diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..c0f46ec --- /dev/null +++ b/.dockerignore @@ -0,0 +1,14 @@ +build +docs/build +cython/pocketsphinx/model +_skbuild +__pycache__ +*~ +CMakeCache.txt +CMakeFiles +CTestTestfile.cmake +DartConfiguration.tcl +cmake_install.cmake +Dockerfile +*.whl +dist diff --git a/.gitignore b/.gitignore index 224e7f0..8d7f924 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,22 @@ -.pc/ +build/ +*~ +.vscode/settings.json +*.egg-info +_skbuild +dist +MANIFEST +__pycache__ +jsbuild +CMakeCache.txt +CMakeFiles +CTestTestfile.cmake +DartConfiguration.tcl +cmake_install.cmake +venv/ +.tox +Makefile +config.h +include/pocketsphinx/sphinx_config.h +pocketsphinx.pc +test/testfuncs.sh +test/unit/test_macros.h diff --git a/.readthedocs.yml b/.readthedocs.yml new file mode 100644 index 0000000..d764d78 --- /dev/null +++ b/.readthedocs.yml @@ -0,0 +1,13 @@ +version: 2 + +build: + os: ubuntu-22.04 + tools: + python: "3.10" + +sphinx: + configuration: docs/source/conf.py + +python: + install: + - requirements: docs/requirements.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..6ab72a2 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,122 @@ +cmake_minimum_required(VERSION 3.14) # I like pie + +project(PocketSphinx VERSION 5.0.4 + DESCRIPTION "A small speech recognizer" + HOMEPAGE_URL "https://github.com/cmusphinx/pocketsphinx" + LANGUAGES C) +include(CMakePrintHelpers) +set(PACKAGE_NAME ${PROJECT_NAME}) +string(TOLOWER ${PROJECT_NAME} PROJECT_SHORTNAME) +set(PACKAGE_VERSION ${PROJECT_VERSION}) +set(PACKAGE_STRING "${PROJECT_NAME} ${PROJECT_VERSION}") +set(PACKAGE_TARNAME "${PROJECT_SHORTNAME}-${PROJECT_VERSION}") +set(PACKAGE_URL ${PROJECT_HOMEPAGE_URL}) +set(PACKAGE_BUGREPORT dhdaines@gmail.com) + +if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) + include(CTest) + add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}) +endif() + +include(CheckTypeSize) +include(CheckSymbolExists) +include(CheckLibraryExists) +include(TestBigEndian) +include(GNUInstallDirs) + +CHECK_INCLUDE_FILE(unistd.h HAVE_UNISTD_H) +CHECK_INCLUDE_FILE(sys/types.h HAVE_SYS_TYPES_H) +CHECK_INCLUDE_FILE(sys/stat.h HAVE_SYS_STAT_H) +CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H) +CHECK_SYMBOL_EXISTS(snprintf stdio.h HAVE_SNPRINTF) +CHECK_SYMBOL_EXISTS(popen stdio.h HAVE_POPEN) +CHECK_TYPE_SIZE(long LONG) +CHECK_TYPE_SIZE("long long" LONG_LONG) +# OMG CMake is so incredibly awful +set(SIZEOF_LONG ${LONG}) +set(SIZEOF_LONG_LONG ${LONG_LONG}) +cmake_print_variables(SIZEOF_LONG SIZEOF_LONG_LONG) +test_big_endian(WORDS_BIGENDIAN) +cmake_print_variables(WORDS_BIGENDIAN) + +# Don't do this +#if(CMAKE_BUILD_TYPE STREQUAL Debug) +# set(SPHINX_DEBUG 1) +#endif() + +# Compiles some code as the wrong endianness in order to ensure that +# it works properly +if(DEBUG_ENDIAN) + add_definitions(-DDEBUG_ENDIAN) +endif() +cmake_print_variables(SPHINX_DEBUG DEBUG_ENDIAN) + +if(MSVC) + add_compile_options(/W3) +else() + add_compile_options(-Wall -Wextra) +endif() + +option(FIXED_POINT "Build using fixed-point math" OFF) +if(NOT DEFAULT_RADIX) + set(DEFAULT_RADIX 12) +endif() +cmake_print_variables(FIXED_POINT DEFAULT_RADIX) + +# Maybe not a great idea, but it does work on both Windows and Linux +set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) +set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) +set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + +configure_file(config.h.in config.h) +configure_file(sphinx_config.h.in include/pocketsphinx/sphinx_config.h) +add_definitions(-DHAVE_CONFIG_H) + +if(SKBUILD) + # Python build + + # Allow compiling against systemwide libpocketsphinx.so for Docker + # or distribution packages + option(USE_INSTALLED_POCKETSPHINX "Build using installed PocketSphinx library" OFF) + if(USE_INSTALLED_POCKETSPHINX) + find_package(PkgConfig) + # Get the libraries and headers + pkg_check_modules(POCKETSPHINX pocketsphinx) + # Set the model directory to the systemwide one. Don't try to use + # CMAKE_INSTALL_FULL_DATADIR! That is not what you want. + pkg_get_variable(MODELDIR pocketsphinx modeldir) + else() + add_subdirectory(src) + endif() + add_subdirectory(cython) +else() + # C build + + # Set the default model directory to the install location + set(MODELDIR ${CMAKE_INSTALL_FULL_DATADIR}/pocketsphinx/model) + option(BUILD_SHARED_LIBS "Build using shared libraries" OFF) + if(BUILD_SHARED_LIBS) + add_definitions(-DSPHINX_DLL) + endif() + add_subdirectory(src) + add_subdirectory(model) + add_subdirectory(doxygen) + add_subdirectory(programs) + add_subdirectory(examples) + if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND BUILD_TESTING) + add_subdirectory(test) + endif() + configure_file(pocketsphinx.pc.in pocketsphinx.pc @ONLY) + install(TARGETS pocketsphinx LIBRARY) + install(DIRECTORY include/ TYPE INCLUDE) + install(DIRECTORY ${CMAKE_BINARY_DIR}/include/ TYPE INCLUDE) + install(FILES ${CMAKE_BINARY_DIR}/pocketsphinx.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) + + option(BUILD_GSTREAMER "Build GStreamer plugin" OFF) + if(BUILD_GSTREAMER) + add_subdirectory(gst) + endif() +endif() + +# Can print this at the end, just to know what it was +cmake_print_variables(MODELDIR) diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f7780d6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +FROM alpine:latest as runtime +RUN apk add --no-cache python3 py3-pip sox portaudio alsa-utils alsaconf + +FROM runtime as build +RUN apk add --no-cache cmake ninja gcc musl-dev python3-dev pkgconfig + +COPY . /pocketsphinx +WORKDIR /pocketsphinx +RUN cmake -S . -B build -DBUILD_SHARED_LIBS=ON -G Ninja && cmake --build build --target install +# Cannot use --build-option because pip sucks +RUN CMAKE_ARGS="-DUSE_INSTALLED_POCKETSPHINX=ON" pip wheel -v . + +FROM runtime +COPY --from=build /usr/local/ /usr/local/ +COPY --from=build /pocketsphinx/*.whl / +RUN pip install --break-system-packages /*.whl && rm /*.whl + +COPY examples/ /work/examples/ +WORKDIR /work diff --git a/LICENSE b/LICENSE index 3561554..2407cfe 100644 --- a/LICENSE +++ b/LICENSE @@ -28,4 +28,109 @@ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - \ No newline at end of file + +WebRTC VAD code (in src/vad): + +Copyright (c) 2011, The WebRTC project authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Python WebRTC VAD code and test files (in cython and test/data/vad): + +The MIT License (MIT) + +Copyright (c) 2016 John Wiseman + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +JSON parser (in src/jsmn.h): + +Copyright (c) 2010 Serge A. Zaitsev + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +Escaping code in JSON serialization (src/ps_config.c): + +Copyright (C) 2014 James McLaughlin. All rights reserved. +https://github.com/udp/json-builder + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..2e81f3f --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,48 @@ +include AUTHORS +include CMakeLists.txt +include LICENSE +include NEWS +include README.md +include Dockerfile +include .dockerignore +include build_wheels.sh +include config.h.in +include pocketsphinx.pc.in +include indent.sh +include pyproject.toml +include requirements.dev.txt +include setup.cfg +include setup.py +include sphinx_config.h.in +recursive-include cython * +recursive-include gst * +recursive-include docs * +recursive-include doxygen * +recursive-include examples * +recursive-include include * +recursive-include model * +recursive-include programs * +recursive-include src * +recursive-include test * +exclude MANIFEST.in +exclude .readthedocs.yml +exclude .travis.yml +exclude .gitignore +exclude examples/simple +exclude examples/live +exclude examples/vad +recursive-exclude .github * +recursive-exclude _skbuild * +recursive-exclude build * +recursive-exclude docs/build * +recursive-exclude cython/pocketsphinx/model * +recursive-exclude cython/pocketsphinx.egg-info * +recursive-exclude * .gitignore +recursive-exclude * *.py[co] +recursive-exclude * *~ +recursive-exclude * *.orig +recursive-exclude * *.DS_Store +recursive-exclude * __pycache__ +recursive-exclude * *.so +recursive-exclude * *.egg-info +recursive-exclude venv * \ No newline at end of file diff --git a/Makefile.am b/Makefile.am deleted file mode 100644 index 121e3fb..0000000 --- a/Makefile.am +++ /dev/null @@ -1,19 +0,0 @@ -SUBDIRS = src doc model include test swig - -EXTRA_DIST = \ - LICENSE \ - autogen.sh \ - m4/pkg.m4 \ - pocketsphinx.pc.in \ - pocketsphinx.sln \ - win32/pocketsphinx/pocketsphinx.vcxproj \ - win32/pocketsphinx/pocketsphinx.vcxproj.filters \ - win32/pocketsphinx_batch/pocketsphinx_batch.vcxproj \ - win32/pocketsphinx_continuous/pocketsphinx_continuous.vcxproj \ - win32/pocketsphinx_mdef_convert/pocketsphinx_mdef_convert.vcxproj - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = pocketsphinx.pc -CLEANFILES = pocketsphinx.pc - -ACLOCAL_AMFLAGS = -I m4 diff --git a/Makefile.in b/Makefile.in deleted file mode 100644 index e718bbb..0000000 --- a/Makefile.in +++ /dev/null @@ -1,876 +0,0 @@ -# Makefile.in generated by automake 1.13.4 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2013 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = . -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/configure $(am__configure_deps) \ - $(srcdir)/pocketsphinx.pc.in AUTHORS NEWS README config.guess \ - config.sub depcomp install-sh missing py-compile ltmain.sh -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ - $(top_srcdir)/m4/ax_python_devel.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ - configure.lineno config.status.lineno -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = pocketsphinx.pc -CONFIG_CLEAN_VPATH_FILES = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -SOURCES = -DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ - ctags-recursive dvi-recursive html-recursive info-recursive \ - install-data-recursive install-dvi-recursive \ - install-exec-recursive install-html-recursive \ - install-info-recursive install-pdf-recursive \ - install-ps-recursive install-recursive installcheck-recursive \ - installdirs-recursive pdf-recursive ps-recursive \ - tags-recursive uninstall-recursive -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(pkgconfigdir)" -DATA = $(pkgconfig_DATA) -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -am__recursive_targets = \ - $(RECURSIVE_TARGETS) \ - $(RECURSIVE_CLEAN_TARGETS) \ - $(am__extra_recursive_targets) -AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ - cscope distdir dist dist-all distcheck -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -CSCOPE = cscope -DIST_SUBDIRS = $(SUBDIRS) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -distdir = $(PACKAGE)-$(VERSION) -top_distdir = $(distdir) -am__remove_distdir = \ - if test -d "$(distdir)"; then \ - find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -rf "$(distdir)" \ - || { sleep 5 && rm -rf "$(distdir)"; }; \ - else :; fi -am__post_remove_distdir = $(am__remove_distdir) -am__relativize = \ - dir0=`pwd`; \ - sed_first='s,^\([^/]*\)/.*$$,\1,'; \ - sed_rest='s,^[^/]*/*,,'; \ - sed_last='s,^.*/\([^/]*\)$$,\1,'; \ - sed_butlast='s,/*[^/]*$$,,'; \ - while test -n "$$dir1"; do \ - first=`echo "$$dir1" | sed -e "$$sed_first"`; \ - if test "$$first" != "."; then \ - if test "$$first" = ".."; then \ - dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ - dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ - else \ - first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ - if test "$$first2" = "$$first"; then \ - dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ - else \ - dir2="../$$dir2"; \ - fi; \ - dir0="$$dir0"/"$$first"; \ - fi; \ - fi; \ - dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ - done; \ - reldir="$$dir2" -DIST_ARCHIVES = $(distdir).tar.gz -GZIP_ENV = --best -DIST_TARGETS = dist-gzip -distuninstallcheck_listfiles = find . -type f -print -am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ - | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' -distcleancheck_listfiles = find . -type f -print -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GST_CFLAGS = @GST_CFLAGS@ -GST_LIBS = @GST_LIBS@ -GST_MAJORMINOR = @GST_MAJORMINOR@ -GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ -GStreamer_CFLAGS = @GStreamer_CFLAGS@ -GStreamer_LIBS = @GStreamer_LIBS@ -HAVE_DOXYGEN = @HAVE_DOXYGEN@ -HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PKG_CONFIG = @PKG_CONFIG@ -PYTHON = @PYTHON@ -PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ -PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ -PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ -PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ -PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ -PYTHON_PLATFORM = @PYTHON_PLATFORM@ -PYTHON_PREFIX = @PYTHON_PREFIX@ -PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ -PYTHON_VERSION = @PYTHON_VERSION@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ -SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ -SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ -STRIP = @STRIP@ -SWIG = @SWIG@ -SWIG_LIB = @SWIG_LIB@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -pkgpyexecdir = @pkgpyexecdir@ -pkgpythondir = @pkgpythondir@ -plugindir = @plugindir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -pyexecdir = @pyexecdir@ -pythondir = @pythondir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUBDIRS = src doc model include test swig -EXTRA_DIST = \ - LICENSE \ - autogen.sh \ - m4/pkg.m4 \ - pocketsphinx.pc.in \ - pocketsphinx.sln \ - win32/pocketsphinx/pocketsphinx.vcxproj \ - win32/pocketsphinx/pocketsphinx.vcxproj.filters \ - win32/pocketsphinx_batch/pocketsphinx_batch.vcxproj \ - win32/pocketsphinx_continuous/pocketsphinx_continuous.vcxproj \ - win32/pocketsphinx_mdef_convert/pocketsphinx_mdef_convert.vcxproj - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = pocketsphinx.pc -CLEANFILES = pocketsphinx.pc -ACLOCAL_AMFLAGS = -I m4 -all: all-recursive - -.SUFFIXES: -am--refresh: Makefile - @: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ - $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - echo ' $(SHELL) ./config.status'; \ - $(SHELL) ./config.status;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - $(SHELL) ./config.status --recheck - -$(top_srcdir)/configure: $(am__configure_deps) - $(am__cd) $(srcdir) && $(AUTOCONF) -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) -$(am__aclocal_m4_deps): -pocketsphinx.pc: $(top_builddir)/config.status $(srcdir)/pocketsphinx.pc.in - cd $(top_builddir) && $(SHELL) ./config.status $@ - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool config.lt -install-pkgconfigDATA: $(pkgconfig_DATA) - @$(NORMAL_INSTALL) - @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ - done - -uninstall-pkgconfigDATA: - @$(NORMAL_UNINSTALL) - @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) - -# This directory's subdirectories are mostly independent; you can cd -# into them and run 'make' without going through this Makefile. -# To change the values of 'make' variables: instead of editing Makefiles, -# (1) if the variable is set in 'config.status', edit 'config.status' -# (which will cause the Makefiles to be regenerated when you run 'make'); -# (2) otherwise, pass the desired values on the 'make' command line. -$(am__recursive_targets): - @fail=; \ - if $(am__make_keepgoing); then \ - failcom='fail=yes'; \ - else \ - failcom='exit 1'; \ - fi; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-recursive -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-recursive - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscope: cscope.files - test ! -s cscope.files \ - || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) -clean-cscope: - -rm -f cscope.files -cscope.files: clean-cscope cscopelist -cscopelist: cscopelist-recursive - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -rm -f cscope.out cscope.in.out cscope.po.out cscope.files - -distdir: $(DISTFILES) - $(am__remove_distdir) - test -d "$(distdir)" || mkdir "$(distdir)" - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - $(am__make_dryrun) \ - || test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ - $(am__relativize); \ - new_distdir=$$reldir; \ - dir1=$$subdir; dir2="$(top_distdir)"; \ - $(am__relativize); \ - new_top_distdir=$$reldir; \ - echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ - echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ - ($(am__cd) $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$new_top_distdir" \ - distdir="$$new_distdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - am__skip_mode_fix=: \ - distdir) \ - || exit 1; \ - fi; \ - done - -test -n "$(am__skip_mode_fix)" \ - || find "$(distdir)" -type d ! -perm -755 \ - -exec chmod u+rwx,go+rx {} \; -o \ - ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ - || chmod -R a+r "$(distdir)" -dist-gzip: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__post_remove_distdir) - -dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 - $(am__post_remove_distdir) - -dist-lzip: distdir - tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz - $(am__post_remove_distdir) - -dist-xz: distdir - tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz - $(am__post_remove_distdir) - -dist-tarZ: distdir - tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__post_remove_distdir) - -dist-shar: distdir - shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__post_remove_distdir) - -dist-zip: distdir - -rm -f $(distdir).zip - zip -rq $(distdir).zip $(distdir) - $(am__post_remove_distdir) - -dist dist-all: - $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' - $(am__post_remove_distdir) - -# This target untars the dist file and tries a VPATH configuration. Then -# it guarantees that the distribution is self-contained by making another -# tarfile. -distcheck: dist - case '$(DIST_ARCHIVES)' in \ - *.tar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ - *.tar.bz2*) \ - bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.lz*) \ - lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ - *.tar.xz*) \ - xz -dc $(distdir).tar.xz | $(am__untar) ;;\ - *.tar.Z*) \ - uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ - *.shar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ - *.zip*) \ - unzip $(distdir).zip ;;\ - esac - chmod -R a-w $(distdir) - chmod u+w $(distdir) - mkdir $(distdir)/_build $(distdir)/_inst - chmod a-w $(distdir) - test -d $(distdir)/_build || exit 0; \ - dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ - && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ - && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build \ - && ../configure --srcdir=.. --prefix="$$dc_install_base" \ - $(AM_DISTCHECK_CONFIGURE_FLAGS) \ - $(DISTCHECK_CONFIGURE_FLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ - && $(MAKE) $(AM_MAKEFLAGS) check \ - && $(MAKE) $(AM_MAKEFLAGS) install \ - && $(MAKE) $(AM_MAKEFLAGS) installcheck \ - && $(MAKE) $(AM_MAKEFLAGS) uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ - distuninstallcheck \ - && chmod -R a-w "$$dc_install_base" \ - && ({ \ - (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ - distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ - } || { rm -rf "$$dc_destdir"; exit 1; }) \ - && rm -rf "$$dc_destdir" \ - && $(MAKE) $(AM_MAKEFLAGS) dist \ - && rm -rf $(DIST_ARCHIVES) \ - && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ - && cd "$$am__cwd" \ - || exit 1 - $(am__post_remove_distdir) - @(echo "$(distdir) archives ready for distribution: "; \ - list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ - sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' -distuninstallcheck: - @test -n '$(distuninstallcheck_dir)' || { \ - echo 'ERROR: trying to run $@ with an empty' \ - '$$(distuninstallcheck_dir)' >&2; \ - exit 1; \ - }; \ - $(am__cd) '$(distuninstallcheck_dir)' || { \ - echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ - exit 1; \ - }; \ - test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ - || { echo "ERROR: files left after uninstall:" ; \ - if test -n "$(DESTDIR)"; then \ - echo " (check DESTDIR support)"; \ - fi ; \ - $(distuninstallcheck_listfiles) ; \ - exit 1; } >&2 -distcleancheck: distclean - @if test '$(srcdir)' = . ; then \ - echo "ERROR: distcleancheck can only run from a VPATH build" ; \ - exit 1 ; \ - fi - @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ - || { echo "ERROR: files left in build directory after distclean:" ; \ - $(distcleancheck_listfiles) ; \ - exit 1; } >&2 -check-am: all-am -check: check-recursive -all-am: Makefile $(DATA) -installdirs: installdirs-recursive -installdirs-am: - for dir in "$(DESTDIR)$(pkgconfigdir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-recursive - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool \ - distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -html-am: - -info: info-recursive - -info-am: - -install-data-am: install-pkgconfigDATA - -install-dvi: install-dvi-recursive - -install-dvi-am: - -install-exec-am: - -install-html: install-html-recursive - -install-html-am: - -install-info: install-info-recursive - -install-info-am: - -install-man: - -install-pdf: install-pdf-recursive - -install-pdf-am: - -install-ps: install-ps-recursive - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -rf $(top_srcdir)/autom4te.cache - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: uninstall-pkgconfigDATA - -.MAKE: $(am__recursive_targets) install-am install-strip - -.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ - am--refresh check check-am clean clean-cscope clean-generic \ - clean-libtool cscope cscopelist-am ctags ctags-am dist \ - dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ - dist-xz dist-zip distcheck distclean distclean-generic \ - distclean-libtool distclean-tags distcleancheck distdir \ - distuninstallcheck dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-pkgconfigDATA install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ - uninstall-am uninstall-pkgconfigDATA - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/NEWS b/NEWS index d6b9d4c..4dafa30 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,10 @@ +PocketSphinx 5.0.3 +^^^^^^^^^^^^^^^^^^ + +The NEWS file has not been updated for some time. See the GitHub +releases page at https://github.com/cmusphinx/pocketsphinx/releases +instead. + Pocketsphinx 0.8 ^^^^^^^^^^^^^^^^ @@ -12,7 +19,7 @@ Improvements: Fixes: * Memory leaks, refcounting and other memory-related issues - * Use proper word bounary senones for the words added on the fly + * Use proper word boundary senones for the words added on the fly * Accurate FSG lextree construction Pocketsphinx 0.7 @@ -41,7 +48,7 @@ Bug fixes: * Fixes very important regression with NULL transitions in fsg search * Proper acoustic score scaling during posterior calculation. -And many, many, many more intersting things! +And many, many, many more interesting things! Pocketsphinx pre ^^^^^^^^^^^^^^^^ diff --git a/README b/README deleted file mode 100644 index e11255f..0000000 --- a/README +++ /dev/null @@ -1,90 +0,0 @@ -PocketSphinx 5prealpha -=============================================================================== - -This is PocketSphinx, one of Carnegie Mellon University's open source large -vocabulary, speaker-independent continuous speech recognition engine. - -**THIS IS A RESEARCH SYSTEM**. This is also an early release of a research -system. We know the APIs and function names are likely to change, and that -several tools need to be made available to make this all complete. With your -help and contributions, this can progress in response to the needs and patches -provided. - -**Please see the LICENSE file for terms of use.** - -Prerequisites -------------------------------------------------------------------------------- - -You **must** have SphinxBase, which you can download from -http://cmusphinx.sourceforge.net. Download and unpack it to the same parent -directory as PocketSphinx, so that the configure script and project files can -find it. On Windows, you will need to rename 'sphinxbase-X.Y' (where X.Y is the -SphinxBase version number) to simply 'sphinxbase' for this to work. - -Linux/Unix installation ------------------------------------------------------------------------------- - -In a unix-like environment (such as linux, solaris etc): - - * Build and optionally install SphinxBase. If you want to use - fixed-point arithmetic, you **must** configure SphinxBase with the - `--enable-fixed` option. - - * If you downloaded directly from the CVS repository, you need to do - this at least once to generate the "configure" file: - - ``` - $ ./autogen.sh - ``` - * If you downloaded the release version, or ran `autogen.sh` at least - once, then compile and install: - - ``` - $ ./configure - $ make clean all - $ make check - $ sudo make install - ``` - -XCode Installation (for iPhone) ------------------------------------------------------------------------------- - -Pocketsphinx uses the standard unix autogen system, you can build pocketsphinx -with automake given you already built sphinxbase You just need to pass correct -configure arguments, set compiler path, set sysroot and other options. After -you build the code you need to import dylib file into your project and you also -need to configure includes for your project to find sphinxbase headers. - -You also will have to create a recorder to capture audio with CoreAudio and -feed it into the recognizer. - -For details see http://github.com/cmusphinx/pocketsphinx-ios-demo - -If you want to quickly start with Pocketsphinx, try OpenEars toolkit which -includes Pocketsphinx http://www.politepix.com/openears/ - - -Android installation ------------------------------------------------------------------------------- - -See http://github.com/cmusphinx/pocketsphinx-android-demo. - - -MS Windows™ (MS Visual Studio 2010 (or newer - we test with VC++ 2010 Express) ------------------------------------------------------------------------------- - - * load sphinxbase.sln located in sphinxbase directory - - * compile all the projects in SphinxBase (from sphinxbase.sln) - - * load pocketsphinx.sln in pocketsphinx directory - - * compile all the projects in PocketSphinx - -MS Visual Studio will build the executables under .\bin\Release or -.\bin\Debug (depending on the version you choose on MS Visual Studio), -and the libraries under .\lib\Release or .\lib\Build. - -Test scripts are forthcoming for Windows. - -For up-to-date information, see http://cmusphinx.sourceforge.net. diff --git a/README.md b/README.md new file mode 100644 index 0000000..c36ddf9 --- /dev/null +++ b/README.md @@ -0,0 +1,189 @@ +PocketSphinx 5.0.4 +================== + +This is PocketSphinx, one of Carnegie Mellon University's open source large +vocabulary, speaker-independent continuous speech recognition engines. + +Although this was at one point a research system, active development +has largely ceased and it has become very, very far from the state of +the art. I am making a release, because people are nonetheless using +it, and there are a number of historical errors in the build system +and API which needed to be corrected. + +The version number is strangely large because there was a "release" +that people are using called 5prealpha, and we will use proper +[semantic versioning](https://semver.org/) from now on. + +**Please see the LICENSE file for terms of use.** + +Installation +------------ + +We now use CMake for building, which should give reasonable results +across Linux and Windows. Not certain about Mac OS X because I don't +have one of those. In addition, the audio library, which never really +built or worked correctly on any platform at all, has simply been +removed. + +There is no longer any dependency on SphinxBase. There is no +SphinxBase anymore. This is not the SphinxBase you're looking for. +All your SphinxBase are belong to us. + +There are some other dependencies that you may find useful in order to +use the example code (though they are not strictly necessary to build +and install). On Debian GNU/Linux and its derivatives (such as +Raspberry Pi OS, Ubuntu, etc), you can install them with: + + sudo apt install \ + ffmpeg \ + libasound2-dev \ + libportaudio2 \ + libportaudiocpp0 \ + libpulse-dev \ + libsox-fmt-all \ + portaudio19-dev \ + sox + +To install the Python module in a virtual environment (replace +`~/ve_pocketsphinx` with the virtual environment you wish to create), +from the top level directory: + +``` +python3 -m venv ~/ve_pocketsphinx +. ~/ve_pocketsphinx/bin/activate +pip install . +``` + +To install the C library and bindings (assuming you have access to +/usr/local - if not, use `-DCMAKE_INSTALL_PREFIX` to set a different +prefix in the first `cmake` command below): + +``` +cmake -S . -B build +cmake --build build +cmake --build build --target install +``` + +Usage +----- + +The `pocketsphinx` command-line program reads single-channel 16-bit +PCM audio from standard input or one or more files, and attempts to +recognize speech in it using the default acoustic and language model. +It accepts a large number of options which you probably don't care +about, a *command* which defaults to `live`, and one or more inputs +(except in `align` mode), or `-` to read from standard input. + +If you have a single-channel WAV file called "speech.wav" and you want +to recognize speech in it, you can try doing this (the results may not +be wonderful): + + pocketsphinx single speech.wav + +If your input is in some other format I suggest converting it with +`sox` as described below. + +The commands are as follows: + + - `help`: Print a long list of those options you don't care about. + + - `config`: Dump configuration as JSON to standard output (can be + loaded with the `-config` option). + + - `live`: Detect speech segments in each input, run recognition + on them (using those options you don't care about), and write the + results to standard output in line-delimited JSON. I realize this + isn't the prettiest format, but it sure beats XML. Each line + contains a JSON object with these fields, which have short names + to make the lines more readable: + + - `b`: Start time in seconds, from the beginning of the stream + - `d`: Duration in seconds + - `p`: Estimated probability of the recognition result, i.e. a + number between 0 and 1 representing the likelihood of the input + according to the model + - `t`: Full text of recognition result + - `w`: List of segments (usually words), each of which in turn + contains the `b`, `d`, `p`, and `t` fields, for start, end, + probability, and the text of the word. If `-phone_align yes` + has been passed, then a `w` field will be present containing + phone segmentations, in the same format. + + - `single`: Recognize each input as a single utterance, and write a + JSON object in the same format described above. + + - `align`: Align a single input file (or `-` for standard input) to + a word sequence, and write a JSON object in the same format + described above. The first positional argument is the input, and + all subsequent ones are concatenated to make the text, to avoid + surprises if you forget to quote it. You are responsible for + normalizing the text to remove punctuation, uppercase, centipedes, + etc. For example: + + pocketsphinx align goforward.wav "go forward ten meters" + + By default, only word-level alignment is done. To get phone + alignments, pass `-phone_align yes` in the flags, e.g.: + + pocketsphinx -phone_align yes align audio.wav $text + + This will make not particularly readable output, but you can use + [jq](https://stedolan.github.io/jq/) to clean it up. For example, + you can get just the word names and start times like this: + + pocketsphinx align audio.wav $text | jq '.w[]|[.t,.b]' + + Or you could get the phone names and durations like this: + + pocketsphinx -phone_align yes align audio.wav $text | jq '.w[]|.w[]|[.t,.d]' + + There are many, many other possibilities, of course. + + - `soxflags`: Return arguments to `sox` which will create the + appropriate input format. Note that because the `sox` + command-line is slightly quirky these must always come *after* the + filename or `-d` (which tells `sox` to read from the microphone). + You can run live recognition like this: + + sox -d $(pocketsphinx soxflags) | pocketsphinx - + + or decode from a file named "audio.mp3" like this: + + sox audio.mp3 $(pocketsphinx soxflags) | pocketsphinx - + +By default only errors are printed to standard error, but if you want +more information you can pass `-loglevel INFO`. Partial results are +not printed, maybe they will be in the future, but don't hold your +breath. + +Programming +----------- + +For programming, see the [examples directory](./examples/) for a +number of examples of using the library from C and Python. You can +also read the [documentation for the Python +API](https://pocketsphinx.readthedocs.io) or [the C +API](https://cmusphinx.github.io/doc/pocketsphinx/) + +Authors +------- + +PocketSphinx is ultimately based on `Sphinx-II` which in turn was +based on some older systems at Carnegie Mellon University, which were +released as free software under a BSD-like license thanks to the +efforts of Kevin Lenzo. Much of the decoder in particular was written +by Ravishankar Mosur (look for "rkm" in the comments), but various +other people contributed as well, see [the AUTHORS file](./AUTHORS) +for more details. + +David Huggins-Daines (the author of this document) is +responsible for creating `PocketSphinx` which added +various speed and memory optimizations, fixed-point computation, JSGF +support, portability to various platforms, and a somewhat coherent +API. He then disappeared for a while. + +Nickolay Shmyrev took over maintenance for quite a long time +afterwards, and a lot of code was contributed by Alexander Solovets, +Vyacheslav Klimkov, and others. + +Currently this is maintained by David Huggins-Daines again. diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..7d12513 --- /dev/null +++ b/TODO.md @@ -0,0 +1,12 @@ +- Documentation: + - Update tutorial + - LM tutorial use pocketsphinx_lm_convert, pocketsphinx + - Training tutorial use Docker + - Android tutorial add note that it's out of date + - FAQ update for new pocketsphinx program + - CLI quick start in README.md + - Python quick start in main page of Python docs + - C quick start in +- Support NumPy arrays for input (see soundfile usage) +- Environment variable for model path + diff --git a/aclocal.m4 b/aclocal.m4 deleted file mode 100644 index 21dcea2..0000000 --- a/aclocal.m4 +++ /dev/null @@ -1,1299 +0,0 @@ -# generated automatically by aclocal 1.13.4 -*- Autoconf -*- - -# Copyright (C) 1996-2013 Free Software Foundation, Inc. - -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) -m4_ifndef([AC_AUTOCONF_VERSION], - [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, -[m4_warning([this file was generated for autoconf 2.69. -You have another version of autoconf. It may work, but is not guaranteed to. -If you have problems, you may need to regenerate the build system entirely. -To do so, use the procedure documented by the package, typically 'autoreconf'.])]) - -# Copyright (C) 2002-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_AUTOMAKE_VERSION(VERSION) -# ---------------------------- -# Automake X.Y traces this macro to ensure aclocal.m4 has been -# generated from the m4 files accompanying Automake X.Y. -# (This private macro should not be called outside this file.) -AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.13' -dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to -dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.13.4], [], - [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl -]) - -# _AM_AUTOCONF_VERSION(VERSION) -# ----------------------------- -# aclocal traces this macro to find the Autoconf version. -# This is a private macro too. Using m4_define simplifies -# the logic in aclocal, which can simply ignore this definition. -m4_define([_AM_AUTOCONF_VERSION], []) - -# AM_SET_CURRENT_AUTOMAKE_VERSION -# ------------------------------- -# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. -# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. -AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.13.4])dnl -m4_ifndef([AC_AUTOCONF_VERSION], - [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) - -# AM_AUX_DIR_EXPAND -*- Autoconf -*- - -# Copyright (C) 2001-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets -# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to -# '$srcdir', '$srcdir/..', or '$srcdir/../..'. -# -# Of course, Automake must honor this variable whenever it calls a -# tool from the auxiliary directory. The problem is that $srcdir (and -# therefore $ac_aux_dir as well) can be either absolute or relative, -# depending on how configure is run. This is pretty annoying, since -# it makes $ac_aux_dir quite unusable in subdirectories: in the top -# source directory, any form will work fine, but in subdirectories a -# relative path needs to be adjusted first. -# -# $ac_aux_dir/missing -# fails when called from a subdirectory if $ac_aux_dir is relative -# $top_srcdir/$ac_aux_dir/missing -# fails if $ac_aux_dir is absolute, -# fails when called from a subdirectory in a VPATH build with -# a relative $ac_aux_dir -# -# The reason of the latter failure is that $top_srcdir and $ac_aux_dir -# are both prefixed by $srcdir. In an in-source build this is usually -# harmless because $srcdir is '.', but things will broke when you -# start a VPATH build or use an absolute $srcdir. -# -# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, -# iff we strip the leading $srcdir from $ac_aux_dir. That would be: -# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` -# and then we would define $MISSING as -# MISSING="\${SHELL} $am_aux_dir/missing" -# This will work as long as MISSING is not called from configure, because -# unfortunately $(top_srcdir) has no meaning in configure. -# However there are other variables, like CC, which are often used in -# configure, and could therefore not use this "fixed" $ac_aux_dir. -# -# Another solution, used here, is to always expand $ac_aux_dir to an -# absolute PATH. The drawback is that using absolute paths prevent a -# configured tree to be moved without reconfiguration. - -AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` -]) - -# AM_CONDITIONAL -*- Autoconf -*- - -# Copyright (C) 1997-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_CONDITIONAL(NAME, SHELL-CONDITION) -# ------------------------------------- -# Define a conditional. -AC_DEFUN([AM_CONDITIONAL], -[AC_PREREQ([2.52])dnl - m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_SUBST([$1_TRUE])dnl -AC_SUBST([$1_FALSE])dnl -_AM_SUBST_NOTMAKE([$1_TRUE])dnl -_AM_SUBST_NOTMAKE([$1_FALSE])dnl -m4_define([_AM_COND_VALUE_$1], [$2])dnl -if $2; then - $1_TRUE= - $1_FALSE='#' -else - $1_TRUE='#' - $1_FALSE= -fi -AC_CONFIG_COMMANDS_PRE( -[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then - AC_MSG_ERROR([[conditional "$1" was never defined. -Usually this means the macro was only invoked conditionally.]]) -fi])]) - -# Copyright (C) 1999-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - - -# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be -# written in clear, in which case automake, when reading aclocal.m4, -# will think it sees a *use*, and therefore will trigger all it's -# C support machinery. Also note that it means that autoscan, seeing -# CC etc. in the Makefile, will ask for an AC_PROG_CC use... - - -# _AM_DEPENDENCIES(NAME) -# ---------------------- -# See how the compiler implements dependency checking. -# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". -# We try a few techniques and use that to set a single cache variable. -# -# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was -# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular -# dependency, and given that the user is not expected to run this macro, -# just rely on AC_PROG_CC. -AC_DEFUN([_AM_DEPENDENCIES], -[AC_REQUIRE([AM_SET_DEPDIR])dnl -AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl -AC_REQUIRE([AM_MAKE_INCLUDE])dnl -AC_REQUIRE([AM_DEP_TRACK])dnl - -m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], - [$1], [CXX], [depcc="$CXX" am_compiler_list=], - [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], - [$1], [UPC], [depcc="$UPC" am_compiler_list=], - [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) - -AC_CACHE_CHECK([dependency style of $depcc], - [am_cv_$1_dependencies_compiler_type], -[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_$1_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` - fi - am__universal=false - m4_case([$1], [CC], - [case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac], - [CXX], - [case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac]) - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with '-c' and '-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_$1_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_$1_dependencies_compiler_type=none -fi -]) -AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) -AM_CONDITIONAL([am__fastdep$1], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) -]) - - -# AM_SET_DEPDIR -# ------------- -# Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES. -AC_DEFUN([AM_SET_DEPDIR], -[AC_REQUIRE([AM_SET_LEADING_DOT])dnl -AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl -]) - - -# AM_DEP_TRACK -# ------------ -AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE([dependency-tracking], [dnl -AS_HELP_STRING( - [--enable-dependency-tracking], - [do not reject slow dependency extractors]) -AS_HELP_STRING( - [--disable-dependency-tracking], - [speeds up one-time build])]) -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' -fi -AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -AC_SUBST([AMDEPBACKSLASH])dnl -_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl -AC_SUBST([am__nodep])dnl -_AM_SUBST_NOTMAKE([am__nodep])dnl -]) - -# Generate code to set up dependency tracking. -*- Autoconf -*- - -# Copyright (C) 1999-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - - -# _AM_OUTPUT_DEPENDENCY_COMMANDS -# ------------------------------ -AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], -[{ - # Older Autoconf quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named 'Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running 'make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "$am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} -])# _AM_OUTPUT_DEPENDENCY_COMMANDS - - -# AM_OUTPUT_DEPENDENCY_COMMANDS -# ----------------------------- -# This macro should only be invoked once -- use via AC_REQUIRE. -# -# This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each '.P' file that we will -# need in order to bootstrap the dependency handling code. -AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], -[AC_CONFIG_COMMANDS([depfiles], - [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], - [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) -]) - -# Do all the work for Automake. -*- Autoconf -*- - -# Copyright (C) 1996-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This macro actually does too much. Some checks are only needed if -# your package does certain things. But this isn't really a big deal. - -# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) -# AM_INIT_AUTOMAKE([OPTIONS]) -# ----------------------------------------------- -# The call with PACKAGE and VERSION arguments is the old style -# call (pre autoconf-2.50), which is being phased out. PACKAGE -# and VERSION should now be passed to AC_INIT and removed from -# the call to AM_INIT_AUTOMAKE. -# We support both call styles for the transition. After -# the next Automake release, Autoconf can make the AC_INIT -# arguments mandatory, and then we can depend on a new Autoconf -# release and drop the old call support. -AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.65])dnl -dnl Autoconf wants to disallow AM_ names. We explicitly allow -dnl the ones we care about. -m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl -AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl -AC_REQUIRE([AC_PROG_INSTALL])dnl -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi -AC_SUBST([CYGPATH_W]) - -# Define the identity of the package. -dnl Distinguish between old-style and new-style calls. -m4_ifval([$2], -[AC_DIAGNOSE([obsolete], - [$0: two- and three-arguments forms are deprecated.]) -m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl - AC_SUBST([PACKAGE], [$1])dnl - AC_SUBST([VERSION], [$2])], -[_AM_SET_OPTIONS([$1])dnl -dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if( - m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), - [ok:ok],, - [m4_fatal([AC_INIT should be called with package and version arguments])])dnl - AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl - AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl - -_AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) - AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl - -# Some tools Automake needs. -AC_REQUIRE([AM_SANITY_CHECK])dnl -AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) -AM_MISSING_PROG([AUTOCONF], [autoconf]) -AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) -AM_MISSING_PROG([AUTOHEADER], [autoheader]) -AM_MISSING_PROG([MAKEINFO], [makeinfo]) -AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -# For better backward compatibility. To be removed once Automake 1.9.x -# dies out for good. For more background, see: -# -# -AC_SUBST([mkdir_p], ['$(MKDIR_P)']) -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([AC_PROG_MAKE_SET])dnl -AC_REQUIRE([AM_SET_LEADING_DOT])dnl -_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], - [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) -_AM_IF_OPTION([no-dependencies],, -[AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES([CC])], - [m4_define([AC_PROG_CC], - m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES([CXX])], - [m4_define([AC_PROG_CXX], - m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES([OBJC])], - [m4_define([AC_PROG_OBJC], - m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], - [_AM_DEPENDENCIES([OBJCXX])], - [m4_define([AC_PROG_OBJCXX], - m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl -]) -AC_REQUIRE([AM_SILENT_RULES])dnl -dnl The testsuite driver may need to know about EXEEXT, so add the -dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This -dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. -AC_CONFIG_COMMANDS_PRE(dnl -[m4_provide_if([_AM_COMPILER_EXEEXT], - [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl -]) - -dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not -dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further -dnl mangled by Autoconf and run in a shell conditional statement. -m4_define([_AC_COMPILER_EXEEXT], -m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) - - -# When config.status generates a header, we must update the stamp-h file. -# This file resides in the same directory as the config header -# that is generated. The stamp files are numbered to have different names. - -# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the -# loop where config.status creates the headers, so we can generate -# our stamp files there. -AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], -[# Compute $1's index in $config_headers. -_am_arg=$1 -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) - -# Copyright (C) 2001-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_INSTALL_SH -# ------------------ -# Define $install_sh. -AC_DEFUN([AM_PROG_INSTALL_SH], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi -AC_SUBST([install_sh])]) - -# Copyright (C) 2003-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# Check whether the underlying file-system supports filenames -# with a leading dot. For instance MS-DOS doesn't. -AC_DEFUN([AM_SET_LEADING_DOT], -[rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null -AC_SUBST([am__leading_dot])]) - -# Check to see how 'make' treats includes. -*- Autoconf -*- - -# Copyright (C) 2001-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_MAKE_INCLUDE() -# ----------------- -# Check to see how make treats includes. -AC_DEFUN([AM_MAKE_INCLUDE], -[am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -AC_MSG_CHECKING([for style of include used by $am_make]) -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from 'make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi -AC_SUBST([am__include]) -AC_SUBST([am__quote]) -AC_MSG_RESULT([$_am_result]) -rm -f confinc confmf -]) - -# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- - -# Copyright (C) 1997-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_MISSING_PROG(NAME, PROGRAM) -# ------------------------------ -AC_DEFUN([AM_MISSING_PROG], -[AC_REQUIRE([AM_MISSING_HAS_RUN]) -$1=${$1-"${am_missing_run}$2"} -AC_SUBST($1)]) - -# AM_MISSING_HAS_RUN -# ------------------ -# Define MISSING if not defined so far and test if it is modern enough. -# If it is, set am_missing_run to use it, otherwise, to nothing. -AC_DEFUN([AM_MISSING_HAS_RUN], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([missing])dnl -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --is-lightweight"; then - am_missing_run="$MISSING " -else - am_missing_run= - AC_MSG_WARN(['missing' script is too old or missing]) -fi -]) - -# Helper functions for option handling. -*- Autoconf -*- - -# Copyright (C) 2001-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# _AM_MANGLE_OPTION(NAME) -# ----------------------- -AC_DEFUN([_AM_MANGLE_OPTION], -[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) - -# _AM_SET_OPTION(NAME) -# -------------------- -# Set option NAME. Presently that only means defining a flag for this option. -AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) - -# _AM_SET_OPTIONS(OPTIONS) -# ------------------------ -# OPTIONS is a space-separated list of Automake options. -AC_DEFUN([_AM_SET_OPTIONS], -[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) - -# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) -# ------------------------------------------- -# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. -AC_DEFUN([_AM_IF_OPTION], -[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) - -# Copyright (C) 1999-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - - -# AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -# --------------------------------------------------------------------------- -# Adds support for distributing Python modules and packages. To -# install modules, copy them to $(pythondir), using the python_PYTHON -# automake variable. To install a package with the same name as the -# automake package, install to $(pkgpythondir), or use the -# pkgpython_PYTHON automake variable. -# -# The variables $(pyexecdir) and $(pkgpyexecdir) are provided as -# locations to install python extension modules (shared libraries). -# Another macro is required to find the appropriate flags to compile -# extension modules. -# -# If your package is configured with a different prefix to python, -# users will have to add the install directory to the PYTHONPATH -# environment variable, or create a .pth file (see the python -# documentation for details). -# -# If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will -# cause an error if the version of python installed on the system -# doesn't meet the requirement. MINIMUM-VERSION should consist of -# numbers and dots only. -AC_DEFUN([AM_PATH_PYTHON], - [ - dnl Find a Python interpreter. Python versions prior to 2.0 are not - dnl supported. (2.0 was released on October 16, 2000). - m4_define_default([_AM_PYTHON_INTERPRETER_LIST], -[python python2 python3 python3.3 python3.2 python3.1 python3.0 python2.7 dnl - python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0]) - - AC_ARG_VAR([PYTHON], [the Python interpreter]) - - m4_if([$1],[],[ - dnl No version check is needed. - # Find any Python interpreter. - if test -z "$PYTHON"; then - AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :) - fi - am_display_PYTHON=python - ], [ - dnl A version check is needed. - if test -n "$PYTHON"; then - # If the user set $PYTHON, use it and don't search something else. - AC_MSG_CHECKING([whether $PYTHON version is >= $1]) - AM_PYTHON_CHECK_VERSION([$PYTHON], [$1], - [AC_MSG_RESULT([yes])], - [AC_MSG_RESULT([no]) - AC_MSG_ERROR([Python interpreter is too old])]) - am_display_PYTHON=$PYTHON - else - # Otherwise, try each interpreter until we find one that satisfies - # VERSION. - AC_CACHE_CHECK([for a Python interpreter with version >= $1], - [am_cv_pathless_PYTHON],[ - for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do - test "$am_cv_pathless_PYTHON" = none && break - AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break]) - done]) - # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. - if test "$am_cv_pathless_PYTHON" = none; then - PYTHON=: - else - AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON]) - fi - am_display_PYTHON=$am_cv_pathless_PYTHON - fi - ]) - - if test "$PYTHON" = :; then - dnl Run any user-specified action, or abort. - m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])]) - else - - dnl Query Python for its version number. Getting [:3] seems to be - dnl the best way to do this; it's what "site.py" does in the standard - dnl library. - - AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version], - [am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[[:3]])"`]) - AC_SUBST([PYTHON_VERSION], [$am_cv_python_version]) - - dnl Use the values of $prefix and $exec_prefix for the corresponding - dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made - dnl distinct variables so they can be overridden if need be. However, - dnl general consensus is that you shouldn't need this ability. - - AC_SUBST([PYTHON_PREFIX], ['${prefix}']) - AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}']) - - dnl At times (like when building shared libraries) you may want - dnl to know which OS platform Python thinks this is. - - AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform], - [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`]) - AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform]) - - # Just factor out some code duplication. - am_python_setup_sysconfig="\ -import sys -# Prefer sysconfig over distutils.sysconfig, for better compatibility -# with python 3.x. See automake bug#10227. -try: - import sysconfig -except ImportError: - can_use_sysconfig = 0 -else: - can_use_sysconfig = 1 -# Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: -# -try: - from platform import python_implementation - if python_implementation() == 'CPython' and sys.version[[:3]] == '2.7': - can_use_sysconfig = 0 -except ImportError: - pass" - - dnl Set up 4 directories: - - dnl pythondir -- where to install python scripts. This is the - dnl site-packages directory, not the python standard library - dnl directory like in previous automake betas. This behavior - dnl is more consistent with lispdir.m4 for example. - dnl Query distutils for this directory. - AC_CACHE_CHECK([for $am_display_PYTHON script directory], - [am_cv_python_pythondir], - [if test "x$prefix" = xNONE - then - am_py_prefix=$ac_default_prefix - else - am_py_prefix=$prefix - fi - am_cv_python_pythondir=`$PYTHON -c " -$am_python_setup_sysconfig -if can_use_sysconfig: - sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'}) -else: - from distutils import sysconfig - sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') -sys.stdout.write(sitedir)"` - case $am_cv_python_pythondir in - $am_py_prefix*) - am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` - am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` - ;; - *) - case $am_py_prefix in - /usr|/System*) ;; - *) - am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages - ;; - esac - ;; - esac - ]) - AC_SUBST([pythondir], [$am_cv_python_pythondir]) - - dnl pkgpythondir -- $PACKAGE directory under pythondir. Was - dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is - dnl more consistent with the rest of automake. - - AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE]) - - dnl pyexecdir -- directory for installing python extension modules - dnl (shared libraries) - dnl Query distutils for this directory. - AC_CACHE_CHECK([for $am_display_PYTHON extension module directory], - [am_cv_python_pyexecdir], - [if test "x$exec_prefix" = xNONE - then - am_py_exec_prefix=$am_py_prefix - else - am_py_exec_prefix=$exec_prefix - fi - am_cv_python_pyexecdir=`$PYTHON -c " -$am_python_setup_sysconfig -if can_use_sysconfig: - sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'}) -else: - from distutils import sysconfig - sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix') -sys.stdout.write(sitedir)"` - case $am_cv_python_pyexecdir in - $am_py_exec_prefix*) - am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` - am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` - ;; - *) - case $am_py_exec_prefix in - /usr|/System*) ;; - *) - am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages - ;; - esac - ;; - esac - ]) - AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir]) - - dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE) - - AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE]) - - dnl Run any user-specified action. - $2 - fi - -]) - - -# AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) -# --------------------------------------------------------------------------- -# Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION. -# Run ACTION-IF-FALSE otherwise. -# This test uses sys.hexversion instead of the string equivalent (first -# word of sys.version), in order to cope with versions such as 2.2c1. -# This supports Python 2.0 or higher. (2.0 was released on October 16, 2000). -AC_DEFUN([AM_PYTHON_CHECK_VERSION], - [prog="import sys -# split strings by '.' and convert to numeric. Append some zeros -# because we need at least 4 digits for the hex conversion. -# map returns an iterator in Python 3.0 and a list in 2.x -minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]] -minverhex = 0 -# xrange is not present in Python 3.0 and range returns an iterator -for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]] -sys.exit(sys.hexversion < minverhex)" - AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])]) - -# Copyright (C) 2001-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_RUN_LOG(COMMAND) -# ------------------- -# Run COMMAND, save the exit status in ac_status, and log it. -# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) -AC_DEFUN([AM_RUN_LOG], -[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD - ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - (exit $ac_status); }]) - -# Check to make sure that the build environment is sane. -*- Autoconf -*- - -# Copyright (C) 1996-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_SANITY_CHECK -# --------------- -AC_DEFUN([AM_SANITY_CHECK], -[AC_MSG_CHECKING([whether build environment is sane]) -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[[\\\"\#\$\&\'\`$am_lf]]*) - AC_MSG_ERROR([unsafe absolute working directory name]);; -esac -case $srcdir in - *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; -esac - -# Do 'set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken - alias in your environment]) - fi - if test "$[2]" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done - test "$[2]" = conftest.file - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -AC_MSG_RESULT([yes]) -# If we didn't sleep, we still need to ensure time stamps of config.status and -# generated files are strictly newer. -am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & - am_sleep_pid=$! -fi -AC_CONFIG_COMMANDS_PRE( - [AC_MSG_CHECKING([that generated files are newer than configure]) - if test -n "$am_sleep_pid"; then - # Hide warnings about reused PIDs. - wait $am_sleep_pid 2>/dev/null - fi - AC_MSG_RESULT([done])]) -rm -f conftest.file -]) - -# Copyright (C) 2009-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_SILENT_RULES([DEFAULT]) -# -------------------------- -# Enable less verbose build rules; with the default set to DEFAULT -# ("yes" being less verbose, "no" or empty being verbose). -AC_DEFUN([AM_SILENT_RULES], -[AC_ARG_ENABLE([silent-rules], [dnl -AS_HELP_STRING( - [--enable-silent-rules], - [less verbose build output (undo: "make V=1")]) -AS_HELP_STRING( - [--disable-silent-rules], - [verbose build output (undo: "make V=0")])dnl -]) -case $enable_silent_rules in @%:@ ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; -esac -dnl -dnl A few 'make' implementations (e.g., NonStop OS and NextStep) -dnl do not support nested variable expansions. -dnl See automake bug#9928 and bug#10237. -am_make=${MAKE-make} -AC_CACHE_CHECK([whether $am_make supports nested variables], - [am_cv_make_support_nested_variables], - [if AS_ECHO([['TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi]) -if test $am_cv_make_support_nested_variables = yes; then - dnl Using '$V' instead of '$(V)' breaks IRIX make. - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AC_SUBST([AM_V])dnl -AM_SUBST_NOTMAKE([AM_V])dnl -AC_SUBST([AM_DEFAULT_V])dnl -AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl -AC_SUBST([AM_DEFAULT_VERBOSITY])dnl -AM_BACKSLASH='\' -AC_SUBST([AM_BACKSLASH])dnl -_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl -]) - -# Copyright (C) 2001-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_INSTALL_STRIP -# --------------------- -# One issue with vendor 'install' (even GNU) is that you can't -# specify the program used to strip binaries. This is especially -# annoying in cross-compiling environments, where the build's strip -# is unlikely to handle the host's binaries. -# Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in "make install-strip", and initialize -# STRIPPROG with the value of the STRIP variable (set by the user). -AC_DEFUN([AM_PROG_INSTALL_STRIP], -[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using 'strip' when the user -# run "make install-strip". However 'strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the 'STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. -if test "$cross_compiling" != no; then - AC_CHECK_TOOL([STRIP], [strip], :) -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -AC_SUBST([INSTALL_STRIP_PROGRAM])]) - -# Copyright (C) 2006-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# _AM_SUBST_NOTMAKE(VARIABLE) -# --------------------------- -# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. -# This macro is traced by Automake. -AC_DEFUN([_AM_SUBST_NOTMAKE]) - -# AM_SUBST_NOTMAKE(VARIABLE) -# -------------------------- -# Public sister of _AM_SUBST_NOTMAKE. -AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) - -# Check how to create a tarball. -*- Autoconf -*- - -# Copyright (C) 2004-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# _AM_PROG_TAR(FORMAT) -# -------------------- -# Check how to create a tarball in format FORMAT. -# FORMAT should be one of 'v7', 'ustar', or 'pax'. -# -# Substitute a variable $(am__tar) that is a command -# writing to stdout a FORMAT-tarball containing the directory -# $tardir. -# tardir=directory && $(am__tar) > result.tar -# -# Substitute a variable $(am__untar) that extract such -# a tarball read from stdin. -# $(am__untar) < result.tar -# -AC_DEFUN([_AM_PROG_TAR], -[# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AC_SUBST([AMTAR], ['$${TAR-tar}']) - -# We'll loop over all known methods to create a tar archive until one works. -_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' - -m4_if([$1], [v7], - [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], - - [m4_case([$1], - [ustar], - [# The POSIX 1988 'ustar' format is defined with fixed-size fields. - # There is notably a 21 bits limit for the UID and the GID. In fact, - # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 - # and bug#13588). - am_max_uid=2097151 # 2^21 - 1 - am_max_gid=$am_max_uid - # The $UID and $GID variables are not portable, so we need to resort - # to the POSIX-mandated id(1) utility. Errors in the 'id' calls - # below are definitely unexpected, so allow the users to see them - # (that is, avoid stderr redirection). - am_uid=`id -u || echo unknown` - am_gid=`id -g || echo unknown` - AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) - if test $am_uid -le $am_max_uid; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - _am_tools=none - fi - AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) - if test $am_gid -le $am_max_gid; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - _am_tools=none - fi], - - [pax], - [], - - [m4_fatal([Unknown tar format])]) - - AC_MSG_CHECKING([how to create a $1 tar archive]) - - # Go ahead even if we have the value already cached. We do so because we - # need to set the values for the 'am__tar' and 'am__untar' variables. - _am_tools=${am_cv_prog_tar_$1-$_am_tools} - - for _am_tool in $_am_tools; do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break - - # tar/untar a dummy directory, and stop if the command works. - rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi - done - rm -rf conftest.dir - - AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) - AC_MSG_RESULT([$am_cv_prog_tar_$1])]) - -AC_SUBST([am__tar]) -AC_SUBST([am__untar]) -]) # _AM_PROG_TAR - -m4_include([m4/ax_pkg_swig.m4]) -m4_include([m4/ax_python_devel.m4]) -m4_include([m4/libtool.m4]) -m4_include([m4/ltoptions.m4]) -m4_include([m4/ltsugar.m4]) -m4_include([m4/ltversion.m4]) -m4_include([m4/lt~obsolete.m4]) -m4_include([m4/pkg.m4]) diff --git a/autogen.sh b/autogen.sh deleted file mode 100755 index e3fdfde..0000000 --- a/autogen.sh +++ /dev/null @@ -1,112 +0,0 @@ -#!/bin/sh -# Run this to generate all the initial makefiles, etc. - -srcdir=`dirname $0` -PKG_NAME="the package." - -DIE=0 - -# Check tools - -(autoconf --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`autoconf' installed to." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -(grep "^LT_INIT" $srcdir/configure.ac >/dev/null) && { - if libtoolize --version /dev/null 2>&1; then - LIBTOOLIZE=libtoolize - elif glibtoolize --version /dev/null 2>&1; then - LIBTOOLIZE=glibtoolize - else - echo - echo "**Error**: You must have \`libtool' installed." - echo "Get ftp://ftp.gnu.org/pub/gnu/libtool/libtool-2.2.6b.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 - fi -} - -(automake --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`automake' installed." - echo "Get ftp://ftp.gnu.org/pub/gnu/automake/automake-1.11.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 - NO_AUTOMAKE=yes -} - - -# if no automake, don't bother testing for aclocal -test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: Missing \`aclocal'. The version of \`automake'" - echo "installed doesn't appear recent enough." - echo "Get ftp://ftp.gnu.org/pub/gnu/automake/automake-1.11.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 -} - -if test "$DIE" -eq 1; then - exit 1 -fi - -if test -z "$*"; then - echo "**Warning**: I am going to run \`configure' with no arguments." - echo "If you wish to pass any to it, please specify them on the" - echo \`$0\'" command line." - echo -fi - -case $CC in -xlc ) - am_opt=--include-deps;; -esac - -for coin in `find $srcdir -name configure.ac -print` -do - dr=`dirname $coin` - if test -f $dr/NO-AUTO-GEN; then - echo skipping $dr -- flagged as no auto-gen - else - echo processing $dr - macrodirs=`sed -n -e 's,AM_ACLOCAL_INCLUDE(\(.*\)),\1,gp' < $coin` - ( cd $dr - aclocalinclude="$ACLOCAL_FLAGS" - for k in $macrodirs; do - if test -d $k; then - aclocalinclude="$aclocalinclude -I $k" - ##else - ## echo "**Warning**: No such directory \`$k'. Ignored." - fi - done - if grep "^LT_INIT" configure.ac >/dev/null; then - echo "Running $LIBTOOLIZE..." - $LIBTOOLIZE --force --copy - fi - echo "Running aclocal $aclocalinclude ..." - aclocal -I m4 $aclocalinclude - if grep "^AC_CONFIG_HEADER" configure.ac >/dev/null; then - echo "Running autoheader..." - autoheader - fi - echo "Running automake --foreign --copy $am_opt ..." - automake --add-missing --foreign --copy $am_opt - echo "Running autoconf ..." - autoconf - ) - fi -done - -#conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c - -if test x$NOCONFIGURE = x; then - echo Running $srcdir/configure $conf_flags "$@" ... - $srcdir/configure $conf_flags "$@" \ - && echo Now type \`make\' to compile $PKG_NAME -else - echo Skipping configure process. -fi diff --git a/config.guess b/config.guess deleted file mode 100755 index b79252d..0000000 --- a/config.guess +++ /dev/null @@ -1,1558 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# Copyright 1992-2013 Free Software Foundation, Inc. - -timestamp='2013-06-10' - -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, see . -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that -# program. This Exception is an additional permission under section 7 -# of the GNU General Public License, version 3 ("GPLv3"). -# -# Originally written by Per Bothner. -# -# You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD -# -# Please send patches with a ChangeLog entry to config-patches@gnu.org. - - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] - -Output the configuration name of the system \`$me' is run on. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.guess ($timestamp) - -Originally written by Per Bothner. -Copyright 1992-2013 Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - * ) - break ;; - esac -done - -if test $# != 0; then - echo "$me: too many arguments$help" >&2 - exit 1 -fi - -trap 'exit 1' 1 2 15 - -# CC_FOR_BUILD -- compiler used by this script. Note that the use of a -# compiler to aid in system detection is discouraged as it requires -# temporary files to be created and, as you can see below, it is a -# headache to deal with in a portable fashion. - -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. - -# Portable tmp directory creation inspired by the Autoconf team. - -set_cc_for_build=' -trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; -trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; -: ${TMPDIR=/tmp} ; - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; -dummy=$tmp/dummy ; -tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > $dummy.c ; - for c in cc gcc c89 c99 ; do - if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; set_cc_for_build= ;' - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -case "${UNAME_SYSTEM}" in -Linux|GNU|GNU/*) - # If the system lacks a compiler, then just pick glibc. - # We could probably try harder. - LIBC=gnu - - eval $set_cc_for_build - cat <<-EOF > $dummy.c - #include - #if defined(__UCLIBC__) - LIBC=uclibc - #elif defined(__dietlibc__) - LIBC=dietlibc - #else - LIBC=gnu - #endif - EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` - ;; -esac - -# Note: order is significant - the case branches are not exclusive. - -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in - *:NetBSD:*:*) - # NetBSD (nbsd) targets should (where applicable) match one or - # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, - # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently - # switched to ELF, *-*-netbsd* would select the old - # object file format. This provides both forward - # compatibility and a consistent mechanism for selecting the - # object file format. - # - # Note: NetBSD doesn't particularly care about the vendor - # portion of the name. We always set it to "unknown". - sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` - case "${UNAME_MACHINE_ARCH}" in - armeb) machine=armeb-unknown ;; - arm*) machine=arm-unknown ;; - sh3el) machine=shl-unknown ;; - sh3eb) machine=sh-unknown ;; - sh5el) machine=sh5le-unknown ;; - *) machine=${UNAME_MACHINE_ARCH}-unknown ;; - esac - # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE_ARCH}" in - arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval $set_cc_for_build - if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ELF__ - then - # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). - # Return netbsd for either. FIX? - os=netbsd - else - os=netbsdelf - fi - ;; - *) - os=netbsd - ;; - esac - # The OS release - # Debian GNU/NetBSD machines have a different userland, and - # thus, need a distinct triplet. However, they do not need - # kernel version information, so it can be replaced with a - # suitable tag, in the style of linux-gnu. - case "${UNAME_VERSION}" in - Debian*) - release='-gnu' - ;; - *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - ;; - esac - # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: - # contains redundant information, the shorter form: - # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" - exit ;; - *:Bitrig:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} - exit ;; - *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} - exit ;; - *:ekkoBSD:*:*) - echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} - exit ;; - *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} - exit ;; - macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd${UNAME_RELEASE} - exit ;; - *:MirBSD:*:*) - echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} - exit ;; - alpha:OSF1:*:*) - case $UNAME_RELEASE in - *4.0) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - ;; - *5.*) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` - ;; - esac - # According to Compaq, /usr/sbin/psrinfo has been available on - # OSF/1 and Tru64 systems produced since 1995. I hope that - # covers most systems running today. This code pipes the CPU - # types through head -n 1, so we only detect the type of CPU 0. - ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case "$ALPHA_CPU_TYPE" in - "EV4 (21064)") - UNAME_MACHINE="alpha" ;; - "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; - "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; - "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; - "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; - "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; - "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; - "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; - "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; - "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; - "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; - "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; - "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; - esac - # A Pn.n version is a patched version. - # A Vn.n version is a released version. - # A Tn.n version is a released field test version. - # A Xn.n version is an unreleased experimental baselevel. - # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - # Reset EXIT trap before exiting to avoid spurious non-zero exit code. - exitcode=$? - trap '' 0 - exit $exitcode ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit ;; - Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; - *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos - exit ;; - *:[Mm]orph[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-morphos - exit ;; - *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; - *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; - *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit ;; - arm*:riscos:*:*|arm*:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; - SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; - Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) - # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit ;; - NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; - DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; - DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) - case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; - esac ;; - s390x:SunOS:*:*) - echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux${UNAME_RELEASE} - exit ;; - i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - eval $set_cc_for_build - SUN_ARCH="i386" - # If there is a compiler, see if it is configured for 64-bit objects. - # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. - # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - SUN_ARCH="x86_64" - fi - fi - echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:6*:*) - # According to config.sub, this is the proper way to canonicalize - # SunOS6. Hard to guess exactly what SunOS6 will be like, but - # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit ;; - sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit ;; - sun*:*:4.2BSD:*) - UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 - case "`/bin/arch`" in - sun3) - echo m68k-sun-sunos${UNAME_RELEASE} - ;; - sun4) - echo sparc-sun-sunos${UNAME_RELEASE} - ;; - esac - exit ;; - aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} - exit ;; - # The situation for MiNT is a little confusing. The machine name - # can be virtually everything (everything which is not - # "atarist" or "atariste" at least should have a processor - # > m68000). The system name ranges from "MiNT" over "FreeMiNT" - # to the lowercase version "mint" (or "freemint"). Finally - # the system name "TOS" denotes a system which is actually not - # MiNT. But MiNT is downward compatible to TOS, so this should - # be no problem. - atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit ;; - hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit ;; - *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit ;; - m68k:machten:*:*) - echo m68k-apple-machten${UNAME_RELEASE} - exit ;; - powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} - exit ;; - RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; - RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit ;; - VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit ;; - 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} - exit ;; - mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c -#ifdef __cplusplus -#include /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif - #if defined (host_mips) && defined (MIPSEB) - #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); - #endif - #endif - exit (-1); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && - dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`$dummy $dummyarg` && - { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos${UNAME_RELEASE} - exit ;; - Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; - Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; - m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; - m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; - m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; - AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] - then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] - then - echo m88k-dg-dgux${UNAME_RELEASE} - else - echo m88k-dg-dguxbcs${UNAME_RELEASE} - fi - else - echo i586-dg-dgux${UNAME_RELEASE} - fi - exit ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; - *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit ;; - ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; - ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` - then - echo "$SYSTEM_NAME" - else - echo rs6000-ibm-aix3.2.5 - fi - elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 - else - echo rs6000-ibm-aix3.2 - fi - exit ;; - *:AIX:*:[4567]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then - IBM_ARCH=rs6000 - else - IBM_ARCH=powerpc - fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit ;; - *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; - DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; - 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; - 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; - 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 - 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 - esac ;; - esac - fi - if [ "${HP_ARCH}" = "" ]; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - - #define _HPUX_SOURCE - #include - #include - - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); - - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } -EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` - test -z "$HP_ARCH" && HP_ARCH=hppa - fi ;; - esac - if [ ${HP_ARCH} = "hppa2.0w" ] - then - eval $set_cc_for_build - - # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating - # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler - # generating 64-bit code. GNU and HP use different nomenclature: - # - # $ CC_FOR_BUILD=cc ./config.guess - # => hppa2.0w-hp-hpux11.23 - # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess - # => hppa64-hp-hpux11.23 - - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | - grep -q __LP64__ - then - HP_ARCH="hppa2.0w" - else - HP_ARCH="hppa64" - fi - fi - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit ;; - ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} - exit ;; - 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - echo unknown-hitachi-hiuxwe2 - exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) - echo hppa1.1-hp-bsd - exit ;; - 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; - *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit ;; - hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; - i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk - else - echo ${UNAME_MACHINE}-unknown-osf1 - fi - exit ;; - parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; - CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ - | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ - -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit ;; - sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:FreeBSD:*:*) - UNAME_PROCESSOR=`/usr/bin/uname -p` - case ${UNAME_PROCESSOR} in - amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - esac - exit ;; - i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit ;; - *:MINGW64*:*) - echo ${UNAME_MACHINE}-pc-mingw64 - exit ;; - *:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit ;; - i*:MSYS*:*) - echo ${UNAME_MACHINE}-pc-msys - exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 - exit ;; - i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 - exit ;; - *:Interix*:*) - case ${UNAME_MACHINE} in - x86) - echo i586-pc-interix${UNAME_RELEASE} - exit ;; - authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix${UNAME_RELEASE} - exit ;; - IA64) - echo ia64-unknown-interix${UNAME_RELEASE} - exit ;; - esac ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - 8664:Windows_NT:*) - echo x86_64-pc-mks - exit ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i586-pc-interix - exit ;; - i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin - exit ;; - amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit ;; - prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - *:GNU:*:*) - # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit ;; - *:GNU/*:*:*) - # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} - exit ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix - exit ;; - aarch64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - aarch64_be:Linux:*:*) - UNAME_MACHINE=aarch64_be - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in - EV5) UNAME_MACHINE=alphaev5 ;; - EV56) UNAME_MACHINE=alphaev56 ;; - PCA56) UNAME_MACHINE=alphapca56 ;; - PCA57) UNAME_MACHINE=alphapca56 ;; - EV6) UNAME_MACHINE=alphaev6 ;; - EV67) UNAME_MACHINE=alphaev67 ;; - EV68*) UNAME_MACHINE=alphaev68 ;; - esac - objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="gnulibc1" ; fi - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - arc:Linux:*:* | arceb:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - arm*:Linux:*:*) - eval $set_cc_for_build - if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_EABI__ - then - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - else - if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_PCS_VFP - then - echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi - else - echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf - fi - fi - exit ;; - avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - cris:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-${LIBC} - exit ;; - crisv32:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-${LIBC} - exit ;; - frv:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - hexagon:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - i*86:Linux:*:*) - echo ${UNAME_MACHINE}-pc-linux-${LIBC} - exit ;; - ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - mips:Linux:*:* | mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef ${UNAME_MACHINE} - #undef ${UNAME_MACHINE}el - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=${UNAME_MACHINE}el - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=${UNAME_MACHINE} - #else - CPU= - #endif - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } - ;; - or1k:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - or32:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - padre:Linux:*:*) - echo sparc-unknown-linux-${LIBC} - exit ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-${LIBC} - exit ;; - parisc:Linux:*:* | hppa:Linux:*:*) - # Look for CPU level - case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; - PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; - *) echo hppa-unknown-linux-${LIBC} ;; - esac - exit ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-${LIBC} - exit ;; - ppc:Linux:*:*) - echo powerpc-unknown-linux-${LIBC} - exit ;; - ppc64le:Linux:*:*) - echo powerpc64le-unknown-linux-${LIBC} - exit ;; - ppcle:Linux:*:*) - echo powerpcle-unknown-linux-${LIBC} - exit ;; - s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux-${LIBC} - exit ;; - sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - tile*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-${LIBC} - exit ;; - x86_64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - i*86:DYNIX/ptx:4*:*) - # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. - # earlier versions are messed up and put the nodename in both - # sysname and nodename. - echo i386-sequent-sysv4 - exit ;; - i*86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, - # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit ;; - i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility - # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx - exit ;; - i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop - exit ;; - i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos - exit ;; - i*86:syllable:*:*) - echo ${UNAME_MACHINE}-pc-syllable - exit ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit ;; - i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` - if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} - else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} - fi - exit ;; - i*86:*:5:[678]*) - # UnixWare 7.x, OpenUNIX and OpenServer 6. - case `/bin/uname -X | grep "^Machine"` in - *486*) UNAME_MACHINE=i486 ;; - *Pentium) UNAME_MACHINE=i586 ;; - *Pent*|*Celeron) UNAME_MACHINE=i686 ;; - esac - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - exit ;; - i*86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` - (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ - && UNAME_MACHINE=i586 - (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ - && UNAME_MACHINE=i686 - (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ - && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL - else - echo ${UNAME_MACHINE}-pc-sysv32 - fi - exit ;; - pc:*:*:*) - # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i586. - # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that - # this is a cross-build. - echo i586-pc-msdosdjgpp - exit ;; - Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; - paragon:*:*:*) - echo i860-intel-osf1 - exit ;; - i860:*:4.*:*) # i860-SVR4 - if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 - else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 - fi - exit ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - echo m68010-convergent-sysv - exit ;; - mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; - M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; - M68*:*:R3V[5678]*:*) - test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; - 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) - OS_REL='' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4; exit; } ;; - NCR*:*:4.2:* | MPRAS*:*:4.2:*) - OS_REL='.3' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; - m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit ;; - mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; - TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit ;; - rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit ;; - SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} - exit ;; - RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - *:SINIX-*:*:*) - if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 - else - echo ns32k-sni-sysv - fi - exit ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says - echo i586-unisys-sysv4 - exit ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes . - # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; - *:*:*:FTX*) - # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; - i*86:VOS:*:*) - # From Paul.Green@stratus.com. - echo ${UNAME_MACHINE}-stratus-vos - exit ;; - *:VOS:*:*) - # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; - mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit ;; - news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; - R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} - else - echo mips-unknown-sysv${UNAME_RELEASE} - fi - exit ;; - BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; - BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; - BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; - BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - echo i586-pc-haiku - exit ;; - x86_64:Haiku:*:*) - echo x86_64-unknown-haiku - exit ;; - SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} - exit ;; - SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} - exit ;; - SX-6:SUPER-UX:*:*) - echo sx6-nec-superux${UNAME_RELEASE} - exit ;; - SX-7:SUPER-UX:*:*) - echo sx7-nec-superux${UNAME_RELEASE} - exit ;; - SX-8:SUPER-UX:*:*) - echo sx8-nec-superux${UNAME_RELEASE} - exit ;; - SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux${UNAME_RELEASE} - exit ;; - Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - eval $set_cc_for_build - if test "$UNAME_PROCESSOR" = unknown ; then - UNAME_PROCESSOR=powerpc - fi - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - case $UNAME_PROCESSOR in - i386) UNAME_PROCESSOR=x86_64 ;; - powerpc) UNAME_PROCESSOR=powerpc64 ;; - esac - fi - fi - echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} - exit ;; - *:procnto*:*:* | *:QNX:[0123456789]*:*) - UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then - UNAME_PROCESSOR=i386 - UNAME_MACHINE=pc - fi - echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} - exit ;; - *:QNX:*:4*) - echo i386-pc-qnx - exit ;; - NEO-?:NONSTOP_KERNEL:*:*) - echo neo-tandem-nsk${UNAME_RELEASE} - exit ;; - NSE-*:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} - exit ;; - NSR-?:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} - exit ;; - *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; - BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; - DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit ;; - *:Plan9:*:*) - # "uname -m" is not consistent, so use $cputype instead. 386 - # is converted to i386 for consistency with other x86 - # operating systems. - if test "$cputype" = "386"; then - UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" - fi - echo ${UNAME_MACHINE}-unknown-plan9 - exit ;; - *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; - *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; - KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; - XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; - *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; - *:ITS:*:*) - echo pdp10-unknown-its - exit ;; - SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} - exit ;; - *:DragonFly:*:*) - echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit ;; - *:*VMS:*:*) - UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "${UNAME_MACHINE}" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; - esac ;; - *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; - i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' - exit ;; - i*86:rdos:*:*) - echo ${UNAME_MACHINE}-pc-rdos - exit ;; - i*86:AROS:*:*) - echo ${UNAME_MACHINE}-pc-aros - exit ;; - x86_64:VMkernel:*:*) - echo ${UNAME_MACHINE}-unknown-esx - exit ;; -esac - -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi - -cat >&2 < in order to provide the needed -information to handle your system. - -config.guess timestamp = $timestamp - -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null` - -hostinfo = `(hostinfo) 2>/dev/null` -/bin/universe = `(/bin/universe) 2>/dev/null` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` -/bin/arch = `(/bin/arch) 2>/dev/null` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` - -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} -EOF - -exit 1 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..46d2ff0 --- /dev/null +++ b/config.h.in @@ -0,0 +1,64 @@ +/* include/config.h.in. Generated from configure.ac by autoheader. */ + +/* Default radix point for fixed-point */ +#cmakedefine DEFAULT_RADIX @DEFAULT_RADIX@ + +/* Define to use fixed-point computation */ +#cmakedefine FIXED_POINT + +/* Define if the system has the type `long long'. */ +#cmakedefine HAVE_LONG_LONG + +/* Define if you have the `popen' function. */ +#cmakedefine HAVE_POPEN + +/* Define if you have the `snprintf' function. */ +#cmakedefine HAVE_SNPRINTF + +/* Define if you have the header file. */ +#cmakedefine HAVE_SYS_STAT_H + +/* Define if you have the header file. */ +#cmakedefine HAVE_SYS_TYPES_H + +/* Define if you have the header file. */ +#cmakedefine HAVE_UNISTD_H + +/* Define if you have the header file. */ +#cmakedefine HAVE_INTTYPES_H + +/* Define if you have the header file. */ +#cmakedefine HAVE_STDINT_H + +/* The size of `long', as computed by sizeof. */ +#cmakedefine SIZEOF_LONG @SIZEOF_LONG@ + +/* The size of `long long', as computed by sizeof. */ +#cmakedefine SIZEOF_LONG_LONG @SIZEOF_LONG_LONG@ + +/* Define WORDS_BIGENDIAN if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN +#else +# cmakedefine WORDS_BIGENDIAN +#endif + +/* Define to the address where bug reports for this package should be sent. */ +#cmakedefine PACKAGE_BUGREPORT "@PACKAGE_BUGREPORT@" + +/* Define to the full name of this package. */ +#cmakedefine PACKAGE_NAME "@PACKAGE_NAME@" + +/* Define to the full name and version of this package. */ +#cmakedefine PACKAGE_STRING "@PACKAGE_STRING@" + +/* Define to the one symbol short name of this package. */ +#cmakedefine PACKAGE_TARNAME "@PACKAGE_TARNAME@" + +/* Define to the home page for this package. */ +#cmakedefine PACKAGE_URL "@PACKAGE_URL@" + +/* Define to the version of this package. */ +#cmakedefine PACKAGE_VERSION "@PACKAGE_VERSION@" + diff --git a/config.sub b/config.sub deleted file mode 100755 index c765b34..0000000 --- a/config.sub +++ /dev/null @@ -1,1788 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright 1992-2013 Free Software Foundation, Inc. - -timestamp='2013-04-24' - -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, see . -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that -# program. This Exception is an additional permission under section 7 -# of the GNU General Public License, version 3 ("GPLv3"). - - -# Please send patches with a ChangeLog entry to config-patches@gnu.org. -# -# Configuration subroutine to validate and canonicalize a configuration type. -# Supply the specified configuration type as an argument. -# If it is invalid, we print an error message on stderr and exit with code 1. -# Otherwise, we print the canonical config type on stdout and succeed. - -# You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or in some cases, the newer four-part form: -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS - -Canonicalize a configuration name. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.sub ($timestamp) - -Copyright 1992-2013 Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" - exit 1 ;; - - *local*) - # First pass through any local machine types. - echo $1 - exit ;; - - * ) - break ;; - esac -done - -case $# in - 0) echo "$me: missing argument$help" >&2 - exit 1;; - 1) ;; - *) echo "$me: too many arguments$help" >&2 - exit 1;; -esac - -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ - linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ - knetbsd*-gnu* | netbsd*-gnu* | \ - kopensolaris*-gnu* | \ - storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - android-linux) - os=-linux-android - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac - -### Let's recognize common machines as not being operating systems so -### that things like config.sub decstation-3100 work. We also -### recognize some manufacturers as not being operating systems, so we -### can provide default operating systems below. -case $os in - -sun*os*) - # Prevent following clause from handling this invalid input. - ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray | -microblaze*) - os= - basic_machine=$1 - ;; - -bluegene*) - os=-cnk - ;; - -sim | -cisco | -oki | -wec | -winbond) - os= - basic_machine=$1 - ;; - -scout) - ;; - -wrs) - os=-vxworks - basic_machine=$1 - ;; - -chorusos*) - os=-chorusos - basic_machine=$1 - ;; - -chorusrdb) - os=-chorusrdb - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco6) - os=-sco5v6 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5) - os=-sco3.2v5 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco4) - os=-sco3.2v4 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2v[4-9]*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5v6*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -lynx*178) - os=-lynxos178 - ;; - -lynx*5) - os=-lynxos5 - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` - ;; - -psos*) - os=-psos - ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; -esac - -# Decode aliases for certain CPU-COMPANY combinations. -case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | aarch64 | aarch64_be \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arceb \ - | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ - | avr | avr32 \ - | be32 | be64 \ - | bfin \ - | c4x | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | epiphany \ - | fido | fr30 | frv \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | hexagon \ - | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ - | le32 | le64 \ - | lm32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipsr5900 | mipsr5900el \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nds32 | nds32le | nds32be \ - | nios | nios2 | nios2eb | nios2el \ - | ns16k | ns32k \ - | open8 \ - | or1k | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle \ - | pyramid \ - | rl78 | rx \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu \ - | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ - | ubicom32 \ - | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ - | we32k \ - | x86 | xc16x | xstormy16 | xtensa \ - | z8k | z80) - basic_machine=$basic_machine-unknown - ;; - c54x) - basic_machine=tic54x-unknown - ;; - c55x) - basic_machine=tic55x-unknown - ;; - c6x) - basic_machine=tic6x-unknown - ;; - m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) - ;; - ms1) - basic_machine=mt-unknown - ;; - - strongarm | thumb | xscale) - basic_machine=arm-unknown - ;; - xgate) - basic_machine=$basic_machine-unknown - os=-none - ;; - xscaleeb) - basic_machine=armeb-unknown - ;; - - xscaleel) - basic_machine=armel-unknown - ;; - - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i*86 | x86_64) - basic_machine=$basic_machine-pc - ;; - # Object if more than one company name word. - *-*-*) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | aarch64-* | aarch64_be-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | be32-* | be64-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | hexagon-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ - | le32-* | le64-* \ - | lm32-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ - | microblaze-* | microblazeel-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64octeon-* | mips64octeonel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64r5900-* | mips64r5900el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa32r2-* | mipsisa32r2el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipsr5900-* | mipsr5900el-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nds32-* | nds32le-* | nds32be-* \ - | nios-* | nios2-* | nios2eb-* | nios2el-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | open8-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ - | pyramid-* \ - | rl78-* | romp-* | rs6000-* | rx-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ - | tahoe-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tile*-* \ - | tron-* \ - | ubicom32-* \ - | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ - | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* \ - | xstormy16-* | xtensa*-* \ - | ymp-* \ - | z8k-* | z80-*) - ;; - # Recognize the basic CPU types without company name, with glob match. - xtensa*) - basic_machine=$basic_machine-unknown - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-unknown - os=-bsd - ;; - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - abacus) - basic_machine=abacus-unknown - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amd64) - basic_machine=x86_64-pc - ;; - amd64-*) - basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aros) - basic_machine=i386-pc - os=-aros - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - blackfin) - basic_machine=bfin-unknown - os=-linux - ;; - blackfin-*) - basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - bluegene*) - basic_machine=powerpc-ibm - os=-cnk - ;; - c54x-*) - basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c55x-*) - basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c6x-*) - basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - cegcc) - basic_machine=arm-unknown - os=-cegcc - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | j90) - basic_machine=j90-cray - os=-unicos - ;; - craynv) - basic_machine=craynv-cray - os=-unicosmp - ;; - cr16 | cr16-*) - basic_machine=cr16-unknown - os=-elf - ;; - crds | unos) - basic_machine=m68k-crds - ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - crx) - basic_machine=crx-unknown - os=-elf - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 - ;; - decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - dicos) - basic_machine=i686-pc - os=-dicos - ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppa-next) - os=-nextstep3 - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; - i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 - ;; - i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 - ;; - i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv - ;; - i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - m68knommu) - basic_machine=m68k-unknown - os=-linux - ;; - m68knommu-*) - basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - microblaze*) - basic_machine=microblaze-xilinx - ;; - mingw64) - basic_machine=x86_64-pc - os=-mingw64 - ;; - mingw32) - basic_machine=i386-pc - os=-mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - os=-mingw32ce - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - morphos) - basic_machine=powerpc-unknown - os=-morphos - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - ms1-*) - basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` - ;; - msys) - basic_machine=i386-pc - os=-msys - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - nacl) - basic_machine=le32-unknown - os=-nacl - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; - np1) - basic_machine=np1-gould - ;; - neo-tandem) - basic_machine=neo-tandem - ;; - nse-tandem) - basic_machine=nse-tandem - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - openrisc | openrisc-*) - basic_machine=or32-unknown - ;; - os400) - basic_machine=powerpc-ibm - os=-os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - parisc) - basic_machine=hppa-unknown - os=-linux - ;; - parisc-*) - basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pc98) - basic_machine=i386-pc - ;; - pc98-*) - basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc - ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc - ;; - pentiumii | pentium2 | pentiumiii | pentium3) - basic_machine=i686-pc - ;; - pentium4) - basic_machine=i786-pc - ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium4-*) - basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pn) - basic_machine=pn-gould - ;; - power) basic_machine=power-ibm - ;; - ppc | ppcbe) basic_machine=powerpc-unknown - ;; - ppc-* | ppcbe-*) - basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rdos | rdos64) - basic_machine=x86_64-pc - os=-rdos - ;; - rdos32) - basic_machine=i386-pc - os=-rdos - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm - ;; - s390x | s390x-*) - basic_machine=s390x-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sb1) - basic_machine=mipsisa64sb1-unknown - ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown - ;; - sde) - basic_machine=mipsisa32-sde - os=-elf - ;; - sei) - basic_machine=mips-sei - os=-seiux - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sh5el) - basic_machine=sh5le-unknown - ;; - sh64) - basic_machine=sh64-unknown - ;; - sparclite-wrs | simso-wrs) - basic_machine=sparclite-wrs - os=-vxworks - ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 - ;; - spur) - basic_machine=spur-unknown - ;; - st2000) - basic_machine=m68k-tandem - ;; - stratus) - basic_machine=i860-stratus - os=-sysv4 - ;; - strongarm-* | thumb-*) - basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - sv1) - basic_machine=sv1-cray - os=-unicos - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - t3e) - basic_machine=alphaev5-cray - os=-unicos - ;; - t90) - basic_machine=t90-cray - os=-unicos - ;; - tile*) - basic_machine=$basic_machine-unknown - os=-linux-gnu - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - toad1) - basic_machine=pdp10-xkl - os=-tops20 - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - tpf) - basic_machine=s390x-ibm - os=-tpf - ;; - udi29k) - basic_machine=a29k-amd - os=-udi - ;; - ultra3) - basic_machine=a29k-nyu - os=-sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=-none - ;; - vaxv) - basic_machine=vax-dec - os=-sysv - ;; - vms) - basic_machine=vax-dec - os=-vms - ;; - vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; - vxworks960) - basic_machine=i960-wrs - os=-vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=-vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=-vxworks - ;; - w65*) - basic_machine=w65-wdc - os=-none - ;; - w89k-*) - basic_machine=hppa1.1-winbond - os=-proelf - ;; - xbox) - basic_machine=i686-pc - os=-mingw32 - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - xscale-* | xscalee[bl]-*) - basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` - ;; - ymp) - basic_machine=ymp-cray - os=-unicos - ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - z80-*-coff) - basic_machine=z80-unknown - os=-sim - ;; - none) - basic_machine=none-none - os=-none - ;; - -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - w89k) - basic_machine=hppa1.1-winbond - ;; - op50n) - basic_machine=hppa1.1-oki - ;; - op60c) - basic_machine=hppa1.1-oki - ;; - romp) - basic_machine=romp-ibm - ;; - mmix) - basic_machine=mmix-knuth - ;; - rs6000) - basic_machine=rs6000-ibm - ;; - vax) - basic_machine=vax-dec - ;; - pdp10) - # there are many clones, so DEC is not a safe bet - basic_machine=pdp10-unknown - ;; - pdp11) - basic_machine=pdp11-dec - ;; - we32k) - basic_machine=we32k-att - ;; - sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) - basic_machine=sh-unknown - ;; - sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) - basic_machine=sparc-sun - ;; - cydra) - basic_machine=cydra-cydrome - ;; - orion) - basic_machine=orion-highlevel - ;; - orion105) - basic_machine=clipper-highlevel - ;; - mac | mpw | mac-mpw) - basic_machine=m68k-apple - ;; - pmac | pmac-mpw) - basic_machine=powerpc-apple - ;; - *-unknown) - # Make sure to match an already-canonicalized machine name. - ;; - *) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` - ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if [ x"$os" != x"" ] -then -case $os in - # First match some system type aliases - # that might get confused with valid system types. - # -solaris* is a basic system type, with this one exception. - -auroraux) - os=-auroraux - ;; - -solaris1 | -solaris1.*) - os=`echo $os | sed -e 's|solaris1|sunos4|'` - ;; - -solaris) - os=-solaris2 - ;; - -svr4*) - os=-sysv4 - ;; - -unixware*) - os=-sysv4.2uw - ;; - -gnu/linux*) - os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` - ;; - # First accept the basic system types. - # The portable systems comes first. - # Each alternative MUST END IN A *, to match a version number. - # -sysv* is not here because it comes later, after sysvr4. - -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ - | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ - | -sym* | -kopensolaris* | -plan9* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* | -aros* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -bitrig* | -openbsd* | -solidbsd* \ - | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ - | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ - | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ - | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* | -cegcc* \ - | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ - | -linux-newlib* | -linux-musl* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ - | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ - | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ - | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ - | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ - | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) - # Remember, each alternative MUST END IN *, to match a version number. - ;; - -qnx*) - case $basic_machine in - x86-* | i*86-*) - ;; - *) - os=-nto$os - ;; - esac - ;; - -nto-qnx*) - ;; - -nto*) - os=`echo $os | sed -e 's|nto|nto-qnx|'` - ;; - -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ - | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) - ;; - -mac*) - os=`echo $os | sed -e 's|mac|macos|'` - ;; - -linux-dietlibc) - os=-linux-dietlibc - ;; - -linux*) - os=`echo $os | sed -e 's|linux|linux-gnu|'` - ;; - -sunos5*) - os=`echo $os | sed -e 's|sunos5|solaris2|'` - ;; - -sunos6*) - os=`echo $os | sed -e 's|sunos6|solaris3|'` - ;; - -opened*) - os=-openedition - ;; - -os400*) - os=-os400 - ;; - -wince*) - os=-wince - ;; - -osfrose*) - os=-osfrose - ;; - -osf*) - os=-osf - ;; - -utek*) - os=-bsd - ;; - -dynix*) - os=-bsd - ;; - -acis*) - os=-aos - ;; - -atheos*) - os=-atheos - ;; - -syllable*) - os=-syllable - ;; - -386bsd) - os=-bsd - ;; - -ctix* | -uts*) - os=-sysv - ;; - -nova*) - os=-rtmk-nova - ;; - -ns2 ) - os=-nextstep2 - ;; - -nsk*) - os=-nsk - ;; - # Preserve the version number of sinix5. - -sinix5.*) - os=`echo $os | sed -e 's|sinix|sysv|'` - ;; - -sinix*) - os=-sysv4 - ;; - -tpf*) - os=-tpf - ;; - -triton*) - os=-sysv3 - ;; - -oss*) - os=-sysv3 - ;; - -svr4) - os=-sysv4 - ;; - -svr3) - os=-sysv3 - ;; - -sysvr4) - os=-sysv4 - ;; - # This must come after -sysvr4. - -sysv*) - ;; - -ose*) - os=-ose - ;; - -es1800*) - os=-ose - ;; - -xenix) - os=-xenix - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - os=-mint - ;; - -aros*) - os=-aros - ;; - -zvmoe) - os=-zvmoe - ;; - -dicos*) - os=-dicos - ;; - -nacl*) - ;; - -none) - ;; - *) - # Get rid of the `-' at the beginning of $os. - os=`echo $os | sed 's/[^-]*-//'` - echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 - exit 1 - ;; -esac -else - -# Here we handle the default operating systems that come with various machines. -# The value should be what the vendor currently ships out the door with their -# machine or put another way, the most popular os provided with the machine. - -# Note that if you're going to try to match "-MANUFACTURER" here (say, -# "-sun"), then you have to tell the case statement up towards the top -# that MANUFACTURER isn't an operating system. Otherwise, code above -# will signal an error saying that MANUFACTURER isn't an operating -# system, and we'll never get to this point. - -case $basic_machine in - score-*) - os=-elf - ;; - spu-*) - os=-elf - ;; - *-acorn) - os=-riscix1.2 - ;; - arm*-rebel) - os=-linux - ;; - arm*-semi) - os=-aout - ;; - c4x-* | tic4x-*) - os=-coff - ;; - hexagon-*) - os=-elf - ;; - tic54x-*) - os=-coff - ;; - tic55x-*) - os=-coff - ;; - tic6x-*) - os=-coff - ;; - # This must come before the *-dec entry. - pdp10-*) - os=-tops20 - ;; - pdp11-*) - os=-none - ;; - *-dec | vax-*) - os=-ultrix4.2 - ;; - m68*-apollo) - os=-domain - ;; - i386-sun) - os=-sunos4.0.2 - ;; - m68000-sun) - os=-sunos3 - ;; - m68*-cisco) - os=-aout - ;; - mep-*) - os=-elf - ;; - mips*-cisco) - os=-elf - ;; - mips*-*) - os=-elf - ;; - or1k-*) - os=-elf - ;; - or32-*) - os=-coff - ;; - *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 - ;; - sparc-* | *-sun) - os=-sunos4.1.1 - ;; - *-be) - os=-beos - ;; - *-haiku) - os=-haiku - ;; - *-ibm) - os=-aix - ;; - *-knuth) - os=-mmixware - ;; - *-wec) - os=-proelf - ;; - *-winbond) - os=-proelf - ;; - *-oki) - os=-proelf - ;; - *-hp) - os=-hpux - ;; - *-hitachi) - os=-hiux - ;; - i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv - ;; - *-cbm) - os=-amigaos - ;; - *-dg) - os=-dgux - ;; - *-dolphin) - os=-sysv3 - ;; - m68k-ccur) - os=-rtu - ;; - m88k-omron*) - os=-luna - ;; - *-next ) - os=-nextstep - ;; - *-sequent) - os=-ptx - ;; - *-crds) - os=-unos - ;; - *-ns) - os=-genix - ;; - i370-*) - os=-mvs - ;; - *-next) - os=-nextstep3 - ;; - *-gould) - os=-sysv - ;; - *-highlevel) - os=-bsd - ;; - *-encore) - os=-bsd - ;; - *-sgi) - os=-irix - ;; - *-siemens) - os=-sysv4 - ;; - *-masscomp) - os=-rtu - ;; - f30[01]-fujitsu | f700-fujitsu) - os=-uxpv - ;; - *-rom68k) - os=-coff - ;; - *-*bug) - os=-coff - ;; - *-apple) - os=-macos - ;; - *-atari*) - os=-mint - ;; - *) - os=-none - ;; -esac -fi - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) - vendor=acorn - ;; - -sunos*) - vendor=sun - ;; - -cnk*|-aix*) - vendor=ibm - ;; - -beos*) - vendor=be - ;; - -hpux*) - vendor=hp - ;; - -mpeix*) - vendor=hp - ;; - -hiux*) - vendor=hitachi - ;; - -unos*) - vendor=crds - ;; - -dgux*) - vendor=dg - ;; - -luna*) - vendor=omron - ;; - -genix*) - vendor=ns - ;; - -mvs* | -opened*) - vendor=ibm - ;; - -os400*) - vendor=ibm - ;; - -ptx*) - vendor=sequent - ;; - -tpf*) - vendor=ibm - ;; - -vxsim* | -vxworks* | -windiss*) - vendor=wrs - ;; - -aux*) - vendor=apple - ;; - -hms*) - vendor=hitachi - ;; - -mpw* | -macos*) - vendor=apple - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - vendor=atari - ;; - -vos*) - vendor=stratus - ;; - esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` - ;; -esac - -echo $basic_machine$os -exit - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/configure b/configure deleted file mode 100755 index a1d4938..0000000 --- a/configure +++ /dev/null @@ -1,15279 +0,0 @@ -#! /bin/sh -# Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for pocketsphinx 5prealpha. -# -# -# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. -# -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -# Use a proper internal environment variable to ensure we don't fall - # into an infinite loop, continuously re-executing ourselves. - if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then - _as_can_reexec=no; export _as_can_reexec; - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 - fi - # We don't want this to propagate to other subprocesses. - { _as_can_reexec=; unset _as_can_reexec;} -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1 -test -x / || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1 - - test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( - ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - PATH=/empty FPATH=/empty; export PATH FPATH - test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ - || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in #( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - export CONFIG_SHELL - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -exit 255 -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, -$0: including any error possibly output before this -$0: message. Then install a modern shell, or manually run -$0: the script under such a shell if you do have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - - - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } - - # If we had to re-execute with $CONFIG_SHELL, we're ensured to have - # already done that, so ensure we don't try to do so again and fall - # in an infinite loop. This has already happened in practice. - _as_can_reexec=no; export _as_can_reexec - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - -SHELL=${CONFIG_SHELL-/bin/sh} - - -test -n "$DJDIR" || exec 7<&0 &1 - -# Name of the host. -# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIBOBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= - -# Identity of this package. -PACKAGE_NAME='pocketsphinx' -PACKAGE_TARNAME='pocketsphinx' -PACKAGE_VERSION='5prealpha' -PACKAGE_STRING='pocketsphinx 5prealpha' -PACKAGE_BUGREPORT='' -PACKAGE_URL='' - -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS -# include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_INTTYPES_H -# include -#endif -#ifdef HAVE_STDINT_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif" - -ac_subst_vars='am__EXEEXT_FALSE -am__EXEEXT_TRUE -LTLIBOBJS -LIBOBJS -SPHINXBASE_SWIG -SPHINXBASE_LIBS -SPHINXBASE_CFLAGS -GST_PLUGIN_LDFLAGS -plugindir -GST_LIBS -GST_CFLAGS -GST_MAJORMINOR -BUILD_GST_FALSE -BUILD_GST_TRUE -GStreamer_LIBS -GStreamer_CFLAGS -PKG_CONFIG -BUILD_SWIG_FALSE -BUILD_SWIG_TRUE -SWIG_LIB -SWIG -PYTHON_EXTRA_LDFLAGS -PYTHON_EXTRA_LIBS -PYTHON_SITE_PKG -PYTHON_LDFLAGS -PYTHON_CPPFLAGS -pkgpyexecdir -pyexecdir -pkgpythondir -pythondir -PYTHON_PLATFORM -PYTHON_EXEC_PREFIX -PYTHON_PREFIX -PYTHON_VERSION -PYTHON -BUILD_DOXYGEN_FALSE -BUILD_DOXYGEN_TRUE -HAVE_DOXYGEN -HAVE_PKGCONFIG -OTOOL64 -OTOOL -LIPO -NMEDIT -DSYMUTIL -MANIFEST_TOOL -RANLIB -ac_ct_AR -AR -DLLTOOL -OBJDUMP -LN_S -NM -ac_ct_DUMPBIN -DUMPBIN -LD -FGREP -SED -LIBTOOL -EGREP -GREP -CPP -am__fastdepCC_FALSE -am__fastdepCC_TRUE -CCDEPMODE -am__nodep -AMDEPBACKSLASH -AMDEP_FALSE -AMDEP_TRUE -am__quote -am__include -DEPDIR -OBJEXT -EXEEXT -ac_ct_CC -CPPFLAGS -LDFLAGS -CFLAGS -CC -host_os -host_vendor -host_cpu -host -build_os -build_vendor -build_cpu -build -AM_BACKSLASH -AM_DEFAULT_VERBOSITY -AM_DEFAULT_V -AM_V -am__untar -am__tar -AMTAR -am__leading_dot -SET_MAKE -AWK -mkdir_p -MKDIR_P -INSTALL_STRIP_PROGRAM -STRIP -install_sh -MAKEINFO -AUTOHEADER -AUTOMAKE -AUTOCONF -ACLOCAL -VERSION -PACKAGE -CYGPATH_W -am__isrc -INSTALL_DATA -INSTALL_SCRIPT -INSTALL_PROGRAM -target_alias -host_alias -build_alias -LIBS -ECHO_T -ECHO_N -ECHO_C -DEFS -mandir -localedir -libdir -psdir -pdfdir -dvidir -htmldir -infodir -docdir -oldincludedir -includedir -localstatedir -sharedstatedir -sysconfdir -datadir -datarootdir -libexecdir -sbindir -bindir -program_transform_name -prefix -exec_prefix -PACKAGE_URL -PACKAGE_BUGREPORT -PACKAGE_STRING -PACKAGE_VERSION -PACKAGE_TARNAME -PACKAGE_NAME -PATH_SEPARATOR -SHELL' -ac_subst_files='' -ac_user_opts=' -enable_option_checking -enable_silent_rules -enable_dependency_tracking -enable_shared -enable_static -with_pic -enable_fast_install -with_gnu_ld -with_sysroot -enable_libtool_lock -with_python -with_sphinxbase -' - ac_precious_vars='build_alias -host_alias -target_alias -CC -CFLAGS -LDFLAGS -LIBS -CPPFLAGS -CPP -PYTHON -PYTHON_VERSION -PKG_CONFIG -GStreamer_CFLAGS -GStreamer_LIBS -SPHINXBASE_CFLAGS -SPHINXBASE_LIBS' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -ac_unrecognized_opts= -ac_unrecognized_sep= -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *=) ac_optarg= ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) - ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; - esac - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error $? "missing argument to $ac_option" -fi - -if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; - fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac -fi - -# Check all directory arguments for consistency. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - # Remove trailing slashes. - case $ac_val in - */ ) - ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` - eval $ac_var=\$ac_val;; - esac - # Be sure to have absolute directory names. - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error $? "working directory cannot be determined" -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error $? "pwd does not report name of working directory" - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$as_myself" || -$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_myself" : 'X\(//\)[^/]' \| \ - X"$as_myself" : 'X\(//\)$' \| \ - X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures pocketsphinx 5prealpha to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root [DATAROOTDIR/doc/pocketsphinx] - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -Program names: - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM run sed PROGRAM on installed program names - -System types: - --build=BUILD configure for building on BUILD [guessed] - --host=HOST cross-compile to build programs to run on HOST [BUILD] -_ACEOF -fi - -if test -n "$ac_init_help"; then - case $ac_init_help in - short | recursive ) echo "Configuration of pocketsphinx 5prealpha:";; - esac - cat <<\_ACEOF - -Optional Features: - --disable-option-checking ignore unrecognized --enable/--with options - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-silent-rules less verbose build output (undo: "make V=1") - --disable-silent-rules verbose build output (undo: "make V=0") - --enable-dependency-tracking - do not reject slow dependency extractors - --disable-dependency-tracking - speeds up one-time build - --enable-shared[=PKGS] build shared libraries [default=yes] - --enable-static[=PKGS] build static libraries [default=yes] - --enable-fast-install[=PKGS] - optimize for fast installation [default=yes] - --disable-libtool-lock avoid locking (might break parallel builds) - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use - both] - --with-gnu-ld assume the C compiler uses GNU ld [default=no] - --with-sysroot=DIR Search for dependent libraries within DIR - (or the compiler's sysroot if not specified). - --with-python Enable Python extension, built with swig, enabled by - default - --with-sphinxbase=DIRECTORY - Look for SphinxBase installation in DIRECTORY. If - this is 'auto', the system-wide installation will be - used. - -Some influential environment variables: - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if - you have headers in a nonstandard directory - CPP C preprocessor - PYTHON the Python interpreter - PYTHON_VERSION - The installed Python version to use, for example '2.3'. This - string will be appended to the Python interpreter canonical - name. - PKG_CONFIG path to pkg-config utility - GStreamer_CFLAGS - C compiler flags for GStreamer, overriding pkg-config - GStreamer_LIBS - linker flags for GStreamer, overriding pkg-config - SPHINXBASE_CFLAGS - C compiler flags for SPHINXBASE, overriding pkg-config - SPHINXBASE_LIBS - linker flags for SPHINXBASE, overriding pkg-config - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -Report bugs to the package provider. -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || - { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || - continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -pocketsphinx configure 5prealpha -generated by GNU Autoconf 2.69 - -Copyright (C) 2012 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -# ac_fn_c_try_compile LINENO -# -------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_compile - -# ac_fn_c_check_type LINENO TYPE VAR INCLUDES -# ------------------------------------------- -# Tests whether TYPE exists after having included INCLUDES, setting cache -# variable VAR accordingly. -ac_fn_c_check_type () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=no" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof ($2)) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof (($2))) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - eval "$3=yes" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_type - -# ac_fn_c_try_cpp LINENO -# ---------------------- -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_cpp - -# ac_fn_c_try_run LINENO -# ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - -# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists and can be compiled using the include files in -# INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_compile - -# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES -# -------------------------------------------- -# Tries to find the compile-time value of EXPR in a program that includes -# INCLUDES, setting VAR accordingly. Returns whether the value could be -# computed -ac_fn_c_compute_int () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) >= 0)]; -test_array [0] = 0; -return test_array [0]; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_lo=0 ac_mid=0 - while :; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) <= $ac_mid)]; -test_array [0] = 0; -return test_array [0]; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_hi=$ac_mid; break -else - as_fn_arith $ac_mid + 1 && ac_lo=$as_val - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) < 0)]; -test_array [0] = 0; -return test_array [0]; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_hi=-1 ac_mid=-1 - while :; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) >= $ac_mid)]; -test_array [0] = 0; -return test_array [0]; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_lo=$ac_mid; break -else - as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - ac_lo= ac_hi= -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) <= $ac_mid)]; -test_array [0] = 0; -return test_array [0]; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_hi=$ac_mid -else - as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in #(( -?*) eval "$3=\$ac_lo"; ac_retval=0 ;; -'') ac_retval=1 ;; -esac - else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -static long int longval () { return $2; } -static unsigned long int ulongval () { return $2; } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - return 1; - if (($2) < 0) - { - long int i = longval (); - if (i != ($2)) - return 1; - fprintf (f, "%ld", i); - } - else - { - unsigned long int i = ulongval (); - if (i != ($2)) - return 1; - fprintf (f, "%lu", i); - } - /* Do not output a trailing newline, as this causes \r\n confusion - on some platforms. */ - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - echo >>conftest.val; read $3 &5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_link - -# ac_fn_c_check_func LINENO FUNC VAR -# ---------------------------------- -# Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_func - -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_mongrel -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by pocketsphinx $as_me 5prealpha, which was -generated by GNU Autoconf 2.69. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; - 2) - as_fn_append ac_configure_args1 " '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - as_fn_append ac_configure_args " '$ac_arg'" - ;; - esac - done -done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - $as_echo "## ---------------- ## -## Cache variables. ## -## ---------------- ##" - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - $as_echo "## ----------------- ## -## Output variables. ## -## ----------------- ##" - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## -## File substitutions. ## -## ------------------- ##" - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - $as_echo "## ----------- ## -## confdefs.h. ## -## ----------- ##" - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -$as_echo "/* confdefs.h */" > confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE -if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in #(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac -elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site -else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site -fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" -do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -ac_config_headers="$ac_config_headers include/config.h" - -am__api_version='1.13' - -ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in #(( - ./ | .// | /[cC]/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac - - done -IFS=$as_save_IFS - -rm -rf conftest.one conftest.two conftest.dir - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 -$as_echo_n "checking whether build environment is sane... " >&6; } -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; -esac -case $srcdir in - *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; -esac - -# Do 'set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error $? "ls -t appears to fail. Make sure there is not a broken - alias in your environment" "$LINENO" 5 - fi - if test "$2" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done - test "$2" = conftest.file - ) -then - # Ok. - : -else - as_fn_error $? "newly created file is older than distributed files! -Check your system clock" "$LINENO" 5 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -# If we didn't sleep, we still need to ensure time stamps of config.status and -# generated files are strictly newer. -am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & - am_sleep_pid=$! -fi - -rm -f conftest.file - -test "$program_prefix" != NONE && - program_transform_name="s&^&$program_prefix&;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. -# By default was `s,x,x', remove it if useless. -ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' -program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` - -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` - -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --is-lightweight"; then - am_missing_run="$MISSING " -else - am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} -fi - -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi - -# Installed binaries are usually stripped using 'strip' when the user -# run "make install-strip". However 'strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the 'STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 -$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } -if test -z "$MKDIR_P"; then - if ${ac_cv_path_mkdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do - for ac_exec_ext in '' $ac_executable_extensions; do - as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue - case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( - 'mkdir (GNU coreutils) '* | \ - 'mkdir (coreutils) '* | \ - 'mkdir (fileutils) '4.1*) - ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext - break 3;; - esac - done - done - done -IFS=$as_save_IFS - -fi - - test -d ./--version && rmdir ./--version - if test "${ac_cv_path_mkdir+set}" = set; then - MKDIR_P="$ac_cv_path_mkdir -p" - else - # As a last resort, use the slow shell script. Don't cache a - # value for MKDIR_P within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - MKDIR_P="$ac_install_sh -d" - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 -$as_echo "$MKDIR_P" >&6; } - -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AWK" && break -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SET_MAKE= -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi - -rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null - -# Check whether --enable-silent-rules was given. -if test "${enable_silent_rules+set}" = set; then : - enableval=$enable_silent_rules; -fi - -case $enable_silent_rules in # ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=1;; -esac -am_make=${MAKE-make} -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 -$as_echo_n "checking whether $am_make supports nested variables... " >&6; } -if ${am_cv_make_support_nested_variables+:} false; then : - $as_echo_n "(cached) " >&6 -else - if $as_echo 'TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 -$as_echo "$am_cv_make_support_nested_variables" >&6; } -if test $am_cv_make_support_nested_variables = yes; then - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AM_BACKSLASH='\' - -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - am__isrc=' -I$(srcdir)' - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi - - -# Define the identity of the package. - PACKAGE='pocketsphinx' - VERSION='5prealpha' - - -# Some tools Automake needs. - -ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} - - -AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} - - -AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} - - -AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} - - -MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} - -# For better backward compatibility. To be removed once Automake 1.9.x -# dies out for good. For more background, see: -# -# -mkdir_p='$(MKDIR_P)' - -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AMTAR='$${TAR-tar}' - - -# We'll loop over all known methods to create a tar archive until one works. -_am_tools='gnutar pax cpio none' - -am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' - - - - - - - - -CFLAGS=${CFLAGS:--g -O2 -Wall} - -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if ${ac_cv_build+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -test "x$ac_build_alias" = x && - as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if ${ac_cv_host+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build -else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { { ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -ac_exeext=$ac_cv_exeext - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -DEPDIR="${am__leading_dot}deps" - -ac_config_commands="$ac_config_commands depfiles" - - -am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 -$as_echo_n "checking for style of include used by $am_make... " >&6; } -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from 'make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 -$as_echo "$_am_result" >&6; } -rm -f confinc confmf - -# Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then : - enableval=$enable_dependency_tracking; -fi - -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' -fi - if test "x$enable_dependency_tracking" != xno; then - AMDEP_TRUE= - AMDEP_FALSE='#' -else - AMDEP_TRUE='#' - AMDEP_FALSE= -fi - - - -depcc="$CC" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CC_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with '-c' and '-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CC_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CC_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } -CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then - am__fastdepCC_TRUE= - am__fastdepCC_FALSE='#' -else - am__fastdepCC_TRUE='#' - am__fastdepCC_FALSE= -fi - - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -ac_fn_c_check_type "$LINENO" "long long" "ac_cv_type_long_long" "$ac_includes_default" -if test "x$ac_cv_type_long_long" = xyes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_LONG_LONG 1 -_ACEOF - - -fi - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 -$as_echo_n "checking size of long long... " >&6; } -if ${ac_cv_sizeof_long_long+:} false; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then : - -else - if test "$ac_cv_type_long_long" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "cannot compute sizeof (long long) -See \`config.log' for more details" "$LINENO" 5; } - else - ac_cv_sizeof_long_long=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5 -$as_echo "$ac_cv_sizeof_long_long" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long -_ACEOF - - - -case `pwd` in - *\ * | *\ *) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; -esac - - - -macro_version='2.4.2' -macro_revision='1.3337' - - - - - - - - - - - - - -ltmain="$ac_aux_dir/ltmain.sh" - -# Backslashify metacharacters that are still active within -# double-quoted strings. -sed_quote_subst='s/\(["`$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 -$as_echo_n "checking how to print strings... " >&6; } -# Test print first, because it will be a builtin if present. -if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ - test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='print -r --' -elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='printf %s\n' -else - # Use this function as a fallback that always works. - func_fallback_echo () - { - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' - } - ECHO='func_fallback_echo' -fi - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "" -} - -case "$ECHO" in - printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 -$as_echo "printf" >&6; } ;; - print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 -$as_echo "print -r" >&6; } ;; - *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 -$as_echo "cat" >&6; } ;; -esac - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for ac_i in 1 2 3 4 5 6 7; do - ac_script="$ac_script$as_nl$ac_script" - done - echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - { ac_script=; unset ac_script;} - if test -z "$SED"; then - ac_path_SED_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_SED" || continue -# Check for GNU ac_path_SED and select it if it is found. - # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in -*GNU*) - ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" - "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_SED_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_SED="$ac_path_SED" - ac_path_SED_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_SED_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_SED"; then - as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 - fi -else - ac_cv_path_SED=$SED -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } - SED="$ac_cv_path_SED" - rm -f conftest.sed - -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -$as_echo_n "checking for fgrep... " >&6; } -if ${ac_cv_path_FGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 - then ac_cv_path_FGREP="$GREP -F" - else - if test -z "$FGREP"; then - ac_path_FGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in fgrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_FGREP" || continue -# Check for GNU ac_path_FGREP and select it if it is found. - # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in -*GNU*) - ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'FGREP' >> "conftest.nl" - "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_FGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_FGREP="$ac_path_FGREP" - ac_path_FGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_FGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_FGREP"; then - as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_FGREP=$FGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 -$as_echo "$ac_cv_path_FGREP" >&6; } - FGREP="$ac_cv_path_FGREP" - - -test -z "$GREP" && GREP=grep - - - - - - - - - - - - - - - - - - - -# Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 -$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if ${lt_cv_path_NM+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS="$lt_save_ifs" - done - : ${lt_cv_path_NM=no} -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 -$as_echo "$lt_cv_path_NM" >&6; } -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - if test -n "$ac_tool_prefix"; then - for ac_prog in dumpbin "link -dump" - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DUMPBIN"; then - ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DUMPBIN=$ac_cv_prog_DUMPBIN -if test -n "$DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 -$as_echo "$DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$DUMPBIN" && break - done -fi -if test -z "$DUMPBIN"; then - ac_ct_DUMPBIN=$DUMPBIN - for ac_prog in dumpbin "link -dump" -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DUMPBIN"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN -if test -n "$ac_ct_DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 -$as_echo "$ac_ct_DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_DUMPBIN" && break -done - - if test "x$ac_ct_DUMPBIN" = x; then - DUMPBIN=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DUMPBIN=$ac_ct_DUMPBIN - fi -fi - - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols" - ;; - *) - DUMPBIN=: - ;; - esac - fi - - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 -$as_echo_n "checking the name lister ($NM) interface... " >&6; } -if ${lt_cv_nm_interface+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: output\"" >&5) - cat conftest.out >&5 - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 -$as_echo "$lt_cv_nm_interface" >&6; } - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } -LN_S=$as_ln_s -if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } -fi - -# find the maximum length of command line arguments -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 -$as_echo_n "checking the maximum length of command line arguments... " >&6; } -if ${lt_cv_sys_max_cmd_len+:} false; then : - $as_echo_n "(cached) " >&6 -else - i=0 - teststring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - os2*) - # The test takes a long time on OS/2. - lt_cv_sys_max_cmd_len=8192 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; - esac - -fi - -if test -n $lt_cv_sys_max_cmd_len ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 -$as_echo "$lt_cv_sys_max_cmd_len" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } -fi -max_cmd_len=$lt_cv_sys_max_cmd_len - - - - - - -: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 -$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,b/c, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 -$as_echo "$xsi_shell" >&6; } - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 -$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } -lt_shell_append=no -( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 -$as_echo "$lt_shell_append" >&6; } - - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi - - - - - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 -$as_echo_n "checking how to convert $build file names to $host format... " >&6; } -if ${lt_cv_to_host_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 - ;; - esac - ;; - *-*-cygwin* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin - ;; - esac - ;; - * ) # unhandled hosts (and "normal" native builds) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; -esac - -fi - -to_host_file_cmd=$lt_cv_to_host_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 -$as_echo "$lt_cv_to_host_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 -$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } -if ${lt_cv_to_tool_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - #assume ordinary cross tools, or native build. -lt_cv_to_tool_file_cmd=func_convert_file_noop -case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 - ;; - esac - ;; -esac - -fi - -to_tool_file_cmd=$lt_cv_to_tool_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 -$as_echo "$lt_cv_to_tool_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 -$as_echo_n "checking for $LD option to reload object files... " >&6; } -if ${lt_cv_ld_reload_flag+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_reload_flag='-r' -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 -$as_echo "$lt_cv_ld_reload_flag" >&6; } -reload_flag=$lt_cv_ld_reload_flag -case $reload_flag in -"" | " "*) ;; -*) reload_flag=" $reload_flag" ;; -esac -reload_cmds='$LD$reload_flag -o $output$reload_objs' -case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - if test "$GCC" != yes; then - reload_cmds=false - fi - ;; - darwin*) - if test "$GCC" = yes; then - reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' - else - reload_cmds='$LD$reload_flag -o $output$reload_objs' - fi - ;; -esac - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OBJDUMP=$ac_ct_OBJDUMP - fi -else - OBJDUMP="$ac_cv_prog_OBJDUMP" -fi - -test -z "$OBJDUMP" && OBJDUMP=objdump - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 -$as_echo_n "checking how to recognize dependent libraries... " >&6; } -if ${lt_cv_deplibs_check_method+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_file_magic_cmd='$MAGIC_CMD' -lt_cv_file_magic_test_file= -lt_cv_deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [[regex]]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given extended regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. - -case $host_os in -aix[4-9]*) - lt_cv_deplibs_check_method=pass_all - ;; - -beos*) - lt_cv_deplibs_check_method=pass_all - ;; - -bsdi[45]*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' - lt_cv_file_magic_cmd='/usr/bin/file -L' - lt_cv_file_magic_test_file=/shlib/libc.so - ;; - -cygwin*) - # func_win32_libid is a shell function defined in ltmain.sh - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - ;; - -mingw* | pw32*) - # Base MSYS/MinGW do not provide the 'file' command needed by - # func_win32_libid shell function, so use a weaker test based on 'objdump', - # unless we find 'file', for example because we are cross-compiling. - # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. - if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' - lt_cv_file_magic_cmd='$OBJDUMP -f' - fi - ;; - -cegcc*) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; - -freebsd* | dragonfly*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -haiku*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case $host_cpu in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -interix[3-9]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' - ;; - -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -*nto* | *qnx*) - lt_cv_deplibs_check_method=pass_all - ;; - -openbsd*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - fi - ;; - -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; - -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 -$as_echo "$lt_cv_deplibs_check_method" >&6; } - -file_magic_glob= -want_nocaseglob=no -if test "$build" = "$host"; then - case $host_os in - mingw* | pw32*) - if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then - want_nocaseglob=yes - else - file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` - fi - ;; - esac -fi - -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown - - - - - - - - - - - - - - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DLLTOOL=$ac_cv_prog_DLLTOOL -if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DLLTOOL"; then - ac_ct_DLLTOOL=$DLLTOOL - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DLLTOOL"; then - ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL -if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DLLTOOL" = x; then - DLLTOOL="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DLLTOOL=$ac_ct_DLLTOOL - fi -else - DLLTOOL="$ac_cv_prog_DLLTOOL" -fi - -test -z "$DLLTOOL" && DLLTOOL=dlltool - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 -$as_echo_n "checking how to associate runtime and link libraries... " >&6; } -if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_sharedlib_from_linklib_cmd='unknown' - -case $host_os in -cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh - # decide which to use based on capabilities of $DLLTOOL - case `$DLLTOOL --help 2>&1` in - *--identify-strict*) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib - ;; - *) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback - ;; - esac - ;; -*) - # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd="$ECHO" - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 -$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } -sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd -test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO - - - - - - - -if test -n "$ac_tool_prefix"; then - for ac_prog in ar - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AR="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AR=$ac_cv_prog_AR -if test -n "$AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -$as_echo "$AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AR" && break - done -fi -if test -z "$AR"; then - ac_ct_AR=$AR - for ac_prog in ar -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_AR"; then - ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_AR="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_AR=$ac_cv_prog_ac_ct_AR -if test -n "$ac_ct_AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -$as_echo "$ac_ct_AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_AR" && break -done - - if test "x$ac_ct_AR" = x; then - AR="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - AR=$ac_ct_AR - fi -fi - -: ${AR=ar} -: ${AR_FLAGS=cru} - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 -$as_echo_n "checking for archiver @FILE support... " >&6; } -if ${lt_cv_ar_at_file+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ar_at_file=no - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - echo conftest.$ac_objext > conftest.lst - lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test "$ac_status" -eq 0; then - # Ensure the archiver fails upon bogus file names. - rm -f conftest.$ac_objext libconftest.a - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test "$ac_status" -ne 0; then - lt_cv_ar_at_file=@ - fi - fi - rm -f conftest.* libconftest.a - -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 -$as_echo "$lt_cv_ar_at_file" >&6; } - -if test "x$lt_cv_ar_at_file" = xno; then - archiver_list_spec= -else - archiver_list_spec=$lt_cv_ar_at_file -fi - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -test -z "$STRIP" && STRIP=: - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - -test -z "$RANLIB" && RANLIB=: - - - - - - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" -fi - -case $host_os in - darwin*) - lock_old_archive_extraction=yes ;; - *) - lock_old_archive_extraction=no ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# Check for command to grab the raw symbol name followed by C symbol from nm. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 -$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -if ${lt_cv_sys_global_symbol_pipe+:} false; then : - $as_echo_n "(cached) " >&6 -else - -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[BCDEGRST]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([_A-Za-z][_A-Za-z0-9]*\)' - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[BCDT]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[ABCDGISTW]' - ;; -hpux*) - if test "$host_cpu" = ia64; then - symcode='[ABCDEGRST]' - fi - ;; -irix* | nonstopux*) - symcode='[BCDEGRST]' - ;; -osf*) - symcode='[BCDEGQRST]' - ;; -solaris*) - symcode='[BDRT]' - ;; -sco3.2v5*) - symcode='[DT]' - ;; -sysv4.2uw2*) - symcode='[DT]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[ABDT]' - ;; -sysv4) - symcode='[DFNSTU]' - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[ABCDGIRSTW]' ;; -esac - -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK '"\ -" {last_section=section; section=\$ 3};"\ -" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Now try to grab the symbols. - nlist=conftest.nm - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 - (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if $GREP ' nm_test_var$' "$nlist" >/dev/null; then - if $GREP ' nm_test_func$' "$nlist" >/dev/null; then - cat <<_LT_EOF > conftest.$ac_ext -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT_DLSYM_CONST -#else -# define LT_DLSYM_CONST const -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -LT_DLSYM_CONST struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_globsym_save_LIBS=$LIBS - lt_globsym_save_CFLAGS=$CFLAGS - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext}; then - pipe_works=yes - fi - LIBS=$lt_globsym_save_LIBS - CFLAGS=$lt_globsym_save_CFLAGS - else - echo "cannot find nm_test_func in $nlist" >&5 - fi - else - echo "cannot find nm_test_var in $nlist" >&5 - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 - fi - else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - fi - rm -rf conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done - -fi - -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -$as_echo "ok" >&6; } -fi - -# Response file support. -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - nm_file_list_spec='@' -elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then - nm_file_list_spec='@' -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 -$as_echo_n "checking for sysroot... " >&6; } - -# Check whether --with-sysroot was given. -if test "${with_sysroot+set}" = set; then : - withval=$with_sysroot; -else - with_sysroot=no -fi - - -lt_sysroot= -case ${with_sysroot} in #( - yes) - if test "$GCC" = yes; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 -$as_echo "${with_sysroot}" >&6; } - as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 - ;; -esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 -$as_echo "${lt_sysroot:-no}" >&6; } - - - - - -# Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then : - enableval=$enable_libtool_lock; -fi - -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out which ABI we are using. - echo '#line '$LINENO' "configure"' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*|powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 -$as_echo_n "checking whether the C compiler needs -belf... " >&6; } -if ${lt_cv_cc_needs_belf+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_cc_needs_belf=yes -else - lt_cv_cc_needs_belf=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 -$as_echo "$lt_cv_cc_needs_belf" >&6; } - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; -*-*solaris*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) - case $host in - i?86-*-solaris*) - LD="${LD-ld} -m elf_x86_64" - ;; - sparc*-*-solaris*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - # GNU ld 2.21 introduced _sol2 emulations. Use them if available. - if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then - LD="${LD-ld}_sol2" - fi - ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks="$enable_libtool_lock" - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. -set dummy ${ac_tool_prefix}mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$MANIFEST_TOOL"; then - ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL -if test -n "$MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 -$as_echo "$MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_MANIFEST_TOOL"; then - ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL - # Extract the first word of "mt", so it can be a program name with args. -set dummy mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_MANIFEST_TOOL"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL -if test -n "$ac_ct_MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 -$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_MANIFEST_TOOL" = x; then - MANIFEST_TOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL - fi -else - MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" -fi - -test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 -$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } -if ${lt_cv_path_mainfest_tool+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_path_mainfest_tool=no - echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 - $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out - cat conftest.err >&5 - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 -$as_echo "$lt_cv_path_mainfest_tool" >&6; } -if test "x$lt_cv_path_mainfest_tool" != xyes; then - MANIFEST_TOOL=: -fi - - - - - - - case $host_os in - rhapsody* | darwin*) - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. -set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DSYMUTIL"; then - ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DSYMUTIL=$ac_cv_prog_DSYMUTIL -if test -n "$DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 -$as_echo "$DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DSYMUTIL"; then - ac_ct_DSYMUTIL=$DSYMUTIL - # Extract the first word of "dsymutil", so it can be a program name with args. -set dummy dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DSYMUTIL"; then - ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL -if test -n "$ac_ct_DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 -$as_echo "$ac_ct_DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DSYMUTIL" = x; then - DSYMUTIL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DSYMUTIL=$ac_ct_DSYMUTIL - fi -else - DSYMUTIL="$ac_cv_prog_DSYMUTIL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. -set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NMEDIT"; then - ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -NMEDIT=$ac_cv_prog_NMEDIT -if test -n "$NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 -$as_echo "$NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_NMEDIT"; then - ac_ct_NMEDIT=$NMEDIT - # Extract the first word of "nmedit", so it can be a program name with args. -set dummy nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_NMEDIT"; then - ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_NMEDIT="nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT -if test -n "$ac_ct_NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 -$as_echo "$ac_ct_NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_NMEDIT" = x; then - NMEDIT=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - NMEDIT=$ac_ct_NMEDIT - fi -else - NMEDIT="$ac_cv_prog_NMEDIT" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. -set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$LIPO"; then - ac_cv_prog_LIPO="$LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -LIPO=$ac_cv_prog_LIPO -if test -n "$LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 -$as_echo "$LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_LIPO"; then - ac_ct_LIPO=$LIPO - # Extract the first word of "lipo", so it can be a program name with args. -set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_LIPO"; then - ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_LIPO="lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO -if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 -$as_echo "$ac_ct_LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_LIPO" = x; then - LIPO=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - LIPO=$ac_ct_LIPO - fi -else - LIPO="$ac_cv_prog_LIPO" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL"; then - ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL=$ac_cv_prog_OTOOL -if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL"; then - ac_ct_OTOOL=$OTOOL - # Extract the first word of "otool", so it can be a program name with args. -set dummy otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL"; then - ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL="otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL -if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 -$as_echo "$ac_ct_OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL" = x; then - OTOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL=$ac_ct_OTOOL - fi -else - OTOOL="$ac_cv_prog_OTOOL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL64"; then - ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL64=$ac_cv_prog_OTOOL64 -if test -n "$OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 -$as_echo "$OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL64"; then - ac_ct_OTOOL64=$OTOOL64 - # Extract the first word of "otool64", so it can be a program name with args. -set dummy otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL64"; then - ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL64="otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 -if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 -$as_echo "$ac_ct_OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL64" = x; then - OTOOL64=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL64=$ac_ct_OTOOL64 - fi -else - OTOOL64="$ac_cv_prog_OTOOL64" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -$as_echo_n "checking for -single_module linker flag... " >&6; } -if ${lt_cv_apple_cc_single_mod+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - # If there is a non-empty error log, and "single_module" - # appears in it, assume the flag caused a linker warning - if test -s conftest.err && $GREP single_module conftest.err; then - cat conftest.err >&5 - # Otherwise, if the output was created with a 0 exit code from - # the compiler, it worked. - elif test -f libconftest.dylib && test $_lt_result -eq 0; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&5 - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 -$as_echo "$lt_cv_apple_cc_single_mod" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -if ${lt_cv_ld_exported_symbols_list+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_ld_exported_symbols_list=yes -else - lt_cv_ld_exported_symbols_list=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 -$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 -$as_echo_n "checking for -force_load linker flag... " >&6; } -if ${lt_cv_ld_force_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_force_load=no - cat > conftest.c << _LT_EOF -int forced_loaded() { return 2;} -_LT_EOF - echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 - $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 - echo "$AR cru libconftest.a conftest.o" >&5 - $AR cru libconftest.a conftest.o 2>&5 - echo "$RANLIB libconftest.a" >&5 - $RANLIB libconftest.a 2>&5 - cat > conftest.c << _LT_EOF -int main() { return 0;} -_LT_EOF - echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err - _lt_result=$? - if test -s conftest.err && $GREP force_load conftest.err; then - cat conftest.err >&5 - elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then - lt_cv_ld_force_load=yes - else - cat conftest.err >&5 - fi - rm -f conftest.err libconftest.a conftest conftest.c - rm -rf conftest.dSYM - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 -$as_echo "$lt_cv_ld_force_load" >&6; } - case $host_os in - rhapsody* | darwin1.[012]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[91]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[012]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then - _lt_dar_single_mod='$single_module' - fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac - -for ac_header in dlfcn.h -do : - ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default -" -if test "x$ac_cv_header_dlfcn_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DLFCN_H 1 -_ACEOF - -fi - -done - - - - - -# Set options - - - - enable_dlopen=no - - - enable_win32_dll=no - - - # Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then : - enableval=$enable_shared; p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_shared=yes -fi - - - - - - - - - - # Check whether --enable-static was given. -if test "${enable_static+set}" = set; then : - enableval=$enable_static; p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_static=yes -fi - - - - - - - - - - -# Check whether --with-pic was given. -if test "${with_pic+set}" = set; then : - withval=$with_pic; lt_p=${PACKAGE-default} - case $withval in - yes|no) pic_mode=$withval ;; - *) - pic_mode=default - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for lt_pkg in $withval; do - IFS="$lt_save_ifs" - if test "X$lt_pkg" = "X$lt_p"; then - pic_mode=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - pic_mode=default -fi - - -test -z "$pic_mode" && pic_mode=default - - - - - - - - # Check whether --enable-fast-install was given. -if test "${enable_fast_install+set}" = set; then : - enableval=$enable_fast_install; p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_fast_install=yes -fi - - - - - - - - - - - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -test -z "$LN_S" && LN_S="ln -s" - - - - - - - - - - - - - - -if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 -$as_echo_n "checking for objdir... " >&6; } -if ${lt_cv_objdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 -$as_echo "$lt_cv_objdir" >&6; } -objdir=$lt_cv_objdir - - - - - -cat >>confdefs.h <<_ACEOF -#define LT_OBJDIR "$lt_cv_objdir/" -_ACEOF - - - - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a - -with_gnu_ld="$lt_cv_prog_gnu_ld" - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` - - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 -$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/${ac_tool_prefix}file; then - lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - - - -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 -$as_echo_n "checking for file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/file; then - lt_cv_path_MAGIC_CMD="$ac_dir/file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - else - MAGIC_CMD=: - fi -fi - - fi - ;; -esac - -# Use C for the default configuration in the libtool script - -lt_save_CC="$CC" -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -objext=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - -## CAVEAT EMPTOR: -## There is no encapsulation within the following macros, do not change -## the running order or otherwise move them around unless you know exactly -## what you are doing... -if test -n "$compiler"; then - -lt_prog_compiler_no_builtin_flag= - -if test "$GCC" = yes; then - case $cc_basename in - nvcc*) - lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; - *) - lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; - esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="-fno-rtti -fno-exceptions" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_rtti_exceptions=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } - -if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then - lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" -else - : -fi - -fi - - - - - - - lt_prog_compiler_wl= -lt_prog_compiler_pic= -lt_prog_compiler_static= - - - if test "$GCC" = yes; then - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_static='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic='-fno-common' - ;; - - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static= - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - ;; - - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - lt_prog_compiler_can_build_shared=no - enable_shared=no - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic=-Kconform_pic - fi - ;; - - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - - case $cc_basename in - nvcc*) # Cuda Compiler Driver 2.2 - lt_prog_compiler_wl='-Xlinker ' - if test -n "$lt_prog_compiler_pic"; then - lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" - fi - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - lt_prog_compiler_wl='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - else - lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - hpux9* | hpux10* | hpux11*) - lt_prog_compiler_wl='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - lt_prog_compiler_wl='-Wl,' - # PIC (with -KPIC) is the default. - lt_prog_compiler_static='-non_shared' - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. - ecc*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='--shared' - lt_prog_compiler_static='--static' - ;; - nagfor*) - # NAG Fortran compiler - lt_prog_compiler_wl='-Wl,-Wl,,' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - ccc*) - lt_prog_compiler_wl='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - xl* | bgxl* | bgf* | mpixl*) - # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-qpic' - lt_prog_compiler_static='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='' - ;; - *Sun\ F* | *Sun*Fortran*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Qoption ld ' - ;; - *Sun\ C*) - # Sun C 5.9 - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Wl,' - ;; - *Intel*\ [CF]*Compiler*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - *Portland\ Group*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - esac - ;; - esac - ;; - - newsos6) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - osf3* | osf4* | osf5*) - lt_prog_compiler_wl='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - - rdos*) - lt_prog_compiler_static='-non_shared' - ;; - - solaris*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - case $cc_basename in - f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) - lt_prog_compiler_wl='-Qoption ld ';; - *) - lt_prog_compiler_wl='-Wl,';; - esac - ;; - - sunos4*) - lt_prog_compiler_wl='-Qoption ld ' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - lt_prog_compiler_pic='-Kconform_pic' - lt_prog_compiler_static='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - unicos*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_can_build_shared=no - ;; - - uts4*) - lt_prog_compiler_pic='-pic' - lt_prog_compiler_static='-Bstatic' - ;; - - *) - lt_prog_compiler_can_build_shared=no - ;; - esac - fi - -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic= - ;; - *) - lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic=$lt_prog_compiler_pic -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 -$as_echo "$lt_cv_prog_compiler_pic" >&6; } -lt_prog_compiler_pic=$lt_cv_prog_compiler_pic - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if ${lt_cv_prog_compiler_pic_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } - -if test x"$lt_cv_prog_compiler_pic_works" = xyes; then - case $lt_prog_compiler_pic in - "" | " "*) ;; - *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; - esac -else - lt_prog_compiler_pic= - lt_prog_compiler_can_build_shared=no -fi - -fi - - - - - - - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works=yes - fi - else - lt_cv_prog_compiler_static_works=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 -$as_echo "$lt_cv_prog_compiler_static_works" >&6; } - -if test x"$lt_cv_prog_compiler_static_works" = xyes; then - : -else - lt_prog_compiler_static= -fi - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - runpath_var= - allow_undefined_flag= - always_export_symbols=no - archive_cmds= - archive_expsym_cmds= - compiler_needs_object=no - enable_shared_with_static_runtimes=no - export_dynamic_flag_spec= - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - hardcode_automatic=no - hardcode_direct=no - hardcode_direct_absolute=no - hardcode_libdir_flag_spec= - hardcode_libdir_separator= - hardcode_minus_L=no - hardcode_shlibpath_var=unsupported - inherit_rpath=no - link_all_deplibs=unknown - module_cmds= - module_expsym_cmds= - old_archive_from_new_cmds= - old_archive_from_expsyms_cmds= - thread_safe_flag_spec= - whole_archive_flag_spec= - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - include_expsyms= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - # Exclude shared library initialization/finalization symbols. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - esac - - ld_shlibs=yes - - # On some targets, GNU ld is compatible enough with the native linker - # that we're better off using the native interface for both. - lt_use_gnu_ld_interface=no - if test "$with_gnu_ld" = yes; then - case $host_os in - aix*) - # The AIX port of GNU ld has always aspired to compatibility - # with the native linker. However, as the warning in the GNU ld - # block says, versions before 2.19.5* couldn't really create working - # shared libraries, regardless of the interface used. - case `$LD -v 2>&1` in - *\ \(GNU\ Binutils\)\ 2.19.5*) ;; - *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; - *\ \(GNU\ Binutils\)\ [3-9]*) ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - fi - - if test "$lt_use_gnu_ld_interface" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec= - fi - supports_anon_versioning=no - case `$LD -v 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix[3-9]*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: the GNU linker, at least up to release 2.19, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to install binutils -*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. -*** You will then need to restart the configuration process. - -_LT_EOF - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs=no - fi - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - export_dynamic_flag_spec='${wl}--export-all-symbols' - allow_undefined_flag=unsupported - always_export_symbols=no - enable_shared_with_static_runtimes=yes - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs=no - fi - ;; - - haiku*) - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - link_all_deplibs=yes - ;; - - interix[3-9]*) - hardcode_direct=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test "$host_os" = linux-dietlibc; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no - then - tmp_addflag=' $pic_flag' - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group f77 and f90 compilers - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - whole_archive_flag_spec= - tmp_sharedflag='--shared' ;; - xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - nvcc*) # Cuda Compiler Driver 2.2 - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - ;; - esac - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) # Sun C 5.9 - whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - xlf* | bgf* | bgxlf* | mpixlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - ld_shlibs=no - fi - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - - if test "$ld_shlibs" = no; then - runpath_var= - hardcode_libdir_flag_spec= - export_dynamic_flag_spec= - whole_archive_flag_spec= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag=unsupported - always_export_symbols=yes - archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - - aix[4-9]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds='' - hardcode_direct=yes - hardcode_direct_absolute=yes - hardcode_libdir_separator=':' - link_all_deplibs=yes - file_list_spec='${wl}-f,' - - if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - export_dynamic_flag_spec='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag="-z nodefs" - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag=' ${wl}-bernotok' - allow_undefined_flag=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec='$convenience' - fi - archive_cmds_need_lc=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - bsdi[45]*) - export_dynamic_flag_spec=-rdynamic - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - case $cc_basename in - cl*) - # Native MSVC - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - always_export_symbols=yes - file_list_spec='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, )='true' - enable_shared_with_static_runtimes=yes - exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' - # Don't use ranlib - old_postinstall_cmds='chmod 644 $oldlib' - postlink_cmds='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # Assume MSVC wrapper - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_from_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' - enable_shared_with_static_runtimes=yes - ;; - esac - ;; - - darwin* | rhapsody*) - - - archive_cmds_need_lc=no - hardcode_direct=no - hardcode_automatic=yes - hardcode_shlibpath_var=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - - else - whole_archive_flag_spec='' - fi - link_all_deplibs=yes - allow_undefined_flag="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - - else - ld_shlibs=no - fi - - ;; - - dgux*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2.*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly*) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - hpux9*) - if test "$GCC" = yes; then - archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - export_dynamic_flag_spec='${wl}-E' - ;; - - hpux10*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - fi - ;; - - hpux11*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - - # Older versions of the 11.00 compiler do not understand -b yet - # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 -$as_echo_n "checking if $CC understands -b... " >&6; } -if ${lt_cv_prog_compiler__b+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler__b=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -b" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler__b=yes - fi - else - lt_cv_prog_compiler__b=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 -$as_echo "$lt_cv_prog_compiler__b" >&6; } - -if test x"$lt_cv_prog_compiler__b" = xyes; then - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' -else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' -fi - - ;; - esac - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct=no - hardcode_shlibpath_var=no - ;; - *) - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - # This should be the same for all languages, so no per-tag cache variable. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 -$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } -if ${lt_cv_irix_exported_symbol+:} false; then : - $as_echo_n "(cached) " >&6 -else - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int foo (void) { return 0; } -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_irix_exported_symbol=yes -else - lt_cv_irix_exported_symbol=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 -$as_echo "$lt_cv_irix_exported_symbol" >&6; } - if test "$lt_cv_irix_exported_symbol" = yes; then - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - fi - else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - inherit_rpath=yes - link_all_deplibs=yes - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - newsos6) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_shlibpath_var=no - ;; - - *nto* | *qnx*) - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - hardcode_direct=yes - hardcode_shlibpath_var=no - hardcode_direct_absolute=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - else - case $host_os in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-R$libdir' - ;; - *) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - ;; - esac - fi - else - ld_shlibs=no - fi - ;; - - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' - - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec='-rpath $libdir' - fi - archive_cmds_need_lc='no' - hardcode_libdir_separator=: - ;; - - solaris*) - no_undefined_flag=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' - ;; - *) - wlarc='${wl}' - archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - else - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' - fi - ;; - esac - link_all_deplibs=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - sysv4) - case $host_vendor in - sni) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds='$CC -r -o $output$reload_objs' - hardcode_direct=no - ;; - motorola) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - - sysv4.3*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag='${wl}-z,text' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag='${wl}-z,text' - allow_undefined_flag='${wl}-z,nodefs' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-R,$libdir' - hardcode_libdir_separator=':' - link_all_deplibs=yes - export_dynamic_flag_spec='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - *) - ld_shlibs=no - ;; - esac - - if test x$host_vendor = xsni; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - export_dynamic_flag_spec='${wl}-Blargedynsym' - ;; - esac - fi - fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 -$as_echo "$ld_shlibs" >&6; } -test "$ld_shlibs" = no && can_build_shared=no - -with_gnu_ld=$with_gnu_ld - - - - - - - - - - - - - - - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl - pic_flag=$lt_prog_compiler_pic - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag - allow_undefined_flag= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc=no - else - lt_cv_archive_cmds_need_lc=yes - fi - allow_undefined_flag=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } - archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -if test "$GCC" = yes; then - case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; - esac - case $host_os in - mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; - *) lt_sed_strip_eq="s,=/,/,g" ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` - case $lt_search_path_spec in - *\;*) - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` - ;; - *) - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` - ;; - esac - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary. - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path/$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" - else - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" - fi - done - lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[lt_foo]++; } - if (lt_freq[lt_foo] == 1) { print lt_foo; } -}'` - # AWK program above erroneously prepends '/' to C:/dos/paths - # for these hosts. - case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's,/\([A-Za-z]:\),\1,g'` ;; - esac - sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[4-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[23].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Add ABI-specific directories to the system library path. - sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" - - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || - test -n "$runpath_var" || - test "X$hardcode_automatic" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$hardcode_direct" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && - test "$hardcode_minus_L" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action=unsupported -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 -$as_echo "$hardcode_action" >&6; } - -if test "$hardcode_action" = relink || - test "$inherit_rpath" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - - - - - - if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - -fi - - ;; - - *) - ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" -if test "x$ac_cv_func_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 -$as_echo_n "checking for shl_load in -ldld... " >&6; } -if ${ac_cv_lib_dld_shl_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (); -int -main () -{ -return shl_load (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_shl_load=yes -else - ac_cv_lib_dld_shl_load=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 -$as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" -else - ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 -$as_echo_n "checking for dlopen in -lsvld... " >&6; } -if ${ac_cv_lib_svld_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_svld_dlopen=yes -else - ac_cv_lib_svld_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 -$as_echo "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 -$as_echo_n "checking for dld_link in -ldld... " >&6; } -if ${ac_cv_lib_dld_dld_link+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dld_link (); -int -main () -{ -return dld_link (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_dld_link=yes -else - ac_cv_lib_dld_dld_link=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 -$as_echo "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = xyes; then : - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" -fi - - -fi - - -fi - - -fi - - -fi - - -fi - - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 -$as_echo_n "checking whether a program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 -$as_echo "$lt_cv_dlopen_self" >&6; } - - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 -$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self_static+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self_static=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 -$as_echo "$lt_cv_dlopen_self_static" >&6; } - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi - - - - - - - - - - - - - - - - - -striplib= -old_striplib= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 -$as_echo_n "checking whether stripping libraries is possible... " >&6; } -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - old_striplib="$STRIP -S" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - esac -fi - - - - - - - - - - - - - # Report which library types will actually be built - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 -$as_echo_n "checking if libtool supports shared libraries... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 -$as_echo "$can_build_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 -$as_echo_n "checking whether to build shared libraries... " >&6; } - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - - aix[4-9]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 -$as_echo "$enable_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 -$as_echo_n "checking whether to build static libraries... " >&6; } - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 -$as_echo "$enable_static" >&6; } - - - - -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC="$lt_save_CC" - - - - - - - - - - - - - - - - ac_config_commands="$ac_config_commands libtool" - - - - -# Only expand once: - - - -# Extract the first word of "pkg-config", so it can be a program name with args. -set dummy pkg-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_HAVE_PKGCONFIG+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$HAVE_PKGCONFIG"; then - ac_cv_prog_HAVE_PKGCONFIG="$HAVE_PKGCONFIG" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_HAVE_PKGCONFIG="yes" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - test -z "$ac_cv_prog_HAVE_PKGCONFIG" && ac_cv_prog_HAVE_PKGCONFIG="no" -fi -fi -HAVE_PKGCONFIG=$ac_cv_prog_HAVE_PKGCONFIG -if test -n "$HAVE_PKGCONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_PKGCONFIG" >&5 -$as_echo "$HAVE_PKGCONFIG" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - -# Extract the first word of "doxygen", so it can be a program name with args. -set dummy doxygen; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_HAVE_DOXYGEN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$HAVE_DOXYGEN"; then - ac_cv_prog_HAVE_DOXYGEN="$HAVE_DOXYGEN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_HAVE_DOXYGEN="yes" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - test -z "$ac_cv_prog_HAVE_DOXYGEN" && ac_cv_prog_HAVE_DOXYGEN="no" -fi -fi -HAVE_DOXYGEN=$ac_cv_prog_HAVE_DOXYGEN -if test -n "$HAVE_DOXYGEN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_DOXYGEN" >&5 -$as_echo "$HAVE_DOXYGEN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - if test "x$HAVE_DOXYGEN" = "xyes"; then - BUILD_DOXYGEN_TRUE= - BUILD_DOXYGEN_FALSE='#' -else - BUILD_DOXYGEN_TRUE='#' - BUILD_DOXYGEN_FALSE= -fi - - - -# Check whether --with-python was given. -if test "${with_python+set}" = set; then : - withval=$with_python; -fi - - -if test "x${with_python}" != "xno"; then - - - - - - - if test -n "$PYTHON"; then - # If the user set $PYTHON, use it and don't search something else. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $PYTHON version is >= 2.6" >&5 -$as_echo_n "checking whether $PYTHON version is >= 2.6... " >&6; } - prog="import sys -# split strings by '.' and convert to numeric. Append some zeros -# because we need at least 4 digits for the hex conversion. -# map returns an iterator in Python 3.0 and a list in 2.x -minver = list(map(int, '2.6'.split('.'))) + [0, 0, 0] -minverhex = 0 -# xrange is not present in Python 3.0 and range returns an iterator -for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] -sys.exit(sys.hexversion < minverhex)" - if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5 - ($PYTHON -c "$prog") >&5 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - as_fn_error $? "Python interpreter is too old" "$LINENO" 5 -fi - am_display_PYTHON=$PYTHON - else - # Otherwise, try each interpreter until we find one that satisfies - # VERSION. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a Python interpreter with version >= 2.6" >&5 -$as_echo_n "checking for a Python interpreter with version >= 2.6... " >&6; } -if ${am_cv_pathless_PYTHON+:} false; then : - $as_echo_n "(cached) " >&6 -else - - for am_cv_pathless_PYTHON in python python2 python3 python3.3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 none; do - test "$am_cv_pathless_PYTHON" = none && break - prog="import sys -# split strings by '.' and convert to numeric. Append some zeros -# because we need at least 4 digits for the hex conversion. -# map returns an iterator in Python 3.0 and a list in 2.x -minver = list(map(int, '2.6'.split('.'))) + [0, 0, 0] -minverhex = 0 -# xrange is not present in Python 3.0 and range returns an iterator -for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] -sys.exit(sys.hexversion < minverhex)" - if { echo "$as_me:$LINENO: $am_cv_pathless_PYTHON -c "$prog"" >&5 - ($am_cv_pathless_PYTHON -c "$prog") >&5 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then : - break -fi - done -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_pathless_PYTHON" >&5 -$as_echo "$am_cv_pathless_PYTHON" >&6; } - # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. - if test "$am_cv_pathless_PYTHON" = none; then - PYTHON=: - else - # Extract the first word of "$am_cv_pathless_PYTHON", so it can be a program name with args. -set dummy $am_cv_pathless_PYTHON; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_PYTHON+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $PYTHON in - [\\/]* | ?:[\\/]*) - ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -PYTHON=$ac_cv_path_PYTHON -if test -n "$PYTHON"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 -$as_echo "$PYTHON" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi - am_display_PYTHON=$am_cv_pathless_PYTHON - fi - - - if test "$PYTHON" = :; then - as_fn_error $? "python not found" "$LINENO" 5 - else - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON version" >&5 -$as_echo_n "checking for $am_display_PYTHON version... " >&6; } -if ${am_cv_python_version+:} false; then : - $as_echo_n "(cached) " >&6 -else - am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[:3])"` -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5 -$as_echo "$am_cv_python_version" >&6; } - PYTHON_VERSION=$am_cv_python_version - - - - PYTHON_PREFIX='${prefix}' - - PYTHON_EXEC_PREFIX='${exec_prefix}' - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON platform" >&5 -$as_echo_n "checking for $am_display_PYTHON platform... " >&6; } -if ${am_cv_python_platform+:} false; then : - $as_echo_n "(cached) " >&6 -else - am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"` -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_platform" >&5 -$as_echo "$am_cv_python_platform" >&6; } - PYTHON_PLATFORM=$am_cv_python_platform - - - # Just factor out some code duplication. - am_python_setup_sysconfig="\ -import sys -# Prefer sysconfig over distutils.sysconfig, for better compatibility -# with python 3.x. See automake bug#10227. -try: - import sysconfig -except ImportError: - can_use_sysconfig = 0 -else: - can_use_sysconfig = 1 -# Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: -# -try: - from platform import python_implementation - if python_implementation() == 'CPython' and sys.version[:3] == '2.7': - can_use_sysconfig = 0 -except ImportError: - pass" - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON script directory" >&5 -$as_echo_n "checking for $am_display_PYTHON script directory... " >&6; } -if ${am_cv_python_pythondir+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "x$prefix" = xNONE - then - am_py_prefix=$ac_default_prefix - else - am_py_prefix=$prefix - fi - am_cv_python_pythondir=`$PYTHON -c " -$am_python_setup_sysconfig -if can_use_sysconfig: - sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'}) -else: - from distutils import sysconfig - sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') -sys.stdout.write(sitedir)"` - case $am_cv_python_pythondir in - $am_py_prefix*) - am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` - am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` - ;; - *) - case $am_py_prefix in - /usr|/System*) ;; - *) - am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages - ;; - esac - ;; - esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pythondir" >&5 -$as_echo "$am_cv_python_pythondir" >&6; } - pythondir=$am_cv_python_pythondir - - - - pkgpythondir=\${pythondir}/$PACKAGE - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON extension module directory" >&5 -$as_echo_n "checking for $am_display_PYTHON extension module directory... " >&6; } -if ${am_cv_python_pyexecdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "x$exec_prefix" = xNONE - then - am_py_exec_prefix=$am_py_prefix - else - am_py_exec_prefix=$exec_prefix - fi - am_cv_python_pyexecdir=`$PYTHON -c " -$am_python_setup_sysconfig -if can_use_sysconfig: - sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'}) -else: - from distutils import sysconfig - sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix') -sys.stdout.write(sitedir)"` - case $am_cv_python_pyexecdir in - $am_py_exec_prefix*) - am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` - am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` - ;; - *) - case $am_py_exec_prefix in - /usr|/System*) ;; - *) - am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages - ;; - esac - ;; - esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pyexecdir" >&5 -$as_echo "$am_cv_python_pyexecdir" >&6; } - pyexecdir=$am_cv_python_pyexecdir - - - - pkgpyexecdir=\${pyexecdir}/$PACKAGE - - - - fi - - - - # - # Allow the use of a (user set) custom python version - # - - - # Extract the first word of "python[$PYTHON_VERSION]", so it can be a program name with args. -set dummy python$PYTHON_VERSION; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_PYTHON+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $PYTHON in - [\\/]* | ?:[\\/]*) - ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -PYTHON=$ac_cv_path_PYTHON -if test -n "$PYTHON"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 -$as_echo "$PYTHON" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - if test -z "$PYTHON"; then - as_fn_error $? "Cannot find python$PYTHON_VERSION in your system path" "$LINENO" 5 - PYTHON_VERSION="" - fi - - # - # Check for a version of Python >= 2.1.0 - # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a version of Python >= '2.1.0'" >&5 -$as_echo_n "checking for a version of Python >= '2.1.0'... " >&6; } - ac_supports_python_ver=`$PYTHON -c "import sys; \ - ver = sys.version.split ()[0]; \ - print (ver >= '2.1.0')"` - if test "$ac_supports_python_ver" != "True"; then - if test -z "$PYTHON_NOVERSIONCHECK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? " -This version of the AC_PYTHON_DEVEL macro -doesn't work properly with versions of Python before -2.1.0. You may need to re-run configure, setting the -variables PYTHON_CPPFLAGS, PYTHON_LDFLAGS, PYTHON_SITE_PKG, -PYTHON_EXTRA_LIBS and PYTHON_EXTRA_LDFLAGS by hand. -Moreover, to disable this check, set PYTHON_NOVERSIONCHECK -to something else than an empty string. - -See \`config.log' for more details" "$LINENO" 5; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: skip at user request" >&5 -$as_echo "skip at user request" >&6; } - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - fi - - # - # if the macro parameter ``version'' is set, honour it - # - if test -n ""; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a version of Python " >&5 -$as_echo_n "checking for a version of Python ... " >&6; } - ac_supports_python_ver=`$PYTHON -c "import sys; \ - ver = sys.version.split ()[0]; \ - print (ver )"` - if test "$ac_supports_python_ver" = "True"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - as_fn_error $? "this package requires Python . -If you have it installed, but it isn't the default Python -interpreter in your system path, please pass the PYTHON_VERSION -variable to configure. See \`\`configure --help'' for reference. -" "$LINENO" 5 - PYTHON_VERSION="" - fi - fi - - # - # Check if you have distutils, else fail - # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the distutils Python package" >&5 -$as_echo_n "checking for the distutils Python package... " >&6; } - ac_distutils_result=`$PYTHON -c "import distutils" 2>&1` - if test -z "$ac_distutils_result"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - as_fn_error $? "cannot import Python module \"distutils\". -Please check your Python installation. The error was: -$ac_distutils_result" "$LINENO" 5 - PYTHON_VERSION="" - fi - - # - # Check for Python include path - # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python include path" >&5 -$as_echo_n "checking for Python include path... " >&6; } - if test -z "$PYTHON_CPPFLAGS"; then - python_path=`$PYTHON -c "import distutils.sysconfig; \ - print (distutils.sysconfig.get_python_inc ());"` - plat_python_path=`$PYTHON -c "import distutils.sysconfig; \ - print (distutils.sysconfig.get_python_inc (plat_specific=1));"` - if test -n "${python_path}"; then - if test "${plat_python_path}" != "${python_path}"; then - python_path="-I$python_path -I$plat_python_path" - else - python_path="-I$python_path" - fi - fi - PYTHON_CPPFLAGS=$python_path - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_CPPFLAGS" >&5 -$as_echo "$PYTHON_CPPFLAGS" >&6; } - - - # - # Check for Python library path - # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python library path" >&5 -$as_echo_n "checking for Python library path... " >&6; } - if test -z "$PYTHON_LDFLAGS"; then - # (makes two attempts to ensure we've got a version number - # from the interpreter) - ac_python_version=`cat<>confdefs.h <<_ACEOF -#define HAVE_PYTHON "$ac_python_version" -_ACEOF - - - # First, the library directory: - ac_python_libdir=`cat<&5 -$as_echo "$PYTHON_LDFLAGS" >&6; } - - - # - # Check for site packages - # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python site-packages path" >&5 -$as_echo_n "checking for Python site-packages path... " >&6; } - if test -z "$PYTHON_SITE_PKG"; then - PYTHON_SITE_PKG=`$PYTHON -c "import distutils.sysconfig; \ - print (distutils.sysconfig.get_python_lib(0,0));"` - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_SITE_PKG" >&5 -$as_echo "$PYTHON_SITE_PKG" >&6; } - - - # - # libraries which must be linked in when embedding - # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking python extra libraries" >&5 -$as_echo_n "checking python extra libraries... " >&6; } - if test -z "$PYTHON_EXTRA_LIBS"; then - PYTHON_EXTRA_LIBS=`$PYTHON -c "import distutils.sysconfig; \ - conf = distutils.sysconfig.get_config_var; \ - print (conf('LIBS') + ' ' + conf('SYSLIBS'))"` - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_EXTRA_LIBS" >&5 -$as_echo "$PYTHON_EXTRA_LIBS" >&6; } - - - # - # linking flags needed when embedding - # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking python extra linking flags" >&5 -$as_echo_n "checking python extra linking flags... " >&6; } - if test -z "$PYTHON_EXTRA_LDFLAGS"; then - PYTHON_EXTRA_LDFLAGS=`$PYTHON -c "import distutils.sysconfig; \ - conf = distutils.sysconfig.get_config_var; \ - print (conf('LINKFORSHARED'))"` - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_EXTRA_LDFLAGS" >&5 -$as_echo "$PYTHON_EXTRA_LDFLAGS" >&6; } - - - # - # final check to see if everything compiles alright - # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking consistency of all components of python development environment" >&5 -$as_echo_n "checking consistency of all components of python development environment... " >&6; } - # save current global flags - ac_save_LIBS="$LIBS" - ac_save_CPPFLAGS="$CPPFLAGS" - LIBS="$ac_save_LIBS $PYTHON_LDFLAGS $PYTHON_EXTRA_LDFLAGS $PYTHON_EXTRA_LIBS" - CPPFLAGS="$ac_save_CPPFLAGS $PYTHON_CPPFLAGS" - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - #include -int -main () -{ -Py_Initialize(); - ; - return 0; -} - -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - pythonexists=yes -else - pythonexists=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - # turn back to default flags - CPPFLAGS="$ac_save_CPPFLAGS" - LIBS="$ac_save_LIBS" - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pythonexists" >&5 -$as_echo "$pythonexists" >&6; } - - if test ! "x$pythonexists" = "xyes"; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? " - Could not link test program to Python. Maybe the main Python library has been - installed in some non-standard library path. If so, pass it to configure, - via the LDFLAGS environment variable. - Example: ./configure LDFLAGS=\"-L/usr/non-standard-path/python/lib\" - ============================================================================ - ERROR! - You probably have to install the development version of the Python package - for your distribution. The exact name of this package varies among them. - ============================================================================ - -See \`config.log' for more details" "$LINENO" 5; } - PYTHON_VERSION="" - fi - - # - # all done! - # - - - # Ubuntu has swig 2.0 as /usr/bin/swig2.0 - for ac_prog in swig swig2.0 -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_SWIG+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $SWIG in - [\\/]* | ?:[\\/]*) - ac_cv_path_SWIG="$SWIG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_SWIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -SWIG=$ac_cv_path_SWIG -if test -n "$SWIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG" >&5 -$as_echo "$SWIG" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$SWIG" && break -done - - if test -z "$SWIG" ; then - as_fn_error $? "swig not found" "$LINENO" 5 - elif test -n "2.0" ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking SWIG version" >&5 -$as_echo_n "checking SWIG version... " >&6; } - swig_version=`$SWIG -version 2>&1 | grep 'SWIG Version' | sed 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/g'` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $swig_version" >&5 -$as_echo "$swig_version" >&6; } - if test -n "$swig_version" ; then - # Calculate the required version number components - required=2.0 - required_major=`echo $required | sed 's/[^0-9].*//'` - if test -z "$required_major" ; then - required_major=0 - fi - required=`echo $required | sed 's/[0-9]*[^0-9]//'` - required_minor=`echo $required | sed 's/[^0-9].*//'` - if test -z "$required_minor" ; then - required_minor=0 - fi - required=`echo $required | sed 's/[0-9]*[^0-9]//'` - required_patch=`echo $required | sed 's/[^0-9].*//'` - if test -z "$required_patch" ; then - required_patch=0 - fi - # Calculate the available version number components - available=$swig_version - available_major=`echo $available | sed 's/[^0-9].*//'` - if test -z "$available_major" ; then - available_major=0 - fi - available=`echo $available | sed 's/[0-9]*[^0-9]//'` - available_minor=`echo $available | sed 's/[^0-9].*//'` - if test -z "$available_minor" ; then - available_minor=0 - fi - available=`echo $available | sed 's/[0-9]*[^0-9]//'` - available_patch=`echo $available | sed 's/[^0-9].*//'` - if test -z "$available_patch" ; then - available_patch=0 - fi - # Convert the version tuple into a single number for easier comparison. - # Using base 100 should be safe since SWIG internally uses BCD values - # to encode its version number. - required_swig_vernum=`expr $required_major \* 10000 \ - \+ $required_minor \* 100 \+ $required_patch` - available_swig_vernum=`expr $available_major \* 10000 \ - \+ $available_minor \* 100 \+ $available_patch` - - if test $available_swig_vernum -lt $required_swig_vernum; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SWIG version >= 2.0 is required. You have $swig_version." >&5 -$as_echo "$as_me: WARNING: SWIG version >= 2.0 is required. You have $swig_version." >&2;} - SWIG='' - as_fn_error $? "swig not found" "$LINENO" 5 - else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SWIG library" >&5 -$as_echo_n "checking for SWIG library... " >&6; } - SWIG_LIB=`$SWIG -swiglib` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG_LIB" >&5 -$as_echo "$SWIG_LIB" >&6; } - - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot determine SWIG version" >&5 -$as_echo "$as_me: WARNING: cannot determine SWIG version" >&2;} - SWIG='' - as_fn_error $? "swig not found" "$LINENO" 5 - fi - fi - - -fi - - - if test "x$SWIG" != "x"; then - BUILD_SWIG_TRUE= - BUILD_SWIG_FALSE='#' -else - BUILD_SWIG_TRUE='#' - BUILD_SWIG_FALSE= -fi - - - -GST_MAJORMINOR=1.0 - - -if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. -set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_PKG_CONFIG+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $PKG_CONFIG in - [\\/]* | ?:[\\/]*) - ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -PKG_CONFIG=$ac_cv_path_PKG_CONFIG -if test -n "$PKG_CONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 -$as_echo "$PKG_CONFIG" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_PKG_CONFIG"; then - ac_pt_PKG_CONFIG=$PKG_CONFIG - # Extract the first word of "pkg-config", so it can be a program name with args. -set dummy pkg-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_PKG_CONFIG in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG -if test -n "$ac_pt_PKG_CONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 -$as_echo "$ac_pt_PKG_CONFIG" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_PKG_CONFIG" = x; then - PKG_CONFIG="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - PKG_CONFIG=$ac_pt_PKG_CONFIG - fi -else - PKG_CONFIG="$ac_cv_path_PKG_CONFIG" -fi - -fi -if test -n "$PKG_CONFIG"; then - _pkg_min_version=0.9.0 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 -$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } - if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - PKG_CONFIG="" - fi - -fi - -pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GStreamer" >&5 -$as_echo_n "checking for GStreamer... " >&6; } - -if test -n "$PKG_CONFIG"; then - if test -n "$GStreamer_CFLAGS"; then - pkg_cv_GStreamer_CFLAGS="$GStreamer_CFLAGS" - else - if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gstreamer-\$GST_MAJORMINOR >= 1.0 - gstreamer-base-\$GST_MAJORMINOR >= 1.0 - gstreamer-plugins-base-\$GST_MAJORMINOR >= 1.0\""; } >&5 - ($PKG_CONFIG --exists --print-errors "gstreamer-$GST_MAJORMINOR >= 1.0 - gstreamer-base-$GST_MAJORMINOR >= 1.0 - gstreamer-plugins-base-$GST_MAJORMINOR >= 1.0") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - pkg_cv_GStreamer_CFLAGS=`$PKG_CONFIG --cflags "gstreamer-$GST_MAJORMINOR >= 1.0 - gstreamer-base-$GST_MAJORMINOR >= 1.0 - gstreamer-plugins-base-$GST_MAJORMINOR >= 1.0" 2>/dev/null` -else - pkg_failed=yes -fi - fi -else - pkg_failed=untried -fi -if test -n "$PKG_CONFIG"; then - if test -n "$GStreamer_LIBS"; then - pkg_cv_GStreamer_LIBS="$GStreamer_LIBS" - else - if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gstreamer-\$GST_MAJORMINOR >= 1.0 - gstreamer-base-\$GST_MAJORMINOR >= 1.0 - gstreamer-plugins-base-\$GST_MAJORMINOR >= 1.0\""; } >&5 - ($PKG_CONFIG --exists --print-errors "gstreamer-$GST_MAJORMINOR >= 1.0 - gstreamer-base-$GST_MAJORMINOR >= 1.0 - gstreamer-plugins-base-$GST_MAJORMINOR >= 1.0") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - pkg_cv_GStreamer_LIBS=`$PKG_CONFIG --libs "gstreamer-$GST_MAJORMINOR >= 1.0 - gstreamer-base-$GST_MAJORMINOR >= 1.0 - gstreamer-plugins-base-$GST_MAJORMINOR >= 1.0" 2>/dev/null` -else - pkg_failed=yes -fi - fi -else - pkg_failed=untried -fi - - - -if test $pkg_failed = yes; then - -if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then - _pkg_short_errors_supported=yes -else - _pkg_short_errors_supported=no -fi - if test $_pkg_short_errors_supported = yes; then - GStreamer_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gstreamer-$GST_MAJORMINOR >= 1.0 - gstreamer-base-$GST_MAJORMINOR >= 1.0 - gstreamer-plugins-base-$GST_MAJORMINOR >= 1.0"` - else - GStreamer_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gstreamer-$GST_MAJORMINOR >= 1.0 - gstreamer-base-$GST_MAJORMINOR >= 1.0 - gstreamer-plugins-base-$GST_MAJORMINOR >= 1.0"` - fi - # Put the nasty error message in config.log where it belongs - echo "$GStreamer_PKG_ERRORS" >&5 - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - HAVE_GST=no -elif test $pkg_failed = untried; then - HAVE_GST=no -else - GStreamer_CFLAGS=$pkg_cv_GStreamer_CFLAGS - GStreamer_LIBS=$pkg_cv_GStreamer_LIBS - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - HAVE_GST=yes -fi - if test x$cross_compiling != xyes && test "x$HAVE_GST" = "xyes"; then - BUILD_GST_TRUE= - BUILD_GST_FALSE='#' -else - BUILD_GST_TRUE='#' - BUILD_GST_FALSE= -fi - -GST_CFLAGS="$GStreamer_CFLAGS $GStreamer_ERROR" -GST_LIBS="$GStreamer_LIBS" - - - - -if test "x${prefix}" = "x$HOME"; then - plugindir="$HOME/.gstreamer-$GST_MAJORMINOR/plugins" -else - plugindir="\$(libdir)/gstreamer-$GST_MAJORMINOR" -fi - - -GST_PLUGIN_LDFLAGS='-module -avoid-version -export-symbols-regex _*\(gst_\|Gst\|GST_\).*' - - - -# Check whether --with-sphinxbase was given. -if test "${with_sphinxbase+set}" = set; then : - withval=$with_sphinxbase; sphinxbase=$withval -fi - - - -if test x$sphinxbase = x; then - dn=`dirname $0` - case "$dn" in - .) - sbdir="`pwd`/.." - ;; - \\/* | ?:\\/*) - sbdir="$dn/.." - ;; - *) - sbdir="`pwd`/$dn/.." - ;; - esac - # Look for sphinxbase in the parent directory - for sb in "$sbdir/sphinxbase" \ - "$sbdir/sphinxbase"*; do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sphinxbase in $sb" >&5 -$as_echo_n "checking for sphinxbase in $sb... " >&6; } - if test -f "$sb/src/libsphinxbase/libsphinxbase.la"; then - sphinxbase="$sb" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - break - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - done -fi - -if test x$sphinxbase = x || test x$sphinxbase = xauto; then - sphinxbase= - - if test "x$HAVE_PKGCONFIG" = "xno"; then - SPHINXBASE_CFLAGS = "-I/usr/include/sphinxbase -I/usr/local/include/sphinxbase" - SPHINXBASE_LIBS = "-lsphinxbase" - SPHINXBASE_PREFIX="/usr/local" - else - -pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SPHINXBASE" >&5 -$as_echo_n "checking for SPHINXBASE... " >&6; } - -if test -n "$PKG_CONFIG"; then - if test -n "$SPHINXBASE_CFLAGS"; then - pkg_cv_SPHINXBASE_CFLAGS="$SPHINXBASE_CFLAGS" - else - if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sphinxbase\""; } >&5 - ($PKG_CONFIG --exists --print-errors "sphinxbase") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - pkg_cv_SPHINXBASE_CFLAGS=`$PKG_CONFIG --cflags "sphinxbase" 2>/dev/null` -else - pkg_failed=yes -fi - fi -else - pkg_failed=untried -fi -if test -n "$PKG_CONFIG"; then - if test -n "$SPHINXBASE_LIBS"; then - pkg_cv_SPHINXBASE_LIBS="$SPHINXBASE_LIBS" - else - if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sphinxbase\""; } >&5 - ($PKG_CONFIG --exists --print-errors "sphinxbase") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - pkg_cv_SPHINXBASE_LIBS=`$PKG_CONFIG --libs "sphinxbase" 2>/dev/null` -else - pkg_failed=yes -fi - fi -else - pkg_failed=untried -fi - - - -if test $pkg_failed = yes; then - -if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then - _pkg_short_errors_supported=yes -else - _pkg_short_errors_supported=no -fi - if test $_pkg_short_errors_supported = yes; then - SPHINXBASE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "sphinxbase"` - else - SPHINXBASE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "sphinxbase"` - fi - # Put the nasty error message in config.log where it belongs - echo "$SPHINXBASE_PKG_ERRORS" >&5 - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "SphinxBase was not found on your system. -Make sure that you have installed it and that the -PKG_CONFIG_PATH environment variable is set correctly, if -it was installed in a non-standard prefix. -See \`config.log' for more details" "$LINENO" 5; } -elif test $pkg_failed = untried; then - - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "SphinxBase was not found on your system. -Make sure that you have installed it and that the -PKG_CONFIG_PATH environment variable is set correctly, if -it was installed in a non-standard prefix. -See \`config.log' for more details" "$LINENO" 5; } -else - SPHINXBASE_CFLAGS=$pkg_cv_SPHINXBASE_CFLAGS - SPHINXBASE_LIBS=$pkg_cv_SPHINXBASE_LIBS - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - : -fi - SPHINXBASE_PREFIX=`pkg-config --variable=prefix sphinxbase` - fi - - LIBS="$LIBS $SPHINXBASE_LIBS" - CPPFLAGS="$CPPFLAGS $SPHINXBASE_CFLAGS" - SPHINXBASE_SWIG="$SPHINXBASE_PREFIX/share/sphinxbase/swig" - ac_fn_c_check_header_mongrel "$LINENO" "sphinx_config.h" "ac_cv_header_sphinx_config_h" "$ac_includes_default" -if test "x$ac_cv_header_sphinx_config_h" = xyes; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "SphinxBase was not found on your system. -See \`config.log' for more details" "$LINENO" 5; } -fi - - -else - LIBS="$LIBS -lsphinxbase" - LDFLAGS="$LDFLAGS -L$sphinxbase/lib -L$sphinxbase/src/libsphinxad -L$sphinxbase/src/libsphinxbase" - CPPFLAGS="$CPPFLAGS -I$sphinxbase/include -I$sphinxbase/include/sphinxbase" - SPHINXBASE_SWIG="$sphinxbase/swig" -fi - - - -ac_config_files="$ac_config_files pocketsphinx.pc Makefile include/Makefile src/Makefile swig/Makefile swig/python/Makefile swig/python/test/Makefile src/libpocketsphinx/Makefile src/programs/Makefile src/gst-plugin/Makefile doc/Makefile doc/doxyfile model/Makefile test/Makefile test/testfuncs.sh test/unit/Makefile test/regression/Makefile" - -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - if test ! -f "$cache_file" || test -h "$cache_file"; then - cat confcache >"$cache_file" - else - case $cache_file in #( - */* | ?:*) - mv -f confcache "$cache_file"$$ && - mv -f "$cache_file"$$ "$cache_file" ;; #( - *) - mv -f confcache "$cache_file" ;; - esac - fi - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -DEFS=-DHAVE_CONFIG_H - -ac_libobjs= -ac_ltlibobjs= -U= -for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIBOBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 -$as_echo_n "checking that generated files are newer than configure... " >&6; } - if test -n "$am_sleep_pid"; then - # Hide warnings about reused PIDs. - wait $am_sleep_pid 2>/dev/null - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 -$as_echo "done" >&6; } - if test -n "$EXEEXT"; then - am__EXEEXT_TRUE= - am__EXEEXT_FALSE='#' -else - am__EXEEXT_TRUE='#' - am__EXEEXT_FALSE= -fi - -if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - as_fn_error $? "conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${BUILD_DOXYGEN_TRUE}" && test -z "${BUILD_DOXYGEN_FALSE}"; then - as_fn_error $? "conditional \"BUILD_DOXYGEN\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${BUILD_SWIG_TRUE}" && test -z "${BUILD_SWIG_FALSE}"; then - as_fn_error $? "conditional \"BUILD_SWIG\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${BUILD_GST_TRUE}" && test -z "${BUILD_GST_FALSE}"; then - as_fn_error $? "conditional \"BUILD_GST\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi - -: "${CONFIG_STATUS=./config.status}" -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false - -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by pocketsphinx $as_me 5prealpha, which was -generated by GNU Autoconf 2.69. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - -case $ac_config_headers in *" -"*) set x $ac_config_headers; shift; ac_config_headers=$*;; -esac - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" -config_headers="$ac_config_headers" -config_commands="$ac_config_commands" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. - -Usage: $0 [OPTION]... [TAG]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - --config print configuration, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - instantiate the configuration header FILE - -Configuration files: -$config_files - -Configuration headers: -$config_headers - -Configuration commands: -$config_commands - -Report bugs to the package provider." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" -ac_cs_version="\\ -pocketsphinx config.status 5prealpha -configured by $0, generated by GNU Autoconf 2.69, - with options \\"\$ac_cs_config\\" - -Copyright (C) 2012 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -INSTALL='$INSTALL' -MKDIR_P='$MKDIR_P' -AWK='$AWK' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=?*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; - esac - as_fn_append CONFIG_FILES " '$ac_optarg'" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - as_fn_append CONFIG_HEADERS " '$ac_optarg'" - ac_need_defaults=false;; - --he | --h) - # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; - --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; - - *) as_fn_append ac_config_targets " $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# -# INIT-COMMANDS -# -AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" - - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' -macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' -enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' -enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' -pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' -enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' -SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' -ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' -PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' -host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' -host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' -host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' -build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' -build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' -build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' -SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' -Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' -GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' -EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' -FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' -LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' -NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' -LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' -max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' -ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' -exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' -lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' -lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' -lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' -lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' -lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' -reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' -reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' -OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' -deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' -file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' -file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' -want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' -DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' -sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' -AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' -AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' -archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' -STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' -RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' -old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' -old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' -lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' -CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' -CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' -compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' -GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' -nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' -lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' -objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' -MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' -need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' -MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' -DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' -NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' -LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' -OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' -OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' -libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' -shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' -extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' -compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' -module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' -with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' -no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' -hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' -hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' -inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' -link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' -always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' -exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' -include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' -prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' -postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' -file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' -variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' -need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' -need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' -version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' -runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' -libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' -library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' -soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' -install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' -postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' -postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' -finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' -hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' -sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' -sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' -hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' -enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' -old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' -striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' - -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$1 -_LTECHO_EOF' -} - -# Quote evaled strings. -for var in SHELL \ -ECHO \ -PATH_SEPARATOR \ -SED \ -GREP \ -EGREP \ -FGREP \ -LD \ -NM \ -LN_S \ -lt_SP2NL \ -lt_NL2SP \ -reload_flag \ -OBJDUMP \ -deplibs_check_method \ -file_magic_cmd \ -file_magic_glob \ -want_nocaseglob \ -DLLTOOL \ -sharedlib_from_linklib_cmd \ -AR \ -AR_FLAGS \ -archiver_list_spec \ -STRIP \ -RANLIB \ -CC \ -CFLAGS \ -compiler \ -lt_cv_sys_global_symbol_pipe \ -lt_cv_sys_global_symbol_to_cdecl \ -lt_cv_sys_global_symbol_to_c_name_address \ -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ -nm_file_list_spec \ -lt_prog_compiler_no_builtin_flag \ -lt_prog_compiler_pic \ -lt_prog_compiler_wl \ -lt_prog_compiler_static \ -lt_cv_prog_compiler_c_o \ -need_locks \ -MANIFEST_TOOL \ -DSYMUTIL \ -NMEDIT \ -LIPO \ -OTOOL \ -OTOOL64 \ -shrext_cmds \ -export_dynamic_flag_spec \ -whole_archive_flag_spec \ -compiler_needs_object \ -with_gnu_ld \ -allow_undefined_flag \ -no_undefined_flag \ -hardcode_libdir_flag_spec \ -hardcode_libdir_separator \ -exclude_expsyms \ -include_expsyms \ -file_list_spec \ -variables_saved_for_relink \ -libname_spec \ -library_names_spec \ -soname_spec \ -install_override_mode \ -finish_eval \ -old_striplib \ -striplib; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in reload_cmds \ -old_postinstall_cmds \ -old_postuninstall_cmds \ -old_archive_cmds \ -extract_expsyms_cmds \ -old_archive_from_new_cmds \ -old_archive_from_expsyms_cmds \ -archive_cmds \ -archive_expsym_cmds \ -module_cmds \ -module_expsym_cmds \ -export_symbols_cmds \ -prelink_cmds \ -postlink_cmds \ -postinstall_cmds \ -postuninstall_cmds \ -finish_cmds \ -sys_lib_search_path_spec \ -sys_lib_dlsearch_path_spec; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -ac_aux_dir='$ac_aux_dir' -xsi_shell='$xsi_shell' -lt_shell_append='$lt_shell_append' - -# See if we are running on zsh, and set the options which allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - - - PACKAGE='$PACKAGE' - VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' - RM='$RM' - ofile='$ofile' - - - - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "include/config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/config.h" ;; - "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; - "pocketsphinx.pc") CONFIG_FILES="$CONFIG_FILES pocketsphinx.pc" ;; - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; - "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; - "swig/Makefile") CONFIG_FILES="$CONFIG_FILES swig/Makefile" ;; - "swig/python/Makefile") CONFIG_FILES="$CONFIG_FILES swig/python/Makefile" ;; - "swig/python/test/Makefile") CONFIG_FILES="$CONFIG_FILES swig/python/test/Makefile" ;; - "src/libpocketsphinx/Makefile") CONFIG_FILES="$CONFIG_FILES src/libpocketsphinx/Makefile" ;; - "src/programs/Makefile") CONFIG_FILES="$CONFIG_FILES src/programs/Makefile" ;; - "src/gst-plugin/Makefile") CONFIG_FILES="$CONFIG_FILES src/gst-plugin/Makefile" ;; - "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; - "doc/doxyfile") CONFIG_FILES="$CONFIG_FILES doc/doxyfile" ;; - "model/Makefile") CONFIG_FILES="$CONFIG_FILES model/Makefile" ;; - "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;; - "test/testfuncs.sh") CONFIG_FILES="$CONFIG_FILES test/testfuncs.sh" ;; - "test/unit/Makefile") CONFIG_FILES="$CONFIG_FILES test/unit/Makefile" ;; - "test/regression/Makefile") CONFIG_FILES="$CONFIG_FILES test/regression/Makefile" ;; - - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= ac_tmp= - trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status -' 0 - trap 'as_fn_exit 1' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -ac_tmp=$tmp - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\)..*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\)..*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' >$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 -_ACEOF - -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// -s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - -# Set up the scripts for CONFIG_HEADERS section. -# No need to generate them if there are no CONFIG_HEADERS. -# This happens for instance with `./config.status Makefile'. -if test -n "$CONFIG_HEADERS"; then -cat >"$ac_tmp/defines.awk" <<\_ACAWK || -BEGIN { -_ACEOF - -# Transform confdefs.h into an awk script `defines.awk', embedded as -# here-document in config.status, that substitutes the proper values into -# config.h.in to produce config.h. - -# Create a delimiter string that does not exist in confdefs.h, to ease -# handling of long lines. -ac_delim='%!_!# ' -for ac_last_try in false false :; do - ac_tt=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_tt"; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done - -# For the awk script, D is an array of macro values keyed by name, -# likewise P contains macro parameters if any. Preserve backslash -# newline sequences. - -ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* -sed -n ' -s/.\{148\}/&'"$ac_delim"'/g -t rset -:rset -s/^[ ]*#[ ]*define[ ][ ]*/ / -t def -d -:def -s/\\$// -t bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3"/p -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p -d -:bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3\\\\\\n"\\/p -t cont -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p -t cont -d -:cont -n -s/.\{148\}/&'"$ac_delim"'/g -t clear -:clear -s/\\$// -t bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/"/p -d -:bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p -b cont -' >$CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - for (key in D) D_is_set[key] = 1 - FS = "" -} -/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { - line = \$ 0 - split(line, arg, " ") - if (arg[1] == "#") { - defundef = arg[2] - mac1 = arg[3] - } else { - defundef = substr(arg[1], 2) - mac1 = arg[2] - } - split(mac1, mac2, "(") #) - macro = mac2[1] - prefix = substr(line, 1, index(line, defundef) - 1) - if (D_is_set[macro]) { - # Preserve the white space surrounding the "#". - print prefix "define", macro P[macro] D[macro] - next - } else { - # Replace #undef with comments. This is necessary, for example, - # in the case of _POSIX_SOURCE, which is predefined and required - # on some systems where configure will not decide to define it. - if (defundef == "undef") { - print "/*", prefix defundef, macro, "*/" - next - } - } -} -{ print } -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 -fi # test -n "$CONFIG_HEADERS" - - -eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$ac_tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac - ac_MKDIR_P=$MKDIR_P - case $MKDIR_P in - [\\/$]* | ?:[\\/]* ) ;; - */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; - esac -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -s&@INSTALL@&$ac_INSTALL&;t t -s&@MKDIR_P@&$ac_MKDIR_P&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ - >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ - "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} - - rm -f "$ac_tmp/stdin" - case $ac_file in - -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; - *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; - esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - ;; - :H) - # - # CONFIG_HEADER - # - if test x"$ac_file" != x-; then - { - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" - } >"$ac_tmp/config.h" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} - else - rm -f "$ac_file" - mv "$ac_tmp/config.h" "$ac_file" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - fi - else - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error $? "could not create -" "$LINENO" 5 - fi -# Compute "$ac_file"'s index in $config_headers. -_am_arg="$ac_file" -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || -$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$_am_arg" : 'X\(//\)[^/]' \| \ - X"$_am_arg" : 'X\(//\)$' \| \ - X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$_am_arg" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'`/stamp-h$_am_stamp_count - ;; - - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} - ;; - esac - - - case $ac_file$ac_mode in - "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Older Autoconf quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named 'Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`$as_dirname -- "$mf" || -$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$mf" : 'X\(//\)[^/]' \| \ - X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$mf" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running 'make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "$am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`$as_dirname -- "$file" || -$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$file" : 'X\(//\)[^/]' \| \ - X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir=$dirpart/$fdir; as_fn_mkdir_p - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} - ;; - "libtool":C) - - # See if we are running on zsh, and set the options which allow our - # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - - cfgfile="${ofile}T" - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of -# the License, or (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - - -# The names of the tagged configurations supported by this script. -available_tags="" - -# ### BEGIN LIBTOOL CONFIG - -# Which release of libtool.m4 was used? -macro_version=$macro_version -macro_revision=$macro_revision - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# What type of objects to build. -pic_mode=$pic_mode - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# An echo program that protects backslashes. -ECHO=$lt_ECHO - -# The PATH separator for the build system. -PATH_SEPARATOR=$lt_PATH_SEPARATOR - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# A sed program that does not truncate output. -SED=$lt_SED - -# Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="\$SED -e 1s/^X//" - -# A grep program that handles long lines. -GREP=$lt_GREP - -# An ERE matcher. -EGREP=$lt_EGREP - -# A literal string matcher. -FGREP=$lt_FGREP - -# A BSD- or MS-compatible name lister. -NM=$lt_NM - -# Whether we need soft or hard links. -LN_S=$lt_LN_S - -# What is the maximum length of a command? -max_cmd_len=$max_cmd_len - -# Object file suffix (normally "o"). -objext=$ac_objext - -# Executable file suffix (normally ""). -exeext=$exeext - -# whether the shell understands "unset". -lt_unset=$lt_unset - -# turn spaces into newlines. -SP2NL=$lt_lt_SP2NL - -# turn newlines into spaces. -NL2SP=$lt_lt_NL2SP - -# convert \$build file names to \$host format. -to_host_file_cmd=$lt_cv_to_host_file_cmd - -# convert \$build files to toolchain format. -to_tool_file_cmd=$lt_cv_to_tool_file_cmd - -# An object symbol dumper. -OBJDUMP=$lt_OBJDUMP - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method = "file_magic". -file_magic_cmd=$lt_file_magic_cmd - -# How to find potential files when deplibs_check_method = "file_magic". -file_magic_glob=$lt_file_magic_glob - -# Find potential files using nocaseglob when deplibs_check_method = "file_magic". -want_nocaseglob=$lt_want_nocaseglob - -# DLL creation program. -DLLTOOL=$lt_DLLTOOL - -# Command to associate shared and link libraries. -sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd - -# The archiver. -AR=$lt_AR - -# Flags to create an archive. -AR_FLAGS=$lt_AR_FLAGS - -# How to feed a file listing to the archiver. -archiver_list_spec=$lt_archiver_list_spec - -# A symbol stripping program. -STRIP=$lt_STRIP - -# Commands used to install an old-style archive. -RANLIB=$lt_RANLIB -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Whether to use a lock for old archive extraction. -lock_old_archive_extraction=$lock_old_archive_extraction - -# A C compiler. -LTCC=$lt_CC - -# LTCC compiler flags. -LTCFLAGS=$lt_CFLAGS - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration. -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair. -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# Transform the output of nm in a C name address pair when lib prefix is needed. -global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix - -# Specify filename containing input files for \$NM. -nm_file_list_spec=$lt_nm_file_list_spec - -# The root where to search for dependent libraries,and in which our libraries should be installed. -lt_sysroot=$lt_sysroot - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# Used to examine libraries when file_magic_cmd begins with "file". -MAGIC_CMD=$MAGIC_CMD - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Manifest tool. -MANIFEST_TOOL=$lt_MANIFEST_TOOL - -# Tool to manipulate archived DWARF debug symbol files on Mac OS X. -DSYMUTIL=$lt_DSYMUTIL - -# Tool to change global to local symbols on Mac OS X. -NMEDIT=$lt_NMEDIT - -# Tool to manipulate fat objects and archives on Mac OS X. -LIPO=$lt_LIPO - -# ldd/readelf like tool for Mach-O binaries on Mac OS X. -OTOOL=$lt_OTOOL - -# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. -OTOOL64=$lt_OTOOL64 - -# Old archive suffix (normally "a"). -libext=$libext - -# Shared library suffix (normally ".so"). -shrext_cmds=$lt_shrext_cmds - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at link time. -variables_saved_for_relink=$lt_variables_saved_for_relink - -# Do we need the "lib" prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Library versioning type. -version_type=$version_type - -# Shared library runtime path variable. -runpath_var=$runpath_var - -# Shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Permission mode override for installation of shared libraries. -install_override_mode=$lt_install_override_mode - -# Command to use after installation of a shared archive. -postinstall_cmds=$lt_postinstall_cmds - -# Command to use after uninstallation of a shared archive. -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# As "finish_cmds", except a single script fragment to be evaled but -# not shown. -finish_eval=$lt_finish_eval - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Compile-time system search path for libraries. -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries. -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - - -# The linker used to build libraries. -LD=$lt_LD - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds - -# A language specific compiler. -CC=$lt_compiler - -# Is the compiler the GNU compiler? -with_gcc=$GCC - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds -archive_expsym_cmds=$lt_archive_expsym_cmds - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds -module_expsym_cmds=$lt_module_expsym_cmds - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var - -# Set to "yes" if building a shared library automatically hardcodes DIR -# into the library and all subsequent libraries and executables linked -# against it. -hardcode_automatic=$hardcode_automatic - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action - -# ### END LIBTOOL CONFIG - -_LT_EOF - - case $host_os in - aix3*) - cat <<\_LT_EOF >> "$cfgfile" -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -_LT_EOF - ;; - esac - - -ltmain="$ac_aux_dir/ltmain.sh" - - - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - if test x"$xsi_shell" = xyes; then - sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ -func_dirname ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_basename ()$/,/^} # func_basename /c\ -func_basename ()\ -{\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ -func_dirname_and_basename ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ -func_stripname ()\ -{\ -\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ -\ # positional parameters, so assign one to ordinary parameter first.\ -\ func_stripname_result=${3}\ -\ func_stripname_result=${func_stripname_result#"${1}"}\ -\ func_stripname_result=${func_stripname_result%"${2}"}\ -} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ -func_split_long_opt ()\ -{\ -\ func_split_long_opt_name=${1%%=*}\ -\ func_split_long_opt_arg=${1#*=}\ -} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ -func_split_short_opt ()\ -{\ -\ func_split_short_opt_arg=${1#??}\ -\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ -} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ -func_lo2o ()\ -{\ -\ case ${1} in\ -\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ -\ *) func_lo2o_result=${1} ;;\ -\ esac\ -} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_xform ()$/,/^} # func_xform /c\ -func_xform ()\ -{\ - func_xform_result=${1%.*}.lo\ -} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_arith ()$/,/^} # func_arith /c\ -func_arith ()\ -{\ - func_arith_result=$(( $* ))\ -} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_len ()$/,/^} # func_len /c\ -func_len ()\ -{\ - func_len_result=${#1}\ -} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - -fi - -if test x"$lt_shell_append" = xyes; then - sed -e '/^func_append ()$/,/^} # func_append /c\ -func_append ()\ -{\ - eval "${1}+=\\${2}"\ -} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ -func_append_quoted ()\ -{\ -\ func_quote_for_eval "${2}"\ -\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ -} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - # Save a `func_append' function call where possible by direct use of '+=' - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -else - # Save a `func_append' function call even when '+=' is not available - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -fi - -if test x"$_lt_function_replace_fail" = x":"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 -$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} -fi - - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" - - ;; - - esac -done # for ac_tag - - -as_fn_exit 0 -_ACEOF -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit 1 -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - diff --git a/configure.ac b/configure.ac deleted file mode 100644 index b192885..0000000 --- a/configure.ac +++ /dev/null @@ -1,165 +0,0 @@ -dnl Welcome to the Sphinx automated build system. -dnl try not to hurt yourself ;) - -AC_INIT(pocketsphinx, 5prealpha) -AC_CONFIG_HEADERS([include/config.h]) -AM_INIT_AUTOMAKE([no-define foreign]) -AC_CONFIG_MACRO_DIR([m4]) - -CFLAGS=${CFLAGS:--g -O2 -Wall} - -AC_CANONICAL_HOST -AC_PROG_CC -AC_CHECK_TYPES(long long) -AC_CHECK_SIZEOF(long long) - -LT_INIT - -dnl -dnl Check for pkgconfig -dnl -AC_CHECK_PROG(HAVE_PKGCONFIG, pkg-config, yes, no) - -dnl -dnl Check for Doxygen, and build dox if present -dnl -AC_CHECK_PROG(HAVE_DOXYGEN, doxygen, yes, no) -AM_CONDITIONAL(BUILD_DOXYGEN, test "x$HAVE_DOXYGEN" = "xyes") - -dnl Check for SWIG and Python -AC_ARG_WITH(python, - AS_HELP_STRING([--with-python], - [Enable Python extension, built with swig, enabled by default])) - -if test "x${with_python}" != "xno"; then - AM_PATH_PYTHON(2.6, [], [AC_MSG_ERROR([python not found])]) - AX_PYTHON_DEVEL() - AX_PKG_SWIG(2.0, [], [AC_MSG_ERROR([swig not found])]) -fi - -AC_SUBST([PYTHON_CPPFLAGS]) -AM_CONDITIONAL(BUILD_SWIG, test "x$SWIG" != "x") - -dnl swig python check - -dnl -dnl Now check for GStreamer, and build the plugin if it's available -dnl -GST_MAJORMINOR=1.0 -PKG_CHECK_MODULES(GStreamer, [gstreamer-$GST_MAJORMINOR >= 1.0 - gstreamer-base-$GST_MAJORMINOR >= 1.0 - gstreamer-plugins-base-$GST_MAJORMINOR >= 1.0], - HAVE_GST=yes, HAVE_GST=no) -dnl Don't build GStreamer when cross-compiling -AM_CONDITIONAL(BUILD_GST, test x$cross_compiling != xyes && test "x$HAVE_GST" = "xyes") -GST_CFLAGS="$GStreamer_CFLAGS $GStreamer_ERROR" -GST_LIBS="$GStreamer_LIBS" -AC_SUBST(GST_MAJORMINOR) -AC_SUBST(GST_CFLAGS) -AC_SUBST(GST_LIBS) - -dnl set the plugindir where plugins should be installed -if test "x${prefix}" = "x$HOME"; then - plugindir="$HOME/.gstreamer-$GST_MAJORMINOR/plugins" -else - plugindir="\$(libdir)/gstreamer-$GST_MAJORMINOR" -fi -AC_SUBST(plugindir) - -dnl set proper LDFLAGS for plugins -GST_PLUGIN_LDFLAGS='-module -avoid-version -export-symbols-regex [_]*\(gst_\|Gst\|GST_\).*' -AC_SUBST(GST_PLUGIN_LDFLAGS) - -dnl -dnl Get SphinxBase from command line if given -dnl -AC_ARG_WITH(sphinxbase, - AS_HELP_STRING([--with-sphinxbase=DIRECTORY], - [Look for SphinxBase installation in DIRECTORY. If this is 'auto', - the system-wide installation will be used.]), - sphinxbase=$withval) - - -dnl -dnl Check for SphinxBase in parent directories -dnl -if test x$sphinxbase = x; then - dn=`dirname $0` - case "$dn" in - .) - sbdir="`pwd`/.." - ;; - [\\/]* | ?:[\\/]*) - sbdir="$dn/.." - ;; - *) - sbdir="`pwd`/$dn/.." - ;; - esac - # Look for sphinxbase in the parent directory - for sb in "$sbdir/sphinxbase" \ - "$sbdir/sphinxbase"*; do - AC_MSG_CHECKING([for sphinxbase in $sb]) - if test -f "$sb/src/libsphinxbase/libsphinxbase.la"; then - sphinxbase="$sb" - AC_MSG_RESULT(yes) - break - else - AC_MSG_RESULT(no) - fi - done -fi - -dnl -dnl Check for system SphinxBase if none was passed to us -dnl Also allow --with-sphinxbase=auto to use system one explicitly -dnl -if test x$sphinxbase = x || test x$sphinxbase = xauto; then - sphinxbase= - - if test "x$HAVE_PKGCONFIG" = "xno"; then - SPHINXBASE_CFLAGS = "-I/usr/include/sphinxbase -I/usr/local/include/sphinxbase" - SPHINXBASE_LIBS = "-lsphinxbase" - SPHINXBASE_PREFIX="/usr/local" - else - PKG_CHECK_MODULES(SPHINXBASE, [sphinxbase],,[ - AC_MSG_FAILURE(dnl -[SphinxBase was not found on your system. -Make sure that you have installed it and that the -PKG_CONFIG_PATH environment variable is set correctly, if -it was installed in a non-standard prefix.])]) - SPHINXBASE_PREFIX=`pkg-config --variable=prefix sphinxbase` - fi - - LIBS="$LIBS $SPHINXBASE_LIBS" - CPPFLAGS="$CPPFLAGS $SPHINXBASE_CFLAGS" - SPHINXBASE_SWIG="$SPHINXBASE_PREFIX/share/sphinxbase/swig" - AC_CHECK_HEADER(sphinx_config.h,,[AC_MSG_FAILURE([SphinxBase was not found on your system.])]) -else - LIBS="$LIBS -lsphinxbase" - LDFLAGS="$LDFLAGS -L$sphinxbase/lib -L$sphinxbase/src/libsphinxad -L$sphinxbase/src/libsphinxbase" - CPPFLAGS="$CPPFLAGS -I$sphinxbase/include -I$sphinxbase/include/sphinxbase" - SPHINXBASE_SWIG="$sphinxbase/swig" -fi - -AC_SUBST(SPHINXBASE_SWIG) - -AC_OUTPUT([ -pocketsphinx.pc -Makefile -include/Makefile -src/Makefile -swig/Makefile -swig/python/Makefile -swig/python/test/Makefile -src/libpocketsphinx/Makefile -src/programs/Makefile -src/gst-plugin/Makefile -doc/Makefile -doc/doxyfile -model/Makefile -test/Makefile -test/testfuncs.sh -test/unit/Makefile -test/regression/Makefile -]) diff --git a/cython/.gitignore b/cython/.gitignore new file mode 100644 index 0000000..fe0c1ac --- /dev/null +++ b/cython/.gitignore @@ -0,0 +1,2 @@ +*.so +model diff --git a/cython/CMakeLists.txt b/cython/CMakeLists.txt new file mode 100644 index 0000000..daa4f76 --- /dev/null +++ b/cython/CMakeLists.txt @@ -0,0 +1,29 @@ +find_package(Python COMPONENTS Interpreter Development.Module REQUIRED) +find_program(CYTHON "cython") + +if(NOT USE_INSTALLED_POCKETSPHINX) + set_property(TARGET pocketsphinx PROPERTY POSITION_INDEPENDENT_CODE on) +endif() + +add_custom_command( + OUTPUT _pocketsphinx.c + DEPENDS _pocketsphinx.pyx + VERBATIM + COMMAND "${CYTHON}" "${CMAKE_CURRENT_SOURCE_DIR}/_pocketsphinx.pyx" --output-file + "${CMAKE_CURRENT_BINARY_DIR}/_pocketsphinx.c") + +python_add_library(_pocketsphinx MODULE "${CMAKE_CURRENT_BINARY_DIR}/_pocketsphinx.c" WITH_SOABI) +target_link_libraries(_pocketsphinx PRIVATE pocketsphinx) +target_include_directories( + _pocketsphinx PRIVATE ${PYTHON_INCLUDE_DIR} + _pocketsphinx PRIVATE ${CMAKE_BINARY_DIR} + _pocketsphinx PRIVATE ${CMAKE_SOURCE_DIR}/src + _pocketsphinx PUBLIC ${CMAKE_SOURCE_DIR}/include + _pocketsphinx PUBLIC ${CMAKE_BINARY_DIR}/include + _pocketsphinx INTERFACE ${CMAKE_SOURCE_DIR}/include + _pocketsphinx INTERFACE ${CMAKE_BINARY_DIR}/include + ) +install(TARGETS _pocketsphinx LIBRARY DESTINATION pocketsphinx) +if(NOT USE_INSTALLED_POCKETSPHINX) + install(DIRECTORY ${PROJECT_SOURCE_DIR}/model DESTINATION pocketsphinx) +endif() diff --git a/cython/README.md b/cython/README.md new file mode 100644 index 0000000..3ee77f4 --- /dev/null +++ b/cython/README.md @@ -0,0 +1,188 @@ +PocketSphinx 5.0.4 +================== + +This is PocketSphinx, one of Carnegie Mellon University's open source large +vocabulary, speaker-independent continuous speech recognition engines. + +Although this was at one point a research system, active development +has largely ceased and it has become very, very far from the state of +the art. I am making a release, because people are nonetheless using +it, and there are a number of historical errors in the build system +and API which needed to be corrected. + +The version number is strangely large because there was a "release" +that people are using called 5prealpha, and we will use proper +[semantic versioning](https://semver.org/) from now on. + +**Please see the LICENSE file for terms of use.** + +Installation +------------ + +You should be able to install this with pip for recent platforms and +versions of Python: + + pip3 install pocketsphinx + +Alternately, you can also compile it from the source tree. I highly +suggest doing this in a virtual environment (replace +`~/ve_pocketsphinx` with the virtual environment you wish to create), +from the top level directory: + + python3 -m venv ~/ve_pocketsphinx + . ~/ve_pocketsphinx/bin/activate + pip3 install . + +On GNU/Linux and maybe other platforms, you must have +[PortAudio](http://www.portaudio.com/) installed for the `LiveSpeech` +class to work (we may add a fall-back to `sox` in the near future). +On Debian-like systems this can be achieved by installing the +`libportaudio2` package: + + sudo apt-get install libportaudio2 + +Usage +----- + +See the [examples directory](../examples/) for a number of examples of +using the library from Python. You can also read the [documentation +for the Python API](https://pocketsphinx.readthedocs.io) or [the C +API](https://cmusphinx.github.io/doc/pocketsphinx/). + +It also mostly supports the same APIs as the previous +[pocketsphinx-python](https://github.com/bambocher/pocketsphinx-python) +module, as described below. + +### LiveSpeech + +An iterator class for continuous recognition or keyword search from a +microphone. For example, to do speech-to-text with the default (some +kind of US English) model: + +```python +from pocketsphinx import LiveSpeech +for phrase in LiveSpeech(): print(phrase) +``` + +Or to do keyword search: + +```python +from pocketsphinx import LiveSpeech + +speech = LiveSpeech(keyphrase='forward', kws_threshold=1e-20) +for phrase in speech: + print(phrase.segments(detailed=True)) +``` + +With your model and dictionary: + +```python +import os +from pocketsphinx import LiveSpeech, get_model_path + +speech = LiveSpeech( + sampling_rate=16000, # optional + hmm=get_model_path('en-us'), + lm=get_model_path('en-us.lm.bin'), + dic=get_model_path('cmudict-en-us.dict') +) + +for phrase in speech: + print(phrase) +``` + +### AudioFile + +This is an iterator class for continuous recognition or keyword search +from a file. Currently it supports only raw, single-channel, 16-bit +PCM data in native byte order. + +```python +from pocketsphinx import AudioFile +for phrase in AudioFile("goforward.raw"): print(phrase) # => "go forward ten meters" +``` + +An example of a keyword search: + +```python +from pocketsphinx import AudioFile + +audio = AudioFile("goforward.raw", keyphrase='forward', kws_threshold=1e-20) +for phrase in audio: + print(phrase.segments(detailed=True)) # => "[('forward', -617, 63, 121)]" +``` + +With your model and dictionary: + +```python +import os +from pocketsphinx import AudioFile, get_model_path + +model_path = get_model_path() + +config = { + 'verbose': False, + 'audio_file': 'goforward.raw', + 'hmm': get_model_path('en-us'), + 'lm': get_model_path('en-us.lm.bin'), + 'dict': get_model_path('cmudict-en-us.dict') +} + +audio = AudioFile(**config) +for phrase in audio: + print(phrase) +``` + +Convert frame into time coordinates: + +```python +from pocketsphinx import AudioFile + +# Frames per Second +fps = 100 + +for phrase in AudioFile(frate=fps): # frate (default=100) + print('-' * 28) + print('| %5s | %3s | %4s |' % ('start', 'end', 'word')) + print('-' * 28) + for s in phrase.seg(): + print('| %4ss | %4ss | %8s |' % (s.start_frame / fps, s.end_frame / fps, s.word)) + print('-' * 28) + +# ---------------------------- +# | start | end | word | +# ---------------------------- +# | 0.0s | 0.24s | | +# | 0.25s | 0.45s | | +# | 0.46s | 0.63s | go | +# | 0.64s | 1.16s | forward | +# | 1.17s | 1.52s | ten | +# | 1.53s | 2.11s | meters | +# | 2.12s | 2.6s | | +# ---------------------------- +``` + +Authors +------- + +PocketSphinx is ultimately based on `Sphinx-II` which in turn was +based on some older systems at Carnegie Mellon University, which were +released as free software under a BSD-like license thanks to the +efforts of Kevin Lenzo. Much of the decoder in particular was written +by Ravishankar Mosur (look for "rkm" in the comments), but various +other people contributed as well, see [the AUTHORS file](./AUTHORS) +for more details. + +David Huggins-Daines (the author of this document) is +guilty^H^H^H^H^Hresponsible for creating `PocketSphinx` which added +various speed and memory optimizations, fixed-point computation, JSGF +support, portability to various platforms, and a somewhat coherent +API. He then disappeared for a while. + +Nickolay Shmyrev took over maintenance for quite a long time +afterwards, and a lot of code was contributed by Alexander Solovets, +Vyacheslav Klimkov, and others. The +[pocketsphinx-python](https://github.com/bambocher/pocketsphinx-python) +module was originally written by Dmitry Prazdnichnov. + +Currently this is maintained by David Huggins-Daines again. diff --git a/cython/_pocketsphinx.pxd b/cython/_pocketsphinx.pxd new file mode 100644 index 0000000..f64a7a0 --- /dev/null +++ b/cython/_pocketsphinx.pxd @@ -0,0 +1,512 @@ +# cython: embedsignature=True, language_level=3 +# Copyright (c) 2008-2020 Carnegie Mellon University. All rights +# reserved. +# +# You may copy, modify, and distribute this code under the same terms +# as PocketSphinx or Python, at your convenience, as long as this +# notice is not removed. +# +# Author: David Huggins-Daines + + +cdef extern from "pocketsphinx/err.h": + cdef enum err_e: + ERR_DEBUG, + ERR_INFO, + ERR_WARN, + ERR_ERROR, + ERR_FATAL, + ERR_MAX + ctypedef err_e err_lvl_t + ctypedef void (*err_cb_f)(void* user_data, err_lvl_t lvl, const char *msg) + void err_set_callback(err_cb_f callback, void *user_data) + const char *err_set_loglevel_str(const char *lvl) + + +cdef extern from "pocketsphinx/logmath.h": + ctypedef struct logmath_t: + pass + + logmath_t *logmath_init(double base, int shift, int use_table) + logmath_t *logmath_retain(logmath_t *lmath) + int logmath_free(logmath_t *lmath) + + int logmath_log(logmath_t *lmath, double p) + double logmath_exp(logmath_t *lmath, int p) + + int logmath_ln_to_log(logmath_t *lmath, double p) + double logmath_log_to_ln(logmath_t *lmath, int p) + + int logmath_log10_to_log(logmath_t *lmath, double p) + double logmath_log_to_log10(logmath_t *lmath, int p) + + int logmath_add(logmath_t *lmath, int p, int q) + + int logmath_get_zero(logmath_t *lmath) + +cdef extern from "fe/fe.h": + ctypedef struct fe_t: + pass + int fe_get_output_size(fe_t *fe) + +cdef extern from "util/hash_table.h": + ctypedef struct hash_table_t: + pass + ctypedef struct hash_entry_t: + const char *key + ctypedef struct hash_iter_t: + hash_entry_t *ent + hash_iter_t *hash_table_iter(hash_table_t *h) + hash_iter_t *hash_table_iter_next(hash_iter_t *h) + const char *hash_entry_key(hash_entry_t *ent) + + +cdef extern from "util/ckd_alloc.h": + void *ckd_alloc_2d_ptr(size_t d1, + size_t d2, + void *store, + size_t elem_size) + void ckd_free(void *ptr) + + +cdef extern from "util/cmd_ln.h": + ctypedef struct pocketsphinx_config_t: + hash_table_t *ht + const ps_arg_t *defn + ctypedef struct cmd_ln_val_t: + int type + void cmd_ln_set_str_extra_r(ps_config_t *config, + const char *name, const char *str) + ps_config_t *cmd_ln_parse_file_r(ps_config_t *inout_cmdln, ps_arg_t *defn, + const char *path, int strict) + + +cdef extern from "lm/ngram_model.h": + cdef enum ngram_file_type_e: + NGRAM_INVALID, + NGRAM_AUTO, + NGRAM_ARPA, + NGRAM_BIN + ctypedef ngram_file_type_e ngram_file_type_t + cdef enum ngram_case_e: + NGRAM_UPPER, + NGRAM_LOWER + ctypedef ngram_case_e ngram_case_t + ctypedef struct ngram_model_t: + pass + ctypedef struct ngram_iter_t: + pass + ctypedef struct ngram_model_set_iter_t: + pass + ngram_model_t *ngram_model_read(ps_config_t *config, + const char *file_name, + ngram_file_type_t file_type, + logmath_t *lmath) + int ngram_model_write(ngram_model_t *model, const char *file_name, + ngram_file_type_t format) + ngram_file_type_t ngram_file_name_to_type(const char *file_name) + ngram_file_type_t ngram_str_to_type(const char *str_name) + const char *ngram_type_to_str(int type) + ngram_model_t *ngram_model_retain(ngram_model_t *model) + int ngram_model_free(ngram_model_t *model) + int ngram_model_casefold(ngram_model_t *model, int kase) + int ngram_model_apply_weights(ngram_model_t *model, + float lw, float wip) + float ngram_model_get_weights(ngram_model_t *model, int *out_log_wip) + int ngram_score(ngram_model_t *model, const char *word, ...) + int ngram_tg_score(ngram_model_t *model, + int w3, int w2, int w1, + int *n_used) + int ngram_bg_score(ngram_model_t *model, + int w2, int w1, + int *n_used) + int ngram_ng_score(ngram_model_t *model, int wid, int *history, + int n_hist, int *n_used) + int ngram_probv(ngram_model_t *model, const char *word, ...) + int ngram_prob(ngram_model_t *model, const char* const *words, int n) + int ngram_ng_prob(ngram_model_t *model, int wid, int *history, + int n_hist, int *n_used) + int ngram_score_to_prob(ngram_model_t *model, int score) + int ngram_wid(ngram_model_t *model, const char *word) + const char *ngram_word(ngram_model_t *model, int wid) + int ngram_unknown_wid(ngram_model_t *model) + int ngram_zero(ngram_model_t *model) + int ngram_model_get_size(ngram_model_t *model) + const unsigned int *ngram_model_get_counts(ngram_model_t *model) + ngram_iter_t *ngram_model_mgrams(ngram_model_t *model, int m) + ngram_iter_t *ngram_iter(ngram_model_t *model, const char *word, ...) + ngram_iter_t *ngram_ng_iter(ngram_model_t *model, int wid, int *history, int n_hist) + const int *ngram_iter_get(ngram_iter_t *itor, + int *out_score, + int *out_bowt) + ngram_iter_t *ngram_iter_successors(ngram_iter_t *itor) + ngram_iter_t *ngram_iter_next(ngram_iter_t *itor) + void ngram_iter_free(ngram_iter_t *itor) + int ngram_model_add_word(ngram_model_t *model, + const char *word, float weight) + int ngram_model_read_classdef(ngram_model_t *model, + const char *file_name) + int ngram_model_add_class(ngram_model_t *model, + const char *classname, + float classweight, + char **words, + const float *weights, + int n_words) + int ngram_model_add_class_word(ngram_model_t *model, + const char *classname, + const char *word, + float weight) + ngram_model_t *ngram_model_set_init(ps_config_t *config, + ngram_model_t **models, + char **names, + const float *weights, + int n_models) + ngram_model_t *ngram_model_set_read(ps_config_t *config, + const char *lmctlfile, + logmath_t *lmath) + int ngram_model_set_count(ngram_model_t *set) + ngram_model_set_iter_t *ngram_model_set_iter(ngram_model_t *set) + ngram_model_set_iter_t *ngram_model_set_iter_next(ngram_model_set_iter_t *itor) + void ngram_model_set_iter_free(ngram_model_set_iter_t *itor) + ngram_model_t *ngram_model_set_iter_model(ngram_model_set_iter_t *itor, + const char **lmname) + ngram_model_t *ngram_model_set_select(ngram_model_t *set, + const char *name) + ngram_model_t *ngram_model_set_lookup(ngram_model_t *set, + const char *name) + const char *ngram_model_set_current(ngram_model_t *set) + ngram_model_t *ngram_model_set_interp(ngram_model_t *set, + const char **names, + const float *weights) + ngram_model_t *ngram_model_set_add(ngram_model_t *set, + ngram_model_t *model, + const char *name, + float weight, + int reuse_widmap) + ngram_model_t *ngram_model_set_remove(ngram_model_t *set, + const char *name, + int reuse_widmap) + void ngram_model_set_map_words(ngram_model_t *set, + const char **words, + int n_words) + int ngram_model_set_current_wid(ngram_model_t *set, + int set_wid) + int ngram_model_set_known_wid(ngram_model_t *set, int set_wid) + void ngram_model_flush(ngram_model_t *lm) + + +cdef extern from "lm/fsg_model.h": + ctypedef struct fsg_model_t: + int start_state + int final_state + + fsg_model_t *fsg_model_init(const char *name, logmath_t *lmath, + float lw, int n_state) + fsg_model_t *fsg_model_readfile(const char *file, logmath_t *lmath, + float lw) + const char *fsg_model_name(fsg_model_t *fsg) + fsg_model_t *fsg_model_retain(fsg_model_t *fsg) + int fsg_model_free(fsg_model_t *fsg) + + int fsg_model_word_add(fsg_model_t *fsg, const char *word) + int fsg_model_word_id(fsg_model_t *fsg, const char *word) + const char *fsg_model_word_str(fsg_model_t *fsg, int wid) + int fsg_model_accept(fsg_model_t *fsg, const char *words) + void fsg_model_trans_add(fsg_model_t * fsg, + int source, int dest, int logp, int wid) + int fsg_model_null_trans_add(fsg_model_t * fsg, int source, int dest, + int logp) + int fsg_model_tag_trans_add(fsg_model_t * fsg, int source, int dest, + int logp, int wid) + int fsg_model_add_silence(fsg_model_t * fsg, const char *silword, + int state, float silprob) + int fsg_model_add_alt(fsg_model_t * fsg, const char *baseword, + const char *altword) + void fsg_model_writefile(fsg_model_t *fsg, const char *file) + void fsg_model_writefile_fsm(fsg_model_t *fsg, const char *file) + void fsg_model_writefile_symtab(fsg_model_t *fsg, const char *file) + + +cdef extern from "lm/jsgf.h": + ctypedef struct jsgf_t: + pass + ctypedef struct jsgf_rule_t: + pass + fsg_model_t *jsgf_read_file(const char *name, logmath_t *lmath, + float lw) + jsgf_t *jsgf_parse_file(const char *string, jsgf_t *parent) + jsgf_t *jsgf_parse_string(const char *string, jsgf_t *parent) + const char *jsgf_grammar_name(jsgf_t *jsgf) + void jsgf_grammar_free(jsgf_t *jsgf) + jsgf_rule_t *jsgf_get_rule(jsgf_t *grammar, const char *name) + jsgf_rule_t *jsgf_get_public_rule(jsgf_t *grammar) + const char *jsgf_rule_name(jsgf_rule_t *rule) + int jsgf_rule_public(jsgf_rule_t *rule) + fsg_model_t *jsgf_build_fsg(jsgf_t *grammar, jsgf_rule_t *rule, + logmath_t *lmath, float lw) + + +cdef extern from "pocketsphinx/lattice.h": + ctypedef struct ps_lattice_t: + pass + ctypedef struct ps_latnode_t: + pass + ctypedef struct ps_latnode_iter_t: + pass + ctypedef struct ps_latlink_t: + pass + ctypedef struct ps_latlink_iter_t: + pass + + ps_lattice_t *ps_lattice_read(ps_decoder_t *ps, + const char *file) + ps_lattice_t *ps_lattice_retain(ps_lattice_t *dag) + int ps_lattice_free(ps_lattice_t *dag) + int ps_lattice_write(ps_lattice_t *dag, const char *filename) + int ps_lattice_write_htk(ps_lattice_t *dag, const char *filename) + logmath_t *ps_lattice_get_logmath(ps_lattice_t *dag) + ps_latnode_iter_t *ps_latnode_iter(ps_lattice_t *dag) + ps_latnode_iter_t *ps_latnode_iter_next(ps_latnode_iter_t *itor) + void ps_latnode_iter_free(ps_latnode_iter_t *itor) + ps_latnode_t *ps_latnode_iter_node(ps_latnode_iter_t *itor) + int ps_latnode_times(ps_latnode_t *node, short *out_fef, short *out_lef) + const char *ps_latnode_word(ps_lattice_t *dag, ps_latnode_t *node) + const char *ps_latnode_baseword(ps_lattice_t *dag, ps_latnode_t *node) + ps_latlink_iter_t *ps_latnode_exits(ps_latnode_t *node) + ps_latlink_iter_t *ps_latnode_entries(ps_latnode_t *node) + int ps_latnode_prob(ps_lattice_t *dag, ps_latnode_t *node, + ps_latlink_t **out_link) + ps_latlink_iter_t *ps_latlink_iter_next(ps_latlink_iter_t *itor) + void ps_latlink_iter_free(ps_latlink_iter_t *itor) + ps_latlink_t *ps_latlink_iter_link(ps_latlink_iter_t *itor) + int ps_latlink_times(ps_latlink_t *link, short *out_sf) + ps_latnode_t *ps_latlink_nodes(ps_latlink_t *link, ps_latnode_t **out_src) + const char *ps_latlink_word(ps_lattice_t *dag, ps_latlink_t *link) + const char *ps_latlink_baseword(ps_lattice_t *dag, ps_latlink_t *link) + ps_latlink_t *ps_latlink_pred(ps_latlink_t *link) + int ps_latlink_prob(ps_lattice_t *dag, ps_latlink_t *link, int *out_ascr) + void ps_lattice_link(ps_lattice_t *dag, ps_latnode_t *_from, ps_latnode_t *to, + int score, int ef) + ps_latlink_t *ps_lattice_traverse_edges(ps_lattice_t *dag, ps_latnode_t *start, + ps_latnode_t *end) + ps_latlink_t *ps_lattice_traverse_next(ps_lattice_t *dag, ps_latnode_t *end) + ps_latlink_t *ps_lattice_reverse_edges(ps_lattice_t *dag, ps_latnode_t *start, + ps_latnode_t *end) + ps_latlink_t *ps_lattice_reverse_next(ps_lattice_t *dag, ps_latnode_t *start) + ps_latlink_t *ps_lattice_bestpath(ps_lattice_t *dag, ngram_model_t *lmset, + float lwf, float ascale) + int ps_lattice_posterior(ps_lattice_t *dag, ngram_model_t *lmset, float ascale) + int ps_lattice_posterior_prune(ps_lattice_t *dag, int beam) + int ps_lattice_n_frames(ps_lattice_t *dag) + + +# Still need this unfortunately +cdef extern from "util/cmd_ln.h": + ctypedef struct ps_config_t: + hash_table_t *ht + ps_arg_t *defn + ps_config_t *ps_config_parse_args(const ps_arg_t *defn, int argc, char **argv) + +cdef extern from "pocketsphinx.h": + cdef enum ps_type_t: + ARG_REQUIRED, + ARG_INTEGER, + ARG_FLOATING, + ARG_STRING, + ARG_BOOLEAN, + REQARG_INTEGER, + REQARG_FLOATING, + REQARG_STRING, + REQARG_BOOLEAN + ctypedef struct ps_arg_t: + const char *name + int type + const char *deflt + const char *doc + ctypedef struct ps_decoder_t: + pass + ctypedef struct ps_seg_t: + pass + ctypedef struct ps_nbest_t: + pass + ctypedef union anytype_t: + long i + float fl + void *ptr + ps_config_t *ps_config_init(const ps_arg_t *defn) + ps_config_t *ps_config_retain(ps_config_t *config) + int ps_config_free(ps_config_t *config) + ps_config_t *ps_config_parse_json(ps_config_t *config, const char *json) + const char *ps_config_serialize_json(ps_config_t *config) + ps_type_t ps_config_typeof(ps_config_t *config, const char *name) + const anytype_t *ps_config_get(ps_config_t *config, const char *name) + const anytype_t *ps_config_set(ps_config_t *config, const char *name, + const anytype_t *val, ps_type_t t) + long ps_config_int(ps_config_t *config, const char *name) + int ps_config_bool(ps_config_t *config, const char *name) + double ps_config_float(ps_config_t *config, const char *name) + const char *ps_config_str(ps_config_t *config, const char *name) + const anytype_t *ps_config_set_int(ps_config_t *config, const char *name, long val) + const anytype_t *ps_config_set_bool(ps_config_t *config, const char *name, int val) + const anytype_t *ps_config_set_float(ps_config_t *config, const char *name, double val) + const anytype_t *ps_config_set_str(ps_config_t *config, const char *name, const char *val) + ps_arg_t *ps_args() + ps_decoder_t *ps_init(ps_config_t *config) + int ps_free(ps_decoder_t *ps) + const char *ps_default_modeldir() + void ps_default_search_args(ps_config_t *config) + void ps_expand_model_config(ps_config_t *config) + int ps_reinit(ps_decoder_t *ps, ps_config_t *config) + int ps_reinit_feat(ps_decoder_t *ps, ps_config_t *config) + const char *ps_get_cmn(ps_decoder_t *ps, int update) + int ps_set_cmn(ps_decoder_t *ps, const char *cmn) + logmath_t *ps_get_logmath(ps_decoder_t *ps) + int ps_start_stream(ps_decoder_t *ps) + int ps_get_in_speech(ps_decoder_t *ps) + int ps_start_utt(ps_decoder_t *ps) + int ps_process_raw(ps_decoder_t *ps, + const short *data, size_t n_samples, + int no_search, int full_utt) + int ps_process_cep(ps_decoder_t *ps, + float **data, + int n_frames, + int no_search, + int full_utt) + int ps_end_utt(ps_decoder_t *ps) + const char *ps_get_hyp(ps_decoder_t *ps, int *out_best_score) + int ps_get_prob(ps_decoder_t *ps) + ps_seg_t *ps_seg_iter(ps_decoder_t *ps) + ps_seg_t *ps_seg_next(ps_seg_t *seg) + const char *ps_seg_word(ps_seg_t *seg) + void ps_seg_frames(ps_seg_t *seg, int *out_sf, int *out_ef) + int ps_seg_prob(ps_seg_t *seg, int *out_ascr, int *out_lscr, int *out_lback) + void ps_seg_free(ps_seg_t *seg) + int ps_add_word(ps_decoder_t *ps, char *word, char *phones, int update) + char *ps_lookup_word(ps_decoder_t *ps, const char *word) + ps_nbest_t *ps_nbest(ps_decoder_t *ps) + ps_nbest_t *ps_nbest_next(ps_nbest_t *nbest) + const char *ps_nbest_hyp(ps_nbest_t *nbest, int *out_score) + ps_seg_t *ps_nbest_seg(ps_nbest_t *nbest) + void ps_nbest_free(ps_nbest_t *nbest) + ps_lattice_t *ps_get_lattice(ps_decoder_t *ps) + void ps_get_utt_time(ps_decoder_t *ps, double *out_nspeech, + double *out_ncpu, double *out_nwall) + void ps_get_all_time(ps_decoder_t *ps, double *out_nspeech, + double *out_ncpu, double *out_nwall) + int ps_get_n_frames(ps_decoder_t *ps) + ps_config_t *ps_get_config(ps_decoder_t *ps) + int ps_load_dict(ps_decoder_t *ps, const char *dictfile, + const char *fdictfile, const char *format) + int ps_save_dict(ps_decoder_t *ps, const char *dictfile, + const char *format) + + +cdef extern from "pocketsphinx/search.h": + ctypedef struct ps_search_iter_t: + pass + int ps_activate_search(ps_decoder_t *ps, const char *name) + int ps_remove_search(ps_decoder_t *ps, const char *name) + const char *ps_current_search(ps_decoder_t *ps) + ps_search_iter_t *ps_search_iter(ps_decoder_t *ps) + ps_search_iter_t *ps_search_iter_next(ps_search_iter_t *itor) + const char* ps_search_iter_val(ps_search_iter_t *itor) + void ps_search_iter_free(ps_search_iter_t *itor) + ngram_model_t *ps_get_lm(ps_decoder_t *ps, const char *name) + int ps_add_lm(ps_decoder_t *ps, const char *name, ngram_model_t *lm) + int ps_add_lm_file(ps_decoder_t *ps, const char *name, const char *path) + fsg_model_t *ps_get_fsg(ps_decoder_t *ps, const char *name) + int ps_add_fsg(ps_decoder_t *ps, const char *name, fsg_model_t *fsg) + int ps_add_jsgf_file(ps_decoder_t *ps, const char *name, const char *path) + int ps_add_jsgf_string(ps_decoder_t *ps, const char *name, const char *jsgf_string) + const char* ps_get_kws(ps_decoder_t *ps, const char *name) + int ps_add_kws(ps_decoder_t *ps, const char *name, const char *keyfile) + int ps_add_keyphrase(ps_decoder_t *ps, const char *name, const char *keyphrase) + int ps_add_allphone(ps_decoder_t *ps, const char *name, ngram_model_t *lm) + int ps_add_allphone_file(ps_decoder_t *ps, const char *name, const char *path) + int ps_set_align_text(ps_decoder_t *ps, const char *words) + int ps_set_alignment(ps_decoder_t *ps, ps_alignment_t *al) + ps_alignment_t *ps_get_alignment(ps_decoder_t *ps) + +cdef extern from "pocketsphinx/vad.h": + ctypedef struct ps_vad_t: + pass + cdef enum ps_vad_mode_e: + PS_VAD_LOOSE, + PS_VAD_MEDIUM_LOOSE, + PS_VAD_MEDIUM_STRICT, + PS_VAD_STRICT + ctypedef ps_vad_mode_e ps_vad_mode_t + cdef enum ps_vad_class_e: + PS_VAD_ERROR, + PS_VAD_NOT_SPEECH, + PS_VAD_SPEECH + ctypedef ps_vad_class_e ps_vad_class_t + cdef int PS_VAD_DEFAULT_SAMPLE_RATE + cdef double PS_VAD_DEFAULT_FRAME_LENGTH + + ps_vad_t *ps_vad_init(ps_vad_mode_t mode, int sample_rate, double frame_length) + int ps_vad_free(ps_vad_t *vad) + int ps_vad_set_input_params(ps_vad_t *vad, int sample_rate, double frame_length) + int ps_vad_sample_rate(ps_vad_t *vad) + size_t ps_vad_frame_size(ps_vad_t *vad) + double ps_vad_frame_length(ps_vad_t *vad) + ps_vad_class_t ps_vad_classify(ps_vad_t *vad, const short *frame) + +cdef extern from "pocketsphinx/endpointer.h": + ctypedef struct ps_endpointer_t: + pass + cdef double PS_ENDPOINTER_DEFAULT_WINDOW + cdef double PS_ENDPOINTER_DEFAULT_RATIO + ps_endpointer_t *ps_endpointer_init(double window, + double ratio, + ps_vad_mode_t mode, + int sample_rate, double frame_length) + ps_endpointer_t *ps_endpointer_retain(ps_endpointer_t *ep) + int ps_endpointer_free(ps_endpointer_t *ep) + ps_vad_t *ps_endpointer_vad(ps_endpointer_t *ep) + size_t ps_endpointer_frame_size(ps_endpointer_t *ep) + double ps_endpointer_frame_length(ps_endpointer_t *ep) + int ps_endpointer_sample_rate(ps_endpointer_t *ep) + const short *ps_endpointer_process(ps_endpointer_t *ep, + const short *frame) + const short *ps_endpointer_end_stream(ps_endpointer_t *ep, + const short *frame, + size_t nsamp, + size_t *out_nsamp) + int ps_endpointer_in_speech(ps_endpointer_t *ep) + double ps_endpointer_speech_start(ps_endpointer_t *ep) + double ps_endpointer_speech_end(ps_endpointer_t *ep) + +cdef extern from "pocketsphinx/alignment.h": + ctypedef struct ps_alignment_t: + pass + ctypedef struct ps_alignment_iter_t: + pass + ctypedef struct pid_struct: + short cipid + unsigned short ssid + int tmat + ctypedef union id_union: + int wid + pid_struct pid + unsigned short senid + ctypedef struct ps_alignment_entry_t: + int start + int duration + int score + id_union id + int parent + int child + ps_alignment_t *ps_alignment_retain(ps_alignment_t *al) + int ps_alignment_free(ps_alignment_t *al) + int ps_alignment_n_words(ps_alignment_t *al) + int ps_alignment_n_phones(ps_alignment_t *al) + int ps_alignment_n_states(ps_alignment_t *al) + ps_alignment_iter_t *ps_alignment_words(ps_alignment_t *al) + ps_alignment_iter_t *ps_alignment_phones(ps_alignment_t *al) + ps_alignment_iter_t *ps_alignment_states(ps_alignment_t *al) + ps_alignment_iter_t *ps_alignment_iter_next(ps_alignment_iter_t *itor) + ps_alignment_iter_t *ps_alignment_iter_children(ps_alignment_iter_t *itor) + int ps_alignment_iter_seg(ps_alignment_iter_t *itor, int *start, int *duration) + const char *ps_alignment_iter_name(ps_alignment_iter_t *itor) + int ps_alignment_iter_free(ps_alignment_iter_t *itor) diff --git a/cython/_pocketsphinx.pyx b/cython/_pocketsphinx.pyx new file mode 100644 index 0000000..d94f4a3 --- /dev/null +++ b/cython/_pocketsphinx.pyx @@ -0,0 +1,2107 @@ +# cython: embedsignature=True, language_level=3 +# Copyright (c) 2008-2020 Carnegie Mellon University. All rights +# reserved. +# +# You may copy, modify, and distribute this code under the same terms +# as PocketSphinx or Python, at your convenience, as long as this +# notice is not removed. +# +# Author: David Huggins-Daines + +from libc.stdlib cimport malloc, free +from libc.string cimport memcpy +import itertools +import logging +import pocketsphinx +import warnings +import os +cimport _pocketsphinx + +LOGGER = logging.getLogger("pocketsphinx") + +cdef class Config: + """Configuration object for PocketSphinx. + + The PocketSphinx recognizer can be configured either implicitly, + by passing keyword arguments to `Decoder`, or by creating and + manipulating `Config` objects. There are a large number of + parameters, most of which are not important or subject to change. + + A `Config` can be initialized with keyword arguments:: + + config = Config(hmm="path/to/things", dict="my.dict") + + It can also be initialized by parsing JSON (either as bytes or str):: + + config = Config.parse_json('''{"hmm": "path/to/things", + "dict": "my.dict"}''') + + The "parser" is very much not strict, so you can also pass a sort + of pseudo-YAML to it, e.g.:: + + config = Config.parse_json("hmm: path/to/things, dict: my.dict") + + You can also initialize an empty `Config` and set arguments in it + directly:: + + config = Config() + config["hmm"] = "path/to/things" + + In general, a `Config` mostly acts like a dictionary, and can be + iterated over in the same fashion. However, attempting to access + a parameter that does not already exist will raise a `KeyError`. + + Many parameters have default values. Also, when constructing a + `Config` directly (as opposed to parsing JSON), `hmm`, `lm`, and + `dict` are set to the default models (some kind of US English + models of unknown origin + CMUDict). You can prevent this by + passing `None` for any of these parameters, e.g.:: + + config = Config(lm=None) # Do not load a language model + + Decoder initialization **will fail** if more than one of `lm`, + `jsgf`, `fsg`, `keyphrase`, `kws`, `allphone`, or `lmctl` are set + in the configuration. To make life easier, and because there is + no possible case in which you would do this intentionally, if you + initialize a `Decoder` or `Config` with any of these (and not + `lm`), the default `lm` value will be removed. This is not the + case if you decide to set one of them in an existing `Config`, so + in that case you must make sure to set `lm` to `None`:: + + config["jsgf"] = "spam_eggs_and_spam.gram" + config["lm"] = None + + You may also call `default_search_args()` after the fact to set + `hmm`, `lm`, and `dict` to the system defaults. Note that this + will set them unconditionally. + + See :doc:`config_params` for a description of existing parameters. + + """ + cdef ps_config_t *config + + # This is __init__ so we can bypass it if necessary + def __init__(self, *args, **kwargs): + cdef char **argv + # Undocumented command-line parsing + if args: + args = [str(k).encode('utf-8') + for k in args] + argv = malloc((len(args) + 1) * sizeof(char *)) + argv[len(args)] = NULL + for i, buf in enumerate(args): + if buf is None: + argv[i] = NULL + else: + argv[i] = buf + self.config = ps_config_parse_args(NULL, len(args), argv) + free(argv) + else: + self.config = ps_config_init(NULL) + # Set default search arguments + self.default_search_args() + # Now override them from kwargs (including None) + if kwargs: + # Remove lm if a different search was specified + for s in ("jsgf", "fsg", "kws", "keyphrase", + "allphone", "lmctl"): + if s in kwargs: + ps_config_set_str(self.config, "lm", NULL) + break + for k, v in kwargs.items(): + # Note that all this is quite inefficient as we end up + # calling _normalize_key repeatedly. + ckey = self._normalize_key(k) + # Special dispensation to support the thing which was + # documented but never actually worked, i.e. setting a + # string value to False (should be None) to remove the + # default. + if ps_config_typeof(self.config, ckey) & ARG_STRING: + if v is False: + v = None + self[ckey] = v + + def default_search_args(self): + """Set arguments for the default acoustic and language model. + + Set `hmm`, `lm`, and `dict` to the default ones (some kind of + US English models of unknown origin + CMUDict). This will + overwrite any previous values for these parameters, and does + not check if the files exist. + """ + default_am = pocketsphinx.get_model_path("en-us/en-us") + self.set_string("hmm", default_am) + default_lm = pocketsphinx.get_model_path("en-us/en-us.lm.bin") + self.set_string("lm", default_lm) + default_dict = pocketsphinx.get_model_path("en-us/cmudict-en-us.dict") + self.set_string("dict", default_dict) + + @staticmethod + cdef create_from_ptr(ps_config_t *config): + cdef Config self = Config.__new__(Config) + self.config = config + return self + + @staticmethod + def parse_file(str path): + """DEPRECATED: Parse a config file. + + This reads a configuration file in "command-line" format, for example:: + + -arg1 value -arg2 value + -arg3 value + + Args: + path(str): Path to configuration file. + Returns: + Config: Parsed config, or None on error. + """ + cdef ps_config_t *config = cmd_ln_parse_file_r(NULL, ps_args(), + path.encode(), False) + warnings.warn("parse_file() is deprecated, use JSON configuration instead", + DeprecationWarning) + if config == NULL: + return None + return Config.create_from_ptr(config) + + @staticmethod + def parse_json(json): + """Parse JSON (or pseudo-YAML) configuration + + Args: + json(bytes|str): JSON data. + Returns: + Config: Parsed config, or None on error. + """ + cdef ps_config_t *config + if not isinstance(json, bytes): + json = json.encode("utf-8") + config = ps_config_parse_json(NULL, json) + if config == NULL: + return None + return Config.create_from_ptr(config) + + def dumps(self): + """Serialize configuration to a JSON-formatted `str`. + + This produces JSON from a configuration object, with default + values included. + + Returns: + str: Serialized JSON + Raises: + RuntimeError: if serialization fails somehow. + """ + cdef const char *json = ps_config_serialize_json(self.config) + if json == NULL: + raise RuntimeError("JSON serialization failed") + return json.decode("utf-8") + + def __dealloc__(self): + ps_config_free(self.config) + + def get_float(self, key): + return ps_config_float(self.config, self._normalize_key(key)) + + def get_int(self, key): + return ps_config_int(self.config, self._normalize_key(key)) + + def get_string(self, key): + cdef const char *val = ps_config_str(self.config, + self._normalize_key(key)) + if val == NULL: + return None + else: + return val.decode('utf-8') + + def get_boolean(self, key): + return ps_config_bool(self.config, self._normalize_key(key)) + + def set_float(self, key, double val): + ps_config_set_float(self.config, self._normalize_key(key), val) + + def set_int(self, key, long val): + ps_config_set_int(self.config, self._normalize_key(key), val) + + def set_boolean(self, key, val): + ps_config_set_bool(self.config, self._normalize_key(key), bool(val)) + + def set_string(self, key, val): + if val == None: + ps_config_set_str(self.config, self._normalize_key(key), NULL) + else: + ps_config_set_str(self.config, self._normalize_key(key), val.encode('utf-8')) + + def set_string_extra(self, key, val): + if val == None: + cmd_ln_set_str_extra_r(self.config, self._normalize_key(key), NULL) + else: + cmd_ln_set_str_extra_r(self.config, self._normalize_key(key), val.encode('utf-8')) + + def exists(self, key): + return key in self + + cdef _normalize_key(self, key): + if isinstance(key, bytes): + # Assume already normalized + return key + else: + if key[0] in "-_": + key = key[1:] + return key.encode('utf-8') + + def __contains__(self, key): + return ps_config_typeof(self.config, self._normalize_key(key)) != 0 + + def __getitem__(self, key): + cdef const char *cval + cdef const anytype_t *at; + cdef int t + + ckey = self._normalize_key(key) + at = ps_config_get(self.config, ckey) + if at == NULL: + raise KeyError("Unknown key %s" % key) + t = ps_config_typeof(self.config, ckey) + if t & ARG_STRING: + cval = at.ptr + if cval == NULL: + return None + else: + return cval.decode('utf-8') + elif t & ARG_INTEGER: + return at.i + elif t & ARG_FLOATING: + return at.fl + elif t & ARG_BOOLEAN: + return bool(at.i) + else: + raise ValueError("Unable to handle parameter type %d" % t) + + def __setitem__(self, key, val): + cdef int t + ckey = self._normalize_key(key) + t = ps_config_typeof(self.config, ckey) + if t == 0: + raise KeyError("Unknown key %s" % key) + if t & ARG_STRING: + if val is None: + ps_config_set_str(self.config, ckey, NULL) + else: + ps_config_set_str(self.config, ckey, str(val).encode('utf-8')) + elif t & ARG_INTEGER: + ps_config_set_int(self.config, ckey, int(val)) + elif t & ARG_FLOATING: + ps_config_set_float(self.config, ckey, float(val)) + elif t & ARG_BOOLEAN: + ps_config_set_bool(self.config, ckey, bool(val)) + else: + raise ValueError("Unable to handle parameter type %d" % t) + + def __iter__(self): + cdef hash_table_t *ht = self.config.ht + cdef hash_iter_t *itor + itor = hash_table_iter(self.config.ht) + while itor != NULL: + ckey = hash_entry_key(itor.ent) + yield ckey.decode('utf-8') + itor = hash_table_iter_next(itor) + + def items(self): + for key in self: + yield (key, self[key]) + + def __len__(self): + # Incredibly, the only way to do this + return sum(1 for _ in self) + + def describe(self): + """Iterate over parameter descriptions. + + This function returns a generator over the parameters defined + in a configuration, as `Arg` objects. + + Returns: + Iterable[Arg]: Descriptions of parameters including their + default values and documentation + + """ + cdef const ps_arg_t *arg = self.config.defn + cdef int base_type + while arg != NULL and arg.name != NULL: + name = arg.name.decode('utf-8') + if name[0] == '-': + name = name[1:] + if arg.deflt == NULL: + default = None + else: + default = arg.deflt.decode('utf-8') + if arg.doc == NULL: + doc = None + else: + doc = arg.doc.decode('utf-8') + required = (arg.type & ARG_REQUIRED) != 0 + base_type = arg.type & ~ARG_REQUIRED + if base_type == ARG_INTEGER: + arg_type = int + elif base_type == ARG_FLOATING: + arg_type = float + elif base_type == ARG_STRING: + arg_type = str + elif base_type == ARG_BOOLEAN: + arg_type = bool + else: + raise ValueError("Unknown type %d in argument %s" + % (base_type, name)) + arg = arg + 1 + yield pocketsphinx.Arg(name=name, default=default, doc=doc, + type=arg_type, required=required) + +cdef class LogMath: + """Log-space computation object used by PocketSphinx. + + PocketSphinx does various computations internally using integer + math in logarithmic space with a very small base (usually 1.0001 + or 1.0003).""" + cdef logmath_t *lmath + + # This is __init__ and *not* __cinit__ because we do not want it + # to get called by create() below (would leak memory) + def __init__(self, base=1.0001, shift=0, use_table=False): + self.lmath = logmath_init(base, shift, use_table) + + @staticmethod + cdef create_from_ptr(logmath_t *lmath): + cdef LogMath self = LogMath.__new__(LogMath) + self.lmath = lmath + return self + + def __dealloc__(self): + if self.lmath != NULL: + logmath_free(self.lmath) + + def log(self, p): + return logmath_log(self.lmath, p) + + def exp(self, p): + return logmath_exp(self.lmath, p) + + def ln_to_log(self, p): + return logmath_ln_to_log(self.lmath, p) + + def log_to_ln(self, p): + return logmath_log_to_ln(self.lmath, p) + + def log10_to_log(self, p): + return logmath_log10_to_log(self.lmath, p) + + def log_to_log10(self, p): + return logmath_log_to_log10(self.lmath, p) + + def add(self, p, q): + return logmath_add(self.lmath, p, q) + + def get_zero(self): + return logmath_get_zero(self.lmath) + +cdef class Segment: + """Word segmentation, as generated by `Decoder.seg`. + + Attributes: + word(str): Name of word. + start_frame(int): Index of start frame. + end_frame(int): Index of end frame (inclusive!) + ascore(float): Acoustic score (density). + lscore(float): Language model score (joint probability). + lback(int): Language model backoff order. + """ + cdef public str word + cdef public int start_frame + cdef public int end_frame + cdef public int lback + cdef public double ascore + cdef public double prob + cdef public double lscore + + @staticmethod + cdef create(ps_seg_t *seg, logmath_t *lmath): + cdef int ascr, lscr, lback + cdef int sf, ef + cdef Segment self + + self = Segment.__new__(Segment) + self.word = ps_seg_word(seg).decode('utf-8') + ps_seg_frames(seg, &sf, &ef) + self.start_frame = sf + self.end_frame = ef + self.prob = logmath_exp(lmath, + ps_seg_prob(seg, &ascr, &lscr, &lback)); + self.ascore = logmath_exp(lmath, ascr) + self.lscore = logmath_exp(lmath, lscr) + self.lback = lback + return self + + +cdef class SegmentList: + """List of word segmentations, as returned by `Decoder.seg`. + + This is a one-time iterator over the word segmentation. Basically + you can think of it as Iterable[Segment]. You should not try to + create it directly. + """ + cdef ps_seg_t *seg + cdef logmath_t *lmath + + def __cinit__(self): + self.seg = NULL + self.lmath = NULL + + @staticmethod + cdef create(ps_seg_t *seg, logmath_t *lmath): + cdef SegmentList self = SegmentList.__new__(SegmentList) + self.seg = seg + self.lmath = logmath_retain(lmath) + return self + + def __iter__(self): + while self.seg != NULL: + yield Segment.create(self.seg, self.lmath) + self.seg = ps_seg_next(self.seg) + + def __dealloc__(self): + if self.seg != NULL: + ps_seg_free(self.seg) + if self.lmath != NULL: + logmath_free(self.lmath) + +cdef class Hypothesis: + """Recognition hypothesis, as returned by `Decoder.hyp`. + + Attributes: + hypstr(str): Recognized text. + score(float): Recognition score. + best_score(float): Alias for `score` for compatibility. + prob(float): Posterior probability. + """ + cdef public str hypstr + cdef public double score + cdef public double prob + + @property + def best_score(self): + return self.score + + def __init__(self, hypstr, score, prob): + self.hypstr = hypstr + self.score = score + self.prob = prob + + +cdef class NBestList: + """List of hypotheses, as returned by `Decoder.nbest`. + + This is a one-time iterator over the N-Best list. Basically + you can think of it as Iterable[Hypothesis]. You should not try to + create it directly. + """ + cdef ps_nbest_t *nbest + cdef logmath_t *lmath + + def __cinit__(self): + self.nbest = NULL + self.lmath = NULL + + @staticmethod + cdef create(ps_nbest_t *nbest, logmath_t *lmath): + cdef NBestList self = NBestList.__new__(NBestList) + self.nbest = nbest + self.lmath = logmath_retain(lmath) + return self + + def __iter__(self): + while self.nbest != NULL: + yield self.hyp() + self.nbest = ps_nbest_next(self.nbest) + + def __dealloc__(self): + if self.nbest != NULL: + ps_nbest_free(self.nbest) + if self.lmath != NULL: + logmath_free(self.lmath) + + def hyp(self): + """Get current recognition hypothesis. + + Returns: + Hypothesis: Current recognition output. + """ + cdef const char *hyp + cdef int score + + hyp = ps_nbest_hyp(self.nbest, &score) + if hyp == NULL: + return None + prob = 0 + return Hypothesis(hyp.decode('utf-8'), + logmath_exp(self.lmath, score), + logmath_exp(self.lmath, prob)) + + +cdef class NGramModel: + """N-Gram language model.""" + cdef ngram_model_t *lm + + def __init__(self, Config config, LogMath logmath, str path): + cdef ngram_model_t *lm = ngram_model_read(config.config, + path.encode("utf-8"), + NGRAM_AUTO, + logmath.lmath) + if lm == NULL: + raise ValueError("Unable to create language model") + self.lm = lm + + @staticmethod + def readfile(str path): + cdef logmath_t *lmath = logmath_init(1.0001, 0, 0) + cdef ngram_model_t *lm = ngram_model_read(NULL, path.encode("utf-8"), + NGRAM_AUTO, lmath) + logmath_free(lmath) + if lm == NULL: + raise ValueError("Unable to read language model from %s" % path) + return NGramModel.create_from_ptr(lm) + + @staticmethod + cdef create_from_ptr(ngram_model_t *lm): + cdef NGramModel self = NGramModel.__new__(NGramModel) + self.lm = lm + return self + + def __dealloc__(self): + if self.lm != NULL: + ngram_model_free(self.lm) + + def write(self, str path, ngram_file_type_t ftype=NGRAM_AUTO): + cdef int rv = ngram_model_write(self.lm, path.encode(), ftype) + if rv < 0: + raise RuntimeError("Failed to write language model to %s" % path) + + @staticmethod + def str_to_type(str typestr): + return ngram_str_to_type(typestr.encode("utf-8")) + + @staticmethod + def type_to_str(ngram_file_type_t _type): + return ngram_type_to_str(_type).decode("utf-8") + + def casefold(self, ngram_case_t kase): + cdef int rv = ngram_model_casefold(self.lm, kase) + if rv < 0: + raise RuntimeError("Failed to case-fold language model") + + def size(self): + return ngram_model_get_size(self.lm) + + def add_word(self, word, float weight): + if not isinstance(word, bytes): + word = word.encode("utf-8") + return ngram_model_add_word(self.lm, word, weight) + + def prob(self, words): + cdef const char **cwords + cdef int prob + bwords = [w.encode("utf-8") for w in words] + cwords = malloc(len(bwords) * sizeof(char *)) + for i, w in enumerate(bwords): + cwords[i] = w + prob = ngram_prob(self.lm, cwords, len(words)) + free(cwords) + return prob + + +cdef class FsgModel: + """Finite-state recognition grammar. + """ + cdef fsg_model_t *fsg + + def __init__(self, name, LogMath logmath, float lw, int nstate): + if not isinstance(name, bytes): + name = name.encode("utf-8") + self.fsg = fsg_model_init(name, logmath.lmath, + lw, nstate) + if self.fsg == NULL: + raise ValueError("Failed to initialize FSG model") + + @staticmethod + def readfile(str filename, LogMath logmath, float lw): + cdef fsg_model_t *cfsg + cdef FsgModel fsg + cfsg = fsg_model_readfile(filename.encode(), logmath.lmath, lw) + return FsgModel.create_from_ptr(cfsg) + + @staticmethod + def jsgf_read_file(str filename, LogMath logmath, float lw): + cdef fsg_model_t *cfsg + cdef FsgModel fsg + cfsg = jsgf_read_file(filename.encode(), logmath.lmath, lw) + return FsgModel.create_from_ptr(cfsg) + + @staticmethod + cdef create_from_ptr(fsg_model_t *fsg): + cdef FsgModel self = FsgModel.__new__(FsgModel) + self.fsg = fsg + return self + + def __dealloc__(self): + fsg_model_free(self.fsg) + + def word_id(self, word): + if not isinstance(word, bytes): + word = word.encode("utf-8") + return fsg_model_word_id(self.fsg, word) + + def word_str(self, wid): + return fsg_model_word_str(self.fsg, wid).decode("utf-8") + + def accept(self, words): + return fsg_model_accept(self.fsg, words.encode("utf-8")) != 0 + + def word_add(self, word): + if not isinstance(word, bytes): + word = word.encode("utf-8") + return fsg_model_word_add(self.fsg, word) + + def set_start_state(self, state): + self.fsg.start_state = state + + def set_final_state(self, state): + self.fsg.final_state = state + + def trans_add(self, int src, int dst, int logp, int wid): + fsg_model_trans_add(self.fsg, src, dst, logp, wid) + + def null_trans_add(self, int src, int dst, int logp): + return fsg_model_null_trans_add(self.fsg, src, dst, logp) + + def tag_trans_add(self, int src, int dst, int logp, int wid): + return fsg_model_tag_trans_add(self.fsg, src, dst, logp, wid) + + def add_silence(self, silword, int state, float silprob): + if not isinstance(silword, bytes): + silword = silword.encode("utf-8") + return fsg_model_add_silence(self.fsg, silword, state, silprob) + + def add_alt(self, baseword, altword): + if not isinstance(baseword, bytes): + baseword = baseword.encode("utf-8") + if not isinstance(altword, bytes): + altword = altword.encode("utf-8") + return fsg_model_add_alt(self.fsg, baseword, altword) + + def writefile(self, str path): + cpath = path.encode() + fsg_model_writefile(self.fsg, cpath) + + def writefile_fsm(self, str path): + cpath = path.encode() + fsg_model_writefile_fsm(self.fsg, cpath) + + def writefile_symtab(self, str path): + cpath = path.encode() + fsg_model_writefile_symtab(self.fsg, cpath) + + +cdef class JsgfRule: + """JSGF Rule. + + Do not create this class directly.""" + cdef jsgf_rule_t *rule + + @staticmethod + cdef create_from_ptr(jsgf_rule_t *rule): + cdef JsgfRule self = JsgfRule.__new__(JsgfRule) + self.rule = rule + return self + + def get_name(self): + return jsgf_rule_name(self.rule).decode("utf-8") + + def is_public(self): + return jsgf_rule_public(self.rule) + + +cdef class Jsgf: + """JSGF parser. + """ + cdef jsgf_t *jsgf + + def __init__(self, str path, Jsgf parent=None): + cdef jsgf_t *cparent + cpath = path.encode() + if parent is not None: + cparent = parent.jsgf + else: + cparent = NULL + self.jsgf = jsgf_parse_file(cpath, cparent) + if self.jsgf == NULL: + raise ValueError("Failed to parse %s as JSGF" % path) + + def __dealloc__(self): + if self.jsgf != NULL: + jsgf_grammar_free(self.jsgf) + + def get_name(self): + return jsgf_grammar_name(self.jsgf).decode("utf-8") + + def get_rule(self, name): + cdef jsgf_rule_t *rule = jsgf_get_rule(self.jsgf, name.encode("utf-8")) + return JsgfRule.create_from_ptr(rule) + + def build_fsg(self, JsgfRule rule, LogMath logmath, float lw): + cdef fsg_model_t *fsg = jsgf_build_fsg(self.jsgf, rule.rule, logmath.lmath, lw) + return FsgModel.create_from_ptr(fsg) + + +cdef class Lattice: + """Word lattice.""" + cdef ps_lattice_t *dag + + @staticmethod + def readfile(str path): + cdef ps_lattice_t *dag = ps_lattice_read(NULL, path.encode("utf-8")) + if dag == NULL: + raise ValueError("Unable to read lattice from %s" % path) + return Lattice.create_from_ptr(dag) + + @staticmethod + cdef create_from_ptr(ps_lattice_t *dag): + cdef Lattice self = Lattice.__new__(Lattice) + self.dag = dag + return self + + def __dealloc__(self): + if self.dag != NULL: + ps_lattice_free(self.dag) + + def write(self, str path): + rv = ps_lattice_write(self.dag, path.encode("utf-8")) + if rv < 0: + raise RuntimeError("Failed to write lattice to %s" % path) + + def write_htk(self, str path): + rv = ps_lattice_write_htk(self.dag, path.encode("utf-8")) + if rv < 0: + raise RuntimeError("Failed to write lattice to %s" % path) + +cdef class Decoder: + """Main class for speech recognition and alignment in PocketSphinx. + + See :doc:`config_params` for a description of keyword arguments. + + Note that, as described in `Config`, `hmm`, `lm`, and `dict` are + set to the default ones (some kind of US English models of unknown + origin + CMUDict) if not defined. You can prevent this by passing + `None` for any of these parameters, e.g.:: + + ps = Decoder(lm=None) # Do not load a language model + + Decoder initialization **will fail** if more than one of `lm`, + `jsgf`, `fsg`, `keyphrase`, `kws`, `allphone`, or `lmctl` are set + in the configuration. To make life easier, and because there is + no possible case in which you would do this intentionally, if you + initialize a `Decoder` or `Config` with any of these (and not + `lm`), the default `lm` value will be removed. + + You can also pass a pre-defined `Config` object as the only + argument to the constructor, e.g.:: + + config = Config.parse_json(json) + ps = Decoder(config) + + Args: + config(Config): Optional configuration object. You can also + use keyword arguments, the most important of + which are noted below. See :doc:`config_params` + for more information. + hmm(str): Path to directory containing acoustic model files. + dict(str): Path to pronunciation dictionary. + lm(str): Path to N-Gram language model. + jsgf(str): Path to JSGF grammar file. + fsg(str): Path to FSG grammar file (only one of ``lm``, ``jsgf``, + or ``fsg`` should be specified). + toprule(str): Name of top-level rule in JSGF file to use as entry point. + samprate(int): Sampling rate for raw audio data. + loglevel(str): Logging level, one of "INFO", "ERROR", "FATAL". + logfn(str): File to write log messages to. + Raises: + ValueError: On invalid configuration or argument list. + RuntimeError: On invalid configuration or other failure to + reinitialize decoder. + """ + cdef ps_decoder_t *_ps + cdef Config _config + + def __init__(self, *args, **kwargs): + if len(args) == 1 and isinstance(args[0], Config): + self._config = args[0] + else: + self._config = Config(*args, **kwargs) + if self._config is None: + raise ValueError, "Failed to parse argument list" + self._ps = ps_init(self._config.config) + if self._ps == NULL: + raise RuntimeError, "Failed to initialize PocketSphinx" + + def __dealloc__(self): + ps_free(self._ps) + + def reinit(self, Config config=None): + """Reinitialize the decoder. + + Args: + config(Config): Optional new configuration to apply, otherwise + the existing configuration in the `config` + attribute will be reloaded. + Raises: + RuntimeError: On invalid configuration or other failure to + reinitialize decoder. + """ + cdef ps_config_t *cconfig + if config is None: + cconfig = NULL + else: + self._config = config + cconfig = config.config + if ps_reinit(self._ps, cconfig) != 0: + raise RuntimeError("Failed to reinitialize decoder configuration") + + def reinit_feat(self, Config config=None): + """Reinitialize only the feature extraction. + + Args: + config(Config): Optional new configuration to apply, otherwise + the existing configuration in the `config` + attribute will be reloaded. + Raises: + RuntimeError: On invalid configuration or other failure to + initialize feature extraction. + """ + cdef ps_config_t *cconfig + if config is None: + cconfig = NULL + else: + self._config = config + cconfig = config.config + if ps_reinit_feat(self._ps, cconfig) < 0: + raise RuntimeError("Failed to reinitialize feature extraction") + + def get_cmn(self, update=False): + """Get current cepstral mean. + + Args: + update(boolean): Update the mean based on current utterance. + Returns: + str: Cepstral mean as a comma-separated list of numbers. + """ + cdef const char *cmn = ps_get_cmn(self._ps, update) + return cmn.decode("utf-8") + + def set_cmn(self, cmn): + """Get current cepstral mean. + + Args: + cmn(str): Cepstral mean as a comma-separated list of numbers. + """ + cdef int rv = ps_set_cmn(self._ps, cmn.encode("utf-8")) + if rv != 0: + raise ValueError("Invalid CMN string") + + def start_stream(self): + """Reset noise statistics. + + This method can be called at the beginning of a new audio + stream (but this is not necessary).""" + cdef int rv = ps_start_stream(self._ps) + warnings.warn("start_stream() is deprecated and unnecessary", + DeprecationWarning) + if rv < 0: + raise RuntimeError("Failed to start audio stream") + + def start_utt(self): + """Start processing raw audio input. + + This method must be called at the beginning of each separate + "utterance" of raw audio input. + + Raises: + RuntimeError: If processing fails to start (usually if it + has already been started). + """ + if ps_start_utt(self._ps) < 0: + raise RuntimeError, "Failed to start utterance processing" + + def get_in_speech(self): + """Return speech status. + + This method is retained for compatibility, but it will always + return True as long as `ps_start_utt` has been previously + called. + """ + warnings.warn("get_in_speech() is deprecated and does nothing useful", + DeprecationWarning) + return ps_get_in_speech(self._ps) + + def process_raw(self, data, no_search=False, full_utt=False): + """Process a block of raw audio. + + Args: + data(bytes): Raw audio data, a block of 16-bit signed integer binary data. + no_search(bool): If `True`, do not do any decoding on this data. + full_utt(bool): If `True`, assume this is the entire utterance, for + purposes of acoustic normalization. + Raises: + RuntimeError: If processing fails. + """ + cdef const unsigned char[:] cdata = data + cdef Py_ssize_t n_samples = len(cdata) // 2 + if ps_process_raw(self._ps, &cdata[0], + n_samples, no_search, full_utt) < 0: + raise RuntimeError, "Failed to process %d samples of audio data" % len / 2 + + def process_cep(self, data, no_search=False, full_utt=False): + """Process a block of MFCC data. + + Args: + data(bytes): Raw MFCC data, a block of 32-bit floating point data. + no_search(bool): If `True`, do not do any decoding on this data. + full_utt(bool): If `True`, assume this is the entire utterance, for + purposes of acoustic normalization. + Raises: + RuntimeError: If processing fails. + """ + cdef const unsigned char[:] cdata = data + cdef int ncep = self._config["ceplen"] + cdef int nfr = len(cdata) // (ncep * sizeof(float)) + cdef float **feats = ckd_alloc_2d_ptr(nfr, ncep, &cdata[0], sizeof(float)) + rv = ps_process_cep(self._ps, feats, nfr, no_search, full_utt) + ckd_free(feats) + if rv < 0: + raise RuntimeError, "Failed to process %d frames of MFCC data" % nfr + + def end_utt(self): + """Finish processing raw audio input. + + This method must be called at the end of each separate + "utterance" of raw audio input. It takes care of flushing any + internal buffers and finalizing recognition results. + + """ + if ps_end_utt(self._ps) < 0: + raise RuntimeError, "Failed to stop utterance processing" + + def hyp(self): + """Get current recognition hypothesis. + + Returns: + Hypothesis: Current recognition output. + """ + cdef const char *hyp + cdef logmath_t *lmath + cdef int score + + hyp = ps_get_hyp(self._ps, &score) + if hyp == NULL: + return None + lmath = ps_get_logmath(self._ps) + prob = ps_get_prob(self._ps) + return Hypothesis(hyp.decode('utf-8'), + logmath_exp(lmath, score), + logmath_exp(lmath, prob)) + + def get_prob(self): + """Posterior probability of current recogntion hypothesis. + + Returns: + float: Posterior probability of current hypothesis. This + will be 1.0 unless the `bestpath` configuration option is + enabled. + + """ + cdef logmath_t *lmath + cdef const char *uttid + lmath = ps_get_logmath(self._ps) + return logmath_exp(lmath, ps_get_prob(self._ps)) + + def add_word(self, str word, str phones, update=True): + """Add a word to the pronunciation dictionary. + + Args: + word(str): Text of word to be added. + phones(str): Space-separated list of phones for this + word's pronunciation. This will depend on + the underlying acoustic model but is probably + in ARPABET. + update(bool): Update the recognizer immediately. You can + set this to `False` if you are adding a lot + of words, to speed things up. + Returns: + int: Word ID of added word. + Raises: + RuntimeError: If adding word failed for some reason. + """ + cdef rv = ps_add_word(self._ps, word.encode("utf-8"), + phones.encode("utf-8"), update) + if rv < 0: + raise RuntimeError("Failed to add word %s" % word) + + def lookup_word(self, str word): + """Look up a word in the dictionary and return phone transcription + for it. + + Args: + word(str): Text of word to search for. + Returns: + str: Space-separated list of phones, or None if not found. + """ + cdef const char *cphones + cphones = ps_lookup_word(self._ps, word.encode("utf-8")) + if cphones == NULL: + return None + else: + return cphones.decode("utf-8") + + def seg(self): + """Get current word segmentation. + + Returns: + Iterable[Segment]: Generator over word segmentations. + """ + cdef ps_seg_t *itor + cdef logmath_t *lmath + itor = ps_seg_iter(self._ps) + if itor == NULL: + return + lmath = ps_get_logmath(self._ps) + return SegmentList.create(itor, lmath) + + + def nbest(self): + """Get N-Best hypotheses. + + Returns: + Iterable[Hypothesis]: Generator over N-Best recognition results + """ + cdef ps_nbest_t *itor + cdef logmath_t *lmath + itor = ps_nbest(self._ps) + if itor == NULL: + return + lmath = ps_get_logmath(self._ps) + return NBestList.create(itor, lmath) + + + def read_fsg(self, filename): + """Read a grammar from an FSG file. + + Args: + filename(str): Path to FSG file. + + Returns: + FsgModel: Newly loaded finite-state grammar. + """ + cdef float lw + + lw = ps_config_float(self._config.config, "lw") + return FsgModel.readfile(filename, self.get_logmath(), lw) + + def read_jsgf(self, str filename): + """Read a grammar from a JSGF file. + + The top rule used is the one specified by the "toprule" + configuration parameter. + + Args: + filename(str): Path to JSGF file. + Returns: + FsgModel: Newly loaded finite-state grammar. + """ + cdef float lw + + lw = ps_config_float(self._config.config, "lw") + return FsgModel.jsgf_read_file(filename, self.get_logmath(), lw) + + def create_fsg(self, str name, int start_state, int final_state, transitions): + """Create a finite-state grammar. + + This method allows the creation of a grammar directly from a + list of transitions. States and words will be created + implicitly from the state numbers and word strings present in + this list. Make sure that the pronunciation dictionary + contains the words, or you will not be able to recognize. + Basic usage:: + + fsg = decoder.create_fsg("mygrammar", + start_state=0, final_state=3, + transitions=[(0, 1, 0.75, "hello"), + (0, 1, 0.25, "goodbye"), + (1, 2, 0.75, "beautiful"), + (1, 2, 0.25, "cruel"), + (2, 3, 1.0, "world")]) + + Args: + name(str): Name to give this FSG (not very important). + start_state(int): Index of starting state. + final_state(int): Index of end state. + transitions(list): List of transitions, each of which is a 3- + or 4-tuple of (from, to, probability[, word]). + If the word is not specified, this is an + epsilon (null) transition that will always be + followed. + Returns: + FsgModel: Newly created finite-state grammar. + Raises: + ValueError: On invalid input. + """ + cdef float lw + cdef int wid + + lw = ps_config_float(self._config.config, "lw") + lmath = self.get_logmath() + n_state = max(itertools.chain(*((t[0], t[1]) for t in transitions))) + 1 + fsg = FsgModel(name, lmath, lw, n_state) + fsg.set_start_state(start_state) + fsg.set_final_state(final_state) + for t in transitions: + source, dest, prob = t[0:3] + if len(t) > 3: + word = t[3] + wid = fsg.word_add(word) + if wid == -1: + raise ValueError("Failed to add word to FSG: %s" % word) + fsg.trans_add(source, dest, + lmath.log(prob), wid) + else: + fsg.null_trans_add(source, dest, + lmath.log(prob)) + return fsg + + def parse_jsgf(self, jsgf_string, toprule=None): + """Parse a JSGF grammar from bytes or string. + + Because PocketSphinx uses UTF-8 internally, it is more + efficient to parse from bytes, as a string will get encoded + and subsequently decoded. + + Args: + jsgf_string(bytes|str): JSGF grammar as string or UTF-8 + encoded bytes. + toprule(str): Name of starting rule in grammar (will + default to first public rule). + Returns: + FsgModel: Newly loaded finite-state grammar. + Raises: + ValueError: On failure to parse or find `toprule`. + RuntimeError: If JSGF has no public rules. + """ + cdef jsgf_t *jsgf + cdef jsgf_rule_t *rule + cdef logmath_t *lmath + cdef float lw + + if not isinstance(jsgf_string, bytes): + jsgf_string = jsgf_string.encode("utf-8") + jsgf = jsgf_parse_string(jsgf_string, NULL) + if jsgf == NULL: + raise ValueError("Failed to parse JSGF") + if toprule is not None: + rule = jsgf_get_rule(jsgf, toprule.encode('utf-8')) + if rule == NULL: + jsgf_grammar_free(jsgf) + raise ValueError("Failed to find top rule %s" % toprule) + else: + rule = jsgf_get_public_rule(jsgf) + if rule == NULL: + jsgf_grammar_free(jsgf) + raise RuntimeError("No public rules found in JSGF") + lw = ps_config_float(self._config.config, "lw") + lmath = ps_get_logmath(self._ps) + cdef fsg_model_t *cfsg = jsgf_build_fsg(jsgf, rule, lmath, lw) + jsgf_grammar_free(jsgf) + return FsgModel.create_from_ptr(cfsg) + + def get_fsg(self, str name = None): + """Get the currently active FsgModel or the model for a + specific search module. + + Args: + name(str): Name of search module for this FSG. If this is + None (the default), the currently active FSG will be + returned. + Returns: + FsgModel: FSG corresponding to `name`, or None if not found. + """ + cdef fsg_model_t *fsg + if name is None: + fsg = ps_get_fsg(self._ps, NULL) + else: + fsg = ps_get_fsg(self._ps, name.encode("utf-8")) + if fsg == NULL: + return None + else: + return FsgModel.create_from_ptr(fsg_model_retain(fsg)) + + def add_fsg(self, str name, FsgModel fsg): + """Create (but do not activate) a search module for a finite-state + grammar. + + Args: + name(str): Search module name to associate to this FSG. + fsg(FsgModel): Previously loaded or constructed grammar. + Raises: + RuntimeError: If adding FSG failed for some reason. + + """ + if ps_add_fsg(self._ps, name.encode("utf-8"), fsg.fsg) != 0: + raise RuntimeError("Failed to set FSG in decoder") + + def set_fsg(self, str name, FsgModel fsg): + warnings.warn("set_fsg() is deprecated, use add_fsg() instead", + DeprecationWarning) + self.add_fsg(name, fsg) + + def add_jsgf_file(self, name, filename): + """Create (but do not activate) a search module from a JSGF file. + + Args: + filename(str): Path to a JSGF file to load. + name(str): Search module name to associate to this grammar. + Raises: + RuntimeError: If adding grammar failed for some reason. + """ + if ps_add_jsgf_file(self._ps, name.encode("utf-8"), + filename.encode()) != 0: + raise RuntimeError("Failed to set JSGF from %s" % filename) + + def set_jsgf_file(self, name, filename): + warnings.warn("set_jsgf_file() is deprecated, use add_jsgf_file() instead", + DeprecationWarning) + self.add_jsgf_file(name, filename) + + def add_jsgf_string(self, name, jsgf_string): + """Create (but do not activate) a search module from JSGF + as bytes or string. + + Args: + jsgf_string(bytes|str): JSGF grammar as string or UTF-8 encoded + bytes. + name(str): Search module name to associate to this grammar. + Raises: + ValueError: If grammar failed to parse. + """ + if not isinstance(jsgf_string, bytes): + jsgf_string = jsgf_string.encode("utf-8") + if ps_add_jsgf_string(self._ps, name.encode("utf-8"), jsgf_string) != 0: + raise ValueError("Failed to parse JSGF in decoder") + + def set_jsgf_string(self, name, jsgf_string): + warnings.warn("set_jsgf_string() is deprecated, use add_jsgf_string() instead", + DeprecationWarning) + self.add_jsgf_string(name, jsgf_string) + + def get_kws(self, str name = None): + """Get keyphrases as text from current or specified search module. + + Args: + name(str): Search module name for keywords. If this is + None, the currently active keywords are returned if + keyword search is active. + Returns: + str: List of keywords as lines (i.e. separated by '\\\\n'), + or None if the specified search could not be found, or if + `name` is None and keyword search is not currently active. + """ + cdef const char *kws + if name is None: + kws = ps_get_kws(self._ps, NULL) + else: + kws = ps_get_kws(self._ps, name.encode("utf-8")) + if kws == NULL: + return None + else: + return kws.decode("utf-8") + + def add_kws(self, str name, str keyfile): + """Create (but do not activate) keyphrase recognition search module + from a file. + + Args: + name(str): Search module name to associate to these keyphrases. + keyfile(str): Path to file with list of keyphrases (one per line). + Raises: + RuntimeError: If adding keyphrases failed for some reason. + """ + cdef int rv = ps_add_kws(self._ps, name.encode("utf-8"), keyfile.encode()) + if rv < 0: + return RuntimeError("Failed to set keyword search %s from %s" + % (name, keyfile)) + + def set_kws(self, str name, str keyfile): + warnings.warn("set_kws() is deprecated, use add_kws() instead", + DeprecationWarning) + self.add_kws(name, keyfile) + + def add_keyphrase(self, str name, str keyphrase): + """Create (but do not activate) search module from a single keyphrase. + + Args: + name(str): Search module name to associate to this keyphrase. + keyphrase(str): Keyphrase to add. + Raises: + RuntimeError: If adding keyphrase failed for some reason. + """ + cdef int rv = ps_add_keyphrase(self._ps, name.encode("utf-8"), + keyphrase.encode("utf-8")) + if rv < 0: + return RuntimeError("Failed to set keyword search %s from phrase %s" + % (name, keyphrase)) + + def set_keyphrase(self, str name, str keyphrase): + warnings.warn("set_keyphrase() is deprecated, use add_keyphrase() instead", + DeprecationWarning) + self.add_keyphrase(name, keyphrase) + + def add_allphone_file(self, str name, str lmfile = None): + """Create (but do not activate) a phoneme recognition search module. + + Args: + name(str): Search module name to associate to allphone search. + lmfile(str): Path to phoneme N-Gram file, or None to use + uniform probability (default is None) + Raises: + RuntimeError: If allphone search init failed for some reason. + """ + cdef int rv + if lmfile is None: + rv = ps_add_allphone_file(self._ps, name.encode("utf-8"), NULL) + else: + rv = ps_add_allphone_file(self._ps, name.encode("utf-8"), lmfile.encode()) + if rv < 0: + return RuntimeError("Failed to set allphone search %s from %s" + % (name, lmfile)) + + def set_allphone_file(self, str name, str keyfile): + warnings.warn("set_allphone_file() is deprecated, use add_allphone_file() instead", + DeprecationWarning) + self.add_allphone_file(name, keyfile) + + def get_lattice(self): + """Get word lattice from current recognition result. + + Returns: + Lattice: Word lattice from current result. + """ + cdef ps_lattice_t *lattice = ps_get_lattice(self._ps) + if lattice == NULL: + return None + return Lattice.create_from_ptr(ps_lattice_retain(lattice)) + + @property + def config(self): + """Read-only property containing configuration object.""" + return self._config + + def get_config(self): + """Get current configuration. + + DEPRECATED: This does the same thing as simply accessing + `config` and is here for historical reasons. + + Returns: + Config: Current configuration. + + """ + return self._config + + # These two do not belong here but they're here for compatibility + @staticmethod + def default_config(): + """Get the default configuration. + + DEPRECATED: This does the same thing as simply creating a + `Config` and is here for historical reasons. + + Returns: + Config: Default configuration. + """ + warnings.warn("default_config() is deprecated, just call Config() constructor", + DeprecationWarning) + return Config() + + @staticmethod + def file_config(str path): + """Parse configuration from a file. + + DEPRECATED: This simply calls `Config.parse_file` and is here + for historical reasons. + + Args: + path(str): Path to arguments file. + Returns: + Config: Configuration parsed from `path`. + """ + warnings.warn("file_config() is deprecated, use JSON configuration please", + DeprecationWarning) + return Config.parse_file(path) + + def load_dict(self, str dict_path, str fdict_path = None, str _format = None): + """Load dictionary (and possibly noise dictionary) from a file. + + Note that the `format` argument does nothing, never has done + anything, and never will. It's only here for historical + reasons. + + Args: + dict_path(str): Path to pronunciation dictionary file. + fdict_path(str): Path to noise dictionary file, or None to keep + existing one (default is None) + _format(str): Useless argument that does nothing. + Raises: + RuntimeError: If dictionary loading failed for some reason. + """ + cdef int rv + # THIS IS VERY ANNOYING, CYTHON + cdef const char *cformat = NULL + cdef const char *cdict = NULL + cdef const char *cfdict = NULL + if _format is not None: + spam = _format.encode("utf-8") + cformat = spam + if dict_path is not None: + eggs = dict_path.encode() + cdict = eggs + if fdict_path is not None: + bacon = fdict_path.encode() + cfdict = bacon + rv = ps_load_dict(self._ps, cdict, cfdict, cformat) + if rv < 0: + raise RuntimeError("Failed to load dictionary from %s and %s" + % (dict_path, fdict_path)) + + def save_dict(self, str dict_path, str _format = None): + """Save dictionary to a file. + + Note that the `format` argument does nothing, never has done + anything, and never will. It's only here for historical + reasons. + + Args: + dict_path(str): Path to save pronunciation dictionary in. + _format(str): Useless argument that does nothing. + Raises: + RuntimeError: If dictionary saving failed for some reason. + """ + cdef int rv + cdef const char *cformat = NULL + cdef const char *cdict = NULL + if _format is not None: + spam = _format.encode("utf-8") + cformat = spam + if dict_path is not None: + eggs = dict_path.encode() + cdict = eggs + rv = ps_save_dict(self._ps, cdict, cformat) + if rv < 0: + raise RuntimeError("Failed to save dictionary to %s" % dict_path) + + def get_lm(self, str name = None): + """Get the current N-Gram language model or the one associated with a + search module. + + Args: + name(str): Name of search module for this language model. If this + is None (default) the current LM will be returned. + Returns: + NGramModel: Model corresponding to `name`, or None if not found. + + """ + cdef ngram_model_t *lm + if name is None: + lm = ps_get_lm(self._ps, NULL) + else: + lm = ps_get_lm(self._ps, name.encode("utf-8")) + if lm == NULL: + return None + return NGramModel.create_from_ptr(ngram_model_retain(lm)) + + def add_lm(self, str name, NGramModel lm): + """Create (but do not activate) a search module for an N-Gram language + model. + + Args: + name(str): Search module name to associate to this LM. + lm(NGramModel): Previously loaded language model. + Raises: + RuntimeError: If adding LM failed for some reason. + """ + cdef int rv = ps_add_lm(self._ps, name.encode("utf-8"), lm.lm) + if rv < 0: + raise RuntimeError("Failed to set language model %s" % name) + + def set_lm(self, str name, NGramModel lm): + warnings.warn("set_lm() is deprecated, use add_lm() instead", + DeprecationWarning) + self.add_lm(name, lm) + + def add_lm_file(self, str name, str path): + """Load (but do not activate a language model from a file into the + decoder. + + Args: + name(str): Search module name to associate to this LM. + path(str): Path to N-Gram language model file. + Raises: + RuntimeError: If adding LM failed for some reason. + """ + cdef int rv = ps_add_lm_file(self._ps, name.encode("utf-8"), path.encode()) + if rv < 0: + raise RuntimeError("Failed to set language model %s from %s" + % (name, path)) + + def set_lm_file(self, str name, str path): + warnings.warn("set_lm_file() is deprecated, use add_lm_file() instead", + DeprecationWarning) + self.add_lm_file(name, path) + + @property + def logmath(self): + """Read-only property containing LogMath object for this decoder.""" + return self.get_logmath() + + def get_logmath(self): + """Get the LogMath object for this decoder. + + DEPRECATED: This does the same thing as simply accessing + `logmath` and is here for historical reasons. + + Returns: + LogMath: Current log-math computation object. + """ + cdef logmath_t *lmath = ps_get_logmath(self._ps) + return LogMath.create_from_ptr(logmath_retain(lmath)) + + def activate_search(self, str search_name = None): + """Activate a search module + + This activates a "search module" that was created with the + methods `add_fsg`, `add_lm`, `add_lm_file`, + `add_allphone_file`, `add_keyphrase`, or `add_kws`. + + This API is still bad, but at least the method names make + sense now. + + Args: + search_name(str): Name of search module to activate. If + None (or not given), then the default search module, the + one created with the Decoder, for instance, will be + (re-)activated. + + Raises: + KeyError: If `search_name` doesn't actually exist. + + """ + cdef int rv + if search_name is None: + rv = ps_activate_search(self._ps, NULL) + else: + rv = ps_activate_search(self._ps, search_name.encode("utf-8")) + if rv < 0: + raise KeyError("Unable to set search %s" % search_name) + + def set_search(self, str search_name): + warnings.warn("set_search() is deprecated, use activate_search() instead", + DeprecationWarning) + self.activate_search(search_name) + + def remove_search(self, str search_name): + """Remove a search (LM, grammar, etc) freeing resources. + + Args: + search_name(str): Name of search module to remove. + Raises: + KeyError: If `search_name` doesn't actually exist. + """ + cdef int rv = ps_remove_search(self._ps, search_name.encode("utf-8")) + if rv < 0: + raise KeyError("Unable to unset search %s" % search_name) + + def unset_search(self, str search_name): + warnings.warn("unset_search() is deprecated, use remove_search() instead", + DeprecationWarning) + self.remove_search(search_name) + + def current_search(self): + """Get the name of the current search (LM, grammar, etc). + + Returns: + str: Name of currently active search module. + """ + return ps_current_search(self._ps).decode("utf-8") + + def get_search(self): + warnings.warn("get_search() is deprecated, use current_search() instead", + DeprecationWarning) + return self.current_search() + + def set_align_text(self, text): + """Set a word sequence for alignment *and* enable alignment mode. + + Unlike the `add_*` methods and the deprecated, badly-named + `set_*` methods, this really does immediately enable the + resulting search module. This is because alignment is + typically a one-shot deal, i.e. you are not likely to create a + list of different alignments and keep them around. If you + really want to do that, perhaps you should use FSG search + instead. Or let me know and perhaps I'll add an + `add_align_text` method. + + You must do any text normalization yourself. For word-level + alignment, once you call this, simply decode and get the + segmentation in the usual manner. For phone-level alignment, + see `set_alignment` and `get_alignment`. + + Args: + text(str): Sentence to align, as whitespace-separated + words. All words must be present in the + dictionary. + Raises: + RuntimeError: If text is invalid somehow. + """ + cdef int rv = ps_set_align_text(self._ps, text.encode("utf-8")) + if rv < 0: + raise RuntimeError("Failed to set up alignment of %s" % (text)) + + def set_alignment(self, Alignment alignment = None): + """Set up *and* activate sub-word alignment mode. + + For efficiency reasons, decoding and word-level alignment (as + done by `set_align_text`) do not track alignments at the + sub-word level. This is fine for a lot of use cases, but + obviously not all of them. If you want to obtain phone or + state level alignments, you must run a second pass of + alignment, which is what this function sets you up to do. The + sequence is something like this:: + + decoder.set_align_text("hello world") + decoder.start_utt() + decoder.process_raw(data, full_utt=True) + decoder.end_utt() + decoder.set_alignment() + decoder.start_utt() + decoder.process_raw(data, full_utt=True) + decoder.end_utt() + for word in decoder.get_alignment(): + for phone in word: + for state in phone: + print(word.name, phone.name, state.start) + + That's a lot of code, so it may get simplified, either here or + in a derived class, before release. + + Note that if you are using this with N-Gram or FSG decoding, + you can restore the default search module afterwards by + calling activate_search() with no argument. + + Args: + alignment(Alignment): Pre-constructed `Alignment` object. + Currently you can't actually do anything with this. + Raises: + RuntimeError: If current hypothesis cannot be aligned (such + as when using keyphrase or allphone search). + + """ + cdef int rv + if alignment is not None: + rv = ps_set_alignment(self._ps, alignment._al) + else: + rv = ps_set_alignment(self._ps, NULL) + if rv < 0: + raise RuntimeError("Failed to set up sub-word alignment") + + def get_alignment(self): + """Get the current sub-word alignment, if any. + + This will return something if `ps_set_alignment` has been + called, but it will not contain an actual *alignment* + (i.e. phone and state durations) unless a second pass of + decoding has been run. + + If the decoder is not in sub-word alignment mode then it will + return None. + + Returns: + Alignment - if an alignment exists. + """ + cdef ps_alignment_t *al = ps_get_alignment(self._ps) + if al == NULL: + return None + return Alignment.create_from_ptr(ps_alignment_retain(al)) + + def n_frames(self): + """Get the number of frames processed up to this point. + + Returns: + int: Like it says. + """ + return ps_get_n_frames(self._ps) + +cdef class Vad: + """Voice activity detection class. + + Args: + mode(int): Aggressiveness of voice activity detection (0-3) + sample_rate(int): Sampling rate of input, default is 16000. + Rates other than 8000, 16000, 32000, 48000 + are only approximately supported, see note + in `frame_length`. Outlandish sampling + rates like 3924 and 115200 will raise a + `ValueError`. + frame_length(float): Desired input frame length in seconds, + default is 0.03. The *actual* frame + length may be different if an + approximately supported sampling rate is + requested. You must *always* use the + `frame_bytes` and `frame_length` + attributes to determine the input size. + + Raises: + ValueError: Invalid input parameter (see above). + """ + cdef ps_vad_t *_vad + LOOSE = PS_VAD_LOOSE + MEDIUM_LOOSE = PS_VAD_MEDIUM_LOOSE + MEDIUM_STRICT = PS_VAD_MEDIUM_STRICT + STRICT = PS_VAD_STRICT + DEFAULT_SAMPLE_RATE = PS_VAD_DEFAULT_SAMPLE_RATE + DEFAULT_FRAME_LENGTH = PS_VAD_DEFAULT_FRAME_LENGTH + + def __init__(self, mode=PS_VAD_LOOSE, + sample_rate=PS_VAD_DEFAULT_SAMPLE_RATE, + frame_length=PS_VAD_DEFAULT_FRAME_LENGTH): + self._vad = ps_vad_init(mode, sample_rate, frame_length) + if self._vad == NULL: + raise ValueError("Invalid VAD parameters") + + def __dealloc__(self): + ps_vad_free(self._vad) + + @property + def frame_bytes(self): + """int: Number of bytes (not samples) required in an input frame. + + You *must* pass input of this size, as `bytes`, to the `Vad`. + """ + return ps_vad_frame_size(self._vad) * 2 + + @property + def frame_length(self): + """float: Length of a frame in seconds (*may be different from the one + requested in the constructor*!)""" + return ps_vad_frame_length(self._vad) + + @property + def sample_rate(self): + """int: Sampling rate of input data.""" + return ps_vad_sample_rate(self._vad) + + def is_speech(self, frame, sample_rate=None): + """Classify a frame as speech or not. + + Args: + frame(bytes): Buffer containing speech data (16-bit signed + integers). Must be of length `frame_bytes` + (in bytes). + Returns: + boolean: Classification as speech or not speech. + Raises: + IndexError: `buf` is of invalid size. + ValueError: Other internal VAD error. + """ + cdef const unsigned char[:] cframe = frame + cdef Py_ssize_t n_samples = len(cframe) // 2 + if len(cframe) != self.frame_bytes: + raise IndexError("Frame size must be %d bytes" % self.frame_bytes) + rv = ps_vad_classify(self._vad, &cframe[0]) + if rv < 0: + raise ValueError("VAD classification failed") + return rv == PS_VAD_SPEECH + +cdef class Endpointer: + """Simple endpointer using voice activity detection. + + Args: + window(float): Length in seconds of window for decision. + ratio(float): Fraction of window that must be speech or + non-speech to make a transition. + mode(int): Aggressiveness of voice activity detection (0-3) + sample_rate(int): Sampling rate of input, default is 16000. + Rates other than 8000, 16000, 32000, 48000 + are only approximately supported, see note + in `frame_length`. Outlandish sampling + rates like 3924 and 115200 will raise a + `ValueError`. + frame_length(float): Desired input frame length in seconds, + default is 0.03. The *actual* frame + length may be different if an + approximately supported sampling rate is + requested. You must *always* use the + `frame_bytes` and `frame_length` + attributes to determine the input size. + + Raises: + ValueError: Invalid input parameter. Also raised if the ratio + makes it impossible to do endpointing (i.e. it + is more than N-1 or less than 1 frame). + """ + cdef ps_endpointer_t *_ep + DEFAULT_WINDOW = PS_ENDPOINTER_DEFAULT_WINDOW + DEFAULT_RATIO = PS_ENDPOINTER_DEFAULT_RATIO + def __init__( + self, + window=0.3, + ratio=0.9, + vad_mode=Vad.LOOSE, + sample_rate=Vad.DEFAULT_SAMPLE_RATE, + frame_length=Vad.DEFAULT_FRAME_LENGTH, + ): + self._ep = ps_endpointer_init(window, ratio, + vad_mode, sample_rate, frame_length) + if (self._ep == NULL): + raise ValueError("Invalid endpointer or VAD parameters") + + @property + def frame_bytes(self): + """int: Number of bytes (not samples) required in an input frame. + + You *must* pass input of this size, as `bytes`, to the `Endpointer`. + """ + return ps_endpointer_frame_size(self._ep) * 2 + + @property + def frame_length(self): + """float: Length of a frame in secondsq (*may be different from the one + requested in the constructor*!)""" + return ps_endpointer_frame_length(self._ep) + + @property + def sample_rate(self): + """int: Sampling rate of input data.""" + return ps_endpointer_sample_rate(self._ep) + + @property + def in_speech(self): + """bool: Is the endpointer currently in a speech segment? + + To detect transitions from non-speech to speech, check this + before `process`. If it was `False` but `process` returns + data, then speech has started:: + + prev_in_speech = ep.in_speech + speech = ep.process(frame) + if speech is not None: + if prev_in_speech: + print("Speech started at", ep.speech_start) + + Likewise, to detect transitions from speech to non-speech, + call this *after* `process`. If `process` returned data but + this returns `False`, then speech has stopped:: + + speech = ep.process(frame) + if speech is not None: + if not ep.in_speech: + print("Speech ended at", ep.speech_end) + """ + return ps_endpointer_in_speech(self._ep) + + @property + def speech_start(self): + """float: Start time of current speech region.""" + return ps_endpointer_speech_start(self._ep) + + @property + def speech_end(self): + """float: End time of current speech region.""" + return ps_endpointer_speech_end(self._ep) + + def process(self, frame): + """Read a frame of data and return speech if detected. + + Args: + frame(bytes): Buffer containing speech data (16-bit signed + integers). Must be of length `frame_bytes` + (in bytes). + Returns: + bytes: Frame of speech data, or None if none detected. + Raises: + IndexError: `buf` is of invalid size. + ValueError: Other internal VAD error. + """ + cdef const unsigned char[:] cframe = frame + cdef Py_ssize_t n_samples = len(cframe) // 2 + cdef const short *outframe + if len(cframe) != self.frame_bytes: + raise IndexError("Frame size must be %d bytes" % self.frame_bytes) + outframe = ps_endpointer_process(self._ep, + &cframe[0]) + if outframe == NULL: + return None + return (&outframe[0])[:n_samples * 2] + + def end_stream(self, frame): + """Read a final frame of data and return speech if any. + + This function should only be called at the end of the input + stream (and then, only if you are currently in a speech + region). It will return any remaining speech data detected by + the endpointer. + + Args: + frame(bytes): Buffer containing speech data (16-bit signed + integers). Must be of length `frame_bytes` + (in bytes) *or less*. + Returns: + bytes: Remaining speech data (could be more than one frame), + or None if none detected. + Raises: + IndexError: `buf` is of invalid size. + ValueError: Other internal VAD error. + + """ + cdef const unsigned char[:] cframe = frame + cdef Py_ssize_t n_samples = len(cframe) // 2 + cdef const short *outbuf + cdef size_t out_n_samples + if len(cframe) > self.frame_bytes: + raise IndexError("Frame size must be %d bytes or less" % self.frame_bytes) + outbuf = ps_endpointer_end_stream(self._ep, + &cframe[0], + n_samples, + &out_n_samples) + if outbuf == NULL: + return None + return (&outbuf[0])[:out_n_samples * 2] + +cdef class AlignmentEntry: + """Entry (word, phone, state) in an alignment. + + Iterating over this will iterate over its children (i.e. the + phones in a word or the states in a phone) if any. For example:: + + for word in decoder.get_alignment(): + print("%s from %.2f to %.2f" % (word.name, word.start, + word.start + word.duration)) + for phone in word: + print("%s at %.2f duration %.2f" % + (phone.name, phone.start, phone.duration)) + + Attributes: + name(str): Name of segment (word, phone name, state id) + start(int): Index of start frame. + duration(int): Duration in frames. + score(float): Acoustic score (density). + """ + cdef public int start + cdef public int duration + cdef public int score + cdef public str name + # DANGER! Not retained! + cdef ps_alignment_iter_t *itor + @staticmethod + cdef create_from_iter(ps_alignment_iter_t *itor): + cdef AlignmentEntry self + self = AlignmentEntry.__new__(AlignmentEntry) + self.score = ps_alignment_iter_seg(itor, &self.start, &self.duration) + self.name = ps_alignment_iter_name(itor).decode('utf-8') + self.itor = itor # DANGER! DANGER! + return self + + def __iter__(self): + cdef ps_alignment_iter_t *itor = ps_alignment_iter_children(self.itor) + while itor != NULL: + c = AlignmentEntry.create_from_iter(itor) + yield c + itor = ps_alignment_iter_next(itor) + # FIXME: will leak memory if iteration stopped short! + +cdef class Alignment: + """Sub-word alignment as returned by `get_alignment`. + + For the moment this is read-only. You are able to iterate over + the words, phones, or states in it, as well as sub-iterating over + each of their children, as described in `AlignmentEntry`. + """ + cdef ps_alignment_t *_al + + @staticmethod + cdef create_from_ptr(ps_alignment_t *al): + cdef Alignment self = Alignment.__new__(Alignment) + self._al = al + return self + + def __dealloc__(self): + if self._al != NULL: + ps_alignment_free(self._al) + + def __iter__(self): + return self.words() + + def words(self): + """Iterate over words in the alignment.""" + cdef ps_alignment_iter_t *itor = ps_alignment_words(self._al) + while itor != NULL: + w = AlignmentEntry.create_from_iter(itor) + yield w + itor = ps_alignment_iter_next(itor) + # FIXME: will leak memory if iteration stopped short! + + def phones(self): + """Iterate over phones in the alignment.""" + cdef ps_alignment_iter_t *itor = ps_alignment_phones(self._al) + while itor != NULL: + p = AlignmentEntry.create_from_iter(itor) + yield p + itor = ps_alignment_iter_next(itor) + + def states(self): + """Iterate over states in the alignment.""" + cdef ps_alignment_iter_t *itor = ps_alignment_states(self._al) + while itor != NULL: + s = AlignmentEntry.create_from_iter(itor) + yield s + itor = ps_alignment_iter_next(itor) + +def set_loglevel(level): + """Set internal log level of PocketSphinx. + + Args: + level(str): one of "DEBUG", "INFO", "ERROR", "FATAL". + Raises: + ValueError: Invalid log level string. + """ + cdef const char *prev_level + prev_level = err_set_loglevel_str(level.encode('utf-8')) + if prev_level == NULL: + raise ValueError("Invalid log level %s" % level) + +def _ps_default_modeldir(): + """Get the system default model path from the PocketSphinx library. + + Do not use this function directly, use + pocketsphinx.get_model_path() instead. + + Returns: + str: System default model path from PocketSphinx library. + """ + dirbytes = ps_default_modeldir() + if dirbytes == NULL: + return None + else: + return dirbytes.decode() diff --git a/cython/pocketsphinx/__init__.py b/cython/pocketsphinx/__init__.py new file mode 100644 index 0000000..28dd97a --- /dev/null +++ b/cython/pocketsphinx/__init__.py @@ -0,0 +1,289 @@ +"""Main module for the PocketSphinx speech recognizer. +""" + +# Copyright (c) 1999-2016 Carnegie Mellon University. All rights +# reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# This work was supported in part by funding from the Defense Advanced +# Research Projects Agency and the National Science Foundation of the +# United States of America, and the CMU Sphinx Speech Consortium. +# +# THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND +# ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY +# NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import collections +import importlib.util +import os +import signal +from contextlib import contextmanager + +from . import _pocketsphinx as pocketsphinx # noqa: F401 +from ._pocketsphinx import LogMath # noqa: F401 +from ._pocketsphinx import Config # noqa: F401 +from ._pocketsphinx import Decoder # noqa: F401 +from ._pocketsphinx import Jsgf # noqa: F401 +from ._pocketsphinx import JsgfRule # noqa: F401 +from ._pocketsphinx import NGramModel # noqa: F401 +from ._pocketsphinx import FsgModel # noqa: F401 +from ._pocketsphinx import Segment # noqa: F401 +from ._pocketsphinx import Hypothesis # noqa: F401 +from ._pocketsphinx import Lattice # noqa: F401 +from ._pocketsphinx import Vad # noqa: F401 +from ._pocketsphinx import Endpointer # noqa: F401 +from ._pocketsphinx import Alignment # noqa: F401 +from ._pocketsphinx import AlignmentEntry # noqa: F401 +from ._pocketsphinx import set_loglevel # noqa: F401 +from .segmenter import Segmenter # noqa: F401 + +Arg = collections.namedtuple("Arg", ["name", "default", "doc", "type", "required"]) +Arg.__doc__ = "Description of a configuration parameter." +Arg.name.__doc__ = "Parameter name (without leading dash)." +Arg.default.__doc__ = "Default value of parameter." +Arg.doc.__doc__ = "Description of parameter." +Arg.type.__doc__ = "Type (as a Python type object) of parameter value." +Arg.required.__doc__ = "Is this parameter required?" + + +def get_model_path(subpath=None): + """Return path to the model directory, or optionally, a specific file + or directory within it. + + If the POCKETSPHINX_PATH environment variable is set, it will be + returned here, otherwise the default is determined by your + PocketSphinx installation, and may or may not be writable by you. + + Args: + subpath: An optional path to add to the model directory. + + Returns: + The requested path within the model directory. + + """ + model_path = pocketsphinx._ps_default_modeldir() + if model_path is None: + # Use importlib to find things (so editable installs work) + model_path = importlib.util.find_spec( + "pocketsphinx.model" + ).submodule_search_locations[0] + if subpath is not None: + return os.path.join(model_path, subpath) + else: + return model_path + + +class Pocketsphinx(Decoder): + """Compatibility wrapper class. + + This class is deprecated, as most of its functionality is now + available in the main `Decoder` class, but it is here in case you + had code that used the old external pocketsphinx-python module. + """ + + def __init__(self, **kwargs): + if kwargs.get("dic") is not None and kwargs.get("dict") is None: + kwargs["dict"] = kwargs.pop("dic") + if kwargs.pop("verbose", False) is True: + kwargs["loglevel"] = "INFO" + self.start_frame = 0 + super(Pocketsphinx, self).__init__(**kwargs) + + def __str__(self): + return self.hypothesis() + + @contextmanager + def start_utterance(self): + self.start_utt() + yield + self.end_utt() + + @contextmanager + def end_utterance(self): + self.end_utt() + yield + self.start_utt() + + def decode(self, audio_file, buffer_size=2048, no_search=False, full_utt=False): + buf = bytearray(buffer_size) + + with open(audio_file, "rb") as f: + with self.start_utterance(): + while f.readinto(buf): + self.process_raw(buf, no_search, full_utt) + return self + + def segments(self, detailed=False): + if detailed: + lmath = self.get_logmath() + return [ + ( + s.word, + lmath.log(s.prob), + self.start_frame + s.start_frame, + self.start_frame + s.end_frame, + ) + for s in self.seg() + ] + else: + return [s.word for s in self.seg()] + + def hypothesis(self): + hyp = self.hyp() + if hyp: + return hyp.hypstr + else: + return "" + + def probability(self): + hyp = self.hyp() + if hyp: + return self.get_logmath().log(hyp.prob) + + def score(self): + hyp = self.hyp() + if hyp: + return self.get_logmath().log(hyp.best_score) + + def best(self, count=10): + lmath = self.get_logmath() + return [ + (h.hypstr, lmath.log(h.score)) for h, i in zip(self.nbest(), range(count)) + ] + + def confidence(self): + hyp = self.hyp() + if hyp: + return hyp.prob + + +class AudioFile(Pocketsphinx): + """Simple audio file segmentation and speech recognition. + + It is recommended to use the `Segmenter` and `Decoder` classes + directly, but this is here in case you had code that used the old + external pocketsphinx-python module, or need something very + simple. + + """ + + def __init__(self, audio_file=None, **kwargs): + signal.signal(signal.SIGINT, self.stop) + + self.audio_file = audio_file + self.segmenter = Segmenter() + + # You would never actually set these! + kwargs.pop("no_search", False) + kwargs.pop("full_utt", False) + kwargs.pop("buffer_size", False) + self.keyphrase = kwargs.get("keyphrase") + + super(AudioFile, self).__init__(**kwargs) + self.f = open(self.audio_file, "rb") + + def __iter__(self): + with self.f: + for speech in self.segmenter.segment(self.f): + self.start_frame = int(speech.start_time * self.config["frate"] + 0.5) + self.start_utt() + self.process_raw(speech.pcm, full_utt=True) + if self.keyphrase and self.hyp(): + self.end_utt() + yield self + else: + self.end_utt() + yield self + + def stop(self, *args, **kwargs): + raise StopIteration + + +class LiveSpeech(Pocketsphinx): + """Simple endpointing and live speech recognition. + + This class is not very useful for an actual application. It is + recommended to use the `Endpointer` and `Decoder` classes + directly, but it is here in case you had code that used the old + external pocketsphinx-python module, or need something incredibly + simple. + + """ + + def __init__(self, **kwargs): + self.audio_device = kwargs.pop("audio_device", None) + self.sampling_rate = kwargs.pop("sampling_rate", 16000) + self.ep = Endpointer(sample_rate=self.sampling_rate) + self.buffer_size = self.ep.frame_bytes + + # Setting these will not do anything good! + kwargs.pop("no_search", False) + kwargs.pop("full_utt", False) + kwargs.pop("buffer_size", False) + + self.keyphrase = kwargs.get("keyphrase") + + try: + import sounddevice + + assert sounddevice + except Exception as e: + # In case PortAudio is not present, for instance + raise RuntimeError("LiveSpeech not supported: %s" % e) + self.ad = sounddevice.RawInputStream( + samplerate=self.sampling_rate, + # WE DO NOT CARE ABOUT LATENCY! + blocksize=self.buffer_size // 2, + dtype="int16", + channels=1, + device=self.audio_device, + ) + super(LiveSpeech, self).__init__(**kwargs) + + def __iter__(self): + with self.ad: + not_done = True + while not_done: + try: + self.buf, _ = self.ad.read(self.buffer_size // 2) + if len(self.buf) == self.buffer_size: + speech = self.ep.process(self.buf) + else: + speech = self.ep.end_stream(self.buf) + not_done = False + if speech is not None: + if not self.in_speech: + self.start_utt() + self.process_raw(speech) + if self.keyphrase and self.hyp(): + with self.end_utterance(): + yield self + elif not self.ep.in_speech: + self.end_utt() + if self.hyp(): + yield self + except KeyboardInterrupt: + break + + @property + def in_speech(self): + return self.get_in_speech() diff --git a/cython/pocketsphinx/lm.py b/cython/pocketsphinx/lm.py new file mode 100644 index 0000000..f871e43 --- /dev/null +++ b/cython/pocketsphinx/lm.py @@ -0,0 +1,383 @@ +#!/usr/bin/env python + +import argparse +import re +import sys +import unicodedata as ud +from collections import defaultdict +from datetime import date +from io import StringIO +from math import log +from typing import Any, Dict, Optional, TextIO + +# Author: Kevin Lenzo +# Based on a Perl script by Alex Rudnicky + + +class ArpaBoLM: + """ + A simple ARPA model builder + """ + + log10 = log(10.0) + norm_exclude_categories = set(["P", "S", "C", "M", "Z"]) + + def __init__( + self, + sentfile: Optional[TextIO] = None, + text: Optional[str] = None, + add_start: bool = False, + word_file: Optional[str] = None, + word_file_count: int = 1, + discount_mass: float = 0.5, + case: Optional[str] = None, # lower, upper + norm: bool = False, + verbose: bool = False, + ): + self.add_start = add_start + self.word_file = word_file + self.word_file_count = word_file_count + self.discount_mass = discount_mass + self.case = case + self.norm = norm + self.verbose = verbose + + self.logfile = sys.stdout + + if self.verbose: + print("Started", date.today(), file=self.logfile) + + if discount_mass is None: # TODO: add other smoothing methods + self.discount_mass = 0.5 + elif not 0.0 < discount_mass < 1.0: + raise AttributeError( + f"Discount value ({discount_mass}) out of range [0.0, 1.0]" + ) + + self.deflator: float = 1.0 - self.discount_mass + + self.sent_count = 0 + + self.grams_1: Any = defaultdict(int) + self.grams_2: Any = defaultdict(lambda: defaultdict(int)) + self.grams_3: Any = defaultdict(lambda: defaultdict(lambda: defaultdict(int))) + + self.sum_1: int = 0 + self.count_1: int = 0 + self.count_2: int = 0 + self.count_3: int = 0 + + self.prob_1: Dict[str, float] = {} + self.alpha_1: Dict[str, float] = {} + self.prob_2: Any = defaultdict(lambda: defaultdict(float)) + self.alpha_2: Any = defaultdict(lambda: defaultdict(float)) + + if sentfile is not None: + self.read_corpus(sentfile) + if text is not None: + self.read_corpus(StringIO(text)) + + if self.word_file is not None: + self.read_word_file(self.word_file) + + def read_word_file(self, path: str, count: Optional[int] = None) -> bool: + """ + Read in a file of words to add to the model, + if not present, with the given count (default 1) + """ + if self.verbose: + print("Reading word file:", path, file=self.logfile) + + if count is None: + count = self.word_file_count + + new_word_count = token_count = 0 + with open(path) as words_file: + for token in words_file: + token = token.strip() + if not token: + continue + if self.case == "lower": + token = token.lower() + elif self.case == "upper": + token = token.upper() + if self.norm: + token = self.norm_token(token) + token_count += 1 + # Here, we could just add one, bumping all the word counts; + # or just add N for the missing ones. We do the latter. + if token not in self.grams_1: + self.grams_1[token] = count + new_word_count += 1 + + if self.verbose: + print( + f"{new_word_count} new unique words", + f"from {token_count} tokens,", + f"each with count {count}", + file=self.logfile, + ) + return True + + def norm_token(self, token: str) -> str: + """ + Remove excluded leading and trailing character categories from a token + """ + while ( + len(token) and ud.category(token[0])[0] in ArpaBoLM.norm_exclude_categories + ): + token = token[1:] + while ( + len(token) and ud.category(token[-1])[0] in ArpaBoLM.norm_exclude_categories + ): + token = token[:-1] + return token + + def read_corpus(self, infile): + """ + Read in a text training corpus from a file handle + """ + if self.verbose: + print("Reading corpus file, breaking per newline.", file=self.logfile) + + sent_count = 0 + for line in infile: + if self.case == "lower": + line = line.lower() + elif self.case == "upper": + line = line.upper() + line = line.strip() + line = re.sub( + r"(.+)\(.+\)$", r"\1", line + ) # trailing file name in transcripts + + words = line.split() + if self.add_start: + words = [""] + words + [""] + if self.norm: + words = [self.norm_token(w) for w in words] + words = [w for w in words if len(w)] + if not words: + continue + sent_count += 1 + wc = len(words) + for j in range(wc): + w1 = words[j] + self.grams_1[w1] += 1 + if j + 1 < wc: + w2 = words[j + 1] + self.grams_2[w1][w2] += 1 + if j + 2 < wc: + w3 = words[j + 2] + self.grams_3[w1][w2][w3] += 1 + + if self.verbose: + print(f"{sent_count} sentences", file=self.logfile) + + def compute(self) -> bool: + """ + Compute all the things (derived values). + + If an n-gram is not present, the back-off is + + P( word_N | word_{N-1}, word_{N-2}, ...., word_1 ) = + P( word_N | word_{N-1}, word_{N-2}, ...., word_2 ) + * backoff-weight( word_{N-1} | word_{N-2}, ...., word_1 ) + + If the sequence + + ( word_{N-1}, word_{N-2}, ...., word_1 ) + + is also not listed, then the term + + backoff-weight( word_{N-1} | word_{N-2}, ...., word_1 ) + + gets replaced with 1.0 and the recursion continues. + + """ + if not self.grams_1: + sys.exit("No input?") + return False + + # token counts + self.sum_1 = sum(self.grams_1.values()) + + # type counts + self.count_1 = len(self.grams_1) + for w1, gram2 in self.grams_2.items(): + self.count_2 += len(gram2) + for w2 in gram2: + self.count_3 += len(self.grams_3[w1][w2]) + + # unigram probabilities + for gram1, count in self.grams_1.items(): + self.prob_1[gram1] = count * self.deflator / self.sum_1 + + # unigram alphas + for w1 in self.grams_1: + sum_denom = 0.0 + for w2, count in self.grams_2[w1].items(): + sum_denom += self.prob_1[w2] + self.alpha_1[w1] = self.discount_mass / (1.0 - sum_denom) + + # bigram probabilities + for w1, grams2 in self.grams_2.items(): + for w2, count in grams2.items(): + self.prob_2[w1][w2] = count * self.deflator / self.grams_1[w1] + + # bigram alphas + for w1, grams2 in self.grams_2.items(): + for w2, count in grams2.items(): + sum_denom = 0.0 + for w3 in self.grams_3[w1][w2]: + sum_denom += self.prob_2[w2][w3] + self.alpha_2[w1][w2] = self.discount_mass / (1.0 - sum_denom) + return True + + def write_file(self, out_path: str) -> bool: + """ + Write out the ARPAbo model to a file path + """ + try: + with open(out_path, "w") as outfile: + self.write(outfile) + except Exception: + return False + return True + + def write(self, outfile: TextIO) -> bool: + """ + Write the ARPAbo model to a file handle + """ + if self.verbose: + print("Writing output file", file=self.logfile) + + print( + "Corpus:", + f"{self.sent_count} sentences;", + f"{self.sum_1} words,", + f"{self.count_1} 1-grams,", + f"{self.count_2} 2-grams,", + f"{self.count_3} 3-grams,", + f"with fixed discount mass {self.discount_mass}", + "with simple normalization" if self.norm else "", + file=outfile, + ) + + print(file=outfile) + print("\\data\\", file=outfile) + + print(f"ngram 1={self.count_1}", file=outfile) + if self.count_2: + print(f"ngram 2={self.count_2}", file=outfile) + if self.count_3: + print(f"ngram 3={self.count_3}", file=outfile) + print(file=outfile) + + print("\\1-grams:", file=outfile) + for w1, prob in sorted(self.prob_1.items()): + log_prob = log(prob) / ArpaBoLM.log10 + log_alpha = log(self.alpha_1[w1]) / ArpaBoLM.log10 + print(f"{log_prob:6.4f} {w1} {log_alpha:6.4f}", file=outfile) + + if self.count_2: + print(file=outfile) + print("\\2-grams:", file=outfile) + for w1, grams2 in sorted(self.prob_2.items()): + for w2, prob in sorted(grams2.items()): + log_prob = log(prob) / ArpaBoLM.log10 + log_alpha = log(self.alpha_2[w1][w2]) / ArpaBoLM.log10 + print(f"{log_prob:6.4f} {w1} {w2} {log_alpha:6.4f}", file=outfile) + if self.count_3: + print(file=outfile) + print("\\3-grams:", file=outfile) + for w1, grams2 in sorted(self.grams_3.items()): + for w2, grams3 in sorted(grams2.items()): + for w3, count in sorted(grams3.items()): # type: ignore + prob = count * self.deflator / self.grams_2[w1][w2] + log_prob = log(prob) / ArpaBoLM.log10 + print(f"{log_prob:6.4f} {w1} {w2} {w3}", file=outfile) + + print(file=outfile) + print("\\end\\", file=outfile) + if self.verbose: + print("Finished", date.today(), file=self.logfile) + + return True + + +def main() -> None: + parser = argparse.ArgumentParser(description="Create a fixed-backoff ARPA LM") + parser.add_argument( + "-s", + "--sentfile", + type=argparse.FileType("rt"), + help="sentence transcripts in sphintrain style or one-per-line texts", + ) + parser.add_argument("-t", "--text", type=str) + parser.add_argument( + "-w", "--word-file", type=str, help="add words from this file with count -C" + ) + parser.add_argument( + "-C", + "--word-file-count", + type=int, + default=1, + help="word count set for each word in --word-file (default 1)", + ) + parser.add_argument( + "-d", "--discount-mass", type=float, help="fixed discount mass [0.0, 1.0]" + ) + parser.add_argument( + "-c", "--case", type=str, help="fold case (values: lower, upper)" + ) + parser.add_argument( + "-a", + "--add-start", + action="store_true", + help="add at start, and at end of lines for -s or -t", + ) + parser.add_argument( + "-n", + "--norm", + action="store_true", + help="do rudimentary token normalization / remove punctuation", + ) + parser.add_argument( + "-o", "--output", type=str, help="output to this file (default stdout)" + ) + parser.add_argument( + "-v", "--verbose", action="store_true", help="extra log info (to stderr)" + ) + + args = parser.parse_args() + + if args.case and args.case not in ["lower", "upper"]: + parser.error("--case must be lower or upper (if given)") + + if args.sentfile is None and args.text is None: + parser.error("Input must be specified with --sentfile and/or --text") + + lm = ArpaBoLM( + sentfile=args.sentfile, + text=args.text, + word_file=args.word_file, + word_file_count=args.word_file_count, + discount_mass=args.discount_mass, + case=args.case, + add_start=args.add_start, + norm=args.norm, + verbose=args.verbose, + ) + lm.compute() + + if args.output: + outfile: TextIO = open(args.output, "w") + else: + outfile = sys.stdout + + lm.write(outfile) + + +if __name__ == "__main__": + main() diff --git a/cython/pocketsphinx/segmenter.py b/cython/pocketsphinx/segmenter.py new file mode 100644 index 0000000..d1e082b --- /dev/null +++ b/cython/pocketsphinx/segmenter.py @@ -0,0 +1,88 @@ +"""VAD-based segmentation. +""" + +from ._pocketsphinx import Endpointer +from collections import namedtuple + +SpeechSegment = namedtuple("SpeechSegment", ["start_time", "end_time", "pcm"]) + + +class Segmenter(Endpointer): + """VAD-based speech segmentation. + + This is a simple class that segments audio from an input stream, + which is assumed to produce binary data as 16-bit signed integers + when `read` is called on it. It takes the same arguments as its + parent `Endpointer` class. + + You could obviously use this on a raw audio file, but also on a + `sounddevice.RawInputStream` or the output of `sox`. You can even + use it with the built-in `wave` module, for example:: + + with wave.open("foo.wav", "r") as w: + segmenter = Segmenter(sample_rate=w.getframerate()) + for seg in segmenter.segment(w.getfp()): + with wave.open("%.2f-%.2f.wav" + % (seg.start_time, seg.end_time), "w") as wo: + wo.setframerate(w.getframerate()) + wo.writeframesraw(seg.pcm) + + Args: + window(float): Length in seconds of window for decision. + ratio(float): Fraction of window that must be speech or + non-speech to make a transition. + mode(int): Aggressiveness of voice activity detection (0-3) + sample_rate(int): Sampling rate of input, default is 16000. + Rates other than 8000, 16000, 32000, 48000 + are only approximately supported, see note + in `frame_length`. Outlandish sampling + rates like 3924 and 115200 will raise a + `ValueError`. + frame_length(float): Desired input frame length in seconds, + default is 0.03. The *actual* frame + length may be different if an + approximately supported sampling rate is + requested. You must *always* use the + `frame_bytes` and `frame_length` + attributes to determine the input size. + + Raises: + ValueError: Invalid input parameter. Also raised if the ratio + makes it impossible to do endpointing (i.e. it + is more than N-1 or less than 1 frame). + """ + def __init__(self, *args, **kwargs): + super(Segmenter, self).__init__(*args, **kwargs) + self.speech_frames = [] + + def segment(self, stream): + """Split a stream of data into speech segments. + + Args: + stream: File-like object returning binary data (assumed to + be single-channel, 16-bit integer PCM) + + Returns: + Iterable[SpeechSegment]: Generator over `SpeechSegment` for + each speech region detected by the `Endpointer`. + + """ + idx = 0 + while True: + frame = stream.read(self.frame_bytes) + if len(frame) == 0: + break + elif len(frame) < self.frame_bytes: + speech = self.end_stream(frame) + else: + speech = self.process(frame) + if speech is not None: + self.speech_frames.append(speech) + if not self.in_speech: + yield SpeechSegment( + start_time=self.speech_start, + end_time=self.speech_end, + pcm=b"".join(self.speech_frames), + ) + del self.speech_frames[:] + idx += 1 diff --git a/cython/pypocketsphinx-examples.py b/cython/pypocketsphinx-examples.py new file mode 100644 index 0000000..cdc0848 --- /dev/null +++ b/cython/pypocketsphinx-examples.py @@ -0,0 +1,177 @@ +from pocketsphinx import LiveSpeech +for phrase in LiveSpeech(): print(phrase) +from pocketsphinx import LiveSpeech + +speech = LiveSpeech(lm=False, keyphrase='forward', kws_threshold=1e-20) +for phrase in speech: + print(phrase.segments(detailed=True)) + +import os +from pocketsphinx import LiveSpeech, get_model_path + +model_path = get_model_path() + +speech = LiveSpeech( + verbose=False, + sampling_rate=16000, + buffer_size=2048, + no_search=False, + full_utt=False, + hmm=os.path.join(model_path, 'en-us'), + lm=os.path.join(model_path, 'en-us.lm.bin'), + dic=os.path.join(model_path, 'cmudict-en-us.dict') +) + +for phrase in speech: + print(phrase) + +from pocketsphinx import AudioFile +for phrase in AudioFile(): print(phrase) # => "go forward ten meters" + +from pocketsphinx import AudioFile + +audio = AudioFile(lm=False, keyphrase='forward', kws_threshold=1e-20) +for phrase in audio: + print(phrase.segments(detailed=True)) # => "[('forward', -617, 63, 121)]" + +import os +from pocketsphinx import AudioFile, get_model_path, get_data_path + +model_path = get_model_path() +data_path = get_data_path() + +config = { + 'verbose': False, + 'audio_file': os.path.join(data_path, 'goforward.raw'), + 'buffer_size': 2048, + 'no_search': False, + 'full_utt': False, + 'hmm': os.path.join(model_path, 'en-us'), + 'lm': os.path.join(model_path, 'en-us.lm.bin'), + 'dict': os.path.join(model_path, 'cmudict-en-us.dict') +} + +audio = AudioFile(**config) +for phrase in audio: + print(phrase) + + +from pocketsphinx import AudioFile + +# Frames per Second +fps = 100 + +for phrase in AudioFile(frate=fps): # frate (default=100) + print('-' * 28) + print('| %5s | %3s | %4s |' % ('start', 'end', 'word')) + print('-' * 28) + for s in phrase.seg(): + print('| %4ss | %4ss | %8s |' % (s.start_frame / fps, s.end_frame / fps, s.word)) + print('-' * 28) + +# ---------------------------- +# | start | end | word | +# ---------------------------- +# | 0.0s | 0.24s | | +# | 0.25s | 0.45s | | +# | 0.46s | 0.63s | go | +# | 0.64s | 1.16s | forward | +# | 1.17s | 1.52s | ten | +# | 1.53s | 2.11s | meters | +# | 2.12s | 2.6s | | +# ---------------------------- + + +from pocketsphinx import Pocketsphinx +print(Pocketsphinx().decode()) # => "go forward ten meters" + + + +from __future__ import print_function +import os +from pocketsphinx import Pocketsphinx, get_model_path, get_data_path + +model_path = get_model_path() +data_path = get_data_path() + +config = { + 'hmm': os.path.join(model_path, 'en-us'), + 'lm': os.path.join(model_path, 'en-us.lm.bin'), + 'dict': os.path.join(model_path, 'cmudict-en-us.dict') +} + +ps = Pocketsphinx(**config) +ps.decode( + audio_file=os.path.join(data_path, 'goforward.raw'), + buffer_size=2048, + no_search=False, + full_utt=False +) + +print(ps.segments()) # => ['', '', 'go', 'forward', 'ten', 'meters', ''] +print('Detailed segments:', *ps.segments(detailed=True), sep='\n') # => [ +# word, prob, start_frame, end_frame +# ('', 0, 0, 24) +# ('', -3778, 25, 45) +# ('go', -27, 46, 63) +# ('forward', -38, 64, 116) +# ('ten', -14105, 117, 152) +# ('meters', -2152, 153, 211) +# ('', 0, 212, 260) +# ] + +print(ps.hypothesis()) # => go forward ten meters +print(ps.probability()) # => -32079 +print(ps.score()) # => -7066 +print(ps.confidence()) # => 0.04042641466841839 + +print(*ps.best(count=10), sep='\n') # => [ +# ('go forward ten meters', -28034) +# ('go for word ten meters', -28570) +# ('go forward and majors', -28670) +# ('go forward and meters', -28681) +# ('go forward and readers', -28685) +# ('go forward ten readers', -28688) +# ('go forward ten leaders', -28695) +# ('go forward can meters', -28695) +# ('go forward and leaders', -28706) +# ('go for work ten meters', -28722) +# ] + + +from pocketsphinx import Pocketsphinx + +ps = Pocketsphinx(verbose=True) +ps.decode() + +print(ps.hypothesis()) + + +from pocketsphinx import Pocketsphinx + +ps = Pocketsphinx(verbose=True, logfn='pocketsphinx.log') +ps.decode() + +print(ps.hypothesis()) + +import os +from pocketsphinx import DefaultConfig, Decoder, get_model_path, get_data_path + +model_path = get_model_path() +data_path = get_data_path() + +# Create a decoder with a certain model +config = DefaultConfig() +config.set_string('-hmm', os.path.join(model_path, 'en-us')) +config.set_string('-lm', os.path.join(model_path, 'en-us.lm.bin')) +config.set_string('-dict', os.path.join(model_path, 'cmudict-en-us.dict')) +decoder = Decoder(config) + +# Decode streaming data +buf = bytearray(1024) +with open(os.path.join(data_path, 'goforward.raw'), 'rb') as f: + decoder.start_utt() + while f.readinto(buf): + decoder.process_raw(buf, False, False) + decoder.end_utt() +print('Best hypothesis segments:', [seg.word for seg in decoder.seg()]) diff --git a/cython/test/alignment_test.py b/cython/test/alignment_test.py new file mode 100644 index 0000000..efbf845 --- /dev/null +++ b/cython/test/alignment_test.py @@ -0,0 +1,99 @@ +#!/usr/bin/python + +import os +from pocketsphinx import Decoder +import unittest +import wave + +DATADIR = os.path.join(os.path.dirname(__file__), "../../test/data") + + +class TestAlignment(unittest.TestCase): + def _run_decode(self, decoder): + with open(os.path.join(DATADIR, "goforward.raw"), "rb") as fh: + buf = fh.read() + decoder.start_utt() + decoder.process_raw(buf, no_search=False, full_utt=True) + decoder.end_utt() + + def test_alignment(self): + decoder = Decoder(lm=None) + decoder.set_align_text("go forward ten meters") + self._run_decode(decoder) + words = [] + for seg in decoder.seg(): + if seg.word not in ("", "", "", "(NULL)"): + words.append((seg.word, seg.start_frame, seg.end_frame)) + print(words) + decoder.set_alignment() + self._run_decode(decoder) + for word in decoder.get_alignment(): + print(word.start, word.duration, word.score, word.name) + for phone in word: + print("\t", phone.start, phone.duration, phone.score, phone.name) + for state in phone: + print("\t\t", state.start, state.duration, state.score, state.name) + + def test_default_lm(self): + decoder = Decoder() + self.assertEqual(decoder.current_search(), "_default") + decoder.set_align_text("go forward then meters") + self.assertEqual(decoder.current_search(), "_align") + self._run_decode(decoder) + self.assertEqual(decoder.hyp().hypstr, "go forward then meters") + decoder.activate_search() + self.assertEqual(decoder.current_search(), "_default") + self._run_decode(decoder) + self.assertEqual(decoder.hyp().hypstr, "go forward ten meters") + + def _run_phone_align(self, decoder, buf): + decoder.start_utt() + decoder.process_raw(buf, no_search=False, full_utt=True) + decoder.end_utt() + decoder.set_alignment() + decoder.start_utt() + decoder.process_raw(buf, no_search=False, full_utt=True) + decoder.end_utt() + + def test_align_forever(self): + decoder = Decoder(loglevel="INFO", backtrace=True, lm=None) + decoder.set_align_text("feels like these days go on forever") + with wave.open( + os.path.join(DATADIR, "forever", "input_2_16k.wav"), "r" + ) as infh: + data = infh.readframes(infh.getnframes()) + self._run_phone_align(decoder, data) + alignment = decoder.get_alignment() + phones = [entry.name for entry in alignment.phones()] + self.assertEqual( + phones, + [ + "F", + "IY", + "L", + "Z", + "L", + "AY", + "K", + "DH", + "IY", + "Z", + "D", + "EY", + "Z", + "G", + "OW", + "AO", + "N", + "F", + "ER", + "EH", + "V", + "ER", + "SIL", + ], + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/cython/test/config_test.py b/cython/test/config_test.py new file mode 100644 index 0000000..e421563 --- /dev/null +++ b/cython/test/config_test.py @@ -0,0 +1,211 @@ +#!/usr/bin/env python3 + +import os +from pocketsphinx import Decoder, Config, get_model_path +import unittest +import tempfile + +MODELDIR = os.path.join(os.path.dirname(__file__), "../../model") +DATADIR = os.path.join(os.path.dirname(__file__), "../../test/data") + + +class TestConfig(unittest.TestCase): + def test_bogus_old_config(self): + """Test backward-compatibility. DO NOT USE Config THIS WAY!""" + config = Decoder.default_config() + intval = 256 + floatval = 0.025 + stringval = "~/pocketsphinx" + boolval = True + + # Check values that was previously set. + s = config.get_float("-wlen") + print("Float:", floatval, " ", s) + self.assertEqual(s, 0.025625) + config.set_float("-wlen", floatval) + s = config.get_float("-wlen") + self.assertEqual(s, floatval) + + s = config.get_int("-nfft") + print("Int:", intval, " ", s) + config.set_int("-nfft", intval) + s = config.get_int("-nfft") + self.assertEqual(s, intval) + + s = config.get_string("-rawlogdir") + print("String:", stringval, " ", s) + config.set_string("-rawlogdir", stringval) + s = config.get_string("-rawlogdir") + self.assertEqual(s, stringval) + + s = config.get_boolean("-backtrace") + print("Boolean:", boolval, " ", s) + config.set_boolean("-backtrace", boolval) + s = config.get_boolean("-backtrace") + self.assertEqual(s, boolval) + + config.set_string_extra("-something12321", "abc") + s = config.get_string("-something12321") + self.assertEqual(s, "abc") + + def test_config_file(self): + config = Config.parse_file( + os.path.join(MODELDIR, "en-us", "en-us", "feat.params") + ) + self.assertEqual(config["lowerf"], 130) + self.assertEqual(config["upperf"], 6800) + self.assertEqual(config["nfilt"], 25) + self.assertEqual(config["transform"], "dct") + self.assertEqual(config["lifter"], 22) + self.assertEqual(config["feat"], "1s_c_d_dd") + self.assertEqual(config["svspec"], "0-12/13-25/26-38") + self.assertEqual(config["agc"], "none") + self.assertEqual(config["cmn"], "batch") + self.assertEqual(config["varnorm"], False) + # not an actual config parameter, it seems! + with self.assertRaises(KeyError): + self.assertEqual(config["model"], "ptm") + self.assertEqual(config["remove_noise"], True) + + +class TestConfigHash(unittest.TestCase): + def test_config__getitem(self): + config = Config() + self.assertEqual(config["samprate"], 16000) + self.assertEqual(config["nfft"], 0) + self.assertEqual(config["fsg"], None) + self.assertEqual(config["backtrace"], False) + self.assertEqual(config["feat"], "1s_c_d_dd") + + def test_config_easyinit(self): + config = Config(samprate=11025, fsg=None, backtrace=False, feat="1s_c_d_dd") + self.assertEqual(config["samprate"], 11025) + self.assertEqual(config.get_int("-samprate"), 11025) + self.assertEqual(config["nfft"], 0) + self.assertEqual(config["fsg"], None) + self.assertEqual(config["backtrace"], False) + self.assertEqual(config["feat"], "1s_c_d_dd") + + def test_config_coercion(self): + config = Config() + config["samprate"] = 48000.0 + self.assertEqual(config["samprate"], 48000) + config["nfft"] = "1024" + self.assertEqual(config["nfft"], 1024) + + def test_config_defaults(self): + # System-wide defaults + config = Config() + self.assertEqual(config["hmm"], get_model_path("en-us/en-us")) + self.assertEqual(config["lm"], get_model_path("en-us/en-us.lm.bin")) + self.assertEqual(config["dict"], get_model_path("en-us/cmudict-en-us.dict")) + # Override them + config = Config(hmm=None, lm=None, dict=None) + self.assertEqual(config["hmm"], None) + self.assertEqual(config["lm"], None) + self.assertEqual(config["dict"], None) + # Legacy method of overriding + config = Config(lm=False) + self.assertEqual(config["hmm"], get_model_path("en-us/en-us")) + self.assertEqual(config["lm"], None) + self.assertEqual(config["dict"], get_model_path("en-us/cmudict-en-us.dict")) + # Check that POCKETSPHINX_PATH is respected + os.environ["POCKETSPHINX_PATH"] = MODELDIR + config = Config() + self.assertEqual(config["hmm"], os.path.join(MODELDIR, "en-us/en-us")) + + def test_stupid_config_hacks(self): + """Test various backward-compatibility special cases.""" + config = Config() + self.assertEqual(config["lm"], get_model_path("en-us/en-us.lm.bin")) + config = Config(jsgf="spam_eggs_and_spam.gram") + self.assertIsNone(config["lm"]) + self.assertEqual(config["jsgf"], "spam_eggs_and_spam.gram") + with self.assertRaises(RuntimeError): + config = Config() + config["jsgf"] = os.path.join(DATADIR, "goforward.gram") + _ = Decoder(config) + with self.assertRaises(RuntimeError): + _ = Decoder(kws=os.path.join(DATADIR, "goforward.kws"), + jsgf=os.path.join(DATADIR, "goforward.gram")) + _ = Decoder(jsgf=os.path.join(DATADIR, "goforward.gram")) + +class TestConfigIter(unittest.TestCase): + def test_config__iter(self): + config = Config() + default_len = len(config) + for key in config: + self.assertTrue(key in config) + for key, value in config.items(): + self.assertTrue(key in config) + self.assertEqual(config[key], value) + config = Config() + self.assertEqual(default_len, len(config)) + config["lm"] = None + config["hmm"] = os.path.join(MODELDIR, "en-us", "en-us") + config["fsg"] = os.path.join(DATADIR, "goforward.fsg") + config["lm"] = None # It won't do this automatically + config["dict"] = os.path.join(DATADIR, "turtle.dic") + self.assertEqual(default_len, len(config)) + for key in config: + self.assertTrue(key in config) + for key, value in config.items(): + self.assertTrue(key in config) + self.assertEqual(config[key], value) + self.assertIsNone(config["mdef"]) + # Now check weird extra value stuff. Length should never change + _ = Decoder(config) + # But mdef, etc, should be filled in + default_mdef = config["mdef"] + self.assertIsNotNone(default_mdef) + # And we should get them for dash and underscore versions too + self.assertEqual(default_mdef, config["-mdef"]) + self.assertEqual(default_mdef, config["_mdef"]) + self.assertEqual(default_len, len(config)) + for key in config: + self.assertTrue(key in config) + for key, value in config.items(): + self.assertTrue(key in config) + self.assertEqual(config[key], value) + + +class TestConfigDefn(unittest.TestCase): + def test_config_describe(self): + config = Config() + for defn in config.describe(): + if defn.name == "hmm": + self.assertTrue(defn.required) + + +class TestConfigJSON(unittest.TestCase): + def assert_parsed(self, config): + self.assertEqual(config["hmm"], "/path/to/some/stuff") + self.assertEqual(config["samprate"], 11025) + self.assertAlmostEqual(config["beam"], 1e-69) + + def test_config_parse(self): + config = Config.parse_json(""" +{ + "hmm": "/path/to/some/stuff", + "samprate": 11025, + "beam": 1e-69 +} +""") + self.assert_parsed(config) + with tempfile.TemporaryFile(mode="w+t") as tf: + tf.write(config.dumps()) + tf.flush() + tf.seek(0, 0) + json = tf.read() + config2 = Config.parse_json(json) + self.assert_parsed(config2) + for k in config: + self.assertAlmostEqual(config[k], config2[k], 2) + config3 = Config.parse_json( + "hmm: /path/to/some/stuff, samprate: 11025, beam: 1e-69") + self.assert_parsed(config3) + for k in config: + self.assertAlmostEqual(config[k], config3[k], 2) + +if __name__ == "__main__": + unittest.main() diff --git a/cython/test/continuous_test.py b/cython/test/continuous_test.py new file mode 100644 index 0000000..79f5b8d --- /dev/null +++ b/cython/test/continuous_test.py @@ -0,0 +1,38 @@ +#!/usr/bin/python + +import os +from pocketsphinx import Decoder +import unittest + +DATADIR = os.path.join(os.path.dirname(__file__), "../../test/data") + + +class TestContinuous(unittest.TestCase): + def test_continuous(self): + prev_cmn = ( + "41,-5.29,-0.12,5.09,2.48,-4.07,-1.37,-1.78,-5.08,-2.05,-6.45,-1.42,1.17" + ) + decoder = Decoder(cmninit=prev_cmn) + self.assertEqual(prev_cmn, decoder.get_cmn(False)) + + with open(os.path.join(DATADIR, "goforward.raw"), "rb") as stream: + decoder.start_utt() + while True: + buf = stream.read(1024) + if buf: + decoder.process_raw(buf, False, False) + cmn = decoder.get_cmn(True) + self.assertNotEqual(prev_cmn, cmn) + prev_cmn = cmn + else: + break + decoder.end_utt() + print("Result:", decoder.hyp().hypstr) + self.assertEqual("go forward ten meters", decoder.hyp().hypstr) + cmn = decoder.get_cmn(False) + self.assertNotEqual(prev_cmn, cmn) + prev_cmn = cmn + + +if __name__ == "__main__": + unittest.main() diff --git a/cython/test/decoder_test.py b/cython/test/decoder_test.py new file mode 100644 index 0000000..851a9b5 --- /dev/null +++ b/cython/test/decoder_test.py @@ -0,0 +1,87 @@ +#!/usr/bin/python + +import os +from pocketsphinx import Decoder +import unittest + +DATADIR = os.path.join(os.path.dirname(__file__), "../../test/data") + + +class TestDecoder(unittest.TestCase): + def _run_decode(self, decoder, expect_fail=False): + with open(os.path.join(DATADIR, "goforward.raw"), "rb") as fh: + buf = fh.read() + decoder.start_utt() + decoder.process_raw(buf, no_search=False, full_utt=True) + decoder.end_utt() + self._check_hyp(decoder.hyp().hypstr, decoder.seg(), expect_fail) + + def _check_hyp(self, hyp, hypseg, expect_fail=False): + if expect_fail: + self.assertNotEqual(hyp, "go forward ten meters") + else: + self.assertEqual(hyp, "go forward ten meters") + words = [] + try: + for seg in hypseg: + if seg.word not in ("", "", "", "(NULL)"): + words.append(seg.word) + except AttributeError: + for word, start, end in hypseg: + if word not in ("", "", "", "(NULL)"): + words.append(word) + if expect_fail: + self.assertNotEqual(words, "go forward ten meters".split()) + else: + self.assertEqual(words, "go forward ten meters".split()) + + def test_decoder(self): + decoder = Decoder() + print("log(1e-150) = ", decoder.logmath.log(1e-150)) + print("Pronunciation for word 'hello' is ", decoder.lookup_word("hello")) + self.assertEqual("HH AH L OW", decoder.lookup_word("hello")) + print("Pronunciation for word 'abcdf' is ", decoder.lookup_word("abcdf")) + self.assertEqual(None, decoder.lookup_word("abcdf")) + + self._run_decode(decoder) + + # Access N best decodings. + print("Best 10 hypothesis: ") + for best, i in zip(decoder.nbest(), range(10)): + print(best.hypstr, best.score) + + with open(os.path.join(DATADIR, "goforward.mfc"), "rb") as stream: + stream.read(4) + buf = stream.read(13780) + decoder.start_utt() + decoder.process_cep(buf, False, True) + decoder.end_utt() + hypothesis = decoder.hyp() + print( + "Best hypothesis: ", + hypothesis.hypstr, + " model score: ", + hypothesis.best_score, + " confidence: ", + hypothesis.prob, + ) + self.assertEqual("go forward ten meters", decoder.hyp().hypstr) + + def test_reinit(self): + decoder = Decoder() + decoder.add_word("_forward", "F AO R W ER D", True) + self._run_decode(decoder) + # should preserve dict words, but make decoding fail + decoder.config["samprate"] = 48000 + decoder.reinit_feat() + self.assertEqual("F AO R W ER D", decoder.lookup_word("_forward")) + self._run_decode(decoder, expect_fail=True) + decoder.config["samprate"] = 16000 + # should erase dict words + decoder.reinit() + self.assertEqual(None, decoder.lookup_word("_forward")) + self._run_decode(decoder) + + +if __name__ == "__main__": + unittest.main() diff --git a/cython/test/endpointer_test.py b/cython/test/endpointer_test.py new file mode 100644 index 0000000..18bee77 --- /dev/null +++ b/cython/test/endpointer_test.py @@ -0,0 +1,257 @@ +#!/usr/bin/env python3 +""" +Segment live speech from the default audio device. +""" + +from pocketsphinx import Vad, Endpointer, set_loglevel +from contextlib import closing +import unittest +import subprocess +import wave +import sys +import os + +DATADIR = os.path.join(os.path.dirname(__file__), "../../test/data/librivox") + + +class VadQ: + def __init__(self, vad_frames=10, frame_length=0.03): + self.frames = [None] * vad_frames + self.is_speech = [0] * vad_frames + self.n = self.pos = 0 + self.maxlen = vad_frames + self.frame_length = frame_length + self.start_time = 0.0 + + def __len__(self): + return self.n + + def empty(self): + return self.n == 0 + + def full(self): + return self.n == self.maxlen + + def clear(self): + self.n = 0 + + def push(self, is_speech, pcm): + i = (self.pos + self.n) % self.maxlen + self.frames[i] = pcm + self.is_speech[i] = is_speech + if self.full(): + self.start_time += self.frame_length + self.pos = (self.pos + 1) % self.maxlen + else: + self.n += 1 + + def pop(self): + if self.empty(): + raise IndexError("Queue is empty") + self.start_time += self.frame_length + rv = self.is_speech[self.pos], self.frames[self.pos] + self.pos = (self.pos + 1) % self.maxlen + self.n -= 1 + return rv + + def speech_count(self): + if self.empty(): + return 0 + if self.full(): + return sum(self.is_speech) + # Ideally we would let it equal self.maxlen + end = (self.pos + self.n) % self.maxlen + if end > self.pos: + return sum(self.is_speech[self.pos: end]) + else: + # Note second term is 0 if end is 0 + return sum(self.is_speech[self.pos:]) + sum(self.is_speech[:end]) + + +class PyEndpointer(Vad): + def __init__( + self, + window=0.3, + ratio=0.9, + vad_mode=Vad.LOOSE, + sample_rate=Vad.DEFAULT_SAMPLE_RATE, + frame_length=Vad.DEFAULT_FRAME_LENGTH, + ): + super(PyEndpointer, self).__init__(vad_mode, sample_rate, frame_length) + maxlen = int(window / self.frame_length + 0.5) + self.start_frames = int(ratio * maxlen) + self.end_frames = int((1.0 - ratio) * maxlen + 0.5) + print("Threshold %d%% of %.3fs window (>%d frames <%d frames of %d)" % + (int(ratio * 100.0 + 0.5), + maxlen * self.frame_length, + self.start_frames, self.end_frames, maxlen)) + self.vadq = VadQ(maxlen, self.frame_length) + self.timestamp = 0.0 + self.in_speech = False + self.speech_start = self.speech_end = None + + def end_stream(self, frame): + if len(frame) > self.frame_bytes: + raise IndexError( + "Last frame size must be %d bytes or less" % self.frame_bytes + ) + speech_frames = [] + self.timestamp += len(frame) * 0.5 / self.sample_rate + if not self.in_speech: + return None + self.in_speech = False + self.speech_end = self.vadq.start_time + while not self.vadq.empty(): + is_speech, pcm = self.vadq.pop() + if is_speech: + speech_frames.append(pcm) + self.speech_end = self.vadq.start_time + else: + break + # If we used all the VAD queue, add the trailing samples + if self.vadq.empty() and self.speech_end == self.vadq.start_time: + speech_frames.append(frame) + self.speech_end = self.timestamp + self.vadq.clear() + return b"".join(speech_frames) + + def process(self, frame): + if self.in_speech: + assert not self.vadq.full(), "VAD queue overflow (should not happen)" + if len(frame) != self.frame_bytes: + raise IndexError("Frame size must be %d bytes" % self.frame_bytes) + self.vadq.push(self.is_speech(frame), frame) + self.timestamp += self.frame_length + speech_count = self.vadq.speech_count() + #print("%.2f %d %d %d" % (self.timestamp, speech_count, self.start_frames, self.end_frames)) + # Handle state transitions + if self.in_speech: + if speech_count < self.end_frames: + # Return only the first frame. Either way it's sort + # of arbitrary, but this avoids having to drain the + # queue to prevent overlapping segments. It's also + # closer to what human annotators will do. + _, outframe = self.vadq.pop() + self.speech_end = self.vadq.start_time + self.in_speech = False + return outframe + else: + if speech_count > self.start_frames: + self.speech_start = self.vadq.start_time + self.speech_end = None + self.in_speech = True + # Return a buffer if we are in a speech region + if self.in_speech: + _, outframe = self.vadq.pop() + return outframe + else: + return None + + +def get_wavfile_length(path): + with closing(wave.open(path)) as reader: + nfr = reader.getnframes() + frate = reader.getframerate() + return nfr / frate + + +def get_labels(path, pos): + with open(path, "rt") as infh: + labels = [(pos, "silence")] + for spam in infh: + # The labels are a bit odd + start, _, label = spam.strip().split() + labels.append((pos + float(start), label)) + return labels + + +def make_single_track(): + labels = [] + infiles = [] + with open(os.path.join(DATADIR, "fileids"), "rt") as infh: + pos = 0.0 + for spam in infh: + fileid = spam.strip() + path = os.path.join(DATADIR, fileid + ".wav") + infiles.append(path) + nsec = get_wavfile_length(path) + path = os.path.join(DATADIR, fileid + ".lab") + labels.extend(get_labels(path, pos)) + pos += nsec + out_labels = [] + start_time, label = labels[0] + for end_time, next_label in labels[1:]: + if next_label != label: + if label == "speech": + out_labels.append((start_time, end_time, label)) + start_time = end_time + label = next_label + if label == "speech": + out_labels.append((start_time, pos, label)) + return infiles, out_labels + + +class EndpointerTest(unittest.TestCase): + def srtest(self, sample_rate): + ep = Endpointer(vad_mode=3, sample_rate=sample_rate) + pyep = PyEndpointer(vad_mode=3, sample_rate=sample_rate) + self.assertEqual(ep.frame_bytes, pyep.frame_bytes) + soxcmd = ["sox"] + files, labels = make_single_track() + soxcmd.extend(files) + soxcmd.extend("-c 1 -b 16 -e signed-integer -D -G -r".split()) + soxcmd.append("%d" % ep.sample_rate) + soxcmd.extend("-t raw -".split()) + with subprocess.Popen(soxcmd, stdout=subprocess.PIPE) as sox: + idx = 0 + while True: + frame = sox.stdout.read(ep.frame_bytes) + if len(frame) == 0: + break + elif len(frame) < ep.frame_bytes: + speech = ep.end_stream(frame) + pyspeech = pyep.end_stream(frame) + self.assertEqual(speech, pyspeech) + else: + speech = ep.process(frame) + pyspeech = pyep.process(frame) + self.assertEqual(speech, pyspeech) + if speech is not None: + self.assertEqual(ep.in_speech, pyep.in_speech) + if not ep.in_speech: + self.assertFalse(pyep.in_speech) + start_time, end_time, _ = labels[idx] + start_diff = abs(start_time - ep.speech_start) + end_diff = abs(end_time - ep.speech_end) + print( + "%.2f:%.2f (py: %.2f:%.2f) (truth: %.2f:%.2f) (diff:%.2f:%.2f)" + % ( + ep.speech_start, + ep.speech_end, + pyep.speech_start, + pyep.speech_end, + start_time, + end_time, + start_diff, + end_diff, + ) + ) + self.assertAlmostEqual(ep.speech_start, pyep.speech_start, 3) + self.assertAlmostEqual(ep.speech_end, pyep.speech_end, 3) + self.assertLess(start_diff, 0.06) + self.assertLess(end_diff, 0.21) + idx += 1 + + def testEndpointer(self): + try: + set_loglevel("INFO") + # 8000, 44100, 48000 give slightly different results unfortunately + for sample_rate in 11025, 16000, 22050, 32000: + print(sample_rate) + self.srtest(sample_rate) + except OSError as err: + self.skipTest("sox not installed: %s" % err) + + +if __name__ == "__main__": + unittest.main() diff --git a/cython/test/fsg_test.py b/cython/test/fsg_test.py new file mode 100644 index 0000000..e4bf6ec --- /dev/null +++ b/cython/test/fsg_test.py @@ -0,0 +1,37 @@ +#!/usr/bin/python + +import unittest +from pocketsphinx import LogMath, FsgModel, Decoder + + +class FsgTest(unittest.TestCase): + def testfsg(self): + lmath = LogMath() + fsg = FsgModel("simple_grammar", lmath, 1.0, 10) + fsg.word_add("hello") + fsg.word_add("world") + print(fsg.word_id("world")) + self.assertEqual(fsg.word_id("world"), 1) + self.assertEqual(fsg.word_add("world"), 1) + + fsg.add_silence("", 1, 0.5) + + decoder = Decoder() + fsg = decoder.create_fsg("mygrammar", + start_state=0, final_state=3, + transitions=[(0, 1, 0.75, "hello"), + (0, 1, 0.25, "goodbye"), + (1, 2, 0.75, "beautiful"), + (1, 2, 0.25, "cruel"), + (2, 3, 1.0, "world")]) + self.assertTrue(fsg.accept("hello beautiful world")) + self.assertTrue(fsg.accept("hello cruel world")) + self.assertTrue(fsg.accept("goodbye beautiful world")) + self.assertTrue(fsg.accept("goodbye cruel world")) + self.assertFalse(fsg.accept("goodbye world")) + self.assertFalse(fsg.accept("hello world")) + self.assertFalse(fsg.accept("hello dead parrot")) + + +if __name__ == "__main__": + unittest.main() diff --git a/cython/test/jsgf_test.py b/cython/test/jsgf_test.py new file mode 100644 index 0000000..6684a0a --- /dev/null +++ b/cython/test/jsgf_test.py @@ -0,0 +1,63 @@ +#!/usr/bin/python + +import unittest +import os +from pocketsphinx import Decoder, Jsgf + +DATADIR = os.path.join(os.path.dirname(__file__), "../../test/data") + + +class TestJsgf(unittest.TestCase): + def test_create_jsgf(self): + jsgf = Jsgf(os.path.join(DATADIR, "goforward.gram")) + del jsgf + + def test_jsgf(self): + # Create a decoder with turtle language model + decoder = Decoder(lm=os.path.join(DATADIR, "turtle.lm.bin"), + dict=os.path.join(DATADIR, "turtle.dic")) + + # Decode with lm + decoder.start_utt() + with open(os.path.join(DATADIR, "goforward.raw"), "rb") as stream: + while True: + buf = stream.read(1024) + if buf: + decoder.process_raw(buf, False, False) + else: + break + decoder.end_utt() + print('Decoding with "turtle" language:', decoder.hyp().hypstr) + self.assertEqual("go forward ten meters", decoder.hyp().hypstr) + + # Switch to JSGF grammar + jsgf = Jsgf(os.path.join(DATADIR, "goforward.gram")) + rule = jsgf.get_rule("goforward.move2") + fsg = jsgf.build_fsg(rule, decoder.logmath, 7.5) + fsg.writefile("goforward.fsg") + self.assertTrue(os.path.exists("goforward.fsg")) + os.remove("goforward.fsg") + + decoder.add_fsg("goforward", fsg) + self.assertNotEqual(decoder.current_search(), "goforward") + decoder.activate_search("goforward") + self.assertEqual(decoder.current_search(), "goforward") + self.assertTrue(decoder.get_fsg()) + self.assertTrue(decoder.get_fsg("goforward")) + self.assertIsNone(decoder.get_lm("foobiebletch")) + + decoder.start_utt() + with open(os.path.join(DATADIR, "goforward.raw"), "rb") as stream: + while True: + buf = stream.read(1024) + if buf: + decoder.process_raw(buf, False, False) + else: + break + decoder.end_utt() + print('Decoding with "goforward" grammar:', decoder.hyp().hypstr) + self.assertEqual("go forward ten meters", decoder.hyp().hypstr) + + +if __name__ == "__main__": + unittest.main() diff --git a/cython/test/kws_test.py b/cython/test/kws_test.py new file mode 100644 index 0000000..407fce0 --- /dev/null +++ b/cython/test/kws_test.py @@ -0,0 +1,60 @@ +#!/usr/bin/python + +import unittest +import sys, os +from pocketsphinx import Decoder + +DATADIR = os.path.join(os.path.dirname(__file__), "../../test/data") + + +class TestKWS(unittest.TestCase): + def test_kws(self): + # Open file to read the data + stream = open(os.path.join(DATADIR, "goforward.raw"), "rb") + + # Process audio chunk by chunk. On keyphrase detected perform action and restart search + decoder = Decoder(kws=os.path.join(DATADIR, "goforward.kws"), + loglevel="INFO", + lm=None) + decoder.start_utt() + keywords = ["forward", "meters"] + while keywords: + buf = stream.read(1024) + if buf: + decoder.process_raw(buf) + else: + break + if decoder.hyp() != None: + print( + [ + (seg.word, seg.prob, seg.start_frame, seg.end_frame) + for seg in decoder.seg() + ] + ) + print("Detected keyphrase, restarting search") + for seg in decoder.seg(): + self.assertTrue(seg.end_frame > seg.start_frame) + self.assertEqual(seg.word, keywords.pop(0)) + decoder.end_utt() + decoder.start_utt() + stream.close() + decoder.end_utt() + + # Detect keywords in a batch utt, make sure they show up in the right order + stream = open(os.path.join(DATADIR, "goforward.raw"), "rb") + decoder.start_utt() + decoder.process_raw(stream.read(), full_utt=True) + decoder.end_utt() + print( + [ + (seg.word, seg.prob, seg.start_frame, seg.end_frame) + for seg in decoder.seg() + ] + ) + self.assertEqual(decoder.hyp().hypstr, "forward meters") + self.assertEqual(["forward", "meters"], + [seg.word for seg in decoder.seg()]) + + +if __name__ == "__main__": + unittest.main() diff --git a/cython/test/lattice_test.py b/cython/test/lattice_test.py new file mode 100644 index 0000000..f2c5766 --- /dev/null +++ b/cython/test/lattice_test.py @@ -0,0 +1,33 @@ +#!/usr/bin/python + +import unittest +import os +from pocketsphinx import Decoder + +DATADIR = os.path.join(os.path.dirname(__file__), "../../test/data") + + +class LatticeTest(unittest.TestCase): + def test_lattice(self): + # Create a decoder with the default model + decoder = Decoder() + + decoder.start_utt() + stream = open(os.path.join(DATADIR, "goforward.raw"), "rb") + while True: + buf = stream.read(1024) + if buf: + decoder.process_raw(buf, False, False) + else: + break + stream.close() + decoder.end_utt() + + decoder.get_lattice().write("goforward.lat") + decoder.get_lattice().write_htk("goforward.htk") + os.unlink("goforward.lat") + os.unlink("goforward.htk") + + +if __name__ == "__main__": + unittest.main() diff --git a/cython/test/lm_test.py b/cython/test/lm_test.py new file mode 100644 index 0000000..9372145 --- /dev/null +++ b/cython/test/lm_test.py @@ -0,0 +1,73 @@ +#!/usr/bin/python + +import unittest +import os +from pocketsphinx import Decoder, NGramModel + +DATADIR = os.path.join(os.path.dirname(__file__), "../../test/data") + + +class TestLM(unittest.TestCase): + def test_lm(self): + # Create a decoder with a broken dictionary + decoder = Decoder(dict=os.path.join(DATADIR, "defective.dic")) + + decoder.start_utt() + with open(os.path.join(DATADIR, "goforward.raw"), "rb") as stream: + while True: + buf = stream.read(1024) + if buf: + decoder.process_raw(buf, False, False) + else: + break + decoder.end_utt() + print("Decoding with default settings:", decoder.hyp().hypstr) + self.assertEqual("", decoder.hyp().hypstr) + + # Load "turtle" language model and decode again. + lm = NGramModel( + decoder.config, + decoder.logmath, + os.path.join(DATADIR, "turtle.lm.bin"), + ) + print(lm.prob(["you"])) + print(lm.prob(["are", "you"])) + print(lm.prob(["you", "are", "what"])) + print(lm.prob(["lost", "are", "you"])) + + decoder.add_lm("turtle", lm) + self.assertNotEqual(decoder.current_search(), "turtle") + decoder.activate_search("turtle") + self.assertEqual(decoder.current_search(), "turtle") + decoder.start_utt() + with open(os.path.join(DATADIR, "goforward.raw"), "rb") as stream: + while True: + buf = stream.read(1024) + if buf: + decoder.process_raw(buf, False, False) + else: + break + decoder.end_utt() + + print('Decoding with "turtle" language:', decoder.hyp().hypstr) + self.assertEqual("", decoder.hyp().hypstr) + + # The word 'meters' isn't in the loaded dictionary. + # Let's add it manually. + decoder.add_word("foobie", "F UW B IY", False) + decoder.add_word("meters", "M IY T ER Z", True) + decoder.start_utt() + with open(os.path.join(DATADIR, "goforward.raw"), "rb") as stream: + while True: + buf = stream.read(1024) + if buf: + decoder.process_raw(buf, False, False) + else: + break + decoder.end_utt() + print("Decoding with customized language:", decoder.hyp().hypstr) + self.assertEqual("foobie meters meters", decoder.hyp().hypstr) + + +if __name__ == "__main__": + unittest.main() diff --git a/cython/test/logmath_test.py b/cython/test/logmath_test.py new file mode 100644 index 0000000..be4d915 --- /dev/null +++ b/cython/test/logmath_test.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 + +from pocketsphinx import LogMath +import unittest + + +class TestLogMath(unittest.TestCase): + def assertLogEqual(self, a, b): + self.assertTrue(abs(a - b) < 200) + + def test_logmath(self): + lmath = LogMath() + self.assertTrue(lmath is not None) + self.assertLogEqual(lmath.log(1e-150), -3454050) + self.assertAlmostEqual(lmath.exp(lmath.log(1e-150)), 1e-150) + self.assertAlmostEqual(lmath.exp(lmath.log(1e-48)), 1e-48) + self.assertLogEqual(lmath.log(42), 37378) + self.assertAlmostEqual(lmath.exp(lmath.log(42)), 42, 1) + print( + "log(1e-3 + 5e-3) = %d + %d = %d\n" + % ( + lmath.log(1e-3), + lmath.log(5e-3), + lmath.add(lmath.log(1e-3), lmath.log(5e-3)), + ) + ) + print( + "log(1e-3 + 5e-3) = %e + %e = %e\n" + % ( + lmath.exp(lmath.log(1e-3)), + lmath.exp(lmath.log(5e-3)), + lmath.exp(lmath.add(lmath.log(1e-3), lmath.log(5e-3))), + ) + ) + self.assertLogEqual( + lmath.add(lmath.log(1e-48), lmath.log(5e-48)), lmath.log(6e-48) + ) + self.assertLogEqual(lmath.add(lmath.log(1e-48), lmath.log(42)), lmath.log(42)) + + +if __name__ == "__main__": + unittest.main() diff --git a/cython/test/phoneme_test.py b/cython/test/phoneme_test.py new file mode 100644 index 0000000..c2f5c26 --- /dev/null +++ b/cython/test/phoneme_test.py @@ -0,0 +1,31 @@ +#!/usr/bin/python + +import os +import unittest +from pocketsphinx import Decoder, get_model_path + +DATADIR = os.path.join(os.path.dirname(__file__), "../../test/data") + + +class PhonemeTest(unittest.TestCase): + def test_phoneme(self): + decoder = Decoder( + allphone=get_model_path("en-us/en-us-phone.lm.bin"), + lw=2.0, pip=0.3, beam=1e-200, pbeam=1e-20) + + # Decode streaming data. + with open(os.path.join(DATADIR, "goforward.raw"), "rb") as stream: + decoder.start_utt() + while True: + buf = stream.read(1024) + if buf: + decoder.process_raw(buf, False, False) + else: + break + decoder.end_utt() + + print("Best phonemes: ", [seg.word for seg in decoder.seg()]) + + +if __name__ == "__main__": + unittest.main() diff --git a/cython/test/pypocketsphinx_test.py b/cython/test/pypocketsphinx_test.py new file mode 100644 index 0000000..c8a0b31 --- /dev/null +++ b/cython/test/pypocketsphinx_test.py @@ -0,0 +1,207 @@ +#!/usr/bin/env python3 + +"""Test the various use cases for the old abandoned +python-pocketsphinx module and its simple classes. We don't support +the truly useless parts of the API like defaulting to "goforward.raw" +as the input, and some results have changed, other than that it should +be compatible. +""" + +import os +from pocketsphinx import Pocketsphinx, AudioFile, NGramModel, Jsgf +from unittest import TestCase, main + +MODELDIR = os.path.join(os.path.dirname(__file__), "../../model") +DATADIR = os.path.join(os.path.dirname(__file__), "../../test/data") + + +class TestAudioFile(TestCase): + def test_audiofile_raw(self): + hypothesis = "" + for phrase in AudioFile(audio_file=os.path.join(DATADIR, "goforward.raw")): + hypothesis = str(phrase) + self.assertEqual(hypothesis, "go forward ten meters") + + +class TestRawDecoder(TestCase): + def setUp(self): + self.ps = Pocketsphinx( + hmm=os.path.join(MODELDIR, "en-us/en-us"), + lm=os.path.join(MODELDIR, "en-us/en-us.lm.bin"), + dict=os.path.join(MODELDIR, "en-us/cmudict-en-us.dict"), + ) + self.ps.decode(os.path.join(DATADIR, "goforward.raw")) + + def test_raw_decoder_lookup_word(self): + self.assertEqual(self.ps.lookup_word("hello"), "HH AH L OW") + self.assertEqual(self.ps.lookup_word("abcdf"), None) + + def test_raw_decoder_hypothesis(self): + self.assertEqual(self.ps.hypothesis(), "go forward ten years") + self.assertEqual(self.ps.score(), -8237) + self.assertAlmostEqual(self.ps.confidence(), 0.01, 3) + + def test_raw_decoder_segments(self): + self.assertEqual( + self.ps.segments(), + ["", "go", "forward", "ten", "years", ""], + ) + + def test_raw_decoder_best_hypothesis(self): + self.assertEqual( + self.ps.best(), + [ + ("go forward ten years", -28492), + ("go forward ten meters", -28547), + ("go for word ten meters", -29079), + ("go forward ten liters", -29084), + ("go forward ten leaders", -29098), + ("go forward can meters", -29174), + ("go for word ten years", -29216), + ("go forward ten readers", -29254), + ("go for work ten meters", -29259), + ("go forward can leaders", -29261), + ], + ) + + +class TestCepDecoder(TestCase): + def test_cep_decoder_hypothesis(self): + ps = Pocketsphinx( + hmm=os.path.join(MODELDIR, "en-us/en-us"), + lm=os.path.join(MODELDIR, "en-us/en-us.lm.bin"), + dict=os.path.join(MODELDIR, "en-us/cmudict-en-us.dict"), + verbose=True, + ) + with open(os.path.join(DATADIR, "goforward.mfc"), "rb") as f: + with ps.start_utterance(): + f.read(4) + buf = f.read(13780) + ps.process_cep(buf, False, True) + self.assertEqual(ps.hypothesis(), "go forward ten meters") + self.assertEqual(ps.score(), -7103) + self.assertEqual(ps.probability(), -33134) + + +class TestJsgf(TestCase): + def test_jsgf(self): + ps = Pocketsphinx( + hmm=os.path.join(MODELDIR, "en-us/en-us"), + lm=os.path.join(DATADIR, "turtle.lm.bin"), + dic=os.path.join(DATADIR, "turtle.dic"), + ) + + # Decoding with 'turtle' language model + ps.decode(os.path.join(DATADIR, "goforward.raw")) + self.assertEqual(ps.hypothesis(), "go forward ten meters") + + # Switch to JSGF grammar + jsgf = Jsgf(os.path.join(DATADIR, "goforward.gram")) + rule = jsgf.get_rule("goforward.move2") + fsg = jsgf.build_fsg(rule, ps.get_logmath(), 7.5) + ps.add_fsg("goforward", fsg) + ps.activate_search("goforward") + + # Decoding with 'goforward' grammar + ps.decode(os.path.join(DATADIR, "goforward.raw")) + self.assertEqual(ps.hypothesis(), "go forward ten meters") + + +class TestKws(TestCase): + def test_kws(self): + segments = [] + for phrase in AudioFile( + os.path.join(DATADIR, "goforward.raw"), + lm=None, + keyphrase="forward", + kws_threshold=1e20, + ): + segments = phrase.segments(detailed=True) + self.assertEqual(segments, [("forward", -706, 63, 121)]) + + def test_kws_badapi(self): + segments = [] + for phrase in AudioFile( + audio_file=os.path.join(DATADIR, "goforward.raw"), + lm=False, # Make sure this still works + keyphrase="forward", + kws_threshold=1e20, + ): + segments = phrase.segments(detailed=True) + self.assertEqual(segments, [("forward", -706, 63, 121)]) + + +class TestLm(TestCase): + def test_lm(self): + ps = Pocketsphinx( + hmm=os.path.join(MODELDIR, "en-us/en-us"), + lm=os.path.join(MODELDIR, "en-us/en-us.lm.bin"), + dic=os.path.join(DATADIR, "defective.dic"), + ) + + # Decoding with 'defective' dictionary + ps.decode(os.path.join(DATADIR, "goforward.raw")) + self.assertEqual(ps.hypothesis(), "") + + # Switch to 'turtle' language model + turtle_lm = os.path.join(DATADIR, "turtle.lm.bin") + lm = NGramModel(ps.get_config(), ps.get_logmath(), turtle_lm) + ps.add_lm("turtle", lm) + ps.activate_search("turtle") + + # Decoding with 'turtle' language model + ps.decode(os.path.join(DATADIR, "goforward.raw")) + self.assertEqual(ps.hypothesis(), "") + + # The word 'meters' isn't in the loaded dictionary + # Let's add it manually + ps.add_word("foobie", "F UW B IY", False) + ps.add_word("meters", "M IY T ER Z", True) + + # Decoding with 'turtle' language model + ps.decode(os.path.join(DATADIR, "goforward.raw")) + self.assertEqual(ps.hypothesis(), "foobie meters meters") + + +class TestPhoneme(TestCase): + def setUp(self): + self.ps = Pocketsphinx( + allphone=os.path.join(MODELDIR, "en-us/en-us-phone.lm.bin"), + lw=2.0, + pip=0.3, + beam=1e-200, + pbeam=1e-20, + ) + self.ps.decode(os.path.join(DATADIR, "goforward.raw")) + + def test_phoneme_hypothesis(self): + self.assertEqual( + self.ps.hypothesis(), "SIL G OW F AO R D T AE N NG IY ZH ER S SIL" + ) + + def test_phoneme_best_phonemes(self): + self.assertEqual( + self.ps.segments(), + [ + "SIL", + "G", + "OW", + "F", + "AO", + "R", + "D", + "T", + "AE", + "N", + "NG", + "IY", + "ZH", + "ER", + "S", + "SIL", + ], + ) + + +if __name__ == "__main__": + main(verbosity=2) diff --git a/cython/test/vad_test.py b/cython/test/vad_test.py new file mode 100644 index 0000000..b004652 --- /dev/null +++ b/cython/test/vad_test.py @@ -0,0 +1,102 @@ +import unittest +import wave +import os +from memory_profiler import memory_usage + +from pocketsphinx import Vad + +DATADIR = os.path.join(os.path.dirname(__file__), "../../test/data/vad") + + +class VadTests(unittest.TestCase): + @staticmethod + def _load_wave(file_name): + fp = wave.open(file_name, 'rb') + try: + assert fp.getnchannels() == 1, ( + '{0}: sound format is incorrect! Sound must be mono.'.format( + file_name)) + assert fp.getsampwidth() == 2, ( + '{0}: sound format is incorrect! ' + 'Sample width of sound must be 2 bytes.').format(file_name) + assert fp.getframerate() in (8000, 16000, 32000), ( + '{0}: sound format is incorrect! ' + 'Sampling frequency must be 8000 Hz, 16000 Hz or 32000 Hz.') + sampling_frequency = fp.getframerate() + sound_data = fp.readframes(fp.getnframes()) + finally: + fp.close() + del fp + return sound_data, sampling_frequency + + def test_constructor(self): + _ = Vad() + + def test_set_mode(self): + _ = Vad(0) + _ = Vad(1) + _ = Vad(2) + _ = Vad(3) + with self.assertRaises(ValueError): + _ = Vad(4) + + def test_valid_rate_and_frame_length(self): + _ = Vad(sample_rate=8000, frame_length=0.01) + _ = Vad(sample_rate=16000, frame_length=0.02) + _ = Vad(sample_rate=32000, frame_length=0.01) + _ = Vad(sample_rate=48000, frame_length=0.03) + with self.assertRaises(ValueError): + _ = Vad(sample_rate=283423, frame_length=1e-5) + + def test_process_zeroes(self): + frame_len = 160 + sample = b'\x00' * frame_len * 2 + vad = Vad(sample_rate=16000, frame_length=0.01) + self.assertFalse(vad.is_speech(sample)) + + def test_process_file(self): + with open(os.path.join(DATADIR, 'test-audio.raw'), 'rb') as f: + data = f.read() + # 30ms frames at 8kHz + n = int(8000 * 2 * 30 / 1000.0) + chunks = list(data[pos:pos + n] for pos in range(0, len(data), n)) + if len(chunks[-1]) != n: + chunks = chunks[:-1] + expecteds = [ + '011110111111111111111111111100', + '011110111111111111111111111100', + '000000111111111111111111110000', + '000000111111111111111100000000' + ] + for mode in (0, 1, 2, 3): + vad = Vad(mode=mode, sample_rate=8000, frame_length=0.03) + result = '' + for chunk in chunks: + voiced = vad.is_speech(chunk) + result += '1' if voiced else '0' + self.assertEqual(expecteds[mode], result) + + def test_leak(self): + sound, fs = self._load_wave(os.path.join(DATADIR, 'leak-test.wav')) + frame_ms = 0.010 + frame_len = int(round(fs * frame_ms)) + n = int(len(sound) / (2 * frame_len)) + nrepeats = 1000 + vad = Vad(mode=3, sample_rate=fs, frame_length=frame_ms) + used_memory_before = memory_usage(-1)[0] + for counter in range(nrepeats): + find_voice = False + for frame_ind in range(n): + slice_start = (frame_ind * 2 * frame_len) + slice_end = ((frame_ind + 1) * 2 * frame_len) + if vad.is_speech(sound[slice_start:slice_end], fs): + find_voice = True + self.assertTrue(find_voice) + used_memory_after = memory_usage(-1)[0] + self.assertGreaterEqual( + used_memory_before / 5.0, + used_memory_after - used_memory_before) + + +if __name__ == '__main__': + unittest.main(verbosity=2) diff --git a/debian/changelog b/debian/changelog index 82aad9b..4b505df 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,84 @@ +pocketsphinx (5.0.4-3) unstable; urgency=medium + + * control: Drop libsphinxbase-dev dependency. + + -- Samuel Thibault Tue, 17 Feb 2026 23:14:02 +0100 + +pocketsphinx (5.0.4-2) unstable; urgency=medium + + * rules: Re-enable testsuite on 64bit big-endian archs. + * copyright: Fix licensing of patches/, add licence of src/jsmn.h. + + -- Samuel Thibault Tue, 17 Feb 2026 10:40:48 +0100 + +pocketsphinx (5.0.4-1) unstable; urgency=medium + + [ Samuel Thibault ] + * New upstream release (Closes: Bug#1043582) + - Rename libpocketsphinx3 to libpocketsphinx5 according to soname bump. + - control: Drop libsphinxbase-dev build-dep, add graphviz, cmake, sox, + libpulse-dev, portaudio19-dev build-deps. + - Drop swig-pocketsphinx package. + - copyright: Update. + - libpocketsphinx-dev.install: libpocketsphinx.a is not getting built any + more. + - rules: Drop --without-python configure option, pass -DBUILD_GSTREAMER=ON + -DBUILD_SHARED_LIBS=ON. + - rules: Fix the test target: upstream uses "check", not "test". + * watch: Update URL. + * control: Replace pkg-config deps with pkgconf. + * tests/tests: Always unpatch on exit. + + [ Gabor Karsay ] + * Update Standards-Version 4.7.3, removing redundant Priority field + * Bump debhelper-compat to 13 + * Remove redundant Rules-Require-Root field + * watch: + - Convert to version 5 + - Drop sf.net + - Search stable versions only + * patches: + - 4 patches with fixes for manual pages + - Change "check" target to add arguments for testing + - Upstream patch dropping pygtkcompat (Closes: Bug#1118277) + * rules: Exclude failing tests on i386 + * autopkgtest: + - Fix tests-patches + - Exclude failing tests on i386 + * Override package-contains-documentation-outside-usr-share-doc + + [ Debian Janitor ] + * Use secure URI in debian/watch. + * Use secure URI in Homepage field. + * Update standards version to 4.6.1, no changes needed. + + -- Samuel Thibault Sat, 14 Feb 2026 15:02:03 +0100 + +pocketsphinx (0.8+5prealpha+1-15) unstable; urgency=medium + + [ Debian Janitor ] + * Remove constraints unnecessary since buster: + + Build-Depends: Drop versioned constraint on libsphinxbase-dev. + + [ Samuel Thibault ] + * watch: Use tags instead of releases. + * patches/avoid-underflow: Avoid underflow in GMM computation + (Closes: #812335) + + -- Samuel Thibault Wed, 28 Sep 2022 22:56:35 +0200 + +pocketsphinx (0.8+5prealpha+1-14) unstable; urgency=medium + + [ Helmut Grohne ] + * Drop unused Build-Depends: swig-sphinxbase, gstreamer1.0-plugins-base, + swig, libjs-jquery. (Closes: Bug#981418) + + [ Samuel Thibault ] + * control: Set Rules-Requires-Root to no. + * control: Bump Standards-Version to 4.6.0 (no change) + + -- Samuel Thibault Sat, 08 Jan 2022 20:17:48 +0100 + pocketsphinx (0.8+5prealpha+1-13) unstable; urgency=medium * Bump debhelper from 10 to 12. diff --git a/debian/control b/debian/control index 3ce54e5..c9b8a78 100644 --- a/debian/control +++ b/debian/control @@ -1,15 +1,12 @@ Source: pocketsphinx -Priority: optional Maintainer: Debian Accessibility Team Uploaders: Samuel Thibault -Build-Depends: debhelper-compat (= 12), pkg-config, doxygen, - libsphinxbase-dev (>= 0.8+5prealpha~), swig-sphinxbase, libgstreamer1.0-dev, libgstreamer-plugins-base1.0-dev, - gstreamer1.0-plugins-base, - swig, - libjs-jquery -Standards-Version: 4.5.0 +Build-Depends: debhelper-compat (= 13), pkgconf, doxygen, graphviz, cmake, + libgstreamer1.0-dev, libgstreamer-plugins-base1.0-dev, + sox, libpulse-dev, portaudio19-dev, +Standards-Version: 4.7.3 Section: sound -Homepage: http://cmusphinx.sourceforge.net/ +Homepage: https://cmusphinx.sourceforge.net/ Vcs-Git: https://salsa.debian.org/a11y-team/pocketsphinx.git Vcs-Browser: https://salsa.debian.org/a11y-team/pocketsphinx @@ -58,7 +55,7 @@ Architecture: any Multi-Arch: same Replaces: pocketsphinx (<< 0.8+5prealpha+1-6) Breaks: pocketsphinx (<< 0.8+5prealpha+1-6) -Depends: libpocketsphinx3 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends}, libjs-jquery, libsphinxbase-dev +Depends: libpocketsphinx5 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends}, libjs-jquery Description: Speech recognition tool - front-end library development files CMU Sphinx is a large vocabulary, speaker-independent continuous speech recognition engine. @@ -66,7 +63,7 @@ Description: Speech recognition tool - front-end library development files This package contains header files and static libraries for developing programs that use the Pocket Shinx frontend. -Package: libpocketsphinx3 +Package: libpocketsphinx5 Section: libs Architecture: any Multi-Arch: same @@ -78,18 +75,6 @@ Description: Speech recognition tool - front-end library . This package contains the frontend shared library -Package: swig-pocketsphinx -Section: interpreters -Architecture: all -Multi-Arch: foreign -Depends: ${shlibs:Depends}, ${misc:Depends} -Description: Speech recognition tool - pocketsphinx swig helpers - CMU Sphinx is a large vocabulary, speaker-independent continuous speech - recognition engine. - . - This package contains swig helpers for building pocketsphinx-related swig - bindings. - Package: pocketsphinx-testdata Section: libdevel Architecture: all diff --git a/debian/copyright b/debian/copyright index ee6ce6d..d850cb6 100644 --- a/debian/copyright +++ b/debian/copyright @@ -5,7 +5,25 @@ Source: http://cmusphinx.sourceforge.net/ Files: * Copyright: 1995-2014 Carnegie Mellon University. All rights reserved. 2014-2015 Alpha Cephei Inc. -License: BSD-2 +License: BSD-2-clause + +Files: src/jsmn.h +Copyright: 2010 Serge Zaitsev +License: Expat + +Files: debian/* +Copyright: 2007-2008, David Huggins-Daines + 2009, Michael Nelson + 2009, Siegfried-Angel Gevatter Pujals + 2013 Samuel Thibault +License: GPL-2+ + +Files: debian/patches/* +Copyright: 1995-2014 Carnegie Mellon University. All rights reserved. + 2014-2015 Alpha Cephei Inc. +License: BSD-2-clause + +License: BSD-2-clause Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -34,42 +52,6 @@ License: BSD-2 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -Files: doc/doxy2swig.py -Copyright: Prabhu Ramachandran -Comment: I, elbrus, contacted the creator to clarify exactly which BSD license - is meant, his reply was BSD-3 clause. - https://lists.alioth.debian.org/pipermail/pkg-a11y-devel/Week-of-Mon-20171030/000247.html -License: BSD-3-clause - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - . - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - . - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - . - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - . - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Files: debian/* -Copyright: 2007-2008, David Huggins-Daines - 2009, Michael Nelson - 2009, Siegfried-Angel Gevatter Pujals - 2013 Samuel Thibault License: GPL-2+ This package is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/debian/libpocketsphinx-dev.docs b/debian/libpocketsphinx-dev.docs deleted file mode 100644 index 0bd3136..0000000 --- a/debian/libpocketsphinx-dev.docs +++ /dev/null @@ -1 +0,0 @@ -doc/html diff --git a/debian/libpocketsphinx-dev.install b/debian/libpocketsphinx-dev.install index 76f28fa..7df81cd 100644 --- a/debian/libpocketsphinx-dev.install +++ b/debian/libpocketsphinx-dev.install @@ -1,4 +1,3 @@ usr/include/* -usr/lib/*/lib*.a usr/lib/*/lib*.so usr/lib/*/pkgconfig/* diff --git a/debian/libpocketsphinx3.dirs b/debian/libpocketsphinx5.dirs similarity index 100% rename from debian/libpocketsphinx3.dirs rename to debian/libpocketsphinx5.dirs diff --git a/debian/libpocketsphinx3.install b/debian/libpocketsphinx5.install similarity index 100% rename from debian/libpocketsphinx3.install rename to debian/libpocketsphinx5.install diff --git a/debian/patches/0002-match-names-of-man-pages-and-executables.patch b/debian/patches/0002-match-names-of-man-pages-and-executables.patch new file mode 100644 index 0000000..be75bd9 --- /dev/null +++ b/debian/patches/0002-match-names-of-man-pages-and-executables.patch @@ -0,0 +1,154 @@ +From: Gabor Karsay +Date: Sat, 24 Jan 2026 14:04:21 +0100 +Subject: match names of man pages and executables + +Forwarded: https://github.com/cmusphinx/pocketsphinx/pull/458 +--- + doxygen/CMakeLists.txt | 6 +++--- + doxygen/{sphinx_lm_convert.1 => pocketsphinx_lm_convert.1} | 2 +- + doxygen/{sphinx_lm_convert.1.in => pocketsphinx_lm_convert.1.in} | 6 +++--- + doxygen/{sphinx_lm_eval.1 => pocketsphinx_lm_eval.1} | 8 ++++---- + doxygen/{sphinx_lm_eval.1.in => pocketsphinx_lm_eval.1.in} | 6 +++--- + doxygen/{sphinx_pitch.1 => pocketsphinx_pitch.1} | 6 +++--- + doxygen/{sphinx_pitch.1.in => pocketsphinx_pitch.1.in} | 6 +++--- + 7 files changed, 20 insertions(+), 20 deletions(-) + rename doxygen/{sphinx_lm_convert.1 => pocketsphinx_lm_convert.1} (96%) + rename doxygen/{sphinx_lm_convert.1.in => pocketsphinx_lm_convert.1.in} (77%) + rename doxygen/{sphinx_lm_eval.1 => pocketsphinx_lm_eval.1} (88%) + rename doxygen/{sphinx_lm_eval.1.in => pocketsphinx_lm_eval.1.in} (79%) + rename doxygen/{sphinx_pitch.1 => pocketsphinx_pitch.1} (94%) + rename doxygen/{sphinx_pitch.1.in => pocketsphinx_pitch.1.in} (76%) + +diff --git a/doxygen/CMakeLists.txt b/doxygen/CMakeLists.txt +index 7b42f7b..5170be8 100644 +--- a/doxygen/CMakeLists.txt ++++ b/doxygen/CMakeLists.txt +@@ -21,8 +21,8 @@ install(FILES + pocketsphinx.1 + pocketsphinx_batch.1 + pocketsphinx_mdef_convert.1 +- sphinx_lm_convert.1 +- sphinx_lm_eval.1 ++ pocketsphinx_lm_convert.1 ++ pocketsphinx_lm_eval.1 + sphinx_lm_sort.1 +- sphinx_pitch.1 ++ pocketsphinx_pitch.1 + DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) +diff --git a/doxygen/sphinx_lm_convert.1 b/doxygen/pocketsphinx_lm_convert.1 +similarity index 96% +rename from doxygen/sphinx_lm_convert.1 +rename to doxygen/pocketsphinx_lm_convert.1 +index 48c1f81..d3ba456 100644 +--- a/doxygen/sphinx_lm_convert.1 ++++ b/doxygen/pocketsphinx_lm_convert.1 +@@ -1,4 +1,4 @@ +-.TH SPHINX_LM_CONVERT 1 "2010-03-18" ++.TH POCKETSPHINX_LM_CONVERT 1 "2010-03-18" + .SH NAME + sphinx_lm_convert \- Convert and manipulate language model files + .SH SYNOPSIS +diff --git a/doxygen/sphinx_lm_convert.1.in b/doxygen/pocketsphinx_lm_convert.1.in +similarity index 77% +rename from doxygen/sphinx_lm_convert.1.in +rename to doxygen/pocketsphinx_lm_convert.1.in +index 923530f..f6f70cb 100644 +--- a/doxygen/sphinx_lm_convert.1.in ++++ b/doxygen/pocketsphinx_lm_convert.1.in +@@ -1,8 +1,8 @@ +-.TH SPHINX_LM_CONVERT 1 "2010-03-18" ++.TH POCKETSPHINX_LM_CONVERT 1 "2010-03-18" + .SH NAME +-sphinx_lm_convert \- Convert and manipulate language model files ++pocketsphinx_lm_convert \- Convert and manipulate language model files + .SH SYNOPSIS +-.B sphinx_lm_convert ++.B pocketsphinx_lm_convert + [\fI options \fR]... + .SH DESCRIPTION + .PP +diff --git a/doxygen/sphinx_lm_eval.1 b/doxygen/pocketsphinx_lm_eval.1 +similarity index 88% +rename from doxygen/sphinx_lm_eval.1 +rename to doxygen/pocketsphinx_lm_eval.1 +index 40c7af0..2a7ef1b 100644 +--- a/doxygen/sphinx_lm_eval.1 ++++ b/doxygen/pocketsphinx_lm_eval.1 +@@ -1,8 +1,8 @@ +-.TH SPHINX_LM_EVAL 1 "2008-05-12" ++.TH POCKETSPHINX_LM_EVAL 1 "2008-05-12" + .SH NAME +-sphinx_lm_eval \- Evaluate perplexity of a transcription ++pocketsphinx_lm_eval \- Evaluate perplexity of a transcription + .SH SYNOPSIS +-.B sphinx_lm_eval ++.B pocketsphinx_lm_eval + [\fI options \fR]... + .SH DESCRIPTION + .PP +@@ -38,7 +38,7 @@ Use memory-mapped I/O for reading binary LM files + definition file for classes in LM + .TP + .B \-text +-string to evaluate ++string to evaluate + .TP + .B \-uw + Unigram probability weight (interpolated with uniform distribution) +diff --git a/doxygen/sphinx_lm_eval.1.in b/doxygen/pocketsphinx_lm_eval.1.in +similarity index 79% +rename from doxygen/sphinx_lm_eval.1.in +rename to doxygen/pocketsphinx_lm_eval.1.in +index a702333..d2dd5fe 100644 +--- a/doxygen/sphinx_lm_eval.1.in ++++ b/doxygen/pocketsphinx_lm_eval.1.in +@@ -1,8 +1,8 @@ +-.TH SPHINX_LM_EVAL 1 "2008-05-12" ++.TH POCKETSPHINX_LM_EVAL 1 "2008-05-12" + .SH NAME +-sphinx_lm_eval \- Evaluate perplexity of a transcription ++pocketsphinx_lm_eval \- Evaluate perplexity of a transcription + .SH SYNOPSIS +-.B sphinx_lm_eval ++.B pocketsphinx_lm_eval + [\fI options \fR]... + .SH DESCRIPTION + .PP +diff --git a/doxygen/sphinx_pitch.1 b/doxygen/pocketsphinx_pitch.1 +similarity index 94% +rename from doxygen/sphinx_pitch.1 +rename to doxygen/pocketsphinx_pitch.1 +index cc1b4e3..4f2b931 100644 +--- a/doxygen/sphinx_pitch.1 ++++ b/doxygen/pocketsphinx_pitch.1 +@@ -1,8 +1,8 @@ +-.TH SPHINX_PITCH 1 "2007-05-12" ++.TH POCKETSPHINX_PITCH 1 "2007-05-12" + .SH NAME +-sphinx_pitch \- Extract pitch from audio files ++spocketphinx_pitch \- Extract pitch from audio files + .SH SYNOPSIS +-.B sphinx_pitch ++.B pocketsphinx_pitch + [\fI options \fR]... + .SH DESCRIPTION + .PP +diff --git a/doxygen/sphinx_pitch.1.in b/doxygen/pocketsphinx_pitch.1.in +similarity index 76% +rename from doxygen/sphinx_pitch.1.in +rename to doxygen/pocketsphinx_pitch.1.in +index 3b21726..c2fb56f 100644 +--- a/doxygen/sphinx_pitch.1.in ++++ b/doxygen/pocketsphinx_pitch.1.in +@@ -1,8 +1,8 @@ +-.TH SPHINX_PITCH 1 "2007-05-12" ++.TH POCKETSPHINX_PITCH 1 "2007-05-12" + .SH NAME +-sphinx_pitch \- Extract pitch from audio files ++pocketsphinx_pitch \- Extract pitch from audio files + .SH SYNOPSIS +-.B sphinx_pitch ++.B pocketsphinx_pitch + [\fI options \fR]... + .SH DESCRIPTION + .PP diff --git a/debian/patches/0003-fix-man-page-reference.patch b/debian/patches/0003-fix-man-page-reference.patch new file mode 100644 index 0000000..6aef787 --- /dev/null +++ b/debian/patches/0003-fix-man-page-reference.patch @@ -0,0 +1,37 @@ +From: Gabor Karsay +Date: Sat, 24 Jan 2026 14:22:47 +0100 +Subject: fix man page reference + +Forwarded: https://github.com/cmusphinx/pocketsphinx/pull/458 + +pocketsphinx_continuous is now pocketsphinx. +--- + doxygen/pocketsphinx_batch.1 | 2 +- + doxygen/pocketsphinx_batch.1.in | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/doxygen/pocketsphinx_batch.1 b/doxygen/pocketsphinx_batch.1 +index be56272..8e660af 100644 +--- a/doxygen/pocketsphinx_batch.1 ++++ b/doxygen/pocketsphinx_batch.1 +@@ -452,6 +452,6 @@ Copyright \(co 1994-2016 Carnegie Mellon University. See the file + \fILICENSE\fR included with this package for more information. + .br + .SH "SEE ALSO" +-.BR pocketsphinx_continuous (1), ++.BR pocketsphinx (1), + .BR sphinx_fe (1). + .br +diff --git a/doxygen/pocketsphinx_batch.1.in b/doxygen/pocketsphinx_batch.1.in +index be41c7e..48c6313 100644 +--- a/doxygen/pocketsphinx_batch.1.in ++++ b/doxygen/pocketsphinx_batch.1.in +@@ -42,6 +42,6 @@ Copyright \(co 1994-2016 Carnegie Mellon University. See the file + \fILICENSE\fR included with this package for more information. + .br + .SH "SEE ALSO" +-.BR pocketsphinx_continuous (1), ++.BR pocketsphinx (1), + .BR sphinx_fe (1). + .br +\ No newline at end of file diff --git a/debian/patches/0004-don-t-install-man-pages-without-executables.patch b/debian/patches/0004-don-t-install-man-pages-without-executables.patch new file mode 100644 index 0000000..5a34ebe --- /dev/null +++ b/debian/patches/0004-don-t-install-man-pages-without-executables.patch @@ -0,0 +1,22 @@ +From: Gabor Karsay +Date: Sat, 24 Jan 2026 14:26:56 +0100 +Subject: don't install man pages without executables + +Forwarded: https://github.com/cmusphinx/pocketsphinx/pull/458 + +There is no executable sphinx_lm_sort. +--- + doxygen/CMakeLists.txt | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/doxygen/CMakeLists.txt b/doxygen/CMakeLists.txt +index 5170be8..22b0c5c 100644 +--- a/doxygen/CMakeLists.txt ++++ b/doxygen/CMakeLists.txt +@@ -23,6 +23,5 @@ install(FILES + pocketsphinx_mdef_convert.1 + pocketsphinx_lm_convert.1 + pocketsphinx_lm_eval.1 +- sphinx_lm_sort.1 + pocketsphinx_pitch.1 + DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) diff --git a/debian/patches/0005-fix-typos-in-man-pages.patch b/debian/patches/0005-fix-typos-in-man-pages.patch new file mode 100644 index 0000000..65e2e8e --- /dev/null +++ b/debian/patches/0005-fix-typos-in-man-pages.patch @@ -0,0 +1,25 @@ +From: Gabor Karsay +Date: Sat, 24 Jan 2026 14:44:43 +0100 +Subject: fix typos in man pages + +Forwarded: https://github.com/cmusphinx/pocketsphinx/pull/458 + +Typo and acute-accent-in-manual-page. +--- + doxygen/pocketsphinx.1 | 2 +- + doxygen/pocketsphinx_lm_convert.1 | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/doxygen/pocketsphinx_lm_convert.1 b/doxygen/pocketsphinx_lm_convert.1 +index d3ba456..5904c76 100644 +--- a/doxygen/pocketsphinx_lm_convert.1 ++++ b/doxygen/pocketsphinx_lm_convert.1 +@@ -12,7 +12,7 @@ of the text in a language model file and to force word strings + to upper or lower case. + .TP + .B \-case +-\'lower\' or \'upper\' - case fold to lower/upper case (NOT UNICODE AWARE) ++\(aqlower' or \(aqupper' - case fold to lower/upper case (NOT UNICODE AWARE) + .TP + .B \-debug + level for debugging messages diff --git a/debian/patches/0006-check-target-build-only.patch b/debian/patches/0006-check-target-build-only.patch new file mode 100644 index 0000000..439fb8a --- /dev/null +++ b/debian/patches/0006-check-target-build-only.patch @@ -0,0 +1,25 @@ +From: Gabor Karsay +Date: Mon, 26 Jan 2026 21:24:59 +0100 +Subject: check-target-build-only + +Forwarded: not-needed + +make targets don't accept arguments. Change it to a build-only target +and run ctest afterwards with arguments, e.g. --verbose. +--- + CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index e363bbd..bfd7b1f 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -15,7 +15,7 @@ set(PACKAGE_BUGREPORT dhdaines@gmail.com) + + if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) + include(CTest) +- add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}) ++ add_custom_target(check) + endif() + + include(CheckTypeSize) diff --git a/debian/patches/0007-drop-pygtkcompat.patch b/debian/patches/0007-drop-pygtkcompat.patch new file mode 100644 index 0000000..41bbc53 --- /dev/null +++ b/debian/patches/0007-drop-pygtkcompat.patch @@ -0,0 +1,86 @@ +From: Gabor Karsay +Date: Wed, 28 Jan 2026 20:32:58 +0100 +Subject: drop pygtkcompat + +commit: d09a9520a6180c7ae6a1cd16224e55ac9c4c9028 +Author: Kevin Lenzo +Date: Thu Oct 23 14:15:47 2025 -0400 + + Remove deprecated pygtkcompat dependency from livedemo.py + + Replace pygtkcompat with modern PyGObject 3.x API to fix compatibility + with current PyGObject versions. The pygtkcompat module was removed + after PyGObject 3.50.x series and is no longer available. + + Changes: + - Remove pygtkcompat import and enable calls + - Add gi.require_version('Gtk', '3.0') requirement + - Update GTK API calls to use Gtk.* instead of gtk.* + - Update wrap mode constant to Gtk.WrapMode.WORD + - Update main loop call to Gtk.main() + + Fixes Debian bug #1118277 +--- + gst/livedemo.py | 27 +++++++++++---------------- + 1 file changed, 11 insertions(+), 16 deletions(-) + +diff --git a/gst/livedemo.py b/gst/livedemo.py +index 8728009..b97b58f 100644 +--- a/gst/livedemo.py ++++ b/gst/livedemo.py +@@ -6,22 +6,17 @@ + # the CMU Sphinx system. See LICENSE for more information. + + +-from gi import pygtkcompat + import gi + + gi.require_version('Gst', '1.0') +-from gi.repository import GObject, Gst ++gi.require_version('Gtk', '3.0') ++from gi.repository import GObject, Gst, Gtk + GObject.threads_init() + Gst.init(None) + + gst = Gst + +-print("Using pygtkcompat and Gst from gi") +- +-pygtkcompat.enable() +-pygtkcompat.enable_gtk(version='3.0') +- +-import gtk ++print("Using PyGObject and Gst from gi") + + class DemoApp(object): + """GStreamer/PocketSphinx Demo Application""" +@@ -32,16 +27,16 @@ class DemoApp(object): + + def init_gui(self): + """Initialize the GUI components""" +- self.window = gtk.Window() +- self.window.connect("delete-event", gtk.main_quit) ++ self.window = Gtk.Window() ++ self.window.connect("delete-event", Gtk.main_quit) + self.window.set_default_size(400,200) + self.window.set_border_width(10) +- vbox = gtk.VBox() +- self.textbuf = gtk.TextBuffer() +- self.text = gtk.TextView(buffer=self.textbuf) +- self.text.set_wrap_mode(gtk.WRAP_WORD) ++ vbox = Gtk.VBox() ++ self.textbuf = Gtk.TextBuffer() ++ self.text = Gtk.TextView(buffer=self.textbuf) ++ self.text.set_wrap_mode(Gtk.WrapMode.WORD) + vbox.pack_start(self.text) +- self.button = gtk.ToggleButton("Speak") ++ self.button = Gtk.ToggleButton("Speak") + self.button.connect('clicked', self.button_clicked) + vbox.pack_start(self.button, False, False, 5) + self.window.add(vbox) +@@ -101,4 +96,4 @@ class DemoApp(object): + self.pipeline.set_state(gst.State.PAUSED) + + app = DemoApp() +-gtk.main() ++Gtk.main() diff --git a/debian/patches/fix-spelling-mistakes-found-by-lintian.patch b/debian/patches/fix-spelling-mistakes-found-by-lintian.patch deleted file mode 100644 index c853c80..0000000 --- a/debian/patches/fix-spelling-mistakes-found-by-lintian.patch +++ /dev/null @@ -1,16 +0,0 @@ -Description: Lintian found spelling mistakes -Author: Paul Gevers - -Index: pocketsphinx/src/libpocketsphinx/mdef.c -=================================================================== ---- pocketsphinx.orig/src/libpocketsphinx/mdef.c -+++ pocketsphinx/src/libpocketsphinx/mdef.c -@@ -348,7 +348,7 @@ parse_base_line(mdef_t * m, char *line, - - /* Read filler attribute, if present */ - if (sscanf(lp, "%s%n", word, &wlen) != 1) -- E_FATAL("Missing filler atribute field: %s\n", line); -+ E_FATAL("Missing filler attribute field: %s\n", line); - lp += wlen; - if (strcmp(word, "filler") == 0) - m->ciphone[(int) ci].filler = 1; diff --git a/debian/patches/pkg-config b/debian/patches/pkg-config deleted file mode 100644 index e549329..0000000 --- a/debian/patches/pkg-config +++ /dev/null @@ -1,44 +0,0 @@ -https://github.com/cmusphinx/pocketsphinx/pull/202 - -merged - -commit 4e3dfd98116b1b0eadc39a9c9372e9b316fadc52 -Author: Helmut Grohne -Date: Sat Mar 28 14:52:36 2020 +0100 - - Fix pkg-config use for cross-compilation - - PKG_PROG_PKG_CONFIG properly detects the cross-compilation pkg-config - when cross-compilation is requested. - -diff --git a/configure.ac b/configure.ac -index b192885..dad7fc5 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -18,7 +18,7 @@ LT_INIT - dnl - dnl Check for pkgconfig - dnl --AC_CHECK_PROG(HAVE_PKGCONFIG, pkg-config, yes, no) -+PKG_PROG_PKG_CONFIG - - dnl - dnl Check for Doxygen, and build dox if present -@@ -117,7 +117,7 @@ dnl - if test x$sphinxbase = x || test x$sphinxbase = xauto; then - sphinxbase= - -- if test "x$HAVE_PKGCONFIG" = "xno"; then -+ if test "x$PKG_CONFIG" = "x"; then - SPHINXBASE_CFLAGS = "-I/usr/include/sphinxbase -I/usr/local/include/sphinxbase" - SPHINXBASE_LIBS = "-lsphinxbase" - SPHINXBASE_PREFIX="/usr/local" -@@ -128,7 +128,7 @@ if test x$sphinxbase = x || test x$sphinxbase = xauto; then - Make sure that you have installed it and that the - PKG_CONFIG_PATH environment variable is set correctly, if - it was installed in a non-standard prefix.])]) -- SPHINXBASE_PREFIX=`pkg-config --variable=prefix sphinxbase` -+ SPHINXBASE_PREFIX=`$PKG_CONFIG --variable=prefix sphinxbase` - fi - - LIBS="$LIBS $SPHINXBASE_LIBS" diff --git a/debian/patches/series b/debian/patches/series index 3f5f26c..60688f9 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,4 +1,6 @@ -fix-spelling-mistakes-found-by-lintian.patch -use_encoding - -pkg-config +0002-match-names-of-man-pages-and-executables.patch +0003-fix-man-page-reference.patch +0004-don-t-install-man-pages-without-executables.patch +0005-fix-typos-in-man-pages.patch +0006-check-target-build-only.patch +0007-drop-pygtkcompat.patch diff --git a/debian/patches/use_encoding b/debian/patches/use_encoding deleted file mode 100644 index 018d33e..0000000 --- a/debian/patches/use_encoding +++ /dev/null @@ -1,15 +0,0 @@ ---- - test/word_align.pl | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/test/word_align.pl -+++ b/test/word_align.pl -@@ -11,7 +11,7 @@ use strict; - use Getopt::Long; - use Pod::Usage; - use vars qw($Verbose $CER $IgnoreUttID); --use encoding 'utf8'; -+use utf8; - - my ($help,%hyphash); - GetOptions( diff --git a/debian/pocketsphinx-en-us.lintian-overrides b/debian/pocketsphinx-en-us.lintian-overrides new file mode 100644 index 0000000..d24ce06 --- /dev/null +++ b/debian/pocketsphinx-en-us.lintian-overrides @@ -0,0 +1,2 @@ +# File describes contents of directory it is in +pocketsphinx-en-us: package-contains-documentation-outside-usr-share-doc [usr/share/pocketsphinx/model/en-us/en-us/README] diff --git a/debian/pocketsphinx-hmm-en-hub4wsj.install b/debian/pocketsphinx-hmm-en-hub4wsj.install deleted file mode 100644 index 1d9c3c9..0000000 --- a/debian/pocketsphinx-hmm-en-hub4wsj.install +++ /dev/null @@ -1 +0,0 @@ -/usr/share/pocketsphinx/model/hmm/en_US/hub4wsj_sc_8k diff --git a/debian/pocketsphinx-testdata.lintian-overrides b/debian/pocketsphinx-testdata.lintian-overrides new file mode 100644 index 0000000..8c7f38d --- /dev/null +++ b/debian/pocketsphinx-testdata.lintian-overrides @@ -0,0 +1,2 @@ +# Files are test files (textual representation of audio) +pocketsphinx-testdata: package-contains-documentation-outside-usr-share-doc [usr/share/pocketsphinx/test/data/librivox/sense_and_sensibility_01_austen_*.txt] \ No newline at end of file diff --git a/debian/rules b/debian/rules index c4c32f3..f8b5929 100755 --- a/debian/rules +++ b/debian/rules @@ -2,17 +2,20 @@ export DEB_BUILD_MAINT_OPTIONS = hardening=+all +TEST_ARGS = --verbose +ifeq (i386,$(DEB_HOST_ARCH)) +TEST_ARGS += ARGS\+="--exclude-regex 'test-main\.sh|test_endpointer|test_vad'" +endif + %: dh $@ override_dh_auto_configure: - dh_auto_configure -- --without-python + dh_auto_configure -- -DBUILD_GSTREAMER=ON -DBUILD_SHARED_LIBS=ON -ifeq (big,$(shell dpkg-architecture -qDEB_BUILD_ARCH_ENDIAN)) override_dh_auto_test: - echo "Big-endian archs do not work yet and create hundreds of gigabytes of log, don't even try for now." - false -endif + cd obj-$(DEB_HOST_GNU_TYPE) && $(MAKE) check + dh_auto_test --buildsystem=cmake -- ARGS\+=$(TEST_ARGS) override_dh_auto_install: dh_auto_install @@ -22,5 +25,5 @@ override_dh_auto_install: override_dh_shlibdeps: dh_shlibdeps - LD_LIBRARY_PATH=debian/libpocketsphinx3/usr/lib/$(DEB_HOST_MULTIARCH):$(LD_LIBRARY_PATH) \ + LD_LIBRARY_PATH=debian/libpocketsphinx5/usr/lib/$(DEB_HOST_MULTIARCH):$(LD_LIBRARY_PATH) \ dh_gstscancodecs diff --git a/debian/salsa-ci.yml b/debian/salsa-ci.yml index 36ff5ca..b7766a6 100644 --- a/debian/salsa-ci.yml +++ b/debian/salsa-ci.yml @@ -1,6 +1,11 @@ --- include: - - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml - - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml + - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/recipes/debian.yml + +variables: + SALSA_CI_REPROTEST_ENABLE_DIFFOSCOPE: 1 + + # needs cross-gstreamer + SALSA_CI_DISABLE_CROSSBUILD_ARM64: 1 # vim: ts=2 sw=2 et sts=2 ft=yaml diff --git a/debian/swig-pocketsphinx.install b/debian/swig-pocketsphinx.install deleted file mode 100644 index 4500949..0000000 --- a/debian/swig-pocketsphinx.install +++ /dev/null @@ -1 +0,0 @@ -/usr/share/pocketsphinx/swig diff --git a/debian/tests-patches/build-tests-use-system-pocketsphinx.patch b/debian/tests-patches/build-tests-use-system-pocketsphinx.patch new file mode 100644 index 0000000..c0fda6b --- /dev/null +++ b/debian/tests-patches/build-tests-use-system-pocketsphinx.patch @@ -0,0 +1,32 @@ +From: Gabor Karsay +Date: Tue, 27 Jan 2026 18:38:32 +0100 +Subject: build tests using system pocketsphinx + +--- + test/unit/CMakeLists.txt | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt +index af108b7..2b3579d 100644 +--- a/test/unit/CMakeLists.txt ++++ b/test/unit/CMakeLists.txt +@@ -34,13 +34,16 @@ set(TESTS + test_word_align + test_endpointer + ) ++ ++find_package(PkgConfig REQUIRED) ++pkg_check_modules(POCKETSPHINX_SYSTEM pocketsphinx) ++ + foreach(TEST_EXECUTABLE ${TESTS}) + add_executable(${TEST_EXECUTABLE} EXCLUDE_FROM_ALL ${TEST_EXECUTABLE}.c) +- target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) ++ target_link_libraries(${TEST_EXECUTABLE} ${POCKETSPHINX_SYSTEM_LIBRARIES}) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src +- ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ++ ${TEST_EXECUTABLE} PRIVATE ${POCKETSPHINX_SYSTEM_INCLUDE_DIRS} + ) + add_test(NAME ${TEST_EXECUTABLE} COMMAND ${TEST_EXECUTABLE}) + add_dependencies(check ${TEST_EXECUTABLE}) diff --git a/debian/tests-patches/series b/debian/tests-patches/series deleted file mode 100644 index 9874100..0000000 --- a/debian/tests-patches/series +++ /dev/null @@ -1 +0,0 @@ -use_system_pocketsphinx diff --git a/debian/tests-patches/testfuncs-use-system-pocketsphinx.patch b/debian/tests-patches/testfuncs-use-system-pocketsphinx.patch new file mode 100644 index 0000000..83ed854 --- /dev/null +++ b/debian/tests-patches/testfuncs-use-system-pocketsphinx.patch @@ -0,0 +1,21 @@ +From: Gabor Karsay +Date: Tue, 27 Jan 2026 18:23:49 +0100 +Subject: testfuncs use system pocketsphinx + +--- + test/testfuncs.sh.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/test/testfuncs.sh.in b/test/testfuncs.sh.in +index f87c005..7c98505 100644 +--- a/test/testfuncs.sh.in ++++ b/test/testfuncs.sh.in +@@ -7,7 +7,7 @@ sourcedir="@CMAKE_SOURCE_DIR@" + tests=$sourcedir/test + data=$sourcedir/test/data + model=$sourcedir/model +-programs=$builddir ++programs=/usr/bin + + # Automatically report failures on exit + failures="" diff --git a/debian/tests-patches/use_system_pocketsphinx b/debian/tests-patches/use_system_pocketsphinx deleted file mode 100644 index eefa3a5..0000000 --- a/debian/tests-patches/use_system_pocketsphinx +++ /dev/null @@ -1,64 +0,0 @@ ---- - test/testfuncs.sh.in | 6 +++--- - test/testfuncs_cygwin.sh | 2 +- - test/unit/Makefile.am | 8 ++++---- - 3 files changed, 8 insertions(+), 8 deletions(-) - ---- a/test/testfuncs_cygwin.sh -+++ b/test/testfuncs_cygwin.sh -@@ -17,7 +17,7 @@ trap "report_failures" 0 - run_program() { - program=`basename $1` - shift -- "$builddir/$program" $@ -+ "/usr/bin/$program" $@ - } - - debug_program() { ---- a/test/unit/Makefile.am -+++ b/test/unit/Makefile.am -@@ -30,15 +30,15 @@ EXTRA_DIST = test_ps.c - - noinst_HEADERS = test_macros.h - --AM_CFLAGS =-I$(top_srcdir)/include \ -+AM_CFLAGS = \ - -I$(top_srcdir)/src/libpocketsphinx \ -- -I$(top_builddir)/include \ -- -I$(srcdir) \ -+ $(shell pkg-config --cflags pocketsphinx) \ -+ -I$(top_srcdir)/debian/tests/include \ - -DMODELDIR=\"${top_srcdir}/model\" \ - -DDATADIR=\"${top_srcdir}/test/data\" - - LDADD = \ -- $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la \ -+ -lpocketsphinx \ - -lsphinxbase - - CLEANFILES = *.log *.out *.lat *.mfc *.raw *.dic *.sen ---- a/test/testfuncs.sh.in -+++ b/test/testfuncs.sh.in -@@ -16,19 +16,19 @@ trap "report_failures" 0 - run_program() { - program="$1" - shift -- $builddir/libtool --mode=execute "$programs/$program" $@ -+ "/usr/bin/$program" $@ - } - - debug_program() { - program="$1" - shift -- $builddir/libtool --mode=execute gdb --args "$programs/$program" $@ -+ gdb --args "/usr/bin/$program" $@ - } - - memcheck_program() { - program="$1" - shift -- $builddir/libtool --mode=execute valgrind --leak-check=full "$programs/$program" $@ -+ valgrind --leak-check=full "/usr/bin/$program" $@ - } - - pass() { diff --git a/debian/tests/tests b/debian/tests/tests index 5afad1e..78d2523 100644 --- a/debian/tests/tests +++ b/debian/tests/tests @@ -5,12 +5,19 @@ set -e WORKDIR=$AUTOPKGTEST_TMP SRCDIR=$PWD -patch -p1 < debian/tests-patches/use_system_pocketsphinx 2>&1 || true +cd $SRCDIR + +patch -p1 < debian/tests-patches/testfuncs-use-system-pocketsphinx.patch 2>&1 || true +patch -p1 < debian/tests-patches/build-tests-use-system-pocketsphinx.patch 2>&1 || true dh_autoreconf 2>&1 -dh_auto_configure -- --without-python 2>&1 +dh_auto_configure 2>&1 dh_auto_build 2>&1 -dh_auto_test 2>&1 +cd obj-$(dpkg-architecture -qDEB_HOST_GNU_TYPE) && make check 2>&1 && cd .. -cd $SRCDIR -patch -p1 -R < debian/tests-patches/use_system_pocketsphinx +TEST_ARGS= +if [ "$(dpkg-architecture -qDEB_HOST_ARCH)" = "i386" ] ; then +TEST_ARGS="--exclude-regex 'test-main\.sh|test_endpointer|test_vad'" +fi + +dh_auto_test --buildsystem=cmake -- ARGS\+="$TEST_ARGS" \ No newline at end of file diff --git a/debian/watch b/debian/watch index 6689e48..c067c94 100644 --- a/debian/watch +++ b/debian/watch @@ -1,7 +1,6 @@ -version=3 -opts= \ -dversionmangle=s/0.8\+//;s/(5prealpha)\+1/$1/ \ -http://sf.net/cmusphinx/ pocketsphinx(?:[_\-]v?|)(\d[^\s/]*)\.(?:tar\.xz|txz|tar\.bz2|tbz2|tar\.gz|tgz) -opts=filenamemangle=s/.+\/v?(@ANY_VERSION@@ARCHIVE_EXT@)/pocketsphinx-$1/ \ - https://github.com/cmusphinx/pocketsphinx/releases .*/.*@ANY_VERSION@@ARCHIVE_EXT@ +Version: 5 +Template: GitHub +Owner: cmusphinx +Project: pocketsphinx +Version-Type: STABLE_VERSION \ No newline at end of file diff --git a/depcomp b/depcomp deleted file mode 100755 index 4ebd5b3..0000000 --- a/depcomp +++ /dev/null @@ -1,791 +0,0 @@ -#! /bin/sh -# depcomp - compile a program generating dependencies as side-effects - -scriptversion=2013-05-30.07; # UTC - -# Copyright (C) 1999-2013 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Originally written by Alexandre Oliva . - -case $1 in - '') - echo "$0: No command. Try '$0 --help' for more information." 1>&2 - exit 1; - ;; - -h | --h*) - cat <<\EOF -Usage: depcomp [--help] [--version] PROGRAM [ARGS] - -Run PROGRAMS ARGS to compile a file, generating dependencies -as side-effects. - -Environment variables: - depmode Dependency tracking mode. - source Source file read by 'PROGRAMS ARGS'. - object Object file output by 'PROGRAMS ARGS'. - DEPDIR directory where to store dependencies. - depfile Dependency file to output. - tmpdepfile Temporary file to use when outputting dependencies. - libtool Whether libtool is used (yes/no). - -Report bugs to . -EOF - exit $? - ;; - -v | --v*) - echo "depcomp $scriptversion" - exit $? - ;; -esac - -# Get the directory component of the given path, and save it in the -# global variables '$dir'. Note that this directory component will -# be either empty or ending with a '/' character. This is deliberate. -set_dir_from () -{ - case $1 in - */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; - *) dir=;; - esac -} - -# Get the suffix-stripped basename of the given path, and save it the -# global variable '$base'. -set_base_from () -{ - base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` -} - -# If no dependency file was actually created by the compiler invocation, -# we still have to create a dummy depfile, to avoid errors with the -# Makefile "include basename.Plo" scheme. -make_dummy_depfile () -{ - echo "#dummy" > "$depfile" -} - -# Factor out some common post-processing of the generated depfile. -# Requires the auxiliary global variable '$tmpdepfile' to be set. -aix_post_process_depfile () -{ - # If the compiler actually managed to produce a dependency file, - # post-process it. - if test -f "$tmpdepfile"; then - # Each line is of the form 'foo.o: dependency.h'. - # Do two passes, one to just change these to - # $object: dependency.h - # and one to simply output - # dependency.h: - # which is needed to avoid the deleted-header problem. - { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" - sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" - } > "$depfile" - rm -f "$tmpdepfile" - else - make_dummy_depfile - fi -} - -# A tabulation character. -tab=' ' -# A newline character. -nl=' -' -# Character ranges might be problematic outside the C locale. -# These definitions help. -upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ -lower=abcdefghijklmnopqrstuvwxyz -digits=0123456789 -alpha=${upper}${lower} - -if test -z "$depmode" || test -z "$source" || test -z "$object"; then - echo "depcomp: Variables source, object and depmode must be set" 1>&2 - exit 1 -fi - -# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. -depfile=${depfile-`echo "$object" | - sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} -tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} - -rm -f "$tmpdepfile" - -# Avoid interferences from the environment. -gccflag= dashmflag= - -# Some modes work just like other modes, but use different flags. We -# parameterize here, but still list the modes in the big case below, -# to make depend.m4 easier to write. Note that we *cannot* use a case -# here, because this file can only contain one case statement. -if test "$depmode" = hp; then - # HP compiler uses -M and no extra arg. - gccflag=-M - depmode=gcc -fi - -if test "$depmode" = dashXmstdout; then - # This is just like dashmstdout with a different argument. - dashmflag=-xM - depmode=dashmstdout -fi - -cygpath_u="cygpath -u -f -" -if test "$depmode" = msvcmsys; then - # This is just like msvisualcpp but w/o cygpath translation. - # Just convert the backslash-escaped backslashes to single forward - # slashes to satisfy depend.m4 - cygpath_u='sed s,\\\\,/,g' - depmode=msvisualcpp -fi - -if test "$depmode" = msvc7msys; then - # This is just like msvc7 but w/o cygpath translation. - # Just convert the backslash-escaped backslashes to single forward - # slashes to satisfy depend.m4 - cygpath_u='sed s,\\\\,/,g' - depmode=msvc7 -fi - -if test "$depmode" = xlc; then - # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. - gccflag=-qmakedep=gcc,-MF - depmode=gcc -fi - -case "$depmode" in -gcc3) -## gcc 3 implements dependency tracking that does exactly what -## we want. Yay! Note: for some reason libtool 1.4 doesn't like -## it if -MD -MP comes after the -MF stuff. Hmm. -## Unfortunately, FreeBSD c89 acceptance of flags depends upon -## the command line argument order; so add the flags where they -## appear in depend2.am. Note that the slowdown incurred here -## affects only configure: in makefiles, %FASTDEP% shortcuts this. - for arg - do - case $arg in - -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; - *) set fnord "$@" "$arg" ;; - esac - shift # fnord - shift # $arg - done - "$@" - stat=$? - if test $stat -ne 0; then - rm -f "$tmpdepfile" - exit $stat - fi - mv "$tmpdepfile" "$depfile" - ;; - -gcc) -## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. -## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. -## (see the conditional assignment to $gccflag above). -## There are various ways to get dependency output from gcc. Here's -## why we pick this rather obscure method: -## - Don't want to use -MD because we'd like the dependencies to end -## up in a subdir. Having to rename by hand is ugly. -## (We might end up doing this anyway to support other compilers.) -## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like -## -MM, not -M (despite what the docs say). Also, it might not be -## supported by the other compilers which use the 'gcc' depmode. -## - Using -M directly means running the compiler twice (even worse -## than renaming). - if test -z "$gccflag"; then - gccflag=-MD, - fi - "$@" -Wp,"$gccflag$tmpdepfile" - stat=$? - if test $stat -ne 0; then - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - echo "$object : \\" > "$depfile" - # The second -e expression handles DOS-style file names with drive - # letters. - sed -e 's/^[^:]*: / /' \ - -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" -## This next piece of magic avoids the "deleted header file" problem. -## The problem is that when a header file which appears in a .P file -## is deleted, the dependency causes make to die (because there is -## typically no way to rebuild the header). We avoid this by adding -## dummy dependencies for each header file. Too bad gcc doesn't do -## this for us directly. -## Some versions of gcc put a space before the ':'. On the theory -## that the space means something, we add a space to the output as -## well. hp depmode also adds that space, but also prefixes the VPATH -## to the object. Take care to not repeat it in the output. -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - tr ' ' "$nl" < "$tmpdepfile" \ - | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ - | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -hp) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -sgi) - if test "$libtool" = yes; then - "$@" "-Wp,-MDupdate,$tmpdepfile" - else - "$@" -MDupdate "$tmpdepfile" - fi - stat=$? - if test $stat -ne 0; then - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - - if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files - echo "$object : \\" > "$depfile" - # Clip off the initial element (the dependent). Don't try to be - # clever and replace this with sed code, as IRIX sed won't handle - # lines with more than a fixed number of characters (4096 in - # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; - # the IRIX cc adds comments like '#:fec' to the end of the - # dependency line. - tr ' ' "$nl" < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ - | tr "$nl" ' ' >> "$depfile" - echo >> "$depfile" - # The second pass generates a dummy entry for each header file. - tr ' ' "$nl" < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ - >> "$depfile" - else - make_dummy_depfile - fi - rm -f "$tmpdepfile" - ;; - -xlc) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -aix) - # The C for AIX Compiler uses -M and outputs the dependencies - # in a .u file. In older versions, this file always lives in the - # current directory. Also, the AIX compiler puts '$object:' at the - # start of each line; $object doesn't have directory information. - # Version 6 uses the directory in both cases. - set_dir_from "$object" - set_base_from "$object" - if test "$libtool" = yes; then - tmpdepfile1=$dir$base.u - tmpdepfile2=$base.u - tmpdepfile3=$dir.libs/$base.u - "$@" -Wc,-M - else - tmpdepfile1=$dir$base.u - tmpdepfile2=$dir$base.u - tmpdepfile3=$dir$base.u - "$@" -M - fi - stat=$? - if test $stat -ne 0; then - rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" - do - test -f "$tmpdepfile" && break - done - aix_post_process_depfile - ;; - -tcc) - # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 - # FIXME: That version still under development at the moment of writing. - # Make that this statement remains true also for stable, released - # versions. - # It will wrap lines (doesn't matter whether long or short) with a - # trailing '\', as in: - # - # foo.o : \ - # foo.c \ - # foo.h \ - # - # It will put a trailing '\' even on the last line, and will use leading - # spaces rather than leading tabs (at least since its commit 0394caf7 - # "Emit spaces for -MD"). - "$@" -MD -MF "$tmpdepfile" - stat=$? - if test $stat -ne 0; then - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. - # We have to change lines of the first kind to '$object: \'. - sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" - # And for each line of the second kind, we have to emit a 'dep.h:' - # dummy dependency, to avoid the deleted-header problem. - sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" - rm -f "$tmpdepfile" - ;; - -## The order of this option in the case statement is important, since the -## shell code in configure will try each of these formats in the order -## listed in this file. A plain '-MD' option would be understood by many -## compilers, so we must ensure this comes after the gcc and icc options. -pgcc) - # Portland's C compiler understands '-MD'. - # Will always output deps to 'file.d' where file is the root name of the - # source file under compilation, even if file resides in a subdirectory. - # The object file name does not affect the name of the '.d' file. - # pgcc 10.2 will output - # foo.o: sub/foo.c sub/foo.h - # and will wrap long lines using '\' : - # foo.o: sub/foo.c ... \ - # sub/foo.h ... \ - # ... - set_dir_from "$object" - # Use the source, not the object, to determine the base name, since - # that's sadly what pgcc will do too. - set_base_from "$source" - tmpdepfile=$base.d - - # For projects that build the same source file twice into different object - # files, the pgcc approach of using the *source* file root name can cause - # problems in parallel builds. Use a locking strategy to avoid stomping on - # the same $tmpdepfile. - lockdir=$base.d-lock - trap " - echo '$0: caught signal, cleaning up...' >&2 - rmdir '$lockdir' - exit 1 - " 1 2 13 15 - numtries=100 - i=$numtries - while test $i -gt 0; do - # mkdir is a portable test-and-set. - if mkdir "$lockdir" 2>/dev/null; then - # This process acquired the lock. - "$@" -MD - stat=$? - # Release the lock. - rmdir "$lockdir" - break - else - # If the lock is being held by a different process, wait - # until the winning process is done or we timeout. - while test -d "$lockdir" && test $i -gt 0; do - sleep 1 - i=`expr $i - 1` - done - fi - i=`expr $i - 1` - done - trap - 1 2 13 15 - if test $i -le 0; then - echo "$0: failed to acquire lock after $numtries attempts" >&2 - echo "$0: check lockdir '$lockdir'" >&2 - exit 1 - fi - - if test $stat -ne 0; then - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - # Each line is of the form `foo.o: dependent.h', - # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. - # Do two passes, one to just change these to - # `$object: dependent.h' and one to simply `dependent.h:'. - sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" - # Some versions of the HPUX 10.20 sed can't process this invocation - # correctly. Breaking it into two sed invocations is a workaround. - sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ - | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -hp2) - # The "hp" stanza above does not work with aCC (C++) and HP's ia64 - # compilers, which have integrated preprocessors. The correct option - # to use with these is +Maked; it writes dependencies to a file named - # 'foo.d', which lands next to the object file, wherever that - # happens to be. - # Much of this is similar to the tru64 case; see comments there. - set_dir_from "$object" - set_base_from "$object" - if test "$libtool" = yes; then - tmpdepfile1=$dir$base.d - tmpdepfile2=$dir.libs/$base.d - "$@" -Wc,+Maked - else - tmpdepfile1=$dir$base.d - tmpdepfile2=$dir$base.d - "$@" +Maked - fi - stat=$? - if test $stat -ne 0; then - rm -f "$tmpdepfile1" "$tmpdepfile2" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" - # Add 'dependent.h:' lines. - sed -ne '2,${ - s/^ *// - s/ \\*$// - s/$/:/ - p - }' "$tmpdepfile" >> "$depfile" - else - make_dummy_depfile - fi - rm -f "$tmpdepfile" "$tmpdepfile2" - ;; - -tru64) - # The Tru64 compiler uses -MD to generate dependencies as a side - # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. - # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put - # dependencies in 'foo.d' instead, so we check for that too. - # Subdirectories are respected. - set_dir_from "$object" - set_base_from "$object" - - if test "$libtool" = yes; then - # Libtool generates 2 separate objects for the 2 libraries. These - # two compilations output dependencies in $dir.libs/$base.o.d and - # in $dir$base.o.d. We have to check for both files, because - # one of the two compilations can be disabled. We should prefer - # $dir$base.o.d over $dir.libs/$base.o.d because the latter is - # automatically cleaned when .libs/ is deleted, while ignoring - # the former would cause a distcleancheck panic. - tmpdepfile1=$dir$base.o.d # libtool 1.5 - tmpdepfile2=$dir.libs/$base.o.d # Likewise. - tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 - "$@" -Wc,-MD - else - tmpdepfile1=$dir$base.d - tmpdepfile2=$dir$base.d - tmpdepfile3=$dir$base.d - "$@" -MD - fi - - stat=$? - if test $stat -ne 0; then - rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" - do - test -f "$tmpdepfile" && break - done - # Same post-processing that is required for AIX mode. - aix_post_process_depfile - ;; - -msvc7) - if test "$libtool" = yes; then - showIncludes=-Wc,-showIncludes - else - showIncludes=-showIncludes - fi - "$@" $showIncludes > "$tmpdepfile" - stat=$? - grep -v '^Note: including file: ' "$tmpdepfile" - if test $stat -ne 0; then - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - echo "$object : \\" > "$depfile" - # The first sed program below extracts the file names and escapes - # backslashes for cygpath. The second sed program outputs the file - # name when reading, but also accumulates all include files in the - # hold buffer in order to output them again at the end. This only - # works with sed implementations that can handle large buffers. - sed < "$tmpdepfile" -n ' -/^Note: including file: *\(.*\)/ { - s//\1/ - s/\\/\\\\/g - p -}' | $cygpath_u | sort -u | sed -n ' -s/ /\\ /g -s/\(.*\)/'"$tab"'\1 \\/p -s/.\(.*\) \\/\1:/ -H -$ { - s/.*/'"$tab"'/ - G - p -}' >> "$depfile" - echo >> "$depfile" # make sure the fragment doesn't end with a backslash - rm -f "$tmpdepfile" - ;; - -msvc7msys) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -#nosideeffect) - # This comment above is used by automake to tell side-effect - # dependency tracking mechanisms from slower ones. - -dashmstdout) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout, regardless of -o. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - - # Remove '-o $object'. - IFS=" " - for arg - do - case $arg in - -o) - shift - ;; - $object) - shift - ;; - *) - set fnord "$@" "$arg" - shift # fnord - shift # $arg - ;; - esac - done - - test -z "$dashmflag" && dashmflag=-M - # Require at least two characters before searching for ':' - # in the target name. This is to cope with DOS-style filenames: - # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. - "$@" $dashmflag | - sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" - rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - # Some versions of the HPUX 10.20 sed can't process this sed invocation - # correctly. Breaking it into two sed invocations is a workaround. - tr ' ' "$nl" < "$tmpdepfile" \ - | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ - | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -dashXmstdout) - # This case only exists to satisfy depend.m4. It is never actually - # run, as this mode is specially recognized in the preamble. - exit 1 - ;; - -makedepend) - "$@" || exit $? - # Remove any Libtool call - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - # X makedepend - shift - cleared=no eat=no - for arg - do - case $cleared in - no) - set ""; shift - cleared=yes ;; - esac - if test $eat = yes; then - eat=no - continue - fi - case "$arg" in - -D*|-I*) - set fnord "$@" "$arg"; shift ;; - # Strip any option that makedepend may not understand. Remove - # the object too, otherwise makedepend will parse it as a source file. - -arch) - eat=yes ;; - -*|$object) - ;; - *) - set fnord "$@" "$arg"; shift ;; - esac - done - obj_suffix=`echo "$object" | sed 's/^.*\././'` - touch "$tmpdepfile" - ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" - rm -f "$depfile" - # makedepend may prepend the VPATH from the source file name to the object. - # No need to regex-escape $object, excess matching of '.' is harmless. - sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" - # Some versions of the HPUX 10.20 sed can't process the last invocation - # correctly. Breaking it into two sed invocations is a workaround. - sed '1,2d' "$tmpdepfile" \ - | tr ' ' "$nl" \ - | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ - | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" "$tmpdepfile".bak - ;; - -cpp) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - - # Remove '-o $object'. - IFS=" " - for arg - do - case $arg in - -o) - shift - ;; - $object) - shift - ;; - *) - set fnord "$@" "$arg" - shift # fnord - shift # $arg - ;; - esac - done - - "$@" -E \ - | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ - -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ - | sed '$ s: \\$::' > "$tmpdepfile" - rm -f "$depfile" - echo "$object : \\" > "$depfile" - cat < "$tmpdepfile" >> "$depfile" - sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -msvisualcpp) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - - IFS=" " - for arg - do - case "$arg" in - -o) - shift - ;; - $object) - shift - ;; - "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") - set fnord "$@" - shift - shift - ;; - *) - set fnord "$@" "$arg" - shift - shift - ;; - esac - done - "$@" -E 2>/dev/null | - sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" - rm -f "$depfile" - echo "$object : \\" > "$depfile" - sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" - echo "$tab" >> "$depfile" - sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -msvcmsys) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -none) - exec "$@" - ;; - -*) - echo "Unknown depmode $depmode" 1>&2 - exit 1 - ;; -esac - -exit 0 - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/doc/Makefile.am b/doc/Makefile.am deleted file mode 100644 index 86908fa..0000000 --- a/doc/Makefile.am +++ /dev/null @@ -1,52 +0,0 @@ -man_MANS = \ - pocketsphinx_batch.1 \ - pocketsphinx_continuous.1 \ - pocketsphinx_mdef_convert.1 - -EXTRA_DIST = \ - args2man.pl \ - doxy2swig.py \ - pocketsphinx_batch.1.in \ - pocketsphinx_continuous.1.in \ - pocketsphinx_batch.1 \ - pocketsphinx_continuous.1 \ - pocketsphinx_mdef_convert.1 - -# pocketsphinx_batch.1: pocketsphinx_batch.1.in -# $(srcdir)/args2man.pl $(top_builddir)/src/programs/pocketsphinx_batch \ -# < $< > $@ - -# pocketsphinx_continuous.1: pocketsphinx_continuous.1.in -# $(srcdir)/args2man.pl $(top_builddir)/src/programs/pocketsphinx_continuous \ -# < $< > $@ - -if BUILD_SWIG -SWIG_DOC = pydoc.i - -pydoc.i: html/index.html - $(PYTHON) $(srcdir)/doxy2swig.py -n xml/index.xml pydoc.i -endif - -if BUILD_DOXYGEN -all-local: html/index.html $(SWIG_DOC) -endif - -headers = \ - $(top_srcdir)/include/pocketsphinx.h \ - $(top_srcdir)/include/ps_lattice.h \ - $(top_srcdir)/include/ps_mllr.h \ - $(top_srcdir)/include/ps_search.h - -latex/refman.pdf: doxyfile $(headers) - doxygen - $(MAKE) -C latex refman.pdf - -html/index.html: doxyfile $(headers) - doxygen - -clean-local: - -rm -rf html xml latex doxytags $(SWIG_DOC) - -# Totally CMU-specific rule for uploading documentation -upload: html/index.html - rsync -av html/ file:/usr12/apache2/htdocs/sphinx/doc/doxygen/pocketsphinx/ diff --git a/doc/Makefile.in b/doc/Makefile.in deleted file mode 100644 index 57d75c5..0000000 --- a/doc/Makefile.in +++ /dev/null @@ -1,584 +0,0 @@ -# Makefile.in generated by automake 1.13.4 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2013 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = doc -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(srcdir)/doxyfile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ - $(top_srcdir)/m4/ax_python_devel.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = doxyfile -CONFIG_CLEAN_VPATH_FILES = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -SOURCES = -DIST_SOURCES = -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -man1dir = $(mandir)/man1 -am__installdirs = "$(DESTDIR)$(man1dir)" -NROFF = nroff -MANS = $(man_MANS) -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GST_CFLAGS = @GST_CFLAGS@ -GST_LIBS = @GST_LIBS@ -GST_MAJORMINOR = @GST_MAJORMINOR@ -GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ -GStreamer_CFLAGS = @GStreamer_CFLAGS@ -GStreamer_LIBS = @GStreamer_LIBS@ -HAVE_DOXYGEN = @HAVE_DOXYGEN@ -HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PKG_CONFIG = @PKG_CONFIG@ -PYTHON = @PYTHON@ -PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ -PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ -PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ -PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ -PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ -PYTHON_PLATFORM = @PYTHON_PLATFORM@ -PYTHON_PREFIX = @PYTHON_PREFIX@ -PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ -PYTHON_VERSION = @PYTHON_VERSION@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ -SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ -SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ -STRIP = @STRIP@ -SWIG = @SWIG@ -SWIG_LIB = @SWIG_LIB@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -pkgpyexecdir = @pkgpyexecdir@ -pkgpythondir = @pkgpythondir@ -plugindir = @plugindir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -pyexecdir = @pyexecdir@ -pythondir = @pythondir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -man_MANS = \ - pocketsphinx_batch.1 \ - pocketsphinx_continuous.1 \ - pocketsphinx_mdef_convert.1 - -EXTRA_DIST = \ - args2man.pl \ - doxy2swig.py \ - pocketsphinx_batch.1.in \ - pocketsphinx_continuous.1.in \ - pocketsphinx_batch.1 \ - pocketsphinx_continuous.1 \ - pocketsphinx_mdef_convert.1 - - -# pocketsphinx_batch.1: pocketsphinx_batch.1.in -# $(srcdir)/args2man.pl $(top_builddir)/src/programs/pocketsphinx_batch \ -# < $< > $@ - -# pocketsphinx_continuous.1: pocketsphinx_continuous.1.in -# $(srcdir)/args2man.pl $(top_builddir)/src/programs/pocketsphinx_continuous \ -# < $< > $@ -@BUILD_SWIG_TRUE@SWIG_DOC = pydoc.i -headers = \ - $(top_srcdir)/include/pocketsphinx.h \ - $(top_srcdir)/include/ps_lattice.h \ - $(top_srcdir)/include/ps_mllr.h \ - $(top_srcdir)/include/ps_search.h - -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign doc/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): -doxyfile: $(top_builddir)/config.status $(srcdir)/doxyfile.in - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-man1: $(man_MANS) - @$(NORMAL_INSTALL) - @list1=''; \ - list2='$(man_MANS)'; \ - test -n "$(man1dir)" \ - && test -n "`echo $$list1$$list2`" \ - || exit 0; \ - echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ - { for i in $$list1; do echo "$$i"; done; \ - if test -n "$$list2"; then \ - for i in $$list2; do echo "$$i"; done \ - | sed -n '/\.1[a-z]*$$/p'; \ - fi; \ - } | while read p; do \ - if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; echo "$$p"; \ - done | \ - sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ - sed 'N;N;s,\n, ,g' | { \ - list=; while read file base inst; do \ - if test "$$base" = "$$inst"; then list="$$list $$file"; else \ - echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ - fi; \ - done; \ - for i in $$list; do echo "$$i"; done | $(am__base_list) | \ - while read files; do \ - test -z "$$files" || { \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ - done; } - -uninstall-man1: - @$(NORMAL_UNINSTALL) - @list=''; test -n "$(man1dir)" || exit 0; \ - files=`{ for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.1[a-z]*$$/p'; \ - } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) -tags TAGS: - -ctags CTAGS: - -cscope cscopelist: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -@BUILD_DOXYGEN_FALSE@all-local: -all-am: Makefile $(MANS) all-local -installdirs: - for dir in "$(DESTDIR)$(man1dir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool clean-local mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: install-man - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: install-man1 - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-man - -uninstall-man: uninstall-man1 - -.MAKE: install-am install-strip - -.PHONY: all all-am all-local check check-am clean clean-generic \ - clean-libtool clean-local cscopelist-am ctags-am distclean \ - distclean-generic distclean-libtool distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-man1 install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ - uninstall-am uninstall-man uninstall-man1 - - -@BUILD_SWIG_TRUE@pydoc.i: html/index.html -@BUILD_SWIG_TRUE@ $(PYTHON) $(srcdir)/doxy2swig.py -n xml/index.xml pydoc.i - -@BUILD_DOXYGEN_TRUE@all-local: html/index.html $(SWIG_DOC) - -latex/refman.pdf: doxyfile $(headers) - doxygen - $(MAKE) -C latex refman.pdf - -html/index.html: doxyfile $(headers) - doxygen - -clean-local: - -rm -rf html xml latex doxytags $(SWIG_DOC) - -# Totally CMU-specific rule for uploading documentation -upload: html/index.html - rsync -av html/ file:/usr12/apache2/htdocs/sphinx/doc/doxygen/pocketsphinx/ - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/doc/doxy2swig.py b/doc/doxy2swig.py deleted file mode 100644 index 6af3ef0..0000000 --- a/doc/doxy2swig.py +++ /dev/null @@ -1,480 +0,0 @@ -#!/usr/bin/env python -"""Doxygen XML to SWIG docstring converter. - -Usage: - - doxy2swig.py [options] input.xml output.i - -Converts Doxygen generated XML files into a file containing docstrings -that can be used by SWIG-1.3.x. Note that you need to get SWIG -version > 1.3.23 or use Robin Dunn's docstring patch to be able to use -the resulting output. - -input.xml is your doxygen generated XML file and output.i is where the -output will be written (the file will be clobbered). - -""" -###################################################################### -# -# This code is implemented using Mark Pilgrim's code as a guideline: -# http://www.faqs.org/docs/diveintopython/kgp_divein.html -# -# Author: Prabhu Ramachandran -# License: BSD style -# -# Thanks: -# Johan Hake: the include_function_definition feature -# Bill Spotz: bug reports and testing. -# Sebastian Henschel: Misc. enhancements. -# -###################################################################### - -from xml.dom import minidom -import re -import textwrap -import sys -import types -import os.path -import optparse - -# TODO: do not process unnecessary files -TYPEMAP = { - 'ps_decoder_t': ('Decoder', 'ps_'), - 'ps_lattice_t': ('Lattice', 'ps_lattice_'), - 'ps_nbest_t': ('NBest', 'ps_nbest_'), - 'ps_seg_t': ('Segment', 'ps_seg_') -} - -USE_PREFIXES = [ - 'ps_', -] - -def my_open_read(source): - if hasattr(source, "read"): - return source - else: - return open(source) - -def my_open_write(dest): - if hasattr(dest, "write"): - return dest - else: - return open(dest, 'w') - - -class Doxy2SWIG: - """Converts Doxygen generated XML files into a file containing - docstrings that can be used by SWIG-1.3.x that have support for - feature("docstring"). Once the data is parsed it is stored in - self.pieces. - - """ - - def __init__(self, src, include_function_definition=True, quiet=False): - """Initialize the instance given a source object. `src` can - be a file or filename. If you do not want to include function - definitions from doxygen then set - `include_function_definition` to `False`. This is handy since - this allows you to use the swig generated function definition - using %feature("autodoc", [0,1]). - - """ - f = my_open_read(src) - self.my_dir = os.path.dirname(f.name) - self.xmldoc = minidom.parse(f).documentElement - f.close() - - self.pieces = [] - self.pieces.append('\n// File: %s\n'%\ - os.path.basename(f.name)) - - self.space_re = re.compile(r'\s+') - self.lead_spc = re.compile(r'^(%feature\S+\s+\S+\s*?)"\s+(\S)') - self.multi = 0 - self.ignores = ['inheritancegraph', 'param', 'listofallmembers', - 'innerclass', 'name', 'declname', 'incdepgraph', - 'invincdepgraph', 'programlisting', 'type', - 'references', 'referencedby', 'location', - 'collaborationgraph', 'reimplements', - 'reimplementedby', 'derivedcompoundref', - 'basecompoundref'] - #self.generics = [] - self.include_function_definition = include_function_definition - if not include_function_definition: - self.ignores.append('argsstring') - - self.quiet = quiet - - - def generate(self): - """Parses the file set in the initialization. The resulting - data is stored in `self.pieces`. - - """ - self.parse(self.xmldoc) - - def parse(self, node): - """Parse a given node. This function in turn calls the - `parse_` functions which handle the respective - nodes. - - """ - pm = getattr(self, "parse_%s"%node.__class__.__name__) - pm(node) - - def parse_Document(self, node): - self.parse(node.documentElement) - - def parse_Text(self, node): - txt = node.data - txt = txt.replace('\\', r'\\\\') - txt = txt.replace('"', r'\"') - # ignore pure whitespace - m = self.space_re.match(txt) - if m and len(m.group()) == len(txt): - pass - else: - self.add_text(textwrap.fill(txt, break_long_words=False)) - - def parse_Element(self, node): - """Parse an `ELEMENT_NODE`. This calls specific - `do_` handers for different elements. If no handler - is available the `generic_parse` method is called. All - tagNames specified in `self.ignores` are simply ignored. - - """ - name = node.tagName - ignores = self.ignores - if name in ignores: - return - attr = "do_%s" % name - if hasattr(self, attr): - handlerMethod = getattr(self, attr) - handlerMethod(node) - else: - self.generic_parse(node) - #if name not in self.generics: self.generics.append(name) - - def parse_Comment(self, node): - """Parse a `COMMENT_NODE`. This does nothing for now.""" - return - - def add_text(self, value): - """Adds text corresponding to `value` into `self.pieces`.""" - if isinstance(value, tuple) or isinstance(value, list): - self.pieces.extend(value) - else: - self.pieces.append(value) - - def get_specific_nodes(self, node, names): - """Given a node and a sequence of strings in `names`, return a - dictionary containing the names as keys and child - `ELEMENT_NODEs`, that have a `tagName` equal to the name. - - """ - nodes = [(x.tagName, x) for x in node.childNodes \ - if x.nodeType == x.ELEMENT_NODE and \ - x.tagName in names] - return dict(nodes) - - def generic_parse(self, node, pad=0): - """A Generic parser for arbitrary tags in a node. - - Parameters: - - - node: A node in the DOM. - - pad: `int` (default: 0) - - If 0 the node data is not padded with newlines. If 1 it - appends a newline after parsing the childNodes. If 2 it - pads before and after the nodes are processed. Defaults to - 0. - - """ - npiece = 0 - if pad: - npiece = len(self.pieces) - if pad == 2: - self.add_text('\n') - for n in node.childNodes: - self.parse(n) - if pad: - if len(self.pieces) > npiece: - self.add_text('\n') - - def space_parse(self, node): - self.add_text(' ') - self.generic_parse(node) - - do_ref = space_parse - do_emphasis = space_parse - do_bold = space_parse - do_computeroutput = space_parse - do_formula = space_parse - - def do_compoundname(self, node): - self.add_text('\n\n') - data = node.firstChild.data - self.add_text('%%feature("docstring") %s "\n' % data) - - def do_compounddef(self, node): - kind = node.attributes['kind'].value - if kind in ('class', 'struct'): - prot = node.attributes['prot'].value - if prot != 'public': - return - names = ('compoundname', 'briefdescription', - 'detaileddescription', 'includes') - first = self.get_specific_nodes(node, names) - for n in names: - if first.has_key(n): - self.parse(first[n]) - self.add_text(['";','\n']) - for n in node.childNodes: - if n not in first.values(): - self.parse(n) - elif kind in ('file', 'namespace'): - nodes = node.getElementsByTagName('sectiondef') - for n in nodes: - self.parse(n) - - def do_includes(self, node): - self.add_text('C++ includes: ') - self.generic_parse(node, pad=1) - - def do_parameterlist(self, node): - text='unknown' - for key, val in node.attributes.items(): - if key == 'kind': - if val == 'param': text = 'Parameters' - elif val == 'exception': text = 'Exceptions' - else: text = val - break - self.add_text(['\n', '\n', text, ':', '\n']) - self.generic_parse(node, pad=1) - - def do_para(self, node): - self.add_text('\n') - self.generic_parse(node, pad=1) - - def do_parametername(self, node): - self.add_text('\n') - try: - data=node.firstChild.data - except AttributeError: # perhaps a tag in it - data=node.firstChild.firstChild.data - if data.find('Exception') != -1: - self.add_text(data) - else: - self.add_text("%s: "%data) - - def do_parameterdefinition(self, node): - self.generic_parse(node, pad=1) - - def do_detaileddescription(self, node): - self.generic_parse(node, pad=1) - - def do_briefdescription(self, node): - self.generic_parse(node, pad=1) - - def do_memberdef(self, node): - prot = node.attributes['prot'].value - id = node.attributes['id'].value - kind = node.attributes['kind'].value - tmp = node.parentNode.parentNode.parentNode - compdef = tmp.getElementsByTagName('compounddef')[0] - cdef_kind = compdef.attributes['kind'].value - - if prot == 'public': - first = self.get_specific_nodes(node, ('definition', 'name')) - name = first['name'].firstChild.data - - for n in node.getElementsByTagName('param'): - arg_type = n.getElementsByTagName('type')[0] - ref = self.get_specific_nodes(arg_type, ('ref')) - if 'ref' in ref: - type_name = ref['ref'].firstChild.data - # TODO: check argument position - if type_name in TYPEMAP: - alias, prefix = TYPEMAP[type_name] - short_name = name.replace(prefix, '') - if not re.match(r'^\d', short_name): - name = alias + '::' + name.replace(prefix, '') - break - - if name[:8] == 'operator': # Don't handle operators yet. - return - - if not ('definition' in first) or \ - kind in ['variable', 'typedef']: - return - - if self.include_function_definition: - defn = first['definition'].firstChild.data - else: - defn = "" - self.add_text('\n') - self.add_text('%feature("docstring") ') - - anc = node.parentNode.parentNode - if cdef_kind in ('file', 'namespace'): - ns_node = anc.getElementsByTagName('innernamespace') - if not ns_node and cdef_kind == 'namespace': - ns_node = anc.getElementsByTagName('compoundname') - if ns_node: - ns = ns_node[0].firstChild.data - self.add_text(' %s::%s "\n%s'%(ns, name, defn)) - else: - self.add_text(' %s "\n%s'%(name, defn)) - elif cdef_kind in ('class', 'struct'): - # Get the full function name. - anc_node = anc.getElementsByTagName('compoundname') - cname = anc_node[0].firstChild.data - self.add_text(' %s::%s "\n%s'%(cname, name, defn)) - - for n in node.childNodes: - if n not in first.values(): - self.parse(n) - self.add_text(['";', '\n']) - - def do_definition(self, node): - data = node.firstChild.data - self.add_text('%s "\n%s'%(data, data)) - - def do_sectiondef(self, node): - kind = node.attributes['kind'].value - if kind in ('public-func', 'func', 'user-defined', ''): - self.generic_parse(node) - - def do_header(self, node): - """For a user defined section def a header field is present - which should not be printed as such, so we comment it in the - output.""" - data = node.firstChild.data - self.add_text('\n/*\n %s \n*/\n'%data) - # If our immediate sibling is a 'description' node then we - # should comment that out also and remove it from the parent - # node's children. - parent = node.parentNode - idx = parent.childNodes.index(node) - if len(parent.childNodes) >= idx + 2: - nd = parent.childNodes[idx+2] - if nd.nodeName == 'description': - nd = parent.removeChild(nd) - self.add_text('\n/*') - self.generic_parse(nd) - self.add_text('\n*/\n') - - def do_simplesect(self, node): - kind = node.attributes['kind'].value - if kind in ('date', 'rcs', 'version'): - pass - elif kind == 'warning': - self.add_text(['\n', 'WARNING: ']) - self.generic_parse(node) - elif kind == 'see': - self.add_text('\n') - self.add_text('See: ') - self.generic_parse(node) - else: - self.generic_parse(node) - - def do_argsstring(self, node): - self.generic_parse(node, pad=1) - - def do_member(self, node): - kind = node.attributes['kind'].value - refid = node.attributes['refid'].value - if kind == 'function' and refid[:9] == 'namespace': - self.generic_parse(node) - - def do_doxygenindex(self, node): - self.multi = 1 - comps = node.getElementsByTagName('compound') - for c in comps: - refid = c.attributes['refid'].value - fname = refid + '.xml' - for prefix in USE_PREFIXES: - if fname.startswith(prefix): - if not os.path.exists(fname): - fname = os.path.join(self.my_dir, fname) - if not self.quiet: - print ("parsing file: %s" % fname) - p = Doxy2SWIG(fname, self.include_function_definition, self.quiet) - p.generate() - self.pieces.extend(self.clean_pieces(p.pieces)) - break - - def write(self, fname): - o = my_open_write(fname) - if self.multi: - o.write("".join(self.pieces)) - else: - o.write("".join(self.clean_pieces(self.pieces))) - o.close() - - def clean_pieces(self, pieces): - """Cleans the list of strings given as `pieces`. It replaces - multiple newlines by a maximum of 2 and returns a new list. - It also wraps the paragraphs nicely. - - """ - ret = [] - count = 0 - for i in pieces: - if i == '\n': - count = count + 1 - else: - if i == '";': - if count: - ret.append('\n') - elif count > 2: - ret.append('\n\n') - elif count: - ret.append('\n'*count) - count = 0 - ret.append(i) - - _data = "".join(ret) - ret = [] - for i in _data.split('\n\n'): - if i == 'Parameters:' or i == 'Exceptions:': - ret.extend([i, '\n-----------', '\n\n']) - elif i.find('// File:') > -1: # leave comments alone. - ret.extend([i, '\n']) - else: - _tmp = textwrap.fill(i.strip(), break_long_words=False) - _tmp = self.lead_spc.sub(r'\1"\2', _tmp) - ret.extend([_tmp, '\n\n']) - return ret - - -def convert(input, output, include_function_definition=True, quiet=False): - p = Doxy2SWIG(input, include_function_definition, quiet) - p.generate() - p.write(output) - -def main(): - usage = __doc__ - parser = optparse.OptionParser(usage) - parser.add_option("-n", '--no-function-definition', - action='store_true', - default=False, - dest='func_def', - help='do not include doxygen function definitions') - parser.add_option("-q", '--quiet', - action='store_true', - default=False, - dest='quiet', - help='be quiet and minimize output') - - options, args = parser.parse_args() - if len(args) != 2: - parser.error("error: no input and output specified") - - convert(args[0], args[1], not options.func_def, options.quiet) - - -if __name__ == '__main__': - main() - diff --git a/doc/doxyfile.in b/doc/doxyfile.in deleted file mode 100644 index 2cd5eb0..0000000 --- a/doc/doxyfile.in +++ /dev/null @@ -1,1250 +0,0 @@ -# Doxyfile 1.5.2 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file that -# follow. The default is UTF-8 which is also the encoding used for all text before -# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into -# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of -# possible encodings. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = PocketSphinx - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = @VERSION@ - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = @builddir@ - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, -# Italian, Japanese, Japanese-en (Japanese with English messages), Korean, -# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, -# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = YES - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = @top_srcdir@ - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like the Qt-style comments (thus requiring an -# explicit @brief command for a brief description. - -JAVADOC_AUTOBRIEF = YES - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 8 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = YES - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for Java. -# For instance, namespaces will be presented as packages, qualified scopes -# will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to -# include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. - -CPP_CLI_SUPPORT = NO - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from the -# version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = @top_srcdir@/include @top_srcdir@/src/libpocketsphinx - -# This tag can be used to specify the character encoding of the source files that -# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default -# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. -# See http://www.gnu.org/software/libiconv for the list of possible encodings. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx -# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py - -FILE_PATTERNS = - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = */.svn/* */.deps/* */.libs/* */cmu6_lts_rules.* - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the output. -# The symbol name can be a fully qualified name, a word, or if the wildcard * is used, -# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = YES - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES (the default) -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = YES - -# If the REFERENCES_RELATION tag is set to YES (the default) -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = YES - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. Otherwise they will link to the documentstion. - -REFERENCES_LINK_SOURCE = YES - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = NO - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = NO - -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. - -ENUM_VALUES_PER_LINE = 4 - -# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be -# generated containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are -# probably better off using the HTML help feature. - -GENERATE_TREEVIEW = YES - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = YES - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4wide - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = NO - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = NO - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = YES - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = NO - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_DEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse -# the parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = @sphinxbasebuild@/doc/doxytags=../sphinxbase - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = @builddir@/doxytags - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option is superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields more -# powerful graphs. - -CLASS_DIAGRAMS = YES - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to -# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to -# specify the directory where the mscgen tool resides. If left empty the tool is assumed to -# be found in the default search path. - -MSCGEN_PATH = - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = NO - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a call dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a caller dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable caller graphs for selected -# functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen will always -# show the root nodes and its direct children regardless of this setting. - -DOT_GRAPH_MAX_NODES = 50 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, which results in a white background. -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- - -# The SEARCHENGINE tag specifies whether or not a search engine should be -# used. If set to NO the values of all tags below this one will be ignored. - -SEARCHENGINE = NO diff --git a/doc/pocketsphinx_continuous.1.in b/doc/pocketsphinx_continuous.1.in deleted file mode 100644 index febd605..0000000 --- a/doc/pocketsphinx_continuous.1.in +++ /dev/null @@ -1,43 +0,0 @@ -.TH POCKETSPHINX_CONTINUOUS 1 "2016-04-01" -.SH NAME -pocketsphinx_continuous \- Run speech recognition in continuous listening mode -.SH SYNOPSIS -.B pocketsphinx_continuous -.RI [ \fB\-infile\fR -\fIfilename.wav\fR ] -[ \fB\-inmic yes\fR ] -[ \fIoptions\fR ]... -.SH DESCRIPTION -.PP -This program opens the audio device or a file and waits for speech. When it -detects an utterance, it performs speech recognition on it. -.PP -To record from microphone and decode use -.TP -.B \-inmic yes -.PP -To decode a 16kHz 16-bit mono WAV file use -.TP -.B \-infile \fIfilename.wav\fR -.PP -You can also specify -.B \-lm -or -.B \-fsg -or -.B \-kws -depending on whether you are using a statistical language -model or a finite-state grammar or look for a keyphase. -.SH OPTIONS -.\" ### ARGUMENTS ### -.SH AUTHOR -Written by numerous people at CMU from 1994 onwards. This manual page -by David Huggins-Daines -.SH COPYRIGHT -Copyright \(co 1994-2016 Carnegie Mellon University. See the file -\fILICENSE\fR included with this package for more information. -.br -.SH "SEE ALSO" -.BR pocketsphinx_batch (1), -.BR sphinx_fe (1). -.br \ No newline at end of file diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/gen_config.py b/docs/gen_config.py new file mode 100644 index 0000000..1b81565 --- /dev/null +++ b/docs/gen_config.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 + +"""Generate the config.rst source from the currently installed version +of PocketSphinx. + +FIXME: This should be integrated into the Sphinx build but I haven't +figured out how to do that yet. +""" + +from pocketsphinx import Decoder + +PREAMBLE = """Configuration parameters +======================== + +These are the parameters currently recognized by +`pocketsphinx.Config` and `pocketsphinx.Decoder` along with their +default values. + +.. method:: Config(*args, **kwargs) + + Create a PocketSphinx configuration. This constructor can be + called with a list of arguments corresponding to a command-line, in + which case the parameter names should be prefixed with a '-'. + Otherwise, pass the keyword arguments described below. For + example, the following invocations are equivalent:: + + config = Config("-hmm", "path/to/things", "-dict", "my.dict") + config = Config(hmm="path/to/things", dict="my.dict") + + The same keyword arguments can also be passed directly to the + constructor for `pocketsphinx.Decoder`. + +""" + +config = Decoder.default_config() + +# Sort them into required and other +required = [] +other = [] +for arg in config.describe(): + if arg.required: + required.append(arg) + else: + other.append(arg) +required.sort(key=lambda a: a.name) +kwargs = required + other + +print(PREAMBLE) +for arg in kwargs: + arg_text = f" :keyword {arg.type.__name__} {arg.name}: " + if arg.doc is not None: + arg_text += arg.doc + if arg.default is not None: + if arg.type == bool: + default = arg.default == "yes" + else: + default = arg.type(arg.default) + arg_text += f", defaults to ``{default}``" + print(arg_text) diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..747ffb7 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..ecd6071 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,5 @@ +sphinx +myst-parser +sphinx-rtd-theme +MarkupSafe +. diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..ce8be7f --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,74 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys +sys.path.insert(0, os.path.abspath('../../py')) + + +# -- Project information ----------------------------------------------------- + +project = 'PocketSphinx' +copyright = '2023, David Huggins-Daines' +author = 'David Huggins-Daines' + +# The full version, including alpha/beta/rc tags +release = '5.0.4' + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.intersphinx', + 'sphinx.ext.coverage', + 'sphinx.ext.viewcode', + 'sphinx.ext.napoleon', + 'myst_parser', +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + +default_role = "py:obj" + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinx_rtd_theme' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + + +# -- Extension configuration ------------------------------------------------- + +js_source_path = "../../js" + +# -- Options for intersphinx extension --------------------------------------- + +# Example configuration for intersphinx: refer to the Python standard library. +intersphinx_mapping = { + 'python': ('https://docs.python.org/3', None), +} diff --git a/docs/source/config_params.rst b/docs/source/config_params.rst new file mode 100644 index 0000000..9909c3f --- /dev/null +++ b/docs/source/config_params.rst @@ -0,0 +1,147 @@ +Configuration parameters +======================== + +These are the parameters currently recognized by +`pocketsphinx.Config` and `pocketsphinx.Decoder` along with their +default values. + +.. method:: Config(*args, **kwargs) + + Create a PocketSphinx configuration from keyword arguments + described below. For example:: + + config = Config(hmm="path/to/things", dict="my.dict") + + The same keyword arguments can also be passed directly to the + constructor for `pocketsphinx.Decoder`. + + Many parameters have default values. Also, when constructing a + `Config` directly (as opposed to parsing JSON), `hmm`, `lm`, and + `dict` are set to the default models (some kind of US English + models of unknown origin + CMUDict). You can prevent this by + passing `None` for any of these parameters, e.g.:: + + config = Config(lm=None) # Do not load a language model + + Decoder initialization **will fail** if more than one of `lm`, + `jsgf`, `fsg`, `keyphrase`, `kws`, `allphone`, or `lmctl` are set + in the configuration. To make life easier, and because there is no + possible case in which you would do this intentionally, if you + initialize a `Decoder` or `Config` with any of these (and not + `lm`), the default `lm` value will be removed. This is not the + case if you decide to set one of them in an existing `Config`, so + in that case you must make sure to set `lm` to `None`:: + + config["jsgf"] = "spam_eggs_and_spam.gram" + config["lm"] = None + + + :keyword str hmm: Directory containing acoustic model files. + :keyword bool logspec: Write out logspectral files instead of cepstra, defaults to ``False`` + :keyword bool smoothspec: Write out cepstral-smoothed logspectral files, defaults to ``False`` + :keyword str transform: Which type of transform to use to calculate cepstra (legacy, dct, or htk), defaults to ``legacy`` + :keyword float alpha: Preemphasis parameter, defaults to ``0.97`` + :keyword int samprate: Sampling rate, defaults to ``16000`` + :keyword int frate: Frame rate, defaults to ``100`` + :keyword float wlen: Hamming window length, defaults to ``0.025625`` + :keyword int nfft: Size of FFT, or 0 to set automatically (recommended), defaults to ``0`` + :keyword int nfilt: Number of filter banks, defaults to ``40`` + :keyword float lowerf: Lower edge of filters, defaults to ``133.33334`` + :keyword float upperf: Upper edge of filters, defaults to ``6855.4976`` + :keyword bool unit_area: Normalize mel filters to unit area, defaults to ``True`` + :keyword bool round_filters: Round mel filter frequencies to DFT points, defaults to ``True`` + :keyword int ncep: Number of cep coefficients, defaults to ``13`` + :keyword bool doublebw: Use double bandwidth filters (same center freq), defaults to ``False`` + :keyword int lifter: Length of sin-curve for liftering, or 0 for no liftering., defaults to ``0`` + :keyword str input_endian: Endianness of input data, big or little, ignored if NIST or MS Wav, defaults to ``little`` + :keyword str warp_type: Warping function type (or shape), defaults to ``inverse_linear`` + :keyword str warp_params: Parameters defining the warping function + :keyword bool dither: Add 1/2-bit noise, defaults to ``False`` + :keyword int seed: Seed for random number generator; if less than zero, pick our own, defaults to ``-1`` + :keyword bool remove_dc: Remove DC offset from each frame, defaults to ``False`` + :keyword bool remove_noise: Remove noise using spectral subtraction, defaults to ``False`` + :keyword bool verbose: Show input filenames, defaults to ``False`` + :keyword str feat: Feature stream type, depends on the acoustic model, defaults to ``1s_c_d_dd`` + :keyword int ceplen: Number of components in the input feature vector, defaults to ``13`` + :keyword str cmn: Cepstral mean normalization scheme ('live', 'batch', or 'none'), defaults to ``live`` + :keyword str cmninit: Initial values (comma-separated) for cepstral mean when 'live' is used, defaults to ``40,3,-1`` + :keyword bool varnorm: Variance normalize each utterance (only if CMN == current), defaults to ``False`` + :keyword str agc: Automatic gain control for c0 ('max', 'emax', 'noise', or 'none'), defaults to ``none`` + :keyword float agcthresh: Initial threshold for automatic gain control, defaults to ``2.0`` + :keyword str lda: File containing transformation matrix to be applied to features (single-stream features only) + :keyword int ldadim: Dimensionality of output of feature transformation (0 to use entire matrix), defaults to ``0`` + :keyword str svspec: Subvector specification (e.g., 24,0-11/25,12-23/26-38 or 0-12/13-25/26-38) + :keyword str featparams: File containing feature extraction parameters. + :keyword str mdef: Model definition input file + :keyword str senmgau: Senone to codebook mapping input file (usually not needed) + :keyword str tmat: HMM state transition matrix input file + :keyword float tmatfloor: HMM state transition probability floor (applied to -tmat file), defaults to ``0.0001`` + :keyword str mean: Mixture gaussian means input file + :keyword str var: Mixture gaussian variances input file + :keyword float varfloor: Mixture gaussian variance floor (applied to data from -var file), defaults to ``0.0001`` + :keyword str mixw: Senone mixture weights input file (uncompressed) + :keyword float mixwfloor: Senone mixture weights floor (applied to data from -mixw file), defaults to ``1e-07`` + :keyword int aw: Inverse weight applied to acoustic scores., defaults to ``1`` + :keyword str sendump: Senone dump (compressed mixture weights) input file + :keyword str mllr: MLLR transformation to apply to means and variances + :keyword bool mmap: Use memory-mapped I/O (if possible) for model files, defaults to ``True`` + :keyword int ds: Frame GMM computation downsampling ratio, defaults to ``1`` + :keyword int topn: Maximum number of top Gaussians to use in scoring., defaults to ``4`` + :keyword str topn_beam: Beam width used to determine top-N Gaussians (or a list, per-feature), defaults to ``0`` + :keyword float logbase: Base in which all log-likelihoods calculated, defaults to ``1.0001`` + :keyword float beam: Beam width applied to every frame in Viterbi search (smaller values mean wider beam), defaults to ``1e-48`` + :keyword float wbeam: Beam width applied to word exits, defaults to ``7e-29`` + :keyword float pbeam: Beam width applied to phone transitions, defaults to ``1e-48`` + :keyword float lpbeam: Beam width applied to last phone in words, defaults to ``1e-40`` + :keyword float lponlybeam: Beam width applied to last phone in single-phone words, defaults to ``7e-29`` + :keyword float fwdflatbeam: Beam width applied to every frame in second-pass flat search, defaults to ``1e-64`` + :keyword float fwdflatwbeam: Beam width applied to word exits in second-pass flat search, defaults to ``7e-29`` + :keyword int pl_window: Phoneme lookahead window size, in frames, defaults to ``5`` + :keyword float pl_beam: Beam width applied to phone loop search for lookahead, defaults to ``1e-10`` + :keyword float pl_pbeam: Beam width applied to phone loop transitions for lookahead, defaults to ``1e-10`` + :keyword float pl_pip: Phone insertion penalty for phone loop, defaults to ``1.0`` + :keyword float pl_weight: Weight for phoneme lookahead penalties, defaults to ``3.0`` + :keyword bool compallsen: Compute all senone scores in every frame (can be faster when there are many senones), defaults to ``False`` + :keyword bool fwdtree: Run forward lexicon-tree search (1st pass), defaults to ``True`` + :keyword bool fwdflat: Run forward flat-lexicon search over word lattice (2nd pass), defaults to ``True`` + :keyword bool bestpath: Run bestpath (Dijkstra) search over word lattice (3rd pass), defaults to ``True`` + :keyword bool backtrace: Print results and backtraces to log., defaults to ``False`` + :keyword int latsize: Initial backpointer table size, defaults to ``5000`` + :keyword int maxwpf: Maximum number of distinct word exits at each frame (or -1 for no pruning), defaults to ``-1`` + :keyword int maxhmmpf: Maximum number of active HMMs to maintain at each frame (or -1 for no pruning), defaults to ``30000`` + :keyword int min_endfr: Nodes ignored in lattice construction if they persist for fewer than N frames, defaults to ``0`` + :keyword int fwdflatefwid: Minimum number of end frames for a word to be searched in fwdflat search, defaults to ``4`` + :keyword int fwdflatsfwin: Window of frames in lattice to search for successor words in fwdflat search , defaults to ``25`` + :keyword str dict: Main pronunciation dictionary (lexicon) input file + :keyword str fdict: Noise word pronunciation dictionary input file + :keyword bool dictcase: Dictionary is case sensitive (NOTE: case insensitivity applies to ASCII characters only), defaults to ``False`` + :keyword str allphone: Perform phoneme decoding with phonetic lm (given here) + :keyword bool allphone_ci: Perform phoneme decoding with phonetic lm and context-independent units only, defaults to ``True`` + :keyword str lm: Word trigram language model input file + :keyword str lmctl: Specify a set of language model + :keyword str lmname: Which language model in -lmctl to use by default + :keyword float lw: Language model probability weight, defaults to ``6.5`` + :keyword float fwdflatlw: Language model probability weight for flat lexicon (2nd pass) decoding, defaults to ``8.5`` + :keyword float bestpathlw: Language model probability weight for bestpath search, defaults to ``9.5`` + :keyword float ascale: Inverse of acoustic model scale for confidence score calculation, defaults to ``20.0`` + :keyword float wip: Word insertion penalty, defaults to ``0.65`` + :keyword float nwpen: New word transition penalty, defaults to ``1.0`` + :keyword float pip: Phone insertion penalty, defaults to ``1.0`` + :keyword float uw: Unigram weight, defaults to ``1.0`` + :keyword float silprob: Silence word transition probability, defaults to ``0.005`` + :keyword float fillprob: Filler word transition probability, defaults to ``1e-08`` + :keyword str fsg: Sphinx format finite state grammar file + :keyword str jsgf: JSGF grammar file + :keyword str toprule: Start rule for JSGF (first public rule is default) + :keyword bool fsgusealtpron: Add alternate pronunciations to FSG, defaults to ``True`` + :keyword bool fsgusefiller: Insert filler words at each state., defaults to ``True`` + :keyword str keyphrase: Keyphrase to spot + :keyword str kws: A file with keyphrases to spot, one per line + :keyword float kws_plp: Phone loop probability for keyphrase spotting, defaults to ``0.1`` + :keyword int kws_delay: Delay to wait for best detection score, defaults to ``10`` + :keyword float kws_threshold: Threshold for p(hyp)/p(alternatives) ratio, defaults to ``1e-30`` + :keyword str logfn: File to write log messages in + :keyword str loglevel: Minimum level of log messages (DEBUG, INFO, WARN, ERROR), defaults to ``WARN`` + :keyword str mfclogdir: Directory to log feature files to + :keyword str rawlogdir: Directory to log raw audio files to + :keyword str senlogdir: Directory to log senone score files to diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..f50e83a --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,50 @@ +PocketSphinx Documentation +============================ + +Welcome to the documentation for the Python interface to the +PocketSphinx speech recognizer! + +Quick Start +----------- + +To install PocketSphinx on most recent versions of Python, you should +be able to simply use `pip`:: + + pip install pocketsphinx + +This is a (somewhat) "batteries-included" install, which comes with a +default model and dictionary. Sadly, this model is specifically for +US (and, by extension Canadian) English, so it may not work well for +your dialect and certainly won't work for your native language. + +On Unix-like platforms you may need to install `PortAudio +`_ for live audio input to work. Now you can +try the simplest possible speech recognizer:: + + from pocketsphinx import LiveSpeech + for phrase in LiveSpeech(): + print(phrase) + +This will open the default audio device and start listening, detecting +segments of speech and printing out the recognized text, which may or +may not resemble what you actually said. + +There are of course many other things you can do with it. See +the :ref:`apidoc` for more information. + +.. _apidoc: + +API Documentation +----------------- + +.. toctree:: + pocketsphinx + config_params + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/source/pocketsphinx.rst b/docs/source/pocketsphinx.rst new file mode 100644 index 0000000..a9ef5b8 --- /dev/null +++ b/docs/source/pocketsphinx.rst @@ -0,0 +1,89 @@ +Main pocketsphinx package +========================= + +.. automodule:: pocketsphinx + +Decoder class +------------- + +.. autoclass:: pocketsphinx.Decoder + :members: + :no-undoc-members: + +Simple Recognition classes +-------------------------- + +.. autoclass:: pocketsphinx.AudioFile + :members: + :undoc-members: + +.. autoclass:: pocketsphinx.LiveSpeech + :members: + :undoc-members: + +Segmentation and Endpointing classes +------------------------------------ + +.. autoclass:: pocketsphinx.Segmenter + :members: + :no-undoc-members: + +.. autoclass:: pocketsphinx.segmenter.SpeechSegment + :members: + :no-undoc-members: + +.. autoclass:: pocketsphinx.Endpointer + :members: + :no-undoc-members: + +.. autoclass:: pocketsphinx.Vad + :members: + :no-undoc-members: + +Other classes +------------- + +.. autoclass:: pocketsphinx.Config + :members: + :no-undoc-members: + +.. autoclass:: pocketsphinx.Arg + :members: + :undoc-members: + +.. autoclass:: pocketsphinx.LogMath + :members: + :undoc-members: + +.. autoclass:: pocketsphinx.Jsgf + :members: + :undoc-members: + +.. autoclass:: pocketsphinx.JsgfRule + :members: + :undoc-members: + +.. autoclass:: pocketsphinx.NGramModel + :members: + :undoc-members: + +.. autoclass:: pocketsphinx.FsgModel + :members: + :undoc-members: + +.. autoclass:: pocketsphinx.Lattice + :members: + :undoc-members: + +.. autoclass:: pocketsphinx.Segment + :no-members: + +.. autoclass:: pocketsphinx.Hypothesis + :no-members: + +.. autoclass:: pocketsphinx.Alignment + :members: + :undoc-members: + +.. autoclass:: pocketsphinx.AlignmentEntry + :no-members: diff --git a/doxygen/CMakeLists.txt b/doxygen/CMakeLists.txt new file mode 100644 index 0000000..e7e2f5c --- /dev/null +++ b/doxygen/CMakeLists.txt @@ -0,0 +1,28 @@ +find_package(Doxygen) +if(DOXYGEN_FOUND) + set(DOXYGEN_PROJECT_NUMBER 5.0.4) + set(DOXYGEN_EXAMPLE_PATH ${CMAKE_SOURCE_DIR}/examples) + set(DOXYGEN_SORT_MEMBER_DOCS NO) + set(DOXYGEN_USE_MATHJAX YES) + set(DOXYGEN_EXCLUDE_PATTERNS + *export.h + *config.h + *.py + ) + set(DOXYGEN_EXCLUDE_SYMBOLS + *_s + ) + doxygen_add_docs(docs + ${CMAKE_SOURCE_DIR}/include + ${CMAKE_SOURCE_DIR}/examples + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/include) +endif() +install(FILES + pocketsphinx.1 + pocketsphinx_batch.1 + pocketsphinx_mdef_convert.1 + sphinx_lm_convert.1 + sphinx_lm_eval.1 + sphinx_lm_sort.1 + sphinx_pitch.1 + DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) diff --git a/doc/args2man.pl b/doxygen/args2man.pl similarity index 97% rename from doc/args2man.pl rename to doxygen/args2man.pl index 3fa2b3f..aa318ef 100755 --- a/doc/args2man.pl +++ b/doxygen/args2man.pl @@ -65,7 +65,7 @@ =head1 DESCRIPTION =head1 AUTHOR -David Huggins-Daines +David Huggins-Daines =head1 COPYRIGHT diff --git a/doc/pocketsphinx_continuous.1 b/doxygen/pocketsphinx.1 similarity index 60% rename from doc/pocketsphinx_continuous.1 rename to doxygen/pocketsphinx.1 index 3f0ac8c..7541e79 100644 --- a/doc/pocketsphinx_continuous.1 +++ b/doxygen/pocketsphinx.1 @@ -1,38 +1,117 @@ -.TH POCKETSPHINX_CONTINUOUS 1 "2016-04-01" +.TH POCKETSPHINX 1 "2022-09-27" .SH NAME -pocketsphinx_continuous \- Run speech recognition in continuous listening mode +pocketsphinx \- Run speech recognition on audio data .SH SYNOPSIS -.B pocketsphinx_continuous -.RI [ \fB\-infile\fR -\fIfilename.wav\fR ] -[ \fB\-inmic yes\fR ] -[ \fIoptions\fR ]... +.B pocketsphinx +[ \fIoptions\fR... ] +[ \fBlive\fR | +\fBsingle\fR | +\fBhelp\fR | +\fBsoxflags\fR ] +\fIINPUTS\fR... .SH DESCRIPTION .PP -This program opens the audio device or a file and waits for speech. When it -detects an utterance, it performs speech recognition on it. +The ‘\f[CR]pocketsphinx\fP’ command-line program reads single-channel +16-bit PCM audio one or more input files (or ‘\f[CR]-\fP’ to read from +standard input), and attempts to recognize speech in it using the +default acoustic and language model. The input files can be raw audio, +WAV, or NIST Sphere files, though some of these may not be recognized +properly. It accepts a large number of options which you probably +don't care about, and a \fIcommand\fP which defaults to +‘\f[CR]live\fP’. The commands are as follows: +.TP +.B help +Print a long list of those options you don't care about. +.TP +.B config +Dump configuration as JSON to standard output (can be loaded with the +‘\f[CR]-config\fP’ option). +.TP +.B live +Detect speech segments in input files, run recognition on them (using +those options you don't care about), and write the results to standard +output in line-delimited JSON. I realize this isn't the prettiest +format, but it sure beats XML. Each line contains a JSON object with +these fields, which have short names to make the lines more readable: +.IP +"b": Start time in seconds, from the beginning of the stream +.IP +"d": Duration in seconds +.IP +"p": Estimated probability of the recognition result, i.e. a number between +0 and 1 which may be used as a confidence score +.IP +"t": Full text of recognition result +.IP +"w": List of segments (usually words), each of which in turn contains the +‘\f[CR]b\fP’, ‘\f[CR]d\fP’, ‘\f[CR]p\fP’, and ‘\f[CR]t\fP’ fields, for +start, end, probability, and the text of the word. In the future we +may also support hierarchical results in which case ‘\f[CR]w\fP’ could +be present. +.TP +.B single +Recognize the input as a single utterance, and write a JSON object in the same format described above. +.TP +.B align + +Align a single input file (or ‘\f[CR]-\fP’ for standard input) to a word +sequence, and write a JSON object in the same format described above. +The first positional argument is the input, and all subsequent ones +are concatenated to make the text, to avoid surprises if you forget to +quote it. You are responsible for normalizing the text to remove +punctuation, uppercase, centipedes, etc. For example: + +.EX + pocketsphinx align goforward.wav "go forward ten meters" +.EE + +By default, only word-level alignment is done. To get phone +alignments, pass `-phone_align yes` in the flags, e.g.: + +.EX + pocketsphinx -phone_align yes align audio.wav $text +.EE + +This will make not particularly readable output, but you can use +.B jq +(https://stedolan.github.io/jq/) to clean it up. For example, +you can get just the word names and start times like this: + +.EX + pocketsphinx align audio.wav $text | jq '.w[]|[.t,.b]' +.EE + +Or you could get the phone names and durations like this: + +.EX + pocketsphinx -phone_align yes align audio.wav $text | jq '.w[]|.w[]|[.t,.d]' +.EE + +There are many, many other possibilities, of course. +.TP +.B help +Print a usage and help text with a list of possible arguments. +.TP +.B soxflags +Return arguments to ‘\f[CR]sox\fP’ which will create the appropriate +input format. Note that because the ‘\f[CR]sox\fP’ command-line is +slightly quirky these must always come \fIafter\fP the filename or +‘\f[CR]-d\fP’ (which tells ‘\f[CR]sox\fP’ to read from the +microphone). You can run live recognition like this: + +.EX + sox -d $(pocketsphinx soxflags) | pocketsphinx - +.EE + +or decode from a file named "audio.mp3" like this: + +.EX + sox audio.mp3 $(pocketsphinx soxflags) | pocketsphinx - +.EE .PP -To record from microphone and decode use -.TP -.B \-inmic yes -.PP -To decode a 16kHz 16-bit mono WAV file use -.TP -.B \-infile \fIfilename.wav\fR -.PP -You can also specify -.B \-lm -or -.B \-fsg -or -.B \-kws -depending on whether you are using a statistical language -model or a finite-state grammar or look for a keyphase. +By default only errors are printed to standard error, but if you want more information you can pass ‘\f[CR]-loglevel INFO\fP’. Partial results are not printed, maybe they will be in the future, but don't hold your breath. Force-alignment is likely to be supported soon, however. .SH OPTIONS .TP -.B \-adcdev -of audio device to use for input. -.TP .B \-agc Automatic gain control for c0 ('max', 'emax', 'noise', or 'none') .TP @@ -40,7 +119,7 @@ Automatic gain control for c0 ('max', 'emax', 'noise', or 'none') Initial threshold for automatic gain control .TP .B \-allphone -phoneme decoding with phonetic lm +phoneme decoding with phonetic lm (given here) .TP .B \-allphone_ci Perform phoneme decoding with phonetic lm and context-independent units only @@ -48,9 +127,6 @@ Perform phoneme decoding with phonetic lm and context-independent units only .B \-alpha Preemphasis parameter .TP -.B \-argfile -file giving extra arguments. -.TP .B \-ascale Inverse of acoustic model scale for confidence score calculation .TP @@ -58,7 +134,7 @@ Inverse of acoustic model scale for confidence score calculation Inverse weight applied to acoustic scores. .TP .B \-backtrace -Print results and backtraces to log file. +Print results and backtraces to log. .TP .B \-beam Beam width applied to every frame in Viterbi search (smaller values mean wider beam) @@ -73,17 +149,14 @@ Language model probability weight for bestpath search Number of components in the input feature vector .TP .B \-cmn -Cepstral mean normalization scheme ('current', 'prior', or 'none') +Cepstral mean normalization scheme ('live', 'batch', or 'none') .TP .B \-cmninit -Initial values (comma-separated) for cepstral mean when 'prior' is used +Initial values (comma-separated) for cepstral mean when 'live' is used .TP .B \-compallsen Compute all senone scores in every frame (can be faster when there are many senones) .TP -.B \-debug -level for debugging messages -.TP .B \-dict pronunciation dictionary (lexicon) input file .TP @@ -147,12 +220,6 @@ Run forward lexicon-tree search (1st pass) .B \-hmm containing acoustic model files. .TP -.B \-infile -file to transcribe. -.TP -.B \-inmic -Transcribe audio from microphone. -.TP .B \-input_endian Endianness of input data, big or little, ignored if NIST or MS Wav .TP @@ -169,7 +236,7 @@ file with keyphrases to spot, one per line Delay to wait for best detection score .TP .B \-kws_plp -Phone loop probability for keyword spotting +Phone loop probability for keyphrase spotting .TP .B \-kws_threshold Threshold for p(hyp)/p(alternatives) ratio @@ -201,6 +268,9 @@ Base in which all log-likelihoods calculated .B \-logfn to write log messages in .TP +.B \-loglevel +Minimum level of log messages (DEBUG, INFO, WARN, ERROR) +.TP .B \-logspec Write out logspectral files instead of cepstra .TP @@ -250,7 +320,7 @@ Use memory-mapped I/O (if possible) for model files Number of cep coefficients .TP .B \-nfft -Size of FFT +Size of FFT, or 0 to set automatically (recommended) .TP .B \-nfilt Number of filter banks @@ -286,10 +356,7 @@ to log raw audio files to Remove DC offset from each frame .TP .B \-remove_noise -Remove noise with spectral subtraction in mel-energies -.TP -.B \-remove_silence -Enables VAD, removes silence frames from processing +Remove noise using spectral subtraction .TP .B \-round_filters Round mel filter frequencies to DFT points @@ -318,9 +385,6 @@ Write out cepstral-smoothed logspectral files .B \-svspec specification (e.g., 24,0-11/25,12-23/26-38 or 0-12/13-25/26-38) .TP -.B \-time -Print word times in file transcription. -.TP .B \-tmat state transition matrix input file .TP @@ -348,18 +412,6 @@ Upper edge of filters .B \-uw Unigram weight .TP -.B \-vad_postspeech -Num of silence frames to keep after from speech to silence. -.TP -.B \-vad_prespeech -Num of speech frames to keep before silence to speech. -.TP -.B \-vad_startspeech -Num of speech frames to trigger vad from silence to speech. -.TP -.B \-vad_threshold -Threshold for decision between noise and silence frames. Log-ratio between signal level and noise level. -.TP .B \-var gaussian variances input file .TP @@ -388,7 +440,7 @@ Word insertion penalty Hamming window length .SH AUTHOR Written by numerous people at CMU from 1994 onwards. This manual page -by David Huggins-Daines +by David Huggins-Daines .SH COPYRIGHT Copyright \(co 1994-2016 Carnegie Mellon University. See the file \fILICENSE\fR included with this package for more information. @@ -396,4 +448,4 @@ Copyright \(co 1994-2016 Carnegie Mellon University. See the file .SH "SEE ALSO" .BR pocketsphinx_batch (1), .BR sphinx_fe (1). -.br \ No newline at end of file +.br diff --git a/doxygen/pocketsphinx.1.in b/doxygen/pocketsphinx.1.in new file mode 100644 index 0000000..9b2f794 --- /dev/null +++ b/doxygen/pocketsphinx.1.in @@ -0,0 +1,125 @@ +.TH POCKETSPHINX 1 "2022-09-27" +.SH NAME +pocketsphinx \- Run speech recognition on audio data +.SH SYNOPSIS +.B pocketsphinx +[ \fIoptions\fR... ] +[ \fBlive\fR | +\fBsingle\fR | +\fBhelp\fR | +\fBsoxflags\fR ] +\fIINPUTS\fR... +.SH DESCRIPTION +.PP +The ‘\f[CR]pocketsphinx\fP’ command-line program reads single-channel +16-bit PCM audio one or more input files (or ‘\f[CR]-\fP’ to read from +standard input), and attempts to recognize speech in it using the +default acoustic and language model. The input files can be raw audio, +WAV, or NIST Sphere files, though some of these may not be recognized +properly. It accepts a large number of options which you probably +don't care about, and a \fIcommand\fP which defaults to +‘\f[CR]live\fP’. The commands are as follows: +.TP +.B help +Print a long list of those options you don't care about. +.TP +.B config +Dump configuration as JSON to standard output (can be loaded with the +‘\f[CR]-config\fP’ option). +.TP +.B live +Detect speech segments in input files, run recognition on them (using +those options you don't care about), and write the results to standard +output in line-delimited JSON. I realize this isn't the prettiest +format, but it sure beats XML. Each line contains a JSON object with +these fields, which have short names to make the lines more readable: +.IP +"b": Start time in seconds, from the beginning of the stream +.IP +"d": Duration in seconds +.IP +"p": Estimated probability of the recognition result, i.e. a number between +0 and 1 which may be used as a confidence score +.IP +"t": Full text of recognition result +.IP +"w": List of segments (usually words), each of which in turn contains the +‘\f[CR]b\fP’, ‘\f[CR]d\fP’, ‘\f[CR]p\fP’, and ‘\f[CR]t\fP’ fields, for +start, end, probability, and the text of the word. In the future we +may also support hierarchical results in which case ‘\f[CR]w\fP’ could +be present. +.TP +.B single +Recognize the input as a single utterance, and write a JSON object in the same format described above. +.TP +.B align + +Align a single input file (or ‘\f[CR]-\fP’ for standard input) to a word +sequence, and write a JSON object in the same format described above. +The first positional argument is the input, and all subsequent ones +are concatenated to make the text, to avoid surprises if you forget to +quote it. You are responsible for normalizing the text to remove +punctuation, uppercase, centipedes, etc. For example: + +.EX + pocketsphinx align goforward.wav "go forward ten meters" +.EE + +By default, only word-level alignment is done. To get phone +alignments, pass `-phone_align yes` in the flags, e.g.: + +.EX + pocketsphinx -phone_align yes align audio.wav $text +.EE + +This will make not particularly readable output, but you can use +.B jq +(https://stedolan.github.io/jq/) to clean it up. For example, +you can get just the word names and start times like this: + +.EX + pocketsphinx align audio.wav $text | jq '.w[]|[.t,.b]' +.EE + +Or you could get the phone names and durations like this: + +.EX + pocketsphinx -phone_align yes align audio.wav $text | jq '.w[]|.w[]|[.t,.d]' +.EE + +There are many, many other possibilities, of course. +.TP +.B help +Print a usage and help text with a list of possible arguments. +.TP +.B soxflags +Return arguments to ‘\f[CR]sox\fP’ which will create the appropriate +input format. Note that because the ‘\f[CR]sox\fP’ command-line is +slightly quirky these must always come \fIafter\fP the filename or +‘\f[CR]-d\fP’ (which tells ‘\f[CR]sox\fP’ to read from the +microphone). You can run live recognition like this: + +.EX + sox -d $(pocketsphinx soxflags) | pocketsphinx - +.EE + +or decode from a file named "audio.mp3" like this: + +.EX + sox audio.mp3 $(pocketsphinx soxflags) | pocketsphinx - +.EE +.PP +By default only errors are printed to standard error, but if you want more information you can pass ‘\f[CR]-loglevel INFO\fP’. Partial results are not printed, maybe they will be in the future, but don't hold your breath. Force-alignment is likely to be supported soon, however. +.SH OPTIONS +.\" ### ARGUMENTS ### +.SH AUTHOR +Written by numerous people at CMU from 1994 onwards. This manual page +by David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 1994-2016 Carnegie Mellon University. See the file +\fILICENSE\fR included with this package for more information. +.br +.SH "SEE ALSO" +.BR pocketsphinx_batch (1), +.BR sphinx_fe (1). +.br diff --git a/doc/pocketsphinx_batch.1 b/doxygen/pocketsphinx_batch.1 similarity index 95% rename from doc/pocketsphinx_batch.1 rename to doxygen/pocketsphinx_batch.1 index fc982bf..be56272 100644 --- a/doc/pocketsphinx_batch.1 +++ b/doxygen/pocketsphinx_batch.1 @@ -342,9 +342,6 @@ Remove DC offset from each frame .B \-remove_noise Remove noise with spectral subtraction in mel-energies .TP -.B \-remove_silence -Enables VAD, removes silence frames from processing -.TP .B \-round_filters Round mel filter frequencies to DFT points .TP @@ -402,18 +399,6 @@ Upper edge of filters .B \-uw Unigram weight .TP -.B \-vad_postspeech -Num of silence frames to keep after from speech to silence. -.TP -.B \-vad_prespeech -Num of speech frames to keep before silence to speech. -.TP -.B \-vad_startspeech -Num of speech frames to trigger vad from silence to speech. -.TP -.B \-vad_threshold -Threshold for decision between noise and silence frames. Log-ratio between signal level and noise level. -.TP .B \-var gaussian variances input file .TP @@ -461,7 +446,7 @@ of a file, using the following format: .RE .SH AUTHOR Written by numerous people at CMU from 1994 onwards. This manual page -by David Huggins-Daines +by David Huggins-Daines .SH COPYRIGHT Copyright \(co 1994-2016 Carnegie Mellon University. See the file \fILICENSE\fR included with this package for more information. @@ -469,4 +454,4 @@ Copyright \(co 1994-2016 Carnegie Mellon University. See the file .SH "SEE ALSO" .BR pocketsphinx_continuous (1), .BR sphinx_fe (1). -.br \ No newline at end of file +.br diff --git a/doc/pocketsphinx_batch.1.in b/doxygen/pocketsphinx_batch.1.in similarity index 96% rename from doc/pocketsphinx_batch.1.in rename to doxygen/pocketsphinx_batch.1.in index 0501f2f..be41c7e 100644 --- a/doc/pocketsphinx_batch.1.in +++ b/doxygen/pocketsphinx_batch.1.in @@ -36,7 +36,7 @@ of a file, using the following format: .RE .SH AUTHOR Written by numerous people at CMU from 1994 onwards. This manual page -by David Huggins-Daines +by David Huggins-Daines .SH COPYRIGHT Copyright \(co 1994-2016 Carnegie Mellon University. See the file \fILICENSE\fR included with this package for more information. diff --git a/doc/pocketsphinx_mdef_convert.1 b/doxygen/pocketsphinx_mdef_convert.1 similarity index 93% rename from doc/pocketsphinx_mdef_convert.1 rename to doxygen/pocketsphinx_mdef_convert.1 index 3cc7e7c..cf49e99 100644 --- a/doc/pocketsphinx_mdef_convert.1 +++ b/doxygen/pocketsphinx_mdef_convert.1 @@ -17,7 +17,7 @@ The input is in text format, and is to be converted to binary. .B -bin The input is in binary format, and is to be converted to text. .SH AUTHOR -Written by David Huggins-Daines . +Written by David Huggins-Daines . .SH COPYRIGHT Copyright \(co 2016 Carnegie Mellon University. See the file \fICOPYING\fR included with this package for more information. diff --git a/doxygen/sphinx_cepview.1 b/doxygen/sphinx_cepview.1 new file mode 100644 index 0000000..05cc016 --- /dev/null +++ b/doxygen/sphinx_cepview.1 @@ -0,0 +1,41 @@ +.TH SPHINX_CEPVIEW 1 "2007-08-27" +.SH NAME +sphinx_cepview \- View acoustic feature files +.SH SYNOPSIS +.B sphinx_cepview +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program reads acoustic feature files in Sphinx format and +displays their contents as text for inspection. +.TP +.B \-b +The beginning frame 0-based. +.TP +.B \-d +Number of displayed coefficients. +.TP +.B \-describe +Whether description will be shown. +.TP +.B \-e +The ending frame. +.TP +.B \-f +feature file. +.TP +.B \-header +Whether header is shown. +.TP +.B \-i +Number of coefficients in the feature vector. +.TP +.B \-logfn +file (default stdout/stderr) +.SH AUTHOR +Written by numerous people at CMU from 1994 onwards. This manual page +by David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 1994-2007 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doxygen/sphinx_cepview.1.in b/doxygen/sphinx_cepview.1.in new file mode 100644 index 0000000..82899b6 --- /dev/null +++ b/doxygen/sphinx_cepview.1.in @@ -0,0 +1,18 @@ +.TH SPHINX_CEPVIEW 1 "2007-08-27" +.SH NAME +sphinx_cepview \- View acoustic feature files +.SH SYNOPSIS +.B sphinx_cepview +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program reads acoustic feature files in Sphinx format and +displays their contents as text for inspection. +.\" ### ARGUMENTS ### +.SH AUTHOR +Written by numerous people at CMU from 1994 onwards. This manual page +by David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 1994-2007 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doxygen/sphinx_cont_seg.1 b/doxygen/sphinx_cont_seg.1 new file mode 100644 index 0000000..2f55657 --- /dev/null +++ b/doxygen/sphinx_cont_seg.1 @@ -0,0 +1,102 @@ +.TH SPHINX_CONT_SEG 1 "2008-05-12" +.SH NAME +sphinx_cont_seg \- Segment a waveform file into non-silence regions +.SH SYNOPSIS +.B sphinx_cont_seg +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program reads an input file and segments it into individual +non-silence regions. It can process either file or read data from +microphone. Use following arguments: +.TP +.B \-adcdev +of audio device to use for input. +.TP +.B \-alpha +Preemphasis parameter +.TP +.B \-argfile +file giving extra arguments. +.TP +.B \-dither +Add 1/2-bit noise +.TP +.B \-doublebw +Use double bandwidth filters (same center freq) +.TP +.B \-frate +Frame rate +.TP +.B \-infile +of audio file to use for input. +.TP +.B \-input_endian +Endianness of input data, big or little, ignored if NIST or MS Wav +.TP +.B \-lifter +Length of sin-curve for liftering, or 0 for no liftering. +.TP +.B \-logspec +Write out logspectral files instead of cepstra +.TP +.B \-lowerf +Lower edge of filters +.TP +.B \-ncep +Number of cep coefficients +.TP +.B \-nfft +Size of FFT +.TP +.B \-nfilt +Number of filter banks +.TP +.B \-remove_dc +Remove DC offset from each frame +.TP +.B \-remove_noise +Remove noise with spectral subtraction in mel-energies +.TP +.B \-round_filters +Round mel filter frequencies to DFT points +.TP +.B \-samprate +Sampling rate +.TP +.B \-seed +Seed for random number generator; if less than zero, pick our own +.TP +.B \-singlefile +a single cleaned file. +.TP +.B \-smoothspec +Write out cepstral-smoothed logspectral files +.TP +.B \-transform +Which type of transform to use to calculate cepstra (legacy, dct, or htk) +.TP +.B \-unit_area +Normalize mel filters to unit area +.TP +.B \-upperf +Upper edge of filters +.TP +.B \-verbose +Show input filenames +.TP +.B \-warp_params +defining the warping function +.TP +.B \-warp_type +Warping function type (or shape) +.TP +.B \-wlen +Hamming window length +.SH AUTHOR +Written by M. K. Ravishankar . This (rather lousy) manual page +by David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 1999-2001 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doxygen/sphinx_cont_seg.1.in b/doxygen/sphinx_cont_seg.1.in new file mode 100644 index 0000000..d10f4ab --- /dev/null +++ b/doxygen/sphinx_cont_seg.1.in @@ -0,0 +1,19 @@ +.TH SPHINX_CONT_SEG 1 "2008-05-12" +.SH NAME +sphinx_cont_seg \- Segment a waveform file into non-silence regions +.SH SYNOPSIS +.B sphinx_cont_seg +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program reads an input file and segments it into individual +non-silence regions. It can process either file or read data from +microphone. Use following arguments: +.\" ### ARGUMENTS ### +.SH AUTHOR +Written by M. K. Ravishankar . This (rather lousy) manual page +by David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 1999-2001 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doxygen/sphinx_fe.1 b/doxygen/sphinx_fe.1 new file mode 100644 index 0000000..ec14ff4 --- /dev/null +++ b/doxygen/sphinx_fe.1 @@ -0,0 +1,178 @@ +.TH SPHINX_FE 1 "2007-08-27" +.SH NAME +sphinx_fe \- Convert audio files to acoustic feature files +.SH SYNOPSIS +.B sphinx_fe +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program converts audio files (in either Microsoft WAV, NIST +Sphere, or raw format) to acoustic feature files for input to +batch-mode speech recognition. The resulting files are also useful +for various other things. A list of options follows: +.TP +.B \-alpha +Preemphasis parameter +.TP +.B \-argfile +file (e.g. feat.params from an acoustic model) to read parameters from. This will override anything set in other command line arguments. +.TP +.B \-blocksize +Number of samples to read at a time. +.TP +.B \-build_outdirs +Create missing subdirectories in output directory +.TP +.B \-c +file for batch processing +.TP +.B \-cep2spec +Input is cepstral files, output is log spectral files +.TP +.B \-di +directory, input file names are relative to this, if defined +.TP +.B \-dither +Add 1/2-bit noise +.TP +.B \-do +directory, output files are relative to this +.TP +.B \-doublebw +Use double bandwidth filters (same center freq) +.TP +.B \-ei +extension to be applied to all input files +.TP +.B \-eo +extension to be applied to all output files +.TP +.B \-example +Shows example of how to use the tool +.TP +.B \-frate +Frame rate +.TP +.B \-help +Shows the usage of the tool +.TP +.B \-i +audio input file +.TP +.B \-input_endian +Endianness of input data, big or little, ignored if NIST or MS Wav +.TP +.B \-lifter +Length of sin-curve for liftering, or 0 for no liftering. +.TP +.B \-logspec +Write out logspectral files instead of cepstra +.TP +.B \-lowerf +Lower edge of filters +.TP +.B \-mach_endian +Endianness of machine, big or little +.TP +.B \-mswav +Defines input format as Microsoft Wav (RIFF) +.TP +.B \-ncep +Number of cep coefficients +.TP +.B \-nchans +Number of channels of data (interlaced samples assumed) +.TP +.B \-nfft +Size of FFT +.TP +.B \-nfilt +Number of filter banks +.TP +.B \-nist +Defines input format as NIST sphere +.TP +.B \-npart +Number of parts to run in (supersedes \fB\-nskip\fR and \fB\-runlen\fR if non-zero) +.TP +.B \-nskip +If a control file was specified, the number of utterances to skip at the head of the file +.TP +.B \-o +cepstral output file +.TP +.B \-ofmt +Format of output files - one of sphinx, htk, text. +.TP +.B \-part +Index of the part to run (supersedes \fB\-nskip\fR and \fB\-runlen\fR if non-zero) +.TP +.B \-raw +Defines input format as raw binary data +.TP +.B \-remove_dc +Remove DC offset from each frame +.TP +.B \-remove_noise +Remove noise with spectral subtraction in mel-energies +.TP +.B \-round_filters +Round mel filter frequencies to DFT points +.TP +.B \-runlen +If a control file was specified, the number of utterances to process, or \fB\-1\fR for all +.TP +.B \-samprate +Sampling rate +.TP +.B \-seed +Seed for random number generator; if less than zero, pick our own +.TP +.B \-smoothspec +Write out cepstral-smoothed logspectral files +.TP +.B \-spec2cep +Input is log spectral files, output is cepstral files +.TP +.B \-sph2pipe +Input is NIST sphere (possibly with Shorten), use sph2pipe to convert +.TP +.B \-transform +Which type of transform to use to calculate cepstra (legacy, dct, or htk) +.TP +.B \-unit_area +Normalize mel filters to unit area +.TP +.B \-upperf +Upper edge of filters +.TP +.B \-verbose +Show input filenames +.TP +.B \-warp_params +defining the warping function +.TP +.B \-warp_type +Warping function type (or shape) +.TP +.B \-whichchan +Channel to process (numbered from 1), or 0 to mix all channels +.TP +.B \-wlen +Hamming window length +.PP +Currently the only kind of features supported are MFCCs (mel-frequency +cepstral coefficients). There are numerous options which control the +properties of the output features. It is \fBVERY\fR important that +you document the specific set of flags used to create any given set of +feature files, since this information is \fBNOT\fR recorded in the +files themselves, and any mismatch between the parameters used to +extract features for recognition and those used to extract features +for training will cause recognition to fail. +.SH AUTHOR +Written by numerous people at CMU from 1994 onwards. This manual page +by David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 1994-2007 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doxygen/sphinx_fe.1.in b/doxygen/sphinx_fe.1.in new file mode 100644 index 0000000..f07ca95 --- /dev/null +++ b/doxygen/sphinx_fe.1.in @@ -0,0 +1,29 @@ +.TH SPHINX_FE 1 "2007-08-27" +.SH NAME +sphinx_fe \- Convert audio files to acoustic feature files +.SH SYNOPSIS +.B sphinx_fe +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program converts audio files (in either Microsoft WAV, NIST +Sphere, or raw format) to acoustic feature files for input to +batch-mode speech recognition. The resulting files are also useful +for various other things. A list of options follows: +.\" ### ARGUMENTS ### +.PP +Currently the only kind of features supported are MFCCs (mel-frequency +cepstral coefficients). There are numerous options which control the +properties of the output features. It is \fBVERY\fR important that +you document the specific set of flags used to create any given set of +feature files, since this information is \fBNOT\fR recorded in the +files themselves, and any mismatch between the parameters used to +extract features for recognition and those used to extract features +for training will cause recognition to fail. +.SH AUTHOR +Written by numerous people at CMU from 1994 onwards. This manual page +by David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 1994-2007 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doxygen/sphinx_lm_convert.1 b/doxygen/sphinx_lm_convert.1 new file mode 100644 index 0000000..48c1f81 --- /dev/null +++ b/doxygen/sphinx_lm_convert.1 @@ -0,0 +1,45 @@ +.TH SPHINX_LM_CONVERT 1 "2010-03-18" +.SH NAME +sphinx_lm_convert \- Convert and manipulate language model files +.SH SYNOPSIS +.B sphinx_lm_convert +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program converts language model files from one format to +another. It can also be used to change the character encoding +of the text in a language model file and to force word strings +to upper or lower case. +.TP +.B \-case +\'lower\' or \'upper\' - case fold to lower/upper case (NOT UNICODE AWARE) +.TP +.B \-debug +level for debugging messages +.TP +.B \-help +Shows the usage of the tool +.TP +.B \-i +language model file (required) +.TP +.B \-ifmt +language model format (will guess if not specified) +.TP +.B \-logbase +Base in which all log-likelihoods calculated +.TP +.B \-mmap +Use memory-mapped I/O for reading binary LM files +.TP +.B \-o +language model file (required) +.TP +.B \-ofmt +language model file (will guess if not specified) +.SH AUTHOR +David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 2010 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doxygen/sphinx_lm_convert.1.in b/doxygen/sphinx_lm_convert.1.in new file mode 100644 index 0000000..923530f --- /dev/null +++ b/doxygen/sphinx_lm_convert.1.in @@ -0,0 +1,19 @@ +.TH SPHINX_LM_CONVERT 1 "2010-03-18" +.SH NAME +sphinx_lm_convert \- Convert and manipulate language model files +.SH SYNOPSIS +.B sphinx_lm_convert +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program converts language model files from one format to +another. It can also be used to change the character encoding +of the text in a language model file and to force word strings +to upper or lower case. +.\" ### ARGUMENTS ### +.SH AUTHOR +David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 2010 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doxygen/sphinx_lm_eval.1 b/doxygen/sphinx_lm_eval.1 new file mode 100644 index 0000000..40c7af0 --- /dev/null +++ b/doxygen/sphinx_lm_eval.1 @@ -0,0 +1,56 @@ +.TH SPHINX_LM_EVAL 1 "2008-05-12" +.SH NAME +sphinx_lm_eval \- Evaluate perplexity of a transcription +.SH SYNOPSIS +.B sphinx_lm_eval +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program evaluates the perplexity of a text file according to a +given language model. The text file is assumed to be in transcript +format, i.e. one utterance per line, delimited by and . +.TP +.B \-help +Shows the usage of the tool +.TP +.B \-lm +model file +.TP +.B \-lmctlfn +file listing a set of language models +.TP +.B \-lmname +of language model in \fB\-lmctlfn\fR to use for all utterances +.TP +.B \-logbase +Base in which all log-likelihoods calculated +.TP +.B \-lsn +file to evaluate +.TP +.B \-lw +Language model weight +.TP +.B \-mmap +Use memory-mapped I/O for reading binary LM files +.TP +.B \-probdef +definition file for classes in LM +.TP +.B \-text +string to evaluate +.TP +.B \-uw +Unigram probability weight (interpolated with uniform distribution) +.TP +.B \-verbose +Print details of perplexity calculation +.TP +.B \-wip +Word insertion probability +.SH AUTHOR +David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 2007-2008 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doxygen/sphinx_lm_eval.1.in b/doxygen/sphinx_lm_eval.1.in new file mode 100644 index 0000000..a702333 --- /dev/null +++ b/doxygen/sphinx_lm_eval.1.in @@ -0,0 +1,18 @@ +.TH SPHINX_LM_EVAL 1 "2008-05-12" +.SH NAME +sphinx_lm_eval \- Evaluate perplexity of a transcription +.SH SYNOPSIS +.B sphinx_lm_eval +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program evaluates the perplexity of a text file according to a +given language model. The text file is assumed to be in transcript +format, i.e. one utterance per line, delimited by and . +.\" ### ARGUMENTS ### +.SH AUTHOR +David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 2007-2008 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doxygen/sphinx_lm_sort.1 b/doxygen/sphinx_lm_sort.1 new file mode 100644 index 0000000..8d5dabf --- /dev/null +++ b/doxygen/sphinx_lm_sort.1 @@ -0,0 +1,21 @@ +.TH SPHINX_LM_SORT 1 "2008-06-26" +.SH NAME +sphinx_lm_sort \- Order N-Grams in a language model for Sphinx +.SH SYNOPSIS +.B sphinx_lm_sort +< +.I input_lm +> +.I output_lm +.SH DESCRIPTION +.PP +This program arranges the N-Grams in an ARPA-format language model to +be acceptable to Sphinx. This is necessary if you created the +language model with SRILM or any other tool which is not as strict +about ordering N-Grams in its output. +.SH AUTHOR +David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 2008 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doxygen/sphinx_pitch.1 b/doxygen/sphinx_pitch.1 new file mode 100644 index 0000000..cc1b4e3 --- /dev/null +++ b/doxygen/sphinx_pitch.1 @@ -0,0 +1,72 @@ +.TH SPHINX_PITCH 1 "2007-05-12" +.SH NAME +sphinx_pitch \- Extract pitch from audio files +.SH SYNOPSIS +.B sphinx_pitch +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program reads audio files and analyzes them for pitch and voicing. +.TP +.B \-c +file for batch processing +.TP +.B \-di +directory, input file names are relative to this, if defined +.TP +.B \-do +directory, output files are relative to this +.TP +.B \-ei +extension to be applied to all input files +.TP +.B \-eo +extension to be applied to all output files +.TP +.B \-flen +Number of seconds in each analysis frame (needs to be greater than twice the longest period you wish to detect - to detect down to 80Hz you need a frame length of 2.0/80 = 0.025). +.TP +.B \-fshift +Frame shift: number of seconds between each analysis frame. +.TP +.B \-i +audio input file +.TP +.B \-input_endian +of audio data (will be determined automatically if not given) +.TP +.B \-mswav +Defines input format as Microsoft Wav (RIFF) +.TP +.B \-nist +Defines input format as NIST sphere +.TP +.B \-nskip +If a control file was specified, the number of utterances to skip at the head of the file +.TP +.B \-o +text output file (standard output will be used if not given) +.TP +.B \-raw +Defines input format as raw binary data +.TP +.B \-runlen +If a control file was specified, the number of utterances to process (see \fB\-nskip\fR too) +.TP +.B \-samprate +Sampling rate of audio data (will be determined automatically if 0) +.TP +.B \-search_range +Fraction of the best local estimate to use as a search range for smoothing. +.TP +.B \-smooth_window +Number of frames on either side of the current frame to use for smoothing. +.TP +.B \-voice_thresh +Threshold of normalized difference under which to search for the fundamental period. +.SH AUTHOR +David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 2007-2008 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/doxygen/sphinx_pitch.1.in b/doxygen/sphinx_pitch.1.in new file mode 100644 index 0000000..3b21726 --- /dev/null +++ b/doxygen/sphinx_pitch.1.in @@ -0,0 +1,16 @@ +.TH SPHINX_PITCH 1 "2007-05-12" +.SH NAME +sphinx_pitch \- Extract pitch from audio files +.SH SYNOPSIS +.B sphinx_pitch +[\fI options \fR]... +.SH DESCRIPTION +.PP +This program reads audio files and analyzes them for pitch and voicing. +.\" ### ARGUMENTS ### +.SH AUTHOR +David Huggins-Daines +.SH COPYRIGHT +Copyright \(co 2007-2008 Carnegie Mellon University. See the file +\fICOPYING\fR included with this package for more information. +.br diff --git a/examples/.gitignore b/examples/.gitignore new file mode 100644 index 0000000..5a0800a --- /dev/null +++ b/examples/.gitignore @@ -0,0 +1,4 @@ +simple +vad +a.out +live diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt new file mode 100644 index 0000000..9c65eeb --- /dev/null +++ b/examples/CMakeLists.txt @@ -0,0 +1,59 @@ +set(EXAMPLES + live + simple + ) + +foreach(EXAMPLE ${EXAMPLES}) + add_executable(${EXAMPLE} EXCLUDE_FROM_ALL ${EXAMPLE}.c) + target_link_libraries(${EXAMPLE} pocketsphinx) + target_include_directories( + ${EXAMPLE} PRIVATE ${CMAKE_BINARY_DIR} + ) +endforeach() + +add_custom_target(examples DEPENDS ${EXAMPLES}) + +# Try to find portaudio and pulseaudio with pkg-config +find_package(PkgConfig QUIET) +if(PKG_CONFIG_FOUND) + pkg_check_modules(PULSEAUDIO libpulse-simple) + if(PULSEAUDIO_FOUND) + add_executable(live_pulseaudio EXCLUDE_FROM_ALL live_pulseaudio.c) + target_link_libraries(live_pulseaudio pocketsphinx ${PULSEAUDIO_LIBRARIES}) + target_include_directories(live_pulseaudio PRIVATE ${CMAKE_BINARY_DIR} + live_pulseaudio PUBLIC ${PULSEAUDIO_INCLUDE_DIRS}) + endif() + + pkg_check_modules(PORTAUDIO portaudio-2.0) + if(PORTAUDIO_FOUND) + add_executable(live_portaudio EXCLUDE_FROM_ALL live_portaudio.c) + target_link_libraries(live_portaudio pocketsphinx ${PORTAUDIO_LIBRARIES}) + target_include_directories(live_portaudio PRIVATE ${CMAKE_BINARY_DIR} + live_portaudio PUBLIC ${PORTAUDIO_INCLUDE_DIRS}) + endif() +endif() + +# Try to find portaudio with its old package finder thing +if(NOT PORTAUDIO_FOUND) + find_package(portaudio QUIET) + if(TARGET portaudio_static) + add_executable(live_portaudio EXCLUDE_FROM_ALL live_portaudio.c) + target_link_libraries(live_portaudio pocketsphinx portaudio_static) + set(PORTAUDIO_FOUND 1) + endif() +endif() + +# Try to find portaudio with its new package finder thing +if(NOT PORTAUDIO_FOUND) + find_package(PortAudio QUIET) + if(TARGET PortAudio::PortAudio) + add_executable(live_portaudio EXCLUDE_FROM_ALL live_portaudio.c) + target_link_libraries(live_portaudio pocketsphinx PortAudio::PortAudio) + set(PORTAUDIO_FOUND 1) + endif() +endif() + +if(WIN32) + add_executable(live_win32 EXCLUDE_FROM_ALL live_win32.c) + target_link_libraries(live_win32 pocketsphinx winmm) +endif() \ No newline at end of file diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 0000000..33e9458 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,44 @@ +PocketSphinx Examples +===================== + +This directory contains some examples of basic PocketSphinx library +usage in C and Python. To compile the C examples, you can build the +target `examples`. If you want to see how it works manually, either +use the library directly in-place, for example, with `simple.c`: + + cmake -DBUILD_SHARED_LIBS=OFF .. && make + cc -o simple simple.c -I../include -Iinclude -L. -lpocketsphinx -lm + +Or if PocketSphinx is installed: + + cc -o simple simple.c $(pkg-config --static --libs --cflags pocketsphinx) + +If PocketSphinx has not been installed, you will need to set the +`POCKETSPHINX_PATH` environment variable to run the examples: + + POCKETSPHINX_PATH=../model ./simple + +The Python scripts, assuming you have installed the `pocketsphinx` +module (see [the top-leve README](../README.md) for instructions), can +just be run as-is: + + python simple.py spam.wav + +Simplest possible example +------------------------- + +The examples `simple.c` and `simple.py` read an entire audio file +(only WAV files are supported) and recognize it as a single, possibly +long, utterance. + +Segmentation +------------ + +The example `segment.py` uses voice activity detection to *segment* +the input stream into speech-like regions. + +Live recognition +---------------- + +Finally, the examples `live.c` and `live.py` do online segmentation +and recognition. diff --git a/examples/live.c b/examples/live.c new file mode 100644 index 0000000..aef4010 --- /dev/null +++ b/examples/live.c @@ -0,0 +1,132 @@ +/* Example of simple PocketSphinx speech segmentation. + * + * MIT license (c) 2022, see LICENSE for more information. + * + * Author: David Huggins-Daines + */ +/** + * @example live.c + * @brief Speech recognition with live audio input and endpointing. + * + * This file shows how to use PocketSphinx in conjunction with `sox` + * to detect and recognize speech from the default audio input device. + * + * This file shows how to use PocketSphinx to recognize a single input + * file. To compile it, assuming you have built the library as in + * \ref unix_install "these directions", you can run: + * + * cmake --build build --target live + * + * Alternately, if PocketSphinx is installed system-wide, you can run: + * + * gcc -o live live.c $(pkg-config --libs --cflags pocketsphinx) + * + * Sadly, this example does *not* seem to work on Windows, even if you + * manage to get `sox` in your `PATH` (which is not easy), because it + * seems that it can't actually read from the microphone. Try + * live_win32.c or live_portaudio.c instead. + */ +#include +#include + +static int global_done = 0; +static void +catch_sig(int signum) +{ + (void)signum; + global_done = 1; +} + +#ifdef WIN32 +#define popen _popen +#define pclose _pclose +#endif + +static FILE * +popen_sox(int sample_rate) +{ + char *soxcmd; + int len; + FILE *sox; + #define SOXCMD "sox -q -r %d -c 1 -b 16 -e signed-integer -d -t raw -" + len = snprintf(NULL, 0, SOXCMD, sample_rate); + if ((soxcmd = malloc(len + 1)) == NULL) + E_FATAL_SYSTEM("Failed to allocate string"); + if (snprintf(soxcmd, len + 1, SOXCMD, sample_rate) != len) + E_FATAL_SYSTEM("snprintf() failed"); + if ((sox = popen(soxcmd, "r")) == NULL) + E_FATAL_SYSTEM("Failed to popen(%s)", soxcmd); + free(soxcmd); + + return sox; +} + +int +main(int argc, char *argv[]) +{ + ps_decoder_t *decoder; + ps_config_t *config; + ps_endpointer_t *ep; + FILE *sox; + short *frame; + size_t frame_size; + + (void)argc; (void)argv; + config = ps_config_init(NULL); + ps_default_search_args(config); + if ((decoder = ps_init(config)) == NULL) + E_FATAL("PocketSphinx decoder init failed\n"); + + if ((ep = ps_endpointer_init(0, 0.0, 0, 0, 0)) == NULL) + E_FATAL("PocketSphinx endpointer init failed\n"); + sox = popen_sox(ps_endpointer_sample_rate(ep)); + frame_size = ps_endpointer_frame_size(ep); + if ((frame = malloc(frame_size * sizeof(frame[0]))) == NULL) + E_FATAL_SYSTEM("Failed to allocate frame"); + if (signal(SIGINT, catch_sig) == SIG_ERR) + E_FATAL_SYSTEM("Failed to set SIGINT handler"); + while (!global_done) { + const int16 *speech; + int prev_in_speech = ps_endpointer_in_speech(ep); + size_t len, end_samples; + if ((len = fread(frame, sizeof(frame[0]), + frame_size, sox)) != frame_size) { + if (len > 0) { + speech = ps_endpointer_end_stream(ep, frame, + frame_size, + &end_samples); + } + else + break; + } else { + speech = ps_endpointer_process(ep, frame); + } + if (speech != NULL) { + const char *hyp; + if (!prev_in_speech) { + fprintf(stderr, "Speech start at %.2f\n", + ps_endpointer_speech_start(ep)); + ps_start_utt(decoder); + } + if (ps_process_raw(decoder, speech, frame_size, FALSE, FALSE) < 0) + E_FATAL("ps_process_raw() failed\n"); + if ((hyp = ps_get_hyp(decoder, NULL)) != NULL) + fprintf(stderr, "PARTIAL RESULT: %s\n", hyp); + if (!ps_endpointer_in_speech(ep)) { + fprintf(stderr, "Speech end at %.2f\n", + ps_endpointer_speech_end(ep)); + ps_end_utt(decoder); + if ((hyp = ps_get_hyp(decoder, NULL)) != NULL) + printf("%s\n", hyp); + } + } + } + free(frame); + if (pclose(sox) < 0) + E_ERROR_SYSTEM("Failed to pclose(sox)"); + ps_endpointer_free(ep); + ps_free(decoder); + ps_config_free(config); + + return 0; +} diff --git a/examples/live.py b/examples/live.py new file mode 100644 index 0000000..2677a29 --- /dev/null +++ b/examples/live.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python3 +""" +Recognize live speech from the default audio device. +""" + +# MIT license (c) 2022, see LICENSE for more information. +# Author: David Huggins-Daines + +from pocketsphinx import Endpointer, Decoder, set_loglevel +import subprocess +import sys +import os + + +def main(): + set_loglevel("INFO") + ep = Endpointer() + decoder = Decoder( + samprate=ep.sample_rate, + ) + soxcmd = f"sox -q -r {ep.sample_rate} -c 1 -b 16 -e signed-integer -d -t raw -" + sox = subprocess.Popen(soxcmd.split(), stdout=subprocess.PIPE) + while True: + frame = sox.stdout.read(ep.frame_bytes) + prev_in_speech = ep.in_speech + speech = ep.process(frame) + if speech is not None: + if not prev_in_speech: + print("Speech start at %.2f" % (ep.speech_start), file=sys.stderr) + decoder.start_utt() + decoder.process_raw(speech) + hyp = decoder.hyp() + if hyp is not None: + print("PARTIAL RESULT:", hyp.hypstr, file=sys.stderr) + if not ep.in_speech: + print("Speech end at %.2f" % (ep.speech_end), file=sys.stderr) + decoder.end_utt() + print(decoder.hyp().hypstr) + + +try: + main() +except KeyboardInterrupt: + pass diff --git a/examples/live_portaudio.c b/examples/live_portaudio.c new file mode 100644 index 0000000..11dcea7 --- /dev/null +++ b/examples/live_portaudio.c @@ -0,0 +1,122 @@ +/* Example of simple PocketSphinx speech segmentation. + * + * MIT license (c) 2022, see LICENSE for more information. + * + * Author: David Huggins-Daines + */ +/** + * @example live_portaudio.c + * @brief Speech recognition with live audio input and endpointing. + * + * This file shows how to use PocketSphinx with microphone input using + * PortAudio (v19 and above). + * + * To compile it, assuming you have built the library as in + * \ref unix_install "these directions", you can run: + * + * cmake --build build --target live_portaudio + * + * Alternately, if PocketSphinx is installed system-wide, you can run: + * + * gcc -o live_portaudio live_portaudio.c \ + * $(pkg-config --libs --cflags pocketsphinx portaudio-2.0) + * + * + */ +#include +#include +#include + +static int global_done = 0; +static void +catch_sig(int signum) +{ + (void)signum; + global_done = 1; +} + +int +main(int argc, char *argv[]) +{ + + PaStream *stream; + PaError err; + ps_decoder_t *decoder; + ps_config_t *config; + ps_endpointer_t *ep; + short *frame; + size_t frame_size; + + (void)argc; (void)argv; + + config = ps_config_init(NULL); + ps_default_search_args(config); + + if ((err = Pa_Initialize()) != paNoError) + E_FATAL("Failed to initialize PortAudio: %s\n", + Pa_GetErrorText(err)); + if ((decoder = ps_init(config)) == NULL) + E_FATAL("PocketSphinx decoder init failed\n"); + if ((ep = ps_endpointer_init(0, 0.0, 0, 0, 0)) == NULL) + E_FATAL("PocketSphinx endpointer init failed\n"); + frame_size = ps_endpointer_frame_size(ep); + if ((frame = malloc(frame_size * sizeof(frame[0]))) == NULL) + E_FATAL_SYSTEM("Failed to allocate frame"); + if ((err = Pa_OpenDefaultStream(&stream, 1, 0, paInt16, + ps_config_int(config, "samprate"), + frame_size, NULL, NULL)) != paNoError) + E_FATAL("Failed to open PortAudio stream: %s\n", + Pa_GetErrorText(err)); + if ((err = Pa_StartStream(stream)) != paNoError) + E_FATAL("Failed to start PortAudio stream: %s\n", + Pa_GetErrorText(err)); + if (signal(SIGINT, catch_sig) == SIG_ERR) + E_FATAL_SYSTEM("Failed to set SIGINT handler"); + while (!global_done) { + const int16 *speech; + int prev_in_speech = ps_endpointer_in_speech(ep); + if ((err = Pa_ReadStream(stream, frame, frame_size)) != paNoError) { + E_ERROR("Error in PortAudio read: %s\n", + Pa_GetErrorText(err)); + break; + } + speech = ps_endpointer_process(ep, frame); + if (speech != NULL) { + const char *hyp; + if (!prev_in_speech) { + fprintf(stderr, "Speech start at %.2f\n", + ps_endpointer_speech_start(ep)); + fflush(stderr); /* For broken MSYS2 terminal */ + ps_start_utt(decoder); + } + if (ps_process_raw(decoder, speech, frame_size, FALSE, FALSE) < 0) + E_FATAL("ps_process_raw() failed\n"); + if ((hyp = ps_get_hyp(decoder, NULL)) != NULL) { + fprintf(stderr, "PARTIAL RESULT: %s\n", hyp); + fflush(stderr); + } + if (!ps_endpointer_in_speech(ep)) { + fprintf(stderr, "Speech end at %.2f\n", + ps_endpointer_speech_end(ep)); + fflush(stderr); + ps_end_utt(decoder); + if ((hyp = ps_get_hyp(decoder, NULL)) != NULL) { + printf("%s\n", hyp); + fflush(stdout); + } + } + } + } + if ((err = Pa_StopStream(stream)) != paNoError) + E_FATAL("Failed to stop PortAudio stream: %s\n", + Pa_GetErrorText(err)); + if ((err = Pa_Terminate()) != paNoError) + E_FATAL("Failed to terminate PortAudio: %s\n", + Pa_GetErrorText(err)); + free(frame); + ps_endpointer_free(ep); + ps_free(decoder); + ps_config_free(config); + + return 0; +} diff --git a/examples/live_pulseaudio.c b/examples/live_pulseaudio.c new file mode 100644 index 0000000..693d276 --- /dev/null +++ b/examples/live_pulseaudio.c @@ -0,0 +1,110 @@ +/* Example of simple PocketSphinx speech segmentation. + * + * MIT license (c) 2022, see LICENSE for more information. + * + * Author: David Huggins-Daines + */ +/** + * @example live_pulseaudio.c + * @brief Speech recognition with live audio input and endpointing. + * + * This file shows how to use PocketSphinx with microphone input using + * PulseAudio. + * + * To compile it, assuming you have built the library as in + * \ref unix_install "these directions", you can run: + * + * cmake --build build --target live_pulseaudio + * + * Alternately, if PocketSphinx is installed system-wide, you can run: + * + * gcc -o live_pulseaudio live_pulseaudio.c \ + * $(pkg-config --libs --cflags pocketsphinx libpulse-simple) + * + * + */ +#include +#include +#include +#include + +static int global_done = 0; +static void +catch_sig(int signum) +{ + (void)signum; + global_done = 1; +} + +int +main(int argc, char *argv[]) +{ + + pa_simple *s; + pa_sample_spec ss; + int err; + ps_decoder_t *decoder; + ps_config_t *config; + ps_endpointer_t *ep; + short *frame; + size_t frame_size; + + (void)argc; (void)argv; + + config = ps_config_init(NULL); + ps_default_search_args(config); + if ((decoder = ps_init(config)) == NULL) + E_FATAL("PocketSphinx decoder init failed\n"); + if ((ep = ps_endpointer_init(0, 0.0, 0, 0, 0)) == NULL) + E_FATAL("PocketSphinx endpointer init failed\n"); + frame_size = ps_endpointer_frame_size(ep); + if ((frame = malloc(frame_size * sizeof(frame[0]))) == NULL) + E_FATAL_SYSTEM("Failed to allocate frame"); + + ss.format = PA_SAMPLE_S16NE; + ss.channels = 1; + ss.rate = ps_config_int(config, "samprate"); + if ((s = pa_simple_new(NULL, "live_pulseaudio", PA_STREAM_RECORD, NULL, + "live", &ss, NULL, NULL, &err)) == NULL) + E_FATAL("Failed to connect to PulseAudio: %s\n", + pa_strerror(err)); + if (signal(SIGINT, catch_sig) == SIG_ERR) + E_FATAL_SYSTEM("Failed to set SIGINT handler"); + while (!global_done) { + const int16 *speech; + int prev_in_speech = ps_endpointer_in_speech(ep); + if (pa_simple_read(s, frame, + frame_size * sizeof(frame[0]), &err) < 0) { + E_ERROR("Error in pa_simple_read: %s\n", + pa_strerror(err)); + break; + } + speech = ps_endpointer_process(ep, frame); + if (speech != NULL) { + const char *hyp; + if (!prev_in_speech) { + fprintf(stderr, "Speech start at %.2f\n", + ps_endpointer_speech_start(ep)); + ps_start_utt(decoder); + } + if (ps_process_raw(decoder, speech, frame_size, FALSE, FALSE) < 0) + E_FATAL("ps_process_raw() failed\n"); + if ((hyp = ps_get_hyp(decoder, NULL)) != NULL) + fprintf(stderr, "PARTIAL RESULT: %s\n", hyp); + if (!ps_endpointer_in_speech(ep)) { + fprintf(stderr, "Speech end at %.2f\n", + ps_endpointer_speech_end(ep)); + ps_end_utt(decoder); + if ((hyp = ps_get_hyp(decoder, NULL)) != NULL) + printf("%s\n", hyp); + } + } + } + pa_simple_free(s); + free(frame); + ps_endpointer_free(ep); + ps_free(decoder); + ps_config_free(config); + + return 0; +} diff --git a/examples/live_win32.c b/examples/live_win32.c new file mode 100644 index 0000000..3c74149 --- /dev/null +++ b/examples/live_win32.c @@ -0,0 +1,160 @@ +/* Example of simple PocketSphinx speech segmentation. + * + * MIT license (c) 2022, see LICENSE for more information. + * + * Author: David Huggins-Daines + */ +/** + * @example live_win32.c + * @brief Speech recognition with live audio input and endpointing. + * + * This file shows how to use PocketSphinx with microphone input using + * the Win32 Waveform Audio API (the only one of many terrible audio + * APIs on Windows that isn't made even more terrible by requiring you + * to use C++ in an unmanaged environment). + * + * To build it, you should be able to find a "live_win32" target in + * your favorite IDE after running CMake - in Visual Studio Code, look + * in the "CMake" tab. + * + * Microphones on Windows tend to be miscalibrated with the recording + * level set much too high by default, so the endpointer may give a + * lot of false positives at first. Programs like Audacity seem to + * work around this somehow, but I don't really know how they do it. + */ + +#include +#include +#include +#include + +static int global_done = 0; +static void +catch_sig(int signum) +{ + (void)signum; + global_done = 1; +} + +#define CHECK(expr) \ + do { \ + int err; \ + if ((err = expr) != 0) \ + { \ + char errbuf[MAXERRORLENGTH]; \ + waveInGetErrorText(err, errbuf, sizeof(errbuf)); \ + E_FATAL("error %08x: %s\n", err, errbuf); \ + } \ + } while (0) + +int main(int argc, char *argv[]) +{ + ps_decoder_t *decoder; + ps_config_t *config; + ps_endpointer_t *ep; + size_t frame_size; + HWAVEIN wavein; + WAVEFORMATEX wavefmt; + HANDLE event; + /* A large but somewhat arbitrary number of buffers. */ +#define NBUF 100 /* 100 * 0.03 = 3 seconds */ + WAVEHDR hdrs[NBUF]; + int i; + + (void)argc; (void)argv; + /* Initialize decoder and endpointer */ + config = ps_config_init(NULL); + ps_default_search_args(config); + if ((decoder = ps_init(config)) == NULL) + E_FATAL("PocketSphinx decoder init failed\n"); + if ((ep = ps_endpointer_init(0, 0.0, 0, + ps_config_int(config, "samprate"), + 0)) == NULL) + E_FATAL("PocketSphinx endpointer init failed\n"); + /* Frame size in samples (not bytes) */ + frame_size = ps_endpointer_frame_size(ep); + /* Tell Windows what format we want (NOTE: may not be available...) */ + wavefmt.wFormatTag = WAVE_FORMAT_PCM; + wavefmt.nChannels = 1; + wavefmt.nSamplesPerSec = ps_endpointer_sample_rate(ep); + wavefmt.wBitsPerSample = 16; + wavefmt.nBlockAlign = 2; + wavefmt.nAvgBytesPerSec = wavefmt.nSamplesPerSec * wavefmt.nBlockAlign; + wavefmt.cbSize = 0; + /* Create an event to tell us when a new buffer is ready. */ + event = CreateEvent(NULL, TRUE, FALSE, "buffer_ready"); + /* Open the recording device. */ + CHECK(waveInOpen(&wavein, WAVE_MAPPER, &wavefmt, + (DWORD_PTR)event, 0, CALLBACK_EVENT)); + /* Create buffers. */ + memset(hdrs, 0, sizeof(hdrs)); + for (i = 0; i < NBUF; ++i) { + hdrs[i].lpData = malloc(frame_size * 2); + hdrs[i].dwBufferLength = (DWORD)frame_size * 2; + CHECK(waveInPrepareHeader(wavein, &hdrs[i], sizeof(hdrs[i]))); + CHECK(waveInAddBuffer(wavein, &hdrs[i], sizeof(hdrs[i]))); + } + /* Start recording. */ + CHECK(waveInStart(wavein)); + i = 0; + if (signal(SIGINT, catch_sig) == SIG_ERR) + E_FATAL_SYSTEM("Failed to set SIGINT handler"); + while (!global_done) { + const int16 *speech; + WaitForSingleObject(event, INFINITE); + /* Get as many buffers as we can. */ + while (hdrs[i].dwFlags & WHDR_DONE) { + int prev_in_speech = ps_endpointer_in_speech(ep); + int16 *frame = (int16 *)hdrs[i].lpData; + /* Process them one by one. */ + speech = ps_endpointer_process(ep, frame); + CHECK(waveInUnprepareHeader(wavein, &hdrs[i], sizeof(hdrs[i]))); + CHECK(waveInPrepareHeader(wavein, &hdrs[i], sizeof(hdrs[i]))); + CHECK(waveInAddBuffer(wavein, &hdrs[i], sizeof(hdrs[i]))); + if (++i == NBUF) + i = 0; + if (speech != NULL) { + const char *hyp; + if (!prev_in_speech) { + fprintf(stderr, "Speech start at %.2f\n", + ps_endpointer_speech_start(ep)); + fflush(stderr); /* For broken MSYS2 terminal */ + ps_start_utt(decoder); + } + if (ps_process_raw(decoder, speech, frame_size, FALSE, FALSE) < 0) + E_FATAL("ps_process_raw() failed\n"); + if ((hyp = ps_get_hyp(decoder, NULL)) != NULL) { + fprintf(stderr, "PARTIAL RESULT: %s\n", hyp); + fflush(stderr); + } + if (!ps_endpointer_in_speech(ep)) { + fprintf(stderr, "Speech end at %.2f\n", + ps_endpointer_speech_end(ep)); + fflush(stderr); + ps_end_utt(decoder); + if ((hyp = ps_get_hyp(decoder, NULL)) != NULL) { + printf("%s\n", hyp); + fflush(stdout); + } + } + } + } + /* Wait for another buffer. */ + ResetEvent(event); + } + /* Stop recording, cancel all buffers, and free them. */ + CHECK(waveInStop(wavein)); + CHECK(waveInReset(wavein)); + for (i = 0; i < NBUF; ++i) { + if (hdrs[i].dwFlags & WHDR_PREPARED) + CHECK(waveInUnprepareHeader(wavein, &hdrs[i], + sizeof(hdrs[i]))); + free(hdrs[i].lpData); + } + CloseHandle(event); + ps_endpointer_free(ep); + ps_free(decoder); + ps_config_free(config); + + return 0; +} diff --git a/examples/segment.py b/examples/segment.py new file mode 100644 index 0000000..ad22e82 --- /dev/null +++ b/examples/segment.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 +""" +Segment speech endlessly from the default audio device. +""" + +# MIT license (c) 2022, see LICENSE for more information. +# Author: David Huggins-Daines + +from pocketsphinx import Segmenter +import subprocess + +seg = Segmenter() +incmd = f"sox -q -r {seg.sample_rate} -c 1 -b 16 -e signed-integer -d -t raw -".split() +outcmd = f"sox -q -t raw -r {seg.sample_rate} -c 1 -b 16 -e signed-integer -".split() +with subprocess.Popen(incmd, stdout=subprocess.PIPE) as sox: + try: + for idx, speech in enumerate(seg.segment(sox.stdout)): + outfile = "%03d_%.2f-%.2f.wav" % ( + idx, + speech.start_time, + speech.end_time, + ) + with subprocess.Popen(outcmd + [outfile], stdin=subprocess.PIPE) as soxout: + soxout.stdin.write(speech.pcm) + print("Wrote %s" % outfile) + except KeyboardInterrupt: + pass diff --git a/examples/simple.c b/examples/simple.c new file mode 100644 index 0000000..bbe5215 --- /dev/null +++ b/examples/simple.c @@ -0,0 +1,85 @@ +/* Example of simple PocketSphinx recognition. + * + * MIT license (c) 2022, see LICENSE for more information. + * + * Author: David Huggins-Daines + */ +/** + * @example simple.c + * @brief Simplest possible example of speech recognition in C. + * + * This file shows how to use PocketSphinx to recognize a single input + * file. To compile it, assuming you have built the library as in + * \ref unix_install "these directions", you can run: + * + * cmake --build build --target simple + * + * Alternately, if PocketSphinx is installed system-wide, you can run: + * + * gcc -o simple simple.c $(pkg-config --libs --cflags pocketsphinx) + * + * + */ + +#include +#include + +int +main(int argc, char *argv[]) +{ + ps_decoder_t *decoder; + ps_config_t *config; + FILE *fh; + short *buf; + size_t len, nsamples; + + /* Look for a single audio file as input parameter. */ + if (argc < 2) + E_FATAL("Usage: %s FILE\n"); + if ((fh = fopen(argv[1], "rb")) == NULL) + E_FATAL_SYSTEM("Failed to open %s", argv[1]); + + /* Get the size of the input. */ + if (fseek(fh, 0, SEEK_END) < 0) + E_FATAL_SYSTEM("Unable to find end of input file %s", argv[1]); + len = ftell(fh); + rewind(fh); + + /* Initialize configuration from input file. */ + config = ps_config_init(NULL); + ps_default_search_args(config); + if (ps_config_soundfile(config, fh, argv[1]) < 0) + E_FATAL("Unsupported input file %s\n", argv[1]); + if ((decoder = ps_init(config)) == NULL) + E_FATAL("PocketSphinx decoder init failed\n"); + + /* Allocate data (skipping header) */ + len -= ftell(fh); + if ((buf = malloc(len)) == NULL) + E_FATAL_SYSTEM("Unable to allocate %d bytes", len); + /* Read input */ + nsamples = fread(buf, sizeof(buf[0]), len / sizeof(buf[0]), fh); + if (nsamples != len / sizeof(buf[0])) + E_FATAL_SYSTEM("Unable to read %d samples", len / sizeof(buf[0])); + + /* Recognize it! */ + if (ps_start_utt(decoder) < 0) + E_FATAL("Failed to start processing\n"); + if (ps_process_raw(decoder, buf, nsamples, FALSE, TRUE) < 0) + E_FATAL("ps_process_raw() failed\n"); + if (ps_end_utt(decoder) < 0) + E_FATAL("Failed to end processing\n"); + + /* Print the result */ + if (ps_get_hyp(decoder, NULL) != NULL) + printf("%s\n", ps_get_hyp(decoder, NULL)); + + /* Clean up */ + if (fclose(fh) < 0) + E_FATAL_SYSTEM("Failed to close %s", argv[1]); + free(buf); + ps_free(decoder); + ps_config_free(config); + + return 0; +} diff --git a/examples/simple.py b/examples/simple.py new file mode 100644 index 0000000..4191cec --- /dev/null +++ b/examples/simple.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 +""" +Recognize a single utterance from a WAV file. + +Supporting other file types is left as an exercise to the reader. +""" + +# MIT license (c) 2022, see LICENSE for more information. +# Author: David Huggins-Daines + +from pocketsphinx import Decoder +import argparse +import wave + +parser = argparse.ArgumentParser(description=__doc__) +parser.add_argument("audio", help="Audio file to recognize") +args = parser.parse_args() +with wave.open(args.audio, "rb") as audio: + decoder = Decoder(samprate=audio.getframerate()) + decoder.start_utt() + decoder.process_raw(audio.getfp().read(), full_utt=True) + decoder.end_utt() + print(decoder.hyp().hypstr) diff --git a/gst/CMakeLists.txt b/gst/CMakeLists.txt new file mode 100644 index 0000000..574baa0 --- /dev/null +++ b/gst/CMakeLists.txt @@ -0,0 +1,21 @@ +find_package(PkgConfig REQUIRED) +pkg_check_modules(GOBJECT gobject-2.0) +pkg_check_modules(GSTREAMER gstreamer-1.0 gstreamer-base-1.0) +add_library(gstpocketsphinx SHARED gstpocketsphinx.c) +set_property(TARGET pocketsphinx PROPERTY POSITION_INDEPENDENT_CODE on) +target_link_libraries(gstpocketsphinx PUBLIC + pocketsphinx + ${GSTREAMER_LIBRARIES} + ${GOBJECT_LIBRARIES} + ) +target_include_directories( + gstpocketsphinx PRIVATE ${CMAKE_BINARY_DIR} + gstpocketsphinx PRIVATE ${CMAKE_SOURCE_DIR}/src + gstpocketsphinx PUBLIC ${CMAKE_SOURCE_DIR}/include + gstpocketsphinx PUBLIC ${CMAKE_BINARY_DIR}/include + gstpocketsphinx INTERFACE ${CMAKE_SOURCE_DIR}/include + gstpocketsphinx INTERFACE ${CMAKE_BINARY_DIR}/include + gstpocketsphinx PUBLIC ${GSTREAMER_INCLUDE_DIRS} ${GOBJECT_INCLUDE_DIRS} + ) +message("Installing GStreamer plugin to ${CMAKE_INSTALL_FULL_LIBDIR}/gstreamer-1.0") +install(TARGETS gstpocketsphinx LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/gstreamer-1.0) diff --git a/src/gst-plugin/gstpocketsphinx.c b/gst/gstpocketsphinx.c similarity index 71% rename from src/gst-plugin/gstpocketsphinx.c rename to gst/gstpocketsphinx.c index 2198e5f..2fd7e50 100644 --- a/src/gst-plugin/gstpocketsphinx.c +++ b/gst/gstpocketsphinx.c @@ -40,7 +40,7 @@ /** * SECTION:element-pocketsphix * - * The element runs the speech recohgnition on incomming audio buffers and + * The element runs the speech recohgnition on incoming audio buffers and * generates an element messages named "pocketsphinx" * for each hypothesis and one for the final result. The message's structure * contains these fields: @@ -91,8 +91,9 @@ #include #include -#include -#include +#include +#include "util/strfuncs.h" +#include "util/ckd_alloc.h" #include "gstpocketsphinx.h" @@ -134,6 +135,7 @@ enum PROP_FSG_FILE, PROP_ALLPHONE_FILE, PROP_KWS_FILE, + PROP_JSGF_FILE, PROP_FWDFLAT, PROP_BESTPATH, PROP_MAXHMMPF, @@ -152,12 +154,6 @@ enum * Static data. */ -/* Default command line. (will go away soon and be constructed using properties) */ -static char *default_argv[] = { - "gst-pocketsphinx", -}; -static const int default_argc = sizeof(default_argv)/sizeof(default_argv[0]); - static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE("sink", GST_PAD_SINK, @@ -175,6 +171,12 @@ static GstStaticPadTemplate src_factory = GST_STATIC_CAPS("text/plain") ); +static void +wrap_ps_free(void *ps) +{ + (void)ps_free((ps_decoder_t *)ps); +} + /* * Boxing of ps_decoder_t. */ @@ -188,7 +190,7 @@ ps_decoder_get_type(void) ("PSDecoder", /* Conveniently, these should just work. */ (GBoxedCopyFunc) ps_retain, - (GBoxedFreeFunc) ps_free); + (GBoxedFreeFunc) wrap_ps_free); } return ps_decoder_type; @@ -248,12 +250,24 @@ gst_pocketsphinx_class_init(GstPocketSphinxClass * klass) "List of keyphrases for spotting", NULL, G_PARAM_READWRITE)); + g_object_class_install_property + (gobject_class, PROP_JSGF_FILE, + g_param_spec_string("jsgf", "Grammar file", + "File with grammar in Java Speech Grammar Format (JSGF)", + NULL, + G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_DICT_FILE, g_param_spec_string("dict", "Dictionary File", "Dictionary File", NULL, G_PARAM_READWRITE)); + g_object_class_install_property + (gobject_class, PROP_MLLR_FILE, + g_param_spec_string("mllr", "MLLR transformation file", + "Transformation to apply to means and variances", + NULL, + G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_FWDFLAT, g_param_spec_boolean("fwdflat", "Flat Lexicon Search", @@ -344,9 +358,9 @@ gst_pocketsphinx_set_string(GstPocketSphinx *ps, const gchar *key, const GValue *value) { if (value != NULL) { - cmd_ln_set_str_r(ps->config, key, g_value_get_string(value)); + ps_config_set_str(ps->config, key, g_value_get_string(value)); } else { - cmd_ln_set_str_r(ps->config, key, NULL); + ps_config_set_str(ps->config, key, NULL); } } @@ -354,21 +368,21 @@ static void gst_pocketsphinx_set_int(GstPocketSphinx *ps, const gchar *key, const GValue *value) { - cmd_ln_set_int32_r(ps->config, key, g_value_get_int(value)); + ps_config_set_int(ps->config, key, g_value_get_int(value)); } static void gst_pocketsphinx_set_boolean(GstPocketSphinx *ps, const gchar *key, const GValue *value) { - cmd_ln_set_boolean_r(ps->config, key, g_value_get_boolean(value)); + ps_config_set_bool(ps->config, key, g_value_get_boolean(value)); } static void gst_pocketsphinx_set_double(GstPocketSphinx *ps, const gchar *key, const GValue *value) { - cmd_ln_set_float_r(ps->config, key, g_value_get_double(value)); + ps_config_set_float(ps->config, key, g_value_get_double(value)); } static void @@ -380,77 +394,91 @@ gst_pocketsphinx_set_property(GObject * object, guint prop_id, switch (prop_id) { case PROP_HMM_DIR: - gst_pocketsphinx_set_string(ps, "-hmm", value); + gst_pocketsphinx_set_string(ps, "hmm", value); break; case PROP_LM_FILE: /* FSG and LM are mutually exclusive. */ - gst_pocketsphinx_set_string(ps, "-lm", value); - gst_pocketsphinx_set_string(ps, "-lmctl", NULL); - gst_pocketsphinx_set_string(ps, "-fsg", NULL); - gst_pocketsphinx_set_string(ps, "-allphone", NULL); - gst_pocketsphinx_set_string(ps, "-kws", NULL); + gst_pocketsphinx_set_string(ps, "lm", value); + gst_pocketsphinx_set_string(ps, "lmctl", NULL); + gst_pocketsphinx_set_string(ps, "fsg", NULL); + gst_pocketsphinx_set_string(ps, "allphone", NULL); + gst_pocketsphinx_set_string(ps, "kws", NULL); + gst_pocketsphinx_set_string(ps, "jsgf", NULL); break; case PROP_LMCTL_FILE: /* FSG and LM are mutually exclusive. */ - gst_pocketsphinx_set_string(ps, "-lm", NULL); - gst_pocketsphinx_set_string(ps, "-lmctl", value); - gst_pocketsphinx_set_string(ps, "-fsg", NULL); - gst_pocketsphinx_set_string(ps, "-allphone", NULL); - gst_pocketsphinx_set_string(ps, "-kws", NULL); + gst_pocketsphinx_set_string(ps, "lm", NULL); + gst_pocketsphinx_set_string(ps, "lmctl", value); + gst_pocketsphinx_set_string(ps, "fsg", NULL); + gst_pocketsphinx_set_string(ps, "allphone", NULL); + gst_pocketsphinx_set_string(ps, "kws", NULL); + gst_pocketsphinx_set_string(ps, "jsgf", NULL); break; case PROP_DICT_FILE: - gst_pocketsphinx_set_string(ps, "-dict", value); + gst_pocketsphinx_set_string(ps, "dict", value); break; case PROP_MLLR_FILE: - gst_pocketsphinx_set_string(ps, "-mllr", value); + gst_pocketsphinx_set_string(ps, "mllr", value); break; case PROP_FSG_FILE: /* FSG and LM are mutually exclusive */ - gst_pocketsphinx_set_string(ps, "-lm", NULL); - gst_pocketsphinx_set_string(ps, "-lmctl", NULL); - gst_pocketsphinx_set_string(ps, "-fsg", value); - gst_pocketsphinx_set_string(ps, "-allphone", NULL); - gst_pocketsphinx_set_string(ps, "-kws", NULL); + gst_pocketsphinx_set_string(ps, "lm", NULL); + gst_pocketsphinx_set_string(ps, "lmctl", NULL); + gst_pocketsphinx_set_string(ps, "fsg", value); + gst_pocketsphinx_set_string(ps, "allphone", NULL); + gst_pocketsphinx_set_string(ps, "kws", NULL); + gst_pocketsphinx_set_string(ps, "jsgf", NULL); break; case PROP_ALLPHONE_FILE: /* FSG and LM are mutually exclusive. */ - gst_pocketsphinx_set_string(ps, "-lm", NULL); - gst_pocketsphinx_set_string(ps, "-lmctl", NULL); - gst_pocketsphinx_set_string(ps, "-fsg", NULL); - gst_pocketsphinx_set_string(ps, "-allphone", value); - gst_pocketsphinx_set_string(ps, "-kws", NULL); + gst_pocketsphinx_set_string(ps, "lm", NULL); + gst_pocketsphinx_set_string(ps, "lmctl", NULL); + gst_pocketsphinx_set_string(ps, "fsg", NULL); + gst_pocketsphinx_set_string(ps, "allphone", value); + gst_pocketsphinx_set_string(ps, "kws", NULL); + gst_pocketsphinx_set_string(ps, "jsgf", NULL); break; case PROP_KWS_FILE: /* FSG and LM are mutually exclusive. */ - gst_pocketsphinx_set_string(ps, "-lm", NULL); - gst_pocketsphinx_set_string(ps, "-lmctl", NULL); - gst_pocketsphinx_set_string(ps, "-fsg", NULL); - gst_pocketsphinx_set_string(ps, "-allphone", NULL); - gst_pocketsphinx_set_string(ps, "-kws", value); + gst_pocketsphinx_set_string(ps, "lm", NULL); + gst_pocketsphinx_set_string(ps, "lmctl", NULL); + gst_pocketsphinx_set_string(ps, "fsg", NULL); + gst_pocketsphinx_set_string(ps, "allphone", NULL); + gst_pocketsphinx_set_string(ps, "jsgf", NULL); + gst_pocketsphinx_set_string(ps, "kws", value); + break; + case PROP_JSGF_FILE: + /* FSG and LM are mutually exclusive. */ + gst_pocketsphinx_set_string(ps, "lm", NULL); + gst_pocketsphinx_set_string(ps, "lmctl", NULL); + gst_pocketsphinx_set_string(ps, "fsg", NULL); + gst_pocketsphinx_set_string(ps, "allphone", NULL); + gst_pocketsphinx_set_string(ps, "kws", NULL); + gst_pocketsphinx_set_string(ps, "jsgf", value); break; case PROP_FWDFLAT: - gst_pocketsphinx_set_boolean(ps, "-fwdflat", value); + gst_pocketsphinx_set_boolean(ps, "fwdflat", value); break; case PROP_BESTPATH: - gst_pocketsphinx_set_boolean(ps, "-bestpath", value); + gst_pocketsphinx_set_boolean(ps, "bestpath", value); break; case PROP_MAXHMMPF: - gst_pocketsphinx_set_int(ps, "-maxhmmpf", value); + gst_pocketsphinx_set_int(ps, "maxhmmpf", value); break; case PROP_MAXWPF: - gst_pocketsphinx_set_int(ps, "-maxwpf", value); + gst_pocketsphinx_set_int(ps, "maxwpf", value); break; case PROP_BEAM: - gst_pocketsphinx_set_double(ps, "-beam", value); + gst_pocketsphinx_set_double(ps, "beam", value); break; case PROP_PBEAM: - gst_pocketsphinx_set_double(ps, "-pbeam", value); + gst_pocketsphinx_set_double(ps, "pbeam", value); break; case PROP_WBEAM: - gst_pocketsphinx_set_double(ps, "-wbeam", value); + gst_pocketsphinx_set_double(ps, "wbeam", value); break; case PROP_DSRATIO: - gst_pocketsphinx_set_int(ps, "-ds", value); + gst_pocketsphinx_set_int(ps, "ds", value); break; @@ -460,11 +488,12 @@ gst_pocketsphinx_set_property(GObject * object, guint prop_id, ps->latdir = g_strdup(g_value_get_string(value)); break; case PROP_LM_NAME: - gst_pocketsphinx_set_string(ps, "-fsg", NULL); - gst_pocketsphinx_set_string(ps, "-lm", NULL); - gst_pocketsphinx_set_string(ps, "-allphone", NULL); - gst_pocketsphinx_set_string(ps, "-kws", NULL); - gst_pocketsphinx_set_string(ps, "-lmname", value); + gst_pocketsphinx_set_string(ps, "fsg", NULL); + gst_pocketsphinx_set_string(ps, "lm", NULL); + gst_pocketsphinx_set_string(ps, "allphone", NULL); + gst_pocketsphinx_set_string(ps, "kws", NULL); + gst_pocketsphinx_set_string(ps, "jsgf", NULL); + gst_pocketsphinx_set_string(ps, "lmname", value); /** * Chances are that lmctl is already loaded and all @@ -473,7 +502,7 @@ gst_pocketsphinx_set_property(GObject * object, guint prop_id, */ if (value != NULL && ps->ps) { - ps_set_search(ps->ps, g_value_get_string(value)); + ps_activate_search(ps->ps, g_value_get_string(value)); } break; default: @@ -497,58 +526,61 @@ gst_pocketsphinx_get_property(GObject * object, guint prop_id, g_value_set_boxed(value, ps->ps); break; case PROP_HMM_DIR: - g_value_set_string(value, cmd_ln_str_r(ps->config, "-hmm")); + g_value_set_string(value, ps_config_str(ps->config, "hmm")); break; case PROP_LM_FILE: - g_value_set_string(value, cmd_ln_str_r(ps->config, "-lm")); + g_value_set_string(value, ps_config_str(ps->config, "lm")); break; case PROP_LMCTL_FILE: - g_value_set_string(value, cmd_ln_str_r(ps->config, "-lmctl")); + g_value_set_string(value, ps_config_str(ps->config, "lmctl")); break; case PROP_LM_NAME: - g_value_set_string(value, cmd_ln_str_r(ps->config, "-lmname")); + g_value_set_string(value, ps_config_str(ps->config, "lmname")); break; case PROP_DICT_FILE: - g_value_set_string(value, cmd_ln_str_r(ps->config, "-dict")); + g_value_set_string(value, ps_config_str(ps->config, "dict")); break; case PROP_MLLR_FILE: - g_value_set_string(value, cmd_ln_str_r(ps->config, "-mllr")); + g_value_set_string(value, ps_config_str(ps->config, "mllr")); break; case PROP_FSG_FILE: - g_value_set_string(value, cmd_ln_str_r(ps->config, "-fsg")); + g_value_set_string(value, ps_config_str(ps->config, "fsg")); break; case PROP_ALLPHONE_FILE: - g_value_set_string(value, cmd_ln_str_r(ps->config, "-allphone")); + g_value_set_string(value, ps_config_str(ps->config, "allphone")); break; case PROP_KWS_FILE: - g_value_set_string(value, cmd_ln_str_r(ps->config, "-kws")); + g_value_set_string(value, ps_config_str(ps->config, "kws")); + break; + case PROP_JSGF_FILE: + g_value_set_string(value, ps_config_str(ps->config, "jsgf")); break; case PROP_FWDFLAT: - g_value_set_boolean(value, cmd_ln_boolean_r(ps->config, "-fwdflat")); + g_value_set_boolean(value, ps_config_bool(ps->config, "fwdflat")); break; case PROP_BESTPATH: - g_value_set_boolean(value, cmd_ln_boolean_r(ps->config, "-bestpath")); + g_value_set_boolean(value, ps_config_bool(ps->config, "bestpath")); break; case PROP_LATDIR: g_value_set_string(value, ps->latdir); break; case PROP_MAXHMMPF: - g_value_set_int(value, cmd_ln_int32_r(ps->config, "-maxhmmpf")); + g_value_set_int(value, ps_config_int(ps->config, "maxhmmpf")); break; case PROP_MAXWPF: - g_value_set_int(value, cmd_ln_int32_r(ps->config, "-maxwpf")); + g_value_set_int(value, ps_config_int(ps->config, "maxwpf")); break; case PROP_BEAM: - g_value_set_double(value, cmd_ln_float_r(ps->config, "-beam")); + g_value_set_double(value, ps_config_float(ps->config, "beam")); break; case PROP_PBEAM: - g_value_set_double(value, cmd_ln_float_r(ps->config, "-pbeam")); + g_value_set_double(value, ps_config_float(ps->config, "pbeam")); break; case PROP_WBEAM: - g_value_set_double(value, cmd_ln_float_r(ps->config, "-wbeam")); + g_value_set_double(value, ps_config_float(ps->config, "wbeam")); break; case PROP_DSRATIO: - g_value_set_int(value, cmd_ln_int32_r(ps->config, "-ds")); + g_value_set_int(value, ps_config_int(ps->config, "ds")); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); @@ -562,7 +594,7 @@ gst_pocketsphinx_finalize(GObject * gobject) GstPocketSphinx *ps = GST_POCKETSPHINX(gobject); ps_free(ps->ps); - cmd_ln_free_r(ps->config); + ps_config_free(ps->config); g_free(ps->last_result); g_free(ps->latdir); @@ -576,9 +608,10 @@ gst_pocketsphinx_init(GstPocketSphinx * ps) gst_pad_new_from_static_template(&sink_factory, "sink"); ps->srcpad = gst_pad_new_from_static_template(&src_factory, "src"); + ps->adapter = gst_adapter_new(); /* Parse default command-line options. */ - ps->config = cmd_ln_parse_r(NULL, ps_args(), default_argc, default_argv, FALSE); + ps->config = ps_config_init(NULL); ps_default_search_args(ps->config); /* Set up pads. */ @@ -609,6 +642,15 @@ gst_pocketsphinx_change_state(GstElement *element, GstStateChange transition) ("Failed to initialize PocketSphinx")); return GST_STATE_CHANGE_FAILURE; } + ps->ep = ps_endpointer_init(0, 0.0, 0, + ps_config_int(ps->config, "samprate"), 0); + if (ps->ep == NULL) { + GST_ELEMENT_ERROR(GST_ELEMENT(ps), LIBRARY, INIT, + ("Failed to initialize PocketSphinx endpointer"), + ("Failed to initialize PocketSphinx endpointer")); + return GST_STATE_CHANGE_FAILURE; + } + ps->frame_size = ps_endpointer_frame_size(ps->ep) * 2; break; case GST_STATE_CHANGE_READY_TO_NULL: ps_free(ps->ps); @@ -637,51 +679,45 @@ static GstFlowReturn gst_pocketsphinx_chain(GstPad * pad, GstObject *parent, GstBuffer * buffer) { GstPocketSphinx *ps; - GstMapInfo info; - gboolean in_speech; + (void)pad; ps = GST_POCKETSPHINX(parent); - /* Start an utterance for the first buffer we get */ - if (!ps->listening_started) { - ps->listening_started = TRUE; - ps->speech_started = FALSE; - ps_start_utt(ps->ps); - } - - gst_buffer_map (buffer, &info, GST_MAP_READ); - ps_process_raw(ps->ps, - (short*) info.data, - info.size / sizeof(short), - FALSE, FALSE); - gst_buffer_unmap (buffer, &info); - - in_speech = ps_get_in_speech(ps->ps); - if (in_speech && !ps->speech_started) { - ps->speech_started = TRUE; - } - if (!in_speech && ps->speech_started) { - gst_pocketsphinx_finalize_utt(ps); - } else if (ps->last_result_time == 0 - /* Get a partial result every now and then, see if it is different. */ - /* Check every 100 milliseconds. */ - || (GST_BUFFER_TIMESTAMP(buffer) - ps->last_result_time) > 100*10*1000) { - int32 score; - char const *hyp; - - hyp = ps_get_hyp(ps->ps, &score); - ps->last_result_time = GST_BUFFER_TIMESTAMP(buffer); - if (hyp && strlen(hyp) > 0) { - if (ps->last_result == NULL || 0 != strcmp(ps->last_result, hyp)) { - g_free(ps->last_result); - ps->last_result = g_strdup(hyp); - gst_pocketsphinx_post_message(ps, FALSE, ps->last_result_time, - ps_get_prob(ps->ps), hyp); + gst_adapter_push(ps->adapter, buffer); + while (gst_adapter_available(ps->adapter) >= ps->frame_size) { + const guint *data = gst_adapter_map(ps->adapter, ps->frame_size); + int prev_in_speech = ps_endpointer_in_speech(ps->ep); + const int16 *speech = ps_endpointer_process(ps->ep, (int16 *)data); + if (speech != NULL) { + if (!prev_in_speech) + ps_start_utt(ps->ps); + ps_process_raw(ps->ps, + speech, ps->frame_size / 2, + FALSE, FALSE); + if (!ps_endpointer_in_speech(ps->ep)) { + gst_pocketsphinx_finalize_utt(ps); + } else if (ps->last_result_time == 0 + /* Get a partial result every now and then, see if it is different. */ + /* Check every 100 milliseconds. */ + || (GST_BUFFER_TIMESTAMP(buffer) - ps->last_result_time) > 100*10*1000) { + int32 score; + char const *hyp; + + hyp = ps_get_hyp(ps->ps, &score); + ps->last_result_time = GST_BUFFER_TIMESTAMP(buffer); + if (hyp && strlen(hyp) > 0) { + if (ps->last_result == NULL || 0 != strcmp(ps->last_result, hyp)) { + g_free(ps->last_result); + ps->last_result = g_strdup(hyp); + gst_pocketsphinx_post_message(ps, FALSE, ps->last_result_time, + ps_get_prob(ps->ps), hyp); + } + } } } - } - - gst_buffer_unref(buffer); + gst_adapter_unmap(ps->adapter); + gst_adapter_flush(ps->adapter, ps->frame_size); + } return GST_FLOW_OK; } @@ -694,11 +730,8 @@ gst_pocketsphinx_finalize_utt(GstPocketSphinx *ps) int32 score; hyp = NULL; - if (!ps->listening_started) - return; ps_end_utt(ps->ps); - ps->listening_started = FALSE; hyp = ps_get_hyp(ps->ps, &score); if (hyp) { @@ -746,8 +779,9 @@ static void gst_pocketsphinx_log(void *user_data, err_lvl_t lvl, const char *fmt, ...) { static const int gst_level[ERR_MAX] = {GST_LEVEL_DEBUG, GST_LEVEL_INFO, - GST_LEVEL_INFO, GST_LEVEL_WARNING, GST_LEVEL_ERROR, GST_LEVEL_ERROR}; + GST_LEVEL_WARNING, GST_LEVEL_ERROR, GST_LEVEL_ERROR}; + (void)user_data; va_list ap; va_start(ap, fmt); gst_debug_log_valist(pocketsphinx_debug, gst_level[lvl], "", "", 0, NULL, fmt, ap); @@ -760,6 +794,7 @@ plugin_init(GstPlugin * plugin) { err_set_callback(gst_pocketsphinx_log, NULL); + err_set_loglevel(ERR_INFO); if (!gst_element_register(plugin, "pocketsphinx", GST_RANK_NONE, GST_TYPE_POCKETSPHINX)) diff --git a/src/gst-plugin/gstpocketsphinx.h b/gst/gstpocketsphinx.h similarity index 96% rename from src/gst-plugin/gstpocketsphinx.h rename to gst/gstpocketsphinx.h index 31b9555..cb2a664 100644 --- a/src/gst-plugin/gstpocketsphinx.h +++ b/gst/gstpocketsphinx.h @@ -40,6 +40,7 @@ #define __GST_POCKETSPHINX_H__ #include +#include #include G_BEGIN_DECLS @@ -61,16 +62,16 @@ typedef struct _GstPocketSphinxClass GstPocketSphinxClass; struct _GstPocketSphinx { GstElement element; - + GstAdapter *adapter; GstPad *sinkpad, *srcpad; ps_decoder_t *ps; - cmd_ln_t *config; + ps_endpointer_t *ep; + ps_config_t *config; - gchar *latdir; /**< Output directory for word lattices. */ + size_t frame_size; - gboolean speech_started; - gboolean listening_started; + gchar *latdir; /**< Output directory for word lattices. */ gint uttno; GstClockTime last_result_time; /**< Timestamp of last partial result. */ diff --git a/src/gst-plugin/livedemo.c b/gst/livedemo.c similarity index 100% rename from src/gst-plugin/livedemo.c rename to gst/livedemo.c diff --git a/src/gst-plugin/livedemo.py b/gst/livedemo.py similarity index 94% rename from src/gst-plugin/livedemo.py rename to gst/livedemo.py index e73cf8b..8728009 100644 --- a/src/gst-plugin/livedemo.py +++ b/gst/livedemo.py @@ -50,7 +50,8 @@ def init_gui(self): def init_gst(self): """Initialize the speech components""" self.pipeline = gst.parse_launch('autoaudiosrc ! audioconvert ! audioresample ' - + '! pocketsphinx ! fakesink') + '! pocketsphinx ! fakesink') +# '! pocketsphinx hmm=../model/en-us/en-us lm=../model/en-us/en-us.lm.bin dict=../model/en-us/cmudict-en-us.dict ! fakesink') bus = self.pipeline.get_bus() bus.add_signal_watch() bus.connect('message::element', self.element_message) diff --git a/include/Makefile.am b/include/Makefile.am deleted file mode 100644 index c0f1bfd..0000000 --- a/include/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -pkginclude_HEADERS = \ - cmdln_macro.h \ - ps_lattice.h \ - ps_mllr.h \ - ps_search.h \ - pocketsphinx_export.h \ - pocketsphinx.h - - - - - diff --git a/include/Makefile.in b/include/Makefile.in deleted file mode 100644 index 6475e63..0000000 --- a/include/Makefile.in +++ /dev/null @@ -1,598 +0,0 @@ -# Makefile.in generated by automake 1.13.4 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2013 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = include -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(srcdir)/config.h.in $(pkginclude_HEADERS) -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ - $(top_srcdir)/m4/ax_python_devel.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -SOURCES = -DIST_SOURCES = -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(pkgincludedir)" -HEADERS = $(pkginclude_HEADERS) -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ - $(LISP)config.h.in -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GST_CFLAGS = @GST_CFLAGS@ -GST_LIBS = @GST_LIBS@ -GST_MAJORMINOR = @GST_MAJORMINOR@ -GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ -GStreamer_CFLAGS = @GStreamer_CFLAGS@ -GStreamer_LIBS = @GStreamer_LIBS@ -HAVE_DOXYGEN = @HAVE_DOXYGEN@ -HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PKG_CONFIG = @PKG_CONFIG@ -PYTHON = @PYTHON@ -PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ -PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ -PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ -PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ -PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ -PYTHON_PLATFORM = @PYTHON_PLATFORM@ -PYTHON_PREFIX = @PYTHON_PREFIX@ -PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ -PYTHON_VERSION = @PYTHON_VERSION@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ -SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ -SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ -STRIP = @STRIP@ -SWIG = @SWIG@ -SWIG_LIB = @SWIG_LIB@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -pkgpyexecdir = @pkgpyexecdir@ -pkgpythondir = @pkgpythondir@ -plugindir = @plugindir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -pyexecdir = @pyexecdir@ -pythondir = @pythondir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -pkginclude_HEADERS = \ - cmdln_macro.h \ - ps_lattice.h \ - ps_mllr.h \ - ps_search.h \ - pocketsphinx_export.h \ - pocketsphinx.h - -all: config.h - $(MAKE) $(AM_MAKEFLAGS) all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign include/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -config.h: stamp-h1 - @if test ! -f $@; then rm -f stamp-h1; else :; fi - @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi - -stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status - @rm -f stamp-h1 - cd $(top_builddir) && $(SHELL) ./config.status include/config.h -$(srcdir)/config.h.in: $(am__configure_deps) - ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) - rm -f stamp-h1 - touch $@ - -distclean-hdr: - -rm -f config.h stamp-h1 - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-pkgincludeHEADERS: $(pkginclude_HEADERS) - @$(NORMAL_INSTALL) - @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ - $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ - done - -uninstall-pkgincludeHEADERS: - @$(NORMAL_UNINSTALL) - @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-am - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-am - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(HEADERS) config.h -installdirs: - for dir in "$(DESTDIR)$(pkgincludedir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-hdr distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: install-pkgincludeHEADERS - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-pkgincludeHEADERS - -.MAKE: all install-am install-strip - -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ - clean-libtool cscopelist-am ctags ctags-am distclean \ - distclean-generic distclean-hdr distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-pkgincludeHEADERS \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ - uninstall-am uninstall-pkgincludeHEADERS - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/include/cmdln_macro.h b/include/cmdln_macro.h deleted file mode 100644 index ff0ab81..0000000 --- a/include/cmdln_macro.h +++ /dev/null @@ -1,388 +0,0 @@ -/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ -/* ==================================================================== - * Copyright (c) 2006 Carnegie Mellon University. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * This work was supported in part by funding from the Defense Advanced - * Research Projects Agency and the National Science Foundation of the - * United States of America, and the CMU Sphinx Speech Consortium. - * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY - * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * ==================================================================== - * - */ - -/* cmdln_macro.h - Command line definitions for PocketSphinx */ - -#ifndef __PS_CMDLN_MACRO_H__ -#define __PS_CMDLN_MACRO_H__ - -#include -#include -#include - -/** Minimal set of command-line options for PocketSphinx. */ -#define POCKETSPHINX_OPTIONS \ - waveform_to_cepstral_command_line_macro(), \ - cepstral_to_feature_command_line_macro(), \ - POCKETSPHINX_ACMOD_OPTIONS, \ - POCKETSPHINX_BEAM_OPTIONS, \ - POCKETSPHINX_SEARCH_OPTIONS, \ - POCKETSPHINX_DICT_OPTIONS, \ - POCKETSPHINX_NGRAM_OPTIONS, \ - POCKETSPHINX_FSG_OPTIONS, \ - POCKETSPHINX_KWS_OPTIONS, \ - POCKETSPHINX_DEBUG_OPTIONS - -/** Options for debugging and logging. */ -#define POCKETSPHINX_DEBUG_OPTIONS \ - { "-logfn", \ - ARG_STRING, \ - NULL, \ - "File to write log messages in" }, \ - { "-debug", \ - ARG_INT32, \ - NULL, \ - "Verbosity level for debugging messages" }, \ - { "-mfclogdir", \ - ARG_STRING, \ - NULL, \ - "Directory to log feature files to" \ - }, \ - { "-rawlogdir", \ - ARG_STRING, \ - NULL, \ - "Directory to log raw audio files to" }, \ - { "-senlogdir", \ - ARG_STRING, \ - NULL, \ - "Directory to log senone score files to" \ - } - -/** Options defining beam width parameters for tuning the search. */ -#define POCKETSPHINX_BEAM_OPTIONS \ -{ "-beam", \ - ARG_FLOAT64, \ - "1e-48", \ - "Beam width applied to every frame in Viterbi search (smaller values mean wider beam)" }, \ -{ "-wbeam", \ - ARG_FLOAT64, \ - "7e-29", \ - "Beam width applied to word exits" }, \ -{ "-pbeam", \ - ARG_FLOAT64, \ - "1e-48", \ - "Beam width applied to phone transitions" }, \ -{ "-lpbeam", \ - ARG_FLOAT64, \ - "1e-40", \ - "Beam width applied to last phone in words" }, \ -{ "-lponlybeam", \ - ARG_FLOAT64, \ - "7e-29", \ - "Beam width applied to last phone in single-phone words" }, \ -{ "-fwdflatbeam", \ - ARG_FLOAT64, \ - "1e-64", \ - "Beam width applied to every frame in second-pass flat search" }, \ -{ "-fwdflatwbeam", \ - ARG_FLOAT64, \ - "7e-29", \ - "Beam width applied to word exits in second-pass flat search" }, \ -{ "-pl_window", \ - ARG_INT32, \ - "5", \ - "Phoneme lookahead window size, in frames" }, \ -{ "-pl_beam", \ - ARG_FLOAT64, \ - "1e-10", \ - "Beam width applied to phone loop search for lookahead" }, \ -{ "-pl_pbeam", \ - ARG_FLOAT64, \ - "1e-10", \ - "Beam width applied to phone loop transitions for lookahead" }, \ -{ "-pl_pip", \ - ARG_FLOAT32, \ - "1.0", \ - "Phone insertion penalty for phone loop" }, \ -{ "-pl_weight", \ - ARG_FLOAT64, \ - "3.0", \ - "Weight for phoneme lookahead penalties" } \ - -/** Options defining other parameters for tuning the search. */ -#define POCKETSPHINX_SEARCH_OPTIONS \ -{ "-compallsen", \ - ARG_BOOLEAN, \ - "no", \ - "Compute all senone scores in every frame (can be faster when there are many senones)" }, \ -{ "-fwdtree", \ - ARG_BOOLEAN, \ - "yes", \ - "Run forward lexicon-tree search (1st pass)" }, \ -{ "-fwdflat", \ - ARG_BOOLEAN, \ - "yes", \ - "Run forward flat-lexicon search over word lattice (2nd pass)" }, \ -{ "-bestpath", \ - ARG_BOOLEAN, \ - "yes", \ - "Run bestpath (Dijkstra) search over word lattice (3rd pass)" }, \ -{ "-backtrace", \ - ARG_BOOLEAN, \ - "no", \ - "Print results and backtraces to log." }, \ -{ "-latsize", \ - ARG_INT32, \ - "5000", \ - "Initial backpointer table size" }, \ -{ "-maxwpf", \ - ARG_INT32, \ - "-1", \ - "Maximum number of distinct word exits at each frame (or -1 for no pruning)" }, \ -{ "-maxhmmpf", \ - ARG_INT32, \ - "30000", \ - "Maximum number of active HMMs to maintain at each frame (or -1 for no pruning)" }, \ -{ "-min_endfr", \ - ARG_INT32, \ - "0", \ - "Nodes ignored in lattice construction if they persist for fewer than N frames" }, \ -{ "-fwdflatefwid", \ - ARG_INT32, \ - "4", \ - "Minimum number of end frames for a word to be searched in fwdflat search" }, \ -{ "-fwdflatsfwin", \ - ARG_INT32, \ - "25", \ - "Window of frames in lattice to search for successor words in fwdflat search " } - -/** Command-line options for keyphrase spotting */ -#define POCKETSPHINX_KWS_OPTIONS \ -{ "-keyphrase", \ - ARG_STRING, \ - NULL, \ - "Keyphrase to spot"}, \ -{ "-kws", \ - ARG_STRING, \ - NULL, \ - "A file with keyphrases to spot, one per line"}, \ -{ "-kws_plp", \ - ARG_FLOAT64, \ - "1e-1", \ - "Phone loop probability for keyphrase spotting" }, \ -{ "-kws_delay", \ - ARG_INT32, \ - "10", \ - "Delay to wait for best detection score" }, \ -{ "-kws_threshold", \ - ARG_FLOAT64, \ - "1", \ - "Threshold for p(hyp)/p(alternatives) ratio" } - -/** Command-line options for finite state grammars. */ -#define POCKETSPHINX_FSG_OPTIONS \ - { "-fsg", \ - ARG_STRING, \ - NULL, \ - "Sphinx format finite state grammar file"}, \ -{ "-jsgf", \ - ARG_STRING, \ - NULL, \ - "JSGF grammar file" }, \ -{ "-toprule", \ - ARG_STRING, \ - NULL, \ - "Start rule for JSGF (first public rule is default)" }, \ -{ "-fsgusealtpron", \ - ARG_BOOLEAN, \ - "yes", \ - "Add alternate pronunciations to FSG"}, \ -{ "-fsgusefiller", \ - ARG_BOOLEAN, \ - "yes", \ - "Insert filler words at each state."} - -/** Command-line options for statistical language models. */ -#define POCKETSPHINX_NGRAM_OPTIONS \ -{ "-allphone", \ - ARG_STRING, \ - NULL, \ - "Perform phoneme decoding with phonetic lm" }, \ -{ "-allphone_ci", \ - ARG_BOOLEAN, \ - "no", \ - "Perform phoneme decoding with phonetic lm and context-independent units only" }, \ -{ "-lm", \ - ARG_STRING, \ - NULL, \ - "Word trigram language model input file" }, \ -{ "-lmctl", \ - ARG_STRING, \ - NULL, \ - "Specify a set of language model"}, \ -{ "-lmname", \ - ARG_STRING, \ - NULL, \ - "Which language model in -lmctl to use by default"}, \ -{ "-lw", \ - ARG_FLOAT32, \ - "6.5", \ - "Language model probability weight" }, \ -{ "-fwdflatlw", \ - ARG_FLOAT32, \ - "8.5", \ - "Language model probability weight for flat lexicon (2nd pass) decoding" }, \ -{ "-bestpathlw", \ - ARG_FLOAT32, \ - "9.5", \ - "Language model probability weight for bestpath search" }, \ -{ "-ascale", \ - ARG_FLOAT32, \ - "20.0", \ - "Inverse of acoustic model scale for confidence score calculation" }, \ -{ "-wip", \ - ARG_FLOAT32, \ - "0.65", \ - "Word insertion penalty" }, \ -{ "-nwpen", \ - ARG_FLOAT32, \ - "1.0", \ - "New word transition penalty" }, \ -{ "-pip", \ - ARG_FLOAT32, \ - "1.0", \ - "Phone insertion penalty" }, \ -{ "-uw", \ - ARG_FLOAT32, \ - "1.0", \ - "Unigram weight" }, \ -{ "-silprob", \ - ARG_FLOAT32, \ - "0.005", \ - "Silence word transition probability" }, \ -{ "-fillprob", \ - ARG_FLOAT32, \ - "1e-8", \ - "Filler word transition probability" } \ - -/** Command-line options for dictionaries. */ -#define POCKETSPHINX_DICT_OPTIONS \ - { "-dict", \ - REQARG_STRING, \ - NULL, \ - "Main pronunciation dictionary (lexicon) input file" }, \ - { "-fdict", \ - ARG_STRING, \ - NULL, \ - "Noise word pronunciation dictionary input file" }, \ - { "-dictcase", \ - ARG_BOOLEAN, \ - "no", \ - "Dictionary is case sensitive (NOTE: case insensitivity applies to ASCII characters only)" } \ - -/** Command-line options for acoustic modeling */ -#define POCKETSPHINX_ACMOD_OPTIONS \ -{ "-hmm", \ - ARG_STRING, \ - NULL, \ - "Directory containing acoustic model files."}, \ -{ "-featparams", \ - ARG_STRING, \ - NULL, \ - "File containing feature extraction parameters."}, \ -{ "-mdef", \ - ARG_STRING, \ - NULL, \ - "Model definition input file" }, \ -{ "-senmgau", \ - ARG_STRING, \ - NULL, \ - "Senone to codebook mapping input file (usually not needed)" }, \ -{ "-tmat", \ - ARG_STRING, \ - NULL, \ - "HMM state transition matrix input file" }, \ -{ "-tmatfloor", \ - ARG_FLOAT32, \ - "0.0001", \ - "HMM state transition probability floor (applied to -tmat file)" }, \ -{ "-mean", \ - ARG_STRING, \ - NULL, \ - "Mixture gaussian means input file" }, \ -{ "-var", \ - ARG_STRING, \ - NULL, \ - "Mixture gaussian variances input file" }, \ -{ "-varfloor", \ - ARG_FLOAT32, \ - "0.0001", \ - "Mixture gaussian variance floor (applied to data from -var file)" }, \ -{ "-mixw", \ - ARG_STRING, \ - NULL, \ - "Senone mixture weights input file (uncompressed)" }, \ -{ "-mixwfloor", \ - ARG_FLOAT32, \ - "0.0000001", \ - "Senone mixture weights floor (applied to data from -mixw file)" }, \ -{ "-aw", \ - ARG_INT32, \ - "1", \ - "Inverse weight applied to acoustic scores." }, \ -{ "-sendump", \ - ARG_STRING, \ - NULL, \ - "Senone dump (compressed mixture weights) input file" }, \ -{ "-mllr", \ - ARG_STRING, \ - NULL, \ - "MLLR transformation to apply to means and variances" }, \ -{ "-mmap", \ - ARG_BOOLEAN, \ - "yes", \ - "Use memory-mapped I/O (if possible) for model files" }, \ -{ "-ds", \ - ARG_INT32, \ - "1", \ - "Frame GMM computation downsampling ratio" }, \ -{ "-topn", \ - ARG_INT32, \ - "4", \ - "Maximum number of top Gaussians to use in scoring." }, \ -{ "-topn_beam", \ - ARG_STRING, \ - "0", \ - "Beam width used to determine top-N Gaussians (or a list, per-feature)" },\ -{ "-logbase", \ - ARG_FLOAT32, \ - "1.0001", \ - "Base in which all log-likelihoods calculated" } - -#define CMDLN_EMPTY_OPTION { NULL, 0, NULL, NULL } - -#endif /* __PS_CMDLN_MACRO_H__ */ diff --git a/include/config.h.in b/include/config.h.in deleted file mode 100644 index 8e4e01a..0000000 --- a/include/config.h.in +++ /dev/null @@ -1,65 +0,0 @@ -/* include/config.h.in. Generated from configure.ac by autoheader. */ - -/* Define to 1 if you have the header file. */ -#undef HAVE_DLFCN_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_INTTYPES_H - -/* Define to 1 if the system has the type `long long'. */ -#undef HAVE_LONG_LONG - -/* Define to 1 if you have the header file. */ -#undef HAVE_MEMORY_H - -/* If available, contains the Python version number currently in use. */ -#undef HAVE_PYTHON - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDINT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDLIB_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRINGS_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRING_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_STAT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_TYPES_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_UNISTD_H - -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ -#undef LT_OBJDIR - -/* Define to the address where bug reports for this package should be sent. */ -#undef PACKAGE_BUGREPORT - -/* Define to the full name of this package. */ -#undef PACKAGE_NAME - -/* Define to the full name and version of this package. */ -#undef PACKAGE_STRING - -/* Define to the one symbol short name of this package. */ -#undef PACKAGE_TARNAME - -/* Define to the home page for this package. */ -#undef PACKAGE_URL - -/* Define to the version of this package. */ -#undef PACKAGE_VERSION - -/* The size of `long long', as computed by sizeof. */ -#undef SIZEOF_LONG_LONG - -/* Define to 1 if you have the ANSI C header files. */ -#undef STDC_HEADERS diff --git a/include/pocketsphinx.h b/include/pocketsphinx.h index c890b2b..884532f 100644 --- a/include/pocketsphinx.h +++ b/include/pocketsphinx.h @@ -33,27 +33,55 @@ */ /** * @file pocketsphinx.h Main header file for the PocketSphinx decoder. + * + * This is the only header file you should need to include in order to + * write code using PocketSphinx. The documentation for its various + * functions and structures is actually located on the pages for those + * structures, and because Doxygen does not seem smart enough to put + * links in the "Typedefs" list above, here they are for your + * convenience: + * + * - \ref ps_config_t + * - \ref ps_arg_t + * - \ref ps_decoder_t + * - \ref ps_nbest_t + * - \ref ps_seg_t + * + * There are also a few other structures you should be aware of, which + * can be useful in writing speech applications: + * + * - \ref ps_endpointer_t + * - \ref ps_vad_t + * - \ref jsgf_t + * - \ref ngram_model_t + * + * Finally, to learn about switching language models and grammars, see + * */ #ifndef __POCKETSPHINX_H__ #define __POCKETSPHINX_H__ - -/* System headers we need. */ +/* System headers */ #include -/* SphinxBase headers we need. */ -#include -#include -#include -#include +/* PocketSphinx utility headers */ +#include +#include +#include +#include -/* PocketSphinx headers (not many of them!) */ -#include -#include -#include -#include +/* PocketSphinx API headers */ +#include +#include +#include +#include +#include +#include +#include +#include +/* Namum manglium ii domum */ #ifdef __cplusplus extern "C" { #endif @@ -61,42 +89,413 @@ extern "C" { } #endif +/* Transparent structures */ /** - * PocketSphinx speech recognizer object. + * @enum ps_type_e + * @brief Types of configuration parameters. */ -typedef struct ps_decoder_s ps_decoder_t; +typedef enum ps_type_e { + ARG_REQUIRED = (1<<0), /*<< Bit indicating required argument. */ + ARG_INTEGER = (1<<1), /*<< Integer up to 64 bits. */ + ARG_FLOATING = (1<<2), /*<< Double-precision floating point. */ + ARG_STRING = (1<<3), /*<< String. */ + ARG_BOOLEAN = (1<<4), /*<< Boolean (true/false). */ + REQARG_INTEGER = (ARG_INTEGER | ARG_REQUIRED), + REQARG_FLOATING = (ARG_FLOATING | ARG_REQUIRED), + REQARG_STRING = (ARG_STRING | ARG_REQUIRED), + REQARG_BOOLEAN = (ARG_BOOLEAN | ARG_REQUIRED) +} ps_type_t; +/** + * @typedef ps_type_t + * @brief Types of configuration parameters. + */ + +/** + * @struct ps_arg_t + * @brief Definition of a configuration parameter. + */ +typedef struct ps_arg_s { + char const *name; /**< Name of the command line switch */ + int type; /**< Type of the argument in question */ + char const *deflt; /**< Default value (as a character string), or NULL if none */ + char const *doc; /**< Documentation/description string */ +} ps_arg_t; -#include +/* Opaque structures */ + +/** + * @struct ps_config_t + * @brief configuration object. + */ +typedef struct cmd_ln_s ps_config_t; + +/** + * @struct ps_decoder_t + * @brief Speech recognizer object. + */ +typedef struct ps_decoder_s ps_decoder_t; /** - * PocketSphinx N-best hypothesis iterator object. + * @struct ps_nbest_t + * @brief N-best hypothesis iterator object. */ typedef struct ps_astar_s ps_nbest_t; /** - * PocketSphinx segmentation iterator object. + * @struct ps_seg_t + * @brief Segmentation iterator object. */ typedef struct ps_seg_s ps_seg_t; /** - * Sets default grammar and language model if they are not set explicitly and - * are present in the default search path. + * Create a configuration with default values. + * + * @memberof ps_config_t + * @param defn Array of ps_arg_t defining and describing parameters, + * terminated by an ps_arg_t with `name == NULL`. You should usually + * just pass NULL here, which will result in the standard set of + * parameters being used. + * @return Newly created configuration or NULL on failure (should not + * happen, but check it anyway). + */ +POCKETSPHINX_EXPORT +ps_config_t *ps_config_init(const ps_arg_t *defn); + +/** + * Retain a pointer to a configuration object. + * @memberof ps_config_t + */ +POCKETSPHINX_EXPORT +ps_config_t *ps_config_retain(ps_config_t *config); + +/** + * Release a configuration object. + * @memberof ps_config_t + */ +POCKETSPHINX_EXPORT +int ps_config_free(ps_config_t *config); + +/** + * Validate configuration. + * + * Currently this just checks that you haven't specified multiple + * types of grammars or language models at the same time. + * + * @memberof ps_config_t + * @return 0 for success, <0 for failure. + */ +int ps_config_validate(ps_config_t *config); + +/** + * Create or update a configuration by parsing slightly extended JSON. + * + * This function parses a JSON object in non-strict mode to produce a + * ps_config_t. Configuration parameters are given *without* a + * leading dash, and do not need to be quoted, nor does the object + * need to be enclosed in curly braces, nor are commas necessary + * between key/value pairs. Basically, it's degenerate YAML. So, for + * example, this is accepted: + * + * hmm: fr-fr + * samprate: 8000 + * keyphrase: "hello world" + * + * Of course, valid JSON is also accepted, but who wants to use that. + * + * Well, mostly. Unicode escape sequences (e.g. `"\u0020"`) are *not* + * supported at the moment, so please don't use them. + * + * @memberof ps_config_t + * @arg config Previously existing ps_config_t to update, or NULL to + * create a new one. + * @arg json JSON serialized object as null-terminated UTF-8, + * containing configuration parameters. + * @return Newly created configuration or NULL on failure (such as + * invalid or missing parameters). + */ +POCKETSPHINX_EXPORT +ps_config_t *ps_config_parse_json(ps_config_t *config, const char *json); + +/** + * Construct JSON from a configuration object. + * + * Unlike ps_config_parse_json(), this actually produces valid JSON ;-) + * + * @memberof ps_config_t + * @arg config Configuration object + * @return Newly created null-terminated JSON string. The ps_config_t + * retains ownership of this pointer, which is only valid until the + * next call to ps_config_serialize_json(). You must copy it if you + * wish to retain it. + */ +POCKETSPHINX_EXPORT +const char *ps_config_serialize_json(ps_config_t *config); + +/** + * Access the type of a configuration parameter. + * + * @memberof ps_config_t + * @param config Configuration object. + * @param name Name of the parameter to retrieve. + * @return the type of the parameter (as a combination of the ARG_* + * bits), or 0 if no such parameter exists. + */ +POCKETSPHINX_EXPORT +ps_type_t ps_config_typeof(ps_config_t *config, char const *name); + +/** + * Access the value of a configuration parameter. + * + * To actually do something with the value, you will need to know its + * type, which can be obtained with ps_config_typeof(). This function + * is thus mainly useful for dynamic language bindings, and you should + * use ps_config_int(), ps_config_float(), or ps_config_str() instead. + * + * @memberof ps_config_t + * @param config Configuration object. + * @param name Name of the parameter to retrieve. + * @return Pointer to the parameter's value, or NULL if the parameter + * does not exist. Note that a string parameter can also have NULL as + * a value, in which case the `ptr` field in the return value is NULL. + * This pointer (and any pointers inside it) is owned by the ps_config_t. + */ +POCKETSPHINX_EXPORT +const anytype_t *ps_config_get(ps_config_t *config, const char *name); + +/** + * Set or unset the value of a configuration parameter. + * + * This will coerce the value to the proper type, so you can, for + * example, pass it a string with ARG_STRING as the type when adding + * options from the command-line. Note that the return pointer will + * *not* be the same as the one passed in the value. + * + * @memberof ps_config_t + * @param config Configuration object. + * @param name Name of the parameter to set. Must exist. + * @param val Pointer to the value (strings will be copied) inside an + * anytype_t union. On 64-bit little-endian platforms, you *can* cast + * a pointer to int, long, double, or char* here, but that doesn't + * necessarily mean that you *should*. As a convenience, you can pass + * NULL here to reset a parameter to its default value. + * @param t Type of the value in `val`, will be coerced to the type of + * the actual parameter if necessary. + * @return Pointer to the parameter's value, or NULL on failure + * (unknown parameter, usually). This pointer (and any pointers + * inside it) is owned by the ps_config_t. + */ +POCKETSPHINX_EXPORT +const anytype_t *ps_config_set(ps_config_t *config, const char *name, + const anytype_t *val, ps_type_t t); + +/** + * Get an integer-valued parameter. + * + * If the parameter does not have an integer or boolean type, this + * will print an error and return 0. So don't do that. + * + * @memberof ps_config_t + */ +POCKETSPHINX_EXPORT +long ps_config_int(ps_config_t *config, const char *name); + +/** + * Get a boolean-valued parameter. + * + * If the parameter does not have an integer or boolean type, this + * will print an error and return 0. The return value is either 0 or + * 1 (if the parameter has an integer type, any non-zero value will + * return 1). + * + * @memberof ps_config_t + */ +POCKETSPHINX_EXPORT +int ps_config_bool(ps_config_t *config, const char *name); + +/** + * Get a floating-point parameter. + * + * If the parameter does not have a floating-point type, this will + * print an error and return 0. + * + * @memberof ps_config_t + */ +POCKETSPHINX_EXPORT +double ps_config_float(ps_config_t *config, const char *name); + +/** + * Get a string parameter. + * + * If the parameter does not have a string type, this will print an + * error and return NULL. Notably, it will *NOT* format an integer or + * float for you, because that would involve allocating memory. So + * don't do that. + * + * @memberof ps_config_t + */ +POCKETSPHINX_EXPORT +const char *ps_config_str(ps_config_t *config, const char *name); + +/** + * Set an integer-valued parameter. + * + * If the parameter does not have an integer or boolean type, this + * will convert `val` appropriately. + * + * @memberof ps_config_t + */ +POCKETSPHINX_EXPORT +const anytype_t *ps_config_set_int(ps_config_t *config, const char *name, long val); + +/** + * Set a boolean-valued parameter. + * + * If the parameter does not have an integer or boolean type, this + * will convert `val` appropriately. + * + * @memberof ps_config_t + */ +POCKETSPHINX_EXPORT +const anytype_t *ps_config_set_bool(ps_config_t *config, const char *name, int val); + +/** + * Set a floating-point parameter. + * + * If the parameter does not have a floating-point type, this will + * convert `val` appropriately. + * + * @memberof ps_config_t + */ +POCKETSPHINX_EXPORT +const anytype_t *ps_config_set_float(ps_config_t *config, const char *name, double val); + +/** + * Set a string-valued parameter. + * + * If the parameter does not have a string type, this will convert + * `val` appropriately. For boolean parameters, any string matching + * `/^[yt1]/` will be true, while any string matching `/^[nf0]/` will + * be false. NULL is also false. + * + * This function is used for configuration from JSON, you may want to + * use it for your own configuration files too. + * + * @memberof ps_config_t + */ +POCKETSPHINX_EXPORT +const anytype_t *ps_config_set_str(ps_config_t *config, const char *name, const char *val); + +/** + * Set configuration parameters (actually just sample rate) from a + * sound file. + * + * If the file is unreadable, unsupported or incompatible with the + * existing feature extraction parameters, this will print an error + * message and fail (return -1). + * + * If it is of an unknown type, it will be treated as raw data. So + * beware! Currently we only support WAV and NIST Sphere files. We + * attempt to recognize Ogg, MP3 (but not really, because it is very + * difficult to do reliably), and FLAC, but do not support them. For + * everything else, there's SoX (tm). + * + * Currently, the file must be seekable, so you can't use this on + * standard input, for instance. + * + * @memberof ps_config_t + * @param config Configuration to update from file. + * @param fh Previously opened file handle. + * @param file Name of open file handle for logging (optional, can be NULL) + */ +POCKETSPHINX_EXPORT +int ps_config_soundfile(ps_config_t *config, FILE *fh, const char *file); + +/** + * Read a WAV header and set configuration parameters. + * + * This works like ps_config_soundfile() but assumes that you already + * know it's a WAV file. + * + * Unlike ps_config_soundfile(), the file does *not* have to be seekable. + * + * @memberof ps_config_t + * @param config Configuration to update from file. + * @param infh Previously opened file handle. + * @param file Name of open file handle for logging (optional, can be NULL) + */ +POCKETSPHINX_EXPORT +int ps_config_wavfile(ps_config_t *config, FILE *infh, const char *file); + +/** + * Read a NIST header and set configuration parameters. + * + * This works like ps_config_soundfile() but assumes that you already + * know it's a NIST file. + * + * Unlike ps_config_soundfile(), the file does *not* have to be seekable. + * + * @memberof ps_config_t + * @param config Configuration to update from file. + * @param infh Previously opened file handle. + * @param file Name of open file handle for logging (optional, can be NULL) */ -POCKETSPHINX_EXPORT void -ps_default_search_args(cmd_ln_t *); +POCKETSPHINX_EXPORT +int ps_config_nistfile(ps_config_t *config, FILE *infh, const char *file); + +/** + * Sets default acoustic and language model if they are not set explicitly. + * + * This function fills in the configuration with the default acoustic + * and language models and dictionary, if (and this is a badly + * implemented heuristic) they do not seem to be already filled in. + * It is preferable for you to call this *before* doing any other + * configuration to avoid confusion. + * + * The default models are looked for in the directory returned by + * ps_default_modeldir(), or, if the `POCKETSPHINX_PATH` environment + * variable is set, this function will look there instead. + * + * If no global model directory was defined at compilation time (this + * is useful for relocatable installs such as the Python module) and + * `POCKETSPHINX_PATH` is not set, this will simply do nothing. + * + * @memberof ps_config_t + */ +POCKETSPHINX_EXPORT +void ps_default_search_args(ps_config_t *config); + +/** + * Sets default file paths and parameters based on configuration. + * + * @memberof ps_config_t + */ +POCKETSPHINX_EXPORT +void ps_expand_model_config(ps_config_t *config); + +/** + * Gets the system default model directory, if any exists. + * + * @relates ps_config_t + * @return system model directory defined at compile time, or NULL if + * not defined (usually in a relocatable installation such as + * a Python module). + */ +POCKETSPHINX_EXPORT +const char *ps_default_modeldir(void); /** * Initialize the decoder from a configuration object. * + * @memberof ps_config_t * @note The decoder retains ownership of the pointer * config, so if you are not going to use it - * elsewere, you can free it. - * - * @param config a command-line structure, as created by - * cmd_ln_parse_r() or cmd_ln_parse_file_r(). + * elsewhere, you can free it. + * @param config a configuration object. If NULL, the + * decoder will be allocated but not initialized. You can + * proceed to initialize it with ps_reinit(). */ POCKETSPHINX_EXPORT -ps_decoder_t *ps_init(cmd_ln_t *config); +ps_decoder_t *ps_init(ps_config_t *config); /** * Reinitialize the decoder with updated configuration. @@ -105,10 +504,16 @@ ps_decoder_t *ps_init(cmd_ln_t *config); * or other configuration without creating an entirely new decoding * object. * + * @note Since the acoustic model will be reloaded, changes made to + * feature extraction parameters may be overridden if a `feat.params` + * file is present. + * @note Any searches created with ps_set_search() or words added to + * the dictionary with ps_add_word() will also be lost. To avoid this + * you can use ps_reinit_feat(). * @note The decoder retains ownership of the pointer - * config, so you must not attempt to free it manually. - * If you wish to reuse it elsewhere, call cmd_ln_retain() on it. + * config, so you should free it when no longer used. * + * @memberof ps_decoder_t * @param ps Decoder. * @param config An optional new configuration to use. If this is * NULL, the previous configuration will be reloaded, @@ -116,16 +521,82 @@ ps_decoder_t *ps_init(cmd_ln_t *config); * @return 0 for success, <0 for failure. */ POCKETSPHINX_EXPORT -int ps_reinit(ps_decoder_t *ps, cmd_ln_t *config); +int ps_reinit(ps_decoder_t *ps, ps_config_t *config); + +/** + * Reinitialize only the feature computation with updated configuration. + * + * This function allows you to switch the feature computation + * parameters without otherwise affecting the decoder configuration. + * For example, if you change the sample rate or the frame rate, and + * do not want to reconfigure the rest of the decoder. + * + * Note that if you have set a custom cepstral mean with ps_set_cmn(), + * it will be overridden. + * + * @note The decoder retains ownership of the pointer `config`, so you + * should free it when no longer used. + * + * @memberof ps_decoder_t + * @param ps Decoder. + * @param config An optional new configuration to use. If this is + * NULL, the previous configuration will be reloaded, + * with any changes to feature computation applied. + * @return 0 for success, <0 for failure (usually an invalid parameter) + */ +POCKETSPHINX_EXPORT +int ps_reinit_feat(ps_decoder_t *ps, ps_config_t *config); /** - * Returns the argument definitions used in ps_init(). + * Get the current cepstral mean as a string. + * + * This is the string representation of the current cepstral mean, + * which represents the acoustic channel conditions in live + * recognition. This can be used to initialize the decoder with the + * `cmninit` option, e.g.: + * + * config = ps_config_parse_json(NULL, "cmninit: 42,-1,0"); + * + * @memberof ps_decoder_t + * @param ps Decoder + * @param update Update the cepstral mean using data processed so far. + * @return String representation of cepstral mean, as + * `ps_config_get_int(config, "ceplen")` comma-separated + * numbers. This pointer is owned by the decoder and only + * valid until the next call to ps_get_cmn(), ps_set_cmn() or + * ps_end_utt(). + */ +POCKETSPHINX_EXPORT +const char *ps_get_cmn(ps_decoder_t *ps, int update); + +/** + * Set the current cepstral mean from a string. + * + * This does the same thing as setting `cmninit` with + * ps_config_set_string() and running `ps_reinit_feat()` but is more + * efficient, and can also be done in the middle of an utterance if + * you like. + * + * @memberof ps_decoder_t + * @param ps Decoder + * @param cmn String representation of cepstral mean, as up to + * `ps_config_get_int(config, "ceplen")` -separated numbers + * (any missing values will be zero-filled). @return 0 for + * success of -1 for invalid input. + */ +POCKETSPHINX_EXPORT +int ps_set_cmn(ps_decoder_t *ps, const char *cmn); + +/** + * Returns the argument definitions used in ps_config_init(). * * This is here to avoid exporting global data, which is problematic * on Win32 and Symbian (and possibly other platforms). + * + * @related ps_config_t */ POCKETSPHINX_EXPORT -arg_t const *ps_args(void); +ps_arg_t const *ps_args(void); /** * Retain a pointer to the decoder. @@ -135,6 +606,7 @@ arg_t const *ps_args(void); * need to use this function, ever. It is mainly here for the * convenience of scripting language bindings. * + * @memberof ps_decoder_t * @return pointer to retained decoder. */ POCKETSPHINX_EXPORT @@ -143,10 +615,9 @@ ps_decoder_t *ps_retain(ps_decoder_t *ps); /** * Finalize the decoder. * - * This releases all resources associated with the decoder, including - * any language models or grammars which have been added to it, and - * the initial configuration object passed to ps_init(). + * This releases all resources associated with the decoder. * + * @memberof ps_decoder_t * @param ps Decoder to be freed. * @return New reference count (0 if freed). */ @@ -156,55 +627,35 @@ int ps_free(ps_decoder_t *ps); /** * Get the configuration object for this decoder. * + * @memberof ps_decoder_t * @return The configuration object for this decoder. The decoder - * retains ownership of this pointer, so you should not - * attempt to free it manually. Use cmd_ln_retain() if you - * wish to reuse it elsewhere. + * owns this pointer, so you should not attempt to free it + * manually. Use ps_config_retain() if you wish to reuse it + * elsewhere. */ POCKETSPHINX_EXPORT -cmd_ln_t *ps_get_config(ps_decoder_t *ps); +ps_config_t *ps_get_config(ps_decoder_t *ps); /** * Get the log-math computation object for this decoder. * - * @return The log-math object for this decoder. The decoder retains - * ownership of this pointer, so you should not attempt to - * free it manually. Use logmath_retain() if you wish to - * reuse it elsewhere. + * @memberof ps_decoder_t + * @return The log-math object for this decoder. The decoder owns + * this pointer, so you should not attempt to free it + * manually. Use logmath_retain() if you wish to reuse it + * elsewhere. */ POCKETSPHINX_EXPORT logmath_t *ps_get_logmath(ps_decoder_t *ps); -/** - * Get the feature extraction object for this decoder. - * - * @return The feature extraction object for this decoder. The - * decoder retains ownership of this pointer, so you should - * not attempt to free it manually. Use fe_retain() if you - * wish to reuse it elsewhere. - */ -POCKETSPHINX_EXPORT -fe_t *ps_get_fe(ps_decoder_t *ps); - -/** - * Get the dynamic feature computation object for this decoder. - * - * @return The dynamic feature computation object for this decoder. The - * decoder retains ownership of this pointer, so you should - * not attempt to free it manually. Use feat_retain() if you - * wish to reuse it elsewhere. - */ -POCKETSPHINX_EXPORT -feat_t *ps_get_feat(ps_decoder_t *ps); - /** * Adapt current acoustic model using a linear transform. * - * @param mllr The new transform to use, or NULL to update the existing - * transform. The decoder retains ownership of this pointer, - * so you should not attempt to free it manually. Use - * ps_mllr_retain() if you wish to reuse it - * elsewhere. + * @memberof ps_decoder_t + * @param mllr The new transform to use, or NULL to update the + * existing transform. The decoder retains ownership of + * this pointer, so you may free it if you no longer need + * it. * @return The updated transform object for this decoder, or * NULL on failure. */ @@ -215,10 +666,11 @@ ps_mllr_t *ps_update_mllr(ps_decoder_t *ps, ps_mllr_t *mllr); * Reload the pronunciation dictionary from a file. * * This function replaces the current pronunciation dictionary with - * the one stored in dictfile. This also causes the active search + * the one stored in `dictfile`. This also causes the active search * module(s) to be reinitialized, in the same manner as calling * ps_add_word() with update=TRUE. * + * @memberof ps_decoder_t * @param dictfile Path to dictionary file to load. * @param fdictfile Path to filler dictionary to load, or NULL to keep * the existing filler dictionary. @@ -232,8 +684,9 @@ int ps_load_dict(ps_decoder_t *ps, char const *dictfile, /** * Dump the current pronunciation dictionary to a file. * - * This function dumps the current pronunciation dictionary to a tex + * This function dumps the current pronunciation dictionary to a text file. * + * @memberof ps_decoder_t * @param dictfile Path to file where dictionary will be written. * @param format Format of the dictionary file, or NULL for the * default (text) format (currently unused, should be NULL) @@ -250,6 +703,7 @@ int ps_save_dict(ps_decoder_t *ps, char const *dictfile, char const *format); * other, it does whatever is necessary to ensure that the word can be * recognized. * + * @memberof ps_decoder_t * @param word Word string to add. * @param phones Whitespace-separated list of phoneme strings * describing pronunciation of word. @@ -267,9 +721,10 @@ int ps_add_word(ps_decoder_t *ps, int update); /** - * Lookup for the word in the dictionary and return phone transcription + * Look up a word in the dictionary and return phone transcription * for it. * + * @memberof ps_decoder_t * @param ps Pocketsphinx decoder * @param word Word to look for * @@ -289,6 +744,7 @@ char *ps_lookup_word(ps_decoder_t *ps, * to determine the sampling rate and endianness of the stream, * respectively. Audio is always assumed to be 16-bit signed PCM. * + * @memberof ps_decoder_t * @param ps Decoder. * @param rawfh Previously opened file stream. * @param maxsamps Maximum number of samples to read from rawfh, or -1 @@ -302,23 +758,43 @@ long ps_decode_raw(ps_decoder_t *ps, FILE *rawfh, /** * Decode a senone score dump file. * + * @memberof ps_decoder_t * @param ps Decoder - * @param fh Previously opened file handle positioned at start of file. + * @param senfh Previously opened file handle positioned at start of file. * @return Number of frames read. */ POCKETSPHINX_EXPORT int ps_decode_senscr(ps_decoder_t *ps, FILE *senfh); /** - * Start processing of the stream of speech. Channel parameters like - * noise-level are maintained for the stream and reused among utterances. - * Times returned in segment iterators are also stream-wide. + * Start processing of the stream of speech. + * + * @deprecated This function is retained for compatibility, but its + * only effect is to reset the noise removal statistics, which are + * otherwise retained across utterances. You do not need to call it. * + * @memberof ps_decoder_t * @return 0 for success, <0 on error. */ POCKETSPHINX_EXPORT int ps_start_stream(ps_decoder_t *ps); +/** + * Check in-speech status of decoder. + * + * @deprecated This function is retained for compatibility but should + * not be considered a reliable voice activity detector. It will + * always return 1 between calls to ps_start_utt() and ps_end_utt(). + * You probably want ps_endpointer_t, but for single frames of data + * you can also use \ref ps_vad_t. + * + * @memberof ps_decoder_t + * @param ps Decoder. + * @return 1 if last buffer contained speech, 0 - otherwise + */ +POCKETSPHINX_EXPORT +int ps_get_in_speech(ps_decoder_t *ps); + /** * Start utterance processing. * @@ -326,6 +802,7 @@ int ps_start_stream(ps_decoder_t *ps); * to the decoder. It marks the start of a new utterance and * reinitializes internal data structures. * + * @memberof ps_decoder_t * @param ps Decoder to be started. * @return 0 for success, <0 on error. */ @@ -335,7 +812,10 @@ int ps_start_utt(ps_decoder_t *ps); /** * Decode raw audio data. * + * @memberof ps_decoder_t * @param ps Decoder. + * @param data Audio data, as 16-bit linear PCM. + * @param n_samples Number of samples (not bytes) in `data`. * @param no_search If non-zero, perform feature extraction but don't * do any recognition yet. This may be necessary if * your processor has trouble doing recognition in @@ -355,7 +835,14 @@ int ps_process_raw(ps_decoder_t *ps, /** * Decode acoustic feature data. * + * @memberof ps_decoder_t * @param ps Decoder. + * @param data Acoustic feature data, a 2-dimensional array of 32-bit + * floating-point values. Note that this is not a standard + * 2-dimesional C array but rather an array of pointers to + * floats, each of which is one vector (or frame) of + * `ps_config_get_int("ceplen")` values. + * @param n_frames Number of vectors in `data`. * @param no_search If non-zero, perform feature extraction but don't * do any recognition yet. This may be necessary if * your processor has trouble doing recognition in @@ -367,7 +854,7 @@ int ps_process_raw(ps_decoder_t *ps, */ POCKETSPHINX_EXPORT int ps_process_cep(ps_decoder_t *ps, - mfcc_t **data, + float32 **data, int n_frames, int no_search, int full_utt); @@ -381,6 +868,7 @@ int ps_process_cep(ps_decoder_t *ps, * audio, and dynamic features are computed over a sliding window of * acoustic features. * + * @memberof ps_decoder_t * @param ps Decoder. * @return Number of frames of speech data which have been recognized * so far. @@ -391,6 +879,7 @@ int ps_get_n_frames(ps_decoder_t *ps); /** * End utterance processing. * + * @memberof ps_decoder_t * @param ps Decoder. * @return 0 for success, <0 on error */ @@ -400,10 +889,13 @@ int ps_end_utt(ps_decoder_t *ps); /** * Get hypothesis string and path score. * + * @memberof ps_decoder_t * @param ps Decoder. * @param out_best_score Output: path score corresponding to returned string. * @return String containing best hypothesis at this point in - * decoding. NULL if no hypothesis is available. + * decoding. NULL if no hypothesis is available. This string is owned + * by the decoder and only valid for the current hypothesis, so you + * should copy it if you need to hold onto it. */ POCKETSPHINX_EXPORT char const *ps_get_hyp(ps_decoder_t *ps, int32 *out_best_score); @@ -418,6 +910,7 @@ char const *ps_get_hyp(ps_decoder_t *ps, int32 *out_best_score); * confidence annotation for partial hypotheses may result in these * restrictions being lifted in future versions. * + * @memberof ps_decoder_t * @param ps Decoder. * @return Posterior probability of the best hypothesis. */ @@ -427,9 +920,7 @@ int32 ps_get_prob(ps_decoder_t *ps); /** * Get word lattice. * - * There isn't much you can do with this so far, a public API will - * appear in the future. - * + * @memberof ps_decoder_t * @param ps Decoder. * @return Word lattice object containing all hypotheses so far. NULL * if no hypotheses are available. This pointer is owned by @@ -443,6 +934,7 @@ ps_lattice_t *ps_get_lattice(ps_decoder_t *ps); /** * Get an iterator over the word segmentation for the best hypothesis. * + * @memberof ps_decoder_t * @param ps Decoder. * @return Iterator over the best hypothesis at this point in * decoding. NULL if no hypothesis is available. @@ -453,6 +945,7 @@ ps_seg_t *ps_seg_iter(ps_decoder_t *ps); /** * Get the next segment in a word segmentation. * + * @memberof ps_seg_t * @param seg Segment iterator. * @return Updated iterator with the next segment. NULL at end of * utterance (the iterator will be freed in this case). @@ -463,6 +956,7 @@ ps_seg_t *ps_seg_next(ps_seg_t *seg); /** * Get word string from a segmentation iterator. * + * @memberof ps_seg_t * @param seg Segment iterator. * @return Read-only string giving string name of this segment. This * is only valid until the next call to ps_seg_next(). @@ -477,9 +971,10 @@ char const *ps_seg_word(ps_seg_t *seg); * to the last frame in which the given word or other segment was * active. Therefore, the actual duration is *out_ef - *out_sf + 1. * + * @memberof ps_seg_t * @param seg Segment iterator. * @param out_sf Output: First frame index in segment. - * @param out_sf Output: Last frame index in segment. + * @param out_ef Output: Last frame index in segment. */ POCKETSPHINX_EXPORT void ps_seg_frames(ps_seg_t *seg, int *out_sf, int *out_ef); @@ -495,6 +990,7 @@ void ps_seg_frames(ps_seg_t *seg, int *out_sf, int *out_ef); * confidence annotation for partial hypotheses may result in these * restrictions being lifted in future versions. * + * @memberof ps_seg_t * @param out_ascr Output: acoustic model score for this segment. * @param out_lscr Output: language model score for this segment. * @param out_lback Output: language model backoff mode for this @@ -511,6 +1007,7 @@ int32 ps_seg_prob(ps_seg_t *seg, int32 *out_ascr, int32 *out_lscr, int32 *out_lb /** * Finish iterating over a word segmentation early, freeing resources. + * @memberof ps_seg_t */ POCKETSPHINX_EXPORT void ps_seg_free(ps_seg_t *seg); @@ -520,6 +1017,7 @@ void ps_seg_free(ps_seg_t *seg); * return a NULL which means that there is no hypothesis available for this * utterance. * + * @memberof ps_decoder_t * @param ps Decoder. * @return Iterator over N-best hypotheses or NULL if no hypothesis is available */ @@ -529,6 +1027,7 @@ ps_nbest_t *ps_nbest(ps_decoder_t *ps); /** * Move an N-best list iterator forward. * + * @memberof ps_nbest_t * @param nbest N-best iterator. * @return Updated N-best iterator, or NULL if no more hypotheses are * available (iterator is freed ni this case). @@ -539,9 +1038,11 @@ ps_nbest_t *ps_nbest_next(ps_nbest_t *nbest); /** * Get the hypothesis string from an N-best list iterator. * + * @memberof ps_nbest_t * @param nbest N-best iterator. * @param out_score Output: Path score for this hypothesis. - * @return String containing next best hypothesis. + * @return String containing next best hypothesis. Note that this + * pointer is only valid for the current iteration. */ POCKETSPHINX_EXPORT char const *ps_nbest_hyp(ps_nbest_t *nbest, int32 *out_score); @@ -549,8 +1050,8 @@ char const *ps_nbest_hyp(ps_nbest_t *nbest, int32 *out_score); /** * Get the word segmentation from an N-best list iterator. * + * @memberof ps_nbest_t * @param nbest N-best iterator. - * @param out_score Output: Path score for this hypothesis. * @return Iterator over the next best hypothesis. */ POCKETSPHINX_EXPORT @@ -559,6 +1060,7 @@ ps_seg_t *ps_nbest_seg(ps_nbest_t *nbest); /** * Finish N-best search early, releasing resources. * + * @memberof ps_nbest_t * @param nbest N-best iterator. */ POCKETSPHINX_EXPORT @@ -567,6 +1069,7 @@ void ps_nbest_free(ps_nbest_t *nbest); /** * Get performance information for the current utterance. * + * @memberof ps_decoder_t * @param ps Decoder. * @param out_nspeech Output: Number of seconds of speech. * @param out_ncpu Output: Number of seconds of CPU time used. @@ -579,6 +1082,7 @@ void ps_get_utt_time(ps_decoder_t *ps, double *out_nspeech, /** * Get overall performance information. * + * @memberof ps_decoder_t * @param ps Decoder. * @param out_nspeech Output: Number of seconds of speech. * @param out_ncpu Output: Number of seconds of CPU time used. @@ -588,50 +1092,230 @@ POCKETSPHINX_EXPORT void ps_get_all_time(ps_decoder_t *ps, double *out_nspeech, double *out_ncpu, double *out_nwall); -/** - * Checks if the last feed audio buffer contained speech - * - * @param ps Decoder. - * @return 1 if last buffer contained speech, 0 - otherwise - */ -POCKETSPHINX_EXPORT -uint8 ps_get_in_speech(ps_decoder_t *ps); - - -/** - * Sets the limit of the raw audio data to store in decoder - * to retrieve it later on ps_get_rawdata. - * - * @param ps Decoder - * @param size bytes of the utterance to store - */ -POCKETSPHINX_EXPORT -void ps_set_rawdata_size(ps_decoder_t *ps, int32 size); - - -/** - * Retrieves the raw data collected during utterance decoding. - * - * @param ps Decoder - * @param buffer preallocated buffer to store the data, must be within the limit - * set before - * @param size size of the data collected in samples (not bytes). - */ -POCKETSPHINX_EXPORT -void ps_get_rawdata(ps_decoder_t *ps, int16 **buffer, int32 *size); - /** * @mainpage PocketSphinx API Documentation - * @author David Huggins-Daines - * @author Alpha Cephei Inc. - * @version 5prealpha - * @date July, 2015 + * @author David Huggins-Daines + * @version 5.0.4 + * @date January 10, 2025 + * + * @tableofcontents{HTML:1} * * @section intro_sec Introduction * - * This is the API documentation for the PocketSphinx speech - * recognition engine. The main API calls are documented in - * . + * This is the documentation for the PocketSphinx speech recognition + * engine. The main API calls are documented in \ref ps_decoder_t and + * \ref ps_config_t. The organization of this document is not optimal + * due to the limitations of Doxygen, so if you know of a better tool + * for documenting object-oriented interfaces in C, please let me know. + * + * @section install_sec Installation + * + * To install from source, you will need a C compiler and a recent + * version of CMake. If you wish to use an integrated development + * environment, Visual Studio Code will automate most of this process + * for you once you have installed C++ and CMake support as described + * at https://code.visualstudio.com/docs/languages/cpp + * + * The easiest way to program PocketSphinx is with the Python module. + * See http://pocketsphinx.readthedocs.io/ for installation and usage + * instructions. + * + * @subsection unix_install Unix-like systems + * + * From the top-level source directory, use CMake to generate a build + * directory: + * + * cmake -S . -B build + * + * Now you can compile and run the tests, and install the code: + * + * cmake --build build + * cmake --build build --target check + * cmake --build build --target install + * + * By default CMake will try to install things in `/usr/local`, which + * you might not have access to. If you want to install somewhere + * else you need to set `CMAKE_INSTALL_PREFIX` *when running cmake for + * the first time*, for example: + * + * cmake -S . -B build -DCMAKE_INSTALL_PREFIX=$HOME/.local + * + * @subsection windows_install Windows + * + * On Windows, the process is similar, but you will need to tell CMake + * what build tool you are using with the `-G` option, and there are + * many of them. The build is known to work with `nmake` but it is + * easiest just to use Visual Studio Code, which should automatically + * detect and offer to run the build when you add the source directory + * to your list of directories. Once built, you will find the EXE + * files in `build\Debug` or `build\Release` depending on your build + * type. + * + * @subsection build_options Compilation options + * + * By default, PocketSphinx does *not* build shared libraries, as + * there are not very many executables, and the library is quite smol. + * If you insist on building them, you can add `BUILD_SHARED_LIBS=ON` + * to the CMake configuration. This is done either in the CMake GUI, + * in Visual Studio Code, or with the `-D` option to the first CMake + * command-line above, e.g.: + * + * cmake -S. -B build -DBUILD_SHARED_LIBS=ON + * + * GStreamer support is not built by default, but can be enabled with + * `BUILD_GSTREAMER=ON`. + * + * PocketSphinx uses a mixture of fixed and floating-point computation + * by default, but can be configured to use fixed-point (nearly) + * exclusively with `FIXED_POINT=ON`. + * + * @section programming_sec Using the Library + * + * Minimally, to do speech recognition, you must first create a + * configuration, using \ref ps_config_t and its associated functions. + * This configuration is then passed to ps_init() to initialize the + * decoder, which is returned as a \ref ps_decoder_t. Note that you must + * ultimately release the configuration with ps_config_free() to avoid + * memory leaks. + * + * At this point, you can start an "utterance" (a section of speech + * you wish to recognize) with ps_start_utt() and pass audio data to + * the decoder with ps_process_raw(). When finished, call + * ps_end_utt() to finalize recognition. The result can then be + * obtained with ps_get_hyp(). To get a detailed word segmentation, + * use ps_seg_iter(). To get the N-best results, use ps_nbest(). + * + * When you no longer need the decoder, release its memory with + * ps_free(). + * + * A concrete example can be found in \ref simple.c. + * + * You may, however, wish to do more interesting things like + * segmenting and recognizing speech from an audio stream. As + * described below, PocketSphinx will *not* handle the details of + * microphone input for you, because doing this in a reliable and + * portable way is outside the scope of a speech recognizer. In + * theory, [PortAudio](http://www.portaudio.com/) should work across + * many platforms. An example using it is in \ref live_portaudio.c. + * + * On Windows, an example of using the [Waveform Audio + * API](https://learn.microsoft.com/en-us/windows/win32/multimedia/waveform-audio) + * can be found in \ref live_win32.c. + * + * On GNU/Linux and some other platforms, audio might be handled by + * the PulseAudio library/server, in which case you can also use the + * technique in \ref live_pulseaudio.c. + * + * Finally, if you have `sox` on your platform, you can simply use the + * method shown in \ref live.c. + * + * @section faq_sec Frequently Asked Questions + * + * @subsection faq_api My code no longer compiles! Why? + * + * Some APIs were intentionally broken by the 5.0.0 release. The most + * likely culprit here is the configuration API, where the old + * "options" which started with a `-` are now "parameters" which do + * not, and instead of a `cmd_ln_t` it is now a `ps_config_t`. There + * is no backward compatibility, you have to change your code + * manually. This is straightforward for the most part. For example, + * instead of writing: + * + * cmdln = cmd_ln_init(NULL, "-samprate", "16000", NULL); + * cmd_ln_set_int32_r(NULL, "-maxwpf", 40); + * + * You should write: + * + * config = ps_config_init(NULL); + * ps_config_set_int(config, "samprate", 16000); + * ps_config_set_int(config, "maxwpf", 40); + * + * Another likely suspect is the \ref pocketsphinx/search.h + * "search module API" where the function names have been changed to be more + * intuitive. Wherever you had `ps_set_search` you can use + * ps_activate_search(), it is the same function. Likewise, anything + * that was `ps_set_*` is now `ps_add_*`, e.g. ps_add_lm(), + * ps_add_fsg(), ps_add_keyphrase(). + * + * @subsection faq_path What does ERROR: "acmod.c, line NN: ..." mean? + * + * In general you will get "Acoustic model definition is not + * specified" or "Folder does not contain acoustic model definition" + * errors if PocketSphinx cannot find a model. If you are trying to + * use the default module, perhaps you have not installed + * PocketSphinx. Unfortunately it is not designed to run "in-place", + * but you can get around this by setting the `POCKETSPHINX_PATH` + * environment variable, e.g. + * + * cmake --build build + * POCKETSPHINX_PATH=$PWD/model build/pocketsphinx single foo.wav + * + * @subsection faq_blank There is literally no output! + * + * If by this you mean it doesn't spew copious logging output like it + * used to, you can solve this by passing `-loglevel INFO` on the + * command-line, or setting the `loglevel` parameter to `"INFO"`, or + * calling err_set_loglevel() with `ERR_INFO`. + * + * If you mean that you just don't have any recognition result, you + * may have forgotten to configure a dictionary. Or see \ref + * faq_error "below" for other reasons the output could be blank. + * + * @subsection faq_audio Why doesn't my audio device work? + * + * Because it's an audio device. They don't work, at least for things + * other than making annoying "beep boop" noises and playing Video + * Games. More generally, I cannot solve this problem for you, + * because every single computer, operating system, sound card, + * microphone, phase of the moon, and day of the week is different + * when it comes to recording audio. That's why I suggest you use + * SoX, because (a) it usually works, and (b) whoever wrote it seems + * to have retired long ago, so you can't bother them. + * + * @subsection faq_error The recognized text is wrong. + * + * That's not a question! But since this isn't Jeopardy, and my name + * is not Watson, I'll try to answer it anyway. Be aware that the + * answer depends on many things, first and foremost what you mean by + * "wrong". + * + * If it *sounds* the same, e.g. "wreck a nice beach" when you said + * "recognize speech" then the issue is that the **language model** is + * not appropriate for the task, domain, dialect, or whatever it is + * you're trying to recognize. You may wish to consider writing a + * JSGF grammar and using it instead of the default language model + * (with the `jsgf` parameter). Or you can get an N-best list or word + * lattice and rescore it with a better language model, such as a + * recurrent neural network or a human being. + * + * If it is total nonsense, or if it is just blank, or if it's the + * same word repeated, e.g. "a a a a a a", then there is likely a + * problem with the input audio. The sampling rate could be wrong, or + * even if it's correct, you may have narrow-band data. Try to look + * at the spectrogram (Audacity can show you this) and see if it looks + * empty or flat below the frequency in the `upperf` parameter. + * Alternately it could just be very noisy. In particular, if the + * noise consists of other people talking, automatic speech + * recognition will nearly always fail. + * + * @subsection faq_tech Why don't you support (pick one or more: WFST, fMLLR, SAT, DNN, CTC, LAS, CNN, RNN, LSTM, etc)? + * + * Not because there's anything wrong with those things (except LAS, + * which is kind of a dumb idea) but simply because PocketSphinx does + * not do them, or anything like them, and there is no point in adding + * them to it when other systems exist. Many of them are also heavily + * dependent on distasteful and wasteful platforms like C++, CUDA, + * TensorFlow, PyTorch, and so on. + * + * @section thanks_sec Acknowledgements + * + * PocketSphinx was originally released by David Huggins-Daines, but + * is largely based on the previous Sphinx-II and Sphinx-III systems, + * developed by a large number of contributors at Carnegie Mellon + * University, and released as open source under a BSD-like license + * thanks to Kevin Lenzo. For some time, it was maintained by + * Nickolay Shmyrev and others at Alpha Cephei, Inc. See the + * `AUTHORS` file for a list of contributors. */ #ifdef __cplusplus diff --git a/include/pocketsphinx/alignment.h b/include/pocketsphinx/alignment.h new file mode 100644 index 0000000..bcc6e97 --- /dev/null +++ b/include/pocketsphinx/alignment.h @@ -0,0 +1,166 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2010 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file alignment.h + * @brief Multi-level alignment structure + * + * Because doxygen is Bad Software, the actual documentation can only + * exist in \ref ps_alignment_t. Sorry about that. + */ + +#ifndef __PS_ALIGNMENT_H__ +#define __PS_ALIGNMENT_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * Value indicating no parent or child for an entry. + * @related ps_alignment_t + */ +#define PS_ALIGNMENT_NONE -1 + +/** + * @struct ps_alignment_t pocketsphinx/alignment.h + * @brief Multi-level alignment (words, phones, states) over an utterance. + */ +typedef struct ps_alignment_s ps_alignment_t; + +/** + * @struct ps_alignment_iter_t pocketsphinx/alignment.h + * @brief Iterator over entries in an alignment. + */ +typedef struct ps_alignment_iter_s ps_alignment_iter_t; + +/** + * Retain an alignment + * @memberof ps_alignment_t + */ +POCKETSPHINX_EXPORT +ps_alignment_t *ps_alignment_retain(ps_alignment_t *al); + +/** + * Release an alignment + * @memberof ps_alignment_t + */ +POCKETSPHINX_EXPORT +int ps_alignment_free(ps_alignment_t *al); + +/** + * Iterate over the alignment starting at the first word. + * @memberof ps_alignment_t + */ +POCKETSPHINX_EXPORT +ps_alignment_iter_t *ps_alignment_words(ps_alignment_t *al); + +/** + * Iterate over the alignment starting at the first phone. + * @memberof ps_alignment_t + */ +POCKETSPHINX_EXPORT +ps_alignment_iter_t *ps_alignment_phones(ps_alignment_t *al); + +/** + * Iterate over the alignment starting at the first state. + * @memberof ps_alignment_t + */ +POCKETSPHINX_EXPORT +ps_alignment_iter_t *ps_alignment_states(ps_alignment_t *al); + +/** + * Get the human-readable name of the current segment for an alignment. + * + * @memberof ps_alignment_iter_t + * @return Name of this segment as a string (word, phone, or state + * number). This pointer is owned by the iterator, do not free it + * yourself. + */ +POCKETSPHINX_EXPORT +const char *ps_alignment_iter_name(ps_alignment_iter_t *itor); + +/** + * Get the timing and score information for the current segment of an alignment. + * + * @memberof ps_alignment_iter_t + * @arg start Output pointer for start frame + * @arg duration Output pointer for duration + * @return Acoustic score for this segment + */ +POCKETSPHINX_EXPORT +int ps_alignment_iter_seg(ps_alignment_iter_t *itor, int *start, int *duration); + +/** + * Move an alignment iterator forward. + * + * If the end of the alignment is reached, this will free the iterator + * and return NULL. + * + * @memberof ps_alignment_iter_t + */ +POCKETSPHINX_EXPORT +ps_alignment_iter_t *ps_alignment_iter_next(ps_alignment_iter_t *itor); + +/** + * Iterate over the children of the current alignment entry. + * + * If there are no child nodes, NULL is returned. + * + * @memberof ps_alignment_iter_t + */ +POCKETSPHINX_EXPORT +ps_alignment_iter_t *ps_alignment_iter_children(ps_alignment_iter_t *itor); + +/** + * Release an iterator before completing all iterations. + * + * @memberof ps_alignment_iter_t + */ +POCKETSPHINX_EXPORT +int ps_alignment_iter_free(ps_alignment_iter_t *itor); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __PS_ALIGNMENT_H__ */ diff --git a/include/pocketsphinx/endpointer.h b/include/pocketsphinx/endpointer.h new file mode 100644 index 0000000..ef083a7 --- /dev/null +++ b/include/pocketsphinx/endpointer.h @@ -0,0 +1,226 @@ +/* -*- c-basic-offset:4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2022 David Huggins-Daines. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ +/** + * @file endpointer.h + * @brief VAD-based endpointer for PocketSphinx + * + * Because doxygen is Bad Software, the actual documentation can only + * exist in \ref ps_endpointer_t. Sorry about that. + */ + +#ifndef __PS_ENDPOINTER_H__ +#define __PS_ENDPOINTER_H__ + + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +#include +#include +#include + +/** + * @struct ps_endpointer_t pocketsphinx/endpointer.h + * @brief Simple voice activity detection based endpointing + */ +typedef struct ps_endpointer_s ps_endpointer_t; + +/** + * Default window in seconds of audio to use for speech start/end decision. + */ +#define PS_ENDPOINTER_DEFAULT_WINDOW 0.3 +/** + * Default ratio of frames in window to trigger start/end decision. + */ +#define PS_ENDPOINTER_DEFAULT_RATIO 0.9 + +/** + * Initialize endpointing. + * + * @memberof ps_endpointer_t + * @param window Seconds of audio to use in speech start/end decision, + * or 0 to use the default (PS_ENDPOINTER_DEFAULT_WINDOW). + * @param ratio Ratio of frames needed to trigger start/end decision, + * or 0 for the default (PS_ENDPOINTER_DEFAULT_RATIO). + * @param mode "Aggressiveness" of voice activity detection. Stricter + * values (see ps_vad_mode_t) are less likely to + * misclassify non-speech as speech. + * @param sample_rate Sampling rate of input, or 0 for default (which can + * be obtained with ps_vad_sample_rate()). Only 8000, + * 16000, 32000, 48000 are directly supported, others + * will use the closest supported rate (within reason). + * Note that this means that the actual frame length + * may not be exactly the one requested, so you must + * always use the one returned by + * ps_endpointer_frame_size() + * (in samples) or ps_endpointer_frame_length() (in + * seconds). + * @param frame_length Requested frame length in seconds, or 0.0 for the + * default. Only 0.01, 0.02, 0.03 currently supported. + * **Actual frame length may be different, you must + * always use ps_endpointer_frame_length() to obtain it.** + * @return Endpointer object or NULL on failure (invalid parameter for + * instance). + */ +POCKETSPHINX_EXPORT +ps_endpointer_t *ps_endpointer_init(double window, + double ratio, + ps_vad_mode_t mode, + int sample_rate, double frame_length); + +/** + * Retain a pointer to endpointer + * + * @memberof ps_endpointer_t + * @param ep Endpointer. + * @return Endpointer with incremented reference count. + */ +POCKETSPHINX_EXPORT +ps_endpointer_t *ps_endpointer_retain(ps_endpointer_t *ep); + +/** + * Release a pointer to endpointer. + * + * @memberof ps_endpointer_t + * @param ep Endpointer + * @return New reference count (0 if freed). + */ +POCKETSPHINX_EXPORT +int ps_endpointer_free(ps_endpointer_t *ep); + +/** + * Get the voice activity detector used by the endpointer. + * + * @memberof ps_endpointer_t + * @return VAD object. The endpointer retains ownership of this + * object, so you must use ps_vad_retain() if you wish to use it + * outside of the lifetime of the endpointer. + */ +POCKETSPHINX_EXPORT +ps_vad_t *ps_endpointer_vad(ps_endpointer_t *ep); + +/** + * Get the frame size (in samples) consumed by the endpointer. + * + * Multiply this by 2 to get the size of the frame buffer required. + */ +#define ps_endpointer_frame_size(ep) ps_vad_frame_size(ps_endpointer_vad(ep)) + +/** + * Get the frame length (in seconds) consumed by the endpointer. + */ +#define ps_endpointer_frame_length(ep) ps_vad_frame_length(ps_endpointer_vad(ep)) + +/** + * Get the sample rate required by the endpointer. + */ +#define ps_endpointer_sample_rate(ep) ps_vad_sample_rate(ps_endpointer_vad(ep)) + +/** + * Process a frame of audio, returning a frame if in a speech region. + * + * Note that the endpointer is *not* thread-safe. You must call all + * endpointer functions from the same thread. + * + * @memberof ps_endpointer_t + * @param ep Endpointer. + * @param frame Frame of data, must contain ps_endpointer_frame_size() + * samples. + * @return NULL if no speech available, or pointer to a frame of + * ps_endpointer_frame_size() samples (no more and no less). + */ +POCKETSPHINX_EXPORT +const int16 *ps_endpointer_process(ps_endpointer_t *ep, + const int16 *frame); + +/** + * Process remaining samples at end of stream. + * + * Note that the endpointer is *not* thread-safe. You must call all + * endpointer functions from the same thread. + * + * @memberof ps_endpointer_t + * @param ep Endpointer. + * @param frame Frame of data, must contain ps_endpointer_frame_size() + * samples or less. + * @param nsamp: Number of samples in frame. + * @param out_nsamp: Output, number of samples available. + * @return Pointer to available samples, or NULL if none available. + */ +POCKETSPHINX_EXPORT +const int16 *ps_endpointer_end_stream(ps_endpointer_t *ep, + const int16 *frame, + size_t nsamp, + size_t *out_nsamp); + +/** + * Get the current state (speech/not-speech) of the endpointer. + * + * This function can be used to detect speech/non-speech transitions. + * If it returns 0, and a subsequent call to ps_endpointer_process() + * returns non-NULL, this indicates a transition to speech. + * Conversely, if ps_endpointer_process() returns non-NULL and a + * subsequent call to this function returns 0, this indicates a + * transition to non-speech. + * + * @memberof ps_endpointer_t + * @param ep Endpointer. + * @return non-zero if in a speech segment after processing the last + * frame of data. + */ +POCKETSPHINX_EXPORT +int ps_endpointer_in_speech(ps_endpointer_t *ep); + +/** + * Get the start time of the last speech segment. + * @memberof ps_endpointer_t + */ +POCKETSPHINX_EXPORT +double ps_endpointer_speech_start(ps_endpointer_t *ep); + +/** + * Get the end time of the last speech segment + * @memberof ps_endpointer_t + */ +POCKETSPHINX_EXPORT +double ps_endpointer_speech_end(ps_endpointer_t *ep); + +#ifdef __cplusplus +} +#endif + +#endif /* __PS_ENDPOINTER_H__ */ diff --git a/include/pocketsphinx/err.h b/include/pocketsphinx/err.h new file mode 100644 index 0000000..dc01f76 --- /dev/null +++ b/include/pocketsphinx/err.h @@ -0,0 +1,220 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef _LIBUTIL_ERR_H_ +#define _LIBUTIL_ERR_H_ + +#include +#include +#include +#include + +#include + +/** + * @file err.h + * @brief Implementation of logging routines. + * + * Logging, warning, debug and error message output functionality is provided in this file. + * Sphinxbase defines several level of logging messages - INFO, WARNING, ERROR, FATAL. By + * default output goes to standard error output. + * + * Logging is implemented through macros. They take same arguments as printf: format string and + * values. By default source file name and source line are prepended to the message. Log output + * could be redirected to any file using err_set_logfp() and err_set_logfile() functions. To disable + * logging in your application, call err_set_logfp(NULL). + * + * It's possible to log multiline info messages, to do that you need to start message with + * E_INFO and output other lines with E_INFOCONT. + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#define E_SYSCALL(stmt, ...) if (stmt) E_FATAL_SYSTEM(__VA_ARGS__); + +#define FILELINE __FILE__ , __LINE__ + +/** + * Exit with non-zero status after error message + */ +#define E_FATAL(...) \ + do { \ + err_msg(ERR_FATAL, FILELINE, __VA_ARGS__); \ + exit(EXIT_FAILURE); \ + } while (0) + +/** + * Print error text; Call perror(""); exit(errno); + */ +#define E_FATAL_SYSTEM(...) \ + do { \ + err_msg_system(ERR_FATAL, FILELINE, __VA_ARGS__); \ + exit(EXIT_FAILURE); \ + } while (0) + +/** + * Print error text; Call perror(""); + */ +#define E_ERROR_SYSTEM(...) err_msg_system(ERR_ERROR, FILELINE, __VA_ARGS__) + +/** + * Print error message to error log + */ +#define E_ERROR(...) err_msg(ERR_ERROR, FILELINE, __VA_ARGS__) + +/** + * Print warning message to error log + */ +#define E_WARN(...) err_msg(ERR_WARN, FILELINE, __VA_ARGS__) + +/** + * Print logging information to standard error stream + */ +#define E_INFO(...) err_msg(ERR_INFO, FILELINE, __VA_ARGS__) + +/** + * Continue printing the information to standard error stream + */ +#define E_INFOCONT(...) err_msg(ERR_INFO, NULL, 0, __VA_ARGS__) + +/** + * Print logging information without filename. + */ +#define E_INFO_NOFN(...) err_msg(ERR_INFO, NULL, 0, __VA_ARGS__) + +/** + * Debug is disabled by default + */ +#ifdef SPHINX_DEBUG +#define E_DEBUG(...) err_msg(ERR_DEBUG, NULL, 0, __VA_ARGS__) +#else +#define E_DEBUG(...) +#endif + +typedef enum err_e { + ERR_DEBUG, + ERR_INFO, + ERR_WARN, + ERR_ERROR, + ERR_FATAL, + ERR_MAX +} err_lvl_t; + +POCKETSPHINX_EXPORT +void err_msg(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...); + +POCKETSPHINX_EXPORT +void err_msg_system(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...); + +POCKETSPHINX_EXPORT +void err_logfp_cb(void * user_data, err_lvl_t level, const char *fmt, ...); + +typedef void (*err_cb_f)(void* user_data, err_lvl_t, const char *, ...); + +/** + * Set minimum logging level. + * + * @param lvl Level below which messages will not be logged (note + * ERR_DEBUG messages are not logged unless compiled in debugging + * mode) + * @return previous log level. + */ +POCKETSPHINX_EXPORT +int err_set_loglevel(err_lvl_t lvl); + +/** + * Set minimum logging levelfrom a string + * + * @param lvl Level below which messages will not be logged (note + * ERR_DEBUG messages are not logged unless compiled in debugging + * mode). A string corresponding to the names in enum err_e, but + * without the leading "ERR_" prefix. + * @return previous log level string, or NULL for invalid argument. + */ +POCKETSPHINX_EXPORT +const char *err_set_loglevel_str(const char *lvl); + +/** + * Sets function to output error messages. Use it to redirect the logging + * to your application. By default the handler which dumps messages to + * stderr is set. + * + * @param callback callback to pass messages too + * @param user_data data to pass to callback + */ +POCKETSPHINX_EXPORT +void err_set_callback(err_cb_f callback, void *user_data); + +/** + * Direct all logging to a given filehandle if default logfp callback is set. + * + * @param stream Filehandle to send log messages to, or NULL to disable logging. + */ +POCKETSPHINX_EXPORT +void err_set_logfp(FILE *stream); + +/** + * Get the current logging filehandle. + * + * @return Current logging filehandle, NULL if logging is disabled. Initially + * it returns stderr + */ +POCKETSPHINX_EXPORT +FILE *err_get_logfp(void); + +/** + * Append all log messages to a given file. + * + * Previous logging filehandle is closed (unless it was stdout or stderr). + * + * @param path File path to send log messages to + * @return 0 for success, <0 for failure (e.g. if file does not exist) + */ +POCKETSPHINX_EXPORT +int err_set_logfile(const char *path); + +#ifdef __cplusplus +} +#endif + +#endif /* !_ERR_H */ diff --git a/include/pocketsphinx_export.h b/include/pocketsphinx/export.h similarity index 100% rename from include/pocketsphinx_export.h rename to include/pocketsphinx/export.h diff --git a/include/ps_lattice.h b/include/pocketsphinx/lattice.h similarity index 88% rename from include/ps_lattice.h rename to include/pocketsphinx/lattice.h index 7d78c6a..8b07a78 100644 --- a/include/ps_lattice.h +++ b/include/pocketsphinx/lattice.h @@ -36,18 +36,19 @@ */ /** - * @file ps_lattice.h Word graph search + * @file lattice.h + * @brief Word lattices + * + * Because doxygen is Bad Software, the actual documentation can only + * exist in \ref ps_lattice_t. Sorry about that. */ #ifndef __PS_LATTICE_H__ #define __PS_LATTICE_H__ -/* SphinxBase headers. */ -#include -#include - -/* PocketSphinx headers. */ -#include +#include +#include +#include #ifdef __cplusplus extern "C" { @@ -57,12 +58,14 @@ extern "C" { #endif /** - * Word graph structure used in bestpath/nbest search. + * @struct ps_lattice_t pocketsphinx/lattice.h + * @brief Word graph structure used in bestpath/nbest search. */ typedef struct ps_lattice_s ps_lattice_t; /** - * DAG nodes. + * @struct ps_latnode_t pocketsphinx/lattice.h + * @brief Node in a word lattice * * A node corresponds to a number of hypothesized instances of a word * which all share the same starting point. @@ -70,12 +73,14 @@ typedef struct ps_lattice_s ps_lattice_t; typedef struct ps_latnode_s ps_latnode_t; /** - * Iterator over DAG nodes. + * @struct ps_latnode_iter_t pocketsphinx/lattice.h + * @brief Iterator over DAG nodes. */ typedef struct ps_latnode_s ps_latnode_iter_t; /* pay no attention to the man behind the curtain */ /** - * Links between DAG nodes. + * @struct ps_latlink_t pocketsphinx/lattice.h + * @brief Link between DAG nodes. * * A link corresponds to a single hypothesized instance of a word with * a given start and end point. @@ -83,7 +88,8 @@ typedef struct ps_latnode_s ps_latnode_iter_t; /* pay no attention to the man be typedef struct ps_latlink_s ps_latlink_t; /** - * Iterator over DAG links. + * @struct ps_latlink_iter_t pocketsphinx/lattice.h + * @brief Iterator over DAG links. */ typedef struct latlink_list_s ps_latlink_iter_t; @@ -93,6 +99,7 @@ struct ps_decoder_s; /** * Read a lattice from a file on disk. * + * @memberof ps_lattice_t * @param ps Decoder to use for processing this lattice, or NULL. * @param file Path to lattice file. * @return Newly created lattice, or NULL for failure. @@ -108,6 +115,7 @@ ps_lattice_t *ps_lattice_read(struct ps_decoder_s *ps, * preventing it from being freed automatically. You must call * ps_lattice_free() to free it after having called this function. * + * @memberof ps_lattice_t * @return pointer to the retained lattice. */ POCKETSPHINX_EXPORT @@ -116,6 +124,7 @@ ps_lattice_t *ps_lattice_retain(ps_lattice_t *dag); /** * Free a lattice. * + * @memberof ps_lattice_t * @return new reference count (0 if dag was freed) */ POCKETSPHINX_EXPORT @@ -124,6 +133,7 @@ int ps_lattice_free(ps_lattice_t *dag); /** * Write a lattice to disk. * + * @memberof ps_lattice_t * @return 0 for success, <0 on failure. */ POCKETSPHINX_EXPORT @@ -132,6 +142,7 @@ int ps_lattice_write(ps_lattice_t *dag, char const *filename); /** * Write a lattice to disk in HTK format * + * @memberof ps_lattice_t * @return 0 for success, <0 on failure. */ POCKETSPHINX_EXPORT @@ -140,6 +151,7 @@ int ps_lattice_write_htk(ps_lattice_t *dag, char const *filename); /** * Get the log-math computation object for this lattice * + * @memberof ps_lattice_t * @return The log-math object for this lattice. The lattice retains * ownership of this pointer, so you should not attempt to * free it manually. Use logmath_retain() if you wish to @@ -155,6 +167,7 @@ logmath_t *ps_lattice_get_logmath(ps_lattice_t *dag); * @note No particular order of traversal is guaranteed, and you * should not depend on this. * + * @memberof ps_lattice_t * @param dag Lattice to iterate over. * @return Iterator over lattice nodes. */ @@ -163,6 +176,7 @@ ps_latnode_iter_t *ps_latnode_iter(ps_lattice_t *dag); /** * Move to next node in iteration. + * @memberof ps_latnode_iter_t * @param itor Node iterator. * @return Updated node iterator, or NULL if finished */ @@ -171,6 +185,7 @@ ps_latnode_iter_t *ps_latnode_iter_next(ps_latnode_iter_t *itor); /** * Stop iterating over nodes. + * @memberof ps_latnode_iter_t * @param itor Node iterator. */ POCKETSPHINX_EXPORT @@ -178,6 +193,7 @@ void ps_latnode_iter_free(ps_latnode_iter_t *itor); /** * Get node from iterator. + * @memberof ps_latnode_iter_t */ POCKETSPHINX_EXPORT ps_latnode_t *ps_latnode_iter_node(ps_latnode_iter_t *itor); @@ -185,6 +201,7 @@ ps_latnode_t *ps_latnode_iter_node(ps_latnode_iter_t *itor); /** * Get start and end time range for a node. * + * @memberof ps_latnode_iter_t * @param node Node inquired about. * @param out_fef Output: End frame of first exit from this node. * @param out_lef Output: End frame of last exit from this node. @@ -196,6 +213,7 @@ int ps_latnode_times(ps_latnode_t *node, int16 *out_fef, int16 *out_lef); /** * Get word string for this node. * + * @memberof ps_latnode_t * @param dag Lattice to which node belongs. * @param node Node inquired about. * @return Word string for this node (possibly a pronunciation variant). @@ -206,6 +224,7 @@ char const *ps_latnode_word(ps_lattice_t *dag, ps_latnode_t *node); /** * Get base word string for this node. * + * @memberof ps_latnode_t * @param dag Lattice to which node belongs. * @param node Node inquired about. * @return Base word string for this node. @@ -216,6 +235,7 @@ char const *ps_latnode_baseword(ps_lattice_t *dag, ps_latnode_t *node); /** * Iterate over exits from this node. * + * @memberof ps_latnode_t * @param node Node inquired about. * @return Iterator over exit links from this node. */ @@ -225,6 +245,7 @@ ps_latlink_iter_t *ps_latnode_exits(ps_latnode_t *node); /** * Iterate over entries to this node. * + * @memberof ps_latnode_t * @param node Node inquired about. * @return Iterator over entry links to this node. */ @@ -234,6 +255,7 @@ ps_latlink_iter_t *ps_latnode_entries(ps_latnode_t *node); /** * Get best posterior probability and associated acoustic score from a lattice node. * + * @memberof ps_latnode_t * @param dag Lattice to which node belongs. * @param node Node inquired about. * @param out_link Output: exit link with highest posterior probability @@ -249,6 +271,7 @@ int32 ps_latnode_prob(ps_lattice_t *dag, ps_latnode_t *node, /** * Get next link from a lattice link iterator. * + * @memberof ps_latlink_iter_t * @param itor Iterator. * @return Updated iterator, or NULL if finished. */ @@ -257,6 +280,7 @@ ps_latlink_iter_t *ps_latlink_iter_next(ps_latlink_iter_t *itor); /** * Stop iterating over links. + * @memberof ps_latlink_iter_t * @param itor Link iterator. */ POCKETSPHINX_EXPORT @@ -264,6 +288,7 @@ void ps_latlink_iter_free(ps_latlink_iter_t *itor); /** * Get link from iterator. + * @memberof ps_latlink_iter_t */ POCKETSPHINX_EXPORT ps_latlink_t *ps_latlink_iter_link(ps_latlink_iter_t *itor); @@ -274,6 +299,7 @@ ps_latlink_t *ps_latlink_iter_link(ps_latlink_iter_t *itor); * @note these are inclusive - i.e. the last frame of * this word is ef, not ef-1. * + * @memberof ps_latlink_t * @param link Link inquired about. * @param out_sf Output: (optional) start frame of this link. * @return End frame of this link. @@ -284,6 +310,7 @@ int ps_latlink_times(ps_latlink_t *link, int16 *out_sf); /** * Get destination and source nodes from a lattice link * + * @memberof ps_latlink_t * @param link Link inquired about * @param out_src Output: (optional) source node. * @return destination node @@ -294,6 +321,7 @@ ps_latnode_t *ps_latlink_nodes(ps_latlink_t *link, ps_latnode_t **out_src); /** * Get word string from a lattice link. * + * @memberof ps_latlink_t * @param dag Lattice to which node belongs. * @param link Link inquired about * @return Word string for this link (possibly a pronunciation variant). @@ -304,6 +332,7 @@ char const *ps_latlink_word(ps_lattice_t *dag, ps_latlink_t *link); /** * Get base word string from a lattice link. * + * @memberof ps_latlink_t * @param dag Lattice to which node belongs. * @param link Link inquired about * @return Base word string for this link @@ -314,6 +343,7 @@ char const *ps_latlink_baseword(ps_lattice_t *dag, ps_latlink_t *link); /** * Get predecessor link in best path. * + * @memberof ps_latlink_t * @param link Link inquired about * @return Best previous link from bestpath search, if any. Otherwise NULL */ @@ -323,6 +353,7 @@ ps_latlink_t *ps_latlink_pred(ps_latlink_t *link); /** * Get acoustic score and posterior probability from a lattice link. * + * @memberof ps_latlink_t * @param dag Lattice to which node belongs. * @param link Link inquired about * @param out_ascr Output: (optional) acoustic score. @@ -336,6 +367,8 @@ int32 ps_latlink_prob(ps_lattice_t *dag, ps_latlink_t *link, int32 *out_ascr); /** * Create a directed link between "from" and "to" nodes, but if a link already exists, * choose one with the best link_scr. + * + * @memberof ps_lattice_t */ POCKETSPHINX_EXPORT void ps_lattice_link(ps_lattice_t *dag, ps_latnode_t *from, ps_latnode_t *to, @@ -351,6 +384,7 @@ void ps_lattice_link(ps_lattice_t *dag, ps_latnode_t *from, ps_latnode_t *to, * impression that multiple traversals are possible at once, no * separate iterator structure is provided. * + * @memberof ps_lattice_t * @param dag Lattice to be traversed. * @param start Start node (source) of traversal. * @param end End node (goal) of traversal. @@ -362,6 +396,7 @@ ps_latlink_t *ps_lattice_traverse_edges(ps_lattice_t *dag, ps_latnode_t *start, /** * Get the next link in forward traversal. * + * @memberof ps_lattice_t * @param dag Lattice to be traversed. * @param end End node (goal) of traversal. * @return Next link in traversal. @@ -374,6 +409,7 @@ ps_latlink_t *ps_lattice_traverse_next(ps_lattice_t *dag, ps_latnode_t *end); * * @note See ps_lattice_traverse_edges() for why this API is the way it is. * + * @memberof ps_lattice_t * @param dag Lattice to be traversed. * @param start Start node (goal) of traversal. * @param end End node (source) of traversal. @@ -385,6 +421,7 @@ ps_latlink_t *ps_lattice_reverse_edges(ps_lattice_t *dag, ps_latnode_t *start, p /** * Get the next link in reverse traversal. * + * @memberof ps_lattice_t * @param dag Lattice to be traversed. * @param start Start node (goal) of traversal. * @return Next link in traversal. @@ -398,6 +435,7 @@ ps_latlink_t *ps_lattice_reverse_next(ps_lattice_t *dag, ps_latnode_t *start); * This function calculates both the best path as well as the forward * probability used in confidence estimation. * + * @memberof ps_lattice_t * @return Final link in best path, NULL on error. */ POCKETSPHINX_EXPORT @@ -409,6 +447,7 @@ ps_latlink_t *ps_lattice_bestpath(ps_lattice_t *dag, ngram_model_t *lmset, * * This function assumes that bestpath search has already been done. * + * @memberof ps_lattice_t * @return Posterior probability of the utterance as a whole. */ POCKETSPHINX_EXPORT @@ -420,6 +459,7 @@ int32 ps_lattice_posterior(ps_lattice_t *dag, ngram_model_t *lmset, * * This function assumes that ps_lattice_posterior() has already been called. * + * @memberof ps_lattice_t * @param beam Minimum posterior probability for links. This is * expressed in the log-base used in the decoder. To convert * from linear floating-point, use @@ -443,6 +483,7 @@ int32 ps_lattice_ngram_expand(ps_lattice_t *dag, ngram_model_t *lm); /** * Get the number of frames in the lattice. * + * @memberof ps_lattice_t * @param dag The lattice in question. * @return Number of frames in this lattice. */ diff --git a/include/pocketsphinx/logmath.h b/include/pocketsphinx/logmath.h new file mode 100644 index 0000000..6f8affd --- /dev/null +++ b/include/pocketsphinx/logmath.h @@ -0,0 +1,272 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file logmath.h + * @brief Fast integer logarithmic addition operations. + * + * Because doxygen is Bad Software, the actual documentation can only + * exist in \ref logmath_t. Sorry about that. + * + * In evaluating HMM models, probability values are often kept in log + * domain, to avoid overflow. To enable these logprob values to be + * held in int32 variables without significant loss of precision, a + * logbase of (1+epsilon) (where epsilon < 0.01 or so) is used. This + * module maintains this logbase (B). + * + * However, maintaining probabilities in log domain creates a problem + * when adding two probability values. This problem can be solved by + * table lookup. Note that: + * + * - \f$ b^z = b^x + b^y \f$ + * - \f$ b^z = b^x(1 + b^{y-x}) = b^y(1 + e^{x-y}) \f$ + * - \f$ z = x + log_b(1 + b^{y-x}) = y + log_b(1 + b^{x-y}) \f$ + * + * So: + * + * - when \f$ y > x, z = y + logadd\_table[-(x-y)] \f$ + * - when \f$ x > y, z = x + logadd\_table[-(y-x)] \f$ + * - where \f$ logadd\_table[n] = log_b(1 + b^{-n}) \f$ + * + * The first entry in logadd_table is + * simply \f$ log_b(2.0) \f$, for + * the case where \f$ y = x \f$ and thus + * \f$ z = log_b(2x) = log_b(2) + x \f$. The last entry is zero, + * where \f$ log_b(x+y) = x = y \f$ due to loss of precision. + * + * Since this table can be quite large particularly for small + * logbases, an option is provided to compress it by dropping the + * least significant bits of the table. + */ + +#ifndef __LOGMATH_H__ +#define __LOGMATH_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * @struct logadd_t pocketsphinx/logmath.h + * @brief Integer log math computation table. + * + * This is exposed here to allow log-add computations to be inlined. + */ +typedef struct logadd_s logadd_t; +struct logadd_s { + /** Table, in unsigned integers of (width) bytes. */ + void *table; + /** Number of elements in (table). This is never smaller than 256 (important!) */ + uint32 table_size; + /** Width of elements of (table). */ + uint8 width; + /** Right shift applied to elements in (table). */ + int8 shift; +}; + +/** + * @struct logmath_t pocketsphinx/logmath.h + * @brief Integer log math computation class. + */ +typedef struct logmath_s logmath_t; + +/** + * Obtain the log-add table from a logmath_t * + */ +#define LOGMATH_TABLE(lm) ((logadd_t *)lm) + +/** + * Initialize a log math computation table. + * @memberof logmath_t + * @param base The base B in which computation is to be done. + * @param shift Log values are shifted right by this many bits. + * @param use_table Whether to use an add table or not + * @return The newly created log math table. + */ +POCKETSPHINX_EXPORT +logmath_t *logmath_init(float64 base, int shift, int use_table); + +/** + * Memory-map (or read) a log table from a file. + * @memberof logmath_t + */ +POCKETSPHINX_EXPORT +logmath_t *logmath_read(const char *filename); + +/** + * Write a log table to a file. + * @memberof logmath_t + */ +POCKETSPHINX_EXPORT +int32 logmath_write(logmath_t *lmath, const char *filename); + +/** + * Get the log table size and dimensions. + * @memberof logmath_t + */ +POCKETSPHINX_EXPORT +int32 logmath_get_table_shape(logmath_t *lmath, uint32 *out_size, + uint32 *out_width, uint32 *out_shift); + +/** + * Get the log base. + * @memberof logmath_t + */ +POCKETSPHINX_EXPORT +float64 logmath_get_base(logmath_t *lmath); + +/** + * Get the smallest possible value represented in this base. + * @memberof logmath_t + */ +POCKETSPHINX_EXPORT +int logmath_get_zero(logmath_t *lmath); + +/** + * Get the width of the values in a log table. + * @memberof logmath_t + */ +POCKETSPHINX_EXPORT +int logmath_get_width(logmath_t *lmath); + +/** + * Get the shift of the values in a log table. + * @memberof logmath_t + */ +POCKETSPHINX_EXPORT +int logmath_get_shift(logmath_t *lmath); + +/** + * Retain ownership of a log table. + * + * @memberof logmath_t + * @return pointer to retained log table. + */ +POCKETSPHINX_EXPORT +logmath_t *logmath_retain(logmath_t *lmath); + +/** + * Free a log table. + * + * @memberof logmath_t + * @return new reference count (0 if freed completely) + */ +POCKETSPHINX_EXPORT +int logmath_free(logmath_t *lmath); + +/** + * Add two values in log space exactly and slowly (without using add table). + * @memberof logmath_t + */ +POCKETSPHINX_EXPORT +int logmath_add_exact(logmath_t *lmath, int logb_p, int logb_q); + +/** + * Add two values in log space (i.e. return log(exp(p)+exp(q))) + * @memberof logmath_t + */ +POCKETSPHINX_EXPORT +int logmath_add(logmath_t *lmath, int logb_p, int logb_q); + +/** + * Convert linear floating point number to integer log in base B. + * @memberof logmath_t + */ +POCKETSPHINX_EXPORT +int logmath_log(logmath_t *lmath, float64 p); + +/** + * Convert integer log in base B to linear floating point. + * @memberof logmath_t + */ +POCKETSPHINX_EXPORT +float64 logmath_exp(logmath_t *lmath, int logb_p); + +/** + * Convert natural log (in floating point) to integer log in base B. + * @memberof logmath_t + */ +POCKETSPHINX_EXPORT +int logmath_ln_to_log(logmath_t *lmath, float64 log_p); + +/** + * Convert integer log in base B to natural log (in floating point). + * @memberof logmath_t + */ +POCKETSPHINX_EXPORT +float64 logmath_log_to_ln(logmath_t *lmath, int logb_p); + +/** + * Convert base 10 log (in floating point) to integer log in base B. + * @memberof logmath_t + */ +POCKETSPHINX_EXPORT +int logmath_log10_to_log(logmath_t *lmath, float64 log_p); + +/** + * Convert base 10 log (in floating point) to float log in base B. + * @memberof logmath_t + */ +POCKETSPHINX_EXPORT +float logmath_log10_to_log_float(logmath_t *lmath, float64 log_p); + +/** + * Convert integer log in base B to base 10 log (in floating point). + * @memberof logmath_t + */ +POCKETSPHINX_EXPORT +float64 logmath_log_to_log10(logmath_t *lmath, int logb_p); + +/** + * Convert float log in base B to base 10 log. + * @memberof logmath_t + */ +POCKETSPHINX_EXPORT +float64 logmath_log_float_to_log10(logmath_t *lmath, float log_p); + +#ifdef __cplusplus +} +#endif + + +#endif /* __LOGMATH_H__ */ diff --git a/include/ps_mllr.h b/include/pocketsphinx/mllr.h similarity index 85% rename from include/ps_mllr.h rename to include/pocketsphinx/mllr.h index dee3ec9..e611770 100644 --- a/include/ps_mllr.h +++ b/include/pocketsphinx/mllr.h @@ -36,18 +36,18 @@ */ /** - * @file ps_mllr.h Model-space linear transforms for speaker adaptation + * @file mllr.h + * @brief Model-space linear transforms for speaker adaptation + * + * Because doxygen is Bad Software, the actual documentation can only + * exist in \ref ps_mllr_t. Sorry about that. */ #ifndef __PS_MLLR_H__ #define __PS_MLLR_H__ -/* SphinxBase headers. */ -#include -#include - -/* PocketSphinx headers. */ -#include +#include +#include #ifdef __cplusplus extern "C" { @@ -57,24 +57,28 @@ extern "C" { #endif /** - * Feature space linear transform object. + * @struct ps_mllr_t pocketsphinx/mllr.h + * @brief Linear transform object. */ typedef struct ps_mllr_s ps_mllr_t; /** * Read a speaker-adaptive linear transform from a file. + * @memberof ps_mllr_t */ POCKETSPHINX_EXPORT ps_mllr_t *ps_mllr_read(char const *file); /** * Retain a pointer to a linear transform. + * @memberof ps_mllr_t */ POCKETSPHINX_EXPORT ps_mllr_t *ps_mllr_retain(ps_mllr_t *mllr); /** * Release a pointer to a linear transform. + * @memberof ps_mllr_t */ POCKETSPHINX_EXPORT int ps_mllr_free(ps_mllr_t *mllr); diff --git a/include/pocketsphinx/model.h b/include/pocketsphinx/model.h new file mode 100644 index 0000000..0661076 --- /dev/null +++ b/include/pocketsphinx/model.h @@ -0,0 +1,1051 @@ +/* -*- c-basic-offset:4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2022 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ +/** + * @file model.h + * @brief Public API for language models + * + * Because doxygen is Bad Software, the actual documentation can only + * exist in \ref jsgf_t, \ref fsg_model_t, and \ref ngram_model_t. + * Sorry about that. + */ + +#ifndef __PS_MODEL_H__ +#define __PS_MODEL_H__ + +#include + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/* Forward declaration to avoid include loops */ +typedef struct cmd_ln_s ps_config_t; + +/** + * @struct jsgf_t pocketsphinx/model.h + * @brief JSGF parser + */ +typedef struct jsgf_s jsgf_t; + +/** + * @struct jsgf_rule_t pocketsphinx/model.h + * @brief Rule in a parsed JSGF grammar. + */ +typedef struct jsgf_rule_s jsgf_rule_t; + +/** + * @struct fsg_model_t pocketsphinx/model.h + * @brief Finite-state grammar. + * + * States are simply integers 0..n_state-1. + * A transition emits a word and has a given probability of being taken. + * There can also be null or epsilon transitions, with no associated emitted + * word. + */ +typedef struct fsg_model_s fsg_model_t; + +/** + * @struct ngram_model_t pocketsphinx/model.h + * @brief N-Gram based language model. + */ +typedef struct ngram_model_s ngram_model_t; + +/** + * Parse a JSGF grammar from a file. + * + * @memberof jsgf_t + * @param filename the name of the file to parse. + * @param parent optional parent grammar for this one (NULL, usually). + * @return new JSGF grammar object, or NULL on failure. + */ +POCKETSPHINX_EXPORT +jsgf_t *jsgf_parse_file(const char *filename, jsgf_t *parent); + +/** + * Parse a JSGF grammar from a string. + * + * @memberof jsgf_t + * @param string 0-terminated string with grammar. + * @param parent optional parent grammar for this one (NULL, usually). + * @return new JSGF grammar object, or NULL on failure. + */ +POCKETSPHINX_EXPORT +jsgf_t *jsgf_parse_string(const char *string, jsgf_t *parent); + +/** + * Get the grammar name from the file. + * @memberof jsgf_t + */ +POCKETSPHINX_EXPORT +char const *jsgf_grammar_name(jsgf_t *jsgf); + +/** + * Free a JSGF grammar. + * @memberof jsgf_t + */ +POCKETSPHINX_EXPORT +void jsgf_grammar_free(jsgf_t *jsgf); + +/** + * Get a rule by name from a grammar. Name should not contain brackets. + * @memberof jsgf_t + */ +POCKETSPHINX_EXPORT +jsgf_rule_t *jsgf_get_rule(jsgf_t *grammar, const char *name); + +/** + * Returns the first public rule of the grammar + * @memberof jsgf_t + */ +POCKETSPHINX_EXPORT +jsgf_rule_t *jsgf_get_public_rule(jsgf_t *grammar); + +/** + * Get the rule name from a rule. + * @memberof jsgf_rule_t + */ +POCKETSPHINX_EXPORT +char const *jsgf_rule_name(jsgf_rule_t *rule); + +/** + * Test if a rule is public or not. + * @memberof jsgf_rule_t + */ +POCKETSPHINX_EXPORT +int jsgf_rule_public(jsgf_rule_t *rule); + +/** + * @struct jsgf_rule_iter_t + * @brief Iterator over rules in a grammar. + */ +typedef struct hash_iter_s jsgf_rule_iter_t; + +/** + * Get an iterator over all rules in a grammar. + * @memberof jsgf_t + */ +POCKETSPHINX_EXPORT +jsgf_rule_iter_t *jsgf_rule_iter(jsgf_t *grammar); + +/** + * Advance an iterator to the next rule in the grammar. + * @memberof jsgf_rule_iter_t + */ +POCKETSPHINX_EXPORT +jsgf_rule_iter_t *jsgf_rule_iter_next(jsgf_rule_iter_t *itor); + +/** + * Get the current rule in a rule iterator. + * @memberof jsgf_rule_iter_t + */ +POCKETSPHINX_EXPORT +jsgf_rule_t *jsgf_rule_iter_rule(jsgf_rule_iter_t *itor); + +/** + * Free a rule iterator (if the end hasn't been reached). + * @memberof jsgf_rule_iter_t + */ +POCKETSPHINX_EXPORT +void jsgf_rule_iter_free(jsgf_rule_iter_t *itor); + +/** + * Build a Sphinx FSG object from a JSGF rule. + * @memberof jsgf_t + */ +POCKETSPHINX_EXPORT +fsg_model_t *jsgf_build_fsg(jsgf_t *grammar, jsgf_rule_t *rule, + logmath_t *lmath, float32 lw); + +/** + * Read JSGF from file and return FSG object from it. + * + * This function looks for a first public rule in jsgf and constructs JSGF from it. + * @memberof fsg_model_t + */ +POCKETSPHINX_EXPORT +fsg_model_t *jsgf_read_file(const char *file, logmath_t * lmath, float32 lw); + +/** + * Read JSGF from string and return FSG object from it. + * + * This function looks for a first public rule in jsgf and constructs JSGF from it. + * @memberof fsg_model_t + */ +POCKETSPHINX_EXPORT +fsg_model_t *jsgf_read_string(const char *string, logmath_t * lmath, float32 lw); + +/** + * Convert a JSGF rule to Sphinx FSG text form. + * + * This does a direct conversion without doing transitive closure on + * null transitions and so forth. + * @memberof jsgf_t + */ +POCKETSPHINX_EXPORT +int jsgf_write_fsg(jsgf_t *grammar, jsgf_rule_t *rule, FILE *outfh); + +/** + * Retain ownership of an FSG. + * + * @return Pointer to retained FSG. + * @memberof fsg_model_t + */ +POCKETSPHINX_EXPORT +fsg_model_t *fsg_model_retain(fsg_model_t *fsg); + +/** + * Free the given word FSG. + * + * @memberof fsg_model_t + * @return new reference count (0 if freed completely) + */ +POCKETSPHINX_EXPORT +int fsg_model_free(fsg_model_t *fsg); + +/** + * Read a word FSG from the given file and return a pointer to the structure + * created. Return NULL if any error occurred. + * + * File format: + * + *
+ *   Any number of comment lines; ignored
+ *   FSG_BEGIN []
+ *   N <#states>
+ *   S 
+ *   F 
+ *   T    []
+ *   T ...
+ *   ... (any number of state transitions)
+ *   FSG_END
+ *   Any number of comment lines; ignored
+ * 
+ * + * The FSG spec begins with the line containing the keyword FSG_BEGIN. + * It has an optional fsg name string. If not present, the FSG has the empty + * string as its name. + * + * Following the FSG_BEGIN declaration is the number of states, the start + * state, and the final state, each on a separate line. States are numbered + * in the range [0 .. -1]. + * + * These are followed by all the state transitions, each on a separate line, + * and terminated by the FSG_END line. A state transition has the given + * probability of being taken, and emits the given word. The word emission + * is optional; if word-string omitted, it is an epsilon or null transition. + * + * Comments can also be embedded within the FSG body proper (i.e. between + * FSG_BEGIN and FSG_END): any line with a # character in col 1 is treated + * as a comment line. + * + * Return value: a new fsg_model_t structure if the file is successfully + * read, NULL otherwise. + * @memberof fsg_model_t + */ +POCKETSPHINX_EXPORT +fsg_model_t *fsg_model_readfile(const char *file, logmath_t *lmath, float32 lw); + +/** + * Like fsg_model_readfile(), but from an already open stream. + * @memberof fsg_model_t + */ +POCKETSPHINX_EXPORT +fsg_model_t *fsg_model_read(FILE *fp, logmath_t *lmath, float32 lw); + +/** + * Check that an FSG accepts a word sequence + * + * @memberof fsg_model_t + * @param words Whitespace-separated word sequence + * @return 1 if accepts, 0 if not. + */ +POCKETSPHINX_EXPORT +int fsg_model_accept(fsg_model_t *fsg, char const *words); + +/** + * Write FSG to a file. + * @memberof fsg_model_t + */ +POCKETSPHINX_EXPORT +void fsg_model_write(fsg_model_t *fsg, FILE *fp); + +/** + * Write FSG to a file. + * @memberof fsg_model_t + */ +POCKETSPHINX_EXPORT +void fsg_model_writefile(fsg_model_t *fsg, char const *file); + +/** + * Write FSG to a file in AT&T FSM format. + * @memberof fsg_model_t + */ +POCKETSPHINX_EXPORT +void fsg_model_write_fsm(fsg_model_t *fsg, FILE *fp); + +/** + * Write FSG to a file in AT&T FSM format. + * @memberof fsg_model_t + */ +POCKETSPHINX_EXPORT +void fsg_model_writefile_fsm(fsg_model_t *fsg, char const *file); + +/** + * Write FSG symbol table to a file (for AT&T FSM) + * @memberof fsg_model_t + */ +POCKETSPHINX_EXPORT +void fsg_model_write_symtab(fsg_model_t *fsg, FILE *file); + +/** + * Write FSG symbol table to a file (for AT&T FSM) + * @memberof fsg_model_t + */ +POCKETSPHINX_EXPORT +void fsg_model_writefile_symtab(fsg_model_t *fsg, char const *file); + +/** + * @struct ngram_class_t pocketsphinx/model.h + * @brief Word class in an N-Gram model. + */ +typedef struct ngram_class_s ngram_class_t; + +/** + * @enum ngram_file_type_e pocketsphinx/model.h + * @brief File types for N-Gram files + */ +typedef enum ngram_file_type_e { + NGRAM_INVALID = -1, /**< Not a valid file type. */ + NGRAM_AUTO, /**< Determine file type automatically. */ + NGRAM_ARPA, /**< ARPABO text format (the standard). */ + NGRAM_BIN /**< Sphinx .DMP format. */ +} ngram_file_type_t; + +#define NGRAM_INVALID_WID -1 /**< Impossible word ID */ + +/** + * Read an N-Gram model from a file on disk. + * + * @param config Optional pointer to a set of command-line arguments. + * Recognized arguments are: + * + * - -mmap (boolean) whether to use memory-mapped I/O + * - -lw (float32) language weight to apply to the model + * - -wip (float32) word insertion penalty to apply to the model + * + * @memberof ngram_model_t + * @param file_name path to the file to read. + * @param file_type type of the file, or NGRAM_AUTO to determine automatically. + * @param lmath Log-math parameters to use for probability + * calculations. Ownership of this object is assumed by + * the newly created ngram_model_t, and you should not + * attempt to free it manually. If you wish to reuse it + * elsewhere, you must retain it with logmath_retain(). + * @return newly created ngram_model_t. + */ +POCKETSPHINX_EXPORT +ngram_model_t *ngram_model_read(ps_config_t *config, + const char *file_name, + ngram_file_type_t file_type, + logmath_t *lmath); + +/** + * Write an N-Gram model to disk. + * + * @memberof ngram_model_t + * @return 0 for success, <0 on error + */ +POCKETSPHINX_EXPORT +int ngram_model_write(ngram_model_t *model, const char *file_name, + ngram_file_type_t format); + +/** + * Guess the file type for an N-Gram model from the filename. + * + * @memberof ngram_model_t + * @return the guessed file type, or NGRAM_INVALID if none could be guessed. + */ +POCKETSPHINX_EXPORT +ngram_file_type_t ngram_file_name_to_type(const char *file_name); + +/** + * Get the N-Gram file type from a string. + * + * @memberof ngram_model_t + * @return file type, or NGRAM_INVALID if no such file type exists. + */ +POCKETSPHINX_EXPORT +ngram_file_type_t ngram_str_to_type(const char *str_name); + +/** + * Get the canonical name for an N-Gram file type. + * + * @memberof ngram_model_t + * @return read-only string with the name for this file type, or NULL + * if no such type exists. + */ +POCKETSPHINX_EXPORT +char const *ngram_type_to_str(int type); + +/** + * Retain ownership of an N-Gram model. + * + * @memberof ngram_model_t + * @return Pointer to retained model. + */ +POCKETSPHINX_EXPORT +ngram_model_t *ngram_model_retain(ngram_model_t *model); + +/** + * Release memory associated with an N-Gram model. + * + * @memberof ngram_model_t + * @return new reference count (0 if freed completely) + */ +POCKETSPHINX_EXPORT +int ngram_model_free(ngram_model_t *model); + +/** + * @enum ngram_case_e pocketsphinx/model.h + * @brief Constants for case folding. + */ +typedef enum ngram_case_e { + NGRAM_UPPER, /**< Upper case */ + NGRAM_LOWER /**< Lower case */ +} ngram_case_t; + +/** + * Case-fold word strings in an N-Gram model. + * + * WARNING: This is not Unicode aware, so any non-ASCII characters + * will not be converted. + * + * @memberof ngram_model_t + */ +POCKETSPHINX_EXPORT +int ngram_model_casefold(ngram_model_t *model, int kase); + +/** + * Apply a language weight, insertion penalty, and unigram weight to a + * language model. + * + * This will change the values output by ngram_score() and friends. + * This is done for efficiency since in decoding, these are the only + * values we actually need. Call ngram_prob() if you want the "raw" + * N-Gram probability estimate. + * + * To remove all weighting, call ngram_apply_weights(model, 1.0, 1.0). + * + * @memberof ngram_model_t + */ +POCKETSPHINX_EXPORT +int ngram_model_apply_weights(ngram_model_t *model, + float32 lw, float32 wip); + +/** + * Get the current weights from a language model. + * + * @memberof ngram_model_t + * @param model The model in question. + * @param out_log_wip Output: (optional) logarithm of word insertion penalty. + * @return language weight. + */ +POCKETSPHINX_EXPORT +float32 ngram_model_get_weights(ngram_model_t *model, int32 *out_log_wip); + +/** + * Get the score (scaled, interpolated log-probability) for a general + * N-Gram. + * + * The argument list consists of the history words (as null-terminated + * strings) of the N-Gram, in reverse order, followed by NULL. + * Therefore, if you wanted to get the N-Gram score for "a whole joy", + * you would call: + * + *
+ *  score = ngram_score(model, "joy", "whole", "a", NULL);
+ * 
+ * + * This is not the function to use in decoding, because it has some + * overhead for looking up words. Use ngram_ng_score(), + * ngram_tg_score(), or ngram_bg_score() instead. In the future there + * will probably be a version that takes a general language model + * state object, to support suffix-array LM and things like that. + * + * If one of the words is not in the LM's vocabulary, the result will + * depend on whether this is an open or closed vocabulary language + * model. For an open-vocabulary model, unknown words are all mapped + * to the unigram <UNK> which has a non-zero probability and also + * participates in higher-order N-Grams. Therefore, you will get a + * score of some sort in this case. + * + * For a closed-vocabulary model, unknown words are impossible and + * thus have zero probability. Therefore, if word is + * unknown, this function will return a "zero" log-probability, i.e. a + * large negative number. To obtain this number for comparison, call + * ngram_zero(). + * + * @memberof ngram_model_t + */ +POCKETSPHINX_EXPORT +int32 ngram_score(ngram_model_t *model, const char *word, ...); + +/** + * Quick trigram score lookup. + * + * @memberof ngram_model_t + */ +POCKETSPHINX_EXPORT +int32 ngram_tg_score(ngram_model_t *model, + int32 w3, int32 w2, int32 w1, + int32 *n_used); + +/** + * Quick bigram score lookup. + * + * @memberof ngram_model_t + */ +POCKETSPHINX_EXPORT +int32 ngram_bg_score(ngram_model_t *model, + int32 w2, int32 w1, + int32 *n_used); + +/** + * Quick general N-Gram score lookup. + * + * @memberof ngram_model_t + */ +POCKETSPHINX_EXPORT +int32 ngram_ng_score(ngram_model_t *model, int32 wid, int32 *history, + int32 n_hist, int32 *n_used); + +/** + * Get the "raw" log-probability for a general N-Gram. + * + * This returns the log-probability of an N-Gram, as defined in the + * language model file, before any language weighting, interpolation, + * or insertion penalty has been applied. + * + * @memberof ngram_model_t + * @note When backing off to a unigram from a bigram or trigram, the + * unigram weight (interpolation with uniform) is not removed. + */ +POCKETSPHINX_EXPORT +int32 ngram_probv(ngram_model_t *model, const char *word, ...); + +/** + * Get the "raw" log-probability for a general N-Gram. + * + * This returns the log-probability of an N-Gram, as defined in the + * language model file, before any language weighting, interpolation, + * or insertion penalty has been applied. + * + * @note When backing off to a unigram from a bigram or trigram, the + * unigram weight (interpolation with uniform) is not removed. + * @memberof ngram_model_t + */ +POCKETSPHINX_EXPORT +int32 ngram_prob(ngram_model_t *model, const char* const *words, int32 n); + +/** + * Quick "raw" probability lookup for a general N-Gram. + * + * See documentation for ngram_ng_score() and ngram_apply_weights() + * for an explanation of this. + * + * @memberof ngram_model_t + */ +POCKETSPHINX_EXPORT +int32 ngram_ng_prob(ngram_model_t *model, int32 wid, int32 *history, + int32 n_hist, int32 *n_used); + +/** + * Convert score to "raw" log-probability. + * + * @note The unigram weight (interpolation with uniform) is not + * removed, since there is no way to know which order of N-Gram + * generated score. + * + * @memberof ngram_model_t + * @param model The N-Gram model from which score was obtained. + * @param score The N-Gram score to convert + * @return The raw log-probability value. + */ +POCKETSPHINX_EXPORT +int32 ngram_score_to_prob(ngram_model_t *model, int32 score); + +/** + * Look up numerical word ID. + * + * @memberof ngram_model_t + */ +POCKETSPHINX_EXPORT +int32 ngram_wid(ngram_model_t *model, const char *word); + +/** + * Look up word string for numerical word ID. + * + * @memberof ngram_model_t + */ +POCKETSPHINX_EXPORT +const char *ngram_word(ngram_model_t *model, int32 wid); + +/** + * Get the unknown word ID for a language model. + * + * Language models can be either "open vocabulary" or "closed + * vocabulary". The difference is that the former assigns a fixed + * non-zero unigram probability to unknown words, while the latter + * does not allow unknown words (or, equivalently, it assigns them + * zero probability). If this is a closed vocabulary model, this + * function will return NGRAM_INVALID_WID. + * + * @memberof ngram_model_t + * @return The ID for the unknown word, or NGRAM_INVALID_WID if none + * exists. + */ +POCKETSPHINX_EXPORT +int32 ngram_unknown_wid(ngram_model_t *model); + +/** + * Get the "zero" log-probability value for a language model. + * + * @memberof ngram_model_t + */ +POCKETSPHINX_EXPORT +int32 ngram_zero(ngram_model_t *model); + +/** + * Get the order of the N-gram model (i.e. the "N" in "N-gram") + * + * @memberof ngram_model_t + */ +POCKETSPHINX_EXPORT +int32 ngram_model_get_size(ngram_model_t *model); + +/** + * Get the counts of the various N-grams in the model. + * + * @memberof ngram_model_t + */ +POCKETSPHINX_EXPORT +uint32 const *ngram_model_get_counts(ngram_model_t *model); + +/** + * @struct ngram_iter_t pocketsphinx/model.h + * @brief M-gram (yes, **M**-gram) iterator object. + * + * This is an iterator over the N-Gram successors of a given word or + * N-1-Gram, that is why it is called "M" and not "N". + */ +typedef struct ngram_iter_s ngram_iter_t; + +/** + * Iterate over all M-grams. + * + * @memberof ngram_model_t + * @param model Language model to query. + * @param m Order of the M-Grams requested minus one (i.e. order of the history) + * @return An iterator over the requested M, or NULL if no N-grams of + * order M+1 exist. + */ +POCKETSPHINX_EXPORT +ngram_iter_t *ngram_model_mgrams(ngram_model_t *model, int m); + +/** + * Get an iterator over M-grams pointing to the specified M-gram. + * + * @memberof ngram_model_t + */ +POCKETSPHINX_EXPORT +ngram_iter_t *ngram_iter(ngram_model_t *model, const char *word, ...); + +/** + * Get an iterator over M-grams pointing to the specified M-gram. + * + * @memberof ngram_model_t + */ +POCKETSPHINX_EXPORT +ngram_iter_t *ngram_ng_iter(ngram_model_t *model, int32 wid, int32 *history, int32 n_hist); + +/** + * Get information from the current M-gram in an iterator. + * + * @memberof ngram_iter_t + * @param out_score Output: Score for this M-gram (including any word + * penalty and language weight). + * @param out_bowt Output: Backoff weight for this M-gram. + * @return read-only array of word IDs. + */ +POCKETSPHINX_EXPORT +int32 const *ngram_iter_get(ngram_iter_t *itor, + int32 *out_score, + int32 *out_bowt); + +/** + * Iterate over all M-gram successors of an M-1-gram. + * + * @memberof ngram_iter_t + * @param itor Iterator pointing to the M-1-gram to get successors of. + */ +POCKETSPHINX_EXPORT +ngram_iter_t *ngram_iter_successors(ngram_iter_t *itor); + +/** + * Advance an M-gram iterator. + * @memberof ngram_iter_t + */ +POCKETSPHINX_EXPORT +ngram_iter_t *ngram_iter_next(ngram_iter_t *itor); + +/** + * Terminate an M-gram iterator. + * @memberof ngram_iter_t + */ +POCKETSPHINX_EXPORT +void ngram_iter_free(ngram_iter_t *itor); + +/** + * Add a word (unigram) to the language model. + * + * @note The semantics of this are not particularly well-defined for + * model sets, and may be subject to change. Currently this will add + * the word to all of the submodels + * + * @memberof ngram_model_t + * @param model The model to add a word to. + * @param word Text of the word to add. + * @param weight Weight of this word relative to the uniform distribution. + * @return The word ID for the new word. + */ +POCKETSPHINX_EXPORT +int32 ngram_model_add_word(ngram_model_t *model, + const char *word, float32 weight); + +/** + * Read a class definition file and add classes to a language model. + * + * This function assumes that the class tags have already been defined + * as unigrams in the language model. All words in the class + * definition will be added to the vocabulary as special in-class words. + * For this reason is is necessary that they not have the same names + * as any words in the general unigram distribution. The convention + * is to suffix them with ":class_tag", where class_tag is the class + * tag minus the enclosing square brackets. + * + * @memberof ngram_model_t + * @return 0 for success, <0 for error + */ +POCKETSPHINX_EXPORT +int32 ngram_model_read_classdef(ngram_model_t *model, + const char *file_name); + +/** + * Add a new class to a language model. + * + * If classname already exists in the unigram set for + * model, then it will be converted to a class tag, and + * classweight will be ignored. Otherwise, a new unigram + * will be created as in ngram_model_add_word(). + * @memberof ngram_model_t + */ +POCKETSPHINX_EXPORT +int32 ngram_model_add_class(ngram_model_t *model, + const char *classname, + float32 classweight, + char **words, + const float32 *weights, + int32 n_words); + +/** + * Add a word to a class in a language model. + * + * @memberof ngram_model_t + * @param model The model to add a word to. + * @param classname Name of the class to add this word to. + * @param word Text of the word to add. + * @param weight Weight of this word relative to the within-class uniform distribution. + * @return The word ID for the new word. + */ +POCKETSPHINX_EXPORT +int32 ngram_model_add_class_word(ngram_model_t *model, + const char *classname, + const char *word, + float32 weight); + +/** + * Create a set of language models sharing a common space of word IDs. + * + * This function creates a meta-language model which groups together a + * set of language models, synchronizing word IDs between them. To + * use this language model, you can either select a submodel to use + * exclusively using ngram_model_set_select(), or interpolate + * between scores from all models. To do the latter, you can either + * pass a non-NULL value of the weights parameter, or + * re-activate interpolation later on by calling + * ngram_model_set_interp(). + * + * In order to make this efficient, there are some restrictions on the + * models that can be grouped together. The most important (and + * currently the only) one is that they must all + * share the same log-math parameters. + * + * @memberof ngram_model_t + * @param config Any configuration parameters to be shared between models. + * @param models Array of pointers to previously created language models. + * @param names Array of strings to use as unique identifiers for LMs. + * @param weights Array of weights to use in interpolating LMs, or NULL + * for no interpolation. + * @param n_models Number of elements in the arrays passed to this function. + */ +POCKETSPHINX_EXPORT +ngram_model_t *ngram_model_set_init(ps_config_t *config, + ngram_model_t **models, + char **names, + const float32 *weights, + int32 n_models); + +/** + * Read a set of language models from a control file. + * + * This file creates a language model set from a "control file" of + * the type used in Sphinx-II and Sphinx-III. + * File format (optional stuff is indicated by enclosing in []): + * + *
+ *   [{ LMClassFileName LMClassFilename ... }]
+ *   TrigramLMFileName LMName [{ LMClassName LMClassName ... }]
+ *   TrigramLMFileName LMName [{ LMClassName LMClassName ... }]
+ *   ...
+ * (There should be whitespace around the { and } delimiters.)
+ * 
+ * + * This is an extension of the older format that had only TrigramLMFilenName + * and LMName pairs. The new format allows a set of LMClass files to be read + * in and referred to by the trigram LMs. + * + * No "comments" allowed in this file. + * + * @memberof ngram_model_t + * @param config Configuration parameters. + * @param lmctlfile Path to the language model control file. + * @param lmath Log-math parameters to use for probability + * calculations. Ownership of this object is assumed by + * the newly created ngram_model_t, and you should not + * attempt to free it manually. If you wish to reuse it + * elsewhere, you must retain it with logmath_retain(). + * @return newly created language model set. + */ +POCKETSPHINX_EXPORT +ngram_model_t *ngram_model_set_read(ps_config_t *config, + const char *lmctlfile, + logmath_t *lmath); + +/** + * Returns the number of language models in a set. + * @memberof ngram_model_t + */ +POCKETSPHINX_EXPORT +int32 ngram_model_set_count(ngram_model_t *set); + +/** + * @struct ngram_model_set_iter_t pocketsphinx/model.h + * @brief Iterator over language models in a set. + */ +typedef struct ngram_model_set_iter_s ngram_model_set_iter_t; + +/** + * Begin iterating over language models in a set. + * + * @memberof ngram_model_t + * @return iterator pointing to the first language model, or NULL if no models remain. + */ +POCKETSPHINX_EXPORT +ngram_model_set_iter_t *ngram_model_set_iter(ngram_model_t *set); + +/** + * Move to the next language model in a set. + * + * @memberof ngram_model_set_iter_t + * @return iterator pointing to the next language model, or NULL if no models remain. + */ +POCKETSPHINX_EXPORT +ngram_model_set_iter_t *ngram_model_set_iter_next(ngram_model_set_iter_t *itor); + +/** + * Finish iteration over a language model set. + * @memberof ngram_model_set_iter_t + */ +POCKETSPHINX_EXPORT +void ngram_model_set_iter_free(ngram_model_set_iter_t *itor); + +/** + * Get language model and associated name from an iterator. + * + * @memberof ngram_model_set_iter_t + * @param itor the iterator + * @param lmname Output: string name associated with this language model. + * @return Language model pointed to by this iterator. + */ +POCKETSPHINX_EXPORT +ngram_model_t *ngram_model_set_iter_model(ngram_model_set_iter_t *itor, + char const **lmname); + +/** + * Select a single language model from a set for scoring. + * + * @memberof ngram_model_t + * @return the newly selected language model, or NULL if no language + * model by that name exists. + */ +POCKETSPHINX_EXPORT +ngram_model_t *ngram_model_set_select(ngram_model_t *set, + const char *name); + +/** + * Look up a language model by name from a set. + * + * @memberof ngram_model_t + * @return language model corresponding to name, or NULL + * if no language model by that name exists. + */ +POCKETSPHINX_EXPORT +ngram_model_t *ngram_model_set_lookup(ngram_model_t *set, + const char *name); + +/** + * Get the current language model name, if any. + * @memberof ngram_model_t + */ +POCKETSPHINX_EXPORT +const char *ngram_model_set_current(ngram_model_t *set); + +/** + * Set interpolation weights for a set and enables interpolation. + * + * If weights is NULL, any previously initialized set of + * weights will be used. If no weights were specified to + * ngram_model_set_init(), then a uniform distribution will be used. + * + * @memberof ngram_model_t + */ +POCKETSPHINX_EXPORT +ngram_model_t *ngram_model_set_interp(ngram_model_t *set, + const char **names, + const float32 *weights); + +/** + * Add a language model to a set. + * + * @memberof ngram_model_t + * @param set The language model set to add to. + * @param model The language model to add. + * @param name The name to associate with this model. + * @param weight Interpolation weight for this model, relative to the + * uniform distribution. 1.0 is a safe value. + * @param reuse_widmap Reuse the existing word-ID mapping in + * set. Any new words present in model + * will not be added to the word-ID mapping in this case. + */ +POCKETSPHINX_EXPORT +ngram_model_t *ngram_model_set_add(ngram_model_t *set, + ngram_model_t *model, + const char *name, + float32 weight, + int reuse_widmap); + +/** + * Remove a language model from a set. + * + * @memberof ngram_model_t + * @param set The language model set to remove from. + * @param name The name associated with the model to remove. + * @param reuse_widmap Reuse the existing word-ID mapping in + * set. + */ +POCKETSPHINX_EXPORT +ngram_model_t *ngram_model_set_remove(ngram_model_t *set, + const char *name, + int reuse_widmap); + +/** + * Set the word-to-ID mapping for this model set. + * @memberof ngram_model_t + */ +POCKETSPHINX_EXPORT +void ngram_model_set_map_words(ngram_model_t *set, + const char **words, + int32 n_words); + +/** + * Query the word-ID mapping for the current language model. + * + * @memberof ngram_model_t + * @return the local word ID in the current language model, or + * NGRAM_INVALID_WID if set_wid is invalid or + * interpolation is enabled. + */ +POCKETSPHINX_EXPORT +int32 ngram_model_set_current_wid(ngram_model_t *set, + int32 set_wid); + +/** + * Test whether a word ID corresponds to a known word in the current + * state of the language model set. + * + * @memberof ngram_model_t + * @return If there is a current language model, returns non-zero if + * set_wid corresponds to a known word in that language + * model. Otherwise, returns non-zero if set_wid + * corresponds to a known word in any language model. + */ +POCKETSPHINX_EXPORT +int32 ngram_model_set_known_wid(ngram_model_t *set, int32 set_wid); + +/** + * Flush any cached N-Gram information + * @memberof ngram_model_t + */ +POCKETSPHINX_EXPORT +void ngram_model_flush(ngram_model_t *lm); + +#ifdef __cplusplus +} +#endif + +#endif /* __PS_MODEL_H__ */ diff --git a/include/pocketsphinx/prim_type.h b/include/pocketsphinx/prim_type.h new file mode 100644 index 0000000..ee11fec --- /dev/null +++ b/include/pocketsphinx/prim_type.h @@ -0,0 +1,198 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * prim_type.h -- Primitive types; more machine-independent. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: prim_type.h,v $ + * Revision 1.12 2005/10/05 00:31:14 dhdfu + * Make int8 be explicitly signed (signedness of 'char' is + * architecture-dependent). Then make a bunch of things use uint8 where + * signedness is unimportant, because on the architecture where 'char' is + * unsigned, it is that way for a reason (signed chars are slower). + * + * Revision 1.11 2005/06/22 03:10:23 arthchan2003 + * Added keyword. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 12-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Added arraysize_t, point_t, fpoint_t. + * + * 01-Feb-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Added anytype_t. + * + * 08-31-95 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Created. + */ + + +#ifndef _LIBUTIL_PRIM_TYPE_H_ +#define _LIBUTIL_PRIM_TYPE_H_ + +/** + * @file prim_type.h + * @brief Basic type definitions used in Sphinx. + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} /* Fool Emacs into not indenting things. */ +#endif + +#include + +/* Define some things for VisualDSP++ */ +#if defined(__ADSPBLACKFIN__) && !defined(__GNUC__) +# ifndef HAVE_LONG_LONG +# define HAVE_LONG_LONG +# endif +# ifndef ssize_t +typedef signed int ssize_t; +# endif +# define SIZEOF_LONG_LONG 8 +# define __BIGSTACKVARIABLE__ static +#else /* Not VisualDSP++ */ +# define __BIGSTACKVARIABLE__ +#endif + +/** + * @union anytype_t pocketsphinx/prim_type.h + * @brief Literally any type! + * + * (correction: not literally any type, but all the ones we use for configuration) + */ +typedef union anytype_s { + void *ptr; + long i; + unsigned long ui; + double fl; +} anytype_t; + +/* Use C99 types if available */ +#if defined(HAVE_STDINT_H) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) +#include +typedef int32_t int32; +typedef int16_t int16; +typedef int8_t int8; +typedef uint32_t uint32; +typedef uint16_t uint16; +typedef uint8_t uint8; +typedef int64_t int64; +typedef uint64_t uint64; +/* Take a wild guess otherwise */ +#else +typedef int int32; +typedef short int16; +typedef signed char int8; +typedef unsigned int uint32; +typedef unsigned short uint16; +typedef unsigned char uint8; +# if defined(_MSC_VER) +typedef __int64 int64; +typedef unsigned __int64 uint64; +# else +typedef long long int64; +typedef unsigned long long uint64; +# endif +#endif /* not C99 or POSIX */ + +/* We should maybe stop using these as there isn't any good way to + know their exact size, but it's 99% certain they are 32 and 64 + bits. */ +typedef float float32; +typedef double float64; + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL (void *)0 +#endif + +/* These really ought to come from , but not everybody has that. */ +/* Useful constants */ +#define MAX_INT32 ((int32) 0x7fffffff) +#define MAX_INT16 ((int16) 0x00007fff) +#define MAX_INT8 ((int8) 0x0000007f) + +#define MAX_NEG_INT32 ((int32) 0x80000000) +#define MAX_NEG_INT16 ((int16) 0xffff8000) +#define MAX_NEG_INT8 ((int8) 0xffffff80) + +#define MAX_UINT32 ((uint32) 0xffffffff) +#define MAX_UINT16 ((uint16) 0x0000ffff) +#define MAX_UINT8 ((uint8) 0x000000ff) + +/* The following are approximate; IEEE floating point standards might quibble! */ +#define MAX_POS_FLOAT32 3.4e+38f +#define MIN_POS_FLOAT32 1.2e-38f /* But not 0 */ +#define MAX_POS_FLOAT64 1.8e+307 +#define MIN_POS_FLOAT64 2.2e-308 + +#define MAX_IEEE_NORM_POS_FLOAT32 3.4e+38f +#define MIN_IEEE_NORM_POS_FLOAT32 1.2e-38f +#define MIN_IEEE_NORM_NEG_FLOAT32 -3.4e+38f +#define MAX_IEEE_NORM_POS_FLOAT64 1.8e+307 +#define MIN_IEEE_NORM_POS_FLOAT64 2.2e-308 +#define MIN_IEEE_NORM_NEG_FLOAT64 -1.8e+307 + +/* Will the following really work?? */ +#define MIN_NEG_FLOAT32 ((float32) (-MIN_POS_FLOAT32)) +#define MIN_NEG_FLOAT64 ((float64) (-MIN_POS_FLOAT64)) + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/pocketsphinx/search.h b/include/pocketsphinx/search.h new file mode 100644 index 0000000..35cbff8 --- /dev/null +++ b/include/pocketsphinx/search.h @@ -0,0 +1,397 @@ +/* -*- c-basic-offset:4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2014 Alpha Cephei Inc.. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * + * THIS SOFTWARE IS PROVIDED BY ALPHA CEPHEI INC. ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file search.h + * @brief Search modules + * + * User can configure several "search" objects with different grammars + * and language models and switch them in runtime to provide + * interactive experience for the user. + * + * There are different possible search modes: + * + *
    + *
  • keyphrase - efficiently looks for keyphrase and ignores other speech. allows to configure detection threshold.
  • + *
  • grammar - recognizes speech according to JSGF grammar. Unlike keyphrase grammar search doesn't ignore words which are not in grammar but tries to recognize them.
  • + *
  • ngram/lm - recognizes natural speech with a language model.
  • + *
  • allphone - recognizes phonemes with a phonetic language model.
  • + *
  • align - creates time alignments for a fixed word sequence.
  • + *
+ * + * Each search module has a name and can be referenced by name. These + * names are application-specific. The function ps_activate_search() + * activates a search module previously added by a name. Only one + * search module can be activated at time. + * + * To add the search module one needs to point to the grammar/language + * model describing the search. The location of the grammar is + * specific to the application. + * + * The exact design of a searches depends on your application. For + * example, you might want to listen for activation keyphrase first + * and once keyphrase is recognized switch to ngram search to + * recognize actual command. Once you have recognized the command, you + * can switch to grammar search to recognize the confirmation and then + * switch back to keyphrase listening mode to wait for another + * command. + * + * If only a simple recognition is required it is sufficient to add a + * single search or just configure the required mode with + * configuration options. + * + * Because Doxygen is Bad Software, the actual function definitions + * can only exist in \ref ps_decoder_t. Sorry about that. + */ + +#ifndef __PS_SEARCH_H__ +#define __PS_SEARCH_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * @struct ps_search_iter_t pocketsphinx/search.h + * @brief Iterator over search modules. + */ +typedef struct ps_search_iter_s ps_search_iter_t; + +/* Forward-declare this because header files are an atrocity. */ +typedef struct ps_decoder_s ps_decoder_t; + +/** + * Actives search with the provided name. + * + * @memberof ps_decoder_t + * @param name Name of search module to activate. This must have been + * previously added by either ps_add_fsg(), ps_add_lm(), or + * ps_add_kws(). If NULL, it will re-activate the default search, + * which is useful when running second-pass alignment, for instance. + * @return 0 on success, -1 on failure + */ +POCKETSPHINX_EXPORT +int ps_activate_search(ps_decoder_t *ps, const char *name); + +/** + * Returns name of current search in decoder + * + * @memberof ps_decoder_t + * @see ps_activate_search + */ +POCKETSPHINX_EXPORT +const char* ps_current_search(ps_decoder_t *ps); + +/** + * Removes a search module and releases its resources. + * + * Removes a search module previously added with + * using ps_add_fsg(), ps_add_lm(), ps_add_kws(), etc. + * + * @memberof ps_decoder_t + * @see ps_add_fsg + * @see ps_add_lm + * @see ps_add_kws + */ +POCKETSPHINX_EXPORT +int ps_remove_search(ps_decoder_t *ps, const char *name); + +/** + * Returns iterator over current searches + * + * @memberof ps_decoder_t + * @see ps_activate_search + */ +POCKETSPHINX_EXPORT +ps_search_iter_t *ps_search_iter(ps_decoder_t *ps); + +/** + * Updates search iterator to point to the next position. + * + * @memberof ps_search_iter_t + * This function automatically frees the iterator object upon reaching + * the final entry. + * @see ps_activate_search + */ +POCKETSPHINX_EXPORT +ps_search_iter_t *ps_search_iter_next(ps_search_iter_t *itor); + +/** + * Retrieves the name of the search the iterator points to. + * + * @memberof ps_search_iter_t + * @see ps_activate_search + */ +POCKETSPHINX_EXPORT +const char* ps_search_iter_val(ps_search_iter_t *itor); + +/** + * Delete an unfinished search iterator + * + * @memberof ps_search_iter_t + * @see ps_activate_search + */ +POCKETSPHINX_EXPORT +void ps_search_iter_free(ps_search_iter_t *itor); + +/** + * Updates search iterator to point to the next position. + * + * @memberof ps_search_iter_t + * This function automatically frees the iterator object upon reaching + * the final entry. + * @see ps_activate_search + */ +POCKETSPHINX_EXPORT +const char* ps_search_iter_val(ps_search_iter_t *itor); + +/** + * Get the language model or lmset object associated with a search. + * + * @memberof ps_decoder_t + * @arg name Name of language model search, or NULL for current search. + * @return The language model (possibly set of language models) object + * for this decoder. The decoder retains ownership of this + * pointer, so you should not attempt to free it manually. + * Use ngram_model_retain() if you wish to reuse it elsewhere. + */ +POCKETSPHINX_EXPORT +ngram_model_t *ps_get_lm(ps_decoder_t *ps, const char *name); + +/** + * Adds new search based on N-gram language model. + * + * Associates N-gram search with the provided name. The search can be activated + * using ps_activate_search(). + * + * @memberof ps_decoder_t + * @see ps_activate_search. + */ +POCKETSPHINX_EXPORT +int ps_add_lm(ps_decoder_t *ps, const char *name, ngram_model_t *lm); + +/** + * Adds new search based on N-gram language model. + * + * Convenient method to load N-gram model and create a search. + * + * @memberof ps_decoder_t + * @see ps_add_lm + */ +POCKETSPHINX_EXPORT +int ps_add_lm_file(ps_decoder_t *ps, const char *name, const char *path); + +/** + * Get the finite-state grammar set object associated with a search. + * + * @memberof ps_decoder_t + * @arg name Name of FSG search, or NULL for current search. + * @return The current FSG set object for this decoder, or + * NULL if `name` does not correspond to an FSG search. + */ +POCKETSPHINX_EXPORT +fsg_model_t *ps_get_fsg(ps_decoder_t *ps, const char *name); + +/** + * Adds new search based on finite state grammar. + * + * Associates FSG search with the provided name. The search can be + * activated using ps_activate_search(). + * + * @memberof ps_decoder_t + * @see ps_activate_search + */ +POCKETSPHINX_EXPORT +int ps_add_fsg(ps_decoder_t *ps, const char *name, fsg_model_t *fsg); + +/** + * Adds new search using JSGF model. + * + * Convenient method to load JSGF model and create a search. + * + * @memberof ps_decoder_t + * @see ps_add_fsg + */ +POCKETSPHINX_EXPORT +int ps_add_jsgf_file(ps_decoder_t *ps, const char *name, const char *path); + +/** + * Adds new search using JSGF model. + * + * Convenience method to parse JSGF model from string and create a search. + * + * @memberof ps_decoder_t + * @see ps_add_fsg + */ +POCKETSPHINX_EXPORT +int ps_add_jsgf_string(ps_decoder_t *ps, const char *name, const char *jsgf_string); + +/** + * Get the keyphrase associated with a KWS search + * + * @memberof ps_decoder_t + * @arg name Name of KWS search, or NULL for current search. + * @return The current keyphrase to spot, or NULL if `name` does not + * correspond to a KWS search + */ +POCKETSPHINX_EXPORT +const char* ps_get_kws(ps_decoder_t *ps, const char *name); + +/** + * Adds keyphrases from a file to spotting + * + * Associates KWS search with the provided name. The search can be activated + * using ps_activate_search(). + * + * @memberof ps_decoder_t + * @see ps_activate_search + */ +POCKETSPHINX_EXPORT +int ps_add_kws(ps_decoder_t *ps, const char *name, const char *keyfile); + +/** + * Adds new keyphrase to spot + * + * Associates KWS search with the provided name. The search can be activated + * using ps_activate_search(). + * + * @memberof ps_decoder_t + * @see ps_activate_search + */ +POCKETSPHINX_EXPORT +int ps_add_keyphrase(ps_decoder_t *ps, const char *name, const char *keyphrase); + +/** + * Adds new search based on phone N-gram language model. + * + * Associates N-gram search with the provided name. The search can be activated + * using ps_activate_search(). + * + * @memberof ps_decoder_t + * @see ps_activate_search. + */ +POCKETSPHINX_EXPORT +int ps_add_allphone(ps_decoder_t *ps, const char *name, ngram_model_t *lm); + +/** + * Adds new search based on phone N-gram language model. + * + * Convenient method to load N-gram model and create a search. + * + * @memberof ps_decoder_t + * @see ps_add_allphone + */ +POCKETSPHINX_EXPORT +int ps_add_allphone_file(ps_decoder_t *ps, const char *name, const char *path); + +/** + * Set up decoder to force-align a word sequence. + * + * Unlike the `ps_add_*` functions, this activates the search module + * immediately, since force-alignment is nearly always a single shot. + * Currently "under the hood" this is an FSG search but you shouldn't + * depend on that. The search module activated is *not* the default + * search, so you can return to that one by calling ps_activate_search + * with `NULL`. + * + * Decoding proceeds as normal, though only this word sequence will be + * recognized, with silences and alternate pronunciations inserted. + * Word alignments are available with ps_seg_iter(). To obtain + * phoneme or state segmentations, you must subsequently call + * ps_set_alignment() and re-run decoding. It's tough son, but it's life. + * + * @memberof ps_decoder_t + * @param ps Decoder + * @param words String containing whitespace-separated words for alignment. + * These words are assumed to exist in the current dictionary. + * + */ +POCKETSPHINX_EXPORT +int ps_set_align_text(ps_decoder_t *ps, const char *words); + +/** + * Set up decoder to run phone and state-level alignment. + * + * Unlike the `ps_add_*` functions, this activates the search module + * immediately, since force-alignment is nearly always a single shot. + * + * To align, run or re-run decoding as usual, then call + * ps_get_alignment() to get the resulting alignment. Note that if + * you call this function *before* rerunning decoding, you can obtain + * the phone and state sequence, but the durations will be invalid + * (phones and states will inherit the parent word's duration). + * + * @memberof ps_decoder_t + * @param ps Decoder object. + * @param al Usually NULL, which means to construct an alignment from + * the current search hypothesis (this does not work with + * allphone or keyword spotting). You can also pass a + * ps_alignment_t here if you have one. The search will + * retain but not copy it, so after running decoding it will + * be updated with new durations. You can set starts and + * durations for words or phones (not states) to constrain + * the alignment. + * @return 0 for success, -1 for error (if there is no search + * hypothesis, or it cannot be aligned due to missing word + * IDs) + */ +POCKETSPHINX_EXPORT +int ps_set_alignment(ps_decoder_t *ps, ps_alignment_t *al); + +/** + * Get the alignment associated with the current search module. + * + * As noted above, if decoding has not been run, this will contain + * invalid durations, but that may still be useful if you just want to + * know the state sequence. + * + * @memberof ps_decoder_t + * @return Current alignment, or NULL if none. This pointer is owned + * by the decoder, so you must call ps_alignment_retain() on + * it if you wish to keep it outside the lifetime of the + * decoder. + */ +POCKETSPHINX_EXPORT +ps_alignment_t *ps_get_alignment(ps_decoder_t *ps); + +#ifdef __cplusplus +} +#endif + +#endif /* __PS_SEARCH_H__ */ diff --git a/include/pocketsphinx/vad.h b/include/pocketsphinx/vad.h new file mode 100644 index 0000000..85efde8 --- /dev/null +++ b/include/pocketsphinx/vad.h @@ -0,0 +1,197 @@ +/* -*- c-basic-offset:4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2022 David Huggins-Daines. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ +/** + * @file vad.h + * @brief Simple voice activity detection + * + * Because doxygen is Bad Software, the actual documentation can only + * exist in \ref ps_vad_t. Sorry about that. + */ + +#ifndef __PS_VAD_H__ +#define __PS_VAD_H__ + + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * @struct ps_vad_t pocketsphinx/vad.h + * @brief Voice activity detector. + */ +typedef struct ps_vad_s ps_vad_t; + +/** + * @enum ps_vad_mode_e pocketsphinx/vad.h + * @brief Voice activity detection "aggressiveness" levels. + */ +typedef enum ps_vad_mode_e { + PS_VAD_LOOSE = 0, + PS_VAD_MEDIUM_LOOSE = 1, + PS_VAD_MEDIUM_STRICT = 2, + PS_VAD_STRICT = 3 +} ps_vad_mode_t; + +/** + * @enum ps_vad_class_e pocketsphinx/vad.h + * @brief Classification of input frames returned by ps_vad_classify(). + */ +typedef enum ps_vad_class_e { + PS_VAD_ERROR = -1, + PS_VAD_NOT_SPEECH = 0, + PS_VAD_SPEECH = 1 +} ps_vad_class_t; + +/** + * Default sampling rate for voice activity detector + */ +#define PS_VAD_DEFAULT_SAMPLE_RATE 16000 +/** + * Default frame length for voice activity detector + */ +#define PS_VAD_DEFAULT_FRAME_LENGTH 0.03 + +/** + * Initialize voice activity detection. + * + * @memberof ps_vad_t + * @param mode "Aggressiveness" of voice activity detection. Stricter + * values (see ps_vad_mode_t) are less likely to + * misclassify non-speech as speech. + * @param sample_rate Sampling rate of input, or 0 for default (which can + * be obtained with ps_vad_sample_rate()). Only 8000, + * 16000, 32000, 48000 are directly supported. See + * ps_vad_set_input_params() for more information. + * @param frame_length Frame length in seconds, or 0.0 for the default. Only + * 0.01, 0.02, 0.03 currently supported. **Actual** value + * may differ, you must use ps_vad_frame_length() to + * obtain it. + * @return VAD object or NULL on failure (invalid parameter for instance). + */ +POCKETSPHINX_EXPORT +ps_vad_t *ps_vad_init(ps_vad_mode_t mode, int sample_rate, double frame_length); + +/** + * Retain a pointer to voice activity detector. + * + * @memberof ps_vad_t + * @param vad Voice activity detector. + * @return Voice activity detector with incremented reference count. + */ +POCKETSPHINX_EXPORT +ps_vad_t *ps_vad_retain(ps_vad_t *vad); + +/** + * Release a pointer to voice activity detector. + * + * @memberof ps_vad_t + * @param vad Voice activity detector. + * @return New reference count (0 if freed). + */ +POCKETSPHINX_EXPORT +int ps_vad_free(ps_vad_t *vad); + +/** + * Set the input parameters for voice activity detection. + * + * @memberof ps_vad_t + * @param sample_rate Sampling rate of input, or 0 for default (which can + * be obtained with ps_vad_sample_rate()). Only 8000, + * 16000, 32000, 48000 are directly supported, others + * will use the closest supported rate (within reason). + * Note that this means that the actual frame length + * may not be exactly the one requested, so you must + * always use the one returned by ps_vad_frame_size() + * (in samples) or ps_vad_frame_length() (in seconds). + * @param frame_length Requested frame length in seconds, or 0.0 for the + * default. Only 0.01, 0.02, 0.03 currently supported. + * **Actual frame length may be different, you must + * always use ps_vad_frame_length() to obtain it.** + * @return 0 for success or -1 on error. + */ +POCKETSPHINX_EXPORT +int ps_vad_set_input_params(ps_vad_t *vad, int sample_rate, double frame_length); + +/** + * Get the sampling rate expected by voice activity detection. + * + * @memberof ps_vad_t + * @param vad Voice activity detector. + * @return Expected sampling rate. + */ +POCKETSPHINX_EXPORT +int ps_vad_sample_rate(ps_vad_t *vad); + +/** + * Get the number of samples expected by voice activity detection. + * + * You **must** always ensure that the buffers passed to + * ps_vad_classify() contain this number of samples (zero-pad them if + * necessary). + * + * @memberof ps_vad_t + * @param vad Voice activity detector. + * @return Size, in samples, of the frames passed to ps_vad_classify(). + */ +POCKETSPHINX_EXPORT +size_t ps_vad_frame_size(ps_vad_t *vad); + +/** + * Get the *actual* length of a frame in seconds. + * + * This may differ from the value requested in ps_vad_set_input_params(). + */ +#define ps_vad_frame_length(vad) ((double)ps_vad_frame_size(vad) / ps_vad_sample_rate(vad)) + +/** + * Classify a frame as speech or not speech. + * + * @memberof ps_vad_t + * @param vad Voice activity detector. + * @param frame Frame of input, **must** contain the number of + * samples returned by ps_vad_frame_size(). + * @return PS_VAD_SPEECH, PS_VAD_NOT_SPEECH, or PS_VAD_ERROR (see + * ps_vad_class_t). + */ +POCKETSPHINX_EXPORT +ps_vad_class_t ps_vad_classify(ps_vad_t *vad, const int16 *frame); + +#ifdef __cplusplus +} +#endif + +#endif /* __PS_VAD_H__ */ diff --git a/include/ps_search.h b/include/ps_search.h deleted file mode 100644 index 8338752..0000000 --- a/include/ps_search.h +++ /dev/null @@ -1,300 +0,0 @@ -/* -*- c-basic-offset:4; indent-tabs-mode: nil -*- */ -/* ==================================================================== - * Copyright (c) 2014 Alpha Cephei Inc.. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * - * THIS SOFTWARE IS PROVIDED BY ALPHA CEPHEI INC. ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY - * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * ==================================================================== - * - */ -/** - * @file ps_search.h User can configure several "search" objects with - * different grammars and langauge models and switch them in runtime to - * provide interactive experience for the user. - * - * There are different possible search modes: - * - *
    - *
  • keyphrase - efficiently looks for keyphrase and ignores other speech. allows to configure detection threshold.
  • - *
  • grammar - recognizes speech according to JSGF grammar. Unlike keyphrase grammar search doesn't ignore words which are not in grammar but tries to recognize them.
  • - *
  • ngram/lm - recognizes natural speech with a language model.
  • - *
  • allphone - recognizes phonemes with a phonetic language model.
  • - *
- * - * Each search has a name and can be referenced by a name, names are - * application-specific. The function ps_set_search allows to activate - * the search previously added by a name. Only single search can be - * activated at time. - * - * To add the search one needs to point to the grammar/language model - * describing the search. The location of the grammar is specific to the - * application. - * - * The exact design of a searches depends on your application. For - * example, you might want to listen for activation keyphrase first and once - * keyphrase is recognized switch to ngram search to recognize actual - * command. Once you recognized the command you can switch to grammar - * search to recognize the confirmation and then switch back to keyphrase listening - * mode to wait for another command. - * - * If only a simple recognition is required it is sufficient to add a single search or - * just configure the required mode with configuration options. - */ - -#ifndef __PS_SEARCH_H__ -#define __PS_SEARCH_H__ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif -#if 0 -} -#endif - -/** - * PocketSphinx search iterator. - */ -typedef struct ps_search_iter_s ps_search_iter_t; - - -/** - * Actives search with the provided name. - * - * Activates search with the provided name. The search must be added before - * using either ps_set_fsg(), ps_set_lm() or ps_set_kws(). - * - * @return 0 on success, -1 on failure - */ -POCKETSPHINX_EXPORT -int ps_set_search(ps_decoder_t *ps, const char *name); - -/** - * Returns name of curent search in decoder - * - * @see ps_set_search - */ -POCKETSPHINX_EXPORT -const char* ps_get_search(ps_decoder_t *ps); - -/** - * Unsets the search and releases related resources. - * - * Unsets the search previously added with - * using either ps_set_fsg(), ps_set_lm() or ps_set_kws(). - * - * @see ps_set_fsg - * @see ps_set_lm - * @see ps_set_kws - */ -POCKETSPHINX_EXPORT -int ps_unset_search(ps_decoder_t *ps, const char *name); - -/** - * Returns iterator over current searches - * - * @see ps_set_search - */ -POCKETSPHINX_EXPORT -ps_search_iter_t *ps_search_iter(ps_decoder_t *ps); - -/** - * Updates search iterator to point to the next position. - * - * This function automatically frees the iterator object upon reaching - * the final entry. - * @see ps_set_search - */ -POCKETSPHINX_EXPORT -ps_search_iter_t *ps_search_iter_next(ps_search_iter_t *itor); - -/** - * Retrieves the name of the search the iterator points to. - * - * @see ps_set_search - */ -POCKETSPHINX_EXPORT -const char* ps_search_iter_val(ps_search_iter_t *itor); - -/** - * Delete an unfinished search iterator - * - * @see ps_set_search - */ -POCKETSPHINX_EXPORT -void ps_search_iter_free(ps_search_iter_t *itor); - -/** - * Updates search iterator to point to the next position. - * - * This function automatically frees the iterator object upon reaching - * the final entry. - * @see ps_set_search - */ -POCKETSPHINX_EXPORT -const char* ps_search_iter_val(ps_search_iter_t *itor); - - -/** - * Get the language model set object for this decoder. - * - * If N-Gram decoding is not enabled, this will return NULL. You will - * need to enable it using ps_set_lmset(). - * - * @return The language model set object for this decoder. The - * decoder retains ownership of this pointer, so you should - * not attempt to free it manually. Use ngram_model_retain() - * if you wish to reuse it elsewhere. - */ -POCKETSPHINX_EXPORT -ngram_model_t *ps_get_lm(ps_decoder_t *ps, const char *name); - -/** - * Adds new search based on N-gram language model. - * - * Associates N-gram search with the provided name. The search can be activated - * using ps_set_search(). - * - * @see ps_set_search. - */ -POCKETSPHINX_EXPORT -int ps_set_lm(ps_decoder_t *ps, const char *name, ngram_model_t *lm); - -/** - * Adds new search based on N-gram language model. - * - * Convenient method to load N-gram model and create a search. - * - * @see ps_set_lm - */ -POCKETSPHINX_EXPORT -int ps_set_lm_file(ps_decoder_t *ps, const char *name, const char *path); - -/** - * Get the finite-state grammar set object for this decoder. - * - * If FSG decoding is not enabled, this returns NULL. Call - * ps_set_fsgset() to enable it. - * - * @return The current FSG set object for this decoder, or - * NULL if none is available. - */ -POCKETSPHINX_EXPORT -fsg_model_t *ps_get_fsg(ps_decoder_t *ps, const char *name); - -/** - * Adds new search based on finite state grammar. - * - * Associates FSG search with the provided name. The search can be activated - * using ps_set_search(). - * - * @see ps_set_search - */ -POCKETSPHINX_EXPORT -int ps_set_fsg(ps_decoder_t *ps, const char *name, fsg_model_t *fsg); - -/** - * Adds new search using JSGF model. - * - * Convenient method to load JSGF model and create a search. - * - * @see ps_set_fsg - */ -POCKETSPHINX_EXPORT -int ps_set_jsgf_file(ps_decoder_t *ps, const char *name, const char *path); - -/** - * Adds new search using JSGF model. - * - * Convenience method to parse JSGF model from string and create a search. - * - * @see ps_set_fsg - */ -POCKETSPHINX_EXPORT -int ps_set_jsgf_string(ps_decoder_t *ps, const char *name, const char *jsgf_string); - -/** - * Get the current Key phrase to spot - * - * If KWS is not enabled, this returns NULL. Call - * ps_update_kws() to enable it. - * - * @return The current keyphrase to spot - */ -POCKETSPHINX_EXPORT -const char* ps_get_kws(ps_decoder_t *ps, const char *name); - -/** - * Adds keyphrases from a file to spotting - * - * Associates KWS search with the provided name. The search can be activated - * using ps_set_search(). - * - * @see ps_set_search - */ -POCKETSPHINX_EXPORT -int ps_set_kws(ps_decoder_t *ps, const char *name, const char *keyfile); - -/** - * Adds new keyphrase to spot - * - * Associates KWS search with the provided name. The search can be activated - * using ps_set_search(). - * - * @see ps_set_search - */ -POCKETSPHINX_EXPORT -int ps_set_keyphrase(ps_decoder_t *ps, const char *name, const char *keyphrase); - -/** - * Adds new search based on phone N-gram language model. - * - * Associates N-gram search with the provided name. The search can be activated - * using ps_set_search(). - * - * @see ps_set_search. - */ -POCKETSPHINX_EXPORT -int ps_set_allphone(ps_decoder_t *ps, const char *name, ngram_model_t *lm); - -/** - * Adds new search based on phone N-gram language model. - * - * Convenient method to load N-gram model and create a search. - * - * @see ps_set_allphone - */ -POCKETSPHINX_EXPORT -int ps_set_allphone_file(ps_decoder_t *ps, const char *name, const char *path); - -#ifdef __cplusplus -} -#endif - -#endif /* __PS_SEARCH_H__ */ diff --git a/indent.sh b/indent.sh new file mode 100755 index 0000000..a724880 --- /dev/null +++ b/indent.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +# This is the equivalent of the following Emacs thing: +# -*- c-basic-offset: 4; indent-tabs-mode: nil -*- + +find . -name '*.c' -print0 | xargs -0 indent -i4 -kr -psl -nce -nut diff --git a/install-sh b/install-sh deleted file mode 100755 index 377bb86..0000000 --- a/install-sh +++ /dev/null @@ -1,527 +0,0 @@ -#!/bin/sh -# install - install a program, script, or datafile - -scriptversion=2011-11-20.07; # UTC - -# This originates from X11R5 (mit/util/scripts/install.sh), which was -# later released in X11R6 (xc/config/util/install.sh) with the -# following copyright and license. -# -# Copyright (C) 1994 X Consortium -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to -# deal in the Software without restriction, including without limitation the -# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -# sell copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- -# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -# Except as contained in this notice, the name of the X Consortium shall not -# be used in advertising or otherwise to promote the sale, use or other deal- -# ings in this Software without prior written authorization from the X Consor- -# tium. -# -# -# FSF changes to this file are in the public domain. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# 'make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. - -nl=' -' -IFS=" "" $nl" - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit=${DOITPROG-} -if test -z "$doit"; then - doit_exec=exec -else - doit_exec=$doit -fi - -# Put in absolute file names if you don't have them in your path; -# or use environment vars. - -chgrpprog=${CHGRPPROG-chgrp} -chmodprog=${CHMODPROG-chmod} -chownprog=${CHOWNPROG-chown} -cmpprog=${CMPPROG-cmp} -cpprog=${CPPROG-cp} -mkdirprog=${MKDIRPROG-mkdir} -mvprog=${MVPROG-mv} -rmprog=${RMPROG-rm} -stripprog=${STRIPPROG-strip} - -posix_glob='?' -initialize_posix_glob=' - test "$posix_glob" != "?" || { - if (set -f) 2>/dev/null; then - posix_glob= - else - posix_glob=: - fi - } -' - -posix_mkdir= - -# Desired mode of installed file. -mode=0755 - -chgrpcmd= -chmodcmd=$chmodprog -chowncmd= -mvcmd=$mvprog -rmcmd="$rmprog -f" -stripcmd= - -src= -dst= -dir_arg= -dst_arg= - -copy_on_change=false -no_target_directory= - -usage="\ -Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE - or: $0 [OPTION]... SRCFILES... DIRECTORY - or: $0 [OPTION]... -t DIRECTORY SRCFILES... - or: $0 [OPTION]... -d DIRECTORIES... - -In the 1st form, copy SRCFILE to DSTFILE. -In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. -In the 4th, create DIRECTORIES. - -Options: - --help display this help and exit. - --version display version info and exit. - - -c (ignored) - -C install only if different (preserve the last data modification time) - -d create directories instead of installing files. - -g GROUP $chgrpprog installed files to GROUP. - -m MODE $chmodprog installed files to MODE. - -o USER $chownprog installed files to USER. - -s $stripprog installed files. - -t DIRECTORY install into DIRECTORY. - -T report an error if DSTFILE is a directory. - -Environment variables override the default commands: - CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG - RMPROG STRIPPROG -" - -while test $# -ne 0; do - case $1 in - -c) ;; - - -C) copy_on_change=true;; - - -d) dir_arg=true;; - - -g) chgrpcmd="$chgrpprog $2" - shift;; - - --help) echo "$usage"; exit $?;; - - -m) mode=$2 - case $mode in - *' '* | *' '* | *' -'* | *'*'* | *'?'* | *'['*) - echo "$0: invalid mode: $mode" >&2 - exit 1;; - esac - shift;; - - -o) chowncmd="$chownprog $2" - shift;; - - -s) stripcmd=$stripprog;; - - -t) dst_arg=$2 - # Protect names problematic for 'test' and other utilities. - case $dst_arg in - -* | [=\(\)!]) dst_arg=./$dst_arg;; - esac - shift;; - - -T) no_target_directory=true;; - - --version) echo "$0 $scriptversion"; exit $?;; - - --) shift - break;; - - -*) echo "$0: invalid option: $1" >&2 - exit 1;; - - *) break;; - esac - shift -done - -if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then - # When -d is used, all remaining arguments are directories to create. - # When -t is used, the destination is already specified. - # Otherwise, the last argument is the destination. Remove it from $@. - for arg - do - if test -n "$dst_arg"; then - # $@ is not empty: it contains at least $arg. - set fnord "$@" "$dst_arg" - shift # fnord - fi - shift # arg - dst_arg=$arg - # Protect names problematic for 'test' and other utilities. - case $dst_arg in - -* | [=\(\)!]) dst_arg=./$dst_arg;; - esac - done -fi - -if test $# -eq 0; then - if test -z "$dir_arg"; then - echo "$0: no input file specified." >&2 - exit 1 - fi - # It's OK to call 'install-sh -d' without argument. - # This can happen when creating conditional directories. - exit 0 -fi - -if test -z "$dir_arg"; then - do_exit='(exit $ret); exit $ret' - trap "ret=129; $do_exit" 1 - trap "ret=130; $do_exit" 2 - trap "ret=141; $do_exit" 13 - trap "ret=143; $do_exit" 15 - - # Set umask so as not to create temps with too-generous modes. - # However, 'strip' requires both read and write access to temps. - case $mode in - # Optimize common cases. - *644) cp_umask=133;; - *755) cp_umask=22;; - - *[0-7]) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw='% 200' - fi - cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; - *) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw=,u+rw - fi - cp_umask=$mode$u_plus_rw;; - esac -fi - -for src -do - # Protect names problematic for 'test' and other utilities. - case $src in - -* | [=\(\)!]) src=./$src;; - esac - - if test -n "$dir_arg"; then - dst=$src - dstdir=$dst - test -d "$dstdir" - dstdir_status=$? - else - - # Waiting for this to be detected by the "$cpprog $src $dsttmp" command - # might cause directories to be created, which would be especially bad - # if $src (and thus $dsttmp) contains '*'. - if test ! -f "$src" && test ! -d "$src"; then - echo "$0: $src does not exist." >&2 - exit 1 - fi - - if test -z "$dst_arg"; then - echo "$0: no destination specified." >&2 - exit 1 - fi - dst=$dst_arg - - # If destination is a directory, append the input filename; won't work - # if double slashes aren't ignored. - if test -d "$dst"; then - if test -n "$no_target_directory"; then - echo "$0: $dst_arg: Is a directory" >&2 - exit 1 - fi - dstdir=$dst - dst=$dstdir/`basename "$src"` - dstdir_status=0 - else - # Prefer dirname, but fall back on a substitute if dirname fails. - dstdir=` - (dirname "$dst") 2>/dev/null || - expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$dst" : 'X\(//\)[^/]' \| \ - X"$dst" : 'X\(//\)$' \| \ - X"$dst" : 'X\(/\)' \| . 2>/dev/null || - echo X"$dst" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q' - ` - - test -d "$dstdir" - dstdir_status=$? - fi - fi - - obsolete_mkdir_used=false - - if test $dstdir_status != 0; then - case $posix_mkdir in - '') - # Create intermediate dirs using mode 755 as modified by the umask. - # This is like FreeBSD 'install' as of 1997-10-28. - umask=`umask` - case $stripcmd.$umask in - # Optimize common cases. - *[2367][2367]) mkdir_umask=$umask;; - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - - *[0-7]) - mkdir_umask=`expr $umask + 22 \ - - $umask % 100 % 40 + $umask % 20 \ - - $umask % 10 % 4 + $umask % 2 - `;; - *) mkdir_umask=$umask,go-w;; - esac - - # With -d, create the new directory with the user-specified mode. - # Otherwise, rely on $mkdir_umask. - if test -n "$dir_arg"; then - mkdir_mode=-m$mode - else - mkdir_mode= - fi - - posix_mkdir=false - case $umask in - *[123567][0-7][0-7]) - # POSIX mkdir -p sets u+wx bits regardless of umask, which - # is incompatible with FreeBSD 'install' when (umask & 300) != 0. - ;; - *) - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 - - if (umask $mkdir_umask && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - ls_ld_tmpdir=`ls -ld "$tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/d" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null - fi - trap '' 0;; - esac;; - esac - - if - $posix_mkdir && ( - umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" - ) - then : - else - - # The umask is ridiculous, or mkdir does not conform to POSIX, - # or it failed possibly due to a race condition. Create the - # directory the slow way, step by step, checking for races as we go. - - case $dstdir in - /*) prefix='/';; - [-=\(\)!]*) prefix='./';; - *) prefix='';; - esac - - eval "$initialize_posix_glob" - - oIFS=$IFS - IFS=/ - $posix_glob set -f - set fnord $dstdir - shift - $posix_glob set +f - IFS=$oIFS - - prefixes= - - for d - do - test X"$d" = X && continue - - prefix=$prefix$d - if test -d "$prefix"; then - prefixes= - else - if $posix_mkdir; then - (umask=$mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break - # Don't fail if two instances are running concurrently. - test -d "$prefix" || exit 1 - else - case $prefix in - *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; - *) qprefix=$prefix;; - esac - prefixes="$prefixes '$qprefix'" - fi - fi - prefix=$prefix/ - done - - if test -n "$prefixes"; then - # Don't fail if two instances are running concurrently. - (umask $mkdir_umask && - eval "\$doit_exec \$mkdirprog $prefixes") || - test -d "$dstdir" || exit 1 - obsolete_mkdir_used=true - fi - fi - fi - - if test -n "$dir_arg"; then - { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && - { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || - test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 - else - - # Make a couple of temp file names in the proper directory. - dsttmp=$dstdir/_inst.$$_ - rmtmp=$dstdir/_rm.$$_ - - # Trap to clean up those temp files at exit. - trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 - - # Copy the file name to the temp name. - (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && - - # and set any options; do chmod last to preserve setuid bits. - # - # If any of these fail, we abort the whole thing. If we want to - # ignore errors from any of these, just make sure not to ignore - # errors from the above "$doit $cpprog $src $dsttmp" command. - # - { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && - { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && - { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && - - # If -C, don't bother to copy if it wouldn't change the file. - if $copy_on_change && - old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && - new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && - - eval "$initialize_posix_glob" && - $posix_glob set -f && - set X $old && old=:$2:$4:$5:$6 && - set X $new && new=:$2:$4:$5:$6 && - $posix_glob set +f && - - test "$old" = "$new" && - $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 - then - rm -f "$dsttmp" - else - # Rename the file to the real destination. - $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || - - # The rename failed, perhaps because mv can't rename something else - # to itself, or perhaps because mv is so ancient that it does not - # support -f. - { - # Now remove or move aside any old file at destination location. - # We try this two ways since rm can't unlink itself on some - # systems and the destination file might be busy for other - # reasons. In this case, the final cleanup might fail but the new - # file should still install successfully. - { - test ! -f "$dst" || - $doit $rmcmd -f "$dst" 2>/dev/null || - { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } - } || - { echo "$0: cannot unlink or rename $dst" >&2 - (exit 1); exit 1 - } - } && - - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dst" - } - fi || exit 1 - - trap '' 0 - fi -done - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/ltmain.sh b/ltmain.sh deleted file mode 100644 index 63ae69d..0000000 --- a/ltmain.sh +++ /dev/null @@ -1,9655 +0,0 @@ - -# libtool (GNU libtool) 2.4.2 -# Written by Gordon Matzigkeit , 1996 - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, -# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. -# This is free software; see the source for copying conditions. There is NO -# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -# GNU Libtool is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, -# or obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -# Usage: $progname [OPTION]... [MODE-ARG]... -# -# Provide generalized library-building support services. -# -# --config show all configuration variables -# --debug enable verbose shell tracing -# -n, --dry-run display commands without modifying any files -# --features display basic configuration information and exit -# --mode=MODE use operation mode MODE -# --preserve-dup-deps don't remove duplicate dependency libraries -# --quiet, --silent don't print informational messages -# --no-quiet, --no-silent -# print informational messages (default) -# --no-warn don't display warning messages -# --tag=TAG use configuration variables from tag TAG -# -v, --verbose print more informational messages than default -# --no-verbose don't print the extra informational messages -# --version print version information -# -h, --help, --help-all print short, long, or detailed help message -# -# MODE must be one of the following: -# -# clean remove files from the build directory -# compile compile a source file into a libtool object -# execute automatically set library path, then run a program -# finish complete the installation of libtool libraries -# install install libraries or executables -# link create a library or an executable -# uninstall remove libraries from an installed directory -# -# MODE-ARGS vary depending on the MODE. When passed as first option, -# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. -# Try `$progname --help --mode=MODE' for a more detailed description of MODE. -# -# When reporting a bug, please describe a test case to reproduce it and -# include the following information: -# -# host-triplet: $host -# shell: $SHELL -# compiler: $LTCC -# compiler flags: $LTCFLAGS -# linker: $LD (gnu? $with_gnu_ld) -# $progname: (GNU libtool) 2.4.2 -# automake: $automake_version -# autoconf: $autoconf_version -# -# Report bugs to . -# GNU libtool home page: . -# General help using GNU software: . - -PROGRAM=libtool -PACKAGE=libtool -VERSION=2.4.2 -TIMESTAMP="" -package_revision=1.3337 - -# Be Bourne compatible -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac -fi -BIN_SH=xpg4; export BIN_SH # for Tru64 -DUALCASE=1; export DUALCASE # for MKS sh - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' -} - -# NLS nuisances: We save the old values to restore during execute mode. -lt_user_locale= -lt_safe_locale= -for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES -do - eval "if test \"\${$lt_var+set}\" = set; then - save_$lt_var=\$$lt_var - $lt_var=C - export $lt_var - lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" - lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" - fi" -done -LC_ALL=C -LANGUAGE=C -export LANGUAGE LC_ALL - -$lt_unset CDPATH - - -# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh -# is ksh but when the shell is invoked as "sh" and the current value of -# the _XPG environment variable is not equal to 1 (one), the special -# positional parameter $0, within a function call, is the name of the -# function. -progpath="$0" - - - -: ${CP="cp -f"} -test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} -: ${MAKE="make"} -: ${MKDIR="mkdir"} -: ${MV="mv -f"} -: ${RM="rm -f"} -: ${SHELL="${CONFIG_SHELL-/bin/sh}"} -: ${Xsed="$SED -e 1s/^X//"} - -# Global variables: -EXIT_SUCCESS=0 -EXIT_FAILURE=1 -EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. -EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. - -exit_status=$EXIT_SUCCESS - -# Make sure IFS has a sensible default -lt_nl=' -' -IFS=" $lt_nl" - -dirname="s,/[^/]*$,," -basename="s,^.*/,," - -# func_dirname file append nondir_replacement -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -func_dirname () -{ - func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi -} # func_dirname may be replaced by extended shell implementation - - -# func_basename file -func_basename () -{ - func_basename_result=`$ECHO "${1}" | $SED "$basename"` -} # func_basename may be replaced by extended shell implementation - - -# func_dirname_and_basename file append nondir_replacement -# perform func_basename and func_dirname in a single function -# call: -# dirname: Compute the dirname of FILE. If nonempty, -# add APPEND to the result, otherwise set result -# to NONDIR_REPLACEMENT. -# value returned in "$func_dirname_result" -# basename: Compute filename of FILE. -# value retuned in "$func_basename_result" -# Implementation must be kept synchronized with func_dirname -# and func_basename. For efficiency, we do not delegate to -# those functions but instead duplicate the functionality here. -func_dirname_and_basename () -{ - # Extract subdirectory from the argument. - func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi - func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` -} # func_dirname_and_basename may be replaced by extended shell implementation - - -# func_stripname prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -# func_strip_suffix prefix name -func_stripname () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; - esac -} # func_stripname may be replaced by extended shell implementation - - -# These SED scripts presuppose an absolute path with a trailing slash. -pathcar='s,^/\([^/]*\).*$,\1,' -pathcdr='s,^/[^/]*,,' -removedotparts=':dotsl - s@/\./@/@g - t dotsl - s,/\.$,/,' -collapseslashes='s@/\{1,\}@/@g' -finalslash='s,/*$,/,' - -# func_normal_abspath PATH -# Remove doubled-up and trailing slashes, "." path components, -# and cancel out any ".." path components in PATH after making -# it an absolute path. -# value returned in "$func_normal_abspath_result" -func_normal_abspath () -{ - # Start from root dir and reassemble the path. - func_normal_abspath_result= - func_normal_abspath_tpath=$1 - func_normal_abspath_altnamespace= - case $func_normal_abspath_tpath in - "") - # Empty path, that just means $cwd. - func_stripname '' '/' "`pwd`" - func_normal_abspath_result=$func_stripname_result - return - ;; - # The next three entries are used to spot a run of precisely - # two leading slashes without using negated character classes; - # we take advantage of case's first-match behaviour. - ///*) - # Unusual form of absolute path, do nothing. - ;; - //*) - # Not necessarily an ordinary path; POSIX reserves leading '//' - # and for example Cygwin uses it to access remote file shares - # over CIFS/SMB, so we conserve a leading double slash if found. - func_normal_abspath_altnamespace=/ - ;; - /*) - # Absolute path, do nothing. - ;; - *) - # Relative path, prepend $cwd. - func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath - ;; - esac - # Cancel out all the simple stuff to save iterations. We also want - # the path to end with a slash for ease of parsing, so make sure - # there is one (and only one) here. - func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` - while :; do - # Processed it all yet? - if test "$func_normal_abspath_tpath" = / ; then - # If we ascended to the root using ".." the result may be empty now. - if test -z "$func_normal_abspath_result" ; then - func_normal_abspath_result=/ - fi - break - fi - func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$pathcar"` - func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$pathcdr"` - # Figure out what to do with it - case $func_normal_abspath_tcomponent in - "") - # Trailing empty path component, ignore it. - ;; - ..) - # Parent dir; strip last assembled component from result. - func_dirname "$func_normal_abspath_result" - func_normal_abspath_result=$func_dirname_result - ;; - *) - # Actual path component, append it. - func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent - ;; - esac - done - # Restore leading double-slash if one was found on entry. - func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result -} - -# func_relative_path SRCDIR DSTDIR -# generates a relative path from SRCDIR to DSTDIR, with a trailing -# slash if non-empty, suitable for immediately appending a filename -# without needing to append a separator. -# value returned in "$func_relative_path_result" -func_relative_path () -{ - func_relative_path_result= - func_normal_abspath "$1" - func_relative_path_tlibdir=$func_normal_abspath_result - func_normal_abspath "$2" - func_relative_path_tbindir=$func_normal_abspath_result - - # Ascend the tree starting from libdir - while :; do - # check if we have found a prefix of bindir - case $func_relative_path_tbindir in - $func_relative_path_tlibdir) - # found an exact match - func_relative_path_tcancelled= - break - ;; - $func_relative_path_tlibdir*) - # found a matching prefix - func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" - func_relative_path_tcancelled=$func_stripname_result - if test -z "$func_relative_path_result"; then - func_relative_path_result=. - fi - break - ;; - *) - func_dirname $func_relative_path_tlibdir - func_relative_path_tlibdir=${func_dirname_result} - if test "x$func_relative_path_tlibdir" = x ; then - # Have to descend all the way to the root! - func_relative_path_result=../$func_relative_path_result - func_relative_path_tcancelled=$func_relative_path_tbindir - break - fi - func_relative_path_result=../$func_relative_path_result - ;; - esac - done - - # Now calculate path; take care to avoid doubling-up slashes. - func_stripname '' '/' "$func_relative_path_result" - func_relative_path_result=$func_stripname_result - func_stripname '/' '/' "$func_relative_path_tcancelled" - if test "x$func_stripname_result" != x ; then - func_relative_path_result=${func_relative_path_result}/${func_stripname_result} - fi - - # Normalisation. If bindir is libdir, return empty string, - # else relative path ending with a slash; either way, target - # file name can be directly appended. - if test ! -z "$func_relative_path_result"; then - func_stripname './' '' "$func_relative_path_result/" - func_relative_path_result=$func_stripname_result - fi -} - -# The name of this program: -func_dirname_and_basename "$progpath" -progname=$func_basename_result - -# Make sure we have an absolute path for reexecution: -case $progpath in - [\\/]*|[A-Za-z]:\\*) ;; - *[\\/]*) - progdir=$func_dirname_result - progdir=`cd "$progdir" && pwd` - progpath="$progdir/$progname" - ;; - *) - save_IFS="$IFS" - IFS=${PATH_SEPARATOR-:} - for progdir in $PATH; do - IFS="$save_IFS" - test -x "$progdir/$progname" && break - done - IFS="$save_IFS" - test -n "$progdir" || progdir=`pwd` - progpath="$progdir/$progname" - ;; -esac - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed="${SED}"' -e 1s/^X//' -sed_quote_subst='s/\([`"$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution that turns a string into a regex matching for the -# string literally. -sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' - -# Sed substitution that converts a w32 file name or path -# which contains forward slashes, into one that contains -# (escaped) backslashes. A very naive implementation. -lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' - -# Re-`\' parameter expansions in output of double_quote_subst that were -# `\'-ed in input to the same. If an odd number of `\' preceded a '$' -# in input to double_quote_subst, that '$' was protected from expansion. -# Since each input `\' is now two `\'s, look for any number of runs of -# four `\'s followed by two `\'s and then a '$'. `\' that '$'. -bs='\\' -bs2='\\\\' -bs4='\\\\\\\\' -dollar='\$' -sed_double_backslash="\ - s/$bs4/&\\ -/g - s/^$bs2$dollar/$bs&/ - s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g - s/\n//g" - -# Standard options: -opt_dry_run=false -opt_help=false -opt_quiet=false -opt_verbose=false -opt_warning=: - -# func_echo arg... -# Echo program name prefixed message, along with the current mode -# name if it has been set yet. -func_echo () -{ - $ECHO "$progname: ${opt_mode+$opt_mode: }$*" -} - -# func_verbose arg... -# Echo program name prefixed message in verbose mode only. -func_verbose () -{ - $opt_verbose && func_echo ${1+"$@"} - - # A bug in bash halts the script if the last line of a function - # fails when set -e is in force, so we need another command to - # work around that: - : -} - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "$*" -} - -# func_error arg... -# Echo program name prefixed message to standard error. -func_error () -{ - $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 -} - -# func_warning arg... -# Echo program name prefixed warning message to standard error. -func_warning () -{ - $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 - - # bash bug again: - : -} - -# func_fatal_error arg... -# Echo program name prefixed message to standard error, and exit. -func_fatal_error () -{ - func_error ${1+"$@"} - exit $EXIT_FAILURE -} - -# func_fatal_help arg... -# Echo program name prefixed message to standard error, followed by -# a help hint, and exit. -func_fatal_help () -{ - func_error ${1+"$@"} - func_fatal_error "$help" -} -help="Try \`$progname --help' for more information." ## default - - -# func_grep expression filename -# Check whether EXPRESSION matches any line of FILENAME, without output. -func_grep () -{ - $GREP "$1" "$2" >/dev/null 2>&1 -} - - -# func_mkdir_p directory-path -# Make sure the entire path to DIRECTORY-PATH is available. -func_mkdir_p () -{ - my_directory_path="$1" - my_dir_list= - - if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then - - # Protect directory names starting with `-' - case $my_directory_path in - -*) my_directory_path="./$my_directory_path" ;; - esac - - # While some portion of DIR does not yet exist... - while test ! -d "$my_directory_path"; do - # ...make a list in topmost first order. Use a colon delimited - # list incase some portion of path contains whitespace. - my_dir_list="$my_directory_path:$my_dir_list" - - # If the last portion added has no slash in it, the list is done - case $my_directory_path in */*) ;; *) break ;; esac - - # ...otherwise throw away the child directory and loop - my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` - done - my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` - - save_mkdir_p_IFS="$IFS"; IFS=':' - for my_dir in $my_dir_list; do - IFS="$save_mkdir_p_IFS" - # mkdir can fail with a `File exist' error if two processes - # try to create one of the directories concurrently. Don't - # stop in that case! - $MKDIR "$my_dir" 2>/dev/null || : - done - IFS="$save_mkdir_p_IFS" - - # Bail out if we (or some other process) failed to create a directory. - test -d "$my_directory_path" || \ - func_fatal_error "Failed to create \`$1'" - fi -} - - -# func_mktempdir [string] -# Make a temporary directory that won't clash with other running -# libtool processes, and avoids race conditions if possible. If -# given, STRING is the basename for that directory. -func_mktempdir () -{ - my_template="${TMPDIR-/tmp}/${1-$progname}" - - if test "$opt_dry_run" = ":"; then - # Return a directory name, but don't create it in dry-run mode - my_tmpdir="${my_template}-$$" - else - - # If mktemp works, use that first and foremost - my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` - - if test ! -d "$my_tmpdir"; then - # Failing that, at least try and use $RANDOM to avoid a race - my_tmpdir="${my_template}-${RANDOM-0}$$" - - save_mktempdir_umask=`umask` - umask 0077 - $MKDIR "$my_tmpdir" - umask $save_mktempdir_umask - fi - - # If we're not in dry-run mode, bomb out on failure - test -d "$my_tmpdir" || \ - func_fatal_error "cannot create temporary directory \`$my_tmpdir'" - fi - - $ECHO "$my_tmpdir" -} - - -# func_quote_for_eval arg -# Aesthetically quote ARG to be evaled later. -# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT -# is double-quoted, suitable for a subsequent eval, whereas -# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters -# which are still active within double quotes backslashified. -func_quote_for_eval () -{ - case $1 in - *[\\\`\"\$]*) - func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; - *) - func_quote_for_eval_unquoted_result="$1" ;; - esac - - case $func_quote_for_eval_unquoted_result in - # Double-quote args containing shell metacharacters to delay - # word splitting, command substitution and and variable - # expansion for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" - ;; - *) - func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" - esac -} - - -# func_quote_for_expand arg -# Aesthetically quote ARG to be evaled later; same as above, -# but do not quote variable references. -func_quote_for_expand () -{ - case $1 in - *[\\\`\"]*) - my_arg=`$ECHO "$1" | $SED \ - -e "$double_quote_subst" -e "$sed_double_backslash"` ;; - *) - my_arg="$1" ;; - esac - - case $my_arg in - # Double-quote args containing shell metacharacters to delay - # word splitting and command substitution for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - my_arg="\"$my_arg\"" - ;; - esac - - func_quote_for_expand_result="$my_arg" -} - - -# func_show_eval cmd [fail_exp] -# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. -func_show_eval () -{ - my_cmd="$1" - my_fail_exp="${2-:}" - - ${opt_silent-false} || { - func_quote_for_expand "$my_cmd" - eval "func_echo $func_quote_for_expand_result" - } - - if ${opt_dry_run-false}; then :; else - eval "$my_cmd" - my_status=$? - if test "$my_status" -eq 0; then :; else - eval "(exit $my_status); $my_fail_exp" - fi - fi -} - - -# func_show_eval_locale cmd [fail_exp] -# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. Use the saved locale for evaluation. -func_show_eval_locale () -{ - my_cmd="$1" - my_fail_exp="${2-:}" - - ${opt_silent-false} || { - func_quote_for_expand "$my_cmd" - eval "func_echo $func_quote_for_expand_result" - } - - if ${opt_dry_run-false}; then :; else - eval "$lt_user_locale - $my_cmd" - my_status=$? - eval "$lt_safe_locale" - if test "$my_status" -eq 0; then :; else - eval "(exit $my_status); $my_fail_exp" - fi - fi -} - -# func_tr_sh -# Turn $1 into a string suitable for a shell variable name. -# Result is stored in $func_tr_sh_result. All characters -# not in the set a-zA-Z0-9_ are replaced with '_'. Further, -# if $1 begins with a digit, a '_' is prepended as well. -func_tr_sh () -{ - case $1 in - [0-9]* | *[!a-zA-Z0-9_]*) - func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` - ;; - * ) - func_tr_sh_result=$1 - ;; - esac -} - - -# func_version -# Echo version message to standard output and exit. -func_version () -{ - $opt_debug - - $SED -n '/(C)/!b go - :more - /\./!{ - N - s/\n# / / - b more - } - :go - /^# '$PROGRAM' (GNU /,/# warranty; / { - s/^# // - s/^# *$// - s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ - p - }' < "$progpath" - exit $? -} - -# func_usage -# Echo short help message to standard output and exit. -func_usage () -{ - $opt_debug - - $SED -n '/^# Usage:/,/^# *.*--help/ { - s/^# // - s/^# *$// - s/\$progname/'$progname'/ - p - }' < "$progpath" - echo - $ECHO "run \`$progname --help | more' for full usage" - exit $? -} - -# func_help [NOEXIT] -# Echo long help message to standard output and exit, -# unless 'noexit' is passed as argument. -func_help () -{ - $opt_debug - - $SED -n '/^# Usage:/,/# Report bugs to/ { - :print - s/^# // - s/^# *$// - s*\$progname*'$progname'* - s*\$host*'"$host"'* - s*\$SHELL*'"$SHELL"'* - s*\$LTCC*'"$LTCC"'* - s*\$LTCFLAGS*'"$LTCFLAGS"'* - s*\$LD*'"$LD"'* - s/\$with_gnu_ld/'"$with_gnu_ld"'/ - s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ - s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ - p - d - } - /^# .* home page:/b print - /^# General help using/b print - ' < "$progpath" - ret=$? - if test -z "$1"; then - exit $ret - fi -} - -# func_missing_arg argname -# Echo program name prefixed message to standard error and set global -# exit_cmd. -func_missing_arg () -{ - $opt_debug - - func_error "missing argument for $1." - exit_cmd=exit -} - - -# func_split_short_opt shortopt -# Set func_split_short_opt_name and func_split_short_opt_arg shell -# variables after splitting SHORTOPT after the 2nd character. -func_split_short_opt () -{ - my_sed_short_opt='1s/^\(..\).*$/\1/;q' - my_sed_short_rest='1s/^..\(.*\)$/\1/;q' - - func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` - func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` -} # func_split_short_opt may be replaced by extended shell implementation - - -# func_split_long_opt longopt -# Set func_split_long_opt_name and func_split_long_opt_arg shell -# variables after splitting LONGOPT at the `=' sign. -func_split_long_opt () -{ - my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' - my_sed_long_arg='1s/^--[^=]*=//' - - func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` - func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` -} # func_split_long_opt may be replaced by extended shell implementation - -exit_cmd=: - - - - - -magic="%%%MAGIC variable%%%" -magic_exe="%%%MAGIC EXE variable%%%" - -# Global variables. -nonopt= -preserve_args= -lo2o="s/\\.lo\$/.${objext}/" -o2lo="s/\\.${objext}\$/.lo/" -extracted_archives= -extracted_serial=0 - -# If this variable is set in any of the actions, the command in it -# will be execed at the end. This prevents here-documents from being -# left over by shells. -exec_cmd= - -# func_append var value -# Append VALUE to the end of shell variable VAR. -func_append () -{ - eval "${1}=\$${1}\${2}" -} # func_append may be replaced by extended shell implementation - -# func_append_quoted var value -# Quote VALUE and append to the end of shell variable VAR, separated -# by a space. -func_append_quoted () -{ - func_quote_for_eval "${2}" - eval "${1}=\$${1}\\ \$func_quote_for_eval_result" -} # func_append_quoted may be replaced by extended shell implementation - - -# func_arith arithmetic-term... -func_arith () -{ - func_arith_result=`expr "${@}"` -} # func_arith may be replaced by extended shell implementation - - -# func_len string -# STRING may not start with a hyphen. -func_len () -{ - func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` -} # func_len may be replaced by extended shell implementation - - -# func_lo2o object -func_lo2o () -{ - func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` -} # func_lo2o may be replaced by extended shell implementation - - -# func_xform libobj-or-source -func_xform () -{ - func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` -} # func_xform may be replaced by extended shell implementation - - -# func_fatal_configuration arg... -# Echo program name prefixed message to standard error, followed by -# a configuration failure hint, and exit. -func_fatal_configuration () -{ - func_error ${1+"$@"} - func_error "See the $PACKAGE documentation for more information." - func_fatal_error "Fatal configuration error." -} - - -# func_config -# Display the configuration for all the tags in this script. -func_config () -{ - re_begincf='^# ### BEGIN LIBTOOL' - re_endcf='^# ### END LIBTOOL' - - # Default configuration. - $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" - - # Now print the configurations for the tags. - for tagname in $taglist; do - $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" - done - - exit $? -} - -# func_features -# Display the features supported by this script. -func_features () -{ - echo "host: $host" - if test "$build_libtool_libs" = yes; then - echo "enable shared libraries" - else - echo "disable shared libraries" - fi - if test "$build_old_libs" = yes; then - echo "enable static libraries" - else - echo "disable static libraries" - fi - - exit $? -} - -# func_enable_tag tagname -# Verify that TAGNAME is valid, and either flag an error and exit, or -# enable the TAGNAME tag. We also add TAGNAME to the global $taglist -# variable here. -func_enable_tag () -{ - # Global variable: - tagname="$1" - - re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" - re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" - sed_extractcf="/$re_begincf/,/$re_endcf/p" - - # Validate tagname. - case $tagname in - *[!-_A-Za-z0-9,/]*) - func_fatal_error "invalid tag name: $tagname" - ;; - esac - - # Don't test for the "default" C tag, as we know it's - # there but not specially marked. - case $tagname in - CC) ;; - *) - if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then - taglist="$taglist $tagname" - - # Evaluate the configuration. Be careful to quote the path - # and the sed script, to avoid splitting on whitespace, but - # also don't use non-portable quotes within backquotes within - # quotes we have to do it in 2 steps: - extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` - eval "$extractedcf" - else - func_error "ignoring unknown tag $tagname" - fi - ;; - esac -} - -# func_check_version_match -# Ensure that we are using m4 macros, and libtool script from the same -# release of libtool. -func_check_version_match () -{ - if test "$package_revision" != "$macro_revision"; then - if test "$VERSION" != "$macro_version"; then - if test -z "$macro_version"; then - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from an older release. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - fi - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, -$progname: but the definition of this LT_INIT comes from revision $macro_revision. -$progname: You should recreate aclocal.m4 with macros from revision $package_revision -$progname: of $PACKAGE $VERSION and run autoconf again. -_LT_EOF - fi - - exit $EXIT_MISMATCH - fi -} - - -# Shorthand for --mode=foo, only valid as the first argument -case $1 in -clean|clea|cle|cl) - shift; set dummy --mode clean ${1+"$@"}; shift - ;; -compile|compil|compi|comp|com|co|c) - shift; set dummy --mode compile ${1+"$@"}; shift - ;; -execute|execut|execu|exec|exe|ex|e) - shift; set dummy --mode execute ${1+"$@"}; shift - ;; -finish|finis|fini|fin|fi|f) - shift; set dummy --mode finish ${1+"$@"}; shift - ;; -install|instal|insta|inst|ins|in|i) - shift; set dummy --mode install ${1+"$@"}; shift - ;; -link|lin|li|l) - shift; set dummy --mode link ${1+"$@"}; shift - ;; -uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) - shift; set dummy --mode uninstall ${1+"$@"}; shift - ;; -esac - - - -# Option defaults: -opt_debug=: -opt_dry_run=false -opt_config=false -opt_preserve_dup_deps=false -opt_features=false -opt_finish=false -opt_help=false -opt_help_all=false -opt_silent=: -opt_warning=: -opt_verbose=: -opt_silent=false -opt_verbose=false - - -# Parse options once, thoroughly. This comes as soon as possible in the -# script to make things like `--version' happen as quickly as we can. -{ - # this just eases exit handling - while test $# -gt 0; do - opt="$1" - shift - case $opt in - --debug|-x) opt_debug='set -x' - func_echo "enabling shell trace mode" - $opt_debug - ;; - --dry-run|--dryrun|-n) - opt_dry_run=: - ;; - --config) - opt_config=: -func_config - ;; - --dlopen|-dlopen) - optarg="$1" - opt_dlopen="${opt_dlopen+$opt_dlopen -}$optarg" - shift - ;; - --preserve-dup-deps) - opt_preserve_dup_deps=: - ;; - --features) - opt_features=: -func_features - ;; - --finish) - opt_finish=: -set dummy --mode finish ${1+"$@"}; shift - ;; - --help) - opt_help=: - ;; - --help-all) - opt_help_all=: -opt_help=': help-all' - ;; - --mode) - test $# = 0 && func_missing_arg $opt && break - optarg="$1" - opt_mode="$optarg" -case $optarg in - # Valid mode arguments: - clean|compile|execute|finish|install|link|relink|uninstall) ;; - - # Catch anything else as an error - *) func_error "invalid argument for $opt" - exit_cmd=exit - break - ;; -esac - shift - ;; - --no-silent|--no-quiet) - opt_silent=false -func_append preserve_args " $opt" - ;; - --no-warning|--no-warn) - opt_warning=false -func_append preserve_args " $opt" - ;; - --no-verbose) - opt_verbose=false -func_append preserve_args " $opt" - ;; - --silent|--quiet) - opt_silent=: -func_append preserve_args " $opt" - opt_verbose=false - ;; - --verbose|-v) - opt_verbose=: -func_append preserve_args " $opt" -opt_silent=false - ;; - --tag) - test $# = 0 && func_missing_arg $opt && break - optarg="$1" - opt_tag="$optarg" -func_append preserve_args " $opt $optarg" -func_enable_tag "$optarg" - shift - ;; - - -\?|-h) func_usage ;; - --help) func_help ;; - --version) func_version ;; - - # Separate optargs to long options: - --*=*) - func_split_long_opt "$opt" - set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} - shift - ;; - - # Separate non-argument short options: - -\?*|-h*|-n*|-v*) - func_split_short_opt "$opt" - set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} - shift - ;; - - --) break ;; - -*) func_fatal_help "unrecognized option \`$opt'" ;; - *) set dummy "$opt" ${1+"$@"}; shift; break ;; - esac - done - - # Validate options: - - # save first non-option argument - if test "$#" -gt 0; then - nonopt="$opt" - shift - fi - - # preserve --debug - test "$opt_debug" = : || func_append preserve_args " --debug" - - case $host in - *cygwin* | *mingw* | *pw32* | *cegcc*) - # don't eliminate duplications in $postdeps and $predeps - opt_duplicate_compiler_generated_deps=: - ;; - *) - opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps - ;; - esac - - $opt_help || { - # Sanity checks first: - func_check_version_match - - if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then - func_fatal_configuration "not configured to build any kind of library" - fi - - # Darwin sucks - eval std_shrext=\"$shrext_cmds\" - - # Only execute mode is allowed to have -dlopen flags. - if test -n "$opt_dlopen" && test "$opt_mode" != execute; then - func_error "unrecognized option \`-dlopen'" - $ECHO "$help" 1>&2 - exit $EXIT_FAILURE - fi - - # Change the help message to a mode-specific one. - generic_help="$help" - help="Try \`$progname --help --mode=$opt_mode' for more information." - } - - - # Bail if the options were screwed - $exit_cmd $EXIT_FAILURE -} - - - - -## ----------- ## -## Main. ## -## ----------- ## - -# func_lalib_p file -# True iff FILE is a libtool `.la' library or `.lo' object file. -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_lalib_p () -{ - test -f "$1" && - $SED -e 4q "$1" 2>/dev/null \ - | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 -} - -# func_lalib_unsafe_p file -# True iff FILE is a libtool `.la' library or `.lo' object file. -# This function implements the same check as func_lalib_p without -# resorting to external programs. To this end, it redirects stdin and -# closes it afterwards, without saving the original file descriptor. -# As a safety measure, use it only where a negative result would be -# fatal anyway. Works if `file' does not exist. -func_lalib_unsafe_p () -{ - lalib_p=no - if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then - for lalib_p_l in 1 2 3 4 - do - read lalib_p_line - case "$lalib_p_line" in - \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; - esac - done - exec 0<&5 5<&- - fi - test "$lalib_p" = yes -} - -# func_ltwrapper_script_p file -# True iff FILE is a libtool wrapper script -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_script_p () -{ - func_lalib_p "$1" -} - -# func_ltwrapper_executable_p file -# True iff FILE is a libtool wrapper executable -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_executable_p () -{ - func_ltwrapper_exec_suffix= - case $1 in - *.exe) ;; - *) func_ltwrapper_exec_suffix=.exe ;; - esac - $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 -} - -# func_ltwrapper_scriptname file -# Assumes file is an ltwrapper_executable -# uses $file to determine the appropriate filename for a -# temporary ltwrapper_script. -func_ltwrapper_scriptname () -{ - func_dirname_and_basename "$1" "" "." - func_stripname '' '.exe' "$func_basename_result" - func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" -} - -# func_ltwrapper_p file -# True iff FILE is a libtool wrapper script or wrapper executable -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_p () -{ - func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" -} - - -# func_execute_cmds commands fail_cmd -# Execute tilde-delimited COMMANDS. -# If FAIL_CMD is given, eval that upon failure. -# FAIL_CMD may read-access the current command in variable CMD! -func_execute_cmds () -{ - $opt_debug - save_ifs=$IFS; IFS='~' - for cmd in $1; do - IFS=$save_ifs - eval cmd=\"$cmd\" - func_show_eval "$cmd" "${2-:}" - done - IFS=$save_ifs -} - - -# func_source file -# Source FILE, adding directory component if necessary. -# Note that it is not necessary on cygwin/mingw to append a dot to -# FILE even if both FILE and FILE.exe exist: automatic-append-.exe -# behavior happens only for exec(3), not for open(2)! Also, sourcing -# `FILE.' does not work on cygwin managed mounts. -func_source () -{ - $opt_debug - case $1 in - */* | *\\*) . "$1" ;; - *) . "./$1" ;; - esac -} - - -# func_resolve_sysroot PATH -# Replace a leading = in PATH with a sysroot. Store the result into -# func_resolve_sysroot_result -func_resolve_sysroot () -{ - func_resolve_sysroot_result=$1 - case $func_resolve_sysroot_result in - =*) - func_stripname '=' '' "$func_resolve_sysroot_result" - func_resolve_sysroot_result=$lt_sysroot$func_stripname_result - ;; - esac -} - -# func_replace_sysroot PATH -# If PATH begins with the sysroot, replace it with = and -# store the result into func_replace_sysroot_result. -func_replace_sysroot () -{ - case "$lt_sysroot:$1" in - ?*:"$lt_sysroot"*) - func_stripname "$lt_sysroot" '' "$1" - func_replace_sysroot_result="=$func_stripname_result" - ;; - *) - # Including no sysroot. - func_replace_sysroot_result=$1 - ;; - esac -} - -# func_infer_tag arg -# Infer tagged configuration to use if any are available and -# if one wasn't chosen via the "--tag" command line option. -# Only attempt this if the compiler in the base compile -# command doesn't match the default compiler. -# arg is usually of the form 'gcc ...' -func_infer_tag () -{ - $opt_debug - if test -n "$available_tags" && test -z "$tagname"; then - CC_quoted= - for arg in $CC; do - func_append_quoted CC_quoted "$arg" - done - CC_expanded=`func_echo_all $CC` - CC_quoted_expanded=`func_echo_all $CC_quoted` - case $@ in - # Blanks in the command may have been stripped by the calling shell, - # but not from the CC environment variable when configure was run. - " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ - " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; - # Blanks at the start of $base_compile will cause this to fail - # if we don't check for them as well. - *) - for z in $available_tags; do - if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then - # Evaluate the configuration. - eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" - CC_quoted= - for arg in $CC; do - # Double-quote args containing other shell metacharacters. - func_append_quoted CC_quoted "$arg" - done - CC_expanded=`func_echo_all $CC` - CC_quoted_expanded=`func_echo_all $CC_quoted` - case "$@ " in - " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ - " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) - # The compiler in the base compile command matches - # the one in the tagged configuration. - # Assume this is the tagged configuration we want. - tagname=$z - break - ;; - esac - fi - done - # If $tagname still isn't set, then no tagged configuration - # was found and let the user know that the "--tag" command - # line option must be used. - if test -z "$tagname"; then - func_echo "unable to infer tagged configuration" - func_fatal_error "specify a tag with \`--tag'" -# else -# func_verbose "using $tagname tagged configuration" - fi - ;; - esac - fi -} - - - -# func_write_libtool_object output_name pic_name nonpic_name -# Create a libtool object file (analogous to a ".la" file), -# but don't create it if we're doing a dry run. -func_write_libtool_object () -{ - write_libobj=${1} - if test "$build_libtool_libs" = yes; then - write_lobj=\'${2}\' - else - write_lobj=none - fi - - if test "$build_old_libs" = yes; then - write_oldobj=\'${3}\' - else - write_oldobj=none - fi - - $opt_dry_run || { - cat >${write_libobj}T </dev/null` - if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then - func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | - $SED -e "$lt_sed_naive_backslashify"` - else - func_convert_core_file_wine_to_w32_result= - fi - fi -} -# end: func_convert_core_file_wine_to_w32 - - -# func_convert_core_path_wine_to_w32 ARG -# Helper function used by path conversion functions when $build is *nix, and -# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly -# configured wine environment available, with the winepath program in $build's -# $PATH. Assumes ARG has no leading or trailing path separator characters. -# -# ARG is path to be converted from $build format to win32. -# Result is available in $func_convert_core_path_wine_to_w32_result. -# Unconvertible file (directory) names in ARG are skipped; if no directory names -# are convertible, then the result may be empty. -func_convert_core_path_wine_to_w32 () -{ - $opt_debug - # unfortunately, winepath doesn't convert paths, only file names - func_convert_core_path_wine_to_w32_result="" - if test -n "$1"; then - oldIFS=$IFS - IFS=: - for func_convert_core_path_wine_to_w32_f in $1; do - IFS=$oldIFS - func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" - if test -n "$func_convert_core_file_wine_to_w32_result" ; then - if test -z "$func_convert_core_path_wine_to_w32_result"; then - func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" - else - func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" - fi - fi - done - IFS=$oldIFS - fi -} -# end: func_convert_core_path_wine_to_w32 - - -# func_cygpath ARGS... -# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when -# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) -# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or -# (2), returns the Cygwin file name or path in func_cygpath_result (input -# file name or path is assumed to be in w32 format, as previously converted -# from $build's *nix or MSYS format). In case (3), returns the w32 file name -# or path in func_cygpath_result (input file name or path is assumed to be in -# Cygwin format). Returns an empty string on error. -# -# ARGS are passed to cygpath, with the last one being the file name or path to -# be converted. -# -# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH -# environment variable; do not put it in $PATH. -func_cygpath () -{ - $opt_debug - if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then - func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` - if test "$?" -ne 0; then - # on failure, ensure result is empty - func_cygpath_result= - fi - else - func_cygpath_result= - func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" - fi -} -#end: func_cygpath - - -# func_convert_core_msys_to_w32 ARG -# Convert file name or path ARG from MSYS format to w32 format. Return -# result in func_convert_core_msys_to_w32_result. -func_convert_core_msys_to_w32 () -{ - $opt_debug - # awkward: cmd appends spaces to result - func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | - $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` -} -#end: func_convert_core_msys_to_w32 - - -# func_convert_file_check ARG1 ARG2 -# Verify that ARG1 (a file name in $build format) was converted to $host -# format in ARG2. Otherwise, emit an error message, but continue (resetting -# func_to_host_file_result to ARG1). -func_convert_file_check () -{ - $opt_debug - if test -z "$2" && test -n "$1" ; then - func_error "Could not determine host file name corresponding to" - func_error " \`$1'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback: - func_to_host_file_result="$1" - fi -} -# end func_convert_file_check - - -# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH -# Verify that FROM_PATH (a path in $build format) was converted to $host -# format in TO_PATH. Otherwise, emit an error message, but continue, resetting -# func_to_host_file_result to a simplistic fallback value (see below). -func_convert_path_check () -{ - $opt_debug - if test -z "$4" && test -n "$3"; then - func_error "Could not determine the host path corresponding to" - func_error " \`$3'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback. This is a deliberately simplistic "conversion" and - # should not be "improved". See libtool.info. - if test "x$1" != "x$2"; then - lt_replace_pathsep_chars="s|$1|$2|g" - func_to_host_path_result=`echo "$3" | - $SED -e "$lt_replace_pathsep_chars"` - else - func_to_host_path_result="$3" - fi - fi -} -# end func_convert_path_check - - -# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG -# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT -# and appending REPL if ORIG matches BACKPAT. -func_convert_path_front_back_pathsep () -{ - $opt_debug - case $4 in - $1 ) func_to_host_path_result="$3$func_to_host_path_result" - ;; - esac - case $4 in - $2 ) func_append func_to_host_path_result "$3" - ;; - esac -} -# end func_convert_path_front_back_pathsep - - -################################################## -# $build to $host FILE NAME CONVERSION FUNCTIONS # -################################################## -# invoked via `$to_host_file_cmd ARG' -# -# In each case, ARG is the path to be converted from $build to $host format. -# Result will be available in $func_to_host_file_result. - - -# func_to_host_file ARG -# Converts the file name ARG from $build format to $host format. Return result -# in func_to_host_file_result. -func_to_host_file () -{ - $opt_debug - $to_host_file_cmd "$1" -} -# end func_to_host_file - - -# func_to_tool_file ARG LAZY -# converts the file name ARG from $build format to toolchain format. Return -# result in func_to_tool_file_result. If the conversion in use is listed -# in (the comma separated) LAZY, no conversion takes place. -func_to_tool_file () -{ - $opt_debug - case ,$2, in - *,"$to_tool_file_cmd",*) - func_to_tool_file_result=$1 - ;; - *) - $to_tool_file_cmd "$1" - func_to_tool_file_result=$func_to_host_file_result - ;; - esac -} -# end func_to_tool_file - - -# func_convert_file_noop ARG -# Copy ARG to func_to_host_file_result. -func_convert_file_noop () -{ - func_to_host_file_result="$1" -} -# end func_convert_file_noop - - -# func_convert_file_msys_to_w32 ARG -# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic -# conversion to w32 is not available inside the cwrapper. Returns result in -# func_to_host_file_result. -func_convert_file_msys_to_w32 () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - func_convert_core_msys_to_w32 "$1" - func_to_host_file_result="$func_convert_core_msys_to_w32_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_msys_to_w32 - - -# func_convert_file_cygwin_to_w32 ARG -# Convert file name ARG from Cygwin to w32 format. Returns result in -# func_to_host_file_result. -func_convert_file_cygwin_to_w32 () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - # because $build is cygwin, we call "the" cygpath in $PATH; no need to use - # LT_CYGPATH in this case. - func_to_host_file_result=`cygpath -m "$1"` - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_cygwin_to_w32 - - -# func_convert_file_nix_to_w32 ARG -# Convert file name ARG from *nix to w32 format. Requires a wine environment -# and a working winepath. Returns result in func_to_host_file_result. -func_convert_file_nix_to_w32 () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - func_convert_core_file_wine_to_w32 "$1" - func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_nix_to_w32 - - -# func_convert_file_msys_to_cygwin ARG -# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. -# Returns result in func_to_host_file_result. -func_convert_file_msys_to_cygwin () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - func_convert_core_msys_to_w32 "$1" - func_cygpath -u "$func_convert_core_msys_to_w32_result" - func_to_host_file_result="$func_cygpath_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_msys_to_cygwin - - -# func_convert_file_nix_to_cygwin ARG -# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed -# in a wine environment, working winepath, and LT_CYGPATH set. Returns result -# in func_to_host_file_result. -func_convert_file_nix_to_cygwin () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. - func_convert_core_file_wine_to_w32 "$1" - func_cygpath -u "$func_convert_core_file_wine_to_w32_result" - func_to_host_file_result="$func_cygpath_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_nix_to_cygwin - - -############################################# -# $build to $host PATH CONVERSION FUNCTIONS # -############################################# -# invoked via `$to_host_path_cmd ARG' -# -# In each case, ARG is the path to be converted from $build to $host format. -# The result will be available in $func_to_host_path_result. -# -# Path separators are also converted from $build format to $host format. If -# ARG begins or ends with a path separator character, it is preserved (but -# converted to $host format) on output. -# -# All path conversion functions are named using the following convention: -# file name conversion function : func_convert_file_X_to_Y () -# path conversion function : func_convert_path_X_to_Y () -# where, for any given $build/$host combination the 'X_to_Y' value is the -# same. If conversion functions are added for new $build/$host combinations, -# the two new functions must follow this pattern, or func_init_to_host_path_cmd -# will break. - - -# func_init_to_host_path_cmd -# Ensures that function "pointer" variable $to_host_path_cmd is set to the -# appropriate value, based on the value of $to_host_file_cmd. -to_host_path_cmd= -func_init_to_host_path_cmd () -{ - $opt_debug - if test -z "$to_host_path_cmd"; then - func_stripname 'func_convert_file_' '' "$to_host_file_cmd" - to_host_path_cmd="func_convert_path_${func_stripname_result}" - fi -} - - -# func_to_host_path ARG -# Converts the path ARG from $build format to $host format. Return result -# in func_to_host_path_result. -func_to_host_path () -{ - $opt_debug - func_init_to_host_path_cmd - $to_host_path_cmd "$1" -} -# end func_to_host_path - - -# func_convert_path_noop ARG -# Copy ARG to func_to_host_path_result. -func_convert_path_noop () -{ - func_to_host_path_result="$1" -} -# end func_convert_path_noop - - -# func_convert_path_msys_to_w32 ARG -# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic -# conversion to w32 is not available inside the cwrapper. Returns result in -# func_to_host_path_result. -func_convert_path_msys_to_w32 () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # Remove leading and trailing path separator characters from ARG. MSYS - # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; - # and winepath ignores them completely. - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" - func_to_host_path_result="$func_convert_core_msys_to_w32_result" - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_msys_to_w32 - - -# func_convert_path_cygwin_to_w32 ARG -# Convert path ARG from Cygwin to w32 format. Returns result in -# func_to_host_file_result. -func_convert_path_cygwin_to_w32 () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_cygwin_to_w32 - - -# func_convert_path_nix_to_w32 ARG -# Convert path ARG from *nix to w32 format. Requires a wine environment and -# a working winepath. Returns result in func_to_host_file_result. -func_convert_path_nix_to_w32 () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" - func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_nix_to_w32 - - -# func_convert_path_msys_to_cygwin ARG -# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. -# Returns result in func_to_host_file_result. -func_convert_path_msys_to_cygwin () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" - func_cygpath -u -p "$func_convert_core_msys_to_w32_result" - func_to_host_path_result="$func_cygpath_result" - func_convert_path_check : : \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" : "$1" - fi -} -# end func_convert_path_msys_to_cygwin - - -# func_convert_path_nix_to_cygwin ARG -# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a -# a wine environment, working winepath, and LT_CYGPATH set. Returns result in -# func_to_host_file_result. -func_convert_path_nix_to_cygwin () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # Remove leading and trailing path separator characters from - # ARG. msys behavior is inconsistent here, cygpath turns them - # into '.;' and ';.', and winepath ignores them completely. - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" - func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" - func_to_host_path_result="$func_cygpath_result" - func_convert_path_check : : \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" : "$1" - fi -} -# end func_convert_path_nix_to_cygwin - - -# func_mode_compile arg... -func_mode_compile () -{ - $opt_debug - # Get the compilation command and the source file. - base_compile= - srcfile="$nonopt" # always keep a non-empty value in "srcfile" - suppress_opt=yes - suppress_output= - arg_mode=normal - libobj= - later= - pie_flag= - - for arg - do - case $arg_mode in - arg ) - # do not "continue". Instead, add this to base_compile - lastarg="$arg" - arg_mode=normal - ;; - - target ) - libobj="$arg" - arg_mode=normal - continue - ;; - - normal ) - # Accept any command-line options. - case $arg in - -o) - test -n "$libobj" && \ - func_fatal_error "you cannot specify \`-o' more than once" - arg_mode=target - continue - ;; - - -pie | -fpie | -fPIE) - func_append pie_flag " $arg" - continue - ;; - - -shared | -static | -prefer-pic | -prefer-non-pic) - func_append later " $arg" - continue - ;; - - -no-suppress) - suppress_opt=no - continue - ;; - - -Xcompiler) - arg_mode=arg # the next one goes into the "base_compile" arg list - continue # The current "srcfile" will either be retained or - ;; # replaced later. I would guess that would be a bug. - - -Wc,*) - func_stripname '-Wc,' '' "$arg" - args=$func_stripname_result - lastarg= - save_ifs="$IFS"; IFS=',' - for arg in $args; do - IFS="$save_ifs" - func_append_quoted lastarg "$arg" - done - IFS="$save_ifs" - func_stripname ' ' '' "$lastarg" - lastarg=$func_stripname_result - - # Add the arguments to base_compile. - func_append base_compile " $lastarg" - continue - ;; - - *) - # Accept the current argument as the source file. - # The previous "srcfile" becomes the current argument. - # - lastarg="$srcfile" - srcfile="$arg" - ;; - esac # case $arg - ;; - esac # case $arg_mode - - # Aesthetically quote the previous argument. - func_append_quoted base_compile "$lastarg" - done # for arg - - case $arg_mode in - arg) - func_fatal_error "you must specify an argument for -Xcompile" - ;; - target) - func_fatal_error "you must specify a target with \`-o'" - ;; - *) - # Get the name of the library object. - test -z "$libobj" && { - func_basename "$srcfile" - libobj="$func_basename_result" - } - ;; - esac - - # Recognize several different file suffixes. - # If the user specifies -o file.o, it is replaced with file.lo - case $libobj in - *.[cCFSifmso] | \ - *.ada | *.adb | *.ads | *.asm | \ - *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ - *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) - func_xform "$libobj" - libobj=$func_xform_result - ;; - esac - - case $libobj in - *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; - *) - func_fatal_error "cannot determine name of library object from \`$libobj'" - ;; - esac - - func_infer_tag $base_compile - - for arg in $later; do - case $arg in - -shared) - test "$build_libtool_libs" != yes && \ - func_fatal_configuration "can not build a shared library" - build_old_libs=no - continue - ;; - - -static) - build_libtool_libs=no - build_old_libs=yes - continue - ;; - - -prefer-pic) - pic_mode=yes - continue - ;; - - -prefer-non-pic) - pic_mode=no - continue - ;; - esac - done - - func_quote_for_eval "$libobj" - test "X$libobj" != "X$func_quote_for_eval_result" \ - && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ - && func_warning "libobj name \`$libobj' may not contain shell special characters." - func_dirname_and_basename "$obj" "/" "" - objname="$func_basename_result" - xdir="$func_dirname_result" - lobj=${xdir}$objdir/$objname - - test -z "$base_compile" && \ - func_fatal_help "you must specify a compilation command" - - # Delete any leftover library objects. - if test "$build_old_libs" = yes; then - removelist="$obj $lobj $libobj ${libobj}T" - else - removelist="$lobj $libobj ${libobj}T" - fi - - # On Cygwin there's no "real" PIC flag so we must build both object types - case $host_os in - cygwin* | mingw* | pw32* | os2* | cegcc*) - pic_mode=default - ;; - esac - if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then - # non-PIC code in shared libraries is not supported - pic_mode=default - fi - - # Calculate the filename of the output object if compiler does - # not support -o with -c - if test "$compiler_c_o" = no; then - output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} - lockfile="$output_obj.lock" - else - output_obj= - need_locks=no - lockfile= - fi - - # Lock this critical section if it is needed - # We use this script file to make the link, it avoids creating a new file - if test "$need_locks" = yes; then - until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do - func_echo "Waiting for $lockfile to be removed" - sleep 2 - done - elif test "$need_locks" = warn; then - if test -f "$lockfile"; then - $ECHO "\ -*** ERROR, $lockfile exists and contains: -`cat $lockfile 2>/dev/null` - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - func_append removelist " $output_obj" - $ECHO "$srcfile" > "$lockfile" - fi - - $opt_dry_run || $RM $removelist - func_append removelist " $lockfile" - trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 - - func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 - srcfile=$func_to_tool_file_result - func_quote_for_eval "$srcfile" - qsrcfile=$func_quote_for_eval_result - - # Only build a PIC object if we are building libtool libraries. - if test "$build_libtool_libs" = yes; then - # Without this assignment, base_compile gets emptied. - fbsd_hideous_sh_bug=$base_compile - - if test "$pic_mode" != no; then - command="$base_compile $qsrcfile $pic_flag" - else - # Don't build PIC code - command="$base_compile $qsrcfile" - fi - - func_mkdir_p "$xdir$objdir" - - if test -z "$output_obj"; then - # Place PIC objects in $objdir - func_append command " -o $lobj" - fi - - func_show_eval_locale "$command" \ - 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' - - if test "$need_locks" = warn && - test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then - $ECHO "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - - # Just move the object if needed, then go on to compile the next one - if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then - func_show_eval '$MV "$output_obj" "$lobj"' \ - 'error=$?; $opt_dry_run || $RM $removelist; exit $error' - fi - - # Allow error messages only from the first compilation. - if test "$suppress_opt" = yes; then - suppress_output=' >/dev/null 2>&1' - fi - fi - - # Only build a position-dependent object if we build old libraries. - if test "$build_old_libs" = yes; then - if test "$pic_mode" != yes; then - # Don't build PIC code - command="$base_compile $qsrcfile$pie_flag" - else - command="$base_compile $qsrcfile $pic_flag" - fi - if test "$compiler_c_o" = yes; then - func_append command " -o $obj" - fi - - # Suppress compiler output if we already did a PIC compilation. - func_append command "$suppress_output" - func_show_eval_locale "$command" \ - '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' - - if test "$need_locks" = warn && - test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then - $ECHO "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - - # Just move the object if needed - if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then - func_show_eval '$MV "$output_obj" "$obj"' \ - 'error=$?; $opt_dry_run || $RM $removelist; exit $error' - fi - fi - - $opt_dry_run || { - func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" - - # Unlock the critical section if it was locked - if test "$need_locks" != no; then - removelist=$lockfile - $RM "$lockfile" - fi - } - - exit $EXIT_SUCCESS -} - -$opt_help || { - test "$opt_mode" = compile && func_mode_compile ${1+"$@"} -} - -func_mode_help () -{ - # We need to display help for each of the modes. - case $opt_mode in - "") - # Generic help is extracted from the usage comments - # at the start of this file. - func_help - ;; - - clean) - $ECHO \ -"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... - -Remove files from the build directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed -to RM. - -If FILE is a libtool library, object or program, all the files associated -with it are deleted. Otherwise, only FILE itself is deleted using RM." - ;; - - compile) - $ECHO \ -"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE - -Compile a source file into a libtool library object. - -This mode accepts the following additional options: - - -o OUTPUT-FILE set the output file name to OUTPUT-FILE - -no-suppress do not suppress compiler output for multiple passes - -prefer-pic try to build PIC objects only - -prefer-non-pic try to build non-PIC objects only - -shared do not build a \`.o' file suitable for static linking - -static only build a \`.o' file suitable for static linking - -Wc,FLAG pass FLAG directly to the compiler - -COMPILE-COMMAND is a command to be used in creating a \`standard' object file -from the given SOURCEFILE. - -The output file name is determined by removing the directory component from -SOURCEFILE, then substituting the C source code suffix \`.c' with the -library object suffix, \`.lo'." - ;; - - execute) - $ECHO \ -"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... - -Automatically set library path, then run a program. - -This mode accepts the following additional options: - - -dlopen FILE add the directory containing FILE to the library path - -This mode sets the library path environment variable according to \`-dlopen' -flags. - -If any of the ARGS are libtool executable wrappers, then they are translated -into their corresponding uninstalled binary, and any of their required library -directories are added to the library path. - -Then, COMMAND is executed, with ARGS as arguments." - ;; - - finish) - $ECHO \ -"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... - -Complete the installation of libtool libraries. - -Each LIBDIR is a directory that contains libtool libraries. - -The commands that this mode executes may require superuser privileges. Use -the \`--dry-run' option if you just want to see what would be executed." - ;; - - install) - $ECHO \ -"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... - -Install executables or libraries. - -INSTALL-COMMAND is the installation command. The first component should be -either the \`install' or \`cp' program. - -The following components of INSTALL-COMMAND are treated specially: - - -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation - -The rest of the components are interpreted as arguments to that command (only -BSD-compatible install options are recognized)." - ;; - - link) - $ECHO \ -"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... - -Link object files or libraries together to form another library, or to -create an executable program. - -LINK-COMMAND is a command using the C compiler that you would use to create -a program from several object files. - -The following components of LINK-COMMAND are treated specially: - - -all-static do not do any dynamic linking at all - -avoid-version do not add a version suffix if possible - -bindir BINDIR specify path to binaries directory (for systems where - libraries must be found in the PATH setting at runtime) - -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime - -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols - -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) - -export-symbols SYMFILE - try to export only the symbols listed in SYMFILE - -export-symbols-regex REGEX - try to export only the symbols matching REGEX - -LLIBDIR search LIBDIR for required installed libraries - -lNAME OUTPUT-FILE requires the installed library libNAME - -module build a library that can dlopened - -no-fast-install disable the fast-install mode - -no-install link a not-installable executable - -no-undefined declare that a library does not refer to external symbols - -o OUTPUT-FILE create OUTPUT-FILE from the specified objects - -objectlist FILE Use a list of object files found in FILE to specify objects - -precious-files-regex REGEX - don't remove output files matching REGEX - -release RELEASE specify package release information - -rpath LIBDIR the created library will eventually be installed in LIBDIR - -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries - -shared only do dynamic linking of libtool libraries - -shrext SUFFIX override the standard shared library file extension - -static do not do any dynamic linking of uninstalled libtool libraries - -static-libtool-libs - do not do any dynamic linking of libtool libraries - -version-info CURRENT[:REVISION[:AGE]] - specify library version info [each variable defaults to 0] - -weak LIBNAME declare that the target provides the LIBNAME interface - -Wc,FLAG - -Xcompiler FLAG pass linker-specific FLAG directly to the compiler - -Wl,FLAG - -Xlinker FLAG pass linker-specific FLAG directly to the linker - -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) - -All other options (arguments beginning with \`-') are ignored. - -Every other argument is treated as a filename. Files ending in \`.la' are -treated as uninstalled libtool libraries, other files are standard or library -object files. - -If the OUTPUT-FILE ends in \`.la', then a libtool library is created, -only library objects (\`.lo' files) may be specified, and \`-rpath' is -required, except when creating a convenience library. - -If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created -using \`ar' and \`ranlib', or on Windows using \`lib'. - -If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file -is created, otherwise an executable program is created." - ;; - - uninstall) - $ECHO \ -"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... - -Remove libraries from an installation directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed -to RM. - -If FILE is a libtool library, all the files associated with it are deleted. -Otherwise, only FILE itself is deleted using RM." - ;; - - *) - func_fatal_help "invalid operation mode \`$opt_mode'" - ;; - esac - - echo - $ECHO "Try \`$progname --help' for more information about other modes." -} - -# Now that we've collected a possible --mode arg, show help if necessary -if $opt_help; then - if test "$opt_help" = :; then - func_mode_help - else - { - func_help noexit - for opt_mode in compile link execute install finish uninstall clean; do - func_mode_help - done - } | sed -n '1p; 2,$s/^Usage:/ or: /p' - { - func_help noexit - for opt_mode in compile link execute install finish uninstall clean; do - echo - func_mode_help - done - } | - sed '1d - /^When reporting/,/^Report/{ - H - d - } - $x - /information about other modes/d - /more detailed .*MODE/d - s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' - fi - exit $? -fi - - -# func_mode_execute arg... -func_mode_execute () -{ - $opt_debug - # The first argument is the command name. - cmd="$nonopt" - test -z "$cmd" && \ - func_fatal_help "you must specify a COMMAND" - - # Handle -dlopen flags immediately. - for file in $opt_dlopen; do - test -f "$file" \ - || func_fatal_help "\`$file' is not a file" - - dir= - case $file in - *.la) - func_resolve_sysroot "$file" - file=$func_resolve_sysroot_result - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$file" \ - || func_fatal_help "\`$lib' is not a valid libtool archive" - - # Read the libtool library. - dlname= - library_names= - func_source "$file" - - # Skip this library if it cannot be dlopened. - if test -z "$dlname"; then - # Warn if it was a shared library. - test -n "$library_names" && \ - func_warning "\`$file' was not linked with \`-export-dynamic'" - continue - fi - - func_dirname "$file" "" "." - dir="$func_dirname_result" - - if test -f "$dir/$objdir/$dlname"; then - func_append dir "/$objdir" - else - if test ! -f "$dir/$dlname"; then - func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" - fi - fi - ;; - - *.lo) - # Just add the directory containing the .lo file. - func_dirname "$file" "" "." - dir="$func_dirname_result" - ;; - - *) - func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" - continue - ;; - esac - - # Get the absolute pathname. - absdir=`cd "$dir" && pwd` - test -n "$absdir" && dir="$absdir" - - # Now add the directory to shlibpath_var. - if eval "test -z \"\$$shlibpath_var\""; then - eval "$shlibpath_var=\"\$dir\"" - else - eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" - fi - done - - # This variable tells wrapper scripts just to set shlibpath_var - # rather than running their programs. - libtool_execute_magic="$magic" - - # Check if any of the arguments is a wrapper script. - args= - for file - do - case $file in - -* | *.la | *.lo ) ;; - *) - # Do a test to see if this is really a libtool program. - if func_ltwrapper_script_p "$file"; then - func_source "$file" - # Transform arg to wrapped name. - file="$progdir/$program" - elif func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - func_source "$func_ltwrapper_scriptname_result" - # Transform arg to wrapped name. - file="$progdir/$program" - fi - ;; - esac - # Quote arguments (to preserve shell metacharacters). - func_append_quoted args "$file" - done - - if test "X$opt_dry_run" = Xfalse; then - if test -n "$shlibpath_var"; then - # Export the shlibpath_var. - eval "export $shlibpath_var" - fi - - # Restore saved environment variables - for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES - do - eval "if test \"\${save_$lt_var+set}\" = set; then - $lt_var=\$save_$lt_var; export $lt_var - else - $lt_unset $lt_var - fi" - done - - # Now prepare to actually exec the command. - exec_cmd="\$cmd$args" - else - # Display what would be done. - if test -n "$shlibpath_var"; then - eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" - echo "export $shlibpath_var" - fi - $ECHO "$cmd$args" - exit $EXIT_SUCCESS - fi -} - -test "$opt_mode" = execute && func_mode_execute ${1+"$@"} - - -# func_mode_finish arg... -func_mode_finish () -{ - $opt_debug - libs= - libdirs= - admincmds= - - for opt in "$nonopt" ${1+"$@"} - do - if test -d "$opt"; then - func_append libdirs " $opt" - - elif test -f "$opt"; then - if func_lalib_unsafe_p "$opt"; then - func_append libs " $opt" - else - func_warning "\`$opt' is not a valid libtool archive" - fi - - else - func_fatal_error "invalid argument \`$opt'" - fi - done - - if test -n "$libs"; then - if test -n "$lt_sysroot"; then - sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` - sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" - else - sysroot_cmd= - fi - - # Remove sysroot references - if $opt_dry_run; then - for lib in $libs; do - echo "removing references to $lt_sysroot and \`=' prefixes from $lib" - done - else - tmpdir=`func_mktempdir` - for lib in $libs; do - sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ - > $tmpdir/tmp-la - mv -f $tmpdir/tmp-la $lib - done - ${RM}r "$tmpdir" - fi - fi - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - for libdir in $libdirs; do - if test -n "$finish_cmds"; then - # Do each command in the finish commands. - func_execute_cmds "$finish_cmds" 'admincmds="$admincmds -'"$cmd"'"' - fi - if test -n "$finish_eval"; then - # Do the single finish_eval. - eval cmds=\"$finish_eval\" - $opt_dry_run || eval "$cmds" || func_append admincmds " - $cmds" - fi - done - fi - - # Exit here if they wanted silent mode. - $opt_silent && exit $EXIT_SUCCESS - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - echo "----------------------------------------------------------------------" - echo "Libraries have been installed in:" - for libdir in $libdirs; do - $ECHO " $libdir" - done - echo - echo "If you ever happen to want to link against installed libraries" - echo "in a given directory, LIBDIR, you must either use libtool, and" - echo "specify the full pathname of the library, or use the \`-LLIBDIR'" - echo "flag during linking and do at least one of the following:" - if test -n "$shlibpath_var"; then - echo " - add LIBDIR to the \`$shlibpath_var' environment variable" - echo " during execution" - fi - if test -n "$runpath_var"; then - echo " - add LIBDIR to the \`$runpath_var' environment variable" - echo " during linking" - fi - if test -n "$hardcode_libdir_flag_spec"; then - libdir=LIBDIR - eval flag=\"$hardcode_libdir_flag_spec\" - - $ECHO " - use the \`$flag' linker flag" - fi - if test -n "$admincmds"; then - $ECHO " - have your system administrator run these commands:$admincmds" - fi - if test -f /etc/ld.so.conf; then - echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" - fi - echo - - echo "See any operating system documentation about shared libraries for" - case $host in - solaris2.[6789]|solaris2.1[0-9]) - echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" - echo "pages." - ;; - *) - echo "more information, such as the ld(1) and ld.so(8) manual pages." - ;; - esac - echo "----------------------------------------------------------------------" - fi - exit $EXIT_SUCCESS -} - -test "$opt_mode" = finish && func_mode_finish ${1+"$@"} - - -# func_mode_install arg... -func_mode_install () -{ - $opt_debug - # There may be an optional sh(1) argument at the beginning of - # install_prog (especially on Windows NT). - if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || - # Allow the use of GNU shtool's install command. - case $nonopt in *shtool*) :;; *) false;; esac; then - # Aesthetically quote it. - func_quote_for_eval "$nonopt" - install_prog="$func_quote_for_eval_result " - arg=$1 - shift - else - install_prog= - arg=$nonopt - fi - - # The real first argument should be the name of the installation program. - # Aesthetically quote it. - func_quote_for_eval "$arg" - func_append install_prog "$func_quote_for_eval_result" - install_shared_prog=$install_prog - case " $install_prog " in - *[\\\ /]cp\ *) install_cp=: ;; - *) install_cp=false ;; - esac - - # We need to accept at least all the BSD install flags. - dest= - files= - opts= - prev= - install_type= - isdir=no - stripme= - no_mode=: - for arg - do - arg2= - if test -n "$dest"; then - func_append files " $dest" - dest=$arg - continue - fi - - case $arg in - -d) isdir=yes ;; - -f) - if $install_cp; then :; else - prev=$arg - fi - ;; - -g | -m | -o) - prev=$arg - ;; - -s) - stripme=" -s" - continue - ;; - -*) - ;; - *) - # If the previous option needed an argument, then skip it. - if test -n "$prev"; then - if test "x$prev" = x-m && test -n "$install_override_mode"; then - arg2=$install_override_mode - no_mode=false - fi - prev= - else - dest=$arg - continue - fi - ;; - esac - - # Aesthetically quote the argument. - func_quote_for_eval "$arg" - func_append install_prog " $func_quote_for_eval_result" - if test -n "$arg2"; then - func_quote_for_eval "$arg2" - fi - func_append install_shared_prog " $func_quote_for_eval_result" - done - - test -z "$install_prog" && \ - func_fatal_help "you must specify an install program" - - test -n "$prev" && \ - func_fatal_help "the \`$prev' option requires an argument" - - if test -n "$install_override_mode" && $no_mode; then - if $install_cp; then :; else - func_quote_for_eval "$install_override_mode" - func_append install_shared_prog " -m $func_quote_for_eval_result" - fi - fi - - if test -z "$files"; then - if test -z "$dest"; then - func_fatal_help "no file or destination specified" - else - func_fatal_help "you must specify a destination" - fi - fi - - # Strip any trailing slash from the destination. - func_stripname '' '/' "$dest" - dest=$func_stripname_result - - # Check to see that the destination is a directory. - test -d "$dest" && isdir=yes - if test "$isdir" = yes; then - destdir="$dest" - destname= - else - func_dirname_and_basename "$dest" "" "." - destdir="$func_dirname_result" - destname="$func_basename_result" - - # Not a directory, so check to see that there is only one file specified. - set dummy $files; shift - test "$#" -gt 1 && \ - func_fatal_help "\`$dest' is not a directory" - fi - case $destdir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - for file in $files; do - case $file in - *.lo) ;; - *) - func_fatal_help "\`$destdir' must be an absolute directory name" - ;; - esac - done - ;; - esac - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic="$magic" - - staticlibs= - future_libdirs= - current_libdirs= - for file in $files; do - - # Do each installation. - case $file in - *.$libext) - # Do the static libraries later. - func_append staticlibs " $file" - ;; - - *.la) - func_resolve_sysroot "$file" - file=$func_resolve_sysroot_result - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$file" \ - || func_fatal_help "\`$file' is not a valid libtool archive" - - library_names= - old_library= - relink_command= - func_source "$file" - - # Add the libdir to current_libdirs if it is the destination. - if test "X$destdir" = "X$libdir"; then - case "$current_libdirs " in - *" $libdir "*) ;; - *) func_append current_libdirs " $libdir" ;; - esac - else - # Note the libdir as a future libdir. - case "$future_libdirs " in - *" $libdir "*) ;; - *) func_append future_libdirs " $libdir" ;; - esac - fi - - func_dirname "$file" "/" "" - dir="$func_dirname_result" - func_append dir "$objdir" - - if test -n "$relink_command"; then - # Determine the prefix the user has applied to our future dir. - inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` - - # Don't allow the user to place us outside of our expected - # location b/c this prevents finding dependent libraries that - # are installed to the same prefix. - # At present, this check doesn't affect windows .dll's that - # are installed into $libdir/../bin (currently, that works fine) - # but it's something to keep an eye on. - test "$inst_prefix_dir" = "$destdir" && \ - func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" - - if test -n "$inst_prefix_dir"; then - # Stick the inst_prefix_dir data into the link command. - relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` - else - relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` - fi - - func_warning "relinking \`$file'" - func_show_eval "$relink_command" \ - 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' - fi - - # See the names of the shared library. - set dummy $library_names; shift - if test -n "$1"; then - realname="$1" - shift - - srcname="$realname" - test -n "$relink_command" && srcname="$realname"T - - # Install the shared library and build the symlinks. - func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ - 'exit $?' - tstripme="$stripme" - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - case $realname in - *.dll.a) - tstripme="" - ;; - esac - ;; - esac - if test -n "$tstripme" && test -n "$striplib"; then - func_show_eval "$striplib $destdir/$realname" 'exit $?' - fi - - if test "$#" -gt 0; then - # Delete the old symlinks, and create new ones. - # Try `ln -sf' first, because the `ln' binary might depend on - # the symlink we replace! Solaris /bin/ln does not understand -f, - # so we also need to try rm && ln -s. - for linkname - do - test "$linkname" != "$realname" \ - && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" - done - fi - - # Do each command in the postinstall commands. - lib="$destdir/$realname" - func_execute_cmds "$postinstall_cmds" 'exit $?' - fi - - # Install the pseudo-library for information purposes. - func_basename "$file" - name="$func_basename_result" - instname="$dir/$name"i - func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' - - # Maybe install the static library, too. - test -n "$old_library" && func_append staticlibs " $dir/$old_library" - ;; - - *.lo) - # Install (i.e. copy) a libtool object. - - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - func_basename "$file" - destfile="$func_basename_result" - destfile="$destdir/$destfile" - fi - - # Deduce the name of the destination old-style object file. - case $destfile in - *.lo) - func_lo2o "$destfile" - staticdest=$func_lo2o_result - ;; - *.$objext) - staticdest="$destfile" - destfile= - ;; - *) - func_fatal_help "cannot copy a libtool object to \`$destfile'" - ;; - esac - - # Install the libtool object if requested. - test -n "$destfile" && \ - func_show_eval "$install_prog $file $destfile" 'exit $?' - - # Install the old object if enabled. - if test "$build_old_libs" = yes; then - # Deduce the name of the old-style object file. - func_lo2o "$file" - staticobj=$func_lo2o_result - func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' - fi - exit $EXIT_SUCCESS - ;; - - *) - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - func_basename "$file" - destfile="$func_basename_result" - destfile="$destdir/$destfile" - fi - - # If the file is missing, and there is a .exe on the end, strip it - # because it is most likely a libtool script we actually want to - # install - stripped_ext="" - case $file in - *.exe) - if test ! -f "$file"; then - func_stripname '' '.exe' "$file" - file=$func_stripname_result - stripped_ext=".exe" - fi - ;; - esac - - # Do a test to see if this is really a libtool program. - case $host in - *cygwin* | *mingw*) - if func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - wrapper=$func_ltwrapper_scriptname_result - else - func_stripname '' '.exe' "$file" - wrapper=$func_stripname_result - fi - ;; - *) - wrapper=$file - ;; - esac - if func_ltwrapper_script_p "$wrapper"; then - notinst_deplibs= - relink_command= - - func_source "$wrapper" - - # Check the variables that should have been set. - test -z "$generated_by_libtool_version" && \ - func_fatal_error "invalid libtool wrapper script \`$wrapper'" - - finalize=yes - for lib in $notinst_deplibs; do - # Check to see that each library is installed. - libdir= - if test -f "$lib"; then - func_source "$lib" - fi - libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test - if test -n "$libdir" && test ! -f "$libfile"; then - func_warning "\`$lib' has not been installed in \`$libdir'" - finalize=no - fi - done - - relink_command= - func_source "$wrapper" - - outputname= - if test "$fast_install" = no && test -n "$relink_command"; then - $opt_dry_run || { - if test "$finalize" = yes; then - tmpdir=`func_mktempdir` - func_basename "$file$stripped_ext" - file="$func_basename_result" - outputname="$tmpdir/$file" - # Replace the output file specification. - relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` - - $opt_silent || { - func_quote_for_expand "$relink_command" - eval "func_echo $func_quote_for_expand_result" - } - if eval "$relink_command"; then : - else - func_error "error: relink \`$file' with the above command before installing it" - $opt_dry_run || ${RM}r "$tmpdir" - continue - fi - file="$outputname" - else - func_warning "cannot relink \`$file'" - fi - } - else - # Install the binary that we compiled earlier. - file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` - fi - fi - - # remove .exe since cygwin /usr/bin/install will append another - # one anyway - case $install_prog,$host in - */usr/bin/install*,*cygwin*) - case $file:$destfile in - *.exe:*.exe) - # this is ok - ;; - *.exe:*) - destfile=$destfile.exe - ;; - *:*.exe) - func_stripname '' '.exe' "$destfile" - destfile=$func_stripname_result - ;; - esac - ;; - esac - func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' - $opt_dry_run || if test -n "$outputname"; then - ${RM}r "$tmpdir" - fi - ;; - esac - done - - for file in $staticlibs; do - func_basename "$file" - name="$func_basename_result" - - # Set up the ranlib parameters. - oldlib="$destdir/$name" - func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 - tool_oldlib=$func_to_tool_file_result - - func_show_eval "$install_prog \$file \$oldlib" 'exit $?' - - if test -n "$stripme" && test -n "$old_striplib"; then - func_show_eval "$old_striplib $tool_oldlib" 'exit $?' - fi - - # Do each command in the postinstall commands. - func_execute_cmds "$old_postinstall_cmds" 'exit $?' - done - - test -n "$future_libdirs" && \ - func_warning "remember to run \`$progname --finish$future_libdirs'" - - if test -n "$current_libdirs"; then - # Maybe just do a dry run. - $opt_dry_run && current_libdirs=" -n$current_libdirs" - exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' - else - exit $EXIT_SUCCESS - fi -} - -test "$opt_mode" = install && func_mode_install ${1+"$@"} - - -# func_generate_dlsyms outputname originator pic_p -# Extract symbols from dlprefiles and create ${outputname}S.o with -# a dlpreopen symbol table. -func_generate_dlsyms () -{ - $opt_debug - my_outputname="$1" - my_originator="$2" - my_pic_p="${3-no}" - my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` - my_dlsyms= - - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - if test -n "$NM" && test -n "$global_symbol_pipe"; then - my_dlsyms="${my_outputname}S.c" - else - func_error "not configured to extract global symbols from dlpreopened files" - fi - fi - - if test -n "$my_dlsyms"; then - case $my_dlsyms in - "") ;; - *.c) - # Discover the nlist of each of the dlfiles. - nlist="$output_objdir/${my_outputname}.nm" - - func_show_eval "$RM $nlist ${nlist}S ${nlist}T" - - # Parse the name list into a source file. - func_verbose "creating $output_objdir/$my_dlsyms" - - $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ -/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ -/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ - -#ifdef __cplusplus -extern \"C\" { -#endif - -#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) -#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" -#endif - -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT_DLSYM_CONST -#else -# define LT_DLSYM_CONST const -#endif - -/* External symbol declarations for the compiler. */\ -" - - if test "$dlself" = yes; then - func_verbose "generating symbol list for \`$output'" - - $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" - - # Add our own program objects to the symbol list. - progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` - for progfile in $progfiles; do - func_to_tool_file "$progfile" func_convert_file_msys_to_w32 - func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" - $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" - done - - if test -n "$exclude_expsyms"; then - $opt_dry_run || { - eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - } - fi - - if test -n "$export_symbols_regex"; then - $opt_dry_run || { - eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - } - fi - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - export_symbols="$output_objdir/$outputname.exp" - $opt_dry_run || { - $RM $export_symbols - eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' - case $host in - *cygwin* | *mingw* | *cegcc* ) - eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' - ;; - esac - } - else - $opt_dry_run || { - eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' - eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - case $host in - *cygwin* | *mingw* | *cegcc* ) - eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' - ;; - esac - } - fi - fi - - for dlprefile in $dlprefiles; do - func_verbose "extracting global C symbols from \`$dlprefile'" - func_basename "$dlprefile" - name="$func_basename_result" - case $host in - *cygwin* | *mingw* | *cegcc* ) - # if an import library, we need to obtain dlname - if func_win32_import_lib_p "$dlprefile"; then - func_tr_sh "$dlprefile" - eval "curr_lafile=\$libfile_$func_tr_sh_result" - dlprefile_dlbasename="" - if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then - # Use subshell, to avoid clobbering current variable values - dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` - if test -n "$dlprefile_dlname" ; then - func_basename "$dlprefile_dlname" - dlprefile_dlbasename="$func_basename_result" - else - # no lafile. user explicitly requested -dlpreopen . - $sharedlib_from_linklib_cmd "$dlprefile" - dlprefile_dlbasename=$sharedlib_from_linklib_result - fi - fi - $opt_dry_run || { - if test -n "$dlprefile_dlbasename" ; then - eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' - else - func_warning "Could not compute DLL name from $name" - eval '$ECHO ": $name " >> "$nlist"' - fi - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | - $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" - } - else # not an import lib - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } - fi - ;; - *) - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } - ;; - esac - done - - $opt_dry_run || { - # Make sure we have at least an empty file. - test -f "$nlist" || : > "$nlist" - - if test -n "$exclude_expsyms"; then - $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T - $MV "$nlist"T "$nlist" - fi - - # Try sorting and uniquifying the output. - if $GREP -v "^: " < "$nlist" | - if sort -k 3 /dev/null 2>&1; then - sort -k 3 - else - sort +2 - fi | - uniq > "$nlist"S; then - : - else - $GREP -v "^: " < "$nlist" > "$nlist"S - fi - - if test -f "$nlist"S; then - eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' - else - echo '/* NONE */' >> "$output_objdir/$my_dlsyms" - fi - - echo >> "$output_objdir/$my_dlsyms" "\ - -/* The mapping between symbol names and symbols. */ -typedef struct { - const char *name; - void *address; -} lt_dlsymlist; -extern LT_DLSYM_CONST lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[]; -LT_DLSYM_CONST lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[] = -{\ - { \"$my_originator\", (void *) 0 }," - - case $need_lib_prefix in - no) - eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" - ;; - *) - eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" - ;; - esac - echo >> "$output_objdir/$my_dlsyms" "\ - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt_${my_prefix}_LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif\ -" - } # !$opt_dry_run - - pic_flag_for_symtable= - case "$compile_command " in - *" -static "*) ;; - *) - case $host in - # compiling the symbol table file with pic_flag works around - # a FreeBSD bug that causes programs to crash when -lm is - # linked before any other PIC object. But we must not use - # pic_flag when linking with -static. The problem exists in - # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. - *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) - pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; - *-*-hpux*) - pic_flag_for_symtable=" $pic_flag" ;; - *) - if test "X$my_pic_p" != Xno; then - pic_flag_for_symtable=" $pic_flag" - fi - ;; - esac - ;; - esac - symtab_cflags= - for arg in $LTCFLAGS; do - case $arg in - -pie | -fpie | -fPIE) ;; - *) func_append symtab_cflags " $arg" ;; - esac - done - - # Now compile the dynamic symbol file. - func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' - - # Clean up the generated files. - func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' - - # Transform the symbol file into the correct name. - symfileobj="$output_objdir/${my_outputname}S.$objext" - case $host in - *cygwin* | *mingw* | *cegcc* ) - if test -f "$output_objdir/$my_outputname.def"; then - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - else - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` - fi - ;; - *) - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` - ;; - esac - ;; - *) - func_fatal_error "unknown suffix for \`$my_dlsyms'" - ;; - esac - else - # We keep going just in case the user didn't refer to - # lt_preloaded_symbols. The linker will fail if global_symbol_pipe - # really was required. - - # Nullify the symbol file. - compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` - fi -} - -# func_win32_libid arg -# return the library type of file 'arg' -# -# Need a lot of goo to handle *both* DLLs and import libs -# Has to be a shell function in order to 'eat' the argument -# that is supplied when $file_magic_command is called. -# Despite the name, also deal with 64 bit binaries. -func_win32_libid () -{ - $opt_debug - win32_libid_type="unknown" - win32_fileres=`file -L $1 2>/dev/null` - case $win32_fileres in - *ar\ archive\ import\ library*) # definitely import - win32_libid_type="x86 archive import" - ;; - *ar\ archive*) # could be an import, or static - # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. - if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | - $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then - func_to_tool_file "$1" func_convert_file_msys_to_w32 - win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | - $SED -n -e ' - 1,100{ - / I /{ - s,.*,import, - p - q - } - }'` - case $win32_nmres in - import*) win32_libid_type="x86 archive import";; - *) win32_libid_type="x86 archive static";; - esac - fi - ;; - *DLL*) - win32_libid_type="x86 DLL" - ;; - *executable*) # but shell scripts are "executable" too... - case $win32_fileres in - *MS\ Windows\ PE\ Intel*) - win32_libid_type="x86 DLL" - ;; - esac - ;; - esac - $ECHO "$win32_libid_type" -} - -# func_cygming_dll_for_implib ARG -# -# Platform-specific function to extract the -# name of the DLL associated with the specified -# import library ARG. -# Invoked by eval'ing the libtool variable -# $sharedlib_from_linklib_cmd -# Result is available in the variable -# $sharedlib_from_linklib_result -func_cygming_dll_for_implib () -{ - $opt_debug - sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` -} - -# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs -# -# The is the core of a fallback implementation of a -# platform-specific function to extract the name of the -# DLL associated with the specified import library LIBNAME. -# -# SECTION_NAME is either .idata$6 or .idata$7, depending -# on the platform and compiler that created the implib. -# -# Echos the name of the DLL associated with the -# specified import library. -func_cygming_dll_for_implib_fallback_core () -{ - $opt_debug - match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` - $OBJDUMP -s --section "$1" "$2" 2>/dev/null | - $SED '/^Contents of section '"$match_literal"':/{ - # Place marker at beginning of archive member dllname section - s/.*/====MARK====/ - p - d - } - # These lines can sometimes be longer than 43 characters, but - # are always uninteresting - /:[ ]*file format pe[i]\{,1\}-/d - /^In archive [^:]*:/d - # Ensure marker is printed - /^====MARK====/p - # Remove all lines with less than 43 characters - /^.\{43\}/!d - # From remaining lines, remove first 43 characters - s/^.\{43\}//' | - $SED -n ' - # Join marker and all lines until next marker into a single line - /^====MARK====/ b para - H - $ b para - b - :para - x - s/\n//g - # Remove the marker - s/^====MARK====// - # Remove trailing dots and whitespace - s/[\. \t]*$// - # Print - /./p' | - # we now have a list, one entry per line, of the stringified - # contents of the appropriate section of all members of the - # archive which possess that section. Heuristic: eliminate - # all those which have a first or second character that is - # a '.' (that is, objdump's representation of an unprintable - # character.) This should work for all archives with less than - # 0x302f exports -- but will fail for DLLs whose name actually - # begins with a literal '.' or a single character followed by - # a '.'. - # - # Of those that remain, print the first one. - $SED -e '/^\./d;/^.\./d;q' -} - -# func_cygming_gnu_implib_p ARG -# This predicate returns with zero status (TRUE) if -# ARG is a GNU/binutils-style import library. Returns -# with nonzero status (FALSE) otherwise. -func_cygming_gnu_implib_p () -{ - $opt_debug - func_to_tool_file "$1" func_convert_file_msys_to_w32 - func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` - test -n "$func_cygming_gnu_implib_tmp" -} - -# func_cygming_ms_implib_p ARG -# This predicate returns with zero status (TRUE) if -# ARG is an MS-style import library. Returns -# with nonzero status (FALSE) otherwise. -func_cygming_ms_implib_p () -{ - $opt_debug - func_to_tool_file "$1" func_convert_file_msys_to_w32 - func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` - test -n "$func_cygming_ms_implib_tmp" -} - -# func_cygming_dll_for_implib_fallback ARG -# Platform-specific function to extract the -# name of the DLL associated with the specified -# import library ARG. -# -# This fallback implementation is for use when $DLLTOOL -# does not support the --identify-strict option. -# Invoked by eval'ing the libtool variable -# $sharedlib_from_linklib_cmd -# Result is available in the variable -# $sharedlib_from_linklib_result -func_cygming_dll_for_implib_fallback () -{ - $opt_debug - if func_cygming_gnu_implib_p "$1" ; then - # binutils import library - sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` - elif func_cygming_ms_implib_p "$1" ; then - # ms-generated import library - sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` - else - # unknown - sharedlib_from_linklib_result="" - fi -} - - -# func_extract_an_archive dir oldlib -func_extract_an_archive () -{ - $opt_debug - f_ex_an_ar_dir="$1"; shift - f_ex_an_ar_oldlib="$1" - if test "$lock_old_archive_extraction" = yes; then - lockfile=$f_ex_an_ar_oldlib.lock - until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do - func_echo "Waiting for $lockfile to be removed" - sleep 2 - done - fi - func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ - 'stat=$?; rm -f "$lockfile"; exit $stat' - if test "$lock_old_archive_extraction" = yes; then - $opt_dry_run || rm -f "$lockfile" - fi - if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then - : - else - func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" - fi -} - - -# func_extract_archives gentop oldlib ... -func_extract_archives () -{ - $opt_debug - my_gentop="$1"; shift - my_oldlibs=${1+"$@"} - my_oldobjs="" - my_xlib="" - my_xabs="" - my_xdir="" - - for my_xlib in $my_oldlibs; do - # Extract the objects. - case $my_xlib in - [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; - *) my_xabs=`pwd`"/$my_xlib" ;; - esac - func_basename "$my_xlib" - my_xlib="$func_basename_result" - my_xlib_u=$my_xlib - while :; do - case " $extracted_archives " in - *" $my_xlib_u "*) - func_arith $extracted_serial + 1 - extracted_serial=$func_arith_result - my_xlib_u=lt$extracted_serial-$my_xlib ;; - *) break ;; - esac - done - extracted_archives="$extracted_archives $my_xlib_u" - my_xdir="$my_gentop/$my_xlib_u" - - func_mkdir_p "$my_xdir" - - case $host in - *-darwin*) - func_verbose "Extracting $my_xabs" - # Do not bother doing anything if just a dry run - $opt_dry_run || { - darwin_orig_dir=`pwd` - cd $my_xdir || exit $? - darwin_archive=$my_xabs - darwin_curdir=`pwd` - darwin_base_archive=`basename "$darwin_archive"` - darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` - if test -n "$darwin_arches"; then - darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` - darwin_arch= - func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" - for darwin_arch in $darwin_arches ; do - func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" - $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" - cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" - func_extract_an_archive "`pwd`" "${darwin_base_archive}" - cd "$darwin_curdir" - $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" - done # $darwin_arches - ## Okay now we've a bunch of thin objects, gotta fatten them up :) - darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` - darwin_file= - darwin_files= - for darwin_file in $darwin_filelist; do - darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` - $LIPO -create -output "$darwin_file" $darwin_files - done # $darwin_filelist - $RM -rf unfat-$$ - cd "$darwin_orig_dir" - else - cd $darwin_orig_dir - func_extract_an_archive "$my_xdir" "$my_xabs" - fi # $darwin_arches - } # !$opt_dry_run - ;; - *) - func_extract_an_archive "$my_xdir" "$my_xabs" - ;; - esac - my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` - done - - func_extract_archives_result="$my_oldobjs" -} - - -# func_emit_wrapper [arg=no] -# -# Emit a libtool wrapper script on stdout. -# Don't directly open a file because we may want to -# incorporate the script contents within a cygwin/mingw -# wrapper executable. Must ONLY be called from within -# func_mode_link because it depends on a number of variables -# set therein. -# -# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR -# variable will take. If 'yes', then the emitted script -# will assume that the directory in which it is stored is -# the $objdir directory. This is a cygwin/mingw-specific -# behavior. -func_emit_wrapper () -{ - func_emit_wrapper_arg1=${1-no} - - $ECHO "\ -#! $SHELL - -# $output - temporary wrapper script for $objdir/$outputname -# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION -# -# The $output program cannot be directly executed until all the libtool -# libraries that it depends on are installed. -# -# This wrapper script should never be moved out of the build directory. -# If it is, it will not operate correctly. - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -sed_quote_subst='$sed_quote_subst' - -# Be Bourne compatible -if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac -fi -BIN_SH=xpg4; export BIN_SH # for Tru64 -DUALCASE=1; export DUALCASE # for MKS sh - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -relink_command=\"$relink_command\" - -# This environment variable determines our operation mode. -if test \"\$libtool_install_magic\" = \"$magic\"; then - # install mode needs the following variables: - generated_by_libtool_version='$macro_version' - notinst_deplibs='$notinst_deplibs' -else - # When we are sourced in execute mode, \$file and \$ECHO are already set. - if test \"\$libtool_execute_magic\" != \"$magic\"; then - file=\"\$0\"" - - qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` - $ECHO "\ - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$1 -_LTECHO_EOF' -} - ECHO=\"$qECHO\" - fi - -# Very basic option parsing. These options are (a) specific to -# the libtool wrapper, (b) are identical between the wrapper -# /script/ and the wrapper /executable/ which is used only on -# windows platforms, and (c) all begin with the string "--lt-" -# (application programs are unlikely to have options which match -# this pattern). -# -# There are only two supported options: --lt-debug and -# --lt-dump-script. There is, deliberately, no --lt-help. -# -# The first argument to this parsing function should be the -# script's $0 value, followed by "$@". -lt_option_debug= -func_parse_lt_options () -{ - lt_script_arg0=\$0 - shift - for lt_opt - do - case \"\$lt_opt\" in - --lt-debug) lt_option_debug=1 ;; - --lt-dump-script) - lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` - test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. - lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` - cat \"\$lt_dump_D/\$lt_dump_F\" - exit 0 - ;; - --lt-*) - \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 - exit 1 - ;; - esac - done - - # Print the debug banner immediately: - if test -n \"\$lt_option_debug\"; then - echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 - fi -} - -# Used when --lt-debug. Prints its arguments to stdout -# (redirection is the responsibility of the caller) -func_lt_dump_args () -{ - lt_dump_args_N=1; - for lt_arg - do - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" - lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` - done -} - -# Core function for launching the target application -func_exec_program_core () -{ -" - case $host in - # Backslashes separate directories on plain windows - *-*-mingw | *-*-os2* | *-cegcc*) - $ECHO "\ - if test -n \"\$lt_option_debug\"; then - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 - func_lt_dump_args \${1+\"\$@\"} 1>&2 - fi - exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} -" - ;; - - *) - $ECHO "\ - if test -n \"\$lt_option_debug\"; then - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 - func_lt_dump_args \${1+\"\$@\"} 1>&2 - fi - exec \"\$progdir/\$program\" \${1+\"\$@\"} -" - ;; - esac - $ECHO "\ - \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 - exit 1 -} - -# A function to encapsulate launching the target application -# Strips options in the --lt-* namespace from \$@ and -# launches target application with the remaining arguments. -func_exec_program () -{ - case \" \$* \" in - *\\ --lt-*) - for lt_wr_arg - do - case \$lt_wr_arg in - --lt-*) ;; - *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; - esac - shift - done ;; - esac - func_exec_program_core \${1+\"\$@\"} -} - - # Parse options - func_parse_lt_options \"\$0\" \${1+\"\$@\"} - - # Find the directory that this script lives in. - thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` - test \"x\$thisdir\" = \"x\$file\" && thisdir=. - - # Follow symbolic links until we get to the real thisdir. - file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` - while test -n \"\$file\"; do - destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` - - # If there was a directory component, then change thisdir. - if test \"x\$destdir\" != \"x\$file\"; then - case \"\$destdir\" in - [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; - *) thisdir=\"\$thisdir/\$destdir\" ;; - esac - fi - - file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` - file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` - done - - # Usually 'no', except on cygwin/mingw when embedded into - # the cwrapper. - WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 - if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then - # special case for '.' - if test \"\$thisdir\" = \".\"; then - thisdir=\`pwd\` - fi - # remove .libs from thisdir - case \"\$thisdir\" in - *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; - $objdir ) thisdir=. ;; - esac - fi - - # Try to get the absolute directory name. - absdir=\`cd \"\$thisdir\" && pwd\` - test -n \"\$absdir\" && thisdir=\"\$absdir\" -" - - if test "$fast_install" = yes; then - $ECHO "\ - program=lt-'$outputname'$exeext - progdir=\"\$thisdir/$objdir\" - - if test ! -f \"\$progdir/\$program\" || - { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ - test \"X\$file\" != \"X\$progdir/\$program\"; }; then - - file=\"\$\$-\$program\" - - if test ! -d \"\$progdir\"; then - $MKDIR \"\$progdir\" - else - $RM \"\$progdir/\$file\" - fi" - - $ECHO "\ - - # relink executable if necessary - if test -n \"\$relink_command\"; then - if relink_command_output=\`eval \$relink_command 2>&1\`; then : - else - $ECHO \"\$relink_command_output\" >&2 - $RM \"\$progdir/\$file\" - exit 1 - fi - fi - - $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || - { $RM \"\$progdir/\$program\"; - $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } - $RM \"\$progdir/\$file\" - fi" - else - $ECHO "\ - program='$outputname' - progdir=\"\$thisdir/$objdir\" -" - fi - - $ECHO "\ - - if test -f \"\$progdir/\$program\"; then" - - # fixup the dll searchpath if we need to. - # - # Fix the DLL searchpath if we need to. Do this before prepending - # to shlibpath, because on Windows, both are PATH and uninstalled - # libraries must come first. - if test -n "$dllsearchpath"; then - $ECHO "\ - # Add the dll search path components to the executable PATH - PATH=$dllsearchpath:\$PATH -" - fi - - # Export our shlibpath_var if we have one. - if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then - $ECHO "\ - # Add our own library path to $shlibpath_var - $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" - - # Some systems cannot cope with colon-terminated $shlibpath_var - # The second colon is a workaround for a bug in BeOS R4 sed - $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` - - export $shlibpath_var -" - fi - - $ECHO "\ - if test \"\$libtool_execute_magic\" != \"$magic\"; then - # Run the actual program with our arguments. - func_exec_program \${1+\"\$@\"} - fi - else - # The program doesn't exist. - \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 - \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 - \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 - exit 1 - fi -fi\ -" -} - - -# func_emit_cwrapperexe_src -# emit the source code for a wrapper executable on stdout -# Must ONLY be called from within func_mode_link because -# it depends on a number of variable set therein. -func_emit_cwrapperexe_src () -{ - cat < -#include -#ifdef _MSC_VER -# include -# include -# include -#else -# include -# include -# ifdef __CYGWIN__ -# include -# endif -#endif -#include -#include -#include -#include -#include -#include -#include -#include - -/* declarations of non-ANSI functions */ -#if defined(__MINGW32__) -# ifdef __STRICT_ANSI__ -int _putenv (const char *); -# endif -#elif defined(__CYGWIN__) -# ifdef __STRICT_ANSI__ -char *realpath (const char *, char *); -int putenv (char *); -int setenv (const char *, const char *, int); -# endif -/* #elif defined (other platforms) ... */ -#endif - -/* portability defines, excluding path handling macros */ -#if defined(_MSC_VER) -# define setmode _setmode -# define stat _stat -# define chmod _chmod -# define getcwd _getcwd -# define putenv _putenv -# define S_IXUSR _S_IEXEC -# ifndef _INTPTR_T_DEFINED -# define _INTPTR_T_DEFINED -# define intptr_t int -# endif -#elif defined(__MINGW32__) -# define setmode _setmode -# define stat _stat -# define chmod _chmod -# define getcwd _getcwd -# define putenv _putenv -#elif defined(__CYGWIN__) -# define HAVE_SETENV -# define FOPEN_WB "wb" -/* #elif defined (other platforms) ... */ -#endif - -#if defined(PATH_MAX) -# define LT_PATHMAX PATH_MAX -#elif defined(MAXPATHLEN) -# define LT_PATHMAX MAXPATHLEN -#else -# define LT_PATHMAX 1024 -#endif - -#ifndef S_IXOTH -# define S_IXOTH 0 -#endif -#ifndef S_IXGRP -# define S_IXGRP 0 -#endif - -/* path handling portability macros */ -#ifndef DIR_SEPARATOR -# define DIR_SEPARATOR '/' -# define PATH_SEPARATOR ':' -#endif - -#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ - defined (__OS2__) -# define HAVE_DOS_BASED_FILE_SYSTEM -# define FOPEN_WB "wb" -# ifndef DIR_SEPARATOR_2 -# define DIR_SEPARATOR_2 '\\' -# endif -# ifndef PATH_SEPARATOR_2 -# define PATH_SEPARATOR_2 ';' -# endif -#endif - -#ifndef DIR_SEPARATOR_2 -# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) -#else /* DIR_SEPARATOR_2 */ -# define IS_DIR_SEPARATOR(ch) \ - (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) -#endif /* DIR_SEPARATOR_2 */ - -#ifndef PATH_SEPARATOR_2 -# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) -#else /* PATH_SEPARATOR_2 */ -# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) -#endif /* PATH_SEPARATOR_2 */ - -#ifndef FOPEN_WB -# define FOPEN_WB "w" -#endif -#ifndef _O_BINARY -# define _O_BINARY 0 -#endif - -#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) -#define XFREE(stale) do { \ - if (stale) { free ((void *) stale); stale = 0; } \ -} while (0) - -#if defined(LT_DEBUGWRAPPER) -static int lt_debug = 1; -#else -static int lt_debug = 0; -#endif - -const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ - -void *xmalloc (size_t num); -char *xstrdup (const char *string); -const char *base_name (const char *name); -char *find_executable (const char *wrapper); -char *chase_symlinks (const char *pathspec); -int make_executable (const char *path); -int check_executable (const char *path); -char *strendzap (char *str, const char *pat); -void lt_debugprintf (const char *file, int line, const char *fmt, ...); -void lt_fatal (const char *file, int line, const char *message, ...); -static const char *nonnull (const char *s); -static const char *nonempty (const char *s); -void lt_setenv (const char *name, const char *value); -char *lt_extend_str (const char *orig_value, const char *add, int to_end); -void lt_update_exe_path (const char *name, const char *value); -void lt_update_lib_path (const char *name, const char *value); -char **prepare_spawn (char **argv); -void lt_dump_script (FILE *f); -EOF - - cat <= 0) - && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) - return 1; - else - return 0; -} - -int -make_executable (const char *path) -{ - int rval = 0; - struct stat st; - - lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", - nonempty (path)); - if ((!path) || (!*path)) - return 0; - - if (stat (path, &st) >= 0) - { - rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); - } - return rval; -} - -/* Searches for the full path of the wrapper. Returns - newly allocated full path name if found, NULL otherwise - Does not chase symlinks, even on platforms that support them. -*/ -char * -find_executable (const char *wrapper) -{ - int has_slash = 0; - const char *p; - const char *p_next; - /* static buffer for getcwd */ - char tmp[LT_PATHMAX + 1]; - int tmp_len; - char *concat_name; - - lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", - nonempty (wrapper)); - - if ((wrapper == NULL) || (*wrapper == '\0')) - return NULL; - - /* Absolute path? */ -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') - { - concat_name = xstrdup (wrapper); - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } - else - { -#endif - if (IS_DIR_SEPARATOR (wrapper[0])) - { - concat_name = xstrdup (wrapper); - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - } -#endif - - for (p = wrapper; *p; p++) - if (*p == '/') - { - has_slash = 1; - break; - } - if (!has_slash) - { - /* no slashes; search PATH */ - const char *path = getenv ("PATH"); - if (path != NULL) - { - for (p = path; *p; p = p_next) - { - const char *q; - size_t p_len; - for (q = p; *q; q++) - if (IS_PATH_SEPARATOR (*q)) - break; - p_len = q - p; - p_next = (*q == '\0' ? q : q + 1); - if (p_len == 0) - { - /* empty path: current directory */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", - nonnull (strerror (errno))); - tmp_len = strlen (tmp); - concat_name = - XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, tmp, tmp_len); - concat_name[tmp_len] = '/'; - strcpy (concat_name + tmp_len + 1, wrapper); - } - else - { - concat_name = - XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, p, p_len); - concat_name[p_len] = '/'; - strcpy (concat_name + p_len + 1, wrapper); - } - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } - } - /* not found in PATH; assume curdir */ - } - /* Relative path | not found in path: prepend cwd */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", - nonnull (strerror (errno))); - tmp_len = strlen (tmp); - concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, tmp, tmp_len); - concat_name[tmp_len] = '/'; - strcpy (concat_name + tmp_len + 1, wrapper); - - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - return NULL; -} - -char * -chase_symlinks (const char *pathspec) -{ -#ifndef S_ISLNK - return xstrdup (pathspec); -#else - char buf[LT_PATHMAX]; - struct stat s; - char *tmp_pathspec = xstrdup (pathspec); - char *p; - int has_symlinks = 0; - while (strlen (tmp_pathspec) && !has_symlinks) - { - lt_debugprintf (__FILE__, __LINE__, - "checking path component for symlinks: %s\n", - tmp_pathspec); - if (lstat (tmp_pathspec, &s) == 0) - { - if (S_ISLNK (s.st_mode) != 0) - { - has_symlinks = 1; - break; - } - - /* search backwards for last DIR_SEPARATOR */ - p = tmp_pathspec + strlen (tmp_pathspec) - 1; - while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) - p--; - if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) - { - /* no more DIR_SEPARATORS left */ - break; - } - *p = '\0'; - } - else - { - lt_fatal (__FILE__, __LINE__, - "error accessing file \"%s\": %s", - tmp_pathspec, nonnull (strerror (errno))); - } - } - XFREE (tmp_pathspec); - - if (!has_symlinks) - { - return xstrdup (pathspec); - } - - tmp_pathspec = realpath (pathspec, buf); - if (tmp_pathspec == 0) - { - lt_fatal (__FILE__, __LINE__, - "could not follow symlinks for %s", pathspec); - } - return xstrdup (tmp_pathspec); -#endif -} - -char * -strendzap (char *str, const char *pat) -{ - size_t len, patlen; - - assert (str != NULL); - assert (pat != NULL); - - len = strlen (str); - patlen = strlen (pat); - - if (patlen <= len) - { - str += len - patlen; - if (strcmp (str, pat) == 0) - *str = '\0'; - } - return str; -} - -void -lt_debugprintf (const char *file, int line, const char *fmt, ...) -{ - va_list args; - if (lt_debug) - { - (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); - va_start (args, fmt); - (void) vfprintf (stderr, fmt, args); - va_end (args); - } -} - -static void -lt_error_core (int exit_status, const char *file, - int line, const char *mode, - const char *message, va_list ap) -{ - fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); - vfprintf (stderr, message, ap); - fprintf (stderr, ".\n"); - - if (exit_status >= 0) - exit (exit_status); -} - -void -lt_fatal (const char *file, int line, const char *message, ...) -{ - va_list ap; - va_start (ap, message); - lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); - va_end (ap); -} - -static const char * -nonnull (const char *s) -{ - return s ? s : "(null)"; -} - -static const char * -nonempty (const char *s) -{ - return (s && !*s) ? "(empty)" : nonnull (s); -} - -void -lt_setenv (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_setenv) setting '%s' to '%s'\n", - nonnull (name), nonnull (value)); - { -#ifdef HAVE_SETENV - /* always make a copy, for consistency with !HAVE_SETENV */ - char *str = xstrdup (value); - setenv (name, str, 1); -#else - int len = strlen (name) + 1 + strlen (value) + 1; - char *str = XMALLOC (char, len); - sprintf (str, "%s=%s", name, value); - if (putenv (str) != EXIT_SUCCESS) - { - XFREE (str); - } -#endif - } -} - -char * -lt_extend_str (const char *orig_value, const char *add, int to_end) -{ - char *new_value; - if (orig_value && *orig_value) - { - int orig_value_len = strlen (orig_value); - int add_len = strlen (add); - new_value = XMALLOC (char, add_len + orig_value_len + 1); - if (to_end) - { - strcpy (new_value, orig_value); - strcpy (new_value + orig_value_len, add); - } - else - { - strcpy (new_value, add); - strcpy (new_value + add_len, orig_value); - } - } - else - { - new_value = xstrdup (add); - } - return new_value; -} - -void -lt_update_exe_path (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", - nonnull (name), nonnull (value)); - - if (name && *name && value && *value) - { - char *new_value = lt_extend_str (getenv (name), value, 0); - /* some systems can't cope with a ':'-terminated path #' */ - int len = strlen (new_value); - while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) - { - new_value[len-1] = '\0'; - } - lt_setenv (name, new_value); - XFREE (new_value); - } -} - -void -lt_update_lib_path (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", - nonnull (name), nonnull (value)); - - if (name && *name && value && *value) - { - char *new_value = lt_extend_str (getenv (name), value, 0); - lt_setenv (name, new_value); - XFREE (new_value); - } -} - -EOF - case $host_os in - mingw*) - cat <<"EOF" - -/* Prepares an argument vector before calling spawn(). - Note that spawn() does not by itself call the command interpreter - (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : - ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&v); - v.dwPlatformId == VER_PLATFORM_WIN32_NT; - }) ? "cmd.exe" : "command.com"). - Instead it simply concatenates the arguments, separated by ' ', and calls - CreateProcess(). We must quote the arguments since Win32 CreateProcess() - interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a - special way: - - Space and tab are interpreted as delimiters. They are not treated as - delimiters if they are surrounded by double quotes: "...". - - Unescaped double quotes are removed from the input. Their only effect is - that within double quotes, space and tab are treated like normal - characters. - - Backslashes not followed by double quotes are not special. - - But 2*n+1 backslashes followed by a double quote become - n backslashes followed by a double quote (n >= 0): - \" -> " - \\\" -> \" - \\\\\" -> \\" - */ -#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" -#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" -char ** -prepare_spawn (char **argv) -{ - size_t argc; - char **new_argv; - size_t i; - - /* Count number of arguments. */ - for (argc = 0; argv[argc] != NULL; argc++) - ; - - /* Allocate new argument vector. */ - new_argv = XMALLOC (char *, argc + 1); - - /* Put quoted arguments into the new argument vector. */ - for (i = 0; i < argc; i++) - { - const char *string = argv[i]; - - if (string[0] == '\0') - new_argv[i] = xstrdup ("\"\""); - else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) - { - int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); - size_t length; - unsigned int backslashes; - const char *s; - char *quoted_string; - char *p; - - length = 0; - backslashes = 0; - if (quote_around) - length++; - for (s = string; *s != '\0'; s++) - { - char c = *s; - if (c == '"') - length += backslashes + 1; - length++; - if (c == '\\') - backslashes++; - else - backslashes = 0; - } - if (quote_around) - length += backslashes + 1; - - quoted_string = XMALLOC (char, length + 1); - - p = quoted_string; - backslashes = 0; - if (quote_around) - *p++ = '"'; - for (s = string; *s != '\0'; s++) - { - char c = *s; - if (c == '"') - { - unsigned int j; - for (j = backslashes + 1; j > 0; j--) - *p++ = '\\'; - } - *p++ = c; - if (c == '\\') - backslashes++; - else - backslashes = 0; - } - if (quote_around) - { - unsigned int j; - for (j = backslashes; j > 0; j--) - *p++ = '\\'; - *p++ = '"'; - } - *p = '\0'; - - new_argv[i] = quoted_string; - } - else - new_argv[i] = (char *) string; - } - new_argv[argc] = NULL; - - return new_argv; -} -EOF - ;; - esac - - cat <<"EOF" -void lt_dump_script (FILE* f) -{ -EOF - func_emit_wrapper yes | - $SED -n -e ' -s/^\(.\{79\}\)\(..*\)/\1\ -\2/ -h -s/\([\\"]\)/\\\1/g -s/$/\\n/ -s/\([^\n]*\).*/ fputs ("\1", f);/p -g -D' - cat <<"EOF" -} -EOF -} -# end: func_emit_cwrapperexe_src - -# func_win32_import_lib_p ARG -# True if ARG is an import lib, as indicated by $file_magic_cmd -func_win32_import_lib_p () -{ - $opt_debug - case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in - *import*) : ;; - *) false ;; - esac -} - -# func_mode_link arg... -func_mode_link () -{ - $opt_debug - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - # It is impossible to link a dll without this setting, and - # we shouldn't force the makefile maintainer to figure out - # which system we are compiling for in order to pass an extra - # flag for every libtool invocation. - # allow_undefined=no - - # FIXME: Unfortunately, there are problems with the above when trying - # to make a dll which has undefined symbols, in which case not - # even a static library is built. For now, we need to specify - # -no-undefined on the libtool link line when we can be certain - # that all symbols are satisfied, otherwise we get a static library. - allow_undefined=yes - ;; - *) - allow_undefined=yes - ;; - esac - libtool_args=$nonopt - base_compile="$nonopt $@" - compile_command=$nonopt - finalize_command=$nonopt - - compile_rpath= - finalize_rpath= - compile_shlibpath= - finalize_shlibpath= - convenience= - old_convenience= - deplibs= - old_deplibs= - compiler_flags= - linker_flags= - dllsearchpath= - lib_search_path=`pwd` - inst_prefix_dir= - new_inherited_linker_flags= - - avoid_version=no - bindir= - dlfiles= - dlprefiles= - dlself=no - export_dynamic=no - export_symbols= - export_symbols_regex= - generated= - libobjs= - ltlibs= - module=no - no_install=no - objs= - non_pic_objects= - precious_files_regex= - prefer_static_libs=no - preload=no - prev= - prevarg= - release= - rpath= - xrpath= - perm_rpath= - temp_rpath= - thread_safe=no - vinfo= - vinfo_number=no - weak_libs= - single_module="${wl}-single_module" - func_infer_tag $base_compile - - # We need to know -static, to get the right output filenames. - for arg - do - case $arg in - -shared) - test "$build_libtool_libs" != yes && \ - func_fatal_configuration "can not build a shared library" - build_old_libs=no - break - ;; - -all-static | -static | -static-libtool-libs) - case $arg in - -all-static) - if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then - func_warning "complete static linking is impossible in this configuration" - fi - if test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - ;; - -static) - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=built - ;; - -static-libtool-libs) - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - ;; - esac - build_libtool_libs=no - build_old_libs=yes - break - ;; - esac - done - - # See if our shared archives depend on static archives. - test -n "$old_archive_from_new_cmds" && build_old_libs=yes - - # Go through the arguments, transforming them on the way. - while test "$#" -gt 0; do - arg="$1" - shift - func_quote_for_eval "$arg" - qarg=$func_quote_for_eval_unquoted_result - func_append libtool_args " $func_quote_for_eval_result" - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - case $prev in - output) - func_append compile_command " @OUTPUT@" - func_append finalize_command " @OUTPUT@" - ;; - esac - - case $prev in - bindir) - bindir="$arg" - prev= - continue - ;; - dlfiles|dlprefiles) - if test "$preload" = no; then - # Add the symbol object into the linking commands. - func_append compile_command " @SYMFILE@" - func_append finalize_command " @SYMFILE@" - preload=yes - fi - case $arg in - *.la | *.lo) ;; # We handle these cases below. - force) - if test "$dlself" = no; then - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - self) - if test "$prev" = dlprefiles; then - dlself=yes - elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then - dlself=yes - else - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - *) - if test "$prev" = dlfiles; then - func_append dlfiles " $arg" - else - func_append dlprefiles " $arg" - fi - prev= - continue - ;; - esac - ;; - expsyms) - export_symbols="$arg" - test -f "$arg" \ - || func_fatal_error "symbol file \`$arg' does not exist" - prev= - continue - ;; - expsyms_regex) - export_symbols_regex="$arg" - prev= - continue - ;; - framework) - case $host in - *-*-darwin*) - case "$deplibs " in - *" $qarg.ltframework "*) ;; - *) func_append deplibs " $qarg.ltframework" # this is fixed later - ;; - esac - ;; - esac - prev= - continue - ;; - inst_prefix) - inst_prefix_dir="$arg" - prev= - continue - ;; - objectlist) - if test -f "$arg"; then - save_arg=$arg - moreargs= - for fil in `cat "$save_arg"` - do -# func_append moreargs " $fil" - arg=$fil - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if func_lalib_unsafe_p "$arg"; then - pic_object= - non_pic_object= - - # Read the .lo file - func_source "$arg" - - if test -z "$pic_object" || - test -z "$non_pic_object" || - test "$pic_object" = none && - test "$non_pic_object" = none; then - func_fatal_error "cannot find name of object for \`$arg'" - fi - - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - if test "$pic_object" != none; then - # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" - - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - func_append dlfiles " $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then - # Preload the old-style object. - func_append dlprefiles " $pic_object" - prev= - fi - - # A PIC object. - func_append libobjs " $pic_object" - arg="$pic_object" - fi - - # Non-PIC object. - if test "$non_pic_object" != none; then - # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" - - # A standard non-PIC object - func_append non_pic_objects " $non_pic_object" - if test -z "$pic_object" || test "$pic_object" = none ; then - arg="$non_pic_object" - fi - else - # If the PIC object exists, use it instead. - # $xdir was prepended to $pic_object above. - non_pic_object="$pic_object" - func_append non_pic_objects " $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if $opt_dry_run; then - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - func_lo2o "$arg" - pic_object=$xdir$objdir/$func_lo2o_result - non_pic_object=$xdir$func_lo2o_result - func_append libobjs " $pic_object" - func_append non_pic_objects " $non_pic_object" - else - func_fatal_error "\`$arg' is not a valid libtool object" - fi - fi - done - else - func_fatal_error "link input file \`$arg' does not exist" - fi - arg=$save_arg - prev= - continue - ;; - precious_regex) - precious_files_regex="$arg" - prev= - continue - ;; - release) - release="-$arg" - prev= - continue - ;; - rpath | xrpath) - # We need an absolute path. - case $arg in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - func_fatal_error "only absolute run-paths are allowed" - ;; - esac - if test "$prev" = rpath; then - case "$rpath " in - *" $arg "*) ;; - *) func_append rpath " $arg" ;; - esac - else - case "$xrpath " in - *" $arg "*) ;; - *) func_append xrpath " $arg" ;; - esac - fi - prev= - continue - ;; - shrext) - shrext_cmds="$arg" - prev= - continue - ;; - weak) - func_append weak_libs " $arg" - prev= - continue - ;; - xcclinker) - func_append linker_flags " $qarg" - func_append compiler_flags " $qarg" - prev= - func_append compile_command " $qarg" - func_append finalize_command " $qarg" - continue - ;; - xcompiler) - func_append compiler_flags " $qarg" - prev= - func_append compile_command " $qarg" - func_append finalize_command " $qarg" - continue - ;; - xlinker) - func_append linker_flags " $qarg" - func_append compiler_flags " $wl$qarg" - prev= - func_append compile_command " $wl$qarg" - func_append finalize_command " $wl$qarg" - continue - ;; - *) - eval "$prev=\"\$arg\"" - prev= - continue - ;; - esac - fi # test -n "$prev" - - prevarg="$arg" - - case $arg in - -all-static) - if test -n "$link_static_flag"; then - # See comment for -static flag below, for more details. - func_append compile_command " $link_static_flag" - func_append finalize_command " $link_static_flag" - fi - continue - ;; - - -allow-undefined) - # FIXME: remove this flag sometime in the future. - func_fatal_error "\`-allow-undefined' must not be used because it is the default" - ;; - - -avoid-version) - avoid_version=yes - continue - ;; - - -bindir) - prev=bindir - continue - ;; - - -dlopen) - prev=dlfiles - continue - ;; - - -dlpreopen) - prev=dlprefiles - continue - ;; - - -export-dynamic) - export_dynamic=yes - continue - ;; - - -export-symbols | -export-symbols-regex) - if test -n "$export_symbols" || test -n "$export_symbols_regex"; then - func_fatal_error "more than one -exported-symbols argument is not allowed" - fi - if test "X$arg" = "X-export-symbols"; then - prev=expsyms - else - prev=expsyms_regex - fi - continue - ;; - - -framework) - prev=framework - continue - ;; - - -inst-prefix-dir) - prev=inst_prefix - continue - ;; - - # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* - # so, if we see these flags be careful not to treat them like -L - -L[A-Z][A-Z]*:*) - case $with_gcc/$host in - no/*-*-irix* | /*-*-irix*) - func_append compile_command " $arg" - func_append finalize_command " $arg" - ;; - esac - continue - ;; - - -L*) - func_stripname "-L" '' "$arg" - if test -z "$func_stripname_result"; then - if test "$#" -gt 0; then - func_fatal_error "require no space between \`-L' and \`$1'" - else - func_fatal_error "need path for \`-L' option" - fi - fi - func_resolve_sysroot "$func_stripname_result" - dir=$func_resolve_sysroot_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - absdir=`cd "$dir" && pwd` - test -z "$absdir" && \ - func_fatal_error "cannot determine absolute directory name of \`$dir'" - dir="$absdir" - ;; - esac - case "$deplibs " in - *" -L$dir "* | *" $arg "*) - # Will only happen for absolute or sysroot arguments - ;; - *) - # Preserve sysroot, but never include relative directories - case $dir in - [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; - *) func_append deplibs " -L$dir" ;; - esac - func_append lib_search_path " $dir" - ;; - esac - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$dir:"*) ;; - ::) dllsearchpath=$dir;; - *) func_append dllsearchpath ":$dir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - ::) dllsearchpath=$testbindir;; - *) func_append dllsearchpath ":$testbindir";; - esac - ;; - esac - continue - ;; - - -l*) - if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) - # These systems don't actually have a C or math library (as such) - continue - ;; - *-*-os2*) - # These systems don't actually have a C library (as such) - test "X$arg" = "X-lc" && continue - ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) - # Do not include libc due to us having libc/libc_r. - test "X$arg" = "X-lc" && continue - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C and math libraries are in the System framework - func_append deplibs " System.ltframework" - continue - ;; - *-*-sco3.2v5* | *-*-sco5v6*) - # Causes problems with __ctype - test "X$arg" = "X-lc" && continue - ;; - *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) - # Compiler inserts libc in the correct place for threads to work - test "X$arg" = "X-lc" && continue - ;; - esac - elif test "X$arg" = "X-lc_r"; then - case $host in - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) - # Do not include libc_r directly, use -pthread flag. - continue - ;; - esac - fi - func_append deplibs " $arg" - continue - ;; - - -module) - module=yes - continue - ;; - - # Tru64 UNIX uses -model [arg] to determine the layout of C++ - # classes, name mangling, and exception handling. - # Darwin uses the -arch flag to determine output architecture. - -model|-arch|-isysroot|--sysroot) - func_append compiler_flags " $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - prev=xcompiler - continue - ;; - - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ - |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) - func_append compiler_flags " $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - case "$new_inherited_linker_flags " in - *" $arg "*) ;; - * ) func_append new_inherited_linker_flags " $arg" ;; - esac - continue - ;; - - -multi_module) - single_module="${wl}-multi_module" - continue - ;; - - -no-fast-install) - fast_install=no - continue - ;; - - -no-install) - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) - # The PATH hackery in wrapper scripts is required on Windows - # and Darwin in order for the loader to find any dlls it needs. - func_warning "\`-no-install' is ignored for $host" - func_warning "assuming \`-no-fast-install' instead" - fast_install=no - ;; - *) no_install=yes ;; - esac - continue - ;; - - -no-undefined) - allow_undefined=no - continue - ;; - - -objectlist) - prev=objectlist - continue - ;; - - -o) prev=output ;; - - -precious-files-regex) - prev=precious_regex - continue - ;; - - -release) - prev=release - continue - ;; - - -rpath) - prev=rpath - continue - ;; - - -R) - prev=xrpath - continue - ;; - - -R*) - func_stripname '-R' '' "$arg" - dir=$func_stripname_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - =*) - func_stripname '=' '' "$dir" - dir=$lt_sysroot$func_stripname_result - ;; - *) - func_fatal_error "only absolute run-paths are allowed" - ;; - esac - case "$xrpath " in - *" $dir "*) ;; - *) func_append xrpath " $dir" ;; - esac - continue - ;; - - -shared) - # The effects of -shared are defined in a previous loop. - continue - ;; - - -shrext) - prev=shrext - continue - ;; - - -static | -static-libtool-libs) - # The effects of -static are defined in a previous loop. - # We used to do the same as -all-static on platforms that - # didn't have a PIC flag, but the assumption that the effects - # would be equivalent was wrong. It would break on at least - # Digital Unix and AIX. - continue - ;; - - -thread-safe) - thread_safe=yes - continue - ;; - - -version-info) - prev=vinfo - continue - ;; - - -version-number) - prev=vinfo - vinfo_number=yes - continue - ;; - - -weak) - prev=weak - continue - ;; - - -Wc,*) - func_stripname '-Wc,' '' "$arg" - args=$func_stripname_result - arg= - save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - func_quote_for_eval "$flag" - func_append arg " $func_quote_for_eval_result" - func_append compiler_flags " $func_quote_for_eval_result" - done - IFS="$save_ifs" - func_stripname ' ' '' "$arg" - arg=$func_stripname_result - ;; - - -Wl,*) - func_stripname '-Wl,' '' "$arg" - args=$func_stripname_result - arg= - save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - func_quote_for_eval "$flag" - func_append arg " $wl$func_quote_for_eval_result" - func_append compiler_flags " $wl$func_quote_for_eval_result" - func_append linker_flags " $func_quote_for_eval_result" - done - IFS="$save_ifs" - func_stripname ' ' '' "$arg" - arg=$func_stripname_result - ;; - - -Xcompiler) - prev=xcompiler - continue - ;; - - -Xlinker) - prev=xlinker - continue - ;; - - -XCClinker) - prev=xcclinker - continue - ;; - - # -msg_* for osf cc - -msg_*) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - ;; - - # Flags to be passed through unchanged, with rationale: - # -64, -mips[0-9] enable 64-bit mode for the SGI compiler - # -r[0-9][0-9]* specify processor for the SGI compiler - # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler - # +DA*, +DD* enable 64-bit mode for the HP compiler - # -q* compiler args for the IBM compiler - # -m*, -t[45]*, -txscale* architecture-specific flags for GCC - # -F/path path to uninstalled frameworks, gcc on darwin - # -p, -pg, --coverage, -fprofile-* profiling flags for GCC - # @file GCC response files - # -tp=* Portland pgcc target processor selection - # --sysroot=* for sysroot support - # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization - -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ - -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ - -O*|-flto*|-fwhopr*|-fuse-linker-plugin) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - func_append compile_command " $arg" - func_append finalize_command " $arg" - func_append compiler_flags " $arg" - continue - ;; - - # Some other compiler flag. - -* | +*) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - ;; - - *.$objext) - # A standard object. - func_append objs " $arg" - ;; - - *.lo) - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if func_lalib_unsafe_p "$arg"; then - pic_object= - non_pic_object= - - # Read the .lo file - func_source "$arg" - - if test -z "$pic_object" || - test -z "$non_pic_object" || - test "$pic_object" = none && - test "$non_pic_object" = none; then - func_fatal_error "cannot find name of object for \`$arg'" - fi - - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - if test "$pic_object" != none; then - # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" - - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - func_append dlfiles " $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then - # Preload the old-style object. - func_append dlprefiles " $pic_object" - prev= - fi - - # A PIC object. - func_append libobjs " $pic_object" - arg="$pic_object" - fi - - # Non-PIC object. - if test "$non_pic_object" != none; then - # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" - - # A standard non-PIC object - func_append non_pic_objects " $non_pic_object" - if test -z "$pic_object" || test "$pic_object" = none ; then - arg="$non_pic_object" - fi - else - # If the PIC object exists, use it instead. - # $xdir was prepended to $pic_object above. - non_pic_object="$pic_object" - func_append non_pic_objects " $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if $opt_dry_run; then - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - func_lo2o "$arg" - pic_object=$xdir$objdir/$func_lo2o_result - non_pic_object=$xdir$func_lo2o_result - func_append libobjs " $pic_object" - func_append non_pic_objects " $non_pic_object" - else - func_fatal_error "\`$arg' is not a valid libtool object" - fi - fi - ;; - - *.$libext) - # An archive. - func_append deplibs " $arg" - func_append old_deplibs " $arg" - continue - ;; - - *.la) - # A libtool-controlled library. - - func_resolve_sysroot "$arg" - if test "$prev" = dlfiles; then - # This library was specified with -dlopen. - func_append dlfiles " $func_resolve_sysroot_result" - prev= - elif test "$prev" = dlprefiles; then - # The library was specified with -dlpreopen. - func_append dlprefiles " $func_resolve_sysroot_result" - prev= - else - func_append deplibs " $func_resolve_sysroot_result" - fi - continue - ;; - - # Some other compiler argument. - *) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - ;; - esac # arg - - # Now actually substitute the argument into the commands. - if test -n "$arg"; then - func_append compile_command " $arg" - func_append finalize_command " $arg" - fi - done # argument parsing loop - - test -n "$prev" && \ - func_fatal_help "the \`$prevarg' option requires an argument" - - if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then - eval arg=\"$export_dynamic_flag_spec\" - func_append compile_command " $arg" - func_append finalize_command " $arg" - fi - - oldlibs= - # calculate the name of the file, without its directory - func_basename "$output" - outputname="$func_basename_result" - libobjs_save="$libobjs" - - if test -n "$shlibpath_var"; then - # get the directories listed in $shlibpath_var - eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` - else - shlib_search_path= - fi - eval sys_lib_search_path=\"$sys_lib_search_path_spec\" - eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" - - func_dirname "$output" "/" "" - output_objdir="$func_dirname_result$objdir" - func_to_tool_file "$output_objdir/" - tool_output_objdir=$func_to_tool_file_result - # Create the object directory. - func_mkdir_p "$output_objdir" - - # Determine the type of output - case $output in - "") - func_fatal_help "you must specify an output file" - ;; - *.$libext) linkmode=oldlib ;; - *.lo | *.$objext) linkmode=obj ;; - *.la) linkmode=lib ;; - *) linkmode=prog ;; # Anything else should be a program. - esac - - specialdeplibs= - - libs= - # Find all interdependent deplibs by searching for libraries - # that are linked more than once (e.g. -la -lb -la) - for deplib in $deplibs; do - if $opt_preserve_dup_deps ; then - case "$libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append libs " $deplib" - done - - if test "$linkmode" = lib; then - libs="$predeps $libs $compiler_lib_search_path $postdeps" - - # Compute libraries that are listed more than once in $predeps - # $postdeps and mark them as special (i.e., whose duplicates are - # not to be eliminated). - pre_post_deps= - if $opt_duplicate_compiler_generated_deps; then - for pre_post_dep in $predeps $postdeps; do - case "$pre_post_deps " in - *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; - esac - func_append pre_post_deps " $pre_post_dep" - done - fi - pre_post_deps= - fi - - deplibs= - newdependency_libs= - newlib_search_path= - need_relink=no # whether we're linking any uninstalled libtool libraries - notinst_deplibs= # not-installed libtool libraries - notinst_path= # paths that contain not-installed libtool libraries - - case $linkmode in - lib) - passes="conv dlpreopen link" - for file in $dlfiles $dlprefiles; do - case $file in - *.la) ;; - *) - func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" - ;; - esac - done - ;; - prog) - compile_deplibs= - finalize_deplibs= - alldeplibs=no - newdlfiles= - newdlprefiles= - passes="conv scan dlopen dlpreopen link" - ;; - *) passes="conv" - ;; - esac - - for pass in $passes; do - # The preopen pass in lib mode reverses $deplibs; put it back here - # so that -L comes before libs that need it for instance... - if test "$linkmode,$pass" = "lib,link"; then - ## FIXME: Find the place where the list is rebuilt in the wrong - ## order, and fix it there properly - tmp_deplibs= - for deplib in $deplibs; do - tmp_deplibs="$deplib $tmp_deplibs" - done - deplibs="$tmp_deplibs" - fi - - if test "$linkmode,$pass" = "lib,link" || - test "$linkmode,$pass" = "prog,scan"; then - libs="$deplibs" - deplibs= - fi - if test "$linkmode" = prog; then - case $pass in - dlopen) libs="$dlfiles" ;; - dlpreopen) libs="$dlprefiles" ;; - link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; - esac - fi - if test "$linkmode,$pass" = "lib,dlpreopen"; then - # Collect and forward deplibs of preopened libtool libs - for lib in $dlprefiles; do - # Ignore non-libtool-libs - dependency_libs= - func_resolve_sysroot "$lib" - case $lib in - *.la) func_source "$func_resolve_sysroot_result" ;; - esac - - # Collect preopened libtool deplibs, except any this library - # has declared as weak libs - for deplib in $dependency_libs; do - func_basename "$deplib" - deplib_base=$func_basename_result - case " $weak_libs " in - *" $deplib_base "*) ;; - *) func_append deplibs " $deplib" ;; - esac - done - done - libs="$dlprefiles" - fi - if test "$pass" = dlopen; then - # Collect dlpreopened libraries - save_deplibs="$deplibs" - deplibs= - fi - - for deplib in $libs; do - lib= - found=no - case $deplib in - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ - |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - func_append compiler_flags " $deplib" - if test "$linkmode" = lib ; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) func_append new_inherited_linker_flags " $deplib" ;; - esac - fi - fi - continue - ;; - -l*) - if test "$linkmode" != lib && test "$linkmode" != prog; then - func_warning "\`-l' is ignored for archives/objects" - continue - fi - func_stripname '-l' '' "$deplib" - name=$func_stripname_result - if test "$linkmode" = lib; then - searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" - else - searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" - fi - for searchdir in $searchdirs; do - for search_ext in .la $std_shrext .so .a; do - # Search the libtool library - lib="$searchdir/lib${name}${search_ext}" - if test -f "$lib"; then - if test "$search_ext" = ".la"; then - found=yes - else - found=no - fi - break 2 - fi - done - done - if test "$found" != yes; then - # deplib doesn't seem to be a libtool library - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" - fi - continue - else # deplib is a libtool library - # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, - # We need to do some special things here, and not later. - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $deplib "*) - if func_lalib_p "$lib"; then - library_names= - old_library= - func_source "$lib" - for l in $old_library $library_names; do - ll="$l" - done - if test "X$ll" = "X$old_library" ; then # only static version available - found=no - func_dirname "$lib" "" "." - ladir="$func_dirname_result" - lib=$ladir/$old_library - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" - fi - continue - fi - fi - ;; - *) ;; - esac - fi - fi - ;; # -l - *.ltframework) - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - if test "$linkmode" = lib ; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) func_append new_inherited_linker_flags " $deplib" ;; - esac - fi - fi - continue - ;; - -L*) - case $linkmode in - lib) - deplibs="$deplib $deplibs" - test "$pass" = conv && continue - newdependency_libs="$deplib $newdependency_libs" - func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - prog) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - continue - fi - if test "$pass" = scan; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - *) - func_warning "\`-L' is ignored for archives/objects" - ;; - esac # linkmode - continue - ;; # -L - -R*) - if test "$pass" = link; then - func_stripname '-R' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - dir=$func_resolve_sysroot_result - # Make sure the xrpath contains only unique directories. - case "$xrpath " in - *" $dir "*) ;; - *) func_append xrpath " $dir" ;; - esac - fi - deplibs="$deplib $deplibs" - continue - ;; - *.la) - func_resolve_sysroot "$deplib" - lib=$func_resolve_sysroot_result - ;; - *.$libext) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - continue - fi - case $linkmode in - lib) - # Linking convenience modules into shared libraries is allowed, - # but linking other static libraries is non-portable. - case " $dlpreconveniencelibs " in - *" $deplib "*) ;; - *) - valid_a_lib=no - case $deplibs_check_method in - match_pattern*) - set dummy $deplibs_check_method; shift - match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ - | $EGREP "$match_pattern_regex" > /dev/null; then - valid_a_lib=yes - fi - ;; - pass_all) - valid_a_lib=yes - ;; - esac - if test "$valid_a_lib" != yes; then - echo - $ECHO "*** Warning: Trying to link with static lib archive $deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because the file extensions .$libext of this argument makes me believe" - echo "*** that it is just a static archive that I should not use here." - else - echo - $ECHO "*** Warning: Linking the shared library $output against the" - $ECHO "*** static library $deplib is not portable!" - deplibs="$deplib $deplibs" - fi - ;; - esac - continue - ;; - prog) - if test "$pass" != link; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - continue - ;; - esac # linkmode - ;; # *.$libext - *.lo | *.$objext) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - elif test "$linkmode" = prog; then - if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then - # If there is no dlopen support or we're linking statically, - # we need to preload. - func_append newdlprefiles " $deplib" - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - func_append newdlfiles " $deplib" - fi - fi - continue - ;; - %DEPLIBS%) - alldeplibs=yes - continue - ;; - esac # case $deplib - - if test "$found" = yes || test -f "$lib"; then : - else - func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" - fi - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$lib" \ - || func_fatal_error "\`$lib' is not a valid libtool archive" - - func_dirname "$lib" "" "." - ladir="$func_dirname_result" - - dlname= - dlopen= - dlpreopen= - libdir= - library_names= - old_library= - inherited_linker_flags= - # If the library was installed with an old release of libtool, - # it will not redefine variables installed, or shouldnotlink - installed=yes - shouldnotlink=no - avoidtemprpath= - - - # Read the .la file - func_source "$lib" - - # Convert "-framework foo" to "foo.ltframework" - if test -n "$inherited_linker_flags"; then - tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` - for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do - case " $new_inherited_linker_flags " in - *" $tmp_inherited_linker_flag "*) ;; - *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; - esac - done - fi - dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - if test "$linkmode,$pass" = "lib,link" || - test "$linkmode,$pass" = "prog,scan" || - { test "$linkmode" != prog && test "$linkmode" != lib; }; then - test -n "$dlopen" && func_append dlfiles " $dlopen" - test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" - fi - - if test "$pass" = conv; then - # Only check for convenience libraries - deplibs="$lib $deplibs" - if test -z "$libdir"; then - if test -z "$old_library"; then - func_fatal_error "cannot find name of link library for \`$lib'" - fi - # It is a libtool convenience library, so add in its objects. - func_append convenience " $ladir/$objdir/$old_library" - func_append old_convenience " $ladir/$objdir/$old_library" - elif test "$linkmode" != prog && test "$linkmode" != lib; then - func_fatal_error "\`$lib' is not a convenience library" - fi - tmp_libs= - for deplib in $dependency_libs; do - deplibs="$deplib $deplibs" - if $opt_preserve_dup_deps ; then - case "$tmp_libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append tmp_libs " $deplib" - done - continue - fi # $pass = conv - - - # Get the name of the library we link against. - linklib= - if test -n "$old_library" && - { test "$prefer_static_libs" = yes || - test "$prefer_static_libs,$installed" = "built,no"; }; then - linklib=$old_library - else - for l in $old_library $library_names; do - linklib="$l" - done - fi - if test -z "$linklib"; then - func_fatal_error "cannot find name of link library for \`$lib'" - fi - - # This library was specified with -dlopen. - if test "$pass" = dlopen; then - if test -z "$libdir"; then - func_fatal_error "cannot -dlopen a convenience library: \`$lib'" - fi - if test -z "$dlname" || - test "$dlopen_support" != yes || - test "$build_libtool_libs" = no; then - # If there is no dlname, no dlopen support or we're linking - # statically, we need to preload. We also need to preload any - # dependent libraries so libltdl's deplib preloader doesn't - # bomb out in the load deplibs phase. - func_append dlprefiles " $lib $dependency_libs" - else - func_append newdlfiles " $lib" - fi - continue - fi # $pass = dlopen - - # We need an absolute path. - case $ladir in - [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; - *) - abs_ladir=`cd "$ladir" && pwd` - if test -z "$abs_ladir"; then - func_warning "cannot determine absolute directory name of \`$ladir'" - func_warning "passing it literally to the linker, although it might fail" - abs_ladir="$ladir" - fi - ;; - esac - func_basename "$lib" - laname="$func_basename_result" - - # Find the relevant object directory and library name. - if test "X$installed" = Xyes; then - if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then - func_warning "library \`$lib' was moved." - dir="$ladir" - absdir="$abs_ladir" - libdir="$abs_ladir" - else - dir="$lt_sysroot$libdir" - absdir="$lt_sysroot$libdir" - fi - test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes - else - if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then - dir="$ladir" - absdir="$abs_ladir" - # Remove this search path later - func_append notinst_path " $abs_ladir" - else - dir="$ladir/$objdir" - absdir="$abs_ladir/$objdir" - # Remove this search path later - func_append notinst_path " $abs_ladir" - fi - fi # $installed = yes - func_stripname 'lib' '.la' "$laname" - name=$func_stripname_result - - # This library was specified with -dlpreopen. - if test "$pass" = dlpreopen; then - if test -z "$libdir" && test "$linkmode" = prog; then - func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" - fi - case "$host" in - # special handling for platforms with PE-DLLs. - *cygwin* | *mingw* | *cegcc* ) - # Linker will automatically link against shared library if both - # static and shared are present. Therefore, ensure we extract - # symbols from the import library if a shared library is present - # (otherwise, the dlopen module name will be incorrect). We do - # this by putting the import library name into $newdlprefiles. - # We recover the dlopen module name by 'saving' the la file - # name in a special purpose variable, and (later) extracting the - # dlname from the la file. - if test -n "$dlname"; then - func_tr_sh "$dir/$linklib" - eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" - func_append newdlprefiles " $dir/$linklib" - else - func_append newdlprefiles " $dir/$old_library" - # Keep a list of preopened convenience libraries to check - # that they are being used correctly in the link pass. - test -z "$libdir" && \ - func_append dlpreconveniencelibs " $dir/$old_library" - fi - ;; - * ) - # Prefer using a static library (so that no silly _DYNAMIC symbols - # are required to link). - if test -n "$old_library"; then - func_append newdlprefiles " $dir/$old_library" - # Keep a list of preopened convenience libraries to check - # that they are being used correctly in the link pass. - test -z "$libdir" && \ - func_append dlpreconveniencelibs " $dir/$old_library" - # Otherwise, use the dlname, so that lt_dlopen finds it. - elif test -n "$dlname"; then - func_append newdlprefiles " $dir/$dlname" - else - func_append newdlprefiles " $dir/$linklib" - fi - ;; - esac - fi # $pass = dlpreopen - - if test -z "$libdir"; then - # Link the convenience library - if test "$linkmode" = lib; then - deplibs="$dir/$old_library $deplibs" - elif test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$dir/$old_library $compile_deplibs" - finalize_deplibs="$dir/$old_library $finalize_deplibs" - else - deplibs="$lib $deplibs" # used for prog,scan pass - fi - continue - fi - - - if test "$linkmode" = prog && test "$pass" != link; then - func_append newlib_search_path " $ladir" - deplibs="$lib $deplibs" - - linkalldeplibs=no - if test "$link_all_deplibs" != no || test -z "$library_names" || - test "$build_libtool_libs" = no; then - linkalldeplibs=yes - fi - - tmp_libs= - for deplib in $dependency_libs; do - case $deplib in - -L*) func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - esac - # Need to link against all dependency_libs? - if test "$linkalldeplibs" = yes; then - deplibs="$deplib $deplibs" - else - # Need to hardcode shared library paths - # or/and link against static libraries - newdependency_libs="$deplib $newdependency_libs" - fi - if $opt_preserve_dup_deps ; then - case "$tmp_libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append tmp_libs " $deplib" - done # for deplib - continue - fi # $linkmode = prog... - - if test "$linkmode,$pass" = "prog,link"; then - if test -n "$library_names" && - { { test "$prefer_static_libs" = no || - test "$prefer_static_libs,$installed" = "built,yes"; } || - test -z "$old_library"; }; then - # We need to hardcode the library path - if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then - # Make sure the rpath contains only unique directories. - case "$temp_rpath:" in - *"$absdir:"*) ;; - *) func_append temp_rpath "$absdir:" ;; - esac - fi - - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) func_append compile_rpath " $absdir" ;; - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - ;; - esac - fi # $linkmode,$pass = prog,link... - - if test "$alldeplibs" = yes && - { test "$deplibs_check_method" = pass_all || - { test "$build_libtool_libs" = yes && - test -n "$library_names"; }; }; then - # We only need to search for static libraries - continue - fi - fi - - link_static=no # Whether the deplib will be linked statically - use_static_libs=$prefer_static_libs - if test "$use_static_libs" = built && test "$installed" = yes; then - use_static_libs=no - fi - if test -n "$library_names" && - { test "$use_static_libs" = no || test -z "$old_library"; }; then - case $host in - *cygwin* | *mingw* | *cegcc*) - # No point in relinking DLLs because paths are not encoded - func_append notinst_deplibs " $lib" - need_relink=no - ;; - *) - if test "$installed" = no; then - func_append notinst_deplibs " $lib" - need_relink=yes - fi - ;; - esac - # This is a shared library - - # Warn about portability, can't link against -module's on some - # systems (darwin). Don't bleat about dlopened modules though! - dlopenmodule="" - for dlpremoduletest in $dlprefiles; do - if test "X$dlpremoduletest" = "X$lib"; then - dlopenmodule="$dlpremoduletest" - break - fi - done - if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then - echo - if test "$linkmode" = prog; then - $ECHO "*** Warning: Linking the executable $output against the loadable module" - else - $ECHO "*** Warning: Linking the shared library $output against the loadable module" - fi - $ECHO "*** $linklib is not portable!" - fi - if test "$linkmode" = lib && - test "$hardcode_into_libs" = yes; then - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) func_append compile_rpath " $absdir" ;; - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - ;; - esac - fi - - if test -n "$old_archive_from_expsyms_cmds"; then - # figure out the soname - set dummy $library_names - shift - realname="$1" - shift - libname=`eval "\\$ECHO \"$libname_spec\""` - # use dlname if we got it. it's perfectly good, no? - if test -n "$dlname"; then - soname="$dlname" - elif test -n "$soname_spec"; then - # bleh windows - case $host in - *cygwin* | mingw* | *cegcc*) - func_arith $current - $age - major=$func_arith_result - versuffix="-$major" - ;; - esac - eval soname=\"$soname_spec\" - else - soname="$realname" - fi - - # Make a new name for the extract_expsyms_cmds to use - soroot="$soname" - func_basename "$soroot" - soname="$func_basename_result" - func_stripname 'lib' '.dll' "$soname" - newlib=libimp-$func_stripname_result.a - - # If the library has no export list, then create one now - if test -f "$output_objdir/$soname-def"; then : - else - func_verbose "extracting exported symbol list from \`$soname'" - func_execute_cmds "$extract_expsyms_cmds" 'exit $?' - fi - - # Create $newlib - if test -f "$output_objdir/$newlib"; then :; else - func_verbose "generating import library for \`$soname'" - func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' - fi - # make sure the library variables are pointing to the new library - dir=$output_objdir - linklib=$newlib - fi # test -n "$old_archive_from_expsyms_cmds" - - if test "$linkmode" = prog || test "$opt_mode" != relink; then - add_shlibpath= - add_dir= - add= - lib_linked=yes - case $hardcode_action in - immediate | unsupported) - if test "$hardcode_direct" = no; then - add="$dir/$linklib" - case $host in - *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; - *-*-sysv4*uw2*) add_dir="-L$dir" ;; - *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ - *-*-unixware7*) add_dir="-L$dir" ;; - *-*-darwin* ) - # if the lib is a (non-dlopened) module then we can not - # link against it, someone is ignoring the earlier warnings - if /usr/bin/file -L $add 2> /dev/null | - $GREP ": [^:]* bundle" >/dev/null ; then - if test "X$dlopenmodule" != "X$lib"; then - $ECHO "*** Warning: lib $linklib is a module, not a shared library" - if test -z "$old_library" ; then - echo - echo "*** And there doesn't seem to be a static archive available" - echo "*** The link will probably fail, sorry" - else - add="$dir/$old_library" - fi - elif test -n "$old_library"; then - add="$dir/$old_library" - fi - fi - esac - elif test "$hardcode_minus_L" = no; then - case $host in - *-*-sunos*) add_shlibpath="$dir" ;; - esac - add_dir="-L$dir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = no; then - add_shlibpath="$dir" - add="-l$name" - else - lib_linked=no - fi - ;; - relink) - if test "$hardcode_direct" = yes && - test "$hardcode_direct_absolute" = no; then - add="$dir/$linklib" - elif test "$hardcode_minus_L" = yes; then - add_dir="-L$absdir" - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case $libdir in - [\\/]*) - func_append add_dir " -L$inst_prefix_dir$libdir" - ;; - esac - fi - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - add_shlibpath="$dir" - add="-l$name" - else - lib_linked=no - fi - ;; - *) lib_linked=no ;; - esac - - if test "$lib_linked" != yes; then - func_fatal_configuration "unsupported hardcode properties" - fi - - if test -n "$add_shlibpath"; then - case :$compile_shlibpath: in - *":$add_shlibpath:"*) ;; - *) func_append compile_shlibpath "$add_shlibpath:" ;; - esac - fi - if test "$linkmode" = prog; then - test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" - test -n "$add" && compile_deplibs="$add $compile_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - if test "$hardcode_direct" != yes && - test "$hardcode_minus_L" != yes && - test "$hardcode_shlibpath_var" = yes; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) func_append finalize_shlibpath "$libdir:" ;; - esac - fi - fi - fi - - if test "$linkmode" = prog || test "$opt_mode" = relink; then - add_shlibpath= - add_dir= - add= - # Finalize command for both is simple: just hardcode it. - if test "$hardcode_direct" = yes && - test "$hardcode_direct_absolute" = no; then - add="$libdir/$linklib" - elif test "$hardcode_minus_L" = yes; then - add_dir="-L$libdir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) func_append finalize_shlibpath "$libdir:" ;; - esac - add="-l$name" - elif test "$hardcode_automatic" = yes; then - if test -n "$inst_prefix_dir" && - test -f "$inst_prefix_dir$libdir/$linklib" ; then - add="$inst_prefix_dir$libdir/$linklib" - else - add="$libdir/$linklib" - fi - else - # We cannot seem to hardcode it, guess we'll fake it. - add_dir="-L$libdir" - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case $libdir in - [\\/]*) - func_append add_dir " -L$inst_prefix_dir$libdir" - ;; - esac - fi - add="-l$name" - fi - - if test "$linkmode" = prog; then - test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" - test -n "$add" && finalize_deplibs="$add $finalize_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - fi - fi - elif test "$linkmode" = prog; then - # Here we assume that one of hardcode_direct or hardcode_minus_L - # is not unsupported. This is valid on all known static and - # shared platforms. - if test "$hardcode_direct" != unsupported; then - test -n "$old_library" && linklib="$old_library" - compile_deplibs="$dir/$linklib $compile_deplibs" - finalize_deplibs="$dir/$linklib $finalize_deplibs" - else - compile_deplibs="-l$name -L$dir $compile_deplibs" - finalize_deplibs="-l$name -L$dir $finalize_deplibs" - fi - elif test "$build_libtool_libs" = yes; then - # Not a shared library - if test "$deplibs_check_method" != pass_all; then - # We're trying link a shared library against a static one - # but the system doesn't support it. - - # Just print a warning and add the library to dependency_libs so - # that the program can be linked against the static library. - echo - $ECHO "*** Warning: This system can not link to static lib archive $lib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." - if test "$module" = yes; then - echo "*** But as you try to build a module library, libtool will still create " - echo "*** a static module, that should work as long as the dlopening application" - echo "*** is linked with the -dlopen flag to resolve symbols at runtime." - if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** \`nm' from GNU binutils and a full rebuild may help." - fi - if test "$build_old_libs" = no; then - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - else - deplibs="$dir/$old_library $deplibs" - link_static=yes - fi - fi # link shared/static library? - - if test "$linkmode" = lib; then - if test -n "$dependency_libs" && - { test "$hardcode_into_libs" != yes || - test "$build_old_libs" = yes || - test "$link_static" = yes; }; then - # Extract -R from dependency_libs - temp_deplibs= - for libdir in $dependency_libs; do - case $libdir in - -R*) func_stripname '-R' '' "$libdir" - temp_xrpath=$func_stripname_result - case " $xrpath " in - *" $temp_xrpath "*) ;; - *) func_append xrpath " $temp_xrpath";; - esac;; - *) func_append temp_deplibs " $libdir";; - esac - done - dependency_libs="$temp_deplibs" - fi - - func_append newlib_search_path " $absdir" - # Link against this library - test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" - # ... and its dependency_libs - tmp_libs= - for deplib in $dependency_libs; do - newdependency_libs="$deplib $newdependency_libs" - case $deplib in - -L*) func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result";; - *) func_resolve_sysroot "$deplib" ;; - esac - if $opt_preserve_dup_deps ; then - case "$tmp_libs " in - *" $func_resolve_sysroot_result "*) - func_append specialdeplibs " $func_resolve_sysroot_result" ;; - esac - fi - func_append tmp_libs " $func_resolve_sysroot_result" - done - - if test "$link_all_deplibs" != no; then - # Add the search paths of all dependency libraries - for deplib in $dependency_libs; do - path= - case $deplib in - -L*) path="$deplib" ;; - *.la) - func_resolve_sysroot "$deplib" - deplib=$func_resolve_sysroot_result - func_dirname "$deplib" "" "." - dir=$func_dirname_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - func_warning "cannot determine absolute directory name of \`$dir'" - absdir="$dir" - fi - ;; - esac - if $GREP "^installed=no" $deplib > /dev/null; then - case $host in - *-*-darwin*) - depdepl= - eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` - if test -n "$deplibrary_names" ; then - for tmp in $deplibrary_names ; do - depdepl=$tmp - done - if test -f "$absdir/$objdir/$depdepl" ; then - depdepl="$absdir/$objdir/$depdepl" - darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` - if test -z "$darwin_install_name"; then - darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` - fi - func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" - func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" - path= - fi - fi - ;; - *) - path="-L$absdir/$objdir" - ;; - esac - else - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - test -z "$libdir" && \ - func_fatal_error "\`$deplib' is not a valid libtool archive" - test "$absdir" != "$libdir" && \ - func_warning "\`$deplib' seems to be moved" - - path="-L$absdir" - fi - ;; - esac - case " $deplibs " in - *" $path "*) ;; - *) deplibs="$path $deplibs" ;; - esac - done - fi # link_all_deplibs != no - fi # linkmode = lib - done # for deplib in $libs - if test "$pass" = link; then - if test "$linkmode" = "prog"; then - compile_deplibs="$new_inherited_linker_flags $compile_deplibs" - finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" - else - compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - fi - fi - dependency_libs="$newdependency_libs" - if test "$pass" = dlpreopen; then - # Link the dlpreopened libraries before other libraries - for deplib in $save_deplibs; do - deplibs="$deplib $deplibs" - done - fi - if test "$pass" != dlopen; then - if test "$pass" != conv; then - # Make sure lib_search_path contains only unique directories. - lib_search_path= - for dir in $newlib_search_path; do - case "$lib_search_path " in - *" $dir "*) ;; - *) func_append lib_search_path " $dir" ;; - esac - done - newlib_search_path= - fi - - if test "$linkmode,$pass" != "prog,link"; then - vars="deplibs" - else - vars="compile_deplibs finalize_deplibs" - fi - for var in $vars dependency_libs; do - # Add libraries to $var in reverse order - eval tmp_libs=\"\$$var\" - new_libs= - for deplib in $tmp_libs; do - # FIXME: Pedantically, this is the right thing to do, so - # that some nasty dependency loop isn't accidentally - # broken: - #new_libs="$deplib $new_libs" - # Pragmatically, this seems to cause very few problems in - # practice: - case $deplib in - -L*) new_libs="$deplib $new_libs" ;; - -R*) ;; - *) - # And here is the reason: when a library appears more - # than once as an explicit dependence of a library, or - # is implicitly linked in more than once by the - # compiler, it is considered special, and multiple - # occurrences thereof are not removed. Compare this - # with having the same library being listed as a - # dependency of multiple other libraries: in this case, - # we know (pedantically, we assume) the library does not - # need to be listed more than once, so we keep only the - # last copy. This is not always right, but it is rare - # enough that we require users that really mean to play - # such unportable linking tricks to link the library - # using -Wl,-lname, so that libtool does not consider it - # for duplicate removal. - case " $specialdeplibs " in - *" $deplib "*) new_libs="$deplib $new_libs" ;; - *) - case " $new_libs " in - *" $deplib "*) ;; - *) new_libs="$deplib $new_libs" ;; - esac - ;; - esac - ;; - esac - done - tmp_libs= - for deplib in $new_libs; do - case $deplib in - -L*) - case " $tmp_libs " in - *" $deplib "*) ;; - *) func_append tmp_libs " $deplib" ;; - esac - ;; - *) func_append tmp_libs " $deplib" ;; - esac - done - eval $var=\"$tmp_libs\" - done # for var - fi - # Last step: remove runtime libs from dependency_libs - # (they stay in deplibs) - tmp_libs= - for i in $dependency_libs ; do - case " $predeps $postdeps $compiler_lib_search_path " in - *" $i "*) - i="" - ;; - esac - if test -n "$i" ; then - func_append tmp_libs " $i" - fi - done - dependency_libs=$tmp_libs - done # for pass - if test "$linkmode" = prog; then - dlfiles="$newdlfiles" - fi - if test "$linkmode" = prog || test "$linkmode" = lib; then - dlprefiles="$newdlprefiles" - fi - - case $linkmode in - oldlib) - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - func_warning "\`-dlopen' is ignored for archives" - fi - - case " $deplibs" in - *\ -l* | *\ -L*) - func_warning "\`-l' and \`-L' are ignored for archives" ;; - esac - - test -n "$rpath" && \ - func_warning "\`-rpath' is ignored for archives" - - test -n "$xrpath" && \ - func_warning "\`-R' is ignored for archives" - - test -n "$vinfo" && \ - func_warning "\`-version-info/-version-number' is ignored for archives" - - test -n "$release" && \ - func_warning "\`-release' is ignored for archives" - - test -n "$export_symbols$export_symbols_regex" && \ - func_warning "\`-export-symbols' is ignored for archives" - - # Now set the variables for building old libraries. - build_libtool_libs=no - oldlibs="$output" - func_append objs "$old_deplibs" - ;; - - lib) - # Make sure we only generate libraries of the form `libNAME.la'. - case $outputname in - lib*) - func_stripname 'lib' '.la' "$outputname" - name=$func_stripname_result - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - ;; - *) - test "$module" = no && \ - func_fatal_help "libtool library \`$output' must begin with \`lib'" - - if test "$need_lib_prefix" != no; then - # Add the "lib" prefix for modules if required - func_stripname '' '.la' "$outputname" - name=$func_stripname_result - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - else - func_stripname '' '.la' "$outputname" - libname=$func_stripname_result - fi - ;; - esac - - if test -n "$objs"; then - if test "$deplibs_check_method" != pass_all; then - func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" - else - echo - $ECHO "*** Warning: Linking the shared library $output against the non-libtool" - $ECHO "*** objects $objs is not portable!" - func_append libobjs " $objs" - fi - fi - - test "$dlself" != no && \ - func_warning "\`-dlopen self' is ignored for libtool libraries" - - set dummy $rpath - shift - test "$#" -gt 1 && \ - func_warning "ignoring multiple \`-rpath's for a libtool library" - - install_libdir="$1" - - oldlibs= - if test -z "$rpath"; then - if test "$build_libtool_libs" = yes; then - # Building a libtool convenience library. - # Some compilers have problems with a `.al' extension so - # convenience libraries should have the same extension an - # archive normally would. - oldlibs="$output_objdir/$libname.$libext $oldlibs" - build_libtool_libs=convenience - build_old_libs=yes - fi - - test -n "$vinfo" && \ - func_warning "\`-version-info/-version-number' is ignored for convenience libraries" - - test -n "$release" && \ - func_warning "\`-release' is ignored for convenience libraries" - else - - # Parse the version information argument. - save_ifs="$IFS"; IFS=':' - set dummy $vinfo 0 0 0 - shift - IFS="$save_ifs" - - test -n "$7" && \ - func_fatal_help "too many parameters to \`-version-info'" - - # convert absolute version numbers to libtool ages - # this retains compatibility with .la files and attempts - # to make the code below a bit more comprehensible - - case $vinfo_number in - yes) - number_major="$1" - number_minor="$2" - number_revision="$3" - # - # There are really only two kinds -- those that - # use the current revision as the major version - # and those that subtract age and use age as - # a minor version. But, then there is irix - # which has an extra 1 added just for fun - # - case $version_type in - # correct linux to gnu/linux during the next big refactor - darwin|linux|osf|windows|none) - func_arith $number_major + $number_minor - current=$func_arith_result - age="$number_minor" - revision="$number_revision" - ;; - freebsd-aout|freebsd-elf|qnx|sunos) - current="$number_major" - revision="$number_minor" - age="0" - ;; - irix|nonstopux) - func_arith $number_major + $number_minor - current=$func_arith_result - age="$number_minor" - revision="$number_minor" - lt_irix_increment=no - ;; - esac - ;; - no) - current="$1" - revision="$2" - age="$3" - ;; - esac - - # Check that each of the things are valid numbers. - case $current in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "CURRENT \`$current' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" - ;; - esac - - case $revision in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "REVISION \`$revision' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" - ;; - esac - - case $age in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "AGE \`$age' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" - ;; - esac - - if test "$age" -gt "$current"; then - func_error "AGE \`$age' is greater than the current interface number \`$current'" - func_fatal_error "\`$vinfo' is not valid version information" - fi - - # Calculate the version variables. - major= - versuffix= - verstring= - case $version_type in - none) ;; - - darwin) - # Like Linux, but with the current version available in - # verstring for coding it into the library header - func_arith $current - $age - major=.$func_arith_result - versuffix="$major.$age.$revision" - # Darwin ld doesn't like 0 for these options... - func_arith $current + 1 - minor_current=$func_arith_result - xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" - verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" - ;; - - freebsd-aout) - major=".$current" - versuffix=".$current.$revision"; - ;; - - freebsd-elf) - major=".$current" - versuffix=".$current" - ;; - - irix | nonstopux) - if test "X$lt_irix_increment" = "Xno"; then - func_arith $current - $age - else - func_arith $current - $age + 1 - fi - major=$func_arith_result - - case $version_type in - nonstopux) verstring_prefix=nonstopux ;; - *) verstring_prefix=sgi ;; - esac - verstring="$verstring_prefix$major.$revision" - - # Add in all the interfaces that we are compatible with. - loop=$revision - while test "$loop" -ne 0; do - func_arith $revision - $loop - iface=$func_arith_result - func_arith $loop - 1 - loop=$func_arith_result - verstring="$verstring_prefix$major.$iface:$verstring" - done - - # Before this point, $major must not contain `.'. - major=.$major - versuffix="$major.$revision" - ;; - - linux) # correct to gnu/linux during the next big refactor - func_arith $current - $age - major=.$func_arith_result - versuffix="$major.$age.$revision" - ;; - - osf) - func_arith $current - $age - major=.$func_arith_result - versuffix=".$current.$age.$revision" - verstring="$current.$age.$revision" - - # Add in all the interfaces that we are compatible with. - loop=$age - while test "$loop" -ne 0; do - func_arith $current - $loop - iface=$func_arith_result - func_arith $loop - 1 - loop=$func_arith_result - verstring="$verstring:${iface}.0" - done - - # Make executables depend on our current version. - func_append verstring ":${current}.0" - ;; - - qnx) - major=".$current" - versuffix=".$current" - ;; - - sunos) - major=".$current" - versuffix=".$current.$revision" - ;; - - windows) - # Use '-' rather than '.', since we only want one - # extension on DOS 8.3 filesystems. - func_arith $current - $age - major=$func_arith_result - versuffix="-$major" - ;; - - *) - func_fatal_configuration "unknown library version type \`$version_type'" - ;; - esac - - # Clear the version info if we defaulted, and they specified a release. - if test -z "$vinfo" && test -n "$release"; then - major= - case $version_type in - darwin) - # we can't check for "0.0" in archive_cmds due to quoting - # problems, so we reset it completely - verstring= - ;; - *) - verstring="0.0" - ;; - esac - if test "$need_version" = no; then - versuffix= - else - versuffix=".0.0" - fi - fi - - # Remove version info from name if versioning should be avoided - if test "$avoid_version" = yes && test "$need_version" = no; then - major= - versuffix= - verstring="" - fi - - # Check to see if the archive will have undefined symbols. - if test "$allow_undefined" = yes; then - if test "$allow_undefined_flag" = unsupported; then - func_warning "undefined symbols not allowed in $host shared libraries" - build_libtool_libs=no - build_old_libs=yes - fi - else - # Don't allow undefined symbols. - allow_undefined_flag="$no_undefined_flag" - fi - - fi - - func_generate_dlsyms "$libname" "$libname" "yes" - func_append libobjs " $symfileobj" - test "X$libobjs" = "X " && libobjs= - - if test "$opt_mode" != relink; then - # Remove our outputs, but don't remove object files since they - # may have been created when compiling PIC objects. - removelist= - tempremovelist=`$ECHO "$output_objdir/*"` - for p in $tempremovelist; do - case $p in - *.$objext | *.gcno) - ;; - $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) - if test "X$precious_files_regex" != "X"; then - if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 - then - continue - fi - fi - func_append removelist " $p" - ;; - *) ;; - esac - done - test -n "$removelist" && \ - func_show_eval "${RM}r \$removelist" - fi - - # Now set the variables for building old libraries. - if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then - func_append oldlibs " $output_objdir/$libname.$libext" - - # Transform .lo files to .o files. - oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` - fi - - # Eliminate all temporary directories. - #for path in $notinst_path; do - # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` - # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` - # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` - #done - - if test -n "$xrpath"; then - # If the user specified any rpath flags, then add them. - temp_xrpath= - for libdir in $xrpath; do - func_replace_sysroot "$libdir" - func_append temp_xrpath " -R$func_replace_sysroot_result" - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - done - if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then - dependency_libs="$temp_xrpath $dependency_libs" - fi - fi - - # Make sure dlfiles contains only unique files that won't be dlpreopened - old_dlfiles="$dlfiles" - dlfiles= - for lib in $old_dlfiles; do - case " $dlprefiles $dlfiles " in - *" $lib "*) ;; - *) func_append dlfiles " $lib" ;; - esac - done - - # Make sure dlprefiles contains only unique files - old_dlprefiles="$dlprefiles" - dlprefiles= - for lib in $old_dlprefiles; do - case "$dlprefiles " in - *" $lib "*) ;; - *) func_append dlprefiles " $lib" ;; - esac - done - - if test "$build_libtool_libs" = yes; then - if test -n "$rpath"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) - # these systems don't actually have a c library (as such)! - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C library is in the System framework - func_append deplibs " System.ltframework" - ;; - *-*-netbsd*) - # Don't link with libc until the a.out ld.so is fixed. - ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) - # Do not include libc due to us having libc/libc_r. - ;; - *-*-sco3.2v5* | *-*-sco5v6*) - # Causes problems with __ctype - ;; - *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) - # Compiler inserts libc in the correct place for threads to work - ;; - *) - # Add libc to deplibs on all other systems if necessary. - if test "$build_libtool_need_lc" = "yes"; then - func_append deplibs " -lc" - fi - ;; - esac - fi - - # Transform deplibs into only deplibs that can be linked in shared. - name_save=$name - libname_save=$libname - release_save=$release - versuffix_save=$versuffix - major_save=$major - # I'm not sure if I'm treating the release correctly. I think - # release should show up in the -l (ie -lgmp5) so we don't want to - # add it in twice. Is that correct? - release="" - versuffix="" - major="" - newdeplibs= - droppeddeps=no - case $deplibs_check_method in - pass_all) - # Don't check for shared/static. Everything works. - # This might be a little naive. We might want to check - # whether the library exists or not. But this is on - # osf3 & osf4 and I'm not really sure... Just - # implementing what was already the behavior. - newdeplibs=$deplibs - ;; - test_compile) - # This code stresses the "libraries are programs" paradigm to its - # limits. Maybe even breaks it. We compile a program, linking it - # against the deplibs as a proxy for the library. Then we can check - # whether they linked in statically or dynamically with ldd. - $opt_dry_run || $RM conftest.c - cat > conftest.c </dev/null` - $nocaseglob - else - potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` - fi - for potent_lib in $potential_libs; do - # Follow soft links. - if ls -lLd "$potent_lib" 2>/dev/null | - $GREP " -> " >/dev/null; then - continue - fi - # The statement above tries to avoid entering an - # endless loop below, in case of cyclic links. - # We might still enter an endless loop, since a link - # loop can be closed while we follow links, - # but so what? - potlib="$potent_lib" - while test -h "$potlib" 2>/dev/null; do - potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` - case $potliblink in - [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; - *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; - esac - done - if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | - $SED -e 10q | - $EGREP "$file_magic_regex" > /dev/null; then - func_append newdeplibs " $a_deplib" - a_deplib="" - break 2 - fi - done - done - fi - if test -n "$a_deplib" ; then - droppeddeps=yes - echo - $ECHO "*** Warning: linker path does not have real file for library $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because I did check the linker path looking for a file starting" - if test -z "$potlib" ; then - $ECHO "*** with $libname but no candidates were found. (...for file magic test)" - else - $ECHO "*** with $libname and none of the candidates passed a file format test" - $ECHO "*** using a file magic. Last file checked: $potlib" - fi - fi - ;; - *) - # Add a -L argument. - func_append newdeplibs " $a_deplib" - ;; - esac - done # Gone through all deplibs. - ;; - match_pattern*) - set dummy $deplibs_check_method; shift - match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - for a_deplib in $deplibs; do - case $a_deplib in - -l*) - func_stripname -l '' "$a_deplib" - name=$func_stripname_result - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $a_deplib "*) - func_append newdeplibs " $a_deplib" - a_deplib="" - ;; - esac - fi - if test -n "$a_deplib" ; then - libname=`eval "\\$ECHO \"$libname_spec\""` - for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - potential_libs=`ls $i/$libname[.-]* 2>/dev/null` - for potent_lib in $potential_libs; do - potlib="$potent_lib" # see symlink-check above in file_magic test - if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ - $EGREP "$match_pattern_regex" > /dev/null; then - func_append newdeplibs " $a_deplib" - a_deplib="" - break 2 - fi - done - done - fi - if test -n "$a_deplib" ; then - droppeddeps=yes - echo - $ECHO "*** Warning: linker path does not have real file for library $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because I did check the linker path looking for a file starting" - if test -z "$potlib" ; then - $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" - else - $ECHO "*** with $libname and none of the candidates passed a file format test" - $ECHO "*** using a regex pattern. Last file checked: $potlib" - fi - fi - ;; - *) - # Add a -L argument. - func_append newdeplibs " $a_deplib" - ;; - esac - done # Gone through all deplibs. - ;; - none | unknown | *) - newdeplibs="" - tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - for i in $predeps $postdeps ; do - # can't use Xsed below, because $i might contain '/' - tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` - done - fi - case $tmp_deplibs in - *[!\ \ ]*) - echo - if test "X$deplibs_check_method" = "Xnone"; then - echo "*** Warning: inter-library dependencies are not supported in this platform." - else - echo "*** Warning: inter-library dependencies are not known to be supported." - fi - echo "*** All declared inter-library dependencies are being dropped." - droppeddeps=yes - ;; - esac - ;; - esac - versuffix=$versuffix_save - major=$major_save - release=$release_save - libname=$libname_save - name=$name_save - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library with the System framework - newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` - ;; - esac - - if test "$droppeddeps" = yes; then - if test "$module" = yes; then - echo - echo "*** Warning: libtool could not satisfy all declared inter-library" - $ECHO "*** dependencies of module $libname. Therefore, libtool will create" - echo "*** a static module, that should work as long as the dlopening" - echo "*** application is linked with the -dlopen flag." - if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** \`nm' from GNU binutils and a full rebuild may help." - fi - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - else - echo "*** The inter-library dependencies that have been dropped here will be" - echo "*** automatically added whenever a program is linked with this library" - echo "*** or is declared to -dlopen it." - - if test "$allow_undefined" = no; then - echo - echo "*** Since this library must not contain undefined symbols," - echo "*** because either the platform does not support them or" - echo "*** it was explicitly requested with -no-undefined," - echo "*** libtool will only create a static version of it." - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - fi - fi - # Done checking deplibs! - deplibs=$newdeplibs - fi - # Time to change all our "foo.ltframework" stuff back to "-framework foo" - case $host in - *-*-darwin*) - newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - ;; - esac - - # move library search paths that coincide with paths to not yet - # installed libraries to the beginning of the library search list - new_libs= - for path in $notinst_path; do - case " $new_libs " in - *" -L$path/$objdir "*) ;; - *) - case " $deplibs " in - *" -L$path/$objdir "*) - func_append new_libs " -L$path/$objdir" ;; - esac - ;; - esac - done - for deplib in $deplibs; do - case $deplib in - -L*) - case " $new_libs " in - *" $deplib "*) ;; - *) func_append new_libs " $deplib" ;; - esac - ;; - *) func_append new_libs " $deplib" ;; - esac - done - deplibs="$new_libs" - - # All the library-specific variables (install_libdir is set above). - library_names= - old_library= - dlname= - - # Test again, we may have decided not to build it any more - if test "$build_libtool_libs" = yes; then - # Remove ${wl} instances when linking with ld. - # FIXME: should test the right _cmds variable. - case $archive_cmds in - *\$LD\ *) wl= ;; - esac - if test "$hardcode_into_libs" = yes; then - # Hardcode the library paths - hardcode_libdirs= - dep_rpath= - rpath="$finalize_rpath" - test "$opt_mode" != relink && rpath="$compile_rpath$rpath" - for libdir in $rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - func_replace_sysroot "$libdir" - libdir=$func_replace_sysroot_result - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append dep_rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) func_append perm_rpath " $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" - fi - if test -n "$runpath_var" && test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - func_append rpath "$dir:" - done - eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" - fi - test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" - fi - - shlibpath="$finalize_shlibpath" - test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" - if test -n "$shlibpath"; then - eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" - fi - - # Get the real and link names of the library. - eval shared_ext=\"$shrext_cmds\" - eval library_names=\"$library_names_spec\" - set dummy $library_names - shift - realname="$1" - shift - - if test -n "$soname_spec"; then - eval soname=\"$soname_spec\" - else - soname="$realname" - fi - if test -z "$dlname"; then - dlname=$soname - fi - - lib="$output_objdir/$realname" - linknames= - for link - do - func_append linknames " $link" - done - - # Use standard objects if they are pic - test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` - test "X$libobjs" = "X " && libobjs= - - delfiles= - if test -n "$export_symbols" && test -n "$include_expsyms"; then - $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" - export_symbols="$output_objdir/$libname.uexp" - func_append delfiles " $export_symbols" - fi - - orig_export_symbols= - case $host_os in - cygwin* | mingw* | cegcc*) - if test -n "$export_symbols" && test -z "$export_symbols_regex"; then - # exporting using user supplied symfile - if test "x`$SED 1q $export_symbols`" != xEXPORTS; then - # and it's NOT already a .def file. Must figure out - # which of the given symbols are data symbols and tag - # them as such. So, trigger use of export_symbols_cmds. - # export_symbols gets reassigned inside the "prepare - # the list of exported symbols" if statement, so the - # include_expsyms logic still works. - orig_export_symbols="$export_symbols" - export_symbols= - always_export_symbols=yes - fi - fi - ;; - esac - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then - func_verbose "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $opt_dry_run || $RM $export_symbols - cmds=$export_symbols_cmds - save_ifs="$IFS"; IFS='~' - for cmd1 in $cmds; do - IFS="$save_ifs" - # Take the normal branch if the nm_file_list_spec branch - # doesn't work or if tool conversion is not needed. - case $nm_file_list_spec~$to_tool_file_cmd in - *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) - try_normal_branch=yes - eval cmd=\"$cmd1\" - func_len " $cmd" - len=$func_len_result - ;; - *) - try_normal_branch=no - ;; - esac - if test "$try_normal_branch" = yes \ - && { test "$len" -lt "$max_cmd_len" \ - || test "$max_cmd_len" -le -1; } - then - func_show_eval "$cmd" 'exit $?' - skipped_export=false - elif test -n "$nm_file_list_spec"; then - func_basename "$output" - output_la=$func_basename_result - save_libobjs=$libobjs - save_output=$output - output=${output_objdir}/${output_la}.nm - func_to_tool_file "$output" - libobjs=$nm_file_list_spec$func_to_tool_file_result - func_append delfiles " $output" - func_verbose "creating $NM input file list: $output" - for obj in $save_libobjs; do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" - done > "$output" - eval cmd=\"$cmd1\" - func_show_eval "$cmd" 'exit $?' - output=$save_output - libobjs=$save_libobjs - skipped_export=false - else - # The command line is too long to execute in one step. - func_verbose "using reloadable object file for export list..." - skipped_export=: - # Break out early, otherwise skipped_export may be - # set to false by a later but shorter cmd. - break - fi - done - IFS="$save_ifs" - if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then - func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - func_show_eval '$MV "${export_symbols}T" "$export_symbols"' - fi - fi - fi - - if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols="$export_symbols" - test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" - $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' - fi - - if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then - # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" - # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands which not all seds can handle. GNU sed should be fine - # though. Also, the filter scales superlinearly with the number of - # global variables. join(1) would be nice here, but unfortunately - # isn't a blessed tool. - $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - func_append delfiles " $export_symbols $output_objdir/$libname.filter" - export_symbols=$output_objdir/$libname.def - $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols - fi - - tmp_deplibs= - for test_deplib in $deplibs; do - case " $convenience " in - *" $test_deplib "*) ;; - *) - func_append tmp_deplibs " $test_deplib" - ;; - esac - done - deplibs="$tmp_deplibs" - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec" && - test "$compiler_needs_object" = yes && - test -z "$libobjs"; then - # extract the archives, so we have objects to list. - # TODO: could optimize this to just extract one archive. - whole_archive_flag_spec= - fi - if test -n "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - test "X$libobjs" = "X " && libobjs= - else - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - - func_extract_archives $gentop $convenience - func_append libobjs " $func_extract_archives_result" - test "X$libobjs" = "X " && libobjs= - fi - fi - - if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then - eval flag=\"$thread_safe_flag_spec\" - func_append linker_flags " $flag" - fi - - # Make a backup of the uninstalled library when relinking - if test "$opt_mode" = relink; then - $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? - fi - - # Do each of the archive commands. - if test "$module" = yes && test -n "$module_cmds" ; then - if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then - eval test_cmds=\"$module_expsym_cmds\" - cmds=$module_expsym_cmds - else - eval test_cmds=\"$module_cmds\" - cmds=$module_cmds - fi - else - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - eval test_cmds=\"$archive_expsym_cmds\" - cmds=$archive_expsym_cmds - else - eval test_cmds=\"$archive_cmds\" - cmds=$archive_cmds - fi - fi - - if test "X$skipped_export" != "X:" && - func_len " $test_cmds" && - len=$func_len_result && - test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then - : - else - # The command line is too long to link in one step, link piecewise - # or, if using GNU ld and skipped_export is not :, use a linker - # script. - - # Save the value of $output and $libobjs because we want to - # use them later. If we have whole_archive_flag_spec, we - # want to use save_libobjs as it was before - # whole_archive_flag_spec was expanded, because we can't - # assume the linker understands whole_archive_flag_spec. - # This may have to be revisited, in case too many - # convenience libraries get linked in and end up exceeding - # the spec. - if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - fi - save_output=$output - func_basename "$output" - output_la=$func_basename_result - - # Clear the reloadable object creation command queue and - # initialize k to one. - test_cmds= - concat_cmds= - objlist= - last_robj= - k=1 - - if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then - output=${output_objdir}/${output_la}.lnkscript - func_verbose "creating GNU ld script: $output" - echo 'INPUT (' > $output - for obj in $save_libobjs - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" >> $output - done - echo ')' >> $output - func_append delfiles " $output" - func_to_tool_file "$output" - output=$func_to_tool_file_result - elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then - output=${output_objdir}/${output_la}.lnk - func_verbose "creating linker input file list: $output" - : > $output - set x $save_libobjs - shift - firstobj= - if test "$compiler_needs_object" = yes; then - firstobj="$1 " - shift - fi - for obj - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" >> $output - done - func_append delfiles " $output" - func_to_tool_file "$output" - output=$firstobj\"$file_list_spec$func_to_tool_file_result\" - else - if test -n "$save_libobjs"; then - func_verbose "creating reloadable object files..." - output=$output_objdir/$output_la-${k}.$objext - eval test_cmds=\"$reload_cmds\" - func_len " $test_cmds" - len0=$func_len_result - len=$len0 - - # Loop over the list of objects to be linked. - for obj in $save_libobjs - do - func_len " $obj" - func_arith $len + $func_len_result - len=$func_arith_result - if test "X$objlist" = X || - test "$len" -lt "$max_cmd_len"; then - func_append objlist " $obj" - else - # The command $test_cmds is almost too long, add a - # command to the queue. - if test "$k" -eq 1 ; then - # The first file doesn't have a previous command to add. - reload_objs=$objlist - eval concat_cmds=\"$reload_cmds\" - else - # All subsequent reloadable object files will link in - # the last one created. - reload_objs="$objlist $last_robj" - eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" - fi - last_robj=$output_objdir/$output_la-${k}.$objext - func_arith $k + 1 - k=$func_arith_result - output=$output_objdir/$output_la-${k}.$objext - objlist=" $obj" - func_len " $last_robj" - func_arith $len0 + $func_len_result - len=$func_arith_result - fi - done - # Handle the remaining objects by creating one last - # reloadable object file. All subsequent reloadable object - # files will link in the last one created. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - reload_objs="$objlist $last_robj" - eval concat_cmds=\"\${concat_cmds}$reload_cmds\" - if test -n "$last_robj"; then - eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" - fi - func_append delfiles " $output" - - else - output= - fi - - if ${skipped_export-false}; then - func_verbose "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $opt_dry_run || $RM $export_symbols - libobjs=$output - # Append the command to create the export file. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" - if test -n "$last_robj"; then - eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" - fi - fi - - test -n "$save_libobjs" && - func_verbose "creating a temporary reloadable object file: $output" - - # Loop through the commands generated above and execute them. - save_ifs="$IFS"; IFS='~' - for cmd in $concat_cmds; do - IFS="$save_ifs" - $opt_silent || { - func_quote_for_expand "$cmd" - eval "func_echo $func_quote_for_expand_result" - } - $opt_dry_run || eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then - ( cd "$output_objdir" && \ - $RM "${realname}T" && \ - $MV "${realname}U" "$realname" ) - fi - - exit $lt_exit - } - done - IFS="$save_ifs" - - if test -n "$export_symbols_regex" && ${skipped_export-false}; then - func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - func_show_eval '$MV "${export_symbols}T" "$export_symbols"' - fi - fi - - if ${skipped_export-false}; then - if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols="$export_symbols" - test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" - $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' - fi - - if test -n "$orig_export_symbols"; then - # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" - # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands which not all seds can handle. GNU sed should be fine - # though. Also, the filter scales superlinearly with the number of - # global variables. join(1) would be nice here, but unfortunately - # isn't a blessed tool. - $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - func_append delfiles " $export_symbols $output_objdir/$libname.filter" - export_symbols=$output_objdir/$libname.def - $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols - fi - fi - - libobjs=$output - # Restore the value of output. - output=$save_output - - if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - test "X$libobjs" = "X " && libobjs= - fi - # Expand the library linking commands again to reset the - # value of $libobjs for piecewise linking. - - # Do each of the archive commands. - if test "$module" = yes && test -n "$module_cmds" ; then - if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then - cmds=$module_expsym_cmds - else - cmds=$module_cmds - fi - else - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - cmds=$archive_expsym_cmds - else - cmds=$archive_cmds - fi - fi - fi - - if test -n "$delfiles"; then - # Append the command to remove temporary files to $cmds. - eval cmds=\"\$cmds~\$RM $delfiles\" - fi - - # Add any objects from preloaded convenience libraries - if test -n "$dlprefiles"; then - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - - func_extract_archives $gentop $dlprefiles - func_append libobjs " $func_extract_archives_result" - test "X$libobjs" = "X " && libobjs= - fi - - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $opt_silent || { - func_quote_for_expand "$cmd" - eval "func_echo $func_quote_for_expand_result" - } - $opt_dry_run || eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then - ( cd "$output_objdir" && \ - $RM "${realname}T" && \ - $MV "${realname}U" "$realname" ) - fi - - exit $lt_exit - } - done - IFS="$save_ifs" - - # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then - $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? - - if test -n "$convenience"; then - if test -z "$whole_archive_flag_spec"; then - func_show_eval '${RM}r "$gentop"' - fi - fi - - exit $EXIT_SUCCESS - fi - - # Create links to the real library. - for linkname in $linknames; do - if test "$realname" != "$linkname"; then - func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' - fi - done - - # If -module or -export-dynamic was specified, set the dlname. - if test "$module" = yes || test "$export_dynamic" = yes; then - # On all known operating systems, these are identical. - dlname="$soname" - fi - fi - ;; - - obj) - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - func_warning "\`-dlopen' is ignored for objects" - fi - - case " $deplibs" in - *\ -l* | *\ -L*) - func_warning "\`-l' and \`-L' are ignored for objects" ;; - esac - - test -n "$rpath" && \ - func_warning "\`-rpath' is ignored for objects" - - test -n "$xrpath" && \ - func_warning "\`-R' is ignored for objects" - - test -n "$vinfo" && \ - func_warning "\`-version-info' is ignored for objects" - - test -n "$release" && \ - func_warning "\`-release' is ignored for objects" - - case $output in - *.lo) - test -n "$objs$old_deplibs" && \ - func_fatal_error "cannot build library object \`$output' from non-libtool objects" - - libobj=$output - func_lo2o "$libobj" - obj=$func_lo2o_result - ;; - *) - libobj= - obj="$output" - ;; - esac - - # Delete the old objects. - $opt_dry_run || $RM $obj $libobj - - # Objects from convenience libraries. This assumes - # single-version convenience libraries. Whenever we create - # different ones for PIC/non-PIC, this we'll have to duplicate - # the extraction. - reload_conv_objs= - gentop= - # reload_cmds runs $LD directly, so let us get rid of - # -Wl from whole_archive_flag_spec and hope we can get by with - # turning comma into space.. - wl= - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" - reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` - else - gentop="$output_objdir/${obj}x" - func_append generated " $gentop" - - func_extract_archives $gentop $convenience - reload_conv_objs="$reload_objs $func_extract_archives_result" - fi - fi - - # If we're not building shared, we need to use non_pic_objs - test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" - - # Create the old-style object. - reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test - - output="$obj" - func_execute_cmds "$reload_cmds" 'exit $?' - - # Exit if we aren't doing a library object file. - if test -z "$libobj"; then - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - exit $EXIT_SUCCESS - fi - - if test "$build_libtool_libs" != yes; then - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - # Create an invalid libtool object if no PIC, so that we don't - # accidentally link it into a program. - # $show "echo timestamp > $libobj" - # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? - exit $EXIT_SUCCESS - fi - - if test -n "$pic_flag" || test "$pic_mode" != default; then - # Only do commands if we really have different PIC objects. - reload_objs="$libobjs $reload_conv_objs" - output="$libobj" - func_execute_cmds "$reload_cmds" 'exit $?' - fi - - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - exit $EXIT_SUCCESS - ;; - - prog) - case $host in - *cygwin*) func_stripname '' '.exe' "$output" - output=$func_stripname_result.exe;; - esac - test -n "$vinfo" && \ - func_warning "\`-version-info' is ignored for programs" - - test -n "$release" && \ - func_warning "\`-release' is ignored for programs" - - test "$preload" = yes \ - && test "$dlopen_support" = unknown \ - && test "$dlopen_self" = unknown \ - && test "$dlopen_self_static" = unknown && \ - func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library is the System framework - compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` - finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` - ;; - esac - - case $host in - *-*-darwin*) - # Don't allow lazy linking, it breaks C++ global constructors - # But is supposedly fixed on 10.4 or later (yay!). - if test "$tagname" = CXX ; then - case ${MACOSX_DEPLOYMENT_TARGET-10.0} in - 10.[0123]) - func_append compile_command " ${wl}-bind_at_load" - func_append finalize_command " ${wl}-bind_at_load" - ;; - esac - fi - # Time to change all our "foo.ltframework" stuff back to "-framework foo" - compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - ;; - esac - - - # move library search paths that coincide with paths to not yet - # installed libraries to the beginning of the library search list - new_libs= - for path in $notinst_path; do - case " $new_libs " in - *" -L$path/$objdir "*) ;; - *) - case " $compile_deplibs " in - *" -L$path/$objdir "*) - func_append new_libs " -L$path/$objdir" ;; - esac - ;; - esac - done - for deplib in $compile_deplibs; do - case $deplib in - -L*) - case " $new_libs " in - *" $deplib "*) ;; - *) func_append new_libs " $deplib" ;; - esac - ;; - *) func_append new_libs " $deplib" ;; - esac - done - compile_deplibs="$new_libs" - - - func_append compile_command " $compile_deplibs" - func_append finalize_command " $finalize_deplibs" - - if test -n "$rpath$xrpath"; then - # If the user specified any rpath flags, then add them. - for libdir in $rpath $xrpath; do - # This is the magic to use -rpath. - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - done - fi - - # Now hardcode the library paths - rpath= - hardcode_libdirs= - for libdir in $compile_rpath $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) func_append perm_rpath " $libdir" ;; - esac - fi - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$libdir:"*) ;; - ::) dllsearchpath=$libdir;; - *) func_append dllsearchpath ":$libdir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - ::) dllsearchpath=$testbindir;; - *) func_append dllsearchpath ":$testbindir";; - esac - ;; - esac - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - compile_rpath="$rpath" - - rpath= - hardcode_libdirs= - for libdir in $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$finalize_perm_rpath " in - *" $libdir "*) ;; - *) func_append finalize_perm_rpath " $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - finalize_rpath="$rpath" - - if test -n "$libobjs" && test "$build_old_libs" = yes; then - # Transform all the library objects into standard objects. - compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` - finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` - fi - - func_generate_dlsyms "$outputname" "@PROGRAM@" "no" - - # template prelinking step - if test -n "$prelink_cmds"; then - func_execute_cmds "$prelink_cmds" 'exit $?' - fi - - wrappers_required=yes - case $host in - *cegcc* | *mingw32ce*) - # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. - wrappers_required=no - ;; - *cygwin* | *mingw* ) - if test "$build_libtool_libs" != yes; then - wrappers_required=no - fi - ;; - *) - if test "$need_relink" = no || test "$build_libtool_libs" != yes; then - wrappers_required=no - fi - ;; - esac - if test "$wrappers_required" = no; then - # Replace the output file specification. - compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` - link_command="$compile_command$compile_rpath" - - # We have no uninstalled library dependencies, so finalize right now. - exit_status=0 - func_show_eval "$link_command" 'exit_status=$?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - # Delete the generated files. - if test -f "$output_objdir/${outputname}S.${objext}"; then - func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' - fi - - exit $exit_status - fi - - if test -n "$compile_shlibpath$finalize_shlibpath"; then - compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" - fi - if test -n "$finalize_shlibpath"; then - finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" - fi - - compile_var= - finalize_var= - if test -n "$runpath_var"; then - if test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - func_append rpath "$dir:" - done - compile_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - if test -n "$finalize_perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $finalize_perm_rpath; do - func_append rpath "$dir:" - done - finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - fi - - if test "$no_install" = yes; then - # We don't need to create a wrapper script. - link_command="$compile_var$compile_command$compile_rpath" - # Replace the output file specification. - link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` - # Delete the old output file. - $opt_dry_run || $RM $output - # Link the executable and exit - func_show_eval "$link_command" 'exit $?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - exit $EXIT_SUCCESS - fi - - if test "$hardcode_action" = relink; then - # Fast installation is not supported - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - - func_warning "this platform does not like uninstalled shared libraries" - func_warning "\`$output' will be relinked during installation" - else - if test "$fast_install" != no; then - link_command="$finalize_var$compile_command$finalize_rpath" - if test "$fast_install" = yes; then - relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` - else - # fast_install is set to needless - relink_command= - fi - else - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - fi - fi - - # Replace the output file specification. - link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` - - # Delete the old output files. - $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname - - func_show_eval "$link_command" 'exit $?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output_objdir/$outputname" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - # Now create the wrapper script. - func_verbose "creating $output" - - # Quote the relink command for shipping. - if test -n "$relink_command"; then - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - func_quote_for_eval "$var_value" - relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" - fi - done - relink_command="(cd `pwd`; $relink_command)" - relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` - fi - - # Only actually do things if not in dry run mode. - $opt_dry_run || { - # win32 will think the script is a binary if it has - # a .exe suffix, so we strip it off here. - case $output in - *.exe) func_stripname '' '.exe' "$output" - output=$func_stripname_result ;; - esac - # test for cygwin because mv fails w/o .exe extensions - case $host in - *cygwin*) - exeext=.exe - func_stripname '' '.exe' "$outputname" - outputname=$func_stripname_result ;; - *) exeext= ;; - esac - case $host in - *cygwin* | *mingw* ) - func_dirname_and_basename "$output" "" "." - output_name=$func_basename_result - output_path=$func_dirname_result - cwrappersource="$output_path/$objdir/lt-$output_name.c" - cwrapper="$output_path/$output_name.exe" - $RM $cwrappersource $cwrapper - trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 - - func_emit_cwrapperexe_src > $cwrappersource - - # The wrapper executable is built using the $host compiler, - # because it contains $host paths and files. If cross- - # compiling, it, like the target executable, must be - # executed on the $host or under an emulation environment. - $opt_dry_run || { - $LTCC $LTCFLAGS -o $cwrapper $cwrappersource - $STRIP $cwrapper - } - - # Now, create the wrapper script for func_source use: - func_ltwrapper_scriptname $cwrapper - $RM $func_ltwrapper_scriptname_result - trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 - $opt_dry_run || { - # note: this script will not be executed, so do not chmod. - if test "x$build" = "x$host" ; then - $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result - else - func_emit_wrapper no > $func_ltwrapper_scriptname_result - fi - } - ;; - * ) - $RM $output - trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 - - func_emit_wrapper no > $output - chmod +x $output - ;; - esac - } - exit $EXIT_SUCCESS - ;; - esac - - # See if we need to build an old-fashioned archive. - for oldlib in $oldlibs; do - - if test "$build_libtool_libs" = convenience; then - oldobjs="$libobjs_save $symfileobj" - addlibs="$convenience" - build_libtool_libs=no - else - if test "$build_libtool_libs" = module; then - oldobjs="$libobjs_save" - build_libtool_libs=no - else - oldobjs="$old_deplibs $non_pic_objects" - if test "$preload" = yes && test -f "$symfileobj"; then - func_append oldobjs " $symfileobj" - fi - fi - addlibs="$old_convenience" - fi - - if test -n "$addlibs"; then - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - - func_extract_archives $gentop $addlibs - func_append oldobjs " $func_extract_archives_result" - fi - - # Do each command in the archive commands. - if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then - cmds=$old_archive_from_new_cmds - else - - # Add any objects from preloaded convenience libraries - if test -n "$dlprefiles"; then - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - - func_extract_archives $gentop $dlprefiles - func_append oldobjs " $func_extract_archives_result" - fi - - # POSIX demands no paths to be encoded in archives. We have - # to avoid creating archives with duplicate basenames if we - # might have to extract them afterwards, e.g., when creating a - # static archive out of a convenience library, or when linking - # the entirety of a libtool archive into another (currently - # not supported by libtool). - if (for obj in $oldobjs - do - func_basename "$obj" - $ECHO "$func_basename_result" - done | sort | sort -uc >/dev/null 2>&1); then - : - else - echo "copying selected object files to avoid basename conflicts..." - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - func_mkdir_p "$gentop" - save_oldobjs=$oldobjs - oldobjs= - counter=1 - for obj in $save_oldobjs - do - func_basename "$obj" - objbase="$func_basename_result" - case " $oldobjs " in - " ") oldobjs=$obj ;; - *[\ /]"$objbase "*) - while :; do - # Make sure we don't pick an alternate name that also - # overlaps. - newobj=lt$counter-$objbase - func_arith $counter + 1 - counter=$func_arith_result - case " $oldobjs " in - *[\ /]"$newobj "*) ;; - *) if test ! -f "$gentop/$newobj"; then break; fi ;; - esac - done - func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" - func_append oldobjs " $gentop/$newobj" - ;; - *) func_append oldobjs " $obj" ;; - esac - done - fi - func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 - tool_oldlib=$func_to_tool_file_result - eval cmds=\"$old_archive_cmds\" - - func_len " $cmds" - len=$func_len_result - if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then - cmds=$old_archive_cmds - elif test -n "$archiver_list_spec"; then - func_verbose "using command file archive linking..." - for obj in $oldobjs - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" - done > $output_objdir/$libname.libcmd - func_to_tool_file "$output_objdir/$libname.libcmd" - oldobjs=" $archiver_list_spec$func_to_tool_file_result" - cmds=$old_archive_cmds - else - # the command line is too long to link in one step, link in parts - func_verbose "using piecewise archive linking..." - save_RANLIB=$RANLIB - RANLIB=: - objlist= - concat_cmds= - save_oldobjs=$oldobjs - oldobjs= - # Is there a better way of finding the last object in the list? - for obj in $save_oldobjs - do - last_oldobj=$obj - done - eval test_cmds=\"$old_archive_cmds\" - func_len " $test_cmds" - len0=$func_len_result - len=$len0 - for obj in $save_oldobjs - do - func_len " $obj" - func_arith $len + $func_len_result - len=$func_arith_result - func_append objlist " $obj" - if test "$len" -lt "$max_cmd_len"; then - : - else - # the above command should be used before it gets too long - oldobjs=$objlist - if test "$obj" = "$last_oldobj" ; then - RANLIB=$save_RANLIB - fi - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" - objlist= - len=$len0 - fi - done - RANLIB=$save_RANLIB - oldobjs=$objlist - if test "X$oldobjs" = "X" ; then - eval cmds=\"\$concat_cmds\" - else - eval cmds=\"\$concat_cmds~\$old_archive_cmds\" - fi - fi - fi - func_execute_cmds "$cmds" 'exit $?' - done - - test -n "$generated" && \ - func_show_eval "${RM}r$generated" - - # Now create the libtool archive. - case $output in - *.la) - old_library= - test "$build_old_libs" = yes && old_library="$libname.$libext" - func_verbose "creating $output" - - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - func_quote_for_eval "$var_value" - relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" - fi - done - # Quote the link command for shipping. - relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" - relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` - if test "$hardcode_automatic" = yes ; then - relink_command= - fi - - # Only create the output if not a dry run. - $opt_dry_run || { - for installed in no yes; do - if test "$installed" = yes; then - if test -z "$install_libdir"; then - break - fi - output="$output_objdir/$outputname"i - # Replace all uninstalled libtool libraries with the installed ones - newdependency_libs= - for deplib in $dependency_libs; do - case $deplib in - *.la) - func_basename "$deplib" - name="$func_basename_result" - func_resolve_sysroot "$deplib" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` - test -z "$libdir" && \ - func_fatal_error "\`$deplib' is not a valid libtool archive" - func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" - ;; - -L*) - func_stripname -L '' "$deplib" - func_replace_sysroot "$func_stripname_result" - func_append newdependency_libs " -L$func_replace_sysroot_result" - ;; - -R*) - func_stripname -R '' "$deplib" - func_replace_sysroot "$func_stripname_result" - func_append newdependency_libs " -R$func_replace_sysroot_result" - ;; - *) func_append newdependency_libs " $deplib" ;; - esac - done - dependency_libs="$newdependency_libs" - newdlfiles= - - for lib in $dlfiles; do - case $lib in - *.la) - func_basename "$lib" - name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - test -z "$libdir" && \ - func_fatal_error "\`$lib' is not a valid libtool archive" - func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" - ;; - *) func_append newdlfiles " $lib" ;; - esac - done - dlfiles="$newdlfiles" - newdlprefiles= - for lib in $dlprefiles; do - case $lib in - *.la) - # Only pass preopened files to the pseudo-archive (for - # eventual linking with the app. that links it) if we - # didn't already link the preopened objects directly into - # the library: - func_basename "$lib" - name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - test -z "$libdir" && \ - func_fatal_error "\`$lib' is not a valid libtool archive" - func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" - ;; - esac - done - dlprefiles="$newdlprefiles" - else - newdlfiles= - for lib in $dlfiles; do - case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; - *) abs=`pwd`"/$lib" ;; - esac - func_append newdlfiles " $abs" - done - dlfiles="$newdlfiles" - newdlprefiles= - for lib in $dlprefiles; do - case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; - *) abs=`pwd`"/$lib" ;; - esac - func_append newdlprefiles " $abs" - done - dlprefiles="$newdlprefiles" - fi - $RM $output - # place dlname in correct position for cygwin - # In fact, it would be nice if we could use this code for all target - # systems that can't hard-code library paths into their executables - # and that have no shared library path variable independent of PATH, - # but it turns out we can't easily determine that from inspecting - # libtool variables, so we have to hard-code the OSs to which it - # applies here; at the moment, that means platforms that use the PE - # object format with DLL files. See the long comment at the top of - # tests/bindir.at for full details. - tdlname=$dlname - case $host,$output,$installed,$module,$dlname in - *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) - # If a -bindir argument was supplied, place the dll there. - if test "x$bindir" != x ; - then - func_relative_path "$install_libdir" "$bindir" - tdlname=$func_relative_path_result$dlname - else - # Otherwise fall back on heuristic. - tdlname=../bin/$dlname - fi - ;; - esac - $ECHO > $output "\ -# $outputname - a libtool library file -# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='$tdlname' - -# Names of this library. -library_names='$library_names' - -# The name of the static archive. -old_library='$old_library' - -# Linker flags that can not go in dependency_libs. -inherited_linker_flags='$new_inherited_linker_flags' - -# Libraries that this one depends upon. -dependency_libs='$dependency_libs' - -# Names of additional weak libraries provided by this library -weak_library_names='$weak_libs' - -# Version information for $libname. -current=$current -age=$age -revision=$revision - -# Is this an already installed library? -installed=$installed - -# Should we warn about portability when linking against -modules? -shouldnotlink=$module - -# Files to dlopen/dlpreopen -dlopen='$dlfiles' -dlpreopen='$dlprefiles' - -# Directory that this library needs to be installed in: -libdir='$install_libdir'" - if test "$installed" = no && test "$need_relink" = yes; then - $ECHO >> $output "\ -relink_command=\"$relink_command\"" - fi - done - } - - # Do a symbolic link so that the libtool archive can be found in - # LD_LIBRARY_PATH before the program is installed. - func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' - ;; - esac - exit $EXIT_SUCCESS -} - -{ test "$opt_mode" = link || test "$opt_mode" = relink; } && - func_mode_link ${1+"$@"} - - -# func_mode_uninstall arg... -func_mode_uninstall () -{ - $opt_debug - RM="$nonopt" - files= - rmforce= - exit_status=0 - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic="$magic" - - for arg - do - case $arg in - -f) func_append RM " $arg"; rmforce=yes ;; - -*) func_append RM " $arg" ;; - *) func_append files " $arg" ;; - esac - done - - test -z "$RM" && \ - func_fatal_help "you must specify an RM program" - - rmdirs= - - for file in $files; do - func_dirname "$file" "" "." - dir="$func_dirname_result" - if test "X$dir" = X.; then - odir="$objdir" - else - odir="$dir/$objdir" - fi - func_basename "$file" - name="$func_basename_result" - test "$opt_mode" = uninstall && odir="$dir" - - # Remember odir for removal later, being careful to avoid duplicates - if test "$opt_mode" = clean; then - case " $rmdirs " in - *" $odir "*) ;; - *) func_append rmdirs " $odir" ;; - esac - fi - - # Don't error if the file doesn't exist and rm -f was used. - if { test -L "$file"; } >/dev/null 2>&1 || - { test -h "$file"; } >/dev/null 2>&1 || - test -f "$file"; then - : - elif test -d "$file"; then - exit_status=1 - continue - elif test "$rmforce" = yes; then - continue - fi - - rmfiles="$file" - - case $name in - *.la) - # Possibly a libtool archive, so verify it. - if func_lalib_p "$file"; then - func_source $dir/$name - - # Delete the libtool libraries and symlinks. - for n in $library_names; do - func_append rmfiles " $odir/$n" - done - test -n "$old_library" && func_append rmfiles " $odir/$old_library" - - case "$opt_mode" in - clean) - case " $library_names " in - *" $dlname "*) ;; - *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; - esac - test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" - ;; - uninstall) - if test -n "$library_names"; then - # Do each command in the postuninstall commands. - func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' - fi - - if test -n "$old_library"; then - # Do each command in the old_postuninstall commands. - func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' - fi - # FIXME: should reinstall the best remaining shared library. - ;; - esac - fi - ;; - - *.lo) - # Possibly a libtool object, so verify it. - if func_lalib_p "$file"; then - - # Read the .lo file - func_source $dir/$name - - # Add PIC object to the list of files to remove. - if test -n "$pic_object" && - test "$pic_object" != none; then - func_append rmfiles " $dir/$pic_object" - fi - - # Add non-PIC object to the list of files to remove. - if test -n "$non_pic_object" && - test "$non_pic_object" != none; then - func_append rmfiles " $dir/$non_pic_object" - fi - fi - ;; - - *) - if test "$opt_mode" = clean ; then - noexename=$name - case $file in - *.exe) - func_stripname '' '.exe' "$file" - file=$func_stripname_result - func_stripname '' '.exe' "$name" - noexename=$func_stripname_result - # $file with .exe has already been added to rmfiles, - # add $file without .exe - func_append rmfiles " $file" - ;; - esac - # Do a test to see if this is a libtool program. - if func_ltwrapper_p "$file"; then - if func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - relink_command= - func_source $func_ltwrapper_scriptname_result - func_append rmfiles " $func_ltwrapper_scriptname_result" - else - relink_command= - func_source $dir/$noexename - fi - - # note $name still contains .exe if it was in $file originally - # as does the version of $file that was added into $rmfiles - func_append rmfiles " $odir/$name $odir/${name}S.${objext}" - if test "$fast_install" = yes && test -n "$relink_command"; then - func_append rmfiles " $odir/lt-$name" - fi - if test "X$noexename" != "X$name" ; then - func_append rmfiles " $odir/lt-${noexename}.c" - fi - fi - fi - ;; - esac - func_show_eval "$RM $rmfiles" 'exit_status=1' - done - - # Try to remove the ${objdir}s in the directories where we deleted files - for dir in $rmdirs; do - if test -d "$dir"; then - func_show_eval "rmdir $dir >/dev/null 2>&1" - fi - done - - exit $exit_status -} - -{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && - func_mode_uninstall ${1+"$@"} - -test -z "$opt_mode" && { - help="$generic_help" - func_fatal_help "you must specify a MODE" -} - -test -z "$exec_cmd" && \ - func_fatal_help "invalid operation mode \`$opt_mode'" - -if test -n "$exec_cmd"; then - eval exec "$exec_cmd" - exit $EXIT_FAILURE -fi - -exit $exit_status - - -# The TAGs below are defined such that we never get into a situation -# in which we disable both kinds of libraries. Given conflicting -# choices, we go for a static library, that is the most portable, -# since we can't tell whether shared libraries were disabled because -# the user asked for that or because the platform doesn't support -# them. This is particularly important on AIX, because we don't -# support having both static and shared libraries enabled at the same -# time on that platform, so we default to a shared-only configuration. -# If a disable-shared tag is given, we'll fallback to a static-only -# configuration. But we'll never go from static-only to shared-only. - -# ### BEGIN LIBTOOL TAG CONFIG: disable-shared -build_libtool_libs=no -build_old_libs=yes -# ### END LIBTOOL TAG CONFIG: disable-shared - -# ### BEGIN LIBTOOL TAG CONFIG: disable-static -build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` -# ### END LIBTOOL TAG CONFIG: disable-static - -# Local Variables: -# mode:shell-script -# sh-indentation:2 -# End: -# vi:sw=2 - diff --git a/m4/ax_pkg_swig.m4 b/m4/ax_pkg_swig.m4 deleted file mode 100644 index d836eec..0000000 --- a/m4/ax_pkg_swig.m4 +++ /dev/null @@ -1,135 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_pkg_swig.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_PKG_SWIG([major.minor.micro], [action-if-found], [action-if-not-found]) -# -# DESCRIPTION -# -# This macro searches for a SWIG installation on your system. If found, -# then SWIG is AC_SUBST'd; if not found, then $SWIG is empty. If SWIG is -# found, then SWIG_LIB is set to the SWIG library path, and AC_SUBST'd. -# -# You can use the optional first argument to check if the version of the -# available SWIG is greater than or equal to the value of the argument. It -# should have the format: N[.N[.N]] (N is a number between 0 and 999. Only -# the first N is mandatory.) If the version argument is given (e.g. -# 1.3.17), AX_PKG_SWIG checks that the swig package is this version number -# or higher. -# -# As usual, action-if-found is executed if SWIG is found, otherwise -# action-if-not-found is executed. -# -# In configure.in, use as: -# -# AX_PKG_SWIG(1.3.17, [], [ AC_MSG_ERROR([SWIG is required to build..]) ]) -# AX_SWIG_ENABLE_CXX -# AX_SWIG_MULTI_MODULE_SUPPORT -# AX_SWIG_PYTHON -# -# LICENSE -# -# Copyright (c) 2008 Sebastian Huber -# Copyright (c) 2008 Alan W. Irwin -# Copyright (c) 2008 Rafael Laboissiere -# Copyright (c) 2008 Andrew Collier -# Copyright (c) 2011 Murray Cumming -# -# This program is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 11 - -AC_DEFUN([AX_PKG_SWIG],[ - # Ubuntu has swig 2.0 as /usr/bin/swig2.0 - AC_PATH_PROGS([SWIG],[swig swig2.0]) - if test -z "$SWIG" ; then - m4_ifval([$3],[$3],[:]) - elif test -n "$1" ; then - AC_MSG_CHECKING([SWIG version]) - [swig_version=`$SWIG -version 2>&1 | grep 'SWIG Version' | sed 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/g'`] - AC_MSG_RESULT([$swig_version]) - if test -n "$swig_version" ; then - # Calculate the required version number components - [required=$1] - [required_major=`echo $required | sed 's/[^0-9].*//'`] - if test -z "$required_major" ; then - [required_major=0] - fi - [required=`echo $required | sed 's/[0-9]*[^0-9]//'`] - [required_minor=`echo $required | sed 's/[^0-9].*//'`] - if test -z "$required_minor" ; then - [required_minor=0] - fi - [required=`echo $required | sed 's/[0-9]*[^0-9]//'`] - [required_patch=`echo $required | sed 's/[^0-9].*//'`] - if test -z "$required_patch" ; then - [required_patch=0] - fi - # Calculate the available version number components - [available=$swig_version] - [available_major=`echo $available | sed 's/[^0-9].*//'`] - if test -z "$available_major" ; then - [available_major=0] - fi - [available=`echo $available | sed 's/[0-9]*[^0-9]//'`] - [available_minor=`echo $available | sed 's/[^0-9].*//'`] - if test -z "$available_minor" ; then - [available_minor=0] - fi - [available=`echo $available | sed 's/[0-9]*[^0-9]//'`] - [available_patch=`echo $available | sed 's/[^0-9].*//'`] - if test -z "$available_patch" ; then - [available_patch=0] - fi - # Convert the version tuple into a single number for easier comparison. - # Using base 100 should be safe since SWIG internally uses BCD values - # to encode its version number. - required_swig_vernum=`expr $required_major \* 10000 \ - \+ $required_minor \* 100 \+ $required_patch` - available_swig_vernum=`expr $available_major \* 10000 \ - \+ $available_minor \* 100 \+ $available_patch` - - if test $available_swig_vernum -lt $required_swig_vernum; then - AC_MSG_WARN([SWIG version >= $1 is required. You have $swig_version.]) - SWIG='' - m4_ifval([$3],[$3],[]) - else - AC_MSG_CHECKING([for SWIG library]) - SWIG_LIB=`$SWIG -swiglib` - AC_MSG_RESULT([$SWIG_LIB]) - m4_ifval([$2],[$2],[]) - fi - else - AC_MSG_WARN([cannot determine SWIG version]) - SWIG='' - m4_ifval([$3],[$3],[]) - fi - fi - AC_SUBST([SWIG_LIB]) -]) diff --git a/m4/ax_python_devel.m4 b/m4/ax_python_devel.m4 deleted file mode 100644 index 59a2ff0..0000000 --- a/m4/ax_python_devel.m4 +++ /dev/null @@ -1,324 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_python_devel.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_PYTHON_DEVEL([version]) -# -# DESCRIPTION -# -# Note: Defines as a precious variable "PYTHON_VERSION". Don't override it -# in your configure.ac. -# -# This macro checks for Python and tries to get the include path to -# 'Python.h'. It provides the $(PYTHON_CPPFLAGS) and $(PYTHON_LDFLAGS) -# output variables. It also exports $(PYTHON_EXTRA_LIBS) and -# $(PYTHON_EXTRA_LDFLAGS) for embedding Python in your code. -# -# You can search for some particular version of Python by passing a -# parameter to this macro, for example ">= '2.3.1'", or "== '2.4'". Please -# note that you *have* to pass also an operator along with the version to -# match, and pay special attention to the single quotes surrounding the -# version number. Don't use "PYTHON_VERSION" for this: that environment -# variable is declared as precious and thus reserved for the end-user. -# -# This macro should work for all versions of Python >= 2.1.0. As an end -# user, you can disable the check for the python version by setting the -# PYTHON_NOVERSIONCHECK environment variable to something else than the -# empty string. -# -# If you need to use this macro for an older Python version, please -# contact the authors. We're always open for feedback. -# -# LICENSE -# -# Copyright (c) 2009 Sebastian Huber -# Copyright (c) 2009 Alan W. Irwin -# Copyright (c) 2009 Rafael Laboissiere -# Copyright (c) 2009 Andrew Collier -# Copyright (c) 2009 Matteo Settenvini -# Copyright (c) 2009 Horst Knorr -# Copyright (c) 2013 Daniel Mullner -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 17 - -AU_ALIAS([AC_PYTHON_DEVEL], [AX_PYTHON_DEVEL]) -AC_DEFUN([AX_PYTHON_DEVEL],[ - # - # Allow the use of a (user set) custom python version - # - AC_ARG_VAR([PYTHON_VERSION],[The installed Python - version to use, for example '2.3'. This string - will be appended to the Python interpreter - canonical name.]) - - AC_PATH_PROG([PYTHON],[python[$PYTHON_VERSION]]) - if test -z "$PYTHON"; then - AC_MSG_ERROR([Cannot find python$PYTHON_VERSION in your system path]) - PYTHON_VERSION="" - fi - - # - # Check for a version of Python >= 2.1.0 - # - AC_MSG_CHECKING([for a version of Python >= '2.1.0']) - ac_supports_python_ver=`$PYTHON -c "import sys; \ - ver = sys.version.split ()[[0]]; \ - print (ver >= '2.1.0')"` - if test "$ac_supports_python_ver" != "True"; then - if test -z "$PYTHON_NOVERSIONCHECK"; then - AC_MSG_RESULT([no]) - AC_MSG_FAILURE([ -This version of the AC@&t@_PYTHON_DEVEL macro -doesn't work properly with versions of Python before -2.1.0. You may need to re-run configure, setting the -variables PYTHON_CPPFLAGS, PYTHON_LDFLAGS, PYTHON_SITE_PKG, -PYTHON_EXTRA_LIBS and PYTHON_EXTRA_LDFLAGS by hand. -Moreover, to disable this check, set PYTHON_NOVERSIONCHECK -to something else than an empty string. -]) - else - AC_MSG_RESULT([skip at user request]) - fi - else - AC_MSG_RESULT([yes]) - fi - - # - # if the macro parameter ``version'' is set, honour it - # - if test -n "$1"; then - AC_MSG_CHECKING([for a version of Python $1]) - ac_supports_python_ver=`$PYTHON -c "import sys; \ - ver = sys.version.split ()[[0]]; \ - print (ver $1)"` - if test "$ac_supports_python_ver" = "True"; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - AC_MSG_ERROR([this package requires Python $1. -If you have it installed, but it isn't the default Python -interpreter in your system path, please pass the PYTHON_VERSION -variable to configure. See ``configure --help'' for reference. -]) - PYTHON_VERSION="" - fi - fi - - # - # Check if you have distutils, else fail - # - AC_MSG_CHECKING([for the distutils Python package]) - ac_distutils_result=`$PYTHON -c "import distutils" 2>&1` - if test -z "$ac_distutils_result"; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - AC_MSG_ERROR([cannot import Python module "distutils". -Please check your Python installation. The error was: -$ac_distutils_result]) - PYTHON_VERSION="" - fi - - # - # Check for Python include path - # - AC_MSG_CHECKING([for Python include path]) - if test -z "$PYTHON_CPPFLAGS"; then - python_path=`$PYTHON -c "import distutils.sysconfig; \ - print (distutils.sysconfig.get_python_inc ());"` - plat_python_path=`$PYTHON -c "import distutils.sysconfig; \ - print (distutils.sysconfig.get_python_inc (plat_specific=1));"` - if test -n "${python_path}"; then - if test "${plat_python_path}" != "${python_path}"; then - python_path="-I$python_path -I$plat_python_path" - else - python_path="-I$python_path" - fi - fi - PYTHON_CPPFLAGS=$python_path - fi - AC_MSG_RESULT([$PYTHON_CPPFLAGS]) - AC_SUBST([PYTHON_CPPFLAGS]) - - # - # Check for Python library path - # - AC_MSG_CHECKING([for Python library path]) - if test -z "$PYTHON_LDFLAGS"; then - # (makes two attempts to ensure we've got a version number - # from the interpreter) - ac_python_version=`cat<]], - [[Py_Initialize();]]) - ],[pythonexists=yes],[pythonexists=no]) - AC_LANG_POP([C]) - # turn back to default flags - CPPFLAGS="$ac_save_CPPFLAGS" - LIBS="$ac_save_LIBS" - - AC_MSG_RESULT([$pythonexists]) - - if test ! "x$pythonexists" = "xyes"; then - AC_MSG_FAILURE([ - Could not link test program to Python. Maybe the main Python library has been - installed in some non-standard library path. If so, pass it to configure, - via the LDFLAGS environment variable. - Example: ./configure LDFLAGS="-L/usr/non-standard-path/python/lib" - ============================================================================ - ERROR! - You probably have to install the development version of the Python package - for your distribution. The exact name of this package varies among them. - ============================================================================ - ]) - PYTHON_VERSION="" - fi - - # - # all done! - # -]) diff --git a/m4/libtool.m4 b/m4/libtool.m4 deleted file mode 100644 index 56666f0..0000000 --- a/m4/libtool.m4 +++ /dev/null @@ -1,7986 +0,0 @@ -# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -m4_define([_LT_COPYING], [dnl -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of -# the License, or (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -]) - -# serial 57 LT_INIT - - -# LT_PREREQ(VERSION) -# ------------------ -# Complain and exit if this libtool version is less that VERSION. -m4_defun([LT_PREREQ], -[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, - [m4_default([$3], - [m4_fatal([Libtool version $1 or higher is required], - 63)])], - [$2])]) - - -# _LT_CHECK_BUILDDIR -# ------------------ -# Complain if the absolute build directory name contains unusual characters -m4_defun([_LT_CHECK_BUILDDIR], -[case `pwd` in - *\ * | *\ *) - AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; -esac -]) - - -# LT_INIT([OPTIONS]) -# ------------------ -AC_DEFUN([LT_INIT], -[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT -AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl -AC_BEFORE([$0], [LT_LANG])dnl -AC_BEFORE([$0], [LT_OUTPUT])dnl -AC_BEFORE([$0], [LTDL_INIT])dnl -m4_require([_LT_CHECK_BUILDDIR])dnl - -dnl Autoconf doesn't catch unexpanded LT_ macros by default: -m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl -m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl -dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 -dnl unless we require an AC_DEFUNed macro: -AC_REQUIRE([LTOPTIONS_VERSION])dnl -AC_REQUIRE([LTSUGAR_VERSION])dnl -AC_REQUIRE([LTVERSION_VERSION])dnl -AC_REQUIRE([LTOBSOLETE_VERSION])dnl -m4_require([_LT_PROG_LTMAIN])dnl - -_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) - -dnl Parse OPTIONS -_LT_SET_OPTIONS([$0], [$1]) - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' -AC_SUBST(LIBTOOL)dnl - -_LT_SETUP - -# Only expand once: -m4_define([LT_INIT]) -])# LT_INIT - -# Old names: -AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) -AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_PROG_LIBTOOL], []) -dnl AC_DEFUN([AM_PROG_LIBTOOL], []) - - -# _LT_CC_BASENAME(CC) -# ------------------- -# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. -m4_defun([_LT_CC_BASENAME], -[for cc_temp in $1""; do - case $cc_temp in - compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; - distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` -]) - - -# _LT_FILEUTILS_DEFAULTS -# ---------------------- -# It is okay to use these file commands and assume they have been set -# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. -m4_defun([_LT_FILEUTILS_DEFAULTS], -[: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} -])# _LT_FILEUTILS_DEFAULTS - - -# _LT_SETUP -# --------- -m4_defun([_LT_SETUP], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl -AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl - -_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl -dnl -_LT_DECL([], [host_alias], [0], [The host system])dnl -_LT_DECL([], [host], [0])dnl -_LT_DECL([], [host_os], [0])dnl -dnl -_LT_DECL([], [build_alias], [0], [The build system])dnl -_LT_DECL([], [build], [0])dnl -_LT_DECL([], [build_os], [0])dnl -dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([LT_PATH_LD])dnl -AC_REQUIRE([LT_PATH_NM])dnl -dnl -AC_REQUIRE([AC_PROG_LN_S])dnl -test -z "$LN_S" && LN_S="ln -s" -_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl -dnl -AC_REQUIRE([LT_CMD_MAX_LEN])dnl -_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl -_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl -dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_CHECK_SHELL_FEATURES])dnl -m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl -m4_require([_LT_CMD_RELOAD])dnl -m4_require([_LT_CHECK_MAGIC_METHOD])dnl -m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl -m4_require([_LT_CMD_OLD_ARCHIVE])dnl -m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl -m4_require([_LT_WITH_SYSROOT])dnl - -_LT_CONFIG_LIBTOOL_INIT([ -# See if we are running on zsh, and set the options which allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi -]) -if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - -_LT_CHECK_OBJDIR - -m4_require([_LT_TAG_COMPILER])dnl - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a - -with_gnu_ld="$lt_cv_prog_gnu_ld" - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -_LT_CC_BASENAME([$compiler]) - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - _LT_PATH_MAGIC - fi - ;; -esac - -# Use C for the default configuration in the libtool script -LT_SUPPORTED_TAG([CC]) -_LT_LANG_C_CONFIG -_LT_LANG_DEFAULT_CONFIG -_LT_CONFIG_COMMANDS -])# _LT_SETUP - - -# _LT_PREPARE_SED_QUOTE_VARS -# -------------------------- -# Define a few sed substitution that help us do robust quoting. -m4_defun([_LT_PREPARE_SED_QUOTE_VARS], -[# Backslashify metacharacters that are still active within -# double-quoted strings. -sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\([["`\\]]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' -]) - -# _LT_PROG_LTMAIN -# --------------- -# Note that this code is called both from `configure', and `config.status' -# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, -# `config.status' has no value for ac_aux_dir unless we are using Automake, -# so we pass a copy along to make sure it has a sensible value anyway. -m4_defun([_LT_PROG_LTMAIN], -[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl -_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) -ltmain="$ac_aux_dir/ltmain.sh" -])# _LT_PROG_LTMAIN - - -## ------------------------------------- ## -## Accumulate code for creating libtool. ## -## ------------------------------------- ## - -# So that we can recreate a full libtool script including additional -# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS -# in macros and then make a single call at the end using the `libtool' -# label. - - -# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) -# ---------------------------------------- -# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. -m4_define([_LT_CONFIG_LIBTOOL_INIT], -[m4_ifval([$1], - [m4_append([_LT_OUTPUT_LIBTOOL_INIT], - [$1 -])])]) - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_INIT]) - - -# _LT_CONFIG_LIBTOOL([COMMANDS]) -# ------------------------------ -# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. -m4_define([_LT_CONFIG_LIBTOOL], -[m4_ifval([$1], - [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], - [$1 -])])]) - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) - - -# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) -# ----------------------------------------------------- -m4_defun([_LT_CONFIG_SAVE_COMMANDS], -[_LT_CONFIG_LIBTOOL([$1]) -_LT_CONFIG_LIBTOOL_INIT([$2]) -]) - - -# _LT_FORMAT_COMMENT([COMMENT]) -# ----------------------------- -# Add leading comment marks to the start of each line, and a trailing -# full-stop to the whole comment if one is not present already. -m4_define([_LT_FORMAT_COMMENT], -[m4_ifval([$1], [ -m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], - [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) -)]) - - - -## ------------------------ ## -## FIXME: Eliminate VARNAME ## -## ------------------------ ## - - -# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) -# ------------------------------------------------------------------- -# CONFIGNAME is the name given to the value in the libtool script. -# VARNAME is the (base) name used in the configure script. -# VALUE may be 0, 1 or 2 for a computed quote escaped value based on -# VARNAME. Any other value will be used directly. -m4_define([_LT_DECL], -[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], - [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], - [m4_ifval([$1], [$1], [$2])]) - lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) - m4_ifval([$4], - [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) - lt_dict_add_subkey([lt_decl_dict], [$2], - [tagged?], [m4_ifval([$5], [yes], [no])])]) -]) - - -# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) -# -------------------------------------------------------- -m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) - - -# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) -# ------------------------------------------------ -m4_define([lt_decl_tag_varnames], -[_lt_decl_filter([tagged?], [yes], $@)]) - - -# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) -# --------------------------------------------------------- -m4_define([_lt_decl_filter], -[m4_case([$#], - [0], [m4_fatal([$0: too few arguments: $#])], - [1], [m4_fatal([$0: too few arguments: $#: $1])], - [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], - [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], - [lt_dict_filter([lt_decl_dict], $@)])[]dnl -]) - - -# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) -# -------------------------------------------------- -m4_define([lt_decl_quote_varnames], -[_lt_decl_filter([value], [1], $@)]) - - -# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) -# --------------------------------------------------- -m4_define([lt_decl_dquote_varnames], -[_lt_decl_filter([value], [2], $@)]) - - -# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) -# --------------------------------------------------- -m4_define([lt_decl_varnames_tagged], -[m4_assert([$# <= 2])dnl -_$0(m4_quote(m4_default([$1], [[, ]])), - m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), - m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) -m4_define([_lt_decl_varnames_tagged], -[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) - - -# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) -# ------------------------------------------------ -m4_define([lt_decl_all_varnames], -[_$0(m4_quote(m4_default([$1], [[, ]])), - m4_if([$2], [], - m4_quote(lt_decl_varnames), - m4_quote(m4_shift($@))))[]dnl -]) -m4_define([_lt_decl_all_varnames], -[lt_join($@, lt_decl_varnames_tagged([$1], - lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl -]) - - -# _LT_CONFIG_STATUS_DECLARE([VARNAME]) -# ------------------------------------ -# Quote a variable value, and forward it to `config.status' so that its -# declaration there will have the same value as in `configure'. VARNAME -# must have a single quote delimited value for this to work. -m4_define([_LT_CONFIG_STATUS_DECLARE], -[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) - - -# _LT_CONFIG_STATUS_DECLARATIONS -# ------------------------------ -# We delimit libtool config variables with single quotes, so when -# we write them to config.status, we have to be sure to quote all -# embedded single quotes properly. In configure, this macro expands -# each variable declared with _LT_DECL (and _LT_TAGDECL) into: -# -# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' -m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], -[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), - [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) - - -# _LT_LIBTOOL_TAGS -# ---------------- -# Output comment and list of tags supported by the script -m4_defun([_LT_LIBTOOL_TAGS], -[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl -available_tags="_LT_TAGS"dnl -]) - - -# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) -# ----------------------------------- -# Extract the dictionary values for VARNAME (optionally with TAG) and -# expand to a commented shell variable setting: -# -# # Some comment about what VAR is for. -# visible_name=$lt_internal_name -m4_define([_LT_LIBTOOL_DECLARE], -[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], - [description])))[]dnl -m4_pushdef([_libtool_name], - m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl -m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), - [0], [_libtool_name=[$]$1], - [1], [_libtool_name=$lt_[]$1], - [2], [_libtool_name=$lt_[]$1], - [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl -m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl -]) - - -# _LT_LIBTOOL_CONFIG_VARS -# ----------------------- -# Produce commented declarations of non-tagged libtool config variables -# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' -# script. Tagged libtool config variables (even for the LIBTOOL CONFIG -# section) are produced by _LT_LIBTOOL_TAG_VARS. -m4_defun([_LT_LIBTOOL_CONFIG_VARS], -[m4_foreach([_lt_var], - m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), - [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) - - -# _LT_LIBTOOL_TAG_VARS(TAG) -# ------------------------- -m4_define([_LT_LIBTOOL_TAG_VARS], -[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), - [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) - - -# _LT_TAGVAR(VARNAME, [TAGNAME]) -# ------------------------------ -m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) - - -# _LT_CONFIG_COMMANDS -# ------------------- -# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of -# variables for single and double quote escaping we saved from calls -# to _LT_DECL, we can put quote escaped variables declarations -# into `config.status', and then the shell code to quote escape them in -# for loops in `config.status'. Finally, any additional code accumulated -# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. -m4_defun([_LT_CONFIG_COMMANDS], -[AC_PROVIDE_IFELSE([LT_OUTPUT], - dnl If the libtool generation code has been placed in $CONFIG_LT, - dnl instead of duplicating it all over again into config.status, - dnl then we will have config.status run $CONFIG_LT later, so it - dnl needs to know what name is stored there: - [AC_CONFIG_COMMANDS([libtool], - [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], - dnl If the libtool generation code is destined for config.status, - dnl expand the accumulated commands and init code now: - [AC_CONFIG_COMMANDS([libtool], - [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) -])#_LT_CONFIG_COMMANDS - - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], -[ - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -_LT_CONFIG_STATUS_DECLARATIONS -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$[]1 -_LTECHO_EOF' -} - -# Quote evaled strings. -for var in lt_decl_all_varnames([[ \ -]], lt_decl_quote_varnames); do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in lt_decl_all_varnames([[ \ -]], lt_decl_dquote_varnames); do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -_LT_OUTPUT_LIBTOOL_INIT -]) - -# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) -# ------------------------------------ -# Generate a child script FILE with all initialization necessary to -# reuse the environment learned by the parent script, and make the -# file executable. If COMMENT is supplied, it is inserted after the -# `#!' sequence but before initialization text begins. After this -# macro, additional text can be appended to FILE to form the body of -# the child script. The macro ends with non-zero status if the -# file could not be fully written (such as if the disk is full). -m4_ifdef([AS_INIT_GENERATED], -[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], -[m4_defun([_LT_GENERATED_FILE_INIT], -[m4_require([AS_PREPARE])]dnl -[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl -[lt_write_fail=0 -cat >$1 <<_ASEOF || lt_write_fail=1 -#! $SHELL -# Generated by $as_me. -$2 -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$1 <<\_ASEOF || lt_write_fail=1 -AS_SHELL_SANITIZE -_AS_PREPARE -exec AS_MESSAGE_FD>&1 -_ASEOF -test $lt_write_fail = 0 && chmod +x $1[]dnl -m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT - -# LT_OUTPUT -# --------- -# This macro allows early generation of the libtool script (before -# AC_OUTPUT is called), incase it is used in configure for compilation -# tests. -AC_DEFUN([LT_OUTPUT], -[: ${CONFIG_LT=./config.lt} -AC_MSG_NOTICE([creating $CONFIG_LT]) -_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], -[# Run this file to recreate a libtool stub with the current configuration.]) - -cat >>"$CONFIG_LT" <<\_LTEOF -lt_cl_silent=false -exec AS_MESSAGE_LOG_FD>>config.log -{ - echo - AS_BOX([Running $as_me.]) -} >&AS_MESSAGE_LOG_FD - -lt_cl_help="\ -\`$as_me' creates a local libtool stub from the current configuration, -for use in further configure time tests before the real libtool is -generated. - -Usage: $[0] [[OPTIONS]] - - -h, --help print this help, then exit - -V, --version print version number, then exit - -q, --quiet do not print progress messages - -d, --debug don't remove temporary files - -Report bugs to ." - -lt_cl_version="\ -m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl -m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) -configured by $[0], generated by m4_PACKAGE_STRING. - -Copyright (C) 2011 Free Software Foundation, Inc. -This config.lt script is free software; the Free Software Foundation -gives unlimited permision to copy, distribute and modify it." - -while test $[#] != 0 -do - case $[1] in - --version | --v* | -V ) - echo "$lt_cl_version"; exit 0 ;; - --help | --h* | -h ) - echo "$lt_cl_help"; exit 0 ;; - --debug | --d* | -d ) - debug=: ;; - --quiet | --q* | --silent | --s* | -q ) - lt_cl_silent=: ;; - - -*) AC_MSG_ERROR([unrecognized option: $[1] -Try \`$[0] --help' for more information.]) ;; - - *) AC_MSG_ERROR([unrecognized argument: $[1] -Try \`$[0] --help' for more information.]) ;; - esac - shift -done - -if $lt_cl_silent; then - exec AS_MESSAGE_FD>/dev/null -fi -_LTEOF - -cat >>"$CONFIG_LT" <<_LTEOF -_LT_OUTPUT_LIBTOOL_COMMANDS_INIT -_LTEOF - -cat >>"$CONFIG_LT" <<\_LTEOF -AC_MSG_NOTICE([creating $ofile]) -_LT_OUTPUT_LIBTOOL_COMMANDS -AS_EXIT(0) -_LTEOF -chmod +x "$CONFIG_LT" - -# configure is writing to config.log, but config.lt does its own redirection, -# appending to config.log, which fails on DOS, as config.log is still kept -# open by configure. Here we exec the FD to /dev/null, effectively closing -# config.log, so it can be properly (re)opened and appended to by config.lt. -lt_cl_success=: -test "$silent" = yes && - lt_config_lt_args="$lt_config_lt_args --quiet" -exec AS_MESSAGE_LOG_FD>/dev/null -$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false -exec AS_MESSAGE_LOG_FD>>config.log -$lt_cl_success || AS_EXIT(1) -])# LT_OUTPUT - - -# _LT_CONFIG(TAG) -# --------------- -# If TAG is the built-in tag, create an initial libtool script with a -# default configuration from the untagged config vars. Otherwise add code -# to config.status for appending the configuration named by TAG from the -# matching tagged config vars. -m4_defun([_LT_CONFIG], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -_LT_CONFIG_SAVE_COMMANDS([ - m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl - m4_if(_LT_TAG, [C], [ - # See if we are running on zsh, and set the options which allow our - # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - - cfgfile="${ofile}T" - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -_LT_COPYING -_LT_LIBTOOL_TAGS - -# ### BEGIN LIBTOOL CONFIG -_LT_LIBTOOL_CONFIG_VARS -_LT_LIBTOOL_TAG_VARS -# ### END LIBTOOL CONFIG - -_LT_EOF - - case $host_os in - aix3*) - cat <<\_LT_EOF >> "$cfgfile" -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -_LT_EOF - ;; - esac - - _LT_PROG_LTMAIN - - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - _LT_PROG_REPLACE_SHELLFNS - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" -], -[cat <<_LT_EOF >> "$ofile" - -dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded -dnl in a comment (ie after a #). -# ### BEGIN LIBTOOL TAG CONFIG: $1 -_LT_LIBTOOL_TAG_VARS(_LT_TAG) -# ### END LIBTOOL TAG CONFIG: $1 -_LT_EOF -])dnl /m4_if -], -[m4_if([$1], [], [ - PACKAGE='$PACKAGE' - VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' - RM='$RM' - ofile='$ofile'], []) -])dnl /_LT_CONFIG_SAVE_COMMANDS -])# _LT_CONFIG - - -# LT_SUPPORTED_TAG(TAG) -# --------------------- -# Trace this macro to discover what tags are supported by the libtool -# --tag option, using: -# autoconf --trace 'LT_SUPPORTED_TAG:$1' -AC_DEFUN([LT_SUPPORTED_TAG], []) - - -# C support is built-in for now -m4_define([_LT_LANG_C_enabled], []) -m4_define([_LT_TAGS], []) - - -# LT_LANG(LANG) -# ------------- -# Enable libtool support for the given language if not already enabled. -AC_DEFUN([LT_LANG], -[AC_BEFORE([$0], [LT_OUTPUT])dnl -m4_case([$1], - [C], [_LT_LANG(C)], - [C++], [_LT_LANG(CXX)], - [Go], [_LT_LANG(GO)], - [Java], [_LT_LANG(GCJ)], - [Fortran 77], [_LT_LANG(F77)], - [Fortran], [_LT_LANG(FC)], - [Windows Resource], [_LT_LANG(RC)], - [m4_ifdef([_LT_LANG_]$1[_CONFIG], - [_LT_LANG($1)], - [m4_fatal([$0: unsupported language: "$1"])])])dnl -])# LT_LANG - - -# _LT_LANG(LANGNAME) -# ------------------ -m4_defun([_LT_LANG], -[m4_ifdef([_LT_LANG_]$1[_enabled], [], - [LT_SUPPORTED_TAG([$1])dnl - m4_append([_LT_TAGS], [$1 ])dnl - m4_define([_LT_LANG_]$1[_enabled], [])dnl - _LT_LANG_$1_CONFIG($1)])dnl -])# _LT_LANG - - -m4_ifndef([AC_PROG_GO], [ -############################################################ -# NOTE: This macro has been submitted for inclusion into # -# GNU Autoconf as AC_PROG_GO. When it is available in # -# a released version of Autoconf we should remove this # -# macro and use it instead. # -############################################################ -m4_defun([AC_PROG_GO], -[AC_LANG_PUSH(Go)dnl -AC_ARG_VAR([GOC], [Go compiler command])dnl -AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl -_AC_ARG_VAR_LDFLAGS()dnl -AC_CHECK_TOOL(GOC, gccgo) -if test -z "$GOC"; then - if test -n "$ac_tool_prefix"; then - AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) - fi -fi -if test -z "$GOC"; then - AC_CHECK_PROG(GOC, gccgo, gccgo, false) -fi -])#m4_defun -])#m4_ifndef - - -# _LT_LANG_DEFAULT_CONFIG -# ----------------------- -m4_defun([_LT_LANG_DEFAULT_CONFIG], -[AC_PROVIDE_IFELSE([AC_PROG_CXX], - [LT_LANG(CXX)], - [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) - -AC_PROVIDE_IFELSE([AC_PROG_F77], - [LT_LANG(F77)], - [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) - -AC_PROVIDE_IFELSE([AC_PROG_FC], - [LT_LANG(FC)], - [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) - -dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal -dnl pulling things in needlessly. -AC_PROVIDE_IFELSE([AC_PROG_GCJ], - [LT_LANG(GCJ)], - [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], - [LT_LANG(GCJ)], - [AC_PROVIDE_IFELSE([LT_PROG_GCJ], - [LT_LANG(GCJ)], - [m4_ifdef([AC_PROG_GCJ], - [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) - m4_ifdef([A][M_PROG_GCJ], - [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) - m4_ifdef([LT_PROG_GCJ], - [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) - -AC_PROVIDE_IFELSE([AC_PROG_GO], - [LT_LANG(GO)], - [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) - -AC_PROVIDE_IFELSE([LT_PROG_RC], - [LT_LANG(RC)], - [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) -])# _LT_LANG_DEFAULT_CONFIG - -# Obsolete macros: -AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) -AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) -AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) -AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) -AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_CXX], []) -dnl AC_DEFUN([AC_LIBTOOL_F77], []) -dnl AC_DEFUN([AC_LIBTOOL_FC], []) -dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) -dnl AC_DEFUN([AC_LIBTOOL_RC], []) - - -# _LT_TAG_COMPILER -# ---------------- -m4_defun([_LT_TAG_COMPILER], -[AC_REQUIRE([AC_PROG_CC])dnl - -_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl -_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl -_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl -_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC -])# _LT_TAG_COMPILER - - -# _LT_COMPILER_BOILERPLATE -# ------------------------ -# Check for compiler boilerplate output or warnings with -# the simple compiler test code. -m4_defun([_LT_COMPILER_BOILERPLATE], -[m4_require([_LT_DECL_SED])dnl -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* -])# _LT_COMPILER_BOILERPLATE - - -# _LT_LINKER_BOILERPLATE -# ---------------------- -# Check for linker boilerplate output or warnings with -# the simple link test code. -m4_defun([_LT_LINKER_BOILERPLATE], -[m4_require([_LT_DECL_SED])dnl -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* -])# _LT_LINKER_BOILERPLATE - -# _LT_REQUIRED_DARWIN_CHECKS -# ------------------------- -m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ - case $host_os in - rhapsody* | darwin*) - AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) - AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) - AC_CHECK_TOOL([LIPO], [lipo], [:]) - AC_CHECK_TOOL([OTOOL], [otool], [:]) - AC_CHECK_TOOL([OTOOL64], [otool64], [:]) - _LT_DECL([], [DSYMUTIL], [1], - [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) - _LT_DECL([], [NMEDIT], [1], - [Tool to change global to local symbols on Mac OS X]) - _LT_DECL([], [LIPO], [1], - [Tool to manipulate fat objects and archives on Mac OS X]) - _LT_DECL([], [OTOOL], [1], - [ldd/readelf like tool for Mach-O binaries on Mac OS X]) - _LT_DECL([], [OTOOL64], [1], - [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) - - AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], - [lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - # If there is a non-empty error log, and "single_module" - # appears in it, assume the flag caused a linker warning - if test -s conftest.err && $GREP single_module conftest.err; then - cat conftest.err >&AS_MESSAGE_LOG_FD - # Otherwise, if the output was created with a 0 exit code from - # the compiler, it worked. - elif test -f libconftest.dylib && test $_lt_result -eq 0; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&AS_MESSAGE_LOG_FD - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi]) - - AC_CACHE_CHECK([for -exported_symbols_list linker flag], - [lt_cv_ld_exported_symbols_list], - [lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], - [lt_cv_ld_exported_symbols_list=yes], - [lt_cv_ld_exported_symbols_list=no]) - LDFLAGS="$save_LDFLAGS" - ]) - - AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], - [lt_cv_ld_force_load=no - cat > conftest.c << _LT_EOF -int forced_loaded() { return 2;} -_LT_EOF - echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD - $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD - echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD - $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD - echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD - $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD - cat > conftest.c << _LT_EOF -int main() { return 0;} -_LT_EOF - echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD - $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err - _lt_result=$? - if test -s conftest.err && $GREP force_load conftest.err; then - cat conftest.err >&AS_MESSAGE_LOG_FD - elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then - lt_cv_ld_force_load=yes - else - cat conftest.err >&AS_MESSAGE_LOG_FD - fi - rm -f conftest.err libconftest.a conftest conftest.c - rm -rf conftest.dSYM - ]) - case $host_os in - rhapsody* | darwin1.[[012]]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[[012]]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then - _lt_dar_single_mod='$single_module' - fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac -]) - - -# _LT_DARWIN_LINKER_FEATURES([TAG]) -# --------------------------------- -# Checks for linker and compiler features on darwin -m4_defun([_LT_DARWIN_LINKER_FEATURES], -[ - m4_require([_LT_REQUIRED_DARWIN_CHECKS]) - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_automatic, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], - [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) - else - _LT_TAGVAR(whole_archive_flag_spec, $1)='' - fi - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - m4_if([$1], [CXX], -[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then - _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" - fi -],[]) - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi -]) - -# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) -# ---------------------------------- -# Links a minimal program and checks the executable -# for the system default hardcoded library path. In most cases, -# this is /usr/lib:/lib, but when the MPI compilers are used -# the location of the communication and MPI libs are included too. -# If we don't find anything, use the default library path according -# to the aix ld manual. -# Store the results from the different compilers for each TAGNAME. -# Allow to override them for all tags through lt_cv_aix_libpath. -m4_defun([_LT_SYS_MODULE_PATH_AIX], -[m4_require([_LT_DECL_SED])dnl -if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], - [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ - lt_aix_libpath_sed='[ - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }]' - _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then - _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi],[]) - if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then - _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" - fi - ]) - aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) -fi -])# _LT_SYS_MODULE_PATH_AIX - - -# _LT_SHELL_INIT(ARG) -# ------------------- -m4_define([_LT_SHELL_INIT], -[m4_divert_text([M4SH-INIT], [$1 -])])# _LT_SHELL_INIT - - - -# _LT_PROG_ECHO_BACKSLASH -# ----------------------- -# Find how we can fake an echo command that does not interpret backslash. -# In particular, with Autoconf 2.60 or later we add some code to the start -# of the generated configure script which will find a shell with a builtin -# printf (which we can use as an echo command). -m4_defun([_LT_PROG_ECHO_BACKSLASH], -[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - -AC_MSG_CHECKING([how to print strings]) -# Test print first, because it will be a builtin if present. -if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ - test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='print -r --' -elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='printf %s\n' -else - # Use this function as a fallback that always works. - func_fallback_echo () - { - eval 'cat <<_LTECHO_EOF -$[]1 -_LTECHO_EOF' - } - ECHO='func_fallback_echo' -fi - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "$*" -} - -case "$ECHO" in - printf*) AC_MSG_RESULT([printf]) ;; - print*) AC_MSG_RESULT([print -r]) ;; - *) AC_MSG_RESULT([cat]) ;; -esac - -m4_ifdef([_AS_DETECT_SUGGESTED], -[_AS_DETECT_SUGGESTED([ - test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( - ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' - ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO - ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - PATH=/empty FPATH=/empty; export PATH FPATH - test "X`printf %s $ECHO`" = "X$ECHO" \ - || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) - -_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) -_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) -])# _LT_PROG_ECHO_BACKSLASH - - -# _LT_WITH_SYSROOT -# ---------------- -AC_DEFUN([_LT_WITH_SYSROOT], -[AC_MSG_CHECKING([for sysroot]) -AC_ARG_WITH([sysroot], -[ --with-sysroot[=DIR] Search for dependent libraries within DIR - (or the compiler's sysroot if not specified).], -[], [with_sysroot=no]) - -dnl lt_sysroot will always be passed unquoted. We quote it here -dnl in case the user passed a directory name. -lt_sysroot= -case ${with_sysroot} in #( - yes) - if test "$GCC" = yes; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - AC_MSG_RESULT([${with_sysroot}]) - AC_MSG_ERROR([The sysroot must be an absolute path.]) - ;; -esac - - AC_MSG_RESULT([${lt_sysroot:-no}]) -_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl -[dependent libraries, and in which our libraries should be installed.])]) - -# _LT_ENABLE_LOCK -# --------------- -m4_defun([_LT_ENABLE_LOCK], -[AC_ARG_ENABLE([libtool-lock], - [AS_HELP_STRING([--disable-libtool-lock], - [avoid locking (might break parallel builds)])]) -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out which ABI we are using. - echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*|powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, - [AC_LANG_PUSH(C) - AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) - AC_LANG_POP]) - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; -*-*solaris*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) - case $host in - i?86-*-solaris*) - LD="${LD-ld} -m elf_x86_64" - ;; - sparc*-*-solaris*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - # GNU ld 2.21 introduced _sol2 emulations. Use them if available. - if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then - LD="${LD-ld}_sol2" - fi - ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks="$enable_libtool_lock" -])# _LT_ENABLE_LOCK - - -# _LT_PROG_AR -# ----------- -m4_defun([_LT_PROG_AR], -[AC_CHECK_TOOLS(AR, [ar], false) -: ${AR=ar} -: ${AR_FLAGS=cru} -_LT_DECL([], [AR], [1], [The archiver]) -_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) - -AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], - [lt_cv_ar_at_file=no - AC_COMPILE_IFELSE([AC_LANG_PROGRAM], - [echo conftest.$ac_objext > conftest.lst - lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' - AC_TRY_EVAL([lt_ar_try]) - if test "$ac_status" -eq 0; then - # Ensure the archiver fails upon bogus file names. - rm -f conftest.$ac_objext libconftest.a - AC_TRY_EVAL([lt_ar_try]) - if test "$ac_status" -ne 0; then - lt_cv_ar_at_file=@ - fi - fi - rm -f conftest.* libconftest.a - ]) - ]) - -if test "x$lt_cv_ar_at_file" = xno; then - archiver_list_spec= -else - archiver_list_spec=$lt_cv_ar_at_file -fi -_LT_DECL([], [archiver_list_spec], [1], - [How to feed a file listing to the archiver]) -])# _LT_PROG_AR - - -# _LT_CMD_OLD_ARCHIVE -# ------------------- -m4_defun([_LT_CMD_OLD_ARCHIVE], -[_LT_PROG_AR - -AC_CHECK_TOOL(STRIP, strip, :) -test -z "$STRIP" && STRIP=: -_LT_DECL([], [STRIP], [1], [A symbol stripping program]) - -AC_CHECK_TOOL(RANLIB, ranlib, :) -test -z "$RANLIB" && RANLIB=: -_LT_DECL([], [RANLIB], [1], - [Commands used to install an old-style archive]) - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" -fi - -case $host_os in - darwin*) - lock_old_archive_extraction=yes ;; - *) - lock_old_archive_extraction=no ;; -esac -_LT_DECL([], [old_postinstall_cmds], [2]) -_LT_DECL([], [old_postuninstall_cmds], [2]) -_LT_TAGDECL([], [old_archive_cmds], [2], - [Commands used to build an old-style archive]) -_LT_DECL([], [lock_old_archive_extraction], [0], - [Whether to use a lock for old archive extraction]) -])# _LT_CMD_OLD_ARCHIVE - - -# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) -# ---------------------------------------------------------------- -# Check whether the given compiler option works -AC_DEFUN([_LT_COMPILER_OPTION], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl -AC_CACHE_CHECK([$1], [$2], - [$2=no - m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$3" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - fi - $RM conftest* -]) - -if test x"[$]$2" = xyes; then - m4_if([$5], , :, [$5]) -else - m4_if([$6], , :, [$6]) -fi -])# _LT_COMPILER_OPTION - -# Old name: -AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) - - -# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [ACTION-SUCCESS], [ACTION-FAILURE]) -# ---------------------------------------------------- -# Check whether the given linker option works -AC_DEFUN([_LT_LINKER_OPTION], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl -AC_CACHE_CHECK([$1], [$2], - [$2=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $3" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&AS_MESSAGE_LOG_FD - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - else - $2=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" -]) - -if test x"[$]$2" = xyes; then - m4_if([$4], , :, [$4]) -else - m4_if([$5], , :, [$5]) -fi -])# _LT_LINKER_OPTION - -# Old name: -AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) - - -# LT_CMD_MAX_LEN -#--------------- -AC_DEFUN([LT_CMD_MAX_LEN], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -# find the maximum length of command line arguments -AC_MSG_CHECKING([the maximum length of command line arguments]) -AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl - i=0 - teststring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - os2*) - # The test takes a long time on OS/2. - lt_cv_sys_max_cmd_len=8192 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; - esac -]) -if test -n $lt_cv_sys_max_cmd_len ; then - AC_MSG_RESULT($lt_cv_sys_max_cmd_len) -else - AC_MSG_RESULT(none) -fi -max_cmd_len=$lt_cv_sys_max_cmd_len -_LT_DECL([], [max_cmd_len], [0], - [What is the maximum length of a command?]) -])# LT_CMD_MAX_LEN - -# Old name: -AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) - - -# _LT_HEADER_DLFCN -# ---------------- -m4_defun([_LT_HEADER_DLFCN], -[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl -])# _LT_HEADER_DLFCN - - -# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, -# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) -# ---------------------------------------------------------------- -m4_defun([_LT_TRY_DLOPEN_SELF], -[m4_require([_LT_HEADER_DLFCN])dnl -if test "$cross_compiling" = yes; then : - [$4] -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -[#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -}] -_LT_EOF - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) $1 ;; - x$lt_dlneed_uscore) $2 ;; - x$lt_dlunknown|x*) $3 ;; - esac - else : - # compilation failed - $3 - fi -fi -rm -fr conftest* -])# _LT_TRY_DLOPEN_SELF - - -# LT_SYS_DLOPEN_SELF -# ------------------ -AC_DEFUN([LT_SYS_DLOPEN_SELF], -[m4_require([_LT_HEADER_DLFCN])dnl -if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ]) - ;; - - *) - AC_CHECK_FUNC([shl_load], - [lt_cv_dlopen="shl_load"], - [AC_CHECK_LIB([dld], [shl_load], - [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], - [AC_CHECK_FUNC([dlopen], - [lt_cv_dlopen="dlopen"], - [AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], - [AC_CHECK_LIB([svld], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], - [AC_CHECK_LIB([dld], [dld_link], - [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) - ]) - ]) - ]) - ]) - ]) - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - AC_CACHE_CHECK([whether a program can dlopen itself], - lt_cv_dlopen_self, [dnl - _LT_TRY_DLOPEN_SELF( - lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, - lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) - ]) - - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - AC_CACHE_CHECK([whether a statically linked program can dlopen itself], - lt_cv_dlopen_self_static, [dnl - _LT_TRY_DLOPEN_SELF( - lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, - lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) - ]) - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi -_LT_DECL([dlopen_support], [enable_dlopen], [0], - [Whether dlopen is supported]) -_LT_DECL([dlopen_self], [enable_dlopen_self], [0], - [Whether dlopen of programs is supported]) -_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], - [Whether dlopen of statically linked programs is supported]) -])# LT_SYS_DLOPEN_SELF - -# Old name: -AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) - - -# _LT_COMPILER_C_O([TAGNAME]) -# --------------------------- -# Check to see if options -c and -o are simultaneously supported by compiler. -# This macro does not hard code the compiler like AC_PROG_CC_C_O. -m4_defun([_LT_COMPILER_C_O], -[m4_require([_LT_DECL_SED])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_TAG_COMPILER])dnl -AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], - [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], - [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes - fi - fi - chmod u+w . 2>&AS_MESSAGE_LOG_FD - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* -]) -_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], - [Does compiler simultaneously support -c and -o options?]) -])# _LT_COMPILER_C_O - - -# _LT_COMPILER_FILE_LOCKS([TAGNAME]) -# ---------------------------------- -# Check to see if we can do hard links to lock some files if needed -m4_defun([_LT_COMPILER_FILE_LOCKS], -[m4_require([_LT_ENABLE_LOCK])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -_LT_COMPILER_C_O([$1]) - -hard_links="nottested" -if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - AC_MSG_CHECKING([if we can lock with hard links]) - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - AC_MSG_RESULT([$hard_links]) - if test "$hard_links" = no; then - AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) - need_locks=warn - fi -else - need_locks=no -fi -_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) -])# _LT_COMPILER_FILE_LOCKS - - -# _LT_CHECK_OBJDIR -# ---------------- -m4_defun([_LT_CHECK_OBJDIR], -[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], -[rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null]) -objdir=$lt_cv_objdir -_LT_DECL([], [objdir], [0], - [The name of the directory that contains temporary libtool files])dnl -m4_pattern_allow([LT_OBJDIR])dnl -AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", - [Define to the sub-directory in which libtool stores uninstalled libraries.]) -])# _LT_CHECK_OBJDIR - - -# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) -# -------------------------------------- -# Check hardcoding attributes. -m4_defun([_LT_LINKER_HARDCODE_LIBPATH], -[AC_MSG_CHECKING([how to hardcode library paths into programs]) -_LT_TAGVAR(hardcode_action, $1)= -if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || - test -n "$_LT_TAGVAR(runpath_var, $1)" || - test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && - test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then - # Linking always hardcodes the temporary library directory. - _LT_TAGVAR(hardcode_action, $1)=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - _LT_TAGVAR(hardcode_action, $1)=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - _LT_TAGVAR(hardcode_action, $1)=unsupported -fi -AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) - -if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || - test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi -_LT_TAGDECL([], [hardcode_action], [0], - [How to hardcode a shared library path into an executable]) -])# _LT_LINKER_HARDCODE_LIBPATH - - -# _LT_CMD_STRIPLIB -# ---------------- -m4_defun([_LT_CMD_STRIPLIB], -[m4_require([_LT_DECL_EGREP]) -striplib= -old_striplib= -AC_MSG_CHECKING([whether stripping libraries is possible]) -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - AC_MSG_RESULT([yes]) -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - old_striplib="$STRIP -S" - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - fi - ;; - *) - AC_MSG_RESULT([no]) - ;; - esac -fi -_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) -_LT_DECL([], [striplib], [1]) -])# _LT_CMD_STRIPLIB - - -# _LT_SYS_DYNAMIC_LINKER([TAG]) -# ----------------------------- -# PORTME Fill in your ld.so characteristics -m4_defun([_LT_SYS_DYNAMIC_LINKER], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_OBJDUMP])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_CHECK_SHELL_FEATURES])dnl -AC_MSG_CHECKING([dynamic linker characteristics]) -m4_if([$1], - [], [ -if test "$GCC" = yes; then - case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; - esac - case $host_os in - mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; - *) lt_sed_strip_eq="s,=/,/,g" ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` - case $lt_search_path_spec in - *\;*) - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` - ;; - *) - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` - ;; - esac - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary. - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path/$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" - else - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" - fi - done - lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[[lt_foo]]++; } - if (lt_freq[[lt_foo]] == 1) { print lt_foo; } -}'` - # AWK program above erroneously prepends '/' to C:/dos/paths - # for these hosts. - case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; - esac - sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi]) -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[[4-9]]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[[01]] | aix4.[[01]].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[[45]]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' -m4_if([$1], [],[ - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' -m4_if([$1], [],[ - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[[23]].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[[01]]* | freebsdelf3.[[01]]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ - freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[[3-9]]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], - [lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ - LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" - AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], - [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], - [lt_cv_shlibpath_overrides_runpath=yes])]) - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - ]) - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Add ABI-specific directories to the system library path. - sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" - - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[[89]] | openbsd2.[[89]].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -AC_MSG_RESULT([$dynamic_linker]) -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - -_LT_DECL([], [variables_saved_for_relink], [1], - [Variables whose values should be saved in libtool wrapper scripts and - restored at link time]) -_LT_DECL([], [need_lib_prefix], [0], - [Do we need the "lib" prefix for modules?]) -_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) -_LT_DECL([], [version_type], [0], [Library versioning type]) -_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) -_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) -_LT_DECL([], [shlibpath_overrides_runpath], [0], - [Is shlibpath searched before the hard-coded library search path?]) -_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) -_LT_DECL([], [library_names_spec], [1], - [[List of archive names. First name is the real one, the rest are links. - The last name is the one that the linker finds with -lNAME]]) -_LT_DECL([], [soname_spec], [1], - [[The coded name of the library, if different from the real name]]) -_LT_DECL([], [install_override_mode], [1], - [Permission mode override for installation of shared libraries]) -_LT_DECL([], [postinstall_cmds], [2], - [Command to use after installation of a shared archive]) -_LT_DECL([], [postuninstall_cmds], [2], - [Command to use after uninstallation of a shared archive]) -_LT_DECL([], [finish_cmds], [2], - [Commands used to finish a libtool library installation in a directory]) -_LT_DECL([], [finish_eval], [1], - [[As "finish_cmds", except a single script fragment to be evaled but - not shown]]) -_LT_DECL([], [hardcode_into_libs], [0], - [Whether we should hardcode library paths into libraries]) -_LT_DECL([], [sys_lib_search_path_spec], [2], - [Compile-time system search path for libraries]) -_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], - [Run-time system search path for libraries]) -])# _LT_SYS_DYNAMIC_LINKER - - -# _LT_PATH_TOOL_PREFIX(TOOL) -# -------------------------- -# find a file program which can recognize shared library -AC_DEFUN([_LT_PATH_TOOL_PREFIX], -[m4_require([_LT_DECL_EGREP])dnl -AC_MSG_CHECKING([for $1]) -AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, -[case $MAGIC_CMD in -[[\\/*] | ?:[\\/]*]) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR -dnl $ac_dummy forces splitting on constant user-supplied paths. -dnl POSIX.2 word splitting is done only on the output of word expansions, -dnl not every word. This closes a longstanding sh security hole. - ac_dummy="m4_if([$2], , $PATH, [$2])" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$1; then - lt_cv_path_MAGIC_CMD="$ac_dir/$1" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac]) -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - AC_MSG_RESULT($MAGIC_CMD) -else - AC_MSG_RESULT(no) -fi -_LT_DECL([], [MAGIC_CMD], [0], - [Used to examine libraries when file_magic_cmd begins with "file"])dnl -])# _LT_PATH_TOOL_PREFIX - -# Old name: -AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) - - -# _LT_PATH_MAGIC -# -------------- -# find a file program which can recognize a shared library -m4_defun([_LT_PATH_MAGIC], -[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) - else - MAGIC_CMD=: - fi -fi -])# _LT_PATH_MAGIC - - -# LT_PATH_LD -# ---------- -# find the pathname to the GNU or non-GNU linker -AC_DEFUN([LT_PATH_LD], -[AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_PROG_ECHO_BACKSLASH])dnl - -AC_ARG_WITH([gnu-ld], - [AS_HELP_STRING([--with-gnu-ld], - [assume the C compiler uses GNU ld @<:@default=no@:>@])], - [test "$withval" = no || with_gnu_ld=yes], - [with_gnu_ld=no])dnl - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by $CC]) - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [[\\/]]* | ?:[[\\/]]*) - re_direlt='/[[^/]][[^/]]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL(lt_cv_path_LD, -[if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' - lt_cv_file_magic_cmd='$OBJDUMP -f' - fi - ;; - -cegcc*) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; - -freebsd* | dragonfly*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -haiku*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case $host_cpu in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -interix[[3-9]]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' - ;; - -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -*nto* | *qnx*) - lt_cv_deplibs_check_method=pass_all - ;; - -openbsd*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' - fi - ;; - -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; - -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all - ;; -esac -]) - -file_magic_glob= -want_nocaseglob=no -if test "$build" = "$host"; then - case $host_os in - mingw* | pw32*) - if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then - want_nocaseglob=yes - else - file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` - fi - ;; - esac -fi - -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown - -_LT_DECL([], [deplibs_check_method], [1], - [Method to check whether dependent libraries are shared objects]) -_LT_DECL([], [file_magic_cmd], [1], - [Command to use when deplibs_check_method = "file_magic"]) -_LT_DECL([], [file_magic_glob], [1], - [How to find potential files when deplibs_check_method = "file_magic"]) -_LT_DECL([], [want_nocaseglob], [1], - [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) -])# _LT_CHECK_MAGIC_METHOD - - -# LT_PATH_NM -# ---------- -# find the pathname to a BSD- or MS-compatible name lister -AC_DEFUN([LT_PATH_NM], -[AC_REQUIRE([AC_PROG_CC])dnl -AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, -[if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS="$lt_save_ifs" - done - : ${lt_cv_path_NM=no} -fi]) -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols" - ;; - *) - DUMPBIN=: - ;; - esac - fi - AC_SUBST([DUMPBIN]) - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm -AC_SUBST([NM]) -_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl - -AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], - [lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) - cat conftest.out >&AS_MESSAGE_LOG_FD - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest*]) -])# LT_PATH_NM - -# Old names: -AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) -AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_PROG_NM], []) -dnl AC_DEFUN([AC_PROG_NM], []) - -# _LT_CHECK_SHAREDLIB_FROM_LINKLIB -# -------------------------------- -# how to determine the name of the shared library -# associated with a specific link library. -# -- PORTME fill in with the dynamic library characteristics -m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], -[m4_require([_LT_DECL_EGREP]) -m4_require([_LT_DECL_OBJDUMP]) -m4_require([_LT_DECL_DLLTOOL]) -AC_CACHE_CHECK([how to associate runtime and link libraries], -lt_cv_sharedlib_from_linklib_cmd, -[lt_cv_sharedlib_from_linklib_cmd='unknown' - -case $host_os in -cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh - # decide which to use based on capabilities of $DLLTOOL - case `$DLLTOOL --help 2>&1` in - *--identify-strict*) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib - ;; - *) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback - ;; - esac - ;; -*) - # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd="$ECHO" - ;; -esac -]) -sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd -test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO - -_LT_DECL([], [sharedlib_from_linklib_cmd], [1], - [Command to associate shared and link libraries]) -])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB - - -# _LT_PATH_MANIFEST_TOOL -# ---------------------- -# locate the manifest tool -m4_defun([_LT_PATH_MANIFEST_TOOL], -[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) -test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], - [lt_cv_path_mainfest_tool=no - echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD - $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out - cat conftest.err >&AS_MESSAGE_LOG_FD - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes - fi - rm -f conftest*]) -if test "x$lt_cv_path_mainfest_tool" != xyes; then - MANIFEST_TOOL=: -fi -_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl -])# _LT_PATH_MANIFEST_TOOL - - -# LT_LIB_M -# -------- -# check for math library -AC_DEFUN([LT_LIB_M], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -LIBM= -case $host in -*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) - # These system don't have libm, or don't need it - ;; -*-ncr-sysv4.3*) - AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") - AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") - ;; -*) - AC_CHECK_LIB(m, cos, LIBM="-lm") - ;; -esac -AC_SUBST([LIBM]) -])# LT_LIB_M - -# Old name: -AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_CHECK_LIBM], []) - - -# _LT_COMPILER_NO_RTTI([TAGNAME]) -# ------------------------------- -m4_defun([_LT_COMPILER_NO_RTTI], -[m4_require([_LT_TAG_COMPILER])dnl - -_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= - -if test "$GCC" = yes; then - case $cc_basename in - nvcc*) - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; - *) - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; - esac - - _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], - lt_cv_prog_compiler_rtti_exceptions, - [-fno-rtti -fno-exceptions], [], - [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) -fi -_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], - [Compiler flag to turn off builtin functions]) -])# _LT_COMPILER_NO_RTTI - - -# _LT_CMD_GLOBAL_SYMBOLS -# ---------------------- -m4_defun([_LT_CMD_GLOBAL_SYMBOLS], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([LT_PATH_NM])dnl -AC_REQUIRE([LT_PATH_LD])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_TAG_COMPILER])dnl - -# Check for command to grab the raw symbol name followed by C symbol from nm. -AC_MSG_CHECKING([command to parse $NM output from $compiler object]) -AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], -[ -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[[BCDEGRST]]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[[BCDT]]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[[ABCDGISTW]]' - ;; -hpux*) - if test "$host_cpu" = ia64; then - symcode='[[ABCDEGRST]]' - fi - ;; -irix* | nonstopux*) - symcode='[[BCDEGRST]]' - ;; -osf*) - symcode='[[BCDEGQRST]]' - ;; -solaris*) - symcode='[[BDRT]]' - ;; -sco3.2v5*) - symcode='[[DT]]' - ;; -sysv4.2uw2*) - symcode='[[DT]]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[[ABDT]]' - ;; -sysv4) - symcode='[[DFNSTU]]' - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[[ABCDGIRSTW]]' ;; -esac - -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK ['"\ -" {last_section=section; section=\$ 3};"\ -" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx]" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - - if AC_TRY_EVAL(ac_compile); then - # Now try to grab the symbols. - nlist=conftest.nm - if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if $GREP ' nm_test_var$' "$nlist" >/dev/null; then - if $GREP ' nm_test_func$' "$nlist" >/dev/null; then - cat <<_LT_EOF > conftest.$ac_ext -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT@&t@_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT@&t@_DLSYM_CONST -#else -# define LT@&t@_DLSYM_CONST const -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -LT@&t@_DLSYM_CONST struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[[]] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_globsym_save_LIBS=$LIBS - lt_globsym_save_CFLAGS=$CFLAGS - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then - pipe_works=yes - fi - LIBS=$lt_globsym_save_LIBS - CFLAGS=$lt_globsym_save_CFLAGS - else - echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD - fi - else - echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD - fi - else - echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD - cat conftest.$ac_ext >&5 - fi - rm -rf conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done -]) -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - AC_MSG_RESULT(failed) -else - AC_MSG_RESULT(ok) -fi - -# Response file support. -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - nm_file_list_spec='@' -elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then - nm_file_list_spec='@' -fi - -_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], - [Take the output of nm and produce a listing of raw symbols and C names]) -_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], - [Transform the output of nm in a proper C declaration]) -_LT_DECL([global_symbol_to_c_name_address], - [lt_cv_sys_global_symbol_to_c_name_address], [1], - [Transform the output of nm in a C name address pair]) -_LT_DECL([global_symbol_to_c_name_address_lib_prefix], - [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], - [Transform the output of nm in a C name address pair when lib prefix is needed]) -_LT_DECL([], [nm_file_list_spec], [1], - [Specify filename containing input files for $NM]) -]) # _LT_CMD_GLOBAL_SYMBOLS - - -# _LT_COMPILER_PIC([TAGNAME]) -# --------------------------- -m4_defun([_LT_COMPILER_PIC], -[m4_require([_LT_TAG_COMPILER])dnl -_LT_TAGVAR(lt_prog_compiler_wl, $1)= -_LT_TAGVAR(lt_prog_compiler_pic, $1)= -_LT_TAGVAR(lt_prog_compiler_static, $1)= - -m4_if([$1], [CXX], [ - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - _LT_TAGVAR(lt_prog_compiler_static, $1)= - ;; - interix[[3-9]]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - sysv4*MP*) - if test -d /usr/nec; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - else - case $host_os in - aix[[4-9]]*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68*) - # Green Hills C++ Compiler - # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - dgux*) - case $cc_basename in - ec++*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - ghcx*) - # Green Hills C++ Compiler - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | dragonfly*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - if test "$host_cpu" != ia64; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - fi - ;; - aCC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - interix*) - # This is c89, which is MS Visual C++ (no shared libs) - # Anyone wants to do a port? - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # KAI C++ Compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - ecpc* ) - # old Intel C++ for x86_64 which still supported -KPIC. - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - icpc* ) - # Intel C++, used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - cxx*) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) - # IBM XL 8.0, 9.0 on PPC and BlueGene - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - ;; - esac - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd*) - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - ;; - RCC*) - # Rational C++ 2.4.1 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - cxx*) - # Digital/Compaq C++ - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - ;; - gcx*) - # Green Hills C++ Compiler - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - lcc*) - # Lucid - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - *) - ;; - esac - ;; - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - case $cc_basename in - CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - *) - ;; - esac - ;; - vxworks*) - ;; - *) - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - esac - fi -], -[ - if test "$GCC" = yes; then - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - _LT_TAGVAR(lt_prog_compiler_static, $1)= - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - ;; - - interix[[3-9]]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - enable_shared=no - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic - fi - ;; - - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - - case $cc_basename in - nvcc*) # Cuda Compiler Driver 2.2 - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' - if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" - fi - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - - hpux9* | hpux10* | hpux11*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # PIC (with -KPIC) is the default. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. - ecc*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' - _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' - ;; - nagfor*) - # NAG Fortran compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - ccc*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # All Alpha code is PIC. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - xl* | bgxl* | bgf* | mpixl*) - # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='' - ;; - *Sun\ F* | *Sun*Fortran*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - ;; - *Sun\ C*) - # Sun C 5.9 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - ;; - *Intel*\ [[CF]]*Compiler*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - *Portland\ Group*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - esac - ;; - esac - ;; - - newsos6) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - - osf3* | osf4* | osf5*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # All OSF/1 code is PIC. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - rdos*) - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - solaris*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - case $cc_basename in - f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; - *) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; - esac - ;; - - sunos4*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - unicos*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - - uts4*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - *) - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - esac - fi -]) -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" - ;; -esac - -AC_CACHE_CHECK([for $compiler option to produce PIC], - [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], - [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) -_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then - _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], - [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], - [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], - [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in - "" | " "*) ;; - *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; - esac], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) -fi -_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], - [Additional compiler flags for building library objects]) - -_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], - [How to pass a linker flag through the compiler]) -# -# Check to make sure the static flag actually works. -# -wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" -_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], - _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), - $lt_tmp_static_flag, - [], - [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) -_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], - [Compiler flag to prevent dynamic linking]) -])# _LT_COMPILER_PIC - - -# _LT_LINKER_SHLIBS([TAGNAME]) -# ---------------------------- -# See if the linker supports building shared libraries. -m4_defun([_LT_LINKER_SHLIBS], -[AC_REQUIRE([LT_PATH_LD])dnl -AC_REQUIRE([LT_PATH_NM])dnl -m4_require([_LT_PATH_MANIFEST_TOOL])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl -m4_require([_LT_TAG_COMPILER])dnl -AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) -m4_if([$1], [CXX], [ - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] - case $host_os in - aix[[4-9]]*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global defined - # symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" - ;; - cygwin* | mingw* | cegcc*) - case $cc_basename in - cl*) - _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - ;; - *) - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] - ;; - esac - ;; - *) - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac -], [ - runpath_var= - _LT_TAGVAR(allow_undefined_flag, $1)= - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(archive_cmds, $1)= - _LT_TAGVAR(archive_expsym_cmds, $1)= - _LT_TAGVAR(compiler_needs_object, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - _LT_TAGVAR(export_dynamic_flag_spec, $1)= - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(hardcode_automatic, $1)=no - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(hardcode_libdir_separator, $1)= - _LT_TAGVAR(hardcode_minus_L, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_TAGVAR(inherit_rpath, $1)=no - _LT_TAGVAR(link_all_deplibs, $1)=unknown - _LT_TAGVAR(module_cmds, $1)= - _LT_TAGVAR(module_expsym_cmds, $1)= - _LT_TAGVAR(old_archive_from_new_cmds, $1)= - _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= - _LT_TAGVAR(thread_safe_flag_spec, $1)= - _LT_TAGVAR(whole_archive_flag_spec, $1)= - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - _LT_TAGVAR(include_expsyms, $1)= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - # Exclude shared library initialization/finalization symbols. -dnl Note also adjust exclude_expsyms for C++ above. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - esac - - _LT_TAGVAR(ld_shlibs, $1)=yes - - # On some targets, GNU ld is compatible enough with the native linker - # that we're better off using the native interface for both. - lt_use_gnu_ld_interface=no - if test "$with_gnu_ld" = yes; then - case $host_os in - aix*) - # The AIX port of GNU ld has always aspired to compatibility - # with the native linker. However, as the warning in the GNU ld - # block says, versions before 2.19.5* couldn't really create working - # shared libraries, regardless of the interface used. - case `$LD -v 2>&1` in - *\ \(GNU\ Binutils\)\ 2.19.5*) ;; - *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; - *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - fi - - if test "$lt_use_gnu_ld_interface" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - _LT_TAGVAR(whole_archive_flag_spec, $1)= - fi - supports_anon_versioning=no - case `$LD -v 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix[[3-9]]*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&2 - -*** Warning: the GNU linker, at least up to release 2.19, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to install binutils -*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. -*** You will then need to restart the configuration process. - -_LT_EOF - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='' - ;; - m68k) - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - haiku*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - interix[[3-9]]*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test "$host_os" = linux-dietlibc; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no - then - tmp_addflag=' $pic_flag' - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group f77 and f90 compilers - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - _LT_TAGVAR(whole_archive_flag_spec, $1)= - tmp_sharedflag='--shared' ;; - xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - nvcc*) # Cuda Compiler Driver 2.2 - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - _LT_TAGVAR(compiler_needs_object, $1)=yes - ;; - esac - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) # Sun C 5.9 - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - _LT_TAGVAR(compiler_needs_object, $1)=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test "x$supports_anon_versioning" = xyes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - xlf* | bgf* | bgxlf* | mpixlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - sunos4*) - _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - - if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then - runpath_var= - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(export_dynamic_flag_spec, $1)= - _LT_TAGVAR(whole_archive_flag_spec, $1)= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=yes - _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - _LT_TAGVAR(hardcode_direct, $1)=unsupported - fi - ;; - - aix[[4-9]]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - _LT_TAGVAR(archive_cmds, $1)='' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' - - if test "$GCC" = yes; then - case $host_os in aix4.[[012]]|aix4.[[012]].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - _LT_TAGVAR(hardcode_direct, $1)=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - _LT_TAGVAR(always_export_symbols, $1)=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' - _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared libraries. - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='' - ;; - m68k) - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - ;; - - bsdi[[45]]*) - _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - case $cc_basename in - cl*) - # Native MSVC - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' - # Don't use ranlib - _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' - _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # Assume MSVC wrapper - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' - # FIXME: Should let the user specify the lib program. - _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - ;; - esac - ;; - - darwin* | rhapsody*) - _LT_DARWIN_LINKER_FEATURES($1) - ;; - - dgux*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2.*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - hpux9*) - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_direct, $1)=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - ;; - - hpux10*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - fi - ;; - - hpux11*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - m4_if($1, [], [ - # Older versions of the 11.00 compiler do not understand -b yet - # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - _LT_LINKER_OPTION([if $CC understands -b], - _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], - [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], - [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], - [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) - ;; - esac - fi - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - case $host_cpu in - hppa*64*|ia64*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - *) - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - # This should be the same for all languages, so no per-tag cache variable. - AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], - [lt_cv_irix_exported_symbol], - [save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - AC_LINK_IFELSE( - [AC_LANG_SOURCE( - [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], - [C++], [[int foo (void) { return 0; }]], - [Fortran 77], [[ - subroutine foo - end]], - [Fortran], [[ - subroutine foo - end]])])], - [lt_cv_irix_exported_symbol=yes], - [lt_cv_irix_exported_symbol=no]) - LDFLAGS="$save_LDFLAGS"]) - if test "$lt_cv_irix_exported_symbol" = yes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - fi - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(inherit_rpath, $1)=yes - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - newsos6) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *nto* | *qnx*) - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - else - case $host_os in - openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - ;; - esac - fi - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - os2*) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - else - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' - - # Both c and cxx compiler support -rpath directly - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - - solaris*) - _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' - ;; - *) - wlarc='${wl}' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - else - _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' - fi - ;; - esac - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv4) - case $host_vendor in - sni) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' - _LT_TAGVAR(hardcode_direct, $1)=no - ;; - motorola) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv4.3*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - _LT_TAGVAR(ld_shlibs, $1)=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *) - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - - if test x$host_vendor = xsni; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' - ;; - esac - fi - fi -]) -AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) -test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - -_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld - -_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl -_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl -_LT_DECL([], [extract_expsyms_cmds], [2], - [The commands to extract the exported symbol list from a shared archive]) - -# -# Do we need to explicitly link libc? -# -case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in -x|xyes) - # Assume -lc should be added - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $_LT_TAGVAR(archive_cmds, $1) in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - AC_CACHE_CHECK([whether -lc should be explicitly linked in], - [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), - [$RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if AC_TRY_EVAL(ac_compile) 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) - pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) - _LT_TAGVAR(allow_undefined_flag, $1)= - if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) - then - lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no - else - lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes - fi - _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - ]) - _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) - ;; - esac - fi - ;; -esac - -_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], - [Whether or not to add -lc for building shared libraries]) -_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], - [enable_shared_with_static_runtimes], [0], - [Whether or not to disallow shared libs when runtime libs are static]) -_LT_TAGDECL([], [export_dynamic_flag_spec], [1], - [Compiler flag to allow reflexive dlopens]) -_LT_TAGDECL([], [whole_archive_flag_spec], [1], - [Compiler flag to generate shared objects directly from archives]) -_LT_TAGDECL([], [compiler_needs_object], [1], - [Whether the compiler copes with passing no objects directly]) -_LT_TAGDECL([], [old_archive_from_new_cmds], [2], - [Create an old-style archive from a shared archive]) -_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], - [Create a temporary old-style archive to link instead of a shared archive]) -_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) -_LT_TAGDECL([], [archive_expsym_cmds], [2]) -_LT_TAGDECL([], [module_cmds], [2], - [Commands used to build a loadable module if different from building - a shared archive.]) -_LT_TAGDECL([], [module_expsym_cmds], [2]) -_LT_TAGDECL([], [with_gnu_ld], [1], - [Whether we are building with GNU ld or not]) -_LT_TAGDECL([], [allow_undefined_flag], [1], - [Flag that allows shared libraries with undefined symbols to be built]) -_LT_TAGDECL([], [no_undefined_flag], [1], - [Flag that enforces no undefined symbols]) -_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], - [Flag to hardcode $libdir into a binary during linking. - This must work even if $libdir does not exist]) -_LT_TAGDECL([], [hardcode_libdir_separator], [1], - [Whether we need a single "-rpath" flag with a separated argument]) -_LT_TAGDECL([], [hardcode_direct], [0], - [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes - DIR into the resulting binary]) -_LT_TAGDECL([], [hardcode_direct_absolute], [0], - [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes - DIR into the resulting binary and the resulting library dependency is - "absolute", i.e impossible to change by setting ${shlibpath_var} if the - library is relocated]) -_LT_TAGDECL([], [hardcode_minus_L], [0], - [Set to "yes" if using the -LDIR flag during linking hardcodes DIR - into the resulting binary]) -_LT_TAGDECL([], [hardcode_shlibpath_var], [0], - [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR - into the resulting binary]) -_LT_TAGDECL([], [hardcode_automatic], [0], - [Set to "yes" if building a shared library automatically hardcodes DIR - into the library and all subsequent libraries and executables linked - against it]) -_LT_TAGDECL([], [inherit_rpath], [0], - [Set to yes if linker adds runtime paths of dependent libraries - to runtime path list]) -_LT_TAGDECL([], [link_all_deplibs], [0], - [Whether libtool must link a program against all its dependency libraries]) -_LT_TAGDECL([], [always_export_symbols], [0], - [Set to "yes" if exported symbols are required]) -_LT_TAGDECL([], [export_symbols_cmds], [2], - [The commands to list exported symbols]) -_LT_TAGDECL([], [exclude_expsyms], [1], - [Symbols that should not be listed in the preloaded symbols]) -_LT_TAGDECL([], [include_expsyms], [1], - [Symbols that must always be exported]) -_LT_TAGDECL([], [prelink_cmds], [2], - [Commands necessary for linking programs (against libraries) with templates]) -_LT_TAGDECL([], [postlink_cmds], [2], - [Commands necessary for finishing linking programs]) -_LT_TAGDECL([], [file_list_spec], [1], - [Specify filename containing input files]) -dnl FIXME: Not yet implemented -dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], -dnl [Compiler flag to generate thread safe objects]) -])# _LT_LINKER_SHLIBS - - -# _LT_LANG_C_CONFIG([TAG]) -# ------------------------ -# Ensure that the configuration variables for a C compiler are suitably -# defined. These variables are subsequently used by _LT_CONFIG to write -# the compiler configuration to `libtool'. -m4_defun([_LT_LANG_C_CONFIG], -[m4_require([_LT_DECL_EGREP])dnl -lt_save_CC="$CC" -AC_LANG_PUSH(C) - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - -_LT_TAG_COMPILER -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -## CAVEAT EMPTOR: -## There is no encapsulation within the following macros, do not change -## the running order or otherwise move them around unless you know exactly -## what you are doing... -if test -n "$compiler"; then - _LT_COMPILER_NO_RTTI($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - LT_SYS_DLOPEN_SELF - _LT_CMD_STRIPLIB - - # Report which library types will actually be built - AC_MSG_CHECKING([if libtool supports shared libraries]) - AC_MSG_RESULT([$can_build_shared]) - - AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - - aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - AC_MSG_RESULT([$enable_shared]) - - AC_MSG_CHECKING([whether to build static libraries]) - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - AC_MSG_RESULT([$enable_static]) - - _LT_CONFIG($1) -fi -AC_LANG_POP -CC="$lt_save_CC" -])# _LT_LANG_C_CONFIG - - -# _LT_LANG_CXX_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for a C++ compiler are suitably -# defined. These variables are subsequently used by _LT_CONFIG to write -# the compiler configuration to `libtool'. -m4_defun([_LT_LANG_CXX_CONFIG], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_PATH_MANIFEST_TOOL])dnl -if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - AC_PROG_CXXCPP -else - _lt_caught_CXX_error=yes -fi - -AC_LANG_PUSH(C++) -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(compiler_needs_object, $1)=no -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for C++ test sources. -ac_ext=cpp - -# Object file extension for compiled C++ test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the CXX compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_caught_CXX_error" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="int some_variable = 0;" - - # Code to be used in simple link tests - lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC=$CC - lt_save_CFLAGS=$CFLAGS - lt_save_LD=$LD - lt_save_GCC=$GCC - GCC=$GXX - lt_save_with_gnu_ld=$with_gnu_ld - lt_save_path_LD=$lt_cv_path_LD - if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx - else - $as_unset lt_cv_prog_gnu_ld - fi - if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX - else - $as_unset lt_cv_path_LD - fi - test -z "${LDCXX+set}" || LD=$LDCXX - CC=${CXX-"c++"} - CFLAGS=$CXXFLAGS - compiler=$CC - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - - if test -n "$compiler"; then - # We don't want -fno-exception when compiling C++ code, so set the - # no_builtin_flag separately - if test "$GXX" = yes; then - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' - else - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= - fi - - if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - LT_PATH_LD - - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='${wl}' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | - $GREP 'no-whole-archive' > /dev/null; then - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - _LT_TAGVAR(whole_archive_flag_spec, $1)= - fi - else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - GXX=no - with_gnu_ld=no - wlarc= - fi - - # PORTME: fill in a description of your system's C++ link characteristics - AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) - _LT_TAGVAR(ld_shlibs, $1)=yes - case $host_os in - aix3*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - aix[[4-9]]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - _LT_TAGVAR(archive_cmds, $1)='' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' - - if test "$GXX" = yes; then - case $host_os in aix4.[[012]]|aix4.[[012]].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - _LT_TAGVAR(hardcode_direct, $1)=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)= - fi - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to - # export. - _LT_TAGVAR(always_export_symbols, $1)=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an empty - # executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' - _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared - # libraries. - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - cygwin* | mingw* | pw32* | cegcc*) - case $GXX,$cc_basename in - ,cl* | no,cl*) - # Native MSVC - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - # Don't use ranlib - _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' - _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - func_to_tool_file "$lt_outputfile"~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # g++ - # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - darwin* | rhapsody*) - _LT_DARWIN_LINKER_FEATURES($1) - ;; - - dgux*) - case $cc_basename in - ec++*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - ghcx*) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - freebsd2.*) - # C++ shared libraries reported to be fairly broken before - # switch to ELF - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - freebsd-elf*) - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - ;; - - freebsd* | dragonfly*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - _LT_TAGVAR(ld_shlibs, $1)=yes - ;; - - gnu*) - ;; - - haiku*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - hpux9*) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - aCC*) - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - ;; - esac - fi - case $host_cpu in - hppa*64*|ia64*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - *) - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - aCC*) - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - interix[[3-9]]*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - irix5* | irix6*) - case $cc_basename in - CC*) - # SGI C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' - fi - fi - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - esac - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(inherit_rpath, $1)=yes - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc* | ecpc* ) - # Intel C++ - with_gnu_ld=yes - # version 8.0 and above of icpc choke on multiply defined symbols - # if we add $predep_objects and $postdep_objects, however 7.1 and - # earlier do not add the objects themselves. - case `$CC -V 2>&1` in - *"Version 7."*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 8.0 or newer - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - case `$CC -V` in - *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) - _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' - _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ - $RANLIB $oldlib' - _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - *) # Version 6 and above use weak symbols - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - esac - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - ;; - cxx*) - # Compaq C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' - ;; - xl* | mpixl* | bgxl*) - # IBM XL 8.0 on PPC, with GNU ld - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - _LT_TAGVAR(compiler_needs_object, $1)=yes - - # Not sure whether something based on - # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 - # would be better. - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' - ;; - esac - ;; - esac - ;; - - lynxos*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - m88k*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - mvs*) - case $cc_basename in - cxx*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - - *nto* | *qnx*) - _LT_TAGVAR(ld_shlibs, $1)=yes - ;; - - openbsd2*) - # C++ shared libraries are fairly broken - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - fi - output_verbose_link_cmd=func_echo_all - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - case $host in - osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; - *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; - esac - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - cxx*) - case $host in - osf3*) - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - ;; - *) - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ - $RM $lib.exp' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - ;; - esac - - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - case $host in - osf3*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - esac - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - psos*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - lcc*) - # Lucid - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_TAGVAR(archive_cmds_need_lc,$1)=yes - _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. - # Supported since Solaris 2.6 (maybe 2.5.1?) - _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' - ;; - esac - _LT_TAGVAR(link_all_deplibs, $1)=yes - - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' - ;; - gcx*) - # Green Hills C++ Compiler - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' - if $CC --version | $GREP -v '^2\.7' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - else - # g++ 2.7 appears to require `-G' NOT `-shared' on this - # platform. - _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - fi - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - ;; - esac - fi - ;; - esac - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ - '"$_LT_TAGVAR(old_archive_cmds, $1)" - _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ - '"$_LT_TAGVAR(reload_cmds, $1)" - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - vxworks*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - - AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) - test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - - _LT_TAGVAR(GCC, $1)="$GXX" - _LT_TAGVAR(LD, $1)="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - _LT_SYS_HIDDEN_LIBDEPS($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS - LDCXX=$LD - LD=$lt_save_LD - GCC=$lt_save_GCC - with_gnu_ld=$lt_save_with_gnu_ld - lt_cv_path_LDCXX=$lt_cv_path_LD - lt_cv_path_LD=$lt_save_path_LD - lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld - lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -fi # test "$_lt_caught_CXX_error" != yes - -AC_LANG_POP -])# _LT_LANG_CXX_CONFIG - - -# _LT_FUNC_STRIPNAME_CNF -# ---------------------- -# func_stripname_cnf prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -# -# This function is identical to the (non-XSI) version of func_stripname, -# except this one can be used by m4 code that may be executed by configure, -# rather than the libtool script. -m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl -AC_REQUIRE([_LT_DECL_SED]) -AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) -func_stripname_cnf () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; - esac -} # func_stripname_cnf -])# _LT_FUNC_STRIPNAME_CNF - -# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) -# --------------------------------- -# Figure out "hidden" library dependencies from verbose -# compiler output when linking a shared library. -# Parse the compiler output and extract the necessary -# objects, libraries and library flags. -m4_defun([_LT_SYS_HIDDEN_LIBDEPS], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl -# Dependencies to place before and after the object being linked: -_LT_TAGVAR(predep_objects, $1)= -_LT_TAGVAR(postdep_objects, $1)= -_LT_TAGVAR(predeps, $1)= -_LT_TAGVAR(postdeps, $1)= -_LT_TAGVAR(compiler_lib_search_path, $1)= - -dnl we can't use the lt_simple_compile_test_code here, -dnl because it contains code intended for an executable, -dnl not a library. It's possible we should let each -dnl tag define a new lt_????_link_test_code variable, -dnl but it's only used here... -m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF -int a; -void foo (void) { a = 0; } -_LT_EOF -], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF -class Foo -{ -public: - Foo (void) { a = 0; } -private: - int a; -}; -_LT_EOF -], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF - subroutine foo - implicit none - integer*4 a - a=0 - return - end -_LT_EOF -], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF - subroutine foo - implicit none - integer a - a=0 - return - end -_LT_EOF -], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF -public class foo { - private int a; - public void bar (void) { - a = 0; - } -}; -_LT_EOF -], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF -package foo -func foo() { -} -_LT_EOF -]) - -_lt_libdeps_save_CFLAGS=$CFLAGS -case "$CC $CFLAGS " in #( -*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; -*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; -*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; -esac - -dnl Parse the compiler output and extract the necessary -dnl objects, libraries and library flags. -if AC_TRY_EVAL(ac_compile); then - # Parse the compiler output and extract the necessary - # objects, libraries and library flags. - - # Sentinel used to keep track of whether or not we are before - # the conftest object file. - pre_test_object_deps_done=no - - for p in `eval "$output_verbose_link_cmd"`; do - case ${prev}${p} in - - -L* | -R* | -l*) - # Some compilers place space between "-{L,R}" and the path. - # Remove the space. - if test $p = "-L" || - test $p = "-R"; then - prev=$p - continue - fi - - # Expand the sysroot to ease extracting the directories later. - if test -z "$prev"; then - case $p in - -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; - -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; - -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; - esac - fi - case $p in - =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; - esac - if test "$pre_test_object_deps_done" = no; then - case ${prev} in - -L | -R) - # Internal compiler library paths should come after those - # provided the user. The postdeps already come after the - # user supplied libs so there is no need to process them. - if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then - _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" - else - _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" - fi - ;; - # The "-l" case would never come before the object being - # linked, so don't bother handling this case. - esac - else - if test -z "$_LT_TAGVAR(postdeps, $1)"; then - _LT_TAGVAR(postdeps, $1)="${prev}${p}" - else - _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" - fi - fi - prev= - ;; - - *.lto.$objext) ;; # Ignore GCC LTO objects - *.$objext) - # This assumes that the test object file only shows up - # once in the compiler output. - if test "$p" = "conftest.$objext"; then - pre_test_object_deps_done=yes - continue - fi - - if test "$pre_test_object_deps_done" = no; then - if test -z "$_LT_TAGVAR(predep_objects, $1)"; then - _LT_TAGVAR(predep_objects, $1)="$p" - else - _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" - fi - else - if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then - _LT_TAGVAR(postdep_objects, $1)="$p" - else - _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" - fi - fi - ;; - - *) ;; # Ignore the rest. - - esac - done - - # Clean up. - rm -f a.out a.exe -else - echo "libtool.m4: error: problem compiling $1 test program" -fi - -$RM -f confest.$objext -CFLAGS=$_lt_libdeps_save_CFLAGS - -# PORTME: override above test on systems where it is broken -m4_if([$1], [CXX], -[case $host_os in -interix[[3-9]]*) - # Interix 3.5 installs completely hosed .la files for C++, so rather than - # hack all around it, let's just trust "g++" to DTRT. - _LT_TAGVAR(predep_objects,$1)= - _LT_TAGVAR(postdep_objects,$1)= - _LT_TAGVAR(postdeps,$1)= - ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test "$solaris_use_stlport4" != yes; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC* | sunCC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test "$solaris_use_stlport4" != yes; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; -esac -]) - -case " $_LT_TAGVAR(postdeps, $1) " in -*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; -esac - _LT_TAGVAR(compiler_lib_search_dirs, $1)= -if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then - _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` -fi -_LT_TAGDECL([], [compiler_lib_search_dirs], [1], - [The directories searched by this compiler when creating a shared library]) -_LT_TAGDECL([], [predep_objects], [1], - [Dependencies to place before and after the objects being linked to - create a shared library]) -_LT_TAGDECL([], [postdep_objects], [1]) -_LT_TAGDECL([], [predeps], [1]) -_LT_TAGDECL([], [postdeps], [1]) -_LT_TAGDECL([], [compiler_lib_search_path], [1], - [The library search path used internally by the compiler when linking - a shared library]) -])# _LT_SYS_HIDDEN_LIBDEPS - - -# _LT_LANG_F77_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for a Fortran 77 compiler are -# suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_F77_CONFIG], -[AC_LANG_PUSH(Fortran 77) -if test -z "$F77" || test "X$F77" = "Xno"; then - _lt_disable_F77=yes -fi - -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for f77 test sources. -ac_ext=f - -# Object file extension for compiled f77 test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the F77 compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_disable_F77" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="\ - subroutine t - return - end -" - - # Code to be used in simple link tests - lt_simple_link_test_code="\ - program t - end -" - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC="$CC" - lt_save_GCC=$GCC - lt_save_CFLAGS=$CFLAGS - CC=${F77-"f77"} - CFLAGS=$FFLAGS - compiler=$CC - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - GCC=$G77 - if test -n "$compiler"; then - AC_MSG_CHECKING([if libtool supports shared libraries]) - AC_MSG_RESULT([$can_build_shared]) - - AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - AC_MSG_RESULT([$enable_shared]) - - AC_MSG_CHECKING([whether to build static libraries]) - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - AC_MSG_RESULT([$enable_static]) - - _LT_TAGVAR(GCC, $1)="$G77" - _LT_TAGVAR(LD, $1)="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - GCC=$lt_save_GCC - CC="$lt_save_CC" - CFLAGS="$lt_save_CFLAGS" -fi # test "$_lt_disable_F77" != yes - -AC_LANG_POP -])# _LT_LANG_F77_CONFIG - - -# _LT_LANG_FC_CONFIG([TAG]) -# ------------------------- -# Ensure that the configuration variables for a Fortran compiler are -# suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_FC_CONFIG], -[AC_LANG_PUSH(Fortran) - -if test -z "$FC" || test "X$FC" = "Xno"; then - _lt_disable_FC=yes -fi - -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for fc test sources. -ac_ext=${ac_fc_srcext-f} - -# Object file extension for compiled fc test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the FC compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_disable_FC" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="\ - subroutine t - return - end -" - - # Code to be used in simple link tests - lt_simple_link_test_code="\ - program t - end -" - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC="$CC" - lt_save_GCC=$GCC - lt_save_CFLAGS=$CFLAGS - CC=${FC-"f95"} - CFLAGS=$FCFLAGS - compiler=$CC - GCC=$ac_cv_fc_compiler_gnu - - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - - if test -n "$compiler"; then - AC_MSG_CHECKING([if libtool supports shared libraries]) - AC_MSG_RESULT([$can_build_shared]) - - AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - AC_MSG_RESULT([$enable_shared]) - - AC_MSG_CHECKING([whether to build static libraries]) - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - AC_MSG_RESULT([$enable_static]) - - _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" - _LT_TAGVAR(LD, $1)="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - _LT_SYS_HIDDEN_LIBDEPS($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - GCC=$lt_save_GCC - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS -fi # test "$_lt_disable_FC" != yes - -AC_LANG_POP -])# _LT_LANG_FC_CONFIG - - -# _LT_LANG_GCJ_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for the GNU Java Compiler compiler -# are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_GCJ_CONFIG], -[AC_REQUIRE([LT_PROG_GCJ])dnl -AC_LANG_SAVE - -# Source file extension for Java test sources. -ac_ext=java - -# Object file extension for compiled Java test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="class foo {}" - -# Code to be used in simple link tests -lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. -_LT_TAG_COMPILER - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -# Allow CC to be a program name with arguments. -lt_save_CC=$CC -lt_save_CFLAGS=$CFLAGS -lt_save_GCC=$GCC -GCC=yes -CC=${GCJ-"gcj"} -CFLAGS=$GCJFLAGS -compiler=$CC -_LT_TAGVAR(compiler, $1)=$CC -_LT_TAGVAR(LD, $1)="$LD" -_LT_CC_BASENAME([$compiler]) - -# GCJ did not exist at the time GCC didn't implicitly link libc in. -_LT_TAGVAR(archive_cmds_need_lc, $1)=no - -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds - -## CAVEAT EMPTOR: -## There is no encapsulation within the following macros, do not change -## the running order or otherwise move them around unless you know exactly -## what you are doing... -if test -n "$compiler"; then - _LT_COMPILER_NO_RTTI($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) -fi - -AC_LANG_RESTORE - -GCC=$lt_save_GCC -CC=$lt_save_CC -CFLAGS=$lt_save_CFLAGS -])# _LT_LANG_GCJ_CONFIG - - -# _LT_LANG_GO_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for the GNU Go compiler -# are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_GO_CONFIG], -[AC_REQUIRE([LT_PROG_GO])dnl -AC_LANG_SAVE - -# Source file extension for Go test sources. -ac_ext=go - -# Object file extension for compiled Go test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="package main; func main() { }" - -# Code to be used in simple link tests -lt_simple_link_test_code='package main; func main() { }' - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. -_LT_TAG_COMPILER - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -# Allow CC to be a program name with arguments. -lt_save_CC=$CC -lt_save_CFLAGS=$CFLAGS -lt_save_GCC=$GCC -GCC=yes -CC=${GOC-"gccgo"} -CFLAGS=$GOFLAGS -compiler=$CC -_LT_TAGVAR(compiler, $1)=$CC -_LT_TAGVAR(LD, $1)="$LD" -_LT_CC_BASENAME([$compiler]) - -# Go did not exist at the time GCC didn't implicitly link libc in. -_LT_TAGVAR(archive_cmds_need_lc, $1)=no - -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds - -## CAVEAT EMPTOR: -## There is no encapsulation within the following macros, do not change -## the running order or otherwise move them around unless you know exactly -## what you are doing... -if test -n "$compiler"; then - _LT_COMPILER_NO_RTTI($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) -fi - -AC_LANG_RESTORE - -GCC=$lt_save_GCC -CC=$lt_save_CC -CFLAGS=$lt_save_CFLAGS -])# _LT_LANG_GO_CONFIG - - -# _LT_LANG_RC_CONFIG([TAG]) -# ------------------------- -# Ensure that the configuration variables for the Windows resource compiler -# are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_RC_CONFIG], -[AC_REQUIRE([LT_PROG_RC])dnl -AC_LANG_SAVE - -# Source file extension for RC test sources. -ac_ext=rc - -# Object file extension for compiled RC test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' - -# Code to be used in simple link tests -lt_simple_link_test_code="$lt_simple_compile_test_code" - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. -_LT_TAG_COMPILER - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -# Allow CC to be a program name with arguments. -lt_save_CC="$CC" -lt_save_CFLAGS=$CFLAGS -lt_save_GCC=$GCC -GCC= -CC=${RC-"windres"} -CFLAGS= -compiler=$CC -_LT_TAGVAR(compiler, $1)=$CC -_LT_CC_BASENAME([$compiler]) -_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes - -if test -n "$compiler"; then - : - _LT_CONFIG($1) -fi - -GCC=$lt_save_GCC -AC_LANG_RESTORE -CC=$lt_save_CC -CFLAGS=$lt_save_CFLAGS -])# _LT_LANG_RC_CONFIG - - -# LT_PROG_GCJ -# ----------- -AC_DEFUN([LT_PROG_GCJ], -[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], - [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], - [AC_CHECK_TOOL(GCJ, gcj,) - test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" - AC_SUBST(GCJFLAGS)])])[]dnl -]) - -# Old name: -AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_GCJ], []) - - -# LT_PROG_GO -# ---------- -AC_DEFUN([LT_PROG_GO], -[AC_CHECK_TOOL(GOC, gccgo,) -]) - - -# LT_PROG_RC -# ---------- -AC_DEFUN([LT_PROG_RC], -[AC_CHECK_TOOL(RC, windres,) -]) - -# Old name: -AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_RC], []) - - -# _LT_DECL_EGREP -# -------------- -# If we don't have a new enough Autoconf to choose the best grep -# available, choose the one first in the user's PATH. -m4_defun([_LT_DECL_EGREP], -[AC_REQUIRE([AC_PROG_EGREP])dnl -AC_REQUIRE([AC_PROG_FGREP])dnl -test -z "$GREP" && GREP=grep -_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) -_LT_DECL([], [EGREP], [1], [An ERE matcher]) -_LT_DECL([], [FGREP], [1], [A literal string matcher]) -dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too -AC_SUBST([GREP]) -]) - - -# _LT_DECL_OBJDUMP -# -------------- -# If we don't have a new enough Autoconf to choose the best objdump -# available, choose the one first in the user's PATH. -m4_defun([_LT_DECL_OBJDUMP], -[AC_CHECK_TOOL(OBJDUMP, objdump, false) -test -z "$OBJDUMP" && OBJDUMP=objdump -_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) -AC_SUBST([OBJDUMP]) -]) - -# _LT_DECL_DLLTOOL -# ---------------- -# Ensure DLLTOOL variable is set. -m4_defun([_LT_DECL_DLLTOOL], -[AC_CHECK_TOOL(DLLTOOL, dlltool, false) -test -z "$DLLTOOL" && DLLTOOL=dlltool -_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) -AC_SUBST([DLLTOOL]) -]) - -# _LT_DECL_SED -# ------------ -# Check for a fully-functional sed program, that truncates -# as few characters as possible. Prefer GNU sed if found. -m4_defun([_LT_DECL_SED], -[AC_PROG_SED -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" -_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) -_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], - [Sed that helps us avoid accidentally triggering echo(1) options like -n]) -])# _LT_DECL_SED - -m4_ifndef([AC_PROG_SED], [ -############################################################ -# NOTE: This macro has been submitted for inclusion into # -# GNU Autoconf as AC_PROG_SED. When it is available in # -# a released version of Autoconf we should remove this # -# macro and use it instead. # -############################################################ - -m4_defun([AC_PROG_SED], -[AC_MSG_CHECKING([for a sed that does not truncate output]) -AC_CACHE_VAL(lt_cv_path_SED, -[# Loop through the user's path and test for sed and gsed. -# Then use that list of sed's as ones to test for truncation. -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for lt_ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then - lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" - fi - done - done -done -IFS=$as_save_IFS -lt_ac_max=0 -lt_ac_count=0 -# Add /usr/xpg4/bin/sed as it is typically found on Solaris -# along with /bin/sed that truncates output. -for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do - test ! -f $lt_ac_sed && continue - cat /dev/null > conftest.in - lt_ac_count=0 - echo $ECHO_N "0123456789$ECHO_C" >conftest.in - # Check for GNU sed and select it if it is found. - if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then - lt_cv_path_SED=$lt_ac_sed - break - fi - while true; do - cat conftest.in conftest.in >conftest.tmp - mv conftest.tmp conftest.in - cp conftest.in conftest.nl - echo >>conftest.nl - $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break - cmp -s conftest.out conftest.nl || break - # 10000 chars as input seems more than enough - test $lt_ac_count -gt 10 && break - lt_ac_count=`expr $lt_ac_count + 1` - if test $lt_ac_count -gt $lt_ac_max; then - lt_ac_max=$lt_ac_count - lt_cv_path_SED=$lt_ac_sed - fi - done -done -]) -SED=$lt_cv_path_SED -AC_SUBST([SED]) -AC_MSG_RESULT([$SED]) -])#AC_PROG_SED -])#m4_ifndef - -# Old name: -AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_SED], []) - - -# _LT_CHECK_SHELL_FEATURES -# ------------------------ -# Find out whether the shell is Bourne or XSI compatible, -# or has some other useful features. -m4_defun([_LT_CHECK_SHELL_FEATURES], -[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,b/c, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -AC_MSG_RESULT([$xsi_shell]) -_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) - -AC_MSG_CHECKING([whether the shell understands "+="]) -lt_shell_append=no -( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -AC_MSG_RESULT([$lt_shell_append]) -_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi -_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac -_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl -_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl -])# _LT_CHECK_SHELL_FEATURES - - -# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) -# ------------------------------------------------------ -# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and -# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. -m4_defun([_LT_PROG_FUNCTION_REPLACE], -[dnl { -sed -e '/^$1 ()$/,/^} # $1 /c\ -$1 ()\ -{\ -m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) -} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: -]) - - -# _LT_PROG_REPLACE_SHELLFNS -# ------------------------- -# Replace existing portable implementations of several shell functions with -# equivalent extended shell implementations where those features are available.. -m4_defun([_LT_PROG_REPLACE_SHELLFNS], -[if test x"$xsi_shell" = xyes; then - _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac]) - - _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl - func_basename_result="${1##*/}"]) - - _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac - func_basename_result="${1##*/}"]) - - _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl - # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are - # positional parameters, so assign one to ordinary parameter first. - func_stripname_result=${3} - func_stripname_result=${func_stripname_result#"${1}"} - func_stripname_result=${func_stripname_result%"${2}"}]) - - _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl - func_split_long_opt_name=${1%%=*} - func_split_long_opt_arg=${1#*=}]) - - _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl - func_split_short_opt_arg=${1#??} - func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) - - _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl - case ${1} in - *.lo) func_lo2o_result=${1%.lo}.${objext} ;; - *) func_lo2o_result=${1} ;; - esac]) - - _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) - - _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) - - _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) -fi - -if test x"$lt_shell_append" = xyes; then - _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) - - _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl - func_quote_for_eval "${2}" -dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ - eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) - - # Save a `func_append' function call where possible by direct use of '+=' - sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -else - # Save a `func_append' function call even when '+=' is not available - sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -fi - -if test x"$_lt_function_replace_fail" = x":"; then - AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) -fi -]) - -# _LT_PATH_CONVERSION_FUNCTIONS -# ----------------------------- -# Determine which file name conversion functions should be used by -# func_to_host_file (and, implicitly, by func_to_host_path). These are needed -# for certain cross-compile configurations and native mingw. -m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -AC_MSG_CHECKING([how to convert $build file names to $host format]) -AC_CACHE_VAL(lt_cv_to_host_file_cmd, -[case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 - ;; - esac - ;; - *-*-cygwin* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin - ;; - esac - ;; - * ) # unhandled hosts (and "normal" native builds) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; -esac -]) -to_host_file_cmd=$lt_cv_to_host_file_cmd -AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) -_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], - [0], [convert $build file names to $host format])dnl - -AC_MSG_CHECKING([how to convert $build file names to toolchain format]) -AC_CACHE_VAL(lt_cv_to_tool_file_cmd, -[#assume ordinary cross tools, or native build. -lt_cv_to_tool_file_cmd=func_convert_file_noop -case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 - ;; - esac - ;; -esac -]) -to_tool_file_cmd=$lt_cv_to_tool_file_cmd -AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) -_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], - [0], [convert $build files to toolchain format])dnl -])# _LT_PATH_CONVERSION_FUNCTIONS diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4 deleted file mode 100644 index 5d9acd8..0000000 --- a/m4/ltoptions.m4 +++ /dev/null @@ -1,384 +0,0 @@ -# Helper functions for option handling. -*- Autoconf -*- -# -# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# Written by Gary V. Vaughan, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 7 ltoptions.m4 - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) - - -# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) -# ------------------------------------------ -m4_define([_LT_MANGLE_OPTION], -[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) - - -# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) -# --------------------------------------- -# Set option OPTION-NAME for macro MACRO-NAME, and if there is a -# matching handler defined, dispatch to it. Other OPTION-NAMEs are -# saved as a flag. -m4_define([_LT_SET_OPTION], -[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl -m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), - _LT_MANGLE_DEFUN([$1], [$2]), - [m4_warning([Unknown $1 option `$2'])])[]dnl -]) - - -# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) -# ------------------------------------------------------------ -# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. -m4_define([_LT_IF_OPTION], -[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) - - -# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) -# ------------------------------------------------------- -# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME -# are set. -m4_define([_LT_UNLESS_OPTIONS], -[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), - [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), - [m4_define([$0_found])])])[]dnl -m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 -])[]dnl -]) - - -# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) -# ---------------------------------------- -# OPTION-LIST is a space-separated list of Libtool options associated -# with MACRO-NAME. If any OPTION has a matching handler declared with -# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about -# the unknown option and exit. -m4_defun([_LT_SET_OPTIONS], -[# Set options -m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), - [_LT_SET_OPTION([$1], _LT_Option)]) - -m4_if([$1],[LT_INIT],[ - dnl - dnl Simply set some default values (i.e off) if boolean options were not - dnl specified: - _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no - ]) - _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no - ]) - dnl - dnl If no reference was made to various pairs of opposing options, then - dnl we run the default mode handler for the pair. For example, if neither - dnl `shared' nor `disable-shared' was passed, we enable building of shared - dnl archives by default: - _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) - _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) - _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) - _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], - [_LT_ENABLE_FAST_INSTALL]) - ]) -])# _LT_SET_OPTIONS - - -## --------------------------------- ## -## Macros to handle LT_INIT options. ## -## --------------------------------- ## - -# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) -# ----------------------------------------- -m4_define([_LT_MANGLE_DEFUN], -[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) - - -# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) -# ----------------------------------------------- -m4_define([LT_OPTION_DEFINE], -[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl -])# LT_OPTION_DEFINE - - -# dlopen -# ------ -LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes -]) - -AU_DEFUN([AC_LIBTOOL_DLOPEN], -[_LT_SET_OPTION([LT_INIT], [dlopen]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `dlopen' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) - - -# win32-dll -# --------- -# Declare package support for building win32 dll's. -LT_OPTION_DEFINE([LT_INIT], [win32-dll], -[enable_win32_dll=yes - -case $host in -*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) - AC_CHECK_TOOL(AS, as, false) - AC_CHECK_TOOL(DLLTOOL, dlltool, false) - AC_CHECK_TOOL(OBJDUMP, objdump, false) - ;; -esac - -test -z "$AS" && AS=as -_LT_DECL([], [AS], [1], [Assembler program])dnl - -test -z "$DLLTOOL" && DLLTOOL=dlltool -_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl - -test -z "$OBJDUMP" && OBJDUMP=objdump -_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl -])# win32-dll - -AU_DEFUN([AC_LIBTOOL_WIN32_DLL], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -_LT_SET_OPTION([LT_INIT], [win32-dll]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `win32-dll' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) - - -# _LT_ENABLE_SHARED([DEFAULT]) -# ---------------------------- -# implement the --enable-shared flag, and supports the `shared' and -# `disable-shared' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_SHARED], -[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([shared], - [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], - [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) - - _LT_DECL([build_libtool_libs], [enable_shared], [0], - [Whether or not to build shared libraries]) -])# _LT_ENABLE_SHARED - -LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) - -# Old names: -AC_DEFUN([AC_ENABLE_SHARED], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) -]) - -AC_DEFUN([AC_DISABLE_SHARED], -[_LT_SET_OPTION([LT_INIT], [disable-shared]) -]) - -AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) -AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_ENABLE_SHARED], []) -dnl AC_DEFUN([AM_DISABLE_SHARED], []) - - - -# _LT_ENABLE_STATIC([DEFAULT]) -# ---------------------------- -# implement the --enable-static flag, and support the `static' and -# `disable-static' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_STATIC], -[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([static], - [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], - [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_static=]_LT_ENABLE_STATIC_DEFAULT) - - _LT_DECL([build_old_libs], [enable_static], [0], - [Whether or not to build static libraries]) -])# _LT_ENABLE_STATIC - -LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) - -# Old names: -AC_DEFUN([AC_ENABLE_STATIC], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) -]) - -AC_DEFUN([AC_DISABLE_STATIC], -[_LT_SET_OPTION([LT_INIT], [disable-static]) -]) - -AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) -AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_ENABLE_STATIC], []) -dnl AC_DEFUN([AM_DISABLE_STATIC], []) - - - -# _LT_ENABLE_FAST_INSTALL([DEFAULT]) -# ---------------------------------- -# implement the --enable-fast-install flag, and support the `fast-install' -# and `disable-fast-install' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_FAST_INSTALL], -[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([fast-install], - [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], - [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) - -_LT_DECL([fast_install], [enable_fast_install], [0], - [Whether or not to optimize for fast installation])dnl -])# _LT_ENABLE_FAST_INSTALL - -LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) - -# Old names: -AU_DEFUN([AC_ENABLE_FAST_INSTALL], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `fast-install' option into LT_INIT's first parameter.]) -]) - -AU_DEFUN([AC_DISABLE_FAST_INSTALL], -[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `disable-fast-install' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) -dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) - - -# _LT_WITH_PIC([MODE]) -# -------------------- -# implement the --with-pic flag, and support the `pic-only' and `no-pic' -# LT_INIT options. -# MODE is either `yes' or `no'. If omitted, it defaults to `both'. -m4_define([_LT_WITH_PIC], -[AC_ARG_WITH([pic], - [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], - [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], - [lt_p=${PACKAGE-default} - case $withval in - yes|no) pic_mode=$withval ;; - *) - pic_mode=default - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for lt_pkg in $withval; do - IFS="$lt_save_ifs" - if test "X$lt_pkg" = "X$lt_p"; then - pic_mode=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [pic_mode=default]) - -test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) - -_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl -])# _LT_WITH_PIC - -LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) -LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) - -# Old name: -AU_DEFUN([AC_LIBTOOL_PICMODE], -[_LT_SET_OPTION([LT_INIT], [pic-only]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `pic-only' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) - -## ----------------- ## -## LTDL_INIT Options ## -## ----------------- ## - -m4_define([_LTDL_MODE], []) -LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], - [m4_define([_LTDL_MODE], [nonrecursive])]) -LT_OPTION_DEFINE([LTDL_INIT], [recursive], - [m4_define([_LTDL_MODE], [recursive])]) -LT_OPTION_DEFINE([LTDL_INIT], [subproject], - [m4_define([_LTDL_MODE], [subproject])]) - -m4_define([_LTDL_TYPE], []) -LT_OPTION_DEFINE([LTDL_INIT], [installable], - [m4_define([_LTDL_TYPE], [installable])]) -LT_OPTION_DEFINE([LTDL_INIT], [convenience], - [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/m4/ltsugar.m4 b/m4/ltsugar.m4 deleted file mode 100644 index 9000a05..0000000 --- a/m4/ltsugar.m4 +++ /dev/null @@ -1,123 +0,0 @@ -# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- -# -# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. -# Written by Gary V. Vaughan, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 6 ltsugar.m4 - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) - - -# lt_join(SEP, ARG1, [ARG2...]) -# ----------------------------- -# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their -# associated separator. -# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier -# versions in m4sugar had bugs. -m4_define([lt_join], -[m4_if([$#], [1], [], - [$#], [2], [[$2]], - [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) -m4_define([_lt_join], -[m4_if([$#$2], [2], [], - [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) - - -# lt_car(LIST) -# lt_cdr(LIST) -# ------------ -# Manipulate m4 lists. -# These macros are necessary as long as will still need to support -# Autoconf-2.59 which quotes differently. -m4_define([lt_car], [[$1]]) -m4_define([lt_cdr], -[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], - [$#], 1, [], - [m4_dquote(m4_shift($@))])]) -m4_define([lt_unquote], $1) - - -# lt_append(MACRO-NAME, STRING, [SEPARATOR]) -# ------------------------------------------ -# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. -# Note that neither SEPARATOR nor STRING are expanded; they are appended -# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). -# No SEPARATOR is output if MACRO-NAME was previously undefined (different -# than defined and empty). -# -# This macro is needed until we can rely on Autoconf 2.62, since earlier -# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. -m4_define([lt_append], -[m4_define([$1], - m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) - - - -# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) -# ---------------------------------------------------------- -# Produce a SEP delimited list of all paired combinations of elements of -# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list -# has the form PREFIXmINFIXSUFFIXn. -# Needed until we can rely on m4_combine added in Autoconf 2.62. -m4_define([lt_combine], -[m4_if(m4_eval([$# > 3]), [1], - [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl -[[m4_foreach([_Lt_prefix], [$2], - [m4_foreach([_Lt_suffix], - ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, - [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) - - -# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) -# ----------------------------------------------------------------------- -# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited -# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. -m4_define([lt_if_append_uniq], -[m4_ifdef([$1], - [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], - [lt_append([$1], [$2], [$3])$4], - [$5])], - [lt_append([$1], [$2], [$3])$4])]) - - -# lt_dict_add(DICT, KEY, VALUE) -# ----------------------------- -m4_define([lt_dict_add], -[m4_define([$1($2)], [$3])]) - - -# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) -# -------------------------------------------- -m4_define([lt_dict_add_subkey], -[m4_define([$1($2:$3)], [$4])]) - - -# lt_dict_fetch(DICT, KEY, [SUBKEY]) -# ---------------------------------- -m4_define([lt_dict_fetch], -[m4_ifval([$3], - m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), - m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) - - -# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) -# ----------------------------------------------------------------- -m4_define([lt_if_dict_fetch], -[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], - [$5], - [$6])]) - - -# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) -# -------------------------------------------------------------- -m4_define([lt_dict_filter], -[m4_if([$5], [], [], - [lt_join(m4_quote(m4_default([$4], [[, ]])), - lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), - [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl -]) diff --git a/m4/ltversion.m4 b/m4/ltversion.m4 deleted file mode 100644 index 07a8602..0000000 --- a/m4/ltversion.m4 +++ /dev/null @@ -1,23 +0,0 @@ -# ltversion.m4 -- version numbers -*- Autoconf -*- -# -# Copyright (C) 2004 Free Software Foundation, Inc. -# Written by Scott James Remnant, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# @configure_input@ - -# serial 3337 ltversion.m4 -# This file is part of GNU Libtool - -m4_define([LT_PACKAGE_VERSION], [2.4.2]) -m4_define([LT_PACKAGE_REVISION], [1.3337]) - -AC_DEFUN([LTVERSION_VERSION], -[macro_version='2.4.2' -macro_revision='1.3337' -_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) -_LT_DECL(, macro_revision, 0) -]) diff --git a/m4/lt~obsolete.m4 b/m4/lt~obsolete.m4 deleted file mode 100644 index c573da9..0000000 --- a/m4/lt~obsolete.m4 +++ /dev/null @@ -1,98 +0,0 @@ -# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- -# -# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. -# Written by Scott James Remnant, 2004. -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 5 lt~obsolete.m4 - -# These exist entirely to fool aclocal when bootstrapping libtool. -# -# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) -# which have later been changed to m4_define as they aren't part of the -# exported API, or moved to Autoconf or Automake where they belong. -# -# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN -# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us -# using a macro with the same name in our local m4/libtool.m4 it'll -# pull the old libtool.m4 in (it doesn't see our shiny new m4_define -# and doesn't know about Autoconf macros at all.) -# -# So we provide this file, which has a silly filename so it's always -# included after everything else. This provides aclocal with the -# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything -# because those macros already exist, or will be overwritten later. -# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. -# -# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. -# Yes, that means every name once taken will need to remain here until -# we give up compatibility with versions before 1.7, at which point -# we need to keep only those names which we still refer to. - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) - -m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) -m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) -m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) -m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) -m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) -m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) -m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) -m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) -m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) -m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) -m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) -m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) -m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) -m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) -m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) -m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) -m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) -m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) -m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) -m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) -m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) -m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) -m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) -m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) -m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) -m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) -m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) -m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) -m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) -m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) -m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) -m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) -m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) -m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) -m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) -m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) -m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) -m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) -m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) -m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) -m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) -m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) -m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) -m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) -m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) -m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) -m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) -m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) -m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) -m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) -m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) -m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) -m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) -m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) -m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) -m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) -m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff --git a/m4/pkg.m4 b/m4/pkg.m4 deleted file mode 100644 index 0048a3f..0000000 --- a/m4/pkg.m4 +++ /dev/null @@ -1,157 +0,0 @@ -# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -# -# Copyright © 2004 Scott James Remnant . -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# PKG_PROG_PKG_CONFIG([MIN-VERSION]) -# ---------------------------------- -AC_DEFUN([PKG_PROG_PKG_CONFIG], -[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) -m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) -AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl -if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then - AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) -fi -if test -n "$PKG_CONFIG"; then - _pkg_min_version=m4_default([$1], [0.9.0]) - AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) - if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - PKG_CONFIG="" - fi - -fi[]dnl -])# PKG_PROG_PKG_CONFIG - -# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -# -# Check to see whether a particular set of modules exists. Similar -# to PKG_CHECK_MODULES(), but does not set variables or print errors. -# -# -# Similar to PKG_CHECK_MODULES, make sure that the first instance of -# this or PKG_CHECK_MODULES is called, or make sure to call -# PKG_CHECK_EXISTS manually -# -------------------------------------------------------------- -AC_DEFUN([PKG_CHECK_EXISTS], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -if test -n "$PKG_CONFIG" && \ - AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then - m4_ifval([$2], [$2], [:]) -m4_ifvaln([$3], [else - $3])dnl -fi]) - - -# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) -# --------------------------------------------- -m4_define([_PKG_CONFIG], -[if test -n "$PKG_CONFIG"; then - if test -n "$$1"; then - pkg_cv_[]$1="$$1" - else - PKG_CHECK_EXISTS([$3], - [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], - [pkg_failed=yes]) - fi -else - pkg_failed=untried -fi[]dnl -])# _PKG_CONFIG - -# _PKG_SHORT_ERRORS_SUPPORTED -# ----------------------------- -AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) -if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then - _pkg_short_errors_supported=yes -else - _pkg_short_errors_supported=no -fi[]dnl -])# _PKG_SHORT_ERRORS_SUPPORTED - - -# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], -# [ACTION-IF-NOT-FOUND]) -# -# -# Note that if there is a possibility the first call to -# PKG_CHECK_MODULES might not happen, you should be sure to include an -# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac -# -# -# -------------------------------------------------------------- -AC_DEFUN([PKG_CHECK_MODULES], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl -AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl - -pkg_failed=no -AC_MSG_CHECKING([for $1]) - -_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) -_PKG_CONFIG([$1][_LIBS], [libs], [$2]) - -m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS -and $1[]_LIBS to avoid the need to call pkg-config. -See the pkg-config man page for more details.]) - -if test $pkg_failed = yes; then - _PKG_SHORT_ERRORS_SUPPORTED - if test $_pkg_short_errors_supported = yes; then - $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` - else - $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` - fi - # Put the nasty error message in config.log where it belongs - echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD - - ifelse([$4], , [AC_MSG_ERROR(dnl -[Package requirements ($2) were not met: - -$$1_PKG_ERRORS - -Consider adjusting the PKG_CONFIG_PATH environment variable if you -installed software in a non-standard prefix. - -_PKG_TEXT -])], - [AC_MSG_RESULT([no]) - $4]) -elif test $pkg_failed = untried; then - ifelse([$4], , [AC_MSG_FAILURE(dnl -[The pkg-config script could not be found or is too old. Make sure it -is in your PATH or set the PKG_CONFIG environment variable to the full -path to pkg-config. - -_PKG_TEXT - -To get pkg-config, see .])], - [$4]) -else - $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS - $1[]_LIBS=$pkg_cv_[]$1[]_LIBS - AC_MSG_RESULT([yes]) - ifelse([$3], , :, [$3]) -fi[]dnl -])# PKG_CHECK_MODULES diff --git a/missing b/missing deleted file mode 100755 index cdea514..0000000 --- a/missing +++ /dev/null @@ -1,215 +0,0 @@ -#! /bin/sh -# Common wrapper for a few potentially missing GNU programs. - -scriptversion=2012-06-26.16; # UTC - -# Copyright (C) 1996-2013 Free Software Foundation, Inc. -# Originally written by Fran,cois Pinard , 1996. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -if test $# -eq 0; then - echo 1>&2 "Try '$0 --help' for more information" - exit 1 -fi - -case $1 in - - --is-lightweight) - # Used by our autoconf macros to check whether the available missing - # script is modern enough. - exit 0 - ;; - - --run) - # Back-compat with the calling convention used by older automake. - shift - ;; - - -h|--h|--he|--hel|--help) - echo "\ -$0 [OPTION]... PROGRAM [ARGUMENT]... - -Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due -to PROGRAM being missing or too old. - -Options: - -h, --help display this help and exit - -v, --version output version information and exit - -Supported PROGRAM values: - aclocal autoconf autoheader autom4te automake makeinfo - bison yacc flex lex help2man - -Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and -'g' are ignored when checking the name. - -Send bug reports to ." - exit $? - ;; - - -v|--v|--ve|--ver|--vers|--versi|--versio|--version) - echo "missing $scriptversion (GNU Automake)" - exit $? - ;; - - -*) - echo 1>&2 "$0: unknown '$1' option" - echo 1>&2 "Try '$0 --help' for more information" - exit 1 - ;; - -esac - -# Run the given program, remember its exit status. -"$@"; st=$? - -# If it succeeded, we are done. -test $st -eq 0 && exit 0 - -# Also exit now if we it failed (or wasn't found), and '--version' was -# passed; such an option is passed most likely to detect whether the -# program is present and works. -case $2 in --version|--help) exit $st;; esac - -# Exit code 63 means version mismatch. This often happens when the user -# tries to use an ancient version of a tool on a file that requires a -# minimum version. -if test $st -eq 63; then - msg="probably too old" -elif test $st -eq 127; then - # Program was missing. - msg="missing on your system" -else - # Program was found and executed, but failed. Give up. - exit $st -fi - -perl_URL=http://www.perl.org/ -flex_URL=http://flex.sourceforge.net/ -gnu_software_URL=http://www.gnu.org/software - -program_details () -{ - case $1 in - aclocal|automake) - echo "The '$1' program is part of the GNU Automake package:" - echo "<$gnu_software_URL/automake>" - echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" - echo "<$gnu_software_URL/autoconf>" - echo "<$gnu_software_URL/m4/>" - echo "<$perl_URL>" - ;; - autoconf|autom4te|autoheader) - echo "The '$1' program is part of the GNU Autoconf package:" - echo "<$gnu_software_URL/autoconf/>" - echo "It also requires GNU m4 and Perl in order to run:" - echo "<$gnu_software_URL/m4/>" - echo "<$perl_URL>" - ;; - esac -} - -give_advice () -{ - # Normalize program name to check for. - normalized_program=`echo "$1" | sed ' - s/^gnu-//; t - s/^gnu//; t - s/^g//; t'` - - printf '%s\n' "'$1' is $msg." - - configure_deps="'configure.ac' or m4 files included by 'configure.ac'" - case $normalized_program in - autoconf*) - echo "You should only need it if you modified 'configure.ac'," - echo "or m4 files included by it." - program_details 'autoconf' - ;; - autoheader*) - echo "You should only need it if you modified 'acconfig.h' or" - echo "$configure_deps." - program_details 'autoheader' - ;; - automake*) - echo "You should only need it if you modified 'Makefile.am' or" - echo "$configure_deps." - program_details 'automake' - ;; - aclocal*) - echo "You should only need it if you modified 'acinclude.m4' or" - echo "$configure_deps." - program_details 'aclocal' - ;; - autom4te*) - echo "You might have modified some maintainer files that require" - echo "the 'automa4te' program to be rebuilt." - program_details 'autom4te' - ;; - bison*|yacc*) - echo "You should only need it if you modified a '.y' file." - echo "You may want to install the GNU Bison package:" - echo "<$gnu_software_URL/bison/>" - ;; - lex*|flex*) - echo "You should only need it if you modified a '.l' file." - echo "You may want to install the Fast Lexical Analyzer package:" - echo "<$flex_URL>" - ;; - help2man*) - echo "You should only need it if you modified a dependency" \ - "of a man page." - echo "You may want to install the GNU Help2man package:" - echo "<$gnu_software_URL/help2man/>" - ;; - makeinfo*) - echo "You should only need it if you modified a '.texi' file, or" - echo "any other file indirectly affecting the aspect of the manual." - echo "You might want to install the Texinfo package:" - echo "<$gnu_software_URL/texinfo/>" - echo "The spurious makeinfo call might also be the consequence of" - echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" - echo "want to install GNU make:" - echo "<$gnu_software_URL/make/>" - ;; - *) - echo "You might have modified some files without having the proper" - echo "tools for further handling them. Check the 'README' file, it" - echo "often tells you about the needed prerequisites for installing" - echo "this package. You may also peek at any GNU archive site, in" - echo "case some other package contains this missing '$1' program." - ;; - esac -} - -give_advice "$1" | sed -e '1s/^/WARNING: /' \ - -e '2,$s/^/ /' >&2 - -# Propagate the correct exit status (expected to be 127 for a program -# not found, 63 for a program that failed due to version mismatch). -exit $st - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/model/CMakeLists.txt b/model/CMakeLists.txt new file mode 100644 index 0000000..0793d2c --- /dev/null +++ b/model/CMakeLists.txt @@ -0,0 +1,3 @@ +install(DIRECTORY + en-us + DESTINATION ${CMAKE_INSTALL_DATADIR}/pocketsphinx/model) diff --git a/model/Makefile.am b/model/Makefile.am deleted file mode 100644 index f1e929d..0000000 --- a/model/Makefile.am +++ /dev/null @@ -1,16 +0,0 @@ -enusdir = $(datadir)/@PACKAGE@/model/en-us/en-us -dist_enus_DATA = \ - en-us/en-us/feat.params \ - en-us/en-us/variances \ - en-us/en-us/transition_matrices \ - en-us/en-us/README \ - en-us/en-us/noisedict \ - en-us/en-us/sendump \ - en-us/en-us/mdef \ - en-us/en-us/means - -enuslmdir = $(datadir)/@PACKAGE@/model/en-us -dist_enuslm_DATA = \ - en-us/cmudict-en-us.dict \ - en-us/en-us-phone.lm.bin \ - en-us/en-us.lm.bin diff --git a/model/Makefile.in b/model/Makefile.in deleted file mode 100644 index 38783a9..0000000 --- a/model/Makefile.in +++ /dev/null @@ -1,547 +0,0 @@ -# Makefile.in generated by automake 1.13.4 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2013 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = model -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(dist_enus_DATA) $(dist_enuslm_DATA) -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ - $(top_srcdir)/m4/ax_python_devel.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -SOURCES = -DIST_SOURCES = -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(enusdir)" "$(DESTDIR)$(enuslmdir)" -DATA = $(dist_enus_DATA) $(dist_enuslm_DATA) -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GST_CFLAGS = @GST_CFLAGS@ -GST_LIBS = @GST_LIBS@ -GST_MAJORMINOR = @GST_MAJORMINOR@ -GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ -GStreamer_CFLAGS = @GStreamer_CFLAGS@ -GStreamer_LIBS = @GStreamer_LIBS@ -HAVE_DOXYGEN = @HAVE_DOXYGEN@ -HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PKG_CONFIG = @PKG_CONFIG@ -PYTHON = @PYTHON@ -PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ -PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ -PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ -PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ -PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ -PYTHON_PLATFORM = @PYTHON_PLATFORM@ -PYTHON_PREFIX = @PYTHON_PREFIX@ -PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ -PYTHON_VERSION = @PYTHON_VERSION@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ -SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ -SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ -STRIP = @STRIP@ -SWIG = @SWIG@ -SWIG_LIB = @SWIG_LIB@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -pkgpyexecdir = @pkgpyexecdir@ -pkgpythondir = @pkgpythondir@ -plugindir = @plugindir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -pyexecdir = @pyexecdir@ -pythondir = @pythondir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -enusdir = $(datadir)/@PACKAGE@/model/en-us/en-us -dist_enus_DATA = \ - en-us/en-us/feat.params \ - en-us/en-us/variances \ - en-us/en-us/transition_matrices \ - en-us/en-us/README \ - en-us/en-us/noisedict \ - en-us/en-us/sendump \ - en-us/en-us/mdef \ - en-us/en-us/means - -enuslmdir = $(datadir)/@PACKAGE@/model/en-us -dist_enuslm_DATA = \ - en-us/cmudict-en-us.dict \ - en-us/en-us-phone.lm.bin \ - en-us/en-us.lm.bin - -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign model/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign model/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-dist_enusDATA: $(dist_enus_DATA) - @$(NORMAL_INSTALL) - @list='$(dist_enus_DATA)'; test -n "$(enusdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(enusdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(enusdir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(enusdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(enusdir)" || exit $$?; \ - done - -uninstall-dist_enusDATA: - @$(NORMAL_UNINSTALL) - @list='$(dist_enus_DATA)'; test -n "$(enusdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(enusdir)'; $(am__uninstall_files_from_dir) -install-dist_enuslmDATA: $(dist_enuslm_DATA) - @$(NORMAL_INSTALL) - @list='$(dist_enuslm_DATA)'; test -n "$(enuslmdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(enuslmdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(enuslmdir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(enuslmdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(enuslmdir)" || exit $$?; \ - done - -uninstall-dist_enuslmDATA: - @$(NORMAL_UNINSTALL) - @list='$(dist_enuslm_DATA)'; test -n "$(enuslmdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(enuslmdir)'; $(am__uninstall_files_from_dir) -tags TAGS: - -ctags CTAGS: - -cscope cscopelist: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(DATA) -installdirs: - for dir in "$(DESTDIR)$(enusdir)" "$(DESTDIR)$(enuslmdir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: install-dist_enusDATA install-dist_enuslmDATA - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-dist_enusDATA uninstall-dist_enuslmDATA - -.MAKE: install-am install-strip - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - cscopelist-am ctags-am distclean distclean-generic \ - distclean-libtool distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am \ - install-dist_enusDATA install-dist_enuslmDATA install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags-am uninstall uninstall-am uninstall-dist_enusDATA \ - uninstall-dist_enuslmDATA - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/model/en-us/cmudict-en-us.dict b/model/en-us/cmudict-en-us.dict index 1de960d..ba02d63 100644 --- a/model/en-us/cmudict-en-us.dict +++ b/model/en-us/cmudict-en-us.dict @@ -14,8 +14,8 @@ 'tis T IH Z 'twas T W AH Z a AH -a's EY Z a(2) EY +a's EY Z a. EY a.'s EY Z a.d. EY D IY @@ -39,9 +39,9 @@ aaron EH R AH N aaron's EH R AH N Z aarons EH R AH N Z aaronson EH R AH N S AH N +aaronson(2) AA R AH N S AH N aaronson's EH R AH N S AH N Z aaronson's(2) AA R AH N S AH N Z -aaronson(2) AA R AH N S AH N aarti AA R T IY aase AA S aasen AA S AH N @@ -894,8 +894,8 @@ activism AE K T IH V IH Z AH M activist AE K T AH V AH S T activist(2) AE K T IH V IH S T activists AE K T AH V AH S T S -activists' AE K T IH V IH S T S activists(2) AE K T IH V IH S T S +activists' AE K T IH V IH S T S activities AE K T IH V AH T IY Z activities(2) AE K T IH V IH T IY Z activity AE K T IH V AH T IY @@ -1044,8 +1044,8 @@ addis AA D IH S addis-ababa AA D IH S AH B AA B AA addis-ababa(2) AA D IY S AH B AA B AA addison AE D AH S AH N -addison's AE D IH S AH N Z addison(2) AE D IH S AH N +addison's AE D IH S AH N Z addition AH D IH SH AH N additional AH D IH SH AH N AH L additional(2) AH D IH SH N AH L @@ -1349,9 +1349,9 @@ adulterous AH D AH L T ER AH S adultery AH D AH L T ER IY adulthood AH D AH L T HH UH D adults AH D AH L T S +adults(2) AE D AH L T S adults' AH D AH L T S adults'(2) AE D AH L T S -adults(2) AE D AH L T S adusdur AE D AH S D ER advacare AE D V AH K EH R advalue AE D V AH L UW @@ -1368,9 +1368,9 @@ advances(2) AH D V AE N S IH Z advancing AH D V AE N S IH NG advani AE D V AA N IY advanta AE D V AE N T AH +advanta(2) AH D V AE N T AH advanta's AE D V AE N T AH Z advanta's(2) AH D V AE N T AH Z -advanta(2) AH D V AE N T AH advantage AE D V AE N T IH JH advantaged AE D V AE N T IH JH D advantageous AE D V AH N T EY JH AH S @@ -1444,8 +1444,8 @@ advisory AE D V AY Z ER IY advo AE D V OW advocacy AE D V AH K AH S IY advocate AE D V AH K AH T -advocate's AE D V AH K AH T S advocate(2) AE D V AH K EY T +advocate's AE D V AH K AH T S advocated AE D V AH K EY T IH D advocates AE D V AH K AH T S advocates(2) AE D V AH K EY T S @@ -1565,13 +1565,13 @@ affiant AE F IY AH N T affidavit AE F AH D EY V AH T affidavits AE F IH D EY V IH T S affiliate AH F IH L IY EY T -affiliate's AH F IH L IY EY T S affiliate(2) AH F IH L IY AH T +affiliate's AH F IH L IY EY T S affiliated AH F IH L IY EY T IH D affiliated's AH F IH L IY EY T IH D Z affiliates AH F IH L IY AH T S -affiliates' AH F IH L IY IH T S affiliates(2) AH F IH L IY EY T S +affiliates' AH F IH L IY IH T S affiliating AH F IH L IY EY T IH NG affiliation AH F IH L IY EY SH AH N affiliations AH F IH L IY EY SH AH N Z @@ -1651,10 +1651,10 @@ afoul AH F AW L afraid AH F R EY D afresh AH F R EH SH africa AE F R AH K AA -africa's AE F R AH K AH Z -africa's(2) AE F R IH K AH Z africa(2) AE F R IH K AH africa(3) AE F ER K AH +africa's AE F R AH K AH Z +africa's(2) AE F R IH K AH Z african AE F R AH K AH N african(2) AE F R IH K AH N african-american AE F R AH K AH N AH M EH R AH K AH N @@ -1717,8 +1717,8 @@ afterwards AE F T ER W ER D Z afula AH F UW L AH afula's AH F UW L AH Z ag AE G -ag's AE G Z ag(2) EY G IY +ag's AE G Z aga AA G AH agache AE G AE CH agache's AE G AE CH AH Z @@ -1944,9 +1944,9 @@ aguinaga AA G UW IY N AA G AH aguirra AH G W IH R AH aguirra's AH G W IH R AH Z aguirre AA G W IH R EY +aguirre(2) AH G W IH R EY aguirre's AA G W IH R EY Z aguirre's(2) AH G W IH R EY Z -aguirre(2) AH G W IH R EY agustin AH G AO S T IH N ah AA aha AA HH AA @@ -2604,9 +2604,9 @@ alex AE L AH K S alex's AE L AH K S IH Z alexa AH L EH K S AH alexander AE L AH G Z AE N D ER +alexander(2) AE L IH G Z AE N D ER alexander's AE L AH G Z AE N D ER Z alexander's(2) AE L IH G Z AE N D ER Z -alexander(2) AE L IH G Z AE N D ER alexanders AE L IH G Z AE N D ER Z alexandra AE L EH G Z AE N D R AH alexandra(2) AE L IH G Z AE N D R AH @@ -2702,8 +2702,8 @@ alibi AE L AH B AY alibis AE L AH B AY Z alibrandi AE L IH B R AE N D IY alice AE L AH S -alice's AE L AH S AH Z alice(2) AE L IH S +alice's AE L AH S AH Z alicea AH L IH S IY AH alices AE L AH S AH Z alicia AH L IH SH AH @@ -2754,9 +2754,9 @@ alistair AE L IH S T EH R alister AE L IH S T ER alita AA L IY T AH alitalia AE L IH T EY L IY AH +alitalia(2) AE L IH T AE L IY AH alitalia's AE L IH T EY L IY AH Z alitalia's(2) AE L IH T AE L IY AH Z -alitalia(2) AE L IH T AE L IY AH alithia AH L IH TH IY AH alito AH L IY T OW alive AH L AY V @@ -2827,9 +2827,9 @@ alleghany AE L AH G EY N IY alleghenies AE L AH G EY N IY Z alleghenies(2) AE L AH G EH N IY Z allegheny AE L AH G EY N IY +allegheny(2) AE L AH G EH N IY allegheny's AE L AH G EY N IY Z allegheny's(2) AE L AH G EH N IY Z -allegheny(2) AE L AH G EH N IY allegiance AH L IY JH AH N S allegiances AE L IY JH IY AE N S IH Z allegiances(2) AH L IY JH AH N S IH Z @@ -2914,13 +2914,13 @@ allianz's AE L IY AH N Z IH Z allick AE L IH K allie AE L IY allied AH L AY D -allied's AE L AY D Z allied(2) AE L AY D +allied's AE L AY D Z alliedsignal AE L AY D S IH G N AH L alliedsignal's AE L AY D S IH G N AH L Z allies AE L AY Z -allies' AE L AY Z allies(2) AH L AY Z +allies' AE L AY Z alligator AE L AH G EY T ER alligators AE L AH G EY T ER Z alligood AE L IH G UH D @@ -2933,8 +2933,8 @@ allington AO L IH NG T AH N allinson AE L IH N S AH N allis AE L IH S allison AE L AH S AH N -allison's AE L IH S AH N Z allison(2) AE L IH S AH N +allison's AE L IH S AH N Z allister AO L IH S T ER allister(2) AE L IH S T ER alliston AE L IH S T AA N @@ -3023,8 +3023,8 @@ allwaste AO L W EY S T allweiss AA L W IY S allweiss's AA L W IY S IH Z ally AE L AY -ally's AH L AY Z ally(2) AH L AY +ally's AH L AY Z allying AE L AY IH NG allying(2) AH L AY IH NG allyn AE L IH N @@ -3348,14 +3348,14 @@ alzado(2) AA L Z AA D OW alzena AA L Z EH N AH alzene AA L Z IY N alzheimer AE L Z HH AY M ER +alzheimer(2) AA L T S HH AY M ER alzheimer's AE L Z HH AY M ER Z alzheimer's(2) AA T S Z HH AY M ER Z -alzheimer(2) AA L T S HH AY M ER alzona AE L Z OW N AH am AE M +am(2) EY EH M am's AE M Z am's(2) EY EH M Z -am(2) EY EH M ama EY EH M EY amabel AE M AH B EH L amabelle AE M AH B AH L @@ -3575,12 +3575,12 @@ amerford EY M ER F ER D ameri AH M EH R IY ameribanc AH M EH R IH B AE NG K america AH M EH R AH K AH +america(2) AH M EH R IH K AH america's AH M EH R AH K AH Z america's(2) AH M EH R IH K AH Z -america(2) AH M EH R IH K AH american AH M EH R AH K AH N -american's AH M EH R IH K AH N Z american(2) AH M EH R IH K AH N +american's AH M EH R IH K AH N Z americana AH M EH R AH K AE N AH americana's AH M EH R AH K AE N AH Z americanas AH M EH R AH K AE N AH Z @@ -3591,14 +3591,14 @@ americanized AH M EH R IH K AH N AY Z D americano AH M EH R IH K AA N OW americanos AH M EH R IH K AA N OW Z americans AH M EH R AH K AH N Z -americans' AH M EH R IH K AH N Z americans(2) AH M EH R IH K AH N Z +americans' AH M EH R IH K AH N Z americar AH M EH R IH K AA R americare AH M EH R IH K EH R americares AH M EH R IH K EH R Z americas AH M EH R AH K AH Z -americas' AH M EH R IH K AH Z americas(2) AH M EH R IH K AH Z +americas' AH M EH R IH K AH Z americium AH M EH R IH S IY AH M americo AH M ER AH K OW americold AH M EH R IH K OW L D @@ -3678,9 +3678,9 @@ aminta AH M IH N T AH amiot EY M IY AH T amiprilose AH M IH P R AH L OW S amir AH M IH R +amir(2) AA M IH R amir's AH M IH R Z amir's(2) AA M IH R Z -amir(2) AA M IH R amiram AE M ER AE M amiran AE M IH R AH N amirault AE M AY R AW L T @@ -4049,9 +4049,9 @@ andraki AE N D AE K IY andras AA N D R AH S andre AA N D R EY andrea AE N D R IY AH +andrea(2) AA N D R EY AH andrea's AE N D R IY AH Z andrea's(2) AA N D R EY AH Z -andrea(2) AA N D R EY AH andreae AA N D R EY AA andreana AE N D R IY AA N AA andreani AE N D R IY AA N IY @@ -4179,9 +4179,9 @@ angeline EY NG G IH L AY N angeline(2) AE N JH AH L IY N angelini AA NG G EH L IY N IY angelino AE N JH AH L IY N OW +angelino(2) AA NG G EH L IY N OW angelino's AE N JH AH L IY N OW Z angelino's(2) AA NG G EH L IY N OW Z -angelino(2) AA NG G EH L IY N OW angelinos AE N JH AH L IY N OW Z angelinos(2) AE NG G AH L IY N OW Z angelique AE N JH EH L IY K @@ -4522,8 +4522,8 @@ antar's AE N T ER Z antarctic AE N T AA R K T IH K antarctic(2) AE N AA R T IH K antarctica AE N T AA R K T IH K AH -antarctica's AE N T AA R K T IH K AH Z antarctica(2) AE N AA R T IH K AH +antarctica's AE N T AA R K T IH K AH Z antares AE N T EH R IY Z antaya AA N T EY AH antczak AE N T CH AE K @@ -4591,7 +4591,8 @@ anti-infective AE N T IY IH N F EH K T IH V anti-war AE N T IY W AO R antiabortion AE N T IY AH B AO R SH AH N antiabortion(2) AE N T AY AH B AO R SH AH N -antiaircraft AE N T AY EH R K R AE F T +antiaircraft AE N T IY EH R K R AE F T +antiaircraft(2) AE N T AY EH R K R AE F T antibacterial AE N T IY B AE K T IH R IY AH L antiballistic AE N T IY B AH L IH S T IH K antibiotic AE N T IY B AY AA T IH K @@ -4802,6 +4803,7 @@ anyways EH N IY W EY Z anywhere EH N IY W EH R anywhere(2) EH N IY HH W EH R anza AE N Z AH +anzac AE N Z AE K anzaldua AA N Z AA L D UW AH anzalone AE N Z AH L OW N anzelmo AA N Z EH L M OW @@ -4817,9 +4819,9 @@ aortic EY AO R T IH K aoshima AW SH IY M AH aoshima(2) EY OW SH IY M AH aoun AW AH N +aoun(2) AW UW N aoun's AW AH N Z aoun's(2) AW UW N Z -aoun(2) AW UW N aouzou AW Y UW Z UW aoyama AW Y AA M AH aoyama(2) EY OW Y AA M AH @@ -4834,9 +4836,9 @@ apalachicola's AE P AH L AE CH AH K OW L AH Z aparicio AE P ER IH S IY OW apart AH P AA R T apartheid AH P AA R T AY T +apartheid(2) AH P AA R T AY D apartheid's AH P AA R T AY T S apartheid's(2) AH P AA R T AY D Z -apartheid(2) AH P AA R T AY D apartment AH P AA R T M AH N T apartment's AH P AA R T M AH N T S apartments AH P AA R T M AH N T S @@ -5200,8 +5202,8 @@ arabicon AH R AE B AH K AO N arabie AE R AH B IY arable AE R AH B AH L arabs AE R AH B Z -arabs' AE R AH B Z arabs(2) EY R AH B Z +arabs' AE R AH B Z araby AE R AH B IY arachnid AH R AE K N AH D arachnid(2) ER AE K N IH D @@ -5691,8 +5693,8 @@ arms AA R M Z armstead AA R M S T EH D armstrad AA R M S T R AE D armstrong AA R M S T R AA NG -armstrong's AA R M S T R AO NG Z armstrong(2) AA R M S T R AO NG +armstrong's AA R M S T R AO NG Z armtec AA R M T EH K armtek AA R M T EH K armtek's AA R M T EH K S @@ -5833,9 +5835,9 @@ arrogant EH R AH G AH N T arrogantly EH R AH G AH N T L IY arrogate AE R OW G EY T arrow AE R OW +arrow(2) EH R OW arrow's AE R OW Z arrow's(2) EH R OW Z -arrow(2) EH R OW arrowhead AE R OW HH EH D arrowhead(2) EH R OW HH EH D arrowheads AE R OW HH EH D Z @@ -5845,9 +5847,9 @@ arrowroot EH R OW R UW T arrows AE R OW Z arrows(2) EH R OW Z arrowsmith AE R OW S M IH TH +arrowsmith(2) EH R OW S M IH TH arrowsmith's AE R OW S M IH TH S arrowsmith's(2) EH R OW S M IH TH S -arrowsmith(2) EH R OW S M IH TH arroyo ER OY OW arroyo's ER OY OW Z arruda AA R UW D AH @@ -5907,8 +5909,8 @@ artichoke AA R T AH CH OW K artichoke(2) AA R T IH CH OW K artichokes AA R T IH CH OW K S article AA R T AH K AH L -article's AA R T IH K AH L Z article(2) AA R T IH K AH L +article's AA R T IH K AH L Z articles AA R T AH K AH L Z articles(2) AA R T IH K AH L Z articular AA R T IH K Y AH L ER @@ -5934,9 +5936,9 @@ artisan AA R T AH Z AH N artisanal AA R T IH Z AH N AH L artisans AA R T AH Z AH N Z artist AA R T AH S T +artist(2) AA R T IH S T artist's AA R T AH S T S artist's(2) AA R T IH S T S -artist(2) AA R T IH S T artistic AA R T IH S T IH K artistically AA R T IH S T IH K L IY artistry AA R T IH S T R IY @@ -6135,9 +6137,9 @@ aside AH S AY D asides AH S AY D Z asiel AE Z IY AH L asimov AE S IH M AA V +asimov(2) AE Z IH M AA V asimov's AE S IH M AA V Z asimov's(2) AE Z IH M AA V Z -asimov(2) AE Z IH M AA V asimow AE S IH M OW asinine AE S AH N AY N ask AE S K @@ -6315,23 +6317,23 @@ assisting AH S IH S T IH NG assists AH S IH S T S assocation AE S AH K EY SH AH N associate AH S OW S IY AH T -associate's AH S OW S IY AH T S -associate's(2) AH S OW SH IY AH T S associate(2) AH S OW S IY EY T associate(3) AH S OW SH IY AH T associate(4) AH S OW SH IY EY T +associate's AH S OW S IY AH T S +associate's(2) AH S OW SH IY AH T S associated AH S OW S IY EY T IH D associated(2) AH S OW SH IY EY T IH D associates AH S OW S IY AH T S -associates' AH S OW SH IY AH T S -associates'(2) AH S OW S IY AH T S associates(2) AH S OW S IY EY T S associates(3) AH S OW SH IY AH T S associates(4) AH S OW SH IY EY T S +associates' AH S OW SH IY AH T S +associates'(2) AH S OW S IY AH T S associating AH S OW S IY EY T IH NG association AH S OW S IY EY SH AH N -association's AH S OW SH IY EY SH AH N Z association(2) AH S OW SH IY EY SH AH N +association's AH S OW SH IY EY SH AH N Z associations AH S OW S IY EY SH AH N Z associations(2) AH S OW SH IY EY SH AH N Z associative AH S OW SH AH T IH V @@ -6524,29 +6526,29 @@ atkin AH T K IH N atkins AE T K IH N Z atkins's AE T K IH N Z IH Z atkinson AE T K AH N S AH N +atkinson(2) AE T K IH N S AH N atkinson's AE T K AH N S AH N Z atkinson's(2) AE T K IH N S AH N Z -atkinson(2) AE T K IH N S AH N atkison AE T K IH S AH N atkisson AE T K IH S AH N atla AE T L AH atlan AE T L AH N atlanta AE T L AE N T AH -atlanta's AE T L AE N T AH Z atlanta(2) AH T L AE N T AH +atlanta's AE T L AE N T AH Z atlantan AE T L AE N T AH N atlantans AE T L AE N T AH N Z atlantic AH T L AE N T IH K +atlantic(2) AH T L AE N IH K atlantic's AH T L AE N T IH K S atlantic's(2) AH T L AE N IH K S -atlantic(2) AH T L AE N IH K atlantica AE T L AE N T IH K AH atlantico AE T L AE N T IH K OW atlantis AE T L AE N T IH S +atlantis(2) AE T L AE N IH S atlantis' AE T L AE N T IH S atlantis'(2) AE T L AE N T IH S IH Z atlantis's AE T L AE N T IH S IH Z -atlantis(2) AE T L AE N IH S atlas AE T L AH S atlas's AE T L AH S IH Z atlases AE T L EY S IH Z @@ -6727,8 +6729,8 @@ auclair OW K L EH R aucoin OW K OY N aucott AO K AA T auction AA K SH AH N -auction's AO K SH AH N Z auction(2) AO K SH AH N +auction's AO K SH AH N Z auctioned AO K SH AH N D auctioneer AA K SH AH N IH R auctioneering AO K SH AH N IH R IH NG @@ -6745,17 +6747,17 @@ auderburn AO D ER B ER N audet OW D EH T audette OW D EH T audi AO D IY +audi(2) AW D IY audi's AO D IY Z audi's(2) AW D IY Z -audi(2) AW D IY audia AO D IY AH audible AA D AH B AH L audibles AA D AH B AH L Z audibly AA D AH B L IY audience AA D IY AH N S +audience(2) AO D IY AH N S audience's AA D IY AH N S AH Z audience's(2) AO D IY AH N S AH Z -audience(2) AO D IY AH N S audiences AA D IY AH N S AH Z audiences(2) AO D IY AH N S AH Z audino AO D IY N OW @@ -6827,8 +6829,8 @@ augur AO G ER auguring AO G ER IH NG augurs AO G ER Z august AA G AH S T -august's AO G AH S T S august(2) AO G AH S T +august's AO G AH S T S augusta AH G AH S T AH augusta's AH G AH S T AH Z auguste AO G AH S T @@ -6863,17 +6865,18 @@ aument AW M AH N T aumiller AW M AH L ER aune AO N aung AO NG +aungier EY N JH ER aungst AW NG G S T aunt AE N T +aunt(2) AO N T aunt's AE N T S aunt's(2) AO N T S -aunt(2) AO N T auntie AE N T IY auntie(2) AO N T IY aunts AE N T S +aunts(2) AO N T S aunts' AE N T S aunts'(2) AO N T S -aunts(2) AO N T S aupperle AW P ER L IY aura AO R AH aural AO R AH L @@ -7124,9 +7127,9 @@ avenues AE V AH N UW Z aver EY V ER avera AA V EH R AH average AE V ER IH JH -average's AE V R IH JH IH Z average(2) AE V R AH JH average(3) AE V R IH JH +average's AE V R IH JH IH Z averaged AE V R AH JH D averaged(2) AE V R IH JH D averages AE V R IH JH IH Z @@ -7328,9 +7331,9 @@ aye AY ayende AH Y EH N D IY ayende(2) AH Y EH N D EY ayer AY ER +ayer(2) EY ER ayer's EH R Z ayer's(2) EY R Z -ayer(2) EY ER ayers AY ER Z ayers(2) EY ER Z ayerst EY ER S T @@ -7370,9 +7373,9 @@ ayscue EY S K Y UW aytes EY T S ayuso AY UW S OW ayyad AY AA D +ayyad(2) AY AE D ayyad's AY AA D Z ayyad's(2) AY AE D Z -ayyad(2) AY AE D ayyash AY Y AE SH azactam AH Z AE K T AE M azalea AH Z EY L Y AH @@ -7387,9 +7390,9 @@ azcona AE Z K OW N AH azcuenaga AE Z K W EY N AA G AH azelia AA Z EH L IY AH azerbaijan AA Z ER B AY JH AA N +azerbaijan(2) AE Z ER B AY JH AA N azerbaijan's AA Z ER B AY JH AA N Z azerbaijan's(2) AE Z ER B AY JH AA N Z -azerbaijan(2) AE Z ER B AY JH AA N azerbaijani AA Z ER B AY JH AA N IY azerbaijani(2) AE Z ER B AY JH AA N IY azerbaijanis AA Z ER B AY JH AA N IY Z @@ -7433,12 +7436,12 @@ b.'s B IY Z b.c. B IY S IY b.s B IY Z ba B IY EY +ba(2) B AA ba'ath B AA TH ba'ath(2) B AH AA TH ba'athism B AA TH IH Z M ba'athist B AA TH IH S T ba'athists B AA TH IH S T S -ba(2) B AA baa B IY EY EY baab B AA B baack B AA K @@ -7452,9 +7455,9 @@ baasch B AA SH baatz B AA T S bab B AE B baba B AH B AH +baba(2) B AA B AH baba's B AH B AH Z baba's(2) B AA B AH Z -baba(2) B AA B AH babangida B AH B AA NG G IH D AH babangida(2) B AH B AE NG G IH D AH babar B AA B AA R @@ -7548,15 +7551,15 @@ bachand B AE CH AH N D bachar B AA K ER bacharach B AE K ER AE K bache B AE CH +bache(2) B EY CH bache's B AE CH IH Z bache's(2) B EY CH IH Z -bache(2) B EY CH bachelder B AA K EH L D ER bacheller B AA K AH L ER bachelor B AE CH AH L ER +bachelor(2) B AE CH L ER bachelor's B AE CH AH L ER Z bachelor's(2) B AE CH L ER Z -bachelor(2) B AE CH L ER bachelors B AE CH L ER Z bacher B AA K ER bachera B AA K ER AH @@ -7835,9 +7838,9 @@ bahnsen B AA N S AH N bahr B EH R bahr(2) B AA R bahrain B AA R EY N +bahrain(2) B AY R EY N bahrain's B AA R EY N Z bahrain's(2) B AY R EY N Z -bahrain(2) B AY R EY N bahraini B ER EY N IY bahraini(2) B AY R AA N IY bahraini(3) B AA R EY N IY @@ -7942,9 +7945,9 @@ baking B EY K IH NG bakke B AE K bakken B AE K AH N bakker B AE K ER +bakker(2) B EY K ER bakker's B AE K ER Z bakker's(2) B EY K ER Z -bakker(2) B EY K ER bakkers B AE K ER Z bakkers(2) B EY K ER Z bakley B AE K L IY @@ -8033,8 +8036,8 @@ balducci B AA L D UW CH IY baldur B AA L D UH R baldus B AA L D IH S baldwin B AO L D W AH N -baldwin's B AO L D W AH N Z baldwin(2) B AO L D W IH N +baldwin's B AO L D W AH N Z baldyga B AA L D IY G AH bale B EY L baleen B AH L IY N @@ -8154,9 +8157,9 @@ ballweg B AE L W IH G ballwig B AA L W IH G ballwig's B AA L W IH G Z bally B AE L IY +bally(2) B EY L IY bally's B AE L IY Z bally's(2) B EY L IY Z -bally(2) B EY L IY ballyhoo B AE L IY HH UW ballyhooed B AE L IY HH UW D balm B AA M @@ -8255,9 +8258,9 @@ bancoklahoma B AE NG K AA K L AH HH OW M AH bancomer B AE NG K AH M ER bancor B AE N K AO R bancorp B AE NG K AO R P +bancorp(2) B AE N K AO R P bancorp's B AE NG K AO R P S bancorp's(2) B AE N K AO R P S -bancorp(2) B AE N K AO R P bancorporation B AE N K AO R P ER EY SH AH N bancroft B AE NG K R AO F T bancroft's B AE N K R AO F T S @@ -8398,8 +8401,8 @@ bankrupcty B AE NG K R AH P T S IY bankrupt B AE NG K R AH P T bankruptcies B AE NG K R AH P T S IY Z bankruptcy B AE NG K R AH P S IY -bankruptcy's B AE NG K R AH P S IY Z bankruptcy(2) B AE NG K R AH P T S IY +bankruptcy's B AE NG K R AH P S IY Z bankrupted B AE NG K R AH P T IH D bankrupting B AE NG K R AH P T IH NG banks B AE NG K S @@ -8511,8 +8514,8 @@ barbakow B AA R B AH K AW barbanel B AA R B AH N AH L barbano B AA R B AA N OW barbara B AA R B ER AH -barbara's B AA R B ER AH Z barbara(2) B AA R B R AH +barbara's B AA R B ER AH Z barbaree B AA R B ER IY barbarian B AA R B EH R IY AH N barbarians B AA R B EH R IY AH N Z @@ -8589,15 +8592,15 @@ barch B AA R K barchefsky B AA CH EH F S K IY barcia B AA R CH AH barclay B AA R K L EY +barclay(2) B AA R K L IY barclay's B AA R K L IY Z barclay's(2) B AA R K L EY Z -barclay(2) B AA R K L IY barclays B AA R K L IY Z +barclays(2) B AA R K L EY Z barclays' B AA R K L IY Z barclays'(2) B AA R K L EY Z barclays's B AA R K L IY Z IH Z barclays's(2) B AA R K L EY Z IH Z -barclays(2) B AA R K L EY Z barclift B AA R K L IH F T barco B AA R K OW barco's B AA R K OW Z @@ -8777,9 +8780,9 @@ barometer B ER AA M IH T ER barometers B ER AA M IH T ER Z barometric B AE R AH M EH T R IH K baron B AE R AH N +baron(2) B EH R AH N baron's B AE R AH N Z baron's(2) B EH R AH N Z -baron(2) B EH R AH N barone B ER OW N barone's B ER OW N Z baroness B EH R AH N IH S @@ -8853,9 +8856,9 @@ barricaded(2) B EH R AH K EY D IH D barricades B AE R AH K EY D Z barricades(2) B EH R AH K EY D Z barrick B AE R IH K +barrick(2) B EH R IH K barrick's B AE R IH K S barrick's(2) B EH R IH K S -barrick(2) B EH R IH K barricklow B AE R IH K L AW barrickman B AE R IH K M AH N barrie B AE R IY @@ -8904,9 +8907,9 @@ barrows(2) B EH R OW Z barrs B AA R Z barrus B AE R AH S barry B AE R IY +barry(2) B EH R IY barry's B AE R IY Z barry's(2) B EH R IY Z -barry(2) B EH R IY barrymore B AE R IY M AO R barrymore(2) B EH R IY M AO R bars B AA R Z @@ -9123,9 +9126,9 @@ basques B AE S K S basquez B AA S K W EH Z basra B AA S R AA bass B AE S +bass(2) B EY S bass's B EY S IH Z bass's(2) B AE S IH Z -bass(2) B EY S bassa B AE S AH bassam B AE S AH M basse B AE S @@ -9548,6 +9551,7 @@ beakley B IY K L IY beaklike B IY K L AY K beakman B IY K M AH N beakman's B IY K M AH N Z +beaks B IY K S beal B IY L beale B IY L bealer B IY L ER @@ -9626,11 +9630,11 @@ beatniks B IY T N IH K S beato B IY AE T OW beaton B IY T AH N beatrice B IY AH T R AH S -beatrice's B IY AH T R IH S IH Z -beatrice's(2) B IY T R IH S IH Z beatrice(2) B IY AH T R IH S beatrice(3) B IY T R AH S beatrice(4) B IY T R IH S +beatrice's B IY AH T R IH S IH Z +beatrice's(2) B IY T R IH S IH Z beatrix B IY T R IH K S beatrix(2) B IY AH T R IH K S beats B IY T S @@ -10178,9 +10182,9 @@ belgium B EH L JH AH M belgium's B EH L JH AH M Z belgo B EH L G OW belgrade B EH L G R EY D +belgrade(2) B EH L G R AA D belgrade's B EH L G R EY D Z belgrade's(2) B EH L G R AA D Z -belgrade(2) B EH L G R AA D belgrave B EH L G R EY V beli B EH L IY belich B EH L IH K @@ -10433,6 +10437,7 @@ bendorf B EH N D AO R F bends B EH N D Z bendt B EH N T bendure B EY N D UH R EY +bendy B EH N D IY bene B EH N AH beneath B IH N IY TH benecke B EH N AH K @@ -10477,14 +10482,14 @@ benes B EH N IY S benesch B EH N AH SH benesh B EH N AH SH benet B EH N AH T +benet(2) B AH N EY benet's B EH N AH T S benet's(2) B AH N EY Z -benet(2) B AH N EY benetti B EH N EH T IY benetton B EH N AH T AH N +benetton(2) B EH N AH T AO N benetton's B EH N AH T AH N Z benetton's(2) B EH N AH T AO N Z -benetton(2) B EH N AH T AO N benevento B EH N AH V EY N T OW benevides B EH N AH V IY D EH S benevolence B AH N EH V AH L AH N S @@ -10549,8 +10554,8 @@ bennefield B EH N IH F IY L D benner B EH N ER bennet B EH N IH T bennett B EH N AH T -bennett's B EH N AH T S bennett(2) B EH N IH T +bennett's B EH N AH T S bennette B IH N EH T bennetts B EH N IH T S benney B EH N IY @@ -10623,8 +10628,8 @@ benway B EH N W EY benyamin B EH N Y AH M IY N benyo B EY N Y OW benz B EH N Z -benz's B EH N Z IH Z benz(2) B AE N Z +benz's B EH N Z IH Z benzel B EH N Z AH L benzene B EH N Z IY N benzes B EH N Z IH Z @@ -10800,9 +10805,9 @@ berlex B ER L EH K S berlin B ER L IH N berlin's B ER L IH N Z berliner B ER L IH N ER +berliner(2) B ER L AY N ER berliner's B ER L IH N ER Z berliner's(2) B ER L AY N ER Z -berliner(2) B ER L AY N ER berliners B ER L IH N ER Z berliners(2) B ER L AY N ER Z berling B ER L IH NG @@ -10837,8 +10842,8 @@ bernadino B ER N AH D IY N OW bernal B ER N AH L bernama B ER N AA M AH bernard B ER N AA R D -bernard's B ER N AA R D Z bernard(2) B ER N ER D +bernard's B ER N AA R D Z bernardi B ER N AA R D IY bernardin B ER N AA R D IY N bernardini B ER N AA R D IY N IY @@ -10884,9 +10889,9 @@ berns B ER N Z bernsen B ER N S AH N bernson B ER N S AH N bernstein B ER N S T AY N +bernstein(2) B ER N S T IY N bernstein's B ER N S T IY N Z bernstein's(2) B ER N S T AY N Z -bernstein(2) B ER N S T IY N bernsteins B ER N S T AY N Z bernsteins(2) B ER N S T IY N Z bernt B ER N T @@ -11308,9 +11313,9 @@ bibeault B IH B OW bibee B IH B IY biber B AY B ER bibi B IH B IY +bibi(2) B IY B IY bibi's B IH B IY Z bibi's(2) B IY B IY Z -bibi(2) B IY B IY bible B AY B AH L bible's B AY B AH L Z bibler B AY B AH L ER @@ -12276,9 +12281,9 @@ blaser B L EY Z ER blasi B L EY Z IY blasia B L AA S IY AH blasier B L EY Z IY ER +blasier(2) B L EY ZH ER blasier's B L EY Z IY ER Z blasier's(2) B L EY ZH ER Z -blasier(2) B L EY ZH ER blasing B L EY Z IH NG blasingame B L AA S IH NG G AA M IY blasini B L AH S IY N IY @@ -13150,9 +13155,9 @@ boipatong B OY P AH T AO NG bois B W AA boisclair B W AA K L EH R boise B OY Z IY +boise(2) B OY S IY boise's B OY Z IY Z boise's(2) B OY S IY Z -boise(2) B OY S IY boisen B OY S AH N boisi B OY S IY boisjoly B OY S JH AH L IY @@ -13231,8 +13236,8 @@ bolitho B OW L IH TH AH bolivar B AA L AH V ER bolivars B AA L AH V ER Z bolivia B AH L IH V IY AH -bolivia's B AH L IH V IY AH Z bolivia(2) B OW L IH V IY AH +bolivia's B AH L IH V IY AH Z bolivian B OW L IH V IY AH N bolivian(2) B AH L IH V IY AH N bolivians B OW L IH V IY AH N Z @@ -13264,8 +13269,8 @@ bollore B AA L AO R bolls B OW L Z bolly B AO L IY bollywood B AA L IY W UH D -bollywood's B AO L IH W UH D Z bollywood(2) B AO L IH W UH D +bollywood's B AO L IH W UH D Z bologna B AH L OW N IY bolognese B OW L OW G N EY Z IY bolognesi B AA L AA G N EH S IY @@ -13307,8 +13312,8 @@ bomag B OW M AE G boman B OW M AH N bomar B AH M AA R bomb B AA M -bomb's B AA M Z bomb(2) B AO M +bomb's B AA M Z bomba B AA M B AH bombard B AA M B AA R D bombarded B AA M B AA R D IH D @@ -13848,9 +13853,9 @@ bosom B UH Z AH M bosqi B AA S K IY bosquez B OW S K W EH Z boss B AA S +boss(2) B AO S boss' B AO S boss's B AO S IH Z -boss(2) B AO S bossard B AH S AA R D bossart B AH S AA R T bosse B AA S @@ -13879,8 +13884,8 @@ bostic B AA S T IH K bostick B OW S T IH K bostock B OW S T AA K boston B AA S T AH N -boston's B AO S T AH N Z boston(2) B AO S T AH N +boston's B AO S T AH N Z bostonian B AO S T OW N IY AH N bostonians B AA S T OW N IY AH N Z bostra B AA S T R AH @@ -13905,9 +13910,9 @@ botero B OW T EH R OW botfly B AA T F L AY both B OW TH botha B AA TH AH +botha(2) B OW T AH botha's B AA TH AH Z botha's(2) B OW T AH Z -botha(2) B OW T AH botham B AA TH AH M botham's B AA TH AH M Z bothe B OW DH @@ -14235,6 +14240,7 @@ boycotting B OY K AA T IH NG boycotts B OY K AA T S boyd B OY D boyd's B OY D Z +boyd-crotty B OY D K R AA T IY boyde B OY D boyden B OY D AH N boydston B OY D S T AH N @@ -15011,18 +15017,18 @@ breyer's B R EY ER Z breyfogle B R EY F OW G AH L breza B R EH Z AH brezhnev B R EH Z N AH V +brezhnev(2) B R EH Z N EH F brezhnev's B R EH Z N AH V Z brezhnev's(2) B R EH Z N EH F S -brezhnev(2) B R EH Z N EH F brezina B R EH Z IY N AH brezinski B R IH Z IH N S K IY bria B R IY AH brian B R AY AH N brian's B R AY AH N Z briana B R IY AE N AH +briana(2) B R IY AA N AH briana's B R IY AE N AH Z briana's(2) B R IY AA N AH Z -briana(2) B R IY AA N AH briancon B R AY AH N S AH N briand B R AY AH N D brianna B R IY AE N AH @@ -15090,8 +15096,8 @@ bridges(2) B R IH JH IH Z bridgestone B R IH JH S T OW N bridgestone's B R IH JH S T OW N Z bridget B R IH JH AH T -bridget's B R IH JH AH T S bridget(2) B R IH JH IH T +bridget's B R IH JH AH T S bridgeton B R IH JH T AH N bridgetown B R IH JH T AW N bridgett B R IH JH IH T @@ -15416,9 +15422,9 @@ broder B R OW D ER broder's B R OW D ER Z broderbund B R OW T ER B AH N D broderick B R AA D ER IH K +broderick(2) B R AA D R IH K broderick's B R AA D ER IH K Z broderick's(2) B R AA D R IH K Z -broderick(2) B R AA D R IH K brodersen B R AA D ER S AH N brodersohn B R OW T ER S AH N broderson B R AA D ER S AH N @@ -15464,13 +15470,13 @@ broken-winded B R OW K AH N W IH N D IH D broker B R OW K ER broker's B R OW K ER Z brokerage B R OW K ER IH JH +brokerage(2) B R OW K R IH JH brokerage's B R OW K ER IH JH IH Z brokerage's(2) B R OW K R IH JH IH Z -brokerage(2) B R OW K R IH JH brokerages B R OW K ER IH JH IH Z +brokerages(2) B R OW K R IH JH IH Z brokerages' B R OW K ER IH JH IH Z brokerages'(2) B R OW K R IH JH IH Z -brokerages(2) B R OW K R IH JH IH Z brokered B R OW K ER D brokering B R OW K ER IH NG brokers B R OW K ER Z @@ -15553,9 +15559,9 @@ brookings B R UH K IH NG Z brookins B R UW K IH N Z brookline B R UH K L AY N brooklyn B R UH K L AH N +brooklyn(2) B R UH K L IH N brooklyn's B R UH K L AH N Z brooklyn's(2) B R UH K L IH N Z -brooklyn(2) B R UH K L IH N brookman B R UH K M AH N brookner B R UH K N ER brookner's B R UH K N ER Z @@ -15974,9 +15980,9 @@ buchheit B AH K HH AY T buchholtz B AH K HH OW L T S buchholz B AH K HH OW L Z buchi B AH CH IY +buchi(2) B UW CH IY buchi's B AH CH IY Z buchi's(2) B UW CH IY Z -buchi(2) B UW CH IY buchinger B AH K IH N JH ER buchko B AH CH K OW buchler B AH K AH L ER @@ -16053,9 +16059,9 @@ bud's B AH D Z bud-test B AH D T EH S T budai B UW D AA IY budapest B UW D AH P EH S T +budapest(2) B UW D AH P EH SH T budapest's B UW D AH P EH S T S budapest's(2) B UW D AH P EH SH T S -budapest(2) B UW D AH P EH SH T buday B UW D EY budd B AH D budde B AH D @@ -16424,9 +16430,9 @@ bund B AH N D bunda B AH N D AH bunde B AH N D bundesbank B UH N D IH S B AE NG K -bundesbank's B UH N D IH S B AE NG K S bundesbank(2) B AA N D IH S B AE NG K bundesbank(3) B UH N D IH S B AA NG K +bundesbank's B UH N D IH S B AE NG K S bundespost B UH N D IH S P OW S T bundespost's B UH N D IH S P OW S T S bundesrat B UH N D IH S R AE T @@ -16454,6 +16460,7 @@ bungee B AH N JH IY bunger B AH NG ER bungert B AH NG G ER T bungey B AH N JH IY +bungle B AH NG G AH L bungled B AH NG G AH L D bungler B AH NG G L ER bunglers B AH NG G L ER Z @@ -16554,9 +16561,9 @@ burdi B UH R D IY burdick B ER D IH K burdin B ER D IH N burdine B ER D IY N +burdine(2) B ER D AY N burdine's B ER D IY N Z burdine's(2) B ER D AY N Z -burdine(2) B ER D AY N burdines B ER D IY N Z burdines(2) B ER D AY N Z burditt B ER D IH T @@ -16726,9 +16733,9 @@ burnett's B ER N EH T S burnette B ER N EH T burney B ER N IY burnham B ER N AH M +burnham(2) B ER N HH AE M burnham's B ER N AH M Z burnham's(2) B ER N HH AE M Z -burnham(2) B ER N HH AE M burning B ER N IH NG burningham B ER N IH NG HH AE M burnings B ER N IH NG Z @@ -16880,18 +16887,18 @@ busier B IH Z IY ER busiest B IH Z IY AH S T busily B IH Z AH L IY business B IH Z N AH S +business(2) B IH Z N IH S business' B IH Z N IH S business'(2) B IH Z N AH S business's B IH Z N IH S IH Z -business(2) B IH Z N IH S businesses B IH Z N AH S AH Z -businesses' B IH Z N EH S IH Z businesses(2) B IH Z N IH S IH Z +businesses' B IH Z N EH S IH Z businessland B IH Z N IH S L AE N D businesslike B IH Z N IH S L AY K businessman B IH Z N AH S M AE N -businessman's B IH Z N IH S M AE N Z businessman(2) B IH Z N IH S M AE N +businessman's B IH Z N IH S M AE N Z businessmen B IH Z N IH S M EH N businesspeople B IH Z N AH S P IY P AH L businessperson B IH Z N AH S P ER S AH N @@ -16960,9 +16967,9 @@ butala B UW T AA L AH butan B UW T AA N butane B Y UW T EY N butare B UW T AA R IY +butare(2) B Y UW T AA R IY butare's B UW T AA R IY Z butare's(2) B Y UW T AA R IY Z -butare(2) B Y UW T AA R IY butch B UH CH butchart B UH CH ER T butcher B UH CH ER @@ -17192,11 +17199,6 @@ c.'s S IY Z c.d.s S IY D IY Z c.o.d. S IY OW D IY c.s S IY Z -c1 S IY W AH N -c2 S IY T UW -c3 S IY TH R IY -c4 S IY F AO R -c5 S IY F AY V ca K AH ca(2) S IY EY ca(3) K AA @@ -17234,8 +17236,8 @@ cabin K AE B AH N cabinda K AH B IH N D AH cabiness K EY B IY N IH S cabinet K AE B AH N AH T -cabinet's K AE B N AH T S cabinet(2) K AE B N AH T +cabinet's K AE B N AH T S cabinetry K AE B N AH T R IY cabinets K AE B AH N AH T S cabinets(2) K AE B N AH T S @@ -17280,8 +17282,8 @@ cabriolet K AE B R IY OW L EY cabriolet(2) K AE B R IY OW L EH T cabs K AE B Z cac K AE K -cac's K AE K S cac(2) S IY EY S IY +cac's K AE K S cacace K AE K AH S cacaci K AH K AA S IY cacao K AH K EY OW @@ -17364,9 +17366,9 @@ cadwallader K AE D W AO L AH D ER cadwell K AE D W EH L cady K EY D IY caen K AE N +caen(2) K AA N caen's K AE N Z caen's(2) K AA N Z -caen(2) K AA N caesar S IY Z ER caesar's S IY Z ER Z caesarea K EY S ER IY AH @@ -17537,8 +17539,8 @@ caley K EY L IY calf K AE F calf's K AE F S calfed K AE F T -calfed's K AE L F EH D Z calfed(2) K AE L F EH D +calfed's K AE L F EH D Z calfee K AE L F IY calgary K AE L G ER IY calgene K AE L JH IY N @@ -17654,9 +17656,9 @@ calmaquip K AE L M AH K W IH P calmar K AE L M AA R calmark K AA L M AA R K calmart K AA L M AA R T +calmart(2) K AE L M AA R T calmart's K AA L M AA R T S calmart's(2) K AE L M AA R T S -calmart(2) K AE L M AA R T calmat K AE L M AE T calmat's K AE L M AE T S calmed K AA M D @@ -17712,9 +17714,9 @@ calvey K AE L V EY calvi K AA L V IY calvillo K AA L V IH L OW calvin K AE L V AH N +calvin(2) K AE L V IH N calvin's K AE L V AH N Z calvin's(2) K AE L V IH N Z -calvin(2) K AE L V IH N calvina K AA L V IY N AH calving K AE V IH NG calvinist K AE L V AH N AH S T @@ -17775,11 +17777,12 @@ camel K AE M AH L camel's K AE M AH L Z camelot K AE M AH L AA T camels K AE M AH L Z +camembert K AE M AH M B EH R cameo K AE M IY OW cameos K AE M IY OW Z camera K AE M ER AH -camera's K AE M R AH Z camera(2) K AE M R AH +camera's K AE M R AH Z cameraman K AE M ER AH M AH N cameramen K AE M ER AH M EH N cameras K AE M ER AH Z @@ -17800,6 +17803,7 @@ camillo K AH M IH L OW caminiti K AA M IY N IY T IY camino K AH M IY N OW camire K AA M IH R IY +camisole K AE M IH S OW L camm K AE M cammack K AE M AH K cammarano K AA M AA R AA N OW @@ -17811,6 +17815,8 @@ cammie K AE M IY cammisa K AH M IY S AH cammon K AE M AH N cammy K AE M IY +camomile K AE M AH M AY L +camomile(2) K AE M AH M IY L camorra K AH M AO R AH camouflage K AE M AH F L AA ZH camouflaged K AE M AH F L AA ZH D @@ -17878,9 +17884,9 @@ camshafts K AE M SH AE F T S camus K AE M IH S camuso K AA M UW S OW can K AE N +can(2) K AH N can's K AE N Z can't K AE N T -can(2) K AH N cana K AE N AH canaan K EY N AH N canaanite K EY N AH N AY T @@ -17959,11 +17965,11 @@ candida K AE N D IH D AH candidacies K AE N D AH D AH S IY Z candidacy K AE N D IH D AH S IY candidate K AE N D AH D EY T -candidate's K AE N D AH D EY T S candidate(2) K AE N AH D IH T +candidate's K AE N D AH D EY T S candidates K AE N D AH D EY T S -candidates' K AE N D AH D EY T S candidates(2) K AE N AH D IH T S +candidates' K AE N D AH D EY T S candidly K AE N D IH D L IY candido K AE N D IY D OW candie K AE N D IY @@ -18032,6 +18038,7 @@ canned K AE N D cannedy K AE N IH D IY cannell K AE N AH L cannella K AA N EH L AH +cannelloni K AE N AH L OW N IY cannelton K AE N AH L T AH N canner K AE N ER canneries K AE N ER IY Z @@ -18204,8 +18211,8 @@ capillary K AE P AH L EH R IY capistrano K AE P IH S T R AA N OW capita K AE P IH T AH capital K AE P AH T AH L -capital's K AE P IH T AH L Z capital(2) K AE P IH T AH L +capital's K AE P IH T AH L Z capitalism K AE P IH T AH L IH Z AH M capitalism's K AE P AH T AH L IH Z AH M Z capitalist K AE P AH T AH L IH S T @@ -18276,9 +18283,9 @@ capra K AE P R AH capraro K AA P R AA R OW caprese K AA P R EY S EY capri K AE P R IY +capri(2) K AH P R IY capri's K AE P R IY Z capri's(2) K AH P R IY Z -capri(2) K AH P R IY capriati K AE P R IY AA T IY capriati's K AE P R IY AA T IY Z caprica K AE P R IH K AH @@ -18422,6 +18429,7 @@ carcione K AA R CH OW N IY card K AA R D card's K AA R D Z carda K AA R D AH +cardamom K AA R D AH M AH M cardarelli K AA R D AA R EH L IY cardassian K AH R D AA S IY AH N cardassians K AH R D AA S IY AH N Z @@ -18447,8 +18455,8 @@ cardiges K AA R D IH JH IH Z cardillo K AA R D IH L OW cardin K AA R D IH N cardinal K AA R D AH N AH L -cardinal's K AA R D AH N AH L Z cardinal(2) K AA R D IH N AH L +cardinal's K AA R D AH N AH L Z cardinale K AA R D IY N AA L IY cardinali K AA R D IY N AA L IY cardinals K AA R D AH N AH L Z @@ -18684,9 +18692,9 @@ carnaud K AA R N AO carne K AA R N carneal K AA R N AH L carnegie K AA R N AH G IY +carnegie(2) K AA R N EY G IY carnegie's K AA R N AH G IY Z carnegie's(2) K AA R N EY G IY Z -carnegie(2) K AA R N EY G IY carnegie-mellon K AA R N AH G IY M EH L AH N carnegie-mellon(2) K AA R N EY G IY M EH L AH N carnegies K AA R N AH G IY Z @@ -18712,9 +18720,9 @@ caro K AA R OW carob K EH R AH B caroche K ER OW CH carol K AE R AH L +carol(2) K EH R AH L carol's K EH R AH L Z carol's(2) K AE R AH L Z -carol(2) K EH R AH L carolan K EH R AH L AE N carolco K ER AA L K OW carolco's K EH R AH L K OW Z @@ -18824,15 +18832,15 @@ carrie K EH R IY carried K AE R IY D carried(2) K EH R IY D carrier K AE R IY ER +carrier(2) K EH R IY ER carrier's K AE R IY ER Z carrier's(2) K EH R IY ER Z -carrier(2) K EH R IY ER carriere K AA R IH R IY carriero K AA R IH R OW carriers K AE R IY ER Z +carriers(2) K EH R IY ER Z carriers' K EH R IY ER Z carriers's K AE R IY ER Z IH Z -carriers(2) K EH R IY ER Z carries K AE R IY Z carries(2) K EH R IY Z carrig K AE R IH G @@ -18854,9 +18862,9 @@ carrizales K AA R IY Z AA L EH S carro K AA R OW carrol K AE R AH L carroll K AE R AH L +carroll(2) K EH R AH L carroll's K AE R AH L Z carroll's(2) K EH R AH L Z -carroll(2) K EH R AH L carrollton K EH R AH L T AH N carron K AE R AH N carrot K AE R AH T @@ -18879,14 +18887,14 @@ carrying K AE R IY IH NG carrying(2) K EH R IY IH NG carryover K EH R Y OW V ER cars K AA R Z -cars' K AA R Z cars(2) K AA Z +cars' K AA R Z carse K AA R S carsey K AA R S IY carsick K AA R S IH K carson K AA R S AH N -carson's K AA R S AH N Z carson(2) K AA R Z AH N +carson's K AA R S AH N Z carstarphen K AA R S T AA R F AH N carsten K AA R S T AH N carstens K AA R S T AH N Z @@ -19132,6 +19140,7 @@ cassinelli K AA S IY N EH L IY cassini K AH S IY N IY cassini's K AH S IY N IY Z cassino K AH S IY N OW +cassiopeia K AH S IY AH P IY AH cassis K AE S IH S cassity K AE S IH T IY casso K AE S OW @@ -19242,9 +19251,6 @@ casualty(3) K AE ZH AH L T IY caswell K AE Z W EH L cat K AE T cat's K AE T S -cat-2 K AE T T UW -cat-3 K AE T TH R IY -cat-4 K AE T F AO R cat-o-nine-tails K AE T OW N AY N T EY L Z cataclysm K AE T AH K L IH S AH M cataclysmic K AE T AH K L IH Z M IH K @@ -19277,8 +19283,8 @@ cataloguing K AE T AH L AO G IH NG catalonia K AE T AH L OW N Y AH catalonian K AE T AH L OW N Y AH N catalyst K AE T AH L AH S T -catalyst's K AE T AH L IH S T S catalyst(2) K AE T AH L IH S T +catalyst's K AE T AH L IH S T S catalysts K AE T AH L AH S T S catalysts(2) K AE T AH L IH S T S catalytic K AE T AH L IH T IH K @@ -19344,13 +19350,13 @@ catering K EY T ER IH NG caterings K AE T ER IH NG Z caterino K AA T ER IY N OW caterpillar K AE T AH P IH L ER -caterpillar's K AE T ER P IH L ER Z caterpillar(2) K AE T ER P IH L ER +caterpillar's K AE T ER P IH L ER Z caterpillars K AE T AH P IH L ER Z caterpiller K AE T AH P IH L ER +caterpiller(2) K AE T ER P IH L ER caterpiller's K AE T AH P IH L ER Z caterpiller's(2) K AE T ER P IH L ER Z -caterpiller(2) K AE T ER P IH L ER caters K EY T ER Z caterwaul K AE T ER W AA L cates K EY T S @@ -19369,9 +19375,9 @@ cather K AE DH ER cather's K AE DH ER Z catherina K AA TH ER IY N AH catherine K AE TH ER AH N -catherine's K AE TH R IH N Z catherine(2) K AE TH ER IH N catherine(3) K AE TH R IH N +catherine's K AE TH R IH N Z catherines K AE TH R IH N Z catherman K AE DH ER M AH N cathers K AE DH ER Z @@ -19422,8 +19428,8 @@ catterson K AE T ER S AH N catterton K AE T ER T AH N cattle K AE T AH L cattlemen K AE T AH L M AH N -cattlemen's K AE T AH L M AH N Z cattlemen(2) K AE T AH L M IH N +cattlemen's K AE T AH L M AH N Z catto K AE T OW cattolica K AH T OW L IH K AH catton K AE T AH N @@ -19438,8 +19444,8 @@ caucasian K AO K EY ZH AH N caucasians K AO K EY ZH AH N Z caucasus K AO K AH S AH S caucus K AO K AH S -caucus's K AO K AH S IH Z caucus(2) K AA K AH S +caucus's K AO K AH S IH Z caucuses K AO K AH S IH Z caudal K AA D AH L caudal(2) K AO D AH L @@ -19667,11 +19673,11 @@ cedes S IY D Z cedillo CH EH D IH L OW ceding S IY D IH NG cedras S EY D R AA S +cedras(2) S EY D R AH S cedras' S EY D R AA S cedras'(2) S EY D R AH S cedras's S EY D R AA S IH S cedras's(2) S EY D R AH S IH S -cedras(2) S EY D R AH S cedric S EH D R IH K cedric(2) S IY D R IH K cedrone S EY D R OW N EY @@ -19828,9 +19834,9 @@ centennial's S EH N T EH N IY AH L Z centeno CH EH N T EH N OW centeno(2) S EH N T EH N OW center S EH N T ER +center(2) S EH N ER center's S EH N T ER Z center's(2) S EH N ER Z -center(2) S EH N ER centerbanc S EH N T ER B AE NG K centerbank S EH N T ER B AE NG K centered S EH N T ER D @@ -19842,9 +19848,9 @@ centerpiece S EH N T ER P IY S centerre S EH N T ER centerre's S EH N T ER Z centers S EH N T ER Z +centers(2) S EH N ER Z centers' S EH N T ER Z centers'(2) S EH N ER Z -centers(2) S EH N ER Z centerville S EH N T ER V IH L centex S EH N T EH K S centigrade S EH N T AH G R EY D @@ -20008,9 +20014,9 @@ cesium S IY Z IY AH M cespedes S EY S P EY D EH S cessation S EH S EY SH AH N cessna S EH S N AH +cessna(2) S EH Z N AH cessna's S EH S N AH Z cessna's(2) S EH Z N AH Z -cessna(2) S EH Z N AH cesspool S EH S P UW L cestaro CH EH S T AA R OW ceta S EH T AH @@ -20060,9 +20066,9 @@ chaebol CH EY B AH L chafe CH EY F chafed CH EY F T chafee CH AE F IY +chafee(2) CH EY F IY chafee's CH EY F IY Z chafee's(2) CH AE F IY Z -chafee(2) CH EY F IY chafes CH EY F S chafete CH AH F IY T chaff CH AE F @@ -20132,8 +20138,8 @@ challender CH AH L EH N D ER challenge CH AE L AH N JH challenged CH AE L AH N JH D challenger CH AE L AH N JH ER -challenger's CH AE L AH N JH ER Z challenger(2) CH AE L IH N JH ER +challenger's CH AE L AH N JH ER Z challengers CH AE L AH N JH ER Z challengery CH AE L AH N JH ER IY challenges CH AE L AH N JH IH Z @@ -20150,8 +20156,8 @@ chamber CH EY M B ER chamber's CH EY M B ER Z chambered CH EY M B ER D chamberlain CH EY M B ER L AH N -chamberlain's CH EY M B ER L AH N Z chamberlain(2) CH EY M B ER L IH N +chamberlain's CH EY M B ER L AH N Z chamberland CH AE M B ER L AH N D chamberlayne CH EY M B ER L EY N chamberlin CH EY M B ER L IH N @@ -20167,11 +20173,13 @@ chameleon K AH M IY L IY AH N chamlee CH AE M L IY chamlong CH AE M L AO NG chamness CH AE M N IH S +chamomile K AE M AH M AY L +chamomile(2) K AE M AH M IY L chamonix CH AE M AH N IH K S chamonix(2) SH AE M OW N IY chamorro CH AH M AO R OW -chamorro's CH AH M AO R OW Z chamorro(2) CH OW M AO R OW +chamorro's CH AH M AO R OW Z champ CH AE M P champa K AA M P AH champagne SH AE M P EY N @@ -20199,8 +20207,8 @@ chana CH AE N AH chance CH AE N S chanced CH AE N S T chancellor CH AE N S AH L ER -chancellor's CH AE N S AH L ER Z chancellor(2) CH AE N S L ER +chancellor's CH AE N S AH L ER Z chancellors CH AE N S AH L ER Z chancery CH AE N S ER IY chances CH AE N S AH Z @@ -20283,8 +20291,8 @@ chaplain CH AE P L AH N chaplains CH AE P L AH N Z chaplan CH AE P L AH N chaplin CH AE P L AH N -chaplin's CH AE P L IH N Z chaplin(2) CH AE P L IH N +chaplin's CH AE P L IH N Z chapman CH AE P M AH N chapman's CH AE P M AH N Z chapnick CH AE P N IH K @@ -20316,8 +20324,8 @@ characterized K EH R AH K T ER AY Z D characterizes K EH R AH K T ER AY Z AH Z characterizing K EH R AH K T ER AY Z IH NG characters K AE R AH K T ER Z -characters' CH EH R AH K T ER Z characters(2) K EH R AH K T ER Z +characters' CH EH R AH K T ER Z charade SH ER EY D charades SH ER EY D Z charalambos CH AA R AH L AA M B OW S @@ -20360,8 +20368,8 @@ charitable CH AE R AH T AH B AH L charitable(2) CH EH R AH T AH B AH L charitably CH EH R IH T AH B L IY charities CH EH R AH T IY Z -charities' CH EH R IH T IY Z charities(2) CH EH R IH T IY Z +charities' CH EH R IH T IY Z charity CH EH R IH T IY charity's CH EH R AH T IY Z charla CH AA R L AH @@ -20375,14 +20383,14 @@ charleen CH AA R L IY N charlemagne SH AA R L AH M EY N charlene SH AA R L IY N charles CH AA R L Z +charles(2) CH AA R AH L Z charles' CH AA R L Z charles'(2) CH AA R AH L Z charles's CH AA R L Z IH Z -charles(2) CH AA R AH L Z charleston CH AA R L S T AH N +charleston(2) CH AA R AH L S T AH N charleston's CH AA R L S T AH N Z charleston's(2) CH AA R AH L S T AH N Z -charleston(2) CH AA R AH L S T AH N charlestown CH AA R L S T AW N charlestown(2) CH AA R AH L S T AW N charlesworth CH AA R AH L S W ER TH @@ -20554,9 +20562,9 @@ chavez(3) SH AH V EH Z chavin CH EY V IH N chavira K AA V IH R AH chavis CH AE V IH S +chavis(2) CH EY V IH S chavis' CH AE V IH S chavis'(2) CH EY V IH S -chavis(2) CH EY V IH S chavitz CH AE V IH T S chavous SH AH V AO S chaw CH AO @@ -20710,8 +20718,8 @@ chemetron CH EH M AH T R AA N chemfix CH EH M F IH K S chemi K EH M IY chemical K EH M AH K AH L -chemical's K EH M IH K AH L Z chemical(2) K EH M IH K AH L +chemical's K EH M IH K AH L Z chemically K EH M AH K L IY chemicals K EH M IH K AH L Z chemicals' CH EH M AH K AH L Z @@ -20859,19 +20867,19 @@ chevis CH EH V IH S chevrette SH IH V R EH T chevrier CH EH V ER IY ER chevrolet SH EH V R AH L EY +chevrolet(2) SH EH V R OW L EY chevrolet's SH EH V R AH L EY Z chevrolet's(2) SH EH V R OW L EY Z -chevrolet(2) SH EH V R OW L EY chevrolets SH EH V R AH L EY Z chevrolets(2) SH EH V R OW L EY Z chevron SH EH V R AH N +chevron(2) SH EH V R AA N chevron's SH EH V R AH N Z chevron's(2) SH EH V R AA N Z -chevron(2) SH EH V R AA N chevy SH EH V IY +chevy(2) CH EH V IY chevy's SH EH V IY Z chevy's(2) CH EH V IY Z -chevy(2) CH EH V IY chevys SH EH V IY S chevys(2) CH EH V IY S chew CH UW @@ -20989,15 +20997,16 @@ childcare CH AY L D K EH R childcraft CH AY L D K R AE F T childe CH IH L D childener CH IH L D N ER +childener(2) CH IH L D IH N ER childener's CH IH L D N ER Z childener's(2) CH IH L D IH N ER Z -childener(2) CH IH L D IH N ER childers CH IH L D ER Z childhood CH AY L D HH UH D childhoods CH AY L D HH UH D Z childish CH AY L D IH SH childless CH AY L D L AH S childlike CH AY L D L AY K +childminder CH AY L D M AY N D ER childraising CH AY L D R EY Z IH NG childree CH AY L D R IY children CH IH L D R AH N @@ -21013,8 +21022,8 @@ chile's CH IH L IY Z chilean CH IH L IY AH N chileans CH IH L IY AH N Z chiles CH AY L Z -chiles's CH IH L IY Z IH Z chiles(2) CH IH L IY Z +chiles's CH IH L IY Z IH Z chili CH IH L IY chili's CH IH L IY Z chilies CH IH L IY Z @@ -21316,9 +21325,9 @@ chrest K R EH S T chrestman K R EH S T M AH N chretien K R IH T Y EH N chriboniko CH R IY B OW N IY K OW +chriboniko(2) CH R IH B AH N IY K OW chriboniko's CH R IY B OW N IY K OW Z chriboniko's(2) CH R IH B AH N IY K OW Z -chriboniko(2) CH R IH B AH N IY K OW chriptosporidium K R IH P T OW S P AO R IH D IY AH M chris K R IH S chris' K R IH S @@ -21516,9 +21525,9 @@ churchgoers CH ER CH G OW ER Z churchgoing CH ER CH G OW IH NG churchhouse CH ER CH HH AW S churchill CH ER CH IH L +churchill(2) CH ER CH HH IH L churchill's CH ER CH IH L Z churchill's(2) CH ER CH HH IH L Z -churchill(2) CH ER CH HH IH L churchman CH ER CH M AH N churchmen CH ER CH M AH N churchwell CH ER CH W EH L @@ -21569,9 +21578,9 @@ ciardi CH ER D IY ciarlo CH ER L OW ciavarella CH AH V AA R EH L AA ciba S IY B AH +ciba(2) S AY B AH ciba's S IY B AH Z ciba's(2) S AY B AH Z -ciba(2) S AY B AH ciborowski CH IH B ER AO F S K IY cibro S IH B R OW cibula CH IY B UW L AA @@ -21805,13 +21814,13 @@ cities' S IH T IY Z citing S AY T IH NG citisteel S IH T IY S T IY L citizen S IH T AH Z AH N -citizen's S IH T AH Z AH N Z citizen(2) S IH T IH Z AH N +citizen's S IH T AH Z AH N Z citizenry S IH T IH Z AH N R IY citizenry's S IH T IH Z AH N R IY Z citizens S IH T AH Z AH N Z -citizens' S IH T IH Z AH N Z citizens(2) S IH T IH Z AH N Z +citizens' S IH T IH Z AH N Z citizenship S IH T IH Z AH N SH IH P citrano CH IY T R AA N OW citric S IH T R IH K @@ -21821,9 +21830,9 @@ citrix S IH T R IH K S citro S IH T R OW citroen S IH T R OW N citron S IH T R AH N +citron(2) S IH T R AH N Z citron's S IH T R AH N Z citron's(2) S IH T R AA N Z -citron(2) S IH T R AH N Z citronella S IH T R AA N EH L AH citrosuco S IH T R AH S UW K OW citrucel S IH T R AH S EH L @@ -21948,9 +21957,9 @@ clapton K L AE P T AH N clapton's K L AE P T AH N Z clar K L AA R clara K L AE R AH +clara(2) K L EH R AH clara's K L AE R AH Z clara's(2) K L EH R AH Z -clara(2) K L EH R AH clarabelle K L AE R AH B AH L clarabelle(2) K L AE R AH B EH L claramae K L AA R AA M AY @@ -22188,9 +22197,9 @@ clemensen K L EH M AH N S AH N clemenson K L EH M IH N S AH N clement K L EH M AH N T clemente K L AH M EH N T EY +clemente(2) K L AH M EH N T IY clemente's K L AH M EH N T EY Z clemente's(2) K L AH M EH N T IY Z -clemente(2) K L AH M EH N T IY clementes K L AH M EH N T EY Z clementes(2) K L AH M EH N T IY Z clementi K L EY M EY N T IY @@ -22343,8 +22352,8 @@ clini K L IY N IY clinic K L IH N IH K clinic's K L IH N IH K S clinical K L IH N AH K AH L -clinical's K L IH N IH K AH L Z clinical(2) K L IH N IH K AH L +clinical's K L IH N IH K AH L Z clinically K L IH N IH K AH L IY clinically(2) K L IH N IH K L IY clinician K L IH N IH SH AH N @@ -22863,9 +22872,9 @@ coey K OW IY cofer K OW F ER coffaro K OW F AA R OW coffee K AA F IY +coffee(2) K AO F IY coffee's K AA F IY Z coffee's(2) K AO F IY Z -coffee(2) K AO F IY coffeehouse K AO F IY HH AW S coffeehouses K AO F IY HH AW S IH Z coffeen K AH F IY N @@ -23230,8 +23239,8 @@ colloquial K AH L OW K W IY AH L colloquium K AH L OW K W IY AH M colloquy K AA L AH K W IY collor K AA L ER -collor's K AA L ER Z collor(2) K AO L ER +collor's K AA L ER Z collosio K AH L OW S IY OW collosio's K AH L OW S IY OW Z collude K AH L UW D @@ -23292,9 +23301,9 @@ color(2) K AO L ER coloradan K AA L ER AA D AH N coloradans K AA L ER AA D AH N Z colorado K AA L ER AA D OW +colorado(2) K AA L ER AE D OW colorado's K AA L ER AA D OW Z colorado's(2) K AA L ER AE D OW Z -colorado(2) K AA L ER AE D OW coloration K AH L ER EY SH AH N coloratura K AH L ER AH T UH R AH colorblind K AH L ER B L AY N D @@ -23343,9 +23352,9 @@ coltie K OW L T IY colton K OW L T AH N coltrain K OW L T R EY N coltrane K OW L T R AH N +coltrane(2) K OW L T R EY N coltrane's K OW L T R AH N Z coltrane's(2) K OW L T R EY N Z -coltrane(2) K OW L T R EY N coltrin K OW L T R IH N colts K OW L T S coltsfoot K OW L T S F UH T @@ -23663,8 +23672,8 @@ communists' K AA M Y UW N IH S T S communities K AH M Y UW N AH T IY Z communities(2) K AH M Y UW N IH T IY Z community K AH M Y UW N AH T IY -community's K AH M Y UW N IH T IY Z community(2) K AH M Y UW N IH T IY +community's K AH M Y UW N IH T IY Z communitywide K AH M Y UW N IH T IY W AY D communization K AA M Y AH N AH Z EY SH AH N communize K AA M Y AH N AY Z @@ -23767,11 +23776,11 @@ competitive(2) K AH M P EH T IH T IH V competitively K AH M P EH T IH T IH V L IY competitiveness K AH M P EH T IH T IH V N IH S competitor K AH M P EH T AH T ER -competitor's K AH M P EH T AH T ER Z competitor(2) K AH M P EH T IH T ER +competitor's K AH M P EH T AH T ER Z competitors K AH M P EH T AH T ER Z -competitors' K AH M P EH T IH T ER Z competitors(2) K AH M P EH T IH T ER Z +competitors' K AH M P EH T IH T ER Z compher K AA M F ER compilation K AA M P AH L EY SH AH N compilations K AA M P AH L EY SH AH N Z @@ -23856,9 +23865,9 @@ composers K AH M P OW Z ER Z composes K AH M P OW Z IH Z composing K AH M P OW Z IH NG composite K AH M P AA Z AH T +composite(2) K AA M P AA Z AH T composite's K AH M P AA Z AH T S composite's(2) K AA M P AA Z AH T S -composite(2) K AA M P AA Z AH T composites K AH M P AA Z AH T S composites(2) K AA M P AA Z AH T S composition K AA M P AH Z IH SH AH N @@ -23912,9 +23921,9 @@ comptek K AA M P T EH K compton K AA M P T AH N compton's K AA M P T AH N Z comptroller K AH M T R OW L ER +comptroller(2) K AA M T R OW L ER comptroller's K AH M T R OW L ER Z comptroller's(2) K AA M T R OW L ER Z -comptroller(2) K AA M T R OW L ER comptronix K AA M P T R AA N IH K S compu K AA M P Y UW compuadd K AA M P Y UW AE D @@ -24087,9 +24096,9 @@ concomitant(2) K AA N K AH M IH T AH N T concomitantly K AA N K AA M AH T AH N T L IY concomitantly(2) K AA N K AH M IH T AH N T L IY concord K AA N K AO R D +concord(2) K AA N K ER D concord's K AA N K AO R D Z concord's(2) K AA N K ER D Z -concord(2) K AA N K ER D concorde K AA N K AO R D concourse K AA N K AO R S concourses K AA N K AO R S IH Z @@ -24203,9 +24212,9 @@ confectioners K AH N F EH K SH AH N ER Z confectionery K AH N F EH K SH AH N EH R IY confections K AH N F EH K SH AH N Z confederacy K AH N F EH D ER AH S IY +confederacy(2) K AH N F EH D R AH S IY confederacy's K AH N F EH D ER AH S IY Z confederacy's(2) K AH N F EH D R AH S IY Z -confederacy(2) K AH N F EH D R AH S IY confederate K AH N F EH D ER AH T confederate(2) K AH N F EH D ER EY T confederates K AH N F EH D ER AH T S @@ -24214,9 +24223,9 @@ confer K AH N F ER conferee K AA N F ER IY conferees K AA N F ER IY Z conference K AA N F ER AH N S +conference(2) K AA N F R AH N S conference's K AA N F ER AH N S IH Z conference's(2) K AA N F R AH N S IH Z -conference(2) K AA N F R AH N S conferences K AA N F ER AH N S AH Z conferences(2) K AA N F R AH N S AH Z conferencing K AA N F R AH N S IH NG @@ -24494,8 +24503,8 @@ connote K AH N OW T connotes K AH N OW T S conny K AA N IY conoco K AA N AH K OW -conoco's K AA N AH K OW Z conoco(2) K AH N AA K OW +conoco's K AA N AH K OW Z conolly K AA N OW L IY conoly K AA N OW L IY conover K AA N AH V ER @@ -24542,9 +24551,9 @@ conscripted K AH N S K R IH P T IH D conscription K AH N S K R IH P SH AH N conscripts K AA N S K R IH P T S conseco K AA N S EY K OW +conseco(2) K AH N S EY K OW conseco's K AA N S EY K OW Z conseco's(2) K AH N S EY K OW Z -conseco(2) K AH N S EY K OW consecrate K AA N S AH K R EY T consecrated K AA N S AH K R EY T IH D consecration K AA N S AH K R EY SH AH N @@ -24644,9 +24653,9 @@ consort K AH N S AO R T consortia K AH N S AO R SH AH consorting K AH N S AO R T IH NG consortium K AH N S AO R SH IY AH M +consortium(2) K AH N S AO R SH Y AH M consortium's K AH N S AO R SH IY AH M Z consortium's(2) K AH N S AO R SH Y AH M Z -consortium(2) K AH N S AO R SH Y AH M consortiums K AH N S AO R SH AH M Z consortiums(2) K AH N S AO R SH Y AH M Z conspicuous K AH N S P IH K Y UW AH S @@ -24849,8 +24858,8 @@ contento K AH N T EH N T OW contents K AA N T EH N T S contents(2) K AH N T EH N T S contest K AA N T EH S T -contest's K AA N T EH S T S contest(2) K AH N T EH S T +contest's K AA N T EH S T S contestable K AH N T EH S T AH B AH L contestant K AH N T EH S T AH N T contestants K AH N T EH S T AH N T S @@ -24870,8 +24879,8 @@ contiguous K AH N T IH G Y UW AH S continent K AA N T AH N AH N T continent's K AA N T AH N AH N T S continental K AA N T AH N EH N T AH L -continental's K AA N T AH N EH N T AH L Z continental(2) K AA N T AH N EH N AH L +continental's K AA N T AH N EH N T AH L Z continentally K AA N T AH N EH N T AH L IY continentally(2) K AA N T AH N EH N AH L IY continentals K AA N T AH N EH N T AH L Z @@ -24915,8 +24924,8 @@ contraception K AA N T R AH S EH P SH AH N contraceptive K AA N T R AH S EH P T IH V contraceptives K AA N T R AH S EH P T IH V Z contract K AA N T R AE K T -contract's K AA N T R AE K T S contract(2) K AH N T R AE K T +contract's K AA N T R AE K T S contracted K AA N T R AE K T AH D contracting K AA N T R AE K T IH NG contraction K AH N T R AE K SH AH N @@ -24949,8 +24958,8 @@ contrariness K AA N T R EH R IY N AH S contrary K AA N T R EH R IY contrary(2) K AH N T R EH R IY contras K AA N T R AH Z -contras' K AA N T R AH Z contras(2) K AO N T R AH Z +contras' K AA N T R AH Z contrast K AA N T R AE S T contrast(2) K AH N T R AE S T contrasted K AH N T R AE S T AH D @@ -25065,8 +25074,8 @@ conveying K AH N V EY IH NG conveyor K AH N V EY ER conveys K AH N V EY Z convict K AA N V IH K T -convict's K AA N V IH K T S convict(2) K AH N V IH K T +convict's K AA N V IH K T S convicted K AH N V IH K T AH D convicting K AH N V IH K T IH NG conviction K AH N V IH K SH AH N @@ -25234,9 +25243,9 @@ copelin K AA P IH L IH N copeman K OW P M AH N copen K OW P AH N copenhagen K OW P AH N HH EY G AH N +copenhagen(2) K OW P AH N HH AA G AH N copenhagen's K OW P AH N HH EY G AH N Z copenhagen's(2) K OW P AH N HH AA G AH N Z -copenhagen(2) K OW P AH N HH AA G AH N copenhaver K AH P EH N HH AH V ER copernican K AH P ER N AH K AH N copernicus K AH P ER N AH K AH S @@ -25550,13 +25559,13 @@ coroners K AO R AH N ER Z coronet K AO R AH N EH T coronets K AO R AH N EH T S corp K AO R P +corp(2) K AO R P ER EY SH AH N corp's K AO R P S corp's(2) K AO R P ER EY SH AH N Z -corp(2) K AO R P ER EY SH AH N corp. K AO R P +corp.(2) K AO R P ER EY SH AH N corp.'s K AO R P S corp.'s(2) K AO R P ER EY SH AH N Z -corp.(2) K AO R P ER EY SH AH N corpening K AO R P AH N IH NG corpora K AO R P ER AH corporacion K AO R P ER AA S IY OW N @@ -25574,8 +25583,8 @@ corporations' K AO R P ER EY SH AH N Z corporatism K AO R P ER AH T IH Z AH M corporatist K AO R P ER AH T IH S T corps K AO R -corps' K AO R Z corps(2) K AO R Z +corps' K AO R Z corpse K AO R P S corpses K AO R P S AH Z corpses(2) K AO R P S IH Z @@ -25885,8 +25894,8 @@ cottman K AA T M AH N cotto K OW T OW cottom K AA T AH M cotton K AA T AH N -cotton's K AA T AH N Z cotton(2) K AO T AH N +cotton's K AA T AH N Z cottone K OW T OW N IY cottoned K AA T AH N D cottongin K AH T AA NG JH IH N @@ -26072,9 +26081,9 @@ countryside K AH N T R IY S AY D countrywide K AH N T R IY W AY D counts K AW N T S county K AW N T IY +county(2) K AW N IY county's K AW N T IY Z county's(2) K AW N IY Z -county(2) K AW N IY coup K UW coupe K UW P couper K UW ER @@ -26611,8 +26620,8 @@ credibility K R EH D AH B IH L IH T IY credible K R EH D AH B AH L credibly K R EH D AH B L IY credit K R EH D AH T -credit's K R EH D IH T S credit(2) K R EH D IH T +credit's K R EH D IH T S creditable K R EH D AH T AH B AH L creditably K R EH D AH T AH B L IY creditanstalt K R EH D IH T AH N SH T AO L T @@ -26760,8 +26769,8 @@ crichlow K R IH K L OW crichton K R IH CH T AH N crick K R IH K cricket K R IH K AH T -cricket's K R IH K AH T S cricket(2) K R IH K IH T +cricket's K R IH K AH T S crickets K R IH K AH T S criddle K R IH D AH L crider K R AY D ER @@ -26851,6 +26860,7 @@ crispino K R IY S P IY N OW crisply K R IH S P L IY crispness K R IH S P N AH S crispo K R IY S P OW +crisps K R IH S P S crispy K R IH S P IY criss K R IH S criss-cross K R IH S K R AO S @@ -26867,9 +26877,9 @@ crista K R IH S T AH cristabel K R IH S T AH B EH L cristal K R IH S T AH L cristiani K R IH S T IY AA N IY +cristiani(2) K R IH S CH IY AA N IY cristiani's K R IH S T IY AA N IY Z cristiani's(2) K R IH S CH IY AA N IY Z -cristiani(2) K R IH S CH IY AA N IY cristiano K R IY S T IY AA N OW cristina K R IH S T IY N AH cristo K R IH S T OW @@ -27346,8 +27356,8 @@ cucci K UW CH IY cuccia K UW CH AH cuccio K UW CH IY OW cuckoo K AH K UW -cuckoo's K UW K UW Z cuckoo(2) K UW K UW +cuckoo's K UW K UW Z cuckoos K UW K UW Z cuco K UW K OW cucumber K Y UW K AH M B ER @@ -27560,9 +27570,9 @@ curated K Y UH R EY T IH D curative K Y UH R AH T IH V curatolo K UH R AA T OW L OW curator K Y UH R EY T ER +curator(2) K Y UH R AH T ER curator's K Y UH R EY T ER Z curator's(2) K Y UH R AH T ER Z -curator(2) K Y UH R AH T ER curatorial K Y UH R AH T AO R IY AH L curators K Y UH R AH T ER Z curators(2) K Y UH R EY T ER Z @@ -27631,9 +27641,9 @@ currency's K ER AH N S IY Z currencywatch K ER AH N S IY W AA CH currens K ER AH N Z current K ER AH N T -current's K ER AH N T S current(2) K ER N T current(3) K AA R AH N T +current's K ER AH N T S currently K ER AH N T L IY currents K ER AH N T S curreri K UH R EH R IY @@ -27650,9 +27660,9 @@ currin K AO R IH N currington K ER IH NG T AH N curro K UH R OW curry K AH R IY +curry(2) K ER IY curry's K AH R IY Z curry's(2) K ER IY Z -curry(2) K ER IY currying K ER IY IH NG currys K AH R IY Z currys(2) K ER IY Z @@ -27676,8 +27686,8 @@ curti K UH R T IY curtice K UH R T IH S curtin K ER T IH N curtis K ER T AH S -curtis' K ER T IH S curtis(2) K ER T IH S +curtis' K ER T IH S curtiss K ER T IH S curtly K ER T L IY curtner K ER T N ER @@ -27719,9 +27729,9 @@ cusip(2) K Y UW S IH P cusk K AH S K cusmano K UW S M AA N OW cuso K Y UW S OW +cuso(2) K UW S OW cuso's K Y UW S OW Z cuso's(2) K UW S OW Z -cuso(2) K UW S OW cusp K AH S P cuss K AH S cussed K AH S T @@ -27772,6 +27782,7 @@ cuthbertson K AH TH B ER T S AH N cuthrell K AH TH R AH L cuticle K Y UW T AH K AH L cuticle(2) K Y UW T IH K AH L +cutie K Y UW T IY cutillo K Y UW T IH L OW cutlass K AH T L AH S cutler K AH T L ER @@ -27911,8 +27922,8 @@ cypher S AY F ER cyphers S AY F ER Z cyphert S AY F ER T cypress S AY P R AH S -cypress's S AY P R AH S IH Z cypress(2) S AY P R IH S +cypress's S AY P R AH S IH Z cyprian S IH P R IY AH N cypriot S IH P R IY AH T cypriot(2) S IH P R IY AA T @@ -27930,9 +27941,9 @@ cyril S IH R AH L cyrilla S IH R IH L AH cyrillic S ER IH L IH K cyrix S AY R IH K S +cyrix(2) S IH R IH K S cyrix's S AY R IH K S IH Z cyrix's(2) S IH R IH K S IH Z -cyrix(2) S IH R IH K S cyrofin S AY R AH F IH N cyrus S AY R AH S cyst S IH S T @@ -27987,8 +27998,8 @@ d'alene's D AH L IY N Z d'alessandra D AE L EH S AE N D R AA d'alessandrini D AA L EH S AA N D R IY N IY d'alessandro D AA L EY Z AA N D R OW -d'alessandro's D AA L EH S AE N D R OW Z d'alessandro(2) D AA L EH S AE N D R OW +d'alessandro's D AA L EH S AE N D R OW Z d'alessi D AH L EH S IY d'alessi(2) D AH L EY S IY d'allest D AE L EH S T @@ -28018,6 +28029,7 @@ d'genetta D IY JH AH N EH T AH d'ivoire D IY V W AA R d'oeuvre D ER V d'oeuvres D ER V Z +d'olier D AH L IY ER d'or D AO R d'orsay D AO R S EY d's D IY Z @@ -28028,14 +28040,15 @@ d.'s D IY Z d.c. D IY S IY d.s D IY Z da D AA -da's D IY EY Z da(2) D IY EY +da's D IY EY Z daane D AA N daarmstadt D AA R M S T AA D daas D AA S dab D AE B dabah D AE B AH dabah(2) D AH B AA +dabber D AE B ER dabbing D AE B IH NG dabble D AE B AH L dabbled D AE B AH L D @@ -28173,8 +28186,8 @@ dailey D EY L IY dailies D EY L IY Z daily D EY L IY daimler D EY M L ER -daimler's D EY M L ER Z daimler(2) D EH M L ER +daimler's D EY M L ER Z daimones D EY M OW N Z dain D EY N daines D EY N Z @@ -28703,9 +28716,9 @@ dassow D AE S OW dastardly D AE S T ER D L IY dat D AE T data D EY T AH +data(2) D AE T AH data's D EY T AH Z data's(2) D AE T AH Z -data(2) D AE T AH database D EY T AH B EY S database(2) D AE T AH B EY S databases D EY T AH B EY S IH Z @@ -28724,9 +28737,9 @@ datagraphix D EY T AH G R AE F IH K S datametrics D EY T AH M EH T R IH K S datametrics(2) D AE T AH M EH T R IH K S datapoint D EY T AH P OY N T +datapoint(2) D AE T AH P OY N T datapoint's D EY T AH P OY N T S datapoint's(2) D AE T AH P OY N T S -datapoint(2) D AE T AH P OY N T datapoints D EY T AH P OY N T S datapoints(2) D AE T AH P OY N T S datapower D EY T AH P AW R @@ -28735,9 +28748,9 @@ dataproducts D EY T AH P R AA D AH K T S dataproducts' D EY T AH P R AO D AH K T S dataproducts'(2) D AE T AH P R AO D AH K T S dataquest D EY T AH K W EH S T +dataquest(2) D AE T AH K W EH S T dataquest's D EY T AH K W EH S T S dataquest's(2) D AE T AH K W EH S T S -dataquest(2) D AE T AH K W EH S T dataram D EY T ER AE M dataram(2) D AE T ER AE M datarex D EY T ER EH K S @@ -28760,9 +28773,9 @@ dato D AA T OW datron D AE T R AH N dats D AE T S datsun D AE T S AH N +datsun(2) D AA T S AH N datsun's D AE T S AH N Z datsun's(2) D AA T S AH N Z -datsun(2) D AA T S AH N dattilio D AA T IY L IY OW dattilo D AA T IY L OW datuk D AA T UW K @@ -28856,11 +28869,11 @@ davino D AA V IY N OW davio's D AE V IY OW Z davir D AH V IH R davis D EY V AH S +davis(2) D EY V IH S davis' D EY V AH S davis'(2) D EY V AH S AH Z davis's D EY V AH S AH Z davis's(2) D EY V IH S IH Z -davis(2) D EY V IH S davison D EY V IH S AH N davisson D AE V IH S AH N davitt D AH V IH T @@ -29018,9 +29031,9 @@ deana D IY AE N AH deanda D IY AE N D AH deandrade D AH N D R AA D IY deandrea D AE D R IY AH +deandrea(2) D IY AE D R EY AH deandrea's D AE D R IY AH Z deandrea's(2) D IY AE D R EY AH Z -deandrea(2) D IY AE D R EY AH deane D IY N deaner D IY N ER deangelis D IY AE N JH AH L AH S @@ -29145,9 +29158,9 @@ debono D IH B OW N OW debor D EH B AO R debora D EH B R AH deborah D EH B ER AH +deborah(2) D EH B R AH deborah's D EH B ER AH Z deborah's(2) D EH B R AH Z -deborah(2) D EH B R AH debord D IH B AO R D deborde D IH B AO R D debose D EH B AH S @@ -29187,9 +29200,9 @@ debunks D IH B AH NG K S debus D EH B IH S debusk D EH B AH S K debussy D IH B AH S IY +debussy(2) D IH B Y UW S IY debussy's D IH B AH S IY Z debussy's(2) D IH B Y UW S IY Z -debussy(2) D IH B Y UW S IY debut D EY B Y UW debutante D EH B Y AH T AA N T debutantes D EH B Y AH T AA N T S @@ -29957,12 +29970,12 @@ delectable D IH L EH K T AH B AH L delee D EH L IY deleeuw D EH L IY UW delegate D EH L AH G EY T -delegate's D EH L IH G AH T S delegate(2) D EH L AH G AH T +delegate's D EH L IH G AH T S delegated D EH L AH G EY T AH D delegates D EH L AH G EY T S -delegates' D EH L AH G EY T S delegates(2) D EH L AH G AH T S +delegates' D EH L AH G EY T S delegating D EH L AH G EY T IH NG delegation D EH L AH G EY SH AH N delegation's D EH L AH G EY SH AH N Z @@ -30124,9 +30137,9 @@ deloney D EH L AH N IY delong D AH L AO NG delora D EH L AO R AH delore D AH L AO R +delore(2) D AH L AO R IY delore's D AH L AO R Z delore's(2) D AH L AO R IY Z -delore(2) D AH L AO R IY delorean D AH L AO R IY AH N delorenzo D EH L AO R EH N Z OW delorenzo(2) D EY L AO R EH N Z OW @@ -30288,8 +30301,8 @@ demeo D IY M IY OW demeree D EH M ER IY demerger D IY M ER JH ER demerist D IH M ER IH S T -demerist's D IH M ER IH S T S demerist(2) D EH M ER IH S T +demerist's D IH M ER IH S T S demerit D IY M EH R AH T demerits D IY M EH R AH T S demeritt D EH M ER IH T @@ -30329,9 +30342,9 @@ demisch D AH M IH SH demise D IH M AY Z demish D EH M IH SH demjanjuk D EH M Y AA N Y UW K +demjanjuk(2) D EH M Y AE N Y UW K demjanjuk's D EH M Y AA N Y UW K S demjanjuk's(2) D EH M Y AE N Y UW K S -demjanjuk(2) D EH M Y AE N Y UW K demko D EH M K OW demler D EH M L ER demma D IY M AH @@ -30592,15 +30605,15 @@ dentine D EH N T IY N denting D EH N T IH NG dentino D IH N T IY N OW dentist D EH N T AH S T -dentist's D EH N T IH S T S dentist(2) D EH N T IH S T dentist(3) D EH N IH S T +dentist's D EH N T IH S T S dentistry D EH N T IH S T R IY dentistry(2) D EH N IH S T R IY dentists D EH N T AH S T S +dentists(2) D EH N T IH S T S dentists' D EH N T IH S T S dentists'(2) D EH N IH S T S -dentists(2) D EH N T IH S T S dentition D EH N T IH SH AH N dentler D EH N T L ER denton D EH N T AH N @@ -31348,9 +31361,9 @@ detritus D IH T R AY T AH S detritus(2) D EH T R AH T AH S detro D IY T R OW detroit D IH T R OY T +detroit(2) D IY T R OY T detroit's D AH T R OY T S detroit's(2) D IH T R OY T S -detroit(2) D IY T R OY T detroiters D AH T R OY T ER Z detroiters(2) D IY T R OY T ER Z detter D EH T ER @@ -31629,8 +31642,8 @@ dhole D OW L dhondt D HH AA N T dhows D AW Z di D IY -di's D AY Z di(2) D AY +di's D AY Z dia D IY AH diab D AY AH B diabase D AY AH B EY S @@ -31664,9 +31677,9 @@ diagrammed D AY AH G R AE M D diagrams D AY AH G R AE M Z diahann D AY AE N dial D AY AH L +dial(2) D AY L dial's D AY AH L Z dial's(2) D AY L Z -dial(2) D AY L dialect D AY AH L EH K T dialectic D AY AH L EH K T IH K dialectical D AY AH L EH K T IH K AH L @@ -31829,9 +31842,9 @@ dickmeyer D IH K M AY ER dicks D IH K S dickson D IH K S AH N dickstein D IH K S T AY N +dickstein(2) D IH K S T IY N dickstein's D IH K S T AY N Z dickstein's(2) D IH K S T IY N Z -dickstein(2) D IH K S T IY N dicky D IH K IY diclemente D IH K L AH M EH N T EY dicocco D IH K OW K OW @@ -31859,6 +31872,7 @@ dictum D IH K T AH M dicus D AY K AH S did D IH D didactic D AY D AE K T IH K +diddle D IH D AH L diddley D IH D L IY diddy D IH D IY didemeyer D IY D AH M AY ER @@ -32057,9 +32071,9 @@ digirolamo D IH JH IH R OW L AA M OW digit D IH JH AH T digit(2) D IH JH IH T digital D IH JH AH T AH L +digital(2) D IH JH IH T AH L digital's D IH JH AH T AH L Z digital's(2) D IH JH IH T AH L Z -digital(2) D IH JH IH T AH L digitalis D IH JH AH T AE L AH S digitally D IH JH AH T AH L IY digitech D IH JH AH T EH K @@ -32138,11 +32152,11 @@ dillahunt D IH L AH HH AH N T dillahunty D IH L AH HH AH N T IY dillan D IH L AH N dillard D IH L ER D +dillard(2) D IH L AA R D +dillard(3) D IH L AH D dillard's D IH L ER D Z dillard's(2) D IH L AA R D Z dillard's(3) D IH L AH D Z -dillard(2) D IH L AA R D -dillard(3) D IH L AH D dille D IH L dillehay D IH L IH HH EY dillen D IH L AH N @@ -32458,13 +32472,13 @@ directness(2) D IY R EH K N AH S directness(3) D AY R EH K N AH S directness(4) D IH R EH K N AH S director D ER EH K T ER +director(2) D AY R EH K T ER +director(3) D IY R EH K T ER +director(4) D IH R EH K T ER director's D AY R EH K T ER Z director's(2) D ER EH K T ER Z director's(3) D IY R EH K T ER Z director's(4) D IH R EH K T ER Z -director(2) D AY R EH K T ER -director(3) D IY R EH K T ER -director(4) D IH R EH K T ER directoral D ER EH K T ER AH L directorate D ER EH K T ER AH T directorate(2) D AY R EH K T ER AH T @@ -32479,12 +32493,12 @@ directories(2) D ER EH K T ER IY Z directories(3) D IY R EH K T ER IY Z directories(4) D IH R EH K T ER IY Z directors D ER EH K T ER Z -directors' D IH R EH K T ER Z -directors'(2) D ER EH K T ER Z -directors'(3) D IY R EH K T ER Z directors(2) D AY R EH K T ER Z directors(3) D IY R EH K T ER Z directors(4) D IH R EH K T ER Z +directors' D IH R EH K T ER Z +directors'(2) D ER EH K T ER Z +directors'(3) D IY R EH K T ER Z directorship D ER EH K T ER SH IH P directorship(2) D AY R EH K T ER SH IH P directorship(3) D IY R EH K T ER SH IH P @@ -32739,9 +32753,9 @@ discoveries D IH S K AH V ER IY Z discovering D IH S K AH V ER IH NG discovers D IH S K AH V ER Z discovery D IH S K AH V ER IY +discovery(2) D IH S K AH V R IY discovery's D IH S K AH V ER IY Z discovery's(2) D IH S K AH V R IY Z -discovery(2) D IH S K AH V R IY discredit D IH S K R EH D AH T discredited D IH S K R EH D IH T IH D discrediting D IH S K R EH D AH T IH NG @@ -33531,8 +33545,8 @@ dockworkers D AA K W ER K ER Z dockyard D AA K Y AA R D docs D AA K S doctor D AA K T ER -doctor's D AA K T ER Z doctor(2) D AO K T ER +doctor's D AA K T ER Z doctoral D AA K T ER AH L doctorate D AA K T ER AH T doctorates D AA K T ER AH T S @@ -33543,8 +33557,8 @@ doctors' D AA K T ER Z doctrinaire D AA K T R AH N EH R doctrinal D AA K T R AH N AH L doctrine D AA K T R AH N -doctrine's D AA K T R AH N Z doctrine(2) D AO K T ER IH N +doctrine's D AA K T R AH N Z doctrines D AA K T R AH N Z docudrama D OW K AH D R AE M AH document D AA K Y AH M EH N T @@ -33662,8 +33676,8 @@ dogmatic(2) D AO G M AE T IH K dogmatically D AA G M AE T IH K L IY dogmatism D AA G M AH T IH Z AH M dogs D AA G Z -dogs' D AO G Z dogs(2) D AO G Z +dogs' D AO G Z dogwood D AO G W UH D dogwoods D AO G W UH D Z doh D OW @@ -33736,15 +33750,15 @@ doll D AA L doll's D AA L Z dollan D OW L AH N dollar D AA L ER +dollar(2) D AO L ER dollar's D AA L ER Z dollar's(2) D AA L AH Z dollar's(3) D AO L ER Z -dollar(2) D AO L ER dollard D AA L ER D dollarhide D AA L ER HH AY D dollars D AA L ER Z -dollars' D AA L ER Z dollars(2) D AO L ER Z +dollars' D AA L ER Z dolle D AA L dolled D AA L D dollens D AA L AH N Z @@ -33801,11 +33815,11 @@ domeier D AA M AY ER domek D OW M EH K domenech D AA M IH N IH K domenici D AH M EH N AH CH IY +domenici(2) D OW M IH N IY CH IY +domenici(3) D OW M EH N IY CH IY domenici's D AH M EH N AH CH IY Z domenici's(2) D OW M IH N IY CH IY Z domenici's(3) D OW M EH N IY CH IY Z -domenici(2) D OW M IH N IY CH IY -domenici(3) D OW M EH N IY CH IY domenick D AA M IH N IH K domenico D OW M EY N IY K OW domeniconi D OW M EH N IH K OW N IY @@ -33836,9 +33850,9 @@ dominee D OW M IH N EY domineer D AA M AH N IH R domineering D AA M AH N IH R IH NG dominelli D OW M IH N EH L IY +dominelli(2) D AA M IH N EH L IY dominelli's D OW M IH N EH L IY Z dominelli's(2) D AA M IH N EH L IY Z -dominelli(2) D AA M IH N EH L IY dominey D AA M IH N IY domingo D OW M IH NG G OW domingo(2) D AH M IH NG G OW @@ -33863,8 +33877,8 @@ dominion's D AH M IH N Y AH N Z dominions D AH M IH N Y AH N Z dominique D AO M IH N IY K domino D AA M AH N OW -domino's D AA M IH N OW Z domino(2) D AA M IH N OW +domino's D AA M IH N OW Z dominoes D AA M AH N OW Z dominos D AA M IH N OW Z dominquez D OW M IY N K W EH Z @@ -33969,13 +33983,13 @@ donned D AA N D donnell D AA N IH L donnellan D AA N IH L AE N donnelley D AA N AH L IY +donnelley(2) D AA N EH L IY donnelley's D AA N AH L IY Z donnelley's(2) D AA N EH L IY Z -donnelley(2) D AA N EH L IY donnelly D AA N AH L IY +donnelly(2) D AA N EH L IY donnelly's D AA N AH L IY Z donnelly's(2) D AA N EH L IY Z -donnelly(2) D AA N EH L IY donner D AA N ER donnie D AA N IY donning D AA N IH NG @@ -33983,16 +33997,16 @@ donny D AA N IY donnybrook D AA N IY B R UH K donofrio D OW N OW F R IY OW donoghue D AA N AH HH Y UW +donoghue(2) D AA N AH Y UW donoghue's D AA N AH HH Y UW Z donoghue's(2) D AA N AH Y UW Z -donoghue(2) D AA N AH Y UW donoho D AA N AH HH OW donohoe D AA N AH HH OW donohoo D AA N AH HH UW donohue D AA N AH HH Y UW +donohue(2) D AA N AH Y UW donohue's D AA N AH HH Y UW Z donohue's(2) D AA N AH Y UW Z -donohue(2) D AA N AH Y UW donor D OW N ER donor's D OW N ER Z donors D OW N ER Z @@ -34144,9 +34158,9 @@ dorotea D AO R AH SH AH dorotea(2) D AO R AH T EY AH dorothea D AO R AH TH IY AH dorothy D AO R AH TH IY +dorothy(2) D AO R TH IY dorothy's D AO R AH TH IY Z dorothy's(2) D AO R TH IY Z -dorothy(2) D AO R TH IY dorough D AO R AW dorow D AO R OW dorr D AO R @@ -34705,8 +34719,8 @@ drexler D R EH K S L ER drey D R EY dreyer D R EY ER dreyfus D R AY F AH S -dreyfus's D R EY F AH S IH Z dreyfus(2) D R EY F AH S +dreyfus's D R EY F AH S IH Z dreyfuss D R EY F AH S dribbed D R IH B D dribble D R IH B AH L @@ -34889,6 +34903,7 @@ drug D R AH G drug's D R AH G Z drugan D R UW G AH N drugged D R AH G D +druggie D R AH G IY drugging D R AH G IH NG druggist D R AH G IH S T druggist's D R AH G AH S T S @@ -34990,9 +35005,9 @@ dubcek(2) D UW B CH EH K dube D UW B dubeau D AH B OW duberstein D UW B ER S T AY N +duberstein(2) D UW B ER S T IY N duberstein's D UW B ER S T AY N Z duberstein's(2) D UW B ER S T IY N Z -duberstein(2) D UW B ER S T IY N dubey D AH B IY dubhi D UW B IY dubicki D AH B IH T S K IY @@ -35937,13 +35952,13 @@ eastgroup IY S T G R UW P eastham IY S T AH M eastin IY Z T IH N eastland IY S T L AH N D +eastland(2) IY S T L AE N D +eastland(3) IY S L AH N D +eastland(4) IY S L AE N D eastland's IY S T L AH N D Z eastland's(2) IY S T L AE N D Z eastland's(3) IY S L AH N D Z eastland's(4) IY S L AE N D Z -eastland(2) IY S T L AE N D -eastland(3) IY S L AH N D -eastland(4) IY S L AE N D eastlick IY S T L IH K eastman IY S T M AH N eastmet IY S T M EH T @@ -36089,9 +36104,9 @@ eck EH K eckard EH K ER D eckard(2) EH K HH AA R D eckardt EH K ER T +eckardt(2) EH K HH AA R T eckardt's EH K ER T S eckardt's(2) EH K HH AA R T S -eckardt(2) EH K HH AA R T eckart EH K AA R T eckberg EH K B ER G eckel EH K AH L @@ -36178,16 +36193,16 @@ economics(2) IY K AH N AA M IH K S economies IH K AA N AH M IY Z economies(2) IY K AA N AH M IY Z economist IH K AA N AH M IH S T +economist(2) IY K AA N AH M IH S T economist's IH K AA N AH M IH S T S economist's(2) IY K AA N AH M IH S T S economist's(3) IH K AA N AH M IH S economist's(4) IY K AA N AH M IH S -economist(2) IY K AA N AH M IH S T economists IH K AA N AH M IH S T S -economists' IH K AA N AH M IH S T S -economists'(2) IY K AA N AH M IH S T S economists(2) IH K AA N AH M IH S economists(3) IY K AA N AH M IH S +economists' IH K AA N AH M IH S T S +economists'(2) IY K AA N AH M IH S T S economize IH K AA N AH M AY Z economize(2) IY K AA N AH M AY Z economizes IH K AA N AH M AY Z AH Z @@ -36197,9 +36212,9 @@ economizing(2) IY K AA N AH M AY Z IH NG economos EH K AH N OW M OW Z economou EH K OW N OW M UW economy IH K AA N AH M IY +economy(2) IY K AA N AH M IY economy's IH K AA N AH M IY Z economy's(2) IY K AA N AH M IY Z -economy(2) IY K AA N AH M IY econships IY K AA N SH IH P S ecosystem IY K OW S IH S T AH M ecosystems IY K OW S IH S T AH M Z @@ -36242,9 +36257,9 @@ edelen EH D AH L AH N edeline EH D IH L AY N edell IH D EH L edelman EH D AH L M AH N +edelman(2) EY D AH L M AH N edelman's EH D AH L M AH N Z edelman's(2) EY D AH L M AH N Z -edelman(2) EY D AH L M AH N edelmann EH D AH L M AH N edelmar EH D IH L M ER edelson EH D IH L S AH N @@ -36319,12 +36334,12 @@ edithe EH D IH DH editing EH D AH T IH NG editing(2) EH D IH T IH NG edition AH D IH SH AH N -edition's IH D IH SH AH N Z edition(2) IH D IH SH AH N +edition's IH D IH SH AH N Z editions IH D IH SH AH N Z editor EH D AH T ER -editor's EH D IH T ER Z editor(2) EH D IH T ER +editor's EH D IH T ER Z editorial EH D AH T AO R IY AH L editorial's EH D AH T AO R IY AH L Z editorialist EH D AH T AO R IY AH L IH S T @@ -36402,9 +36417,9 @@ educates(4) EH JH Y UW K EY T S educating EH JH AH K EY T IH NG educating(2) EH JH Y UW K EY T IH NG education EH JH AH K EY SH AH N +education(2) EH JH Y UW K EY SH AH N education's EH JH AH K EY SH AH N Z education's(2) EH JH Y UW K EY SH AH N Z -education(2) EH JH Y UW K EY SH AH N educational EH JH AH K EY SH AH N AH L educational(2) EH JH Y UW K EY SH AH N AH L educationally EH JH AH K EY SH AH N AH L IY @@ -36580,9 +36595,9 @@ egregiously IH G R IY JH AH S L IY egress IH G R EH S egret EH G R AH T egypt IY JH AH P T +egypt(2) IY JH IH P T egypt's IY JH AH P T S egypt's(2) IY JH IH P T S -egypt(2) IY JH IH P T egyptair IY JH IH P T EH R egyptian IH JH IH P SH AH N egyptians IH JH IH P SH AH N Z @@ -36774,9 +36789,9 @@ ejection IH JH EH K SH AH N ejects IH JH EH K T S ejects(2) IH JH EH K S ejup IY JH AH P +ejup(2) IY JH UW P ejup's IY JH AH P S ejup's(2) IY JH UW P S -ejup(2) IY JH UW P ek EH K ek(2) IY K EY eka EH K AH @@ -36817,11 +36832,11 @@ elaborating IH L AE B ER EY T IH NG elaboration IH L AE B ER EY SH AH N elaina IH L EY N AH elaine IH L EY N +elaine(2) AH L EY N +elaine(3) IY L EY N elaine's AH L EY N Z elaine's(2) IY L EY N Z elaine's(3) IH L EY N Z -elaine(2) AH L EY N -elaine(3) IY L EY N elaire IH L EY R elam EH L AH M elamin EH L AH M IH N @@ -36893,9 +36908,9 @@ eldridge EH L D R IH JH eldritch EH L D R IH CH eldwin IH L D W IH N eleanor EH L AH N AO R +eleanor(2) EH L AH N ER eleanor's EH L AH N AO R Z eleanor's(2) EH L AH N ER Z -eleanor(2) EH L AH N ER eleanora EH L AH N AO R AH eleanore EH L AH N AO R eleazer EH L AH Z ER @@ -36917,8 +36932,8 @@ electives IH L EH K T IH V Z elector IH L EH K T ER electoral IH L EH K T ER AH L electorate IH L EH K T ER AH T -electorate's IH L EH K T ER AH T S electorate(2) IH L EH K T R IH T +electorate's IH L EH K T ER AH T S electorates IH L EH K T ER AH T S electors IH L EH K T ER Z electra IH L EH K T R AH @@ -37006,8 +37021,8 @@ elementary(2) EH L AH M EH N T ER R IY elementary(3) EH L AH M EH N CH R IY elements EH L AH M AH N T S elena EH L AH N AA -elena's EH L AH N AH Z elena(2) EH L EY N AA +elena's EH L AH N AH Z elenbaas EH L IH N B AA Z elene EH L IY N elenore EH L IH N ER @@ -37029,9 +37044,9 @@ elevations EH L AH V EY SH AH N Z elevator EH L AH V EY T ER elevators EH L AH V EY T ER Z eleven IH L EH V AH N +eleven(2) IY L EH V AH N eleven's IH L EH V AH N Z eleven's(2) IY L EH V AH N Z -eleven(2) IY L EH V AH N elevens IH L EH V AH N Z elevens(2) IY L EH V AH N Z eleventh IH L EH V AH N TH @@ -37097,9 +37112,9 @@ eliot EH L IY AH T eliot's EH L IY AH T S eliott EH L IY AA T elisa AH L IY S AH +elisa(2) AH L IY Z AH elisa's AH L IY S AH Z elisa's(2) AH L IY Z AH Z -elisa(2) AH L IY Z AH elisabeth IH L IH Z AH B IH TH elise AH L IY S elish EH L IH SH @@ -37119,8 +37134,8 @@ elitists(2) IH L IY T IH S T S elixir IH L IH K S ER eliza IH L AY Z AH elizabeth IH L IH Z AH B AH TH -elizabeth's IH L IH Z AH B AH TH S elizabeth(2) IH L IH Z AH B IH TH +elizabeth's IH L IH Z AH B AH TH S elizabethan EH L IH Z AH B IY TH AH N elizabethtown AH L IH Z AH B EH TH T AW N elizalde EH L IY Z AA L D IY @@ -37284,9 +37299,9 @@ elser EH L S ER elses EH L S IH Z elsesser EH L S IH S ER elsevier EH L S EH V Y ER +elsevier(2) EH L S AH V IH R elsevier's EH L S EH V Y ER Z elsevier's(2) EH L S AH V IH R Z -elsevier(2) EH L S AH V IH R elsewhere EH L S W EH R elsey EH L S IY elsie EH L S IY @@ -37567,9 +37582,9 @@ emir(2) EY M IH R emirate EH M ER AH T emirate(2) EH M ER EY T emirates EH M ER AH T S +emirates(2) EH M ER EY T S emirates' EH M ER AH T S emirates'(2) EH M ER EY T S -emirates(2) EH M ER EY T S emison EH M IH S AH N emissaries EH M AH S EH R IY Z emissary EH M AH S EH R IY @@ -37674,20 +37689,20 @@ employable EH M P L OY AH B AH L employed EH M P L OY D employed(2) IH M P L OY D employee EH M P L OY IY +employee(2) IH M P L OY IY employee's EH M P L OY IY Z employee's(2) IH M P L OY IY Z -employee(2) IH M P L OY IY employees EH M P L OY IY Z -employees' EH M P L OY IY Z employees(2) IH M P L OY IY Z +employees' EH M P L OY IY Z employer EH M P L OY ER +employer(2) IH M P L OY ER employer's EH M P L OY ER Z employer's(2) IH M P L OY ER Z -employer(2) IH M P L OY ER employers EH M P L OY ER Z +employers(2) IH M P L OY ER Z employers' EH M P L OY ER Z employers'(2) IH M P L OY ER Z -employers(2) IH M P L OY ER Z employing EH M P L OY IH NG employing(2) IH M P L OY IH NG employment EH M P L OY M AH N T @@ -38080,8 +38095,8 @@ engesser EH NG G IH S ER engh EH NG engholm EH NG HH OW L M engine EH N JH AH N -engine's EH N JH AH N Z engine(2) IH N JH AH N +engine's EH N JH AH N Z engined EH N JH AH N D engineer EH N JH AH N IH R engineer's EH N JH AH N IY R Z @@ -38103,9 +38118,9 @@ englehardt IH NG AH L HH AA R T englehart IH NG AH L HH AA R T engleman IH NG AH L M AH N engler EH NG G AH L ER +engler(2) EH NG G L ER engler's EH NG G AH L ER Z engler's(2) EH NG G L ER Z -engler(2) EH NG G L ER englert IH NG L ER T englerth IH NG L ER TH engles IH NG AH L Z @@ -38240,9 +38255,9 @@ enormously IH N AO R M AH S L IY enormously(2) IY N AO R M AH S L IY enos IY N AH S enough IH N AH F +enough(2) IY N AH F enough's IH N AH F S enough's(2) IY N AH F S -enough(2) IY N AH F enqueso EH N K W EH S OW enquire IH N K W AY ER enquirer IH N K W AY R ER @@ -38363,15 +38378,15 @@ enterline's EH N T ER L AY N Z enterococcus EH N T ER AH K AO K AH S enterology EH N T ER AA L AH JH IY enterprise EH N T ER P R AY Z +enterprise(2) EH N ER P R AY Z enterprise's EH N T ER P R AY Z AH Z enterprise's(2) EH N T ER P R AY Z IH Z enterprise's(3) EH N ER P R AY Z AH Z enterprise's(4) EH N ER P R AY Z IH Z -enterprise(2) EH N ER P R AY Z enterprises EH N T ER P R AY Z IH Z +enterprises(2) EH N ER P R AY Z IH Z enterprises' EH N T ER P R AY Z IH Z enterprises'(2) EH N ER P R AY Z IH Z -enterprises(2) EH N ER P R AY Z IH Z enterprising EH N T ER P R AY Z IH NG enterprising(2) EH N ER P R AY Z IH NG enterra EH N T EH R AH @@ -38382,17 +38397,17 @@ entertain(2) EH N ER T EY N entertained EH N T ER T EY N D entertained(2) EH N ER T EY N D entertainer EH N T ER T EY N ER +entertainer(2) EH N ER T EY N ER entertainer's EH N T ER T EY N ER Z entertainer's(2) EH N ER T EY N ER Z -entertainer(2) EH N ER T EY N ER entertainers EH N T ER T EY N ER Z entertainers(2) EH N ER T EY N ER Z entertaining EH N T ER T EY N IH NG entertaining(2) EH N ER T EY N IH NG entertainment EH N T ER T EY N M AH N T +entertainment(2) EH N ER T EY N M AH N T entertainment's EH N T ER T EY N M AH N T S entertainment's(2) EH N ER T EY N M AH N T S -entertainment(2) EH N ER T EY N M AH N T entertainments EH N T ER T EY N M AH N T S entertainments(2) EH N ER T EY N M AH N T S entertains EH N T ER T EY N Z @@ -38428,8 +38443,8 @@ entitles EH N T AY T AH L Z entitling EH N T AY T AH L IH NG entitling(2) EH N T AY T L IH NG entity EH N T AH T IY -entity's EH N T AH T IY Z entity(2) EH N T IH T IY +entity's EH N T AH T IY Z entler EH N T L ER entoffen EH N T AH F AH N entoffen's EH N T AH F AH N Z @@ -38469,8 +38484,8 @@ entrenches EH N T R EH N CH IH Z entrenching EH N T R EH N CH IH NG entrenchment EH N T R EH N CH M AH N T entrepreneur AA N T R AH P R AH N ER -entrepreneur's AA N T R AH P R AH N ER Z entrepreneur(2) AA N T R AH P R AH N UH R +entrepreneur's AA N T R AH P R AH N ER Z entrepreneurial AA N T R AH P R AH N ER IY AH L entrepreneurialism EH N T R AH P R AH N UW R IY AH L IH Z AH M entrepreneurs AA N T R AH P R AH N ER Z @@ -38522,11 +38537,11 @@ environmentalism(2) EH N V AY R AH N M EH N AH L IH Z AH M environmentalist IH N V AY R AH N M EH N T AH L IH S T environmentalist(2) IH N V AY R AH N M EH N AH L IH S T environmentalists EH N V AY R AH N M EH N T AH L IH S T S -environmentalists' IH N V AY R AH N M EH N T AH L IH S T S -environmentalists'(2) EH N V AY R AH N M EH N AH L IH S T S environmentalists(2) EH N V AY R AH N M EH N AH L IH S T S environmentalists(3) EH N V AY R AH N M EH N T AH L IH S environmentalists(4) EH N V AY R AH N M EH N AH L IH S +environmentalists' IH N V AY R AH N M EH N T AH L IH S T S +environmentalists'(2) EH N V AY R AH N M EH N AH L IH S T S environmentally IH N V AY R AH N M EH N T AH L IY environmentally(2) IH N V AY R AH N M EH N AH L IY environments IH N V AY R AH N M AH N T S @@ -38721,8 +38736,8 @@ equipped IH K W IH P T equipping IH K W IH P IH NG equips IH K W IH P S equitable EH K W AH T AH B AH L -equitable's EH K W AH T AH B AH L Z equitable(2) EH K W IH T AH B AH L +equitable's EH K W AH T AH B AH L Z equitably EH K W IH T AH B L IY equitas EH K W AH T AH S equitation EH K W AH T EY SH AH N @@ -38743,9 +38758,9 @@ equivocating IH K W IH V AH K EY T IH NG equivocation IH K W IH V AH K EY SH AH N er ER era EH R AH +era(2) IH R AH era's EH R AH Z era's(2) IH R AH Z -era(2) IH R AH eradicable IH R AE D AH K AH B AH L eradicate IH R AE D AH K EY T eradicated IH R AE D AH K EY T IH D @@ -38887,8 +38902,8 @@ erna ER N AH ernaline ER N AH L AY N erne ER N ernest ER N AH S T -ernest's ER N AH S T S ernest(2) ER N IH S T +ernest's ER N AH S T S ernestine ER N IH S T IY N ernesto ER N EH S T OW ernests ER N AH S T S @@ -39024,6 +39039,7 @@ escaping IH S K EY P IH NG escapism IH S K EY P IH Z AH M escarcega EH S K AA R CH EH G AH escareno EH S K AA R EH N OW +escargot EH S K AA R G OW escarpment EH S K AA R P M AH N T escarpments EH S K AA R P M AH N T S esch EH SH @@ -39045,9 +39061,9 @@ eschews EH S CH UW Z eschmann EH SH M AH N esco EH S K OW escobar EH S K OW B AA R +escobar(2) EH S K AH B AA R escobar's EH S K OW B AA R Z escobar's(2) EH S K AH B AA R Z -escobar(2) EH S K AH B AA R escobedo EH S K OW B EY D OW escoe IH S K OW escondido EH S K AA N D IY D OW @@ -39495,16 +39511,16 @@ eustacia Y UW S T AA CH AH eustice Y UW S T IH S eustis Y UW S T AH S euthanasia Y UW TH AH N EY ZH AH -euthanasia's Y UW TH AH N EY ZH AH Z euthanasia(2) Y UW TH AH N EY ZH Y AH +euthanasia's Y UW TH AH N EY ZH AH Z euthanize Y UW TH AH N AY Z eutsey Y UW T S IY eutsler Y UW T S L ER ev EH V eva EY V AH +eva(2) IY V AH eva's EY V AH Z eva's(2) IY V AH Z -eva(2) IY V AH evacuate IH V AE K Y AH EY T evacuate(2) IY V AE K Y AH EY T evacuated IH V AE K Y AH W EY T IH D @@ -39623,9 +39639,9 @@ evensen EH V IH N S AH N evensky IY V EH N S K IY evenson EH V IH N S AH N event IH V EH N T +event(2) IY V EH N T event's IH V EH N T S event's(2) IY V EH N T S -event(2) IY V EH N T eventful IH V EH N T F AH L eventful(2) IY V EH N T F AH L events IH V EH N T S @@ -39646,9 +39662,9 @@ everding EH V ER D IH NG eveready EH V ER R EH D IY evered EH V ER D everest EH V ER AH S T +everest(2) EH V R AH S T everest's EH V ER AH S T S everest's(2) EH V R AH S T S -everest(2) EH V R AH S T everett EH V ER AH T everett(2) EH V R AH T everette EH V ER EH T @@ -39899,8 +39915,8 @@ exchanged IH K S CH EY N JH D exchanger IH K S CH EY N JH ER exchangers IH K S CH EY N JH ER Z exchanges IH K S CH EY N JH AH Z -exchanges' EH K S CH EY N JH IH Z exchanges(2) IH K S CH EY N JH IH Z +exchanges' EH K S CH EY N JH IH Z exchanging IH K S CH EY N JH IH NG exchequer EH K S CH EH K ER excimer EH K S IH M ER @@ -40114,9 +40130,9 @@ expands IH K S P AE N D Z expanse IH K S P AE N S expanses IH K S P AE N S IH Z expansion IH K S P AE N SH AH N +expansion(2) IH K S P AE N CH AH N expansion's IH K S P AE N SH AH N Z expansion's(2) IH K S P AE N CH AH N Z -expansion(2) IH K S P AE N CH AH N expansionary IH K S P AE N SH AH N EH R IY expansionary(2) IH K S P AE N CH AH N EH R IY expansionism IH K S P AE N SH AH N IH Z AH M @@ -40235,9 +40251,9 @@ exploitive IH K S P L OY T IH V exploitive(2) EH K S P L OY T IH V exploits EH K S P L OY T S exploration EH K S P L ER EY SH AH N +exploration(2) EH K S P L AO R EY SH AH N exploration's EH K S P L ER EY SH AH N Z exploration's(2) EH K S P L AO R EY SH AH N Z -exploration(2) EH K S P L AO R EY SH AH N explorations EH K S P L ER EY SH AH N Z explorations(2) EH K S P L AO R EY SH AH N Z exploratory IH K S P L AO R AH T AO R IY @@ -40822,8 +40838,8 @@ falklands F AO K L AH N D Z falkner F AO K N ER falkowski F AH L K AO F S K IY fall F AO L -fall's F AO L Z fall(2) F AA L +fall's F AO L Z falla F AE L AH fallacies F AE L AH S IY Z fallacious F AH L EY SH AH S @@ -40891,12 +40907,12 @@ familiarity F AH M IH L Y EH R AH T IY familiarize F AH M IH L Y ER AY Z familiarized F AH M IH L Y ER AY Z D families F AE M AH L IY Z -families' F AE M AH L IY Z families(2) F AE M L IY Z +families' F AE M AH L IY Z family F AE M AH L IY +family(2) F AE M L IY family's F AE M AH L IY Z family's(2) F AE M L IY Z -family(2) F AE M L IY famine F AE M AH N famines F AE M AH N Z famished F AE M IH SH T @@ -41451,9 +41467,9 @@ feb F EH B Y AH W EH R IY febles F EH B AH L Z febres F EH B R AH S february F EH B Y AH W EH R IY +february(2) F EH B R UW EH R IY february's F EH B Y AH W EH R IY Z february's(2) F EH B R UW EH R IY Z -february(2) F EH B R UW EH R IY fecal F IY K AH L feces F IY S IY Z fecher F EH K ER @@ -41477,9 +41493,9 @@ fedele F EH D AH L fedeli F EH D EH L IY feder F EH D ER federal F EH D ER AH L +federal(2) F EH D R AH L federal's F EH D ER AH L Z federal's(2) F EH D R AH L Z -federal(2) F EH D R AH L federalism F EH D ER AH L IH Z AH M federalism(2) F EH D R AH L IH Z AH M federalist F EH D ER AH L IH S T @@ -41597,9 +41613,9 @@ feild F IY L D feiler F AY L ER feimster F AY M S T ER fein F AY N +fein(2) F EY N fein's F AY N Z fein's(2) F EY N Z -fein(2) F EY N feinauer F AY N AW ER feinberg F AY N B ER G feiner F AY N ER @@ -41607,9 +41623,9 @@ feinerman F AY N ER M AH N feingold F AY NG G OW L D feinman F AY N M AH N feinstein F AY N S T AY N +feinstein(2) F AY N S T IY N feinstein's F AY N S T AY N Z feinstein's(2) F AY N S T IY N Z -feinstein(2) F AY N S T IY N feint F EY N T feis F AY S feist F AY S T @@ -41648,9 +41664,9 @@ feldpausch F EH L D P AW SH feldspar F EH L D S P AA R feldspars F EH L D S P AA R Z feldstein F EH L D S T AY N +feldstein(2) F EH L D S T IY N feldstein's F EH L D S T IY N Z feldstein's(2) F EH L D S T AY N Z -feldstein(2) F EH L D S T IY N feldt F EH L T felgenhauer F EH L G IH N HH AW ER felger F EH L G ER @@ -41659,9 +41675,9 @@ felicetti F EH L IY CH EH T IY felicia F AH L IY SH AH felicia's F AH L IY SH AH Z feliciano F AH L IY S IY AA N OW +feliciano(2) F AH L IY SH IY AA N OW feliciano's F AH L IY S IY AA N OW Z feliciano's(2) F AH L IY SH IY AA N OW Z -feliciano(2) F AH L IY SH IY AA N OW felicitate F AH L IH S IH T EY T felicite F EH L IH S AY T felicite(2) F EH L IH S AH T IY @@ -41858,9 +41874,9 @@ ferman F ER M AH N fermata F EH R M AA T AA ferment F ER M EH N T fermenta F ER M EH N T AH +fermenta(2) F ER M EH N AH fermenta's F ER M EH N T AH Z fermenta's(2) F ER M EH N AH Z -fermenta(2) F ER M EH N AH fermentation F ER M AH N T EY SH AH N fermented F ER M EH N T AH D fermenting F ER M EH N T IH NG @@ -41886,9 +41902,9 @@ fernandez(3) F ER N AA N D EH Z fernandez(4) F EH R N AA N D EH Z fernandina F ER N AH N D IY N AH fernando F ER N AE N D OW +fernando(2) F ER N AA N D OW fernando's F ER N AE N D OW Z fernando's(2) F ER N AA N D OW Z -fernando(2) F ER N AA N D OW fernao F ER N AW fernau F ER N AW fernbank F ER N B AE NG K @@ -42024,8 +42040,8 @@ festered F EH S T ER D festering F EH S T ER IH NG festiva F EH S T IY V AH festival F EH S T AH V AH L -festival's F EH S T IH V AH L Z festival(2) F EH S T IH V AH L +festival's F EH S T IH V AH L Z festivals F EH S T AH V AH L Z festivals(2) F EH S T IH V AH L Z festive F EH S T IH V @@ -42182,9 +42198,9 @@ fidder F IH D ER fiddle F IH D AH L fiddled F IH D AH L D fiddler F IH D AH L ER +fiddler(2) F IH D L ER fiddler's F IH D AH L ER Z fiddler's(2) F IH D L ER Z -fiddler(2) F IH D L ER fiddlers F IH D AH L ER Z fiddlers(2) F IH D L ER Z fiddles F IH D AH L Z @@ -42197,8 +42213,8 @@ fidelcor F IH D AH L K AO R fidelia F IH D IY L Y AH fidelities F AH D EH L AH T IY Z fidelity F AH D EH L AH T IY -fidelity's F AH D EH L AH T IY Z fidelity(2) F AY D EH L AH T IY +fidelity's F AH D EH L AH T IY Z fidenas F IH D IH N AH S fides F AY D Z fidget F IH JH IH T @@ -42483,10 +42499,10 @@ financer(2) F IH N AE N S ER finances F IH N AE N S IH Z finances(2) F AY N AE N S IH Z financial F AH N AE N SH AH L -financial's F AY N AE N SH AH L Z -financial's(2) F IH N AE N SH AH L Z financial(2) F IH N AE N SH AH L financial(3) F AY N AE N SH AH L +financial's F AY N AE N SH AH L Z +financial's(2) F IH N AE N SH AH L Z financially F AH N AE N SH AH L IY financially(2) F IH N AE N SH AH L IY financially(3) F AY N AE N SH AH L IY @@ -42600,9 +42616,9 @@ finkel F IH NG K AH L finkelman F IH NG K AH L M AH N finkelson F IH NG K AH L S AH N finkelstein F IH NG K AH L S T IY N +finkelstein(2) F IH NG K AH L S T AY N finkelstein's F IH NG K AH L S T IY N Z finkelstein's(2) F IH NG K AH L S T AY N Z -finkelstein(2) F IH NG K AH L S T AY N finken F IH NG K AH N finkenbinder F IH NG K IH N B IH N D ER finkielstain F IH NG K IY L S T IH N @@ -42613,8 +42629,8 @@ finkler F IH NG K L ER finkley F IH NG K L IY finks F IH NG K S finland F IH N L AE N D -finland's F IH N L AH N D Z finland(2) F IH N L AH N D +finland's F IH N L AH N D Z finlandization F IH N L AE N D IH Z EY SH AH N finlay F IH N L IY finlayson F IH N L IY S AH N @@ -42674,8 +42690,8 @@ fipple F IH P AH L fipps F IH P S fir F ER fire F AY ER -fire's F AY ER Z fire(2) F AY R +fire's F AY ER Z fire-men F AY R M AH N firearm F AY ER AA R M firearm(2) F AY R AA R M @@ -42713,6 +42729,8 @@ firefly F AY ER F L AY firefox F AY ER F AO K S firehouse F AY ER HH AW S firehouses F AY ER HH AW S IH Z +firelighter F AY ER L AY T ER +firelighters F AY ER L AY T ER Z fireman F AY R M AH N fireman's F AY R M AH N Z firemen F AY R M AH N @@ -42821,8 +42839,8 @@ fisher F IH SH ER fisher's F IH SH ER Z fisheries F IH SH ER IY Z fisherman F IH SH ER M AE N -fisherman's F IH SH ER M AH N Z fisherman(2) F IH SH ER M AH N +fisherman's F IH SH ER M AH N Z fishermen F IH SH ER M IH N fishers F IH SH ER Z fishery F IH SH ER IY @@ -43196,11 +43214,11 @@ fleischmann F L AY SH M AH N fleisher F L AY SH ER fleishman F L AY SH M AH N fleiss F L AY SH +fleiss(2) F L AY S fleiss' F L AY SH fleiss'(2) F L AY S fleiss's F L AY SH IH Z fleiss's(2) F L AY S IH Z -fleiss(2) F L AY S fleissner F L AY S N ER fleitas F L AY T AH S fleming F L EH M IH NG @@ -43395,12 +43413,12 @@ floria F L AO R IY AH florian F L AO R IY AH N florid F L AO R AH D florida F L AO R AH D AH -florida's F L AO R IH D AH Z -florida's(2) F L AA R IH D AH Z -florida's(3) F L AO R AH D AH Z florida(2) F L AO R IH D AH florida(3) F L AA R AH D AH florida(4) F L AA R IH D AH +florida's F L AO R IH D AH Z +florida's(2) F L AA R IH D AH Z +florida's(3) F L AO R AH D AH Z floridabanc F L AO R AH D AH B AE NG K floridian F L AO R IH D IY AH N floridians F L AO R IH D IY AH N Z @@ -43972,13 +43990,13 @@ foreigner(2) F AA R AH N ER foreigner(3) F AO R N ER foreigner(4) F AA R N ER foreigners F AO R AH N ER Z +foreigners(2) F AA R AH N ER Z +foreigners(3) F AO R N ER Z +foreigners(4) F AA R N ER Z foreigners' F AO R AH N ER Z foreigners'(2) F AA R AH N ER Z foreigners'(3) F AO R N ER Z foreigners'(4) F AA R N ER Z -foreigners(2) F AA R AH N ER Z -foreigners(3) F AO R N ER Z -foreigners(4) F AA R N ER Z forelimb F AO R L IH M forelimbs F AO R L IH M Z foreman F AO R M AH N @@ -44009,8 +44027,8 @@ foresight F AO R S AY T foreskin F OW R S K IH N foresman F AO R S M AH N forest F AO R AH S T -forest's F AO R AH S T S forest(2) F AO R IH S T +forest's F AO R AH S T S foresta F AO R S T AH forestall F AO R S T AO L forestalled F AO R S T AA L D @@ -44147,9 +44165,9 @@ former F AO R M ER formerly F AO R M ER L IY formic F AO R M IH K formica F AO R M AY K AH +formica(2) F ER M AY K AH formica's F AO R M AY K AH Z formica's(2) F ER M AY K AH Z -formica(2) F ER M AY K AH formidable F AO R M AH D AH B AH L formidable(2) F AO R M IH D AH B AH L formidably F AO R M AH D AH B L IY @@ -44238,9 +44256,9 @@ forthrightness F AO R TH R AY T N AH S forthwith F AO R TH W IH TH forti F AO R T IY fortier F AO R T IY ER +fortier(2) F AO R T Y ER fortier's F AO R T IY ER Z fortier's(2) F AO R T Y ER Z -fortier(2) F AO R T Y ER forties F AO R T IY Z fortieth F AO R T IY IH TH fortification F AO R T AH F AH K EY SH AH N @@ -44276,9 +44294,9 @@ fortunately(2) F AO R CH UW N AH T L IY fortunato F AO R T UW N AA T OW fortunato(2) F AO R CH UW N AA T OW fortune F AO R CH AH N +fortune(2) F AO R CH UW N fortune's F AO R CH AH N Z fortune's(2) F AO R CH UW N Z -fortune(2) F AO R CH UW N fortunes F AO R CH AH N Z fortunes(2) F AO R CH UW N Z fortuny F AO R CH UW N IY @@ -44559,9 +44577,9 @@ francine F R AE N S IY N francine's F R AE N S IY N Z francines F R AE N S IY N Z francis F R AE N S AH S +francis(2) F R AE N S IH S francis' F R AE N S AH S francis'(2) F R AE N S IH S -francis(2) F R AE N S IH S franciscan F R AE N S IH S K AH N franciscans F R AE N S IH S K AH N Z francisco F R AE N S IH S K OW @@ -44607,9 +44625,9 @@ frankenfield F R AE NG K AH N F IY L D frankenfood F R AE NG K AH N F UW D frankenheimer F R AE NG K AH N HH AY M ER frankenstein F R AE NG K AH N S T AY N +frankenstein(2) F R AE NG K AH N S T IY N frankenstein's F R AE NG K AH N S T AY N Z frankenstein's(2) F R AE NG K AH N S T IY N Z -frankenstein(2) F R AE NG K AH N S T IY N frankfort F R AE NG K F ER T frankfort's F R AE NG K F ER T S frankfurt F R AE NG K F ER T @@ -44755,9 +44773,9 @@ fredenburg F R IY D AH N B ER G frederic F R EH D R IH K frederica F R EH D ER IY K AH frederick F R EH D R IH K +frederick(2) F R EH D ER IH K frederick's F R EH D R IH K S frederick's(2) F R EH D ER IH K S -frederick(2) F R EH D ER IH K fredericka F R EY D EH R IY K AH fredericks F R EH D R IH K S fredericksburg F R EH D R IH K S B ER G @@ -44880,9 +44898,9 @@ freidel F R AY D AH L freidman F R AY D M AH N freidman(2) F R IY D M AH N freidy F R IY D IY +freidy(2) F R AY D IY freidy's F R IY D IY Z freidy's(2) F R AY D IY Z -freidy(2) F R AY D IY freier F R EY ER freiermuth F R AY ER M UW TH freight F R EY T @@ -45035,9 +45053,9 @@ frictionless F R IH K SH AH N L AH S frictions F R IH K SH AH N Z frida F R IY D AH friday F R AY D IY +friday(2) F R AY D EY friday's F R AY D IY Z friday's(2) F R AY D EY Z -friday(2) F R AY D EY fridays F R AY D IY Z fridays(2) F R AY D EY Z friddle F R IH D AH L @@ -45095,13 +45113,13 @@ friendliest(2) F R EH N L IY AH S T friendliness F R EH N D L IY N IH S friendliness(2) F R EH N L IY N IH S friendly F R EH N D L IY +friendly(2) F R EH N L IY friendly's F R EH N D L IY Z friendly's(2) F R EH N L IY Z -friendly(2) F R EH N L IY friends F R EH N D Z +friends(2) F R EH N Z friends' F R EH N D Z friends'(2) F R EH N Z -friends(2) F R EH N Z friendship F R EH N D SH IH P friendship(2) F R EH N SH IH P friendships F R EH N D SH IH P S @@ -45118,6 +45136,7 @@ friess F R IY S friesz F R IY SH frieze F R IY Z friezes F R IY Z IH Z +frig F R IH G frigate F R IH G AH T frigate's F R IH G AH T S frigates F R IH G AH T S @@ -45134,6 +45153,7 @@ frightfully F R AY T F AH L IY frigid F R IH JH AH D frigo F R IY G OW frigon F R IH G AH N +frigs F R IH G Z friis F R IY Z frikkie F R IH K IY fril F R IH L @@ -45379,8 +45399,8 @@ fudgy F AH JH IY fudo F Y UW D OW fudosan F Y UW D AH S AA N fuel F Y UW AH L -fuel's F Y UW AH L Z fuel(2) F Y UW L +fuel's F Y UW AH L Z fueled F Y UW AH L D fueling F Y UW L IH NG fuelled F Y UW AH L D @@ -45844,9 +45864,9 @@ gadget's G AE JH AH T S gadgetry G AE JH AH T R IY gadgets G AE JH AH T S gadhafi G AH D AA F IY +gadhafi(2) G AH D HH AA F IY gadhafi's G AH D AA F IY Z gadhafi's(2) G AH D HH AA F IY Z -gadhafi(2) G AH D HH AA F IY gadomski G AH D AA M S K IY gadoury G AE D UH R IY gads G AE D Z @@ -46014,9 +46034,9 @@ galik G AE L IH K galilean G AE L AH L IY AH N galilee G AE L AH L IY galileo G AE L AH L IY OW +galileo(2) G AE L AH L EY OW galileo's G AE L AH L IY OW Z galileo's(2) G AE L AH L EY OW Z -galileo(2) G AE L AH L EY OW galin G AE L IH N galina G AH L IY N AH galindo G AA L IY N D OW @@ -46033,6 +46053,7 @@ galla G AE L AH gallacher G AE L AH K ER gallager G AO L IH JH ER gallagher G AE L AH G ER +gallagher(2) G AE L AH HH ER gallahan G AE L AH HH AE N gallaher G AE L AH HH ER gallamore G AA L AA M AO R @@ -46165,8 +46186,8 @@ gamblers G AE M B L ER Z gambles G AE M B AH L Z gamblin G AE M B L IH N gambling G AE M B AH L IH NG -gambling's G AE M B L IH NG Z gambling(2) G AE M B L IH NG +gambling's G AE M B L IH NG Z gamboa G AA M B OW AH gambone G AA M B OW N gambrel G AE M B R AH L @@ -46321,9 +46342,9 @@ garages G ER AA ZH IH Z garagiola G ER AE JH IY OW L AH garagiola(2) G EH R AH JH IY OW L AH garajda G ER AA ZH D AH +garajda(2) G AO R AA ZH D AH garajda's G ER AA ZH D AH Z garajda's(2) G AO R AA ZH D AH Z -garajda(2) G AO R AA ZH D AH garamendi G EH R AH M EH N D IY garamendi's G EH R AH M EH N D IY Z garand G AE R AH N D @@ -46354,6 +46375,8 @@ garcetti's G AA R CH EH T IY Z garcia G AA R S IY AH garcia's G AA R S IY AH Z garcias G AA R S IY AH Z +garcon G AA R S OW N +garcons G AA R S OW N Z garczynski G ER CH IH N S K IY gard G AA R D garda G AA R D AH @@ -46492,9 +46515,9 @@ garret's G EH R AH T S garrets G EH R AH T S garretson G AE R IH T S AH N garrett G AE R IH T +garrett(2) G EH R IH T garrett's G AE R IH T Z garrett's(2) G EH R IH T Z -garrett(2) G EH R IH T garrette G ER EH T garrey G AE R IY garrick G EH R IH K @@ -46564,9 +46587,9 @@ garvin G AA R V IH N garwin G AA R W IH N garwood G AA R W UH D gary G EH R IY +gary(2) G AE R IY gary's G EH R IY Z gary's(2) G AE R IY Z -gary(2) G AE R IY garza G AA R Z AH garzarelli G AA R Z ER EH L IY garzon G AA R Z AH N @@ -46717,9 +46740,9 @@ gau G OW gaub G AO B gaubatz G AW B AH T S gaubert G AW B ER T +gaubert(2) G AW B EH R T gaubert's G AW B ER T S gaubert's(2) G AW B EH R T S -gaubert(2) G AW B EH R T gauch G AO CH gauche G OW SH gaucher G OW SH ER @@ -46854,6 +46877,7 @@ gazaway G AA Z AH W EY gazda G AE Z D AH gazdik G AE Z D IH K gaze G EY Z +gazebo G AH Z IY B OW gazed G EY Z D gazella G AH Z EH L AH gazelle G AH Z EH L @@ -46866,6 +46890,7 @@ gazette G AH Z EH T gazing G EY Z IH NG gazonsky G AH Z AA N S K IY gazonsky's G AH Z AA N S K IY Z +gazpacho G AH S P AA CH OW gazprom G AE Z P R AA M gazzola G AA T S OW L AH gdansk G D AE N S K @@ -47039,11 +47064,11 @@ gelvin G EH L V IH N gem JH EH M gem's JH EH M Z gemayel G AH M EY AH L +gemayel(2) JH AH M AY AH L +gemayel(3) G AH M AY AH L gemayel's G AH M EY AH L Z gemayel's(2) JH AH M AY AH L Z gemayel's(3) G AH M AY AH L Z -gemayel(2) JH AH M AY AH L -gemayel(3) G AH M AY AH L gemberling G EH M B ER L IH NG gemco JH EH M K OW gemcraft JH EH M K R AE F T @@ -47073,9 +47098,9 @@ gencarelli JH EH N K AA R EH L IY genco JH EH NG K OW gencor JH EH N K AO R gencorp JH EH N K AO R P +gencorp(2) JH EH N K AO R gencorp's JH EH N K AO R P S gencorp's(2) JH EH N K AO R S -gencorp(2) JH EH N K AO R gendarme ZH AA N D AA R M gender JH EH N D ER gendered JH EH N D ER D @@ -47101,9 +47126,9 @@ genentech JH EH N AH N T EH K genentech's JH EH N AH N T EH K S genera JH EH N ER AH general JH EH N ER AH L +general(2) JH EH N R AH L general's JH EH N ER AH L Z general's(2) JH EH N R AH L Z -general(2) JH EH N R AH L generale JH EH N ER AE L generales JH EH N EH R AA L EH S generali JH EH N ER AA L IY @@ -47237,15 +47262,15 @@ gentle(2) JH EH N AH L gentleladies JH EH N T AH L EY D IY Z gentlelady JH EH N T AH L EY D IY gentleman JH EH N T AH L M AH N +gentleman(2) JH EH N AH L M AH N gentleman's JH EH N T AH L M AH N Z gentleman's(2) JH EH N AH L M AH N Z -gentleman(2) JH EH N AH L M AH N gentlemanly JH EH N T AH L M AH N L IY gentlemanly(2) JH EH N AH L M AH N L IY gentlemen JH EH N T AH L M IH N +gentlemen(2) JH EH N AH L M IH N gentlemen's JH EH N T AH L M EH N Z gentlemen's(2) JH EH N AH L M EH N Z -gentlemen(2) JH EH N AH L M IH N gentleness JH EH N T AH L N AH S gentleness(2) JH EH N AH L N AH S gentler JH EH N T L ER @@ -47253,13 +47278,13 @@ gentles JH EH N T AH L Z gentles(2) JH EH N AH L Z gentlest JH EH N T AH L AH S T gentlewoman JH EH N T AH L W UH M AH N +gentlewoman(2) JH EH N AH L W UH M AH N gentlewoman's JH EH N T AH L W UH M AH N Z gentlewoman's(2) JH EH N AH L W UH M AH N Z -gentlewoman(2) JH EH N AH L W UH M AH N gentlewomen JH EH N T AH L W IH M AH N +gentlewomen(2) JH EH N AH L W IH M AH N gentlewomen's JH EH N T AH L W IH M AH N Z gentlewomen's(2) JH EH N AH L W IH M AH N Z -gentlewomen(2) JH EH N AH L W IH M AH N gently JH EH N T L IY gentner JH EH N T N ER gentrification JH EH N T R IH F IH K EY SH AH N @@ -48073,9 +48098,9 @@ giovanelli JH OW V AA N EH L IY giovanetti JH OW V AA N EH T IY giovannetti JH OW V AA N EH T IY giovanni JH IY OW V AA N IY +giovanni(2) JH AH V AA N IY giovanni's JH IY OW V AA N IY Z giovanni's(2) JH AH V AA N IY Z -giovanni(2) JH AH V AA N IY giovanniello JH OW V AA N IY EH L OW giovannini JH OW V AA N IY N IY giovannoni JH OW V AA N OW N IY @@ -48955,9 +48980,9 @@ goldsmith's G OW L D S M IH TH S goldson G OW L D S AH N goldstar G OW L D S T AA R goldstein G OW L D S T AY N +goldstein(2) G OW L D S T IY N goldstein's G OW L D S T AY N Z goldstein's(2) G OW L D S T IY N Z -goldstein(2) G OW L D S T IY N goldstock G OW L D S T AA K goldston G OW L D S T AH N goldstone G OW L D S T OW N @@ -48979,8 +49004,8 @@ golembiewski G AH L IH M B IY EH F S K IY golen G AA L AH N goley G OW L IY golf G AA L F -golf's G AA L F S golf(2) G AO L F +golf's G AA L F S golfarb G AO L F AA R B golfed G AA L F T golfer G AA L F ER @@ -49087,8 +49112,8 @@ gonzo's G AA N Z OW Z goo G UW gooch G UW CH good G UH D -good's G UH D Z good(2) G IH D +good's G UH D Z good-bye G IH D B AY good-bye(2) G UH D B AY good-heartedly G UH D HH AA R T IH D L IY @@ -49178,8 +49203,8 @@ goodwyn G UH D W IH N goody G UH D IY goody's G UH D IY Z goodyear G UH D Y IH R -goodyear's G UH D Y IH R Z goodyear(2) G UH D Y IY R +goodyear's G UH D Y IH R Z gooey G UW IY goof G UW F goofed G UW F T @@ -49234,13 +49259,13 @@ goralski G ER AA L S K IY goran G AO R AH N goranson G AO R AH N S AH N gorazde G AO R AA ZH D AH +gorazde(2) G ER AA ZH D AH gorazde's G AO R AA ZH D AH Z gorazde's(2) G ER AA ZH D AH Z -gorazde(2) G ER AA ZH D AH gorbachev G AO R B AH CH EH V +gorbachev(2) G AO R B AH CH AO F gorbachev's G AO R B AH CH EH V Z gorbachev's(2) G AO R B AH CH AO F S -gorbachev(2) G AO R B AH CH AO F gorbachevs G AO R B AH CH EH V Z gorbachevs(2) G AO R B AH CH AO F S gorby G AO R B IY @@ -49283,6 +49308,7 @@ gorgon G AO R G AH N gorgone G AO R G AH N gorgonian G AO R G OW N IY AH N gorgons G AO R G AH N Z +gorgonzola G AO R G AH N Z OW L AH gorguze G AO R G Y UW Z gorham G AO R AH M gori G AO R IY @@ -49442,6 +49468,8 @@ gourdine G UH R D AY N gourds G AO R D Z gourlay G AO R L EY gourley G AO R L IY +gourmand G UH R M AA N D +gourmand(2) G AO R M AA N D gourment G AO R M EH N T gourmet G UH R M EY gourmets G UH R M EY Z @@ -49464,17 +49492,17 @@ governed G AH V ER N D governess G AH V ER N AH S governing G AH V ER N IH NG government G AH V ER M AH N T +government(2) G AH V ER N M AH N T government's G AH V ER M AH N T S government's(2) G AH V ER N M AH N T S -government(2) G AH V ER N M AH N T governmental G AH V ER M EH N T AH L governmental(2) G AH V ER N M EH N T AH L governmentally G AH V ER M EH N T AH L IY governmentally(2) G AH V ER M EH N AH L IY governments G AH V ER M AH N T S +governments(2) G AH V ER N M AH N T S governments' G AH V ER N M AH N T S governments'(2) G AH V ER M AH N T S -governments(2) G AH V ER N M AH N T S governor G AH V ER N ER governor's G AH V ER N ER Z governors G AH V ER N ER Z @@ -49595,9 +49623,9 @@ gradov G R EY D AO F gradovs G R EY D AO F S grads G R AE D Z gradstein G R AE D S T IY N +gradstein(2) G R AE D S T AY N gradstein's G R AE D S T IY N Z gradstein's(2) G R AE D S T AY N Z -gradstein(2) G R AE D S T AY N gradual G R AE JH UW AH L gradualism G R AE JH AH W AH L IH Z AH M gradualist G R AE JH AH W AH L IH S T @@ -49650,9 +49678,9 @@ grage G R EY JH gragert G R EY G ER T gragg G R AE G graham G R EY AH M +graham(2) G R AE M graham's G R EY AH M Z graham's(2) G R AE M Z -graham(2) G R AE M grahams G R AE M Z grahams(2) G R EY AH M Z grahek G R AE HH IH K @@ -49725,9 +49753,9 @@ grandchamp G R AE N D CH AE M P grandchild G R AE N D CH AY L D grandchild(2) G R AE N CH AY L D grandchildren G R AE N CH IH L D R AH N +grandchildren(2) G R AE N D CH IH L D R AH N grandchildren's G R AE N CH IH L D R AH N Z grandchildren's(2) G R AE N D CH IH L D R AH N Z -grandchildren(2) G R AE N D CH IH L D R AH N granddad G R AE N D AE D granddaddy G R AE N D AE D IY granddaughter G R AE N D AO T ER @@ -49739,9 +49767,9 @@ granderson G R AE N D ER S AH N grandest G R AE N D AH S T grandeur G R AE N D UW R grandfather G R AE N D F AA DH ER +grandfather(2) G R AE N F AA DH ER grandfather's G R AE N D F AA DH ER Z grandfather's(2) G R AE N F AA DH ER Z -grandfather(2) G R AE N F AA DH ER grandfathered G R AE N D F AA DH ER D grandfathered(2) G R AE N F AA DH ER D grandfathering G R AE N D F AA DH ER IH NG @@ -50152,8 +50180,8 @@ greenwalt G R IY N W AH L T greenway G R IY N W EY greenwell G R IY N W EH L greenwich G R EH N IH CH -greenwich's G R EH N IH CH IH Z greenwich(2) G R IY N W IH CH +greenwich's G R EH N IH CH IH Z greenwood G R IY N W UH D greer G R IH R greeson G R IY S AH N @@ -50298,9 +50326,9 @@ grieme G R IY M griep G R IY P griepentrog G R IY P IH N T R AH G grier G R AY ER +grier(2) G R IY R grier's G R AY ER Z grier's(2) G R IY R Z -grier(2) G R IY R grierson G R IH R S AH N gries G R AY Z griesa G R IY EH S AH @@ -50338,8 +50366,8 @@ griffin's G R IH F IH N Z griffing G R IH F IH NG griffis G R IH F IH S griffith G R IH F AH TH -griffith's G R IH F IH TH S griffith(2) G R IH F IH TH +griffith's G R IH F IH TH S griffiths G R IH F IH TH S griffitts G R IH F IH T S griffo G R IH F OW @@ -50983,9 +51011,9 @@ guests' G EH S T S guettler G EH T AH L ER guettler(2) G EH T L ER guevara G EY V AA R AH +guevara(2) G AH V AA R AH guevara's G EY V AA R AH Z guevara's(2) G AH V AA R AH Z -guevara(2) G AH V AA R AH guez G EH Z guez's G EH Z IH Z guff G AH F @@ -51650,8 +51678,8 @@ hadoop HH AE D UW P hadoya HH AH D OY AH hadria HH AE D R IY AH hadrian HH AE D R IY AH N -hadrian's HH EY D R IY AH N Z hadrian(2) HH EY D R IY AH N +hadrian's HH EY D R IY AH N Z hadron HH AE D R AO N hadsall HH AE D S AH L hadsell HH AE D S AH L @@ -51693,9 +51721,9 @@ haft's HH AE F T S haft's(2) HH AE F S hafta HH AE F T AH hafts HH AE F T S +hafts(2) HH AE F S hafts' HH AE F T S hafts'(2) HH AE F S -hafts(2) HH AE F S hag HH AE G haga HH AA G AH hagadorn HH AE G AH D AO R N @@ -51739,6 +51767,7 @@ hagge HH AE G haggerty HH AE G ER T IY haggett HH AE G IH T haggins HH AE G IH N Z +haggis HH AE G AH S haggle HH AE G AH L haggled HH AE G AH L D haggling HH AE G AH L IH NG @@ -51865,9 +51894,9 @@ hakeem HH AA K IY M hakeem's HH AA K IY M Z hakes HH EY K S hakim HH AA K IY M +hakim(2) AA K IY M hakim's HH AA K IY M Z hakim's(2) AA K IY M Z -hakim(2) AA K IY M hakki HH AE K IY hakko HH AE K OW hakon HH AE K AH N @@ -51897,9 +51926,9 @@ hald HH AO L D haldan HH AE L D AH N haldana HH AH L D AE N AH haldeman HH AA L D M AH N +haldeman(2) HH AA L D AH M AH N haldeman's HH AA L D M AH N Z haldeman's(2) HH AA L D AH M AH N Z -haldeman(2) HH AA L D AH M AH N halden HH AO L D AH N halder HH AO L D ER halderman HH AO L D ER M AH N @@ -52167,9 +52196,9 @@ hammersley HH AE M ER S L IY hammersmith HH AE M ER S M IH TH hammerson HH AE M ER S AH N hammerstein HH AE M ER S T IY N +hammerstein(2) HH AE M ER S T AY N hammerstein's HH AE M ER S T IY N Z hammerstein's(2) HH AE M ER S T AY N Z -hammerstein(2) HH AE M ER S T AY N hammerstrom HH AE M ER S T R AH M hammes HH AE M Z hammett HH AE M IH T @@ -52195,13 +52224,13 @@ hampering HH AE M P ER IH NG hampers HH AE M P ER Z hample HH AE M P AH L hampshire HH AE M P SH ER +hampshire(2) HH AE M SH ER +hampshire(3) HH AE M P SH AY ER +hampshire(4) HH AE M SH AY ER hampshire's HH AE M P SH ER Z hampshire's(2) HH AE M SH ER Z hampshire's(3) HH AE M P SH AY ER Z hampshire's(4) HH AE M SH AY ER Z -hampshire(2) HH AE M SH ER -hampshire(3) HH AE M P SH AY ER -hampshire(4) HH AE M SH AY ER hampshirites HH AE M P SH ER AY T S hampson HH AE M P S AH N hampstead HH AE M P S T EH D @@ -52226,9 +52255,9 @@ hamstrings HH AE M S T R IH NG Z hamstrung HH AE M S T R AH NG hamtramck HH AE M T R AE M IH K han HH AA N +han(2) HH AE N han's HH AA N Z han's(2) HH AE N Z -han(2) HH AE N hana HH AE N AH hanafin HH AE N AH F IH N hanagan HH AA N AA G AA N @@ -52886,13 +52915,13 @@ harris HH EH R IH S harris' HH EH R IH S harris's HH EH R IH S IH Z harrisburg HH AE R IH S B ER G +harrisburg(2) HH EH R IH S B ER G harrisburg's HH AE R IH S B ER G Z harrisburg's(2) HH EH R IH S B ER G Z -harrisburg(2) HH EH R IH S B ER G harrisburgh HH AE R IH S B ER G +harrisburgh(2) HH EH R IH S B ER G harrisburgh's HH AE R IH S B ER G Z harrisburgh's(2) HH EH R IH S B ER G Z -harrisburgh(2) HH EH R IH S B ER G harrises HH AE R IH S IH Z harrison HH EH R IH S AH N harrison's HH EH R IH S AH N Z @@ -53194,6 +53223,7 @@ hattaway HH AE T AH W EY hatten HH AE T AH N hattendorf HH AE T IH N D AO R F hatter HH AE T ER +hatter's HH AE T ER Z hatteras HH AE T ER AH S hattersley HH AE T ER Z L IY hattery HH AE T ER IY @@ -54476,24 +54506,24 @@ heralding HH EH R AH L D IH NG heraldry HH EH R AH L D R IY heralds HH EH R AH L D Z herb ER B +herb(2) HH ER B herb's ER B Z herb's(2) HH ER B Z -herb(2) HH ER B herbaceous ER B EY SH AH S herbal ER B AH L herbal(2) HH ER B AH L herbalife HH ER B AH L AY F herbalife(2) ER B AH L AY F herbalist ER B AH L AH S T +herbalist(2) HH ER B AH L AH S T herbalist's ER B AH L AH S T S herbalist's(2) HH ER B AH L AH S T S -herbalist(2) HH ER B AH L AH S T herbalists ER B AH L AH S T S -herbalists' ER B AH L AH S T S -herbalists'(2) HH ER B AH L AH S T S herbalists(2) HH ER B AH L AH S T S herbalists(3) ER B AH L AH S herbalists(4) HH ER B AH L AH S +herbalists' ER B AH L AH S T S +herbalists'(2) HH ER B AH L AH S T S herbarium HH ER B EH R IY AH M herbarium(2) ER B EH R IY AH M herbariums HH ER B EH R IY AH M Z @@ -54524,9 +54554,9 @@ herbst HH ER B S T herbster HH ER B S T ER herceg HH ER S IH G hercegovina HH EH R T S AH G OW V IY N AH +hercegovina(2) HH ER R T S AH G OW V IY N AH hercegovina's HH EH R T S AH G OW V IY N AH Z hercegovina's(2) HH ER R T S AH G OW V IY N AH Z -hercegovina(2) HH ER R T S AH G OW V IY N AH herculean HH ER K Y UW L IY AH N hercules HH ER K Y AH L IY Z herczeg HH ER CH IH G @@ -54571,8 +54601,8 @@ heringer HH EH R IH N JH ER herington HH EH R IH NG T AH N heritable HH EH R AH T AH B AH L heritage HH EH R AH T AH JH -heritage's HH EH R AH T IH JH IH Z heritage(2) HH EH R IH T IH JH +heritage's HH EH R AH T IH JH IH Z heritages HH EH R IH T IH JH AH Z herk HH ER K herkert HH ER K ER T @@ -54628,9 +54658,9 @@ herniate HH ER N IY EY T herniates HH ER N IY EY T S hernon HH ER N AH N hero HH IH R OW +hero(2) HH IY R OW hero's HH IH R OW Z hero's(2) HH IY R OW Z -hero(2) HH IY R OW herod HH EH R AH D heroes HH IH R OW Z heroes(2) HH IY R OW Z @@ -54739,9 +54769,9 @@ herz HH ER Z herzberg HH ER Z B ER G herzberger HH ER Z B ER G ER herzegovina HH EH R T S AH G OW V IY N AH +herzegovina(2) HH ER T S AH G OW V IY N AH herzegovina's HH EH R T S AH G OW V IY N AH Z herzegovina's(2) HH ER T S AH G OW V IY N AH Z -herzegovina(2) HH ER T S AH G OW V IY N AH herzer HH ER Z ER herzfeld HH ER Z F EH L D herzig HH ER Z IH G @@ -55282,9 +55312,9 @@ hindrance HH IH N D R AH N S hindrances HH IH N D R AH N S IH Z hinds HH AY N D Z hindsight HH AY N D S AY T +hindsight(2) HH AY N S AY T hindsight's HH AY N D S AY T S hindsight's(2) HH AY N S AY T S -hindsight(2) HH AY N S AY T hindu HH IH N D UW hinduism HH IH N JH UW IH Z AH M hindus HH IH N D UW Z @@ -55405,9 +55435,9 @@ hirn HH ER N hiro HH IH R OW hiroaki HH IH R OW AA K IY hirohito HH IH R OW HH IY T OW +hirohito(2) HH IH R AH HH IY T OW hirohito's HH IH R OW HH IY T OW Z hirohito's(2) HH IH R AH HH IY T OW Z -hirohito(2) HH IH R AH HH IY T OW hiromasa HH IH R OW M AA S AH hirons HH AY R AH N Z hirosakamoki HH IH R AH S AE K AH M OW K IY @@ -55484,9 +55514,9 @@ histories HH IH S T ER IY Z histories(2) HH IH S T R IY Z historiography HH IH S T AO R IY AA G R AH F IY history HH IH S T ER IY +history(2) HH IH S T R IY history's HH IH S T ER IY Z history's(2) HH IH S T R IY Z -history(2) HH IH S T R IY histrionic HH IH S T R IY AA N IH K histrionics HH IH S T R IY AA N IH K S hit HH IH T @@ -55693,9 +55723,9 @@ hodsdon HH AA D Z D AH N hodson HH AA D S AH N hoe HH OW hoechst HH OW K S T +hoechst(2) HH OW SH T hoechst's HH OW K S T S hoechst's(2) HH OW SH T S -hoechst(2) HH OW SH T hoeck HH OW K hoecker HH OW K ER hoedown HH OW D AW N @@ -55787,8 +55817,8 @@ hofstetter HH AA F S T EH T ER hofstra HH AA F S T R AH hog HH AA G hogan HH OW G AA N -hogan's HH OW G AA N Z hogan(2) HH OW G AH N +hogan's HH OW G AA N Z hogans HH OW G AA N Z hogans(2) HH OW G AH N Z hoganson HH AA G AH N S AH N @@ -55927,8 +55957,8 @@ holguin HH OW L G IH N holian HH OW L IY AH N holick HH AA L IH K holiday HH AA L AH D EY -holiday's HH AA L AH D EY Z holiday(2) HH AA L IH D EY +holiday's HH AA L AH D EY Z holidays HH AA L AH D EY Z holidaysburg HH AA L AH D EY Z B ER G holien HH OW L IY AH N @@ -56037,9 +56067,9 @@ holme HH OW L M holmen HH AA L M EH N holmer HH OW L M ER holmes HH OW M Z +holmes(2) HH OW L M Z holmes's HH OW M Z IH Z holmes's(2) HH OW L M Z IH Z -holmes(2) HH OW L M Z holmgren HH OW L M G R EH N holmium HH OW L M IY AH M holmlund HH OW L M L AH N D @@ -56482,8 +56512,8 @@ hopton HH AA P T AH N hopwood HH AA P W UH D hora HH AO R AH horace HH AO R AH S -horace's HH AO R AH S AH Z horace(2) HH AO R IH S +horace's HH AO R AH S AH Z horacek HH AO R AH CH EH K horacia HH AO R AA S IY AH horacio HH AO R EY S IY OW @@ -56612,8 +56642,8 @@ horseplay HH AO R S P L EY horsepower HH AO R S P AW ER horseradish HH AO R S R AE D IH SH horses HH AO R S AH Z -horses' HH AO R S IH Z horses(2) HH AO R S IH Z +horses' HH AO R S IH Z horseshit HH AO R S SH IH T horseshoe HH AO R S SH UW horseshoes HH AO R S SH UW Z @@ -56652,9 +56682,9 @@ hosakawa HH OW S AH K AA W AH hosch HH AO SH hose HH OW Z hosea HH OW S IY AH +hosea(2) HH OW Z EY AH hosea's HH OW Z IY AH Z hosea's(2) HH OW Z EY AH Z -hosea(2) HH OW Z EY AH hosed HH OW Z D hosek HH OW S EH K hoselton HH AH S EH L T AH N @@ -56804,9 +56834,9 @@ houghland HH AW L AH N D houghs HH AW Z houghtaling HH AO T AH L IH NG houghton HH AO T AH N +houghton(2) HH AW T AH N houghton's HH AO T AH N Z houghton's(2) HH AW T AH N Z -houghton(2) HH AW T AH N hougland HH AW G L AH N D houk HH AW K houle HH AW L @@ -56821,8 +56851,8 @@ hounshell HH AW N SH AH L houp HH UW P houpt HH UW P T hour AW ER -hour's AW ER Z hour(2) AW R +hour's AW ER Z hourglass AW ER G L AE S hourglasses AW ER G L AE S IH Z hourigan AW R IH G AE N @@ -56830,8 +56860,8 @@ hourihan AW R IY HH AA N hourlong AW R L AO NG hourly AW R L IY hours AW ER Z -hours' AW R Z hours(2) AW R Z +hours' AW R Z housand HH AW S AH N D housden HH AW S D AH N house HH AW S @@ -56861,8 +56891,8 @@ housen HH AW S AH N houser HH AW Z ER houseraising HH AW S R EY Z IH NG houses HH AW S AH Z -houses' HH AW S IH Z houses(2) HH AW S IH Z +houses' HH AW S IH Z houseware HH AW S W EH R housewares HH AW S W EH R Z housewarming HH AW S W AA M IH NG @@ -57220,11 +57250,11 @@ hughbanks(3) Y UW B AH NG K S hughen HH Y UW AH N hughen(2) Y UW AH N hughes HH Y UW Z +hughes(2) Y UW Z hughes' HH Y UW Z hughes'(2) Y UW Z hughes's HH Y UW Z IH Z hughes's(2) Y UW Z IH Z -hughes(2) Y UW Z hughett HH Y UW IH T hughett(2) Y UW IH T hughette HH Y UW EH T @@ -57252,9 +57282,9 @@ hughy(2) Y UW IY hugill HH AH JH AH L hugley HH AH G L IY hugo HH Y UW G OW +hugo(2) Y UW G OW hugo's HH Y UW G OW Z hugo's(2) Y UW G OW Z -hugo(2) Y UW G OW hugoton HH Y UW G OW T AH N hugoton(2) Y UW G OW T AH N hugs HH AH G Z @@ -57350,8 +57380,8 @@ hulu HH UW L UW hulvey HH AH L V IY hum HH AH M human HH Y UW M AH N -human's HH Y UW M AH N Z human(2) Y UW M AH N +human's HH Y UW M AH N Z humana HH Y UW M AE N AH humana's HH Y UW M AE N AH Z humane HH Y UW M EY N @@ -57367,9 +57397,9 @@ humanitarians(2) Y UW M AE N AH T EH R IY AH N Z humanities HH Y UW M AE N IH T IY Z humanities(2) Y UW M AE N IH T IY Z humanity HH Y UW M AE N IH T IY +humanity(2) Y UW M AE N IH T IY humanity's HH Y UW M AE N IH T IY Z humanity's(2) Y UW M AE N IH T IY Z -humanity(2) Y UW M AE N IH T IY humanize HH Y UW M AH N AY Z humanized HH Y UW M AH N AY Z D humanizes HH Y UW M AH N AY Z IH Z @@ -57483,10 +57513,10 @@ hundai HH AH N D EY hundertmark HH AH N D ER T M AA R K hundley HH AH N D L IY hundred HH AH N D R AH D -hundred's HH AH N D R IH D Z hundred(2) HH AH N D R IH D hundred(3) HH AH N ER D hundred(4) HH AH N D ER D +hundred's HH AH N D R IH D Z hundreds HH AH N D R AH D Z hundreds(2) HH AH N D ER D Z hundreds(3) HH AH N ER D Z @@ -57596,8 +57626,8 @@ hurray HH AH R EY hurrell HH AO R AH L hurri HH ER IY hurricane HH ER AH K EY N -hurricane's HH ER AH K EY N Z hurricane(2) HH AH R AH K EY N Z +hurricane's HH ER AH K EY N Z hurricanes HH ER AH K EY N Z hurried HH ER IY D hurriedly HH ER IY D L IY @@ -57971,8 +58001,8 @@ hyun HH AY AH N hyun(2) HH Y AH N hyundae HH Y AH N D EY hyundai HH Y AH N D EY -hyundai's HH AH N D EY Z hyundai(2) HH AH N D EY +hyundai's HH AH N D EY Z hyundais HH Y AH N D EY Z hywell HH AY W EH L hz HH ER T Z @@ -58088,10 +58118,10 @@ icicles AY S IH K AH L Z icily AY S IH L IY icing AY S IH NG ickes IH K IY Z -ickes' IH K AH S -ickes'(2) IH K IY Z ickes(2) AY K IY Z ickes(3) AY K S +ickes' IH K AH S +ickes'(2) IH K IY Z icloud AY K L AW D icon AY K AA N iconic AY K AA N IH K @@ -58330,9 +58360,9 @@ illig IH L IH G illina IH L IY N AH illingworth IH L IH NG W ER TH illinois IH L AH N OY +illinois(2) IH L AH N OY Z illinois' IH L IH N OY Z illinois's IH L IH N OY Z -illinois(2) IH L AH N OY Z illiquid IH L IH K W IH D illiquidity IH L IH K W IH D IH T IY illiteracy IH L IH T ER AH S IY @@ -58886,8 +58916,8 @@ inbreed IH N B R IY D inbreeding IH N B R IY D IH NG inc IH NG K inc. IH NG K -inc.'s IH NG K S inc.(2) IH NG K AO R P AO R EY T AH D +inc.'s IH NG K S inca IH NG K AH incalculable IH N K AE L K Y AH L AH B AH L incandescent IH N K AH N D EH S AH N T @@ -58931,9 +58961,9 @@ inchcape IH N CH K EY P inched IH N CH T incheon IH N CH AO N inches IH N CH AH Z +inches(2) IH N CH IH Z inches' IH N CH AH Z inches'(2) IH N CH IH Z -inches(2) IH N CH IH Z inching IH N CH IH NG inchoate IH N K OW AH T inchon IH N CH AO N @@ -59487,9 +59517,9 @@ informatic(2) IH N F AO R M AE T IH K informatics IH N F ER M AE T IH K S informatics(2) IH N F AO R M AE T IH K S information IH N F ER M EY SH AH N +information(2) IH N F AO R M EY SH AH N information's IH N F ER M EY SH AH N Z information's(2) IH N F AO R M EY SH AH N Z -information(2) IH N F AO R M EY SH AH N informational IH N F ER M EY SH AH N AH L informational(2) IH N F AO R M EY SH AH N AH L informations IH N F ER M EY SH AH N Z @@ -59639,9 +59669,9 @@ inhibitors IH N HH IH B AH T ER Z inhibitory IH N HH IH B AH T AO R IY inhibits IH N HH IH B AH T S inhofe IH N HH OW F +inhofe(2) IH N HH AA F inhofe's IH N HH OW F S inhofe's(2) IH N HH AA F S -inhofe(2) IH N HH AA F inhospitable IH N HH AA S P AH T AH B AH L inhospitable(2) IH N HH AA S P IH T AH B AH L inhouse IH N HH AW S @@ -59708,9 +59738,9 @@ injustice IH N JH AH S T IH S injustices IH N JH AH S T AH S IH Z ink IH NG K inkatha IH NG K AE TH AH +inkatha(2) IH NG K AA T AH inkatha's IH NG K AE TH AH Z inkatha's(2) IH NG K AA T AH Z -inkatha(2) IH NG K AA T AH inkblot IH NG K B L AA T inkjet IH NG K JH EH T inkling IH NG K L IH NG @@ -60099,11 +60129,11 @@ integrals IH N T AH G R AH L Z integrate IH N T AH G R EY T integrate(2) IH N AH G R EY T integrated IH N T AH G R EY T AH D -integrated's IH N T AH G R EY T IH D Z -integrated's(2) IH N AH G R EY T IH D Z integrated(2) IH N T AH G R EY T IH D integrated(3) IH N AH G R EY T AH D integrated(4) IH N AH G R EY T IH D +integrated's IH N T AH G R EY T IH D Z +integrated's(2) IH N AH G R EY T IH D Z integrates IH N T AH G R EY T S integrates(2) IH N AH G R EY T S integrating IH N T AH G R EY T IH NG @@ -60390,9 +60420,9 @@ internalize IH N T ER N AH L AY Z internalized IH N T ER N AH L AY Z D internally IH N T ER N AH L IY international IH N T ER N AE SH AH N AH L +international(2) IH N ER N AE SH AH N AH L international's IH N T ER N AE SH AH N AH L Z international's(2) IH N ER N AE SH AH N AH L Z -international(2) IH N ER N AE SH AH N AH L internationale IH N T ER N AE SH AH N AA L IY internationale(2) IH N ER N AE SH AH N AA L IY internationalism IH N T ER N AE SH AH N AH L IH Z AH M @@ -60742,13 +60772,13 @@ investing IH N V EH S T IH NG investissements IH N V EH S T IY Z IH M AA N T S investiture IH N V EH S T AH CH ER investment IH N V EH S T M AH N T +investment(2) IH N V EH S M AH N T investment's IH N V EH S T M AH N T S investment's(2) IH N V EH S M AH N T S -investment(2) IH N V EH S M AH N T investments IH N V EH S T M AH N T S +investments(2) IH N V EH S M AH N T S investments' IH N V EH S T M AH N T S investments'(2) IH N V EH S M AH N T S -investments(2) IH N V EH S M AH N T S investnet IH N V EH S T N EH T investor IH N V EH S T ER investor's IH N V EH S T ER Z @@ -60847,9 +60877,9 @@ iou AY OW Y UW iovine IY OW V IY N IY iovino IY OW V IY N OW iowa AY AH W AH +iowa(2) AY OW AH iowa's AY AH W AH Z iowa's(2) AY OW AH Z -iowa(2) AY OW AH iowan AY AH W AH N iowan(2) AY OW AH N iowans AY AH W AH N Z @@ -60878,36 +60908,36 @@ iq AY K Y UW iq's AY K Y UW Z iqbal IH K B AH L ira AY R AH -ira's AY R AH Z ira(2) AY AA R EY +ira's AY R AH Z iran IH R AA N +iran(2) AY R AE N iran's IH R AE N Z iran's(2) AY R AE N Z -iran(2) AY R AE N iranamok AY R AH N AA M AA K irangate IH R AA N G EY T irani IH R AA N IY iranian IH R AA N IY AH N iranian(2) AY R EY N IY AH N iranians AY R EY N IY AH N Z -iranians' AY R EY N IY AH N Z iranians(2) IH R AA N IY AH N Z +iranians' AY R EY N IY AH N Z iranscam AY R AE N S K AE M iraq IH R AA K +iraq(2) IY R AA K +iraq(3) AY R AA K iraq's IH R AA K S iraq's(2) IY R AA K S iraq's(3) AY R AA K S -iraq(2) IY R AA K -iraq(3) AY R AA K iraqgate IH R AA K G EY T iraqgate(2) IY R AA K G EY T iraqgate(3) AY R AA K G EY T iraqi IH R AE K IY +iraqi(2) IY R AE K IY +iraqi(3) AY R AE K IY iraqi's IH R AE K IY Z iraqi's(2) IY R AE K IY Z iraqi's(3) AY R AE K IY Z -iraqi(2) IY R AE K IY -iraqi(3) AY R AE K IY iraqis IH R AE K IY Z iraqis(2) IY R AE K IY Z iraqis(3) AY R AE K IY Z @@ -60922,8 +60952,8 @@ ire AY R ireene AY R IY N irelan IH R EY L AA N ireland AY ER L AH N D -ireland's AY R L AH N D Z ireland(2) AY R L AH N D +ireland's AY R L AH N D Z irelands AY R L AH N D Z irell AY R EH L irena IH R EY N AH @@ -61124,8 +61154,8 @@ isis AY S AH S iskra IH S K R AH isla IY L AH islam IH S L AA M -islam's IH S L AA M Z islam(2) IH Z L AH M +islam's IH S L AA M Z islamabad IH S L AE M AH B AE D islamabad's IH S L AE M AH B AE D Z islami IH Z L AA M IY @@ -61198,9 +61228,9 @@ isotopic AY S AH T AA P IH K isoxicam IH S AA K S IH K AH M ispra IH S P R AH israel IH Z R IY AH L +israel(2) IH Z R EY L israel's IH Z R EY L Z israel's(2) IH Z R IY AH L Z -israel(2) IH Z R EY L israeli IH Z R EY L IY israeli's IH Z R EY L IY Z israelis IH Z R EY L IY Z @@ -61497,9 +61527,9 @@ jacqueline(2) JH AE K L IH N jacqueline(3) JH AE K AH L IH N jacquelyn JH AE K W IH L IH N jacques ZH AA K +jacques(2) JH AE K jacques' ZH AA K S jacques'(2) JH AE K S -jacques(2) JH AE K jacquet JH AE K EH T jacquet(2) JH AE K EY jacquetta JH AA K EH T AH @@ -61614,6 +61644,7 @@ jamal JH AH M AA L jamal's JH AH M AA L Z jamar Y AA M AA R jamb JH AE M +jambalaya JH AH M B AH L AY AH jambor Y AA M B AO R jamerson JH AE M ER S AH N jamerson's JH AE M ER S AH N Z @@ -61672,9 +61703,9 @@ janelle ZH AH N EH L janes JH EY N Z janesville JH EY N Z V IH L janet JH AE N AH T +janet(2) JH AE N IH T janet's JH AE N AH T S janet's(2) JH AE N IH T S -janet(2) JH AE N IH T janette JH AH N EH T janeway JH EY N W EY janey JH EY N IY @@ -61825,8 +61856,8 @@ jarvie JH AA R V IY jarvik JH AA R V IH K jarvinen JH AA R V IH N AH N jarvis JH AA R V AH S -jarvis's JH AA R V IH S IH Z jarvis(2) JH AA R V IH S +jarvis's JH AA R V IH S IH Z jaryl JH AE R AH L jarzombek Y ER Z AA M B EH K jas JH AE S @@ -62216,9 +62247,9 @@ jewel JH UW AH L jewel(2) JH UW L jewelcor JH UW AH L K AO R jeweler JH UW AH L ER +jeweler(2) JH UW L ER jeweler's JH UW AH L ER Z jeweler's(2) JH UW L ER Z -jeweler(2) JH UW L ER jewelers JH UW AH L ER Z jewelers(2) JH UW L ER Z jewell JH UW IH L @@ -62261,8 +62292,8 @@ ji JH IY jia JH IY AH jian JH IY AH N jiang JH AA NG -jiang's JH IY AA NG Z jiang(2) JH IY AA NG +jiang's JH IY AA NG Z jiangsu JH Y AA NG S UW jiar JH IY AA R jiawen JH IY W EH N @@ -62346,9 +62377,9 @@ jiving JH AY V IH NG jna JH EY EH N EY jo JH OW joachim Y OW AA K IH M +joachim(2) W AA K IY M joachim's Y OW AA K IH M Z joachim's(2) W AA K IY M Z -joachim(2) W AA K IY M joachims Y OW AA K IH M Z joachims(2) W AA K IY M Z joakima JH OW K IY M AH @@ -62363,9 +62394,9 @@ joao JH OW OW joaquim W AA K IY M joaquin W AA K IY N job JH AA B +job(2) JH OW B job's JH AA B Z job's(2) JH OW B Z -job(2) JH OW B jobber JH AA B ER jobbers JH AA B ER Z jobe JH OW B @@ -62606,8 +62637,8 @@ josef JH OW S AH F josefina Y OW S IH F IY N AH josefina(2) JH OW Z AH F IY N AH joseph JH OW S AH F -joseph's JH OW Z AH F S joseph(2) JH OW Z AH F +joseph's JH OW Z AH F S josepha JH OW S EH F AH josephina JH AA S IH F AY N AH josephina(2) JH OW Z AH F IY N AH @@ -62655,23 +62686,23 @@ joulwan(2) JH UW L HH W AA N jour JH UW R jourdan ZH UH R D AE N jouret ZH W AA R EY +jouret(2) JH ER EH T jouret's ZH W AA R EY Z jouret's(2) JH ER EH T S -jouret(2) JH ER EH T journal JH ER N AH L journal's JH ER N AH L Z journalese JH ER N AH L IY Z journalism JH ER N AH L IH Z AH M journalism's JH ER N AH L IH Z AH M Z journalist JH ER N AH L AH S T -journalist's JH ER N AH L IH S T S journalist(2) JH ER N AH L IH S T +journalist's JH ER N AH L IH S T S journalistic JH ER N AH L IH S T IH K journalistically JH ER N AH L IH S T IH K AH L IY journalistically(2) JH ER N AH L IH S T IH K L IY journalists JH ER N AH L AH S T S -journalists' JH ER N AH L IH S T S journalists(2) JH ER N AH L IH S T S +journalists' JH ER N AH L IH S T S journals JH ER N AH L Z journey JH ER N IY journeyed JH ER N IY D @@ -62741,9 +62772,9 @@ jubilee JH UW B AH L IY juckett JH AH K IH T judah JH UW D AH judaism JH UW D EY IH Z AH M +judaism(2) JH UW D IY IH Z AH M judaism's JH UW D EY IH Z AH M Z judaism's(2) JH UW D IY IH Z AH M Z -judaism(2) JH UW D IY IH Z AH M judas JH UW D AH S juday JH UW D EY judd JH AH D @@ -62864,9 +62895,9 @@ juliusz JH UW L IY UW S julliard JH UW L IY AA R D julson JH AH L S AH N july JH UW L AY +july(2) JH AH L AY july's JH UW L AY Z july's(2) JH AH L AY Z -july(2) JH AH L AY jumanji JH UW M AA N JH IY jumble JH AH M B AH L jumbled JH AH M B AH L D @@ -62953,9 +62984,9 @@ juntunen JH AH N T AH N AH N junwuxiyan JH AH N W UW K S IY AH N jupin JH UW P IH N jupiter JH UW P AH T ER +jupiter(2) JH UW P IH T ER jupiter's JH UW P AH T ER Z jupiter's(2) JH UW P IH T ER Z -jupiter(2) JH UW P IH T ER juppe JH UW P IY jura JH UH R AH jura's JH UH R AH Z @@ -63014,11 +63045,11 @@ justen JH AH S T AH N juster JH AH S T ER justesen JH AH S T IY Z AH N justice JH AH S T AH S -justice's JH AH S T IH S IH Z justice(2) JH AH S T IH S +justice's JH AH S T IH S IH Z justices JH AH S T AH S AH Z -justices' JH AH S T IH S IH Z justices(2) JH AH S T IH S IH Z +justices' JH AH S T IH S IH Z justifiable JH AH S T AH F AY AH B AH L justifiably JH AH S T AH F AY AH B L IY justification JH AH S T AH F AH K EY SH AH N @@ -63028,9 +63059,9 @@ justifies JH AH S T AH F AY Z justify JH AH S T AH F AY justifying JH AH S T AH F AY IH NG justin JH AH S T AH N +justin(2) JH AH S T IH N justin's JH AH S T AH N Z justin's(2) JH AH S T IH N Z -justin(2) JH AH S T IH N justina Y UW S T IY N AH justine JH AH S T IY N justiniano JH UW S T IY N IY AA N OW @@ -63051,9 +63082,9 @@ jutting JH AH T IH NG juul JH UW AH L juve JH UW V juvenile JH UW V AH N AH L +juvenile(2) JH UW V AH N AY L juvenile's JH UW V AH N AH L Z juvenile's(2) JH UW V AH N AY L Z -juvenile(2) JH UW V AH N AY L juveniles JH UW V AH N AH L Z juveniles(2) JH UW V AH N AY L Z juwan JH UW AA N @@ -63108,9 +63139,9 @@ kaczmarski K AH CH M AA R S K IY kaczor K AA CH ER kaczorowski K AH CH ER AO F S K IY kaczynski K AH CH IH N S K IY +kaczynski(2) K AH Z IH N S K IY kaczynski's K AH CH IH N S K IY Z kaczynski's(2) K AH Z IH N S K IY Z -kaczynski(2) K AH Z IH N S K IY kadar K AE D ER kadar(2) K AH D AA R kade K EY D @@ -63451,6 +63482,7 @@ kaplow K AE P L OW kaplowitz K AA P L AH W IH T S kapner K AE P N ER kapnick K AE P N IH K +kapok K EY P AA K kapoor K AH P UW R kapor K EY P ER kaposi K AH P OW S IY @@ -63671,9 +63703,9 @@ kassab K AE S AH B kassan K AE S AH N kassar K AE S ER kassebaum K AE S AH B AW M +kassebaum(2) K AE S AH B AA M kassebaum's K AE S AH B AW M Z kassebaum's(2) K AE S AH B AA M Z -kassebaum(2) K AE S AH B AA M kassel K AE S AH L kassem K AE S AH M kassen K AE S AH N @@ -63843,9 +63875,9 @@ kayvon K EY V AA N kazakh K AE Z AE K kazakhs K AE Z AE K S kazakhstan K AA Z AA K S T AA N +kazakhstan(2) K AH Z AE K S T AE N kazakhstan's K AA Z AA K S T AA N Z kazakhstan's(2) K AH Z AE K S T AE N Z -kazakhstan(2) K AH Z AE K S T AE N kazakhstana K AA Z AA K S T AA N AH kazakhstana(2) K AH Z AE K S T AE N AH kazan K EY Z AH N @@ -64076,8 +64108,8 @@ kellerman K EH L ER M AH N kellermann K EH L ER M AH N kellett K EH L IH T kelley K EH L IY -kelley's K EH L IY Z kelley(2) OW K EH L IY +kelley's K EH L IY Z kelli K EH L IY kelli's K EH L IY Z kellie K EH L IY @@ -64122,8 +64154,8 @@ keltz K EH L T S kelvan K EH L V AH N kelven K EH L V AH N kelvin K EH L V AH N -kelvin's K EH L V IH N Z kelvin(2) K EH L V IH N +kelvin's K EH L V IH N Z kem K EH M kemal K AH M AA L kembel K EH M B AH L @@ -64256,9 +64288,9 @@ kenwood K EH N W UH D kenworth K EH N W ER TH kenworthy K EH N W ER DH IY kenya K EH N Y AH +kenya(2) K IY N Y AH kenya's K EH N Y AH Z kenya's(2) K IY N Y AH Z -kenya(2) K IY N Y AH kenyan K EH N Y AH N kenyan(2) K IY N Y AH N kenyans K EH N Y AH N Z @@ -64526,9 +64558,9 @@ khalaf K AE L AH F khaled HH AH L AH D khaled(2) K AH L AH D khalid K AA L IH D +khalid(2) HH AA L IH D khalid's K AA L IH D Z khalid's(2) HH AA L IH D Z -khalid(2) HH AA L IH D khalifa K AH L IY F AH khalil K AE L AH L khalsa K AA L S AH @@ -64553,18 +64585,18 @@ khlebnikov K L EH B N IH K AA V khlebnikov's K L EH B N IH K AA V Z khmer K M EH R khomeini K OW M EY N IY +khomeini(2) HH OW M EY N IY khomeini's HH OW M EY N IY Z khomeini's(2) K OW M EY N IY Z -khomeini(2) HH OW M EY N IY khoo K UW khosla K AO S L AH khost K OW S T khouri K AW R IY khoury K AW R IY khrushchev K R UW S CH EH V +khrushchev(2) K R UW S CH AO F khrushchev's K R UW S CH EH V Z khrushchev's(2) K R UW S CH AO F S -khrushchev(2) K R UW S CH AO F khufu K UW F UW khumalo K Y UW M AA L OW khuu K UW @@ -65040,8 +65072,8 @@ kiper K AY P ER kipfer K IH P F ER kipling K IH P L IH NG kiplinger K IH P AH L IH NG ER -kiplinger's K IH P L IH NG ER Z kiplinger(2) K IH P L IH NG ER +kiplinger's K IH P L IH NG ER Z kipnis K IH P N IH S kipp K IH P kipper K IH P ER @@ -66029,15 +66061,15 @@ kondrat K AA N D R AH T konecny K AH N EH K N IY konen K AA N AH N kong K AO NG +kong(2) K AO NG G kong's K AO NG Z kong's(2) K AO NG G Z -kong(2) K AO NG G konger K AA NG G ER kongers K AA NG G ER Z kongsberg K AO NG Z B ER G +kongsberg(2) K AO NG G Z B ER G kongsberg's K AO NG Z B ER G Z kongsberg's(2) K AO NG G Z B ER G Z -kongsberg(2) K AO NG G Z B ER G konica K AA N IH K AH konicek K AA N IH CH EH K konicki K AH N IH T S K IY @@ -66164,24 +66196,24 @@ korczak K AO R CH AE K korda K AO R D AH kordell K AO R D EH L korea K AO R IY AH +korea(2) K R IY AH +korea(3) K ER R IY AH korea's K AO R IY AH Z korea's(2) K R IY AH Z korea's(3) K ER R IY AH Z -korea(2) K R IY AH -korea(3) K ER R IY AH koreagate K AO R IY AH G EY T koreagate(2) K ER R IY AH G EY T korean K AO R IY AH N -korean's K R IY AH N Z -korean's(2) K ER IY AH N Z korean(2) K R IY AH N korean(3) K ER R IY AH N +korean's K R IY AH N Z +korean's(2) K ER IY AH N Z koreans K AO R IY AH N Z +koreans(2) K R IY AH N Z +koreans(3) K ER R IY AH N Z koreans' K AO R IY AH N Z koreans'(2) K R IY AH N Z koreans'(3) K ER R IY AH N Z -koreans(2) K R IY AH N Z -koreans(3) K ER R IY AH N Z koreas K AO R IY AH Z koreas(2) K R IY AH Z koreas(3) K ER R IY AH Z @@ -66333,11 +66365,11 @@ kotlowitz K AA T L AH W IH T S koto K OW T OW kotowski K AH T AO F S K IY kotsonis K AE T S OW N AH S +kotsonis(2) K OW T S OW N AH S kotsonis' K AE T S OW N AH S kotsonis'(2) K OW T S OW N AH S kotsonis's K AE T S OW N AH S IH Z kotsonis's(2) K OW T S OW N AH S IH Z -kotsonis(2) K OW T S OW N AH S kott K AA T kotter K AA T ER kottke K AA T K IY @@ -66457,9 +66489,9 @@ krain K R EY N krajewski K R AY EH F S K IY krajicek K R AY IH CH EH K krajina K R AY N AH +krajina(2) K R AY IY N AH krajina's K R AY N AH Z krajina's(2) K R AY IY N AH Z -krajina(2) K R AY IY N AH kraker K R EY K ER krakow K R AA K AW krakow(2) K R AA K AA V @@ -66589,8 +66621,8 @@ krell K R EH L kremer K R IY M ER kremers K R IY M ER Z kremlin K R EH M L AH N -kremlin's K R EH M L IH N Z kremlin(2) K R EH M L IH N +kremlin's K R EH M L IH N Z kremlinologist K R EH M L IH N AA L AH JH IH S T kremlinologists K R EH M L IH N AA L AH JH IH S T S krempa K R EH M P AH @@ -67047,9 +67079,9 @@ kunzler K AH N Z L ER kunzman K AH N Z M AH N kuo K UW OW kuomintang K W OW M IH N T AE NG +kuomintang(2) G W OW M IH N T AE NG kuomintang's K W OW M IH N T AE NG Z kuomintang's(2) G W OW M IH N T AE NG Z -kuomintang(2) G W OW M IH N T AE NG kuow K Y UW OW kupek K UW P IH K kuper K Y UW P ER @@ -68294,8 +68326,8 @@ larner L AA R N ER larocca L AA R OW K AH larocco L AA R OW K OW laroche L AA R OW SH -laroche's L AA R OW SH IH Z laroche(2) L ER OW SH +laroche's L AA R OW SH IH Z larochelle L AE R AH SH AH L larock L AE R AH K larocque L ER OW K @@ -68416,8 +68448,8 @@ lassner L AE S N ER lasso L AE S OW lasswell L AE S W EH L last L AE S T -last's L AE S T S last(2) L AE S +last's L AE S T S last-minute L AE S M IH N AH T lasted L AE S T AH D lasted(2) L AE S T IH D @@ -68663,9 +68695,9 @@ lauricella L AO R IH S EH L AH laurich L AW R IH K lauridsen L AO R IH D S AH N laurie L AO R IY +laurie(2) L AA R IY laurie's L AO R IY Z laurie's(2) L AA R IY Z -laurie(2) L AA R IY laurin L AO R IH N laurino L AO R IY N OW lauritsen L AW R IH T S AH N @@ -68744,8 +68776,8 @@ lavoro L AH V AO R OW lavoy L AH V OY lavy L EY V IY law L AO -law's L AO Z law(2) L AA +law's L AO Z lawall L AW AH L laware L AH W EH R lawbreaker L AO B R EY K ER @@ -68804,14 +68836,14 @@ lawther L AO DH ER lawton L AO T AH N lawver L AA V ER lawyer L AO Y ER -lawyer's L AO Y ER Z lawyer(2) L OY ER +lawyer's L AO Y ER Z lawyered L AO Y ER D lawyering L AO Y ER IH NG lawyerly L AO Y ER L IY lawyers L AO Y ER Z -lawyers' L AO Y ER Z lawyers(2) L OY ER Z +lawyers' L AO Y ER Z lax L AE K S laxalt L AE K S AA L T laxative L AE K S AH T IH V @@ -69399,9 +69431,9 @@ leibovit L IY B AH V IH T leibovitz L IY B AH V IH T S leibowitz L IY B OW IH T S leibrand L AY B R AE N D +leibrand(2) L IY B R AE N D leibrand's L AY B R AE N D Z leibrand's(2) L IY B R AE N D Z -leibrand(2) L IY B R AE N D leibrock L AY B R AH K leiby L IY B IY leicester L EH S T ER @@ -69619,8 +69651,8 @@ leniently L IY N Y AH N T L IY lenig L EH N IH G lenihan L EH N IH HH AE N lenin L EH N AH N -lenin's L EH N IH N Z lenin(2) L EH N IH N +lenin's L EH N IH N Z leningrad L EH N AH N G R AE D leningrad(2) L EH N IH N G R AE D lenington L EH N IH NG T AH N @@ -69645,9 +69677,9 @@ lennon's L EH N AH N Z lennox L EH N AH K S lenny L EH N IY leno L EH N OW +leno(2) L IY N OW leno's L EH N OW Z leno's(2) L IY N OW Z -leno(2) L IY N OW lenon L EH N AH N lenora L EH N ER AH lenore L AH N AO R @@ -69984,9 +70016,9 @@ levied L EH V IY D levien L EH V IY AH N levies L EH V IY Z levin L EH V IH N +levin(2) L AH V IH N levin's L EH V IH N Z levin's(2) L AH V IH N Z -levin(2) L AH V IH N levina L EH V IY N AH levine L AH V IY N levine's L AH V IY N Z @@ -70022,9 +70054,9 @@ levittown's L EH V IH T AW N Z levity L EH V IH T IY levitz L EH V IH T S levy L EH V IY +levy(2) L IY V IY levy's L EH V IY Z levy's(2) L IY V IY Z -levy(2) L IY V IY levying L EH V IY IH NG lew L UW lewallen L UW AO L AH N @@ -70049,9 +70081,9 @@ lewins L UW IH N Z lewinski L UW IH N S K IY lewinski(2) L AH W IH N S K IY lewinsky L UW IH N S K IY +lewinsky(2) L AH W IH N S K IY lewinsky's L UW IH N S K IY Z lewinsky's(2) L AH W IH N S K IY Z -lewinsky(2) L AH W IH N S K IY lewinsohn L UW IH N S AH N lewinton L UW IH N T AH N lewis L UW IH S @@ -70455,9 +70487,9 @@ likhyani L IH K Y AA N IY liking L AY K IH NG likins L IH K IH N Z likud L IH K AH D +likud(2) L IY K UW D likud's L IH K AH D Z likud's(2) L IY K UW D Z -likud(2) L IY K UW D lil L IH L lila L IY L AH lilac L AY L AE K @@ -70548,9 +70580,9 @@ limit L IH M AH T limitation L IH M IH T EY SH AH N limitations L IH M IH T EY SH AH N Z limited L IH M AH T AH D +limited(2) L IH M IH T IH D limited's L IH M AH T AH D Z limited's(2) L IH M IH T IH D Z -limited(2) L IH M IH T IH D limiting L IH M AH T IH NG limitless L IH M AH T L AH S limits L IH M AH T S @@ -71103,8 +71135,8 @@ liverwort L IH V ER W ER T liverworts L IH V ER W ER T S livery L IH V ER IY lives L IH V Z -lives' L AY V Z lives(2) L AY V Z +lives' L AY V Z livesay L IH V IH S EY livesey L IH V IH S IY livestock L AY V S T AA K @@ -71778,9 +71810,9 @@ lorenzetti L AO R EH N Z EH T IY lorenzi L AO R EH N Z IY lorenzini L AO R EH N Z IY N IY lorenzo L ER EH N Z OW +lorenzo(2) L AO EH N Z OW lorenzo's L AO R EH N Z OW Z lorenzo's(2) L ER EH N Z OW Z -lorenzo(2) L AO EH N Z OW loreto L AO R EH T OW loretta L ER EH T AH lorette L AO R EH T @@ -71855,8 +71887,8 @@ lost L AO S T losurdo L OW S UH R D OW losure L OW ZH ER lot L AA T -lot's L AA T S lot(2) L AO T +lot's L AA T S loth L AA TH lothian L AA TH IY AH N lothrop L AA TH R AH P @@ -71928,11 +71960,11 @@ louie L UW IY louima L UW IY M AH louima's L UW IY M AH Z louis L UW IH S +louis(2) L UW IY louis' L UW IH S louis'(2) L UW IY Z louis'(3) L UW IH S IH Z louis's L UW IH S IH Z -louis(2) L UW IY louisa L UW IY Z AH louisan L UW IH S AH N louise L UW IY Z @@ -72630,9 +72662,9 @@ luxembourg L AH K S AH M B AO R G luxembourg(2) L AH K S AH M B ER G luxor L AH K S ER luxottica L AH K S OW T IY K AH +luxottica(2) L AH K S AA T IH K AH luxottica's L AH K S OW T IY K AH Z luxottica's(2) L AH K S AA T IH K AH Z -luxottica(2) L AH K S AA T IH K AH luxton L AH K S T AH N luxuriant L AH G ZH ER IY AH N T luxuries L AH G ZH ER IY Z @@ -72737,15 +72769,15 @@ lyon L AY AH N lyon's L AY AH N Z lyondell L AY AH N D EH L lyonnais L IY AH N EY -lyonnais's L AY AH N EY Z IH Z lyonnais(2) L AY AH N EY Z +lyonnais's L AY AH N EY Z IH Z lyonnaise L AY AH N EY Z lyons L AY AH N Z lyons's L AY AH N Z IH Z lyphomed L AY F AH M EH D +lyphomed(2) L IH F AH M EH D lyphomed's L AY F AH M EH D Z lyphomed's(2) L IH F AH M EH D Z -lyphomed(2) L IH F AH M EH D lyra L AY R AH lyre L AY R lyric L IH R IH K @@ -72780,19 +72812,12 @@ m EH M m'bow M B OW m'bow(2) EH M B OW m's EH M Z -m-8 EH M EY T -m-80 EH M EY T IY m-code EH M K OW D m-codes EH M K OW D Z m. EH M m.'s EH M Z m.d. EH M D IY m.s EH M Z -m1 EH M W AH N -m2 EH M T UW -m3 EH M TH R IY -m4 EH M F AO R -m5 EH M F AY V ma M AA ma'am M AE M maack M AA K @@ -72880,9 +72905,9 @@ maceachern M AH K IY CH ER N maceda M AH S EY D AH macedo M AH S EY D OW macedonia M AE S AH D OW N IY AH +macedonia(2) M AE K AH D OW N IY AH macedonia's M AE S AH D OW N IY AH Z macedonia's(2) M AE K AH D OW N IY AH Z -macedonia(2) M AE K AH D OW N IY AH macedonian M AE S AH D OW N Y AH N macedonian(2) M AE K AH D OW N Y AH N macedonians M AE S AH D OW N IY AH N Z @@ -72921,9 +72946,9 @@ machetes M AH SH EH T IY Z machetes(2) M AH CH EH T IY Z machi M AA K IY machiavelli M AA K IY AH V EH L IY +machiavelli(2) M AA K Y AH V EH L IY machiavelli's M AA K IY AH V EH L IY Z machiavelli's(2) M AA K Y AH V EH L IY Z -machiavelli(2) M AA K Y AH V EH L IY machiavellian M AA K IY AH V EH L IY AH N machiavellian(2) M AA K Y AH V EH L IY AH N machida M AH CH IY D AH @@ -73044,9 +73069,9 @@ macoutes M AH K UW T S macphail M AH K F EY L macphee M AH K F IY macpherson M AH K F ER S AH N +macpherson(2) M AH K F IH R S AH N macpherson's M AH K F ER S AH N Z macpherson's(2) M AH K F IH R S AH N Z -macpherson(2) M AH K F IH R S AH N macquarrie M AH K EH R IY macqueen M AH K W IY N macrae M AH K R EY @@ -73142,9 +73167,9 @@ madigan M AE D IH G AH N madill M AA D IY L madis M AE D AH S madison M AE D AH S AH N +madison(2) M AE D IH S AH N madison's M AE D AH S AH N Z madison's(2) M AE D IH S AH N Z -madison(2) M AE D IH S AH N madkins M AE D K IH N Z madl M AE D AH L madlen M AE D AH L AH N @@ -73281,9 +73306,9 @@ magistrate(2) M AE JH IH S T R EY T magistrates M AE JH IH S T R EY T S magistro M AA JH IY S T R OW maglaj M AA G L AY +maglaj(2) M AE G L AY maglaj's M AA G L AY Z maglaj's(2) M AE G L AY Z -maglaj(2) M AE G L AY maglev M AE G L EH V magley M AE G L IY magli M AE G L IY @@ -73900,17 +73925,17 @@ manageable M AE N IH JH AH B AH L managed M AE N AH JH D managed(2) M AE N IH JH D management M AE N AH JH M AH N T -management's M AE N IH JH M AH N T S management(2) M AE N IH JH M AH N T +management's M AE N IH JH M AH N T S managements M AE N IH JH M AH N T S managements' M AE N IH JH M AH N T S manager M AE N AH JH ER -manager's M AE N IH JH ER Z manager(2) M AE N IH JH ER +manager's M AE N IH JH ER Z managerial M AE N IH JH IH R IY AH L managers M AE N AH JH ER Z -managers' M AE N AH JH ER Z managers(2) M AE N IH JH ER Z +managers' M AE N AH JH ER Z manages M AE N IH JH IH Z managing M AE N AH JH IH NG managua M AH N AA G W AH @@ -74508,10 +74533,10 @@ marga M AA R G AH margalo M AA R G AA L OW margalov M AA G AH L AO V margaret M AA R G ER IH T -margaret's M AA R G ER IH T S -margaret's(2) M AA R G R IH T S margaret(2) M AA R G R AH T margaret(3) M AA R G R IH T +margaret's M AA R G ER IH T S +margaret's(2) M AA R G R IH T S margareta M AA R G AA R EH T AH margarete M AA R G ER IY T margarethe M AA R G AA R EH DH IY @@ -74602,9 +74627,9 @@ marilin M AE R IH L IH N marilla M AA R IH L AH marilu M EH R IY L UW marilyn M EH R AH L AH N +marilyn(2) M EH R AH L IH N marilyn's M EH R AH L AH N Z marilyn's(2) M EH R AH L IH N Z -marilyn(2) M EH R AH L IH N marilynn M EH R AH L AH N marimba M ER IH M B AH marimbalax M ER IH M B AH L AH K S @@ -74690,8 +74715,8 @@ markers M AA R K ER Z markert M AA R K ER T markese M AA R K IY S market M AA R K AH T -market's M AA R K AH T S market(2) M AA R K IH T +market's M AA R K AH T S marketability M AA R K IH T AH B IH L IH T IY marketable M AA R K AH T AH B AH L marketamerica M AA R K AH T AH M EH R IH K AH @@ -74710,12 +74735,12 @@ marketings M AA R K AH T IH NG Z marketmaker M AA R K AH T M EY K ER marketmakers M AA R K AH T M EY K ER Z marketplace M AA R K AH T P L EY S -marketplace's M AA R K AH T P L EY S IH Z marketplace(2) M AA R K IH T P L EY S +marketplace's M AA R K AH T P L EY S IH Z marketplaces M AA R K AH T P L EY S IH Z markets M AA R K AH T S -markets' M AA R K IH T S markets(2) M AA R K IH T S +markets' M AA R K IH T S marketscope M AA R K AH T S K OW P marketwide M AA R K AH T W AY D markey M AA R K IY @@ -74983,8 +75008,8 @@ martian M AA R SH AH N martians M AA R SH AH N Z martie M AA R T IY martin M AA R T AH N -martin's M AA R T AH N Z martin(2) M AA R T IH N +martin's M AA R T AH N Z martina M AA R T IY N AH martindale M AA R T IH N D EY L martine M AA R T IY N @@ -75097,6 +75122,9 @@ marzano M AA R Z AA N OW marzec M AA R Z IH K marzette M AA R Z EH T marzilli M AA R Z IY L IY +marzipan M AA R Z AH P AE N +marzipan(2) M AA R T S AH P AA N +marzipan(3) M AA R T S AH P AE N marzo M AA R Z OW marzolf M AA R Z OW L F marzotto M AA R Z AA T OW @@ -75309,9 +75337,9 @@ mastrangelo M AA S T R AA NG G EH L OW mastrianni M AA S T R IY AA N IY mastriano M AA S T R IY AA N OW mastrich M AE S T R IH CH +mastrich(2) M AA S T R IH K mastrich's M AE S T R IH CH IH Z mastrich's(2) M AA S T R IH K S -mastrich(2) M AA S T R IH K mastro M AE S T R OW mastrocola M AE S T R OW K OW L AH mastrogiovanni M AE S T R OW JH OW V AA N IY @@ -75662,9 +75690,9 @@ maureen M AO R IY N maurer M AO R ER mauri M AO R IY maurice M AO R IY S +maurice(2) M AA R IH S maurice's M AO R AH S AH Z maurice's(2) M AO R IY S AH Z -maurice(2) M AA R IH S mauricio M AW R IY S IY OW maurie M AO R IY mauriello M AO R IY EH L OW @@ -75700,9 +75728,9 @@ maven M EY V AH N maven's M EY V AH N Z mavens M EY V AH N Z maverick M AE V ER IH K +maverick(2) M AE V R IH K maverick's M AE V ER IH K S maverick's(2) M AE V R IH K S -maverick(2) M AE V R IH K mavericks M AE V ER IH K S mavericks(2) M AE V R IH K S maverix M AE V ER IH K S @@ -75843,9 +75871,9 @@ mazaitis M AH Z AY T IH S mazanec M AH Z AE N IH K mazankowski M AE Z AH NG K AW S K IY mazda M AA Z D AH +mazda(2) M AE Z D AH mazda's M AA Z D AH Z mazda's(2) M AE Z D AH Z -mazda(2) M AE Z D AH maze M EY Z mazeika M AH Z AY K AH mazel M AH Z AH L @@ -75913,9 +75941,9 @@ mcaffee(2) M AH K AE F IY mcafferty M AH K AE F ER T IY mcaleer M AE K AH L IH R mcaleese M AH K AH L IY Z +mcaleese(2) M AH K AH L IY Z IY mcaleese's M AH K AH L IY S IY Z mcaleese's(2) M AH K AH L IY S IH Z -mcaleese(2) M AH K AH L IY Z IY mcalexander M AH K AE L IH G Z AE N D ER mcalinden M AH K L IH N D AH N mcalister M AH K AE L AH S T ER @@ -76684,9 +76712,9 @@ mclawhorn M AH K L AE W ER N mclawhorn(2) M AH K L AW HH AO R N mclay M AH K L EY mclean M AH K L IY N +mclean(2) M AH K L EY N mclean's M AH K L IY N Z mclean's(2) M AH K L EY N Z -mclean(2) M AH K L EY N mclear M AH K L IH R mcleary M AH K L IH R IY mclees M AH K L IY Z @@ -77125,9 +77153,9 @@ medic M EH D IH K medic's M EH D IH K S medicaid M EH D AH K EY D medical M EH D AH K AH L +medical(2) M EH D IH K AH L medical's M EH D AH K AH L Z medical's(2) M EH D IH K AH L Z -medical(2) M EH D IH K AH L medically M EH D AH K L IY medically(2) M EH D IH K AH L IY medicare M EH D AH K EH R @@ -77752,8 +77780,8 @@ mentions M EH N SH AH N Z mento M EH N T OW menton M EH N T AH N mentor M EH N T AO R -mentor's M EH N T AO R Z mentor(2) M EH N T ER +mentor's M EH N T AO R Z mentored M EH N T ER D mentoring M EH N T ER IH NG mentors M EH N T ER Z @@ -77786,9 +77814,9 @@ merabank M EH R AH B AE NG K meranda M ER AA N D AH meraz M EH R AA Z merc M ER K +merc(2) M AA R K merc's M ER K S merc's(2) M AA R K S -merc(2) M AA R K mercadante M ER K AA D AA N T IY mercado M ER K AA D OW mercantil M ER K AE N T IH L @@ -78379,17 +78407,17 @@ micheal M AY K AH L micheaux M IH SH OW micheaux's M IH SH OW Z michel M IH SH EH L +michel(2) M IH CH AH L +michel(3) M AY K AH L michel's M IH SH EH L Z michel's(2) M IH CH AH L Z michel's(3) M AY K AH L Z -michel(2) M IH CH AH L -michel(3) M AY K AH L michela M IH K EY L AH michela's M IH K EY L AH Z michelangelo M AY K AH L AE N JH AH L OW +michelangelo(2) M IH K AH L AE N JH AH L OW michelangelo's M AY K AH L AE N JH AH L OW Z michelangelo's(2) M IH K AH L AE N JH AH L OW Z -michelangelo(2) M IH K AH L AE N JH AH L OW michelangelos M AY K AH L AE N JH AH L OW Z michelangelos(2) M IH K AH L AE N JH AH L OW Z michele M IH SH EH L @@ -78777,9 +78805,9 @@ milady M IH L EY D IY milagro M IH L AE G R OW milam M IH L AH M milan M AH L AA N -milan's M IH L AA N Z milan(2) M IH L AA N milan(3) M AY L AE N +milan's M IH L AA N Z milani M IY L AA N IY milano M IY L AA N OW milanowski M IH L AH N AO F S K IY @@ -78849,14 +78877,14 @@ militarists M IH L AH T ER IH S T S militarize M IH L AH T ER AY Z militarized M IH L AH T ER AY Z D military M IH L AH T EH R IY -military's M IH L IH T EH R IY Z military(2) M IH L IH T EH R IY +military's M IH L IH T EH R IY Z militate M IH L IH T EY T militello M IY L IY T EH L OW militia M AH L IH SH AH +militia(2) M IH L IH SH AH militia's M AH L IH SH AH Z militia's(2) M IH L IH SH AH Z -militia(2) M IH L IH SH AH militiamen M AH L IH SH AH M IH N militias M AH L IH SH AH Z militias(2) M IH L IH SH AH Z @@ -78984,8 +79012,8 @@ milonas M IY L OW N AA Z milone M IH L OW N milos M IY L OW Z milosevic M IH L OW S AH V IH K -milosevic's M IH L OW S AH V IH CH IH Z milosevic(2) M IH L OW S AH V IH CH +milosevic's M IH L OW S AH V IH CH IH Z milosevich M IH L AA S IH V IH CH milosh M IH L AO SH milot M IH L AH T @@ -79106,9 +79134,9 @@ miner M AY N ER miner's M AY N ER Z minera M IH N EH R AH mineral M IH N ER AH L +mineral(2) M IH N R AH L mineral's M IH N ER AH L Z mineral's(2) M IH N R AH L Z -mineral(2) M IH N R AH L mineralization M IH N ER AH L AH Z EY SH AH N mineralize M IH N ER AH L AY Z mineralogically M IH N ER AH L AA JH IH K AH L IY @@ -79117,9 +79145,9 @@ mineralogist M IH N ER AE L AH JH IH S T mineralogist(2) M IH N ER AA L AH JH IH S T mineralogy M IH N ER AA L AH JH IY minerals M IH N ER AH L Z +minerals(2) M IH N R AH L Z minerals' M IH N ER AH L Z minerals'(2) M IH N R AH L Z -minerals(2) M IH N R AH L Z minerd M IH N ER D minero M IH N EH R OW miners M AY N ER Z @@ -79204,21 +79232,21 @@ minish M IH N IH SH miniskirt M IH N IY S K ER T miniskirts M IH N IY S K ER T S minister M IH N AH S T ER -minister's M IH N IH S T ER Z minister(2) M IH N IH S T ER +minister's M IH N IH S T ER Z ministerial M IH N IH S T IY R IY AH L ministering M IH N IH S T R IH NG ministers M IH N AH S T ER Z -ministers' M IH N IH S T ER Z ministers(2) M IH N IH S T ER Z +ministers' M IH N IH S T ER Z ministership M IH N IH S T ER SH IH P ministral M IH N AH S T R AH L ministration M IH N AH S T R EY SH AH N ministrations M IH N AH S T R EY SH AH N Z ministries M IH N IH S T R IY Z ministry M IH N AH S T R IY -ministry's M IH N AH S T R IY Z ministry(2) M IH N IH S T R IY +ministry's M IH N AH S T R IY Z minisupercomputer M IH N IY S UW P ER K AH M P Y UW T ER minisupercomputers M IH N IY S UW P ER K AH M P Y UW T ER Z minit M IH N IH T @@ -79326,9 +79354,9 @@ minus M AY N AH S minuscule M IH N AH S K Y UW L minuses M AY N AH S IH Z minute M IH N AH T -minute's M IH N AH T S minute(2) M AY N UW T minute(3) M AY N Y UW T +minute's M IH N AH T S minutely M IH N AH T L IY minuteman M IH N AH T M AE N minutemen M IH N AH T M EH N @@ -79704,9 +79732,9 @@ missive M IH S IH V missler M IH S L ER missoula M IH Z UW L AH missouri M AH Z UH R IY +missouri(2) M AH Z ER AH missouri's M AH Z UH R IY Z missouri's(2) M AH Z ER AH Z -missouri(2) M AH Z ER AH missourian M AH Z UH R IY AH N missourians M AH Z UH R IY AH N Z misspeak M IH S S P IY K @@ -79850,8 +79878,8 @@ mitsuba M IY T S UW B AH mitsubishi M IH T S UW B IY SH IY mitsubishi's M IH T S UW B IY SH IY Z mitsui M IY T S UW IY -mitsui's M IY T S UW IY Z mitsui(2) M IH T S UW IY +mitsui's M IY T S UW IY Z mitsukoshi M IY T S UW K OW SH IY mitsuru M IY T S UW R UW mitt M IH T @@ -79867,12 +79895,12 @@ mitten M IH T AH N mittendorf M IH T IH N D AO R F mittens M IH T AH N Z mitterand M IY T ER AO N D +mitterand(2) M IY T ER AE N D mitterand's M IY T ER AO N D Z mitterand's(2) M IY T ER AE N D Z -mitterand(2) M IY T ER AE N D mitterrand M IY T ER AO N D -mitterrand's M IY T ER AE N D Z mitterrand(2) M IY T ER AE N D +mitterrand's M IY T ER AE N D Z mittleman M IH T AH L M AH N mittler M IH T L ER mittman M IH T M AH N @@ -80406,9 +80434,9 @@ mondale's M AA N D EY L Z mondallo M AA N D AE L OW mondavi M AA N D AA V IY monday M AH N D IY +monday(2) M AH N D EY monday's M AH N D IY Z monday's(2) M AH N D EY Z -monday(2) M AH N D EY mondays M AH N D IY Z mondays(2) M AH N D EY Z monde M AA N D @@ -80791,9 +80819,9 @@ mooradian M UH R EY D IY AH N moorco M UH R K OW moorco(2) M AO R K OW moore M UH R +moore(2) M AO R moore's M UH R Z moore's(2) M AO R Z -moore(2) M AO R moored M UH R D moorefield M UH R IH F IY L D moorefield(2) M UH R F IY L D @@ -81060,16 +81088,16 @@ morrell M AO R EH L morren M AO R AH N morrical M AO R IH K AH L morricone M AO R AH K OW N +morricone(2) M AO R AH K OW N IY morricone's M AO R AH K OW N Z morricone's(2) M AO R AH K OW N IY Z -morricone(2) M AO R AH K OW N IY morrie M AO R IY morrill M AO R IY L morrin M AO R IH N morris M AO R AH S +morris(2) M AO R IH S morris' M AO R AH S morris's M AO R IH S IH Z -morris(2) M AO R IH S morrisett M AO R AH S EH T morrisette M AO R IH S EH T morrisey M AO R IH S IY @@ -81111,8 +81139,8 @@ mortensen M AO R T IH N S AH N mortenson M AO R T IH N S AH N morter M AO R T ER mortgage M AO R G AH JH -mortgage's M AO R G IH JH IH Z mortgage(2) M AO R G IH JH +mortgage's M AO R G IH JH IH Z mortgaged M AO R G IH JH D mortgagepower M AO R G IH JH P AW R mortgages M AO R G AH JH AH Z @@ -81156,9 +81184,9 @@ mosco M OW S K OW moscom M AO S K AH M moscoso M OW S K OW S OW moscow M AA S K OW +moscow(2) M AO S K AW moscow's M AO S K OW Z moscow's(2) M AA S K AW Z -moscow(2) M AO S K AW moscowane M AA S K OW W EY N moscowitz M AA S K AH W IH T S mose M OW Z @@ -81174,9 +81202,9 @@ moses(2) M OW Z IH S mosey M OW Z IY mosh M AO SH moshe M OW SH EH +moshe(2) M OW SH AH moshe's M OW SH EH Z moshe's(2) M OW SH AH Z -moshe(2) M OW SH AH mosher M OW ZH ER moshier M AA SH IY ER moshood M AA S HH UH D @@ -81227,6 +81255,7 @@ mossholder M AO S HH OW L D ER mosslike M AO S L AY K mossman M AO S M AH N mosso M OW S OW +mossy M AO S IY most M OW S T most(2) M OW S mostaert M AH S T EY R T @@ -81430,6 +81459,7 @@ mousers M AW Z ER Z mousetrap M AW S T R AE P mousley M AW S L IY moussa M AW S AH +moussaka M UW S AA K AH mousse M UW S mousseau M UW S OW moussorgsky M UW S AO R G S K IY @@ -81515,9 +81545,9 @@ mozambicans M OW Z AE M B IY K AH N Z mozambique M OW Z AE M B IY K mozambique(2) M OW Z AH M B IY K mozart M OW Z AA R T +mozart(2) M OW T S AA R T mozart's M OW Z AA R T S mozart's(2) M OW T S AA R T S -mozart(2) M OW T S AA R T mozartean M OW Z AA R T IY AH N mozartean(2) M OW T Z AA R T IY AH N mozee M AA Z IY @@ -81527,6 +81557,7 @@ mozer M OW Z ER mozer's M OW Z ER Z mozingo M OW Z IY NG G OW mozley M AA Z L IY +mozzarella M AA T S AH R EH L AH mpeg EH M P EH G mpg EH M P IY JH IY mpg(2) M AY L Z P ER G AE L AH N @@ -81561,9 +81592,9 @@ mu M UW muammar M UW AE M ER muavenet M UW AH V EH N IH T mubarak M UW B AA R IH K +mubarak(2) M Y UW B AA R IH K mubarak's M UW B AA R IH K S mubarak's(2) M Y UW B AA R IH K S -mubarak(2) M Y UW B AA R IH K mucci M UW CH IY muccio M UW CH IY OW much M AH CH @@ -81746,6 +81777,7 @@ mullett M UW L IH T mullican M AH L IH K AH N mulligan M AH L IH G AH N mulligans M AH L IH G AH N Z +mulligatawny M AH L IH G AH T AA N IY mulliken M AH L IH K AH N mullikin M AH L IH K IH N mullin M AH L IH N @@ -81803,9 +81835,9 @@ multilingual(2) M AH L T AY L IH NG W AH L multimarket M AH L T IY M AA R K IH T multimate M AH L T IY M EY T multimedia M AH L T IY M IY D IY AH +multimedia(2) M AH L T AY M IY D IY AH multimedia's M AH L T IY M IY D IY AH Z multimedia's(2) M AH L T AY M IY D IY AH Z -multimedia(2) M AH L T AY M IY D IY AH multimillion M AH L T AY M IH L Y AH N multimillion(2) M AH L T IY M IH L Y AH N multimillionaire M AH L T IY M IH L Y AH N EH R @@ -81873,6 +81905,8 @@ mumia M AH M IY Y AH mumm M AH M mumma M AH M AH mumme M AH M +mummer M AH M ER +mummer's M AH M ER Z mummert M AH M ER T mummey M AH M IY mummies M AH M IY Z @@ -82049,8 +82083,8 @@ murphys M ER F IY Z murr M ER murrah M ER R AA murray M ER IY -murray's M ER IY Z murray(2) M AH R IY +murray's M ER IY Z murree M ER IY murrelet M ER L IH T murrell M AO R AH L @@ -82365,7 +82399,9 @@ n.s EH N Z na N AA naab N AA B naacp EH N EY EY S IY P IY +naan N AA N naas N AA Z +naas(2) N EY S nab N AE B nabb N AE B nabbed N AE B D @@ -82620,8 +82656,8 @@ napkin N AE P K IH N napkins N AE P K IH N Z naples N EY P AH L Z napoleon N AH P OW L IY AH N -napoleon's N AH P OW L IY AH N Z napoleon(2) N AH P OW L Y AH N +napoleon's N AH P OW L IY AH N Z napoleonic N AH P OW L IY AA N IH K napoles N AE P AH L Z napoletano N AA P OW L EH T AA N OW @@ -82773,9 +82809,9 @@ natalle N AH T AA L EY natalle's N AH T AA L EY Z natan N EY T AH N natasha N AH T AA SH AH +natasha(2) N AH T AE SH AH natasha's N AH T AA SH AH Z natasha's(2) N AH T AE SH AH Z -natasha(2) N AH T AE SH AH natcher N AE CH ER natchez N AE CH EH Z natchez' N AE CH EH Z @@ -82800,9 +82836,9 @@ nation N EY SH AH N nation's N EY SH AH N Z nationair N EY SH AH N EH R national N AE SH AH N AH L +national(2) N AE SH N AH L national's N AE SH AH N AH L Z national's(2) N AE SH N AH L Z -national(2) N AE SH N AH L nationale N AE SH AH N AE L EY nationale(2) N AE SH AH N AH L nationales N AE SH AH N AA L EH S @@ -82840,9 +82876,9 @@ nationhood N EY SH AH N HH UH D nations N EY SH AH N Z nations' N EY SH AH N Z nationsbanc N EY SH AH N Z B AE NG K +nationsbanc(2) N EY SH AH N Z B AA NG K nationsbanc's N EY SH AH N Z B AE NG K S nationsbanc's(2) N EY SH AH N Z B AA NG K S -nationsbanc(2) N EY SH AH N Z B AA NG K nationsbank N EY SH AH N Z B AE NG K nationsbank's N EY SH AH N Z B AE NG K S nationwide N EY SH AH N W AY D @@ -82867,9 +82903,9 @@ nattily N AE T AH L IY natty N AE T IY natuna N AH T UW N AH natural N AE CH ER AH L +natural(2) N AE CH R AH L natural's N AE CH ER AH L Z natural's(2) N AE CH R AH L Z -natural(2) N AE CH R AH L naturalism N AE CH ER AH L IH Z AH M naturalism(2) N AE CH R AH L IH Z AH M naturalist N AE CH ER AH L AH S T @@ -82995,8 +83031,8 @@ nbc EH N B IY S IY nbc's EH N B IY S IY Z ndau EH N D AW ne N IY -ne'er N EH R ne(2) N EY +ne'er N EH R neace N IY S nead N IY D neagle N IY G AH L @@ -83196,8 +83232,8 @@ negotiation N IH G OW SH IY EY SH AH N negotiations N AH G OW SH IY EY SH AH N Z negotiations(2) N IH G OW SH IY EY SH AH N Z negotiator N AH G OW SH IY EY T ER -negotiator's N IH G OW SH IY EY T ER Z negotiator(2) N IH G OW SH IY EY T ER +negotiator's N IH G OW SH IY EY T ER Z negotiators N IH G OW SH IY EY T ER Z negotiators' N AH G OW SH IY EY T ER Z negrete N EH G R IY T @@ -83420,9 +83456,9 @@ nesci N EH S IY nesheim N EH S HH AY M nesi N EH S IY nesler N EH S AH L ER +nesler(2) N EH S L ER nesler's N EH S AH L ER Z nesler's(2) N EH S L ER Z -nesler(2) N EH S L ER nesmith N EH Z M IH TH ness N EH S nessa N EH S AH @@ -83444,9 +83480,9 @@ nester N EH S T ER nesters N EH S T ER Z nesting N EH S T IH NG nestle N EH S AH L +nestle(2) N EH S L IY nestle's N EH S AH L Z nestle's(2) N EH S L IY Z -nestle(2) N EH S L IY nestled N EH S AH L D nestler N EH S AH L ER nestler(2) N EH S L ER @@ -83465,6 +83501,7 @@ netanyahu N EH T AH N Y AA HH UW netanyahu's N EH T AH N Y AA HH UW Z netback N EH T B AE K netcom N EH T K AA M +netflix N EH T F L IH K S neth N EH TH nether N EH DH ER nethercutt N EH TH ER K AH T @@ -83607,9 +83644,9 @@ neuwirth N UW W ER TH neuzil N UW Z AH L neva N EY V AH nevada N AH V AA D AH +nevada(2) N AH V AE D AH nevada's N AH V AE D AH Z nevada's(2) N AH V AA D AH Z -nevada(2) N AH V AE D AH nevadan N AH V AE D AH N nevadans N AH V AE D AH N Z nevala N EY V AA L AH @@ -83671,8 +83708,8 @@ new-yorkers N UW Y AO R K ER Z new-zealand N UW Z IY L AH N D newall N UW AO L newark N UW ER K -newark's N Y UW ER K S newark(2) N Y UW ER K +newark's N Y UW ER K S newbauer N UW B AW ER newberg N UW B ER G newberger N UW B ER G ER @@ -83754,9 +83791,9 @@ newport's N UW P AO R T S newport-news N UW P AO R T N UW Z newquist N UW K W IH S T news N UW Z +news(2) N Y UW Z news' N UW Z news's N UW Z IH Z -news(2) N Y UW Z newscast N UW Z K AE S T newscaster N UW Z K AE S T ER newscasters N UW Z K AE S T ER Z @@ -83835,8 +83872,8 @@ nexgen N EH K S JH EH N nexis N EH K S IH S nexrad N EH K S R AE D next N EH K S T -next's N EH K S T S next(2) N EH K S +next's N EH K S T S nextel N EH K S T EH L nextel's N EH K S T EH L Z nextstep N EH K S T S T EH P @@ -83860,8 +83897,7 @@ ngai(2) EH N G AY ngema EH N G EH M AA nghi G IY nghi(2) EH N G IY -ngo EH NG JH IY OW -ngo's EH NG JH IY OW Z +ngo EH NG G OW ngor EH NG G AO R ngos EH NG G OW Z ngueppe EH NG G EH P IY @@ -83914,11 +83950,11 @@ niches N IH CH IH Z nichol N IH K AO L nichola N IH HH OW L AH nicholas N IH K AH L AH S +nicholas(2) N IH K L AH S nicholas' N IH K AH L AH S nicholas'(2) N IH K L AH S nicholas's N IH K AH L AH S IH Z nicholas's(2) N IH K L AH S IH Z -nicholas(2) N IH K L AH S nichole N IH K OW L nicholes N IH K OW L Z nicholi N IH K AH L AY @@ -84073,9 +84109,9 @@ niese N IY Z niesen N IY S AH N niess N IY S nieto N IY T OW +nieto(2) N IY AH T OW nieto's N IY T OW Z nieto's(2) N IY AH T OW Z -nieto(2) N IY AH T OW nietzsche N IY CH IY nieves N IY EH V EH S niezgoda N IY Z G OW D AH @@ -84155,9 +84191,9 @@ nikita N IH K IY T AH nikita(2) N AH K IY T AH nikk's N IH K S nikkei N IH K EY -nikkei's N IY K EY Z nikkei(2) N IY K EY nikkei(3) N AY K IY +nikkei's N IY K EY Z nikkel N IH K AH L nikkhah N IH K HH AA nikki N IH K IY @@ -84259,9 +84295,9 @@ nirenberg N AY R AH N B ER G niriko N IH R IH K OW niro N IH R OW nirvana N IH R V AA N AH +nirvana(2) N ER V AA N AH nirvana's N IH R V AA N AH Z nirvana's(2) N ER V AA N AH Z -nirvana(2) N ER V AA N AH nirvanas N IH R V AA N AH Z nirvanas(2) N ER V AA N AH Z nisbet N IH Z B AH T @@ -84403,11 +84439,11 @@ nobly N AA B L IY nobodies N OW B AA D IY Z nobodies(2) N OW B AH D IY Z nobody N OW B AA D IY +nobody(2) N OW B AH D IY nobody'd N OW B AA D IY D nobody'd(2) N OW B AH D IY D nobody's N OW B AA D IY Z nobody's(2) N OW B AH D IY Z -nobody(2) N OW B AH D IY noboru N OW B AO R UW nobrega N AA B R IH G AH nobriga N AA B R IH G AH @@ -85096,9 +85132,9 @@ norwitz N AO R W IH T S norwood N AO R W UH D norwyn N AO R W IH N nosair N OW Z EY R +nosair(2) N OW S EY R nosair's N OW Z EY R Z nosair's(2) N OW S EY R Z -nosair(2) N OW S EY R nosal N OW Z AH L nose N OW Z nosebleed N OW Z B L IY D @@ -85456,9 +85492,9 @@ nursery N ER S ER IY nurseryman N ER S ER IY M AE N nurserymen N ER S ER IY M AH N nurses N ER S AH Z +nurses(2) N ER S IH Z nurses' N ER S AH Z nurses'(2) N ER S IH Z -nurses(2) N ER S IH Z nursing N ER S IH NG nurture N ER CH ER nurtured N ER CH ER D @@ -85471,9 +85507,9 @@ nusbaum(2) N AH S B AA M nusen N UW S AH N nuss N AH S nussbaum N AH S B AW M +nussbaum(2) N AH S B AA M nussbaum's N AH S B AW M Z nussbaum's(2) N AH S B AA M Z -nussbaum(2) N AH S B AA M nussbaumer N AH S B AW M ER nusser N AH S ER nussle N AH S AH L @@ -85997,9 +86033,9 @@ occhoa OW CH OW AA occhoa's OW CH OW AH Z occident AA K S AH D EH N T occidental AA K S AH D EH N T AH L +occidental(2) AA K S AH D EH N AH L occidental's AA K S AH D EH N T AH L Z occidental's(2) AA K S AH D EH N AH L Z -occidental(2) AA K S AH D EH N AH L occidentale AA K S IH D EH N T AH L occidentale's AA K S IH D EH N T AH L Z occipital AA K S IH P AH T AH L @@ -86240,26 +86276,26 @@ offered AO F ER D offerer AO F ER ER offerers AO F ER ER Z offering AO F ER IH NG +offering(2) AO F R IH NG offering's AO F ER IH NG Z offering's(2) AO F R IH NG Z -offering(2) AO F R IH NG offerings AO F ER IH NG Z offerings(2) AO F R IH NG Z offerman AO F ER M AH N offermann AO F ER M AH N offers AO F ER Z offhand AO F HH AE N D -office AO F AH S +office AO F IH S office's AO F AH S IH Z officeholder AO F AH S HH OW L D ER officeholders AO F AH S HH OW L D ER Z officemax AO F AH S M AE K S officer AO F AH S ER -officer's AO F IH S ER Z officer(2) AO F IH S ER +officer's AO F IH S ER Z officers AO F AH S ER Z -officers' AO F IH S ER Z officers(2) AO F IH S ER Z +officers' AO F IH S ER Z offices AO F AH S AH Z offices(2) AO F AH S IH Z official AH F IH SH AH L @@ -86595,8 +86631,8 @@ olive AA L AH V olive(2) AA L IH V oliveira AA L IH V EY R AH oliver AA L AH V ER -oliver's AA L IH V ER Z oliver(2) AA L IH V ER +oliver's AA L IH V ER Z olivera OW L IY V EH R AH oliveras OW L IY V EH R AA Z oliveri OW L IY V EH R IY @@ -86624,9 +86660,9 @@ ollar AA L ER oller AA L ER olley AA L IY ollie AA L IY +ollie(2) OW L IY ollie's AA L IY Z ollie's(2) OW L IY Z -ollie(2) OW L IY olliff AA L IH F ollila AA L IH L AH ollinger AA L IH NG ER @@ -86756,11 +86792,11 @@ ona AH N AA onagers AA N AH JH ER Z onan OW N AH N onassis OW N AE S IH S +onassis(2) OW N AA S IH S onassis' OW N AE S IH S onassis'(2) OW N AA S IH S onassis's OW N AE S IH S IH S onassis's(2) OW N AA S IH S IH S -onassis(2) OW N AA S IH S onate OW N EY T onawa OW N AA W AH onboard AA N B AO R D @@ -86780,7 +86816,6 @@ onderdonk AA N D ER D AH NG K ondo AO N D OW ondracek AA N D R AH S EH K one W AH N -one(2) HH W AH N one's W AH N Z one-eyed W AH N AY D one-legged W AH N L EH G AH D @@ -86884,8 +86919,8 @@ oozed UW Z D oozes UW Z IH Z oozing UW Z IH NG op AA P -op's AA P S op(2) AO P +op's AA P S opacity OW P AE S AH T IY opal OW P AH L opal's OW P AH L Z @@ -86944,8 +86979,8 @@ operatives AA P ER AH T IH V Z operator AA P ER EY T ER operator's AA P ER EY T ER Z operators AA P ER EY T ER Z -operators' AO P ER EY T ER Z operators(2) AO P ER EY T ER Z +operators' AO P ER EY T ER Z opere OW P EH R operetta AA P ER EH T AH operettas AA P ER EH T AH Z @@ -87066,8 +87101,8 @@ optimum AA P T AH M AH M optimus AA P T IH M AH S opting AA P T IH NG option AA P SH AH N -option's AA P SH AH N Z option(2) AO P SH AH N +option's AA P SH AH N Z optional AA P SH AH N AH L optional(2) AO P SH AH N AH L optioned AA P SH AH N D @@ -87075,8 +87110,8 @@ optioned(2) AO P SH AH N D optioning AA P SH AH N IH NG optioning(2) AO P SH AH N IH NG options AA P SH AH N Z -options' AA P SH AH N Z options(2) AO P SH AH N Z +options' AA P SH AH N Z opto AA P T OW optometric AA P T OW M EH T R IH K optometrist AA P T AA M AH T R IH S T @@ -87117,9 +87152,9 @@ oranges(2) AO R IH N JH IH Z orangina AO R AE N JH IY N ER orangina(2) AO R AE N JH IY N AH orangutan AO R AE NG AH T AE N +orangutan(2) AO R AE NG AH T AA N orangutan's AO R AE NG AH T AE N Z orangutan's(2) AO R AE NG AH T AA N Z -orangutan(2) AO R AE NG AH T AA N orangutans AO R AE NG AH T AE N Z orangutans(2) AO R AE NG AH T AA N Z orasure AO R AH SH UH R @@ -87203,9 +87238,9 @@ oregan AO R EH G AH N oregano AO R EH G AH N OW oregano(2) ER EH G AH N OW oregon AO R AH G AH N +oregon(2) AO R AH G AA N oregon's AO R AH G AH N Z oregon's(2) AO R AH G AA N Z -oregon(2) AO R AH G AA N oregonian AO R AH G OW N IY AH N oregonians AO R AH G OW N IY AH N Z oreilly AO R AH L IY @@ -87307,9 +87342,9 @@ oriole AO R IY OW L orioles AO R IY OW L Z orioles' AO R IY OW L Z orion OW R AY AH N +orion(2) AO R AY AH N orion's OW R AY AH N Z orion's(2) AO R AY AH N Z -orion(2) AO R AY AH N oriordan OW R IH R D AH N oriordan(2) AO R IH R D AH N oritz AO R IH T S @@ -87333,8 +87368,8 @@ orlean's(2) AO R L IY N Z orleanian AO R L IY AH N IY AH N orleanians AO R L IY AH N IY AH N Z orleans AO R L IY AH N Z -orleans' AO R L IY AH N Z orleans(2) AO R L IY N Z +orleans' AO R L IY AH N Z orlena AO R L IH N AH orlene AO R L IY N orlich AO R L IH K @@ -88624,8 +88659,8 @@ pacini P AA CH IY N IY pacino P AH S IY N OW pack P AE K package P AE K AH JH -package's P AE K IH JH IH Z package(2) P AE K IH JH +package's P AE K IH JH IH Z packaged P AE K IH JH D packager P AE K IH JH ER packagers P AE K IH JH ER Z @@ -88921,9 +88956,9 @@ palmdale's P AA M D EY L Z palme P AA M palme(2) P AA L M palmer P AA M ER +palmer(2) P AA L M ER palmer's P AA M ER Z palmer's(2) P AA L M ER Z -palmer(2) P AA L M ER palmeri P AA L M EH R IY palmerino P AO L M EH R IY N OW palmero P AA L M EH R OW @@ -89438,10 +89473,10 @@ parillo P AA R IH L OW parimutuel P EH R IH M Y UW CH UW AH L paring P EH R IH NG paris P EH R IH S +paris(2) P AE R IH S paris' P EH R IH S paris'(2) P AE R IH S paris's P EH R IH S IH Z -paris(2) P AE R IH S parise P AA R AY Z pariseau P AE R IH S OW parish P AE R IH SH @@ -89923,8 +89958,8 @@ patient P EY SH AH N T patient's P EY SH AH N T S patiently P EY SH AH N T L IY patients P EY SH AH N T S -patients' P EY SH AH N T S patients(2) P EY SH AH N Z +patients' P EY SH AH N T S patillo P AH T IH L OW patin P AE T IH N patina P AH T IY N AH @@ -90591,9 +90626,9 @@ pemrich P EH M R IH CH pen P EH N pen's P EH N Z pena P EH N AH +pena(2) P EY N Y AH pena's P EH N AH Z pena's(2) P EY N Y AH Z -pena(2) P EY N Y AH penal P IY N AH L penalize P EH N AH L AY Z penalize(2) P IY N AH L AY Z @@ -90749,9 +90784,9 @@ pensyl P EH N S IH L pent P EH N T penta P EH N T AH pentagon P EH N T IH G AA N +pentagon(2) P EH N IH G AA N pentagon's P EH N T IH G AA N Z pentagon's(2) P EH N IH G AA N Z -pentagon(2) P EH N IH G AA N pentagons P EH N T IH G AA N Z pentagons(2) P EH N IH G AA N Z pentair P EH N T EH R @@ -90844,9 +90879,9 @@ peralez P ER AA L EH Z peralta P ER AA L T AH peras P EH R AH S peratis P ER AA T IH S +peratis(2) P ER AE T IH S peratis' P ER AA T IH S peratis'(2) P ER AE T IH S -peratis(2) P ER AE T IH S peraza P ER AA Z AH perazzo P ER AA Z OW perc P ER K @@ -91032,9 +91067,9 @@ perkey P ER K IY perkin P ER K IH N perking P ER K IH NG perkins P ER K AH N Z +perkins(2) P ER K IH N Z perkins' P ER K IH N Z perkins's P ER K IH N Z IH Z -perkins(2) P ER K IH N Z perkinson P ER K IH N S AH N perko P ER K OW perkovic P ER K AH V IH CH @@ -91099,8 +91134,8 @@ perniciaro P ER N IY CH ER OW pernicious P ER N IH SH AH S perno P ER N OW pernod P EH R N OW -pernod's P ER N AA D Z pernod(2) P ER N AA D +pernod's P ER N AA D Z pero P ER OW peron P ER AO N perona P ER OW N AH @@ -91787,9 +91822,9 @@ philibosian F IH L IH B OW Z IY AH N philida F AH L IY D AH philina F AH L IY N AH philip F IH L AH P +philip(2) F IH L IH P philip's F IH L AH P S philip's(2) F IH L IH P S -philip(2) F IH L IH P philipp F IH L IH P philippa F IH L IH P AH philippe F IH L IY P EY @@ -91802,9 +91837,9 @@ philippino F IH L AH P IY N OW philippoussis F IH L AH P UW S AH S philipps F IH L IH P S philips F IH L AH P S +philips(2) F IH L IH P S philips' F IH L IH P S philips's F IH L IH P S IH Z -philips(2) F IH L IH P S philipson F IH L AH P S AH N philistia F IH L IH S T IY AH philistine F IH L AH S T IY N @@ -91977,8 +92012,8 @@ physicals F IH Z IH K AH L Z physician F AH Z IH SH AH N physician's F AH Z IH SH AH N Z physicians F AH Z IH SH AH N Z -physicians' F IH Z IH SH AH N Z physicians(2) F IH Z IH SH AH N Z +physicians' F IH Z IH SH AH N Z physicist F IH Z IH S IH S T physicists F IH Z IH S IH S T S physics F IH Z IH K S @@ -92001,19 +92036,19 @@ piaget P IY AH ZH EY piaget's P IY AH ZH EY Z piana P IY AE N AH pianist P IY AE N AH S T -pianist's P IY AE N AH S T S -pianist's(2) P IY AH N IH S T S pianist(2) P IY AA N AH S T pianist(3) P IY AH N IH S T +pianist's P IY AE N AH S T S +pianist's(2) P IY AH N IH S T S pianists P IY AE N AH S T S pianists(2) P IY AH N IH S T S pianists(3) P IY AE N AH S pianists(4) P IY AH N IH S pianka P IY AA NG K AH piano P IY AE N OW +piano(2) P IY AE N AH piano's P IY AE N OW Z piano's(2) P IY AE N AH Z -piano(2) P IY AE N AH pianos P IY AE N OW Z pianos(2) P IY AE N AH Z piascik P IY AH S CH IH K @@ -92241,8 +92276,8 @@ pig P IH G pig's P IH G Z pigan P IH G AH N pigeon P IH JH AH N -pigeon's P IH JH AH N Z pigeon(2) P IH JH IH N +pigeon's P IH JH AH N Z pigeonhole P IH JH AH N HH OW L pigeonholed P IH JH AH N HH OW L D pigeons P IH JH AH N Z @@ -92317,8 +92352,8 @@ pilger P IH L G ER pilgram P IH L G R AH M pilgreen P IH L G R IY N pilgrim P IH L G R AH M -pilgrim's P IH L G R AH M Z pilgrim(2) P IH L G R IH M +pilgrim's P IH L G R AH M Z pilgrimage P IH L G R AH M AH JH pilgrimage(2) P IH L G R AH M IH JH pilgrimages P IH L G R AH M IH JH IH Z @@ -92483,11 +92518,11 @@ pino P IY N OW pino's P IY N OW Z pinocchio P IH N OW K IY OW pinochet P IH N AH SH EY +pinochet(2) P IY N AO CH EH T +pinochet(3) P IY N OW SH EY pinochet's P IH N AH SH EY Z pinochet's(2) P IY N AO CH EH T S pinochet's(3) P IY N OW SH EY Z -pinochet(2) P IY N AO CH EH T -pinochet(3) P IY N OW SH EY pinola P IH N OW L AH pinot P IH N AH T pinpoint P IH N P OY N T @@ -92765,8 +92800,8 @@ placeta P L AH S EY T AH placetas P L AH S EY T AH Z placeway P L EY S W EY placid P L AE S AH D -placid's P L AE S IH D Z placid(2) P L AE S IH D +placid's P L AE S IH D Z placida P L AA CH IY D AH placidly P L AE S IH D L IY placido P L AA CH IH D OW @@ -92800,13 +92835,13 @@ plaino P L EY N OW plains P L EY N Z plainsong P L EY N S AO NG plaintiff P L EY N T AH F +plaintiff(2) P L EY N AH F plaintiff's P L EY N T IH F S plaintiff's(2) P L EY N IH F S -plaintiff(2) P L EY N AH F plaintiffs P L EY N T IH F S +plaintiffs(2) P L EY N IH F S plaintiffs' P L EY N T IH F S plaintiffs'(2) P L EY N IH F S -plaintiffs(2) P L EY N IH F S plaintive P L EY N T IH V plaintive(2) P L EY N IH V plaintively P L EY N T AY V L IY @@ -92924,9 +92959,9 @@ platforms P L AE T F AO R M Z plath P L AE TH plating P L EY T IH NG platinum P L AE T N AH M +platinum(2) P L AE T AH N AH M platinum's P L AE T AH N AH M Z platinum's(2) P L AE T N AH M Z -platinum(2) P L AE T AH N AH M platitude P L AE T IH T UW D platitudes P L AE T IH T UW D Z platner P L AE T N ER @@ -93008,9 +93043,9 @@ playwright P L EY R AY T playwright's P L EY R AY T S playwrights P L EY R AY T S plaza P L AA Z AH +plaza(2) P L AE Z AH plaza's P L AA Z AH Z plaza's(2) P L AE Z AH Z -plaza(2) P L AE Z AH plazas P L AA Z AH Z plazas(2) P L AE Z AH Z plazic P L EY Z IH K @@ -93576,9 +93611,9 @@ polivka P OW L IY V K AH polizzi P OW L IY T S IY polje P OW L JH IY polk P OW K +polk(2) P OW L K polk's P OW K S polk's(2) P OW L K S -polk(2) P OW L K polka P OW L K AA polka(2) P OW K AA polkas P OW L K AA Z @@ -93800,14 +93835,14 @@ ponte P AA N T pontes P OW N T EH S ponti P AA N T IY pontiac P AA N T IY AE K +pontiac(2) P AA N IY AE K pontiac's P AA N T IY AE K S pontiac's(2) P AA N IY AE K S -pontiac(2) P AA N IY AE K pontiacs P AA N T IY AE K S pontiacs(2) P AA N IY AE K S pontiff P AA N T AH F -pontiff's P AA N T AH F S pontiff(2) P AA N T IH F +pontiff's P AA N T AH F S pontifical P AA N T IH F AH K AH L pontificate P AA N T IH F AH K EY T pontificated P AA N T IH F AH K EY T IH D @@ -94004,9 +94039,9 @@ porridge P AO R AH JH porritt P AO R IH T porro P AO R OW porsche P AO R SH AH +porsche(2) P AO R SH porsche's P AO R SH AH Z porsche's(2) P AO R SH IH Z -porsche(2) P AO R SH porsches P AO R SH IH Z port P AO R T port's P AO R T S @@ -94129,9 +94164,9 @@ posits P AA Z AH T S posluns P AO Z L AH N Z posluszny P AH S L AH SH N IY posner P OW Z N ER +posner(2) P AO Z N ER posner's P OW Z N ER Z posner's(2) P AO Z N ER Z -posner(2) P AO Z N ER posners P OW Z N ER Z posners(2) P AO Z N ER Z posnick P AO S N IH K @@ -94825,9 +94860,9 @@ premeditate P R IY M EH D AH T EY T premeditated P R IY M EH D AH T EY T IH D premeditation P R IY M EH D AH T EY SH AH N premier P R EH M IH R +premier(2) P R IY M IH R premier's P R EH M IH R Z premier's(2) P R IY M IH R Z -premier(2) P R IY M IH R premiere P R EH M IH R premiered P R EH M IH R D premieres P R EH M IH R Z @@ -94989,16 +95024,16 @@ presidencies P R EH Z AH D AH N S IY Z presidency P R EH Z AH D AH N S IY presidency's P R EH Z AH D AH N S IY Z president P R EH Z AH D EH N T -president's P R EH Z IH D AH N T S president(2) P R EH Z IH D AH N T +president's P R EH Z IH D AH N T S presidential P R EH Z AH D EH N SH AH L presidential's P R EH Z AH D EH N SH AH L Z presidentialist P R EH Z AH D EH N SH AH L IH S T presidentially P R EH S IH D EH N SH AH L IY presidents P R EH Z AH D EH N T S -presidents' P R EH Z IH D AH N T S presidents(2) P R EH Z IH D AH N T S presidents(3) P R EH Z IH D AH N S +presidents' P R EH Z IH D AH N T S presides P R IH Z AY D Z presides(2) P R IY Z AY D Z presiding P R IH Z AY D IH NG @@ -95192,9 +95227,9 @@ prezzano P R EH Z AA N OW pri P R AY pri(2) P R IY priam P R AY AE M +priam(2) P R AY AH M priam's P R AY AE M Z priam's(2) P R AY AH M Z -priam(2) P R AY AH M pribble P R IH B AH L pribula P R IY B UW L AH pribyl P R IH B AH L @@ -95346,15 +95381,15 @@ printed(2) P R IH N AH D printed(3) P R IH N IH D printemps P R IH N T EH M P S printer P R IH N T ER +printer(2) P R IH N ER printer's P R IH N T ER Z printer's(2) P R IH N ER Z -printer(2) P R IH N ER printers P R IH N T ER Z printers(2) P R IH N ER Z printing P R IH N T IH NG +printing(2) P R IH N IH NG printing's P R IH N T IH NG Z printing's(2) P R IH N IH NG Z -printing(2) P R IH N IH NG printings P R IH N T IH NG Z printings(2) P R IH N IH NG Z printmaker P R IH N T M EY K ER @@ -95399,13 +95434,13 @@ prison P R IH Z AH N prison's P R IH Z AH N Z prisoned P R IH Z AH N D prisoner P R IH Z AH N ER +prisoner(2) P R IH Z N ER prisoner's P R IH Z AH N ER Z prisoner's(2) P R IH Z N ER Z -prisoner(2) P R IH Z N ER prisoners P R IH Z AH N ER Z +prisoners(2) P R IH Z N ER Z prisoners' P R IH Z AH N ER Z prisoners'(2) P R IH Z N ER Z -prisoners(2) P R IH Z N ER Z prisons P R IH Z AH N Z prissie P R IH S IY prissy P R IH S IY @@ -95606,17 +95641,17 @@ product P R AA D AH K T product's P R AA D AH K T S product's(2) P R AA D AH K S production P R AH D AH K SH AH N +production(2) P R OW D AH K SH AH N +production(3) P ER D AH K SH AH N production's P R OW D AH K SH AH N Z production's(2) P R AH D AH K SH AH N Z production's(3) P ER D AH K SH AH N Z -production(2) P R OW D AH K SH AH N -production(3) P ER D AH K SH AH N productions P R AH D AH K SH AH N Z +productions(2) P R OW D AH K SH AH N Z +productions(3) P ER D AH K SH AH N Z productions' P R AH D AH K SH AH N Z productions'(2) P R OW D AH K SH AH N Z productions'(3) P ER D AH K SH AH N Z -productions(2) P R OW D AH K SH AH N Z -productions(3) P ER D AH K SH AH N Z productive P R AH D AH K T IH V productive(2) P R OW D AH K T IH V productive(3) P ER D AH K T IH V @@ -95626,9 +95661,9 @@ productively(3) P ER D AH K T IH V L IY productivity P R OW D AH K T IH V AH T IY productivity(2) P R OW D AH K T IH V IH T IY products P R AA D AH K T S +products(2) P R AA D AH K S products' P R AO D AH K T S products'(2) P R AO D AH K S -products(2) P R AA D AH K S prody P OW D IY proehl P R OW L prof. P R AO F @@ -95744,9 +95779,9 @@ prohibits P R OW HH IH B AH T S proia P R OW Y AH proietti P R OY EH T IY project P R AA JH EH K T +project(2) P R AH JH EH K T project's P R AA JH EH K T S project's(2) P R AA JH EH K S -project(2) P R AH JH EH K T projected P R AH JH EH K T AH D projectile P R AH JH EH K T AH L projectile(2) P R AH JH EH K T AY L @@ -95759,11 +95794,11 @@ projective P R AH JH EH K T IH V projector P R AH JH EH K T ER projectors P R AH JH EH K T ER Z projects P R AA JH EH K T S -projects' P R AO JH EH K T S -projects'(2) P R AO JH EH K S projects(2) P R AH JH EH K T S projects(3) P R AA JH EH K S projects(4) P R AH JH EH K S +projects' P R AO JH EH K T S +projects'(2) P R AO JH EH K S prokofiev P R AA K OW F IY V prokop P R OW K AH P prolactin P R OW L AE K T AH N @@ -95951,6 +95986,7 @@ prosaic P R OW Z EY IH K proscar P R AO S K AA R prosch P R AO SH proscia P R OW S CH AH +prosciutto P R AH SH UW T OW proscribe P R OW S K R AY B proscribed P R OW S K R AY B D proscribes P R OW S K R AY B Z @@ -96148,8 +96184,8 @@ providing P R AH V AY D IH NG provigo P R OW V IH G OW provigo's P R OW V IY G OW Z province P R AA V AH N S -province's P R AA V AH N S IH Z province(2) P R AA V IH N S +province's P R AA V AH N S IH Z provinces P R AA V AH N S AH Z provincetown P R AA V AH N S T AW N provincial P R AH V IH N SH AH L @@ -96436,7 +96472,6 @@ puffy P AH F IY pug P AH G puga P Y UW G AH puget P Y UW JH IH T -puget-1 P Y UW JH IH T W AH N pugh P Y UW pugh's P Y UW Z pughs P Y UW Z @@ -96578,9 +96613,9 @@ punishments P AH N IH SH M AH N T S punit P AH N IH T punitive P Y UW N AH T IH V punjab P AH N JH AA B +punjab(2) P AH N JH AE B punjab's P AH N JH AA B Z punjab's(2) P AH N JH AE B Z -punjab(2) P AH N JH AE B punk P AH NG K punkin P AH NG K IH N punks P AH NG K S @@ -96824,6 +96859,7 @@ puzzles P AH Z AH L Z puzzling P AH Z AH L IH NG puzzling(2) P AH Z L IH NG puzzo P UW Z OW +pvc P IY V IY S IY pyatt P AY AH T pyburn P IH B ER N pye P AY @@ -97136,9 +97172,9 @@ quest K W EH S T questar K W EH S T ER questech K W EH S T EH K question K W EH S CH AH N +question(2) K W EH SH AH N question's K W EH S CH AH N Z question's(2) K W EH SH AH N Z -question(2) K W EH SH AH N question-mark K W EH S CH AH N M AA R K questionable K W EH S CH AH N AH B AH L questioned K W EH S CH AH N D @@ -97297,9 +97333,9 @@ quist's K W IH S T S quit K W IH T quite K W AY T quito K W IY T OW +quito(2) K IY T OW quito's K W IY T OW Z quito's(2) K IY T OW Z -quito(2) K IY T OW quits K W IH T S quitter K W IH T ER quitters K W IH T ER Z @@ -98242,9 +98278,10 @@ rathburne's R AE TH B ER N Z rathe R EY DH rathel R AE TH AH L rather R AE DH ER -rather's R AE DH ER Z rather(2) R AH DH ER +rather's R AE DH ER Z rathert R AE TH ER T +rathfarnham R AH DH F AA R N AH M rathgeber R AE TH G IH B ER rathje R AE TH JH AH rathjen R AE TH JH AH N @@ -98362,8 +98399,8 @@ ravan R EY V AH N rave R EY V raved R EY V D ravel R AE V AH L -ravel's R AH V EH L Z ravel(2) R AH V EH L +ravel's R AH V EH L Z raveled R AE V AH L D raveling R AE V AH L IH NG raveling(2) R AE V L IH NG @@ -98481,8 +98518,8 @@ razzle R AE Z AH L razzmatazz R AE Z M AH T AE Z rca AA R S IY EY re R EY -re's R EY Z re(2) R IY +re's R EY Z re-entered R IY EH N T ER D rea R EY rea's R EY Z @@ -98513,8 +98550,8 @@ reactor's R IY AE K T ER Z reactors R IY AE K T ER Z reacts R IY AE K T S read R EH D -read's R IY D Z read(2) R IY D +read's R IY D Z readability R IY D AH B IH L IH T IY readable R IY D AH B AH L reade R EH D @@ -98553,9 +98590,9 @@ reaffirmed R IY AH F ER M D reaffirming R IY AH F ER M IH NG reaffirms R IY AH F ER M Z reagan R EY G AH N +reagan(2) R IY G AH N reagan's R EY G AH N Z reagan's(2) R IY G AH N Z -reagan(2) R IY G AH N reaganesque R EY G AH N EH S K reaganesque(2) R IY G AH N EH S K reaganism R EY G AH N IH Z AH M @@ -98622,16 +98659,16 @@ realmuto R AH L M UW T OW realpolitik R IY L P AO L IH T IH K realtime R IY AH L T AY M realtor R IY AH L T ER +realtor(2) R IY L T ER realtor's R IY AH L T ER Z realtor's(2) R IY L T ER Z -realtor(2) R IY L T ER realtors R IY AH L T ER Z realtors(2) R IY L T ER Z realty R IY AH L T IY -realty's R IY AH L T IY Z -realty's(2) R IY L T IY Z realty(2) R IH L IH T IY realty(3) R IY L T IY +realty's R IY AH L T IY Z +realty's(2) R IY L T IY Z ream R IY M reamer R IY M ER reamer's R IY M ER Z @@ -98758,8 +98795,8 @@ rebeck R IY B EH K rebeka R IH B IY K AH rebekka R IH B EH K AH rebel R EH B AH L -rebel's R EH B AH L Z rebel(2) R IH B EH L +rebel's R EH B AH L Z rebelled R IH B EH L D rebelling R IH B EH L IH NG rebellion R IH B EH L Y AH N @@ -98771,8 +98808,8 @@ rebelliousness R AH B EH L IY AH S N AH S rebello R EH B EH L OW rebelo R EH B EH L OW rebels R EH B AH L Z -rebels' R EH B AH L Z rebels(2) R IH B EH L Z +rebels' R EH B AH L Z reber R EH B ER rebert R EH B ER T rebholz R EH B HH OW L Z @@ -98925,8 +98962,8 @@ recessed(2) R IY S EH S T recesses R IY S EH S AH Z recessing R IY S EH S IH NG recession R IH S EH SH AH N -recession's R IY S EH SH AH N Z recession(2) R IY S EH SH AH N +recession's R IY S EH SH AH N Z recessionary R IY S EH SH AH N EH R IY recessions R IH S EH SH AH N Z recessive R AH S EH S IH V @@ -98949,8 +98986,8 @@ recipe R EH S AH P IY recipe's R EH S AH P IY Z recipes R EH S AH P IY Z recipient R AH S IH P IY AH N T -recipient's R IH S IH P IY AH N T S recipient(2) R IH S IH P IY AH N T +recipient's R IH S IH P IY AH N T S recipients R IH S IH P IY AH N T S recipients' R IH S IH P IY AH N T S reciprocal R IH S IH P R AH K AH L @@ -99012,8 +99049,8 @@ recognised R EH K AH G N AY Z D recognises R EH K AH G N AY Z IH Z recognising R EH K AH G N AY Z IH NG recognition R EH K AH G N IH SH AH N -recognition's R EH K IH G N IH SH AH N Z recognition(2) R EH K IH G N IH SH AH N +recognition's R EH K IH G N IH SH AH N Z recognizable R EH K AH G N AY Z AH B AH L recognizably R EH K AH G N AY Z AH B L IY recognizance R IH K AA N AH Z AH N S @@ -99095,9 +99132,9 @@ reconvene R IY K AH N V IY N reconvened R IY K AH N V IY N D reconvenes R IY K AH N V IY N Z record R AH K AO R D -record's R EH K ER D Z record(2) R EH K ER D record(3) R IH K AO R D +record's R EH K ER D Z recordable R IH K AO R D AH B AH L recorded R AH K AO R D IH D recorded(2) R IH K AO R D IH D @@ -99110,9 +99147,9 @@ recording(2) R IH K AO R D IH NG recordings R IH K AO R D IH NG Z recordkeeping R EH K ER D K IY P IH NG records R AH K AO R D Z -records' R EH K ER D Z records(2) R EH K ER D Z records(3) R IH K AO R D Z +records' R EH K ER D Z recore R EH K AO R IY recoton R IH K AO T IH N recount R IH K AW N T @@ -99137,9 +99174,9 @@ recovering R AH K AH V ER IH NG recovering(2) R IH K AH V ER IH NG recovers R IH K AH V ER Z recovery R IH K AH V R IY +recovery(2) R IH K AH V ER IY recovery's R IH K AH V ER IY Z recovery's(2) R IH K AH V R IY Z -recovery(2) R IH K AH V ER IY recreate R EH K R IY EY T recreate(2) R IY K R IY EY T recreated R EH K R IY EY T IH D @@ -99155,9 +99192,9 @@ recrimination R IH K R IH M IH N EY SH AH N recriminations R IH K R IH M IH N EY SH AH N Z recross R IY K R AO S recruit R AH K R UW T -recruit's R IY K R UW T S recruit(2) R IH K R UW T recruit(3) R IY K R UW T +recruit's R IY K R UW T S recruited R IH K R UW T IH D recruited(2) R IY K R UW T IH D recruiter R IH K R UW T ER @@ -99735,8 +99772,8 @@ reggy R EH G IY regie R EH G IY regier R IY G IY ER regime R AH ZH IY M -regime's R EY ZH IY M Z regime(2) R EY ZH IY M +regime's R EY ZH IY M Z regimen R EH JH AH M AH N regimens R EH JH AH M AH N Z regiment R EH JH AH M AH N T @@ -99890,9 +99927,9 @@ reichenberger R AY K AH N B ER G ER reicher R AY K ER reichert R AY K ER T reichhold R AY K HH OW L D +reichhold(2) R AY K OW L D reichhold's R AY K HH OW L D Z reichhold's(2) R AY K OW L D Z -reichhold(2) R AY K OW L D reichl R AY K AH L reichle R AY K AH L reichler R AY K L ER @@ -100234,9 +100271,9 @@ reliable(2) R IY L AY AH B AH L reliably R IH L AY AH B L IY reliably(2) R IY L AY AH B L IY reliance R IH L AY AH N S +reliance(2) R IY L AY AH N S reliance's R IH L AY AH N S IH Z reliance's(2) R IY L AY AH N S IH Z -reliance(2) R IY L AY AH N S reliant R IH L AY AH N T reliant(2) R IY L AY AH N T relic R EH L IH K @@ -100260,8 +100297,8 @@ relieving(2) R IY L IY V IH NG reliford R EH L IH F AO R D relig R IH L IH JH religion R IH L IH JH AH N -religion's R IH L IH JH AH N Z religion(2) R IY L IH JH AH N +religion's R IH L IH JH AH N Z religione R IH L IH JH IY OW N IY religionist R IY L IH JH AH N IH S T religions R IY L IH JH AH N Z @@ -100478,9 +100515,9 @@ renationalize R IY N AE SH AH N AH L AY Z renato R EH N AA T OW renaud R IH N OW renault R AH N OW +renault(2) R IH N AO L T renault's R IH N AO L T S renault's(2) R AH N OW Z -renault(2) R IH N AO L T renbarger R EH N B AA R G ER rencen R EH N S AH N rench R EH N CH @@ -100639,8 +100676,8 @@ reorganizing R IY AO R G AH N AY Z IH NG reorient R IY AO R IY EH N T reorientate R IY AO R IY EH N T EY T rep R EH P -rep's R EH P S rep(2) R EH P R IY Z EH T AH T IH V +rep's R EH P S rep. R EH P R IY Z EH T AH T IH V repack R IY P AE K repackage R IY P AE K IH JH @@ -100773,9 +100810,9 @@ replying(2) R IY P L AY IH NG repo R IY P OW reponse R IH P AA N S report R IY P AO R T +report(2) R IH P AO R T report's R IY P AO R T S report's(2) R IH P AO R T S -report(2) R IH P AO R T reportable R IH P AO R T AH B AH L reportage R IH P AO R T IH JH reported R IY P AO R T IH D @@ -100790,9 +100827,9 @@ reporting R IY P AO R T IH NG reporting(2) R IH P AO R T IH NG reportorial R EH P ER T AO R IY AH L reports R IH P AO R T S +reports(2) R IY P AO R T S reports' R IH P AO R T S reports'(2) R IY P AO R T S -reports(2) R IY P AO R T S repos R IY P OW Z reposa R EH P OW S AH repose R IY P OW Z @@ -100818,17 +100855,17 @@ representation R EH P R AH Z EH N T EY SH AH N representational R EH P R AH Z AH N T EY SH AH N AH L representations R EH P R AH Z AH N T EY SH AH N Z representative R EH P R AH Z EH N T AH T IH V -representative's R EH P R IH Z EH N T AH T IH V Z -representative's(2) R EH P R IH Z EH N AH T IH V Z representative(2) R EH P R IH Z EH N T AH T IH V representative(3) R EH P R AH Z EH N AH T IH V representative(4) R EH P R IH Z EH N AH T IH V +representative's R EH P R IH Z EH N T AH T IH V Z +representative's(2) R EH P R IH Z EH N AH T IH V Z representatives R EH P R AH Z EH N T AH T IH V Z -representatives' R EH P R AH S EH N T AH T IH V Z -representatives'(2) R EH P R AH S EH N AH T IH V Z representatives(2) R EH P R IH Z EH N T AH T IH V Z representatives(3) R EH P R AH Z EH N AH T IH V Z representatives(4) R EH P R IH Z EH N AH T IH V Z +representatives' R EH P R AH S EH N T AH T IH V Z +representatives'(2) R EH P R AH S EH N AH T IH V Z represented R EH P R IH Z EH N T IH D representing R EH P R IH Z EH N T IH NG represents R EH P R IH Z EH N T S @@ -100882,19 +100919,19 @@ reptiles R EH P T AY L Z reptilian R EH P T IH L Y AH N reptilians R EH P T IH L Y AH N Z republic R IY P AH B L AH K -republic's R IY P AH B L IH K S republic(2) R IY P AH B L IH K +republic's R IY P AH B L IH K S republica R IH P AH B L IH K AH republican R IH P AH B L IH K AH N -republican's R IY P AH B L IH K AH N Z republican(2) R IY P AH B L AH K AH N republican(3) R IY P AH B L IH K AH N +republican's R IY P AH B L IH K AH N Z republicanism R IH P AH B L IH K AH N IH Z AH M republicans R IH P AH B L IH K AH N Z -republicans' R IH P AH B L IH K AH N Z -republicans'(2) R IY P AH B L IH K AH N Z republicans(2) R IY P AH B L AH K AH N Z republicans(3) R IY P AH B L IH K AH N Z +republicans' R IH P AH B L IH K AH N Z +republicans'(2) R IY P AH B L IH K AH N Z republicbank R IY P AH B L IH K B AE NG K republicbank's R IY P AH B L IH K B AE NG K S republics R IY P AH B L IH K S @@ -101047,9 +101084,9 @@ reservationist R EH Z ER V EY SH AH N IH S T reservationists R EH Z ER V EY SH AH N IH S T S reservations R EH Z ER V EY SH AH N Z reserve R IH Z ER V +reserve(2) R IY Z ER V reserve's R IH Z ER V Z reserve's(2) R IY Z ER V Z -reserve(2) R IY Z ER V reserved R IH Z ER V D reserved(2) R IY Z ER V D reserveese R EH Z ER V IY S @@ -101150,13 +101187,13 @@ resnick R EH Z N IH K resnick's R EH Z N IH K S resnik R EH S N IH K reso R IH Z OW +reso(2) R IY Z OW +reso(3) R IH S OW +reso(4) R IY S OW reso's R IY S OW Z reso's(2) R IY Z OW Z reso's(3) R IH S OW Z reso's(4) R IH Z OW Z -reso(2) R IY Z OW -reso(3) R IH S OW -reso(4) R IY S OW resold R IY S OW L D resolute R EH Z AH L UW T resolutely R EH S AH L UW T L IY @@ -101175,9 +101212,9 @@ resonated R EH Z AH N EY T IH D resonates R EH Z AH N EY T S resonating R EH Z AH N EY T IH NG resort R IH Z AO R T -resort's R IH Z AO R T S resort(2) R IY Z AO R T resort(3) R IY S AO R T +resort's R IH Z AO R T S resorted R IH Z AO R T IH D resorted(2) R IY Z AO R T IH D resorted(3) R IY S AO R T IH D @@ -101185,9 +101222,9 @@ resorting R IH Z AO R T IH NG resorting(2) R IY Z AO R T IH NG resorting(3) R IY S AO R T IH NG resorts R IH Z AO R T S -resorts' R IH Z AO R T S resorts(2) R IY Z AO R T S resorts(3) R IY S AO R T S +resorts' R IH Z AO R T S resound R IY S AW N D resound(2) R IY Z AW N D resounding R IY S AW N D IH NG @@ -101272,15 +101309,15 @@ restatements R IY S T EY T M AH N T S restates R IY S T EY T S restating R IY S T EY T IH NG restaurant R EH S T ER AA N T +restaurant(2) R EH S T R AA N T restaurant's R EH S T ER AA N T S restaurant's(2) R EH S T R AA N T S -restaurant(2) R EH S T R AA N T restauranteur R EH S T R AA N T ER restauranteurs R EH S T R AA N T ER Z restaurants R EH S T ER AA N T S +restaurants(2) R EH S T R AA N T S restaurants' R EH S T ER AA N T S restaurants'(2) R EH S T R AA N T S -restaurants(2) R EH S T R AA N T S restaurateur R EH S T ER AH T ER restaurateur(2) R EH S T R AH T ER restaurateurs R EH S T ER AH T ER Z @@ -101470,9 +101507,9 @@ retiree's R IH T AY R IY Z retirees R IY T AY R IY Z retirees' R IH T AY R IY Z retirement R IY T AY ER M AH N T +retirement(2) R IH T AY ER M AH N T retirement's R IH T AY R M AH N T S retirement's(2) R IY T AY R M AH N T S -retirement(2) R IH T AY ER M AH N T retirements R IH T AY R M AH N T S retirements(2) R IY T AY R M AH N T S retires R IH T AY R Z @@ -101571,9 +101608,9 @@ returnees R IH T ER N IY Z returning R IH T ER N IH NG returning(2) R IY T ER N IH NG returns R IH T ER N Z +returns(2) R IY T ER N Z returns' R AH T ER N Z returns'(2) R IY T ER N Z -returns(2) R IY T ER N Z retz R EH T S retzer R EH T Z ER retzlaff R EH T Z L AH F @@ -102602,9 +102639,9 @@ ritchie's R IH CH IY Z rite R AY T rite's R AY T S ritenour R IH T AH N AW R +ritenour(2) R AY T AH N AW R ritenour's R IH T AH N AW R Z ritenour's(2) R AY T AH N AW R Z -ritenour(2) R AY T AH N AW R riter R AY T ER rites R AY T S ritesh R IH T EH SH @@ -102833,9 +102870,9 @@ robidoux R AA B IH D UW robie R OW B IY robillard R AA B IH L ER D robin R AA B AH N +robin(2) R AA B IH N robin's R AA B AH N Z robin's(2) R AA B IH N Z -robin(2) R AA B IH N robina R AH B IY N AH robinett R AA B IH N EH T robinette R AA B IH N EH T @@ -102866,9 +102903,9 @@ robnett R AA B N IH T robo R OW B OW robocop R OW B OW K AA P robot R OW B AA T +robot(2) R OW B AH T robot's R OW B AA T S robot's(2) R OW B AH T S -robot(2) R OW B AH T robotic R OW B AA T IH K robotics R OW B AA T IH K S robots R OW B AA T S @@ -102904,17 +102941,17 @@ rocha R OW K AH rochat R AA CH AH T rochberg R OW CH B ER G roche R OW CH -roche's R OW SH IH Z roche(2) R OW SH +roche's R OW SH IH Z rochefort R AA K IH F ER T rochefort(2) R AA SH F ER T rochefort(3) R AA K F ER T rocheleau R AA SH IH L OW rochella R AH CH EH L AH rochelle R OW SH EH L +rochelle(2) R AH SH EH L rochelle's R OW SH EH L Z rochelle's(2) R AH SH EH L Z -rochelle(2) R AH SH EH L rocher R OW CH ER rocher(2) R OW SH ER rochester R AA CH EH S T ER @@ -103149,9 +103186,9 @@ roh's R OW Z rohan R OW AH N rohana R AH HH AE N AH rohatyn R AA HH AH T IH N +rohatyn(2) R OW HH AE T AH N rohatyn's R AA HH AH T IH N Z rohatyn's(2) R OW HH AE T AH N Z -rohatyn(2) R OW HH AE T AH N rohde R OW D rohde(2) R OW D AH rohe R OW @@ -103440,9 +103477,9 @@ roos R UW Z roosa R UW S AH roose R UW Z roosevelt R OW Z AH V EH L T +roosevelt(2) R UW Z AH V EH L T roosevelt's R OW Z AH V EH L T S roosevelt's(2) R UW Z AH V EH L T S -roosevelt(2) R UW Z AH V EH L T roosevelts R OW Z AH V EH L T S roosevelts(2) R UW Z AH V EH L T S roost R UW S T @@ -103649,9 +103686,9 @@ rosoff R AA S AO F rosol R OW S AO L rospatch R AO S P AE CH ross R AA S +ross(2) R AO S ross' R AA S ross's R AA S IH Z -ross(2) R AO S rossa R OW S AH rossano R OW S AA N OW rossbach R AA S B AA K @@ -103857,8 +103894,8 @@ roupe R UW P rourk R AO R K rourke R AO R K rouse R AW S -rouse's R AW Z IH Z rouse(2) R AW Z +rouse's R AW Z IH Z roused R AW Z D rouser R AW Z ER rousey R AW S IY @@ -104023,6 +104060,7 @@ rozzi R AA Z IY rpf AA R P IY EH F rpm AA R P IY EH M rsvp AA R EH S V IY P IY +rte AA R T IY IY ru R UW ru(2) AA R Y UW rua R UW AH @@ -104306,9 +104344,9 @@ rumbled R AH M B AH L D rumbles R AH M B AH L Z rumbley R AH M B L IY rumbling R AH M B AH L IH NG +rumbling(2) R AH M B L IH NG rumbling's R AH M B AH L IH NG Z rumbling's(2) R AH M B L IH NG Z -rumbling(2) R AH M B L IH NG rumblings R AH M B AH L IH NG Z rumblings(2) R AH M B L IH NG Z rumbold R AH M B OW L D @@ -104588,13 +104626,13 @@ ruzich R AH Z IH HH ruzicka R UW Z IH K AH ruzzo R UW Z OW rwanda R AH W AA N D AH +rwanda(2) R UW AA N D AH rwanda's R AH W AA N D AH Z rwanda's(2) R UW AA N D AH Z -rwanda(2) R UW AA N D AH rwandan R AH W AA N D AH N +rwandan(2) R UW AA N D AH N rwandan's R AH W AA N D AH N Z rwandan's(2) R UW AA N D AH N Z -rwandan(2) R UW AA N D AH N rwandans R AH W AA N D AH N Z rwandans(2) R UW AA N D AH N Z rwandese R AH W AA D IY Z @@ -104779,9 +104817,9 @@ sachet S AE SH EY sachi S AE CH IY sachin S AE CH AH N sachs S AE K S +sachs(2) S AA K S sachs' S AE K S sachs's S AE K S IH Z -sachs(2) S AA K S sachse S AE CH S sacilor S AE S AH L ER sacirbey S AA K ER B IY @@ -104822,13 +104860,13 @@ sadaka S AH D AA K AH sadako S AA D AA K OW sadao S AH D AW sadat S AA D AA T +sadat(2) S AH D AE T sadat's S AA D AA T S sadat's(2) S AH D AE T S -sadat(2) S AH D AE T saddam S AA D AH M +saddam(2) S AH D AA M saddam's S AA D AH M Z saddam's(2) S AH D AA M Z -saddam(2) S AH D AA M sadden S AE D AH N saddened S AE D AH N D saddening S AE D AH N IH NG @@ -105121,10 +105159,10 @@ salim(2) S AA L IY M salin S AA L IY N salina S AH L IY N AH salinas S AH L IY N AH S +salinas(2) S AH L IY N AH Z salinas' S AH L IY N AH S salinas'(2) S AH L IY N AH Z salinas's S AH L IY N AH S IH Z -salinas(2) S AH L IY N AH Z saline S AH L IY N saling S EY L IH NG salinger S AE L IH N JH ER @@ -105340,6 +105378,7 @@ samojlik S AH M OY L IH K samons S AA M OW N Z samora S AA M AO R AH samos S EY M AA S +samosa S AH M OW S AH samoth S AE M AH TH samp S AE M P sampan S AE M P AE N @@ -105383,8 +105422,8 @@ samuels S AE M Y UW AH L Z samuelsen S AE M UH L S AH N samuelson S AE M Y UW AH L S AH N samurai S AE M UH R AY -samurai's S AE M ER AY Z samurai(2) S AE M ER AY +samurai's S AE M ER AY Z samurais S AE M ER AY Z samurais(2) S AE M ER IH Z san S AE N @@ -105587,8 +105626,8 @@ sansui S AE N S UW IY sansui's S AE N S UW IY Z sant S AE N T santa S AE N T AH -santa's S AE N T AH Z santa(2) S AE N AH +santa's S AE N T AH Z santa-croce S AE N T AH K R OW CH IY santa-cruz S AE N T AH K R UW Z santa-fe S AE N T AH F EY @@ -105849,6 +105888,8 @@ satanism S EY T AH N IH Z AH M satanist S EY T AH N IH S T satanjeev S AA T AA N JH IY V satans S EY T AH N Z +satay S AE T EY +satay(2) S AA T EY satchell S AE CH AH L satcher S AE CH ER sate S EY T @@ -105893,6 +105934,8 @@ satoh S AA T OW satoshi S AA T OW SH IY satre S EY T ER satriani S AE T R IY AA N IY +satsuma S AE T S UW M AH +satsumas S AE T S UW M AH Z satter S AE T ER satterfield S AE T ER F IY L D satterlee S AE T ER L IY @@ -105904,9 +105947,9 @@ saturated S AE CH ER EY T IH D saturating S AE CH ER EY T IH NG saturation S AE CH ER EY SH AH N saturday S AE T ER D IY +saturday(2) S AE T IH D EY saturday's S AE T ER D IY Z saturday's(2) S AE T ER D EY Z -saturday(2) S AE T IH D EY saturdays S AE T ER D IY Z saturdays(2) S AE T ER D EY Z saturn S AE T ER N @@ -105935,9 +105978,9 @@ saudia S AO D IY AH saudia(2) S AW D IY AH saudiization S AW IY IH Z EY SH AH N saudis S AO D IY Z +saudis(2) S AW D IY Z saudis' S AO D IY Z saudis'(2) S AW D IY Z -saudis(2) S AW D IY Z sauer S AW ER sauerkraut S AW ER K R AW T sauers S AW ER Z @@ -106094,8 +106137,8 @@ sawshank S AO SH AE N K sawtell S AO T EH L sawtelle S AO T EH L sawyer S AO Y ER -sawyer's S AO Y ER Z sawyer(2) S OY ER +sawyer's S AO Y ER Z sawyers S AO Y ER Z sax S AE K S saxby S AE K S B IY @@ -106183,9 +106226,9 @@ scalfaro S K AE L F AA R OW scali S K AA L IY scali(2) S K EY L IY scalia S K AA L IY AH +scalia(2) S K AA L Y AH scalia's S K AA L IY AH Z scalia's(2) S K AA L Y AH Z -scalia(2) S K AA L Y AH scaling S K EY L IH NG scalise S K AA L AY Z scalisi S K AA L IY S IY @@ -106553,8 +106596,8 @@ scherf SH ER F scherff SH ER F scherger SH ER G ER schering SH ER IH NG -schering's SH EH R IH NG Z schering(2) SH EH R IH NG +schering's SH EH R IH NG Z scherlis SH ER L IH S scherman SH ER M AH N schermer SH ER M ER @@ -106617,9 +106660,9 @@ schiesser SH IY S ER schiewe SH IY W IY schifano S K IY F AA N OW schiferon SH IH F ER AO N +schiferon(2) SH IH F R AO N schiferon's SH IH F ER AO N Z schiferon's(2) SH IH F R AO N Z -schiferon(2) SH IH F R AO N schiff SH IH F schiffbauer SH IH F B AW ER schiffer SH IH F ER @@ -107217,9 +107260,9 @@ schwarzenegger SH W AO R Z AH N EY G ER schwarzenegger's SH W AO R Z AH N EY G ER Z schwarzer SH W AO R T S ER schwarzkopf SH W AO R T S K AO P F +schwarzkopf(2) SH W AO R T S K AO F schwarzkopf's SH W AO R T S K AO P F S schwarzkopf's(2) SH W AO R T S K AO F S -schwarzkopf(2) SH W AO R T S K AO F schwarzman SH W AO R T S M AH N schwebach SH W EH B AA K schwebel SH W EH B AH L @@ -107301,8 +107344,8 @@ science S AY AH N S science's S AY AH N S IH Z science-fiction S AY AH N S F IH K SH AH N sciences S AY AH N S AH Z -sciences' S AY AH N S IH Z sciences(2) S AY AH N S IH Z +sciences' S AY AH N S IH Z scientific S AY AH N T IH F IH K scientific's S AY AH N T IH F IH K S scientifically S AY AH N T IH F IH K AH L IY @@ -107311,10 +107354,10 @@ scientifics S AY AH N T IH F IH K S scientist S AY AH N T IH S T scientist's S AY AH N T IH S T S scientists S AY AH N T IH S T S -scientists' S AY AH N T IH S T S scientists(2) S AY N T IH S T S scientists(3) S AY N T IH S scientists(4) S AY AH N T IH S +scientists' S AY AH N T IH S T S scientologist S AY AH N T AA L AH JH AH S T scientologists S AY AH N T AA L AH JH AH S T S scientology S AY AH N T AA L AH JH IY @@ -107423,9 +107466,9 @@ scorpion S K AO R P IY AH N scorpions S K AO R P IY AH N Z scorpius S K AO R P IY AH S scorsese S K AO R S IY Z +scorsese(2) S K AO R S EY Z IY scorsese's S K AO R S IY Z IH Z scorsese's(2) S K AO R S EY Z IY Z -scorsese(2) S K AO R S EY Z IY scorsone S K AO R S AH N scortese S K AO R T IY Z scortese(2) S K AO R T IY Z IY @@ -107929,8 +107972,8 @@ secoy S EH K OY secrecy S IY K R AH S IY secrest S EH K ER IH S T secret S IY K R AH T -secret's S IY K R AH T S secret(2) S IY K R IH T +secret's S IY K R AH T S secretarial S EH K R AH T EH R IY AH L secretariat S EH K R IH T EH R IY AH T secretaries S EH K R AH T EH R IY Z @@ -108118,8 +108161,8 @@ sefcik S EH F S IH K seff S EH F sefton S EH F T AH N sega S IY G AH -sega's S EY G AH Z sega(2) S EY G AH +sega's S EY G AH Z segal S IY G AH L segalas S EH G AH L AH S segall S EY G AA L @@ -108133,8 +108176,8 @@ segers S IY G ER Z segerstrom S EH G ER S T R AH M segler S EH G L ER segment S EH G M AH N T -segment's S EH G M AH N T S segment(2) S EH G M EH N T +segment's S EH G M AH N T S segmentation S EH G M AH N T EY SH AH N segmented S EH G M EH N T IH D segmented(2) S EH G M EH N IH D @@ -108375,8 +108418,8 @@ selikoff S EH L IH K AO F selin S EH L IH N selina S AH L IY N AH selinas S AH L IY N AH Z -selinas's S AH L IY N AH S IH Z selinas(2) S AH L IY N AH S +selinas's S AH L IY N AH S IH Z selinda S EH L IY N D AH selinger S EH L IH NG ER seljuk S EH L JH AH K @@ -108488,11 +108531,11 @@ semiclassical(2) S EH M IH K L AE S IH K AH L semiclassical(3) S EH M AY K L AE S IH K AH L semicon S EH M IH K AA N semiconductor S EH M IY K AH N D AH K T ER +semiconductor(2) S EH M IH K AH N D AH K T ER +semiconductor(3) S EH M AY K AH N D AH K T ER semiconductor's S EH M IY K AH N D AH K T ER Z semiconductor's(2) S EH M IH K AH N D AH K T ER Z semiconductor's(3) S EH M AY K AH N D AH K T ER Z -semiconductor(2) S EH M IH K AH N D AH K T ER -semiconductor(3) S EH M AY K AH N D AH K T ER semiconductors S EH M IY K AH N D AH K T ER Z semiconductors(2) S EH M IH K AH N D AH K T ER Z semiconductors(3) S EH M AY K AH N D AH K T ER Z @@ -108580,8 +108623,8 @@ semtex S EH M T EH K S sen S EH N sena S EH N AH senate S EH N AH T -senate's S EH N IH T S senate(2) S EH N IH T +senate's S EH N IH T S senator S EH N AH T ER senator's S EH N AH T ER Z senatore S EH N AA T AO R IY @@ -108717,8 +108760,8 @@ seo(2) S EY OW seoul S OW L seoul's S OW L Z seow S IY OW -seow's S IY OW Z seow(2) S IY AW +seow's S IY OW Z sep S EH P sep(2) EH S IY P IY separate S EH P ER EY T @@ -108896,9 +108939,9 @@ serr S EH R serra S EH R AH serra's S EH R AH Z serrano S ER AA N OW +serrano(2) S ER AE N OW serrano's S ER AA N OW Z serrano's(2) S ER AE N OW Z -serrano(2) S ER AE N OW serranto S ER AA N T OW serrao S EH R AW serrate S EH R EY T @@ -108924,8 +108967,8 @@ server S ER V ER servers S ER V ER Z serves S ER V Z service S ER V AH S -service's S ER V IH S IH Z service(2) S ER V IH S +service's S ER V IH S IH Z serviceable S ER V AH S AH B AH L serviced S ER V IH S T serviceman S ER V AH S M AE N @@ -108934,9 +108977,9 @@ servicemen S ER V AH S M EH N servicemen's S ER V IH S M EH N Z servicer S ER V IH S ER services S ER V AH S AH Z +services(2) S ER V IH S IH Z services' S ER V IH S IH Z services'(2) S ER V AH S AH Z -services(2) S ER V IH S IH Z servicing S ER V IH S IH NG servico S ER V IH K OW servidio S ER V IY D IY OW @@ -109007,8 +109050,8 @@ settlemyre S EH T AH L M AY R settler S EH T AH L ER settler(2) S EH T L ER settlers S EH T L ER Z -settlers' S EH T L ER Z settlers(2) S EH T AH L ER Z +settlers' S EH T L ER Z settles S EH T AH L Z settling S EH T AH L IH NG settling(2) S EH T L IH NG @@ -109039,8 +109082,8 @@ seventies(2) S EH V AH N IY Z seventieth S EH V AH N T IY IH TH seventieth(2) S EH V AH N IY IH TH seventy S EH V AH N T IY -seventy's S EH V AH N T IY Z seventy(2) S EH V AH N IY +seventy's S EH V AH N T IY Z seventy-five S EH V AH N T IY F AY V sever S EH V ER severa S EY V EH R AH @@ -109430,11 +109473,11 @@ sharma SH AA R M AH sharma's SH AA R M AH Z sharman SH AA R M AH N sharon SH AE R AH N +sharon(2) SH EH R AH N +sharon(3) SH AH R OW N sharon's SH EH R AH N Z sharon's(2) SH AE R AH N Z sharon's(3) SH AH R OW N Z -sharon(2) SH EH R AH N -sharon(3) SH AH R OW N sharp SH AA R P sharp's SH AA R P S sharp-sign SH AA R P S AY N @@ -109590,9 +109633,9 @@ sheds SH EH D Z sheeder SH IY D ER sheedy SH IY D IY sheehan SH IY AH N +sheehan(2) SH IY HH AH N sheehan's SH IY AH N Z sheehan's(2) SH IY HH AH N Z -sheehan(2) SH IY HH AH N sheehy SH IY HH IY sheehy(2) SH IY IY sheek SH IY K @@ -109615,6 +109658,7 @@ sheeps SH IY P S sheepskin SH IY P S K IH N sheer SH IH R sheeran SH IH R AH N +sheeran's SH IH R AH N Z sheerer SH IY R ER sheerin SH IH R IH N sheesh SH IY SH @@ -109770,9 +109814,9 @@ sheri SH EH R IY sherick SH EH R IH K sheridan SH EH R IH D AH N sheriff SH EH R AH F +sheriff(2) SH EH R IH F sheriff's SH EH R AH F S sheriff's(2) SH EH R IH F S -sheriff(2) SH EH R IH F sheriffs SH EH R AH F S sherin SH EH R IH N sherk SH ER K @@ -110225,6 +110269,7 @@ shortchanged SH AO R T CH EY N JH D shortchanging SH AO R T CH EY N JH IH NG shortcoming SH AO R T K AH M IH NG shortcomings SH AO R T K AH M IH NG Z +shortcrust SH AO R T K R AH S T shortcut SH AO R T K AH T shortcuts SH AO R T K AH T S shorted SH AO R T IH D @@ -110747,6 +110792,7 @@ siers S IY R Z sies S IY Z siese S IY EH S siess S IY S +siesta S IY EH S T AH sietsema S IY T S IY M AH sieve S IH V siever S IY V ER @@ -110933,8 +110979,8 @@ silsby S IH L S B IY silt S IH L T siltec S IH L T EH K silva S IH L V AH -silva's S IH L V AH Z silva(2) S EH L V AH +silva's S IH L V AH Z silvadio S IH L V AA D IY OW silvadio's S IH L V AA D IY OW Z silvana S IH L V AA N AH @@ -112224,9 +112270,9 @@ smiths S M IH TH S smithson S M IH TH S AH N smithson's S M IH TH S AH N Z smithsonian S M IH TH S OW N IY AH N +smithsonian(2) S M IH S OW N IY AH N smithsonian's S M IH TH S OW N IY AH N Z smithsonian's(2) S M IH S OW N IY AH N Z -smithsonian(2) S M IH S OW N IY AH N smithtown S M IH TH T AW N smithwick S M IH TH W IH K smitley S M IH T L IY @@ -112309,12 +112355,12 @@ smug S M AH G smuggle S M AH G AH L smuggled S M AH G AH L D smuggler S M AH G L ER -smuggler's S M AH G L ER Z smuggler(2) S M AH G AH L ER +smuggler's S M AH G L ER Z smugglers S M AH G L ER Z +smugglers(2) S M AH G AH L ER Z smugglers' S M AH G L ER Z smugglers'(2) S M AH G AH L ER Z -smugglers(2) S M AH G AH L ER Z smuggling S M AH G L IH NG smuggling(2) S M AH G AH L IH NG smugly S M AH G L IY @@ -112660,8 +112706,8 @@ socialist S OW SH AH L AH S T socialist(2) S OW SH AH L IH S T socialistic S OW SH AH L IH S T IH K socialists S OW SH AH L AH S T S -socialists' S OW SH AH L IH S T S socialists(2) S OW SH AH L IH S T S +socialists' S OW SH AH L IH S T S socialite S OW SH AH L AY T socialites S OW SH AH L AY T S socialization S OW SH AH L IH Z EY SH AH N @@ -112692,9 +112738,9 @@ socking S AA K IH NG socks S AA K S sockwell S AA K W EH L soco S OW K OW +soco(2) S AA K OW soco's S OW K OW Z soco's(2) S AA K OW Z -soco(2) S AA K OW socol S OW K AA L socrates S AA K R AH T IY Z socratic S AH K R AE T IH K @@ -112778,9 +112824,9 @@ softsoap(2) S AO F S OW P softspoken S AO F T S P OW K AH N softspoken(2) S AO F S P OW K AH N software S AO F T W EH R +software(2) S AO F W EH R software's S AO F T W EH R Z software's(2) S AO F W EH R Z -software(2) S AO F W EH R softwood S AO F T W UH D sogang S OW G AE NG soggy S AA G IY @@ -112978,9 +113024,9 @@ som S AA M soma S OW M AA somali S AH M AA L IY somalia S AH M AA L IY AH +somalia(2) S AH M AA L Y AH somalia's S AH M AA L IY AH Z somalia's(2) S AH M AA L Y AH Z -somalia(2) S AH M AA L Y AH somalian S AH M AA L Y AH N somalians S AH M AA L Y AH N Z somalias S AH M AA L IY AH Z @@ -112995,8 +113041,8 @@ somberly S AA M B ER L IY sombrero S AA M B R EH R OW some S AH M somebody S AH M B AA D IY -somebody's S AH M B AA D IY Z somebody(2) S AH M B AH D IY +somebody's S AH M B AA D IY Z someday S AH M D EY somehow S AH M HH AW someone S AH M W AH N @@ -113156,6 +113202,7 @@ sophy S OW F IY sopko S OW P K OW sopp S AA P sopping S AA P IH NG +soppy S AA P IY soprano S AH P R AA N OW soprano(2) S AH P R AE N OW sopranos S AH P R AE N OW Z @@ -113387,8 +113434,8 @@ sovetskaya S OW V EH T S K AY AA sovexportfilm S OW V EH K S P AO R T F IH L M sovey S OW V IY soviet S OW V IY AH T -soviet's S OW V IY EH T S soviet(2) S OW V IY EH T +soviet's S OW V IY EH T S soviet-union S OW V IY EH T Y UW N Y AH N sovietologist S OW V IY AH T AA L AH JH IH S T sovietologists S OW V IY AH T AA L AH JH IH S T S @@ -113432,9 +113479,9 @@ soybeans S OY B IY N Z soyka S OY K AH soysauce S OY S AO S soyuz S OY AH Z +soyuz(2) S OY UW Z soyuz's S OY AH Z IH Z soyuz's(2) S OY UW Z IH Z -soyuz(2) S OY UW Z soza S OW Z AH sozio S OW Z IY OW spa S P AA @@ -113659,8 +113706,8 @@ speciale S P EH CH AH L IY specialist S P EH SH AH L AH S T specialist(2) S P EH SH AH L IH S T specialists S P EH SH AH L AH S T S -specialists' S P EH SH AH L IH S T S specialists(2) S P EH SH AH L IH S T S +specialists' S P EH SH AH L IH S T S specialities S P EH SH AH L T IY Z speciality S P EH SH IY AE L IH T IY specialization S P EH SH AH L AH Z EY SH AH N @@ -113904,8 +113951,8 @@ spiers S P AY ER Z spies S P AY Z spiess S P IY Z spieth S P IY TH -spieth's S P IY TH S spieth(2) S P AY AH TH +spieth's S P IY TH S spiewak S P IY W AE K spiffing S P IH F IH NG spiffy S P IH F IY @@ -113979,8 +114026,8 @@ spirals S P AY R AH L Z spire S P AY R spires S P AY R Z spirit S P IH R AH T -spirit's S P IH R IH T S spirit(2) S P IH R IH T +spirit's S P IH R IH T S spirited S P IH R IH T IH D spiritedness S P IH R IH T IH D N AH S spirito S P IH R IY T OW @@ -114246,8 +114293,8 @@ sprigged S P R IH G D spriggs S P R IH G Z sprightly S P R AY T L IY spring S P R IH NG -spring's S P R IH NG Z spring(2) S P ER IH NG +spring's S P R IH NG Z springboard S P R IH NG B AO R D springborn S P R IH NG G B ER N springdale S P R IH NG D EY L @@ -114319,6 +114366,7 @@ spud S P AH D spud's S P AH D Z spuds S P AH D Z spuhler S P UW L ER +spumoni S P UW M OW N IY spun S P AH N spunk S P AH NG K spunky S P AH NG K IY @@ -114455,9 +114503,9 @@ sram(2) EH S R AE M sramek SH R AE M IH K srdan S ER D AE N srebrenica S R EY B R EH N IY T S AH +srebrenica(2) SH R EY B R AH N IY T S AH srebrenica's S R EY B R EH N IY T S AH Z srebrenica's(2) SH R EY B R AH N IY T S AH Z -srebrenica(2) SH R EY B R AH N IY T S AH sremac S R IY M AE K sri SH R IY sri(2) EH S AA R AY @@ -114480,6 +114528,7 @@ sroge SH R OW G sroka SH R OW K AH sroufe SH R OW F srpska S R AH P S K AH +ss EH S EH S ssangyong S AE NG Y AO NG ssn EH S EH S EH N st S T R IY T @@ -114597,9 +114646,9 @@ staffing S T AE F IH NG stafford S T AE F ER D stafford's S T AE F ER D Z staffordshire S T AE F ER D SH ER +staffordshire(2) S T AE F ER D SH AY ER staffordshire's S T AE F ER D SH ER Z staffordshire's(2) S T AE F ER D SH AY ER Z -staffordshire(2) S T AE F ER D SH AY ER staffs S T AE F S stag S T AE G stag-party S T AE G P AE R T IY @@ -115527,8 +115576,8 @@ stephany S T EH F AH N IY stephen S T IY V AH N stephen's S T IY V AH N Z stephens S T IY V AH N Z -stephens's S T IY V IH N Z IH Z stephens(2) S T EH F AH N Z +stephens's S T IY V IH N Z IH Z stephenson S T IY V AH N S AH N stephenville S T IY V IH N V IH L stepien S T EH P IY AH N @@ -115786,6 +115835,7 @@ stillwell's S T IH L W EH L Z stils S T IH L Z stilson S T IH L S AH N stilt S T IH L T +stilton S T IH L T AH N stilted S T IH L T IH D stiltner S T IH L T N ER stilts S T IH L T S @@ -115814,9 +115864,9 @@ stinchfield S T IH N CH F IY L D stine S T AY N stinebaugh S T IH N IH B AO stinel S T IH N AH L +stinel(2) S T IH N EH L stinel's S T IH N AH L Z stinel's(2) S T IH N EH L Z -stinel(2) S T IH N EH L stineman S T AY N M AH N stiner S T AY N ER stines S T AY N Z @@ -116417,9 +116467,9 @@ streiff S T R AY F streight S T R EY T streiker S T R AY K ER streisand S T R AY Z AH N D +streisand(2) S T R AY S AE N D streisand's S T R AY Z AH N D Z streisand's(2) S T R AY S AE N D Z -streisand(2) S T R AY S AE N D streit S T R AY T streitmatter S T R AY T M AH T ER strelow S T R EH L OW @@ -116643,6 +116693,7 @@ structure's S T R AH K CH ER Z structured S T R AH K CH ER D structures S T R AH K CH ER Z structuring S T R AH K CH ER IH NG +strudel S T R UW D AH L struebing S T R UH B IH NG struggle S T R AH G AH L struggle's S T R AH G AH L Z @@ -116673,11 +116724,11 @@ strzelecki(2) S T ER Z IH L EH T S K IY stu S T UW stuard S T UW ER D stuart S T UW ER T +stuart(2) S T Y UW ER T +stuart(3) S T AO R T stuart's S T UW ER T S stuart's(2) S T Y UW ER T S stuart's(3) S T AO R T S -stuart(2) S T Y UW ER T -stuart(3) S T AO R T stuarts S T UW ER T S stub S T AH B stubbe S T AH B @@ -116946,17 +116997,17 @@ subhuman S AH B HH Y UW M AH N subia S UW B IY AH subic S UW B IH K subject S AH B JH EH K T -subject's S AH B JH IH K T S subject(2) S AH B JH IH K T +subject's S AH B JH IH K T S subjected S AH B JH EH K T IH D subjecting S AH B JH EH K T IH NG subjective S AH B JH EH K T IH V subjectivity S AH B JH EH K T IH V IH T IY subjects S AH B JH IH K T S -subjects' S AH B JH EH K T S -subjects'(2) S AH B JH EH K S subjects(2) S AH B JH EH K T S subjects(3) S AH B JH EH K S +subjects' S AH B JH EH K T S +subjects'(2) S AH B JH EH K S subjugate S AH B JH AH G EY T subjugated S AH B JH AH G EY T IH D subkingdom S AH B K IH NG D AH M @@ -117289,9 +117340,9 @@ suicides S UW AH S AY D Z suing S UW IH NG suire S UH R suisse S W IH S +suisse(2) S W IY S suisse's S W IH S IH Z suisse's(2) S W IY S IH Z -suisse(2) S W IY S suit S UW T suit's S UW T S suitability S UW T AH B IH L IH T IY @@ -117352,8 +117403,8 @@ sullied S AH L IY D sullinger S AH L IH NG ER sullins S AH L IH N Z sullivan S AH L AH V AH N -sullivan's S AH L IH V AH N Z sullivan(2) S AH L IH V AH N +sullivan's S AH L IH V AH N Z sullivans S AH L IH V AH N Z sullivant S AH L IH V AH N T sullo S UW L OW @@ -117425,8 +117476,8 @@ summerville S AH M ER V IH L summey S AH M IY summing S AH M IH NG summit S AH M AH T -summit's S AH M AH T S summit(2) S AH M IH T +summit's S AH M AH T S summiteer S AH M IH T IH R summiteers S AH M IH T IH R Z summitry S AH M IH T R IY @@ -117481,9 +117532,9 @@ sundance S AH N D AE N S sundar S UW N D AA R sundararajan S UW N D AA R AH R AA JH AH N sunday S AH N D EY +sunday(2) S AH N D IY sunday's S AH N D EY Z sunday's(2) S AH N D IY Z -sunday(2) S AH N D IY sundays S AH N D EY Z sundays(2) S AH N D IY Z sundberg S AH N D B ER G @@ -117637,8 +117688,8 @@ superimposed S UW P ER AH M P OW Z D superintendant S UW P ER AH N T EH N D AH N T superintendant(2) S UW P ER IH N T EH N D AH N T superintendent S UW P ER AH N T EH N D AH N T -superintendent's S UW P ER IH N T EH N D AH N T S superintendent(2) S UW P ER IH N T EH N D AH N T +superintendent's S UW P ER IH N T EH N D AH N T S superintendents S UW P ER AH N T EH N D AH N T S superintendents(2) S UW P ER IH N T EH N D AH N T S superior S UW P IH R IY ER @@ -117650,8 +117701,8 @@ superlatives S UH P ER L AH T IH V Z supermac S UW P ER M AE K supermajority S UW P ER M AH JH AO R IH T IY superman S UW P ER M AH N -superman's S UW P ER M AE N Z superman(2) S UW P ER M AE N +superman's S UW P ER M AE N Z supermarket S UW P ER M AA R K IH T supermarket's S UW P ER M AA R K AH T S supermarkets S UW P ER M AA R K IH T S @@ -117818,8 +117869,8 @@ surfing S ER F IH NG surge S ER JH surged S ER JH D surgeon S ER JH AH N -surgeon's S ER JH AH N Z surgeon(2) S ER JH IH N +surgeon's S ER JH AH N Z surgeons S ER JH AH N Z surgeons' S ER JH IH N Z surgeries S ER JH ER IY Z @@ -117867,9 +117918,9 @@ surprisingly(2) S AH P R AY Z IH NG L IY surratt S AO R AH T surreal S ER IY L surrealism S ER IY L IH Z AH M +surrealism(2) S ER IY AH L IH Z AH M surrealism's S ER IY L IH Z AH M Z surrealism's(2) S ER IY AH L IH Z AH M Z -surrealism(2) S ER IY AH L IH Z AH M surrealisms S ER IY L IH Z AH M Z surrealisms(2) S ER IY AH L IH Z AH M Z surrealistic S ER IY L IH S T IH K @@ -118574,8 +118625,8 @@ syncope S IH N K AH P IY syncor S IH N K AO R synder S IH N D ER syndicate S IH N D IH K AH T -syndicate's S IH N D IH K AH T S syndicate(2) S IH N D AH K EY T +syndicate's S IH N D IH K AH T S syndicated S IH N D IH K EY T IH D syndicates S IH N D IH K EY T S syndicates(2) S IH N D IH K AH T S @@ -118740,6 +118791,8 @@ tabasco T AH B AE S K OW tabb T AE B tabbert T AE B ER T tabbing T AE B IH NG +tabbouleh T AH B UW L EY +tabbouleh(2) T AH B UW L IY tabby T AE B IY taber T EY B ER tabernacle T AE B ER N AE K AH L @@ -119135,6 +119188,8 @@ tancredo T AE N K R EY D OW tandem T AE N D AH M tandem's T AE N D AH M Z tandon T AE N D AH N +tandoor T AE N D UW R +tandoori T AE N D UW R IY tandy T AE N D IY tandy's T AE N D IY Z tandycraft T AE N D IY K R AE F T @@ -119231,11 +119286,11 @@ tantrums T AE N T R AH M Z tanu T AA N UW tanya T AA N Y AH tanzania T AE N Z EY N IY AH +tanzania(2) T AE N Z AH N IY AH +tanzania(3) T AE N Z EY N Y AH tanzania's T AE N Z EY N IY AH Z tanzania's(2) T AE N Z AH N IY AH Z tanzania's(3) T AE N Z EY N Y AH Z -tanzania(2) T AE N Z AH N IY AH -tanzania(3) T AE N Z EY N Y AH tanzanian T AE N Z EY N IY AH N tanzanian(2) T AE N Z EY N Y AH N tanzer T AE N Z ER @@ -119281,9 +119336,9 @@ taps T AE P S tapscott T AE P S K AH T tar T AA R tara T EH R AH +tara(2) T AA R AH tara's T EH R AH Z tara's(2) T AA R AH Z -tara(2) T AA R AH tarahumara T AA R AH HH UW M AA R AH tarallo T ER AE L OW tarango T AA R AA NG G OW @@ -119308,8 +119363,8 @@ tardiness T AA R D IY N AH S tarditi T AA R D IH T IY tardy T AA R D IY target T AA R G AH T -target's T AA R G AH T S target(2) T ER G AH T +target's T AA R G AH T S targeted T AA R G AH T IH D targeting T AA R G AH T IH NG targets T AA R G AH T S @@ -119374,9 +119429,9 @@ tartu T AA R T UW tarver T AA R V ER tarvin T AA R V IH N tarzan T AA R Z AE N +tarzan(2) T AA R Z AH N tarzan's T AA R Z AE N Z tarzan's(2) T AA R Z AH N Z -tarzan(2) T AA R Z AH N tasaday T AE S AH D EY tasca T AA S K AH tasch T AE SH @@ -119524,8 +119579,8 @@ taxed T AE K S T taxer T AE K S ER taxers T AE K S ER Z taxes T AE K S AH Z -taxes' T AE K S IH Z taxes(2) T AE K S IH Z +taxes' T AE K S IH Z taxi T AE K S IY taxi's T AE K S IY Z taxicab T AE K S IY K AE B @@ -119560,11 +119615,11 @@ tbilisi T AH B IH L IY S IY tbilisi(2) T AH B L IY S IY tcas T IY S IY EY EH S tchaikovsky CH EY K AA V S K IY +tchaikovsky(2) CH AY K AA V S K IY +tchaikovsky(3) CH AY K AA F S K IY tchaikovsky's CH EY K AA V S K IY Z tchaikovsky's(2) CH AY K AA V S K IY Z tchaikovsky's(3) CH AY K AA F S K IY Z -tchaikovsky(2) CH AY K AA V S K IY -tchaikovsky(3) CH AY K AA F S K IY tchuruk CH UH R IH K te T IY tea T IY @@ -120123,8 +120178,8 @@ tennessee T EH N AH S IY tennessee's T EH N AH S IY Z tenney T EH N IY tennis T EH N AH S -tennis's T EH N AH S IH Z tennis(2) T EH N IH S +tennis's T EH N AH S IH Z tennison T EH N IH S AH N tenny T EH N IY tennyson T EH N IH S AH N @@ -120189,9 +120244,9 @@ terence T EH R AH N S terence's T EH R AH N S IH Z terentia T ER EH N SH AH teresa T ER IY S AH +teresa(2) T ER EY S AH teresa's T ER IY S AH Z teresa's(2) T ER EY S AH Z -teresa(2) T ER EY S AH terese T EH R IY Z teresi T ER EH S IY teresita T ER EH S IY T AH @@ -120247,6 +120302,7 @@ terrace T EH R AH S terraced T EH R AH S T terraces T EH R AH S AH Z terraces(2) T EH R AH S IH Z +terracotta T ER AH K AA T AH terrain T ER EY N terrains T ER EY N Z terral T EH R AH L @@ -120298,8 +120354,8 @@ terrorism T EH R ER IH Z AH M terrorist T EH R ER IH S T terroristic T EH R ER IH S T IH K terrorists T EH R ER AH S T S -terrorists' T EH R ER IH S T S terrorists(2) T EH R ER IH S T S +terrorists' T EH R ER IH S T S terrorize T EH R ER AY Z terrorized T EH R ER AY Z D terrorizes T EH R ER AY Z IH Z @@ -120544,11 +120600,11 @@ tharrington TH AE R IH NG T AH N thaser TH EY Z ER thassos TH AE S OW S that DH AE T +that(2) DH AH T that'd DH AE T IH D that'll DH AE T AH L that's DH AE T S that've DH AE T AH V -that(2) DH AH T thatch TH AE CH thatched TH AE CH T thatcher TH AE CH ER @@ -120677,9 +120733,9 @@ theorized TH IY ER AY Z D theorizes TH IY ER AY Z IH Z theorizing TH IY ER AY Z IH NG theory TH IH R IY +theory(2) TH IY ER IY theory's TH IH R IY Z theory's(2) TH IY ER IY Z -theory(2) TH IY ER IY thera TH EH R AH therafectin TH EH R AH F EH K T IH N therani T EH R AA N IY @@ -120689,9 +120745,9 @@ therapeutically(2) TH EH R AH P Y UW T IH K L IY therapeutics TH EH R AH P Y UW T IH K S therapies TH EH R AH P IY Z therapist TH EH R AH P AH S T +therapist(2) TH EH R AH P IH S T therapist's TH EH R AH P AH S T S therapist's(2) TH EH R AH P IH S T S -therapist(2) TH EH R AH P IH S T therapists TH EH R AH P IH S T S therapists' TH EH R AH P IH S T S therapists's TH EH R AH P IH S T S @@ -120711,9 +120767,9 @@ therein DH EH R IH N thereof DH EH R AH V thereon DH EH R AO N theresa T ER IY S AH +theresa(2) T ER EY S AH theresa's T ER IY S AH Z theresa's(2) T ER EY S AH Z -theresa(2) T ER EY S AH therese TH EH R IY S thereto DH EH R T UW thereupon DH EH R AH P AA N @@ -120872,9 +120928,9 @@ thirties TH ER T IY Z thirtieth TH ER T IY AH TH thirtieth(2) TH ER T IY IH TH thirty TH ER D IY +thirty(2) TH ER T IY thirty's TH ER D IY Z thirty's(2) TH ER T IY Z -thirty(2) TH ER T IY thirty-five TH ER D IY F AY V thirtysomething TH ER T IY S AH M TH IH NG thiry TH IH R IY @@ -120932,9 +120988,9 @@ thompkins(2) T AA M K IH N Z thompsen T AA M P S AH N thompsen(2) T AA M S AH N thompson T AA M P S AH N +thompson(2) T AA M S AH N thompson's T AA M P S AH N Z thompson's(2) T AA M S AH N Z -thompson(2) T AA M S AH N thompsons T AA M P S AH N Z thompsons(2) T AA M S AH N Z thoms TH AA M Z @@ -121087,9 +121143,9 @@ thrift TH R IH F T thrift's TH R IH F T S thriftier TH R IH F T IY ER thrifts TH R IH F T S +thrifts(2) TH R IH F S thrifts' TH R IH F T S thrifts'(2) TH R IH F S -thrifts(2) TH R IH F S thrifty TH R IH F T IY thrill TH R IH L thrilled TH R IH L D @@ -121214,9 +121270,9 @@ thurnher TH ER N ER thurow TH UH R OW thursby TH ER S B IY thursday TH ER Z D EY +thursday(2) TH ER Z D IY thursday's TH ER Z D IY Z thursday's(2) TH ER Z D EY Z -thursday(2) TH ER Z D IY thursdays TH ER Z D EY Z thursdays(2) TH ER Z D IY Z thurstan TH ER S T AH N @@ -121282,8 +121338,8 @@ tick T IH K ticked T IH K T ticker T IH K ER ticket T IH K AH T -ticket's T IH K AH T S ticket(2) T IH K IH T +ticket's T IH K AH T S ticketed T IH K AH T IH D ticketing T IH K AH T IH NG ticketless T IH K AH T L AH S @@ -121764,11 +121820,11 @@ tod T AA D toda T OW D AH todaro T OW D AA R OW today T AH D EY +today(2) T UW D EY today'll T AH D EY L today'll(2) T UW D EY L today's T AH D EY Z today's(2) T UW D EY Z -today(2) T UW D EY todays T AH D EY Z todays(2) T UW D EY Z todd T AA D @@ -121974,9 +122030,9 @@ tommy-lee T AA M IY L IY tomographic T OW M OW G R AE F IH K tomography T OW M OW G R AE F IY tomorrow T AH M AA R OW +tomorrow(2) T UW M AA R OW tomorrow's T AH M AA R OW Z tomorrow's(2) T UW M AA R OW Z -tomorrow(2) T UW M AA R OW tomorrows T AH M AA R OW Z tomorrows(2) T UW M AA R OW Z tompane T AA M P EY N @@ -122017,9 +122073,9 @@ tonics T AA N IH K S tonie T OW N IY toniest T OW N IY S T tonight T AH N AY T +tonight(2) T UH N AY T tonight's T AH N AY T S tonight's(2) T UH N AY T S -tonight(2) T UH N AY T toning T OW N IH NG tonini T OW N IY N IY tonite T AH N AY T @@ -122117,8 +122173,8 @@ topanga(2) T AH P AE NG G AH topaz T OW P AE Z tope T OW P topeka T AH P IY K AA -topeka's T AH P IY K AH Z topeka(2) T OW P IY K AA +topeka's T AH P IY K AH Z topekan T AH P IY K AH N topekans T AH P IY K AH N Z topel T OW P AH L @@ -122224,9 +122280,9 @@ toro T AO R OW torok T AO R AH K toronado T AO R AH N AA D OW toronto T ER AA N T OW +toronto(2) T AO R AA N T OW toronto's T ER AA N T OW Z toronto's(2) T AO R AA N T OW Z -toronto(2) T AO R AA N T OW torosian T ER AA ZH IH N torp T AO R P torpedo T AO R P IY D OW @@ -122749,13 +122805,13 @@ transcisco T R AE N S IH S K OW transco T R AE N S K OW transcon T R AE N Z K AA N transcontinental T R AE N Z K AA N T IH N EH N T AH L +transcontinental(2) T R AE N Z K AA N IH N EH N T AH L +transcontinental(3) T R AE N Z K AA N T IH N EH N AH L +transcontinental(4) T R AE N Z K AA N IH N EH N AH L transcontinental's T R AE N Z K AA N T IH N EH N T AH L Z transcontinental's(2) T R AE N Z K AA N IH N EH N T AH L Z transcontinental's(3) T R AE N Z K AA N T IH N EH N AH L Z transcontinental's(4) T R AE N Z K AA N IH N EH N AH L Z -transcontinental(2) T R AE N Z K AA N IH N EH N T AH L -transcontinental(3) T R AE N Z K AA N T IH N EH N AH L -transcontinental(4) T R AE N Z K AA N IH N EH N AH L transcribe T R AE N S K R AY B transcribed T R AE N S K R AY B D transcriber T R AE N S K R AY B ER @@ -122963,11 +123019,11 @@ travelday T R AE V AH L D EY traveldays T R AE V AH L D EY Z traveled T R AE V AH L D traveler T R AE V AH L ER -traveler's T R AE V AH L ER Z traveler(2) T R AE V L ER +traveler's T R AE V AH L ER Z travelers T R AE V AH L ER Z -travelers' T R AE V AH L ER Z travelers(2) T R AE V L ER Z +travelers' T R AE V AH L ER Z travelgate T R AE V AH L G EY T traveling T R AE V AH L IH NG traveling(2) T R AE V L IH NG @@ -123203,8 +123259,8 @@ triad's T R AY AE D Z triads T R AY AE D Z triage T R AY IH JH trial T R AY AH L -trial's T R AY AH L Z trial(2) T R AY L +trial's T R AY AH L Z trials T R AY AH L Z trials(2) T R AY L Z triana T R IY AE N AH @@ -123337,8 +123393,8 @@ tringali T R IH NG G AA L IY trinh T R IH N trinidad T R IH N IH D AE D trinity T R IH N AH T IY -trinity's T R IH N IH T IY Z trinity(2) T R IH N IH T IY +trinity's T R IH N IH T IY Z trinka T R IH NG K AH trinket T R IH NG K AH T trinkets T R IH NG K AH T S @@ -123733,9 +123789,9 @@ trzcinski T ER ZH IH N S K IY trzeciak T ER Z EH CH IY AE K ts T IY EH S tsai T S AY +tsai(2) S AY tsai's T S AY Z tsai's(2) S AY Z -tsai(2) S AY tsakos T S AA K OW S tsang T S AE NG tsang(2) S AE NG @@ -123764,11 +123820,11 @@ tsingtao(2) T S IH NG D AW tso T S OW tso(2) S OW tsongas T S AO NG G AH S +tsongas(2) S AO NG G AH S tsongas' T S AO NG G AH S tsongas'(2) S AO NG G AH S tsongas's T S AO NG G AH S AH Z tsongas's(2) S AO NG G AH S AH Z -tsongas(2) S AO NG G AH S tsu T S UW tsuda T S UW D AH tsuda(2) S UW D AH @@ -123834,17 +123890,17 @@ tudisco T UW D IY S K OW tudjman T UH JH M AH N tudjman's T UH JH M AH N Z tudor T UW D ER -tudor's T Y UW D ER Z tudor(2) T Y UW D ER +tudor's T Y UW D ER Z tue T UW tuel T UW L tuell T UW L tuesday T UW Z D IY +tuesday(2) T UW Z D EY +tuesday(3) T Y UW Z D EY tuesday's T UW Z D IY Z tuesday's(2) T UW Z D EY Z tuesday's(3) T Y UW Z D EY Z -tuesday(2) T UW Z D EY -tuesday(3) T Y UW Z D EY tuesdays T UW Z D EY Z tuesdays(2) T UW Z D IY Z tuesdays(3) T Y UW Z D EY Z @@ -124177,8 +124233,8 @@ tuzla T UW Z L AH tuzla's T UW Z L AH Z tuzzolino T UW T S OW L IY N OW tv T IY V IY -tv's T IY V IY Z tv(2) T EH L AH V IH ZH AH N +tv's T IY V IY Z tvedt T V EH D T tveit T V IY T tvs T IY V IY Z @@ -124221,9 +124277,9 @@ twentieth(2) T W EH N T IY IH TH twentieth(3) T W EH N IY AH TH twentieth(4) T W EH N IY IH TH twenty T W EH N T IY +twenty(2) T W EH N IY twenty's T W EH N T IY Z twenty's(2) T W EH N IY Z -twenty(2) T W EH N IY twenty-first T W EH N T IY F ER S T twenty-five T W EH N T IY F AY V twenty-four T W EH N T IY F AO R @@ -124440,9 +124496,9 @@ udo UW D OW udolf AH D OW L F udvar AH D V AA R udverhye UW D V EH R HH IY +udverhye(2) Y UW D V EH R HH IY udverhye's UW D V EH R HH IY Z udverhye's(2) Y UW D V EH R HH IY Z -udverhye(2) Y UW D V EH R HH IY udy Y UW D IY uebel UH B AH L ueberroth Y UW B ER R AO TH @@ -124468,8 +124524,8 @@ ufo's Y UW EH F OW Z ufos Y UW EH F OW Z ugalde UW G AA L D IY uganda Y UW G AE N D AA -uganda's Y UW G AE N D AH Z uganda(2) Y UW G AA N D AA +uganda's Y UW G AE N D AH Z ugandan Y UW G AE N D AH N ugandan(2) Y UW G AA N D AH N ugarte UW G AA R T IY @@ -124803,7 +124859,7 @@ uncollectable AH N K AH L EH K T AH B AH L uncollected AH N K AH L EH K T IH D uncollectible AH N K AH L EH K T IH B AH L uncomfortable AH N K AH M F ER T AH B AH L -uncomfortably AH N K AH M F T AH B L IY +uncomfortably AH N K AH M F ER T AH B L IY uncommitted AH N K AH M IH T IH D uncommon AH N K AA M AH N uncommonly AH N K AA M AH N L IY @@ -125375,8 +125431,8 @@ unisys Y UW N IH S IH S unisys' Y UW N IH S IH S unisys's Y UW N IH S IH S IH Z unit Y UW N AH T -unit's Y UW N IH T S unit(2) Y UW N IH T +unit's Y UW N IH T S unita Y UW N IY T AH unitaf Y UW N IH T AE F unitarian Y UW N AH T EH R IY AH N @@ -125397,8 +125453,8 @@ unitrin's Y UW N IH T R IH N Z unitrode Y UW N IH T R OW D unitrode's Y UW N IH T R OW D Z units Y UW N AH T S -units' Y UW N IH T S units(2) Y UW N IH T S +units' Y UW N IH T S unity Y UW N AH T IY unity(2) Y UW N IH T IY univa Y UW N IH V AH @@ -125498,9 +125554,9 @@ unobstructed AH N AH B S T R AH K T IH D unobtainable AH N AH B T EY N AH B AH L unobtrusive AH N AH B T R UW S IH V unocal Y UW N AH K AE L +unocal(2) Y UW N AH K AO L unocal's Y UW N AH K AE L Z unocal's(2) Y UW N AH K AO L Z -unocal(2) Y UW N AH K AO L unoccupied AH N AA K Y AH P AY D unofficial AH N AH F IH SH AH L unofficially AH N AH F IH SH AH L IY @@ -126060,9 +126116,9 @@ ursus ER S AH S ursy ER S IY urton ER T AH N uruguay Y ER AH G W EY +uruguay(2) Y ER AH G W AY uruguay's Y ER AH G W EY Z uruguay's(2) Y ER AH G W AY Z -uruguay(2) Y ER AH G W AY uruguayan Y ER AH G W EY AH N uruguayan(2) Y ER AH G W AY AH N urwin ER W AH N @@ -126187,6 +126243,7 @@ utterly AH T ER L IY utters AH T ER Z utz AH T S utzinger AH T Z IH NG ER +uv Y UW V IY uva Y UW V AH uva(2) Y UW V IY EY uwe Y UW @@ -126777,8 +126834,8 @@ vanstory V AE N S T AO R IY vanstraten V AE N S T R EY T AH N vansyckle V AE N S AY K AH L vantage V AE N T AH JH -vantage's V AE N T IH JH IH Z vantage(2) V AE N T IH JH +vantage's V AE N T IH JH IH Z vantages V AE N T IH JH IH Z vantages(2) V AE N IH JH IH Z vantassel V AE N T AE S AH L @@ -127072,11 +127129,11 @@ vehement(2) V AH HH IY M AH N T vehemently V IY AH M AH N T L IY vehemently(2) V AH HH IY M AH N T L IY vehicle V IY HH IH K AH L -vehicle's V IY HH IH K AH L Z vehicle(2) V IY IH K AH L +vehicle's V IY HH IH K AH L Z vehicles V IY HH IH K AH L Z -vehicles' V EH HH IH K AH L Z vehicles(2) V IY IH K AH L Z +vehicles' V EH HH IH K AH L Z vehicular V IY HH IH K Y AH L ER veiga V EY G AH veigel V AY G AH L @@ -127189,8 +127246,8 @@ venezuelans V EH N IH Z W EY L AH N Z vengeance V EH N JH AH N S vengeful V EH N JH F AH L venice V EH N AH S -venice's V EH N IH S IH Z venice(2) V EH N IH S +venice's V EH N IH S IH Z venier V IY N IY ER venison V EH N AH S AH N venita V EH N IY T AH @@ -127320,9 +127377,9 @@ verga V EH R G AH vergara V ER G AA R AH verge V ER JH verges V ER JH IH Z +verges(2) V ER JH IY Z verges's V ER JH IH Z IH Z verges's(2) V ER JH IY Z IH Z -verges(2) V ER JH IY Z vergesh V ER G EH SH vergesh's V ER G EH SH IH S vergil V ER JH AH L @@ -127352,8 +127409,8 @@ veritable V EH R IH T AH B AH L veritably V EH R IH T AH B L IY verities V EH R AH T IY Z verity V EH R AH T IY -verity's V EH R AH T IY Z verity(2) V EH R IH T IY +verity's V EH R AH T IY Z verizon V EH R AY Z AH N verizon's V EH R AY Z AH N Z verizons V EH R AY Z AH N Z @@ -127417,9 +127474,9 @@ verry V EH R IY vers V ER S versa V ER S AH versace V ER S AA CH EY +versace(2) V ER S AA CH IY versace's V ER S AA CH EY Z versace's(2) V ER S AA CH IY Z -versace(2) V ER S AA CH IY versailles V EH R S AY versailles(2) V EH R S EY L Z versatile V ER S AH T AH L @@ -127508,12 +127565,12 @@ vet V EH T veta V EH T AH vetco V EH T K OW veteran V EH T ER AH N -veteran's V EH T ER AH N Z veteran(2) V EH T R AH N +veteran's V EH T ER AH N Z veterans V EH T ER AH N Z +veterans(2) V EH T R AH N Z veterans' V EH T ER AH N Z veterans'(2) V EH T R AH N Z -veterans(2) V EH T R AH N Z vetere V EH T ER veterinarian V EH T R AH N EH R IY AH N veterinarian(2) V EH T ER AH N EH R IY AH N @@ -127643,9 +127700,9 @@ vicon V IH K AH N vicon's V IH K AH N Z vicorp V AY K AO R P victim V IH K T AH M +victim(2) V IH K T IH M victim's V IH K T AH M Z victim's(2) V IH K T IH M Z -victim(2) V IH K T IH M victimhood V IH K T AH M HH UH D victimization V IH K T AH M AH Z EY SH AH N victimize V IH K T AH M AY Z @@ -127653,8 +127710,8 @@ victimized V IH K T AH M AY Z D victimizing V IH K T AH M AY Z IH NG victimless V IH K T AH M L AH S victims V IH K T AH M Z -victims' V IH K T IH M Z victims(2) V IH K T IH M Z +victims' V IH K T IH M Z victoire V IH K T W AA R victor V IH K T ER victor's V IH K T ER Z @@ -127816,8 +127873,8 @@ villafane V IY L AA F AA N EY villafranca V IH L AH F R AE NG K AH villafuerte V IY L AA F W EH R T EY village V IH L AH JH -village's V IH L IH JH IH Z village(2) V IH L IH JH +village's V IH L IH JH IH Z villager V IH L IH JH ER villagers V IH L IH JH ER Z villages V IH L AH JH AH Z @@ -127877,16 +127934,16 @@ vince's V IH N S IH S vincelette V IH N S IH L EH T vincennes V IH N S EH N AH S vincent V IH N S AH N T -vincent's V IH N S IH N T S vincent(2) V IH N S IH N T +vincent's V IH N S IH N T S vincente V IH N CH EH N T IY vincenti V IY N CH EH N T IY vincentia V IY N CH EH N SH AH vincenzo V IH N S EH N Z OW vinci V IH N S IY +vinci(2) V IH N CH IY vinci's V IH N S IY Z vinci's(2) V IH N CH IY Z -vinci(2) V IH N CH IY vinciguerra V IY N CH IY G EH R AH vindicate V IH N D AH K EY T vindicated V IH N D AH K EY T IH D @@ -128371,8 +128428,8 @@ volpicella V OW L P IH S EH L AH volt V OW L T volta V OW L T AH voltage V OW L T AH JH -voltage's V OW L T IH JH IH Z voltage(2) V OW L T IH JH +voltage's V OW L T IH JH IH Z voltages V OW L T AH JH AH Z voltages(2) V OW L T IH JH IH Z voltaire V OW L T EH R @@ -128507,8 +128564,8 @@ voyage(2) V OY IH JH voyaged V OY AH JH D voyaged(2) V OY IH JH D voyager V OY AH JH ER -voyager's V OY IH JH ER Z voyager(2) V OY IH JH ER +voyager's V OY IH JH ER Z voyagers V OY IH JH ER Z voyages V OY AH JH AH Z voyages(2) V OY IH JH IH Z @@ -128694,9 +128751,9 @@ wagler W AE G L ER wagley W AE G L IY wagman W AE G M AH N wagner W AE G N ER +wagner(2) V AA G N ER wagner's W AE G N ER Z wagner's(2) V AE G N ER Z -wagner(2) V AA G N ER wagnerian W AE G N EH R IY AH N wagnerian(2) V AA G N EH R IY AH N wagnon W AE G N AH N @@ -128832,9 +128889,9 @@ waldenbooks W AO L D AH N B UH K S waldenbooks' W AO L D AH N B UH K S walder W AO L D ER waldheim W AO L D HH AY M +waldheim(2) V AO L D HH AY M waldheim's W AO L D HH AY M Z waldheim's(2) V AO L D HH AY M Z -waldheim(2) V AO L D HH AY M waldholtz W AO L D HH OW L T S waldholtz's W AO L D HH OW L T S IH Z waldholz W AO L D HH OW L T S @@ -128873,9 +128930,9 @@ walenta(2) V AH L EH N T AH wales W EY L Z wales' W EY L Z walesa W AH L EH S AH +walesa(2) V AH L EH S AH walesa's W AH L EH S AH Z walesa's(2) V AH L EH S AH Z -walesa(2) V AH L EH S AH waleson W EY L S AH N walford W AO L F ER D walfred W AO L F R EH D @@ -128926,8 +128983,8 @@ walla W AO L AA wallabies W AA L AH B IY Z wallaby W AA L AH B IY wallace W AO L AH S -wallace's W AO L AH S AH Z wallace(2) W AO L IH S +wallace's W AO L AH S AH Z wallach W AO L AH K wallack W AO L AH K wallander W AO L AH N D ER @@ -128979,8 +129036,8 @@ wallsend W AO L S EH N D wallstreet W AO L S T R IY T wallwork W AO L W ER K wally W AO L IY -wally's W AO L IY Z wally(2) W EY L IY +wally's W AO L IY Z walmart W AO L M AA R T walmart's W AO L M AA R T S walmarts W AO L M AA R T S @@ -129328,9 +129385,9 @@ washes W AA SH IH Z washi's W AA SH IY Z washing W AA SH IH NG washington W AA SH IH NG T AH N +washington(2) W AO SH IH NG T AH N washington's W AA SH IH NG T AH N Z washington's(2) W AO SH IH NG T AH N Z -washington(2) W AO SH IH NG T AH N washingtonian W AA SH IH NG T OW N IY AH N washingtonian(2) W AO SH IH NG T OW N IY AH N washingtonians W AA SH IH NG T OW N IY AH N Z @@ -129724,9 +129781,9 @@ wedig W EH D IH G wedin W EH D IH N wedlock W EH D L AA K wednesday W EH N Z D IY +wednesday(2) W EH N Z D EY wednesday's W EH N Z D IY Z wednesday's(2) W EH N Z D EY Z -wednesday(2) W EH N Z D EY wednesdays W EH N Z D EY Z wednesdays(2) W EH N Z D IY Z wedowee W EH D AW W IY @@ -129750,8 +129807,8 @@ week's W IY K S weekday W IY K D EY weekdays W IY K D EY Z weekend W IY K EH N D -weekend's W IY K EH N D Z weekend(2) W IY K IH N D +weekend's W IY K EH N D Z weekender W IY K EH N D ER weekends W IY K EH N D Z weekes W IY K S @@ -129865,8 +129922,8 @@ weiker W AY K ER weikert W AY K ER T weikle W IY K AH L weil W AY L -weil's W AY L Z weil(2) W IY L +weil's W AY L Z weiland W AY L AH N D weilbacher W AY L B AA K ER weild W AY L D @@ -129908,9 +129965,9 @@ weinrich W AY N R IH K weinroth W AY N R AO TH weins W IY N Z weinstein W AY N S T AY N +weinstein(2) W AY N S T IY N weinstein's W AY N S T AY N Z weinstein's(2) W AY N S T IY N Z -weinstein(2) W AY N S T IY N weinstock W AY N S T AA K weintraub W AY N T R AW B weintz W AY N T S @@ -130059,6 +130116,7 @@ wellies W EH L IY Z welling W EH L IH NG wellington W EH L IH NG T AH N wellington's W EH L IH NG T AH N Z +wellingtons W EH L IH NG T AH N Z welliver W EH L IH V ER wellman W EH L M AH N wellner W EH L N ER @@ -130307,8 +130365,8 @@ westerman W EH S T ER M AH N westermann W EH S T ER M AH N westermeyer W EH S T ER M AY ER western W EH S T ER N -western's W EH S T ER N Z western(2) HH W EH S T ER N +western's W EH S T ER N Z westerner W EH S T ER N ER westerners W EH S T ER N ER Z westernization W EH S T ER N IH Z EY SH AH N @@ -130440,9 +130498,9 @@ whackos W AE K OW Z whacks W AE K S whacks(2) HH W AE K S whale W EY L +whale(2) HH W EY L whale's W EY L Z whale's(2) HH W EY L Z -whale(2) HH W EY L whalen W EY L AH N whalen(2) HH W EY L AH N whaler W EY L ER @@ -130467,9 +130525,9 @@ whan(2) HH W AE N whang W AE NG whang(2) HH W AE NG wharf W AO R F +wharf(2) HH W AO R F wharf's W AO R F S wharf's(2) HH W AO R F S -wharf(2) HH W AO R F wharff W AA R F wharff(2) HH W AA R F wharfs W AO R F S @@ -130479,6 +130537,7 @@ wharry(2) HH W AE R IY wharton W AO R T AH N wharton's W AO R T AH N Z what W AH T +what(2) HH W AH T what'd W AH T IH D what'd(2) HH W AH T IH D what'll W AH T AH L @@ -130488,13 +130547,12 @@ what're(2) HH W AH T ER what's W AH T S what's(2) HH W AH T S what've W AH T AH V -what(2) HH W AH T what-what W AH T W AH T whate W EY T whatever W AH T EH V ER +whatever(2) HH W AH T EH V ER whatever's W AH T EH V ER Z whatever's(2) HH W AH T EH V ER Z -whatever(2) HH W AH T EH V ER whatley W AH T L IY whatley(2) HH W AH T L IY whatnot W AH T N AA T @@ -130547,17 +130605,17 @@ wheeldon(2) HH W IY L D AH N wheeled W IY L D wheeled(2) HH W IY L D wheeler W IY L ER +wheeler(2) HH W IY L ER wheeler's W IY L ER Z wheeler's(2) HH W IY L ER Z -wheeler(2) HH W IY L ER wheelers W IY L ER Z wheelers(2) HH W IY L ER Z wheeless W IY L AH S wheeless(2) HH W IY L AH S wheeling W IY L IH NG +wheeling(2) HH W IY L IH NG wheeling's W IY L IH NG Z wheeling's(2) HH W IY L IH NG Z -wheeling(2) HH W IY L IH NG wheelis W IY L IH S wheelis(2) HH W IY L IH S wheelock W IY L AA K @@ -130592,25 +130650,25 @@ whelpley(2) HH W EH L P L IY whelton W EH L T AH N whelton(2) HH W EH L T AH N when W EH N +when(2) HH W EH N +when(3) W IH N +when(4) HH W IH N when'll W EH N AH L when'll(2) HH W EH N AH L when's W EH N Z when's(2) HH W EH N Z -when(2) HH W EH N -when(3) W IH N -when(4) HH W IH N whence W EH N S whence(2) HH W EH N S whenever W EH N EH V ER whenever(2) HH W EH N EH V ER where W EH R +where(2) HH W EH R where'd W EH R D where'd(2) HH W EH R D where're W EH R ER where's W EH R Z where's(2) HH W EH R Z where've W EH R AH V -where(2) HH W EH R whereabouts W EH R AH B AW T S whereabouts(2) HH W EH R AH B AW T S whereas W EH R AE Z @@ -130652,11 +130710,11 @@ whew(3) HH Y UW whey W EY whey(2) HH W EY which W IH CH +which(2) HH W IH CH which're W IH CH ER which're(2) HH W IH CH ER which's W IH CH IH Z which's(2) HH W IH CH IH Z -which(2) HH W IH CH whichard W IH CH ER D whichard(2) HH W IH CH ER D whichever W IH CH EH V ER @@ -130733,9 +130791,9 @@ whipped(2) HH W IH P T whipping W IH P IH NG whipping(2) HH W IH P IH NG whipple W IH P AH L +whipple(2) HH W IH P AH L whipple's W IH P AH L Z whipple's(2) HH W IH P AH L Z -whipple(2) HH W IH P AH L whippoorwills W IH P ER W IH L Z whippoorwills(2) HH W IH P ER W IH L Z whipps W IH P S @@ -130757,9 +130815,9 @@ whirley(2) HH W ER L IY whirling W ER L IH NG whirling(2) HH W ER L IH NG whirlpool W ER L P UW L +whirlpool(2) HH W ER L P UW L whirlpool's W ER L P UW L Z whirlpool's(2) HH W ER L P UW L Z -whirlpool(2) HH W ER L P UW L whirlpools W ER L P UW L Z whirlpools(2) HH W ER L P UW L Z whirlwind W ER L W IH N D @@ -130848,9 +130906,9 @@ whitcomb(2) HH W IH T K AH M whitcraft W IH T K R AE F T whitcraft(2) HH W IH T K R AE F T white W AY T +white(2) HH W AY T white's W AY T S white's(2) HH W AY T S -white(2) HH W AY T whiteaker W IH T AH K ER whiteaker(2) HH W IH T AH K ER whitebread W AY T B R EH D @@ -130868,13 +130926,13 @@ whiteford(2) HH W AY T F AO R D whitehair W AY T HH EH R whitehair(2) HH W AY T HH EH R whitehall W AY T HH AO L +whitehall(2) HH W AY T HH AO L whitehall's W AY T HH AO L Z whitehall's(2) HH W AY T HH AO L Z -whitehall(2) HH W AY T HH AO L whitehead W AY T HH EH D +whitehead(2) HH W AY T HH EH D whitehead's W AY T HH EH D Z whitehead's(2) HH W AY T HH EH D Z -whitehead(2) HH W AY T HH EH D whitehill W AY T HH IH L whitehill(2) HH W AY T HH IH L whitehorn W AY T HH AO R N @@ -130884,8 +130942,8 @@ whitehorse(2) HH W AY T HH AO R S whitehouse W AY T HH AW S whitehouse(2) HH W AY T HH AW S whitehurst W AY T HH ER S T -whitehurst's W AY T HH ER S T S whitehurst(2) HH W AY T HH ER S T +whitehurst's W AY T HH ER S T S whitelaw W AY T L AO whitelaw(2) HH W AY T L AO whiteley W AY T L IY @@ -130940,9 +130998,9 @@ whitewash(2) HH W AY T W AA SH whitewashed W AY T W AA SH T whitewashed(2) HH W AY T W AA SH T whitewater W AY T W AO T ER +whitewater(2) HH W AY T W AO T ER whitewater's W AY T W AO T ER Z whitewater's(2) HH W AY T W AO T ER Z -whitewater(2) HH W AY T W AO T ER whitey W AY T IY whitey(2) HH W AY T IY whitfield W IH T F IY L D @@ -130979,9 +131037,9 @@ whitlow(2) HH W IH T L OW whitly W IH T L IY whitly(2) HH W IH T L IY whitman W IH T M AH N +whitman(2) HH W IH T M AH N whitman's W IH T M AH N Z whitman's(2) HH W IH T M AH N Z -whitman(2) HH W IH T M AH N whitmarsh W IH T M AA R SH whitmarsh(2) HH W IH T M AA R SH whitmer W IH T M ER @@ -130999,9 +131057,9 @@ whitmyer(2) HH W IH T M AY ER whitner W IH T N ER whitner(2) HH W IH T N ER whitney W IH T N IY +whitney(2) HH W IH T N IY whitney's W IH T N IY Z whitney's(2) HH W IH T N IY Z -whitney(2) HH W IH T N IY whiton W IH T AH N whiton(2) HH W IH T AH N whitrow W IH T R OW @@ -131043,9 +131101,9 @@ whittinghill(2) HH W IH T IH NG HH IH L whittington W IH T IH NG T AH N whittington(2) HH W IH T IH NG T AH N whittle W IH T AH L +whittle(2) HH W IH T AH L whittle's W IH T AH L Z whittle's(2) HH W IH T AH L Z -whittle(2) HH W IH T AH L whittled W IH T AH L D whittled(2) HH W IH T AH L D whittlesey W IH T AH L S IY @@ -131147,12 +131205,12 @@ whorton HH AO R T AH N whose HH UW Z whosoever HH UW S OW EH V ER why W AY +why(2) HH W AY why'd W AY D why'd(2) HH W AY D why're W AY ER why's W AY Z why's(2) HH W AY Z -why(2) HH W AY whys W AY Z whys(2) HH W AY Z whyte W AY T @@ -131315,9 +131373,9 @@ wiener W IY N ER wiener(2) W AY N ER wieners W IY N ER Z wienerschnitzel W IY N ER SH N IH T S AH L +wienerschnitzel(2) V IY N ER SH N IH T S AH L wienerschnitzel's W IY N ER SH N IH T S AH L Z wienerschnitzel's(2) V IY N ER SH N IH T S AH L Z -wienerschnitzel(2) V IY N ER SH N IH T S AH L wienke W IY NG K wiens W IY N Z wier W IH R @@ -131349,8 +131407,8 @@ wieting W IY T IH NG wife W AY F wife's W AY F S wifi W AY F AY -wifi's W AY F AY Z wifi(2) W IY F IY +wifi's W AY F AY Z wifis W AY F AY Z wig W IH G wigal W IH G AH L @@ -131519,24 +131577,24 @@ wilkin W IH L K IH N wilking W IH L K IH NG wilkins W IH L K IH N Z wilkinson W IH L K AH N S AH N -wilkinson's W IH L K IH N S AH N Z wilkinson(2) W IH L K IH N S AH N +wilkinson's W IH L K IH N S AH N Z wilkis W IH L K IH S wilkison W IH L K IH S AH N wilkowski V IH L K AO F S K IY wilks W IH L K S will W IH L -will's W IH L Z will(2) W AH L +will's W IH L Z willa W IH L AH willabelle W IH L AH B EH L willadsen W IH L AE D S AH N willaims W IH L AH M Z willam W IH L AH M willamette W AH L AE M AH T +willamette(2) W IH L AH M EH T willamette's W AH L AE M AH T S willamette's(2) W IH L AH M EH T S -willamette(2) W IH L AH M EH T willamina W IH L AH M AY N AH willapa W IH L AA P AH willapa's W IH L AA P AH Z @@ -131708,8 +131766,8 @@ winchester W IH N CH EH S T ER wincing W IH N S IH NG winckler W IH NG K L ER wind W AY N D -wind's W IH N D Z wind(2) W IH N D +wind's W IH N D Z windchill W IH N D CH IH L windchime W IH N D CH AY M windchimes W IH N D CH AY M Z @@ -132110,8 +132168,8 @@ witness' W IH T N AH S witness's W IH T N AH S IH Z witnessed W IH T N AH S T witnesses W IH T N AH S AH Z -witnesses' W IH T N AH S IH Z witnesses(2) W IH T N AH S IH Z +witnesses' W IH T N AH S IH Z witnessing W IH T N AH S IH NG witowski V IH T AO F S K IY wits W IH T S @@ -132351,8 +132409,8 @@ womer W OW M ER wometco W OW M EH T K OW wommack W AA M AH K won W AH N -won't W OW N T won(2) W AA N +won't W OW N T wond W AO N D wonda W AA N D AH wonder W AH N D ER @@ -132419,8 +132477,8 @@ woodington W UH D IH NG T AH N woodis W UH D IH S woodke W UH D K IY woodland W UH D L AE N D -woodland's W UH D L AE N D Z woodland(2) W UH D L AH N D +woodland's W UH D L AE N D Z woodlands W UH D L AE N D Z woodlands(2) W UH D L AH N D Z woodle W UH D AH L @@ -132460,8 +132518,8 @@ woodson's W UH D S AH N Z woodstock W UH D S T AA K woodstream W UH D S T R IY M woodward W UH D W AO R D -woodward's W UH D W ER D Z woodward(2) W UH D W ER D +woodward's W UH D W ER D Z woodwind W UH D W IH N D woodwind's W UH D W IH N D Z woodwinds W UH D W IH N D Z @@ -132724,9 +132782,9 @@ wowie W AW IY wowing W AW IH NG wows W AW Z woy W OY -wozniak V AA Z N IY AE K +wozniak W AA Z N IY AE K woznick W AA Z N IH K -woznicki V AH Z N IH T S K IY +woznicki W AH Z N IH T S K IY wozny W AA Z N IY wrack R AE K wracked R AE K T @@ -132993,8 +133051,8 @@ x-acto EH G Z AE K T OW x-ray EH K S R EY x-rays EH K S R EY Z x. EH K S -x.'s EH K S IH Z x.(2) AE K S +x.'s EH K S IH Z x.ers EH K S ER Z x.s EH K S IH Z xan SH AA N @@ -133046,11 +133104,11 @@ xio ZH AO xiong ZH AO NG xml EH K S EH M EH L xoma Z OW M AH +xoma(2) IH G Z OW M AH +xoma(3) EH K S OW M AH xoma's Z OW M AH Z xoma's(2) IH G Z OW M AH Z xoma's(3) EH K S OW M AH Z -xoma(2) IH G Z OW M AH -xoma(3) EH K S OW M AH xscribe EH K S K R AY B xtra EH K S T R AH xu Z UW @@ -133246,14 +133304,14 @@ yasmin Y AE Z M IH N yasmine Y AE Z M IH N yass Y AE S yasser Y AE S ER +yasser(2) Y AA S ER yasser's Y AE S ER Z yasser's(2) Y AA S ER Z -yasser(2) Y AA S ER yassin Y AE S IH N yassir Y AE S IH R +yassir(2) Y AA S IH R yassir's Y AE S IH R Z yassir's(2) Y AA S IH R Z -yassir(2) Y AA S IH R yasso Y AA S OW yassukovich Y AH S UW K AH V IH CH yastrow Y AE S T R OW @@ -133338,8 +133396,8 @@ yearnings Y ER N IH NG Z yearns Y ER N Z yearout Y IH R AW T years Y IH R Z -years' Y IH R Z years(2) Y ER Z +years' Y IH R Z years-old Y IH R Z AO L D yearsley Y ER S L IY yearwood Y IH R W UH D @@ -133442,9 +133500,9 @@ yeske Y EH S K yessuey Y EH S UW IY yest Y EH S T yesterday Y EH S T ER D EY +yesterday(2) Y EH S T ER D IY yesterday's Y EH S T ER D EY Z yesterday's(2) Y EH S T ER D IY Z -yesterday(2) Y EH S T ER D IY yesterdays Y EH S T ER D EY Z yesterdays(2) Y EH S T ER D IY Z yesteryear Y EH S T ER Y IH R @@ -133559,9 +133617,9 @@ yolk Y OW K yolks Y OW K S yolo Y OW L OW yom Y AA M +yom(2) Y OW M yom's Y AA M Z yom's(2) Y OW M Z -yom(2) Y OW M yomiuri Y OW M IY ER IY yon Y AA N yona Y OW N AH @@ -133932,6 +133990,7 @@ zambian Z AE M B IY AH N zambito Z AA M B IY T OW zambo Z AE M B OW zamboanga Z AE M B OW NG G AH +zamboni Z AE M B OW N IY zambrana Z AA M B R AE N AH zambrano Z AA M B R AA N OW zambrano(2) Z AE M B R AE N OW @@ -134093,9 +134152,9 @@ zeckendorf Z EH K AH N D AO R F zed Z EH D zedekiah Z EH D AH K AY AH zedillo Z EY D IY OW +zedillo(2) Z EH D IH L OW zedillo's Z EY D IY OW Z zedillo's(2) Z EH D IH L OW Z -zedillo(2) Z EH D IH L OW zedillos Z EY D IY OW Z zedillos(2) Z EH D IH L OW Z zedong Z EY D AO NG @@ -134223,8 +134282,8 @@ zenia Z EY N IY AH zenica Z EH N IH K AH zenina Z EH N IY N AH zenith Z IY N AH TH -zenith's Z IY N IH TH S zenith(2) Z IY N IH TH +zenith's Z IY N IH TH S zenk Z EH NG K zenker Z EH NG K ER zenna Z EH N AH @@ -134264,9 +134323,9 @@ zerlinda Z ER L IY N D AH zermeno Z ER M EH N OW zern Z IH R N zero Z IH R OW +zero(2) Z IY R OW zero's Z IH R OW Z zero's(2) Z IY R OW Z -zero(2) Z IY R OW zero-sum Z IY R OW S AH M zeroed Z IH R OW D zeroed(2) Z IY R OW D @@ -134611,15 +134670,15 @@ zuchowski Z AH HH AO F S K IY zuchowski(2) Z UW K AO F S K IY zuck Z AH K zucker Z AH K ER +zucker(2) Z UW K ER zucker's Z AH K ER Z zucker's(2) Z UW K ER Z -zucker(2) Z UW K ER zuckerberg Z AH K ER B ER G zuckerberg's Z AH K ER B ER G Z zuckerman Z AH K ER M AH N +zuckerman(2) Z UW K ER M AH N zuckerman's Z AH K ER M AH N Z zuckerman's(2) Z UW K ER M AH N Z -zuckerman(2) Z UW K ER M AH N zue Z UW zue's Z UW Z zuege Z UW JH @@ -134631,9 +134690,9 @@ zufelt Z AH F IH L T zug Z AH G zug's Z AH G Z zuganov Z UW G AH N AO V +zuganov(2) Z UW G AH N AO F zuganov's Z UW G AH N AO V S zuganov's(2) Z UW G AH N AO F S -zuganov(2) Z UW G AH N AO F zuhlke Z UW L K zuidema Z UW IH D EH M AH zuk Z AH K @@ -134717,7 +134776,7 @@ zynda Z IH N D AH zysk Z AY S K zyskowski Z IH S K AO F S K IY zyuganov Z Y UW G AA N AA V +zyuganov(2) Z UW G AA N AA V zyuganov's Z Y UW G AA N AA V Z zyuganov's(2) Z UW G AA N AA V Z -zyuganov(2) Z UW G AA N AA V zywicki Z IH W IH K IY diff --git a/model/en-us/en-us/feat.params b/model/en-us/en-us/feat.params index 4dc9e37..d73869e 100644 --- a/model/en-us/en-us/feat.params +++ b/model/en-us/en-us/feat.params @@ -9,4 +9,4 @@ -cmn batch -varnorm no -model ptm --cmninit 41.00,-5.29,-0.12,5.09,2.48,-4.07,-1.37,-1.78,-5.08,-2.05,-6.45,-1.42,1.17 +-remove_noise yes diff --git a/pocketsphinx.pc.in b/pocketsphinx.pc.in index 3eb8948..49cc0ff 100644 --- a/pocketsphinx.pc.in +++ b/pocketsphinx.pc.in @@ -1,16 +1,15 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ -libs=@LIBS@ -datadir=@datarootdir@/@PACKAGE@ -modeldir=@datarootdir@/@PACKAGE@/model +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=@CMAKE_INSTALL_PREFIX@ +libdir=@CMAKE_INSTALL_FULL_LIBDIR@ +includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ +libs= +datadir=@CMAKE_INSTALL_FULL_DATADIR@/@PROJECT_SHORTNAME@ +modeldir=@CMAKE_INSTALL_FULL_DATADIR@/@PROJECT_SHORTNAME@/model Name: PocketSphinx Description: Lightweight speech recognition system -Version: @VERSION@ -URL: http://cmusphinx.sourceforge.net/ -Requires: sphinxbase >= @VERSION@ +Version: @PROJECT_VERSION@ +URL: @PACKAGE_URL@ Libs: -L${libdir} -lpocketsphinx Libs.private: ${libs} -lm -Cflags: -I${includedir} -I${includedir}/sphinxbase -I${includedir}/pocketsphinx +Cflags: -I${includedir} -I${includedir}/pocketsphinx diff --git a/pocketsphinx.sln b/pocketsphinx.sln deleted file mode 100644 index f145878..0000000 --- a/pocketsphinx.sln +++ /dev/null @@ -1,56 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Express 2012 for Windows Desktop -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pocketsphinx", "win32\pocketsphinx\pocketsphinx.vcxproj", "{94001A0E-A837-445C-8004-F918F10D0226}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pocketsphinx_continuous", "win32\pocketsphinx_continuous\pocketsphinx_continuous.vcxproj", "{1380AF76-C926-44D0-8002-06C228AC869A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pocketsphinx_batch", "win32\pocketsphinx_batch\pocketsphinx_batch.vcxproj", "{CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pocketsphinx_mdef_convert", "win32\pocketsphinx_mdef_convert\pocketsphinx_mdef_convert.vcxproj", "{4FB65800-11B8-46BD-95B8-6E4F73BDAD91}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {94001A0E-A837-445C-8004-F918F10D0226}.Debug|Win32.ActiveCfg = Debug|Win32 - {94001A0E-A837-445C-8004-F918F10D0226}.Debug|Win32.Build.0 = Debug|Win32 - {94001A0E-A837-445C-8004-F918F10D0226}.Debug|x64.ActiveCfg = Debug|x64 - {94001A0E-A837-445C-8004-F918F10D0226}.Debug|x64.Build.0 = Debug|x64 - {94001A0E-A837-445C-8004-F918F10D0226}.Release|Win32.ActiveCfg = Release|Win32 - {94001A0E-A837-445C-8004-F918F10D0226}.Release|Win32.Build.0 = Release|Win32 - {94001A0E-A837-445C-8004-F918F10D0226}.Release|x64.ActiveCfg = Release|x64 - {94001A0E-A837-445C-8004-F918F10D0226}.Release|x64.Build.0 = Release|x64 - {1380AF76-C926-44D0-8002-06C228AC869A}.Debug|Win32.ActiveCfg = Debug|Win32 - {1380AF76-C926-44D0-8002-06C228AC869A}.Debug|Win32.Build.0 = Debug|Win32 - {1380AF76-C926-44D0-8002-06C228AC869A}.Debug|x64.ActiveCfg = Debug|x64 - {1380AF76-C926-44D0-8002-06C228AC869A}.Debug|x64.Build.0 = Debug|x64 - {1380AF76-C926-44D0-8002-06C228AC869A}.Release|Win32.ActiveCfg = Release|Win32 - {1380AF76-C926-44D0-8002-06C228AC869A}.Release|Win32.Build.0 = Release|Win32 - {1380AF76-C926-44D0-8002-06C228AC869A}.Release|x64.ActiveCfg = Release|x64 - {1380AF76-C926-44D0-8002-06C228AC869A}.Release|x64.Build.0 = Release|x64 - {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Debug|Win32.ActiveCfg = Debug|Win32 - {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Debug|Win32.Build.0 = Debug|Win32 - {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Debug|x64.ActiveCfg = Debug|x64 - {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Debug|x64.Build.0 = Debug|x64 - {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Release|Win32.ActiveCfg = Release|Win32 - {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Release|Win32.Build.0 = Release|Win32 - {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Release|x64.ActiveCfg = Release|x64 - {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A}.Release|x64.Build.0 = Release|x64 - {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Debug|Win32.ActiveCfg = Debug|Win32 - {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Debug|Win32.Build.0 = Debug|Win32 - {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Debug|x64.ActiveCfg = Debug|x64 - {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Debug|x64.Build.0 = Debug|x64 - {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Release|Win32.ActiveCfg = Release|Win32 - {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Release|Win32.Build.0 = Release|Win32 - {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Release|x64.ActiveCfg = Release|x64 - {4FB65800-11B8-46BD-95B8-6E4F73BDAD91}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/programs/CMakeLists.txt b/programs/CMakeLists.txt new file mode 100644 index 0000000..7ce362a --- /dev/null +++ b/programs/CMakeLists.txt @@ -0,0 +1,35 @@ +set(POCKETSPHINX_PROGRAMS + pocketsphinx_main + pocketsphinx_batch + pocketsphinx_mdef_convert + pocketsphinx_jsgf2fsg + pocketsphinx_lm_convert + pocketsphinx_lm_eval + pocketsphinx_pitch + ) +foreach(PROGRAM ${POCKETSPHINX_PROGRAMS}) + add_executable(${PROGRAM} ${PROGRAM}.c) + target_link_libraries(${PROGRAM} pocketsphinx) + target_include_directories( + ${PROGRAM} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${PROGRAM} PRIVATE ${CMAKE_BINARY_DIR}) + add_dependencies(check ${PROGRAM}) +endforeach() +# CMake and its lovely flat namespace +set_target_properties(pocketsphinx_main PROPERTIES OUTPUT_NAME pocketsphinx) + +# The cmake docs indicate you should check MACOSX_BUNDLE +# and that MACOSX_BUNDLE is initialized based on the value +# of CMAKE_MACOSX_BUNDLE but in practice, MACOSX_BUNDLE +# seems blank regardless of the value of CMAKE_MACOSX_BUNDLE. +# Since MACOSX_BUNDLE seems intended to just forward the value +# of CMAKE_MACOSX_BUNDLE anyway, we check CMAKE_MACOSX_BUNDLE +# directly. +if(CMAKE_MACOSX_BUNDLE) + install(TARGETS ${POCKETSPHINX_PROGRAMS} + RUNTIME DESTINATION bin + BUNDLE DESTINATION bin + ) +else() + install(TARGETS ${POCKETSPHINX_PROGRAMS} RUNTIME) +endif() diff --git a/programs/fsg2dot.pl b/programs/fsg2dot.pl new file mode 100755 index 0000000..784ff3a --- /dev/null +++ b/programs/fsg2dot.pl @@ -0,0 +1,44 @@ +#!/usr/bin/env perl + +use strict; + +my $nstates; +while (<>) { + chomp; + s/#.*$//; + next if /^$/; + + if (/FSG_BEGIN (\S+)/) { + print "digraph $1 {\n\trankdir=LR;\n\t"; + } + elsif (/NUM_STATES (\d+)/) { + $nstates = $1; + } + elsif (/START_STATE (\d+)/) { + } + elsif (/FINAL_STATE (\d+)/) { + my $end = $1; + + print "\tnode [shape=circle];"; + for (my $i = 0; $i < $nstates; ++$i) { + print " $i" unless $i == $end; + } + print ";\n\tnode [shape=doublecircle]; $end;\n\n"; + } + elsif (/TRANSITION/) { + my (undef, $from, $to, $weight, $word) = split; + + my $label; + if ($weight != 1.0 and defined($word)) { + $label = sprintf "%s/%.2f", $word, $weight; + } + elsif ($weight != 1.0) { + $label = sprintf "%.2f", $weight; + } + elsif ($word) { + $label = $word; + } + print "\t$from -> $to [label=\"$label\"];\n"; + } +} +print "}\n"; diff --git a/src/programs/batch.c b/programs/pocketsphinx_batch.c similarity index 72% rename from src/programs/batch.c rename to programs/pocketsphinx_batch.c index f516186..3a1ae21 100644 --- a/src/programs/batch.c +++ b/programs/pocketsphinx_batch.c @@ -35,20 +35,17 @@ * */ -/* System headers. */ #include -/* SphinxBase headers. */ -#include -#include -#include -#include -#include - -/* PocketSphinx headers. */ #include -/* S3kr3t headerz. */ +#include "util/ckd_alloc.h" +#include "util/strfuncs.h" +#include "util/filename.h" +#include "util/byteorder.h" +#include "util/pio.h" +#include "lm/fsg_model.h" +#include "config_macro.h" #include "pocketsphinx_internal.h" /* Silvio Moioli: setbuf doesn't exist in Windows CE */ @@ -57,138 +54,150 @@ } #endif -static const arg_t ps_args_def[] = { +static const ps_arg_t ps_args_def[] = { POCKETSPHINX_OPTIONS, /* Various options specific to batch-mode processing. */ /* Argument file. */ - { "-argfile", + { "argfile", ARG_STRING, NULL, "Argument file giving extra arguments." }, /* Control file. */ - { "-ctl", + { "ctl", ARG_STRING, NULL, "Control file listing utterances to be processed" }, - { "-ctloffset", - ARG_INT32, + { "ctloffset", + ARG_INTEGER, "0", "No. of utterances at the beginning of -ctl file to be skipped" }, - { "-ctlcount", - ARG_INT32, + { "ctlcount", + ARG_INTEGER, "-1", "No. of utterances to be processed (after skipping -ctloffset entries)" }, - { "-ctlincr", - ARG_INT32, + { "ctlincr", + ARG_INTEGER, "1", "Do every Nth line in the control file" }, - { "-mllrctl", + { "mllrctl", ARG_STRING, NULL, "Control file listing MLLR transforms to use for each utterance" }, - { "-mllrdir", + { "mllrdir", ARG_STRING, NULL, "Base directory for MLLR transforms" }, - { "-mllrext", + { "mllrext", ARG_STRING, NULL, "File extension for MLLR transforms (including leading dot)" }, - { "-lmnamectl", + { "lmnamectl", ARG_STRING, NULL, "Control file listing LM name to use for each utterance" }, - { "-fsgctl", + { "fsgctl", ARG_STRING, NULL, "Control file listing FSG file to use for each utterance" }, - { "-fsgdir", + { "fsgdir", ARG_STRING, NULL, "Base directory for FSG files" }, - { "-fsgext", + { "fsgext", ARG_STRING, NULL, "File extension for FSG files (including leading dot)" }, + { "alignctl", + ARG_STRING, + NULL, + "Control file listing transcript files to force-align to utts" }, + { "aligndir", + ARG_STRING, + NULL, + "Base directory for transcript files" }, + { "alignext", + ARG_STRING, + NULL, + "File extension for transcript files (including leading dot)" }, /* Input file types and locations. */ - { "-adcin", + { "adcin", ARG_BOOLEAN, "no", "Input is raw audio data" }, - { "-adchdr", - ARG_INT32, + { "adchdr", + ARG_INTEGER, "0", "Size of audio file header in bytes (headers are ignored)" }, - { "-senin", + { "senin", ARG_BOOLEAN, "no", "Input is senone score dump files" }, - { "-cepdir", + { "cepdir", ARG_STRING, NULL, "Input files directory (prefixed to filespecs in control file)" }, - { "-cepext", + { "cepext", ARG_STRING, ".mfc", "Input files extension (suffixed to filespecs in control file)" }, /* Output files. */ - { "-hyp", + { "hyp", ARG_STRING, NULL, "Recognition output file name" }, - { "-hypseg", + { "hypseg", ARG_STRING, NULL, "Recognition output with segmentation file name" }, - { "-ctm", + { "ctm", ARG_STRING, NULL, "Recognition output in CTM file format (may require post-sorting)" }, - { "-outlatdir", + { "outlatdir", ARG_STRING, NULL, "Directory for dumping word lattices" }, - { "-outlatfmt", + { "outlatfmt", ARG_STRING, "s3", "Format for dumping word lattices (s3 or htk)" }, - { "-outlatext", + { "outlatext", ARG_STRING, ".lat", "Filename extension for dumping word lattices" }, - { "-outlatbeam", - ARG_FLOAT64, + { "outlatbeam", + ARG_FLOATING, "1e-5", "Minimum posterior probability for output lattice nodes" }, - { "-build_outdirs", + { "build_outdirs", ARG_BOOLEAN, "yes", "Create missing subdirectories in output directory" }, - { "-nbestdir", + { "nbestdir", ARG_STRING, NULL, "Directory for writing N-best hypothesis lists" }, - { "-nbestext", + { "nbestext", ARG_STRING, ".hyp", "Extension for N-best hypothesis list files" }, - { "-nbest", - ARG_INT32, + { "nbest", + ARG_INTEGER, "0", "Number of N-best hypotheses to write to -nbestdir (0 for no N-best)" }, CMDLN_EMPTY_OPTION }; -static mfcc_t ** +static float32 ** read_mfc_file(FILE *infh, int sf, int ef, int *out_nfr, int ceplen) { long flen; int32 nmfc, nfr; float32 *floats; - mfcc_t **mfcs; + float32 **mfcs; int swap, i; fseek(infh, 0, SEEK_END); @@ -220,7 +229,7 @@ read_mfc_file(FILE *infh, int sf, int ef, int *out_nfr, int ceplen) nfr = ef - sf; mfcs = ckd_calloc_2d(nfr, ceplen, sizeof(**mfcs)); floats = (float32 *)mfcs[0]; - if (fread(floats, 4, nfr * ceplen, infh) != nfr * ceplen) { + if (fread(floats, 4, nfr * ceplen, infh) != (size_t)nfr * ceplen) { E_ERROR_SYSTEM("Failed to read %d items from mfcfile"); ckd_free_2d(mfcs); return NULL; @@ -229,10 +238,6 @@ read_mfc_file(FILE *infh, int sf, int ef, int *out_nfr, int ceplen) for (i = 0; i < nfr * ceplen; ++i) SWAP_FLOAT32(&floats[i]); } -#ifdef FIXED_POINT - for (i = 0; i < nfr * ceplen; ++i) - mfcs[0][i] = FLOAT2MFCC(floats[i]); -#endif *out_nfr = nfr; return mfcs; } @@ -254,8 +259,8 @@ process_mllrctl_line(ps_decoder_t *ps, cmd_ln_t *config, char const *file) ckd_free(lastfile); lastfile = ckd_salloc(file); - mllrext = cmd_ln_str_r(config, "-mllrext"); - if ((mllrdir = cmd_ln_str_r(config, "-mllrdir"))) + mllrext = ps_config_str(config, "mllrext"); + if ((mllrdir = ps_config_str(config, "mllrdir"))) infile = string_join(mllrdir, "/", file, mllrext ? mllrext : "", NULL); else if (mllrext) @@ -284,8 +289,8 @@ process_fsgctl_line(ps_decoder_t *ps, cmd_ln_t *config, char const *fname) fsg_model_t *fsg; int err; char *path = NULL; - const char *fsgdir = cmd_ln_str_r(config, "-fsgdir"); - const char *fsgext = cmd_ln_str_r(config, "-fsgext"); + const char *fsgdir = ps_config_str(config, "fsgdir"); + const char *fsgext = ps_config_str(config, "fsgext"); if (fname == NULL) return 0; @@ -298,19 +303,19 @@ process_fsgctl_line(ps_decoder_t *ps, cmd_ln_t *config, char const *fname) path = ckd_salloc(fname); fsg = fsg_model_readfile(path, ps_get_logmath(ps), - cmd_ln_float32_r(config, "-lw")); + ps_config_float(config, "lw")); err = 0; if (!fsg) { err = -1; goto error_out; } - if (ps_set_fsg(ps, fname, fsg)) { + if (ps_add_fsg(ps, fname, fsg)) { err = -1; goto error_out; } E_INFO("Using FSG: %s\n", fname); - if (ps_set_search(ps, fname)) + if (ps_activate_search(ps, fname)) err = -1; error_out: @@ -323,23 +328,76 @@ process_fsgctl_line(ps_decoder_t *ps, cmd_ln_t *config, char const *fname) static int process_lmnamectl_line(ps_decoder_t *ps, cmd_ln_t *config, char const *lmname) { + (void)config; if (!lmname) return 0; E_INFO("Using language model: %s\n", lmname); - if (ps_set_search(ps, lmname)) { + if (ps_activate_search(ps, lmname)) { E_ERROR("No such language model: %s\n", lmname); return -1; } return 0; } +static int +process_alignctl_line(ps_decoder_t *ps, cmd_ln_t *config, char const *fname) +{ + int err; + char *path = NULL; + const char *aligndir = ps_config_str(config, "aligndir"); + const char *alignext = ps_config_str(config, "alignext"); + char *text = NULL; + size_t nchars, nread; + FILE *fh; + + if (fname == NULL) + return 0; + + if (aligndir) + path = string_join(aligndir, "/", fname, alignext ? alignext : "", NULL); + else if (alignext) + path = string_join(fname, alignext, NULL); + else + path = ckd_salloc(fname); + + if ((fh = fopen(path, "r")) == NULL) { + E_ERROR_SYSTEM("Failed to open transcript file %s", path); + err = -1; + goto error_out; + } + fseek(fh, 0, SEEK_END); + nchars = ftell(fh); + text = ckd_calloc(nchars + 1, 1); + fseek(fh, 0, SEEK_SET); + if ((nread = fread(text, 1, nchars, fh)) != nchars) { + E_ERROR_SYSTEM("Failed to fully read transcript file %s", path); + err = -1; + goto error_out; + } + if ((err = fclose(fh)) != 0) { + E_ERROR_SYSTEM("Failed to close transcript file %s", path); + goto error_out; + } + if (ps_set_align_text(ps, text)) { + err = -1; + goto error_out; + } + E_INFO("Force-aligning with transcript from: %s\n", fname); + +error_out: + ckd_free(path); + ckd_free(text); + + return err; +} + static int build_outdir_one(cmd_ln_t *config, char const *arg, char const *uttpath) { char const *dir; - if ((dir = cmd_ln_str_r(config, arg)) != NULL) { + if ((dir = ps_config_str(config, arg)) != NULL) { char *dirname = string_join(dir, "/", uttpath, NULL); build_directory(dirname); ckd_free(dirname); @@ -353,11 +411,11 @@ build_outdirs(cmd_ln_t *config, char const *uttid) char *uttpath = ckd_salloc(uttid); path2dirname(uttid, uttpath); - build_outdir_one(config, "-outlatdir", uttpath); - build_outdir_one(config, "-mfclogdir", uttpath); - build_outdir_one(config, "-rawlogdir", uttpath); - build_outdir_one(config, "-senlogdir", uttpath); - build_outdir_one(config, "-nbestdir", uttpath); + build_outdir_one(config, "outlatdir", uttpath); + build_outdir_one(config, "mfclogdir", uttpath); + build_outdir_one(config, "rawlogdir", uttpath); + build_outdir_one(config, "senlogdir", uttpath); + build_outdir_one(config, "nbestdir", uttpath); ckd_free(uttpath); return 0; @@ -376,8 +434,8 @@ process_ctl_line(ps_decoder_t *ps, cmd_ln_t *config, return -1; } - cepdir = cmd_ln_str_r(config, "-cepdir"); - cepext = cmd_ln_str_r(config, "-cepext"); + cepdir = ps_config_str(config, "cepdir"); + cepext = ps_config_str(config, "cepext"); /* Build input filename. */ infile = string_join(cepdir ? cepdir : "", @@ -391,40 +449,39 @@ process_ctl_line(ps_decoder_t *ps, cmd_ln_t *config, return -1; } /* Build output directories. */ - if (cmd_ln_boolean_r(config, "-build_outdirs")) + if (ps_config_bool(config, "build_outdirs")) build_outdirs(config, uttid); - if (cmd_ln_boolean_r(config, "-senin")) { + if (ps_config_bool(config, "senin")) { /* start and end frames not supported. */ ps_decode_senscr(ps, infh); } - else if (cmd_ln_boolean_r(config, "-adcin")) { + else if (ps_config_bool(config, "adcin")) { if (ef != -1) { ef = (int32)((ef - sf) - * (cmd_ln_float32_r(config, "-samprate") - / cmd_ln_int32_r(config, "-frate")) - + (cmd_ln_float32_r(config, "-samprate") - * cmd_ln_float32_r(config, "-wlen"))); + * ((double)ps_config_int(config, "samprate") + / ps_config_int(config, "frate")) + + ((double)ps_config_int(config, "samprate") + * ps_config_float(config, "wlen"))); } sf = (int32)(sf - * (cmd_ln_float32_r(config, "-samprate") - / cmd_ln_int32_r(config, "-frate"))); - fseek(infh, cmd_ln_int32_r(config, "-adchdr") + sf * sizeof(int16), SEEK_SET); + * ((double)ps_config_int(config, "samprate") + / ps_config_int(config, "frate"))); + fseek(infh, ps_config_int(config, "adchdr") + sf * sizeof(int16), SEEK_SET); ps_decode_raw(ps, infh, ef); } else { - mfcc_t **mfcs; + float32 **mfcs; int nfr; if (NULL == (mfcs = read_mfc_file(infh, sf, ef, &nfr, - cmd_ln_int32_r(config, "-ceplen")))) { + ps_config_int(config, "ceplen")))) { E_ERROR("Failed to read MFCC from the file '%s'\n", infile); fclose(infh); ckd_free(infile); return -1; } - ps_start_stream(ps); ps_start_utt(ps); ps_process_cep(ps, mfcs, nfr, FALSE, TRUE); ps_end_utt(ps); @@ -450,12 +507,12 @@ write_lattice(ps_decoder_t *ps, char const *latdir, char const *uttid) } config = ps_get_config(ps); outfile = string_join(latdir, "/", uttid, - cmd_ln_str_r(config, "-outlatext"), NULL); + ps_config_str(config, "outlatext"), NULL); /* Prune lattice. */ lmath = ps_get_logmath(ps); - beam = logmath_log(lmath, cmd_ln_float64_r(config, "-outlatbeam")); + beam = logmath_log(lmath, ps_config_float(config, "outlatbeam")); ps_lattice_posterior_prune(lat, beam); - if (0 == strcmp("htk", cmd_ln_str_r(config, "-outlatfmt"))) { + if (0 == strcmp("htk", ps_config_str(config, "outlatfmt"))) { if (ps_lattice_write_htk(lat, outfile) < 0) { E_ERROR("Failed to write lattice to %s\n", outfile); return -1; @@ -482,8 +539,8 @@ write_nbest(ps_decoder_t *ps, char const *nbestdir, char const *uttid) config = ps_get_config(ps); outfile = string_join(nbestdir, "/", uttid, - cmd_ln_str_r(config, "-nbestext"), NULL); - n = cmd_ln_int32_r(config, "-nbest"); + ps_config_str(config, "nbestext"), NULL); + n = ps_config_int(config, "nbest"); fh = fopen(outfile, "w"); if (fh == NULL) { E_ERROR_SYSTEM("Failed to write a lattice to file %s\n", outfile); @@ -589,6 +646,38 @@ write_ctm(FILE *fh, ps_decoder_t *ps, ps_seg_t *itor, char const *uttid, int32 f return 0; } +static char * +get_align_hyp(ps_decoder_t *ps, int *out_score) +{ + ps_seg_t *itor; + char *out, *ptr; + int len; + + if (ps_get_hyp(ps, out_score) == NULL) + return ckd_salloc(""); + len = 0; + for (itor = ps_seg_iter(ps); itor; itor = ps_seg_next(itor)) { + /* FIXME: Need to handle tag transitions somehow... */ + if (itor->wid < 0) + continue; + len += strlen(itor->text); + len++; + } + if (len == 0) + return ckd_salloc(""); + ptr = out = ckd_malloc(len); + for (itor = ps_seg_iter(ps); itor; itor = ps_seg_next(itor)) { + if (itor->wid < 0) + continue; + len = strlen(itor->text); + memcpy(ptr, itor->text, len); + ptr += len; + *ptr++ = ' '; + } + *--ptr = '\0'; + return out; +} + static void process_ctl(ps_decoder_t *ps, cmd_ln_t *config, FILE *ctlfh) { @@ -597,42 +686,49 @@ process_ctl(ps_decoder_t *ps, cmd_ln_t *config, FILE *ctlfh) char *line; size_t len; FILE *hypfh = NULL, *hypsegfh = NULL, *ctmfh = NULL; - FILE *mllrfh = NULL, *lmfh = NULL, *fsgfh = NULL; + FILE *mllrfh = NULL, *lmfh = NULL, *fsgfh = NULL, *alignfh = NULL; double n_speech, n_cpu, n_wall; char const *outlatdir; char const *nbestdir; char const *str; int frate; - ctloffset = cmd_ln_int32_r(config, "-ctloffset"); - ctlcount = cmd_ln_int32_r(config, "-ctlcount"); - ctlincr = cmd_ln_int32_r(config, "-ctlincr"); - outlatdir = cmd_ln_str_r(config, "-outlatdir"); - nbestdir = cmd_ln_str_r(config, "-nbestdir"); - frate = cmd_ln_int32_r(config, "-frate"); + ctloffset = ps_config_int(config, "ctloffset"); + ctlcount = ps_config_int(config, "ctlcount"); + ctlincr = ps_config_int(config, "ctlincr"); + outlatdir = ps_config_str(config, "outlatdir"); + nbestdir = ps_config_str(config, "nbestdir"); + frate = ps_config_int(config, "frate"); - if ((str = cmd_ln_str_r(config, "-mllrctl"))) { + if ((str = ps_config_str(config, "mllrctl"))) { mllrfh = fopen(str, "r"); if (mllrfh == NULL) { E_ERROR_SYSTEM("Failed to open MLLR control file file %s", str); goto done; } } - if ((str = cmd_ln_str_r(config, "-fsgctl"))) { + if ((str = ps_config_str(config, "fsgctl"))) { fsgfh = fopen(str, "r"); if (fsgfh == NULL) { E_ERROR_SYSTEM("Failed to open FSG control file file %s", str); goto done; } } - if ((str = cmd_ln_str_r(config, "-lmnamectl"))) { + if ((str = ps_config_str(config, "alignctl"))) { + alignfh = fopen(str, "r"); + if (alignfh == NULL) { + E_ERROR_SYSTEM("Failed to open alignment control file file %s", str); + goto done; + } + } + if ((str = ps_config_str(config, "lmnamectl"))) { lmfh = fopen(str, "r"); if (lmfh == NULL) { E_ERROR_SYSTEM("Failed to open LM name control file file %s", str); goto done; } } - if ((str = cmd_ln_str_r(config, "-hyp"))) { + if ((str = ps_config_str(config, "hyp"))) { hypfh = fopen(str, "w"); if (hypfh == NULL) { E_ERROR_SYSTEM("Failed to open hypothesis file %s for writing", str); @@ -640,7 +736,7 @@ process_ctl(ps_decoder_t *ps, cmd_ln_t *config, FILE *ctlfh) } setbuf(hypfh, NULL); } - if ((str = cmd_ln_str_r(config, "-hypseg"))) { + if ((str = ps_config_str(config, "hypseg"))) { hypsegfh = fopen(str, "w"); if (hypsegfh == NULL) { E_ERROR_SYSTEM("Failed to open hypothesis file %s for writing", str); @@ -648,7 +744,7 @@ process_ctl(ps_decoder_t *ps, cmd_ln_t *config, FILE *ctlfh) } setbuf(hypsegfh, NULL); } - if ((str = cmd_ln_str_r(config, "-ctm"))) { + if ((str = ps_config_str(config, "ctm"))) { ctmfh = fopen(str, "w"); if (ctmfh == NULL) { E_ERROR_SYSTEM("Failed to open hypothesis file %s for writing", str); @@ -663,6 +759,7 @@ process_ctl(ps_decoder_t *ps, cmd_ln_t *config, FILE *ctlfh) int32 nf, sf, ef; char *mllrline = NULL, *lmline = NULL, *fsgline = NULL; char *fsgfile = NULL, *lmname = NULL, *mllrfile = NULL; + char *alignline = NULL, *alignfile = NULL; if (mllrfh) { mllrline = fread_line(mllrfh, &len); @@ -694,6 +791,16 @@ process_ctl(ps_decoder_t *ps, cmd_ln_t *config, FILE *ctlfh) } fsgfile = string_trim(fsgline, STRING_BOTH); } + if (alignfh) { + alignline = fread_line(alignfh, &len); + if (alignline == NULL) { + E_ERROR("File size mismatch between control and align control\n"); + ckd_free(line); + ckd_free(alignline); + goto done; + } + alignfile = string_trim(alignline, STRING_BOTH); + } if (i < ctloffset) { i += ctlincr; @@ -713,7 +820,7 @@ process_ctl(ps_decoder_t *ps, cmd_ln_t *config, FILE *ctlfh) E_ERROR("Unexpected extra data in control file at line %d\n", i); } else { - char const *hyp, *file, *uttid; + char const *hyp = NULL, *file, *uttid; int32 score; file = wptr[0]; @@ -735,13 +842,25 @@ process_ctl(ps_decoder_t *ps, cmd_ln_t *config, FILE *ctlfh) continue; if(process_fsgctl_line(ps, config, fsgfile) < 0) continue; + if(process_alignctl_line(ps, config, alignfile) < 0) + continue; if(process_ctl_line(ps, config, file, uttid, sf, ef) < 0) continue; - hyp = ps_get_hyp(ps, &score); - - /* Write out results and such. */ + /* Special case for force-alignment: report silences and + * alternate pronunciations. This isn't done + * automatically because Reasons. (API consistency but + * also because force-alignment is really secretly FSG + * search at the moment). */ if (hypfh) { - fprintf(hypfh, "%s (%s %d)\n", hyp ? hyp : "", uttid, score); + if (alignfile) { + char *align_hyp = get_align_hyp(ps, &score); + fprintf(hypfh, "%s (%s %d)\n", align_hyp, uttid, score); + ckd_free(align_hyp); + } + else { + hyp = ps_get_hyp(ps, &score); + fprintf(hypfh, "%s (%s %d)\n", hyp ? hyp : "", uttid, score); + } } if (hypsegfh) { write_hypseg(hypsegfh, ps, uttid); @@ -767,6 +886,7 @@ process_ctl(ps_decoder_t *ps, cmd_ln_t *config, FILE *ctlfh) } i += ctlincr; nextline: + ckd_free(alignline); ckd_free(mllrline); ckd_free(fsgline); ckd_free(lmline); @@ -786,6 +906,8 @@ process_ctl(ps_decoder_t *ps, cmd_ln_t *config, FILE *ctlfh) fclose(hypsegfh); if (ctmfh) fclose(ctmfh); + if (alignfh) + fclose(alignfh); } int @@ -799,16 +921,18 @@ main(int32 argc, char *argv[]) config = cmd_ln_parse_r(NULL, ps_args_def, argc, argv, TRUE); /* Handle argument file as -argfile. */ - if (config && (ctl = cmd_ln_str_r(config, "-argfile")) != NULL) { + if (config && (ctl = ps_config_str(config, "argfile")) != NULL) { config = cmd_ln_parse_file_r(config, ps_args_def, ctl, FALSE); } if (config == NULL) { /* This probably just means that we got no arguments. */ + err_set_loglevel(ERR_INFO); + cmd_ln_log_help_r(NULL, ps_args_def); return 1; } - if ((ctl = cmd_ln_str_r(config, "-ctl")) == NULL) { + if ((ctl = ps_config_str(config, "ctl")) == NULL) { E_FATAL("-ctl argument not present, nothing to do in batch mode!\n"); } if ((ctlfh = fopen(ctl, "r")) == NULL) { @@ -817,7 +941,7 @@ main(int32 argc, char *argv[]) ps_default_search_args(config); if (!(ps = ps_init(config))) { - cmd_ln_free_r(config); + ps_config_free(config); fclose(ctlfh); E_FATAL("PocketSphinx decoder init failed\n"); } @@ -826,7 +950,7 @@ main(int32 argc, char *argv[]) fclose(ctlfh); ps_free(ps); - cmd_ln_free_r(config); + ps_config_free(config); return 0; } diff --git a/programs/pocketsphinx_jsgf2fsg.c b/programs/pocketsphinx_jsgf2fsg.c new file mode 100644 index 0000000..8f1193c --- /dev/null +++ b/programs/pocketsphinx_jsgf2fsg.c @@ -0,0 +1,226 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include + +#include "util/ckd_alloc.h" +#include "util/hash_table.h" +#include "util/strfuncs.h" +#include "lm/fsg_model.h" +#include "lm/jsgf.h" +#include "pocketsphinx_internal.h" + +static const ps_arg_t defn[] = { + { "help", + ARG_BOOLEAN, + "no", + "Shows the usage of the tool"}, + + { "jsgf", + REQARG_STRING, + NULL, + "Input grammar in jsgf format (required)"}, + + { "toprule", + ARG_STRING, + NULL, + "Root rule name (optional)"}, + + { "fsg", + ARG_STRING, + NULL, + "Output grammar in fsg format"}, + + { "fsm", + ARG_STRING, + NULL, + "Output grammar in FSM format"}, + + { "symtab", + ARG_STRING, + NULL, + "Output symtab for grammar in FSM format"}, + + { "compile", + ARG_BOOLEAN, + "no", + "Compute grammar closure to speedup loading"}, + + { "loglevel", + ARG_STRING, + "WARN", + "Minimum level of log messages (DEBUG, INFO, WARN, ERROR)" }, + + { NULL, 0, NULL, NULL } +}; + + +static void +usagemsg(char *pgm) +{ + E_INFO("Usage: %s -jsgf -toprule \\\n", pgm); + E_INFOCONT("\t[-fsm yes/no] [-compile yes/no]\n"); + E_INFOCONT("\t-fsg \n"); + + exit(0); +} + +static fsg_model_t * +get_fsg(jsgf_t *grammar, const char *name) +{ + logmath_t *lmath; + fsg_model_t *fsg; + jsgf_rule_t *rule; + + /* Take the -toprule if specified. */ + if (name) { + rule = jsgf_get_rule(grammar, name); + if (rule == NULL) { + E_ERROR("Start rule %s not found\n", name); + return NULL; + } + } else { + rule = jsgf_get_public_rule(grammar); + if (rule == NULL) { + E_ERROR("No public rules found in grammar %s\n", jsgf_grammar_name(grammar)); + return NULL; + } else { + E_INFO("No -toprule was given; grabbing the first public rule: " + "'%s' of the grammar '%s'.\n", + jsgf_rule_name(rule), jsgf_grammar_name(grammar)); + } + } + + lmath = logmath_init(1.0001, 0, 0); + fsg = jsgf_build_fsg_raw(grammar, rule, lmath, 1.0); + return fsg; +} + +int +main(int argc, char *argv[]) +{ + jsgf_t *jsgf; + fsg_model_t *fsg; + cmd_ln_t *config; + const char *rule, *loglevel; + + if ((config = cmd_ln_parse_r(NULL, defn, argc, argv, TRUE)) == NULL) { + /* This probably just means that we got no arguments. */ + err_set_loglevel(ERR_INFO); + cmd_ln_log_help_r(NULL, defn); + return 1; + } + + if (ps_config_bool(config, "help")) { + usagemsg(argv[0]); + } + + loglevel = ps_config_str(config, "loglevel"); + if (loglevel) { + if (err_set_loglevel_str(loglevel) == NULL) { + E_ERROR("Invalid log level: %s\n", loglevel); + return -1; + } + } + + jsgf = jsgf_parse_file(ps_config_str(config, "jsgf"), NULL); + if (jsgf == NULL) { + return 1; + } + + rule = ps_config_str(config, "toprule") ? ps_config_str(config, "toprule") : NULL; + if (!(fsg = get_fsg(jsgf, rule))) { + E_ERROR("No fsg was built for the given rule '%s'.\n" + "Check rule name; it should be qualified (with grammar name)\n" + "and not enclosed in angle brackets (e.g. 'grammar.rulename').", + rule); + return 1; + } + + + if (ps_config_bool(config, "compile")) { + fsg_model_null_trans_closure(fsg, NULL); + } + + + if (ps_config_str(config, "fsm")) { + const char* outfile = ps_config_str(config, "fsm"); + const char* symfile = ps_config_str(config, "symtab"); + if (outfile) + fsg_model_writefile_fsm(fsg, outfile); + else + fsg_model_write_fsm(fsg, stdout); + if (symfile) + fsg_model_writefile_symtab(fsg, symfile); + } + else { + const char *outfile = ps_config_str(config, "fsg"); + if (outfile) + fsg_model_writefile(fsg, outfile); + else + fsg_model_write(fsg, stdout); + } + fsg_model_free(fsg); + jsgf_grammar_free(jsgf); + + return 0; +} + + +#if defined(_WIN32_WCE) +#pragma comment(linker,"/entry:mainWCRTStartup") +#include + +/* Windows Mobile has the Unicode main only */ +int wmain(int32 argc, wchar_t *wargv[]) { + char** argv; + size_t wlen; + size_t len; + int i; + + argv = malloc(argc*sizeof(char*)); + for (i = 0; i < argc; i++){ + wlen = lstrlenW(wargv[i]); + len = wcstombs(NULL, wargv[i], wlen); + argv[i] = malloc(len+1); + wcstombs(argv[i], wargv[i], wlen); + } + + /* assuming ASCII parameters */ + return main(argc, argv); +} +#endif diff --git a/programs/pocketsphinx_lm_convert.c b/programs/pocketsphinx_lm_convert.c new file mode 100644 index 0000000..302a53c --- /dev/null +++ b/programs/pocketsphinx_lm_convert.c @@ -0,0 +1,212 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2009 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * \file sphinx_lm_convert.c + * Language model conversion tool. + */ +#include +#include "pocketsphinx_internal.h" +#include "lm/ngram_model.h" +#include "util/ckd_alloc.h" +#include "util/cmd_ln.h" +#include "util/ckd_alloc.h" +#include "util/pio.h" +#include "util/strfuncs.h" + +#include +#include +#include + +static const ps_arg_t defn[] = { + { "help", + ARG_BOOLEAN, + "no", + "Shows the usage of the tool"}, + + { "logbase", + ARG_FLOATING, + "1.0001", + "Base in which all log-likelihoods calculated" }, + + { "i", + REQARG_STRING, + NULL, + "Input language model file (required)"}, + + { "o", + REQARG_STRING, + NULL, + "Output language model file (required)"}, + + { "ifmt", + ARG_STRING, + NULL, + "Input language model format (will guess if not specified)"}, + + { "ofmt", + ARG_STRING, + NULL, + "Output language model file (will guess if not specified)"}, + + { "case", + ARG_STRING, + NULL, + "Ether 'lower' or 'upper' - case fold to lower/upper case (NOT UNICODE AWARE)" }, + + { "mmap", + ARG_BOOLEAN, + "no", + "Use memory-mapped I/O for reading binary LM files"}, + + { NULL, 0, NULL, NULL } +}; + +static void +usagemsg(char *pgm) +{ + E_INFO("Usage: %s -i \\\n", pgm); + E_INFOCONT("\t[-ifmt txt] [-ofmt dmp]\n"); + E_INFOCONT("\t-o \n"); + + exit(0); +} + + +int +main(int argc, char *argv[]) +{ + cmd_ln_t *config; + ngram_model_t *lm = NULL; + logmath_t *lmath; + int itype, otype; + char const *kase; + + if ((config = cmd_ln_parse_r(NULL, defn, argc, argv, TRUE)) == NULL) { + /* This probably just means that we got no arguments. */ + err_set_loglevel(ERR_INFO); + cmd_ln_log_help_r(NULL, defn); + return 1; + } + + if (ps_config_bool(config, "help")) { + usagemsg(argv[0]); + } + + /* Create log math object. */ + if ((lmath = logmath_init + (ps_config_float(config, "logbase"), 0, 0)) == NULL) { + E_FATAL("Failed to initialize log math\n"); + } + + if (ps_config_str(config, "i") == NULL || ps_config_str(config, "i") == NULL) { + E_ERROR("Please specify both input and output models\n"); + goto error_out; + } + + /* Load the input language model. */ + if (ps_config_str(config, "ifmt")) { + if ((itype = ngram_str_to_type(ps_config_str(config, "ifmt"))) + == NGRAM_INVALID) { + E_ERROR("Invalid input type %s\n", ps_config_str(config, "ifmt")); + goto error_out; + } + lm = ngram_model_read(config, ps_config_str(config, "i"), + itype, lmath); + } + else { + lm = ngram_model_read(config, ps_config_str(config, "i"), + NGRAM_AUTO, lmath); + } + + if (lm == NULL) { + E_ERROR("Failed to read the model from the file '%s'\n", ps_config_str(config, "i")); + goto error_out; + } + + /* Guess or set the output language model type. */ + if (ps_config_str(config, "ofmt")) { + if ((otype = ngram_str_to_type(ps_config_str(config, "ofmt"))) + == NGRAM_INVALID) { + E_ERROR("Invalid output type %s\n", ps_config_str(config, "ofmt")); + goto error_out; + } + } + else { + otype = ngram_file_name_to_type(ps_config_str(config, "o")); + } + + /* Case fold if requested. */ + if ((kase = ps_config_str(config, "case"))) { + if (0 == strcmp(kase, "lower")) { + ngram_model_casefold(lm, NGRAM_LOWER); + } + else if (0 == strcmp(kase, "upper")) { + ngram_model_casefold(lm, NGRAM_UPPER); + } + else { + E_ERROR("Unknown value for -case: %s\n", kase); + goto error_out; + } + } + + /* Write the output language model. */ + if (ngram_model_write(lm, ps_config_str(config, "o"), otype) != 0) { + E_ERROR("Failed to write language model in format %s to %s\n", + ngram_type_to_str(otype), ps_config_str(config, "o")); + goto error_out; + } + + /* That's all folks! */ + ngram_model_free(lm); + if (lmath) { + logmath_free(lmath); + } + if (config) { + ps_config_free(config); + } + return 0; + +error_out: + ngram_model_free(lm); + if (lmath) { + logmath_free(lmath); + } + if (config) { + ps_config_free(config); + } + return 1; +} diff --git a/programs/pocketsphinx_lm_eval.c b/programs/pocketsphinx_lm_eval.c new file mode 100644 index 0000000..329c50c --- /dev/null +++ b/programs/pocketsphinx_lm_eval.c @@ -0,0 +1,331 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * \file sphinx_lm_eval.c + * Language model evaluation tool. + */ +#include + +#include "lm/ngram_model.h" +#include "util/ckd_alloc.h" +#include "util/cmd_ln.h" +#include "util/ckd_alloc.h" +#include "util/pio.h" +#include "util/strfuncs.h" +#include "pocketsphinx_internal.h" + +#include +#include +#include + +static const ps_arg_t defn[] = { + { "help", + ARG_BOOLEAN, + "no", + "Shows the usage of the tool"}, + + { "logbase", + ARG_FLOATING, + "1.0001", + "Base in which all log-likelihoods calculated" }, + + { "lm", + ARG_STRING, + NULL, + "Language model file"}, + + { "probdef", + ARG_STRING, + NULL, + "Probability definition file for classes in LM"}, + + { "lmctlfn", + ARG_STRING, + NULL, + "Control file listing a set of language models"}, + + { "lmname", + ARG_STRING, + NULL, + "Name of language model in -lmctlfn to use for all utterances" }, + + { "lsn", + ARG_STRING, + NULL, + "Transcription file to evaluate"}, + + { "text", + ARG_STRING, + NULL, + "Text string to evaluate"}, + + { "mmap", + ARG_BOOLEAN, + "no", + "Use memory-mapped I/O for reading binary LM files"}, + + { "lw", + ARG_FLOATING, + "1.0", + "Language model weight" }, + + { "wip", + ARG_FLOATING, + "1.0", + "Word insertion probability" }, + + { "verbose", + ARG_BOOLEAN, + "no", + "Print details of perplexity calculation" }, + + /* FIXME: Support -lmstartsym, -lmendsym, -lmctlfn, -ctl_lm */ + { NULL, 0, NULL, NULL } +}; + +static int verbose; + +static int +calc_entropy(ngram_model_t *lm, char **words, int32 n, + int32 *out_n_ccs, int32 *out_n_oovs, int32 *out_lm_score) +{ + int32 *wids; + int32 startwid; + int32 i, ch, nccs, noovs, unk; + + if (n == 0) + return 0; + + unk = ngram_unknown_wid(lm); + + /* Reverse this array into an array of word IDs. */ + wids = ckd_calloc(n, sizeof(*wids)); + for (i = 0; i < n; ++i) + wids[n-i-1] = ngram_wid(lm, words[i]); + /* Skip as it's a context cue (HACK, this should be configurable). */ + startwid = ngram_wid(lm, ""); + + /* Now evaluate the list of words in reverse using the + * remainder of the array as the history. */ + ch = noovs = nccs = 0; + for (i = 0; i < n; ++i) { + int32 n_used; + int32 prob; + + /* Skip as it's a context cue (HACK, this should be configurable). */ + if (wids[i] == startwid) { + ++nccs; + continue; + } + /* Skip and count OOVs. */ + if (wids[i] == NGRAM_INVALID_WID || wids[i] == unk) { + ++noovs; + continue; + } + /* Sum up information for each N-gram */ + prob = ngram_ng_score(lm, + wids[i], wids + i + 1, + n - i - 1, &n_used); + if (verbose) { + int m; + printf("log P(%s|", ngram_word(lm, wids[i])); + m = i + ngram_model_get_size(lm) - 1; + if (m >= n) + m = n - 1; + while (m > i) { + printf("%s ", ngram_word(lm, wids[m--])); + } + printf(") = %d\n", prob); + } + ch -= prob; + } + + if (out_n_ccs) *out_n_ccs = nccs; + if (out_n_oovs) *out_n_oovs = noovs; + + /* Calculate cross-entropy CH = - 1/N sum log P(W|H) */ + n -= (nccs + noovs); + if (n <= 0) + return 0; + if (out_lm_score) + *out_lm_score = -ch; + return ch / n; +} + +static void +evaluate_file(ngram_model_t *lm, logmath_t *lmath, const char *lsnfn) +{ + FILE *fh; + lineiter_t *litor; + int32 nccs, noovs, nwords, lscr; + float64 ch, log_to_log2;; + + if ((fh = fopen(lsnfn, "r")) == NULL) + E_FATAL_SYSTEM("failed to open transcript file %s", lsnfn); + + /* We have to keep ch in floating-point to avoid overflows, so + * we might as well use log2. */ + log_to_log2 = log(logmath_get_base(lmath)) / log(2); + lscr = nccs = noovs = nwords = 0; + ch = 0.0; + for (litor = lineiter_start(fh); litor; litor = lineiter_next(litor)) { + char **words; + int32 n, tmp_ch, tmp_noovs, tmp_nccs, tmp_lscr; + + n = str2words(litor->buf, NULL, 0); + if (n < 0) + E_FATAL("str2words(line, NULL, 0) = %d, should not happen\n", n); + if (n == 0) /* Do nothing! */ + continue; + words = ckd_calloc(n, sizeof(*words)); + str2words(litor->buf, words, n); + + /* Remove any utterance ID (FIXME: has to be a single "word") */ + if (words[n-1][0] == '(' + && words[n-1][strlen(words[n-1])-1] == ')') + n = n - 1; + + tmp_ch = calc_entropy(lm, words, n, &tmp_nccs, + &tmp_noovs, &tmp_lscr); + + ch += (float64) tmp_ch * (n - tmp_nccs - tmp_noovs) * log_to_log2; + nccs += tmp_nccs; + noovs += tmp_noovs; + lscr += tmp_lscr; + nwords += n; + + ckd_free(words); + } + + ch /= (nwords - nccs - noovs); + printf("cross-entropy: %f bits\n", ch); + + /* Calculate perplexity pplx = exp CH */ + printf("perplexity: %f\n", pow(2.0, ch)); + printf("lm score: %d\n", lscr); + + /* Report OOVs and CCs */ + printf("%d words evaluated\n", nwords); + printf("%d OOVs (%.2f%%), %d context cues removed\n", + noovs, (double)noovs / nwords * 100, nccs); +} + +static void +evaluate_string(ngram_model_t *lm, logmath_t *lmath, const char *text) +{ + char *textfoo; + char **words; + int32 n, ch, noovs, nccs, lscr; + + /* Split it into an array of strings. */ + textfoo = ckd_salloc(text); + n = str2words(textfoo, NULL, 0); + if (n < 0) + E_FATAL("str2words(textfoo, NULL, 0) = %d, should not happen\n", n); + if (n == 0) /* Do nothing! */ + return; + words = ckd_calloc(n, sizeof(*words)); + str2words(textfoo, words, n); + + ch = calc_entropy(lm, words, n, &nccs, &noovs, &lscr); + + printf("input: %s\n", text); + printf("cross-entropy: %f bits\n", + ch * log(logmath_get_base(lmath)) / log(2)); + + /* Calculate perplexity pplx = exp CH */ + printf("perplexity: %f\n", logmath_exp(lmath, ch)); + printf("lm score: %d\n", lscr); + + /* Report OOVs and CCs */ + printf("%d words evaluated\n", n); + printf("%d OOVs, %d context cues removed\n", + noovs, nccs); + + ckd_free(textfoo); + ckd_free(words); +} + +int +main(int argc, char *argv[]) +{ + cmd_ln_t *config; + ngram_model_t *lm = NULL; + logmath_t *lmath; + const char *lmfn, *probdefn, *lsnfn, *text; + + if ((config = cmd_ln_parse_r(NULL, defn, argc, argv, TRUE)) == NULL) { + /* This probably just means that we got no arguments. */ + err_set_loglevel(ERR_INFO); + cmd_ln_log_help_r(NULL, defn); + return 1; + } + + verbose = ps_config_bool(config, "verbose"); + + /* Create log math object. */ + if ((lmath = logmath_init + (ps_config_float(config, "logbase"), 0, 0)) == NULL) { + E_FATAL("Failed to initialize log math\n"); + } + + /* Load the language model. */ + lmfn = ps_config_str(config, "lm"); + if (lmfn == NULL + || (lm = ngram_model_read(config, lmfn, + NGRAM_AUTO, lmath)) == NULL) { + E_FATAL("Failed to load language model from %s\n", + ps_config_str(config, "lm")); + } + if ((probdefn = ps_config_str(config, "probdef")) != NULL) + ngram_model_read_classdef(lm, probdefn); + ngram_model_apply_weights(lm, + ps_config_float(config, "lw"), + ps_config_float(config, "wip")); + + /* Now evaluate some text. */ + lsnfn = ps_config_str(config, "lsn"); + text = ps_config_str(config, "text"); + if (lsnfn) { + evaluate_file(lm, lmath, lsnfn); + } + else if (text) { + evaluate_string(lm, lmath, text); + } + + return 0; +} diff --git a/programs/pocketsphinx_main.c b/programs/pocketsphinx_main.c new file mode 100644 index 0000000..c202a67 --- /dev/null +++ b/programs/pocketsphinx_main.c @@ -0,0 +1,819 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2022 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file pocketsphinx.c + * @brief Simple command-line speech recognition. + */ + +#include +#include +#include +#include + +#include + +#include "util/ckd_alloc.h" +#include "config_macro.h" +#include "pocketsphinx_internal.h" +#include "ps_alignment_internal.h" + +/* Le sigh. Didn't want to have to do this. */ +static const ps_arg_t ps_main_args_def[] = { + POCKETSPHINX_OPTIONS, + { "config", + ARG_STRING, + NULL, + "JSON file with configuration." }, + { "phone_align", + ARG_BOOLEAN, + "no", + "Run a second pass to align phones and print their durations " + "(DOES NOT WORK IN LIVE MODE)." }, + { "state_align", + ARG_BOOLEAN, + "no", + "Run a second pass to align phones and states and print their durations " + "(Implies -phone_align) " + "(DOES NOT WORK IN LIVE MODE)." }, + CMDLN_EMPTY_OPTION +}; + +static int global_done = 0; +static void +catch_sig(int signum) +{ + (void)signum; + global_done = 1; +} + +#define HYP_FORMAT "{\"b\":%.3f,\"d\":%.3f,\"p\":%.3f,\"t\":\"%s\"" +static int +format_hyp(char *outptr, int len, ps_endpointer_t *ep, ps_decoder_t *decoder) +{ + logmath_t *lmath; + double prob, st, et; + const char *hyp; + + lmath = ps_get_logmath(decoder); + prob = logmath_exp(lmath, ps_get_prob(decoder)); + if (ep == NULL) { + st = 0.0; + et = (double)ps_get_n_frames(decoder) + / ps_config_int(ps_get_config(decoder), "frate"); + } + else { + st = ps_endpointer_speech_start(ep); + et = ps_endpointer_speech_end(ep); + } + hyp = ps_get_hyp(decoder, NULL); + if (hyp == NULL) + hyp = ""; + return snprintf(outptr, len, HYP_FORMAT, st, et - st, prob, hyp); +} + +static int +format_seg(char *outptr, int len, ps_seg_t *seg, + double utt_start, int frate, + logmath_t *lmath) +{ + double prob, st, dur; + int sf, ef; + const char *word; + + ps_seg_frames(seg, &sf, &ef); + st = utt_start + (double)sf / frate; + dur = (double)(ef + 1 - sf) / frate; + word = ps_seg_word(seg); + if (word == NULL) + word = ""; + prob = logmath_exp(lmath, ps_seg_prob(seg, NULL, NULL, NULL)); + len = snprintf(outptr, len, HYP_FORMAT, st, dur, prob, word); + if (outptr) { + outptr += len; + *outptr++ = '}'; + *outptr = '\0'; + } + len++; + return len; +} + +static int +format_align_iter(char *outptr, int maxlen, + ps_alignment_iter_t *itor, double utt_start, int frate, logmath_t *lmath) +{ + int start, duration, score; + double prob, st, dur; + const char *word; + + score = ps_alignment_iter_seg(itor, &start, &duration); + st = utt_start + (double)start / frate; + dur = (double)duration / frate; + prob = logmath_exp(lmath, score); + word = ps_alignment_iter_name(itor); + if (word == NULL) + word = ""; + + return snprintf(outptr, maxlen, HYP_FORMAT, st, dur, prob, word); +} + +static int +format_seg_align(char *outptr, int maxlen, + ps_alignment_iter_t *itor, + double utt_start, int frate, + logmath_t *lmath, int state_align) +{ + ps_alignment_iter_t *pitor; + int len = 0, hyplen; + + hyplen = format_align_iter(outptr, maxlen, + itor, utt_start, frate, lmath); + len += hyplen; + if (outptr) + outptr += hyplen; + if (maxlen) + maxlen -= hyplen; + + len += 6; /* "w":,[ */ + if (outptr) { + memcpy(outptr, ",\"w\":[", 6); + outptr += 6; + } + if (maxlen) + maxlen -= 6; + + pitor = ps_alignment_iter_children(itor); + while (pitor != NULL) { + hyplen = format_align_iter(outptr, maxlen, + pitor, utt_start, frate, lmath); + len += hyplen; + if (outptr) + outptr += hyplen; + if (maxlen) + maxlen -= hyplen; + + /* FIXME: refactor with recursion, someday */ + if (state_align) { + ps_alignment_iter_t *sitor = ps_alignment_iter_children(pitor); + len += 6; /* "w":,[ */ + if (outptr) { + memcpy(outptr, ",\"w\":[", 6); + outptr += 6; + } + if (maxlen) + maxlen -= 6; + while (sitor != NULL) { + hyplen = format_align_iter(outptr, maxlen, + sitor, utt_start, frate, lmath); + len += hyplen; + if (outptr) + outptr += hyplen; + if (maxlen) + maxlen -= hyplen; + + len++; /* } */ + if (outptr) + *outptr++ = '}'; + if (maxlen) + maxlen--; + sitor = ps_alignment_iter_next(sitor); + if (sitor != NULL) { + len++; + if (outptr) + *outptr++ = ','; + if (maxlen) + maxlen--; + } + } + len++; + if (outptr) + *outptr++ = ']'; + if (maxlen) + maxlen--; + } + + len++; /* } */ + if (outptr) + *outptr++ = '}'; + if (maxlen) + maxlen--; + pitor = ps_alignment_iter_next(pitor); + if (pitor != NULL) { + len++; + if (outptr) + *outptr++ = ','; + if (maxlen) + maxlen--; + } + } + + len += 2; + if (outptr) { + *outptr++ = ']'; + *outptr++ = '}'; + *outptr = '\0'; + } + if (maxlen) + maxlen--; + + return len; +} + +static void +output_hyp(ps_endpointer_t *ep, ps_decoder_t *decoder, ps_alignment_t *alignment) +{ + logmath_t *lmath; + char *hyp_json, *ptr; + int frate; + int maxlen, len; + double st; + int state_align = ps_config_bool(decoder->config, "state_align"); + + maxlen = format_hyp(NULL, 0, ep, decoder); + maxlen += 6; /* "w":,[ */ + lmath = ps_get_logmath(decoder); + frate = ps_config_int(ps_get_config(decoder), "frate"); + if (ep == NULL) + st = 0.0; + else + st = ps_endpointer_speech_start(ep); + if (alignment) { + ps_alignment_iter_t *itor = ps_alignment_words(alignment); + if (itor == NULL) + maxlen++; /* ] at end */ + for (; itor; itor = ps_alignment_iter_next(itor)) { + maxlen += format_seg_align(NULL, 0, itor, st, frate, + lmath, state_align); + maxlen++; /* , or ] at end */ + } + } + else { + ps_seg_t *itor = ps_seg_iter(decoder); + if (itor == NULL) + maxlen++; /* ] at end */ + for (; itor; itor = ps_seg_next(itor)) { + maxlen += format_seg(NULL, 0, itor, st, frate, lmath); + maxlen++; /* , or ] at end */ + } + } + maxlen++; /* final } */ + maxlen++; /* trailing \0 */ + + ptr = hyp_json = ckd_calloc(maxlen, 1); + len = maxlen; + len = format_hyp(hyp_json, len, ep, decoder); + ptr += len; + maxlen -= len; + + assert(maxlen > 6); + memcpy(ptr, ",\"w\":[", 6); + ptr += 6; + maxlen -= 6; + + if (alignment) { + ps_alignment_iter_t *itor; + for (itor = ps_alignment_words(alignment); itor; + itor = ps_alignment_iter_next(itor)) { + assert(maxlen > 0); + len = format_seg_align(ptr, maxlen, itor, st, frate, lmath, + state_align); + ptr += len; + maxlen -= len; + *ptr++ = ','; + maxlen--; + } + } + else { + ps_seg_t *itor = ps_seg_iter(decoder); + if (itor == NULL) { + *ptr++ = ']'; /* Gets overwritten below... */ + maxlen--; + } + for (; itor; itor = ps_seg_next(itor)) { + assert(maxlen > 0); + len = format_seg(ptr, maxlen, itor, st, frate, lmath); + ptr += len; + maxlen -= len; + *ptr++ = ','; + maxlen--; + } + } + --ptr; + *ptr++ = ']'; + assert(maxlen == 2); + *ptr++ = '}'; + --maxlen; + *ptr = '\0'; + puts(hyp_json); + fflush(stdout); + ckd_free(hyp_json); +} + +static int +live(ps_config_t *config, FILE *infile) +{ + ps_decoder_t *decoder = NULL; + ps_endpointer_t *ep = NULL; + short *frame = NULL; + size_t frame_size; + + if ((decoder = ps_init(config)) == NULL) { + E_FATAL("PocketSphinx decoder init failed\n"); + goto error_out; + } + if ((ep = ps_endpointer_init(0, 0.0, + 0, ps_config_int(config, "samprate"), + 0)) == NULL) { + E_ERROR("PocketSphinx endpointer init failed\n"); + goto error_out; + } + frame_size = ps_endpointer_frame_size(ep); + if ((frame = ckd_calloc(frame_size, sizeof(frame[0]))) == NULL) { + E_ERROR("Failed to allocate frame"); + goto error_out; + } + if (signal(SIGINT, catch_sig) == SIG_ERR) + E_FATAL_SYSTEM("Failed to set SIGINT handler"); + while (!global_done) { + const int16 *speech; + int prev_in_speech = ps_endpointer_in_speech(ep); + size_t len, end_samples; + if ((len = fread(frame, sizeof(frame[0]), + frame_size, infile)) != frame_size) { + if (len > 0) { + speech = ps_endpointer_end_stream(ep, frame, + frame_size, + &end_samples); + } + else + break; + } else + speech = ps_endpointer_process(ep, frame); + if (speech != NULL) { + if (!prev_in_speech) { + E_INFO("Speech start at %.2f\n", + ps_endpointer_speech_start(ep)); + ps_start_utt(decoder); + } + if (ps_process_raw(decoder, speech, frame_size, FALSE, FALSE) < 0) { + E_ERROR("ps_process_raw() failed\n"); + goto error_out; + } + if (!ps_endpointer_in_speech(ep)) { + E_INFO("Speech end at %.2f\n", + ps_endpointer_speech_end(ep)); + ps_end_utt(decoder); + if (ps_config_bool(decoder->config, "phone_align")) + E_WARN("Subword alignment not yet supported in live mode\n"); + output_hyp(ep, decoder, NULL); + } + } + } + ckd_free(frame); + ps_endpointer_free(ep); + ps_free(decoder); + return 0; + +error_out: + if (frame) + ckd_free(frame); + if (ep) + ps_endpointer_free(ep); + if (decoder) + ps_free(decoder); + return -1; +} + +static int +decode_single(ps_decoder_t *decoder, FILE *infile) +{ + ps_alignment_t *alignment = NULL; + size_t data_size, block_size; + short *data, *ptr; + int rv = 0; + + data_size = 65536; + block_size = 2048; + ptr = data = ckd_calloc(data_size, sizeof(*data)); + if (signal(SIGINT, catch_sig) == SIG_ERR) + E_FATAL_SYSTEM("Failed to set SIGINT handler"); + while (!global_done) { + size_t len; + if ((size_t)(ptr + block_size - data) > data_size) { + len = ptr - data; + data_size *= 2; + data = ckd_realloc(data, data_size * sizeof(*data)); + ptr = data + len; + } + len = fread(ptr, sizeof(*ptr), block_size, infile); + if (len == 0) { + if (feof(infile)) + break; + else { + E_ERROR_SYSTEM("Failed to read %d bytes\n", + sizeof(*ptr) * block_size); + rv = -1; + goto error_out; + } + } + ptr += len; + } + if ((rv = ps_start_utt(decoder)) < 0) + goto error_out; + if ((rv = ps_process_raw(decoder, data, ptr - data, FALSE, TRUE)) < 0) { + E_ERROR("ps_process_raw() failed\n"); + goto error_out; + } + if ((rv = ps_end_utt(decoder)) < 0) + goto error_out; + if (ps_config_bool(decoder->config, "phone_align")) { + const char *prev_search = ps_current_search(decoder); + if (ps_set_alignment(decoder, NULL) < 0) + goto error_out; + if ((rv = ps_start_utt(decoder)) < 0) + goto error_out; + if ((rv = ps_process_raw(decoder, data, ptr - data, FALSE, TRUE)) < 0) { + E_ERROR("ps_process_raw() failed\n"); + goto error_out; + } + if ((rv = ps_end_utt(decoder)) < 0) + goto error_out; + if ((alignment = ps_get_alignment(decoder)) == NULL) + goto error_out; + ps_activate_search(decoder, prev_search); + } + output_hyp(NULL, decoder, alignment); + /* Fall through intentionally */ +error_out: + ckd_free(data); + return rv; +} + +static int +single(ps_config_t *config, FILE *infile) +{ + ps_decoder_t *decoder; + int rv = 0; + + if ((decoder = ps_init(config)) == NULL) { + E_FATAL("PocketSphinx decoder init failed\n"); + return -1; + } + rv = decode_single(decoder, infile); + ps_free(decoder); + return rv; +} + +static char * +string_array_join(char **strings, int nstrings) +{ + char *joined, *ptr; + int i, *len, jlen; + + len = ckd_malloc(nstrings * sizeof(*len)); + for (jlen = i = 0; i < nstrings; ++i) { + len[i] = strlen(strings[i]); + jlen += len[i] + 1; + } + ptr = joined = ckd_malloc(jlen); + for (i = 0; i < nstrings; ++i) { + memcpy(ptr, strings[i], len[i]); + ptr += len[i]; + *ptr++ = ' '; + } + *--ptr = '\0'; + ckd_free(len); + return joined; +} + +static int +align(ps_config_t *config, char **inputs, int ninputs) +{ + int rv = 0, is_stdin = FALSE; + ps_decoder_t *decoder = NULL; + char *text = NULL; + FILE *fh = NULL; + + if (ninputs < 2) { + E_ERROR("Usage: pocketsphinx align INFILE TEXT...\n"); + return -1; + } + /* Please do not use bestpath for alignment. */ + ps_config_set_bool(config, "bestpath", FALSE); + ps_config_set_str(config, "lm", NULL); + if (0 == strcmp(inputs[0], "-")) { + is_stdin = TRUE; + fh = stdin; + } + else if ((fh = fopen(inputs[0], "rb")) == NULL) { + E_ERROR_SYSTEM("Failed to open %s for input", inputs[0]); + goto error_out; + } + if ((rv = ps_config_soundfile(config, fh, inputs[0])) < 0) + goto error_out; + if ((decoder = ps_init(config)) == NULL) { + E_FATAL("PocketSphinx decoder init failed\n"); + rv = -1; + goto error_out; + } + text = string_array_join(inputs + 1, ninputs - 1); + if ((rv = ps_set_align_text(decoder, text)) < 0) + goto error_out; + rv = decode_single(decoder, fh); + /* Fall through intentionally. */ +error_out: + if (fh && !is_stdin) + fclose(fh); + if (text) + ckd_free(text); + if (decoder) + ps_free(decoder); + return rv; +} + +#if 0 +static int sample_rates[] = { + 8000, + 11025, + 16000, + 22050, + 32000, + 44100, + 48000 +}; +static const int n_sample_rates = sizeof(sample_rates)/sizeof(sample_rates[0]); + +static int +minimum_samprate(ps_config_t *config) +{ + double upperf = ps_config_float(config, "upperf"); + int nyquist = (int)(upperf * 2); + int i; + for (i = 0; i < n_sample_rates; ++i) + if (sample_rates[i] >= nyquist) + break; + if (i == n_sample_rates) + E_FATAL("Unable to find sampling rate for -upperf %f\n", upperf); + return sample_rates[i]; +} +#endif + +#define SOX_FORMAT "-r %d -c 1 -b 16 -e signed-integer -t raw -" +static int +soxflags(ps_config_t *config) +{ + int maxlen, len; + int samprate; + char *args; + + /* Get feature extraction parameters. */ + ps_expand_model_config(config); + samprate = ps_config_int(config, "samprate"); + + maxlen = snprintf(NULL, 0, SOX_FORMAT, samprate); + if (maxlen < 0) { + E_ERROR_SYSTEM("Failed to snprintf()"); + return -1; + } + maxlen++; + args = ckd_calloc(maxlen, 1); + len = snprintf(args, maxlen, SOX_FORMAT, samprate); + if (len != maxlen - 1) { + E_ERROR_SYSTEM("Failed to snprintf()"); + return -1; + } + puts(args); + fflush(stdout); + ckd_free(args); + return 0; +} + +static char * +find_command(int *argc, char **argv) +{ + int i; + for (i = 1; i < *argc; i += 2) { + char *arg = argv[i]; + if (arg && arg[0] && arg[0] != '-') { + memmove(&argv[i], + &argv[i + 1], + (*argc - i - 1) * sizeof(argv[i])); + --*argc; + return arg; + } + } + return "live"; +} + +static char ** +find_inputs(int *argc, char **argv, int *ninputs) +{ + char **inputs = NULL; + int i = 1; + *ninputs = 0; + while (i < *argc) { + char *arg = argv[i]; + /* Bubble-bogo-bobo-backward-sort them to the end of argv. */ + if (arg && arg[0] + /* "-" on its own is an input, otherwise, - starts args. */ + && (arg[0] != '-' || arg[1] == '\0')) { + memmove(&argv[i], + &argv[i + 1], + (*argc - i - 1) * sizeof(argv[i])); + --*argc; + argv[*argc] = arg; + inputs = &argv[*argc]; + ++*ninputs; + } + else + i += 2; + } + /* Now reverse them. I won't be passing Google's coding interview + any time soon, not that it matters in this particular case. */ + for (i = 0; i < *ninputs / 2; ++i) { + char *tmp = inputs[i]; + inputs[i] = inputs[*ninputs - i - 1]; + inputs[*ninputs - i - 1] = tmp; + } + return inputs; +} + +int +process_inputs(int (*func)(ps_config_t *, FILE *), + ps_config_t *config, + char **inputs, int ninputs) +{ + int rv = 0; + + if (ninputs == 0) + return func(config, stdin); + else { + int i, rv_one; + for (i = 0; i < ninputs; ++i) { + char *file = inputs[i]; + int is_stdin = FALSE; + FILE *fh; + + if (0 == strcmp(file, "-")) { + is_stdin = TRUE; + fh = stdin; + } + else if ((fh = fopen(file, "rb")) == NULL) { + E_ERROR_SYSTEM("Failed to open %s for input", file); + rv = -1; + continue; + } + if ((rv_one = ps_config_soundfile(config, fh, file)) < 0) { + fclose(fh); + rv = rv_one; + continue; + } + if ((rv_one = func(config, fh)) < 0) { + rv = rv_one; + E_ERROR("Recognition failed on %s\n", file); + } + if (!is_stdin) + fclose(fh); + } + } + return rv; +} + +static int +print_config(ps_config_t *config) +{ + if (puts(ps_config_serialize_json(config)) < 0) + return -1; + fflush(stdout); + return 0; +} + +void +usage(char *name, int help_config) +{ + fprintf(stderr, "Usage: %s [PARAMS] [soxflags | config | help | help-config | live | single | align] INPUTS...\n", name); + fprintf(stderr, "Examples:\n"); + fprintf(stderr, "\tsox input.mp3 $(%s soxflags) | %s single -\n", name, name); + fprintf(stderr, "\tsox -qd $(%s soxflags) | %s live -\n", name, name); + fprintf(stderr, "\t%s single INPUT\n", name); + fprintf(stderr, "\t%s align INPUT WORDS...\n", name); + fprintf(stderr, "\nFor detailed PARAMS values, run %s help-config\n", name); + if (help_config) { + err_set_loglevel(ERR_INFO); + cmd_ln_log_help_r(NULL, ps_args()); + } +} + +int +main(int argc, char *argv[]) +{ + ps_config_t *config; + const char *conffile; + char *command; + char **inputs; + int rv, ninputs; + + command = find_command(&argc, argv); + inputs = find_inputs(&argc, argv, &ninputs); + /* Only soxflags and config take no arguments */ + if (ninputs == 0) { + if ((0 != strcmp(command, "soxflags")) + && 0 != strcmp(command, "config") + && 0 != strcmp(command, "help-config")) { + usage(argv[0], FALSE); + return 1; + } + } + /* If arg parsing fails */ + if ((config = ps_config_parse_args(ps_main_args_def, argc, argv)) == NULL) { + usage(argv[0], FALSE); + return 1; + } + ps_default_search_args(config); + if (ps_config_bool(config, "state_align")) + ps_config_set_bool(config, "phone_align", TRUE); + if ((conffile = ps_config_str(config, "config")) != NULL) { + char *json; + FILE *infh; + size_t len; + if ((infh = fopen(conffile, "rt")) == NULL) { + E_ERROR_SYSTEM("Failed to open config file %s", conffile); + return 1; + } + fseek(infh, 0, SEEK_END); + len = (size_t)ftell(infh); + fseek(infh, 0, SEEK_SET); + json = ckd_malloc(len + 1); + if (fread(json, 1, len, infh) != len) { + E_ERROR_SYSTEM("Failed to read config file %s", conffile); + ckd_free(json); + fclose(infh); + return 1; + } + json[len] = '\0'; + fclose(infh); + config = ps_config_parse_json(config, json); + ckd_free(json); + if (config == NULL) + return 1; + ps_config_set_str(config, "config", NULL); + } + if (0 == strcmp(command, "soxflags")) + rv = soxflags(config); + else if (0 == strcmp(command, "config")) + rv = print_config(config); + else if (0 == strcmp(command, "live")) + rv = process_inputs(live, config, inputs, ninputs); + else if (0 == strcmp(command, "single")) + rv = process_inputs(single, config, inputs, ninputs); + else if (0 == strcmp(command, "align")) + rv = align(config, inputs, ninputs); + else if (0 == strcmp(command, "help")) { + rv = 0; + usage(argv[0], FALSE); + } + else if (0 == strcmp(command, "help-config")) { + rv = 0; + usage(argv[0], TRUE); + } + else { + E_ERROR("Unknown command \"%s\"\n", command); + return 1; + } + + ps_config_free(config); + return rv; +} diff --git a/src/programs/mdef_convert.c b/programs/pocketsphinx_mdef_convert.c similarity index 97% rename from src/programs/mdef_convert.c rename to programs/pocketsphinx_mdef_convert.c index 096e021..a7eeb40 100644 --- a/src/programs/mdef_convert.c +++ b/programs/pocketsphinx_mdef_convert.c @@ -37,7 +37,7 @@ /** * mdef_convert.c - convert text to binary model definition files (and vice versa) * - * Author: David Huggins-Daines + * Author: David Huggins-Daines **/ #include @@ -45,6 +45,7 @@ #include +#include "util/ckd_alloc.h" #include "bin_mdef.h" int diff --git a/programs/pocketsphinx_pitch.c b/programs/pocketsphinx_pitch.c new file mode 100644 index 0000000..d03e500 --- /dev/null +++ b/programs/pocketsphinx_pitch.c @@ -0,0 +1,432 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include + +#include "util/cmd_ln.h" +#include "util/ckd_alloc.h" +#include "util/byteorder.h" +#include "util/strfuncs.h" +#include "util/pio.h" +#include "fe/yin.h" + +#include "pocketsphinx_internal.h" + +static ps_arg_t defn[] = { + { "i", + ARG_STRING, + NULL, + "Single audio input file" }, + + { "o", + ARG_STRING, + NULL, + "Single text output file (standard output will be used if not given)" }, + + { "c", + ARG_STRING, + NULL, + "Control file for batch processing" }, + + { "nskip", + ARG_INTEGER, + "0", + "If a control file was specified, the number of utterances to skip at the head of the file" }, + + { "runlen", + ARG_INTEGER, + "-1", + "If a control file was specified, the number of utterances to process (see -nskip too)" }, + + { "di", + ARG_STRING, + NULL, + "Input directory, input file names are relative to this, if defined" }, + + { "ei", + ARG_STRING, + NULL, + "Input extension to be applied to all input files" }, + + { "do", + ARG_STRING, + NULL, + "Output directory, output files are relative to this" }, + + { "eo", + ARG_STRING, + NULL, + "Output extension to be applied to all output files" }, + + { "nist", + ARG_BOOLEAN, + "no", + "Defines input format as NIST sphere" }, + + { "raw", + ARG_BOOLEAN, + "no", + "Defines input format as raw binary data" }, + + { "mswav", + ARG_BOOLEAN, + "no", + "Defines input format as Microsoft Wav (RIFF)" }, + + { "samprate", + ARG_INTEGER, + "0", + "Sampling rate of audio data (will be determined automatically if 0)" }, + + { "input_endian", + ARG_STRING, + NULL, + "Endianness of audio data (will be determined automatically if not given)" }, + + { "fshift", + ARG_FLOATING, + "0.01", + "Frame shift: number of seconds between each analysis frame." }, + + { "flen", + ARG_FLOATING, + "0.025", + "Number of seconds in each analysis frame (needs to be greater than twice the longest period you wish to detect - to detect down to 80Hz you need a frame length of 2.0/80 = 0.025)." }, + + { "smooth_window", + ARG_INTEGER, + "2", + "Number of frames on either side of the current frame to use for smoothing." }, + + { "voice_thresh", + ARG_FLOATING, + "0.1", + "Threshold of normalized difference under which to search for the fundamental period." }, + + { "search_range", + ARG_FLOATING, + "0.2", + "Fraction of the best local estimate to use as a search range for smoothing." }, + + { NULL, 0, NULL, NULL } +}; + +static int extract_pitch(const char *in, const char *out, cmd_ln_t *config); +static int run_control_file(const char *ctl, cmd_ln_t *config); + +static int +guess_file_type(char const *file, FILE *infh, ps_config_t *config) +{ + char header[4]; + + fseek(infh, 0, SEEK_SET); + if (fread(header, 1, 4, infh) != 4) { + E_ERROR_SYSTEM("Failed to read 4 byte header"); + return -1; + } + if (0 == memcmp(header, "RIFF", 4)) { + E_INFO("%s appears to be a WAV file\n", file); + if (ps_config_typeof(config, "mswav") != 0) { + ps_config_set_bool(config, "mswav", TRUE); + ps_config_set_bool(config, "nist", FALSE); + ps_config_set_bool(config, "raw", FALSE); + } + } + else if (0 == memcmp(header, "NIST", 4)) { + E_INFO("%s appears to be a NIST SPHERE file\n", file); + if (ps_config_typeof(config, "mswav") != 0) { + ps_config_set_bool(config, "mswav", FALSE); + ps_config_set_bool(config, "nist", TRUE); + ps_config_set_bool(config, "raw", FALSE); + } + } + else { + E_INFO("%s appears to be raw data\n", file); + if (ps_config_typeof(config, "mswav") != 0) { + ps_config_set_bool(config, "mswav", FALSE); + ps_config_set_bool(config, "nist", FALSE); + ps_config_set_bool(config, "raw", TRUE); + } + } + fseek(infh, 0, SEEK_SET); + return 0; +} + +int +main(int argc, char *argv[]) +{ + cmd_ln_t *config = cmd_ln_parse_r(NULL, defn, argc, argv, TRUE); + + if (config == NULL) { + /* This probably just means that we got no arguments. */ + err_set_loglevel(ERR_INFO); + cmd_ln_log_help_r(NULL, defn); + return 1; + } + + /* Run a control file if requested. */ + if (ps_config_str(config, "c")) { + if (run_control_file(ps_config_str(config, "c"), config) < 0) + return 1; + } + else { + if (extract_pitch(ps_config_str(config, "i"), + ps_config_str(config, "o"), + config) < 0) + return 1; + } + + ps_config_free(config); + return 0; +} + +static int +extract_pitch(const char *in, const char *out, cmd_ln_t *config) +{ + FILE *infh = NULL, *outfh = NULL; + size_t flen, fshift, nsamps; + int16 *buf = NULL; + yin_t *yin = NULL; + uint16 period, bestdiff; + int32 sps; + + if (out) { + if ((outfh = fopen(out, "w")) == NULL) { + E_ERROR_SYSTEM("Failed to open %s for writing", out); + goto error_out; + } + } + else { + outfh = stdout; + } + if ((infh = fopen(in, "rb")) == NULL) { + E_ERROR_SYSTEM("Failed to open %s for reading", in); + goto error_out; + } + + /* If we weren't told what the file type is, weakly try to + * determine it (actually it's pretty obvious) */ + if (!(ps_config_bool(config, "raw") + || ps_config_bool(config, "mswav") + || ps_config_bool(config, "nist"))) { + if (guess_file_type(in, infh, config) < 0) + goto error_out; + } + + /* Grab the sampling rate and byte order from the header and also + * make sure this is 16-bit linear PCM. */ + if (ps_config_bool(config, "mswav")) { + if (ps_config_wavfile(config, infh, in) < 0) + goto error_out; + } + else if (ps_config_bool(config, "nist")) { + if (ps_config_nistfile(config, infh, in) < 0) + goto error_out; + } + else if (ps_config_bool(config, "raw")) { + /* Just use some defaults for sampling rate and endian. */ + if (ps_config_str(config, "input_endian") == NULL) { + ps_config_set_str(config, "input_endian", "little"); + } + if (ps_config_int(config, "samprate") == 0) + ps_config_set_int(config, "samprate", 16000); + } + + /* Now read frames and write pitch estimates. */ + sps = ps_config_int(config, "samprate"); + flen = (size_t)(0.5 + sps * ps_config_float(config, "flen")); + fshift = (size_t)(0.5 + sps * ps_config_float(config, "fshift")); + yin = yin_init(flen, ps_config_float(config, "voice_thresh"), + ps_config_float(config, "search_range"), + ps_config_int(config, "smooth_window")); + if (yin == NULL) { + E_ERROR("Failed to initialize YIN\n"); + goto error_out; + } + buf = ckd_calloc(flen, sizeof(*buf)); + /* Read the first full frame of data. */ + if (fread(buf, sizeof(*buf), flen, infh) != flen) { + /* Fail silently, which is probably okay. */ + } + yin_start(yin); + nsamps = 0; + while (!feof(infh)) { + /* Process a frame of data. */ + yin_write(yin, buf); + if (yin_read(yin, &period, &bestdiff)) { + fprintf(outfh, "%.3f %.2f %.2f\n", + /* Time point. */ + (double)nsamps/sps, + /* "Probability" of voicing. */ + bestdiff > 32768 ? 0.0 : 1.0 - (double)bestdiff / 32768, + /* Pitch (possibly bogus) */ + period == 0 ? sps : (double)sps / period); + nsamps += fshift; + } + /* Shift it back and get the next frame's overlap. */ + memmove(buf, buf + fshift, (flen - fshift) * sizeof(*buf)); + if (fread(buf + flen - fshift, sizeof(*buf), fshift, infh) != fshift) { + /* Fail silently (FIXME: really?) */ + } + } + yin_end(yin); + /* Process trailing frames of data. */ + while (yin_read(yin, &period, &bestdiff)) { + fprintf(outfh, "%.3f %.2f %.2f\n", + /* Time point. */ + (double)nsamps/sps, + /* "Probability" of voicing. */ + bestdiff > 32768 ? 0.0 : 1.0 - (double)bestdiff / 32768, + /* Pitch (possibly bogus) */ + period == 0 ? sps : (double)sps / period); + } + + if (yin) + yin_free(yin); + ckd_free(buf); + fclose(infh); + if (outfh && outfh != stdout) + fclose(outfh); + return 0; + +error_out: + if (yin) + yin_free(yin); + ckd_free(buf); + if (infh) fclose(infh); + if (outfh && outfh != stdout) + fclose(outfh); + return -1; +} + +static int +run_control_file(const char *ctl, cmd_ln_t *config) +{ + FILE *ctlfh; + char *line; + char *di, *dout, *ei, *eio; + size_t len; + int rv, guess_type, guess_sps, guess_endian; + int32 skip, runlen; + + skip = ps_config_int(config, "nskip"); + runlen = ps_config_int(config, "runlen"); + + /* Whether to guess file types */ + guess_type = !(ps_config_bool(config, "raw") + || ps_config_bool(config, "mswav") + || ps_config_bool(config, "nist")); + /* Whether to guess sampling rate */ + guess_sps = (ps_config_int(config, "samprate") == 0); + /* Whether to guess endian */ + guess_endian = (ps_config_str(config, "input_endian") == NULL); + + if ((ctlfh = fopen(ctl, "r")) == NULL) { + E_ERROR_SYSTEM("Failed to open control file %s", ctl); + return -1; + } + if (ps_config_str(config, "di")) + di = string_join(ps_config_str(config, "di"), "/", NULL); + else + di = ckd_salloc(""); + if (ps_config_str(config, "do")) + dout = string_join(ps_config_str(config, "do"), "/", NULL); + else + dout = ckd_salloc(""); + if (ps_config_str(config, "ei")) + ei = string_join(".", ps_config_str(config, "ei"), NULL); + else + ei = ckd_salloc(""); + if (ps_config_str(config, "eo")) + eio = string_join(".", ps_config_str(config, "eo"), NULL); + else + eio = ckd_salloc(""); + rv = 0; + while ((line = fread_line(ctlfh, &len)) != NULL) { + char *infile, *outfile; + + if (skip-- > 0) { + ckd_free(line); + continue; + } + if (runlen == 0) { + ckd_free(line); + break; + } + --runlen; + + if (line[len-1] == '\n') + line[len-1] = '\0'; + + infile = string_join(di, line, ei, NULL); + outfile = string_join(dout, line, eio, NULL); + + /* Reset various guessed information */ + if (guess_type) { + ps_config_set_bool(config, "nist", FALSE); + ps_config_set_bool(config, "mswav", FALSE); + ps_config_set_bool(config, "raw", FALSE); + } + if (guess_sps) + ps_config_set_int(config, "samprate", 0); + if (guess_endian) + ps_config_set_str(config, "input_endian", NULL); + + rv = extract_pitch(infile, outfile, config); + + ckd_free(infile); + ckd_free(outfile); + ckd_free(line); + + if (rv != 0) + break; + } + ckd_free(di); + ckd_free(dout); + ckd_free(ei); + ckd_free(eio); + fclose(ctlfh); + ps_config_free(config); + return rv; +} diff --git a/py-compile b/py-compile deleted file mode 100755 index 46ea866..0000000 --- a/py-compile +++ /dev/null @@ -1,170 +0,0 @@ -#!/bin/sh -# py-compile - Compile a Python program - -scriptversion=2011-06-08.12; # UTC - -# Copyright (C) 2000-2013 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# This file is maintained in Automake, please report -# bugs to or send patches to -# . - -if [ -z "$PYTHON" ]; then - PYTHON=python -fi - -me=py-compile - -usage_error () -{ - echo "$me: $*" >&2 - echo "Try '$me --help' for more information." >&2 - exit 1 -} - -basedir= -destdir= -while test $# -ne 0; do - case "$1" in - --basedir) - if test $# -lt 2; then - usage_error "option '--basedir' requires an argument" - else - basedir=$2 - fi - shift - ;; - --destdir) - if test $# -lt 2; then - usage_error "option '--destdir' requires an argument" - else - destdir=$2 - fi - shift - ;; - -h|--help) - cat <<\EOF -Usage: py-compile [--help] [--version] [--basedir DIR] [--destdir DIR] FILES..." - -Byte compile some python scripts FILES. Use --destdir to specify any -leading directory path to the FILES that you don't want to include in the -byte compiled file. Specify --basedir for any additional path information you -do want to be shown in the byte compiled file. - -Example: - py-compile --destdir /tmp/pkg-root --basedir /usr/share/test test.py test2.py - -Report bugs to . -EOF - exit $? - ;; - -v|--version) - echo "$me $scriptversion" - exit $? - ;; - --) - shift - break - ;; - -*) - usage_error "unrecognized option '$1'" - ;; - *) - break - ;; - esac - shift -done - -files=$* -if test -z "$files"; then - usage_error "no files given" -fi - -# if basedir was given, then it should be prepended to filenames before -# byte compilation. -if [ -z "$basedir" ]; then - pathtrans="path = file" -else - pathtrans="path = os.path.join('$basedir', file)" -fi - -# if destdir was given, then it needs to be prepended to the filename to -# byte compile but not go into the compiled file. -if [ -z "$destdir" ]; then - filetrans="filepath = path" -else - filetrans="filepath = os.path.normpath('$destdir' + os.sep + path)" -fi - -$PYTHON -c " -import sys, os, py_compile, imp - -files = '''$files''' - -sys.stdout.write('Byte-compiling python modules...\n') -for file in files.split(): - $pathtrans - $filetrans - if not os.path.exists(filepath) or not (len(filepath) >= 3 - and filepath[-3:] == '.py'): - continue - sys.stdout.write(file) - sys.stdout.flush() - if hasattr(imp, 'get_tag'): - py_compile.compile(filepath, imp.cache_from_source(filepath), path) - else: - py_compile.compile(filepath, filepath + 'c', path) -sys.stdout.write('\n')" || exit $? - -# this will fail for python < 1.5, but that doesn't matter ... -$PYTHON -O -c " -import sys, os, py_compile, imp - -# pypy does not use .pyo optimization -if hasattr(sys, 'pypy_translation_info'): - sys.exit(0) - -files = '''$files''' -sys.stdout.write('Byte-compiling python modules (optimized versions) ...\n') -for file in files.split(): - $pathtrans - $filetrans - if not os.path.exists(filepath) or not (len(filepath) >= 3 - and filepath[-3:] == '.py'): - continue - sys.stdout.write(file) - sys.stdout.flush() - if hasattr(imp, 'get_tag'): - py_compile.compile(filepath, imp.cache_from_source(filepath, False), path) - else: - py_compile.compile(filepath, filepath + 'o', path) -sys.stdout.write('\n')" 2>/dev/null || : - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..41d8085 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,75 @@ +[build-system] +requires = [ + "scikit-build-core", + "Cython" +] +build-backend = "scikit_build_core.build" + +[project] +name = "pocketsphinx" +version = "5.0.4" +description = "Official Python bindings for PocketSphinx" +readme = "cython/README.md" +authors = [ + {name = "David Huggins-Daines", email = "dhdaines@gmail.com"} +] +keywords = ["asr", "speech"] +dependencies = ["sounddevice"] +classifiers = [ + "Development Status :: 6 - Mature", + "Programming Language :: C", + "Programming Language :: Cython", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "License :: OSI Approved :: BSD License", + "Operating System :: OS Independent", + "Topic :: Multimedia :: Sound/Audio :: Speech", +] + +[project.urls] +Homepage = "https://github.com/cmusphinx/pocketsphinx" +Documentation = "https://pocketsphinx.readthedocs.io/en/latest/" +Repository = "https://github.com/cmusphinx/pocketsphinx.git" +Issues = "https://github.com/cmusphinx/pocketsphinx/issues" + +[project.scripts] +pocketsphinx_lm = "pocketsphinx.lm:main" + +[tool.cibuildwheel] +# Build a reduced selection of binaries as there are tons of them +build = [ + "pp310*", + "cp38-*", + "cp310-*", + "cp311-*", + "cp312-*", + "cp313-*", +] +# Build only universal wheels for Mac where possible, and skip 32-bit +# builds to avoid building a gigabyte of stuff all the time +skip = [ + "cp*-macosx_x86_64", + "cp*-macosx_arm64", + "*_i686", + "*-win32", +] + +[tool.cibuildwheel.macos] +archs = ["x86_64", "universal2", "arm64"] + +[tool.isort] +profile = "black" + +[tool.flake8] +extend-ignore = "E203" +max-line-length = "88" + +[tool.scikit-build] +cmake.verbose = true +logging.level = "INFO" +wheel.packages = ["cython/pocketsphinx"] diff --git a/release-checklist.md b/release-checklist.md new file mode 100644 index 0000000..1e08cbf --- /dev/null +++ b/release-checklist.md @@ -0,0 +1,13 @@ +- versions: + - CMakeLists.txt + - cython/README.md + - docs/source/conf.py + - doxygen/CMakeLists.txt + - README.md + - pyproject.toml + - include/pocketsphinx.h +- docker build +- make github release and tag +- upload wheels to PyPI +- make doxygen docs and upload to cmusphinx.github.io +- post on cmusphinx.github.io diff --git a/sphinx_config.h.in b/sphinx_config.h.in new file mode 100644 index 0000000..3314ce1 --- /dev/null +++ b/sphinx_config.h.in @@ -0,0 +1,26 @@ +/* sphinx_config.h: Externally visible configuration parameters */ + +/* Define to use fixed-point computation */ +#cmakedefine FIXED_POINT + +/* Default radix point for fixed-point */ +#cmakedefine DEFAULT_RADIX @DEFAULT_RADIX@ + +/* Define if you have the header file. */ +#ifndef HAVE_STDINT_H +#cmakedefine HAVE_STDINT_H +#endif + +/* The size of `long', as computed by sizeof. */ +#cmakedefine SIZEOF_LONG @SIZEOF_LONG@ + +/* Define if the system has the type `long long'. */ +#ifndef HAVE_LONG_LONG /* sometimes it is already defined */ +#cmakedefine HAVE_LONG_LONG +#endif + +/* The size of `long long', as computed by sizeof. */ +#cmakedefine SIZEOF_LONG_LONG @SIZEOF_LONG_LONG@ + +/* Enable debugging output */ +#cmakedefine SPHINX_DEBUG diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..232cb65 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,133 @@ +add_library(pocketsphinx +acmod.c +allphone_search.c +bin_mdef.c +common_audio/vad/vad_gmm.c +common_audio/vad/webrtc_vad.c +common_audio/vad/vad_filterbank.c +common_audio/vad/vad_core.c +common_audio/vad/vad_sp.c +common_audio/signal_processing/division_operations.c +common_audio/signal_processing/resample_48khz.c +common_audio/signal_processing/resample.c +common_audio/signal_processing/resample_fractional.c +common_audio/signal_processing/downsample_fast.c +common_audio/signal_processing/min_max_operations.c +common_audio/signal_processing/cross_correlation.c +common_audio/signal_processing/vector_scaling_operations.c +common_audio/signal_processing/resample_by_2_internal.c +common_audio/signal_processing/energy.c +common_audio/signal_processing/spl_inl.c +common_audio/signal_processing/get_scaling_square.c +dict2pid.c +dict.c +fe/fe_sigproc.c +fe/fixlog.c +fe/fe_warp_inverse_linear.c +fe/fe_noise.c +fe/fe_warp.c +fe/fe_interface.c +fe/fe_warp_affine.c +fe/yin.c +fe/fe_warp_piecewise_linear.c +feat/cmn.c +feat/agc.c +feat/cmn_live.c +feat/feat.c +feat/lda.c +fsg_history.c +fsg_lextree.c +fsg_search.c +hmm.c +kws_detections.c +kws_search.c +lm/lm_trie_quant.c +lm/ngram_model_trie.c +lm/fsg_model.c +lm/jsgf.c +lm/ngram_model_set.c +lm/ngrams_raw.c +lm/jsgf_scanner.c +lm/bitarr.c +lm/ngram_model.c +lm/lm_trie.c +lm/jsgf_parser.c +mdef.c +ms_gauden.c +ms_mgau.c +ms_senone.c +ngram_search.c +ngram_search_fwdflat.c +ngram_search_fwdtree.c +phone_loop_search.c +pocketsphinx.c +ps_alignment.c +ps_config.c +ps_endpointer.c +ps_lattice.c +ps_mllr.c +ps_vad.c +ptm_mgau.c +s2_semi_mgau.c +state_align_search.c +tmat.c +util/strfuncs.c +util/dtoa.c +util/case.c +util/filename.c +util/slamch.c +util/cmd_ln.c +util/blas_lite.c +util/blkarray_list.c +util/vector.c +util/mmio.c +util/hash_table.c +util/err.c +util/ckd_alloc.c +util/slapack_lite.c +util/matrix.c +util/bio.c +util/heap.c +util/priority_queue.c +util/bitvec.c +util/profile.c +util/errno.c +util/logmath.c +util/glist.c +util/f2c_lite.c +util/listelem_alloc.c +util/pio.c +util/genrand.c +util/soundfiles.c + ) +target_include_directories( + pocketsphinx PRIVATE ${CMAKE_BINARY_DIR} + pocketsphinx PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} + pocketsphinx PUBLIC ${CMAKE_SOURCE_DIR}/include + pocketsphinx PUBLIC ${CMAKE_BINARY_DIR}/include + pocketsphinx INTERFACE ${CMAKE_SOURCE_DIR}/include + pocketsphinx INTERFACE ${CMAKE_BINARY_DIR}/include + ) +if(APPLE) + # Things we might need are here + target_link_directories(pocketsphinx PUBLIC /usr/local/lib) +endif() +find_library(MATH_LIBRARY m) +if(MATH_LIBRARY) + target_link_libraries(pocketsphinx PUBLIC ${MATH_LIBRARY}) +endif() +# Shared library version != package version, but we will make it the +# same for now to avoid confusion +set_target_properties(pocketsphinx PROPERTIES + VERSION 5.0.0 + SOVERSION 5 + ) +# No idea why this can't just go in the above list but oh well +if(MODELDIR) + set_property(TARGET pocketsphinx PROPERTY + COMPILE_DEFINITIONS POCKETSPHINX_EXPORTS;SPHINXBASE_EXPORTS;MODELDIR="${MODELDIR}" + ) +else() + set_property(TARGET pocketsphinx PROPERTY + COMPILE_DEFINITIONS POCKETSPHINX_EXPORTS;SPHINXBASE_EXPORTS) +endif() diff --git a/src/Makefile.am b/src/Makefile.am deleted file mode 100644 index f82ea71..0000000 --- a/src/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -SUBDIRS = libpocketsphinx \ - programs \ - gst-plugin diff --git a/src/Makefile.in b/src/Makefile.in deleted file mode 100644 index 5062b25..0000000 --- a/src/Makefile.in +++ /dev/null @@ -1,636 +0,0 @@ -# Makefile.in generated by automake 1.13.4 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2013 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = src -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ - $(top_srcdir)/m4/ax_python_devel.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -SOURCES = -DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ - ctags-recursive dvi-recursive html-recursive info-recursive \ - install-data-recursive install-dvi-recursive \ - install-exec-recursive install-html-recursive \ - install-info-recursive install-pdf-recursive \ - install-ps-recursive install-recursive installcheck-recursive \ - installdirs-recursive pdf-recursive ps-recursive \ - tags-recursive uninstall-recursive -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -am__recursive_targets = \ - $(RECURSIVE_TARGETS) \ - $(RECURSIVE_CLEAN_TARGETS) \ - $(am__extra_recursive_targets) -AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ - distdir -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = $(SUBDIRS) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -am__relativize = \ - dir0=`pwd`; \ - sed_first='s,^\([^/]*\)/.*$$,\1,'; \ - sed_rest='s,^[^/]*/*,,'; \ - sed_last='s,^.*/\([^/]*\)$$,\1,'; \ - sed_butlast='s,/*[^/]*$$,,'; \ - while test -n "$$dir1"; do \ - first=`echo "$$dir1" | sed -e "$$sed_first"`; \ - if test "$$first" != "."; then \ - if test "$$first" = ".."; then \ - dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ - dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ - else \ - first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ - if test "$$first2" = "$$first"; then \ - dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ - else \ - dir2="../$$dir2"; \ - fi; \ - dir0="$$dir0"/"$$first"; \ - fi; \ - fi; \ - dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ - done; \ - reldir="$$dir2" -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GST_CFLAGS = @GST_CFLAGS@ -GST_LIBS = @GST_LIBS@ -GST_MAJORMINOR = @GST_MAJORMINOR@ -GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ -GStreamer_CFLAGS = @GStreamer_CFLAGS@ -GStreamer_LIBS = @GStreamer_LIBS@ -HAVE_DOXYGEN = @HAVE_DOXYGEN@ -HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PKG_CONFIG = @PKG_CONFIG@ -PYTHON = @PYTHON@ -PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ -PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ -PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ -PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ -PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ -PYTHON_PLATFORM = @PYTHON_PLATFORM@ -PYTHON_PREFIX = @PYTHON_PREFIX@ -PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ -PYTHON_VERSION = @PYTHON_VERSION@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ -SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ -SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ -STRIP = @STRIP@ -SWIG = @SWIG@ -SWIG_LIB = @SWIG_LIB@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -pkgpyexecdir = @pkgpyexecdir@ -pkgpythondir = @pkgpythondir@ -plugindir = @plugindir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -pyexecdir = @pyexecdir@ -pythondir = @pythondir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUBDIRS = libpocketsphinx \ - programs \ - gst-plugin - -all: all-recursive - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign src/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -# This directory's subdirectories are mostly independent; you can cd -# into them and run 'make' without going through this Makefile. -# To change the values of 'make' variables: instead of editing Makefiles, -# (1) if the variable is set in 'config.status', edit 'config.status' -# (which will cause the Makefiles to be regenerated when you run 'make'); -# (2) otherwise, pass the desired values on the 'make' command line. -$(am__recursive_targets): - @fail=; \ - if $(am__make_keepgoing); then \ - failcom='fail=yes'; \ - else \ - failcom='exit 1'; \ - fi; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-recursive -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-recursive - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-recursive - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - $(am__make_dryrun) \ - || test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ - $(am__relativize); \ - new_distdir=$$reldir; \ - dir1=$$subdir; dir2="$(top_distdir)"; \ - $(am__relativize); \ - new_top_distdir=$$reldir; \ - echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ - echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ - ($(am__cd) $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$new_top_distdir" \ - distdir="$$new_distdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - am__skip_mode_fix=: \ - distdir) \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-recursive -all-am: Makefile -installdirs: installdirs-recursive -installdirs-am: -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-recursive - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -html-am: - -info: info-recursive - -info-am: - -install-data-am: - -install-dvi: install-dvi-recursive - -install-dvi-am: - -install-exec-am: - -install-html: install-html-recursive - -install-html-am: - -install-info: install-info-recursive - -install-info-am: - -install-man: - -install-pdf: install-pdf-recursive - -install-pdf-am: - -install-ps: install-ps-recursive - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: - -.MAKE: $(am__recursive_targets) install-am install-strip - -.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ - check-am clean clean-generic clean-libtool cscopelist-am ctags \ - ctags-am distclean distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - installdirs-am maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ - ps ps-am tags tags-am uninstall uninstall-am - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/src/libpocketsphinx/acmod.c b/src/acmod.c similarity index 80% rename from src/libpocketsphinx/acmod.c rename to src/acmod.c index f8e15f8..6089219 100644 --- a/src/libpocketsphinx/acmod.c +++ b/src/acmod.c @@ -38,25 +38,19 @@ /** * @file acmod.c Acoustic model structures for PocketSphinx. - * @author David Huggins-Daines + * @author David Huggins-Daines */ -/* System headers. */ #include #include #include -/* SphinxBase headers. */ -#include -#include -#include -#include -#include -#include -#include - -/* Local headers. */ -#include "cmdln_macro.h" +#include + +#include "util/strfuncs.h" +#include "util/byteorder.h" +#include "feat/feat.h" +#include "util/bio.h" #include "acmod.h" #include "s2_semi_mgau.h" #include "ptm_mgau.h" @@ -70,8 +64,8 @@ acmod_init_am(acmod_t *acmod) char const *mdeffn, *tmatfn, *mllrfn, *hmmdir; /* Read model definition. */ - if ((mdeffn = cmd_ln_str_r(acmod->config, "_mdef")) == NULL) { - if ((hmmdir = cmd_ln_str_r(acmod->config, "-hmm")) == NULL) + if ((mdeffn = ps_config_str(acmod->config, "mdef")) == NULL) { + if ((hmmdir = ps_config_str(acmod->config, "hmm")) == NULL) E_ERROR("Acoustic model definition is not specified either " "with -mdef option or with -hmm\n"); else @@ -87,23 +81,23 @@ acmod_init_am(acmod_t *acmod) } /* Read transition matrices. */ - if ((tmatfn = cmd_ln_str_r(acmod->config, "_tmat")) == NULL) { + if ((tmatfn = ps_config_str(acmod->config, "tmat")) == NULL) { E_ERROR("No tmat file specified\n"); return -1; } acmod->tmat = tmat_init(tmatfn, acmod->lmath, - cmd_ln_float32_r(acmod->config, "-tmatfloor"), + ps_config_float(acmod->config, "tmatfloor"), TRUE); /* Read the acoustic models. */ - if ((cmd_ln_str_r(acmod->config, "_mean") == NULL) - || (cmd_ln_str_r(acmod->config, "_var") == NULL) - || (cmd_ln_str_r(acmod->config, "_tmat") == NULL)) { + if ((ps_config_str(acmod->config, "mean") == NULL) + || (ps_config_str(acmod->config, "var") == NULL) + || (ps_config_str(acmod->config, "tmat") == NULL)) { E_ERROR("No mean/var/tmat files specified\n"); return -1; } - if (cmd_ln_str_r(acmod->config, "_senmgau")) { + if (ps_config_str(acmod->config, "senmgau")) { E_INFO("Using general multi-stream GMM computation\n"); acmod->mgau = ms_mgau_init(acmod, acmod->lmath, acmod->mdef); if (acmod->mgau == NULL) @@ -125,7 +119,7 @@ acmod_init_am(acmod_t *acmod) } /* If there is an MLLR transform, apply it. */ - if ((mllrfn = cmd_ln_str_r(acmod->config, "-mllr"))) { + if ((mllrfn = ps_config_str(acmod->config, "mllr"))) { ps_mllr_t *mllr = ps_mllr_read(mllrfn); if (mllr == NULL) return -1; @@ -135,63 +129,92 @@ acmod_init_am(acmod_t *acmod) return 0; } -static int -acmod_init_feat(acmod_t *acmod) +int +acmod_reinit_feat(acmod_t *acmod, fe_t *fe, feat_t *fcb) { - acmod->fcb = - feat_init(cmd_ln_str_r(acmod->config, "-feat"), - cmn_type_from_str(cmd_ln_str_r(acmod->config,"-cmn")), - cmd_ln_boolean_r(acmod->config, "-varnorm"), - agc_type_from_str(cmd_ln_str_r(acmod->config, "-agc")), - 1, cmd_ln_int32_r(acmod->config, "-ceplen")); - if (acmod->fcb == NULL) - return -1; - - if (cmd_ln_str_r(acmod->config, "_lda")) { - E_INFO("Reading linear feature transformation from %s\n", - cmd_ln_str_r(acmod->config, "_lda")); - if (feat_read_lda(acmod->fcb, - cmd_ln_str_r(acmod->config, "_lda"), - cmd_ln_int32_r(acmod->config, "-ldadim")) < 0) + if (fe) + fe = fe_retain(fe); + else { + fe = fe_init_auto_r(acmod->config); + if (fe == NULL) return -1; } + if (acmod_fe_mismatch(acmod, fe)) { + fe_free(fe); + return -1; + } + if (acmod->fe) + fe_free(acmod->fe); + acmod->fe = fe; - if (cmd_ln_str_r(acmod->config, "-svspec")) { - int32 **subvecs; - E_INFO("Using subvector specification %s\n", - cmd_ln_str_r(acmod->config, "-svspec")); - if ((subvecs = parse_subvecs(cmd_ln_str_r(acmod->config, "-svspec"))) == NULL) - return -1; - if ((feat_set_subvecs(acmod->fcb, subvecs)) < 0) + if (fcb) + fcb = feat_retain(fcb); + else { + fcb = + feat_init(ps_config_str(acmod->config, "feat"), + cmn_type_from_str(ps_config_str(acmod->config,"cmn")), + ps_config_bool(acmod->config, "varnorm"), + agc_type_from_str(ps_config_str(acmod->config, "agc")), + 1, ps_config_int(acmod->config, "ceplen")); + if (fcb == NULL) return -1; - } - if (cmd_ln_exists_r(acmod->config, "-agcthresh") - && 0 != strcmp(cmd_ln_str_r(acmod->config, "-agc"), "none")) { - agc_set_threshold(acmod->fcb->agc_struct, - cmd_ln_float32_r(acmod->config, "-agcthresh")); - } + if (ps_config_str(acmod->config, "lda")) { + E_INFO("Reading linear feature transformation from %s\n", + ps_config_str(acmod->config, "lda")); + if (feat_read_lda(fcb, + ps_config_str(acmod->config, "lda"), + ps_config_int(acmod->config, "ldadim")) < 0) + return -1; + } - if (acmod->fcb->cmn_struct - && cmd_ln_exists_r(acmod->config, "-cmninit")) { - char *c, *cc, *vallist; - int32 nvals; - - vallist = ckd_salloc(cmd_ln_str_r(acmod->config, "-cmninit")); - c = vallist; - nvals = 0; - while (nvals < acmod->fcb->cmn_struct->veclen - && (cc = strchr(c, ',')) != NULL) { - *cc = '\0'; - acmod->fcb->cmn_struct->cmn_mean[nvals] = FLOAT2MFCC(atof_c(c)); - c = cc + 1; - ++nvals; + if (ps_config_str(acmod->config, "svspec")) { + int32 **subvecs; + E_INFO("Using subvector specification %s\n", + ps_config_str(acmod->config, "svspec")); + if ((subvecs = parse_subvecs(ps_config_str(acmod->config, "svspec"))) == NULL) + return -1; + if ((feat_set_subvecs(fcb, subvecs)) < 0) + return -1; } - if (nvals < acmod->fcb->cmn_struct->veclen && *c != '\0') { - acmod->fcb->cmn_struct->cmn_mean[nvals] = FLOAT2MFCC(atof_c(c)); + + if (0 != strcmp(ps_config_str(acmod->config, "agc"), "none")) { + agc_set_threshold(fcb->agc_struct, + ps_config_float(acmod->config, "agcthresh")); + } + + if (fcb->cmn_struct + && ps_config_str(acmod->config, "cmninit")) { + E_INFO("Setting initial CMN to %s\n", ps_config_str(acmod->config, "cmninit")); + cmn_set_repr(fcb->cmn_struct, ps_config_str(acmod->config, "cmninit")); } - ckd_free(vallist); } + if (acmod_feat_mismatch(acmod, fcb)) { + feat_free(fcb); + return -1; + } + if (acmod->fcb) + feat_free(acmod->fcb); + acmod->fcb = fcb; + + /* The MFCC buffer needs to be at least as large as the dynamic + * feature window. */ + acmod->n_mfc_alloc = acmod->fcb->window_size * 2 + 1; + if (acmod->mfc_buf) + ckd_free_2d(acmod->mfc_buf); + acmod->mfc_buf = (mfcc_t **) + ckd_calloc_2d(acmod->n_mfc_alloc, acmod->fcb->cepsize, + sizeof(**acmod->mfc_buf)); + + /* Feature buffer has to be at least as large as MFCC buffer. */ + acmod->n_feat_alloc = acmod->n_mfc_alloc + ps_config_int(acmod->config, "pl_window"); + if (acmod->feat_buf) + feat_array_free(acmod->feat_buf); + acmod->feat_buf = feat_array_alloc(acmod->fcb, acmod->n_feat_alloc); + if (acmod->framepos) + ckd_free(acmod->framepos); + acmod->framepos = ckd_calloc(acmod->n_feat_alloc, sizeof(*acmod->framepos)); + return 0; } @@ -199,10 +222,10 @@ int acmod_fe_mismatch(acmod_t *acmod, fe_t *fe) { /* Output vector dimension needs to be the same. */ - if (cmd_ln_int32_r(acmod->config, "-ceplen") != fe_get_output_size(fe)) { + if (ps_config_int(acmod->config, "ceplen") != fe_get_output_size(fe)) { E_ERROR("Configured feature length %d doesn't match feature " "extraction output size %d\n", - cmd_ln_int32_r(acmod->config, "-ceplen"), + ps_config_int(acmod->config, "ceplen"), fe_get_output_size(fe)); return TRUE; } @@ -215,71 +238,33 @@ int acmod_feat_mismatch(acmod_t *acmod, feat_t *fcb) { /* Feature type needs to be the same. */ - if (0 != strcmp(cmd_ln_str_r(acmod->config, "-feat"), feat_name(fcb))) + if (0 != strcmp(ps_config_str(acmod->config, "feat"), feat_name(fcb))) return TRUE; /* Input vector dimension needs to be the same. */ - if (cmd_ln_int32_r(acmod->config, "-ceplen") != feat_cepsize(fcb)) + if (ps_config_int(acmod->config, "ceplen") != feat_cepsize(fcb)) return TRUE; /* FIXME: Need to check LDA and stuff too. */ return FALSE; } acmod_t * -acmod_init(cmd_ln_t *config, logmath_t *lmath, fe_t *fe, feat_t *fcb) +acmod_init(ps_config_t *config, logmath_t *lmath, fe_t *fe, feat_t *fcb) { acmod_t *acmod; acmod = ckd_calloc(1, sizeof(*acmod)); - acmod->config = cmd_ln_retain(config); - acmod->lmath = lmath; + acmod->config = ps_config_retain(config); + acmod->lmath = logmath_retain(lmath); acmod->state = ACMOD_IDLE; - /* Initialize feature computation. */ - if (fe) { - if (acmod_fe_mismatch(acmod, fe)) - goto error_out; - fe_retain(fe); - acmod->fe = fe; - } - else { - /* Initialize a new front end. */ - acmod->fe = fe_init_auto_r(config); - if (acmod->fe == NULL) - goto error_out; - if (acmod_fe_mismatch(acmod, acmod->fe)) - goto error_out; - } - if (fcb) { - if (acmod_feat_mismatch(acmod, fcb)) - goto error_out; - feat_retain(fcb); - acmod->fcb = fcb; - } - else { - /* Initialize a new fcb. */ - if (acmod_init_feat(acmod) < 0) - goto error_out; - } + /* Initialize or retain fe and fcb. */ + if (acmod_reinit_feat(acmod, fe, fcb) < 0) + goto error_out; /* Load acoustic model parameters. */ if (acmod_init_am(acmod) < 0) goto error_out; - - /* The MFCC buffer needs to be at least as large as the dynamic - * feature window. */ - acmod->n_mfc_alloc = acmod->fcb->window_size * 2 + 1; - acmod->mfc_buf = (mfcc_t **) - ckd_calloc_2d(acmod->n_mfc_alloc, acmod->fcb->cepsize, - sizeof(**acmod->mfc_buf)); - - /* Feature buffer has to be at least as large as MFCC buffer. */ - acmod->n_feat_alloc = acmod->n_mfc_alloc + cmd_ln_int32_r(config, "-pl_window"); - acmod->feat_buf = feat_array_alloc(acmod->fcb, acmod->n_feat_alloc); - acmod->framepos = ckd_calloc(acmod->n_feat_alloc, sizeof(*acmod->framepos)); - - acmod->utt_start_frame = 0; - /* Senone computation stuff. */ acmod->senone_scores = ckd_calloc(bin_mdef_n_sen(acmod->mdef), sizeof(*acmod->senone_scores)); @@ -287,7 +272,7 @@ acmod_init(cmd_ln_t *config, logmath_t *lmath, fe_t *fe, feat_t *fcb) acmod->senone_active = ckd_calloc(bin_mdef_n_sen(acmod->mdef), sizeof(*acmod->senone_active)); acmod->log_zero = logmath_get_zero(acmod->lmath); - acmod->compallsen = cmd_ln_boolean_r(config, "-compallsen"); + acmod->compallsen = ps_config_bool(config, "compallsen"); return acmod; error_out: @@ -303,7 +288,7 @@ acmod_free(acmod_t *acmod) feat_free(acmod->fcb); fe_free(acmod->fe); - cmd_ln_free_r(acmod->config); + ps_config_free(acmod->config); if (acmod->mfc_buf) ckd_free_2d((void **)acmod->mfc_buf); @@ -321,7 +306,6 @@ acmod_free(acmod_t *acmod) ckd_free(acmod->senone_scores); ckd_free(acmod->senone_active_vec); ckd_free(acmod->senone_active); - ckd_free(acmod->rawdata); if (acmod->mdef) bin_mdef_free(acmod->mdef); @@ -331,6 +315,7 @@ acmod_free(acmod_t *acmod) ps_mgau_free(acmod->mgau); if (acmod->mllr) ps_mllr_free(acmod->mllr); + logmath_free(acmod->lmath); ckd_free(acmod); } @@ -340,7 +325,7 @@ acmod_update_mllr(acmod_t *acmod, ps_mllr_t *mllr) { if (acmod->mllr) ps_mllr_free(acmod->mllr); - acmod->mllr = mllr; + acmod->mllr = ps_mllr_retain(mllr); ps_mgau_transform(acmod->mgau, mllr); return mllr; @@ -355,7 +340,7 @@ acmod_write_senfh_header(acmod_t *acmod, FILE *logfh) sprintf(logbasestr, "%f", logmath_get_base(acmod->lmath)); return bio_writehdr(logfh, "version", "0.1", - "mdef_file", cmd_ln_str_r(acmod->config, "_mdef"), + "mdef_file", ps_config_str(acmod->config, "mdef"), "n_sen", nsenstr, "logbase", logbasestr, NULL); } @@ -432,8 +417,6 @@ acmod_start_utt(acmod_t *acmod) acmod->senscr_frame = -1; acmod->n_senone_active = 0; acmod->mgau->frame_idx = 0; - acmod->rawdata_pos = 0; - return 0; } @@ -450,17 +433,18 @@ acmod_end_utt(acmod_t *acmod) /* nfr is always either zero or one. */ fe_end_utt(acmod->fe, acmod->mfc_buf[inptr], &nfr); acmod->n_mfc_frame += nfr; - - /* Process whatever's left, and any leadout or update stats if needed. */ + /* Process whatever's left, and any leadout. */ if (nfr) nfr = acmod_process_mfcbuf(acmod); - else + else /* Make sure to update CMN! */ feat_update_stats(acmod->fcb); } + else /* Make sure to update CMN! */ + feat_update_stats(acmod->fcb); if (acmod->mfcfh) { - long outlen; - int32 rv; + int32 outlen, rv; outlen = (ftell(acmod->mfcfh) - 4) / 4; + SWAP_BE_32(&outlen); /* Try to seek and write */ if ((rv = fseek(acmod->mfcfh, 0, SEEK_SET)) == 0) { fwrite(&outlen, 4, 1, acmod->mfcfh); @@ -485,11 +469,27 @@ static int acmod_log_mfc(acmod_t *acmod, mfcc_t **cep, int n_frames) { - int n = n_frames * feat_cepsize(acmod->fcb); + size_t i, n; + int32 *ptr = (int32 *)cep[0]; + + n = n_frames * feat_cepsize(acmod->fcb); + /* Swap bytes. */ +#ifndef WORDS_BIGENDIAN + for (i = 0; i < (n * sizeof(mfcc_t) / sizeof(int32)); ++i) { + SWAP_INT32(ptr + i); + } +#endif /* Write features. */ if (fwrite(cep[0], sizeof(mfcc_t), n, acmod->mfcfh) != n) { - E_ERROR_SYSTEM("Failed to write %d values to file", n); + E_ERROR_SYSTEM("Failed to write %d values to log file", n); + } + + /* Swap them back. */ +#ifndef WORDS_BIGENDIAN + for (i = 0; i < (n * sizeof(mfcc_t) / sizeof(int32)); ++i) { + SWAP_INT32(ptr + i); } +#endif return 0; } @@ -500,7 +500,7 @@ acmod_process_full_cep(acmod_t *acmod, { int32 nfr; - /* Write to file. */ + /* Write to log file. */ if (acmod->mfcfh) acmod_log_mfc(acmod, *inout_cep, *inout_n_frames); @@ -524,7 +524,6 @@ acmod_process_full_cep(acmod_t *acmod, assert(acmod->n_feat_frame <= acmod->n_feat_alloc); *inout_cep += *inout_n_frames; *inout_n_frames = 0; - return nfr; } @@ -537,14 +536,10 @@ acmod_process_full_raw(acmod_t *acmod, mfcc_t **cepptr; /* Write to logging file if any. */ - if (*inout_n_samps + acmod->rawdata_pos < acmod->rawdata_size) { - memcpy(acmod->rawdata + acmod->rawdata_pos, *inout_raw, *inout_n_samps * sizeof(int16)); - acmod->rawdata_pos += *inout_n_samps; - } if (acmod->rawfh) - fwrite(*inout_raw, sizeof(int16), *inout_n_samps, acmod->rawfh); + fwrite(*inout_raw, 2, *inout_n_samps, acmod->rawfh); /* Resize mfc_buf to fit. */ - if (fe_process_frames(acmod->fe, NULL, inout_n_samps, NULL, &nfr, NULL) < 0) + if (fe_process_frames(acmod->fe, NULL, inout_n_samps, NULL, &nfr) < 0) return -1; if (acmod->n_mfc_alloc < nfr + 1) { ckd_free_2d(acmod->mfc_buf); @@ -556,7 +551,7 @@ acmod_process_full_raw(acmod_t *acmod, acmod->mfc_outidx = 0; fe_start_utt(acmod->fe); if (fe_process_frames(acmod->fe, inout_raw, inout_n_samps, - acmod->mfc_buf, &nfr, NULL) < 0) + acmod->mfc_buf, &nfr) < 0) return -1; fe_end_utt(acmod->fe, acmod->mfc_buf[nfr], &ntail); nfr += ntail; @@ -610,9 +605,7 @@ acmod_process_raw(acmod_t *acmod, int full_utt) { int32 ncep; - int32 out_frameidx; - int16 const *prev_audio_inptr; - + /* If this is a full utterance, process it all at once. */ if (full_utt) return acmod_process_full_raw(acmod, inout_raw, inout_n_samps); @@ -620,10 +613,9 @@ acmod_process_raw(acmod_t *acmod, /* Append MFCCs to the end of any that are previously in there * (in practice, there will probably be none) */ if (inout_n_samps && *inout_n_samps) { + int16 const *prev_audio_inptr = *inout_raw; int inptr; - int32 processed_samples; - prev_audio_inptr = *inout_raw; /* Total number of frames available. */ ncep = acmod->n_mfc_alloc - acmod->n_mfc_frame; /* Where to start writing them (circular buffer) */ @@ -633,25 +625,15 @@ acmod_process_raw(acmod_t *acmod, while (inptr + ncep > acmod->n_mfc_alloc) { int32 ncep1 = acmod->n_mfc_alloc - inptr; if (fe_process_frames(acmod->fe, inout_raw, inout_n_samps, - acmod->mfc_buf + inptr, &ncep1, &out_frameidx) < 0) + acmod->mfc_buf + inptr, &ncep1) < 0) return -1; - - if (out_frameidx > 0) - acmod->utt_start_frame = out_frameidx; - - processed_samples = *inout_raw - prev_audio_inptr; - if (processed_samples + acmod->rawdata_pos < acmod->rawdata_size) { - memcpy(acmod->rawdata + acmod->rawdata_pos, prev_audio_inptr, processed_samples * sizeof(int16)); - acmod->rawdata_pos += processed_samples; - } /* Write to logging file if any. */ if (acmod->rawfh) { - fwrite(prev_audio_inptr, sizeof(int16), - processed_samples, + fwrite(prev_audio_inptr, 2, + *inout_raw - prev_audio_inptr, acmod->rawfh); + prev_audio_inptr = *inout_raw; } - prev_audio_inptr = *inout_raw; - /* ncep1 now contains the number of frames actually * processed. This is a good thing, but it means we * actually still might have some room left at the end of @@ -666,26 +648,16 @@ acmod_process_raw(acmod_t *acmod, if (ncep1 == 0) goto alldone; } - - assert(inptr + ncep <= acmod->n_mfc_alloc); + assert(inptr + ncep <= acmod->n_mfc_alloc); if (fe_process_frames(acmod->fe, inout_raw, inout_n_samps, - acmod->mfc_buf + inptr, &ncep, &out_frameidx) < 0) + acmod->mfc_buf + inptr, &ncep) < 0) return -1; - - if (out_frameidx > 0) - acmod->utt_start_frame = out_frameidx; - - - processed_samples = *inout_raw - prev_audio_inptr; - if (processed_samples + acmod->rawdata_pos < acmod->rawdata_size) { - memcpy(acmod->rawdata + acmod->rawdata_pos, prev_audio_inptr, processed_samples * sizeof(int16)); - acmod->rawdata_pos += processed_samples; - } + /* Write to logging file if any. */ if (acmod->rawfh) { - fwrite(prev_audio_inptr, sizeof(int16), - processed_samples, acmod->rawfh); + fwrite(prev_audio_inptr, 2, + *inout_raw - prev_audio_inptr, acmod->rawfh); + prev_audio_inptr = *inout_raw; } - prev_audio_inptr = *inout_raw; acmod->n_mfc_frame += ncep; alldone: ; @@ -708,7 +680,7 @@ acmod_process_cep(acmod_t *acmod, if (full_utt) return acmod_process_full_cep(acmod, inout_cep, inout_n_frames); - /* Write to file. */ + /* Write to log file. */ if (acmod->mfcfh) acmod_log_mfc(acmod, *inout_cep, *inout_n_frames); @@ -743,13 +715,11 @@ acmod_process_cep(acmod_t *acmod, } - /* FIXME: we can't split the last frame drop properly to be on the bounary, - * so just return - */ + /* FIXME: we can't split the last frame drop properly to be on the boundary, so just return */ if (inptr + nfeat > acmod->n_feat_alloc && acmod->state == ACMOD_ENDED) { - *inout_n_frames -= ncep; - *inout_cep += ncep; - return 0; + *inout_n_frames -= ncep; + *inout_cep += ncep; + return 0; } /* Write them in two parts if there is wraparound. */ @@ -789,7 +759,6 @@ acmod_process_cep(acmod_t *acmod, *inout_cep += ncep; if (acmod->state == ACMOD_STARTED) acmod->state = ACMOD_PROCESSING; - return orig_n_frames - *inout_n_frames; } @@ -866,7 +835,7 @@ acmod_set_insenfh(acmod_t *acmod, FILE *senfh) acmod->insenfh = senfh; if (senfh == NULL) { acmod->n_feat_frame = 0; - acmod->compallsen = cmd_ln_boolean_r(acmod->config, "-compallsen"); + acmod->compallsen = ps_config_bool(acmod->config, "compallsen"); return 0; } acmod->compallsen = TRUE; @@ -928,12 +897,12 @@ acmod_write_scores(acmod_t *acmod, int n_active, uint8 const *active, if (fwrite(&n_active2, 2, 1, senfh) != 1) goto error_out; if (n_active == bin_mdef_n_sen(acmod->mdef)) { - if (fwrite(senscr, 2, n_active, senfh) != n_active) + if (fwrite(senscr, 2, n_active, senfh) != (size_t) n_active) goto error_out; } else { int i, n; - if (fwrite(active, 1, n_active, senfh) != n_active) + if (fwrite(active, 1, n_active, senfh) != (size_t) n_active) goto error_out; for (i = n = 0; i < n_active; ++i) { n += active[i]; @@ -973,14 +942,16 @@ acmod_read_scores_internal(acmod_t *acmod) acmod->n_senone_active = n_active; if (acmod->n_senone_active == bin_mdef_n_sen(acmod->mdef)) { if ((rv = fread(acmod->senone_scores, 2, - acmod->n_senone_active, senfh)) != acmod->n_senone_active) + acmod->n_senone_active, senfh)) + != (size_t) acmod->n_senone_active) goto error_out; } else { int i, n; if ((rv = fread(acmod->senone_active, 1, - acmod->n_senone_active, senfh)) != acmod->n_senone_active) + acmod->n_senone_active, senfh)) + != (size_t) acmod->n_senone_active) goto error_out; for (i = 0, n = 0; i < acmod->n_senone_active; ++i) { @@ -1033,8 +1004,8 @@ acmod_read_scores(acmod_t *acmod) get reused below in acmod_score(). */ acmod->senscr_frame = acmod->output_frame + acmod->n_feat_frame; - E_DEBUG(1,("Frame %d has %d active states\n", - acmod->senscr_frame, acmod->n_senone_active)); + E_DEBUG("Frame %d has %d active states\n", + acmod->senscr_frame, acmod->n_senone_active); /* Increment the "feature frame counter" and record the file * position for the relevant frame in the (possibly circular) @@ -1123,10 +1094,7 @@ acmod_score(acmod_t *acmod, int *inout_frame_idx) if ((feat_idx = calc_feat_idx(acmod, frame_idx)) < 0) return NULL; - /* - * If there is an input senone file locate the appropriate frame and read - * it. - */ + /* If there is an input senone file locate the appropriate frame and read it. */ if (acmod->insenfh) { fseek(acmod->insenfh, acmod->framepos[feat_idx], SEEK_SET); if (acmod_read_scores_internal(acmod) < 0) @@ -1157,8 +1125,8 @@ acmod_score(acmod_t *acmod, int *inout_frame_idx) acmod->senone_scores, acmod->senfh) < 0) return NULL; - E_DEBUG(1,("Frame %d has %d active states\n", frame_idx, - acmod->n_senone_active)); + E_DEBUG("Frame %d has %d active states\n", frame_idx, + acmod->n_senone_active); } return acmod->senone_scores; @@ -1221,6 +1189,7 @@ acmod_activate_hmm(acmod_t *acmod, hmm_t *hmm) case 5: MPX_BITVEC_SET(acmod, hmm, 4); MPX_BITVEC_SET(acmod, hmm, 3); + /* FALLTHRU */ case 3: MPX_BITVEC_SET(acmod, hmm, 2); MPX_BITVEC_SET(acmod, hmm, 1); @@ -1237,6 +1206,7 @@ acmod_activate_hmm(acmod_t *acmod, hmm_t *hmm) case 5: NONMPX_BITVEC_SET(acmod, hmm, 4); NONMPX_BITVEC_SET(acmod, hmm, 3); + /* FALLTHRU */ case 3: NONMPX_BITVEC_SET(acmod, hmm, 2); NONMPX_BITVEC_SET(acmod, hmm, 1); @@ -1299,43 +1269,7 @@ acmod_flags2list(acmod_t *acmod) } acmod->n_senone_active = n; - E_DEBUG(1, ("acmod_flags2list: %d active in frame %d\n", - acmod->n_senone_active, acmod->output_frame)); + E_DEBUG("acmod_flags2list: %d active in frame %d\n", + acmod->n_senone_active, acmod->output_frame); return n; } - -int32 -acmod_stream_offset(acmod_t *acmod) -{ - return acmod->utt_start_frame; -} - -void -acmod_start_stream(acmod_t *acmod) -{ - fe_start_stream(acmod->fe); - acmod->utt_start_frame = 0; -} - -void -acmod_set_rawdata_size(acmod_t *acmod, int32 size) -{ - assert(size >= 0); - acmod->rawdata_size = size; - if (acmod->rawdata_size > 0) { - ckd_free(acmod->rawdata); - acmod->rawdata = ckd_calloc(size, sizeof(int16)); - } -} - -void -acmod_get_rawdata(acmod_t *acmod, int16 **buffer, int32 *size) -{ - if (buffer) { - *buffer = acmod->rawdata; - } - if (size) { - *size = acmod->rawdata_pos; - } -} - diff --git a/src/libpocketsphinx/acmod.h b/src/acmod.h similarity index 88% rename from src/libpocketsphinx/acmod.h rename to src/acmod.h index f4d5761..5c72313 100644 --- a/src/libpocketsphinx/acmod.h +++ b/src/acmod.h @@ -37,30 +37,30 @@ /** * @file acmod.h Acoustic model structures for PocketSphinx. - * @author David Huggins-Daines + * @author David Huggins-Daines */ #ifndef __ACMOD_H__ #define __ACMOD_H__ -/* System headers. */ #include -/* SphinxBase headers. */ -#include -#include -#include -#include -#include -#include -#include - -/* Local headers. */ -#include "ps_mllr.h" +#include + +#include "fe/fe.h" +#include "feat/feat.h" +#include "util/bitvec.h" #include "bin_mdef.h" #include "tmat.h" #include "hmm.h" +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + /** * States in utterance processing. */ @@ -147,7 +147,7 @@ struct ps_mgau_s { */ struct acmod_s { /* Global objects, not retained. */ - cmd_ln_t *config; /**< Configuration. */ + ps_config_t *config; /**< Configuration. */ logmath_t *lmath; /**< Log-math computation. */ glist_t strings; /**< Temporary acoustic model filenames. */ @@ -178,19 +178,12 @@ struct acmod_s { FILE *insenfh; /**< Input senone score file. */ long *framepos; /**< File positions of recent frames in senone file. */ - /* Rawdata collected during decoding */ - int16 *rawdata; - int32 rawdata_size; - int32 rawdata_pos; - /* A whole bunch of flags and counters: */ uint8 state; /**< State of utterance processing. */ uint8 compallsen; /**< Compute all senones? */ uint8 grow_feat; /**< Whether to grow feat_buf. */ uint8 insen_swap; /**< Whether to swap input senone score. */ - frame_idx_t utt_start_frame; /**< Index of the utterance start in the stream, all timings are relative to that. */ - frame_idx_t output_frame; /**< Index of next frame of dynamic features. */ frame_idx_t n_mfc_alloc; /**< Number of frames allocated in mfc_buf */ frame_idx_t n_mfc_frame; /**< Number of frames active in mfc_buf */ @@ -204,29 +197,52 @@ typedef struct acmod_s acmod_t; /** * Initialize an acoustic model. * - * @param config a command-line object containing parameters. This - * pointer is not retained by this object. + * @param config a command-line object containing parameters. + * Ownership of this pointer is retained by this object, + * so you may free it if you no longer need it. * @param lmath global log-math parameters. * @param fe a previously-initialized acoustic feature module to use, * or NULL to create one automatically. If this is supplied * and its parameters do not match those in the acoustic - * model, this function will fail. This pointer is not retained. - * @param fe a previously-initialized dynamic feature module to use, + * model, this function will fail. This pointer is retained. + * @param fcb a previously-initialized dynamic feature module to use, * or NULL to create one automatically. If this is supplied * and its parameters do not match those in the acoustic - * model, this function will fail. This pointer is not retained. + * model, this function will fail. This pointer is retained. * @return a newly initialized acmod_t, or NULL on failure. */ -acmod_t *acmod_init(cmd_ln_t *config, logmath_t *lmath, fe_t *fe, feat_t *fcb); +acmod_t *acmod_init(ps_config_t *config, logmath_t *lmath, fe_t *fe, feat_t *fcb); + +/** + * Reinitialize feature computation modules. + */ +int acmod_reinit_feat(acmod_t *acmod, fe_t *fe, feat_t *fcb); + +/** + * Verify that feature extraction parameters are compatible with + * acoustic model. + * + * @param fe acoustic feature extraction module to verify. + * @return TRUE if compatible, FALSE otherwise + */ +int acmod_fe_mismatch(acmod_t *acmod, fe_t *fe); + +/** + * Verify that dynamic feature computation parameters are compatible + * with acoustic model. + * + * @param fcb dynamic feature computation module to verify. + * @return TRUE if compatible, FALSE otherwise + */ +int acmod_feat_mismatch(acmod_t *acmod, feat_t *fcb); /** * Adapt acoustic model using a linear transform. * - * @param mllr The new transform to use, or NULL to update the existing - * transform. The decoder retains ownership of this pointer, - * so you should not attempt to free it manually. Use - * ps_mllr_retain() if you wish to reuse it - * elsewhere. + * @param mllr The new transform to use, or NULL to update the + * existing transform. The decoder retains ownership of + * this pointer, so you may free it if you no longer need + * it. * @return The updated transform object for this decoder, or * NULL on failure. */ @@ -332,6 +348,7 @@ int acmod_process_raw(acmod_t *acmod, size_t *inout_n_samps, int full_utt); + /** * Feed acoustic feature data into the acoustic model for scoring. * @@ -439,28 +456,12 @@ void acmod_activate_hmm(acmod_t *acmod, hmm_t *hmm); #define acmod_activate_sen(acmod, sen) bitvec_set((acmod)->senone_active_vec, sen) /** - * Build active list from + * Build active list. */ int32 acmod_flags2list(acmod_t *acmod); -/** - * Get the offset of the utterance start of the current stream, helpful for stream-wide timing. - */ -int32 acmod_stream_offset(acmod_t *acmod); - -/** - * Reset the current stream - */ -void acmod_start_stream(acmod_t *acmod); - -/** - * Sets the limit of the raw audio data to store - */ -void acmod_set_rawdata_size(acmod_t *acmod, int32 size); - -/** - * Retrieves the raw data collected during utterance decoding - */ -void acmod_get_rawdata(acmod_t *acmod, int16 **buffer, int32 *size); +#ifdef __cplusplus +} /* extern "C" */ +#endif #endif /* __ACMOD_H__ */ diff --git a/src/libpocketsphinx/allphone_search.c b/src/allphone_search.c similarity index 96% rename from src/libpocketsphinx/allphone_search.c rename to src/allphone_search.c index ebb3a11..3567031 100644 --- a/src/libpocketsphinx/allphone_search.c +++ b/src/allphone_search.c @@ -1,3 +1,4 @@ +/* -*- c-basic-offset: 4 -*- */ /* ==================================================================== * Copyright (c) 2014 Carnegie Mellon University. All rights * reserved. @@ -39,11 +40,11 @@ #include #include -#include -#include -#include -#include -#include +#include + +#include "util/ckd_alloc.h" +#include "util/strfuncs.h" +#include "util/pio.h" #include "pocketsphinx_internal.h" #include "allphone_search.h" @@ -51,17 +52,21 @@ static ps_lattice_t * allphone_search_lattice(ps_search_t * search) { + (void) search; return NULL; } static int allphone_search_prob(ps_search_t * search) { + (void) search; return 0; } static void allphone_backtrace(allphone_search_t * allphs, int32 f, int32 *out_score); +static void +allphone_clear_segments(allphone_search_t * allphs); static void allphone_search_seg_free(ps_seg_t * seg) @@ -76,7 +81,8 @@ allphone_search_fill_iter(ps_seg_t *seg, phseg_t *phseg) seg->ef = phseg->ef; seg->ascr = phseg->score; seg->lscr = phseg->tscore; - seg->word = bin_mdef_ciphone_str(ps_search_acmod(seg->search)->mdef, phseg->ci); + seg->text = bin_mdef_ciphone_str(ps_search_acmod(seg->search)->mdef, phseg->ci); + seg->wid = BAD_S3WID; } static ps_seg_t * @@ -519,7 +525,7 @@ phmm_trans(allphone_search_t * allphs, int32 best, ps_search_t * allphone_search_init(const char *name, ngram_model_t * lm, - cmd_ln_t * config, + ps_config_t * config, acmod_t * acmod, dict_t * dict, dict2pid_t * d2p) { int i; @@ -538,8 +544,8 @@ allphone_search_init(const char *name, return NULL; } - allphs->ci_only = cmd_ln_boolean_r(config, "-allphone_ci"); - allphs->lw = cmd_ln_float32_r(config, "-lw"); + allphs->ci_only = ps_config_bool(config, "allphone_ci"); + allphs->lw = ps_config_float(config, "lw"); phmm_build(allphs); @@ -574,7 +580,7 @@ allphone_search_init(const char *name, ("Failed to load language model specified in -allphone, doing unconstrained phone-loop decoding\n"); allphs->inspen = (int32) (logmath_log - (acmod->lmath, cmd_ln_float32_r(config, "-pip")) + (acmod->lmath, ps_config_float(config, "pip")) * allphs->lw) >> SENSCR_SHIFT; } @@ -586,19 +592,19 @@ allphone_search_init(const char *name, allphs->beam = (int32) logmath_log(acmod->lmath, - cmd_ln_float64_r(config, "-beam")) + ps_config_float(config, "beam")) >> SENSCR_SHIFT; allphs->pbeam = (int32) logmath_log(acmod->lmath, - cmd_ln_float64_r(config, "-pbeam")) + ps_config_float(config, "pbeam")) >> SENSCR_SHIFT; /* LM related weights/penalties */ allphs->history = blkarray_list_init(); /* Acoustic score scale for posterior probabilities. */ - allphs->ascale = 1.0 / cmd_ln_float32_r(config, "-ascale"); + allphs->ascale = 1.0 / ps_config_float(config, "ascale"); E_INFO("Allphone(beam: %d, pbeam: %d)\n", allphs->beam, allphs->pbeam); @@ -622,9 +628,8 @@ allphone_search_reinit(ps_search_t * search, dict_t * dict, allphs->inspen = (int32) (logmath_log (search->acmod->lmath, - cmd_ln_float32_r(search->config, - "-pip")) * - allphs->lw) >> SENSCR_SHIFT; + ps_config_float(search->config, "pip")) + * allphs->lw) >> SENSCR_SHIFT; } return 0; @@ -637,7 +642,7 @@ allphone_search_free(ps_search_t * search) double n_speech = (double)allphs->n_tot_frame - / cmd_ln_int32_r(ps_search_config(allphs), "-frate"); + / ps_config_int(ps_search_config(allphs), "frate"); E_INFO("TOTAL allphone %.2f CPU %.3f xRT\n", allphs->perf.t_tot_cpu, @@ -648,6 +653,7 @@ allphone_search_free(ps_search_t * search) ps_search_base_free(search); + allphone_clear_segments(allphs); hmm_context_free(allphs->hmmctx); phmm_free(allphs); if (allphs->lm) @@ -792,7 +798,7 @@ allphone_backtrace(allphone_search_t * allphs, int32 f, int32 *out_score) return; /* Find bestscore */ - best = (int32) 0x80000000; + best = MAX_NEG_INT32; best_idx = -1; while (frm == last_frm && hist_idx > 0) { h = blkarray_list_get(allphs->history, hist_idx); @@ -857,7 +863,7 @@ allphone_search_finish(ps_search_t * search) cf = ps_search_acmod(allphs)->output_frame; if (cf > 0) { double n_speech = (double) (cf + 1) - / cmd_ln_int32_r(ps_search_config(allphs), "-frate"); + / ps_config_int(ps_search_config(allphs), "frate"); E_INFO("allphone %.2f CPU %.3f xRT\n", allphs->perf.t_cpu, allphs->perf.t_cpu / n_speech); E_INFO("allphone %.2f wall %.3f xRT\n", diff --git a/src/libpocketsphinx/allphone_search.h b/src/allphone_search.h similarity index 95% rename from src/libpocketsphinx/allphone_search.h rename to src/allphone_search.h index d09a4e3..c30f3c1 100644 --- a/src/libpocketsphinx/allphone_search.h +++ b/src/allphone_search.h @@ -40,18 +40,22 @@ #ifndef __ALLPHONE_SEARCH_H__ #define __ALLPHONE_SEARCH_H__ +#include -/* SphinxBase headers. */ -#include -#include -#include -#include - -/* Local headers. */ +#include "util/glist.h" +#include "util/bitvec.h" +#include "util/blkarray_list.h" +#include "lm/ngram_model.h" #include "pocketsphinx_internal.h" -#include "blkarray_list.h" #include "hmm.h" +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + /** * Models a single unique pair. * Can represent several different triphones, but all with the same parent basephone. @@ -140,7 +144,7 @@ typedef struct allphone_search_s { */ ps_search_t *allphone_search_init(const char *name, ngram_model_t * lm, - cmd_ln_t * config, + ps_config_t * config, acmod_t * acmod, dict_t * dict, dict2pid_t * d2p); @@ -176,4 +180,8 @@ int allphone_search_finish(ps_search_t * search); */ char const *allphone_search_hyp(ps_search_t * search, int32 * out_score); +#ifdef __cplusplus +} /* extern "C" */ +#endif + #endif /* __ALLPHONE_SEARCH_H__ */ diff --git a/src/libpocketsphinx/bin_mdef.c b/src/bin_mdef.c similarity index 96% rename from src/libpocketsphinx/bin_mdef.c rename to src/bin_mdef.c index eed47d3..09ae19f 100644 --- a/src/libpocketsphinx/bin_mdef.c +++ b/src/bin_mdef.c @@ -43,33 +43,31 @@ * heterogeneous topologies and variable-size N-phones * * Author: - * David Huggins-Daines + * David Huggins-Daines *********************************************************************/ -/* System headers. */ #include #include #include -/* SphinxBase headers. */ -#include -#include -#include -#include -#include +#include -/* Local headers. */ +#include "util/ckd_alloc.h" +#include "util/byteorder.h" +#include "util/case.h" #include "mdef.h" #include "bin_mdef.h" bin_mdef_t * -bin_mdef_read_text(cmd_ln_t *config, const char *filename) +bin_mdef_read_text(ps_config_t *config, const char *filename) { bin_mdef_t *bmdef; mdef_t *mdef; int i, nodes, ci_idx, lc_idx, rc_idx; int nchars; + (void)config; + if ((mdef = mdef_init((char *) filename, TRUE)) == NULL) return NULL; @@ -124,13 +122,15 @@ bin_mdef_read_text(cmd_ln_t *config, const char *filename) bmdef->ciname[0] = ckd_calloc(nchars, 1); strcpy(bmdef->ciname[0], mdef->ciphone[0].name); for (i = 1; i < bmdef->n_ciphone; ++i) { + assert(i > 0); /* No reason to imagine it wouldn't be, but... */ bmdef->ciname[i] = bmdef->ciname[i - 1] + strlen(bmdef->ciname[i - 1]) + 1; strcpy(bmdef->ciname[i], mdef->ciphone[i].name); - if (i > 0 && strcmp(bmdef->ciname[i - 1], bmdef->ciname[i]) > 0) { + if (strcmp(bmdef->ciname[i - 1], bmdef->ciname[i]) > 0) { /* FIXME: there should be a solution to this, actually. */ E_ERROR("Phone names are not in sorted order, sorry."); bin_mdef_free(bmdef); + mdef_free(mdef); return NULL; } } @@ -320,7 +320,7 @@ static const char format_desc[] = "END FILE FORMAT DESCRIPTION\n"; bin_mdef_t * -bin_mdef_read(cmd_ln_t *config, const char *filename) +bin_mdef_read(ps_config_t *config, const char *filename) { bin_mdef_t *m; FILE *fh; @@ -400,7 +400,7 @@ bin_mdef_read(cmd_ln_t *config, const char *filename) m->ciname = ckd_calloc(m->n_ciphone, sizeof(*m->ciname)); /* Decide whether to read in the whole file or mmap it. */ - do_mmap = config ? cmd_ln_boolean_r(config, "-mmap") : TRUE; + do_mmap = config ? ps_config_bool(config, "mmap") : TRUE; if (swap) { E_WARN("-mmap specified, but mdef is other-endian. Will not memory-map.\n"); do_mmap = FALSE; @@ -425,7 +425,7 @@ bin_mdef_read(cmd_ln_t *config, const char *filename) end = ftell(fh); fseek(fh, pos, SEEK_SET); m->ciname[0] = ckd_malloc(end - pos); - if (fread(m->ciname[0], 1, end - pos, fh) != end - pos) + if (fread(m->ciname[0], 1, end - pos, fh) != (size_t)(end - pos)) E_FATAL("Failed to read %d bytes of data from %s\n", end - pos, filename); } @@ -552,12 +552,7 @@ bin_mdef_write(bin_mdef_t * m, const char *filename) fwrite(&m->n_sseq, 4, 1, fh); fwrite(&m->n_ctx, 4, 1, fh); fwrite(&m->n_cd_tree, 4, 1, fh); - /* Write this as a 32-bit value to preserve alignment for the - * non-mmap case (we want things aligned both from the - * beginning of the file and the beginning of the phone - * strings). */ - val = m->sil; - fwrite(&val, 4, 1, fh); + fwrite(&m->sil, 4, 1, fh); /* Phone strings. */ for (i = 0; i < m->n_ciphone; ++i) @@ -581,9 +576,10 @@ bin_mdef_write(bin_mdef_t * m, const char *filename) m->n_sseq * m->n_emit_state, fh); } else { + /* FIXME: This code is never used */ int32 n; - /* Calcluate size of sseq */ + /* Calculate size of sseq */ n = 0; for (i = 0; i < m->n_sseq; ++i) n += m->sseq_len[i]; @@ -704,7 +700,7 @@ bin_mdef_ciphone_id(bin_mdef_t * m, const char *ciphone) return mid; else if (c > 0) low = mid + 1; - else if (c < 0) + else high = mid; } return -1; @@ -727,7 +723,7 @@ bin_mdef_ciphone_id_nocase(bin_mdef_t * m, const char *ciphone) return mid; else if (c > 0) low = mid + 1; - else if (c < 0) + else high = mid; } return -1; diff --git a/src/libpocketsphinx/bin_mdef.h b/src/bin_mdef.h similarity index 95% rename from src/libpocketsphinx/bin_mdef.h rename to src/bin_mdef.h index 96cad59..7bcb153 100644 --- a/src/libpocketsphinx/bin_mdef.h +++ b/src/bin_mdef.h @@ -40,20 +40,22 @@ * Binary format model definition files, with support for * heterogeneous topologies and variable-size N-phones * - * @author David Huggins-Daines + * @author David Huggins-Daines */ #ifndef __BIN_MDEF_H__ #define __BIN_MDEF_H__ #ifdef __cplusplus extern "C" { -#endif /* __cplusplus */ +#endif +#if 0 +} +#endif -/* SphinxBase headers. */ -#include -#include -#include +#include +#include +#include "util/mmio.h" #include "mdef.h" #define BIN_MDEF_FORMAT_VERSION 1 @@ -125,7 +127,7 @@ struct bin_mdef_s { int32 n_sseq; /**< Number of unique senone sequences */ int32 n_ctx; /**< Number of phones of context */ int32 n_cd_tree; /**< Number of nodes in cd_tree (below) */ - int16 sil; /**< CI phone ID for silence */ + int32 sil; /**< CI phone ID for silence */ mmio_file_t *filemap;/**< File map for this file (if any) */ char **ciname; /**< CI phone names */ @@ -166,26 +168,31 @@ struct bin_mdef_s { * Read a binary mdef from a file. */ POCKETSPHINX_EXPORT -bin_mdef_t *bin_mdef_read(cmd_ln_t *config, const char *filename); +bin_mdef_t *bin_mdef_read(ps_config_t *config, const char *filename); + /** * Read a text mdef from a file (creating an in-memory binary mdef). */ POCKETSPHINX_EXPORT -bin_mdef_t *bin_mdef_read_text(cmd_ln_t *config, const char *filename); +bin_mdef_t *bin_mdef_read_text(ps_config_t *config, const char *filename); + /** * Write a binary mdef to a file. */ POCKETSPHINX_EXPORT int bin_mdef_write(bin_mdef_t *m, const char *filename); + /** * Write a binary mdef to a text file. */ POCKETSPHINX_EXPORT int bin_mdef_write_text(bin_mdef_t *m, const char *filename); + /** * Retain a pointer to a bin_mdef_t. */ bin_mdef_t *bin_mdef_retain(bin_mdef_t *m); + /** * Release a pointer to a binary mdef. */ @@ -230,7 +237,7 @@ int bin_mdef_phone_str(bin_mdef_t *m, /**< In: Model structure being queried */ char *buf); /**< Out: On return, buf has the string */ #ifdef __cplusplus -}; /* extern "C" */ -#endif /* __cplusplus */ +} /* extern "C" */ +#endif #endif /* __BIN_MDEF_H__ */ diff --git a/src/common_audio/signal_processing/cross_correlation.c b/src/common_audio/signal_processing/cross_correlation.c new file mode 100644 index 0000000..c6267c9 --- /dev/null +++ b/src/common_audio/signal_processing/cross_correlation.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "common_audio/signal_processing/include/signal_processing_library.h" + +/* C version of WebRtcSpl_CrossCorrelation() for generic platforms. */ +void WebRtcSpl_CrossCorrelationC(int32_t* cross_correlation, + const int16_t* seq1, + const int16_t* seq2, + size_t dim_seq, + size_t dim_cross_correlation, + int right_shifts, + int step_seq2) { + size_t i = 0, j = 0; + + for (i = 0; i < dim_cross_correlation; i++) { + int32_t corr = 0; + for (j = 0; j < dim_seq; j++) + corr += (seq1[j] * seq2[j]) >> right_shifts; + seq2 += step_seq2; + *cross_correlation++ = corr; + } +} diff --git a/src/common_audio/signal_processing/division_operations.c b/src/common_audio/signal_processing/division_operations.c new file mode 100644 index 0000000..4764ddf --- /dev/null +++ b/src/common_audio/signal_processing/division_operations.c @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + + +/* + * This file contains implementations of the divisions + * WebRtcSpl_DivU32U16() + * WebRtcSpl_DivW32W16() + * WebRtcSpl_DivW32W16ResW16() + * WebRtcSpl_DivResultInQ31() + * WebRtcSpl_DivW32HiLow() + * + * The description header can be found in signal_processing_library.h + * + */ + +#include "common_audio/signal_processing/include/signal_processing_library.h" +#include "rtc_base/sanitizer.h" + +uint32_t WebRtcSpl_DivU32U16(uint32_t num, uint16_t den) +{ + // Guard against division with 0 + if (den != 0) + { + return (uint32_t)(num / den); + } else + { + return (uint32_t)0xFFFFFFFF; + } +} + +int32_t WebRtcSpl_DivW32W16(int32_t num, int16_t den) +{ + // Guard against division with 0 + if (den != 0) + { + return (int32_t)(num / den); + } else + { + return (int32_t)0x7FFFFFFF; + } +} + +int16_t WebRtcSpl_DivW32W16ResW16(int32_t num, int16_t den) +{ + // Guard against division with 0 + if (den != 0) + { + return (int16_t)(num / den); + } else + { + return (int16_t)0x7FFF; + } +} + +int32_t WebRtcSpl_DivResultInQ31(int32_t num, int32_t den) +{ + int32_t L_num = num; + int32_t L_den = den; + int32_t div = 0; + int k = 31; + int change_sign = 0; + + if (num == 0) + return 0; + + if (num < 0) + { + change_sign++; + L_num = -num; + } + if (den < 0) + { + change_sign++; + L_den = -den; + } + while (k--) + { + div <<= 1; + L_num <<= 1; + if (L_num >= L_den) + { + L_num -= L_den; + div++; + } + } + if (change_sign == 1) + { + div = -div; + } + return div; +} + +int32_t WebRtcSpl_DivW32HiLow(int32_t num, int16_t den_hi, int16_t den_low) +{ + int16_t approx, tmp_hi, tmp_low, num_hi, num_low; + int32_t tmpW32; + + approx = (int16_t)WebRtcSpl_DivW32W16((int32_t)0x1FFFFFFF, den_hi); + // result in Q14 (Note: 3FFFFFFF = 0.5 in Q30) + + // tmpW32 = 1/den = approx * (2.0 - den * approx) (in Q30) + tmpW32 = (den_hi * approx << 1) + ((den_low * approx >> 15) << 1); + // tmpW32 = den * approx + + // result in Q30 (tmpW32 = 2.0-(den*approx)) + tmpW32 = (int32_t)((int64_t)0x7fffffffL - tmpW32); + + // Store tmpW32 in hi and low format + tmp_hi = (int16_t)(tmpW32 >> 16); + tmp_low = (int16_t)((tmpW32 - ((int32_t)tmp_hi << 16)) >> 1); + + // tmpW32 = 1/den in Q29 + tmpW32 = (tmp_hi * approx + (tmp_low * approx >> 15)) << 1; + + // 1/den in hi and low format + tmp_hi = (int16_t)(tmpW32 >> 16); + tmp_low = (int16_t)((tmpW32 - ((int32_t)tmp_hi << 16)) >> 1); + + // Store num in hi and low format + num_hi = (int16_t)(num >> 16); + num_low = (int16_t)((num - ((int32_t)num_hi << 16)) >> 1); + + // num * (1/den) by 32 bit multiplication (result in Q28) + + tmpW32 = num_hi * tmp_hi + (num_hi * tmp_low >> 15) + + (num_low * tmp_hi >> 15); + + // Put result in Q31 (convert from Q28) + tmpW32 = WEBRTC_SPL_LSHIFT_W32(tmpW32, 3); + + return tmpW32; +} diff --git a/src/common_audio/signal_processing/downsample_fast.c b/src/common_audio/signal_processing/downsample_fast.c new file mode 100644 index 0000000..80fdc58 --- /dev/null +++ b/src/common_audio/signal_processing/downsample_fast.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "common_audio/signal_processing/include/signal_processing_library.h" + +#include "rtc_base/checks.h" +#include "rtc_base/sanitizer.h" + +// TODO(Bjornv): Change the function parameter order to WebRTC code style. +// C version of WebRtcSpl_DownsampleFast() for generic platforms. +int WebRtcSpl_DownsampleFastC(const int16_t* data_in, + size_t data_in_length, + int16_t* data_out, + size_t data_out_length, + const int16_t* __restrict coefficients, + size_t coefficients_length, + int factor, + size_t delay) { + int16_t* const original_data_out = data_out; + size_t i = 0; + size_t j = 0; + int32_t out_s32 = 0; + size_t endpos = delay + factor * (data_out_length - 1) + 1; + + // Return error if any of the running conditions doesn't meet. + if (data_out_length == 0 || coefficients_length == 0 + || data_in_length < endpos) { + return -1; + } + + rtc_MsanCheckInitialized(coefficients, sizeof(coefficients[0]), + coefficients_length); + + for (i = delay; i < endpos; i += factor) { + out_s32 = 2048; // Round value, 0.5 in Q12. + + for (j = 0; j < coefficients_length; j++) { + // Negative overflow is permitted here, because this is + // auto-regressive filters, and the state for each batch run is + // stored in the "negative" positions of the output vector. + rtc_MsanCheckInitialized(&data_in[(ptrdiff_t) i - (ptrdiff_t) j], + sizeof(data_in[0]), 1); + // out_s32 is in Q12 domain. + out_s32 += coefficients[j] * data_in[(ptrdiff_t) i - (ptrdiff_t) j]; + } + + out_s32 >>= 12; // Q0. + + // Saturate and store the output. + *data_out++ = WebRtcSpl_SatW32ToW16(out_s32); + } + + RTC_DCHECK_EQ(original_data_out + data_out_length, data_out); + rtc_MsanCheckInitialized(original_data_out, sizeof(original_data_out[0]), + data_out_length); + + return 0; +} diff --git a/src/common_audio/signal_processing/energy.c b/src/common_audio/signal_processing/energy.c new file mode 100644 index 0000000..5cce6b8 --- /dev/null +++ b/src/common_audio/signal_processing/energy.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + + +/* + * This file contains the function WebRtcSpl_Energy(). + * The description header can be found in signal_processing_library.h + * + */ + +#include "common_audio/signal_processing/include/signal_processing_library.h" + +int32_t WebRtcSpl_Energy(int16_t* vector, + size_t vector_length, + int* scale_factor) +{ + int32_t en = 0; + size_t i; + int scaling = + WebRtcSpl_GetScalingSquare(vector, vector_length, vector_length); + size_t looptimes = vector_length; + int16_t *vectorptr = vector; + + for (i = 0; i < looptimes; i++) + { + en += (*vectorptr * *vectorptr) >> scaling; + vectorptr++; + } + *scale_factor = scaling; + + return en; +} diff --git a/src/common_audio/signal_processing/get_scaling_square.c b/src/common_audio/signal_processing/get_scaling_square.c new file mode 100644 index 0000000..4eb1269 --- /dev/null +++ b/src/common_audio/signal_processing/get_scaling_square.c @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + + +/* + * This file contains the function WebRtcSpl_GetScalingSquare(). + * The description header can be found in signal_processing_library.h + * + */ + +#include "common_audio/signal_processing/include/signal_processing_library.h" + +int16_t WebRtcSpl_GetScalingSquare(int16_t* in_vector, + size_t in_vector_length, + size_t times) +{ + int16_t nbits = WebRtcSpl_GetSizeInBits((uint32_t)times); + size_t i; + int16_t smax = -1; + int16_t sabs; + int16_t *sptr = in_vector; + int16_t t; + size_t looptimes = in_vector_length; + + for (i = looptimes; i > 0; i--) + { + sabs = (*sptr > 0 ? *sptr++ : -*sptr++); + smax = (sabs > smax ? sabs : smax); + } + t = WebRtcSpl_NormW32(WEBRTC_SPL_MUL(smax, smax)); + + if (smax == 0) + { + return 0; // Since norm(0) returns 0 + } else + { + return (t > nbits) ? 0 : nbits - t; + } +} diff --git a/src/common_audio/signal_processing/include/signal_processing_library.h b/src/common_audio/signal_processing/include/signal_processing_library.h new file mode 100644 index 0000000..a298753 --- /dev/null +++ b/src/common_audio/signal_processing/include/signal_processing_library.h @@ -0,0 +1,1644 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +/* + * This header file includes all of the fix point signal processing library + * (SPL) function descriptions and declarations. For specific function calls, + * see bottom of file. + */ + +#ifndef COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SIGNAL_PROCESSING_LIBRARY_H_ +#define COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SIGNAL_PROCESSING_LIBRARY_H_ + +#include + +#include +#ifdef HAVE_STDINT_H +#include +#else +#include "rtc_base/typedefs.h" +#endif + +// Vade retro C++ +//#include "common_audio/signal_processing/dot_product_with_scale.h" + +// Macros specific for the fixed point implementation +#define WEBRTC_SPL_WORD16_MAX 32767 +#define WEBRTC_SPL_WORD16_MIN -32768 +#define WEBRTC_SPL_WORD32_MAX (int32_t)0x7fffffff +#define WEBRTC_SPL_WORD32_MIN (int32_t)0x80000000 +#define WEBRTC_SPL_MAX_LPC_ORDER 14 +#define WEBRTC_SPL_MIN(A, B) (A < B ? A : B) // Get min value +#define WEBRTC_SPL_MAX(A, B) (A > B ? A : B) // Get max value +// TODO(kma/bjorn): For the next two macros, investigate how to correct the code +// for inputs of a = WEBRTC_SPL_WORD16_MIN or WEBRTC_SPL_WORD32_MIN. +#define WEBRTC_SPL_ABS_W16(a) (((int16_t)a >= 0) ? ((int16_t)a) : -((int16_t)a)) +#define WEBRTC_SPL_ABS_W32(a) (((int32_t)a >= 0) ? ((int32_t)a) : -((int32_t)a)) + +#define WEBRTC_SPL_MUL(a, b) ((int32_t)((int32_t)(a) * (int32_t)(b))) +#define WEBRTC_SPL_UMUL(a, b) ((uint32_t)((uint32_t)(a) * (uint32_t)(b))) +#define WEBRTC_SPL_UMUL_32_16(a, b) ((uint32_t)((uint32_t)(a) * (uint16_t)(b))) +#define WEBRTC_SPL_MUL_16_U16(a, b) ((int32_t)(int16_t)(a) * (uint16_t)(b)) + +// clang-format off +// clang-format would choose some indentation +// leading to presubmit error (cpplint.py) +#ifndef WEBRTC_ARCH_ARM_V7 +// For ARMv7 platforms, these are inline functions in spl_inl_armv7.h +#ifndef MIPS32_LE +// For MIPS platforms, these are inline functions in spl_inl_mips.h +#define WEBRTC_SPL_MUL_16_16(a, b) ((int32_t)(((int16_t)(a)) * ((int16_t)(b)))) +#define WEBRTC_SPL_MUL_16_32_RSFT16(a, b) \ + (WEBRTC_SPL_MUL_16_16(a, b >> 16) + \ + ((WEBRTC_SPL_MUL_16_16(a, (b & 0xffff) >> 1) + 0x4000) >> 15)) +#endif +#endif + +#define WEBRTC_SPL_MUL_16_32_RSFT11(a, b) \ + (WEBRTC_SPL_MUL_16_16(a, (b) >> 16) * (1 << 5) + \ + (((WEBRTC_SPL_MUL_16_U16(a, (uint16_t)(b)) >> 1) + 0x0200) >> 10)) +#define WEBRTC_SPL_MUL_16_32_RSFT14(a, b) \ + (WEBRTC_SPL_MUL_16_16(a, (b) >> 16) * (1 << 2) + \ + (((WEBRTC_SPL_MUL_16_U16(a, (uint16_t)(b)) >> 1) + 0x1000) >> 13)) +#define WEBRTC_SPL_MUL_16_32_RSFT15(a, b) \ + ((WEBRTC_SPL_MUL_16_16(a, (b) >> 16) * (1 << 1)) + \ + (((WEBRTC_SPL_MUL_16_U16(a, (uint16_t)(b)) >> 1) + 0x2000) >> 14)) +// clang-format on + +#define WEBRTC_SPL_MUL_16_16_RSFT(a, b, c) (WEBRTC_SPL_MUL_16_16(a, b) >> (c)) + +#define WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(a, b, c) \ + ((WEBRTC_SPL_MUL_16_16(a, b) + ((int32_t)(((int32_t)1) << ((c)-1)))) >> (c)) + +// C + the 32 most significant bits of A * B +#define WEBRTC_SPL_SCALEDIFF32(A, B, C) \ + (C + (B >> 16) * A + (((uint32_t)(B & 0x0000FFFF) * A) >> 16)) + +#define WEBRTC_SPL_SAT(a, b, c) (b > a ? a : b < c ? c : b) + +// Shifting with negative numbers allowed +// Positive means left shift +#define WEBRTC_SPL_SHIFT_W32(x, c) ((c) >= 0 ? (x) * (1 << (c)) : (x) >> -(c)) + +// Shifting with negative numbers not allowed +// We cannot do casting here due to signed/unsigned problem +#define WEBRTC_SPL_LSHIFT_W32(x, c) ((x) << (c)) + +#define WEBRTC_SPL_RSHIFT_U32(x, c) ((uint32_t)(x) >> (c)) + +#define WEBRTC_SPL_RAND(a) ((int16_t)((((int16_t)a * 18816) >> 7) & 0x00007fff)) + +#ifdef __cplusplus +extern "C" { +#endif + +#define WEBRTC_SPL_MEMCPY_W16(v1, v2, length) \ + memcpy(v1, v2, (length) * sizeof(int16_t)) + +// inline functions: +#include "common_audio/signal_processing/include/spl_inl.h" + +// third party math functions +// (unused) +//#include "common_audio/third_party/spl_sqrt_floor/spl_sqrt_floor.h" + +int16_t WebRtcSpl_GetScalingSquare(int16_t* in_vector, + size_t in_vector_length, + size_t times); + +// Copy and set operations. Implementation in copy_set_operations.c. +// Descriptions at bottom of file. +void WebRtcSpl_MemSetW16(int16_t* vector, + int16_t set_value, + size_t vector_length); +void WebRtcSpl_MemSetW32(int32_t* vector, + int32_t set_value, + size_t vector_length); +void WebRtcSpl_MemCpyReversedOrder(int16_t* out_vector, + int16_t* in_vector, + size_t vector_length); +void WebRtcSpl_CopyFromEndW16(const int16_t* in_vector, + size_t in_vector_length, + size_t samples, + int16_t* out_vector); +void WebRtcSpl_ZerosArrayW16(int16_t* vector, size_t vector_length); +void WebRtcSpl_ZerosArrayW32(int32_t* vector, size_t vector_length); +// End: Copy and set operations. + +// Minimum and maximum operation functions and their pointers. +// Implementation in min_max_operations.c. + +// Returns the largest absolute value in a signed 16-bit vector. +// +// Input: +// - vector : 16-bit input vector. +// - length : Number of samples in vector. +// +// Return value : Maximum absolute value in vector. +typedef int16_t (*MaxAbsValueW16)(const int16_t* vector, size_t length); +extern const MaxAbsValueW16 WebRtcSpl_MaxAbsValueW16; +int16_t WebRtcSpl_MaxAbsValueW16C(const int16_t* vector, size_t length); +#if defined(WEBRTC_HAS_NEON) +int16_t WebRtcSpl_MaxAbsValueW16Neon(const int16_t* vector, size_t length); +#endif +#if defined(MIPS32_LE) +int16_t WebRtcSpl_MaxAbsValueW16_mips(const int16_t* vector, size_t length); +#endif + +// Returns the largest absolute value in a signed 32-bit vector. +// +// Input: +// - vector : 32-bit input vector. +// - length : Number of samples in vector. +// +// Return value : Maximum absolute value in vector. +typedef int32_t (*MaxAbsValueW32)(const int32_t* vector, size_t length); +extern const MaxAbsValueW32 WebRtcSpl_MaxAbsValueW32; +int32_t WebRtcSpl_MaxAbsValueW32C(const int32_t* vector, size_t length); +#if defined(WEBRTC_HAS_NEON) +int32_t WebRtcSpl_MaxAbsValueW32Neon(const int32_t* vector, size_t length); +#endif +#if defined(MIPS_DSP_R1_LE) +int32_t WebRtcSpl_MaxAbsValueW32_mips(const int32_t* vector, size_t length); +#endif + +// Returns the maximum value of a 16-bit vector. +// +// Input: +// - vector : 16-bit input vector. +// - length : Number of samples in vector. +// +// Return value : Maximum sample value in `vector`. +typedef int16_t (*MaxValueW16)(const int16_t* vector, size_t length); +extern const MaxValueW16 WebRtcSpl_MaxValueW16; +int16_t WebRtcSpl_MaxValueW16C(const int16_t* vector, size_t length); +#if defined(WEBRTC_HAS_NEON) +int16_t WebRtcSpl_MaxValueW16Neon(const int16_t* vector, size_t length); +#endif +#if defined(MIPS32_LE) +int16_t WebRtcSpl_MaxValueW16_mips(const int16_t* vector, size_t length); +#endif + +// Returns the maximum value of a 32-bit vector. +// +// Input: +// - vector : 32-bit input vector. +// - length : Number of samples in vector. +// +// Return value : Maximum sample value in `vector`. +typedef int32_t (*MaxValueW32)(const int32_t* vector, size_t length); +extern const MaxValueW32 WebRtcSpl_MaxValueW32; +int32_t WebRtcSpl_MaxValueW32C(const int32_t* vector, size_t length); +#if defined(WEBRTC_HAS_NEON) +int32_t WebRtcSpl_MaxValueW32Neon(const int32_t* vector, size_t length); +#endif +#if defined(MIPS32_LE) +int32_t WebRtcSpl_MaxValueW32_mips(const int32_t* vector, size_t length); +#endif + +// Returns the minimum value of a 16-bit vector. +// +// Input: +// - vector : 16-bit input vector. +// - length : Number of samples in vector. +// +// Return value : Minimum sample value in `vector`. +typedef int16_t (*MinValueW16)(const int16_t* vector, size_t length); +extern const MinValueW16 WebRtcSpl_MinValueW16; +int16_t WebRtcSpl_MinValueW16C(const int16_t* vector, size_t length); +#if defined(WEBRTC_HAS_NEON) +int16_t WebRtcSpl_MinValueW16Neon(const int16_t* vector, size_t length); +#endif +#if defined(MIPS32_LE) +int16_t WebRtcSpl_MinValueW16_mips(const int16_t* vector, size_t length); +#endif + +// Returns the minimum value of a 32-bit vector. +// +// Input: +// - vector : 32-bit input vector. +// - length : Number of samples in vector. +// +// Return value : Minimum sample value in `vector`. +typedef int32_t (*MinValueW32)(const int32_t* vector, size_t length); +extern const MinValueW32 WebRtcSpl_MinValueW32; +int32_t WebRtcSpl_MinValueW32C(const int32_t* vector, size_t length); +#if defined(WEBRTC_HAS_NEON) +int32_t WebRtcSpl_MinValueW32Neon(const int32_t* vector, size_t length); +#endif +#if defined(MIPS32_LE) +int32_t WebRtcSpl_MinValueW32_mips(const int32_t* vector, size_t length); +#endif + +// Returns both the minimum and maximum values of a 16-bit vector. +// +// Input: +// - vector : 16-bit input vector. +// - length : Number of samples in vector. +// Output: +// - max_val : Maximum sample value in `vector`. +// - min_val : Minimum sample value in `vector`. +void WebRtcSpl_MinMaxW16(const int16_t* vector, + size_t length, + int16_t* min_val, + int16_t* max_val); +#if defined(WEBRTC_HAS_NEON) +void WebRtcSpl_MinMaxW16Neon(const int16_t* vector, + size_t length, + int16_t* min_val, + int16_t* max_val); +#endif + +// Returns the vector index to the largest absolute value of a 16-bit vector. +// +// Input: +// - vector : 16-bit input vector. +// - length : Number of samples in vector. +// +// Return value : Index to the maximum absolute value in vector. +// If there are multiple equal maxima, return the index of the +// first. -32768 will always have precedence over 32767 (despite +// -32768 presenting an int16 absolute value of 32767). +size_t WebRtcSpl_MaxAbsIndexW16(const int16_t* vector, size_t length); + +// Returns the element with the largest absolute value of a 16-bit vector. Note +// that this function can return a negative value. +// +// Input: +// - vector : 16-bit input vector. +// - length : Number of samples in vector. +// +// Return value : The element with the largest absolute value. Note that this +// may be a negative value. +int16_t WebRtcSpl_MaxAbsElementW16(const int16_t* vector, size_t length); + +// Returns the vector index to the maximum sample value of a 16-bit vector. +// +// Input: +// - vector : 16-bit input vector. +// - length : Number of samples in vector. +// +// Return value : Index to the maximum value in vector (if multiple +// indexes have the maximum, return the first). +size_t WebRtcSpl_MaxIndexW16(const int16_t* vector, size_t length); + +// Returns the vector index to the maximum sample value of a 32-bit vector. +// +// Input: +// - vector : 32-bit input vector. +// - length : Number of samples in vector. +// +// Return value : Index to the maximum value in vector (if multiple +// indexes have the maximum, return the first). +size_t WebRtcSpl_MaxIndexW32(const int32_t* vector, size_t length); + +// Returns the vector index to the minimum sample value of a 16-bit vector. +// +// Input: +// - vector : 16-bit input vector. +// - length : Number of samples in vector. +// +// Return value : Index to the minimum value in vector (if multiple +// indexes have the minimum, return the first). +size_t WebRtcSpl_MinIndexW16(const int16_t* vector, size_t length); + +// Returns the vector index to the minimum sample value of a 32-bit vector. +// +// Input: +// - vector : 32-bit input vector. +// - length : Number of samples in vector. +// +// Return value : Index to the minimum value in vector (if multiple +// indexes have the minimum, return the first). +size_t WebRtcSpl_MinIndexW32(const int32_t* vector, size_t length); + +// End: Minimum and maximum operations. + +// Vector scaling operations. Implementation in vector_scaling_operations.c. +// Description at bottom of file. +void WebRtcSpl_VectorBitShiftW16(int16_t* out_vector, + size_t vector_length, + const int16_t* in_vector, + int16_t right_shifts); +void WebRtcSpl_VectorBitShiftW32(int32_t* out_vector, + size_t vector_length, + const int32_t* in_vector, + int16_t right_shifts); +void WebRtcSpl_VectorBitShiftW32ToW16(int16_t* out_vector, + size_t vector_length, + const int32_t* in_vector, + int right_shifts); +void WebRtcSpl_ScaleVector(const int16_t* in_vector, + int16_t* out_vector, + int16_t gain, + size_t vector_length, + int16_t right_shifts); +void WebRtcSpl_ScaleVectorWithSat(const int16_t* in_vector, + int16_t* out_vector, + int16_t gain, + size_t vector_length, + int16_t right_shifts); +void WebRtcSpl_ScaleAndAddVectors(const int16_t* in_vector1, + int16_t gain1, + int right_shifts1, + const int16_t* in_vector2, + int16_t gain2, + int right_shifts2, + int16_t* out_vector, + size_t vector_length); + +// The functions (with related pointer) perform the vector operation: +// out_vector[k] = ((scale1 * in_vector1[k]) + (scale2 * in_vector2[k]) +// + round_value) >> right_shifts, +// where round_value = (1 << right_shifts) >> 1. +// +// Input: +// - in_vector1 : Input vector 1 +// - in_vector1_scale : Gain to be used for vector 1 +// - in_vector2 : Input vector 2 +// - in_vector2_scale : Gain to be used for vector 2 +// - right_shifts : Number of right bit shifts to be applied +// - length : Number of elements in the input vectors +// +// Output: +// - out_vector : Output vector +// Return value : 0 if OK, -1 if (in_vector1 == null +// || in_vector2 == null || out_vector == null +// || length <= 0 || right_shift < 0). +typedef int (*ScaleAndAddVectorsWithRound)(const int16_t* in_vector1, + int16_t in_vector1_scale, + const int16_t* in_vector2, + int16_t in_vector2_scale, + int right_shifts, + int16_t* out_vector, + size_t length); +extern const ScaleAndAddVectorsWithRound WebRtcSpl_ScaleAndAddVectorsWithRound; +int WebRtcSpl_ScaleAndAddVectorsWithRoundC(const int16_t* in_vector1, + int16_t in_vector1_scale, + const int16_t* in_vector2, + int16_t in_vector2_scale, + int right_shifts, + int16_t* out_vector, + size_t length); +#if defined(MIPS_DSP_R1_LE) +int WebRtcSpl_ScaleAndAddVectorsWithRound_mips(const int16_t* in_vector1, + int16_t in_vector1_scale, + const int16_t* in_vector2, + int16_t in_vector2_scale, + int right_shifts, + int16_t* out_vector, + size_t length); +#endif +// End: Vector scaling operations. + +// iLBC specific functions. Implementations in ilbc_specific_functions.c. +// Description at bottom of file. +void WebRtcSpl_ReverseOrderMultArrayElements(int16_t* out_vector, + const int16_t* in_vector, + const int16_t* window, + size_t vector_length, + int16_t right_shifts); +void WebRtcSpl_ElementwiseVectorMult(int16_t* out_vector, + const int16_t* in_vector, + const int16_t* window, + size_t vector_length, + int16_t right_shifts); +void WebRtcSpl_AddVectorsAndShift(int16_t* out_vector, + const int16_t* in_vector1, + const int16_t* in_vector2, + size_t vector_length, + int16_t right_shifts); +void WebRtcSpl_AddAffineVectorToVector(int16_t* out_vector, + const int16_t* in_vector, + int16_t gain, + int32_t add_constant, + int16_t right_shifts, + size_t vector_length); +void WebRtcSpl_AffineTransformVector(int16_t* out_vector, + const int16_t* in_vector, + int16_t gain, + int32_t add_constant, + int16_t right_shifts, + size_t vector_length); +// End: iLBC specific functions. + +// Signal processing operations. + +// A 32-bit fix-point implementation of auto-correlation computation +// +// Input: +// - in_vector : Vector to calculate autocorrelation upon +// - in_vector_length : Length (in samples) of `vector` +// - order : The order up to which the autocorrelation should be +// calculated +// +// Output: +// - result : auto-correlation values (values should be seen +// relative to each other since the absolute values +// might have been down shifted to avoid overflow) +// +// - scale : The number of left shifts required to obtain the +// auto-correlation in Q0 +// +// Return value : Number of samples in `result`, i.e. (order+1) +size_t WebRtcSpl_AutoCorrelation(const int16_t* in_vector, + size_t in_vector_length, + size_t order, + int32_t* result, + int* scale); + +// A 32-bit fix-point implementation of the Levinson-Durbin algorithm that +// does NOT use the 64 bit class +// +// Input: +// - auto_corr : Vector with autocorrelation values of length >= `order`+1 +// - order : The LPC filter order (support up to order 20) +// +// Output: +// - lpc_coef : lpc_coef[0..order] LPC coefficients in Q12 +// - refl_coef : refl_coef[0...order-1]| Reflection coefficients in Q15 +// +// Return value : 1 for stable 0 for unstable +int16_t WebRtcSpl_LevinsonDurbin(const int32_t* auto_corr, + int16_t* lpc_coef, + int16_t* refl_coef, + size_t order); + +// Converts reflection coefficients `refl_coef` to LPC coefficients `lpc_coef`. +// This version is a 16 bit operation. +// +// NOTE: The 16 bit refl_coef -> lpc_coef conversion might result in a +// "slightly unstable" filter (i.e., a pole just outside the unit circle) in +// "rare" cases even if the reflection coefficients are stable. +// +// Input: +// - refl_coef : Reflection coefficients in Q15 that should be converted +// to LPC coefficients +// - use_order : Number of coefficients in `refl_coef` +// +// Output: +// - lpc_coef : LPC coefficients in Q12 +void WebRtcSpl_ReflCoefToLpc(const int16_t* refl_coef, + int use_order, + int16_t* lpc_coef); + +// Converts LPC coefficients `lpc_coef` to reflection coefficients `refl_coef`. +// This version is a 16 bit operation. +// The conversion is implemented by the step-down algorithm. +// +// Input: +// - lpc_coef : LPC coefficients in Q12, that should be converted to +// reflection coefficients +// - use_order : Number of coefficients in `lpc_coef` +// +// Output: +// - refl_coef : Reflection coefficients in Q15. +void WebRtcSpl_LpcToReflCoef(int16_t* lpc_coef, + int use_order, + int16_t* refl_coef); + +// Calculates reflection coefficients (16 bit) from auto-correlation values +// +// Input: +// - auto_corr : Auto-correlation values +// - use_order : Number of coefficients wanted be calculated +// +// Output: +// - refl_coef : Reflection coefficients in Q15. +void WebRtcSpl_AutoCorrToReflCoef(const int32_t* auto_corr, + int use_order, + int16_t* refl_coef); + +// The functions (with related pointer) calculate the cross-correlation between +// two sequences `seq1` and `seq2`. +// `seq1` is fixed and `seq2` slides as the pointer is increased with the +// amount `step_seq2`. Note the arguments should obey the relationship: +// `dim_seq` - 1 + `step_seq2` * (`dim_cross_correlation` - 1) < +// buffer size of `seq2` +// +// Input: +// - seq1 : First sequence (fixed throughout the correlation) +// - seq2 : Second sequence (slides `step_vector2` for each +// new correlation) +// - dim_seq : Number of samples to use in the cross-correlation +// - dim_cross_correlation : Number of cross-correlations to calculate (the +// start position for `vector2` is updated for each +// new one) +// - right_shifts : Number of right bit shifts to use. This will +// become the output Q-domain. +// - step_seq2 : How many (positive or negative) steps the +// `vector2` pointer should be updated for each new +// cross-correlation value. +// +// Output: +// - cross_correlation : The cross-correlation in Q(-right_shifts) +typedef void (*CrossCorrelation)(int32_t* cross_correlation, + const int16_t* seq1, + const int16_t* seq2, + size_t dim_seq, + size_t dim_cross_correlation, + int right_shifts, + int step_seq2); +extern const CrossCorrelation WebRtcSpl_CrossCorrelation; +void WebRtcSpl_CrossCorrelationC(int32_t* cross_correlation, + const int16_t* seq1, + const int16_t* seq2, + size_t dim_seq, + size_t dim_cross_correlation, + int right_shifts, + int step_seq2); +#if defined(WEBRTC_HAS_NEON) +void WebRtcSpl_CrossCorrelationNeon(int32_t* cross_correlation, + const int16_t* seq1, + const int16_t* seq2, + size_t dim_seq, + size_t dim_cross_correlation, + int right_shifts, + int step_seq2); +#endif +#if defined(MIPS32_LE) +void WebRtcSpl_CrossCorrelation_mips(int32_t* cross_correlation, + const int16_t* seq1, + const int16_t* seq2, + size_t dim_seq, + size_t dim_cross_correlation, + int right_shifts, + int step_seq2); +#endif + +// Creates (the first half of) a Hanning window. Size must be at least 1 and +// at most 512. +// +// Input: +// - size : Length of the requested Hanning window (1 to 512) +// +// Output: +// - window : Hanning vector in Q14. +void WebRtcSpl_GetHanningWindow(int16_t* window, size_t size); + +// Calculates y[k] = sqrt(1 - x[k]^2) for each element of the input vector +// `in_vector`. Input and output values are in Q15. +// +// Inputs: +// - in_vector : Values to calculate sqrt(1 - x^2) of +// - vector_length : Length of vector `in_vector` +// +// Output: +// - out_vector : Output values in Q15 +void WebRtcSpl_SqrtOfOneMinusXSquared(int16_t* in_vector, + size_t vector_length, + int16_t* out_vector); +// End: Signal processing operations. + +// Randomization functions. Implementations collected in +// randomization_functions.c and descriptions at bottom of this file. +int16_t WebRtcSpl_RandU(uint32_t* seed); +int16_t WebRtcSpl_RandN(uint32_t* seed); +int16_t WebRtcSpl_RandUArray(int16_t* vector, + int16_t vector_length, + uint32_t* seed); +// End: Randomization functions. + +// Math functions +int32_t WebRtcSpl_Sqrt(int32_t value); + +// Divisions. Implementations collected in division_operations.c and +// descriptions at bottom of this file. +uint32_t WebRtcSpl_DivU32U16(uint32_t num, uint16_t den); +int32_t WebRtcSpl_DivW32W16(int32_t num, int16_t den); +int16_t WebRtcSpl_DivW32W16ResW16(int32_t num, int16_t den); +int32_t WebRtcSpl_DivResultInQ31(int32_t num, int32_t den); +int32_t WebRtcSpl_DivW32HiLow(int32_t num, int16_t den_hi, int16_t den_low); +// End: Divisions. + +int32_t WebRtcSpl_Energy(int16_t* vector, + size_t vector_length, + int* scale_factor); + +// Filter operations. +size_t WebRtcSpl_FilterAR(const int16_t* ar_coef, + size_t ar_coef_length, + const int16_t* in_vector, + size_t in_vector_length, + int16_t* filter_state, + size_t filter_state_length, + int16_t* filter_state_low, + size_t filter_state_low_length, + int16_t* out_vector, + int16_t* out_vector_low, + size_t out_vector_low_length); + +// WebRtcSpl_FilterMAFastQ12(...) +// +// Performs a MA filtering on a vector in Q12 +// +// Input: +// - in_vector : Input samples (state in positions +// in_vector[-order] .. in_vector[-1]) +// - ma_coef : Filter coefficients (in Q12) +// - ma_coef_length : Number of B coefficients (order+1) +// - vector_length : Number of samples to be filtered +// +// Output: +// - out_vector : Filtered samples +// +void WebRtcSpl_FilterMAFastQ12(const int16_t* in_vector, + int16_t* out_vector, + const int16_t* ma_coef, + size_t ma_coef_length, + size_t vector_length); + +// Performs a AR filtering on a vector in Q12 +// Input: +// - data_in : Input samples +// - data_out : State information in positions +// data_out[-order] .. data_out[-1] +// - coefficients : Filter coefficients (in Q12) +// - coefficients_length: Number of coefficients (order+1) +// - data_length : Number of samples to be filtered +// Output: +// - data_out : Filtered samples +void WebRtcSpl_FilterARFastQ12(const int16_t* data_in, + int16_t* data_out, + const int16_t* __restrict coefficients, + size_t coefficients_length, + size_t data_length); + +// The functions (with related pointer) perform a MA down sampling filter +// on a vector. +// Input: +// - data_in : Input samples (state in positions +// data_in[-order] .. data_in[-1]) +// - data_in_length : Number of samples in `data_in` to be filtered. +// This must be at least +// `delay` + `factor`*(`out_vector_length`-1) + 1) +// - data_out_length : Number of down sampled samples desired +// - coefficients : Filter coefficients (in Q12) +// - coefficients_length: Number of coefficients (order+1) +// - factor : Decimation factor +// - delay : Delay of filter (compensated for in out_vector) +// Output: +// - data_out : Filtered samples +// Return value : 0 if OK, -1 if `in_vector` is too short +typedef int (*DownsampleFast)(const int16_t* data_in, + size_t data_in_length, + int16_t* data_out, + size_t data_out_length, + const int16_t* __restrict coefficients, + size_t coefficients_length, + int factor, + size_t delay); +extern const DownsampleFast WebRtcSpl_DownsampleFast; +int WebRtcSpl_DownsampleFastC(const int16_t* data_in, + size_t data_in_length, + int16_t* data_out, + size_t data_out_length, + const int16_t* __restrict coefficients, + size_t coefficients_length, + int factor, + size_t delay); +#if defined(WEBRTC_HAS_NEON) +int WebRtcSpl_DownsampleFastNeon(const int16_t* data_in, + size_t data_in_length, + int16_t* data_out, + size_t data_out_length, + const int16_t* __restrict coefficients, + size_t coefficients_length, + int factor, + size_t delay); +#endif +#if defined(MIPS32_LE) +int WebRtcSpl_DownsampleFast_mips(const int16_t* data_in, + size_t data_in_length, + int16_t* data_out, + size_t data_out_length, + const int16_t* __restrict coefficients, + size_t coefficients_length, + int factor, + size_t delay); +#endif + +// End: Filter operations. + +// FFT operations + +int WebRtcSpl_ComplexFFT(int16_t vector[], int stages, int mode); +int WebRtcSpl_ComplexIFFT(int16_t vector[], int stages, int mode); + +// Treat a 16-bit complex data buffer `complex_data` as an array of 32-bit +// values, and swap elements whose indexes are bit-reverses of each other. +// +// Input: +// - complex_data : Complex data buffer containing 2^`stages` real +// elements interleaved with 2^`stages` imaginary +// elements: [Re Im Re Im Re Im....] +// - stages : Number of FFT stages. Must be at least 3 and at most +// 10, since the table WebRtcSpl_kSinTable1024[] is 1024 +// elements long. +// +// Output: +// - complex_data : The complex data buffer. + +void WebRtcSpl_ComplexBitReverse(int16_t* __restrict complex_data, int stages); + +// End: FFT operations + +/************************************************************ + * + * RESAMPLING FUNCTIONS AND THEIR STRUCTS ARE DEFINED BELOW + * + ************************************************************/ + +/******************************************************************* + * resample.c + * + * Includes the following resampling combinations + * 22 kHz -> 16 kHz + * 16 kHz -> 22 kHz + * 22 kHz -> 8 kHz + * 8 kHz -> 22 kHz + * + ******************************************************************/ + +// state structure for 22 -> 16 resampler +typedef struct { + int32_t S_22_44[8]; + int32_t S_44_32[8]; + int32_t S_32_16[8]; +} WebRtcSpl_State22khzTo16khz; + +void WebRtcSpl_Resample22khzTo16khz(const int16_t* in, + int16_t* out, + WebRtcSpl_State22khzTo16khz* state, + int32_t* tmpmem); + +void WebRtcSpl_ResetResample22khzTo16khz(WebRtcSpl_State22khzTo16khz* state); + +// state structure for 16 -> 22 resampler +typedef struct { + int32_t S_16_32[8]; + int32_t S_32_22[8]; +} WebRtcSpl_State16khzTo22khz; + +void WebRtcSpl_Resample16khzTo22khz(const int16_t* in, + int16_t* out, + WebRtcSpl_State16khzTo22khz* state, + int32_t* tmpmem); + +void WebRtcSpl_ResetResample16khzTo22khz(WebRtcSpl_State16khzTo22khz* state); + +// state structure for 22 -> 8 resampler +typedef struct { + int32_t S_22_22[16]; + int32_t S_22_16[8]; + int32_t S_16_8[8]; +} WebRtcSpl_State22khzTo8khz; + +void WebRtcSpl_Resample22khzTo8khz(const int16_t* in, + int16_t* out, + WebRtcSpl_State22khzTo8khz* state, + int32_t* tmpmem); + +void WebRtcSpl_ResetResample22khzTo8khz(WebRtcSpl_State22khzTo8khz* state); + +// state structure for 8 -> 22 resampler +typedef struct { + int32_t S_8_16[8]; + int32_t S_16_11[8]; + int32_t S_11_22[8]; +} WebRtcSpl_State8khzTo22khz; + +void WebRtcSpl_Resample8khzTo22khz(const int16_t* in, + int16_t* out, + WebRtcSpl_State8khzTo22khz* state, + int32_t* tmpmem); + +void WebRtcSpl_ResetResample8khzTo22khz(WebRtcSpl_State8khzTo22khz* state); + +/******************************************************************* + * resample_fractional.c + * Functions for internal use in the other resample functions + * + * Includes the following resampling combinations + * 48 kHz -> 32 kHz + * 32 kHz -> 24 kHz + * 44 kHz -> 32 kHz + * + ******************************************************************/ + +void WebRtcSpl_Resample48khzTo32khz(const int32_t* In, int32_t* Out, size_t K); + +void WebRtcSpl_Resample32khzTo24khz(const int32_t* In, int32_t* Out, size_t K); + +void WebRtcSpl_Resample44khzTo32khz(const int32_t* In, int32_t* Out, size_t K); + +/******************************************************************* + * resample_48khz.c + * + * Includes the following resampling combinations + * 48 kHz -> 16 kHz + * 16 kHz -> 48 kHz + * 48 kHz -> 8 kHz + * 8 kHz -> 48 kHz + * + ******************************************************************/ + +typedef struct { + int32_t S_48_48[16]; + int32_t S_48_32[8]; + int32_t S_32_16[8]; +} WebRtcSpl_State48khzTo16khz; + +void WebRtcSpl_Resample48khzTo16khz(const int16_t* in, + int16_t* out, + WebRtcSpl_State48khzTo16khz* state, + int32_t* tmpmem); + +void WebRtcSpl_ResetResample48khzTo16khz(WebRtcSpl_State48khzTo16khz* state); + +typedef struct { + int32_t S_16_32[8]; + int32_t S_32_24[8]; + int32_t S_24_48[8]; +} WebRtcSpl_State16khzTo48khz; + +void WebRtcSpl_Resample16khzTo48khz(const int16_t* in, + int16_t* out, + WebRtcSpl_State16khzTo48khz* state, + int32_t* tmpmem); + +void WebRtcSpl_ResetResample16khzTo48khz(WebRtcSpl_State16khzTo48khz* state); + +typedef struct { + int32_t S_48_24[8]; + int32_t S_24_24[16]; + int32_t S_24_16[8]; + int32_t S_16_8[8]; +} WebRtcSpl_State48khzTo8khz; + +void WebRtcSpl_Resample48khzTo8khz(const int16_t* in, + int16_t* out, + WebRtcSpl_State48khzTo8khz* state, + int32_t* tmpmem); + +void WebRtcSpl_ResetResample48khzTo8khz(WebRtcSpl_State48khzTo8khz* state); + +typedef struct { + int32_t S_8_16[8]; + int32_t S_16_12[8]; + int32_t S_12_24[8]; + int32_t S_24_48[8]; +} WebRtcSpl_State8khzTo48khz; + +void WebRtcSpl_Resample8khzTo48khz(const int16_t* in, + int16_t* out, + WebRtcSpl_State8khzTo48khz* state, + int32_t* tmpmem); + +void WebRtcSpl_ResetResample8khzTo48khz(WebRtcSpl_State8khzTo48khz* state); + +/******************************************************************* + * resample_by_2.c + * + * Includes down and up sampling by a factor of two. + * + ******************************************************************/ + +void WebRtcSpl_DownsampleBy2(const int16_t* in, + size_t len, + int16_t* out, + int32_t* filtState); + +void WebRtcSpl_UpsampleBy2(const int16_t* in, + size_t len, + int16_t* out, + int32_t* filtState); + +/************************************************************ + * END OF RESAMPLING FUNCTIONS + ************************************************************/ +void WebRtcSpl_AnalysisQMF(const int16_t* in_data, + size_t in_data_length, + int16_t* low_band, + int16_t* high_band, + int32_t* filter_state1, + int32_t* filter_state2); +void WebRtcSpl_SynthesisQMF(const int16_t* low_band, + const int16_t* high_band, + size_t band_length, + int16_t* out_data, + int32_t* filter_state1, + int32_t* filter_state2); + +#ifdef __cplusplus +} +#endif // __cplusplus +#endif // COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SIGNAL_PROCESSING_LIBRARY_H_ + +// +// WebRtcSpl_AddSatW16(...) +// WebRtcSpl_AddSatW32(...) +// +// Returns the result of a saturated 16-bit, respectively 32-bit, addition of +// the numbers specified by the `var1` and `var2` parameters. +// +// Input: +// - var1 : Input variable 1 +// - var2 : Input variable 2 +// +// Return value : Added and saturated value +// + +// +// WebRtcSpl_SubSatW16(...) +// WebRtcSpl_SubSatW32(...) +// +// Returns the result of a saturated 16-bit, respectively 32-bit, subtraction +// of the numbers specified by the `var1` and `var2` parameters. +// +// Input: +// - var1 : Input variable 1 +// - var2 : Input variable 2 +// +// Returned value : Subtracted and saturated value +// + +// +// WebRtcSpl_GetSizeInBits(...) +// +// Returns the # of bits that are needed at the most to represent the number +// specified by the `value` parameter. +// +// Input: +// - value : Input value +// +// Return value : Number of bits needed to represent `value` +// + +// +// WebRtcSpl_NormW32(...) +// +// Norm returns the # of left shifts required to 32-bit normalize the 32-bit +// signed number specified by the `value` parameter. +// +// Input: +// - value : Input value +// +// Return value : Number of bit shifts needed to 32-bit normalize `value` +// + +// +// WebRtcSpl_NormW16(...) +// +// Norm returns the # of left shifts required to 16-bit normalize the 16-bit +// signed number specified by the `value` parameter. +// +// Input: +// - value : Input value +// +// Return value : Number of bit shifts needed to 32-bit normalize `value` +// + +// +// WebRtcSpl_NormU32(...) +// +// Norm returns the # of left shifts required to 32-bit normalize the unsigned +// 32-bit number specified by the `value` parameter. +// +// Input: +// - value : Input value +// +// Return value : Number of bit shifts needed to 32-bit normalize `value` +// + +// +// WebRtcSpl_GetScalingSquare(...) +// +// Returns the # of bits required to scale the samples specified in the +// `in_vector` parameter so that, if the squares of the samples are added the +// # of times specified by the `times` parameter, the 32-bit addition will not +// overflow (result in int32_t). +// +// Input: +// - in_vector : Input vector to check scaling on +// - in_vector_length : Samples in `in_vector` +// - times : Number of additions to be performed +// +// Return value : Number of right bit shifts needed to avoid +// overflow in the addition calculation +// + +// +// WebRtcSpl_MemSetW16(...) +// +// Sets all the values in the int16_t vector `vector` of length +// `vector_length` to the specified value `set_value` +// +// Input: +// - vector : Pointer to the int16_t vector +// - set_value : Value specified +// - vector_length : Length of vector +// + +// +// WebRtcSpl_MemSetW32(...) +// +// Sets all the values in the int32_t vector `vector` of length +// `vector_length` to the specified value `set_value` +// +// Input: +// - vector : Pointer to the int16_t vector +// - set_value : Value specified +// - vector_length : Length of vector +// + +// +// WebRtcSpl_MemCpyReversedOrder(...) +// +// Copies all the values from the source int16_t vector `in_vector` to a +// destination int16_t vector `out_vector`. It is done in reversed order, +// meaning that the first sample of `in_vector` is copied to the last sample of +// the `out_vector`. The procedure continues until the last sample of +// `in_vector` has been copied to the first sample of `out_vector`. This +// creates a reversed vector. Used in e.g. prediction in iLBC. +// +// Input: +// - in_vector : Pointer to the first sample in a int16_t vector +// of length `length` +// - vector_length : Number of elements to copy +// +// Output: +// - out_vector : Pointer to the last sample in a int16_t vector +// of length `length` +// + +// +// WebRtcSpl_CopyFromEndW16(...) +// +// Copies the rightmost `samples` of `in_vector` (of length `in_vector_length`) +// to the vector `out_vector`. +// +// Input: +// - in_vector : Input vector +// - in_vector_length : Number of samples in `in_vector` +// - samples : Number of samples to extract (from right side) +// from `in_vector` +// +// Output: +// - out_vector : Vector with the requested samples +// + +// +// WebRtcSpl_ZerosArrayW16(...) +// WebRtcSpl_ZerosArrayW32(...) +// +// Inserts the value "zero" in all positions of a w16 and a w32 vector +// respectively. +// +// Input: +// - vector_length : Number of samples in vector +// +// Output: +// - vector : Vector containing all zeros +// + +// +// WebRtcSpl_VectorBitShiftW16(...) +// WebRtcSpl_VectorBitShiftW32(...) +// +// Bit shifts all the values in a vector up or downwards. Different calls for +// int16_t and int32_t vectors respectively. +// +// Input: +// - vector_length : Length of vector +// - in_vector : Pointer to the vector that should be bit shifted +// - right_shifts : Number of right bit shifts (negative value gives left +// shifts) +// +// Output: +// - out_vector : Pointer to the result vector (can be the same as +// `in_vector`) +// + +// +// WebRtcSpl_VectorBitShiftW32ToW16(...) +// +// Bit shifts all the values in a int32_t vector up or downwards and +// stores the result as an int16_t vector. The function will saturate the +// signal if needed, before storing in the output vector. +// +// Input: +// - vector_length : Length of vector +// - in_vector : Pointer to the vector that should be bit shifted +// - right_shifts : Number of right bit shifts (negative value gives left +// shifts) +// +// Output: +// - out_vector : Pointer to the result vector (can be the same as +// `in_vector`) +// + +// +// WebRtcSpl_ScaleVector(...) +// +// Performs the vector operation: +// out_vector[k] = (gain*in_vector[k])>>right_shifts +// +// Input: +// - in_vector : Input vector +// - gain : Scaling gain +// - vector_length : Elements in the `in_vector` +// - right_shifts : Number of right bit shifts applied +// +// Output: +// - out_vector : Output vector (can be the same as `in_vector`) +// + +// +// WebRtcSpl_ScaleVectorWithSat(...) +// +// Performs the vector operation: +// out_vector[k] = SATURATE( (gain*in_vector[k])>>right_shifts ) +// +// Input: +// - in_vector : Input vector +// - gain : Scaling gain +// - vector_length : Elements in the `in_vector` +// - right_shifts : Number of right bit shifts applied +// +// Output: +// - out_vector : Output vector (can be the same as `in_vector`) +// + +// +// WebRtcSpl_ScaleAndAddVectors(...) +// +// Performs the vector operation: +// out_vector[k] = (gain1*in_vector1[k])>>right_shifts1 +// + (gain2*in_vector2[k])>>right_shifts2 +// +// Input: +// - in_vector1 : Input vector 1 +// - gain1 : Gain to be used for vector 1 +// - right_shifts1 : Right bit shift to be used for vector 1 +// - in_vector2 : Input vector 2 +// - gain2 : Gain to be used for vector 2 +// - right_shifts2 : Right bit shift to be used for vector 2 +// - vector_length : Elements in the input vectors +// +// Output: +// - out_vector : Output vector +// + +// +// WebRtcSpl_ReverseOrderMultArrayElements(...) +// +// Performs the vector operation: +// out_vector[n] = (in_vector[n]*window[-n])>>right_shifts +// +// Input: +// - in_vector : Input vector +// - window : Window vector (should be reversed). The pointer +// should be set to the last value in the vector +// - right_shifts : Number of right bit shift to be applied after the +// multiplication +// - vector_length : Number of elements in `in_vector` +// +// Output: +// - out_vector : Output vector (can be same as `in_vector`) +// + +// +// WebRtcSpl_ElementwiseVectorMult(...) +// +// Performs the vector operation: +// out_vector[n] = (in_vector[n]*window[n])>>right_shifts +// +// Input: +// - in_vector : Input vector +// - window : Window vector. +// - right_shifts : Number of right bit shift to be applied after the +// multiplication +// - vector_length : Number of elements in `in_vector` +// +// Output: +// - out_vector : Output vector (can be same as `in_vector`) +// + +// +// WebRtcSpl_AddVectorsAndShift(...) +// +// Performs the vector operation: +// out_vector[k] = (in_vector1[k] + in_vector2[k])>>right_shifts +// +// Input: +// - in_vector1 : Input vector 1 +// - in_vector2 : Input vector 2 +// - right_shifts : Number of right bit shift to be applied after the +// multiplication +// - vector_length : Number of elements in `in_vector1` and `in_vector2` +// +// Output: +// - out_vector : Output vector (can be same as `in_vector1`) +// + +// +// WebRtcSpl_AddAffineVectorToVector(...) +// +// Adds an affine transformed vector to another vector `out_vector`, i.e, +// performs +// out_vector[k] += (in_vector[k]*gain+add_constant)>>right_shifts +// +// Input: +// - in_vector : Input vector +// - gain : Gain value, used to multiply the in vector with +// - add_constant : Constant value to add (usually 1<<(right_shifts-1), +// but others can be used as well +// - right_shifts : Number of right bit shifts (0-16) +// - vector_length : Number of samples in `in_vector` and `out_vector` +// +// Output: +// - out_vector : Vector with the output +// + +// +// WebRtcSpl_AffineTransformVector(...) +// +// Affine transforms a vector, i.e, performs +// out_vector[k] = (in_vector[k]*gain+add_constant)>>right_shifts +// +// Input: +// - in_vector : Input vector +// - gain : Gain value, used to multiply the in vector with +// - add_constant : Constant value to add (usually 1<<(right_shifts-1), +// but others can be used as well +// - right_shifts : Number of right bit shifts (0-16) +// - vector_length : Number of samples in `in_vector` and `out_vector` +// +// Output: +// - out_vector : Vector with the output +// + +// +// WebRtcSpl_IncreaseSeed(...) +// +// Increases the seed (and returns the new value) +// +// Input: +// - seed : Seed for random calculation +// +// Output: +// - seed : Updated seed value +// +// Return value : The new seed value +// + +// +// WebRtcSpl_RandU(...) +// +// Produces a uniformly distributed value in the int16_t range +// +// Input: +// - seed : Seed for random calculation +// +// Output: +// - seed : Updated seed value +// +// Return value : Uniformly distributed value in the range +// [Word16_MIN...Word16_MAX] +// + +// +// WebRtcSpl_RandN(...) +// +// Produces a normal distributed value in the int16_t range +// +// Input: +// - seed : Seed for random calculation +// +// Output: +// - seed : Updated seed value +// +// Return value : N(0,1) value in the Q13 domain +// + +// +// WebRtcSpl_RandUArray(...) +// +// Produces a uniformly distributed vector with elements in the int16_t +// range +// +// Input: +// - vector_length : Samples wanted in the vector +// - seed : Seed for random calculation +// +// Output: +// - vector : Vector with the uniform values +// - seed : Updated seed value +// +// Return value : Number of samples in vector, i.e., `vector_length` +// + +// +// WebRtcSpl_Sqrt(...) +// +// Returns the square root of the input value `value`. The precision of this +// function is integer precision, i.e., sqrt(8) gives 2 as answer. +// If `value` is a negative number then 0 is returned. +// +// Algorithm: +// +// A sixth order Taylor Series expansion is used here to compute the square +// root of a number y^0.5 = (1+x)^0.5 +// where +// x = y-1 +// = 1+(x/2)-0.5*((x/2)^2+0.5*((x/2)^3-0.625*((x/2)^4+0.875*((x/2)^5) +// 0.5 <= x < 1 +// +// Input: +// - value : Value to calculate sqrt of +// +// Return value : Result of the sqrt calculation +// + +// +// WebRtcSpl_DivU32U16(...) +// +// Divides a uint32_t `num` by a uint16_t `den`. +// +// If `den`==0, (uint32_t)0xFFFFFFFF is returned. +// +// Input: +// - num : Numerator +// - den : Denominator +// +// Return value : Result of the division (as a uint32_t), i.e., the +// integer part of num/den. +// + +// +// WebRtcSpl_DivW32W16(...) +// +// Divides a int32_t `num` by a int16_t `den`. +// +// If `den`==0, (int32_t)0x7FFFFFFF is returned. +// +// Input: +// - num : Numerator +// - den : Denominator +// +// Return value : Result of the division (as a int32_t), i.e., the +// integer part of num/den. +// + +// +// WebRtcSpl_DivW32W16ResW16(...) +// +// Divides a int32_t `num` by a int16_t `den`, assuming that the +// result is less than 32768, otherwise an unpredictable result will occur. +// +// If `den`==0, (int16_t)0x7FFF is returned. +// +// Input: +// - num : Numerator +// - den : Denominator +// +// Return value : Result of the division (as a int16_t), i.e., the +// integer part of num/den. +// + +// +// WebRtcSpl_DivResultInQ31(...) +// +// Divides a int32_t `num` by a int16_t `den`, assuming that the +// absolute value of the denominator is larger than the numerator, otherwise +// an unpredictable result will occur. +// +// Input: +// - num : Numerator +// - den : Denominator +// +// Return value : Result of the division in Q31. +// + +// +// WebRtcSpl_DivW32HiLow(...) +// +// Divides a int32_t `num` by a denominator in hi, low format. The +// absolute value of the denominator has to be larger (or equal to) the +// numerator. +// +// Input: +// - num : Numerator +// - den_hi : High part of denominator +// - den_low : Low part of denominator +// +// Return value : Divided value in Q31 +// + +// +// WebRtcSpl_Energy(...) +// +// Calculates the energy of a vector +// +// Input: +// - vector : Vector which the energy should be calculated on +// - vector_length : Number of samples in vector +// +// Output: +// - scale_factor : Number of left bit shifts needed to get the physical +// energy value, i.e, to get the Q0 value +// +// Return value : Energy value in Q(-`scale_factor`) +// + +// +// WebRtcSpl_FilterAR(...) +// +// Performs a 32-bit AR filtering on a vector in Q12 +// +// Input: +// - ar_coef : AR-coefficient vector (values in Q12), +// ar_coef[0] must be 4096. +// - ar_coef_length : Number of coefficients in `ar_coef`. +// - in_vector : Vector to be filtered. +// - in_vector_length : Number of samples in `in_vector`. +// - filter_state : Current state (higher part) of the filter. +// - filter_state_length : Length (in samples) of `filter_state`. +// - filter_state_low : Current state (lower part) of the filter. +// - filter_state_low_length : Length (in samples) of `filter_state_low`. +// - out_vector_low_length : Maximum length (in samples) of +// `out_vector_low`. +// +// Output: +// - filter_state : Updated state (upper part) vector. +// - filter_state_low : Updated state (lower part) vector. +// - out_vector : Vector containing the upper part of the +// filtered values. +// - out_vector_low : Vector containing the lower part of the +// filtered values. +// +// Return value : Number of samples in the `out_vector`. +// + +// +// WebRtcSpl_ComplexIFFT(...) +// +// Complex Inverse FFT +// +// Computes an inverse complex 2^`stages`-point FFT on the input vector, which +// is in bit-reversed order. The original content of the vector is destroyed in +// the process, since the input is overwritten by the output, normal-ordered, +// FFT vector. With X as the input complex vector, y as the output complex +// vector and with M = 2^`stages`, the following is computed: +// +// M-1 +// y(k) = sum[X(i)*[cos(2*pi*i*k/M) + j*sin(2*pi*i*k/M)]] +// i=0 +// +// The implementations are optimized for speed, not for code size. It uses the +// decimation-in-time algorithm with radix-2 butterfly technique. +// +// Input: +// - vector : In pointer to complex vector containing 2^`stages` +// real elements interleaved with 2^`stages` imaginary +// elements. +// [ReImReImReIm....] +// The elements are in Q(-scale) domain, see more on Return +// Value below. +// +// - stages : Number of FFT stages. Must be at least 3 and at most 10, +// since the table WebRtcSpl_kSinTable1024[] is 1024 +// elements long. +// +// - mode : This parameter gives the user to choose how the FFT +// should work. +// mode==0: Low-complexity and Low-accuracy mode +// mode==1: High-complexity and High-accuracy mode +// +// Output: +// - vector : Out pointer to the FFT vector (the same as input). +// +// Return Value : The scale value that tells the number of left bit shifts +// that the elements in the `vector` should be shifted with +// in order to get Q0 values, i.e. the physically correct +// values. The scale parameter is always 0 or positive, +// except if N>1024 (`stages`>10), which returns a scale +// value of -1, indicating error. +// + +// +// WebRtcSpl_ComplexFFT(...) +// +// Complex FFT +// +// Computes a complex 2^`stages`-point FFT on the input vector, which is in +// bit-reversed order. The original content of the vector is destroyed in +// the process, since the input is overwritten by the output, normal-ordered, +// FFT vector. With x as the input complex vector, Y as the output complex +// vector and with M = 2^`stages`, the following is computed: +// +// M-1 +// Y(k) = 1/M * sum[x(i)*[cos(2*pi*i*k/M) + j*sin(2*pi*i*k/M)]] +// i=0 +// +// The implementations are optimized for speed, not for code size. It uses the +// decimation-in-time algorithm with radix-2 butterfly technique. +// +// This routine prevents overflow by scaling by 2 before each FFT stage. This is +// a fixed scaling, for proper normalization - there will be log2(n) passes, so +// this results in an overall factor of 1/n, distributed to maximize arithmetic +// accuracy. +// +// Input: +// - vector : In pointer to complex vector containing 2^`stages` real +// elements interleaved with 2^`stages` imaginary elements. +// [ReImReImReIm....] +// The output is in the Q0 domain. +// +// - stages : Number of FFT stages. Must be at least 3 and at most 10, +// since the table WebRtcSpl_kSinTable1024[] is 1024 +// elements long. +// +// - mode : This parameter gives the user to choose how the FFT +// should work. +// mode==0: Low-complexity and Low-accuracy mode +// mode==1: High-complexity and High-accuracy mode +// +// Output: +// - vector : The output FFT vector is in the Q0 domain. +// +// Return value : The scale parameter is always 0, except if N>1024, +// which returns a scale value of -1, indicating error. +// + +// +// WebRtcSpl_AnalysisQMF(...) +// +// Splits a 0-2*F Hz signal into two sub bands: 0-F Hz and F-2*F Hz. The +// current version has F = 8000, therefore, a super-wideband audio signal is +// split to lower-band 0-8 kHz and upper-band 8-16 kHz. +// +// Input: +// - in_data : Wide band speech signal, 320 samples (10 ms) +// +// Input & Output: +// - filter_state1 : Filter state for first All-pass filter +// - filter_state2 : Filter state for second All-pass filter +// +// Output: +// - low_band : Lower-band signal 0-8 kHz band, 160 samples (10 ms) +// - high_band : Upper-band signal 8-16 kHz band (flipped in frequency +// domain), 160 samples (10 ms) +// + +// +// WebRtcSpl_SynthesisQMF(...) +// +// Combines the two sub bands (0-F and F-2*F Hz) into a signal of 0-2*F +// Hz, (current version has F = 8000 Hz). So the filter combines lower-band +// (0-8 kHz) and upper-band (8-16 kHz) channels to obtain super-wideband 0-16 +// kHz audio. +// +// Input: +// - low_band : The signal with the 0-8 kHz band, 160 samples (10 ms) +// - high_band : The signal with the 8-16 kHz band, 160 samples (10 ms) +// +// Input & Output: +// - filter_state1 : Filter state for first All-pass filter +// - filter_state2 : Filter state for second All-pass filter +// +// Output: +// - out_data : Super-wideband speech signal, 0-16 kHz +// + +// int16_t WebRtcSpl_SatW32ToW16(...) +// +// This function saturates a 32-bit word into a 16-bit word. +// +// Input: +// - value32 : The value of a 32-bit word. +// +// Output: +// - out16 : the saturated 16-bit word. +// + +// int32_t WebRtc_MulAccumW16(...) +// +// This function multiply a 16-bit word by a 16-bit word, and accumulate this +// value to a 32-bit integer. +// +// Input: +// - a : The value of the first 16-bit word. +// - b : The value of the second 16-bit word. +// - c : The value of an 32-bit integer. +// +// Return Value: The value of a * b + c. +// diff --git a/src/common_audio/signal_processing/include/spl_inl.h b/src/common_audio/signal_processing/include/spl_inl.h new file mode 100644 index 0000000..f1b2db1 --- /dev/null +++ b/src/common_audio/signal_processing/include/spl_inl.h @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +// This header file includes the inline functions in +// the fix point signal processing library. + +#ifndef COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SPL_INL_H_ +#define COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SPL_INL_H_ + +#include "rtc_base/compile_assert_c.h" + +#include +#ifdef HAVE_STDINT_H +#include +#else +#include "rtc_base/typedefs.h" +#endif + +extern const int8_t kWebRtcSpl_CountLeadingZeros32_Table[64]; + +// Don't call this directly except in tests! +static __inline int WebRtcSpl_CountLeadingZeros32_NotBuiltin(uint32_t n) { + // Normalize n by rounding up to the nearest number that is a sequence of 0 + // bits followed by a sequence of 1 bits. This number has the same number of + // leading zeros as the original n. There are exactly 33 such values. + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; + + // Multiply the modified n with a constant selected (by exhaustive search) + // such that each of the 33 possible values of n give a product whose 6 most + // significant bits are unique. Then look up the answer in the table. + return kWebRtcSpl_CountLeadingZeros32_Table[(n * 0x8c0b2891) >> 26]; +} + +// Don't call this directly except in tests! +static __inline int WebRtcSpl_CountLeadingZeros64_NotBuiltin(uint64_t n) { + const int leading_zeros = n >> 32 == 0 ? 32 : 0; + return leading_zeros + WebRtcSpl_CountLeadingZeros32_NotBuiltin( + (uint32_t)(n >> (32 - leading_zeros))); +} + +// Returns the number of leading zero bits in the argument. +static __inline int WebRtcSpl_CountLeadingZeros32(uint32_t n) { +#ifdef __GNUC__ + RTC_COMPILE_ASSERT(sizeof(unsigned int) == sizeof(uint32_t)); + return n == 0 ? 32 : __builtin_clz(n); +#else + return WebRtcSpl_CountLeadingZeros32_NotBuiltin(n); +#endif +} + +// Returns the number of leading zero bits in the argument. +static __inline int WebRtcSpl_CountLeadingZeros64(uint64_t n) { +#ifdef __GNUC__ + RTC_COMPILE_ASSERT(sizeof(unsigned long long) == sizeof(uint64_t)); // NOLINT + return n == 0 ? 64 : __builtin_clzll(n); +#else + return WebRtcSpl_CountLeadingZeros64_NotBuiltin(n); +#endif +} + +#ifdef WEBRTC_ARCH_ARM_V7 +#include "common_audio/signal_processing/include/spl_inl_armv7.h" +#else + +#if defined(MIPS32_LE) +#include "common_audio/signal_processing/include/spl_inl_mips.h" +#endif + +#if !defined(MIPS_DSP_R1_LE) +static __inline int16_t WebRtcSpl_SatW32ToW16(int32_t value32) { + int16_t out16 = (int16_t)value32; + + if (value32 > 32767) + out16 = 32767; + else if (value32 < -32768) + out16 = -32768; + + return out16; +} + +static __inline int32_t WebRtcSpl_AddSatW32(int32_t a, int32_t b) { + // Do the addition in unsigned numbers, since signed overflow is undefined + // behavior. + const int32_t sum = (int32_t)((uint32_t)a + (uint32_t)b); + + // a + b can't overflow if a and b have different signs. If they have the + // same sign, a + b also has the same sign iff it didn't overflow. + if ((a < 0) == (b < 0) && (a < 0) != (sum < 0)) { + // The direction of the overflow is obvious from the sign of a + b. + return sum < 0 ? INT32_MAX : INT32_MIN; + } + return sum; +} + +static __inline int32_t WebRtcSpl_SubSatW32(int32_t a, int32_t b) { + // Do the subtraction in unsigned numbers, since signed overflow is undefined + // behavior. + const int32_t diff = (int32_t)((uint32_t)a - (uint32_t)b); + + // a - b can't overflow if a and b have the same sign. If they have different + // signs, a - b has the same sign as a iff it didn't overflow. + if ((a < 0) != (b < 0) && (a < 0) != (diff < 0)) { + // The direction of the overflow is obvious from the sign of a - b. + return diff < 0 ? INT32_MAX : INT32_MIN; + } + return diff; +} + +static __inline int16_t WebRtcSpl_AddSatW16(int16_t a, int16_t b) { + return WebRtcSpl_SatW32ToW16((int32_t)a + (int32_t)b); +} + +static __inline int16_t WebRtcSpl_SubSatW16(int16_t var1, int16_t var2) { + return WebRtcSpl_SatW32ToW16((int32_t)var1 - (int32_t)var2); +} +#endif // #if !defined(MIPS_DSP_R1_LE) + +#if !defined(MIPS32_LE) +static __inline int16_t WebRtcSpl_GetSizeInBits(uint32_t n) { + return 32 - WebRtcSpl_CountLeadingZeros32(n); +} + +// Return the number of steps a can be left-shifted without overflow, +// or 0 if a == 0. +static __inline int16_t WebRtcSpl_NormW32(int32_t a) { + return a == 0 ? 0 : WebRtcSpl_CountLeadingZeros32(a < 0 ? ~a : a) - 1; +} + +// Return the number of steps a can be left-shifted without overflow, +// or 0 if a == 0. +static __inline int16_t WebRtcSpl_NormU32(uint32_t a) { + return a == 0 ? 0 : WebRtcSpl_CountLeadingZeros32(a); +} + +// Return the number of steps a can be left-shifted without overflow, +// or 0 if a == 0. +static __inline int16_t WebRtcSpl_NormW16(int16_t a) { + const int32_t a32 = a; + return a == 0 ? 0 : WebRtcSpl_CountLeadingZeros32(a < 0 ? ~a32 : a32) - 17; +} + +static __inline int32_t WebRtc_MulAccumW16(int16_t a, int16_t b, int32_t c) { + return (a * b + c); +} +#endif // #if !defined(MIPS32_LE) + +#endif // WEBRTC_ARCH_ARM_V7 + +#endif // COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SPL_INL_H_ diff --git a/src/common_audio/signal_processing/min_max_operations.c b/src/common_audio/signal_processing/min_max_operations.c new file mode 100644 index 0000000..e794dae --- /dev/null +++ b/src/common_audio/signal_processing/min_max_operations.c @@ -0,0 +1,256 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +/* + * This file contains the implementation of functions + * WebRtcSpl_MaxAbsValueW16C() + * WebRtcSpl_MaxAbsValueW32C() + * WebRtcSpl_MaxValueW16C() + * WebRtcSpl_MaxValueW32C() + * WebRtcSpl_MinValueW16C() + * WebRtcSpl_MinValueW32C() + * WebRtcSpl_MaxAbsIndexW16() + * WebRtcSpl_MaxIndexW16() + * WebRtcSpl_MaxIndexW32() + * WebRtcSpl_MinIndexW16() + * WebRtcSpl_MinIndexW32() + * + */ + +#include + +#include "rtc_base/checks.h" +#include "common_audio/signal_processing/include/signal_processing_library.h" + +// TODO(bjorn/kma): Consolidate function pairs (e.g. combine +// WebRtcSpl_MaxAbsValueW16C and WebRtcSpl_MaxAbsIndexW16 into a single one.) +// TODO(kma): Move the next six functions into min_max_operations_c.c. + +// Maximum absolute value of word16 vector. C version for generic platforms. +int16_t WebRtcSpl_MaxAbsValueW16C(const int16_t* vector, size_t length) { + size_t i = 0; + int absolute = 0, maximum = 0; + + RTC_DCHECK_GT(length, 0); + + for (i = 0; i < length; i++) { + absolute = abs((int)vector[i]); + + if (absolute > maximum) { + maximum = absolute; + } + } + + // Guard the case for abs(-32768). + if (maximum > WEBRTC_SPL_WORD16_MAX) { + maximum = WEBRTC_SPL_WORD16_MAX; + } + + return (int16_t)maximum; +} + +// Maximum absolute value of word32 vector. C version for generic platforms. +int32_t WebRtcSpl_MaxAbsValueW32C(const int32_t* vector, size_t length) { + // Use uint32_t for the local variables, to accommodate the return value + // of abs(0x80000000), which is 0x80000000. + + uint32_t absolute = 0, maximum = 0; + size_t i = 0; + + RTC_DCHECK_GT(length, 0); + + for (i = 0; i < length; i++) { + absolute = abs((int)vector[i]); + if (absolute > maximum) { + maximum = absolute; + } + } + + maximum = WEBRTC_SPL_MIN(maximum, WEBRTC_SPL_WORD32_MAX); + + return (int32_t)maximum; +} + +// Maximum value of word16 vector. C version for generic platforms. +int16_t WebRtcSpl_MaxValueW16C(const int16_t* vector, size_t length) { + int16_t maximum = WEBRTC_SPL_WORD16_MIN; + size_t i = 0; + + RTC_DCHECK_GT(length, 0); + + for (i = 0; i < length; i++) { + if (vector[i] > maximum) + maximum = vector[i]; + } + return maximum; +} + +// Maximum value of word32 vector. C version for generic platforms. +int32_t WebRtcSpl_MaxValueW32C(const int32_t* vector, size_t length) { + int32_t maximum = WEBRTC_SPL_WORD32_MIN; + size_t i = 0; + + RTC_DCHECK_GT(length, 0); + + for (i = 0; i < length; i++) { + if (vector[i] > maximum) + maximum = vector[i]; + } + return maximum; +} + +// Minimum value of word16 vector. C version for generic platforms. +int16_t WebRtcSpl_MinValueW16C(const int16_t* vector, size_t length) { + int16_t minimum = WEBRTC_SPL_WORD16_MAX; + size_t i = 0; + + RTC_DCHECK_GT(length, 0); + + for (i = 0; i < length; i++) { + if (vector[i] < minimum) + minimum = vector[i]; + } + return minimum; +} + +// Minimum value of word32 vector. C version for generic platforms. +int32_t WebRtcSpl_MinValueW32C(const int32_t* vector, size_t length) { + int32_t minimum = WEBRTC_SPL_WORD32_MAX; + size_t i = 0; + + RTC_DCHECK_GT(length, 0); + + for (i = 0; i < length; i++) { + if (vector[i] < minimum) + minimum = vector[i]; + } + return minimum; +} + +// Index of maximum absolute value in a word16 vector. +size_t WebRtcSpl_MaxAbsIndexW16(const int16_t* vector, size_t length) { + // Use type int for local variables, to accommodate the value of abs(-32768). + + size_t i = 0, index = 0; + int absolute = 0, maximum = 0; + + RTC_DCHECK_GT(length, 0); + + for (i = 0; i < length; i++) { + absolute = abs((int)vector[i]); + + if (absolute > maximum) { + maximum = absolute; + index = i; + } + } + + return index; +} + +int16_t WebRtcSpl_MaxAbsElementW16(const int16_t* vector, size_t length) { + int16_t min_val, max_val; + WebRtcSpl_MinMaxW16(vector, length, &min_val, &max_val); + if (min_val == max_val || min_val < -max_val) { + return min_val; + } + return max_val; +} + +// Index of maximum value in a word16 vector. +size_t WebRtcSpl_MaxIndexW16(const int16_t* vector, size_t length) { + size_t i = 0, index = 0; + int16_t maximum = WEBRTC_SPL_WORD16_MIN; + + RTC_DCHECK_GT(length, 0); + + for (i = 0; i < length; i++) { + if (vector[i] > maximum) { + maximum = vector[i]; + index = i; + } + } + + return index; +} + +// Index of maximum value in a word32 vector. +size_t WebRtcSpl_MaxIndexW32(const int32_t* vector, size_t length) { + size_t i = 0, index = 0; + int32_t maximum = WEBRTC_SPL_WORD32_MIN; + + RTC_DCHECK_GT(length, 0); + + for (i = 0; i < length; i++) { + if (vector[i] > maximum) { + maximum = vector[i]; + index = i; + } + } + + return index; +} + +// Index of minimum value in a word16 vector. +size_t WebRtcSpl_MinIndexW16(const int16_t* vector, size_t length) { + size_t i = 0, index = 0; + int16_t minimum = WEBRTC_SPL_WORD16_MAX; + + RTC_DCHECK_GT(length, 0); + + for (i = 0; i < length; i++) { + if (vector[i] < minimum) { + minimum = vector[i]; + index = i; + } + } + + return index; +} + +// Index of minimum value in a word32 vector. +size_t WebRtcSpl_MinIndexW32(const int32_t* vector, size_t length) { + size_t i = 0, index = 0; + int32_t minimum = WEBRTC_SPL_WORD32_MAX; + + RTC_DCHECK_GT(length, 0); + + for (i = 0; i < length; i++) { + if (vector[i] < minimum) { + minimum = vector[i]; + index = i; + } + } + + return index; +} + +// Finds both the minimum and maximum elements in an array of 16-bit integers. +void WebRtcSpl_MinMaxW16(const int16_t* vector, size_t length, + int16_t* min_val, int16_t* max_val) { +#if defined(WEBRTC_HAS_NEON) + return WebRtcSpl_MinMaxW16Neon(vector, length, min_val, max_val); +#else + int16_t minimum = WEBRTC_SPL_WORD16_MAX; + int16_t maximum = WEBRTC_SPL_WORD16_MIN; + size_t i = 0; + + RTC_DCHECK_GT(length, 0); + + for (i = 0; i < length; i++) { + if (vector[i] < minimum) + minimum = vector[i]; + if (vector[i] > maximum) + maximum = vector[i]; + } + *min_val = minimum; + *max_val = maximum; +#endif +} diff --git a/src/common_audio/signal_processing/resample.c b/src/common_audio/signal_processing/resample.c new file mode 100644 index 0000000..d4b2736 --- /dev/null +++ b/src/common_audio/signal_processing/resample.c @@ -0,0 +1,505 @@ +/* + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + + +/* + * This file contains the resampling functions for 22 kHz. + * The description header can be found in signal_processing_library.h + * + */ + +#include "common_audio/signal_processing/include/signal_processing_library.h" +#include "common_audio/signal_processing/resample_by_2_internal.h" + +// Declaration of internally used functions +static void WebRtcSpl_32khzTo22khzIntToShort(const int32_t *In, int16_t *Out, + int32_t K); + +void WebRtcSpl_32khzTo22khzIntToInt(const int32_t *In, int32_t *Out, + int32_t K); + +// interpolation coefficients +static const int16_t kCoefficients32To22[5][9] = { + {127, -712, 2359, -6333, 23456, 16775, -3695, 945, -154}, + {-39, 230, -830, 2785, 32366, -2324, 760, -218, 38}, + {117, -663, 2222, -6133, 26634, 13070, -3174, 831, -137}, + {-77, 457, -1677, 5958, 31175, -4136, 1405, -408, 71}, + { 98, -560, 1900, -5406, 29240, 9423, -2480, 663, -110} +}; + +////////////////////// +// 22 kHz -> 16 kHz // +////////////////////// + +// number of subblocks; options: 1, 2, 4, 5, 10 +#define SUB_BLOCKS_22_16 5 + +// 22 -> 16 resampler +void WebRtcSpl_Resample22khzTo16khz(const int16_t* in, int16_t* out, + WebRtcSpl_State22khzTo16khz* state, int32_t* tmpmem) +{ + int k; + + // process two blocks of 10/SUB_BLOCKS_22_16 ms (to reduce temp buffer size) + for (k = 0; k < SUB_BLOCKS_22_16; k++) + { + ///// 22 --> 44 ///// + // int16_t in[220/SUB_BLOCKS_22_16] + // int32_t out[440/SUB_BLOCKS_22_16] + ///// + WebRtcSpl_UpBy2ShortToInt(in, 220 / SUB_BLOCKS_22_16, tmpmem + 16, state->S_22_44); + + ///// 44 --> 32 ///// + // int32_t in[440/SUB_BLOCKS_22_16] + // int32_t out[320/SUB_BLOCKS_22_16] + ///// + // copy state to and from input array + tmpmem[8] = state->S_44_32[0]; + tmpmem[9] = state->S_44_32[1]; + tmpmem[10] = state->S_44_32[2]; + tmpmem[11] = state->S_44_32[3]; + tmpmem[12] = state->S_44_32[4]; + tmpmem[13] = state->S_44_32[5]; + tmpmem[14] = state->S_44_32[6]; + tmpmem[15] = state->S_44_32[7]; + state->S_44_32[0] = tmpmem[440 / SUB_BLOCKS_22_16 + 8]; + state->S_44_32[1] = tmpmem[440 / SUB_BLOCKS_22_16 + 9]; + state->S_44_32[2] = tmpmem[440 / SUB_BLOCKS_22_16 + 10]; + state->S_44_32[3] = tmpmem[440 / SUB_BLOCKS_22_16 + 11]; + state->S_44_32[4] = tmpmem[440 / SUB_BLOCKS_22_16 + 12]; + state->S_44_32[5] = tmpmem[440 / SUB_BLOCKS_22_16 + 13]; + state->S_44_32[6] = tmpmem[440 / SUB_BLOCKS_22_16 + 14]; + state->S_44_32[7] = tmpmem[440 / SUB_BLOCKS_22_16 + 15]; + + WebRtcSpl_Resample44khzTo32khz(tmpmem + 8, tmpmem, 40 / SUB_BLOCKS_22_16); + + ///// 32 --> 16 ///// + // int32_t in[320/SUB_BLOCKS_22_16] + // int32_t out[160/SUB_BLOCKS_22_16] + ///// + WebRtcSpl_DownBy2IntToShort(tmpmem, 320 / SUB_BLOCKS_22_16, out, state->S_32_16); + + // move input/output pointers 10/SUB_BLOCKS_22_16 ms seconds ahead + in += 220 / SUB_BLOCKS_22_16; + out += 160 / SUB_BLOCKS_22_16; + } +} + +// initialize state of 22 -> 16 resampler +void WebRtcSpl_ResetResample22khzTo16khz(WebRtcSpl_State22khzTo16khz* state) +{ + int k; + for (k = 0; k < 8; k++) + { + state->S_22_44[k] = 0; + state->S_44_32[k] = 0; + state->S_32_16[k] = 0; + } +} + +////////////////////// +// 16 kHz -> 22 kHz // +////////////////////// + +// number of subblocks; options: 1, 2, 4, 5, 10 +#define SUB_BLOCKS_16_22 4 + +// 16 -> 22 resampler +void WebRtcSpl_Resample16khzTo22khz(const int16_t* in, int16_t* out, + WebRtcSpl_State16khzTo22khz* state, int32_t* tmpmem) +{ + int k; + + // process two blocks of 10/SUB_BLOCKS_16_22 ms (to reduce temp buffer size) + for (k = 0; k < SUB_BLOCKS_16_22; k++) + { + ///// 16 --> 32 ///// + // int16_t in[160/SUB_BLOCKS_16_22] + // int32_t out[320/SUB_BLOCKS_16_22] + ///// + WebRtcSpl_UpBy2ShortToInt(in, 160 / SUB_BLOCKS_16_22, tmpmem + 8, state->S_16_32); + + ///// 32 --> 22 ///// + // int32_t in[320/SUB_BLOCKS_16_22] + // int32_t out[220/SUB_BLOCKS_16_22] + ///// + // copy state to and from input array + tmpmem[0] = state->S_32_22[0]; + tmpmem[1] = state->S_32_22[1]; + tmpmem[2] = state->S_32_22[2]; + tmpmem[3] = state->S_32_22[3]; + tmpmem[4] = state->S_32_22[4]; + tmpmem[5] = state->S_32_22[5]; + tmpmem[6] = state->S_32_22[6]; + tmpmem[7] = state->S_32_22[7]; + state->S_32_22[0] = tmpmem[320 / SUB_BLOCKS_16_22]; + state->S_32_22[1] = tmpmem[320 / SUB_BLOCKS_16_22 + 1]; + state->S_32_22[2] = tmpmem[320 / SUB_BLOCKS_16_22 + 2]; + state->S_32_22[3] = tmpmem[320 / SUB_BLOCKS_16_22 + 3]; + state->S_32_22[4] = tmpmem[320 / SUB_BLOCKS_16_22 + 4]; + state->S_32_22[5] = tmpmem[320 / SUB_BLOCKS_16_22 + 5]; + state->S_32_22[6] = tmpmem[320 / SUB_BLOCKS_16_22 + 6]; + state->S_32_22[7] = tmpmem[320 / SUB_BLOCKS_16_22 + 7]; + + WebRtcSpl_32khzTo22khzIntToShort(tmpmem, out, 20 / SUB_BLOCKS_16_22); + + // move input/output pointers 10/SUB_BLOCKS_16_22 ms seconds ahead + in += 160 / SUB_BLOCKS_16_22; + out += 220 / SUB_BLOCKS_16_22; + } +} + +// initialize state of 16 -> 22 resampler +void WebRtcSpl_ResetResample16khzTo22khz(WebRtcSpl_State16khzTo22khz* state) +{ + int k; + for (k = 0; k < 8; k++) + { + state->S_16_32[k] = 0; + state->S_32_22[k] = 0; + } +} + +////////////////////// +// 22 kHz -> 8 kHz // +////////////////////// + +// number of subblocks; options: 1, 2, 5, 10 +#define SUB_BLOCKS_22_8 2 + +// 22 -> 8 resampler +void WebRtcSpl_Resample22khzTo8khz(const int16_t* in, int16_t* out, + WebRtcSpl_State22khzTo8khz* state, int32_t* tmpmem) +{ + int k; + + // process two blocks of 10/SUB_BLOCKS_22_8 ms (to reduce temp buffer size) + for (k = 0; k < SUB_BLOCKS_22_8; k++) + { + ///// 22 --> 22 lowpass ///// + // int16_t in[220/SUB_BLOCKS_22_8] + // int32_t out[220/SUB_BLOCKS_22_8] + ///// + WebRtcSpl_LPBy2ShortToInt(in, 220 / SUB_BLOCKS_22_8, tmpmem + 16, state->S_22_22); + + ///// 22 --> 16 ///// + // int32_t in[220/SUB_BLOCKS_22_8] + // int32_t out[160/SUB_BLOCKS_22_8] + ///// + // copy state to and from input array + tmpmem[8] = state->S_22_16[0]; + tmpmem[9] = state->S_22_16[1]; + tmpmem[10] = state->S_22_16[2]; + tmpmem[11] = state->S_22_16[3]; + tmpmem[12] = state->S_22_16[4]; + tmpmem[13] = state->S_22_16[5]; + tmpmem[14] = state->S_22_16[6]; + tmpmem[15] = state->S_22_16[7]; + state->S_22_16[0] = tmpmem[220 / SUB_BLOCKS_22_8 + 8]; + state->S_22_16[1] = tmpmem[220 / SUB_BLOCKS_22_8 + 9]; + state->S_22_16[2] = tmpmem[220 / SUB_BLOCKS_22_8 + 10]; + state->S_22_16[3] = tmpmem[220 / SUB_BLOCKS_22_8 + 11]; + state->S_22_16[4] = tmpmem[220 / SUB_BLOCKS_22_8 + 12]; + state->S_22_16[5] = tmpmem[220 / SUB_BLOCKS_22_8 + 13]; + state->S_22_16[6] = tmpmem[220 / SUB_BLOCKS_22_8 + 14]; + state->S_22_16[7] = tmpmem[220 / SUB_BLOCKS_22_8 + 15]; + + WebRtcSpl_Resample44khzTo32khz(tmpmem + 8, tmpmem, 20 / SUB_BLOCKS_22_8); + + ///// 16 --> 8 ///// + // int32_t in[160/SUB_BLOCKS_22_8] + // int32_t out[80/SUB_BLOCKS_22_8] + ///// + WebRtcSpl_DownBy2IntToShort(tmpmem, 160 / SUB_BLOCKS_22_8, out, state->S_16_8); + + // move input/output pointers 10/SUB_BLOCKS_22_8 ms seconds ahead + in += 220 / SUB_BLOCKS_22_8; + out += 80 / SUB_BLOCKS_22_8; + } +} + +// initialize state of 22 -> 8 resampler +void WebRtcSpl_ResetResample22khzTo8khz(WebRtcSpl_State22khzTo8khz* state) +{ + int k; + for (k = 0; k < 8; k++) + { + state->S_22_22[k] = 0; + state->S_22_22[k + 8] = 0; + state->S_22_16[k] = 0; + state->S_16_8[k] = 0; + } +} + +////////////////////// +// 8 kHz -> 22 kHz // +////////////////////// + +// number of subblocks; options: 1, 2, 5, 10 +#define SUB_BLOCKS_8_22 2 + +// 8 -> 22 resampler +void WebRtcSpl_Resample8khzTo22khz(const int16_t* in, int16_t* out, + WebRtcSpl_State8khzTo22khz* state, int32_t* tmpmem) +{ + int k; + + // process two blocks of 10/SUB_BLOCKS_8_22 ms (to reduce temp buffer size) + for (k = 0; k < SUB_BLOCKS_8_22; k++) + { + ///// 8 --> 16 ///// + // int16_t in[80/SUB_BLOCKS_8_22] + // int32_t out[160/SUB_BLOCKS_8_22] + ///// + WebRtcSpl_UpBy2ShortToInt(in, 80 / SUB_BLOCKS_8_22, tmpmem + 18, state->S_8_16); + + ///// 16 --> 11 ///// + // int32_t in[160/SUB_BLOCKS_8_22] + // int32_t out[110/SUB_BLOCKS_8_22] + ///// + // copy state to and from input array + tmpmem[10] = state->S_16_11[0]; + tmpmem[11] = state->S_16_11[1]; + tmpmem[12] = state->S_16_11[2]; + tmpmem[13] = state->S_16_11[3]; + tmpmem[14] = state->S_16_11[4]; + tmpmem[15] = state->S_16_11[5]; + tmpmem[16] = state->S_16_11[6]; + tmpmem[17] = state->S_16_11[7]; + state->S_16_11[0] = tmpmem[160 / SUB_BLOCKS_8_22 + 10]; + state->S_16_11[1] = tmpmem[160 / SUB_BLOCKS_8_22 + 11]; + state->S_16_11[2] = tmpmem[160 / SUB_BLOCKS_8_22 + 12]; + state->S_16_11[3] = tmpmem[160 / SUB_BLOCKS_8_22 + 13]; + state->S_16_11[4] = tmpmem[160 / SUB_BLOCKS_8_22 + 14]; + state->S_16_11[5] = tmpmem[160 / SUB_BLOCKS_8_22 + 15]; + state->S_16_11[6] = tmpmem[160 / SUB_BLOCKS_8_22 + 16]; + state->S_16_11[7] = tmpmem[160 / SUB_BLOCKS_8_22 + 17]; + + WebRtcSpl_32khzTo22khzIntToInt(tmpmem + 10, tmpmem, 10 / SUB_BLOCKS_8_22); + + ///// 11 --> 22 ///// + // int32_t in[110/SUB_BLOCKS_8_22] + // int16_t out[220/SUB_BLOCKS_8_22] + ///// + WebRtcSpl_UpBy2IntToShort(tmpmem, 110 / SUB_BLOCKS_8_22, out, state->S_11_22); + + // move input/output pointers 10/SUB_BLOCKS_8_22 ms seconds ahead + in += 80 / SUB_BLOCKS_8_22; + out += 220 / SUB_BLOCKS_8_22; + } +} + +// initialize state of 8 -> 22 resampler +void WebRtcSpl_ResetResample8khzTo22khz(WebRtcSpl_State8khzTo22khz* state) +{ + int k; + for (k = 0; k < 8; k++) + { + state->S_8_16[k] = 0; + state->S_16_11[k] = 0; + state->S_11_22[k] = 0; + } +} + +// compute two inner-products and store them to output array +static void WebRtcSpl_DotProdIntToInt(const int32_t* in1, const int32_t* in2, + const int16_t* coef_ptr, int32_t* out1, + int32_t* out2) +{ + int32_t tmp1 = 16384; + int32_t tmp2 = 16384; + int16_t coef; + + coef = coef_ptr[0]; + tmp1 += coef * in1[0]; + tmp2 += coef * in2[-0]; + + coef = coef_ptr[1]; + tmp1 += coef * in1[1]; + tmp2 += coef * in2[-1]; + + coef = coef_ptr[2]; + tmp1 += coef * in1[2]; + tmp2 += coef * in2[-2]; + + coef = coef_ptr[3]; + tmp1 += coef * in1[3]; + tmp2 += coef * in2[-3]; + + coef = coef_ptr[4]; + tmp1 += coef * in1[4]; + tmp2 += coef * in2[-4]; + + coef = coef_ptr[5]; + tmp1 += coef * in1[5]; + tmp2 += coef * in2[-5]; + + coef = coef_ptr[6]; + tmp1 += coef * in1[6]; + tmp2 += coef * in2[-6]; + + coef = coef_ptr[7]; + tmp1 += coef * in1[7]; + tmp2 += coef * in2[-7]; + + coef = coef_ptr[8]; + *out1 = tmp1 + coef * in1[8]; + *out2 = tmp2 + coef * in2[-8]; +} + +// compute two inner-products and store them to output array +static void WebRtcSpl_DotProdIntToShort(const int32_t* in1, const int32_t* in2, + const int16_t* coef_ptr, int16_t* out1, + int16_t* out2) +{ + int32_t tmp1 = 16384; + int32_t tmp2 = 16384; + int16_t coef; + + coef = coef_ptr[0]; + tmp1 += coef * in1[0]; + tmp2 += coef * in2[-0]; + + coef = coef_ptr[1]; + tmp1 += coef * in1[1]; + tmp2 += coef * in2[-1]; + + coef = coef_ptr[2]; + tmp1 += coef * in1[2]; + tmp2 += coef * in2[-2]; + + coef = coef_ptr[3]; + tmp1 += coef * in1[3]; + tmp2 += coef * in2[-3]; + + coef = coef_ptr[4]; + tmp1 += coef * in1[4]; + tmp2 += coef * in2[-4]; + + coef = coef_ptr[5]; + tmp1 += coef * in1[5]; + tmp2 += coef * in2[-5]; + + coef = coef_ptr[6]; + tmp1 += coef * in1[6]; + tmp2 += coef * in2[-6]; + + coef = coef_ptr[7]; + tmp1 += coef * in1[7]; + tmp2 += coef * in2[-7]; + + coef = coef_ptr[8]; + tmp1 += coef * in1[8]; + tmp2 += coef * in2[-8]; + + // scale down, round and saturate + tmp1 >>= 15; + if (tmp1 > (int32_t)0x00007FFF) + tmp1 = 0x00007FFF; + if (tmp1 < (int32_t)0xFFFF8000) + tmp1 = 0xFFFF8000; + tmp2 >>= 15; + if (tmp2 > (int32_t)0x00007FFF) + tmp2 = 0x00007FFF; + if (tmp2 < (int32_t)0xFFFF8000) + tmp2 = 0xFFFF8000; + *out1 = (int16_t)tmp1; + *out2 = (int16_t)tmp2; +} + +// Resampling ratio: 11/16 +// input: int32_t (normalized, not saturated) :: size 16 * K +// output: int32_t (shifted 15 positions to the left, + offset 16384) :: size 11 * K +// K: Number of blocks + +void WebRtcSpl_32khzTo22khzIntToInt(const int32_t* In, + int32_t* Out, + int32_t K) +{ + ///////////////////////////////////////////////////////////// + // Filter operation: + // + // Perform resampling (16 input samples -> 11 output samples); + // process in sub blocks of size 16 samples. + int32_t m; + + for (m = 0; m < K; m++) + { + // first output sample + Out[0] = ((int32_t)In[3] << 15) + (1 << 14); + + // sum and accumulate filter coefficients and input samples + WebRtcSpl_DotProdIntToInt(&In[0], &In[22], kCoefficients32To22[0], &Out[1], &Out[10]); + + // sum and accumulate filter coefficients and input samples + WebRtcSpl_DotProdIntToInt(&In[2], &In[20], kCoefficients32To22[1], &Out[2], &Out[9]); + + // sum and accumulate filter coefficients and input samples + WebRtcSpl_DotProdIntToInt(&In[3], &In[19], kCoefficients32To22[2], &Out[3], &Out[8]); + + // sum and accumulate filter coefficients and input samples + WebRtcSpl_DotProdIntToInt(&In[5], &In[17], kCoefficients32To22[3], &Out[4], &Out[7]); + + // sum and accumulate filter coefficients and input samples + WebRtcSpl_DotProdIntToInt(&In[6], &In[16], kCoefficients32To22[4], &Out[5], &Out[6]); + + // update pointers + In += 16; + Out += 11; + } +} + +// Resampling ratio: 11/16 +// input: int32_t (normalized, not saturated) :: size 16 * K +// output: int16_t (saturated) :: size 11 * K +// K: Number of blocks + +void WebRtcSpl_32khzTo22khzIntToShort(const int32_t *In, + int16_t *Out, + int32_t K) +{ + ///////////////////////////////////////////////////////////// + // Filter operation: + // + // Perform resampling (16 input samples -> 11 output samples); + // process in sub blocks of size 16 samples. + int32_t tmp; + int32_t m; + + for (m = 0; m < K; m++) + { + // first output sample + tmp = In[3]; + if (tmp > (int32_t)0x00007FFF) + tmp = 0x00007FFF; + if (tmp < (int32_t)0xFFFF8000) + tmp = 0xFFFF8000; + Out[0] = (int16_t)tmp; + + // sum and accumulate filter coefficients and input samples + WebRtcSpl_DotProdIntToShort(&In[0], &In[22], kCoefficients32To22[0], &Out[1], &Out[10]); + + // sum and accumulate filter coefficients and input samples + WebRtcSpl_DotProdIntToShort(&In[2], &In[20], kCoefficients32To22[1], &Out[2], &Out[9]); + + // sum and accumulate filter coefficients and input samples + WebRtcSpl_DotProdIntToShort(&In[3], &In[19], kCoefficients32To22[2], &Out[3], &Out[8]); + + // sum and accumulate filter coefficients and input samples + WebRtcSpl_DotProdIntToShort(&In[5], &In[17], kCoefficients32To22[3], &Out[4], &Out[7]); + + // sum and accumulate filter coefficients and input samples + WebRtcSpl_DotProdIntToShort(&In[6], &In[16], kCoefficients32To22[4], &Out[5], &Out[6]); + + // update pointers + In += 16; + Out += 11; + } +} diff --git a/src/common_audio/signal_processing/resample_48khz.c b/src/common_audio/signal_processing/resample_48khz.c new file mode 100644 index 0000000..8518e7b --- /dev/null +++ b/src/common_audio/signal_processing/resample_48khz.c @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + + +/* + * This file contains resampling functions between 48 kHz and nb/wb. + * The description header can be found in signal_processing_library.h + * + */ + +#include +#include "common_audio/signal_processing/include/signal_processing_library.h" +#include "common_audio/signal_processing/resample_by_2_internal.h" + +//////////////////////////// +///// 48 kHz -> 16 kHz ///// +//////////////////////////// + +// 48 -> 16 resampler +void WebRtcSpl_Resample48khzTo16khz(const int16_t* in, int16_t* out, + WebRtcSpl_State48khzTo16khz* state, int32_t* tmpmem) +{ + ///// 48 --> 48(LP) ///// + // int16_t in[480] + // int32_t out[480] + ///// + WebRtcSpl_LPBy2ShortToInt(in, 480, tmpmem + 16, state->S_48_48); + + ///// 48 --> 32 ///// + // int32_t in[480] + // int32_t out[320] + ///// + // copy state to and from input array + memcpy(tmpmem + 8, state->S_48_32, 8 * sizeof(int32_t)); + memcpy(state->S_48_32, tmpmem + 488, 8 * sizeof(int32_t)); + WebRtcSpl_Resample48khzTo32khz(tmpmem + 8, tmpmem, 160); + + ///// 32 --> 16 ///// + // int32_t in[320] + // int16_t out[160] + ///// + WebRtcSpl_DownBy2IntToShort(tmpmem, 320, out, state->S_32_16); +} + +// initialize state of 48 -> 16 resampler +void WebRtcSpl_ResetResample48khzTo16khz(WebRtcSpl_State48khzTo16khz* state) +{ + memset(state->S_48_48, 0, 16 * sizeof(int32_t)); + memset(state->S_48_32, 0, 8 * sizeof(int32_t)); + memset(state->S_32_16, 0, 8 * sizeof(int32_t)); +} + +//////////////////////////// +///// 16 kHz -> 48 kHz ///// +//////////////////////////// + +// 16 -> 48 resampler +void WebRtcSpl_Resample16khzTo48khz(const int16_t* in, int16_t* out, + WebRtcSpl_State16khzTo48khz* state, int32_t* tmpmem) +{ + ///// 16 --> 32 ///// + // int16_t in[160] + // int32_t out[320] + ///// + WebRtcSpl_UpBy2ShortToInt(in, 160, tmpmem + 16, state->S_16_32); + + ///// 32 --> 24 ///// + // int32_t in[320] + // int32_t out[240] + // copy state to and from input array + ///// + memcpy(tmpmem + 8, state->S_32_24, 8 * sizeof(int32_t)); + memcpy(state->S_32_24, tmpmem + 328, 8 * sizeof(int32_t)); + WebRtcSpl_Resample32khzTo24khz(tmpmem + 8, tmpmem, 80); + + ///// 24 --> 48 ///// + // int32_t in[240] + // int16_t out[480] + ///// + WebRtcSpl_UpBy2IntToShort(tmpmem, 240, out, state->S_24_48); +} + +// initialize state of 16 -> 48 resampler +void WebRtcSpl_ResetResample16khzTo48khz(WebRtcSpl_State16khzTo48khz* state) +{ + memset(state->S_16_32, 0, 8 * sizeof(int32_t)); + memset(state->S_32_24, 0, 8 * sizeof(int32_t)); + memset(state->S_24_48, 0, 8 * sizeof(int32_t)); +} + +//////////////////////////// +///// 48 kHz -> 8 kHz ///// +//////////////////////////// + +// 48 -> 8 resampler +void WebRtcSpl_Resample48khzTo8khz(const int16_t* in, int16_t* out, + WebRtcSpl_State48khzTo8khz* state, int32_t* tmpmem) +{ + ///// 48 --> 24 ///// + // int16_t in[480] + // int32_t out[240] + ///// + WebRtcSpl_DownBy2ShortToInt(in, 480, tmpmem + 256, state->S_48_24); + + ///// 24 --> 24(LP) ///// + // int32_t in[240] + // int32_t out[240] + ///// + WebRtcSpl_LPBy2IntToInt(tmpmem + 256, 240, tmpmem + 16, state->S_24_24); + + ///// 24 --> 16 ///// + // int32_t in[240] + // int32_t out[160] + ///// + // copy state to and from input array + memcpy(tmpmem + 8, state->S_24_16, 8 * sizeof(int32_t)); + memcpy(state->S_24_16, tmpmem + 248, 8 * sizeof(int32_t)); + WebRtcSpl_Resample48khzTo32khz(tmpmem + 8, tmpmem, 80); + + ///// 16 --> 8 ///// + // int32_t in[160] + // int16_t out[80] + ///// + WebRtcSpl_DownBy2IntToShort(tmpmem, 160, out, state->S_16_8); +} + +// initialize state of 48 -> 8 resampler +void WebRtcSpl_ResetResample48khzTo8khz(WebRtcSpl_State48khzTo8khz* state) +{ + memset(state->S_48_24, 0, 8 * sizeof(int32_t)); + memset(state->S_24_24, 0, 16 * sizeof(int32_t)); + memset(state->S_24_16, 0, 8 * sizeof(int32_t)); + memset(state->S_16_8, 0, 8 * sizeof(int32_t)); +} + +//////////////////////////// +///// 8 kHz -> 48 kHz ///// +//////////////////////////// + +// 8 -> 48 resampler +void WebRtcSpl_Resample8khzTo48khz(const int16_t* in, int16_t* out, + WebRtcSpl_State8khzTo48khz* state, int32_t* tmpmem) +{ + ///// 8 --> 16 ///// + // int16_t in[80] + // int32_t out[160] + ///// + WebRtcSpl_UpBy2ShortToInt(in, 80, tmpmem + 264, state->S_8_16); + + ///// 16 --> 12 ///// + // int32_t in[160] + // int32_t out[120] + ///// + // copy state to and from input array + memcpy(tmpmem + 256, state->S_16_12, 8 * sizeof(int32_t)); + memcpy(state->S_16_12, tmpmem + 416, 8 * sizeof(int32_t)); + WebRtcSpl_Resample32khzTo24khz(tmpmem + 256, tmpmem + 240, 40); + + ///// 12 --> 24 ///// + // int32_t in[120] + // int16_t out[240] + ///// + WebRtcSpl_UpBy2IntToInt(tmpmem + 240, 120, tmpmem, state->S_12_24); + + ///// 24 --> 48 ///// + // int32_t in[240] + // int16_t out[480] + ///// + WebRtcSpl_UpBy2IntToShort(tmpmem, 240, out, state->S_24_48); +} + +// initialize state of 8 -> 48 resampler +void WebRtcSpl_ResetResample8khzTo48khz(WebRtcSpl_State8khzTo48khz* state) +{ + memset(state->S_8_16, 0, 8 * sizeof(int32_t)); + memset(state->S_16_12, 0, 8 * sizeof(int32_t)); + memset(state->S_12_24, 0, 8 * sizeof(int32_t)); + memset(state->S_24_48, 0, 8 * sizeof(int32_t)); +} diff --git a/src/common_audio/signal_processing/resample_by_2_internal.c b/src/common_audio/signal_processing/resample_by_2_internal.c new file mode 100644 index 0000000..99592b2 --- /dev/null +++ b/src/common_audio/signal_processing/resample_by_2_internal.c @@ -0,0 +1,689 @@ +/* + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + + +/* + * This header file contains some internal resampling functions. + * + */ + +#include "common_audio/signal_processing/resample_by_2_internal.h" +#include "rtc_base/sanitizer.h" + +// allpass filter coefficients. +static const int16_t kResampleAllpass[2][3] = { + {821, 6110, 12382}, + {3050, 9368, 15063} +}; + +// +// decimator +// input: int32_t (shifted 15 positions to the left, + offset 16384) OVERWRITTEN! +// output: int16_t (saturated) (of length len/2) +// state: filter state array; length = 8 + +void RTC_NO_SANITIZE("signed-integer-overflow") // bugs.webrtc.org/5486 +WebRtcSpl_DownBy2IntToShort(int32_t *in, int32_t len, int16_t *out, + int32_t *state) +{ + int32_t tmp0, tmp1, diff; + int32_t i; + + len >>= 1; + + // lower allpass filter (operates on even input samples) + for (i = 0; i < len; i++) + { + tmp0 = in[i << 1]; + diff = tmp0 - state[1]; + // UBSan: -1771017321 - 999586185 cannot be represented in type 'int' + + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[0] + diff * kResampleAllpass[1][0]; + state[0] = tmp0; + diff = tmp1 - state[2]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[1] + diff * kResampleAllpass[1][1]; + state[1] = tmp1; + diff = tmp0 - state[3]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[3] = state[2] + diff * kResampleAllpass[1][2]; + state[2] = tmp0; + + // divide by two and store temporarily + in[i << 1] = (state[3] >> 1); + } + + in++; + + // upper allpass filter (operates on odd input samples) + for (i = 0; i < len; i++) + { + tmp0 = in[i << 1]; + diff = tmp0 - state[5]; + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[4] + diff * kResampleAllpass[0][0]; + state[4] = tmp0; + diff = tmp1 - state[6]; + // scale down and round + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[5] + diff * kResampleAllpass[0][1]; + state[5] = tmp1; + diff = tmp0 - state[7]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[7] = state[6] + diff * kResampleAllpass[0][2]; + state[6] = tmp0; + + // divide by two and store temporarily + in[i << 1] = (state[7] >> 1); + } + + in--; + + // combine allpass outputs + for (i = 0; i < len; i += 2) + { + // divide by two, add both allpass outputs and round + tmp0 = (in[i << 1] + in[(i << 1) + 1]) >> 15; + tmp1 = (in[(i << 1) + 2] + in[(i << 1) + 3]) >> 15; + if (tmp0 > (int32_t)0x00007FFF) + tmp0 = 0x00007FFF; + if (tmp0 < (int32_t)0xFFFF8000) + tmp0 = 0xFFFF8000; + out[i] = (int16_t)tmp0; + if (tmp1 > (int32_t)0x00007FFF) + tmp1 = 0x00007FFF; + if (tmp1 < (int32_t)0xFFFF8000) + tmp1 = 0xFFFF8000; + out[i + 1] = (int16_t)tmp1; + } +} + +// +// decimator +// input: int16_t +// output: int32_t (shifted 15 positions to the left, + offset 16384) (of length len/2) +// state: filter state array; length = 8 + +void RTC_NO_SANITIZE("signed-integer-overflow") // bugs.webrtc.org/5486 +WebRtcSpl_DownBy2ShortToInt(const int16_t *in, + int32_t len, + int32_t *out, + int32_t *state) +{ + int32_t tmp0, tmp1, diff; + int32_t i; + + len >>= 1; + + // lower allpass filter (operates on even input samples) + for (i = 0; i < len; i++) + { + tmp0 = ((int32_t)in[i << 1] << 15) + (1 << 14); + diff = tmp0 - state[1]; + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[0] + diff * kResampleAllpass[1][0]; + state[0] = tmp0; + diff = tmp1 - state[2]; + // UBSan: -1379909682 - 834099714 cannot be represented in type 'int' + + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[1] + diff * kResampleAllpass[1][1]; + state[1] = tmp1; + diff = tmp0 - state[3]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[3] = state[2] + diff * kResampleAllpass[1][2]; + state[2] = tmp0; + + // divide by two and store temporarily + out[i] = (state[3] >> 1); + } + + in++; + + // upper allpass filter (operates on odd input samples) + for (i = 0; i < len; i++) + { + tmp0 = ((int32_t)in[i << 1] << 15) + (1 << 14); + diff = tmp0 - state[5]; + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[4] + diff * kResampleAllpass[0][0]; + state[4] = tmp0; + diff = tmp1 - state[6]; + // scale down and round + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[5] + diff * kResampleAllpass[0][1]; + state[5] = tmp1; + diff = tmp0 - state[7]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[7] = state[6] + diff * kResampleAllpass[0][2]; + state[6] = tmp0; + + // divide by two and store temporarily + out[i] += (state[7] >> 1); + } + + in--; +} + +// +// interpolator +// input: int16_t +// output: int32_t (normalized, not saturated) (of length len*2) +// state: filter state array; length = 8 +void WebRtcSpl_UpBy2ShortToInt(const int16_t *in, int32_t len, int32_t *out, + int32_t *state) +{ + int32_t tmp0, tmp1, diff; + int32_t i; + + // upper allpass filter (generates odd output samples) + for (i = 0; i < len; i++) + { + tmp0 = ((int32_t)in[i] << 15) + (1 << 14); + diff = tmp0 - state[5]; + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[4] + diff * kResampleAllpass[0][0]; + state[4] = tmp0; + diff = tmp1 - state[6]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[5] + diff * kResampleAllpass[0][1]; + state[5] = tmp1; + diff = tmp0 - state[7]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[7] = state[6] + diff * kResampleAllpass[0][2]; + state[6] = tmp0; + + // scale down, round and store + out[i << 1] = state[7] >> 15; + } + + out++; + + // lower allpass filter (generates even output samples) + for (i = 0; i < len; i++) + { + tmp0 = ((int32_t)in[i] << 15) + (1 << 14); + diff = tmp0 - state[1]; + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[0] + diff * kResampleAllpass[1][0]; + state[0] = tmp0; + diff = tmp1 - state[2]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[1] + diff * kResampleAllpass[1][1]; + state[1] = tmp1; + diff = tmp0 - state[3]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[3] = state[2] + diff * kResampleAllpass[1][2]; + state[2] = tmp0; + + // scale down, round and store + out[i << 1] = state[3] >> 15; + } +} + +// +// interpolator +// input: int32_t (shifted 15 positions to the left, + offset 16384) +// output: int32_t (shifted 15 positions to the left, + offset 16384) (of length len*2) +// state: filter state array; length = 8 +void WebRtcSpl_UpBy2IntToInt(const int32_t *in, int32_t len, int32_t *out, + int32_t *state) +{ + int32_t tmp0, tmp1, diff; + int32_t i; + + // upper allpass filter (generates odd output samples) + for (i = 0; i < len; i++) + { + tmp0 = in[i]; + diff = tmp0 - state[5]; + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[4] + diff * kResampleAllpass[0][0]; + state[4] = tmp0; + diff = tmp1 - state[6]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[5] + diff * kResampleAllpass[0][1]; + state[5] = tmp1; + diff = tmp0 - state[7]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[7] = state[6] + diff * kResampleAllpass[0][2]; + state[6] = tmp0; + + // scale down, round and store + out[i << 1] = state[7]; + } + + out++; + + // lower allpass filter (generates even output samples) + for (i = 0; i < len; i++) + { + tmp0 = in[i]; + diff = tmp0 - state[1]; + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[0] + diff * kResampleAllpass[1][0]; + state[0] = tmp0; + diff = tmp1 - state[2]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[1] + diff * kResampleAllpass[1][1]; + state[1] = tmp1; + diff = tmp0 - state[3]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[3] = state[2] + diff * kResampleAllpass[1][2]; + state[2] = tmp0; + + // scale down, round and store + out[i << 1] = state[3]; + } +} + +// +// interpolator +// input: int32_t (shifted 15 positions to the left, + offset 16384) +// output: int16_t (saturated) (of length len*2) +// state: filter state array; length = 8 +void WebRtcSpl_UpBy2IntToShort(const int32_t *in, int32_t len, int16_t *out, + int32_t *state) +{ + int32_t tmp0, tmp1, diff; + int32_t i; + + // upper allpass filter (generates odd output samples) + for (i = 0; i < len; i++) + { + tmp0 = in[i]; + diff = tmp0 - state[5]; + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[4] + diff * kResampleAllpass[0][0]; + state[4] = tmp0; + diff = tmp1 - state[6]; + // scale down and round + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[5] + diff * kResampleAllpass[0][1]; + state[5] = tmp1; + diff = tmp0 - state[7]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[7] = state[6] + diff * kResampleAllpass[0][2]; + state[6] = tmp0; + + // scale down, saturate and store + tmp1 = state[7] >> 15; + if (tmp1 > (int32_t)0x00007FFF) + tmp1 = 0x00007FFF; + if (tmp1 < (int32_t)0xFFFF8000) + tmp1 = 0xFFFF8000; + out[i << 1] = (int16_t)tmp1; + } + + out++; + + // lower allpass filter (generates even output samples) + for (i = 0; i < len; i++) + { + tmp0 = in[i]; + diff = tmp0 - state[1]; + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[0] + diff * kResampleAllpass[1][0]; + state[0] = tmp0; + diff = tmp1 - state[2]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[1] + diff * kResampleAllpass[1][1]; + state[1] = tmp1; + diff = tmp0 - state[3]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[3] = state[2] + diff * kResampleAllpass[1][2]; + state[2] = tmp0; + + // scale down, saturate and store + tmp1 = state[3] >> 15; + if (tmp1 > (int32_t)0x00007FFF) + tmp1 = 0x00007FFF; + if (tmp1 < (int32_t)0xFFFF8000) + tmp1 = 0xFFFF8000; + out[i << 1] = (int16_t)tmp1; + } +} + +// lowpass filter +// input: int16_t +// output: int32_t (normalized, not saturated) +// state: filter state array; length = 8 +void WebRtcSpl_LPBy2ShortToInt(const int16_t* in, int32_t len, int32_t* out, + int32_t* state) +{ + int32_t tmp0, tmp1, diff; + int32_t i; + + len >>= 1; + + // lower allpass filter: odd input -> even output samples + in++; + // initial state of polyphase delay element + tmp0 = state[12]; + for (i = 0; i < len; i++) + { + diff = tmp0 - state[1]; + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[0] + diff * kResampleAllpass[1][0]; + state[0] = tmp0; + diff = tmp1 - state[2]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[1] + diff * kResampleAllpass[1][1]; + state[1] = tmp1; + diff = tmp0 - state[3]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[3] = state[2] + diff * kResampleAllpass[1][2]; + state[2] = tmp0; + + // scale down, round and store + out[i << 1] = state[3] >> 1; + tmp0 = ((int32_t)in[i << 1] << 15) + (1 << 14); + } + in--; + + // upper allpass filter: even input -> even output samples + for (i = 0; i < len; i++) + { + tmp0 = ((int32_t)in[i << 1] << 15) + (1 << 14); + diff = tmp0 - state[5]; + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[4] + diff * kResampleAllpass[0][0]; + state[4] = tmp0; + diff = tmp1 - state[6]; + // scale down and round + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[5] + diff * kResampleAllpass[0][1]; + state[5] = tmp1; + diff = tmp0 - state[7]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[7] = state[6] + diff * kResampleAllpass[0][2]; + state[6] = tmp0; + + // average the two allpass outputs, scale down and store + out[i << 1] = (out[i << 1] + (state[7] >> 1)) >> 15; + } + + // switch to odd output samples + out++; + + // lower allpass filter: even input -> odd output samples + for (i = 0; i < len; i++) + { + tmp0 = ((int32_t)in[i << 1] << 15) + (1 << 14); + diff = tmp0 - state[9]; + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[8] + diff * kResampleAllpass[1][0]; + state[8] = tmp0; + diff = tmp1 - state[10]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[9] + diff * kResampleAllpass[1][1]; + state[9] = tmp1; + diff = tmp0 - state[11]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[11] = state[10] + diff * kResampleAllpass[1][2]; + state[10] = tmp0; + + // scale down, round and store + out[i << 1] = state[11] >> 1; + } + + // upper allpass filter: odd input -> odd output samples + in++; + for (i = 0; i < len; i++) + { + tmp0 = ((int32_t)in[i << 1] << 15) + (1 << 14); + diff = tmp0 - state[13]; + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[12] + diff * kResampleAllpass[0][0]; + state[12] = tmp0; + diff = tmp1 - state[14]; + // scale down and round + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[13] + diff * kResampleAllpass[0][1]; + state[13] = tmp1; + diff = tmp0 - state[15]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[15] = state[14] + diff * kResampleAllpass[0][2]; + state[14] = tmp0; + + // average the two allpass outputs, scale down and store + out[i << 1] = (out[i << 1] + (state[15] >> 1)) >> 15; + } +} + +// lowpass filter +// input: int32_t (shifted 15 positions to the left, + offset 16384) +// output: int32_t (normalized, not saturated) +// state: filter state array; length = 8 +void RTC_NO_SANITIZE("signed-integer-overflow") // bugs.webrtc.org/5486 +WebRtcSpl_LPBy2IntToInt(const int32_t* in, int32_t len, int32_t* out, + int32_t* state) +{ + int32_t tmp0, tmp1, diff; + int32_t i; + + len >>= 1; + + // lower allpass filter: odd input -> even output samples + in++; + // initial state of polyphase delay element + tmp0 = state[12]; + for (i = 0; i < len; i++) + { + diff = tmp0 - state[1]; + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[0] + diff * kResampleAllpass[1][0]; + state[0] = tmp0; + diff = tmp1 - state[2]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[1] + diff * kResampleAllpass[1][1]; + state[1] = tmp1; + diff = tmp0 - state[3]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[3] = state[2] + diff * kResampleAllpass[1][2]; + state[2] = tmp0; + + // scale down, round and store + out[i << 1] = state[3] >> 1; + tmp0 = in[i << 1]; + } + in--; + + // upper allpass filter: even input -> even output samples + for (i = 0; i < len; i++) + { + tmp0 = in[i << 1]; + diff = tmp0 - state[5]; + // UBSan: -794814117 - 1566149201 cannot be represented in type 'int' + + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[4] + diff * kResampleAllpass[0][0]; + state[4] = tmp0; + diff = tmp1 - state[6]; + // scale down and round + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[5] + diff * kResampleAllpass[0][1]; + state[5] = tmp1; + diff = tmp0 - state[7]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[7] = state[6] + diff * kResampleAllpass[0][2]; + state[6] = tmp0; + + // average the two allpass outputs, scale down and store + out[i << 1] = (out[i << 1] + (state[7] >> 1)) >> 15; + } + + // switch to odd output samples + out++; + + // lower allpass filter: even input -> odd output samples + for (i = 0; i < len; i++) + { + tmp0 = in[i << 1]; + diff = tmp0 - state[9]; + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[8] + diff * kResampleAllpass[1][0]; + state[8] = tmp0; + diff = tmp1 - state[10]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[9] + diff * kResampleAllpass[1][1]; + state[9] = tmp1; + diff = tmp0 - state[11]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[11] = state[10] + diff * kResampleAllpass[1][2]; + state[10] = tmp0; + + // scale down, round and store + out[i << 1] = state[11] >> 1; + } + + // upper allpass filter: odd input -> odd output samples + in++; + for (i = 0; i < len; i++) + { + tmp0 = in[i << 1]; + diff = tmp0 - state[13]; + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[12] + diff * kResampleAllpass[0][0]; + state[12] = tmp0; + diff = tmp1 - state[14]; + // scale down and round + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[13] + diff * kResampleAllpass[0][1]; + state[13] = tmp1; + diff = tmp0 - state[15]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[15] = state[14] + diff * kResampleAllpass[0][2]; + state[14] = tmp0; + + // average the two allpass outputs, scale down and store + out[i << 1] = (out[i << 1] + (state[15] >> 1)) >> 15; + } +} diff --git a/src/common_audio/signal_processing/resample_by_2_internal.h b/src/common_audio/signal_processing/resample_by_2_internal.h new file mode 100644 index 0000000..f7aafe9 --- /dev/null +++ b/src/common_audio/signal_processing/resample_by_2_internal.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +/* + * This header file contains some internal resampling functions. + * + */ + +#ifndef COMMON_AUDIO_SIGNAL_PROCESSING_RESAMPLE_BY_2_INTERNAL_H_ +#define COMMON_AUDIO_SIGNAL_PROCESSING_RESAMPLE_BY_2_INTERNAL_H_ + +#include +#ifdef HAVE_STDINT_H +#include +#else +#include "rtc_base/typedefs.h" +#endif + +/******************************************************************* + * resample_by_2_fast.c + * Functions for internal use in the other resample functions + ******************************************************************/ +void WebRtcSpl_DownBy2IntToShort(int32_t* in, + int32_t len, + int16_t* out, + int32_t* state); + +void WebRtcSpl_DownBy2ShortToInt(const int16_t* in, + int32_t len, + int32_t* out, + int32_t* state); + +void WebRtcSpl_UpBy2ShortToInt(const int16_t* in, + int32_t len, + int32_t* out, + int32_t* state); + +void WebRtcSpl_UpBy2IntToInt(const int32_t* in, + int32_t len, + int32_t* out, + int32_t* state); + +void WebRtcSpl_UpBy2IntToShort(const int32_t* in, + int32_t len, + int16_t* out, + int32_t* state); + +void WebRtcSpl_LPBy2ShortToInt(const int16_t* in, + int32_t len, + int32_t* out, + int32_t* state); + +void WebRtcSpl_LPBy2IntToInt(const int32_t* in, + int32_t len, + int32_t* out, + int32_t* state); + +#endif // COMMON_AUDIO_SIGNAL_PROCESSING_RESAMPLE_BY_2_INTERNAL_H_ diff --git a/src/common_audio/signal_processing/resample_fractional.c b/src/common_audio/signal_processing/resample_fractional.c new file mode 100644 index 0000000..9ffe0ac --- /dev/null +++ b/src/common_audio/signal_processing/resample_fractional.c @@ -0,0 +1,239 @@ +/* + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + + +/* + * This file contains the resampling functions between 48, 44, 32 and 24 kHz. + * The description headers can be found in signal_processing_library.h + * + */ + +#include "common_audio/signal_processing/include/signal_processing_library.h" + +// interpolation coefficients +static const int16_t kCoefficients48To32[2][8] = { + {778, -2050, 1087, 23285, 12903, -3783, 441, 222}, + {222, 441, -3783, 12903, 23285, 1087, -2050, 778} +}; + +static const int16_t kCoefficients32To24[3][8] = { + {767, -2362, 2434, 24406, 10620, -3838, 721, 90}, + {386, -381, -2646, 19062, 19062, -2646, -381, 386}, + {90, 721, -3838, 10620, 24406, 2434, -2362, 767} +}; + +static const int16_t kCoefficients44To32[4][9] = { + {117, -669, 2245, -6183, 26267, 13529, -3245, 845, -138}, + {-101, 612, -2283, 8532, 29790, -5138, 1789, -524, 91}, + {50, -292, 1016, -3064, 32010, 3933, -1147, 315, -53}, + {-156, 974, -3863, 18603, 21691, -6246, 2353, -712, 126} +}; + +// Resampling ratio: 2/3 +// input: int32_t (normalized, not saturated) :: size 3 * K +// output: int32_t (shifted 15 positions to the left, + offset 16384) :: size 2 * K +// K: number of blocks + +void WebRtcSpl_Resample48khzTo32khz(const int32_t *In, int32_t *Out, size_t K) +{ + ///////////////////////////////////////////////////////////// + // Filter operation: + // + // Perform resampling (3 input samples -> 2 output samples); + // process in sub blocks of size 3 samples. + int32_t tmp; + size_t m; + + for (m = 0; m < K; m++) + { + tmp = 1 << 14; + tmp += kCoefficients48To32[0][0] * In[0]; + tmp += kCoefficients48To32[0][1] * In[1]; + tmp += kCoefficients48To32[0][2] * In[2]; + tmp += kCoefficients48To32[0][3] * In[3]; + tmp += kCoefficients48To32[0][4] * In[4]; + tmp += kCoefficients48To32[0][5] * In[5]; + tmp += kCoefficients48To32[0][6] * In[6]; + tmp += kCoefficients48To32[0][7] * In[7]; + Out[0] = tmp; + + tmp = 1 << 14; + tmp += kCoefficients48To32[1][0] * In[1]; + tmp += kCoefficients48To32[1][1] * In[2]; + tmp += kCoefficients48To32[1][2] * In[3]; + tmp += kCoefficients48To32[1][3] * In[4]; + tmp += kCoefficients48To32[1][4] * In[5]; + tmp += kCoefficients48To32[1][5] * In[6]; + tmp += kCoefficients48To32[1][6] * In[7]; + tmp += kCoefficients48To32[1][7] * In[8]; + Out[1] = tmp; + + // update pointers + In += 3; + Out += 2; + } +} + +// Resampling ratio: 3/4 +// input: int32_t (normalized, not saturated) :: size 4 * K +// output: int32_t (shifted 15 positions to the left, + offset 16384) :: size 3 * K +// K: number of blocks + +void WebRtcSpl_Resample32khzTo24khz(const int32_t *In, int32_t *Out, size_t K) +{ + ///////////////////////////////////////////////////////////// + // Filter operation: + // + // Perform resampling (4 input samples -> 3 output samples); + // process in sub blocks of size 4 samples. + size_t m; + int32_t tmp; + + for (m = 0; m < K; m++) + { + tmp = 1 << 14; + tmp += kCoefficients32To24[0][0] * In[0]; + tmp += kCoefficients32To24[0][1] * In[1]; + tmp += kCoefficients32To24[0][2] * In[2]; + tmp += kCoefficients32To24[0][3] * In[3]; + tmp += kCoefficients32To24[0][4] * In[4]; + tmp += kCoefficients32To24[0][5] * In[5]; + tmp += kCoefficients32To24[0][6] * In[6]; + tmp += kCoefficients32To24[0][7] * In[7]; + Out[0] = tmp; + + tmp = 1 << 14; + tmp += kCoefficients32To24[1][0] * In[1]; + tmp += kCoefficients32To24[1][1] * In[2]; + tmp += kCoefficients32To24[1][2] * In[3]; + tmp += kCoefficients32To24[1][3] * In[4]; + tmp += kCoefficients32To24[1][4] * In[5]; + tmp += kCoefficients32To24[1][5] * In[6]; + tmp += kCoefficients32To24[1][6] * In[7]; + tmp += kCoefficients32To24[1][7] * In[8]; + Out[1] = tmp; + + tmp = 1 << 14; + tmp += kCoefficients32To24[2][0] * In[2]; + tmp += kCoefficients32To24[2][1] * In[3]; + tmp += kCoefficients32To24[2][2] * In[4]; + tmp += kCoefficients32To24[2][3] * In[5]; + tmp += kCoefficients32To24[2][4] * In[6]; + tmp += kCoefficients32To24[2][5] * In[7]; + tmp += kCoefficients32To24[2][6] * In[8]; + tmp += kCoefficients32To24[2][7] * In[9]; + Out[2] = tmp; + + // update pointers + In += 4; + Out += 3; + } +} + +// +// fractional resampling filters +// Fout = 11/16 * Fin +// Fout = 8/11 * Fin +// + +// compute two inner-products and store them to output array +static void WebRtcSpl_ResampDotProduct(const int32_t *in1, const int32_t *in2, + const int16_t *coef_ptr, int32_t *out1, + int32_t *out2) +{ + int32_t tmp1 = 16384; + int32_t tmp2 = 16384; + int16_t coef; + + coef = coef_ptr[0]; + tmp1 += coef * in1[0]; + tmp2 += coef * in2[-0]; + + coef = coef_ptr[1]; + tmp1 += coef * in1[1]; + tmp2 += coef * in2[-1]; + + coef = coef_ptr[2]; + tmp1 += coef * in1[2]; + tmp2 += coef * in2[-2]; + + coef = coef_ptr[3]; + tmp1 += coef * in1[3]; + tmp2 += coef * in2[-3]; + + coef = coef_ptr[4]; + tmp1 += coef * in1[4]; + tmp2 += coef * in2[-4]; + + coef = coef_ptr[5]; + tmp1 += coef * in1[5]; + tmp2 += coef * in2[-5]; + + coef = coef_ptr[6]; + tmp1 += coef * in1[6]; + tmp2 += coef * in2[-6]; + + coef = coef_ptr[7]; + tmp1 += coef * in1[7]; + tmp2 += coef * in2[-7]; + + coef = coef_ptr[8]; + *out1 = tmp1 + coef * in1[8]; + *out2 = tmp2 + coef * in2[-8]; +} + +// Resampling ratio: 8/11 +// input: int32_t (normalized, not saturated) :: size 11 * K +// output: int32_t (shifted 15 positions to the left, + offset 16384) :: size 8 * K +// K: number of blocks + +void WebRtcSpl_Resample44khzTo32khz(const int32_t *In, int32_t *Out, size_t K) +{ + ///////////////////////////////////////////////////////////// + // Filter operation: + // + // Perform resampling (11 input samples -> 8 output samples); + // process in sub blocks of size 11 samples. + int32_t tmp; + size_t m; + + for (m = 0; m < K; m++) + { + tmp = 1 << 14; + + // first output sample + Out[0] = ((int32_t)In[3] << 15) + tmp; + + // sum and accumulate filter coefficients and input samples + tmp += kCoefficients44To32[3][0] * In[5]; + tmp += kCoefficients44To32[3][1] * In[6]; + tmp += kCoefficients44To32[3][2] * In[7]; + tmp += kCoefficients44To32[3][3] * In[8]; + tmp += kCoefficients44To32[3][4] * In[9]; + tmp += kCoefficients44To32[3][5] * In[10]; + tmp += kCoefficients44To32[3][6] * In[11]; + tmp += kCoefficients44To32[3][7] * In[12]; + tmp += kCoefficients44To32[3][8] * In[13]; + Out[4] = tmp; + + // sum and accumulate filter coefficients and input samples + WebRtcSpl_ResampDotProduct(&In[0], &In[17], kCoefficients44To32[0], &Out[1], &Out[7]); + + // sum and accumulate filter coefficients and input samples + WebRtcSpl_ResampDotProduct(&In[2], &In[15], kCoefficients44To32[1], &Out[2], &Out[6]); + + // sum and accumulate filter coefficients and input samples + WebRtcSpl_ResampDotProduct(&In[3], &In[14], kCoefficients44To32[2], &Out[3], &Out[5]); + + // update pointers + In += 11; + Out += 8; + } +} diff --git a/src/common_audio/signal_processing/spl_inl.c b/src/common_audio/signal_processing/spl_inl.c new file mode 100644 index 0000000..d09e308 --- /dev/null +++ b/src/common_audio/signal_processing/spl_inl.c @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include + +#include "common_audio/signal_processing/include/spl_inl.h" + +// Table used by WebRtcSpl_CountLeadingZeros32_NotBuiltin. For each uint32_t n +// that's a sequence of 0 bits followed by a sequence of 1 bits, the entry at +// index (n * 0x8c0b2891) >> 26 in this table gives the number of zero bits in +// n. +const int8_t kWebRtcSpl_CountLeadingZeros32_Table[64] = { + 32, 8, 17, -1, -1, 14, -1, -1, -1, 20, -1, -1, -1, 28, -1, 18, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 26, 25, 24, + 4, 11, 23, 31, 3, 7, 10, 16, 22, 30, -1, -1, 2, 6, 13, 9, + -1, 15, -1, 21, -1, 29, 19, -1, -1, -1, -1, -1, 1, 27, 5, 12, +}; diff --git a/src/common_audio/signal_processing/vector_scaling_operations.c b/src/common_audio/signal_processing/vector_scaling_operations.c new file mode 100644 index 0000000..7307dc7 --- /dev/null +++ b/src/common_audio/signal_processing/vector_scaling_operations.c @@ -0,0 +1,165 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + + +/* + * This file contains implementations of the functions + * WebRtcSpl_VectorBitShiftW16() + * WebRtcSpl_VectorBitShiftW32() + * WebRtcSpl_VectorBitShiftW32ToW16() + * WebRtcSpl_ScaleVector() + * WebRtcSpl_ScaleVectorWithSat() + * WebRtcSpl_ScaleAndAddVectors() + * WebRtcSpl_ScaleAndAddVectorsWithRoundC() + */ + +#include "common_audio/signal_processing/include/signal_processing_library.h" + +void WebRtcSpl_VectorBitShiftW16(int16_t *res, size_t length, + const int16_t *in, int16_t right_shifts) +{ + size_t i; + + if (right_shifts > 0) + { + for (i = length; i > 0; i--) + { + (*res++) = ((*in++) >> right_shifts); + } + } else + { + for (i = length; i > 0; i--) + { + (*res++) = ((*in++) * (1 << (-right_shifts))); + } + } +} + +void WebRtcSpl_VectorBitShiftW32(int32_t *out_vector, + size_t vector_length, + const int32_t *in_vector, + int16_t right_shifts) +{ + size_t i; + + if (right_shifts > 0) + { + for (i = vector_length; i > 0; i--) + { + (*out_vector++) = ((*in_vector++) >> right_shifts); + } + } else + { + for (i = vector_length; i > 0; i--) + { + (*out_vector++) = ((*in_vector++) << (-right_shifts)); + } + } +} + +void WebRtcSpl_VectorBitShiftW32ToW16(int16_t* out, size_t length, + const int32_t* in, int right_shifts) { + size_t i; + int32_t tmp_w32; + + if (right_shifts >= 0) { + for (i = length; i > 0; i--) { + tmp_w32 = (*in++) >> right_shifts; + (*out++) = WebRtcSpl_SatW32ToW16(tmp_w32); + } + } else { + int left_shifts = -right_shifts; + for (i = length; i > 0; i--) { + tmp_w32 = (*in++) << left_shifts; + (*out++) = WebRtcSpl_SatW32ToW16(tmp_w32); + } + } +} + +void WebRtcSpl_ScaleVector(const int16_t *in_vector, int16_t *out_vector, + int16_t gain, size_t in_vector_length, + int16_t right_shifts) +{ + // Performs vector operation: out_vector = (gain*in_vector)>>right_shifts + size_t i; + const int16_t *inptr; + int16_t *outptr; + + inptr = in_vector; + outptr = out_vector; + + for (i = 0; i < in_vector_length; i++) + { + *outptr++ = (int16_t)((*inptr++ * gain) >> right_shifts); + } +} + +void WebRtcSpl_ScaleVectorWithSat(const int16_t *in_vector, int16_t *out_vector, + int16_t gain, size_t in_vector_length, + int16_t right_shifts) +{ + // Performs vector operation: out_vector = (gain*in_vector)>>right_shifts + size_t i; + const int16_t *inptr; + int16_t *outptr; + + inptr = in_vector; + outptr = out_vector; + + for (i = 0; i < in_vector_length; i++) { + *outptr++ = WebRtcSpl_SatW32ToW16((*inptr++ * gain) >> right_shifts); + } +} + +void WebRtcSpl_ScaleAndAddVectors(const int16_t *in1, int16_t gain1, int shift1, + const int16_t *in2, int16_t gain2, int shift2, + int16_t *out, size_t vector_length) +{ + // Performs vector operation: out = (gain1*in1)>>shift1 + (gain2*in2)>>shift2 + size_t i; + const int16_t *in1ptr; + const int16_t *in2ptr; + int16_t *outptr; + + in1ptr = in1; + in2ptr = in2; + outptr = out; + + for (i = 0; i < vector_length; i++) + { + *outptr++ = (int16_t)((gain1 * *in1ptr++) >> shift1) + + (int16_t)((gain2 * *in2ptr++) >> shift2); + } +} + +// C version of WebRtcSpl_ScaleAndAddVectorsWithRound() for generic platforms. +int WebRtcSpl_ScaleAndAddVectorsWithRoundC(const int16_t* in_vector1, + int16_t in_vector1_scale, + const int16_t* in_vector2, + int16_t in_vector2_scale, + int right_shifts, + int16_t* out_vector, + size_t length) { + size_t i = 0; + int round_value = (1 << right_shifts) >> 1; + + if (in_vector1 == NULL || in_vector2 == NULL || out_vector == NULL || + length == 0 || right_shifts < 0) { + return -1; + } + + for (i = 0; i < length; i++) { + out_vector[i] = (int16_t)(( + in_vector1[i] * in_vector1_scale + in_vector2[i] * in_vector2_scale + + round_value) >> right_shifts); + } + + return 0; +} diff --git a/src/common_audio/vad/include/webrtc_vad.h b/src/common_audio/vad/include/webrtc_vad.h new file mode 100644 index 0000000..543a0dc --- /dev/null +++ b/src/common_audio/vad/include/webrtc_vad.h @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +/* + * This header file includes the VAD API calls. Specific function calls are + * given below. + */ + +#ifndef COMMON_AUDIO_VAD_INCLUDE_WEBRTC_VAD_H_ // NOLINT +#define COMMON_AUDIO_VAD_INCLUDE_WEBRTC_VAD_H_ + +#include + +#include +#ifdef HAVE_STDINT_H +#include +#else +#include "rtc_base/typedefs.h" +#endif + +typedef struct WebRtcVadInst VadInst; + +#ifdef __cplusplus +extern "C" { +#endif + +// Creates an instance to the VAD structure. +VadInst* WebRtcVad_Create(void); + +// Frees the dynamic memory of a specified VAD instance. +// +// - handle [i] : Pointer to VAD instance that should be freed. +void WebRtcVad_Free(VadInst* handle); + +// Initializes a VAD instance. +// +// - handle [i/o] : Instance that should be initialized. +// +// returns : 0 - (OK), +// -1 - (null pointer or Default mode could not be set). +int WebRtcVad_Init(VadInst* handle); + +// Sets the VAD operating mode. A more aggressive (higher mode) VAD is more +// restrictive in reporting speech. Put in other words the probability of being +// speech when the VAD returns 1 is increased with increasing mode. As a +// consequence also the missed detection rate goes up. +// +// - handle [i/o] : VAD instance. +// - mode [i] : Aggressiveness mode (0, 1, 2, or 3). +// +// returns : 0 - (OK), +// -1 - (null pointer, mode could not be set or the VAD instance +// has not been initialized). +int WebRtcVad_set_mode(VadInst* handle, int mode); + +// Calculates a VAD decision for the `audio_frame`. For valid sampling rates +// frame lengths, see the description of WebRtcVad_ValidRatesAndFrameLengths(). +// +// - handle [i/o] : VAD Instance. Needs to be initialized by +// WebRtcVad_Init() before call. +// - fs [i] : Sampling frequency (Hz): 8000, 16000, or 32000 +// - audio_frame [i] : Audio frame buffer. +// - frame_length [i] : Length of audio frame buffer in number of samples. +// +// returns : 1 - (Active Voice), +// 0 - (Non-active Voice), +// -1 - (Error) +int WebRtcVad_Process(VadInst* handle, + int fs, + const int16_t* audio_frame, + size_t frame_length); + +// Checks for valid combinations of `rate` and `frame_length`. We support 10, +// 20 and 30 ms frames and the rates 8000, 16000 and 32000 Hz. +// +// - rate [i] : Sampling frequency (Hz). +// - frame_length [i] : Speech frame buffer length in number of samples. +// +// returns : 0 - (valid combination), -1 - (invalid combination) +int WebRtcVad_ValidRateAndFrameLength(int rate, size_t frame_length); + +#ifdef __cplusplus +} +#endif + +#endif // COMMON_AUDIO_VAD_INCLUDE_WEBRTC_VAD_H_ // NOLINT diff --git a/src/common_audio/vad/vad_core.c b/src/common_audio/vad/vad_core.c new file mode 100644 index 0000000..0872449 --- /dev/null +++ b/src/common_audio/vad/vad_core.c @@ -0,0 +1,685 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "common_audio/vad/vad_core.h" + +#include "rtc_base/sanitizer.h" +#include "common_audio/signal_processing/include/signal_processing_library.h" +#include "common_audio/vad/vad_filterbank.h" +#include "common_audio/vad/vad_gmm.h" +#include "common_audio/vad/vad_sp.h" + +// Spectrum Weighting +static const int16_t kSpectrumWeight[kNumChannels] = { 6, 8, 10, 12, 14, 16 }; +static const int16_t kNoiseUpdateConst = 655; // Q15 +static const int16_t kSpeechUpdateConst = 6554; // Q15 +static const int16_t kBackEta = 154; // Q8 +// Minimum difference between the two models, Q5 +static const int16_t kMinimumDifference[kNumChannels] = { + 544, 544, 576, 576, 576, 576 }; +// Upper limit of mean value for speech model, Q7 +static const int16_t kMaximumSpeech[kNumChannels] = { + 11392, 11392, 11520, 11520, 11520, 11520 }; +// Minimum value for mean value +static const int16_t kMinimumMean[kNumGaussians] = { 640, 768 }; +// Upper limit of mean value for noise model, Q7 +static const int16_t kMaximumNoise[kNumChannels] = { + 9216, 9088, 8960, 8832, 8704, 8576 }; +// Start values for the Gaussian models, Q7 +// Weights for the two Gaussians for the six channels (noise) +static const int16_t kNoiseDataWeights[kTableSize] = { + 34, 62, 72, 66, 53, 25, 94, 66, 56, 62, 75, 103 }; +// Weights for the two Gaussians for the six channels (speech) +static const int16_t kSpeechDataWeights[kTableSize] = { + 48, 82, 45, 87, 50, 47, 80, 46, 83, 41, 78, 81 }; +// Means for the two Gaussians for the six channels (noise) +static const int16_t kNoiseDataMeans[kTableSize] = { + 6738, 4892, 7065, 6715, 6771, 3369, 7646, 3863, 7820, 7266, 5020, 4362 }; +// Means for the two Gaussians for the six channels (speech) +static const int16_t kSpeechDataMeans[kTableSize] = { + 8306, 10085, 10078, 11823, 11843, 6309, 9473, 9571, 10879, 7581, 8180, 7483 +}; +// Stds for the two Gaussians for the six channels (noise) +static const int16_t kNoiseDataStds[kTableSize] = { + 378, 1064, 493, 582, 688, 593, 474, 697, 475, 688, 421, 455 }; +// Stds for the two Gaussians for the six channels (speech) +static const int16_t kSpeechDataStds[kTableSize] = { + 555, 505, 567, 524, 585, 1231, 509, 828, 492, 1540, 1079, 850 }; + +// Constants used in GmmProbability(). +// +// Maximum number of counted speech (VAD = 1) frames in a row. +static const int16_t kMaxSpeechFrames = 6; +// Minimum standard deviation for both speech and noise. +static const int16_t kMinStd = 384; + +// Constants in WebRtcVad_InitCore(). +// Default aggressiveness mode. +static const short kDefaultMode = 0; +static const int kInitCheck = 42; + +// Constants used in WebRtcVad_set_mode_core(). +// +// Thresholds for different frame lengths (10 ms, 20 ms and 30 ms). +// +// Mode 0, Quality. +static const int16_t kOverHangMax1Q[3] = { 8, 4, 3 }; +static const int16_t kOverHangMax2Q[3] = { 14, 7, 5 }; +static const int16_t kLocalThresholdQ[3] = { 24, 21, 24 }; +static const int16_t kGlobalThresholdQ[3] = { 57, 48, 57 }; +// Mode 1, Low bitrate. +static const int16_t kOverHangMax1LBR[3] = { 8, 4, 3 }; +static const int16_t kOverHangMax2LBR[3] = { 14, 7, 5 }; +static const int16_t kLocalThresholdLBR[3] = { 37, 32, 37 }; +static const int16_t kGlobalThresholdLBR[3] = { 100, 80, 100 }; +// Mode 2, Aggressive. +static const int16_t kOverHangMax1AGG[3] = { 6, 3, 2 }; +static const int16_t kOverHangMax2AGG[3] = { 9, 5, 3 }; +static const int16_t kLocalThresholdAGG[3] = { 82, 78, 82 }; +static const int16_t kGlobalThresholdAGG[3] = { 285, 260, 285 }; +// Mode 3, Very aggressive. +static const int16_t kOverHangMax1VAG[3] = { 6, 3, 2 }; +static const int16_t kOverHangMax2VAG[3] = { 9, 5, 3 }; +static const int16_t kLocalThresholdVAG[3] = { 94, 94, 94 }; +static const int16_t kGlobalThresholdVAG[3] = { 1100, 1050, 1100 }; + +// Calculates the weighted average w.r.t. number of Gaussians. The `data` are +// updated with an `offset` before averaging. +// +// - data [i/o] : Data to average. +// - offset [i] : An offset added to `data`. +// - weights [i] : Weights used for averaging. +// +// returns : The weighted average. +static int32_t WeightedAverage(int16_t* data, int16_t offset, + const int16_t* weights) { + int k; + int32_t weighted_average = 0; + + for (k = 0; k < kNumGaussians; k++) { + data[k * kNumChannels] += offset; + weighted_average += data[k * kNumChannels] * weights[k * kNumChannels]; + } + return weighted_average; +} + +// An s16 x s32 -> s32 multiplication that's allowed to overflow. (It's still +// undefined behavior, so not a good idea; this just makes UBSan ignore the +// violation, so that our old code can continue to do what it's always been +// doing.) +static inline int32_t RTC_NO_SANITIZE("signed-integer-overflow") + OverflowingMulS16ByS32ToS32(int16_t a, int32_t b) { + return a * b; +} + +// Calculates the probabilities for both speech and background noise using +// Gaussian Mixture Models (GMM). A hypothesis-test is performed to decide which +// type of signal is most probable. +// +// - self [i/o] : Pointer to VAD instance +// - features [i] : Feature vector of length `kNumChannels` +// = log10(energy in frequency band) +// - total_power [i] : Total power in audio frame. +// - frame_length [i] : Number of input samples +// +// - returns : the VAD decision (0 - noise, 1 - speech). +static int16_t GmmProbability(VadInstT* self, int16_t* features, + int16_t total_power, size_t frame_length) { + int channel, k; + int16_t feature_minimum; + int16_t h0, h1; + int16_t log_likelihood_ratio; + int16_t vadflag = 0; + int16_t shifts_h0, shifts_h1; + int16_t tmp_s16, tmp1_s16, tmp2_s16; + int16_t diff; + int gaussian; + int16_t nmk, nmk2, nmk3, smk, smk2, nsk, ssk; + int16_t delt, ndelt; + int16_t maxspe, maxmu; + int16_t deltaN[kTableSize], deltaS[kTableSize]; + int16_t ngprvec[kTableSize] = { 0 }; // Conditional probability = 0. + int16_t sgprvec[kTableSize] = { 0 }; // Conditional probability = 0. + int32_t h0_test, h1_test; + int32_t tmp1_s32, tmp2_s32; + int32_t sum_log_likelihood_ratios = 0; + int32_t noise_global_mean, speech_global_mean; + int32_t noise_probability[kNumGaussians], speech_probability[kNumGaussians]; + int16_t overhead1, overhead2, individualTest, totalTest; + + // Set various thresholds based on frame lengths (80, 160 or 240 samples). + if (frame_length == 80) { + overhead1 = self->over_hang_max_1[0]; + overhead2 = self->over_hang_max_2[0]; + individualTest = self->individual[0]; + totalTest = self->total[0]; + } else if (frame_length == 160) { + overhead1 = self->over_hang_max_1[1]; + overhead2 = self->over_hang_max_2[1]; + individualTest = self->individual[1]; + totalTest = self->total[1]; + } else { + overhead1 = self->over_hang_max_1[2]; + overhead2 = self->over_hang_max_2[2]; + individualTest = self->individual[2]; + totalTest = self->total[2]; + } + + if (total_power > kMinEnergy) { + // The signal power of current frame is large enough for processing. The + // processing consists of two parts: + // 1) Calculating the likelihood of speech and thereby a VAD decision. + // 2) Updating the underlying model, w.r.t., the decision made. + + // The detection scheme is an LRT with hypothesis + // H0: Noise + // H1: Speech + // + // We combine a global LRT with local tests, for each frequency sub-band, + // here defined as `channel`. + for (channel = 0; channel < kNumChannels; channel++) { + // For each channel we model the probability with a GMM consisting of + // `kNumGaussians`, with different means and standard deviations depending + // on H0 or H1. + h0_test = 0; + h1_test = 0; + for (k = 0; k < kNumGaussians; k++) { + gaussian = channel + k * kNumChannels; + // Probability under H0, that is, probability of frame being noise. + // Value given in Q27 = Q7 * Q20. + tmp1_s32 = WebRtcVad_GaussianProbability(features[channel], + self->noise_means[gaussian], + self->noise_stds[gaussian], + &deltaN[gaussian]); + noise_probability[k] = kNoiseDataWeights[gaussian] * tmp1_s32; + h0_test += noise_probability[k]; // Q27 + + // Probability under H1, that is, probability of frame being speech. + // Value given in Q27 = Q7 * Q20. + tmp1_s32 = WebRtcVad_GaussianProbability(features[channel], + self->speech_means[gaussian], + self->speech_stds[gaussian], + &deltaS[gaussian]); + speech_probability[k] = kSpeechDataWeights[gaussian] * tmp1_s32; + h1_test += speech_probability[k]; // Q27 + } + + // Calculate the log likelihood ratio: log2(Pr{X|H1} / Pr{X|H1}). + // Approximation: + // log2(Pr{X|H1} / Pr{X|H1}) = log2(Pr{X|H1}*2^Q) - log2(Pr{X|H1}*2^Q) + // = log2(h1_test) - log2(h0_test) + // = log2(2^(31-shifts_h1)*(1+b1)) + // - log2(2^(31-shifts_h0)*(1+b0)) + // = shifts_h0 - shifts_h1 + // + log2(1+b1) - log2(1+b0) + // ~= shifts_h0 - shifts_h1 + // + // Note that b0 and b1 are values less than 1, hence, 0 <= log2(1+b0) < 1. + // Further, b0 and b1 are independent and on the average the two terms + // cancel. + shifts_h0 = WebRtcSpl_NormW32(h0_test); + shifts_h1 = WebRtcSpl_NormW32(h1_test); + if (h0_test == 0) { + shifts_h0 = 31; + } + if (h1_test == 0) { + shifts_h1 = 31; + } + log_likelihood_ratio = shifts_h0 - shifts_h1; + + // Update `sum_log_likelihood_ratios` with spectrum weighting. This is + // used for the global VAD decision. + sum_log_likelihood_ratios += + (int32_t) (log_likelihood_ratio * kSpectrumWeight[channel]); + + // Local VAD decision. + if ((log_likelihood_ratio * 4) > individualTest) { + vadflag = 1; + } + + // TODO(bjornv): The conditional probabilities below are applied on the + // hard coded number of Gaussians set to two. Find a way to generalize. + // Calculate local noise probabilities used later when updating the GMM. + h0 = (int16_t) (h0_test >> 12); // Q15 + if (h0 > 0) { + // High probability of noise. Assign conditional probabilities for each + // Gaussian in the GMM. + tmp1_s32 = (noise_probability[0] & 0xFFFFF000) << 2; // Q29 + ngprvec[channel] = (int16_t) WebRtcSpl_DivW32W16(tmp1_s32, h0); // Q14 + ngprvec[channel + kNumChannels] = 16384 - ngprvec[channel]; + } else { + // Low noise probability. Assign conditional probability 1 to the first + // Gaussian and 0 to the rest (which is already set at initialization). + ngprvec[channel] = 16384; + } + + // Calculate local speech probabilities used later when updating the GMM. + h1 = (int16_t) (h1_test >> 12); // Q15 + if (h1 > 0) { + // High probability of speech. Assign conditional probabilities for each + // Gaussian in the GMM. Otherwise use the initialized values, i.e., 0. + tmp1_s32 = (speech_probability[0] & 0xFFFFF000) << 2; // Q29 + sgprvec[channel] = (int16_t) WebRtcSpl_DivW32W16(tmp1_s32, h1); // Q14 + sgprvec[channel + kNumChannels] = 16384 - sgprvec[channel]; + } + } + + // Make a global VAD decision. + vadflag |= (sum_log_likelihood_ratios >= totalTest); + + // Update the model parameters. + maxspe = 12800; + for (channel = 0; channel < kNumChannels; channel++) { + + // Get minimum value in past which is used for long term correction in Q4. + feature_minimum = WebRtcVad_FindMinimum(self, features[channel], channel); + + // Compute the "global" mean, that is the sum of the two means weighted. + noise_global_mean = WeightedAverage(&self->noise_means[channel], 0, + &kNoiseDataWeights[channel]); + tmp1_s16 = (int16_t) (noise_global_mean >> 6); // Q8 + + for (k = 0; k < kNumGaussians; k++) { + gaussian = channel + k * kNumChannels; + + nmk = self->noise_means[gaussian]; + smk = self->speech_means[gaussian]; + nsk = self->noise_stds[gaussian]; + ssk = self->speech_stds[gaussian]; + + // Update noise mean vector if the frame consists of noise only. + nmk2 = nmk; + if (!vadflag) { + // deltaN = (x-mu)/sigma^2 + // ngprvec[k] = `noise_probability[k]` / + // (`noise_probability[0]` + `noise_probability[1]`) + + // (Q14 * Q11 >> 11) = Q14. + delt = (int16_t)((ngprvec[gaussian] * deltaN[gaussian]) >> 11); + // Q7 + (Q14 * Q15 >> 22) = Q7. + nmk2 = nmk + (int16_t)((delt * kNoiseUpdateConst) >> 22); + } + + // Long term correction of the noise mean. + // Q8 - Q8 = Q8. + ndelt = (feature_minimum << 4) - tmp1_s16; + // Q7 + (Q8 * Q8) >> 9 = Q7. + nmk3 = nmk2 + (int16_t)((ndelt * kBackEta) >> 9); + + // Control that the noise mean does not drift to much. + tmp_s16 = (int16_t) ((k + 5) << 7); + if (nmk3 < tmp_s16) { + nmk3 = tmp_s16; + } + tmp_s16 = (int16_t) ((72 + k - channel) << 7); + if (nmk3 > tmp_s16) { + nmk3 = tmp_s16; + } + self->noise_means[gaussian] = nmk3; + + if (vadflag) { + // Update speech mean vector: + // `deltaS` = (x-mu)/sigma^2 + // sgprvec[k] = `speech_probability[k]` / + // (`speech_probability[0]` + `speech_probability[1]`) + + // (Q14 * Q11) >> 11 = Q14. + delt = (int16_t)((sgprvec[gaussian] * deltaS[gaussian]) >> 11); + // Q14 * Q15 >> 21 = Q8. + tmp_s16 = (int16_t)((delt * kSpeechUpdateConst) >> 21); + // Q7 + (Q8 >> 1) = Q7. With rounding. + smk2 = smk + ((tmp_s16 + 1) >> 1); + + // Control that the speech mean does not drift to much. + maxmu = maxspe + 640; + if (smk2 < kMinimumMean[k]) { + smk2 = kMinimumMean[k]; + } + if (smk2 > maxmu) { + smk2 = maxmu; + } + self->speech_means[gaussian] = smk2; // Q7. + + // (Q7 >> 3) = Q4. With rounding. + tmp_s16 = ((smk + 4) >> 3); + + tmp_s16 = features[channel] - tmp_s16; // Q4 + // (Q11 * Q4 >> 3) = Q12. + tmp1_s32 = (deltaS[gaussian] * tmp_s16) >> 3; + tmp2_s32 = tmp1_s32 - 4096; + tmp_s16 = sgprvec[gaussian] >> 2; + // (Q14 >> 2) * Q12 = Q24. + tmp1_s32 = tmp_s16 * tmp2_s32; + + tmp2_s32 = tmp1_s32 >> 4; // Q20 + + // 0.1 * Q20 / Q7 = Q13. + if (tmp2_s32 > 0) { + tmp_s16 = (int16_t) WebRtcSpl_DivW32W16(tmp2_s32, ssk * 10); + } else { + tmp_s16 = (int16_t) WebRtcSpl_DivW32W16(-tmp2_s32, ssk * 10); + tmp_s16 = -tmp_s16; + } + // Divide by 4 giving an update factor of 0.025 (= 0.1 / 4). + // Note that division by 4 equals shift by 2, hence, + // (Q13 >> 8) = (Q13 >> 6) / 4 = Q7. + tmp_s16 += 128; // Rounding. + ssk += (tmp_s16 >> 8); + if (ssk < kMinStd) { + ssk = kMinStd; + } + self->speech_stds[gaussian] = ssk; + } else { + // Update GMM variance vectors. + // deltaN * (features[channel] - nmk) - 1 + // Q4 - (Q7 >> 3) = Q4. + tmp_s16 = features[channel] - (nmk >> 3); + // (Q11 * Q4 >> 3) = Q12. + tmp1_s32 = (deltaN[gaussian] * tmp_s16) >> 3; + tmp1_s32 -= 4096; + + // (Q14 >> 2) * Q12 = Q24. + tmp_s16 = (ngprvec[gaussian] + 2) >> 2; + tmp2_s32 = OverflowingMulS16ByS32ToS32(tmp_s16, tmp1_s32); + // Q20 * approx 0.001 (2^-10=0.0009766), hence, + // (Q24 >> 14) = (Q24 >> 4) / 2^10 = Q20. + tmp1_s32 = tmp2_s32 >> 14; + + // Q20 / Q7 = Q13. + if (tmp1_s32 > 0) { + tmp_s16 = (int16_t) WebRtcSpl_DivW32W16(tmp1_s32, nsk); + } else { + tmp_s16 = (int16_t) WebRtcSpl_DivW32W16(-tmp1_s32, nsk); + tmp_s16 = -tmp_s16; + } + tmp_s16 += 32; // Rounding + nsk += tmp_s16 >> 6; // Q13 >> 6 = Q7. + if (nsk < kMinStd) { + nsk = kMinStd; + } + self->noise_stds[gaussian] = nsk; + } + } + + // Separate models if they are too close. + // `noise_global_mean` in Q14 (= Q7 * Q7). + noise_global_mean = WeightedAverage(&self->noise_means[channel], 0, + &kNoiseDataWeights[channel]); + + // `speech_global_mean` in Q14 (= Q7 * Q7). + speech_global_mean = WeightedAverage(&self->speech_means[channel], 0, + &kSpeechDataWeights[channel]); + + // `diff` = "global" speech mean - "global" noise mean. + // (Q14 >> 9) - (Q14 >> 9) = Q5. + diff = (int16_t) (speech_global_mean >> 9) - + (int16_t) (noise_global_mean >> 9); + if (diff < kMinimumDifference[channel]) { + tmp_s16 = kMinimumDifference[channel] - diff; + + // `tmp1_s16` = ~0.8 * (kMinimumDifference - diff) in Q7. + // `tmp2_s16` = ~0.2 * (kMinimumDifference - diff) in Q7. + tmp1_s16 = (int16_t)((13 * tmp_s16) >> 2); + tmp2_s16 = (int16_t)((3 * tmp_s16) >> 2); + + // Move Gaussian means for speech model by `tmp1_s16` and update + // `speech_global_mean`. Note that `self->speech_means[channel]` is + // changed after the call. + speech_global_mean = WeightedAverage(&self->speech_means[channel], + tmp1_s16, + &kSpeechDataWeights[channel]); + + // Move Gaussian means for noise model by -`tmp2_s16` and update + // `noise_global_mean`. Note that `self->noise_means[channel]` is + // changed after the call. + noise_global_mean = WeightedAverage(&self->noise_means[channel], + -tmp2_s16, + &kNoiseDataWeights[channel]); + } + + // Control that the speech & noise means do not drift to much. + maxspe = kMaximumSpeech[channel]; + tmp2_s16 = (int16_t) (speech_global_mean >> 7); + if (tmp2_s16 > maxspe) { + // Upper limit of speech model. + tmp2_s16 -= maxspe; + + for (k = 0; k < kNumGaussians; k++) { + self->speech_means[channel + k * kNumChannels] -= tmp2_s16; + } + } + + tmp2_s16 = (int16_t) (noise_global_mean >> 7); + if (tmp2_s16 > kMaximumNoise[channel]) { + tmp2_s16 -= kMaximumNoise[channel]; + + for (k = 0; k < kNumGaussians; k++) { + self->noise_means[channel + k * kNumChannels] -= tmp2_s16; + } + } + } + self->frame_counter++; + } + + // Smooth with respect to transition hysteresis. + if (!vadflag) { + if (self->over_hang > 0) { + vadflag = 2 + self->over_hang; + self->over_hang--; + } + self->num_of_speech = 0; + } else { + self->num_of_speech++; + if (self->num_of_speech > kMaxSpeechFrames) { + self->num_of_speech = kMaxSpeechFrames; + self->over_hang = overhead2; + } else { + self->over_hang = overhead1; + } + } + return vadflag; +} + +// Initialize the VAD. Set aggressiveness mode to default value. +int WebRtcVad_InitCore(VadInstT* self) { + int i; + + if (self == NULL) { + return -1; + } + + // Initialization of general struct variables. + self->vad = 1; // Speech active (=1). + self->frame_counter = 0; + self->over_hang = 0; + self->num_of_speech = 0; + + // Initialization of downsampling filter state. + memset(self->downsampling_filter_states, 0, + sizeof(self->downsampling_filter_states)); + + // Initialization of 48 to 8 kHz downsampling. + WebRtcSpl_ResetResample48khzTo8khz(&self->state_48_to_8); + + // Read initial PDF parameters. + for (i = 0; i < kTableSize; i++) { + self->noise_means[i] = kNoiseDataMeans[i]; + self->speech_means[i] = kSpeechDataMeans[i]; + self->noise_stds[i] = kNoiseDataStds[i]; + self->speech_stds[i] = kSpeechDataStds[i]; + } + + // Initialize Index and Minimum value vectors. + for (i = 0; i < 16 * kNumChannels; i++) { + self->low_value_vector[i] = 10000; + self->index_vector[i] = 0; + } + + // Initialize splitting filter states. + memset(self->upper_state, 0, sizeof(self->upper_state)); + memset(self->lower_state, 0, sizeof(self->lower_state)); + + // Initialize high pass filter states. + memset(self->hp_filter_state, 0, sizeof(self->hp_filter_state)); + + // Initialize mean value memory, for WebRtcVad_FindMinimum(). + for (i = 0; i < kNumChannels; i++) { + self->mean_value[i] = 1600; + } + + // Set aggressiveness mode to default (=`kDefaultMode`). + if (WebRtcVad_set_mode_core(self, kDefaultMode) != 0) { + return -1; + } + + self->init_flag = kInitCheck; + + return 0; +} + +// Set aggressiveness mode +int WebRtcVad_set_mode_core(VadInstT* self, int mode) { + int return_value = 0; + + switch (mode) { + case 0: + // Quality mode. + memcpy(self->over_hang_max_1, kOverHangMax1Q, + sizeof(self->over_hang_max_1)); + memcpy(self->over_hang_max_2, kOverHangMax2Q, + sizeof(self->over_hang_max_2)); + memcpy(self->individual, kLocalThresholdQ, + sizeof(self->individual)); + memcpy(self->total, kGlobalThresholdQ, + sizeof(self->total)); + break; + case 1: + // Low bitrate mode. + memcpy(self->over_hang_max_1, kOverHangMax1LBR, + sizeof(self->over_hang_max_1)); + memcpy(self->over_hang_max_2, kOverHangMax2LBR, + sizeof(self->over_hang_max_2)); + memcpy(self->individual, kLocalThresholdLBR, + sizeof(self->individual)); + memcpy(self->total, kGlobalThresholdLBR, + sizeof(self->total)); + break; + case 2: + // Aggressive mode. + memcpy(self->over_hang_max_1, kOverHangMax1AGG, + sizeof(self->over_hang_max_1)); + memcpy(self->over_hang_max_2, kOverHangMax2AGG, + sizeof(self->over_hang_max_2)); + memcpy(self->individual, kLocalThresholdAGG, + sizeof(self->individual)); + memcpy(self->total, kGlobalThresholdAGG, + sizeof(self->total)); + break; + case 3: + // Very aggressive mode. + memcpy(self->over_hang_max_1, kOverHangMax1VAG, + sizeof(self->over_hang_max_1)); + memcpy(self->over_hang_max_2, kOverHangMax2VAG, + sizeof(self->over_hang_max_2)); + memcpy(self->individual, kLocalThresholdVAG, + sizeof(self->individual)); + memcpy(self->total, kGlobalThresholdVAG, + sizeof(self->total)); + break; + default: + return_value = -1; + break; + } + + return return_value; +} + +// Calculate VAD decision by first extracting feature values and then calculate +// probability for both speech and background noise. + +int WebRtcVad_CalcVad48khz(VadInstT* inst, const int16_t* speech_frame, + size_t frame_length) { + int vad; + size_t i; + int16_t speech_nb[240]; // 30 ms in 8 kHz. + // `tmp_mem` is a temporary memory used by resample function, length is + // frame length in 10 ms (480 samples) + 256 extra. + int32_t tmp_mem[480 + 256] = { 0 }; + const size_t kFrameLen10ms48khz = 480; + const size_t kFrameLen10ms8khz = 80; + size_t num_10ms_frames = frame_length / kFrameLen10ms48khz; + + for (i = 0; i < num_10ms_frames; i++) { + WebRtcSpl_Resample48khzTo8khz(speech_frame, + &speech_nb[i * kFrameLen10ms8khz], + &inst->state_48_to_8, + tmp_mem); + } + + // Do VAD on an 8 kHz signal + vad = WebRtcVad_CalcVad8khz(inst, speech_nb, frame_length / 6); + + return vad; +} + +int WebRtcVad_CalcVad32khz(VadInstT* inst, const int16_t* speech_frame, + size_t frame_length) +{ + size_t len; + int vad; + int16_t speechWB[480]; // Downsampled speech frame: 960 samples (30ms in SWB) + int16_t speechNB[240]; // Downsampled speech frame: 480 samples (30ms in WB) + + + // Downsample signal 32->16->8 before doing VAD + WebRtcVad_Downsampling(speech_frame, speechWB, &(inst->downsampling_filter_states[2]), + frame_length); + len = frame_length / 2; + + WebRtcVad_Downsampling(speechWB, speechNB, inst->downsampling_filter_states, len); + len /= 2; + + // Do VAD on an 8 kHz signal + vad = WebRtcVad_CalcVad8khz(inst, speechNB, len); + + return vad; +} + +int WebRtcVad_CalcVad16khz(VadInstT* inst, const int16_t* speech_frame, + size_t frame_length) +{ + size_t len; + int vad; + int16_t speechNB[240]; // Downsampled speech frame: 480 samples (30ms in WB) + + // Wideband: Downsample signal before doing VAD + WebRtcVad_Downsampling(speech_frame, speechNB, inst->downsampling_filter_states, + frame_length); + + len = frame_length / 2; + vad = WebRtcVad_CalcVad8khz(inst, speechNB, len); + + return vad; +} + +int WebRtcVad_CalcVad8khz(VadInstT* inst, const int16_t* speech_frame, + size_t frame_length) +{ + int16_t feature_vector[kNumChannels], total_power; + + // Get power in the bands + total_power = WebRtcVad_CalculateFeatures(inst, speech_frame, frame_length, + feature_vector); + + // Make a VAD + inst->vad = GmmProbability(inst, feature_vector, total_power, frame_length); + + return inst->vad; +} diff --git a/src/common_audio/vad/vad_core.h b/src/common_audio/vad/vad_core.h new file mode 100644 index 0000000..ee102de --- /dev/null +++ b/src/common_audio/vad/vad_core.h @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +/* + * This header file includes the descriptions of the core VAD calls. + */ + +#ifndef COMMON_AUDIO_VAD_VAD_CORE_H_ +#define COMMON_AUDIO_VAD_VAD_CORE_H_ + +#include "common_audio/signal_processing/include/signal_processing_library.h" + +enum { kNumChannels = 6 }; // Number of frequency bands (named channels). +enum { kNumGaussians = 2 }; // Number of Gaussians per channel in the GMM. +enum { kTableSize = kNumChannels * kNumGaussians }; +enum { kMinEnergy = 10 }; // Minimum energy required to trigger audio signal. + +typedef struct VadInstT_ { + int vad; + int32_t downsampling_filter_states[4]; + WebRtcSpl_State48khzTo8khz state_48_to_8; + int16_t noise_means[kTableSize]; + int16_t speech_means[kTableSize]; + int16_t noise_stds[kTableSize]; + int16_t speech_stds[kTableSize]; + // TODO(bjornv): Change to `frame_count`. + int32_t frame_counter; + int16_t over_hang; // Over Hang + int16_t num_of_speech; + // TODO(bjornv): Change to `age_vector`. + int16_t index_vector[16 * kNumChannels]; + int16_t low_value_vector[16 * kNumChannels]; + // TODO(bjornv): Change to `median`. + int16_t mean_value[kNumChannels]; + int16_t upper_state[5]; + int16_t lower_state[5]; + int16_t hp_filter_state[4]; + int16_t over_hang_max_1[3]; + int16_t over_hang_max_2[3]; + int16_t individual[3]; + int16_t total[3]; + + int init_flag; +} VadInstT; + +// Initializes the core VAD component. The default aggressiveness mode is +// controlled by `kDefaultMode` in vad_core.c. +// +// - self [i/o] : Instance that should be initialized +// +// returns : 0 (OK), -1 (null pointer in or if the default mode can't be +// set) +int WebRtcVad_InitCore(VadInstT* self); + +/**************************************************************************** + * WebRtcVad_set_mode_core(...) + * + * This function changes the VAD settings + * + * Input: + * - inst : VAD instance + * - mode : Aggressiveness degree + * 0 (High quality) - 3 (Highly aggressive) + * + * Output: + * - inst : Changed instance + * + * Return value : 0 - Ok + * -1 - Error + */ + +int WebRtcVad_set_mode_core(VadInstT* self, int mode); + +/**************************************************************************** + * WebRtcVad_CalcVad48khz(...) + * WebRtcVad_CalcVad32khz(...) + * WebRtcVad_CalcVad16khz(...) + * WebRtcVad_CalcVad8khz(...) + * + * Calculate probability for active speech and make VAD decision. + * + * Input: + * - inst : Instance that should be initialized + * - speech_frame : Input speech frame + * - frame_length : Number of input samples + * + * Output: + * - inst : Updated filter states etc. + * + * Return value : VAD decision + * 0 - No active speech + * 1-6 - Active speech + */ +int WebRtcVad_CalcVad48khz(VadInstT* inst, + const int16_t* speech_frame, + size_t frame_length); +int WebRtcVad_CalcVad32khz(VadInstT* inst, + const int16_t* speech_frame, + size_t frame_length); +int WebRtcVad_CalcVad16khz(VadInstT* inst, + const int16_t* speech_frame, + size_t frame_length); +int WebRtcVad_CalcVad8khz(VadInstT* inst, + const int16_t* speech_frame, + size_t frame_length); + +#endif // COMMON_AUDIO_VAD_VAD_CORE_H_ diff --git a/src/common_audio/vad/vad_filterbank.c b/src/common_audio/vad/vad_filterbank.c new file mode 100644 index 0000000..aff63f7 --- /dev/null +++ b/src/common_audio/vad/vad_filterbank.c @@ -0,0 +1,329 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "common_audio/vad/vad_filterbank.h" + +#include "rtc_base/checks.h" +#include "common_audio/signal_processing/include/signal_processing_library.h" + +// Constants used in LogOfEnergy(). +static const int16_t kLogConst = 24660; // 160*log10(2) in Q9. +static const int16_t kLogEnergyIntPart = 14336; // 14 in Q10 + +// Coefficients used by HighPassFilter, Q14. +static const int16_t kHpZeroCoefs[3] = { 6631, -13262, 6631 }; +static const int16_t kHpPoleCoefs[3] = { 16384, -7756, 5620 }; + +// Allpass filter coefficients, upper and lower, in Q15. +// Upper: 0.64, Lower: 0.17 +static const int16_t kAllPassCoefsQ15[2] = { 20972, 5571 }; + +// Adjustment for division with two in SplitFilter. +static const int16_t kOffsetVector[6] = { 368, 368, 272, 176, 176, 176 }; + +// High pass filtering, with a cut-off frequency at 80 Hz, if the `data_in` is +// sampled at 500 Hz. +// +// - data_in [i] : Input audio data sampled at 500 Hz. +// - data_length [i] : Length of input and output data. +// - filter_state [i/o] : State of the filter. +// - data_out [o] : Output audio data in the frequency interval +// 80 - 250 Hz. +static void HighPassFilter(const int16_t* data_in, size_t data_length, + int16_t* filter_state, int16_t* data_out) { + size_t i; + const int16_t* in_ptr = data_in; + int16_t* out_ptr = data_out; + int32_t tmp32 = 0; + + + // The sum of the absolute values of the impulse response: + // The zero/pole-filter has a max amplification of a single sample of: 1.4546 + // Impulse response: 0.4047 -0.6179 -0.0266 0.1993 0.1035 -0.0194 + // The all-zero section has a max amplification of a single sample of: 1.6189 + // Impulse response: 0.4047 -0.8094 0.4047 0 0 0 + // The all-pole section has a max amplification of a single sample of: 1.9931 + // Impulse response: 1.0000 0.4734 -0.1189 -0.2187 -0.0627 0.04532 + + for (i = 0; i < data_length; i++) { + // All-zero section (filter coefficients in Q14). + tmp32 = kHpZeroCoefs[0] * *in_ptr; + tmp32 += kHpZeroCoefs[1] * filter_state[0]; + tmp32 += kHpZeroCoefs[2] * filter_state[1]; + filter_state[1] = filter_state[0]; + filter_state[0] = *in_ptr++; + + // All-pole section (filter coefficients in Q14). + tmp32 -= kHpPoleCoefs[1] * filter_state[2]; + tmp32 -= kHpPoleCoefs[2] * filter_state[3]; + filter_state[3] = filter_state[2]; + filter_state[2] = (int16_t) (tmp32 >> 14); + *out_ptr++ = filter_state[2]; + } +} + +// All pass filtering of `data_in`, used before splitting the signal into two +// frequency bands (low pass vs high pass). +// Note that `data_in` and `data_out` can NOT correspond to the same address. +// +// - data_in [i] : Input audio signal given in Q0. +// - data_length [i] : Length of input and output data. +// - filter_coefficient [i] : Given in Q15. +// - filter_state [i/o] : State of the filter given in Q(-1). +// - data_out [o] : Output audio signal given in Q(-1). +static void AllPassFilter(const int16_t* data_in, size_t data_length, + int16_t filter_coefficient, int16_t* filter_state, + int16_t* data_out) { + // The filter can only cause overflow (in the w16 output variable) + // if more than 4 consecutive input numbers are of maximum value and + // has the the same sign as the impulse responses first taps. + // First 6 taps of the impulse response: + // 0.6399 0.5905 -0.3779 0.2418 -0.1547 0.0990 + + size_t i; + int16_t tmp16 = 0; + int32_t tmp32 = 0; + int32_t state32 = ((int32_t) (*filter_state) * (1 << 16)); // Q15 + + for (i = 0; i < data_length; i++) { + tmp32 = state32 + filter_coefficient * *data_in; + tmp16 = (int16_t) (tmp32 >> 16); // Q(-1) + *data_out++ = tmp16; + state32 = (*data_in * (1 << 14)) - filter_coefficient * tmp16; // Q14 + state32 *= 2; // Q15. + data_in += 2; + } + + *filter_state = (int16_t) (state32 >> 16); // Q(-1) +} + +// Splits `data_in` into `hp_data_out` and `lp_data_out` corresponding to +// an upper (high pass) part and a lower (low pass) part respectively. +// +// - data_in [i] : Input audio data to be split into two frequency bands. +// - data_length [i] : Length of `data_in`. +// - upper_state [i/o] : State of the upper filter, given in Q(-1). +// - lower_state [i/o] : State of the lower filter, given in Q(-1). +// - hp_data_out [o] : Output audio data of the upper half of the spectrum. +// The length is `data_length` / 2. +// - lp_data_out [o] : Output audio data of the lower half of the spectrum. +// The length is `data_length` / 2. +static void SplitFilter(const int16_t* data_in, size_t data_length, + int16_t* upper_state, int16_t* lower_state, + int16_t* hp_data_out, int16_t* lp_data_out) { + size_t i; + size_t half_length = data_length >> 1; // Downsampling by 2. + int16_t tmp_out; + + // All-pass filtering upper branch. + AllPassFilter(&data_in[0], half_length, kAllPassCoefsQ15[0], upper_state, + hp_data_out); + + // All-pass filtering lower branch. + AllPassFilter(&data_in[1], half_length, kAllPassCoefsQ15[1], lower_state, + lp_data_out); + + // Make LP and HP signals. + for (i = 0; i < half_length; i++) { + tmp_out = *hp_data_out; + *hp_data_out++ -= *lp_data_out; + *lp_data_out++ += tmp_out; + } +} + +// Calculates the energy of `data_in` in dB, and also updates an overall +// `total_energy` if necessary. +// +// - data_in [i] : Input audio data for energy calculation. +// - data_length [i] : Length of input data. +// - offset [i] : Offset value added to `log_energy`. +// - total_energy [i/o] : An external energy updated with the energy of +// `data_in`. +// NOTE: `total_energy` is only updated if +// `total_energy` <= `kMinEnergy`. +// - log_energy [o] : 10 * log10("energy of `data_in`") given in Q4. +static void LogOfEnergy(const int16_t* data_in, size_t data_length, + int16_t offset, int16_t* total_energy, + int16_t* log_energy) { + // `tot_rshifts` accumulates the number of right shifts performed on `energy`. + int tot_rshifts = 0; + // The `energy` will be normalized to 15 bits. We use unsigned integer because + // we eventually will mask out the fractional part. + uint32_t energy = 0; + + RTC_DCHECK(data_in); + RTC_DCHECK_GT(data_length, 0); + + energy = (uint32_t) WebRtcSpl_Energy((int16_t*) data_in, data_length, + &tot_rshifts); + + if (energy != 0) { + // By construction, normalizing to 15 bits is equivalent with 17 leading + // zeros of an unsigned 32 bit value. + int normalizing_rshifts = 17 - WebRtcSpl_NormU32(energy); + // In a 15 bit representation the leading bit is 2^14. log2(2^14) in Q10 is + // (14 << 10), which is what we initialize `log2_energy` with. For a more + // detailed derivations, see below. + int16_t log2_energy = kLogEnergyIntPart; + + tot_rshifts += normalizing_rshifts; + // Normalize `energy` to 15 bits. + // `tot_rshifts` is now the total number of right shifts performed on + // `energy` after normalization. This means that `energy` is in + // Q(-tot_rshifts). + if (normalizing_rshifts < 0) { + energy <<= -normalizing_rshifts; + } else { + energy >>= normalizing_rshifts; + } + + // Calculate the energy of `data_in` in dB, in Q4. + // + // 10 * log10("true energy") in Q4 = 2^4 * 10 * log10("true energy") = + // 160 * log10(`energy` * 2^`tot_rshifts`) = + // 160 * log10(2) * log2(`energy` * 2^`tot_rshifts`) = + // 160 * log10(2) * (log2(`energy`) + log2(2^`tot_rshifts`)) = + // (160 * log10(2)) * (log2(`energy`) + `tot_rshifts`) = + // `kLogConst` * (`log2_energy` + `tot_rshifts`) + // + // We know by construction that `energy` is normalized to 15 bits. Hence, + // `energy` = 2^14 + frac_Q15, where frac_Q15 is a fractional part in Q15. + // Further, we'd like `log2_energy` in Q10 + // log2(`energy`) in Q10 = 2^10 * log2(2^14 + frac_Q15) = + // 2^10 * log2(2^14 * (1 + frac_Q15 * 2^-14)) = + // 2^10 * (14 + log2(1 + frac_Q15 * 2^-14)) ~= + // (14 << 10) + 2^10 * (frac_Q15 * 2^-14) = + // (14 << 10) + (frac_Q15 * 2^-4) = (14 << 10) + (frac_Q15 >> 4) + // + // Note that frac_Q15 = (`energy` & 0x00003FFF) + + // Calculate and add the fractional part to `log2_energy`. + log2_energy += (int16_t) ((energy & 0x00003FFF) >> 4); + + // `kLogConst` is in Q9, `log2_energy` in Q10 and `tot_rshifts` in Q0. + // Note that we in our derivation above have accounted for an output in Q4. + *log_energy = (int16_t)(((kLogConst * log2_energy) >> 19) + + ((tot_rshifts * kLogConst) >> 9)); + + if (*log_energy < 0) { + *log_energy = 0; + } + } else { + *log_energy = offset; + return; + } + + *log_energy += offset; + + // Update the approximate `total_energy` with the energy of `data_in`, if + // `total_energy` has not exceeded `kMinEnergy`. `total_energy` is used as an + // energy indicator in WebRtcVad_GmmProbability() in vad_core.c. + if (*total_energy <= kMinEnergy) { + if (tot_rshifts >= 0) { + // We know by construction that the `energy` > `kMinEnergy` in Q0, so add + // an arbitrary value such that `total_energy` exceeds `kMinEnergy`. + *total_energy += kMinEnergy + 1; + } else { + // By construction `energy` is represented by 15 bits, hence any number of + // right shifted `energy` will fit in an int16_t. In addition, adding the + // value to `total_energy` is wrap around safe as long as + // `kMinEnergy` < 8192. + *total_energy += (int16_t) (energy >> -tot_rshifts); // Q0. + } + } +} + +int16_t WebRtcVad_CalculateFeatures(VadInstT* self, const int16_t* data_in, + size_t data_length, int16_t* features) { + int16_t total_energy = 0; + // We expect `data_length` to be 80, 160 or 240 samples, which corresponds to + // 10, 20 or 30 ms in 8 kHz. Therefore, the intermediate downsampled data will + // have at most 120 samples after the first split and at most 60 samples after + // the second split. + int16_t hp_120[120], lp_120[120]; + int16_t hp_60[60], lp_60[60]; + const size_t half_data_length = data_length >> 1; + size_t length = half_data_length; // `data_length` / 2, corresponds to + // bandwidth = 2000 Hz after downsampling. + + // Initialize variables for the first SplitFilter(). + int frequency_band = 0; + const int16_t* in_ptr = data_in; // [0 - 4000] Hz. + int16_t* hp_out_ptr = hp_120; // [2000 - 4000] Hz. + int16_t* lp_out_ptr = lp_120; // [0 - 2000] Hz. + + RTC_DCHECK_LE(data_length, 240); + RTC_DCHECK_LT(4, kNumChannels - 1); // Checking maximum `frequency_band`. + + // Split at 2000 Hz and downsample. + SplitFilter(in_ptr, data_length, &self->upper_state[frequency_band], + &self->lower_state[frequency_band], hp_out_ptr, lp_out_ptr); + + // For the upper band (2000 Hz - 4000 Hz) split at 3000 Hz and downsample. + frequency_band = 1; + in_ptr = hp_120; // [2000 - 4000] Hz. + hp_out_ptr = hp_60; // [3000 - 4000] Hz. + lp_out_ptr = lp_60; // [2000 - 3000] Hz. + SplitFilter(in_ptr, length, &self->upper_state[frequency_band], + &self->lower_state[frequency_band], hp_out_ptr, lp_out_ptr); + + // Energy in 3000 Hz - 4000 Hz. + length >>= 1; // `data_length` / 4 <=> bandwidth = 1000 Hz. + + LogOfEnergy(hp_60, length, kOffsetVector[5], &total_energy, &features[5]); + + // Energy in 2000 Hz - 3000 Hz. + LogOfEnergy(lp_60, length, kOffsetVector[4], &total_energy, &features[4]); + + // For the lower band (0 Hz - 2000 Hz) split at 1000 Hz and downsample. + frequency_band = 2; + in_ptr = lp_120; // [0 - 2000] Hz. + hp_out_ptr = hp_60; // [1000 - 2000] Hz. + lp_out_ptr = lp_60; // [0 - 1000] Hz. + length = half_data_length; // `data_length` / 2 <=> bandwidth = 2000 Hz. + SplitFilter(in_ptr, length, &self->upper_state[frequency_band], + &self->lower_state[frequency_band], hp_out_ptr, lp_out_ptr); + + // Energy in 1000 Hz - 2000 Hz. + length >>= 1; // `data_length` / 4 <=> bandwidth = 1000 Hz. + LogOfEnergy(hp_60, length, kOffsetVector[3], &total_energy, &features[3]); + + // For the lower band (0 Hz - 1000 Hz) split at 500 Hz and downsample. + frequency_band = 3; + in_ptr = lp_60; // [0 - 1000] Hz. + hp_out_ptr = hp_120; // [500 - 1000] Hz. + lp_out_ptr = lp_120; // [0 - 500] Hz. + SplitFilter(in_ptr, length, &self->upper_state[frequency_band], + &self->lower_state[frequency_band], hp_out_ptr, lp_out_ptr); + + // Energy in 500 Hz - 1000 Hz. + length >>= 1; // `data_length` / 8 <=> bandwidth = 500 Hz. + LogOfEnergy(hp_120, length, kOffsetVector[2], &total_energy, &features[2]); + + // For the lower band (0 Hz - 500 Hz) split at 250 Hz and downsample. + frequency_band = 4; + in_ptr = lp_120; // [0 - 500] Hz. + hp_out_ptr = hp_60; // [250 - 500] Hz. + lp_out_ptr = lp_60; // [0 - 250] Hz. + SplitFilter(in_ptr, length, &self->upper_state[frequency_band], + &self->lower_state[frequency_band], hp_out_ptr, lp_out_ptr); + + // Energy in 250 Hz - 500 Hz. + length >>= 1; // `data_length` / 16 <=> bandwidth = 250 Hz. + LogOfEnergy(hp_60, length, kOffsetVector[1], &total_energy, &features[1]); + + // Remove 0 Hz - 80 Hz, by high pass filtering the lower band. + HighPassFilter(lp_60, length, self->hp_filter_state, hp_120); + + // Energy in 80 Hz - 250 Hz. + LogOfEnergy(hp_120, length, kOffsetVector[0], &total_energy, &features[0]); + + return total_energy; +} diff --git a/src/common_audio/vad/vad_filterbank.h b/src/common_audio/vad/vad_filterbank.h new file mode 100644 index 0000000..205eac8 --- /dev/null +++ b/src/common_audio/vad/vad_filterbank.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +/* + * This file includes feature calculating functionality used in vad_core.c. + */ + +#ifndef COMMON_AUDIO_VAD_VAD_FILTERBANK_H_ +#define COMMON_AUDIO_VAD_VAD_FILTERBANK_H_ + +#include "common_audio/vad/vad_core.h" + +// Takes `data_length` samples of `data_in` and calculates the logarithm of the +// energy of each of the `kNumChannels` = 6 frequency bands used by the VAD: +// 80 Hz - 250 Hz +// 250 Hz - 500 Hz +// 500 Hz - 1000 Hz +// 1000 Hz - 2000 Hz +// 2000 Hz - 3000 Hz +// 3000 Hz - 4000 Hz +// +// The values are given in Q4 and written to `features`. Further, an approximate +// overall energy is returned. The return value is used in +// WebRtcVad_GmmProbability() as a signal indicator, hence it is arbitrary above +// the threshold `kMinEnergy`. +// +// - self [i/o] : State information of the VAD. +// - data_in [i] : Input audio data, for feature extraction. +// - data_length [i] : Audio data size, in number of samples. +// - features [o] : 10 * log10(energy in each frequency band), Q4. +// - returns : Total energy of the signal (NOTE! This value is not +// exact. It is only used in a comparison.) +int16_t WebRtcVad_CalculateFeatures(VadInstT* self, + const int16_t* data_in, + size_t data_length, + int16_t* features); + +#endif // COMMON_AUDIO_VAD_VAD_FILTERBANK_H_ diff --git a/src/common_audio/vad/vad_gmm.c b/src/common_audio/vad/vad_gmm.c new file mode 100644 index 0000000..4a7fe67 --- /dev/null +++ b/src/common_audio/vad/vad_gmm.c @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "common_audio/vad/vad_gmm.h" + +#include "common_audio/signal_processing/include/signal_processing_library.h" + +static const int32_t kCompVar = 22005; +static const int16_t kLog2Exp = 5909; // log2(exp(1)) in Q12. + +// For a normal distribution, the probability of `input` is calculated and +// returned (in Q20). The formula for normal distributed probability is +// +// 1 / s * exp(-(x - m)^2 / (2 * s^2)) +// +// where the parameters are given in the following Q domains: +// m = `mean` (Q7) +// s = `std` (Q7) +// x = `input` (Q4) +// in addition to the probability we output `delta` (in Q11) used when updating +// the noise/speech model. +int32_t WebRtcVad_GaussianProbability(int16_t input, + int16_t mean, + int16_t std, + int16_t* delta) { + int16_t tmp16, inv_std, inv_std2, exp_value = 0; + int32_t tmp32; + + // Calculate `inv_std` = 1 / s, in Q10. + // 131072 = 1 in Q17, and (`std` >> 1) is for rounding instead of truncation. + // Q-domain: Q17 / Q7 = Q10. + tmp32 = (int32_t) 131072 + (int32_t) (std >> 1); + inv_std = (int16_t) WebRtcSpl_DivW32W16(tmp32, std); + + // Calculate `inv_std2` = 1 / s^2, in Q14. + tmp16 = (inv_std >> 2); // Q10 -> Q8. + // Q-domain: (Q8 * Q8) >> 2 = Q14. + inv_std2 = (int16_t)((tmp16 * tmp16) >> 2); + // TODO(bjornv): Investigate if changing to + // inv_std2 = (int16_t)((inv_std * inv_std) >> 6); + // gives better accuracy. + + tmp16 = (input << 3); // Q4 -> Q7 + tmp16 = tmp16 - mean; // Q7 - Q7 = Q7 + + // To be used later, when updating noise/speech model. + // `delta` = (x - m) / s^2, in Q11. + // Q-domain: (Q14 * Q7) >> 10 = Q11. + *delta = (int16_t)((inv_std2 * tmp16) >> 10); + + // Calculate the exponent `tmp32` = (x - m)^2 / (2 * s^2), in Q10. Replacing + // division by two with one shift. + // Q-domain: (Q11 * Q7) >> 8 = Q10. + tmp32 = (*delta * tmp16) >> 9; + + // If the exponent is small enough to give a non-zero probability we calculate + // `exp_value` ~= exp(-(x - m)^2 / (2 * s^2)) + // ~= exp2(-log2(exp(1)) * `tmp32`). + if (tmp32 < kCompVar) { + // Calculate `tmp16` = log2(exp(1)) * `tmp32`, in Q10. + // Q-domain: (Q12 * Q10) >> 12 = Q10. + tmp16 = (int16_t)((kLog2Exp * tmp32) >> 12); + tmp16 = -tmp16; + exp_value = (0x0400 | (tmp16 & 0x03FF)); + tmp16 ^= 0xFFFF; + tmp16 >>= 10; + tmp16 += 1; + // Get `exp_value` = exp(-`tmp32`) in Q10. + exp_value >>= tmp16; + } + + // Calculate and return (1 / s) * exp(-(x - m)^2 / (2 * s^2)), in Q20. + // Q-domain: Q10 * Q10 = Q20. + return inv_std * exp_value; +} diff --git a/src/common_audio/vad/vad_gmm.h b/src/common_audio/vad/vad_gmm.h new file mode 100644 index 0000000..4c13978 --- /dev/null +++ b/src/common_audio/vad/vad_gmm.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +// Gaussian probability calculations internally used in vad_core.c. + +#ifndef COMMON_AUDIO_VAD_VAD_GMM_H_ +#define COMMON_AUDIO_VAD_VAD_GMM_H_ + +#include +#ifdef HAVE_STDINT_H +#include +#else +#include "rtc_base/typedefs.h" +#endif + + +// Calculates the probability for `input`, given that `input` comes from a +// normal distribution with mean and standard deviation (`mean`, `std`). +// +// Inputs: +// - input : input sample in Q4. +// - mean : mean input in the statistical model, Q7. +// - std : standard deviation, Q7. +// +// Output: +// +// - delta : input used when updating the model, Q11. +// `delta` = (`input` - `mean`) / `std`^2. +// +// Return: +// (probability for `input`) = +// 1 / `std` * exp(-(`input` - `mean`)^2 / (2 * `std`^2)); +int32_t WebRtcVad_GaussianProbability(int16_t input, + int16_t mean, + int16_t std, + int16_t* delta); + +#endif // COMMON_AUDIO_VAD_VAD_GMM_H_ diff --git a/src/common_audio/vad/vad_sp.c b/src/common_audio/vad/vad_sp.c new file mode 100644 index 0000000..3d24cf6 --- /dev/null +++ b/src/common_audio/vad/vad_sp.c @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "common_audio/vad/vad_sp.h" + +#include "rtc_base/checks.h" +#include "common_audio/signal_processing/include/signal_processing_library.h" +#include "common_audio/vad/vad_core.h" + +// Allpass filter coefficients, upper and lower, in Q13. +// Upper: 0.64, Lower: 0.17. +static const int16_t kAllPassCoefsQ13[2] = { 5243, 1392 }; // Q13. +static const int16_t kSmoothingDown = 6553; // 0.2 in Q15. +static const int16_t kSmoothingUp = 32439; // 0.99 in Q15. + +// TODO(bjornv): Move this function to vad_filterbank.c. +// Downsampling filter based on splitting filter and allpass functions. +void WebRtcVad_Downsampling(const int16_t* signal_in, + int16_t* signal_out, + int32_t* filter_state, + size_t in_length) { + int16_t tmp16_1 = 0, tmp16_2 = 0; + int32_t tmp32_1 = filter_state[0]; + int32_t tmp32_2 = filter_state[1]; + size_t n = 0; + // Downsampling by 2 gives half length. + size_t half_length = (in_length >> 1); + + // Filter coefficients in Q13, filter state in Q0. + for (n = 0; n < half_length; n++) { + // All-pass filtering upper branch. + tmp16_1 = (int16_t) ((tmp32_1 >> 1) + + ((kAllPassCoefsQ13[0] * *signal_in) >> 14)); + *signal_out = tmp16_1; + tmp32_1 = (int32_t)(*signal_in++) - ((kAllPassCoefsQ13[0] * tmp16_1) >> 12); + + // All-pass filtering lower branch. + tmp16_2 = (int16_t) ((tmp32_2 >> 1) + + ((kAllPassCoefsQ13[1] * *signal_in) >> 14)); + *signal_out++ += tmp16_2; + tmp32_2 = (int32_t)(*signal_in++) - ((kAllPassCoefsQ13[1] * tmp16_2) >> 12); + } + // Store the filter states. + filter_state[0] = tmp32_1; + filter_state[1] = tmp32_2; +} + +// Inserts `feature_value` into `low_value_vector`, if it is one of the 16 +// smallest values the last 100 frames. Then calculates and returns the median +// of the five smallest values. +int16_t WebRtcVad_FindMinimum(VadInstT* self, + int16_t feature_value, + int channel) { + int i = 0, j = 0; + int position = -1; + // Offset to beginning of the 16 minimum values in memory. + const int offset = (channel << 4); + int16_t current_median = 1600; + int16_t alpha = 0; + int32_t tmp32 = 0; + // Pointer to memory for the 16 minimum values and the age of each value of + // the `channel`. + int16_t* age = &self->index_vector[offset]; + int16_t* smallest_values = &self->low_value_vector[offset]; + + RTC_DCHECK_LT(channel, kNumChannels); + + // Each value in `smallest_values` is getting 1 loop older. Update `age`, and + // remove old values. + for (i = 0; i < 16; i++) { + if (age[i] != 100) { + age[i]++; + } else { + // Too old value. Remove from memory and shift larger values downwards. + for (j = i; j < 15; j++) { + smallest_values[j] = smallest_values[j + 1]; + age[j] = age[j + 1]; + } + age[15] = 101; + smallest_values[15] = 10000; + } + } + + // Check if `feature_value` is smaller than any of the values in + // `smallest_values`. If so, find the `position` where to insert the new value + // (`feature_value`). + if (feature_value < smallest_values[7]) { + if (feature_value < smallest_values[3]) { + if (feature_value < smallest_values[1]) { + if (feature_value < smallest_values[0]) { + position = 0; + } else { + position = 1; + } + } else if (feature_value < smallest_values[2]) { + position = 2; + } else { + position = 3; + } + } else if (feature_value < smallest_values[5]) { + if (feature_value < smallest_values[4]) { + position = 4; + } else { + position = 5; + } + } else if (feature_value < smallest_values[6]) { + position = 6; + } else { + position = 7; + } + } else if (feature_value < smallest_values[15]) { + if (feature_value < smallest_values[11]) { + if (feature_value < smallest_values[9]) { + if (feature_value < smallest_values[8]) { + position = 8; + } else { + position = 9; + } + } else if (feature_value < smallest_values[10]) { + position = 10; + } else { + position = 11; + } + } else if (feature_value < smallest_values[13]) { + if (feature_value < smallest_values[12]) { + position = 12; + } else { + position = 13; + } + } else if (feature_value < smallest_values[14]) { + position = 14; + } else { + position = 15; + } + } + + // If we have detected a new small value, insert it at the correct position + // and shift larger values up. + if (position > -1) { + for (i = 15; i > position; i--) { + smallest_values[i] = smallest_values[i - 1]; + age[i] = age[i - 1]; + } + smallest_values[position] = feature_value; + age[position] = 1; + } + + // Get `current_median`. + if (self->frame_counter > 2) { + current_median = smallest_values[2]; + } else if (self->frame_counter > 0) { + current_median = smallest_values[0]; + } + + // Smooth the median value. + if (self->frame_counter > 0) { + if (current_median < self->mean_value[channel]) { + alpha = kSmoothingDown; // 0.2 in Q15. + } else { + alpha = kSmoothingUp; // 0.99 in Q15. + } + } + tmp32 = (alpha + 1) * self->mean_value[channel]; + tmp32 += (WEBRTC_SPL_WORD16_MAX - alpha) * current_median; + tmp32 += 16384; + self->mean_value[channel] = (int16_t) (tmp32 >> 15); + + return self->mean_value[channel]; +} diff --git a/src/common_audio/vad/vad_sp.h b/src/common_audio/vad/vad_sp.h new file mode 100644 index 0000000..89138c5 --- /dev/null +++ b/src/common_audio/vad/vad_sp.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +// This file includes specific signal processing tools used in vad_core.c. + +#ifndef COMMON_AUDIO_VAD_VAD_SP_H_ +#define COMMON_AUDIO_VAD_VAD_SP_H_ + +#include "common_audio/vad/vad_core.h" + +// Downsamples the signal by a factor 2, eg. 32->16 or 16->8. +// +// Inputs: +// - signal_in : Input signal. +// - in_length : Length of input signal in samples. +// +// Input & Output: +// - filter_state : Current filter states of the two all-pass filters. The +// `filter_state` is updated after all samples have been +// processed. +// +// Output: +// - signal_out : Downsampled signal (of length `in_length` / 2). +void WebRtcVad_Downsampling(const int16_t* signal_in, + int16_t* signal_out, + int32_t* filter_state, + size_t in_length); + +// Updates and returns the smoothed feature minimum. As minimum we use the +// median of the five smallest feature values in a 100 frames long window. +// As long as `handle->frame_counter` is zero, that is, we haven't received any +// "valid" data, FindMinimum() outputs the default value of 1600. +// +// Inputs: +// - feature_value : New feature value to update with. +// - channel : Channel number. +// +// Input & Output: +// - handle : State information of the VAD. +// +// Returns: +// : Smoothed minimum value for a moving window. +int16_t WebRtcVad_FindMinimum(VadInstT* handle, + int16_t feature_value, + int channel); + +#endif // COMMON_AUDIO_VAD_VAD_SP_H_ diff --git a/src/common_audio/vad/webrtc_vad.c b/src/common_audio/vad/webrtc_vad.c new file mode 100644 index 0000000..db1f169 --- /dev/null +++ b/src/common_audio/vad/webrtc_vad.c @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + + +#include +#include + +#include "include/webrtc_vad.h" + +#include "common_audio/signal_processing/include/signal_processing_library.h" +#include "common_audio/vad/vad_core.h" + +static const int kInitCheck = 42; +static const int kValidRates[] = { 8000, 16000, 32000, 48000 }; +static const size_t kRatesSize = sizeof(kValidRates) / sizeof(*kValidRates); +static const int kMaxFrameLengthMs = 30; + +VadInst* WebRtcVad_Create(void) { + VadInstT* self = (VadInstT*)malloc(sizeof(VadInstT)); + + self->init_flag = 0; + + return (VadInst*)self; +} + +void WebRtcVad_Free(VadInst* handle) { + free(handle); +} + +// TODO(bjornv): Move WebRtcVad_InitCore() code here. +int WebRtcVad_Init(VadInst* handle) { + // Initialize the core VAD component. + return WebRtcVad_InitCore((VadInstT*) handle); +} + +// TODO(bjornv): Move WebRtcVad_set_mode_core() code here. +int WebRtcVad_set_mode(VadInst* handle, int mode) { + VadInstT* self = (VadInstT*) handle; + + if (handle == NULL) { + return -1; + } + if (self->init_flag != kInitCheck) { + return -1; + } + + return WebRtcVad_set_mode_core(self, mode); +} + +int WebRtcVad_Process(VadInst* handle, int fs, const int16_t* audio_frame, + size_t frame_length) { + int vad = -1; + VadInstT* self = (VadInstT*) handle; + + if (handle == NULL) { + return -1; + } + + if (self->init_flag != kInitCheck) { + return -1; + } + if (audio_frame == NULL) { + return -1; + } + if (WebRtcVad_ValidRateAndFrameLength(fs, frame_length) != 0) { + return -1; + } + + if (fs == 48000) { + vad = WebRtcVad_CalcVad48khz(self, audio_frame, frame_length); + } else if (fs == 32000) { + vad = WebRtcVad_CalcVad32khz(self, audio_frame, frame_length); + } else if (fs == 16000) { + vad = WebRtcVad_CalcVad16khz(self, audio_frame, frame_length); + } else if (fs == 8000) { + vad = WebRtcVad_CalcVad8khz(self, audio_frame, frame_length); + } + + if (vad > 0) { + vad = 1; + } + return vad; +} + +int WebRtcVad_ValidRateAndFrameLength(int rate, size_t frame_length) { + int return_value = -1; + size_t i; + int valid_length_ms; + size_t valid_length; + + // We only allow 10, 20 or 30 ms frames. Loop through valid frame rates and + // see if we have a matching pair. + for (i = 0; i < kRatesSize; i++) { + if (kValidRates[i] == rate) { + for (valid_length_ms = 10; valid_length_ms <= kMaxFrameLengthMs; + valid_length_ms += 10) { + valid_length = (size_t)(kValidRates[i] / 1000 * valid_length_ms); + if (frame_length == valid_length) { + return_value = 0; + break; + } + } + break; + } + } + + return return_value; +} diff --git a/src/config_macro.h b/src/config_macro.h new file mode 100644 index 0000000..769412e --- /dev/null +++ b/src/config_macro.h @@ -0,0 +1,541 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* config_macro.h - Configuration definitions for PocketSphinx */ + +#ifndef __PS_CMDLN_MACRO_H__ +#define __PS_CMDLN_MACRO_H__ + +/* Public headers. */ +#include + +/* Necessary private headers. */ +#include "fe/fe.h" +#include "feat/feat.h" + +/** + * Helper macro to stringify enums and other non-string values for + * default arguments. + **/ +#define ARG_STRINGIFY(s) ARG_STRINGIFY1(s) +#define ARG_STRINGIFY1(s) #s + + +/** Minimal set of command-line options for PocketSphinx. */ +#define POCKETSPHINX_OPTIONS \ + POCKETSPHINX_FE_OPTIONS, \ + POCKETSPHINX_FEAT_OPTIONS, \ + POCKETSPHINX_ACMOD_OPTIONS, \ + POCKETSPHINX_BEAM_OPTIONS, \ + POCKETSPHINX_SEARCH_OPTIONS, \ + POCKETSPHINX_DICT_OPTIONS, \ + POCKETSPHINX_NGRAM_OPTIONS, \ + POCKETSPHINX_FSG_OPTIONS, \ + POCKETSPHINX_KWS_OPTIONS, \ + POCKETSPHINX_DEBUG_OPTIONS + +/** Options for debugging and logging. */ +#define POCKETSPHINX_DEBUG_OPTIONS \ + { "logfn", \ + ARG_STRING, \ + NULL, \ + "File to write log messages in" }, \ + { "loglevel", \ + ARG_STRING, \ + "WARN", \ + "Minimum level of log messages (DEBUG, INFO, WARN, ERROR)" },\ + { "mfclogdir", \ + ARG_STRING, \ + NULL, \ + "Directory to log feature files to" \ + }, \ + { "rawlogdir", \ + ARG_STRING, \ + NULL, \ + "Directory to log raw audio files to" }, \ + { "senlogdir", \ + ARG_STRING, \ + NULL, \ + "Directory to log senone score files to" \ + } + +/** Options defining beam width parameters for tuning the search. */ +#define POCKETSPHINX_BEAM_OPTIONS \ +{ "beam", \ + ARG_FLOATING, \ + "1e-48", \ + "Beam width applied to every frame in Viterbi search (smaller values mean wider beam)" }, \ +{ "wbeam", \ + ARG_FLOATING, \ + "7e-29", \ + "Beam width applied to word exits" }, \ +{ "pbeam", \ + ARG_FLOATING, \ + "1e-48", \ + "Beam width applied to phone transitions" }, \ +{ "lpbeam", \ + ARG_FLOATING, \ + "1e-40", \ + "Beam width applied to last phone in words" }, \ +{ "lponlybeam", \ + ARG_FLOATING, \ + "7e-29", \ + "Beam width applied to last phone in single-phone words" }, \ +{ "fwdflatbeam", \ + ARG_FLOATING, \ + "1e-64", \ + "Beam width applied to every frame in second-pass flat search" }, \ +{ "fwdflatwbeam", \ + ARG_FLOATING, \ + "7e-29", \ + "Beam width applied to word exits in second-pass flat search" }, \ +{ "pl_window", \ + ARG_INTEGER, \ + "5", \ + "Phoneme lookahead window size, in frames" }, \ +{ "pl_beam", \ + ARG_FLOATING, \ + "1e-10", \ + "Beam width applied to phone loop search for lookahead" }, \ +{ "pl_pbeam", \ + ARG_FLOATING, \ + "1e-10", \ + "Beam width applied to phone loop transitions for lookahead" }, \ +{ "pl_pip", \ + ARG_FLOATING, \ + "1.0", \ + "Phone insertion penalty for phone loop" }, \ +{ "pl_weight", \ + ARG_FLOATING, \ + "3.0", \ + "Weight for phoneme lookahead penalties" } \ + +/** Options defining other parameters for tuning the search. */ +#define POCKETSPHINX_SEARCH_OPTIONS \ +{ "compallsen", \ + ARG_BOOLEAN, \ + "no", \ + "Compute all senone scores in every frame (can be faster when there are many senones)" }, \ +{ "fwdtree", \ + ARG_BOOLEAN, \ + "yes", \ + "Run forward lexicon-tree search (1st pass)" }, \ +{ "fwdflat", \ + ARG_BOOLEAN, \ + "yes", \ + "Run forward flat-lexicon search over word lattice (2nd pass)" }, \ +{ "bestpath", \ + ARG_BOOLEAN, \ + "yes", \ + "Run bestpath (Dijkstra) search over word lattice (3rd pass)" }, \ +{ "backtrace", \ + ARG_BOOLEAN, \ + "no", \ + "Print results and backtraces to log." }, \ +{ "latsize", \ + ARG_INTEGER, \ + "5000", \ + "Initial backpointer table size" }, \ +{ "maxwpf", \ + ARG_INTEGER, \ + "-1", \ + "Maximum number of distinct word exits at each frame (or -1 for no pruning)" }, \ +{ "maxhmmpf", \ + ARG_INTEGER, \ + "30000", \ + "Maximum number of active HMMs to maintain at each frame (or -1 for no pruning)" }, \ +{ "min_endfr", \ + ARG_INTEGER, \ + "0", \ + "Nodes ignored in lattice construction if they persist for fewer than N frames" }, \ +{ "fwdflatefwid", \ + ARG_INTEGER, \ + "4", \ + "Minimum number of end frames for a word to be searched in fwdflat search" }, \ +{ "fwdflatsfwin", \ + ARG_INTEGER, \ + "25", \ + "Window of frames in lattice to search for successor words in fwdflat search " } + +/** Command-line options for keyphrase spotting */ +#define POCKETSPHINX_KWS_OPTIONS \ +{ "keyphrase", \ + ARG_STRING, \ + NULL, \ + "Keyphrase to spot"}, \ +{ "kws", \ + ARG_STRING, \ + NULL, \ + "A file with keyphrases to spot, one per line"}, \ +{ "kws_plp", \ + ARG_FLOATING, \ + "1e-1", \ + "Phone loop probability for keyphrase spotting" }, \ +{ "kws_delay", \ + ARG_INTEGER, \ + "10", \ + "Delay to wait for best detection score" }, \ +{ "kws_threshold", \ + ARG_FLOATING, \ + "1e-30", \ + "Threshold for p(hyp)/p(alternatives) ratio" } + +/** Command-line options for finite state grammars. */ +#define POCKETSPHINX_FSG_OPTIONS \ + { "fsg", \ + ARG_STRING, \ + NULL, \ + "Sphinx format finite state grammar file"}, \ +{ "jsgf", \ + ARG_STRING, \ + NULL, \ + "JSGF grammar file" }, \ +{ "toprule", \ + ARG_STRING, \ + NULL, \ + "Start rule for JSGF (first public rule is default)" }, \ +{ "fsgusealtpron", \ + ARG_BOOLEAN, \ + "yes", \ + "Add alternate pronunciations to FSG"}, \ +{ "fsgusefiller", \ + ARG_BOOLEAN, \ + "yes", \ + "Insert filler words at each state."} + +/** Command-line options for statistical language models. */ +#define POCKETSPHINX_NGRAM_OPTIONS \ +{ "allphone", \ + ARG_STRING, \ + NULL, \ + "Perform phoneme decoding with phonetic lm (given here)" }, \ +{ "allphone_ci", \ + ARG_BOOLEAN, \ + "yes", \ + "Perform phoneme decoding with phonetic lm and context-independent units only" }, \ +{ "lm", \ + ARG_STRING, \ + NULL, \ + "Word trigram language model input file" }, \ +{ "lmctl", \ + ARG_STRING, \ + NULL, \ + "Specify a set of language model"}, \ +{ "lmname", \ + ARG_STRING, \ + NULL, \ + "Which language model in -lmctl to use by default"}, \ +{ "lw", \ + ARG_FLOATING, \ + "6.5", \ + "Language model probability weight" }, \ +{ "fwdflatlw", \ + ARG_FLOATING, \ + "8.5", \ + "Language model probability weight for flat lexicon (2nd pass) decoding" }, \ +{ "bestpathlw", \ + ARG_FLOATING, \ + "9.5", \ + "Language model probability weight for bestpath search" }, \ +{ "ascale", \ + ARG_FLOATING, \ + "20.0", \ + "Inverse of acoustic model scale for confidence score calculation" }, \ +{ "wip", \ + ARG_FLOATING, \ + "0.65", \ + "Word insertion penalty" }, \ +{ "nwpen", \ + ARG_FLOATING, \ + "1.0", \ + "New word transition penalty" }, \ +{ "pip", \ + ARG_FLOATING, \ + "1.0", \ + "Phone insertion penalty" }, \ +{ "uw", \ + ARG_FLOATING, \ + "1.0", \ + "Unigram weight" }, \ +{ "silprob", \ + ARG_FLOATING, \ + "0.005", \ + "Silence word transition probability" }, \ +{ "fillprob", \ + ARG_FLOATING, \ + "1e-8", \ + "Filler word transition probability" } \ + +/** Command-line options for dictionaries. */ +#define POCKETSPHINX_DICT_OPTIONS \ + { "dict", \ + ARG_STRING, \ + NULL, \ + "Main pronunciation dictionary (lexicon) input file" }, \ + { "fdict", \ + ARG_STRING, \ + NULL, \ + "Noise word pronunciation dictionary input file" }, \ + { "dictcase", \ + ARG_BOOLEAN, \ + "no", \ + "Dictionary is case sensitive (NOTE: case insensitivity applies to ASCII characters only)" } \ + +/** Command-line options for acoustic modeling */ +#define POCKETSPHINX_ACMOD_OPTIONS \ +{ "hmm", \ + REQARG_STRING, \ + NULL, \ + "Directory containing acoustic model files."}, \ +{ "featparams", \ + ARG_STRING, \ + NULL, \ + "File containing feature extraction parameters."}, \ +{ "mdef", \ + ARG_STRING, \ + NULL, \ + "Model definition input file" }, \ +{ "senmgau", \ + ARG_STRING, \ + NULL, \ + "Senone to codebook mapping input file (usually not needed)" }, \ +{ "tmat", \ + ARG_STRING, \ + NULL, \ + "HMM state transition matrix input file" }, \ +{ "tmatfloor", \ + ARG_FLOATING, \ + "0.0001", \ + "HMM state transition probability floor (applied to -tmat file)" }, \ +{ "mean", \ + ARG_STRING, \ + NULL, \ + "Mixture gaussian means input file" }, \ +{ "var", \ + ARG_STRING, \ + NULL, \ + "Mixture gaussian variances input file" }, \ +{ "varfloor", \ + ARG_FLOATING, \ + "0.0001", \ + "Mixture gaussian variance floor (applied to data from -var file)" }, \ +{ "mixw", \ + ARG_STRING, \ + NULL, \ + "Senone mixture weights input file (uncompressed)" }, \ +{ "mixwfloor", \ + ARG_FLOATING, \ + "0.0000001", \ + "Senone mixture weights floor (applied to data from -mixw file)" }, \ +{ "aw", \ + ARG_INTEGER, \ + "1", \ + "Inverse weight applied to acoustic scores." }, \ +{ "sendump", \ + ARG_STRING, \ + NULL, \ + "Senone dump (compressed mixture weights) input file" }, \ +{ "mllr", \ + ARG_STRING, \ + NULL, \ + "MLLR transformation to apply to means and variances" }, \ +{ "mmap", \ + ARG_BOOLEAN, \ + "yes", \ + "Use memory-mapped I/O (if possible) for model files" }, \ +{ "ds", \ + ARG_INTEGER, \ + "1", \ + "Frame GMM computation downsampling ratio" }, \ +{ "topn", \ + ARG_INTEGER, \ + "4", \ + "Maximum number of top Gaussians to use in scoring." }, \ +{ "topn_beam", \ + ARG_STRING, \ + "0", \ + "Beam width used to determine top-N Gaussians (or a list, per-feature)" },\ +{ "logbase", \ + ARG_FLOATING, \ + "1.0001", \ + "Base in which all log-likelihoods calculated" } + +/** Options for acoustic feature computation. */ +#define POCKETSPHINX_FE_OPTIONS \ + { "logspec", \ + ARG_BOOLEAN, \ + "no", \ + "Write out logspectral files instead of cepstra" }, \ + { "smoothspec", \ + ARG_BOOLEAN, \ + "no", \ + "Write out cepstral-smoothed logspectral files" }, \ + { "transform", \ + ARG_STRING, \ + "legacy", \ + "Which type of transform to use to calculate cepstra (legacy, dct, or htk)" }, \ + { "alpha", \ + ARG_FLOATING, \ + ARG_STRINGIFY(DEFAULT_PRE_EMPHASIS_ALPHA), \ + "Preemphasis parameter" }, \ + { "samprate", \ + ARG_INTEGER, \ + ARG_STRINGIFY(DEFAULT_SAMPLING_RATE), \ + "Sampling rate" }, \ + { "frate", \ + ARG_INTEGER, \ + ARG_STRINGIFY(DEFAULT_FRAME_RATE), \ + "Frame rate" }, \ + { "wlen", \ + ARG_FLOATING, \ + ARG_STRINGIFY(DEFAULT_WINDOW_LENGTH), \ + "Hamming window length" }, \ + { "nfft", \ + ARG_INTEGER, \ + "0", \ + "Size of FFT, or 0 to set automatically (recommended)" }, \ + { "nfilt", \ + ARG_INTEGER, \ + ARG_STRINGIFY(DEFAULT_NUM_FILTERS), \ + "Number of filter banks" }, \ + { "lowerf", \ + ARG_FLOATING, \ + ARG_STRINGIFY(DEFAULT_LOWER_FILT_FREQ), \ + "Lower edge of filters" }, \ + { "upperf", \ + ARG_FLOATING, \ + ARG_STRINGIFY(DEFAULT_UPPER_FILT_FREQ), \ + "Upper edge of filters" }, \ + { "unit_area", \ + ARG_BOOLEAN, \ + "yes", \ + "Normalize mel filters to unit area" }, \ + { "round_filters", \ + ARG_BOOLEAN, \ + "yes", \ + "Round mel filter frequencies to DFT points" }, \ + { "ncep", \ + ARG_INTEGER, \ + ARG_STRINGIFY(DEFAULT_NUM_CEPSTRA), \ + "Number of cep coefficients" }, \ + { "doublebw", \ + ARG_BOOLEAN, \ + "no", \ + "Use double bandwidth filters (same center freq)" }, \ + { "lifter", \ + ARG_INTEGER, \ + "0", \ + "Length of sin-curve for liftering, or 0 for no liftering." }, \ + { "input_endian", \ + ARG_STRING, \ + NATIVE_ENDIAN, \ + "Endianness of input data, big or little, ignored if NIST or MS Wav" }, \ + { "warp_type", \ + ARG_STRING, \ + DEFAULT_WARP_TYPE, \ + "Warping function type (or shape)" }, \ + { "warp_params", \ + ARG_STRING, \ + NULL, \ + "Parameters defining the warping function" }, \ + { "dither", \ + ARG_BOOLEAN, \ + "no", \ + "Add 1/2-bit noise" }, \ + { "seed", \ + ARG_INTEGER, \ + ARG_STRINGIFY(SEED), \ + "Seed for random number generator; if less than zero, pick our own" }, \ + { "remove_dc", \ + ARG_BOOLEAN, \ + "no", \ + "Remove DC offset from each frame" }, \ + { "remove_noise", \ + ARG_BOOLEAN, \ + "no", \ + "Remove noise using spectral subtraction" }, \ + { "verbose", \ + ARG_BOOLEAN, \ + "no", \ + "Show input filenames" } + +/** Options for dynamic feature calculation. */ +#define POCKETSPHINX_FEAT_OPTIONS \ +{ "feat", \ + ARG_STRING, \ + "1s_c_d_dd", \ + "Feature stream type, depends on the acoustic model" }, \ +{ "ceplen", \ + ARG_INTEGER, \ + "13", \ + "Number of components in the input feature vector" }, \ +{ "cmn", \ + ARG_STRING, \ + "live", \ + "Cepstral mean normalization scheme ('live', 'batch', or 'none')" }, \ +{ "cmninit", \ + ARG_STRING, \ + "40,3,-1", \ + "Initial values (comma-separated) for cepstral mean when 'live' is used" }, \ +{ "varnorm", \ + ARG_BOOLEAN, \ + "no", \ + "Variance normalize each utterance (only if CMN == current)" }, \ +{ "agc", \ + ARG_STRING, \ + "none", \ + "Automatic gain control for c0 ('max', 'emax', 'noise', or 'none')" }, \ +{ "agcthresh", \ + ARG_FLOATING, \ + "2.0", \ + "Initial threshold for automatic gain control" }, \ +{ "lda", \ + ARG_STRING, \ + NULL, \ + "File containing transformation matrix to be applied to features (single-stream features only)" }, \ +{ "ldadim", \ + ARG_INTEGER, \ + "0", \ + "Dimensionality of output of feature transformation (0 to use entire matrix)" }, \ +{ "svspec", \ + ARG_STRING, \ + NULL, \ + "Subvector specification (e.g., 24,0-11/25,12-23/26-38 or 0-12/13-25/26-38)"} + +#define CMDLN_EMPTY_OPTION { NULL, 0, NULL, NULL } + +#endif /* __PS_CMDLN_MACRO_H__ */ diff --git a/src/libpocketsphinx/dict.c b/src/dict.c similarity index 96% rename from src/libpocketsphinx/dict.c rename to src/dict.c index 3048508..b9a1322 100644 --- a/src/libpocketsphinx/dict.c +++ b/src/dict.c @@ -35,14 +35,11 @@ * */ -/* System headers. */ #include -/* SphinxBase headers. */ -#include -#include - -/* Local headers. */ +#include "util/pio.h" +#include "util/ckd_alloc.h" +#include "util/strfuncs.h" #include "dict.h" @@ -191,7 +188,7 @@ dict_read(FILE * fp, dict_t * d) for (i = 1; i < nwd; i++) { p[i - 1] = dict_ciphone_id(d, wptr[i]); if (NOT_S3CIPID(p[i - 1])) { - E_ERROR("Line %d: Phone '%s' is mising in the acoustic model; word '%s' ignored\n", + E_ERROR("Line %d: Phone '%s' is missing in the acoustic model; word '%s' ignored\n", lineno, wptr[i], wptr[0]); break; } @@ -223,6 +220,7 @@ dict_write(dict_t *dict, char const *filename, char const *format) FILE *fh; int i; + (void)format; /* FIXME */ if ((fh = fopen(filename, "w")) == NULL) { E_ERROR_SYSTEM("Failed to open '%s'", filename); return -1; @@ -249,7 +247,7 @@ dict_write(dict_t *dict, char const *filename, char const *format) dict_t * -dict_init(cmd_ln_t *config, bin_mdef_t * mdef) +dict_init(ps_config_t *config, bin_mdef_t * mdef) { FILE *fp, *fp2; int32 n; @@ -259,8 +257,8 @@ dict_init(cmd_ln_t *config, bin_mdef_t * mdef) char const *dictfile = NULL, *fillerfile = NULL; if (config) { - dictfile = cmd_ln_str_r(config, "-dict"); - fillerfile = cmd_ln_str_r(config, "_fdict"); + dictfile = ps_config_str(config, "dict"); + fillerfile = ps_config_str(config, "fdict"); } /* @@ -309,8 +307,8 @@ dict_init(cmd_ln_t *config, bin_mdef_t * mdef) if (n >= MAX_S3WID) { E_ERROR("Number of words in dictionaries (%d) exceeds limit (%d)\n", n, MAX_S3WID); - fclose(fp); - fclose(fp2); + if (fp) fclose(fp); + if (fp2) fclose(fp2); ckd_free(d); return NULL; } @@ -324,8 +322,8 @@ dict_init(cmd_ln_t *config, bin_mdef_t * mdef) d->mdef = bin_mdef_retain(mdef); /* Create new hash table for word strings; case-insensitive word strings */ - if (config && cmd_ln_exists_r(config, "-dictcase")) - d->nocase = cmd_ln_boolean_r(config, "-dictcase"); + if (config) + d->nocase = ps_config_bool(config, "dictcase"); d->ht = hash_table_new(d->max_words, d->nocase); /* Digest main dictionary file */ @@ -354,7 +352,7 @@ dict_init(cmd_ln_t *config, bin_mdef_t * mdef) /* Now the filler dictionary file, if it exists */ d->filler_start = d->n_word; - if (fillerfile) { + if (fp2) { E_INFO("Reading filler dictionary: %s\n", fillerfile); dict_read(fp2, d); fclose(fp2); diff --git a/src/libpocketsphinx/dict.h b/src/dict.h similarity index 96% rename from src/libpocketsphinx/dict.h rename to src/dict.h index 26ffd2b..2f13b65 100644 --- a/src/libpocketsphinx/dict.h +++ b/src/dict.h @@ -42,25 +42,27 @@ * \brief Operations on dictionary. */ -/* SphinxBase headers. */ -#include +#include -/* Local headers. */ #include "s3types.h" #include "bin_mdef.h" -#include "pocketsphinx_export.h" +#include "util/hash_table.h" +#include "pocketsphinx/export.h" #define S3DICT_INC_SZ 4096 #ifdef __cplusplus extern "C" { #endif +#if 0 +} +#endif /** \struct dictword_t \brief a structure for one dictionary word. */ -typedef struct { +typedef struct dictword_s { char *word; /**< Ascii word string */ s3cipid_t *ciphone; /**< Pronunciation */ int32 pronlen; /**< Pronunciation length */ @@ -73,7 +75,7 @@ typedef struct { \brief a structure for a dictionary. */ -typedef struct { +typedef struct dict_s { int refcnt; bin_mdef_t *mdef; /**< Model definition used for phone IDs; NULL if none used */ dictword_t *word; /**< Array of entries in dictionary */ @@ -100,7 +102,7 @@ typedef struct { * * Return ptr to dict_t if successful, NULL otherwise. */ -dict_t *dict_init(cmd_ln_t *config, /**< Configuration (-dict, -fdict, -dictcase) or NULL */ +dict_t *dict_init(ps_config_t *config, /**< Configuration (-dict, -fdict, -dictcase) or NULL */ bin_mdef_t *mdef /**< For looking up CI phone IDs (or NULL) */ ); @@ -204,7 +206,7 @@ void dict_report(dict_t *d /**< A dictionary structure */ ); #ifdef __cplusplus -} +} /* extern "C" */ #endif #endif diff --git a/src/libpocketsphinx/dict2pid.c b/src/dict2pid.c similarity index 96% rename from src/libpocketsphinx/dict2pid.c rename to src/dict2pid.c index 0293dfb..c6bfe17 100644 --- a/src/libpocketsphinx/dict2pid.c +++ b/src/dict2pid.c @@ -37,6 +37,9 @@ #include +#include "util/ckd_alloc.h" +#include "util/bitvec.h" +#include "s3types.h" #include "dict2pid.h" #include "hmm.h" @@ -285,11 +288,11 @@ populate_lrdiph(dict2pid_t *d2p, s3ssid_t ***rdiph_rc, s3cipid_t b) rdiph_rc[b][l][r] = bin_mdef_pid2ssid(mdef, p); assert(IS_S3SSID(bin_mdef_pid2ssid(mdef, p))); - E_DEBUG(2,("%s(%s,%s) => %d / %d\n", - bin_mdef_ciphone_str(mdef, b), - bin_mdef_ciphone_str(mdef, l), - bin_mdef_ciphone_str(mdef, r), - p, bin_mdef_pid2ssid(mdef, p))); + E_DEBUG("%s(%s,%s) => %d / %d\n", + bin_mdef_ciphone_str(mdef, b), + bin_mdef_ciphone_str(mdef, l), + bin_mdef_ciphone_str(mdef, r), + p, bin_mdef_pid2ssid(mdef, p)); } } } @@ -307,9 +310,9 @@ dict2pid_add_word(dict2pid_t *d2p, * word. */ if (d2p->ldiph_lc[dict_first_phone(d, wid)][dict_second_phone(d, wid)][0] == BAD_S3SSID) { - E_DEBUG(2, ("Filling in left-context diphones for %s(?,%s)\n", + E_DEBUG("Filling in left-context diphones for %s(?,%s)\n", bin_mdef_ciphone_str(mdef, dict_first_phone(d, wid)), - bin_mdef_ciphone_str(mdef, dict_second_phone(d, wid)))); + bin_mdef_ciphone_str(mdef, dict_second_phone(d, wid))); for (l = 0; l < bin_mdef_n_ciphone(mdef); l++) { int p = bin_mdef_phone_id_nearest(mdef, @@ -327,9 +330,9 @@ dict2pid_add_word(dict2pid_t *d2p, s3cipid_t *tmpcimap; s3cipid_t r; - E_DEBUG(2, ("Filling in right-context diphones for %s(%s,?)\n", + E_DEBUG("Filling in right-context diphones for %s(%s,?)\n", bin_mdef_ciphone_str(mdef, dict_last_phone(d, wid)), - bin_mdef_ciphone_str(mdef, dict_second_last_phone(d, wid)))); + bin_mdef_ciphone_str(mdef, dict_second_last_phone(d, wid))); rmap = ckd_calloc(bin_mdef_n_ciphone(mdef), sizeof(*rmap)); for (r = 0; r < bin_mdef_n_ciphone(mdef); r++) { int p @@ -472,8 +475,8 @@ dict2pid_build(bin_mdef_t * mdef, dict_t * dict) } else if (pronlen == 1) { b = dict_pron(dict, w, 0); - E_DEBUG(1,("Building tables for single phone word %s phone %d = %s\n", - dict_wordstr(dict, w), b, bin_mdef_ciphone_str(mdef, b))); + E_DEBUG("Building tables for single phone word %s phone %d = %s\n", + dict_wordstr(dict, w), b, bin_mdef_ciphone_str(mdef, b)); /* Populate lrdiph_rc (and also ldiph_lc, rdiph_rc if needed) */ if (bitvec_is_clear(single, b)) { populate_lrdiph(dict2pid, rdiph_rc, b); @@ -492,7 +495,6 @@ dict2pid_build(bin_mdef_t * mdef, dict_t * dict) ckd_free_3d(rdiph_rc); - dict2pid_report(dict2pid); return dict2pid; } @@ -529,11 +531,6 @@ dict2pid_free(dict2pid_t * d2p) return 0; } -void -dict2pid_report(dict2pid_t * d2p) -{ -} - void dict2pid_dump(FILE * fp, dict2pid_t * d2p) { diff --git a/src/libpocketsphinx/dict2pid.h b/src/dict2pid.h similarity index 97% rename from src/libpocketsphinx/dict2pid.h rename to src/dict2pid.h index f81cf63..001d7c0 100644 --- a/src/libpocketsphinx/dict2pid.h +++ b/src/dict2pid.h @@ -38,14 +38,10 @@ #ifndef _S3_DICT2PID_H_ #define _S3_DICT2PID_H_ -/* System headers. */ #include -/* SphinxBase headers. */ -#include -#include +#include -/* Local headers. */ #include "s3types.h" #include "bin_mdef.h" #include "dict.h" @@ -64,13 +60,16 @@ #ifdef __cplusplus extern "C" { #endif +#if 0 +} +#endif /** * \struct xwdssid_t * \brief cross word triphone model structure */ -typedef struct { +typedef struct xwdssid_s { s3ssid_t *ssid; /**< Senone Sequence ID list for all context ciphones */ s3cipid_t *cimap; /**< Index into ssid[] above for each ci phone */ int32 n_ssid; /**< #Unique ssid in above, compressed ssid list */ @@ -81,7 +80,7 @@ typedef struct { \brief Building composite triphone (as well as word internal triphones) with the dictionary. */ -typedef struct { +typedef struct dict2pid_s { int refcount; bin_mdef_t *mdef; /**< Model definition, used to generate @@ -173,8 +172,7 @@ s3cipid_t* dict2pid_get_rcmap(dict2pid_t *d2p, /**< In: a dict2pid */ ); #ifdef __cplusplus -} +} /* extern "C" */ #endif - #endif diff --git a/src/fast_ptm.txt b/src/fast_ptm.txt new file mode 100644 index 0000000..e3297ea --- /dev/null +++ b/src/fast_ptm.txt @@ -0,0 +1,23 @@ +Ideas for accelerating PTM computation +-------------------------------------- + +First thing to note is that codebook computation now takes up the +majority of the time spent evaluating PTMs. So speeding up Gaussian +evaluation is suddenly important again. + +Using a tighter top-N beam will speed up Gaussian computation by +imposing a higher floor on densities, but this effect isn't worth a +whole lot, in contrast to SC models where mixture computation rather +than density computation is the most expensive part. + +This means that we should probably bring back kd-trees, although the +implementation should be tweaked to be faster loading. + +Also, maybe more importantly, we can do some form of CI-GMM selection +on the codebooks. This won't actually work with the way the models +are set up currently since the CI phones share the same codebook as +the CD ones, and the goal is to prune codebooks rather than phones. + +But wait! It's okay, because we still have the same top-N mechanism +as before. We can use those top-N scores to do early pruning of +entire codebooks. This ought to give us the most bang for the buck. diff --git a/src/fe/fe.h b/src/fe/fe.h new file mode 100644 index 0000000..aba0c64 --- /dev/null +++ b/src/fe/fe.h @@ -0,0 +1,523 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1996-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file fe.h + * @brief Feature Extraction and/or Front End + */ + +#if defined(_WIN32) && !defined(GNUWINCE) +#define srand48(x) srand(x) +#define lrand48() rand() +#endif + +#ifndef _NEW_FE_H_ +#define _NEW_FE_H_ + +#include "util/cmd_ln.h" +#include "fixpoint.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#ifdef WORDS_BIGENDIAN +#define NATIVE_ENDIAN "big" +#else +#define NATIVE_ENDIAN "little" +#endif + +/** Default number of samples per second. */ +#define DEFAULT_SAMPLING_RATE 16000 +/** Default number of frames per second. */ +#define DEFAULT_FRAME_RATE 100 +/** Default spacing between frame starts (equal to + * DEFAULT_SAMPLING_RATE/DEFAULT_FRAME_RATE) */ +#define DEFAULT_FRAME_SHIFT 160 +/** Default size of each frame (410 samples @ 16000Hz). */ +#define DEFAULT_WINDOW_LENGTH 0.025625 +/** Default number of FFT points. */ +#define DEFAULT_FFT_SIZE 512 +/** Default number of MFCC coefficients in output. */ +#define DEFAULT_NUM_CEPSTRA 13 +/** Default number of filter bands used to generate MFCCs. */ +#define DEFAULT_NUM_FILTERS 40 + +/** Default prespeech length */ +#define DEFAULT_PRE_SPEECH 20 +/** Default postspeech length */ +#define DEFAULT_POST_SPEECH 50 +/** Default postspeech length */ +#define DEFAULT_START_SPEECH 10 + +/** Default lower edge of mel filter bank. */ +#define DEFAULT_LOWER_FILT_FREQ 133.33334 +/** Default upper edge of mel filter bank. */ +#define DEFAULT_UPPER_FILT_FREQ 6855.4976 +/** Default pre-emphasis filter coefficient. */ +#define DEFAULT_PRE_EMPHASIS_ALPHA 0.97 +/** Default type of frequency warping to use for VTLN. */ +#define DEFAULT_WARP_TYPE "inverse_linear" +/** Default random number seed to use for dithering. */ +#define SEED -1 + +#define waveform_to_cepstral_command_line_macro() \ + { "logspec", \ + ARG_BOOLEAN, \ + "no", \ + "Write out logspectral files instead of cepstra" }, \ + \ + { "smoothspec", \ + ARG_BOOLEAN, \ + "no", \ + "Write out cepstral-smoothed logspectral files" }, \ + \ + { "transform", \ + ARG_STRING, \ + "legacy", \ + "Which type of transform to use to calculate cepstra (legacy, dct, or htk)" }, \ + \ + { "alpha", \ + ARG_FLOATING, \ + ARG_STRINGIFY(DEFAULT_PRE_EMPHASIS_ALPHA), \ + "Preemphasis parameter" }, \ + \ + { "samprate", \ + ARG_INTEGER, \ + ARG_STRINGIFY(DEFAULT_SAMPLING_RATE), \ + "Sampling rate" }, \ + \ + { "frate", \ + ARG_INTEGER, \ + ARG_STRINGIFY(DEFAULT_FRAME_RATE), \ + "Frame rate" }, \ + \ + { "wlen", \ + ARG_FLOATING, \ + ARG_STRINGIFY(DEFAULT_WINDOW_LENGTH), \ + "Hamming window length" }, \ + \ + { "nfft", \ + ARG_INTEGER, \ + "0", \ + "Size of FFT, or 0 to set automatically (recommended)" }, \ + \ + { "nfilt", \ + ARG_INTEGER, \ + ARG_STRINGIFY(DEFAULT_NUM_FILTERS), \ + "Number of filter banks" }, \ + \ + { "lowerf", \ + ARG_FLOATING, \ + ARG_STRINGIFY(DEFAULT_LOWER_FILT_FREQ), \ + "Lower edge of filters" }, \ + \ + { "upperf", \ + ARG_FLOATING, \ + ARG_STRINGIFY(DEFAULT_UPPER_FILT_FREQ), \ + "Upper edge of filters" }, \ + \ + { "unit_area", \ + ARG_BOOLEAN, \ + "yes", \ + "Normalize mel filters to unit area" }, \ + \ + { "round_filters", \ + ARG_BOOLEAN, \ + "yes", \ + "Round mel filter frequencies to DFT points" }, \ + \ + { "ncep", \ + ARG_INTEGER, \ + ARG_STRINGIFY(DEFAULT_NUM_CEPSTRA), \ + "Number of cep coefficients" }, \ + \ + { "doublebw", \ + ARG_BOOLEAN, \ + "no", \ + "Use double bandwidth filters (same center freq)" }, \ + \ + { "lifter", \ + ARG_INTEGER, \ + "0", \ + "Length of sin-curve for liftering, or 0 for no liftering." }, \ + \ + { "input_endian", \ + ARG_STRING, \ + NATIVE_ENDIAN, \ + "Endianness of input data, big or little, ignored if NIST or MS Wav" }, \ + \ + { "warp_type", \ + ARG_STRING, \ + DEFAULT_WARP_TYPE, \ + "Warping function type (or shape)" }, \ + \ + { "warp_params", \ + ARG_STRING, \ + NULL, \ + "Parameters defining the warping function" }, \ + \ + { "dither", \ + ARG_BOOLEAN, \ + "no", \ + "Add 1/2-bit noise" }, \ + \ + { "seed", \ + ARG_INTEGER, \ + ARG_STRINGIFY(SEED), \ + "Seed for random number generator; if less than zero, pick our own" }, \ + \ + { "remove_dc", \ + ARG_BOOLEAN, \ + "no", \ + "Remove DC offset from each frame" }, \ + { "remove_noise", \ + ARG_BOOLEAN, \ + "no", \ + "Remove noise using spectral subtraction" }, \ + { "verbose", \ + ARG_BOOLEAN, \ + "no", \ + "Show input filenames" } + + +#ifdef FIXED_POINT +/** MFCC computation type. */ +typedef fixed32 mfcc_t; + +/** Convert a floating-point value to mfcc_t. */ +#define FLOAT2MFCC(x) FLOAT2FIX(x) +/** Convert a mfcc_t value to floating-point. */ +#define MFCC2FLOAT(x) FIX2FLOAT(x) +/** Multiply two mfcc_t values. */ +#define MFCCMUL(a,b) FIXMUL(a,b) +#define MFCCLN(x,in,out) FIXLN_ANY(x,in,out) +#else /* !FIXED_POINT */ + +/** MFCC computation type. */ +typedef float32 mfcc_t; +/** Convert a floating-point value to mfcc_t. */ +#define FLOAT2MFCC(x) (x) +/** Convert a mfcc_t value to floating-point. */ +#define MFCC2FLOAT(x) (x) +/** Multiply two mfcc_t values. */ +#define MFCCMUL(a,b) ((a)*(b)) +#define MFCCLN(x,in,out) log(x) +#endif /* !FIXED_POINT */ + +/** + * Structure for the front-end computation. + */ +typedef struct fe_s fe_t; + +/** + * Error codes returned by stuff. + */ +enum fe_error_e { + FE_SUCCESS = 0, + FE_OUTPUT_FILE_SUCCESS = 0, + FE_CONTROL_FILE_ERROR = -1, + FE_START_ERROR = -2, + FE_UNKNOWN_SINGLE_OR_BATCH = -3, + FE_INPUT_FILE_OPEN_ERROR = -4, + FE_INPUT_FILE_READ_ERROR = -5, + FE_MEM_ALLOC_ERROR = -6, + FE_OUTPUT_FILE_WRITE_ERROR = -7, + FE_OUTPUT_FILE_OPEN_ERROR = -8, + FE_ZERO_ENERGY_ERROR = -9, + FE_INVALID_PARAM_ERROR = -10 +}; + +/** + * Initialize a front-end object from a command-line parse. + * + * @param config Command-line object, as returned by cmd_ln_parse_r() + * or cmd_ln_parse_file(). Ownership is retained by the + * fe_t, so you may free this if you no longer need it. + * @return Newly created front-end object. + */ +fe_t *fe_init_auto_r(cmd_ln_t *config); + +/** + * Retrieve the command-line object used to initialize this front-end. + * + * @return command-line object for this front-end. This pointer is + * owned by the fe_t, so you should not attempt to free it + * manually. + */ +cmd_ln_t *fe_get_config(fe_t *fe); + +/** + * Start processing an utterance. + * @return 0 for success, <0 for error (see enum fe_error_e) + */ +int fe_start_utt(fe_t *fe); + +/** + * Get the dimensionality of the output of this front-end object. + * + * This is guaranteed to be the number of values in one frame of + * output from fe_end_utt(), fe_process_frame(), and + * fe_process_frames(). It is usually the number of MFCC + * coefficients, but it might be the number of log-spectrum bins, if + * the -logspec or -smoothspec options to + * fe_init_auto_r() were true. + * + * @param fe Front-end object + * @return Dimensionality of front-end output. + */ +int fe_get_output_size(fe_t *fe); + +/** + * Get the dimensionality of the input to this front-end object. + * + * This function retrieves the number of input samples consumed by one + * frame of processing. To obtain one frame of output, you must have + * at least *out_frame_size samples. To obtain N + * frames of output, you must have at least (N-1) * + * *out_frame_shift + *out_frame_size input samples. + * + * @param fe Front-end object + * @param out_frame_shift Output: Number of samples between each frame start. + * @param out_frame_size Output: Number of samples in each frame. + */ +void fe_get_input_size(fe_t *fe, int *out_frame_shift, + int *out_frame_size); + +/** + * Finish processing an utterance. + * + * This function also collects any remaining samples and calculates a + * final cepstral vector. If there are overflow samples remaining, it + * will pad with zeros to make a complete frame. + * + * @param fe Front-end object. + * @param out_cepvector Buffer to hold a residual cepstral vector, or NULL + * if you wish to ignore it. Must be large enough + * @param out_nframes Number of frames of residual cepstra created + * (either 0 or 1). + * @return 0 for success, <0 for error (see enum fe_error_e) + */ +int fe_end_utt(fe_t *fe, mfcc_t *out_cepvector, int32 *out_nframes); + +/** + * Retain ownership of a front end object. + * + * @return pointer to the retained front end. + */ +fe_t *fe_retain(fe_t *fe); + +/** + * Free the front end. + * + * Releases resources associated with the front-end object. + * + * @return new reference count (0 if freed completely) + */ +int fe_free(fe_t *fe); + +/** + * Process one frame of samples. + * + * @param spch Speech samples (signed 16-bit linear PCM) + * @param nsamps Number of samples in spch + * @param buf_cep Buffer which will receive one frame of features. + * @return 0 for success, <0 for error (see enum fe_error_e) + */ +int fe_process_frame(fe_t *fe, int16 const *spch, + int32 nsamps, mfcc_t *out_cep); + +/** + * Process a block of samples. + * + * This function generates up to *inout_nframes of + * features, or as many as can be generated from + * *inout_nsamps samples. + * + * On exit, the inout_spch, inout_nsamps, + * and inout_nframes parameters are updated to point to + * the remaining sample data, the number of remaining samples, and the + * number of frames processed, respectively. This allows you to call + * this repeatedly to process a large block of audio in small (say, + * 5-frame) chunks: + * + * int16 *bigbuf, *p; + * mfcc_t **cepstra; + * int32 nsamps; + * int32 nframes = 5; + * + * cepstra = (mfcc_t **) + * ckd_calloc_2d(nframes, fe_get_output_size(fe), sizeof(**cepstra)); + * p = bigbuf; + * while (nsamps) { + * nframes = 5; + * fe_process_frames(fe, &p, &nsamps, cepstra, &nframes); + * // Now do something with these frames... + * if (nframes) + * do_some_stuff(cepstra, nframes); + * } + * + * @param inout_spch Input: Pointer to pointer to speech samples + * (signed 16-bit linear PCM). + * Output: Pointer to remaining samples. + * @param inout_nsamps Input: Pointer to maximum number of samples to + * process. + * Output: Number of samples remaining in input buffer. + * @param buf_cep Two-dimensional buffer (allocated with + * ckd_calloc_2d()) which will receive frames of output + * data. If NULL, no actual processing will be done, + * and the maximum number of output frames which would + * be generated is returned in + * *inout_nframes. + * @param inout_nframes Input: Pointer to maximum number of frames to + * generate. + * Output: Number of frames actually generated. + * @return 0 for success, <0 for failure (see enum fe_error_e) + */ +int fe_process_frames(fe_t *fe, + int16 const **inout_spch, + size_t *inout_nsamps, + mfcc_t **buf_cep, + int32 *inout_nframes); + +/** + * Process a block of samples, returning as many frames as possible. + * + * This function processes all the samples in a block of data and + * returns a newly allocated block of feature vectors. This block + * needs to be freed with fe_free_2d() after use. + * + * It is possible for there to be some left-over data which could not + * fit in a complete frame. This data can be processed with + * fe_end_utt(). + * + * This function is deprecated in favor of fe_process_frames(). + * + * @return 0 for success, <0 for failure (see enum fe_error_e) + */ +int fe_process_utt(fe_t *fe, /**< A front end object */ + int16 const *spch, /**< The speech samples */ + size_t nsamps, /**< number of samples*/ + mfcc_t ***cep_block, /**< Output pointer to cepstra */ + int32 *nframes /**< Number of frames processed */ + ); + +/** + * Free the output pointer returned by fe_process_utt(). + **/ +void fe_free_2d(void *arr); + +/** + * Convert a block of mfcc_t to float32 (can be done in-place) + **/ +int fe_mfcc_to_float(fe_t *fe, + mfcc_t **input, + float32 **output, + int32 nframes); + +/** + * Convert a block of float32 to mfcc_t (can be done in-place) + **/ +int fe_float_to_mfcc(fe_t *fe, + float32 **input, + mfcc_t **output, + int32 nframes); + +/** + * Process one frame of log spectra into MFCC using discrete cosine + * transform. + * + * This uses a variant of the DCT-II where the first frequency bin is + * scaled by 0.5. Unless somebody misunderstood the DCT-III equations + * and thought that's what they were implementing here, this is + * ostensibly done to account for the symmetry properties of the + * DCT-II versus the DFT - the first coefficient of the input is + * assumed to be repeated in the negative frequencies, which is not + * the case for the DFT. (This begs the question, why not just use + * the DCT-I, since it has the appropriate symmetry properties...) + * Moreover, this is bogus since the mel-frequency bins on which we + * are doing the DCT don't extend to the edge of the DFT anyway. + * + * This also means that the matrix used in computing this DCT can not + * be made orthogonal, and thus inverting the transform is difficult. + * Therefore if you want to do cepstral smoothing or have some other + * reason to invert your MFCCs, use fe_logspec_dct2() and its inverse + * fe_logspec_dct3() instead. + * + * Also, it normalizes by 1/nfilt rather than 2/nfilt, for some reason. + **/ +int fe_logspec_to_mfcc(fe_t *fe, /**< A fe structure */ + const mfcc_t *fr_spec, /**< One frame of spectrum */ + mfcc_t *fr_cep /**< One frame of cepstrum */ + ); + +/** + * Convert log spectra to MFCC using DCT-II. + * + * This uses the "unitary" form of the DCT-II, i.e. with a scaling + * factor of sqrt(2/N) and a "beta" factor of sqrt(1/2) applied to the + * cos(0) basis vector (i.e. the one corresponding to the DC + * coefficient in the output). + **/ +int fe_logspec_dct2(fe_t *fe, /**< A fe structure */ + const mfcc_t *fr_spec, /**< One frame of spectrum */ + mfcc_t *fr_cep /**< One frame of cepstrum */ + ); + +/** + * Convert MFCC to log spectra using DCT-III. + * + * This uses the "unitary" form of the DCT-III, i.e. with a scaling + * factor of sqrt(2/N) and a "beta" factor of sqrt(1/2) applied to the + * cos(0) basis vector (i.e. the one corresponding to the DC + * coefficient in the input). + **/ +int fe_mfcc_dct3(fe_t *fe, /**< A fe structure */ + const mfcc_t *fr_cep, /**< One frame of cepstrum */ + mfcc_t *fr_spec /**< One frame of spectrum */ + ); + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/src/fe/fe_interface.c b/src/fe/fe_interface.c new file mode 100644 index 0000000..85016c4 --- /dev/null +++ b/src/fe/fe_interface.c @@ -0,0 +1,680 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1996-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +#include +#include +#include +#include +#include + +#ifdef HAVE_CONFIG_H +#include +#endif + +/* Public headers. */ +#include + +#include "util/byteorder.h" +#include "util/genrand.h" +#include "util/ckd_alloc.h" +#include "fe/fixpoint.h" +#include "fe/fe_internal.h" +#include "fe/fe_warp.h" + +int +fe_parse_general_params(cmd_ln_t *config, fe_t * fe) +{ + int j, frate, window_samples; + + fe->config = ps_config_retain(config); + fe->sampling_rate = ps_config_int(config, "samprate"); + frate = ps_config_int(config, "frate"); + if (frate > MAX_INT16 || frate > fe->sampling_rate || frate < 1) { + E_ERROR + ("Frame rate %d can not be bigger than sample rate %.02f\n", + frate, fe->sampling_rate); + return -1; + } + + fe->frame_rate = (int16)frate; + if (ps_config_bool(config, "dither")) { + fe->dither = 1; + fe->dither_seed = ps_config_int(config, "seed"); + } +#ifdef WORDS_BIGENDIAN + /* i.e. if input_endian is *not* "big", then fe->swap is true. */ + fe->swap = strcmp("big", ps_config_str(config, "input_endian")); +#else + /* and vice versa */ + fe->swap = strcmp("little", ps_config_str(config, "input_endian")); +#endif + fe->window_length = ps_config_float(config, "wlen"); + fe->pre_emphasis_alpha = ps_config_float(config, "alpha"); + + fe->num_cepstra = (uint8)ps_config_int(config, "ncep"); + fe->fft_size = (int16)ps_config_int(config, "nfft"); + + window_samples = (int)(fe->window_length * fe->sampling_rate); + E_INFO("Frames are %d samples at intervals of %d\n", + window_samples, (int)(fe->sampling_rate / frate)); + if (window_samples > MAX_INT16) { + /* This is extremely unlikely! */ + E_ERROR("Frame size exceeds maximum FFT size (%d > %d)\n", + window_samples, MAX_INT16); + return -1; + } + + /* Set FFT size automatically from window size. */ + if (fe->fft_size == 0) { + fe->fft_order = 0; + fe->fft_size = (1<fft_order); + while (fe->fft_size < window_samples) { + fe->fft_order++; + fe->fft_size <<= 1; + } + E_INFO("FFT size automatically set to %d\n", fe->fft_size); + } + else { + /* Check FFT size, compute FFT order (log_2(n)) */ + for (j = fe->fft_size, fe->fft_order = 0; j > 1; j >>= 1, fe->fft_order++) { + if (((j % 2) != 0) || (fe->fft_size <= 0)) { + E_ERROR("fft: number of points must be a power of 2 (is %d)\n", + fe->fft_size); + return -1; + } + } + /* Verify that FFT size is greater or equal to window length. */ + if (fe->fft_size < window_samples) { + E_ERROR("FFT: Number of points must be greater or " + "equal to frame size\n"); + return -1; + } + } + + fe->remove_dc = ps_config_bool(config, "remove_dc"); + + if (0 == strcmp(ps_config_str(config, "transform"), "dct")) + fe->transform = DCT_II; + else if (0 == strcmp(ps_config_str(config, "transform"), "legacy")) + fe->transform = LEGACY_DCT; + else if (0 == strcmp(ps_config_str(config, "transform"), "htk")) + fe->transform = DCT_HTK; + else { + E_ERROR("Invalid transform type (values are 'dct', 'legacy', 'htk')\n"); + return -1; + } + + if (ps_config_bool(config, "logspec")) + fe->log_spec = RAW_LOG_SPEC; + if (ps_config_bool(config, "smoothspec")) + fe->log_spec = SMOOTH_LOG_SPEC; + + return 0; +} + +static int +fe_parse_melfb_params(cmd_ln_t *config, fe_t *fe, melfb_t * mel) +{ + mel->sampling_rate = fe->sampling_rate; + mel->fft_size = fe->fft_size; + mel->num_cepstra = fe->num_cepstra; + mel->num_filters = ps_config_int(config, "nfilt"); + + if (fe->log_spec) + fe->feature_dimension = mel->num_filters; + else + fe->feature_dimension = fe->num_cepstra; + + mel->upper_filt_freq = ps_config_float(config, "upperf"); + mel->lower_filt_freq = ps_config_float(config, "lowerf"); + + mel->doublewide = ps_config_bool(config, "doublebw"); + + mel->warp_type = ps_config_str(config, "warp_type"); + mel->warp_params = ps_config_str(config, "warp_params"); + mel->lifter_val = ps_config_int(config, "lifter"); + + mel->unit_area = ps_config_bool(config, "unit_area"); + mel->round_filters = ps_config_bool(config, "round_filters"); + + if (fe_warp_set(mel, mel->warp_type) != FE_SUCCESS) { + E_ERROR("Failed to initialize the warping function.\n"); + return -1; + } + fe_warp_set_parameters(mel, mel->warp_params, mel->sampling_rate); + return 0; +} + +void +fe_print_current(fe_t const *fe) +{ + E_INFO("Current FE Parameters:\n"); + E_INFO("\tSampling Rate: %f\n", fe->sampling_rate); + E_INFO("\tFrame Size: %d\n", fe->frame_size); + E_INFO("\tFrame Shift: %d\n", fe->frame_shift); + E_INFO("\tFFT Size: %d\n", fe->fft_size); + E_INFO("\tLower Frequency: %g\n", + fe->mel_fb->lower_filt_freq); + E_INFO("\tUpper Frequency: %g\n", + fe->mel_fb->upper_filt_freq); + E_INFO("\tNumber of filters: %d\n", fe->mel_fb->num_filters); + E_INFO("\tNumber of Overflow Samps: %d\n", fe->num_overflow_samps); + E_INFO("Will %sremove DC offset at frame level\n", + fe->remove_dc ? "" : "not "); + if (fe->dither) { + E_INFO("Will add dither to audio\n"); + E_INFO("Dither seeded with %d\n", fe->dither_seed); + } + else { + E_INFO("Will not add dither to audio\n"); + } + if (fe->mel_fb->lifter_val) { + E_INFO("Will apply sine-curve liftering, period %d\n", + fe->mel_fb->lifter_val); + } + E_INFO("Will %snormalize filters to unit area\n", + fe->mel_fb->unit_area ? "" : "not "); + E_INFO("Will %sround filter frequencies to DFT points\n", + fe->mel_fb->round_filters ? "" : "not "); + E_INFO("Will %suse double bandwidth in mel filter\n", + fe->mel_fb->doublewide ? "" : "not "); +} + +fe_t * +fe_init_auto_r(cmd_ln_t *config) +{ + fe_t *fe; + + fe = (fe_t*)ckd_calloc(1, sizeof(*fe)); + fe->refcount = 1; + + /* transfer params to front end */ + if (fe_parse_general_params(config, fe) < 0) { + fe_free(fe); + return NULL; + } + + /* compute remaining fe parameters */ + /* We add 0.5 so approximate the float with the closest + * integer. E.g., 2.3 is truncate to 2, whereas 3.7 becomes 4 + */ + fe->frame_shift = (int32) (fe->sampling_rate / fe->frame_rate + 0.5); + fe->frame_size = (int32) (fe->window_length * fe->sampling_rate + 0.5); + fe->pre_emphasis_prior = 0; + + assert (fe->frame_shift > 1); + if (fe->frame_size < fe->frame_shift) { + E_ERROR + ("Frame size %d (-wlen) must be greater than frame shift %d (-frate)\n", + fe->frame_size, fe->frame_shift); + fe_free(fe); + return NULL; + } + + if (fe->frame_size > (fe->fft_size)) { + E_ERROR + ("Number of FFT points has to be a power of 2 higher than %d, it is %d\n", + fe->frame_size, fe->fft_size); + fe_free(fe); + return NULL; + } + + if (fe->dither) + fe_init_dither(fe->dither_seed); + + /* establish buffers for overflow samps and hamming window */ + fe->overflow_samps = ckd_calloc(fe->frame_size, sizeof(float32)); + fe->hamming_window = ckd_calloc(fe->frame_size/2, sizeof(window_t)); + + /* create hamming window */ + fe_create_hamming(fe->hamming_window, fe->frame_size); + + /* init and fill appropriate filter structure */ + fe->mel_fb = ckd_calloc(1, sizeof(*fe->mel_fb)); + + /* transfer params to mel fb */ + fe_parse_melfb_params(config, fe, fe->mel_fb); + + if (fe->mel_fb->upper_filt_freq > fe->sampling_rate / 2 + 1.0) { + E_ERROR("Upper frequency %.1f is higher than samprate/2 (%.1f)\n", + fe->mel_fb->upper_filt_freq, fe->sampling_rate / 2); + fe_free(fe); + return NULL; + } + + fe_build_melfilters(fe->mel_fb); + fe_compute_melcosine(fe->mel_fb); + if (ps_config_bool(config, "remove_noise")) + fe->noise_stats = fe_init_noisestats(fe->mel_fb->num_filters); + + /* Create temporary FFT, spectrum and mel-spectrum buffers. */ + /* FIXME: Gosh there are a lot of these. */ + fe->spch = ckd_calloc(fe->frame_size, sizeof(*fe->spch)); + fe->frame = ckd_calloc(fe->fft_size, sizeof(*fe->frame)); + fe->spec = ckd_calloc(fe->fft_size, sizeof(*fe->spec)); + fe->mfspec = ckd_calloc(fe->mel_fb->num_filters, sizeof(*fe->mfspec)); + + /* create twiddle factors */ + fe->ccc = ckd_calloc(fe->fft_size / 4, sizeof(*fe->ccc)); + fe->sss = ckd_calloc(fe->fft_size / 4, sizeof(*fe->sss)); + fe_create_twiddle(fe); + + if (ps_config_bool(config, "verbose")) { + fe_print_current(fe); + } + + /*** Initialize the overflow buffers ***/ + fe_start_utt(fe); + return fe; +} + +cmd_ln_t * +fe_get_config(fe_t *fe) +{ + return fe->config; +} + +void +fe_init_dither(int32 seed) +{ + E_INFO("You are using %d as the seed.\n", seed); + s3_rand_seed(seed); +} + +int32 +fe_start_utt(fe_t * fe) +{ + fe->num_overflow_samps = 0; + // Does the same thing as above, but whatever... + memset(fe->overflow_samps, 0, + fe->frame_size * sizeof(*fe->overflow_samps)); + fe->pre_emphasis_prior = 0; + return 0; +} + +int +fe_get_output_size(fe_t *fe) +{ + return (int)fe->feature_dimension; +} + +void +fe_get_input_size(fe_t *fe, int *out_frame_shift, + int *out_frame_size) +{ + if (out_frame_shift) + *out_frame_shift = fe->frame_shift; + if (out_frame_size) + *out_frame_size = fe->frame_size; +} + +int32 +fe_process_frame(fe_t * fe, int16 const *spch, int32 nsamps, mfcc_t * fr_cep) +{ + fe_read_frame_int16(fe, spch, nsamps); + return fe_write_frame(fe, fr_cep); +} + +int +fe_process_frames_int16(fe_t *fe, + int16 const **inout_spch, + size_t *inout_nsamps, + mfcc_t **buf_cep, + int32 *inout_nframes) +{ + int32 frame_count; + int outidx, i, n_overflow, orig_n_overflow; + int16 const *orig_spch; + + /* In the special case where there is no output buffer, return the + * maximum number of frames which would be generated. */ + if (buf_cep == NULL) { + if (*inout_nsamps + fe->num_overflow_samps < (size_t)fe->frame_size) + *inout_nframes = 0; + else + *inout_nframes = 1 + + ((*inout_nsamps + fe->num_overflow_samps - fe->frame_size) + / fe->frame_shift); + return *inout_nframes; + } + + /* Are there not enough samples to make at least 1 frame? */ + if (*inout_nsamps + fe->num_overflow_samps < (size_t)fe->frame_size) { + if (*inout_nsamps > 0) { + /* Append them to the overflow buffer. */ + memcpy(fe->overflow_samps + fe->num_overflow_samps, + *inout_spch, *inout_nsamps * (sizeof(**inout_spch))); + fe->num_overflow_samps += *inout_nsamps; + /* Update input-output pointers and counters. */ + *inout_spch += *inout_nsamps; + *inout_nsamps = 0; + } + /* We produced no frames of output, sorry! */ + *inout_nframes = 0; + return 0; + } + + /* Can't write a frame? Then do nothing! */ + if (*inout_nframes < 1) { + *inout_nframes = 0; + return 0; + } + + /* Keep track of the original start of the buffer. */ + orig_spch = *inout_spch; + orig_n_overflow = fe->num_overflow_samps; + /* How many frames will we be able to get? */ + frame_count = 1 + + ((*inout_nsamps + fe->num_overflow_samps - fe->frame_size) + / fe->frame_shift); + /* Limit it to the number of output frames available. */ + if (frame_count > *inout_nframes) + frame_count = *inout_nframes; + /* Index of output frame. */ + outidx = 0; + + /* Start processing, taking care of any incoming overflow. */ + if (fe->num_overflow_samps) { + int offset = fe->frame_size - fe->num_overflow_samps; + + /* Append start of spch to overflow samples to make a full frame. */ + memcpy(fe->overflow_samps + fe->num_overflow_samps, + *inout_spch, offset * sizeof(**inout_spch)); + fe_read_frame_int16(fe, fe->overflow_samps, fe->frame_size); + assert(outidx < frame_count); + fe_write_frame(fe, buf_cep[outidx]); + outidx++; + /* Update input-output pointers and counters. */ + *inout_spch += offset; + *inout_nsamps -= offset; + fe->num_overflow_samps -= fe->frame_shift; + } + else { + fe_read_frame_int16(fe, *inout_spch, fe->frame_size); + assert(outidx < frame_count); + fe_write_frame(fe, buf_cep[outidx]); + outidx++; + /* Update input-output pointers and counters. */ + *inout_spch += fe->frame_size; + *inout_nsamps -= fe->frame_size; + } + + /* Process all remaining frames. */ + for (i = 1; i < frame_count; ++i) { + assert(*inout_nsamps >= (size_t)fe->frame_shift); + + fe_shift_frame_int16(fe, *inout_spch, fe->frame_shift); + assert(outidx < frame_count); + fe_write_frame(fe, buf_cep[outidx]); + outidx++; + /* Update input-output pointers and counters. */ + *inout_spch += fe->frame_shift; + *inout_nsamps -= fe->frame_shift; + /* Amount of data behind the original input which is still needed. */ + if (fe->num_overflow_samps > 0) + fe->num_overflow_samps -= fe->frame_shift; + } + + /* How many relevant overflow samples are there left? */ + if (fe->num_overflow_samps <= 0) { + /* Maximum number of overflow samples past *inout_spch to save. */ + n_overflow = *inout_nsamps; + if (n_overflow > fe->frame_shift) + n_overflow = fe->frame_shift; + fe->num_overflow_samps = fe->frame_size - fe->frame_shift; + /* Make sure this isn't an illegal read! */ + if (fe->num_overflow_samps > *inout_spch - orig_spch) + fe->num_overflow_samps = *inout_spch - orig_spch; + fe->num_overflow_samps += n_overflow; + if (fe->num_overflow_samps > 0) { + memcpy(fe->overflow_samps, + *inout_spch - (fe->frame_size - fe->frame_shift), + fe->num_overflow_samps * sizeof(**inout_spch)); + /* Update the input pointer to cover this stuff. */ + *inout_spch += n_overflow; + *inout_nsamps -= n_overflow; + } + } + else { + /* There is still some relevant data left in the overflow buffer. */ + /* Shift existing data to the beginning. */ + memmove(fe->overflow_samps, + fe->overflow_samps + orig_n_overflow - fe->num_overflow_samps, + fe->num_overflow_samps * sizeof(*fe->overflow_samps)); + /* Copy in whatever we had in the original speech buffer. */ + n_overflow = *inout_spch - orig_spch + *inout_nsamps; + if (n_overflow > fe->frame_size - fe->num_overflow_samps) + n_overflow = fe->frame_size - fe->num_overflow_samps; + memcpy(fe->overflow_samps + fe->num_overflow_samps, + orig_spch, n_overflow * sizeof(*orig_spch)); + fe->num_overflow_samps += n_overflow; + /* Advance the input pointers. */ + if (n_overflow > *inout_spch - orig_spch) { + n_overflow -= (*inout_spch - orig_spch); + *inout_spch += n_overflow; + *inout_nsamps -= n_overflow; + } + } + + /* Finally update the frame counter with the number of frames we processed. */ + *inout_nframes = outidx; /* FIXME: Not sure why I wrote it this way... */ + return 0; +} + +int +fe_process_frames(fe_t *fe, + int16 const **inout_spch, + size_t *inout_nsamps, + mfcc_t **buf_cep, + int32 *inout_nframes) +{ + return fe_process_frames_int16(fe, inout_spch, inout_nsamps, buf_cep, inout_nframes); +} + +int +fe_process_utt(fe_t * fe, int16 const * spch, size_t nsamps, + mfcc_t *** cep_block, int32 * nframes) +{ + mfcc_t **cep; + int rv; + + /* Figure out how many frames we will need. */ + fe_process_frames_int16(fe, NULL, &nsamps, NULL, nframes); + /* Create the output buffer (it has to exist, even if there are no output frames). */ + if (*nframes) + cep = (mfcc_t **)ckd_calloc_2d(*nframes, fe->feature_dimension, sizeof(**cep)); + else + cep = (mfcc_t **)ckd_calloc_2d(1, fe->feature_dimension, sizeof(**cep)); + /* Now just call fe_process_frames() with the allocated buffer. */ + rv = fe_process_frames_int16(fe, &spch, &nsamps, cep, nframes); + *cep_block = cep; + + return rv; +} + +int32 +fe_end_utt(fe_t * fe, mfcc_t * cepvector, int32 * nframes) +{ + /* Process any remaining data. */ + if (fe->num_overflow_samps > 0) { + fe_read_frame_int16(fe, fe->overflow_samps, + fe->num_overflow_samps); + fe_write_frame(fe, cepvector); + *nframes = 1; + } + else { + *nframes = 0; + } + + /* reset overflow buffers... */ + fe->num_overflow_samps = 0; + + return 0; +} + +fe_t * +fe_retain(fe_t *fe) +{ + ++fe->refcount; + return fe; +} + +int +fe_free(fe_t * fe) +{ + if (fe == NULL) + return 0; + if (--fe->refcount > 0) + return fe->refcount; + + /* kill FE instance - free everything... */ + if (fe->mel_fb) { + if (fe->mel_fb->mel_cosine) + fe_free_2d((void *) fe->mel_fb->mel_cosine); + ckd_free(fe->mel_fb->lifter); + ckd_free(fe->mel_fb->spec_start); + ckd_free(fe->mel_fb->filt_start); + ckd_free(fe->mel_fb->filt_width); + ckd_free(fe->mel_fb->filt_coeffs); + ckd_free(fe->mel_fb); + } + ckd_free(fe->spch); + ckd_free(fe->frame); + ckd_free(fe->ccc); + ckd_free(fe->sss); + ckd_free(fe->spec); + ckd_free(fe->mfspec); + ckd_free(fe->overflow_samps); + ckd_free(fe->hamming_window); + if (fe->noise_stats) + fe_free_noisestats(fe->noise_stats); + ps_config_free(fe->config); + ckd_free(fe); + + return 0; +} + +/** + * Convert a block of mfcc_t to float32 (can be done in-place) + **/ +int32 +fe_mfcc_to_float(fe_t * fe, + mfcc_t ** input, float32 ** output, int32 nframes) +{ + int32 i; + +#ifndef FIXED_POINT + if ((void *) input == (void *) output) + return nframes * fe->feature_dimension; +#endif + for (i = 0; i < nframes * fe->feature_dimension; ++i) + output[0][i] = MFCC2FLOAT(input[0][i]); + + return i; +} + +/** + * Convert a block of float32 to mfcc_t (can be done in-place) + **/ +int32 +fe_float_to_mfcc(fe_t * fe, + float32 ** input, mfcc_t ** output, int32 nframes) +{ + int32 i; + +#ifndef FIXED_POINT + if ((void *) input == (void *) output) + return nframes * fe->feature_dimension; +#endif + for (i = 0; i < nframes * fe->feature_dimension; ++i) + output[0][i] = FLOAT2MFCC(input[0][i]); + + return i; +} + +int32 +fe_logspec_to_mfcc(fe_t * fe, const mfcc_t * fr_spec, mfcc_t * fr_cep) +{ +#ifdef FIXED_POINT + fe_spec2cep(fe, fr_spec, fr_cep); +#else /* ! FIXED_POINT */ + powspec_t *powspec; + int32 i; + + powspec = ckd_malloc(fe->mel_fb->num_filters * sizeof(powspec_t)); + for (i = 0; i < fe->mel_fb->num_filters; ++i) + powspec[i] = (powspec_t) fr_spec[i]; + fe_spec2cep(fe, powspec, fr_cep); + ckd_free(powspec); +#endif /* ! FIXED_POINT */ + return 0; +} + +int32 +fe_logspec_dct2(fe_t * fe, const mfcc_t * fr_spec, mfcc_t * fr_cep) +{ +#ifdef FIXED_POINT + fe_dct2(fe, fr_spec, fr_cep, 0); +#else /* ! FIXED_POINT */ + powspec_t *powspec; + int32 i; + + powspec = ckd_malloc(fe->mel_fb->num_filters * sizeof(powspec_t)); + for (i = 0; i < fe->mel_fb->num_filters; ++i) + powspec[i] = (powspec_t) fr_spec[i]; + fe_dct2(fe, powspec, fr_cep, 0); + ckd_free(powspec); +#endif /* ! FIXED_POINT */ + return 0; +} + +int32 +fe_mfcc_dct3(fe_t * fe, const mfcc_t * fr_cep, mfcc_t * fr_spec) +{ +#ifdef FIXED_POINT + fe_dct3(fe, fr_cep, fr_spec); +#else /* ! FIXED_POINT */ + powspec_t *powspec; + int32 i; + + powspec = ckd_malloc(fe->mel_fb->num_filters * sizeof(powspec_t)); + fe_dct3(fe, fr_cep, powspec); + for (i = 0; i < fe->mel_fb->num_filters; ++i) + fr_spec[i] = (mfcc_t) powspec[i]; + ckd_free(powspec); +#endif /* ! FIXED_POINT */ + return 0; +} diff --git a/src/fe/fe_internal.h b/src/fe/fe_internal.h new file mode 100644 index 0000000..6dc54b9 --- /dev/null +++ b/src/fe/fe_internal.h @@ -0,0 +1,181 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1996-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef __FE_INTERNAL_H__ +#define __FE_INTERNAL_H__ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "util/cmd_ln.h" +#include "fe/fe.h" +#include "fe/fixpoint.h" +#include "fe/fe_noise.h" +#include "fe/fe_type.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/* Values for the 'logspec' field. */ +enum { + RAW_LOG_SPEC = 1, + SMOOTH_LOG_SPEC = 2 +}; + +/* Values for the 'transform' field. */ +enum { + LEGACY_DCT = 0, + DCT_II = 1, + DCT_HTK = 2 +}; + +typedef struct melfb_s melfb_t; +/** Base Struct to hold all structure for MFCC computation. */ +struct melfb_s { + float32 sampling_rate; + int32 num_cepstra; + int32 num_filters; + int32 fft_size; + float32 lower_filt_freq; + float32 upper_filt_freq; + /* DCT coefficients. */ + mfcc_t **mel_cosine; + /* Filter coefficients. */ + mfcc_t *filt_coeffs; + int16 *spec_start; + int16 *filt_start; + int16 *filt_width; + /* Luxury mobile home. */ + int32 doublewide; + char const *warp_type; + char const *warp_params; + uint32 warp_id; + /* Precomputed normalization constants for unitary DCT-II/DCT-III */ + mfcc_t sqrt_inv_n, sqrt_inv_2n; + /* Value and coefficients for HTK-style liftering */ + int32 lifter_val; + mfcc_t *lifter; + /* Normalize filters to unit area */ + int32 unit_area; + /* Round filter frequencies to DFT points (hurts accuracy, but is + useful for legacy purposes) */ + int32 round_filters; +}; + +/* sqrt(1/2), also used for unitary DCT-II/DCT-III */ +#define SQRT_HALF FLOAT2MFCC(0.707106781186548) + +/** Structure for the front-end computation. */ +struct fe_s { + cmd_ln_t *config; + int refcount; + + float32 sampling_rate; + int16 frame_rate; + int16 frame_shift; + + float32 window_length; + int16 frame_size; + int16 fft_size; + + uint8 fft_order; + uint8 feature_dimension; + uint8 num_cepstra; + uint8 remove_dc; + + uint8 log_spec; + uint8 swap; + uint8 dither; + uint8 transform; + + float32 pre_emphasis_alpha; + int32 dither_seed; + + /* Twiddle factors for FFT. */ + frame_t *ccc, *sss; + /* Mel filter parameters. */ + melfb_t *mel_fb; + /* Half of a Hamming Window. */ + window_t *hamming_window; + + /* Temporary buffers for processing. */ + int16 *spch; + frame_t *frame; + powspec_t *spec, *mfspec; + int16 *overflow_samps; + int num_overflow_samps; + int16 pre_emphasis_prior; + /* Noise removal */ + noise_stats_t *noise_stats; +}; + +void fe_init_dither(int32 seed); + +/* Load a frame of data into the fe. */ +int fe_read_frame_int16(fe_t *fe, int16 const *in, int32 len); + +/* Shift the input buffer back and read more data. */ +int fe_shift_frame_int16(fe_t *fe, int16 const *in, int32 len); + +/* Process a frame of data into features. */ +int fe_write_frame(fe_t *fe, mfcc_t *fea); + +/* Initialization functions. */ +int32 fe_build_melfilters(melfb_t *MEL_FB); +int32 fe_compute_melcosine(melfb_t *MEL_FB); +void fe_create_hamming(window_t *in, int32 in_len); +void fe_create_twiddle(fe_t *fe); + +fixed32 fe_log_add(fixed32 x, fixed32 y); +fixed32 fe_log_sub(fixed32 x, fixed32 y); + +/* Miscellaneous processing functions. */ +void fe_spec2cep(fe_t * fe, const powspec_t * mflogspec, mfcc_t * mfcep); +void fe_dct2(fe_t *fe, const powspec_t *mflogspec, mfcc_t *mfcep, int htk); +void fe_dct3(fe_t *fe, const mfcc_t *mfcep, powspec_t *mflogspec); + +#ifdef __cplusplus +} +#endif + +#endif /* __FE_INTERNAL_H__ */ diff --git a/src/fe/fe_noise.c b/src/fe/fe_noise.c new file mode 100644 index 0000000..c3a994e --- /dev/null +++ b/src/fe/fe_noise.c @@ -0,0 +1,364 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2013 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* This noise removal algorithm is inspired by the following papers + * Computationally Efficient Speech Enhancement by Spectral Minina Tracking + * by G. Doblinger + * + * Power-Normalized Cepstral Coefficients (PNCC) for Robust Speech Recognition + * by C. Kim. + * + * For the recent research and state of art see papers about IMRCA and + * A Minimum-Mean-Square-Error Noise Reduction Algorithm On Mel-Frequency + * Cepstra For Robust Speech Recognition by Dong Yu and others + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include + +#include "util/ckd_alloc.h" +#include "util/strfuncs.h" + +#include "fe/fe_noise.h" +#include "fe/fe_internal.h" + +/* Noise suppression constants */ +#define SMOOTH_WINDOW 4 +#define LAMBDA_POWER 0.7 +#define LAMBDA_A 0.995 +#define LAMBDA_B 0.5 +#define LAMBDA_T 0.85 +#define MU_T 0.2 +#define MAX_GAIN 20 +#define SLOW_PEAK_FORGET_FACTOR 0.9995 +#define SLOW_PEAK_LEARN_FACTOR 0.9 +#define SPEECH_VOLUME_RANGE 8.0 + +struct noise_stats_s { + /* Smoothed power */ + powspec_t *power; + /* Noise estimate */ + powspec_t *noise; + /* Signal floor estimate */ + powspec_t *floor; + /* Peak for temporal masking */ + powspec_t *peak; + /* Buffers used in update_noisestats */ + powspec_t *signal, *gain; + + /* Initialize it next time */ + int undefined; + /* Number of items to process */ + int num_filters; + + /* Sum of slow peaks for VAD */ + powspec_t slow_peak_sum; + + /* Precomputed constants */ + powspec_t lambda_power; + powspec_t comp_lambda_power; + powspec_t lambda_a; + powspec_t comp_lambda_a; + powspec_t lambda_b; + powspec_t comp_lambda_b; + powspec_t lambda_t; + powspec_t mu_t; + powspec_t max_gain; + powspec_t inv_max_gain; + + powspec_t smooth_scaling[2 * SMOOTH_WINDOW + 3]; +}; + +static void +fe_lower_envelope(noise_stats_t *noise_stats, const powspec_t *buf, powspec_t *floor_buf, int32 num_filt) +{ + int i; + + for (i = 0; i < num_filt; i++) { +#ifndef FIXED_POINT + if (buf[i] >= floor_buf[i]) { + floor_buf[i] = + noise_stats->lambda_a * floor_buf[i] + noise_stats->comp_lambda_a * buf[i]; + } + else { + floor_buf[i] = + noise_stats->lambda_b * floor_buf[i] + noise_stats->comp_lambda_b * buf[i]; + } +#else + if (buf[i] >= floor_buf[i]) { + floor_buf[i] = fe_log_add(noise_stats->lambda_a + floor_buf[i], + noise_stats->comp_lambda_a + buf[i]); + } + else { + floor_buf[i] = fe_log_add(noise_stats->lambda_b + floor_buf[i], + noise_stats->comp_lambda_b + buf[i]); + } +#endif + } +} + +/* temporal masking */ +static void +fe_temp_masking(noise_stats_t *noise_stats, powspec_t * buf, powspec_t * peak, int32 num_filt) +{ + powspec_t cur_in; + int i; + + for (i = 0; i < num_filt; i++) { + cur_in = buf[i]; + +#ifndef FIXED_POINT + peak[i] *= noise_stats->lambda_t; + if (buf[i] < noise_stats->lambda_t * peak[i]) + buf[i] = peak[i] * noise_stats->mu_t; +#else + peak[i] += noise_stats->lambda_t; + if (buf[i] < noise_stats->lambda_t + peak[i]) + buf[i] = peak[i] + noise_stats->mu_t; +#endif + + if (cur_in > peak[i]) + peak[i] = cur_in; + } +} + +/* spectral weight smoothing */ +static void +fe_weight_smooth(noise_stats_t *noise_stats, powspec_t * buf, powspec_t * coefs, int32 num_filt) +{ + int i, j; + int l1, l2; + powspec_t coef; + + for (i = 0; i < num_filt; i++) { + l1 = ((i - SMOOTH_WINDOW) > 0) ? (i - SMOOTH_WINDOW) : 0; + l2 = ((i + SMOOTH_WINDOW) < + (num_filt - 1)) ? (i + SMOOTH_WINDOW) : (num_filt - 1); + +#ifndef FIXED_POINT + (void)noise_stats; + coef = 0; + for (j = l1; j <= l2; j++) { + coef += coefs[j]; + } + buf[i] = buf[i] * (coef / (l2 - l1 + 1)); +#else + coef = MIN_FIXLOG; + for (j = l1; j <= l2; j++) { + coef = fe_log_add(coef, coefs[j]); + } + buf[i] = buf[i] + coef - noise_stats->smooth_scaling[l2 - l1 + 1]; +#endif + + } +} + +noise_stats_t * +fe_init_noisestats(int num_filters) +{ + int i; + noise_stats_t *noise_stats; + + noise_stats = (noise_stats_t *) ckd_calloc(1, sizeof(noise_stats_t)); + + noise_stats->power = + (powspec_t *) ckd_calloc(num_filters, sizeof(powspec_t)); + noise_stats->noise = + (powspec_t *) ckd_calloc(num_filters, sizeof(powspec_t)); + noise_stats->floor = + (powspec_t *) ckd_calloc(num_filters, sizeof(powspec_t)); + noise_stats->peak = + (powspec_t *) ckd_calloc(num_filters, sizeof(powspec_t)); + + noise_stats->undefined = TRUE; + noise_stats->num_filters = num_filters; + +#ifndef FIXED_POINT + noise_stats->lambda_power = LAMBDA_POWER; + noise_stats->comp_lambda_power = 1 - LAMBDA_POWER; + noise_stats->lambda_a = LAMBDA_A; + noise_stats->comp_lambda_a = 1 - LAMBDA_A; + noise_stats->lambda_b = LAMBDA_B; + noise_stats->comp_lambda_b = 1 - LAMBDA_B; + noise_stats->lambda_t = LAMBDA_T; + noise_stats->mu_t = MU_T; + noise_stats->max_gain = MAX_GAIN; + noise_stats->inv_max_gain = 1.0 / MAX_GAIN; + + for (i = 1; i < 2 * SMOOTH_WINDOW + 1; i++) { + noise_stats->smooth_scaling[i] = 1.0 / i; + } +#else + noise_stats->lambda_power = FLOAT2FIX(log(LAMBDA_POWER)); + noise_stats->comp_lambda_power = FLOAT2FIX(log(1 - LAMBDA_POWER)); + noise_stats->lambda_a = FLOAT2FIX(log(LAMBDA_A)); + noise_stats->comp_lambda_a = FLOAT2FIX(log(1 - LAMBDA_A)); + noise_stats->lambda_b = FLOAT2FIX(log(LAMBDA_B)); + noise_stats->comp_lambda_b = FLOAT2FIX(log(1 - LAMBDA_B)); + noise_stats->lambda_t = FLOAT2FIX(log(LAMBDA_T)); + noise_stats->mu_t = FLOAT2FIX(log(MU_T)); + noise_stats->max_gain = FLOAT2FIX(log(MAX_GAIN)); + noise_stats->inv_max_gain = FLOAT2FIX(log(1.0 / MAX_GAIN)); + + for (i = 1; i < 2 * SMOOTH_WINDOW + 3; i++) { + noise_stats->smooth_scaling[i] = FLOAT2FIX(log(i)); + } +#endif + + noise_stats->signal = (powspec_t *) ckd_calloc(num_filters, sizeof(powspec_t)); + noise_stats->gain = (powspec_t *) ckd_calloc(num_filters, sizeof(powspec_t)); + + return noise_stats; +} + +void +fe_reset_noisestats(noise_stats_t * noise_stats) +{ + if (noise_stats) + noise_stats->undefined = TRUE; +} + +void +fe_free_noisestats(noise_stats_t * noise_stats) +{ + ckd_free(noise_stats->signal); + ckd_free(noise_stats->gain); + ckd_free(noise_stats->power); + ckd_free(noise_stats->noise); + ckd_free(noise_stats->floor); + ckd_free(noise_stats->peak); + ckd_free(noise_stats); +} + +/** + * For fixed point we are doing the computation in a fixlog domain, + * so we have to add many processing cases. + */ +void +fe_remove_noise(fe_t * fe) +{ + noise_stats_t *noise_stats; + powspec_t *mfspec; + int32 i, num_filts; + + if (fe->noise_stats == NULL) + return; + + noise_stats = fe->noise_stats; + mfspec = fe->mfspec; + num_filts = noise_stats->num_filters; + + if (noise_stats->undefined) { + noise_stats->slow_peak_sum = FIX2FLOAT(0.0); + for (i = 0; i < num_filts; i++) { + noise_stats->power[i] = mfspec[i]; +#ifndef FIXED_POINT + noise_stats->noise[i] = mfspec[i] / noise_stats->max_gain; + noise_stats->floor[i] = mfspec[i] / noise_stats->max_gain; + noise_stats->peak[i] = 0.0; +#else + noise_stats->noise[i] = mfspec[i] - noise_stats->max_gain;; + noise_stats->floor[i] = mfspec[i] - noise_stats->max_gain; + noise_stats->peak[i] = MIN_FIXLOG; +#endif + } + noise_stats->undefined = FALSE; + } + + /* Calculate smoothed power */ + for (i = 0; i < num_filts; i++) { +#ifndef FIXED_POINT + noise_stats->power[i] = + noise_stats->lambda_power * noise_stats->power[i] + noise_stats->comp_lambda_power * mfspec[i]; +#else + noise_stats->power[i] = fe_log_add(noise_stats->lambda_power + noise_stats->power[i], + noise_stats->comp_lambda_power + mfspec[i]); +#endif + } + + /* Update noise spectrum estimate */ + fe_lower_envelope(noise_stats, noise_stats->power, noise_stats->noise, num_filts); + + /* Drop out noise from signal */ + for (i = 0; i < num_filts; i++) { +#ifndef FIXED_POINT + noise_stats->signal[i] = noise_stats->power[i] - noise_stats->noise[i]; + if (noise_stats->signal[i] < 1.0) + noise_stats->signal[i] = 1.0; +#else + noise_stats->signal[i] = fe_log_sub(noise_stats->power[i], noise_stats->noise[i]); +#endif + } + + /* FIXME: Somewhat unclear why we have to do this twice, but this + * seeems to estimate some kind of signal floor. */ + fe_lower_envelope(noise_stats, noise_stats->signal, noise_stats->floor, num_filts); + + fe_temp_masking(noise_stats, noise_stats->signal, noise_stats->peak, num_filts); + + for (i = 0; i < num_filts; i++) { + if (noise_stats->signal[i] < noise_stats->floor[i]) + noise_stats->signal[i] = noise_stats->floor[i]; + } + +#ifndef FIXED_POINT + for (i = 0; i < num_filts; i++) { + if (noise_stats->signal[i] < noise_stats->max_gain * noise_stats->power[i]) + noise_stats->gain[i] = noise_stats->signal[i] / noise_stats->power[i]; + else + noise_stats->gain[i] = noise_stats->max_gain; + if (noise_stats->gain[i] < noise_stats->inv_max_gain) + noise_stats->gain[i] = noise_stats->inv_max_gain; + } +#else + for (i = 0; i < num_filts; i++) { + noise_stats->gain[i] = noise_stats->signal[i] - noise_stats->power[i]; + if (noise_stats->gain[i] > noise_stats->max_gain) + noise_stats->gain[i] = noise_stats->max_gain; + if (noise_stats->gain[i] < noise_stats->inv_max_gain) + noise_stats->gain[i] = noise_stats->inv_max_gain; + } +#endif + + /* Weight smoothing and time frequency normalization */ + fe_weight_smooth(noise_stats, mfspec, noise_stats->gain, num_filts); +} diff --git a/src/fe/fe_noise.h b/src/fe/fe_noise.h new file mode 100644 index 0000000..964e298 --- /dev/null +++ b/src/fe/fe_noise.h @@ -0,0 +1,60 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2013 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +#ifndef FE_NOISE_H +#define FE_NOISE_H + +#include "fe/fe.h" +#include "fe/fixpoint.h" +#include "fe/fe_type.h" + +typedef struct noise_stats_s noise_stats_t; + +/* Creates noisestats object */ +noise_stats_t *fe_init_noisestats(int num_filters); + +/* Resets collected noise statistics */ +void fe_reset_noisestats(noise_stats_t * noise_stats); + +/* Frees allocated data */ +void fe_free_noisestats(noise_stats_t * noise_stats); + +/** + * Process frame, update noise statistics, remove noise components if needed. + */ +void fe_remove_noise(fe_t *fe); + +#endif /* FE_NOISE_H */ diff --git a/src/fe/fe_sigproc.c b/src/fe/fe_sigproc.c new file mode 100644 index 0000000..aa38bf0 --- /dev/null +++ b/src/fe/fe_sigproc.c @@ -0,0 +1,1387 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1996-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include +#include +#include +#include +#include + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef _MSC_VER +#pragma warning (disable: 4244) +#endif + +/** + * Windows math.h does not contain M_PI + */ +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +#include + +#include "util/ckd_alloc.h" +#include "util/genrand.h" +#include "util/byteorder.h" +#include "fe/fixpoint.h" +#include "fe/fe.h" +#include "fe/fe_internal.h" +#include "fe/fe_warp.h" + +/* Use extra precision for cosines, Hamming window, pre-emphasis + * coefficient, twiddle factors. */ +#ifdef FIXED_POINT +#define FLOAT2COS(x) FLOAT2FIX_ANY(x,30) +#define COSMUL(x,y) FIXMUL_ANY(x,y,30) +#else +#define FLOAT2COS(x) (x) +#define COSMUL(x,y) ((x)*(y)) +#endif + +#ifdef FIXED_POINT + +/* Internal log-addition table for natural log with radix point at 8 + * bits. Each entry is 256 * log(1 + e^{-n/256}). This is used in the + * log-add computation: + * + * e^z = e^x + e^y + * e^z = e^x(1 + e^{y-x}) = e^y(1 + e^{x-y}) + * z = x + log(1 + e^{y-x}) = y + log(1 + e^{x-y}) + * + * So when y > x, z = y + logadd_table[-(x-y)] + * when x > y, z = x + logadd_table[-(y-x)] + */ +static const unsigned char fe_logadd_table[] = { + 177, 177, 176, 176, 175, 175, 174, 174, 173, 173, + 172, 172, 172, 171, 171, 170, 170, 169, 169, 168, + 168, 167, 167, 166, 166, 165, 165, 164, 164, 163, + 163, 162, 162, 161, 161, 161, 160, 160, 159, 159, + 158, 158, 157, 157, 156, 156, 155, 155, 155, 154, + 154, 153, 153, 152, 152, 151, 151, 151, 150, 150, + 149, 149, 148, 148, 147, 147, 147, 146, 146, 145, + 145, 144, 144, 144, 143, 143, 142, 142, 141, 141, + 141, 140, 140, 139, 139, 138, 138, 138, 137, 137, + 136, 136, 136, 135, 135, 134, 134, 134, 133, 133, + 132, 132, 131, 131, 131, 130, 130, 129, 129, 129, + 128, 128, 128, 127, 127, 126, 126, 126, 125, 125, + 124, 124, 124, 123, 123, 123, 122, 122, 121, 121, + 121, 120, 120, 119, 119, 119, 118, 118, 118, 117, + 117, 117, 116, 116, 115, 115, 115, 114, 114, 114, + 113, 113, 113, 112, 112, 112, 111, 111, 110, 110, + 110, 109, 109, 109, 108, 108, 108, 107, 107, 107, + 106, 106, 106, 105, 105, 105, 104, 104, 104, 103, + 103, 103, 102, 102, 102, 101, 101, 101, 100, 100, + 100, 99, 99, 99, 98, 98, 98, 97, 97, 97, + 96, 96, 96, 96, 95, 95, 95, 94, 94, 94, + 93, 93, 93, 92, 92, 92, 92, 91, 91, 91, + 90, 90, 90, 89, 89, 89, 89, 88, 88, 88, + 87, 87, 87, 87, 86, 86, 86, 85, 85, 85, + 85, 84, 84, 84, 83, 83, 83, 83, 82, 82, + 82, 82, 81, 81, 81, 80, 80, 80, 80, 79, + 79, 79, 79, 78, 78, 78, 78, 77, 77, 77, + 77, 76, 76, 76, 75, 75, 75, 75, 74, 74, + 74, 74, 73, 73, 73, 73, 72, 72, 72, 72, + 71, 71, 71, 71, 71, 70, 70, 70, 70, 69, + 69, 69, 69, 68, 68, 68, 68, 67, 67, 67, + 67, 67, 66, 66, 66, 66, 65, 65, 65, 65, + 64, 64, 64, 64, 64, 63, 63, 63, 63, 63, + 62, 62, 62, 62, 61, 61, 61, 61, 61, 60, + 60, 60, 60, 60, 59, 59, 59, 59, 59, 58, + 58, 58, 58, 58, 57, 57, 57, 57, 57, 56, + 56, 56, 56, 56, 55, 55, 55, 55, 55, 54, + 54, 54, 54, 54, 53, 53, 53, 53, 53, 52, + 52, 52, 52, 52, 52, 51, 51, 51, 51, 51, + 50, 50, 50, 50, 50, 50, 49, 49, 49, 49, + 49, 49, 48, 48, 48, 48, 48, 48, 47, 47, + 47, 47, 47, 47, 46, 46, 46, 46, 46, 46, + 45, 45, 45, 45, 45, 45, 44, 44, 44, 44, + 44, 44, 43, 43, 43, 43, 43, 43, 43, 42, + 42, 42, 42, 42, 42, 41, 41, 41, 41, 41, + 41, 41, 40, 40, 40, 40, 40, 40, 40, 39, + 39, 39, 39, 39, 39, 39, 38, 38, 38, 38, + 38, 38, 38, 37, 37, 37, 37, 37, 37, 37, + 37, 36, 36, 36, 36, 36, 36, 36, 35, 35, + 35, 35, 35, 35, 35, 35, 34, 34, 34, 34, + 34, 34, 34, 34, 33, 33, 33, 33, 33, 33, + 33, 33, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0 +}; + +static const int fe_logadd_table_size = + sizeof(fe_logadd_table) / sizeof(fe_logadd_table[0]); + +fixed32 +fe_log_add(fixed32 x, fixed32 y) +{ + fixed32 d, r; + + if (x > y) { + d = (x - y) >> (DEFAULT_RADIX - 8); + r = x; + } + else { + d = (y - x) >> (DEFAULT_RADIX - 8); + r = y; + } + + if (r <= MIN_FIXLOG) + return MIN_FIXLOG; + else if (d > fe_logadd_table_size - 1) + return r; + else { + r += ((fixed32) fe_logadd_table[d] << (DEFAULT_RADIX - 8)); +/* printf("%d - %d = %d | %f - %f = %f | %f - %f = %f\n", + x, y, r, FIX2FLOAT(x), FIX2FLOAT(y), FIX2FLOAT(r), + exp(FIX2FLOAT(x)), exp(FIX2FLOAT(y)), exp(FIX2FLOAT(r))); +*/ + return r; + } +} + +/* + * log_sub for spectral subtraction, similar to logadd but we had + * to smooth function around zero with fixlog in order to improve + * table interpolation properties + * + * The table is created with the file included into distribution + * + * e^z = e^x - e^y + * e^z = e^x (1 - e^(-(x - y))) + * z = x + log(1 - e^(-(x - y))) + * z = x + fixlog(a) + (log(1 - e^(- a)) - log(a)) + * + * Input radix is 8 output radix is 10 + */ +static const uint16 fe_logsub_table[] = { +1, 3, 5, 7, 9, 11, 13, 15, 17, 19, +21, 23, 25, 27, 29, 31, 33, 35, 37, 39, +41, 43, 45, 47, 49, 51, 53, 55, 56, 58, +60, 62, 64, 66, 68, 70, 72, 74, 76, 78, +80, 82, 84, 86, 88, 90, 92, 94, 95, 97, +99, 101, 103, 105, 107, 109, 111, 113, 115, 117, +119, 121, 122, 124, 126, 128, 130, 132, 134, 136, +138, 140, 142, 143, 145, 147, 149, 151, 153, 155, +157, 159, 161, 162, 164, 166, 168, 170, 172, 174, +176, 178, 179, 181, 183, 185, 187, 189, 191, 193, +194, 196, 198, 200, 202, 204, 206, 207, 209, 211, +213, 215, 217, 219, 220, 222, 224, 226, 228, 230, +232, 233, 235, 237, 239, 241, 243, 244, 246, 248, +250, 252, 254, 255, 257, 259, 261, 263, 265, 266, +268, 270, 272, 274, 275, 277, 279, 281, 283, 284, +286, 288, 290, 292, 294, 295, 297, 299, 301, 302, +304, 306, 308, 310, 311, 313, 315, 317, 319, 320, +322, 324, 326, 327, 329, 331, 333, 335, 336, 338, +340, 342, 343, 345, 347, 349, 350, 352, 354, 356, +357, 359, 361, 363, 364, 366, 368, 370, 371, 373, +375, 377, 378, 380, 382, 384, 385, 387, 389, 391, +392, 394, 396, 397, 399, 401, 403, 404, 406, 408, +410, 411, 413, 415, 416, 418, 420, 422, 423, 425, +427, 428, 430, 432, 433, 435, 437, 439, 440, 442, +444, 445, 447, 449, 450, 452, 454, 455, 457, 459, +460, 462, 464, 465, 467, 469, 471, 472, 474, 476, +477, 479, 481, 482, 484, 486, 487, 489, 490, 492, +494, 495, 497, 499, 500, 502, 504, 505, 507, 509, +510, 512, 514, 515, 517, 518, 520, 522, 523, 525, +527, 528, 530, 532, 533, 535, 536, 538, 540, 541, +543, 544, 546, 548, 549, 551, 553, 554, 556, 557, +559, 561, 562, 564, 565, 567, 569, 570, 572, 573, +575, 577, 578, 580, 581, 583, 585, 586, 588, 589, +591, 592, 594, 596, 597, 599, 600, 602, 603, 605, +607, 608, 610, 611, 613, 614, 616, 618, 619, 621, +622, 624, 625, 627, 628, 630, 632, 633, 635, 636, +638, 639, 641, 642, 644, 645, 647, 649, 650, 652, +653, 655, 656, 658, 659, 661, 662, 664, 665, 667, +668, 670, 671, 673, 674, 676, 678, 679, 681, 682, +684, 685, 687, 688, 690, 691, 693, 694, 696, 697, +699, 700, 702, 703, 705, 706, 708, 709, 711, 712, +714, 715, 717, 718, 719, 721, 722, 724, 725, 727, +728, 730, 731, 733, 734, 736, 737, 739, 740, 742, +743, 745, 746, 747, 749, 750, 752, 753, 755, 756, +758, 759, 761, 762, 763, 765, 766, 768, 769, 771, +772, 774, 775, 776, 778, 779, 781, 782, 784, 785, +786, 788, 789, 791, 792, 794, 795, 796, 798, 799, +801, 802, 804, 805, 806, 808, 809, 811, 812, 813, +815, 816, 818, 819, 820, 822, 823, 825, 826, 827, +829, 830, 832, 833, 834, 836, 837, 839, 840, 841, +843, 844, 846, 847, 848, 850, 851, 852, 854, 855, +857, 858, 859, 861, 862, 863, 865, 866, 868, 869, +870, 872, 873, 874, 876, 877, 878, 880, 881, 883, +884, 885, 887, 888, 889, 891, 892, 893, 895, 896, +897, 899, 900, 901, 903, 904, 905, 907, 908, 909, +911, 912, 913, 915, 916, 917, 919, 920, 921, 923, +924, 925, 927, 928, 929, 931, 932, 933, 935, 936, +937, 939, 940, 941, 942, 944, 945, 946, 948, 949, +950, 952, 953, 954, 956, 957, 958, 959, 961, 962, +963, 965, 966, 967, 968, 970, 971, 972, 974, 975, +976, 977, 979, 980, 981, 983, 984, 985, 986, 988, +989, 990, 991, 993, 994, 995, 997, 998, 999, 1000, +1002, 1003, 1004, 1005, 1007, 1008, 1009, 1010, 1012, 1013, +1014, 1015, 1017, 1018, 1019, 1020, 1022, 1023, 1024, 1025, +1027, 1028, 1029, 1030, 1032, 1033, 1034, 1035, 1037, 1038, +1039, 1040, 1041, 1043, 1044, 1045, 1046, 1048, 1049, 1050, +1051, 1052, 1054, 1055, 1056, 1057, 1059, 1060, 1061, 1062, +1063, 1065, 1066, 1067, 1068, 1069, 1071, 1072, 1073, 1074, +1076, 1077, 1078, 1079, 1080, 1082, 1083, 1084, 1085, 1086, +1087, 1089, 1090, 1091, 1092, 1093, 1095, 1096, 1097, 1098, +1099, 1101, 1102, 1103, 1104, 1105, 1106, 1108, 1109, 1110, +1111, 1112, 1114, 1115, 1116, 1117, 1118, 1119, 1121, 1122, +1123, 1124, 1125, 1126, 1128, 1129, 1130, 1131, 1132, 1133, +1135, 1136, 1137, 1138, 1139, 1140, 1141, 1143, 1144, 1145, +1146, 1147, 1148, 1149, 1151, 1152, 1153, 1154, 1155, 1156, +1157, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1167, 1168, +1169, 1170, 1171, 1172, 1173, 1174, 1176, 1177, 1178, 1179, +1180, 1181, 1182, 1183, 1185, 1186, 1187, 1188, 1189, 1190, +1191, 1192, 1193, 1195, 1196, 1197, 1198, 1199, 1200, 1201, +1202, 1203, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, +1213, 1214, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, +1224, 1225, 1226, 1228, 1229, 1230, 1231, 1232, 1233, 1234, +1235, 1236, 1237, 1238, 1239, 1240, 1242, 1243, 1244, 1245, +1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, +1256, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, +1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1277, +1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, +1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, +1298, 1299, 1300, 1301, 1302, 1303, 1305, 1306, 1307, 1308, +1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, +1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1328, +1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, +1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, +1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, 1358, +1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, +1369, 1370, 1371, 1372, 1372, 1373, 1374, 1375, 1376, 1377, +1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, +1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, +1398, 1399, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, +1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, +1417, 1418, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, +1426, 1427, 1428, 1429, 1430, 1431, 1432, 1432, 1433, 1434, +1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, +1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, +1454, 1455, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, +1463, 1464, 1465, 1466, 1466, 1467, 1468, 1469, 1470, 1471, +1472, 1473, 1474, 1475, 1475, 1476, 1477, 1478, 1479, 1480, +1481, 1482, 1483, 1483, 1484, 1485, 1486, 1487, 1488, 1489, +1490, 1491, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, +1499, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1506, +1507, 1508, 1509, 1510, 1511, 1512, 1513, 1513, 1514, 1515, +1516, 1517, 1518, 1519, 1520, 1520, 1521, 1522, 1523, 1524, +1525, 1526, 1526, 1527, 1528, 1529, 1530, 1531, 1532, 1532, +1533, 1534, 1535, 1536, 1537, 1538, 1538, 1539, 1540, 1541, +1542, 1543, 1544, 1544, 1545, 1546, 1547, 1548, 1549, 1550, +1550, 1551, 1552, 1553, 1554, 1555, 1555, 1556, 1557, 1558, +1559, 1560, 1560, 1561, 1562, 1563, 1564, 1565, 1565, 1566, +1567, 1568, 1569, 1570, 1570, 1571, 1572, 1573, 1574, 1575, +1575, 1576, 1577, 1578, 1579, 1580, 1580, 1581, 1582, 1583, +1584, 1584, 1585, 1586, 1587, 1588, 1589, 1589, 1590, 1591, +1592, 1593, 1593, 1594, 1595, 1596, 1597, 1598, 1598, 1599, +1600, 1601, 1602, 1602, 1603, 1604, 1605, 1606, 1606, 1607, +1608, 1609, 1610, 1610, 1611, 1612, 1613, 1614, 1614, 1615, +1616, 1617, 1618, 1618, 1619, 1620, 1621, 1622, 1622, 1623, +1624, 1625, 1626, 1626, 1627, 1628, 1629, 1630, 1630, 1631, +1632, 1633, 1634, 1634, 1635, 1636, 1637, 1637, 1638, 1639, +1640, 1641, 1641, 1642, 1643, 1644, 1645, 1645, 1646, 1647, +1648, 1648, 1649, 1650, 1651, 1652, 1652, 1653, 1654, 1655, +1655, 1656, 1657, 1658, 1658, 1659, 1660, 1661, 1662, 1662, +1663, 1664, 1665, 1665, 1666, 1667, 1668, 1668, 1669, 1670, +1671, 1671, 1672, 1673, 1674, 1675, 1675, 1676, 1677, 1678, +1678, 1679, 1680, 1681, 1681, 1682, 1683, 1684, 1684, 1685, +1686, 1687, 1687, 1688, 1689, 1690, 1690, 1691, 1692, 1693, +1693, 1694, 1695, 1696, 1696, 1697, 1698, 1699, 1699, 1700, +1701, 1702, 1702, 1703, 1704, 1705, 1705, 1706, 1707, 1707, +1708, 1709, 1710, 1710, 1711, 1712, 1713, 1713, 1714, 1715, +1716, 1716, 1717, 1718, 1718, 1719, 1720, 1721, 1721, 1722, +1723, 1724, 1724, 1725, 1726, 1727, 1727, 1728, 1729, 1729, +1730, 1731, 1732, 1732, 1733, 1734, 1734, 1735, 1736, 1737, +1737, 1738, 1739, 1740, 1740, 1741, 1742, 1742, 1743, 1744, +1745, 1745, 1746, 1747, 1747, 1748, 1749, 1749, 1750, 1751, +1752, 1752, 1753, 1754, 1754, 1755, 1756, 1757, 1757, 1758, +1759, 1759, 1760, 1761, 1762, 1762, 1763, 1764, 1764, 1765, +1766, 1766, 1767, 1768, 1769, 1769, 1770, 1771, 1771, 1772, +1773, 1773, 1774, 1775, 1776, 1776, 1777, 1778, 1778, 1779, +1780, 1780, 1781, 1782, 1782, 1783, 1784, 1784, 1785, 1786, +1787, 1787, 1788, 1789, 1789, 1790, 1791, 1791, 1792, 1793, +1793, 1794, 1795, 1795, 1796, 1797, 1798, 1798, 1799, 1800, +1800, 1801, 1802, 1802, 1803, 1804, 1804, 1805, 1806, 1806, +1807, 1808, 1808, 1809, 1810, 1810, 1811, 1812, 1812, 1813, +1814, 1814, 1815, 1816, 1816, 1817, 1818, 1818, 1819, 1820, +1820, 1821, 1822, 1822, 1823, 1824, 1824, 1825, 1826, 1826, +1827, 1828, 1828, 1829, 1830, 1830, 1831, 1832, 1832, 1833, +1834, 1834, 1835, 1836, 1836, 1837, 1838, 1838, 1839, 1840, +1840, 1841, 1842, 1842, 1843, 1844, 1844, 1845, 1845, 1846, +1847, 1847, 1848, 1849, 1849, 1850, 1851, 1851, 1852, 1853, +1853, 1854, 1855, 1855, 1856, 1857, 1857, 1858, 1858, 1859, +1860, 1860, 1861, 1862, 1862, 1863, 1864, 1864, 1865, 1866, +1866, 1867, 1867, 1868, 1869, 1869, 1870, 1871, 1871, 1872, +1873, 1873, 1874, 1874, 1875, 1876, 1876, 1877, 1878, 1878, +1879, 1879, 1880, 1881, 1881, 1882, 1883, 1883, 1884, 1885, +1885, 1886, 1886, 1887, 1888, 1888, 1889, 1890, 1890, 1891, +1891, 1892, 1893, 1893, 1894, 1895, 1895, 1896, 1896, 1897, +1898, 1898, 1899, 1900, 1900, 1901, 1901, 1902, 1903, 1903, +1904, 1904, 1905, 1906, 1906, 1907, 1908, 1908, 1909, 1909, +1910, 1911, 1911, 1912, 1912, 1913, 1914, 1914, 1915, 1916, +1916, 1917, 1917, 1918, 1919, 1919, 1920, 1920, 1921, 1922, +1922, 1923, 1923, 1924, 1925, 1925, 1926, 1926, 1927, 1928, +1928, 1929, 1929, 1930, 1931, 1931, 1932, 1932, 1933, 1934, +1934, 1935, 1935, 1936, 1937, 1937, 1938, 1938, 1939, 1940, +1940, 1941, 1941, 1942, 1943, 1943, 1944, 1944, 1945, 1946, +1946, 1947, 1947, 1948, 1949, 1949, 1950, 1950, 1951, 1952, +1952, 1953, 1953, 1954, 1955, 1955, 1956, 1956, 1957, 1957, +1958, 1959, 1959, 1960, 1960, 1961, 1962, 1962, 1963, 1963, +1964, 1964, 1965, 1966, 1966, 1967, 1967, 1968, 1969, 1969, +1970, 1970, 1971, 1971, 1972, 1973, 1973, 1974, 1974, 1975, +1976, 1976, 1977, 1977, 1978, 1978, 1979, 1980, 1980, 1981, +1981, 1982, 1982, 1983, 1984, 1984, 1985, 1985, 1986, 1986, +1987, 1988, 1988, 1989, 1989, 1990, 1990, 1991, 1992, 1992, +1993, 1993, 1994, 1994, 1995, 1996, 1996, 1997, 1997, 1998, +1998, 1999, 1999, 2000, 2001, 2001, 2002, 2002, 2003, 2003, +2004, 2005, 2005, 2006, 2006, 2007, 2007, 2008, 2008, 2009, +2010, 2010, 2011, 2011, 2012, 2012, 2013, 2014, 2014, 2015, +2015, 2016, 2016, 2017, 2017, 2018, 2019, 2019, 2020, 2020, +2021, 2021, 2022, 2022, 2023, 2023, 2024, 2025, 2025, 2026, +2026, 2027, 2027, 2028, 2028, 2029, 2030, 2030, 2031, 2031, +2032, 2032, 2033, 2033, 2034, 2034, 2035, 2036, 2036, 2037, +2037, 2038, 2038, 2039, 2039, 2040, 2040, 2041, 2042, 2042, +2043, 2043, 2044, 2044, 2045, 2045, 2046, 2046, 2047, 2048, +2048, 2049, 2049, 2050, 2050, 2051, 2051, 2052, 2052, 2053, +2053, 2054, 2054, 2055, 2056, 2056, 2057, 2057, 2058, 2058, +2059, 2059, 2060, 2060, 2061, 2061, 2062, 2062, 2063, 2064, +2064, 2065, 2065, 2066, 2066, 2067, 2067, 2068, 2068, 2069, +2069, 2070, 2070, 2071, 2072, 2072, 2073, 2073, 2074, 2074, +2075, 2075, 2076, 2076, 2077, 2077, 2078, 2078, 2079, 2079, +2080, 2080, 2081 +}; + +static const int fe_logsub_table_size = + sizeof(fe_logsub_table) / sizeof(fe_logsub_table[0]); + +fixed32 +fe_log_sub(fixed32 x, fixed32 y) +{ + fixed32 d, r; + + if (x < MIN_FIXLOG || y >= x) + return MIN_FIXLOG; + + d = (x - y) >> (DEFAULT_RADIX - 8); + + if (d > fe_logsub_table_size - 1) + return x; + + r = fe_logsub_table[d] << (DEFAULT_RADIX - 10); +/* + printf("diff=%d\n", + x + FIXLN(x-y) - r - + (x + FLOAT2FIX(logf(-expm1f(FIX2FLOAT(y - x)))))); +*/ + return x + FIXLN(x-y) - r; +} + +static fixed32 +fe_log(float32 x) +{ + if (x <= 0) { + return MIN_FIXLOG; + } + else { + return FLOAT2FIX(log(x)); + } +} +#endif + +static float32 +fe_mel(melfb_t * mel, float32 x) +{ + float32 warped = fe_warp_unwarped_to_warped(mel, x); + + return (float32) (2595.0 * log10(1.0 + warped / 700.0)); +} + +static float32 +fe_melinv(melfb_t * mel, float32 x) +{ + float32 warped = (float32) (700.0 * (pow(10.0, x / 2595.0) - 1.0)); + return fe_warp_warped_to_unwarped(mel, warped); +} + +int32 +fe_build_melfilters(melfb_t * mel_fb) +{ + float32 melmin, melmax, melbw, fftfreq; + int n_coeffs, i, j; + + + /* Filter coefficient matrix, in flattened form. */ + mel_fb->spec_start = + ckd_calloc(mel_fb->num_filters, sizeof(*mel_fb->spec_start)); + mel_fb->filt_start = + ckd_calloc(mel_fb->num_filters, sizeof(*mel_fb->filt_start)); + mel_fb->filt_width = + ckd_calloc(mel_fb->num_filters, sizeof(*mel_fb->filt_width)); + + /* First calculate the widths of each filter. */ + /* Minimum and maximum frequencies in mel scale. */ + melmin = fe_mel(mel_fb, mel_fb->lower_filt_freq); + melmax = fe_mel(mel_fb, mel_fb->upper_filt_freq); + + /* Width of filters in mel scale */ + melbw = (melmax - melmin) / (mel_fb->num_filters + 1); + if (mel_fb->doublewide) { + melmin -= melbw; + melmax += melbw; + if ((fe_melinv(mel_fb, melmin) < 0) || + (fe_melinv(mel_fb, melmax) > mel_fb->sampling_rate / 2)) { + E_WARN + ("Out of Range: low filter edge = %f (%f)\n", + fe_melinv(mel_fb, melmin), 0.0); + E_WARN + (" high filter edge = %f (%f)\n", + fe_melinv(mel_fb, melmax), mel_fb->sampling_rate / 2); + return FE_INVALID_PARAM_ERROR; + } + } + + /* DFT point spacing */ + fftfreq = mel_fb->sampling_rate / (float32) mel_fb->fft_size; + + /* Count and place filter coefficients. */ + n_coeffs = 0; + for (i = 0; i < mel_fb->num_filters; ++i) { + float32 freqs[3]; + + /* Left, center, right frequencies in Hertz */ + for (j = 0; j < 3; ++j) { + if (mel_fb->doublewide) + freqs[j] = fe_melinv(mel_fb, (i + j * 2) * melbw + melmin); + else + freqs[j] = fe_melinv(mel_fb, (i + j) * melbw + melmin); + /* Round them to DFT points if requested */ + if (mel_fb->round_filters) + freqs[j] = ((int) (freqs[j] / fftfreq + 0.5)) * fftfreq; + } + + /* spec_start is the start of this filter in the power spectrum. */ + mel_fb->spec_start[i] = -1; + /* There must be a better way... */ + for (j = 0; j < mel_fb->fft_size / 2 + 1; ++j) { + float32 hz = j * fftfreq; + if (hz < freqs[0]) + continue; + else if (hz > freqs[2] || j == mel_fb->fft_size / 2) { + /* filt_width is the width in DFT points of this filter. */ + mel_fb->filt_width[i] = j - mel_fb->spec_start[i]; + /* filt_start is the start of this filter in the filt_coeffs array. */ + mel_fb->filt_start[i] = n_coeffs; + n_coeffs += mel_fb->filt_width[i]; + break; + } + if (mel_fb->spec_start[i] == -1) + mel_fb->spec_start[i] = j; + } + } + + /* Now go back and allocate the coefficient array. */ + mel_fb->filt_coeffs = + ckd_malloc(n_coeffs * sizeof(*mel_fb->filt_coeffs)); + + /* And now generate the coefficients. */ + n_coeffs = 0; + for (i = 0; i < mel_fb->num_filters; ++i) { + float32 freqs[3]; + + /* Left, center, right frequencies in Hertz */ + for (j = 0; j < 3; ++j) { + if (mel_fb->doublewide) + freqs[j] = fe_melinv(mel_fb, (i + j * 2) * melbw + melmin); + else + freqs[j] = fe_melinv(mel_fb, (i + j) * melbw + melmin); + /* Round them to DFT points if requested */ + if (mel_fb->round_filters) + freqs[j] = ((int) (freqs[j] / fftfreq + 0.5)) * fftfreq; + } + + for (j = 0; j < mel_fb->filt_width[i]; ++j) { + float32 hz, loslope, hislope; + + hz = (mel_fb->spec_start[i] + j) * fftfreq; + if (hz < freqs[0] || hz > freqs[2]) { + E_FATAL + ("Failed to create filterbank, frequency range does not match. " + "Sample rate %f, FFT size %d, lowerf %f < freq %f > upperf %f.\n", + mel_fb->sampling_rate, mel_fb->fft_size, freqs[0], hz, + freqs[2]); + } + loslope = (hz - freqs[0]) / (freqs[1] - freqs[0]); + hislope = (freqs[2] - hz) / (freqs[2] - freqs[1]); + if (mel_fb->unit_area) { + loslope *= 2 / (freqs[2] - freqs[0]); + hislope *= 2 / (freqs[2] - freqs[0]); + } + if (loslope < hislope) { +#ifdef FIXED_POINT + mel_fb->filt_coeffs[n_coeffs] = fe_log(loslope); +#else + mel_fb->filt_coeffs[n_coeffs] = loslope; +#endif + } + else { +#ifdef FIXED_POINT + mel_fb->filt_coeffs[n_coeffs] = fe_log(hislope); +#else + mel_fb->filt_coeffs[n_coeffs] = hislope; +#endif + } + ++n_coeffs; + } + } + + return FE_SUCCESS; +} + +int32 +fe_compute_melcosine(melfb_t * mel_fb) +{ + + float64 freqstep; + int32 i, j; + + mel_fb->mel_cosine = + (mfcc_t **) ckd_calloc_2d(mel_fb->num_cepstra, + mel_fb->num_filters, sizeof(mfcc_t)); + + freqstep = M_PI / mel_fb->num_filters; + /* NOTE: The first row vector is actually unnecessary but we leave + * it in to avoid confusion. */ + for (i = 0; i < mel_fb->num_cepstra; i++) { + for (j = 0; j < mel_fb->num_filters; j++) { + float64 cosine; + + cosine = cos(freqstep * i * (j + 0.5)); + mel_fb->mel_cosine[i][j] = FLOAT2COS(cosine); + } + } + + /* Also precompute normalization constants for unitary DCT. */ + mel_fb->sqrt_inv_n = FLOAT2COS(sqrt(1.0 / mel_fb->num_filters)); + mel_fb->sqrt_inv_2n = FLOAT2COS(sqrt(2.0 / mel_fb->num_filters)); + + /* And liftering weights */ + if (mel_fb->lifter_val) { + mel_fb->lifter = + calloc(mel_fb->num_cepstra, sizeof(*mel_fb->lifter)); + for (i = 0; i < mel_fb->num_cepstra; ++i) { + mel_fb->lifter[i] = FLOAT2MFCC(1 + mel_fb->lifter_val / 2 + * sin(i * M_PI / + mel_fb->lifter_val)); + } + } + + return (0); +} + +static void +fe_pre_emphasis_int16(int16 const *in, frame_t * out, int32 len, + float32 factor, int16 prior) +{ + int i; + +#if defined(FIXED16) + int16 fxd_alpha = (int16)(factor * 0x8000); + int32 tmp1, tmp2; + + tmp1 = (int32)in[0] << 15; + tmp2 = (int32)prior * fxd_alpha; + out[0] = (int16)((tmp1 - tmp2) >> 15); + for (i = 1; i < len; ++i) { + tmp1 = (int32)in[i] << 15; + tmp2 = (int32)in[i-1] * fxd_alpha; + out[i] = (int16)((tmp1 - tmp2) >> 15); + } +#elif defined(FIXED_POINT) + fixed32 fxd_alpha = FLOAT2FIX(factor); + out[0] = ((fixed32) in[0] << DEFAULT_RADIX) - (prior * fxd_alpha); + for (i = 1; i < len; ++i) + out[i] = ((fixed32) in[i] << DEFAULT_RADIX) + - (fixed32) in[i - 1] * fxd_alpha; +#else + out[0] = (frame_t) in[0] - (frame_t) prior *factor; + for (i = 1; i < len; i++) + out[i] = (frame_t) in[i] - (frame_t) in[i - 1] * factor; +#endif +} + +static void +fe_copy_to_frame_int16(int16 const *in, frame_t * out, int32 len) +{ + int i; + +#if defined(FIXED16) + memcpy(out, in, len * sizeof(*out)); +#elif defined(FIXED_POINT) + for (i = 0; i < len; i++) + out[i] = (int32) in[i] << DEFAULT_RADIX; +#else /* FIXED_POINT */ + for (i = 0; i < len; i++) + out[i] = (frame_t) in[i]; +#endif /* FIXED_POINT */ +} + +void +fe_create_hamming(window_t * in, int32 in_len) +{ + int i; + + /* Symmetric, so we only create the first half of it. */ + for (i = 0; i < in_len / 2; i++) { + float64 hamm; + hamm = (0.54 - 0.46 * cos(2 * M_PI * i / + ((float64) in_len - 1.0))); +#ifdef FIXED16 + in[i] = (int16)(hamm * 0x8000); +#else + in[i] = FLOAT2COS(hamm); +#endif + } +} + +static void +fe_hamming_window(frame_t * in, window_t * window, int32 in_len, + int32 remove_dc) +{ + int i; + + if (remove_dc) { +#ifdef FIXED16 + int32 mean = 0; /* Use int32 to avoid possibility of overflow */ +#else + frame_t mean = 0; +#endif + + for (i = 0; i < in_len; i++) + mean += in[i]; + mean /= in_len; + for (i = 0; i < in_len; i++) + in[i] -= (frame_t) mean; + } + +#ifdef FIXED16 + for (i = 0; i < in_len/2; i++) { + int32 tmp1, tmp2; + + tmp1 = (int32)in[i] * window[i]; + tmp2 = (int32)in[in_len-1-i] * window[i]; + in[i] = (int16)(tmp1 >> 15); + in[in_len-1-i] = (int16)(tmp2 >> 15); + } +#else + for (i = 0; i < in_len/2; i++) { + in[i] = COSMUL(in[i], window[i]); + in[in_len - 1 - i] = COSMUL(in[in_len - 1 - i], window[i]); + } +#endif +} + +static int +fe_spch_to_frame(fe_t * fe, int len) +{ + /* Copy to the frame buffer. */ + if (fe->pre_emphasis_alpha != 0.0) { + fe_pre_emphasis_int16(fe->spch, fe->frame, len, + fe->pre_emphasis_alpha, + fe->pre_emphasis_prior); + if (len >= fe->frame_shift) + fe->pre_emphasis_prior = fe->spch[fe->frame_shift - 1]; + else + fe->pre_emphasis_prior = fe->spch[len - 1]; + } + else + fe_copy_to_frame_int16(fe->spch, fe->frame, len); + + /* Zero pad up to FFT size. */ + memset(fe->frame + len, 0, (fe->fft_size - len) * sizeof(*fe->frame)); + + /* Window. */ + fe_hamming_window(fe->frame, fe->hamming_window, fe->frame_size, + fe->remove_dc); + + return len; +} + +int +fe_read_frame_int16(fe_t * fe, int16 const *in, int32 len) +{ + int i; + + if (len > fe->frame_size) + len = fe->frame_size; + + /* Read it into the raw speech buffer. */ + memcpy(fe->spch, in, len * sizeof(*in)); + /* Swap and dither if necessary. */ + if (fe->swap) + for (i = 0; i < len; ++i) + SWAP_INT16(&fe->spch[i]); + if (fe->dither) + for (i = 0; i < len; ++i) + fe->spch[i] += (int16) ((!(s3_rand_int31() % 4)) ? 1 : 0); + + return fe_spch_to_frame(fe, len); +} + +int +fe_read_frame(fe_t * fe, int16 const *in, int32 len) +{ + return fe_read_frame_int16(fe, in, len); +} + +int +fe_shift_frame_int16(fe_t * fe, int16 const *in, int32 len) +{ + int offset, i; + + if (len > fe->frame_shift) + len = fe->frame_shift; + offset = fe->frame_size - fe->frame_shift; + + /* Shift data into the raw speech buffer. */ + memmove(fe->spch, fe->spch + fe->frame_shift, + offset * sizeof(*fe->spch)); + memcpy(fe->spch + offset, in, len * sizeof(*fe->spch)); + /* Swap and dither if necessary. */ + if (fe->swap) + for (i = 0; i < len; ++i) + SWAP_INT16(&fe->spch[offset + i]); + if (fe->dither) + for (i = 0; i < len; ++i) + fe->spch[offset + i] + += (int16) ((!(s3_rand_int31() % 4)) ? 1 : 0); + + return fe_spch_to_frame(fe, offset + len); +} + +int +fe_shift_frame(fe_t * fe, int16 const *in, int32 len) +{ + return fe_shift_frame_int16(fe, in, len); +} + +/** + * Create arrays of twiddle factors. + */ +void +fe_create_twiddle(fe_t * fe) +{ + int i; + + for (i = 0; i < fe->fft_size / 4; ++i) { + float64 a = 2 * M_PI * i / fe->fft_size; +#ifdef FIXED16 + fe->ccc[i] = (int16)(cos(a) * 0x8000); + fe->sss[i] = (int16)(sin(a) * 0x8000); +#elif defined(FIXED_POINT) + fe->ccc[i] = FLOAT2COS(cos(a)); + fe->sss[i] = FLOAT2COS(sin(a)); +#else + fe->ccc[i] = cos(a); + fe->sss[i] = sin(a); +#endif + } +} + +/* Translated from the FORTRAN (obviously) from "Real-Valued Fast + * Fourier Transform Algorithms" by Henrik V. Sorensen et al., IEEE + * Transactions on Acoustics, Speech, and Signal Processing, vol. 35, + * no.6. The 16-bit version does a version of "block floating + * point" in order to avoid rounding errors. + */ +#if defined(FIXED16) +static int +fe_fft_real(fe_t *fe) +{ + int i, j, k, m, n, lz; + frame_t *x, xt, max; + + x = fe->frame; + m = fe->fft_order; + n = fe->fft_size; + + /* Bit-reverse the input. */ + j = 0; + for (i = 0; i < n - 1; ++i) { + if (i < j) { + xt = x[j]; + x[j] = x[i]; + x[i] = xt; + } + k = n / 2; + while (k <= j) { + j -= k; + k /= 2; + } + j += k; + } + /* Determine how many bits of dynamic range are in the input. */ + max = 0; + for (i = 0; i < n; ++i) + if (abs(x[i]) > max) + max = abs(x[i]); + /* The FFT has a gain of M bits, so we need to attenuate the input + * by M bits minus the number of leading zeroes in the input's + * range in order to avoid overflows. */ + for (lz = 0; lz < m; ++lz) + if (max & (1 << (15-lz))) + break; + + /* Basic butterflies (2-point FFT, real twiddle factors): + * x[i] = x[i] + 1 * x[i+1] + * x[i+1] = x[i] + -1 * x[i+1] + */ + /* The quantization error introduced by attenuating the input at + * any given stage of the FFT has a cascading effect, so we hold + * off on it until it's absolutely necessary. */ + for (i = 0; i < n; i += 2) { + int atten = (lz == 0); + xt = x[i] >> atten; + x[i] = xt + (x[i + 1] >> atten); + x[i + 1] = xt - (x[i + 1] >> atten); + } + + /* The rest of the butterflies, in stages from 1..m */ + for (k = 1; k < m; ++k) { + int n1, n2, n4; + /* Start attenuating once we hit the number of leading zeros. */ + int atten = (k >= lz); + + n4 = k - 1; + n2 = k; + n1 = k + 1; + /* Stride over each (1 << (k+1)) points */ + for (i = 0; i < n; i += (1 << n1)) { + /* Basic butterfly with real twiddle factors: + * x[i] = x[i] + 1 * x[i + (1<> atten; + x[i] = xt + (x[i + (1 << n2)] >> atten); + x[i + (1 << n2)] = xt - (x[i + (1 << n2)] >> atten); + + /* The other ones with real twiddle factors: + * x[i + (1<> atten; + x[i + (1 << n4)] = x[i + (1 << n4)] >> atten; + + /* Butterflies with complex twiddle factors. + * There are (1<ccc[j << (m - n1)]; + ss = fe->sss[j << (m - n1)]; + + /* There are some symmetry properties which allow us + * to get away with only four multiplications here. */ + { + int32 tmp1, tmp2; + tmp1 = (int32)x[i3] * cc + (int32)x[i4] * ss; + tmp2 = (int32)x[i3] * ss - (int32)x[i4] * cc; + t1 = (int16)(tmp1 >> 15) >> atten; + t2 = (int16)(tmp2 >> 15) >> atten; + } + + x[i4] = (x[i2] >> atten) - t2; + x[i3] = (-x[i2] >> atten) - t2; + x[i2] = (x[i1] >> atten) - t1; + x[i1] = (x[i1] >> atten) + t1; + } + } + } + + /* Return the residual scaling factor. */ + return lz; +} +#else /* !FIXED16 */ +static int +fe_fft_real(fe_t *fe) +{ + int i, j, k, m, n; + frame_t *x, xt; + + x = fe->frame; + m = fe->fft_order; + n = fe->fft_size; + + /* Bit-reverse the input. */ + j = 0; + for (i = 0; i < n - 1; ++i) { + if (i < j) { + xt = x[j]; + x[j] = x[i]; + x[i] = xt; + } + k = n / 2; + while (k <= j) { + j -= k; + k /= 2; + } + j += k; + } + + /* Basic butterflies (2-point FFT, real twiddle factors): + * x[i] = x[i] + 1 * x[i+1] + * x[i+1] = x[i] + -1 * x[i+1] + */ + for (i = 0; i < n; i += 2) { + xt = x[i]; + x[i] = (xt + x[i + 1]); + x[i + 1] = (xt - x[i + 1]); + } + + /* The rest of the butterflies, in stages from 1..m */ + for (k = 1; k < m; ++k) { + int n1, n2, n4; + + n4 = k - 1; + n2 = k; + n1 = k + 1; + /* Stride over each (1 << (k+1)) points */ + for (i = 0; i < n; i += (1 << n1)) { + /* Basic butterfly with real twiddle factors: + * x[i] = x[i] + 1 * x[i + (1<ccc[j << (m - n1)]; + ss = fe->sss[j << (m - n1)]; + + /* There are some symmetry properties which allow us + * to get away with only four multiplications here. */ + t1 = COSMUL(x[i3], cc) + COSMUL(x[i4], ss); + t2 = COSMUL(x[i3], ss) - COSMUL(x[i4], cc); + + x[i4] = (x[i2] - t2); + x[i3] = (-x[i2] - t2); + x[i2] = (x[i1] - t1); + x[i1] = (x[i1] + t1); + } + } + } + + /* This isn't used, but return it for completeness. */ + return m; +} +#endif /* !FIXED16 */ + +static void +fe_spec_magnitude(fe_t * fe) +{ + frame_t *fft; + powspec_t *spec; + int32 j, scale, fftsize; + + /* Do FFT and get the scaling factor back (only actually used in + * fixed-point). Note the scaling factor is expressed in bits. */ + scale = fe_fft_real(fe); + + /* Convenience pointers to make things less awkward below. */ + fft = fe->frame; + spec = fe->spec; + fftsize = fe->fft_size; + + /* We need to scale things up the rest of the way to N. */ + scale = fe->fft_order - scale; + + /* The first point (DC coefficient) has no imaginary part */ + { +#ifdef FIXED16 + spec[0] = fixlog(abs(fft[0]) << scale) * 2; +#elif defined(FIXED_POINT) + spec[0] = FIXLN(abs(fft[0]) << scale) * 2; +#else + spec[0] = fft[0] * fft[0]; +#endif + } + + for (j = 1; j <= fftsize / 2; j++) { +#ifdef FIXED16 + int32 rr = fixlog(abs(fft[j]) << scale) * 2; + int32 ii = fixlog(abs(fft[fftsize - j]) << scale) * 2; + spec[j] = fe_log_add(rr, ii); +#elif defined(FIXED_POINT) + int32 rr = FIXLN(abs(fft[j]) << scale) * 2; + int32 ii = FIXLN(abs(fft[fftsize - j]) << scale) * 2; + spec[j] = fe_log_add(rr, ii); +#else + spec[j] = fft[j] * fft[j] + fft[fftsize - j] * fft[fftsize - j]; +#endif + } +} + +static void +fe_mel_spec(fe_t * fe) +{ + int whichfilt; + powspec_t *spec, *mfspec; + + /* Convenience poitners. */ + spec = fe->spec; + mfspec = fe->mfspec; + + for (whichfilt = 0; whichfilt < fe->mel_fb->num_filters; whichfilt++) { + int spec_start, filt_start, i; + + spec_start = fe->mel_fb->spec_start[whichfilt]; + filt_start = fe->mel_fb->filt_start[whichfilt]; + +#ifdef FIXED_POINT + mfspec[whichfilt] = + spec[spec_start] + fe->mel_fb->filt_coeffs[filt_start]; + for (i = 1; i < fe->mel_fb->filt_width[whichfilt]; i++) { + mfspec[whichfilt] = fe_log_add(mfspec[whichfilt], + spec[spec_start + i] + + fe->mel_fb-> + filt_coeffs[filt_start + i]); + } +#else /* !FIXED_POINT */ + mfspec[whichfilt] = 0; + for (i = 0; i < fe->mel_fb->filt_width[whichfilt]; i++) + mfspec[whichfilt] += + spec[spec_start + i] * fe->mel_fb->filt_coeffs[filt_start + + i]; +#endif /* !FIXED_POINT */ + } + +} + +#define LOG_FLOOR 1e-4 + +static void +fe_mel_cep(fe_t * fe, mfcc_t * mfcep) +{ + int32 i; + powspec_t *mfspec; + + /* Convenience pointer. */ + mfspec = fe->mfspec; + + for (i = 0; i < fe->mel_fb->num_filters; ++i) { +#ifndef FIXED_POINT /* It's already in log domain for fixed point */ + mfspec[i] = log(mfspec[i] + LOG_FLOOR); +#endif /* !FIXED_POINT */ + } + + /* If we are doing LOG_SPEC, then do nothing. */ + if (fe->log_spec == RAW_LOG_SPEC) { + for (i = 0; i < fe->feature_dimension; i++) { + mfcep[i] = (mfcc_t) mfspec[i]; + } + } + /* For smoothed spectrum, do DCT-II followed by (its inverse) DCT-III */ + else if (fe->log_spec == SMOOTH_LOG_SPEC) { + /* FIXME: This is probably broken for fixed-point. */ + fe_dct2(fe, mfspec, mfcep, 0); + fe_dct3(fe, mfcep, mfspec); + for (i = 0; i < fe->feature_dimension; i++) { + mfcep[i] = (mfcc_t) mfspec[i]; + } + } + else if (fe->transform == DCT_II) + fe_dct2(fe, mfspec, mfcep, FALSE); + else if (fe->transform == DCT_HTK) + fe_dct2(fe, mfspec, mfcep, TRUE); + else + fe_spec2cep(fe, mfspec, mfcep); + + return; +} + +void +fe_spec2cep(fe_t * fe, const powspec_t * mflogspec, mfcc_t * mfcep) +{ + int32 i, j, beta; + + /* Compute C0 separately (its basis vector is 1) to avoid + * costly multiplications. */ + mfcep[0] = mflogspec[0] / 2; /* beta = 0.5 */ + for (j = 1; j < fe->mel_fb->num_filters; j++) + mfcep[0] += mflogspec[j]; /* beta = 1.0 */ + mfcep[0] /= (frame_t) fe->mel_fb->num_filters; + + for (i = 1; i < fe->num_cepstra; ++i) { + mfcep[i] = 0; + for (j = 0; j < fe->mel_fb->num_filters; j++) { + if (j == 0) + beta = 1; /* 0.5 */ + else + beta = 2; /* 1.0 */ + mfcep[i] += COSMUL(mflogspec[j], + fe->mel_fb->mel_cosine[i][j]) * beta; + } + /* Note that this actually normalizes by num_filters, like the + * original Sphinx front-end, due to the doubled 'beta' factor + * above. */ + mfcep[i] /= (frame_t) fe->mel_fb->num_filters * 2; + } +} + +void +fe_dct2(fe_t * fe, const powspec_t * mflogspec, mfcc_t * mfcep, int htk) +{ + int32 i, j; + + /* Compute C0 separately (its basis vector is 1) to avoid + * costly multiplications. */ + mfcep[0] = mflogspec[0]; + for (j = 1; j < fe->mel_fb->num_filters; j++) + mfcep[0] += mflogspec[j]; + if (htk) + mfcep[0] = COSMUL(mfcep[0], fe->mel_fb->sqrt_inv_2n); + else /* sqrt(1/N) = sqrt(2/N) * 1/sqrt(2) */ + mfcep[0] = COSMUL(mfcep[0], fe->mel_fb->sqrt_inv_n); + + for (i = 1; i < fe->num_cepstra; ++i) { + mfcep[i] = 0; + for (j = 0; j < fe->mel_fb->num_filters; j++) { + mfcep[i] += COSMUL(mflogspec[j], fe->mel_fb->mel_cosine[i][j]); + } + mfcep[i] = COSMUL(mfcep[i], fe->mel_fb->sqrt_inv_2n); + } +} + +void +fe_lifter(fe_t * fe, mfcc_t * mfcep) +{ + int32 i; + + if (fe->mel_fb->lifter_val == 0) + return; + + for (i = 0; i < fe->num_cepstra; ++i) { + mfcep[i] = MFCCMUL(mfcep[i], fe->mel_fb->lifter[i]); + } +} + +void +fe_dct3(fe_t * fe, const mfcc_t * mfcep, powspec_t * mflogspec) +{ + int32 i, j; + + for (i = 0; i < fe->mel_fb->num_filters; ++i) { + mflogspec[i] = COSMUL(mfcep[0], SQRT_HALF); + for (j = 1; j < fe->num_cepstra; j++) { + mflogspec[i] += COSMUL(mfcep[j], fe->mel_fb->mel_cosine[j][i]); + } + mflogspec[i] = COSMUL(mflogspec[i], fe->mel_fb->sqrt_inv_2n); + } +} + +int +fe_write_frame(fe_t * fe, mfcc_t * feat) +{ + fe_spec_magnitude(fe); + fe_mel_spec(fe); + fe_remove_noise(fe); + fe_mel_cep(fe, feat); + fe_lifter(fe, feat); + + return 1; +} + + +void * +fe_create_2d(int32 d1, int32 d2, int32 elem_size) +{ + return (void *) ckd_calloc_2d(d1, d2, elem_size); +} + +void +fe_free_2d(void *arr) +{ + ckd_free_2d((void **) arr); +} diff --git a/src/fe/fe_type.h b/src/fe/fe_type.h new file mode 100644 index 0000000..13db0eb --- /dev/null +++ b/src/fe/fe_type.h @@ -0,0 +1,64 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2013 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +#ifndef FE_TYPE_H +#define FE_TYPE_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "fe/fixpoint.h" + +#ifdef FIXED16 +/* Q15 format */ +typedef int16 frame_t; +typedef int16 window_t; +typedef int32 powspec_t; +typedef struct { int16 r, i; } complex; +#elif defined(FIXED_POINT) +typedef fixed32 frame_t; +typedef int32 powspec_t; +typedef fixed32 window_t; +typedef struct { fixed32 r, i; } complex; +#else /* FIXED_POINT */ +typedef float64 frame_t; +typedef float64 powspec_t; +typedef float64 window_t; +typedef struct { float64 r, i; } complex; +#endif /* FIXED_POINT */ + +#endif /* FE_TYPE_H */ diff --git a/src/fe/fe_warp.c b/src/fe/fe_warp.c new file mode 100644 index 0000000..5156596 --- /dev/null +++ b/src/fe/fe_warp.c @@ -0,0 +1,252 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/********************************************************************* + * + * File: fe_warp.c + * + * Description: + * Allows a caller to choose a warping function. + *********************************************************************/ + +/* static char rcsid[] = "@(#)$Id: fe_warp.c,v 1.2 2006/02/17 00:31:34 egouvea Exp $";*/ + +#include +#include +#include +#include + +#include + +#include "fe/fe_warp_inverse_linear.h" +#include "fe/fe_warp_affine.h" +#include "fe/fe_warp_piecewise_linear.h" +#include "fe/fe_warp.h" + +/* This is for aliases for each of the entries below. Currently not + used. +*/ +static char *__name2id[] = { + "inverse", + "linear", + "piecewise", + NULL +}; + +static char *name2id[] = { + "inverse_linear", + "affine", + "piecewise_linear", + NULL +}; + +static fe_warp_conf_t fe_warp_conf[FE_WARP_ID_MAX + 1] = { + {fe_warp_inverse_linear_set_parameters, + fe_warp_inverse_linear_doc, + fe_warp_inverse_linear_id, + fe_warp_inverse_linear_n_param, + fe_warp_inverse_linear_warped_to_unwarped, + fe_warp_inverse_linear_unwarped_to_warped, + fe_warp_inverse_linear_print}, /* Inverse linear warping */ + {fe_warp_affine_set_parameters, + fe_warp_affine_doc, + fe_warp_affine_id, + fe_warp_affine_n_param, + fe_warp_affine_warped_to_unwarped, + fe_warp_affine_unwarped_to_warped, + fe_warp_affine_print}, /* Affine warping */ + {fe_warp_piecewise_linear_set_parameters, + fe_warp_piecewise_linear_doc, + fe_warp_piecewise_linear_id, + fe_warp_piecewise_linear_n_param, + fe_warp_piecewise_linear_warped_to_unwarped, + fe_warp_piecewise_linear_unwarped_to_warped, + fe_warp_piecewise_linear_print}, /* Piecewise_Linear warping */ +}; + +int +fe_warp_set(melfb_t *mel, const char *id_name) +{ + uint32 i; + + for (i = 0; name2id[i]; i++) { + if (strcmp(id_name, name2id[i]) == 0) { + mel->warp_id = i; + break; + } + } + + if (name2id[i] == NULL) { + for (i = 0; __name2id[i]; i++) { + if (strcmp(id_name, __name2id[i]) == 0) { + mel->warp_id = i; + break; + } + } + if (__name2id[i] == NULL) { + E_ERROR("Unimplemented warping function %s\n", id_name); + E_ERROR("Implemented functions are:\n"); + for (i = 0; name2id[i]; i++) { + fprintf(stderr, "\t%s\n", name2id[i]); + } + mel->warp_id = FE_WARP_ID_NONE; + + return FE_START_ERROR; + } + } + + return FE_SUCCESS; +} + +void +fe_warp_set_parameters(melfb_t *mel, char const *param_str, float sampling_rate) +{ + if (mel->warp_id <= FE_WARP_ID_MAX) { + fe_warp_conf[mel->warp_id].set_parameters(param_str, sampling_rate); + } + else if (mel->warp_id == FE_WARP_ID_NONE) { + E_FATAL("feat module must be configured w/ a valid ID\n"); + } + else { + E_FATAL + ("fe_warp module misconfigured with invalid fe_warp_id %u\n", + mel->warp_id); + } +} + +const char * +fe_warp_doc(melfb_t *mel) +{ + if (mel->warp_id <= FE_WARP_ID_MAX) { + return fe_warp_conf[mel->warp_id].doc(); + } + else if (mel->warp_id == FE_WARP_ID_NONE) { + E_FATAL("fe_warp module must be configured w/ a valid ID\n"); + } + else { + E_FATAL + ("fe_warp module misconfigured with invalid fe_warp_id %u\n", + mel->warp_id); + } + + return NULL; +} + +uint32 +fe_warp_id(melfb_t *mel) +{ + if (mel->warp_id <= FE_WARP_ID_MAX) { + assert(mel->warp_id == fe_warp_conf[mel->warp_id].id()); + return mel->warp_id; + } + else if (mel->warp_id != FE_WARP_ID_NONE) { + E_FATAL + ("fe_warp module misconfigured with invalid fe_warp_id %u\n", + mel->warp_id); + } + + return FE_WARP_ID_NONE; +} + +uint32 +fe_warp_n_param(melfb_t *mel) +{ + if (mel->warp_id <= FE_WARP_ID_MAX) { + return fe_warp_conf[mel->warp_id].n_param(); + } + else if (mel->warp_id == FE_WARP_ID_NONE) { + E_FATAL("fe_warp module must be configured w/ a valid ID\n"); + } + else { + E_FATAL + ("fe_warp module misconfigured with invalid fe_warp_id %u\n", + mel->warp_id); + } + + return 0; +} + +float +fe_warp_warped_to_unwarped(melfb_t *mel, float nonlinear) +{ + if (mel->warp_id <= FE_WARP_ID_MAX) { + return fe_warp_conf[mel->warp_id].warped_to_unwarped(nonlinear); + } + else if (mel->warp_id == FE_WARP_ID_NONE) { + E_FATAL("fe_warp module must be configured w/ a valid ID\n"); + } + else { + E_FATAL + ("fe_warp module misconfigured with invalid fe_warp_id %u\n", + mel->warp_id); + } + + return 0; +} + +float +fe_warp_unwarped_to_warped(melfb_t *mel,float linear) +{ + if (mel->warp_id <= FE_WARP_ID_MAX) { + return fe_warp_conf[mel->warp_id].unwarped_to_warped(linear); + } + else if (mel->warp_id == FE_WARP_ID_NONE) { + E_FATAL("fe_warp module must be configured w/ a valid ID\n"); + } + else { + E_FATAL + ("fe_warp module misconfigured with invalid fe_warp_id %u\n", + mel->warp_id); + } + + return 0; +} + +void +fe_warp_print(melfb_t *mel, const char *label) +{ + if (mel->warp_id <= FE_WARP_ID_MAX) { + fe_warp_conf[mel->warp_id].print(label); + } + else if (mel->warp_id == FE_WARP_ID_NONE) { + E_FATAL("fe_warp module must be configured w/ a valid ID\n"); + } + else { + E_FATAL + ("fe_warp module misconfigured with invalid fe_warp_id %u\n", + mel->warp_id); + } +} diff --git a/src/fe/fe_warp.h b/src/fe/fe_warp.h new file mode 100644 index 0000000..f2fd145 --- /dev/null +++ b/src/fe/fe_warp.h @@ -0,0 +1,90 @@ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef FE_WARP_H +#define FE_WARP_H + +#include "fe_internal.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#define FE_WARP_ID_INVERSE_LINEAR 0 +#define FE_WARP_ID_AFFINE 1 +#define FE_WARP_ID_PIECEWISE_LINEAR 2 +#define FE_WARP_ID_EIDE_GISH 3 +#define FE_WARP_ID_MAX 2 +#define FE_WARP_ID_NONE 0xffffffff + +typedef struct { + void (*set_parameters)(char const *param_str, float sampling_rate); + const char * (*doc)(void); + uint32 (*id)(void); + uint32 (*n_param)(void); + float (*warped_to_unwarped)(float nonlinear); + float (*unwarped_to_warped)(float linear); + void (*print)(const char *label); +} fe_warp_conf_t; + +int fe_warp_set(melfb_t *mel, const char *id_name); + +uint32 fe_warp_id(melfb_t *mel); + +const char * fe_warp_doc(melfb_t *mel); + +void fe_warp_set_parameters(melfb_t *mel, char const *param_str, float sampling_rate); + +uint32 fe_warp_n_param(melfb_t *mel); + +float fe_warp_warped_to_unwarped(melfb_t *mel, float nonlinear); + +float fe_warp_unwarped_to_warped(melfb_t *mel, float linear); + +void fe_warp_print(melfb_t *mel, const char *label); + +#define FE_WARP_NO_SIZE 0xffffffff + +#ifdef __cplusplus +} +#endif + + +#endif /* FE_WARP_H */ diff --git a/src/fe/fe_warp_affine.c b/src/fe/fe_warp_affine.c new file mode 100644 index 0000000..5dad097 --- /dev/null +++ b/src/fe/fe_warp_affine.c @@ -0,0 +1,181 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/********************************************************************* + * + * File: fe_warp_affine.c + * + * Description: + * Warp the frequency axis according to an affine function, i.e.: + * + * w' = a * w + b + * + *********************************************************************/ + +/* static char rcsid[] = "@(#)$Id: fe_warp_affine.c,v 1.2 2006/02/17 00:31:34 egouvea Exp $"; */ + +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning (disable: 4996) +#endif + +#include + +#include "util/strfuncs.h" +#include "fe/fe_warp.h" +#include "fe/fe_warp_affine.h" + +#define N_PARAM 2 +#define YES 1 +#define NO 0 + +/* + * params[0] : a + * params[1] : b + */ +static float params[N_PARAM] = { 1.0f, 0.0f }; +static int32 is_neutral = YES; +static char p_str[256] = ""; +static float nyquist_frequency = 0.0f; + + +const char * +fe_warp_affine_doc() +{ + return "affine :== < w' = a * x + b >"; +} + +uint32 +fe_warp_affine_id() +{ + return FE_WARP_ID_AFFINE; +} + +uint32 +fe_warp_affine_n_param() +{ + return N_PARAM; +} + +void +fe_warp_affine_set_parameters(char const *param_str, float sampling_rate) +{ + char *tok; + char *seps = " \t"; + char temp_param_str[256]; + int param_index = 0; + + nyquist_frequency = sampling_rate / 2; + if (param_str == NULL) { + is_neutral = YES; + return; + } + /* The new parameters are the same as the current ones, so do nothing. */ + if (strcmp(param_str, p_str) == 0) { + return; + } + is_neutral = NO; + strcpy(temp_param_str, param_str); + memset(params, 0, N_PARAM * sizeof(float)); + strcpy(p_str, param_str); + /* FIXME: strtok() is not re-entrant... */ + tok = strtok(temp_param_str, seps); + while (tok != NULL) { + params[param_index++] = (float) atof_c(tok); + tok = strtok(NULL, seps); + if (param_index >= N_PARAM) { + break; + } + } + if (tok != NULL) { + E_INFO + ("Affine warping takes up to two arguments, %s ignored.\n", + tok); + } + if (params[0] == 0) { + is_neutral = YES; + E_INFO + ("Affine warping cannot have slope zero, warping not applied.\n"); + } +} + +float +fe_warp_affine_warped_to_unwarped(float nonlinear) +{ + if (is_neutral) { + return nonlinear; + } + else { + /* linear = (nonlinear - b) / a */ + float temp = nonlinear - params[1]; + temp /= params[0]; + if (temp > nyquist_frequency) { + E_WARN + ("Warp factor %g results in frequency (%.1f) higher than Nyquist (%.1f)\n", + params[0], temp, nyquist_frequency); + } + return temp; + } +} + +float +fe_warp_affine_unwarped_to_warped(float linear) +{ + if (is_neutral) { + return linear; + } + else { + /* nonlinear = a * linear - b */ + float temp = linear * params[0]; + temp += params[1]; + return temp; + } +} + +void +fe_warp_affine_print(const char *label) +{ + uint32 i; + + for (i = 0; i < N_PARAM; i++) { + printf("%s[%04u]: %6.3f ", label, i, params[i]); + } + printf("\n"); +} diff --git a/src/fe/fe_warp_affine.h b/src/fe/fe_warp_affine.h new file mode 100644 index 0000000..b63472d --- /dev/null +++ b/src/fe/fe_warp_affine.h @@ -0,0 +1,73 @@ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef FE_WARP_AFFINE_H +#define FE_WARP_AFFINE_H + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +const char * +fe_warp_affine_doc(void); + +uint32 +fe_warp_affine_id(void); + +uint32 +fe_warp_affine_n_param(void); + +void +fe_warp_affine_set_parameters(char const *param_str, float sampling_rate); + +float +fe_warp_affine_warped_to_unwarped(float nonlinear); + +float +fe_warp_affine_unwarped_to_warped(float linear); + +void +fe_warp_affine_print(const char *label); + +#ifdef __cplusplus +} +#endif + +#endif /* FE_WARP_AFFINE_H */ diff --git a/src/fe/fe_warp_inverse_linear.c b/src/fe/fe_warp_inverse_linear.c new file mode 100644 index 0000000..644019a --- /dev/null +++ b/src/fe/fe_warp_inverse_linear.c @@ -0,0 +1,179 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/********************************************************************* + * + * File: fe_warp_inverse_linear.c + * + * Description: + * Warp the frequency axis according to an inverse_linear function, i.e.: + * + * w' = w / a + * + *********************************************************************/ + +/* static char rcsid[] = "@(#)$Id: fe_warp_inverse_linear.c,v 1.3 2006/02/23 19:40:11 eht Exp $"; */ + +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning (disable: 4996) +#endif + +#include + +#include "util/strfuncs.h" + +#include "fe/fe_warp.h" +#include "fe/fe_warp_inverse_linear.h" + +#define N_PARAM 1 +#define YES 1 +#define NO 0 + +/* + * params[0] : a + */ +static float params[N_PARAM] = { 1.0f }; +static int32 is_neutral = YES; +static char p_str[256] = ""; +static float nyquist_frequency = 0.0f; + + +const char * +fe_warp_inverse_linear_doc() +{ + return "inverse_linear :== < w' = x / a >"; +} + +uint32 +fe_warp_inverse_linear_id() +{ + return FE_WARP_ID_INVERSE_LINEAR; +} + +uint32 +fe_warp_inverse_linear_n_param() +{ + return N_PARAM; +} + +void +fe_warp_inverse_linear_set_parameters(char const *param_str, float sampling_rate) +{ + char *tok; + char *seps = " \t"; + char temp_param_str[256]; + int param_index = 0; + + nyquist_frequency = sampling_rate / 2; + if (param_str == NULL) { + is_neutral = YES; + return; + } + /* The new parameters are the same as the current ones, so do nothing. */ + if (strcmp(param_str, p_str) == 0) { + return; + } + is_neutral = NO; + strcpy(temp_param_str, param_str); + memset(params, 0, N_PARAM * sizeof(float)); + strcpy(p_str, param_str); + /* FIXME: strtok() is not re-entrant... */ + tok = strtok(temp_param_str, seps); + while (tok != NULL) { + params[param_index++] = (float) atof_c(tok); + tok = strtok(NULL, seps); + if (param_index >= N_PARAM) { + break; + } + } + if (tok != NULL) { + E_INFO + ("Inverse linear warping takes only one argument, %s ignored.\n", + tok); + } + if (params[0] == 0) { + is_neutral = YES; + E_INFO + ("Inverse linear warping cannot have slope zero, warping not applied.\n"); + } +} + +float +fe_warp_inverse_linear_warped_to_unwarped(float nonlinear) +{ + if (is_neutral) { + return nonlinear; + } + else { + /* linear = nonlinear * a */ + float temp = nonlinear * params[0]; + if (temp > nyquist_frequency) { + E_WARN + ("Warp factor %g results in frequency (%.1f) higher than Nyquist (%.1f)\n", + params[0], temp, nyquist_frequency); + } + return temp; + } +} + +float +fe_warp_inverse_linear_unwarped_to_warped(float linear) +{ + if (is_neutral) { + return linear; + } + else { + /* nonlinear = a / linear */ + float temp = linear / params[0]; + return temp; + } +} + +void +fe_warp_inverse_linear_print(const char *label) +{ + uint32 i; + + for (i = 0; i < N_PARAM; i++) { + printf("%s[%04u]: %6.3f ", label, i, params[i]); + } + printf("\n"); +} diff --git a/src/fe/fe_warp_inverse_linear.h b/src/fe/fe_warp_inverse_linear.h new file mode 100644 index 0000000..be559e6 --- /dev/null +++ b/src/fe/fe_warp_inverse_linear.h @@ -0,0 +1,74 @@ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef FE_WARP_inverse_linear_H +#define FE_WARP_inverse_linear_H + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +const char * +fe_warp_inverse_linear_doc(void); + +uint32 +fe_warp_inverse_linear_id(void); + +uint32 +fe_warp_inverse_linear_n_param(void); + +void +fe_warp_inverse_linear_set_parameters(char const *param_str, float sampling_rate); + +float +fe_warp_inverse_linear_warped_to_unwarped(float nonlinear); + +float +fe_warp_inverse_linear_unwarped_to_warped(float linear); + +void +fe_warp_inverse_linear_print(const char *label); + +#ifdef __cplusplus +} +#endif + + +#endif /* FE_WARP_inverse_linear_H */ diff --git a/src/fe/fe_warp_piecewise_linear.c b/src/fe/fe_warp_piecewise_linear.c new file mode 100644 index 0000000..6076b1b --- /dev/null +++ b/src/fe/fe_warp_piecewise_linear.c @@ -0,0 +1,224 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/********************************************************************* + * + * File: fe_warp_piecewise_linear.c + * + * Description: + * + * Warp the frequency axis according to an piecewise linear + * function. The function is linear up to a frequency F, where + * the slope changes so that the Nyquist frequency in the warped + * axis maps to the Nyquist frequency in the unwarped. + * + * w' = a * w, w < F + * w' = a' * w + b, W > F + * w'(0) = 0 + * w'(F) = F + * w'(Nyq) = Nyq + * + *********************************************************************/ + +/* static char rcsid[] = "@(#)$Id: fe_warp_piecewise_linear.c,v 1.2 2006/02/17 00:31:34 egouvea Exp $"; */ + +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning (disable: 4996) +#endif + +#include + +#include "util/strfuncs.h" + +#include "fe/fe_warp.h" +#include "fe/fe_warp_piecewise_linear.h" + +#define N_PARAM 2 +#define YES 1 +#define NO 0 + +/* + * params[0] : a + * params[1] : F (the non-differentiable point) + */ +static float params[N_PARAM] = { 1.0f, 6800.0f }; +static float final_piece[2]; +static int32 is_neutral = YES; +static char p_str[256] = ""; +static float nyquist_frequency = 0.0f; + + +const char * +fe_warp_piecewise_linear_doc() +{ + return "piecewise_linear :== < w' = a * w, w < F >"; +} + +uint32 +fe_warp_piecewise_linear_id() +{ + return FE_WARP_ID_PIECEWISE_LINEAR; +} + +uint32 +fe_warp_piecewise_linear_n_param() +{ + return N_PARAM; +} + +void +fe_warp_piecewise_linear_set_parameters(char const *param_str, + float sampling_rate) +{ + char *tok; + char *seps = " \t"; + char temp_param_str[256]; + int param_index = 0; + + nyquist_frequency = sampling_rate / 2; + if (param_str == NULL) { + is_neutral = YES; + return; + } + /* The new parameters are the same as the current ones, so do nothing. */ + if (strcmp(param_str, p_str) == 0) { + return; + } + is_neutral = NO; + strcpy(temp_param_str, param_str); + memset(params, 0, N_PARAM * sizeof(float)); + memset(final_piece, 0, 2 * sizeof(float)); + strcpy(p_str, param_str); + /* FIXME: strtok() is not re-entrant... */ + tok = strtok(temp_param_str, seps); + while (tok != NULL) { + params[param_index++] = (float) atof_c(tok); + tok = strtok(NULL, seps); + if (param_index >= N_PARAM) { + break; + } + } + if (tok != NULL) { + E_INFO + ("Piecewise linear warping takes up to two arguments, %s ignored.\n", + tok); + } + if (params[1] < sampling_rate) { + /* Precompute these. These are the coefficients of a + * straight line that contains the points (F, aF) and (N, + * N), where a = params[0], F = params[1], N = Nyquist + * frequency. + */ + if (params[1] == 0) { + params[1] = sampling_rate * 0.85f; + } + final_piece[0] = + (nyquist_frequency - + params[0] * params[1]) / (nyquist_frequency - params[1]); + final_piece[1] = + nyquist_frequency * params[1] * (params[0] - + 1.0f) / (nyquist_frequency - + params[1]); + } + else { + memset(final_piece, 0, 2 * sizeof(float)); + } + if (params[0] == 0) { + is_neutral = YES; + E_INFO + ("Piecewise linear warping cannot have slope zero, warping not applied.\n"); + } +} + +float +fe_warp_piecewise_linear_warped_to_unwarped(float nonlinear) +{ + if (is_neutral) { + return nonlinear; + } + else { + /* linear = (nonlinear - b) / a */ + float temp; + if (nonlinear < params[0] * params[1]) { + temp = nonlinear / params[0]; + } + else { + temp = nonlinear - final_piece[1]; + temp /= final_piece[0]; + } + if (temp > nyquist_frequency) { + E_WARN + ("Warp factor %g results in frequency (%.1f) higher than Nyquist (%.1f)\n", + params[0], temp, nyquist_frequency); + } + return temp; + } +} + +float +fe_warp_piecewise_linear_unwarped_to_warped(float linear) +{ + if (is_neutral) { + return linear; + } + else { + float temp; + /* nonlinear = a * linear - b */ + if (linear < params[1]) { + temp = linear * params[0]; + } + else { + temp = final_piece[0] * linear + final_piece[1]; + } + return temp; + } +} + +void +fe_warp_piecewise_linear_print(const char *label) +{ + uint32 i; + + for (i = 0; i < N_PARAM; i++) { + printf("%s[%04u]: %6.3f ", label, i, params[i]); + } + printf("\n"); +} diff --git a/src/fe/fe_warp_piecewise_linear.h b/src/fe/fe_warp_piecewise_linear.h new file mode 100644 index 0000000..8eaddfb --- /dev/null +++ b/src/fe/fe_warp_piecewise_linear.h @@ -0,0 +1,74 @@ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef FE_WARP_PIECEWIDE_LINEAR_H +#define FE_WARP_PIECEWIDE_LINEAR_H + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +const char * +fe_warp_piecewise_linear_doc(void); + +uint32 +fe_warp_piecewise_linear_id(void); + +uint32 +fe_warp_piecewise_linear_n_param(void); + +void +fe_warp_piecewise_linear_set_parameters(char const *param_str, float sampling_rate); + +float +fe_warp_piecewise_linear_warped_to_unwarped(float nonlinear); + +float +fe_warp_piecewise_linear_unwarped_to_warped(float linear); + +void +fe_warp_piecewise_linear_print(const char *label); + +#ifdef __cplusplus +} +#endif + + +#endif /* FE_WARP_PIECEWIDE_LINEAR_H */ diff --git a/src/fe/fixlog.c b/src/fe/fixlog.c new file mode 100644 index 0000000..c34c381 --- /dev/null +++ b/src/fe/fixlog.c @@ -0,0 +1,229 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2005 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + * File: fixlog.c + * + * Description: Fast approximate fixed-point logarithms + * + * Author: David Huggins-Daines + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "fe/fixpoint.h" +#include "fe/fe_internal.h" + +/* Table of log2(x/128)*(1<= 4 + y = __builtin_clz(x); + x <<= y; + y = (31 - y); +#else + for (y = 31; y > 0; --y) { + if (x & 0x80000000) + break; + x <<= 1; + } +#endif + y <<= DEFAULT_RADIX; + /* Do a table lookup for the MSB of the mantissa. */ + x = (x >> 24) & 0x7f; + return y + logtable[x]; +} + +int +fixlog(uint32 x) +{ + int32 y; + y = fixlog2(x); + return FIXMUL(y, FIXLN_2); +} diff --git a/src/fe/fixpoint.h b/src/fe/fixpoint.h new file mode 100644 index 0000000..3257fce --- /dev/null +++ b/src/fe/fixpoint.h @@ -0,0 +1,144 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2005 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== */ + +/** + * @file fixpoint.h + * @brief Fixed-point arithmetic macros. + * + * Author: David Huggins-Daines + */ + +#ifndef _FIXPOINT_H_ +#define _FIXPOINT_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#ifndef DEFAULT_RADIX +#define DEFAULT_RADIX 12 +#endif + +/** Fixed-point computation type. */ +typedef int32 fixed32; + +/** Convert floating point to fixed point. */ +#define FLOAT2FIX_ANY(x,radix) \ + (((x)<0.0) ? \ + ((fixed32)((x)*(float32)(1<<(radix)) - 0.5)) \ + : ((fixed32)((x)*(float32)(1<<(radix)) + 0.5))) +#define FLOAT2FIX(x) FLOAT2FIX_ANY(x,DEFAULT_RADIX) +/** Convert fixed point to floating point. */ +#define FIX2FLOAT_ANY(x,radix) ((float32)(x)/(1<<(radix))) +#define FIX2FLOAT(x) FIX2FLOAT_ANY(x,DEFAULT_RADIX) + +/** + * Multiply two fixed point numbers with an arbitrary radix point. + * + * A veritable multiplicity of implementations exist, starting with + * the fastest ones... + */ + +#if defined(__arm__) && !defined(__thumb__) +/* + * This works on most modern ARMs but *only* in ARM mode (for obvious + * reasons), so don't use it in Thumb mode (but why are you building + * signal processing code in Thumb mode?!) + */ +#define FIXMUL(a,b) FIXMUL_ANY(a,b,DEFAULT_RADIX) +#define FIXMUL_ANY(a,b,r) ({ \ + int cl, ch, _a = a, _b = b; \ + __asm__ ("smull %0, %1, %2, %3\n" \ + "mov %0, %0, lsr %4\n" \ + "orr %0, %0, %1, lsl %5\n" \ + : "=&r" (cl), "=&r" (ch) \ + : "r" (_a), "r" (_b), "i" (r), "i" (32-(r)));\ + cl; }) + +#elif defined(_MSC_VER) || (defined(HAVE_LONG_LONG) && SIZEOF_LONG_LONG == 8) +/* Standard systems*/ +#define FIXMUL(a,b) FIXMUL_ANY(a,b,DEFAULT_RADIX) +#define FIXMUL_ANY(a,b,radix) ((fixed32)(((int64)(a)*(b))>>(radix))) + +#else +/* Most general case where 'long long' doesn't exist or is slow. */ +#define FIXMUL(a,b) FIXMUL_ANY(a,b,DEFAULT_RADIX) +#define FIXMUL_ANY(a,b,radix) ({ \ + int32 _ah, _bh; \ + uint32 _al, _bl, _t, c; \ + _ah = ((int32)(a)) >> 16; \ + _bh = ((int32)(b)) >> 16; \ + _al = ((uint32)(a)) & 0xffff; \ + _bl = ((uint32)(b)) & 0xffff; \ + _t = _ah * _bl + _al * _bh; \ + c = (fixed32)(((_al * _bl) >> (radix)) \ + + ((_ah * _bh) << (32 - (radix))) \ + + ((radix) > 16 ? (_t >> (radix - 16)) : (_t << (16 - radix)))); \ + c;}) +#endif + +/* Various fixed-point logarithmic functions that we need. */ +/** Minimum value representable in log format. */ +#define MIN_FIXLOG -2829416 /* log(1e-300) * (1< 0: + stop = int(round(math.log(-math.expm1(-byx/scale)) * out_scale)) + if stop == 0: + break + + byx = byx + 1. + +print "static const uint16 logsub_table[] = {" +for i in range(0,len(logtab),10): + if i+10 <= len(logtab): + print ", ".join(str(x) for x in logtab[i:i+10]) + "," + else: + print ", ".join(str(x) for x in logtab[i:]) +print "};" diff --git a/src/fe/make_log_table.py b/src/fe/make_log_table.py new file mode 100644 index 0000000..7a3ed59 --- /dev/null +++ b/src/fe/make_log_table.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +import math + +radix = 8 +scale = 1< + */ + +/* This implements part of the YIN algorithm: + * + * "YIN, a fundamental frequency estimator for speech and music". + * Alain de Cheveigné and Hideki Kawahara. Journal of the Acoustical + * Society of America, 111 (4), April 2002. + */ + +#include + +#include "util/ckd_alloc.h" +#include "fe/fixpoint.h" +#include "fe/yin.h" + +#include +#include + +struct yin_s { + uint16 frame_size; /** Size of analysis frame. */ + uint16 search_threshold; /**< Threshold for finding period, in Q15 */ + uint16 search_range; /**< Range around best local estimate to search, in Q15 */ + uint16 nfr; /**< Number of frames read so far. */ + + unsigned char wsize; /**< Size of smoothing window. */ + unsigned char wstart; /**< First frame in window. */ + unsigned char wcur; /**< Current frame of analysis. */ + unsigned char endut; /**< Hoch Hech! Are we at the utterance end? */ + + fixed32 **diff_window; /**< Window of difference function outputs. */ + uint16 *period_window; /**< Window of best period estimates. */ +}; + +/** + * The core of YIN: cumulative mean normalized difference function. + */ +static void +cmn_diff(int16 const *signal, int32 *out_diff, int ndiff) +{ + uint32 cum, cshift; + int32 t, tscale; + + out_diff[0] = 32768; + cum = 0; + cshift = 0; + + /* Determine how many bits we can scale t up by below. */ + for (tscale = 0; tscale < 32; ++tscale) + if (ndiff & (1<<(31-tscale))) + break; + --tscale; /* Avoid the overflowz. */ + /* printf("tscale is %d (ndiff - 1) << tscale is %d\n", + tscale, (ndiff-1) << tscale); */ + + /* Somewhat elaborate block floating point implementation. + * The fp implementation of this is really a lot simpler. */ + for (t = 1; t < ndiff; ++t) { + uint32 dd, dshift, norm; + int j; + + dd = 0; + dshift = 0; + for (j = 0; j < ndiff; ++j) { + int diff = signal[j] - signal[t + j]; + /* Guard against overflows. */ + if (dd > (1UL<>= 1; + ++dshift; + } + dd += (diff * diff) >> dshift; + } + /* Make sure the diffs and cum are shifted to the same + * scaling factor (usually dshift will be zero) */ + if (dshift > cshift) { + cum += dd << (dshift-cshift); + } + else { + cum += dd >> (cshift-dshift); + } + + /* Guard against overflows and also ensure that (t< cum. */ + while (cum > (1UL<>= 1; + ++cshift; + } + /* Avoid divide-by-zero! */ + if (cum == 0) cum = 1; + /* Calculate the normalizer in high precision. */ + norm = (t << tscale) / cum; + /* Do a long multiply and shift down to Q15. */ + out_diff[t] = (int32)(((long long)dd * norm) + >> (tscale - 15 + cshift - dshift)); + /* printf("dd %d cshift %d dshift %d scaledt %d cum %d norm %d cmn %d\n", + dd, cshift, dshift, (t<frame_size = frame_size; + pe->search_threshold = (uint16)(search_threshold * 32768); + pe->search_range = (uint16)(search_range * 32768); + pe->wsize = smooth_window * 2 + 1; + pe->diff_window = ckd_calloc_2d(pe->wsize, + pe->frame_size / 2, + sizeof(**pe->diff_window)); + pe->period_window = ckd_calloc(pe->wsize, + sizeof(*pe->period_window)); + return pe; +} + +void +yin_free(yin_t *pe) +{ + ckd_free_2d(pe->diff_window); + ckd_free(pe->period_window); + ckd_free(pe); +} + +void +yin_start(yin_t *pe) +{ + /* Reset the circular window pointers. */ + pe->wstart = pe->endut = 0; + pe->nfr = 0; +} + +void +yin_end(yin_t *pe) +{ + pe->endut = 1; +} + +int +thresholded_search(int32 *diff_window, fixed32 threshold, int start, int end) +{ + int i, min, argmin; + + min = INT_MAX; + argmin = 0; + for (i = start; i < end; ++i) { + int diff = diff_window[i]; + + if (diff < threshold) { + min = diff; + argmin = i; + break; + } + if (diff < min) { + min = diff; + argmin = i; + } + } + return argmin; +} + +void +yin_write(yin_t *pe, int16 const *frame) +{ + int outptr, difflen; + + /* Rotate the window one frame forward. */ + ++pe->wstart; + /* Fill in the frame before wstart. */ + outptr = pe->wstart - 1; + /* Wrap around the window pointer. */ + if (pe->wstart == pe->wsize) + pe->wstart = 0; + + /* Now calculate normalized difference function. */ + difflen = pe->frame_size / 2; + cmn_diff(frame, pe->diff_window[outptr], difflen); + + /* Find the first point under threshold. If not found, then + * use the absolute minimum. */ + pe->period_window[outptr] + = thresholded_search(pe->diff_window[outptr], + pe->search_threshold, 0, difflen); + + /* Increment total number of frames. */ + ++pe->nfr; +} + +int +yin_read(yin_t *pe, uint16 *out_period, uint16 *out_bestdiff) +{ + int wstart, wlen, half_wsize, i; + int best, best_diff, search_width, low_period, high_period; + + half_wsize = (pe->wsize-1)/2; + /* Without any smoothing, just return the current value (don't + * need to do anything to the current pointer either). */ + if (half_wsize == 0) { + if (pe->endut) + return 0; + *out_period = pe->period_window[0]; + *out_bestdiff = pe->diff_window[0][pe->period_window[0]]; + return 1; + } + + /* We can't do anything unless we have at least (wsize-1)/2 + 1 + * frames, unless we're at the end of the utterance. */ + if (pe->endut == 0 && pe->nfr < half_wsize + 1) { + /* Don't increment the current pointer either. */ + return 0; + } + + /* Establish the smoothing window. */ + /* End of utterance. */ + if (pe->endut) { + /* We are done (no more data) when pe->wcur = pe->wstart. */ + if (pe->wcur == pe->wstart) + return 0; + /* I.e. pe->wcur (circular minus) half_wsize. */ + wstart = (pe->wcur + pe->wsize - half_wsize) % pe->wsize; + /* Number of frames from wstart up to pe->wstart. */ + wlen = pe->wstart - wstart; + if (wlen < 0) wlen += pe->wsize; + /*printf("ENDUT! ");*/ + } + /* Beginning of utterance. */ + else if (pe->nfr < pe->wsize) { + wstart = 0; + wlen = pe->nfr; + } + /* Normal case, it is what it is. */ + else { + wstart = pe->wstart; + wlen = pe->wsize; + } + + /* Now (finally) look for the best local estimate. */ + /* printf("Searching for local estimate in %d frames around %d\n", + wlen, pe->nfr + 1 - wlen); */ + best = pe->period_window[pe->wcur]; + best_diff = pe->diff_window[pe->wcur][best]; + for (i = 0; i < wlen; ++i) { + int j = wstart + i; + int diff; + + j %= pe->wsize; + diff = pe->diff_window[j][pe->period_window[j]]; + /* printf("%.2f,%.2f ", 1.0 - (double)diff/32768, + pe->period_window[j] ? 8000.0/pe->period_window[j] : 8000.0); */ + if (diff < best_diff) { + best_diff = diff; + best = pe->period_window[j]; + } + } + /* printf("best: %.2f, %.2f\n", 1.0 - (double)best_diff/32768, + best ? 8000.0/best : 8000.0); */ + /* If it's the same as the current one then return it. */ + if (best == pe->period_window[pe->wcur]) { + /* Increment the current pointer. */ + if (++pe->wcur == pe->wsize) + pe->wcur = 0; + *out_period = best; + *out_bestdiff = best_diff; + return 1; + } + /* Otherwise, redo the search inside a narrower range. */ + search_width = best * pe->search_range / 32768; + /* printf("Search width = %d * %.2f = %d\n", + best, (double)pe->search_range/32768, search_width); */ + if (search_width == 0) search_width = 1; + low_period = best - search_width; + high_period = best + search_width; + if (low_period < 0) low_period = 0; + if (high_period > pe->frame_size / 2) high_period = pe->frame_size / 2; + /* printf("Searching from %d to %d\n", low_period, high_period); */ + best = thresholded_search(pe->diff_window[pe->wcur], + pe->search_threshold, + low_period, high_period); + best_diff = pe->diff_window[pe->wcur][best]; + + if (out_period) + *out_period = (best > 32768) ? 32768 : best; + if (out_bestdiff) + *out_bestdiff = (best_diff > 32768) ? 32768 : best_diff; + + /* Increment the current pointer. */ + if (++pe->wcur == pe->wsize) + pe->wcur = 0; + return 1; +} diff --git a/src/fe/yin.h b/src/fe/yin.h new file mode 100644 index 0000000..9cfd287 --- /dev/null +++ b/src/fe/yin.h @@ -0,0 +1,115 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* + * Copyright (c) 2008 Beyond Access, Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY BEYOND ACCESS, INC. ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BEYOND ACCESS, INC. NOR + * ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file yin.h + * @brief Implementation of pitch estimation + * @author David Huggins-Daines + * + * This implements part of the YIN algorithm: + * + * "YIN, a fundamental frequency estimator for speech and music". + * Alain de Cheveigné and Hideki Kawahara. Journal of the Acoustical + * Society of America, 111 (4), April 2002. + */ + +#ifndef __YIN_H__ +#define __YIN_H__ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} /* Fool Emacs. */ +#endif + +#include +#include + +/** + * Frame-based moving-window pitch estimator. + */ +typedef struct yin_s yin_t; + +/** + * Initialize moving-window pitch estimation. + */ +POCKETSPHINX_EXPORT +yin_t *yin_init(int frame_size, float search_threshold, + float search_range, int smooth_window); + +/** + * Free a moving-window pitch estimator. + */ +POCKETSPHINX_EXPORT +void yin_free(yin_t *pe); + +/** + * Start processing an utterance. + */ +POCKETSPHINX_EXPORT +void yin_start(yin_t *pe); + +/** + * Mark the end of an utterance. + */ +POCKETSPHINX_EXPORT +void yin_end(yin_t *pe); + +/** + * Feed a frame of data to the pitch estimator. + * + * @param pe Pitch estimator. + * @param frame Frame of frame_size (see + * yin_init()) samples of audio data. + */ +POCKETSPHINX_EXPORT +void yin_write(yin_t *pe, int16 const *frame); + +/** + * Read a raw estimated pitch value from the pitch estimator. + * + * @param pe Pitch estimator. + * @param out_period Output: an estimate of the period (*not* the pitch) + * of the signal in samples. + * @param out_bestdiff Output: the minimum normalized difference value + * associated with *out_pitch, in Q15 + * format (i.e. scaled by 32768). This can be + * interpreted as one minus the probability of voicing. + * @return Non-zero if enough data was available to return a pitch + * estimate, zero otherwise. + */ +POCKETSPHINX_EXPORT +int yin_read(yin_t *pe, uint16 *out_period, uint16 *out_bestdiff); + +#ifdef __cplusplus +} +#endif + +#endif /* __YIN_H__ */ diff --git a/src/feat/agc.c b/src/feat/agc.c new file mode 100644 index 0000000..78ce04f --- /dev/null +++ b/src/feat/agc.c @@ -0,0 +1,228 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * agc.c -- Various forms of automatic gain control (AGC) + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1996 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log$ + * Revision 1.5 2005/06/21 19:25:41 arthchan2003 + * 1, Fixed doxygen documentation. 2, Added $ keyword. + * + * Revision 1.3 2005/03/30 01:22:46 archan + * Fixed mistakes in last updates. Add + * + * + * 04-Nov-95 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created. + */ + +#include +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "util/ckd_alloc.h" +#include "feat/agc.h" + +/* NOTE! These must match the enum in agc.h */ +const char *agc_type_str[] = { + "none", + "max", + "emax", + "noise" +}; +static const int n_agc_type_str = sizeof(agc_type_str)/sizeof(agc_type_str[0]); + +agc_type_t +agc_type_from_str(const char *str) +{ + int i; + + for (i = 0; i < n_agc_type_str; ++i) { + if (0 == strcmp(str, agc_type_str[i])) + return (agc_type_t)i; + } + E_FATAL("Unknown AGC type '%s'\n", str); + return AGC_NONE; +} + +agc_t *agc_init(void) +{ + agc_t *agc; + agc = ckd_calloc(1, sizeof(*agc)); + agc->noise_thresh = FLOAT2MFCC(2.0); + + return agc; +} + +void agc_free(agc_t *agc) +{ + ckd_free(agc); +} + +/** + * Normalize c0 for all frames such that max(c0) = 0. + */ +void +agc_max(agc_t *agc, mfcc_t **mfc, int32 n_frame) +{ + int32 i; + + if (n_frame <= 0) + return; + agc->obs_max = mfc[0][0]; + for (i = 1; i < n_frame; i++) { + if (mfc[i][0] > agc->obs_max) { + agc->obs_max = mfc[i][0]; + agc->obs_frame = 1; + } + } + + E_INFO("AGCMax: obs=max= %.2f\n", agc->obs_max); + for (i = 0; i < n_frame; i++) + mfc[i][0] -= agc->obs_max; +} + +void +agc_emax_set(agc_t *agc, float32 m) +{ + agc->max = FLOAT2MFCC(m); + E_INFO("AGCEMax: max= %.2f\n", m); +} + +float32 +agc_emax_get(agc_t *agc) +{ + return MFCC2FLOAT(agc->max); +} + +void +agc_emax(agc_t *agc, mfcc_t **mfc, int32 n_frame) +{ + int i; + + if (n_frame <= 0) + return; + for (i = 0; i < n_frame; ++i) { + if (mfc[i][0] > agc->obs_max) { + agc->obs_max = mfc[i][0]; + agc->obs_frame = 1; + } + mfc[i][0] -= agc->max; + } +} + +/* Update estimated max for next utterance */ +void +agc_emax_update(agc_t *agc) +{ + if (agc->obs_frame) { /* Update only if some data observed */ + agc->obs_max_sum += agc->obs_max; + agc->obs_utt++; + + /* Re-estimate max over past history; decay the history */ + agc->max = agc->obs_max_sum / agc->obs_utt; + if (agc->obs_utt == 16) { + agc->obs_max_sum /= 2; + agc->obs_utt = 8; + } + } + E_INFO("AGCEMax: obs= %.2f, new= %.2f\n", agc->obs_max, agc->max); + + /* Reset the accumulators for the next utterance. */ + agc->obs_frame = 0; + agc->obs_max = FLOAT2MFCC(-1000.0); /* Less than any real C0 value (hopefully!!) */ +} + +void +agc_noise(agc_t *agc, + mfcc_t **cep, + int32 nfr) +{ + mfcc_t min_energy; /* Minimum log-energy */ + mfcc_t noise_level; /* Average noise_level */ + int32 i; /* frame index */ + int32 noise_frames; /* Number of noise frames */ + + /* Determine minimum log-energy in utterance */ + min_energy = cep[0][0]; + for (i = 0; i < nfr; ++i) { + if (cep[i][0] < min_energy) + min_energy = cep[i][0]; + } + + /* Average all frames between min_energy and min_energy + agc->noise_thresh */ + noise_frames = 0; + noise_level = 0; + min_energy += agc->noise_thresh; + for (i = 0; i < nfr; ++i) { + if (cep[i][0] < min_energy) { + noise_level += cep[i][0]; + noise_frames++; + } + } + + if (noise_frames > 0) { + noise_level /= noise_frames; + E_INFO("AGC NOISE: max= %6.3f\n", MFCC2FLOAT(noise_level)); + /* Subtract noise_level from all log_energy values */ + for (i = 0; i < nfr; i++) { + cep[i][0] -= noise_level; + } + } +} + +void +agc_set_threshold(agc_t *agc, float32 threshold) +{ + agc->noise_thresh = FLOAT2MFCC(threshold); +} + +float32 +agc_get_threshold(agc_t *agc) +{ + return FLOAT2MFCC(agc->noise_thresh); +} diff --git a/src/feat/agc.h b/src/feat/agc.h new file mode 100644 index 0000000..fbf7e9c --- /dev/null +++ b/src/feat/agc.h @@ -0,0 +1,187 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * agc.h -- Various forms of automatic gain control (AGC) + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log$ + * Revision 1.1 2006/04/05 20:27:30 dhdfu + * A Great Reorganzation of header files and executables + * + * Revision 1.8 2005/06/21 19:25:41 arthchan2003 + * 1, Fixed doxygen documentation. 2, Added $ keyword. + * + * Revision 1.4 2005/06/13 04:02:56 archan + * Fixed most doxygen-style documentation under libs3decoder. + * + * Revision 1.3 2005/03/30 01:22:46 archan + * Fixed mistakes in last updates. Add + * + * + * 28-Apr-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Copied from previous version. + */ + + +#ifndef _S3_AGC_H_ +#define _S3_AGC_H_ + +#include +#include "fe/fe.h" + +/** \file agc.h + * \brief routine that implements automatic gain control + * + * \warning This function may not be fully compatible with + * SphinxTrain's family of AGC. + * + * This implements AGC. + */ +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Types of acoustic gain control to apply to the features. + */ +typedef enum agc_type_e { + AGC_NONE = 0, + AGC_MAX, + AGC_EMAX, + AGC_NOISE +} agc_type_t; + +/** Convert string representation (from command-line) to agc_type_t */ +agc_type_t agc_type_from_str(const char *str); + +/** String representations of agc_type_t values. */ +extern const char *agc_type_str[]; + +/** + * Structure holding data for doing AGC. + **/ +typedef struct agc_s { + mfcc_t max; /**< Estimated max for current utterance (for AGC_EMAX) */ + mfcc_t obs_max; /**< Observed max in current utterance */ + int32 obs_frame; /**< Whether any data was observed after prev update */ + int32 obs_utt; /**< Whether any utterances have been observed */ + mfcc_t obs_max_sum; + mfcc_t noise_thresh; /**< Noise threshold (for AGC_NOISE only) */ +} agc_t; + +/** + * Initialize AGC structure with default values. + */ +agc_t *agc_init(void); + +/** + * Free AGC structure. + */ +void agc_free(agc_t *agc); + +/** + * Apply AGC to the given mfc vectors (normalize all C0 mfc coefficients in the given + * input such that the max C0 value is 0, by subtracting the input max C0 from all). + * This function operates on an entire utterance at a time. Hence, the entire utterance + * must be available beforehand (batchmode). + */ +void agc_max(agc_t *agc, /**< In: AGC structure (not used) */ + mfcc_t **mfc, /**< In/Out: mfc[f] = cepstrum vector in frame f */ + int32 n_frame /**< In: number of frames of cepstrum vectors supplied */ + ); + +/** + * Apply AGC to the given block of MFC vectors. + * Unlike agc_max() this does not require the entire utterance to be + * available. Call agc_emax_update() at the end of each utterance to + * update the AGC parameters. */ +void agc_emax(agc_t *agc, /**< In: AGC structure */ + mfcc_t **mfc, /**< In/Out: mfc[f] = cepstrum vector in frame f */ + int32 n_frame /**< In: number of frames of cepstrum vectors supplied */ + ); + +/** + * Update AGC parameters for next utterance. + **/ +void agc_emax_update(agc_t *agc /**< In: AGC structure */ + ); + +/** + * Get the current AGC maximum estimate. + **/ +float32 agc_emax_get(agc_t *agc); + +/** + * Set the current AGC maximum estimate. + **/ +void agc_emax_set(agc_t *agc, float32 m); + +/** + * Apply AGC using noise threshold to the given block of MFC vectors. + **/ +void agc_noise(agc_t *agc, /**< In: AGC structure */ + mfcc_t **mfc, /**< In/Out: mfc[f] = cepstrum vector in frame f */ + int32 n_frame /**< In: number of frames of cepstrum vectors supplied */ + ); + +/** + * Get the current AGC noise threshold. + **/ +float32 agc_get_threshold(agc_t *agc); + +/** + * Set the current AGC noise threshold. + **/ +void agc_set_threshold(agc_t *agc, float32 threshold); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/feat/cmn.c b/src/feat/cmn.c new file mode 100644 index 0000000..5cfd253 --- /dev/null +++ b/src/feat/cmn.c @@ -0,0 +1,258 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * cmn.c -- Various forms of cepstral mean normalization + */ + +#include +#include +#include +#include +#include +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef _MSC_VER +#pragma warning (disable: 4244) +#endif + +#include + +#include "util/ckd_alloc.h" +#include "util/strfuncs.h" +#include "feat/cmn.h" +#include "feat/feat.h" + +/* NOTE! These must match the enum in cmn.h */ +const char *cmn_type_str[] = { + "none", + "batch", + "live" +}; +const char *cmn_alt_type_str[] = { + "none", + "current", + "prior" +}; +static const int n_cmn_type_str = sizeof(cmn_type_str)/sizeof(cmn_type_str[0]); + +cmn_type_t +cmn_type_from_str(const char *str) +{ + int i; + + for (i = 0; i < n_cmn_type_str; ++i) { + if (0 == strcmp(str, cmn_type_str[i]) || 0 == strcmp(str, cmn_alt_type_str[i])) + return (cmn_type_t)i; + } + E_FATAL("Unknown CMN type '%s'\n", str); + return CMN_NONE; +} + +const char * +cmn_update_repr(cmn_t *cmn) +{ + char *ptr; + int i, len; + + len = 0; + for (i = 0; i < cmn->veclen; ++i) { + int nbytes = snprintf(NULL, 0, "%g,", MFCC2FLOAT(cmn->cmn_mean[i])); + if (nbytes <= 0) { + E_ERROR_SYSTEM("Failed to format %g for cmninit", MFCC2FLOAT(cmn->cmn_mean[i])); + return NULL; + } + len += nbytes; + } + len++; + if (cmn->repr) + ckd_free(cmn->repr); + ptr = cmn->repr = ckd_malloc(len); + if (ptr == NULL) { + E_ERROR_SYSTEM("Failed to allocate %d bytes for cmn string", len); + return NULL; + } + for (i = 0; i < cmn->veclen; ++i) + ptr += snprintf(ptr, cmn->repr + len - ptr, "%g,", + MFCC2FLOAT(cmn->cmn_mean[i])); + *--ptr = '\0'; + + return cmn->repr; +} + +int +cmn_set_repr(cmn_t *cmn, const char *repr) +{ + char *c, *cc, *vallist; + int32 nvals; + + E_INFO("Update from < %s >\n", cmn->repr); + memset(cmn->cmn_mean, 0, sizeof(cmn->cmn_mean[0]) * cmn->veclen); + memset(cmn->sum, 0, sizeof(cmn->sum[0]) * cmn->veclen); + vallist = ckd_salloc(repr); + c = vallist; + nvals = 0; + while (nvals < cmn->veclen + && (cc = strchr(c, ',')) != NULL) { + *cc = '\0'; + cmn->cmn_mean[nvals] = FLOAT2MFCC(atof_c(c)); + cmn->sum[nvals] = cmn->cmn_mean[nvals] * CMN_WIN; + c = cc + 1; + ++nvals; + } + if (nvals < cmn->veclen && *c != '\0') { + cmn->cmn_mean[nvals] = FLOAT2MFCC(atof_c(c)); + cmn->sum[nvals] = cmn->cmn_mean[nvals] * CMN_WIN; + } + ckd_free(vallist); + cmn->nframe = CMN_WIN; + E_INFO("Update to < %s >\n", cmn_update_repr(cmn)); + return 0; +} + +cmn_t * +cmn_init(int32 veclen) +{ + cmn_t *cmn; + cmn = (cmn_t *) ckd_calloc(1, sizeof(cmn_t)); + cmn->refcount = 1; + cmn->veclen = veclen; + cmn->cmn_mean = (mfcc_t *) ckd_calloc(veclen, sizeof(mfcc_t)); + cmn->cmn_var = (mfcc_t *) ckd_calloc(veclen, sizeof(mfcc_t)); + cmn->sum = (mfcc_t *) ckd_calloc(veclen, sizeof(mfcc_t)); + cmn->nframe = 0; + cmn_update_repr(cmn); + + return cmn; +} + + +void +cmn(cmn_t *cmn, mfcc_t ** mfc, int32 varnorm, int32 n_frame) +{ + mfcc_t *mfcp; + mfcc_t t; + int32 i, f; + + assert(mfc != NULL); + + if (n_frame <= 0) + return; + + /* If cmn->cmn_mean wasn't NULL, we need to zero the contents */ + memset(cmn->cmn_mean, 0, cmn->veclen * sizeof(mfcc_t)); + memset(cmn->sum, 0, cmn->veclen * sizeof(mfcc_t)); + + /* Find mean cep vector for this utterance */ + for (f = 0, cmn->nframe = 0; f < n_frame; f++) { + mfcp = mfc[f]; + + /* Skip zero energy frames */ + if (mfcp[0] < 0) + continue; + + for (i = 0; i < cmn->veclen; i++) { + cmn->sum[i] += mfcp[i]; + } + + cmn->nframe++; + } + + for (i = 0; i < cmn->veclen; i++) { + cmn->cmn_mean[i] = cmn->sum[i] / cmn->nframe; + } + + E_INFO("CMN: %s\n", cmn_update_repr(cmn)); + if (!varnorm) { + /* Subtract mean from each cep vector */ + for (f = 0; f < n_frame; f++) { + mfcp = mfc[f]; + for (i = 0; i < cmn->veclen; i++) + mfcp[i] -= cmn->cmn_mean[i]; + } + } + else { + /* Scale cep vectors to have unit variance along each dimension, and subtract means */ + /* If cmn->cmn_var wasn't NULL, we need to zero the contents */ + memset(cmn->cmn_var, 0, cmn->veclen * sizeof(mfcc_t)); + + for (f = 0; f < n_frame; f++) { + mfcp = mfc[f]; + + for (i = 0; i < cmn->veclen; i++) { + t = mfcp[i] - cmn->cmn_mean[i]; + cmn->cmn_var[i] += MFCCMUL(t, t); + } + } + for (i = 0; i < cmn->veclen; i++) + /* Inverse Std. Dev, RAH added type case from sqrt */ + cmn->cmn_var[i] = FLOAT2MFCC(sqrt((float64)n_frame / MFCC2FLOAT(cmn->cmn_var[i]))); + + for (f = 0; f < n_frame; f++) { + mfcp = mfc[f]; + for (i = 0; i < cmn->veclen; i++) + mfcp[i] = MFCCMUL((mfcp[i] - cmn->cmn_mean[i]), cmn->cmn_var[i]); + } + } +} + +int +cmn_free(cmn_t * cmn) +{ + if (cmn == NULL) + return 0; + if (--cmn->refcount > 0) + return cmn->refcount; + if (cmn->cmn_var) + ckd_free(cmn->cmn_var); + if (cmn->cmn_mean) + ckd_free(cmn->cmn_mean); + if (cmn->sum) + ckd_free(cmn->sum); + if (cmn->repr) + ckd_free(cmn->repr); + ckd_free(cmn); + return 0; +} + +cmn_t * +cmn_retain(cmn_t *cmn) +{ + ++cmn->refcount; + return cmn; +} diff --git a/src/feat/cmn.h b/src/feat/cmn.h new file mode 100644 index 0000000..46b9c9b --- /dev/null +++ b/src/feat/cmn.h @@ -0,0 +1,198 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * cmn.h -- Various forms of cepstral mean normalization + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log$ + * Revision 1.1 2006/04/05 20:27:30 dhdfu + * A Great Reorganzation of header files and executables + * + * Revision 1.13 2006/02/23 03:48:27 arthchan2003 + * Resolved conflict in cmn.h + * + * + * Revision 1.12 2006/02/22 23:43:55 arthchan2003 + * Merged from the branch SPHINX3_5_2_RCI_IRII_BRANCH: Put data structure into the cmn_t structure. + * + * Revision 1.11.4.2 2005/10/17 04:45:57 arthchan2003 + * Free stuffs in cmn and feat correctly. + * + * Revision 1.11.4.1 2005/07/05 06:25:08 arthchan2003 + * Fixed dox-doc. + * + * Revision 1.11 2005/06/21 19:28:00 arthchan2003 + * 1, Fixed doxygen documentation. 2, Added $ keyword. + * + * Revision 1.4 2005/06/13 04:02:56 archan + * Fixed most doxygen-style documentation under libs3decoder. + * + * Revision 1.3 2005/03/30 01:22:46 archan + * Fixed mistakes in last updates. Add + * + * + * 20.Apr.2001 RAH (rhoughton@mediasite.com, ricky.houghton@cs.cmu.edu) + * Added cmn_free() and moved *mean and *var out global space and named them cmn_mean and cmn_var + * + * 28-Apr-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Copied from previous version. + */ + + +#ifndef _S3_CMN_H_ +#define _S3_CMN_H_ + +#include "fe/fe.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** \file cmn.h + * \brief Apply Cepstral Mean Normalization (CMN) to the set of input mfc frames. + * + * By subtractingthe mean of the input from each frame. C0 is also included in this process. + * This function operates on an entire utterance at a time. Hence, the entire utterance + * must be available beforehand (batchmode). + */ + +/** + * Types of cepstral mean normalization to apply to the features. + */ +typedef enum cmn_type_e { + CMN_NONE = 0, + CMN_BATCH, + CMN_LIVE +} cmn_type_t; + +/** String representations of cmn_type_t values. */ +extern const char *cmn_type_str[]; + +/** Convert string representation (from command-line) to cmn_type_t */ +cmn_type_t cmn_type_from_str(const char *str); + +/** \struct cmn_t + * \brief wrapper of operation of the cepstral mean normalization. + */ + +typedef struct { + mfcc_t *cmn_mean; /**< Current means */ + mfcc_t *cmn_var; /**< Stored cmn variance */ + mfcc_t *sum; /**< Accumulated cepstra for computing mean */ + int32 nframe; /**< Number of frames */ + int32 veclen; /**< Length of cepstral vector */ + char *repr; /**< String representation of current means */ + int refcount; +} cmn_t; + +cmn_t* cmn_init(int32 veclen); + +/** + * CMN for the whole sentence +*/ +void cmn (cmn_t *cmn, /**< In/Out: cmn normalization, which contains the cmn_mean and cmn_var) */ + mfcc_t **mfc, /**< In/Out: mfc[f] = mfc vector in frame f */ + int32 varnorm,/**< In: if not FALSE, variance normalize the input vectors + to have unit variance (along each dimension independently); + Irrelevant if no cmn is performed */ + int32 n_frame /**< In: Number of frames of mfc vectors */ + ); + +#define CMN_WIN_HWM 800 /* #frames after which window shifted */ +#define CMN_WIN 500 + +/** + * CMN for one block of data, using live mean + */ +void cmn_live(cmn_t *cmn, /**< In/Out: cmn normalization, which contains + the cmn_mean and cmn_var) */ + mfcc_t **incep, /**< In/Out: mfc[f] = mfc vector in frame f*/ + int32 varnorm, /**< This flag should always be 0 for live */ + int32 nfr /**< Number of incoming frames */ + ); + +/** + * Update live mean based on observed data + */ +void cmn_live_update(cmn_t *cmn); + +/** + * Set live mean from a vector of length cmn->veclen + */ +void cmn_live_set(cmn_t *cmn, mfcc_t const * vec); + +/** + * Get the string representation of the live mean. + */ +#define cmn_repr(cmn) (cmn)->repr + +/** + * Update the string representation. + */ +const char *cmn_update_repr(cmn_t *cmn); + +/** + * Set the live mean from a string. + */ +int cmn_set_repr(cmn_t *cmn, char const *repr); + +/** + * Retain a CMN. + */ +cmn_t *cmn_retain(cmn_t *cmn); + +/** + * Release a CMN, possibly freeing it. + */ +int cmn_free (cmn_t *cmn); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/feat/cmn_live.c b/src/feat/cmn_live.c new file mode 100644 index 0000000..015ecee --- /dev/null +++ b/src/feat/cmn_live.c @@ -0,0 +1,140 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef _MSC_VER +#pragma warning (disable: 4244) +#endif + +#include + +#include "util/ckd_alloc.h" +#include "feat/cmn.h" + +void +cmn_live_set(cmn_t *cmn, mfcc_t const * vec) +{ + int32 i; + + E_INFO("Update from < %s >\n", cmn->repr); + for (i = 0; i < cmn->veclen; i++) { + cmn->cmn_mean[i] = vec[i]; + cmn->sum[i] = vec[i] * CMN_WIN; + } + cmn->nframe = CMN_WIN; + E_INFO("Update to < %s >\n", cmn_update_repr(cmn)); +} + +static void +cmn_live_shiftwin(cmn_t *cmn) +{ + mfcc_t sf; + int32 i; + + E_INFO("Update from < %s >\n", cmn->repr); + sf = FLOAT2MFCC(1.0) / cmn->nframe; + for (i = 0; i < cmn->veclen; i++) + cmn->cmn_mean[i] = cmn->sum[i] / cmn->nframe; /* sum[i] * sf */ + + /* Make the accumulation decay exponentially */ + if (cmn->nframe >= CMN_WIN_HWM) { + sf = CMN_WIN * sf; + for (i = 0; i < cmn->veclen; i++) + cmn->sum[i] = MFCCMUL(cmn->sum[i], sf); + cmn->nframe = CMN_WIN; + } + E_INFO("Update to < %s >\n", cmn_update_repr(cmn)); +} + +void +cmn_live_update(cmn_t *cmn) +{ + mfcc_t sf; + int32 i; + + if (cmn->nframe <= 0) + return; + + E_INFO("Update from < %s >\n", cmn->repr); + /* Update mean buffer */ + sf = FLOAT2MFCC(1.0) / cmn->nframe; + for (i = 0; i < cmn->veclen; i++) + cmn->cmn_mean[i] = cmn->sum[i] / cmn->nframe; /* sum[i] * sf; */ + + /* Make the accumulation decay exponentially */ + if (cmn->nframe > CMN_WIN_HWM) { + sf = CMN_WIN * sf; + for (i = 0; i < cmn->veclen; i++) + cmn->sum[i] = MFCCMUL(cmn->sum[i], sf); + cmn->nframe = CMN_WIN; + } + E_INFO("Update to < %s >\n", cmn_update_repr(cmn)); +} + +void +cmn_live(cmn_t *cmn, mfcc_t **incep, int32 varnorm, int32 nfr) +{ + int32 i, j; + + if (nfr <= 0) + return; + + if (varnorm) + E_FATAL + ("Variance normalization not implemented in live mode decode\n"); + + for (i = 0; i < nfr; i++) { + + /* Skip zero energy frames */ + if (incep[i][0] < 0) + continue; + + for (j = 0; j < cmn->veclen; j++) { + cmn->sum[j] += incep[i][j]; + incep[i][j] -= cmn->cmn_mean[j]; + } + + ++cmn->nframe; + } + + /* Shift buffer down if we have more than CMN_WIN_HWM frames */ + if (cmn->nframe > CMN_WIN_HWM) + cmn_live_shiftwin(cmn); +} diff --git a/src/feat/feat.c b/src/feat/feat.c new file mode 100644 index 0000000..6076f59 --- /dev/null +++ b/src/feat/feat.c @@ -0,0 +1,1497 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * feat.c -- Feature vector description and cepstra->feature computation. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1996 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log$ + * Revision 1.22 2006/02/23 03:59:40 arthchan2003 + * Merged from branch SPHINX3_5_2_RCI_IRII_BRANCH: a, Free buffers correctly. b, Fixed dox-doc. + * + * Revision 1.21.4.3 2005/10/17 04:45:57 arthchan2003 + * Free stuffs in cmn and feat correctly. + * + * Revision 1.21.4.2 2005/09/26 02:19:57 arthchan2003 + * Add message to show the directory which the feature is searched for. + * + * Revision 1.21.4.1 2005/07/03 22:55:50 arthchan2003 + * More correct deallocation in feat.c. The cmn deallocation is still not correct at this point. + * + * Revision 1.21 2005/06/22 03:29:35 arthchan2003 + * Makefile.am s for all subdirectory of libs3decoder/ + * + * Revision 1.4 2005/04/21 23:50:26 archan + * Some more refactoring on the how reporting of structures inside kbcore_t is done, it is now 50% nice. Also added class-based LM test case into test-decode.sh.in. At this moment, everything in search mode 5 is already done. It is time to test the idea whether the search can really be used. + * + * Revision 1.3 2005/03/30 01:22:46 archan + * Fixed mistakes in last updates. Add + * + * + * 20.Apr.2001 RAH (rhoughton@mediasite.com, ricky.houghton@cs.cmu.edu) + * Adding feat_free() to free allocated memory + * + * 02-Jan-2001 Rita Singh (rsingh@cs.cmu.edu) at Carnegie Mellon University + * Modified feat_s2mfc2feat_block() to handle empty buffers at + * the end of an utterance + * + * 30-Dec-2000 Rita Singh (rsingh@cs.cmu.edu) at Carnegie Mellon University + * Added feat_s2mfc2feat_block() to allow feature computation + * from sequences of blocks of cepstral vectors + * + * 12-Jun-98 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Major changes to accommodate arbitrary feature input types. Added + * feat_read(), moved various cep2feat functions from other files into + * this one. Also, made this module object-oriented with the feat_t type. + * Changed definition of s2mfc_read to let the caller manage MFC buffers. + * + * 03-Oct-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added unistd.h include. + * + * 02-Oct-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added check for sf argument to s2mfc_read being within file size. + * + * 18-Sep-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added sf, ef parameters to s2mfc_read(). + * + * 10-Jan-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added feat_cepsize(). + * Added different feature-handling (s2_4x, s3_1x39 at this point). + * Moved feature-dependent functions to feature-dependent files. + * + * 09-Jan-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Moved constant declarations from feat.h into here. + * + * 04-Nov-95 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created. + */ + + +/* + * This module encapsulates different feature streams used by the Sphinx group. New + * stream types can be added by augmenting feat_init() and providing an accompanying + * compute_feat function. It also provides a "generic" feature vector definition for + * handling "arbitrary" speech input feature types (see the last section in feat_init()). + * In this case the speech input data should already be feature vectors; no computation, + * such as MFC->feature conversion, is available or needed. + */ + +#include +#include +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef _MSC_VER +#pragma warning (disable: 4244 4996) +#endif + +#include + +#include "fe/fe.h" +#include "feat/feat.h" +#include "util/bio.h" +#include "util/pio.h" +#include "feat/cmn.h" +#include "feat/agc.h" +#include "util/ckd_alloc.h" +#include "util/glist.h" + +#define FEAT_VERSION "1.0" +#define FEAT_DCEP_WIN 2 + +#ifdef DUMP_FEATURES +static void +cep_dump_dbg(feat_t *fcb, mfcc_t **mfc, int32 nfr, const char *text) +{ + int32 i, j; + + E_INFO("%s\n", text); + for (i = 0; i < nfr; i++) { + for (j = 0; j < fcb->cepsize; j++) { + fprintf(stderr, "%f ", MFCC2FLOAT(mfc[i][j])); + } + fprintf(stderr, "\n"); + } +} +static void +feat_print_dbg(feat_t *fcb, mfcc_t ***feat, int32 nfr, const char *text) +{ + E_INFO("%s\n", text); + feat_print(fcb, feat, nfr, stderr); +} +#else /* !DUMP_FEATURES */ +#define cep_dump_dbg(fcb,mfc,nfr,text) +#define feat_print_dbg(fcb,mfc,nfr,text) +#endif + +int32 ** +parse_subvecs(char const *str) +{ + char const *strp; + int32 n, n2, l; + glist_t dimlist; /* List of dimensions in one subvector */ + glist_t veclist; /* List of dimlists (subvectors) */ + int32 **subvec; + gnode_t *gn, *gn2; + + veclist = NULL; + + strp = str; + for (;;) { + dimlist = NULL; + + for (;;) { + if (sscanf(strp, "%d%n", &n, &l) != 1) + E_FATAL("'%s': Couldn't read int32 @pos %d\n", str, + strp - str); + strp += l; + + if (*strp == '-') { + strp++; + + if (sscanf(strp, "%d%n", &n2, &l) != 1) + E_FATAL("'%s': Couldn't read int32 @pos %d\n", str, + strp - str); + strp += l; + } + else + n2 = n; + + if ((n < 0) || (n > n2)) + E_FATAL("'%s': Bad subrange spec ending @pos %d\n", str, + strp - str); + + for (; n <= n2; n++) { + gnode_t *gn; + for (gn = dimlist; gn; gn = gnode_next(gn)) + if (gnode_int32(gn) == n) + break; + if (gn != NULL) + E_FATAL("'%s': Duplicate dimension ending @pos %d\n", + str, strp - str); + + dimlist = glist_add_int32(dimlist, n); + } + + if ((*strp == '\0') || (*strp == '/')) + break; + + if (*strp != ',') + E_FATAL("'%s': Bad delimiter @pos %d\n", str, strp - str); + + strp++; + } + + veclist = glist_add_ptr(veclist, (void *) dimlist); + + if (*strp == '\0') + break; + + assert(*strp == '/'); + strp++; + } + + /* Convert the glists to arrays; remember the glists are in reverse order of the input! */ + n = glist_count(veclist); /* #Subvectors */ + subvec = (int32 **) ckd_calloc(n + 1, sizeof(int32 *)); /* +1 for sentinel */ + subvec[n] = NULL; /* sentinel */ + + for (--n, gn = veclist; (n >= 0) && gn; gn = gnode_next(gn), --n) { + gn2 = (glist_t) gnode_ptr(gn); + + n2 = glist_count(gn2); /* Length of this subvector */ + if (n2 <= 0) + E_FATAL("'%s': 0-length subvector\n", str); + + subvec[n] = (int32 *) ckd_calloc(n2 + 1, sizeof(int32)); /* +1 for sentinel */ + subvec[n][n2] = -1; /* sentinel */ + + for (--n2; (n2 >= 0) && gn2; gn2 = gnode_next(gn2), --n2) + subvec[n][n2] = gnode_int32(gn2); + assert((n2 < 0) && (!gn2)); + } + assert((n < 0) && (!gn)); + + /* Free the glists */ + for (gn = veclist; gn; gn = gnode_next(gn)) { + gn2 = (glist_t) gnode_ptr(gn); + glist_free(gn2); + } + glist_free(veclist); + + return subvec; +} + +void +subvecs_free(int32 **subvecs) +{ + int32 **sv; + + for (sv = subvecs; sv && *sv; ++sv) + ckd_free(*sv); + ckd_free(subvecs); +} + +int +feat_set_subvecs(feat_t *fcb, int32 **subvecs) +{ + int32 **sv; + uint32 n_sv, n_dim, i; + + if (subvecs == NULL) { + subvecs_free(fcb->subvecs); + ckd_free(fcb->sv_buf); + ckd_free(fcb->sv_len); + fcb->n_sv = 0; + fcb->subvecs = NULL; + fcb->sv_len = NULL; + fcb->sv_buf = NULL; + fcb->sv_dim = 0; + return 0; + } + + if (fcb->n_stream != 1) { + E_ERROR("Subvector specifications require single-stream features!"); + return -1; + } + + n_sv = 0; + n_dim = 0; + for (sv = subvecs; sv && *sv; ++sv) { + int32 *d; + + for (d = *sv; d && *d != -1; ++d) { + ++n_dim; + } + ++n_sv; + } + if (n_dim > feat_dimension(fcb)) { + E_ERROR("Total dimensionality of subvector specification %d " + "> feature dimensionality %d\n", n_dim, feat_dimension(fcb)); + return -1; + } + + fcb->n_sv = n_sv; + fcb->subvecs = subvecs; + fcb->sv_len = (uint32 *)ckd_calloc(n_sv, sizeof(*fcb->sv_len)); + fcb->sv_buf = (mfcc_t *)ckd_calloc(n_dim, sizeof(*fcb->sv_buf)); + fcb->sv_dim = n_dim; + for (i = 0; i < n_sv; ++i) { + int32 *d; + for (d = subvecs[i]; d && *d != -1; ++d) { + ++fcb->sv_len[i]; + } + } + + return 0; +} + +/** + * Project feature components to subvectors (if any). + */ +static void +feat_subvec_project(feat_t *fcb, mfcc_t ***inout_feat, uint32 nfr) +{ + uint32 i; + + if (fcb->subvecs == NULL) + return; + for (i = 0; i < nfr; ++i) { + mfcc_t *out; + int32 j; + + out = fcb->sv_buf; + for (j = 0; j < fcb->n_sv; ++j) { + int32 *d; + for (d = fcb->subvecs[j]; d && *d != -1; ++d) { + *out++ = inout_feat[i][0][*d]; + } + } + memcpy(inout_feat[i][0], fcb->sv_buf, fcb->sv_dim * sizeof(*fcb->sv_buf)); + } +} + +mfcc_t *** +feat_array_alloc(feat_t * fcb, int32 nfr) +{ + int32 i, j, k; + mfcc_t *data, *d, ***feat; + + assert(fcb); + assert(nfr > 0); + assert(feat_dimension(fcb) > 0); + + /* Make sure to use the dimensionality of the features *before* + LDA and subvector projection. */ + k = 0; + for (i = 0; i < fcb->n_stream; ++i) + k += fcb->stream_len[i]; + assert((uint32)k >= feat_dimension(fcb)); + assert(k >= fcb->sv_dim); + + feat = + (mfcc_t ***) ckd_calloc_2d(nfr, feat_dimension1(fcb), sizeof(mfcc_t *)); + data = (mfcc_t *) ckd_calloc(nfr * k, sizeof(mfcc_t)); + + for (i = 0; i < nfr; i++) { + d = data + i * k; + for (j = 0; j < feat_dimension1(fcb); j++) { + feat[i][j] = d; + d += feat_dimension2(fcb, j); + } + } + + return feat; +} + +mfcc_t *** +feat_array_realloc(feat_t *fcb, mfcc_t ***old_feat, int32 ofr, int32 nfr) +{ + int32 i, k, cf; + mfcc_t*** new_feat; + + assert(fcb); + assert(nfr > 0); + assert(ofr > 0); + assert(feat_dimension(fcb) > 0); + + /* Make sure to use the dimensionality of the features *before* + LDA and subvector projection. */ + k = 0; + for (i = 0; i < fcb->n_stream; ++i) + k += fcb->stream_len[i]; + assert((uint32)k >= feat_dimension(fcb)); + assert(k >= fcb->sv_dim); + + new_feat = feat_array_alloc(fcb, nfr); + + cf = (nfr < ofr) ? nfr : ofr; + memcpy(new_feat[0][0], old_feat[0][0], cf * k * sizeof(mfcc_t)); + + feat_array_free(old_feat); + + return new_feat; +} + +void +feat_array_free(mfcc_t ***feat) +{ + ckd_free(feat[0][0]); + ckd_free_2d((void **)feat); +} + +static void +feat_s2_4x_cep2feat(feat_t * fcb, mfcc_t ** mfc, mfcc_t ** feat) +{ + mfcc_t *f; + mfcc_t *w, *_w; + mfcc_t *w1, *w_1, *_w1, *_w_1; + mfcc_t d1, d2; + int32 i, j; + + assert(fcb); + assert(feat_cepsize(fcb) == 13); + assert(feat_n_stream(fcb) == 4); + assert(feat_stream_len(fcb, 0) == 12); + assert(feat_stream_len(fcb, 1) == 24); + assert(feat_stream_len(fcb, 2) == 3); + assert(feat_stream_len(fcb, 3) == 12); + assert(feat_window_size(fcb) == 4); + + /* CEP; skip C0 */ + memcpy(feat[0], mfc[0] + 1, (feat_cepsize(fcb) - 1) * sizeof(mfcc_t)); + + /* + * DCEP(SHORT): mfc[2] - mfc[-2] + * DCEP(LONG): mfc[4] - mfc[-4] + */ + w = mfc[2] + 1; /* +1 to skip C0 */ + _w = mfc[-2] + 1; + + f = feat[1]; + for (i = 0; i < feat_cepsize(fcb) - 1; i++) /* Short-term */ + f[i] = w[i] - _w[i]; + + w = mfc[4] + 1; /* +1 to skip C0 */ + _w = mfc[-4] + 1; + + for (j = 0; j < feat_cepsize(fcb) - 1; i++, j++) /* Long-term */ + f[i] = w[j] - _w[j]; + + /* D2CEP: (mfc[3] - mfc[-1]) - (mfc[1] - mfc[-3]) */ + w1 = mfc[3] + 1; /* Final +1 to skip C0 */ + _w1 = mfc[-1] + 1; + w_1 = mfc[1] + 1; + _w_1 = mfc[-3] + 1; + + f = feat[3]; + for (i = 0; i < feat_cepsize(fcb) - 1; i++) { + d1 = w1[i] - _w1[i]; + d2 = w_1[i] - _w_1[i]; + + f[i] = d1 - d2; + } + + /* POW: C0, DC0, D2C0; differences computed as above for rest of cep */ + f = feat[2]; + f[0] = mfc[0][0]; + f[1] = mfc[2][0] - mfc[-2][0]; + + d1 = mfc[3][0] - mfc[-1][0]; + d2 = mfc[1][0] - mfc[-3][0]; + f[2] = d1 - d2; +} + + +static void +feat_s3_1x39_cep2feat(feat_t * fcb, mfcc_t ** mfc, mfcc_t ** feat) +{ + mfcc_t *f; + mfcc_t *w, *_w; + mfcc_t *w1, *w_1, *_w1, *_w_1; + mfcc_t d1, d2; + int32 i; + + assert(fcb); + assert(feat_cepsize(fcb) == 13); + assert(feat_n_stream(fcb) == 1); + assert(feat_stream_len(fcb, 0) == 39); + assert(feat_window_size(fcb) == 3); + + /* CEP; skip C0 */ + memcpy(feat[0], mfc[0] + 1, (feat_cepsize(fcb) - 1) * sizeof(mfcc_t)); + /* + * DCEP: mfc[2] - mfc[-2]; + */ + f = feat[0] + feat_cepsize(fcb) - 1; + w = mfc[2] + 1; /* +1 to skip C0 */ + _w = mfc[-2] + 1; + + for (i = 0; i < feat_cepsize(fcb) - 1; i++) + f[i] = w[i] - _w[i]; + + /* POW: C0, DC0, D2C0 */ + f += feat_cepsize(fcb) - 1; + + f[0] = mfc[0][0]; + f[1] = mfc[2][0] - mfc[-2][0]; + + d1 = mfc[3][0] - mfc[-1][0]; + d2 = mfc[1][0] - mfc[-3][0]; + f[2] = d1 - d2; + + /* D2CEP: (mfc[3] - mfc[-1]) - (mfc[1] - mfc[-3]) */ + f += 3; + + w1 = mfc[3] + 1; /* Final +1 to skip C0 */ + _w1 = mfc[-1] + 1; + w_1 = mfc[1] + 1; + _w_1 = mfc[-3] + 1; + + for (i = 0; i < feat_cepsize(fcb) - 1; i++) { + d1 = w1[i] - _w1[i]; + d2 = w_1[i] - _w_1[i]; + + f[i] = d1 - d2; + } +} + + +static void +feat_s3_cep(feat_t * fcb, mfcc_t ** mfc, mfcc_t ** feat) +{ + assert(fcb); + assert(feat_n_stream(fcb) == 1); + assert(feat_window_size(fcb) == 0); + + /* CEP */ + memcpy(feat[0], mfc[0], feat_cepsize(fcb) * sizeof(mfcc_t)); +} + +static void +feat_s3_cep_dcep(feat_t * fcb, mfcc_t ** mfc, mfcc_t ** feat) +{ + mfcc_t *f; + mfcc_t *w, *_w; + int32 i; + + assert(fcb); + assert(feat_n_stream(fcb) == 1); + assert(feat_stream_len(fcb, 0) == (uint32)feat_cepsize(fcb) * 2); + assert(feat_window_size(fcb) == 2); + + /* CEP */ + memcpy(feat[0], mfc[0], feat_cepsize(fcb) * sizeof(mfcc_t)); + + /* + * DCEP: mfc[2] - mfc[-2]; + */ + f = feat[0] + feat_cepsize(fcb); + w = mfc[2]; + _w = mfc[-2]; + + for (i = 0; i < feat_cepsize(fcb); i++) + f[i] = w[i] - _w[i]; +} + +static void +feat_1s_c_d_dd_cep2feat(feat_t * fcb, mfcc_t ** mfc, mfcc_t ** feat) +{ + mfcc_t *f; + mfcc_t *w, *_w; + mfcc_t *w1, *w_1, *_w1, *_w_1; + mfcc_t d1, d2; + int32 i; + + assert(fcb); + assert(feat_n_stream(fcb) == 1); + assert(feat_stream_len(fcb, 0) == (uint32)feat_cepsize(fcb) * 3); + assert(feat_window_size(fcb) == FEAT_DCEP_WIN + 1); + + /* CEP */ + memcpy(feat[0], mfc[0], feat_cepsize(fcb) * sizeof(mfcc_t)); + + /* + * DCEP: mfc[w] - mfc[-w], where w = FEAT_DCEP_WIN; + */ + f = feat[0] + feat_cepsize(fcb); + w = mfc[FEAT_DCEP_WIN]; + _w = mfc[-FEAT_DCEP_WIN]; + + for (i = 0; i < feat_cepsize(fcb); i++) + f[i] = w[i] - _w[i]; + + /* + * D2CEP: (mfc[w+1] - mfc[-w+1]) - (mfc[w-1] - mfc[-w-1]), + * where w = FEAT_DCEP_WIN + */ + f += feat_cepsize(fcb); + + w1 = mfc[FEAT_DCEP_WIN + 1]; + _w1 = mfc[-FEAT_DCEP_WIN + 1]; + w_1 = mfc[FEAT_DCEP_WIN - 1]; + _w_1 = mfc[-FEAT_DCEP_WIN - 1]; + + for (i = 0; i < feat_cepsize(fcb); i++) { + d1 = w1[i] - _w1[i]; + d2 = w_1[i] - _w_1[i]; + + f[i] = d1 - d2; + } +} + +static void +feat_1s_c_d_ld_dd_cep2feat(feat_t * fcb, mfcc_t ** mfc, mfcc_t ** feat) +{ + mfcc_t *f; + mfcc_t *w, *_w; + mfcc_t *w1, *w_1, *_w1, *_w_1; + mfcc_t d1, d2; + int32 i; + + assert(fcb); + assert(feat_n_stream(fcb) == 1); + assert(feat_stream_len(fcb, 0) == (uint32)feat_cepsize(fcb) * 4); + assert(feat_window_size(fcb) == FEAT_DCEP_WIN * 2); + + /* CEP */ + memcpy(feat[0], mfc[0], feat_cepsize(fcb) * sizeof(mfcc_t)); + + /* + * DCEP: mfc[w] - mfc[-w], where w = FEAT_DCEP_WIN; + */ + f = feat[0] + feat_cepsize(fcb); + w = mfc[FEAT_DCEP_WIN]; + _w = mfc[-FEAT_DCEP_WIN]; + + for (i = 0; i < feat_cepsize(fcb); i++) + f[i] = w[i] - _w[i]; + + /* + * LDCEP: mfc[w] - mfc[-w], where w = FEAT_DCEP_WIN * 2; + */ + f += feat_cepsize(fcb); + w = mfc[FEAT_DCEP_WIN * 2]; + _w = mfc[-FEAT_DCEP_WIN * 2]; + + for (i = 0; i < feat_cepsize(fcb); i++) + f[i] = w[i] - _w[i]; + + /* + * D2CEP: (mfc[w+1] - mfc[-w+1]) - (mfc[w-1] - mfc[-w-1]), + * where w = FEAT_DCEP_WIN + */ + f += feat_cepsize(fcb); + + w1 = mfc[FEAT_DCEP_WIN + 1]; + _w1 = mfc[-FEAT_DCEP_WIN + 1]; + w_1 = mfc[FEAT_DCEP_WIN - 1]; + _w_1 = mfc[-FEAT_DCEP_WIN - 1]; + + for (i = 0; i < feat_cepsize(fcb); i++) { + d1 = w1[i] - _w1[i]; + d2 = w_1[i] - _w_1[i]; + + f[i] = d1 - d2; + } +} + +static void +feat_copy(feat_t * fcb, mfcc_t ** mfc, mfcc_t ** feat) +{ + int32 win, i, j; + + win = feat_window_size(fcb); + + /* Concatenate input features */ + for (i = -win; i <= win; ++i) { + uint32 spos = 0; + + for (j = 0; j < feat_n_stream(fcb); ++j) { + uint32 stream_len; + + /* Unscale the stream length by the window. */ + stream_len = feat_stream_len(fcb, j) / (2 * win + 1); + memcpy(feat[j] + ((i + win) * stream_len), + mfc[i] + spos, + stream_len * sizeof(mfcc_t)); + spos += stream_len; + } + } +} + +feat_t * +feat_init(char const *type, cmn_type_t cmn, int32 varnorm, + agc_type_t agc, int32 breport, int32 cepsize) +{ + feat_t *fcb; + + if (cepsize == 0) + cepsize = 13; + if (breport) + E_INFO + ("Initializing feature stream to type: '%s', ceplen=%d, CMN='%s', VARNORM='%s', AGC='%s'\n", + type, cepsize, cmn_type_str[cmn], varnorm ? "yes" : "no", agc_type_str[agc]); + + fcb = (feat_t *) ckd_calloc(1, sizeof(feat_t)); + fcb->refcount = 1; + fcb->name = (char *) ckd_salloc(type); + if (strcmp(type, "s2_4x") == 0) { + /* Sphinx-II format 4-stream feature (Hack!! hardwired constants below) */ + if (cepsize != 13) { + E_ERROR("s2_4x features require cepsize == 13\n"); + ckd_free(fcb); + return NULL; + } + fcb->cepsize = 13; + fcb->n_stream = 4; + fcb->stream_len = (uint32 *) ckd_calloc(4, sizeof(uint32)); + fcb->stream_len[0] = 12; + fcb->stream_len[1] = 24; + fcb->stream_len[2] = 3; + fcb->stream_len[3] = 12; + fcb->out_dim = 51; + fcb->window_size = 4; + fcb->compute_feat = feat_s2_4x_cep2feat; + } + else if ((strcmp(type, "s3_1x39") == 0) || (strcmp(type, "1s_12c_12d_3p_12dd") == 0)) { + /* 1-stream cep/dcep/pow/ddcep (Hack!! hardwired constants below) */ + if (cepsize != 13) { + E_ERROR("s2_4x features require cepsize == 13\n"); + ckd_free(fcb); + return NULL; + } + fcb->cepsize = 13; + fcb->n_stream = 1; + fcb->stream_len = (uint32 *) ckd_calloc(1, sizeof(uint32)); + fcb->stream_len[0] = 39; + fcb->out_dim = 39; + fcb->window_size = 3; + fcb->compute_feat = feat_s3_1x39_cep2feat; + } + else if (strncmp(type, "1s_c_d_dd", 9) == 0) { + fcb->cepsize = cepsize; + fcb->n_stream = 1; + fcb->stream_len = (uint32 *) ckd_calloc(1, sizeof(uint32)); + fcb->stream_len[0] = cepsize * 3; + fcb->out_dim = cepsize * 3; + fcb->window_size = FEAT_DCEP_WIN + 1; /* ddcep needs the extra 1 */ + fcb->compute_feat = feat_1s_c_d_dd_cep2feat; + } + else if (strncmp(type, "1s_c_d_ld_dd", 12) == 0) { + fcb->cepsize = cepsize; + fcb->n_stream = 1; + fcb->stream_len = (uint32 *) ckd_calloc(1, sizeof(uint32)); + fcb->stream_len[0] = cepsize * 4; + fcb->out_dim = cepsize * 4; + fcb->window_size = FEAT_DCEP_WIN * 2; + fcb->compute_feat = feat_1s_c_d_ld_dd_cep2feat; + } + else if (strncmp(type, "cep_dcep", 8) == 0 || strncmp(type, "1s_c_d", 6) == 0) { + /* 1-stream cep/dcep */ + fcb->cepsize = cepsize; + fcb->n_stream = 1; + fcb->stream_len = (uint32 *) ckd_calloc(1, sizeof(uint32)); + fcb->stream_len[0] = feat_cepsize(fcb) * 2; + fcb->out_dim = fcb->stream_len[0]; + fcb->window_size = 2; + fcb->compute_feat = feat_s3_cep_dcep; + } + else if (strncmp(type, "cep", 3) == 0 || strncmp(type, "1s_c", 4) == 0) { + /* 1-stream cep */ + fcb->cepsize = cepsize; + fcb->n_stream = 1; + fcb->stream_len = (uint32 *) ckd_calloc(1, sizeof(uint32)); + fcb->stream_len[0] = feat_cepsize(fcb); + fcb->out_dim = fcb->stream_len[0]; + fcb->window_size = 0; + fcb->compute_feat = feat_s3_cep; + } + else if (strncmp(type, "1s_3c", 5) == 0 || strncmp(type, "1s_4c", 5) == 0) { + /* 1-stream cep with frames concatenated, so called cepwin features */ + if (strncmp(type, "1s_3c", 5) == 0) + fcb->window_size = 3; + else + fcb->window_size = 4; + + fcb->cepsize = cepsize; + fcb->n_stream = 1; + fcb->stream_len = (uint32 *) ckd_calloc(1, sizeof(uint32)); + fcb->stream_len[0] = feat_cepsize(fcb) * (2 * fcb->window_size + 1); + fcb->out_dim = fcb->stream_len[0]; + fcb->compute_feat = feat_copy; + } + else { + int32 i, k, l; + size_t len; + char *strp; + char *mtype = ckd_salloc(type); + char *wd = ckd_salloc(type); + /* + * Generic definition: Format should be %d,%d,%d,...,%d (i.e., + * comma separated list of feature stream widths; #items = + * #streams). An optional window size (frames will be + * concatenated) is also allowed, which can be specified with + * a colon after the list of feature streams. + */ + len = strlen(mtype); + k = 0; + for (i = 1; (size_t)i < len - 1; i++) { + if (mtype[i] == ',') { + mtype[i] = ' '; + k++; + } + else if (mtype[i] == ':') { + mtype[i] = '\0'; + fcb->window_size = atoi(mtype + i + 1); + break; + } + } + k++; /* Presumably there are (#commas+1) streams */ + fcb->n_stream = k; + fcb->stream_len = (uint32 *) ckd_calloc(k, sizeof(uint32)); + + /* Scan individual feature stream lengths */ + strp = mtype; + i = 0; + fcb->out_dim = 0; + fcb->cepsize = 0; + while (sscanf(strp, "%s%n", wd, &l) == 1) { + strp += l; + if ((i >= fcb->n_stream) + || (sscanf(wd, "%u", &(fcb->stream_len[i])) != 1) + || (fcb->stream_len[i] <= 0)) + E_FATAL("Bad feature type argument\n"); + /* Input size before windowing */ + fcb->cepsize += fcb->stream_len[i]; + if (fcb->window_size > 0) + fcb->stream_len[i] *= (fcb->window_size * 2 + 1); + /* Output size after windowing */ + fcb->out_dim += fcb->stream_len[i]; + i++; + } + if (i != fcb->n_stream) + E_FATAL("Bad feature type argument\n"); + if (fcb->cepsize != cepsize) + E_FATAL("Bad feature type argument\n"); + + /* Input is already the feature stream */ + fcb->compute_feat = feat_copy; + ckd_free(mtype); + ckd_free(wd); + } + + if (cmn != CMN_NONE) + fcb->cmn_struct = cmn_init(feat_cepsize(fcb)); + fcb->cmn = cmn; + fcb->varnorm = varnorm; + if (agc != AGC_NONE) { + fcb->agc_struct = agc_init(); + /* + * No need to check if agc is set to EMAX; agc_emax_set() changes only emax related things + * Moreover, if agc is not NONE and block mode is used, feat_agc() SILENTLY + * switches to EMAX + */ + /* HACK: hardwired initial estimates based on use of CMN (from Sphinx2) */ + agc_emax_set(fcb->agc_struct, (cmn != CMN_NONE) ? 5.0 : 10.0); + } + fcb->agc = agc; + /* + * Make sure this buffer is large enough to be used in feat_s2mfc2feat_block_utt() + */ + fcb->cepbuf = (mfcc_t **) ckd_calloc_2d((LIVEBUFBLOCKSIZE < feat_window_size(fcb) * 2) ? feat_window_size(fcb) * 2 : LIVEBUFBLOCKSIZE, + feat_cepsize(fcb), + sizeof(mfcc_t)); + /* This one is actually just an array of pointers to "flatten out" + * wraparounds. */ + fcb->tmpcepbuf = (mfcc_t** )ckd_calloc(2 * feat_window_size(fcb) + 1, + sizeof(*fcb->tmpcepbuf)); + + return fcb; +} + + +void +feat_print(feat_t * fcb, mfcc_t *** feat, int32 nfr, FILE * fp) +{ + uint32 i, j, k; + + for (i = 0; i < (uint32)nfr; i++) { + fprintf(fp, "%8d:\n", i); + + for (j = 0; j < (uint32)feat_dimension1(fcb); j++) { + fprintf(fp, "\t%2d:", j); + + for (k = 0; k < feat_dimension2(fcb, j); k++) + fprintf(fp, " %8.4f", MFCC2FLOAT(feat[i][j][k])); + fprintf(fp, "\n"); + } + } + + fflush(fp); +} + +static void +feat_cmn(feat_t *fcb, mfcc_t **mfc, int32 nfr, int32 beginutt, int32 endutt) +{ + cmn_type_t cmn_type = fcb->cmn; + + if (!(beginutt && endutt) + && cmn_type != CMN_NONE) /* Only cmn_prior in block computation mode. */ + fcb->cmn = cmn_type = CMN_LIVE; + + switch (cmn_type) { + case CMN_BATCH: + cmn(fcb->cmn_struct, mfc, fcb->varnorm, nfr); + break; + case CMN_LIVE: + cmn_live(fcb->cmn_struct, mfc, fcb->varnorm, nfr); + if (endutt) + cmn_live_update(fcb->cmn_struct); + break; + default: + ; + } + cep_dump_dbg(fcb, mfc, nfr, "After CMN"); +} + +static void +feat_agc(feat_t *fcb, mfcc_t **mfc, int32 nfr, int32 beginutt, int32 endutt) +{ + agc_type_t agc_type = fcb->agc; + + if (!(beginutt && endutt) + && agc_type != AGC_NONE) /* Only agc_emax in block computation mode. */ + agc_type = AGC_EMAX; + + switch (agc_type) { + case AGC_MAX: + agc_max(fcb->agc_struct, mfc, nfr); + break; + case AGC_EMAX: + agc_emax(fcb->agc_struct, mfc, nfr); + if (endutt) + agc_emax_update(fcb->agc_struct); + break; + case AGC_NOISE: + agc_noise(fcb->agc_struct, mfc, nfr); + break; + default: + ; + } + cep_dump_dbg(fcb, mfc, nfr, "After AGC"); +} + +static void +feat_compute_utt(feat_t *fcb, mfcc_t **mfc, int32 nfr, int32 win, mfcc_t ***feat) +{ + int32 i; + + cep_dump_dbg(fcb, mfc, nfr, "Incoming features (after padding)"); + + /* Create feature vectors */ + for (i = win; i < nfr - win; i++) { + fcb->compute_feat(fcb, mfc + i, feat[i - win]); + } + + feat_print_dbg(fcb, feat, nfr - win * 2, "After dynamic feature computation"); + + if (fcb->lda) { + feat_lda_transform(fcb, feat, nfr - win * 2); + feat_print_dbg(fcb, feat, nfr - win * 2, "After LDA"); + } + + if (fcb->subvecs) { + feat_subvec_project(fcb, feat, nfr - win * 2); + feat_print_dbg(fcb, feat, nfr - win * 2, "After subvector projection"); + } +} + + +/** + * Read Sphinx-II format mfc file (s2mfc = Sphinx-II format MFC data). + * If out_mfc is NULL, no actual reading will be done, and the number of + * frames (plus padding) that would be read is returned. + * + * It's important that normalization is done before padding because + * frames outside the data we are interested in shouldn't be taken + * into normalization stats. + * + * @return # frames read (plus padding) if successful, -1 if + * error (e.g., mfc array too small). + */ +static int32 +feat_s2mfc_read_norm_pad(feat_t *fcb, char *file, int32 win, + int32 sf, int32 ef, + mfcc_t ***out_mfc, + int32 maxfr, + int32 cepsize) +{ + FILE *fp; + int32 n_float32; + float32 *float_feat; + struct stat statbuf; + int32 i, n, byterev; + int32 start_pad, end_pad; + mfcc_t **mfc; + + /* Initialize the output pointer to NULL, so that any attempts to + free() it if we fail before allocating it will not segfault! */ + if (out_mfc) + *out_mfc = NULL; + E_INFO("Reading mfc file: '%s'[%d..%d]\n", file, sf, ef); + if (ef >= 0 && ef <= sf) { + E_ERROR("%s: End frame (%d) <= Start frame (%d)\n", file, ef, sf); + return -1; + } + + /* Find filesize; HACK!! To get around intermittent NFS failures, use stat_retry */ + if ((stat_retry(file, &statbuf) < 0) + || ((fp = fopen(file, "rb")) == NULL)) { + E_ERROR_SYSTEM("Failed to open file '%s' for reading", file); + return -1; + } + + /* Read #floats in header */ + if (fread_retry(&n_float32, sizeof(int32), 1, fp) != 1) { + E_ERROR("%s: fread(#floats) failed\n", file); + fclose(fp); + return -1; + } + + /* Check if n_float32 matches file size */ + byterev = 0; + if ((int32) (n_float32 * sizeof(float32) + 4) != (int32) statbuf.st_size) { /* RAH, typecast both sides to remove compile warning */ + n = n_float32; + SWAP_INT32(&n); + + if ((int32) (n * sizeof(float32) + 4) != (int32) (statbuf.st_size)) { /* RAH, typecast both sides to remove compile warning */ + E_ERROR + ("%s: Header size field: %d(%08x); filesize: %d(%08x)\n", + file, n_float32, n_float32, statbuf.st_size, + statbuf.st_size); + fclose(fp); + return -1; + } + + n_float32 = n; + byterev = 1; + } + if (n_float32 <= 0) { + E_ERROR("%s: Header size field (#floats) = %d\n", file, n_float32); + fclose(fp); + return -1; + } + + /* Convert n to #frames of input */ + n = n_float32 / cepsize; + if (n * cepsize != n_float32) { + E_ERROR("Header size field: %d; not multiple of %d\n", n_float32, + cepsize); + fclose(fp); + return -1; + } + + /* Check start and end frames */ + if (sf > 0) { + if (sf >= n) { + E_ERROR("%s: Start frame (%d) beyond file size (%d)\n", file, + sf, n); + fclose(fp); + return -1; + } + } + if (ef < 0) + ef = n-1; + else if (ef >= n) { + E_WARN("%s: End frame (%d) beyond file size (%d), will truncate\n", + file, ef, n); + ef = n-1; + } + + /* Add window to start and end frames */ + sf -= win; + ef += win; + if (sf < 0) { + start_pad = -sf; + sf = 0; + } + else + start_pad = 0; + if (ef >= n) { + end_pad = ef - n + 1; + ef = n - 1; + } + else + end_pad = 0; + + /* Limit n if indicated by [sf..ef] */ + if ((ef - sf + 1) < n) + n = (ef - sf + 1); + if (maxfr > 0 && n + start_pad + end_pad > maxfr) { + E_ERROR("%s: Maximum output size(%d frames) < actual #frames(%d)\n", + file, maxfr, n + start_pad + end_pad); + fclose(fp); + return -1; + } + + /* If no output buffer was supplied, then skip the actual data reading. */ + if (out_mfc != NULL) { + /* Position at desired start frame and read actual MFC data */ + mfc = (mfcc_t **)ckd_calloc_2d(n + start_pad + end_pad, cepsize, sizeof(mfcc_t)); + if (sf > 0) + fseek(fp, sf * cepsize * sizeof(float32), SEEK_CUR); + n_float32 = n * cepsize; +#ifdef FIXED_POINT + float_feat = ckd_calloc(n_float32, sizeof(float32)); +#else + float_feat = mfc[start_pad]; +#endif + if (fread_retry(float_feat, sizeof(float32), n_float32, fp) != n_float32) { + E_ERROR("%s: fread(%dx%d) (MFC data) failed\n", file, n, cepsize); + ckd_free_2d(mfc); + fclose(fp); + return -1; + } + if (byterev) { + for (i = 0; i < n_float32; i++) { + SWAP_FLOAT32(&float_feat[i]); + } + } +#ifdef FIXED_POINT + for (i = 0; i < n_float32; ++i) { + mfc[start_pad][i] = FLOAT2MFCC(float_feat[i]); + } + ckd_free(float_feat); +#endif + + /* Normalize */ + feat_cmn(fcb, mfc + start_pad, n, 1, 1); + feat_agc(fcb, mfc + start_pad, n, 1, 1); + + /* Replicate start and end frames if necessary. */ + for (i = 0; i < start_pad; ++i) + memcpy(mfc[i], mfc[start_pad], cepsize * sizeof(mfcc_t)); + for (i = 0; i < end_pad; ++i) + memcpy(mfc[start_pad + n + i], mfc[start_pad + n - 1], + cepsize * sizeof(mfcc_t)); + + *out_mfc = mfc; + } + + fclose(fp); + return n + start_pad + end_pad; +} + + + +int32 +feat_s2mfc2feat(feat_t * fcb, const char *file, const char *dir, const char *cepext, + int32 sf, int32 ef, mfcc_t *** feat, int32 maxfr) +{ + char *path; + char *ps = "/"; + int32 win, nfr; + size_t file_length, cepext_length, path_length = 0; + mfcc_t **mfc; + + if (fcb->cepsize <= 0) { + E_ERROR("Bad cepsize: %d\n", fcb->cepsize); + return -1; + } + + if (cepext == NULL) + cepext = ""; + + /* + * Create mfc filename, combining file, dir and extension if + * necessary + */ + + /* + * First we decide about the path. If dir is defined, then use + * it. Otherwise assume the filename already contains the path. + */ + if (dir == NULL) { + dir = ""; + ps = ""; + /* + * This is not true but some 3rd party apps + * may parse the output explicitly checking for this line + */ + E_INFO("At directory . (current directory)\n"); + } + else { + E_INFO("At directory %s\n", dir); + /* + * Do not forget the path separator! + */ + path_length += strlen(dir) + 1; + } + + /* + * Include cepext, if it's not already part of the filename. + */ + file_length = strlen(file); + cepext_length = strlen(cepext); + if ((file_length > cepext_length) + && (strcmp(file + file_length - cepext_length, cepext) == 0)) { + cepext = ""; + cepext_length = 0; + } + + /* + * Do not forget the '\0' + */ + path_length += file_length + cepext_length + 1; + path = (char*) ckd_calloc(path_length, sizeof(char)); + +#ifdef HAVE_SNPRINTF + /* + * Paranoia is our best friend... + */ + while ((file_length = snprintf(path, path_length, "%s%s%s%s", dir, ps, file, cepext)) > path_length) { + path_length = file_length; + path = (char*) ckd_realloc(path, path_length * sizeof(char)); + } +#else + sprintf(path, "%s%s%s%s", dir, ps, file, cepext); +#endif + + win = feat_window_size(fcb); + /* Pad maxfr with win, so we read enough raw feature data to + * calculate the requisite number of dynamic features. */ + if (maxfr >= 0) + maxfr += win * 2; + + if (feat != NULL) { + /* Read mfc file including window or padding if necessary. */ + nfr = feat_s2mfc_read_norm_pad(fcb, path, win, sf, ef, &mfc, maxfr, fcb->cepsize); + ckd_free(path); + if (nfr < 0) { + ckd_free_2d((void **) mfc); + return -1; + } + + /* Actually compute the features */ + feat_compute_utt(fcb, mfc, nfr, win, feat); + + ckd_free_2d((void **) mfc); + } + else { + /* Just calculate the number of frames we would need. */ + nfr = feat_s2mfc_read_norm_pad(fcb, path, win, sf, ef, NULL, maxfr, fcb->cepsize); + ckd_free(path); + if (nfr < 0) + return nfr; + } + + + return (nfr - win * 2); +} + +static int32 +feat_s2mfc2feat_block_utt(feat_t * fcb, mfcc_t ** uttcep, + int32 nfr, mfcc_t *** ofeat) +{ + mfcc_t **cepbuf; + int32 i, win, cepsize; + + win = feat_window_size(fcb); + cepsize = feat_cepsize(fcb); + + /* Copy and pad out the utterance (this requires that the + * feature computation functions always access the buffer via + * the frame pointers, which they do) */ + cepbuf = (mfcc_t **)ckd_calloc(nfr + win * 2, sizeof(mfcc_t *)); + memcpy(cepbuf + win, uttcep, nfr * sizeof(mfcc_t *)); + + /* Do normalization before we interpolate on the boundary */ + feat_cmn(fcb, cepbuf + win, nfr, 1, 1); + feat_agc(fcb, cepbuf + win, nfr, 1, 1); + + /* Now interpolate */ + for (i = 0; i < win; ++i) { + cepbuf[i] = fcb->cepbuf[i]; + memcpy(cepbuf[i], uttcep[0], cepsize * sizeof(mfcc_t)); + cepbuf[nfr + win + i] = fcb->cepbuf[win + i]; + memcpy(cepbuf[nfr + win + i], uttcep[nfr - 1], cepsize * sizeof(mfcc_t)); + } + /* Compute as usual. */ + feat_compute_utt(fcb, cepbuf, nfr + win * 2, win, ofeat); + ckd_free(cepbuf); + return nfr; +} + +int32 +feat_s2mfc2feat_live(feat_t * fcb, mfcc_t ** uttcep, int32 *inout_ncep, + int32 beginutt, int32 endutt, mfcc_t *** ofeat) +{ + int32 win, cepsize, nbufcep; + int32 i, j, nfeatvec; + int32 zero = 0; + + /* Avoid having to check this everywhere. */ + if (inout_ncep == NULL) inout_ncep = &zero; + + /* Special case for entire utterances. */ + if (beginutt && endutt && *inout_ncep > 0) + return feat_s2mfc2feat_block_utt(fcb, uttcep, *inout_ncep, ofeat); + + win = feat_window_size(fcb); + cepsize = feat_cepsize(fcb); + + /* Empty the input buffer on start of utterance. */ + if (beginutt) + fcb->bufpos = fcb->curpos; + + /* Calculate how much data is in the buffer already. */ + nbufcep = fcb->bufpos - fcb->curpos; + if (nbufcep < 0) + nbufcep = fcb->bufpos + LIVEBUFBLOCKSIZE - fcb->curpos; + /* Add any data that we have to replicate. */ + if (beginutt && *inout_ncep > 0) + nbufcep += win; + if (endutt) + nbufcep += win; + + /* Only consume as much input as will fit in the buffer. */ + if (nbufcep + *inout_ncep > LIVEBUFBLOCKSIZE) { + /* We also can't overwrite the trailing window, hence the + * reason why win is subtracted here. */ + *inout_ncep = LIVEBUFBLOCKSIZE - nbufcep - win; + /* Cancel end of utterance processing. */ + endutt = FALSE; + } + + /* FIXME: Don't modify the input! */ + feat_cmn(fcb, uttcep, *inout_ncep, beginutt, endutt); + feat_agc(fcb, uttcep, *inout_ncep, beginutt, endutt); + + /* Replicate first frame into the first win frames if we're at the + * beginning of the utterance and there was some actual input to + * deal with. (FIXME: Not entirely sure why that condition) */ + if (beginutt && *inout_ncep > 0) { + for (i = 0; i < win; i++) { + memcpy(fcb->cepbuf[fcb->bufpos++], uttcep[0], + cepsize * sizeof(mfcc_t)); + fcb->bufpos %= LIVEBUFBLOCKSIZE; + } + /* Move the current pointer past this data. */ + fcb->curpos = fcb->bufpos; + nbufcep -= win; + } + + /* Copy in frame data to the circular buffer. */ + for (i = 0; i < *inout_ncep; ++i) { + memcpy(fcb->cepbuf[fcb->bufpos++], uttcep[i], + cepsize * sizeof(mfcc_t)); + fcb->bufpos %= LIVEBUFBLOCKSIZE; + ++nbufcep; + } + + /* Replicate last frame into the last win frames if we're at the + * end of the utterance (even if there was no input, so we can + * flush the output). */ + if (endutt) { + int32 tpos; /* Index of last input frame. */ + if (fcb->bufpos == 0) + tpos = LIVEBUFBLOCKSIZE - 1; + else + tpos = fcb->bufpos - 1; + for (i = 0; i < win; ++i) { + memcpy(fcb->cepbuf[fcb->bufpos++], fcb->cepbuf[tpos], + cepsize * sizeof(mfcc_t)); + fcb->bufpos %= LIVEBUFBLOCKSIZE; + } + } + + /* We have to leave the trailing window of frames. */ + nfeatvec = nbufcep - win; + if (nfeatvec <= 0) + return 0; /* Do nothing. */ + + for (i = 0; i < nfeatvec; ++i) { + /* Handle wraparound cases. */ + if (fcb->curpos - win < 0 || fcb->curpos + win >= LIVEBUFBLOCKSIZE) { + /* Use tmpcepbuf for this case. Actually, we just need the pointers. */ + for (j = -win; j <= win; ++j) { + int32 tmppos = + (fcb->curpos + j + LIVEBUFBLOCKSIZE) % LIVEBUFBLOCKSIZE; + fcb->tmpcepbuf[win + j] = fcb->cepbuf[tmppos]; + } + fcb->compute_feat(fcb, fcb->tmpcepbuf + win, ofeat[i]); + } + else { + fcb->compute_feat(fcb, fcb->cepbuf + fcb->curpos, ofeat[i]); + } + /* Move the read pointer forward. */ + ++fcb->curpos; + fcb->curpos %= LIVEBUFBLOCKSIZE; + } + + if (fcb->lda) + feat_lda_transform(fcb, ofeat, nfeatvec); + + if (fcb->subvecs) + feat_subvec_project(fcb, ofeat, nfeatvec); + + return nfeatvec; +} + +void +feat_update_stats(feat_t *fcb) +{ + if (fcb->cmn == CMN_LIVE) { + cmn_live_update(fcb->cmn_struct); + } + if (fcb->agc == AGC_EMAX || fcb->agc == AGC_MAX) { + agc_emax_update(fcb->agc_struct); + } +} + +feat_t * +feat_retain(feat_t *f) +{ + ++f->refcount; + return f; +} + +int +feat_free(feat_t * f) +{ + if (f == NULL) + return 0; + if (--f->refcount > 0) + return f->refcount; + + if (f->cepbuf) + ckd_free_2d((void **) f->cepbuf); + ckd_free(f->tmpcepbuf); + + if (f->name) { + ckd_free((void *) f->name); + } + if (f->lda) + ckd_free_3d((void ***) f->lda); + + ckd_free(f->stream_len); + ckd_free(f->sv_len); + ckd_free(f->sv_buf); + subvecs_free(f->subvecs); + + cmn_free(f->cmn_struct); + agc_free(f->agc_struct); + + ckd_free(f); + return 0; +} + + +void +feat_report(feat_t * f) +{ + int i; + E_INFO_NOFN("Initialization of feat_t, report:\n"); + E_INFO_NOFN("Feature type = %s\n", f->name); + E_INFO_NOFN("Cepstral size = %d\n", f->cepsize); + E_INFO_NOFN("Number of streams = %d\n", f->n_stream); + for (i = 0; i < f->n_stream; i++) { + E_INFO_NOFN("Vector size of stream[%d]: %d\n", i, + f->stream_len[i]); + } + E_INFO_NOFN("Number of subvectors = %d\n", f->n_sv); + for (i = 0; i < f->n_sv; i++) { + int32 *sv; + + E_INFO_NOFN("Components of subvector[%d]:", i); + for (sv = f->subvecs[i]; sv && *sv != -1; ++sv) + E_INFOCONT(" %d", *sv); + E_INFOCONT("\n"); + } + E_INFO_NOFN("Whether CMN is used = %d\n", f->cmn); + E_INFO_NOFN("Whether AGC is used = %d\n", f->agc); + E_INFO_NOFN("Whether variance is normalized = %d\n", f->varnorm); + E_INFO_NOFN("\n"); +} diff --git a/src/feat/feat.h b/src/feat/feat.h new file mode 100644 index 0000000..850012d --- /dev/null +++ b/src/feat/feat.h @@ -0,0 +1,452 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * feat.h -- Cepstral features computation. + */ + +#ifndef _S3_FEAT_H_ +#define _S3_FEAT_H_ + +#include + +#include + +#include "fe/fe.h" +#include "feat/cmn.h" +#include "feat/agc.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** \file feat.h + * \brief compute the dynamic coefficients from the cepstral vector. + */ +#define LIVEBUFBLOCKSIZE 256 /** Blocks of 256 vectors allocated + for livemode decoder */ +#define S3_MAX_FRAMES 15000 /* RAH, I believe this is still too large, but better than before */ + +#define cepstral_to_feature_command_line_macro() \ +{ "feat", \ + ARG_STRING, \ + "1s_c_d_dd", \ + "Feature stream type, depends on the acoustic model" }, \ +{ "ceplen", \ + ARG_INTEGER, \ + "13", \ + "Number of components in the input feature vector" }, \ +{ "cmn", \ + ARG_STRING, \ + "live", \ + "Cepstral mean normalization scheme ('live', 'batch', or 'none')" }, \ +{ "cmninit", \ + ARG_STRING, \ + "40,3,-1", \ + "Initial values (comma-separated) for cepstral mean when 'live' is used" }, \ +{ "varnorm", \ + ARG_BOOLEAN, \ + "no", \ + "Variance normalize each utterance (only if CMN == current)" }, \ +{ "agc", \ + ARG_STRING, \ + "none", \ + "Automatic gain control for c0 ('max', 'emax', 'noise', or 'none')" }, \ +{ "agcthresh", \ + ARG_FLOATING, \ + "2.0", \ + "Initial threshold for automatic gain control" }, \ +{ "lda", \ + ARG_STRING, \ + NULL, \ + "File containing transformation matrix to be applied to features (single-stream features only)" }, \ +{ "ldadim", \ + ARG_INTEGER, \ + "0", \ + "Dimensionality of output of feature transformation (0 to use entire matrix)" }, \ +{"svspec", \ + ARG_STRING, \ + NULL, \ + "Subvector specification (e.g., 24,0-11/25,12-23/26-38 or 0-12/13-25/26-38)"} + +/** + * \struct feat_t + * \brief Structure for describing a speech feature type + * Structure for describing a speech feature type (no. of streams and stream widths), + * as well as the computation for converting the input speech (e.g., Sphinx-II format + * MFC cepstra) into this type of feature vectors. + */ +typedef struct feat_s { + int refcount; /**< Reference count. */ + char *name; /**< Printable name for this feature type */ + int32 cepsize; /**< Size of input speech vector (typically, a cepstrum vector) */ + int32 n_stream; /**< Number of feature streams; e.g., 4 in Sphinx-II */ + uint32 *stream_len; /**< Vector length of each feature stream */ + int32 window_size; /**< Number of extra frames around given input frame needed to compute + corresponding output feature (so total = window_size*2 + 1) */ + int32 n_sv; /**< Number of subvectors */ + uint32 *sv_len; /**< Vector length of each subvector */ + int32 **subvecs; /**< Subvector specification (or NULL for none) */ + mfcc_t *sv_buf; /**< Temporary copy buffer for subvector projection */ + int32 sv_dim; /**< Total dimensionality of subvector (length of sv_buf) */ + + cmn_type_t cmn; /**< Type of CMN to be performed on each utterance */ + int32 varnorm; /**< Whether variance normalization is to be performed on each utt; + Irrelevant if no CMN is performed */ + agc_type_t agc; /**< Type of AGC to be performed on each utterance */ + + /** + * Feature computation function. + * @param fcb the feat_t describing this feature type + * @param input pointer into the input cepstra + * @param feat a 2-d array of output features (n_stream x stream_len) + * @return 0 if successful, -ve otherwise. + * + * Function for converting window of input speech vector + * (input[-window_size..window_size]) to output feature vector + * (feat[stream][]). If NULL, no conversion available, the + * speech input must be feature vector itself. + **/ + void (*compute_feat)(struct feat_s *fcb, mfcc_t **input, mfcc_t **feat); + cmn_t *cmn_struct; /**< Structure that stores the temporary variables for cepstral + means normalization*/ + agc_t *agc_struct; /**< Structure that stores the temporary variables for acoustic + gain control*/ + + mfcc_t **cepbuf; /**< Circular buffer of MFCC frames for live feature computation. */ + mfcc_t **tmpcepbuf; /**< Array of pointers into cepbuf to handle border cases. */ + int32 bufpos; /**< Write index in cepbuf. */ + int32 curpos; /**< Read index in cepbuf. */ + + mfcc_t ***lda; /**< Array of linear transformations (for LDA, MLLT, or whatever) */ + uint32 n_lda; /**< Number of linear transformations in lda. */ + uint32 out_dim; /**< Output dimensionality */ +} feat_t; + +/** + * Name of feature type. + */ +#define feat_name(f) ((f)->name) +/** + * Input dimensionality of feature. + */ +#define feat_cepsize(f) ((f)->cepsize) +/** + * Size of dynamic feature window. + */ +#define feat_window_size(f) ((f)->window_size) +/** + * Number of feature streams. + * + * @deprecated Do not use this, use feat_dimension1() instead. + */ +#define feat_n_stream(f) ((f)->n_stream) +/** + * Length of feature stream i. + * + * @deprecated Do not use this, use feat_dimension2() instead. + */ +#define feat_stream_len(f,i) ((f)->stream_len[i]) +/** + * Number of streams or subvectors in feature output. + */ +#define feat_dimension1(f) ((f)->n_sv ? (f)->n_sv : f->n_stream) +/** + * Dimensionality of stream/subvector i in feature output. + */ +#define feat_dimension2(f,i) ((f)->lda ? (f)->out_dim : ((f)->sv_len ? (f)->sv_len[i] : f->stream_len[i])) +/** + * Total dimensionality of feature output. + */ +#define feat_dimension(f) ((f)->out_dim) +/** + * Array with stream/subvector lengths + */ +#define feat_stream_lengths(f) ((f)->lda ? (&(f)->out_dim) : (f)->sv_len ? (f)->sv_len : f->stream_len) + +/** + * Parse subvector specification string. + * + * Format of specification: + * \li '/' separated list of subvectors + * \li each subvector is a ',' separated list of subranges + * \li each subrange is a single \verbatim \endverbatim or + * \verbatim - \endverbatim (inclusive), where + * \verbatim \endverbatim is a feature vector dimension + * specifier. + * + * E.g., "24,0-11/25,12-23/26,27-38" has: + * \li 3 subvectors + * \li the 1st subvector has feature dims: 24, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, and 11. + * \li etc. + * + * @param str subvector specification string. + * @return allocated 2-D array of subvector specs (free with + * subvecs_free()). If there are N subvectors specified, subvec[N] = + * NULL; and each subvec[0]..subvec[N-1] is -1 terminated vector of + * feature dims. + */ +int32 **parse_subvecs(char const *str); + +/** + * Free array of subvector specs. + */ +void subvecs_free(int32 **subvecs); + + +/** + * Allocate an array to hold several frames worth of feature vectors. The returned value + * is the mfcc_t ***data array, organized as follows: + * + * - data[0][0] = frame 0 stream 0 vector, data[0][1] = frame 0 stream 1 vector, ... + * - data[1][0] = frame 1 stream 0 vector, data[0][1] = frame 1 stream 1 vector, ... + * - data[2][0] = frame 2 stream 0 vector, data[0][1] = frame 2 stream 1 vector, ... + * - ... + * + * NOTE: For I/O convenience, the entire data area is allocated as one contiguous block. + * @return pointer to the allocated space if successful, NULL if any error. + */ +mfcc_t ***feat_array_alloc(feat_t *fcb, /**< In: Descriptor from feat_init(), used + to obtain number of streams and stream sizes */ + int32 nfr /**< In: Number of frames for which to allocate */ + ); + +/** + * Realloate the array of features. Requires us to know the old size + */ +mfcc_t ***feat_array_realloc(feat_t *fcb, /**< In: Descriptor from feat_init(), used + to obtain number of streams and stream sizes */ + mfcc_t ***old_feat, /**< Feature array. Freed */ + int32 ofr, /**< In: Previous number of frames */ + int32 nfr /**< In: Number of frames for which to allocate */ + ); + +/** + * Free a buffer allocated with feat_array_alloc() + */ +void feat_array_free(mfcc_t ***feat); + + +/** + * Initialize feature module to use the selected type of feature stream. + * One-time only initialization at the beginning of the program. Input type + * is a string defining the kind of input->feature conversion desired: + * + * - "s2_4x": s2mfc->Sphinx-II 4-feature stream, + * - "1s_c_d_dd": s2mfc->Sphinx 3.x single feature stream, + * - "s3_1x39": s2mfc->Sphinx 3.0 single feature stream, + * - "n1,n2,n3,...": Explicit feature vector layout spec. with comma-separated + * feature stream lengths. In this case, the input data is already in the + * feature format and there is no conversion necessary. + * + * @return (feat_t *) descriptor if successful, NULL if error. Caller + * must not directly modify the contents of the returned value. + */ +feat_t *feat_init(char const *type,/**< In: Type of feature stream */ + cmn_type_t cmn, /**< In: Type of cepstram mean normalization to + be done before feature computation; can be + CMN_NONE (for none) */ + int32 varnorm, /**< In: (boolean) Whether variance + normalization done on each utt; only + applicable if CMN also done */ + agc_type_t agc, /**< In: Type of automatic gain control to be + done before feature computation */ + int32 breport, /**< In: Whether to show a report for feat_t */ + int32 cepsize /**< Number of components in the input vector + (or 0 for the default for this feature type, + which is usually 13) */ + ); + +/** + * Add an LDA transformation to the feature module from a file. + * @return 0 for success or -1 if reading the LDA file failed. + **/ +int32 feat_read_lda(feat_t *feat, /**< In: Descriptor from feat_init() */ + const char *ldafile, /**< In: File to read the LDA matrix from. */ + int32 dim /**< In: Dimensionality of LDA output. */ + ); + +/** + * Transform a block of features using the feature module's LDA transform. + **/ +void feat_lda_transform(feat_t *fcb, /**< In: Descriptor from feat_init() */ + mfcc_t ***inout_feat, /**< Feature block to transform. */ + uint32 nfr /**< In: Number of frames in inout_feat. */ + ); + +/** + * Add a subvector specification to the feature module. + * + * The subvector splitting will be performed after dynamic feature + * computation, CMN, AGC, and any LDA transformation. The number of + * streams in the dynamic feature type must be one, as with LDA. + * + * After adding a subvector specification, the output of feature + * computation will be split into multiple subvectors, and + * feat_array_alloc() will allocate pointers accordingly. The number + * of streams will remain the + * + * @param fcb the feature descriptor. + * @param subvecs subvector specification. This pointer is retained + * by the feat_t and should not be freed manually. + * @return 0 for success or -1 if the subvector specification was + * invalid. + */ +int feat_set_subvecs(feat_t *fcb, int32 **subvecs); + +/** + * Print the given block of feature vectors to the given FILE. + */ +void feat_print(feat_t *fcb, /**< In: Descriptor from feat_init() */ + mfcc_t ***feat, /**< In: Feature data to be printed */ + int32 nfr, /**< In: Number of frames of feature data above */ + FILE *fp /**< In: Output file pointer */ + ); + + +/** + * Read a specified MFC file (or given segment within it), perform + * CMN/AGC as indicated by fcb, and compute feature + * vectors. Feature vectors are computed for the entire segment + * specified, by including additional surrounding or padding frames to + * accommodate the feature windows. + * + * @return Number of frames of feature vectors computed if successful; + * -1 if any error. If feat is NULL, then no actual + * computation will be done, and the number of frames which must be + * allocated will be returned. + * + * A note on how the file path is constructed: If the control file + * already specifies extension or absolute path, then these are not + * applied. The default extension is defined by the application. + */ +int32 feat_s2mfc2feat(feat_t *fcb, /**< In: Descriptor from feat_init() */ + const char *file, /**< In: File to be read */ + const char *dir, /**< In: Directory prefix for file, + if needed; can be NULL */ + const char *cepext,/**< In: Extension of the + cepstrum file.It cannot be + NULL */ + int32 sf, int32 ef, /* Start/End frames + within file to be read. Use + 0,-1 to process entire + file */ + mfcc_t ***feat, /**< Out: Computed feature vectors; + caller must allocate this space */ + int32 maxfr /**< In: Available space (number of frames) in + above feat array; it must be + sufficient to hold the result. + Pass -1 for no limit. */ + ); + + +/** + * Feature computation routine for live mode decoder. + * + * This function computes features for blocks of incoming data. It + * retains an internal buffer for computing deltas, which means that + * the number of output frames will not necessarily equal the number + * of input frames. + * + * It is very important to realize that the number of + * output frames can be greater than the number of + * input frames, specifically when endutt is true. It is + * guaranteed to never exceed *inout_ncep + + * feat_window_size(fcb). You MUST have + * allocated at least that many frames in ofeat, or you + * will experience a buffer overflow. + * + * If beginutt and endutt are both true, CMN_CURRENT and AGC_MAX will + * be done. Otherwise only CMN_PRIOR and AGC_EMAX will be done. + * + * If beginutt is false, endutt is true, and the number of input + * frames exceeds the input size, then end-of-utterance processing + * won't actually be done. This condition can easily be checked, + * because *inout_ncep will equal the return value on + * exit, and will also be smaller than the value of + * *inout_ncep on entry. + * + * @return The number of output frames actually computed. + **/ +int32 feat_s2mfc2feat_live(feat_t *fcb, /**< In: Descriptor from feat_init() */ + mfcc_t **uttcep, /**< In: Incoming cepstral buffer */ + int32 *inout_ncep,/**< In: Size of incoming buffer. + Out: Number of incoming frames consumed. */ + int32 beginutt, /**< In: Beginning of utterance flag */ + int32 endutt, /**< In: End of utterance flag */ + mfcc_t ***ofeat /**< In: Output feature buffer. See + VERY IMPORTANT note + about the size of this buffer above. */ + ); + + +/** + * Update the normalization stats, possibly in the end of utterance + * + */ +void feat_update_stats(feat_t *fcb); + + +/** + * Retain ownership of feat_t. + * + * @return pointer to retained feat_t. + */ +feat_t *feat_retain(feat_t *f); + +/** + * Release resource associated with feat_t + * + * @return new reference count (0 if freed) + */ +int feat_free(feat_t *f /**< In: feat_t */ + ); + +/** + * Report the feat_t data structure + */ +void feat_report(feat_t *f /**< In: feat_t */ + ); +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/src/feat/lda.c b/src/feat/lda.c new file mode 100644 index 0000000..7fc0407 --- /dev/null +++ b/src/feat/lda.c @@ -0,0 +1,159 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * lda.c -- Read and apply LDA matrices to features. + * + * Author: David Huggins-Daines + */ + +#include +#include +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef _MSC_VER +#pragma warning (disable: 4018) +#endif + +#include + +#include "feat/feat.h" +#include "util/ckd_alloc.h" +#include "util/bio.h" + +#define MATRIX_FILE_VERSION "0.1" + +int32 +feat_read_lda(feat_t *feat, const char *ldafile, int32 dim) +{ + FILE *fh; + int32 byteswap; + uint32 chksum, i, m, n; + char **argname, **argval; + + assert(feat); + if (feat->n_stream != 1) { + E_ERROR("LDA incompatible with multi-stream features (n_stream = %d)\n", + feat->n_stream); + return -1; + } + + if ((fh = fopen(ldafile, "rb")) == NULL) { + E_ERROR_SYSTEM("Failed to open transform file '%s' for reading", ldafile); + return -1; + } + + if (bio_readhdr(fh, &argname, &argval, &byteswap) < 0) { + E_ERROR("Failed to read header from transform file '%s'\n", ldafile); + fclose(fh); + return -1; + } + + for (i = 0; argname[i]; i++) { + if (strcmp(argname[i], "version") == 0) { + if (strcmp(argval[i], MATRIX_FILE_VERSION) != 0) + E_WARN("%s: Version mismatch: %s, expecting %s\n", + ldafile, argval[i], MATRIX_FILE_VERSION); + } + } + + bio_hdrarg_free(argname, argval); + argname = argval = NULL; + + chksum = 0; + + if (feat->lda) + ckd_free_3d((void ***)feat->lda); + + { + /* Use a temporary variable to avoid strict-aliasing problems. */ + void ***outlda; + + if (bio_fread_3d(&outlda, sizeof(float32), + &feat->n_lda, &m, &n, + fh, byteswap, &chksum) < 0) { + E_ERROR_SYSTEM("%s: bio_fread_3d(lda) failed\n", ldafile); + fclose(fh); + return -1; + } + feat->lda = (void *)outlda; + } + fclose(fh); + +#ifdef FIXED_POINT + /* FIXME: This is a fragile hack that depends on mfcc_t and + * float32 being the same size (which they are, but...) */ + for (i = 0; i < feat->n_lda * m * n; ++i) { + feat->lda[0][0][i] = FLOAT2MFCC(((float *)feat->lda[0][0])[i]); + } +#endif + + /* Note that SphinxTrain stores the eigenvectors as row vectors. */ + if (n != feat->stream_len[0]) + E_FATAL("LDA matrix dimension %d doesn't match feature stream size %d\n", n, feat->stream_len[0]); + + /* Override dim from file if it is 0 or greater than m. */ + if ((uint32)dim > m || dim <= 0) { + dim = m; + } + feat->out_dim = dim; + + return 0; +} + +void +feat_lda_transform(feat_t *fcb, mfcc_t ***inout_feat, uint32 nfr) +{ + mfcc_t *tmp; + uint32 i, j, k; + + tmp = ckd_calloc(fcb->stream_len[0], sizeof(mfcc_t)); + for (i = 0; i < nfr; ++i) { + /* Do the matrix multiplication inline here since fcb->lda + * is transposed (eigenvectors in rows not columns). */ + /* FIXME: In the future we ought to use the BLAS. */ + memset(tmp, 0, sizeof(mfcc_t) * fcb->stream_len[0]); + for (j = 0; j < feat_dimension(fcb); ++j) { + for (k = 0; k < fcb->stream_len[0]; ++k) { + tmp[j] += MFCCMUL(inout_feat[i][0][k], fcb->lda[0][j][k]); + } + } + memcpy(inout_feat[i][0], tmp, fcb->stream_len[0] * sizeof(mfcc_t)); + } + ckd_free(tmp); +} diff --git a/src/libpocketsphinx/fsg_history.c b/src/fsg_history.c similarity index 92% rename from src/libpocketsphinx/fsg_history.c rename to src/fsg_history.c index 25c6eb0..63f4312 100644 --- a/src/libpocketsphinx/fsg_history.c +++ b/src/fsg_history.c @@ -48,15 +48,10 @@ * Started.. */ -/* System headers. */ #include -/* SphinxBase headers. */ -#include -#include -#include - -/* Local headers. */ +#include +#include "util/ckd_alloc.h" #include "fsg_search_internal.h" #include "fsg_history.h" @@ -284,6 +279,7 @@ fsg_history_utt_start(fsg_history_t * h) void fsg_history_utt_end(fsg_history_t * h) { + (void)h; } void @@ -291,27 +287,24 @@ fsg_history_print(fsg_history_t *h, dict_t *dict) { int bpidx, bp; + (void)dict; for (bpidx = 0; bpidx < blkarray_list_n_valid(h->entries); bpidx++) { bp = bpidx; printf("History entry: "); while (bp > 0) { fsg_hist_entry_t *hist_entry = fsg_history_entry_get(h, bp); - fsg_link_t *fl = fsg_hist_entry_fsglink(hist_entry); - char const *baseword; - int32 wid; - bp = fsg_hist_entry_pred(hist_entry); - wid = fsg_link_wid(fl); - - if (fl == NULL) - continue; - - baseword = fsg_model_word_str(h->fsg, wid); - - printf("%s(%d->%d:%d) ", baseword, - fsg_link_from_state(hist_entry->fsglink), - fsg_link_to_state(hist_entry->fsglink), - hist_entry->frame); - } - printf("\n"); + fsg_link_t *fl = fsg_hist_entry_fsglink(hist_entry); + bp = fsg_hist_entry_pred(hist_entry); + if (fl) { + int32 wid = fsg_link_wid(fl); + const char *baseword = fsg_model_word_str(h->fsg, wid); + + printf("%s(%d->%d:%d) ", baseword, + fsg_link_from_state(hist_entry->fsglink), + fsg_link_to_state(hist_entry->fsglink), + hist_entry->frame); + } + } + printf("\n"); } } diff --git a/src/libpocketsphinx/fsg_history.h b/src/fsg_history.h similarity index 96% rename from src/libpocketsphinx/fsg_history.h rename to src/fsg_history.h index 5eaad65..44b6f0b 100644 --- a/src/libpocketsphinx/fsg_history.h +++ b/src/fsg_history.h @@ -75,15 +75,20 @@ #define __S2_FSG_HISTORY_H__ -/* SphinxBase headers. */ -#include -#include +#include -/* Local headers. */ -#include "blkarray_list.h" +#include "lm/fsg_model.h" +#include "util/blkarray_list.h" #include "fsg_lextree.h" #include "dict.h" +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + /* * The Viterbi history structure. This is a tree, with the root at the * FSG start state, at frame 0, with a null predecessor. @@ -150,7 +155,7 @@ typedef struct fsg_history_s { /* - * One-time intialization: Allocate and return an initially empty history + * One-time initialization: Allocate and return an initially empty history * module. */ fsg_history_t *fsg_history_init(fsg_model_t *fsg, dict_t *dict); @@ -186,7 +191,7 @@ void fsg_history_entry_add (fsg_history_t *h, void fsg_history_end_frame (fsg_history_t *h); -/* Clear the hitory table */ +/* Clear the history table */ void fsg_history_reset (fsg_history_t *h); @@ -212,4 +217,8 @@ void fsg_history_free (fsg_history_t *h); /* Print the entire history */ void fsg_history_print(fsg_history_t *h, dict_t *dict); +#ifdef __cplusplus +} /* extern "C" */ +#endif + #endif diff --git a/src/libpocketsphinx/fsg_lextree.c b/src/fsg_lextree.c similarity index 97% rename from src/libpocketsphinx/fsg_lextree.c rename to src/fsg_lextree.c index 573f06b..b237195 100644 --- a/src/libpocketsphinx/fsg_lextree.c +++ b/src/fsg_lextree.c @@ -38,16 +38,13 @@ * @author Bhiksha Raj */ -/* System headers. */ #include #include #include -/* SphinxBase headers. */ -#include -#include +#include -/* Local headers. */ +#include "util/ckd_alloc.h" #include "fsg_lextree.h" #define __FSG_DBG__ 0 @@ -495,7 +492,7 @@ psubtree_add_trans(fsg_lextree_t *lextree, if (glist && glist->glist) { assert(glist->ci == ci && glist->rc == rc); /* We've found a valid glist. Hook to it and move to next phoneme */ - E_DEBUG(2,("Found match for (%d,%d)\n", ci, rc)); + E_DEBUG("Found match for (%d,%d)\n", ci, rc); lc_pnodelist = glist->glist; /* Set the predecessor node for the future tree first */ pred = (fsg_pnode_t *) gnode_ptr(lc_pnodelist); @@ -576,7 +573,7 @@ psubtree_add_trans(fsg_lextree_t *lextree, } if (pnode && (hmm_nonmpx_ssid(&pnode->hmm) == ssid && !pnode->leaf)) { /* Found the ssid; go to next phoneme */ - E_DEBUG(2,("Found match for %d\n", ci)); + E_DEBUG("Found match for %d\n", ci); pred = pnode; continue; } @@ -688,9 +685,9 @@ psubtree_add_trans(fsg_lextree_t *lextree, glist_free(rc_pnodelist); } - E_DEBUG(2,("Allocated %d HMMs (%d lc, %d rc, %d internal)\n", - n_lc_alloc + n_rc_alloc + n_int_alloc, - n_lc_alloc, n_rc_alloc, n_int_alloc)); + E_DEBUG("Allocated %d HMMs (%d lc, %d rc, %d internal)\n", + n_lc_alloc + n_rc_alloc + n_int_alloc, + n_lc_alloc, n_rc_alloc, n_int_alloc); *alloc_head = head; return root; @@ -728,15 +725,15 @@ fsg_psubtree_init(fsg_lextree_t *lextree, if (fsg_link_wid(fsglink) < 0) continue; - E_DEBUG(2,("Building lextree for arc from %d to %d: %s\n", - from_state, dst, fsg_model_word_str(fsg, fsg_link_wid(fsglink)))); + E_DEBUG("Building lextree for arc from %d to %d: %s\n", + from_state, dst, fsg_model_word_str(fsg, fsg_link_wid(fsglink))); root = psubtree_add_trans(lextree, root, &glist, fsglink, lextree->lc[from_state], lextree->rc[dst], alloc_head); ++n_arc; } - E_DEBUG(2,("State %d has %d outgoing arcs\n", from_state, n_arc)); + E_DEBUG("State %d has %d outgoing arcs\n", from_state, n_arc); fsg_glist_linklist_free(glist); diff --git a/src/libpocketsphinx/fsg_lextree.h b/src/fsg_lextree.h similarity index 98% rename from src/libpocketsphinx/fsg_lextree.h rename to src/fsg_lextree.h index 563065c..2c2ea9e 100644 --- a/src/libpocketsphinx/fsg_lextree.h +++ b/src/fsg_lextree.h @@ -39,15 +39,20 @@ #ifndef __S2_FSG_LEXTREE_H__ #define __S2_FSG_LEXTREE_H__ -/* SphinxBase headers. */ -#include -#include +#include -/* Local headers. */ +#include "lm/fsg_model.h" #include "hmm.h" #include "dict.h" #include "dict2pid.h" +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + /* * Compile-time constant determining the size of the * bitvector fsg_pnode_t.fsg_pnode_ctxt_t.bv. (See below.) @@ -57,7 +62,7 @@ */ #define FSG_PNODE_CTXT_BVSZ 4 -typedef struct { +typedef struct fsg_pnode_ctxt_s { uint32 bv[FSG_PNODE_CTXT_BVSZ]; } fsg_pnode_ctxt_t; @@ -252,4 +257,8 @@ void fsg_pnode_add_all_ctxt(fsg_pnode_ctxt_t *ctxt); */ uint32 fsg_pnode_ctxt_sub_generic(fsg_pnode_ctxt_t *src, fsg_pnode_ctxt_t *sub); +#ifdef __cplusplus +} /* extern "C" */ +#endif + #endif diff --git a/src/libpocketsphinx/fsg_search.c b/src/fsg_search.c similarity index 94% rename from src/libpocketsphinx/fsg_search.c rename to src/fsg_search.c index 09969c9..d4db17c 100644 --- a/src/libpocketsphinx/fsg_search.c +++ b/src/fsg_search.c @@ -48,19 +48,15 @@ * Started. */ -/* System headers. */ #include #include #include -/* SphinxBase headers. */ -#include -#include -#include -#include +#include -/* Local headers. */ #include "pocketsphinx_internal.h" +#include "util/ckd_alloc.h" +#include "util/strfuncs.h" #include "ps_lattice_internal.h" #include "fsg_search_internal.h" #include "fsg_history.h" @@ -69,6 +65,7 @@ /* Turn this on for detailed debugging dump */ #define __FSG_DBG__ 0 #define __FSG_DBG_CHAN__ 0 +#define __FSG_ALLOW_BESTPATH__ 1 static ps_seg_t *fsg_search_seg_iter(ps_search_t *search); static ps_lattice_t *fsg_search_lattice(ps_search_t *search); @@ -108,7 +105,7 @@ fsg_search_add_silences(fsg_search_t *fsgs, fsg_model_t *fsg) */ /* Add silence self-loops to all states. */ fsg_model_add_silence(fsg, "", -1, - cmd_ln_float32_r(ps_search_config(fsgs), "-silprob")); + ps_config_float(ps_search_config(fsgs), "silprob")); n_sil = 0; /* Add self-loops for all other fillers. */ for (wid = dict_filler_start(dict); wid < dict_filler_end(dict); ++wid) { @@ -116,7 +113,7 @@ fsg_search_add_silences(fsg_search_t *fsgs, fsg_model_t *fsg) if (wid == dict_startwid(dict) || wid == dict_finishwid(dict)) continue; fsg_model_add_silence(fsg, word, -1, - cmd_ln_float32_r(ps_search_config(fsgs), "-fillprob")); + ps_config_float(ps_search_config(fsgs), "fillprob")); ++n_sil; } @@ -177,7 +174,7 @@ fsg_search_add_altpron(fsg_search_t *fsgs, fsg_model_t *fsg) ps_search_t * fsg_search_init(const char *name, fsg_model_t *fsg, - cmd_ln_t *config, + ps_config_t *config, acmod_t *acmod, dict_t *dict, dict2pid_t *d2p) @@ -194,33 +191,33 @@ fsg_search_init(const char *name, return NULL; } - /* Intialize the search history object */ + /* Initialize the search history object */ fsgs->history = fsg_history_init(NULL, dict); fsgs->frame = -1; /* Get search pruning parameters */ fsgs->beam_factor = 1.0f; fsgs->beam = fsgs->beam_orig - = (int32) logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-beam")) + = (int32) logmath_log(acmod->lmath, ps_config_float(config, "beam")) >> SENSCR_SHIFT; fsgs->pbeam = fsgs->pbeam_orig - = (int32) logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-pbeam")) + = (int32) logmath_log(acmod->lmath, ps_config_float(config, "pbeam")) >> SENSCR_SHIFT; fsgs->wbeam = fsgs->wbeam_orig - = (int32) logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-wbeam")) + = (int32) logmath_log(acmod->lmath, ps_config_float(config, "wbeam")) >> SENSCR_SHIFT; /* LM related weights/penalties */ - fsgs->lw = cmd_ln_float32_r(config, "-lw"); - fsgs->pip = (int32) (logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-pip")) + fsgs->lw = ps_config_float(config, "lw"); + fsgs->pip = (int32) (logmath_log(acmod->lmath, ps_config_float(config, "pip")) * fsgs->lw) >> SENSCR_SHIFT; - fsgs->wip = (int32) (logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-wip")) + fsgs->wip = (int32) (logmath_log(acmod->lmath, ps_config_float(config, "wip")) * fsgs->lw) >> SENSCR_SHIFT; /* Acoustic score scale for posterior probabilities. */ - fsgs->ascale = 1.0 / cmd_ln_float32_r(config, "-ascale"); + fsgs->ascale = 1.0 / ps_config_float(config, "ascale"); E_INFO("FSG(beam: %d, pbeam: %d, wbeam: %d; wip: %d, pip: %d)\n", fsgs->beam_orig, fsgs->pbeam_orig, fsgs->wbeam_orig, @@ -231,14 +228,21 @@ fsg_search_init(const char *name, return NULL; } - if (cmd_ln_boolean_r(config, "-fsgusefiller") && + if (ps_config_bool(config, "fsgusefiller") && !fsg_model_has_sil(fsg)) fsg_search_add_silences(fsgs, fsg); - if (cmd_ln_boolean_r(config, "-fsgusealtpron") && + if (ps_config_bool(config, "fsgusealtpron") && !fsg_model_has_alt(fsg)) fsg_search_add_altpron(fsgs, fsg); +#if __FSG_ALLOW_BESTPATH__ + /* If bestpath is enabled, hypotheses are generated from a ps_lattice_t. + * This is not allowed by default because it tends to be very slow. */ + if (ps_config_bool(config, "bestpath")) + fsgs->bestpath = TRUE; +#endif + if (fsg_search_reinit(ps_search_base(fsgs), ps_search_dict(fsgs), ps_search_dict2pid(fsgs)) < 0) @@ -258,7 +262,7 @@ fsg_search_free(ps_search_t *search) fsg_search_t *fsgs = (fsg_search_t *)search; double n_speech = (double)fsgs->n_tot_frame - / cmd_ln_int32_r(ps_search_config(fsgs), "-frate"); + / ps_config_int(ps_search_config(fsgs), "frate"); E_INFO("TOTAL fsg %.2f CPU %.3f xRT\n", fsgs->perf.t_tot_cpu, @@ -373,7 +377,7 @@ fsg_search_hmm_eval(fsg_search_t *fsgs) fsgs->n_hmm_eval += n; /* Adjust beams if #active HMMs larger than absolute threshold */ - maxhmmpf = cmd_ln_int32_r(ps_search_config(fsgs), "-maxhmmpf"); + maxhmmpf = ps_config_int(ps_search_config(fsgs), "maxhmmpf"); if (maxhmmpf != -1 && n > maxhmmpf) { /* * Too many HMMs active; reduce the beam factor applied to the default @@ -470,8 +474,8 @@ fsg_search_pnode_exit(fsg_search_t *fsgs, fsg_pnode_t * pnode) if (fsg_model_is_filler(fsgs->fsg, wid) /* FIXME: This might be slow due to repeated calls to dict_to_id(). */ || (dict_is_single_phone(ps_search_dict(fsgs), - dict_wordid(ps_search_dict(fsgs), - fsg_model_word_str(fsgs->fsg, wid))))) { + dict_wordid(ps_search_dict(fsgs), + fsg_model_word_str(fsgs->fsg, wid))))) { /* Create a dummy context structure that applies to all right contexts */ fsg_pnode_add_all_ctxt(&ctxt); @@ -864,7 +868,7 @@ fsg_search_finish(ps_search_t *search) cf = ps_search_acmod(fsgs)->output_frame; if (cf > 0) { double n_speech = (double) (cf + 1) - / cmd_ln_int32_r(ps_search_config(fsgs), "-frate"); + / ps_config_int(ps_search_config(fsgs), "frate"); E_INFO("fsg %.2f CPU %.3f xRT\n", fsgs->perf.t_cpu, fsgs->perf.t_cpu / n_speech); E_INFO("fsg %.2f wall %.3f xRT\n", @@ -954,6 +958,7 @@ fsg_search_bestpath(ps_search_t *search, int32 *out_score, int backward) { fsg_search_t *fsgs = (fsg_search_t *)search; + (void)backward; if (search->last_link == NULL) { search->last_link = ps_lattice_bestpath(search->dag, NULL, 1.0, fsgs->ascale); @@ -985,7 +990,8 @@ fsg_search_hyp(ps_search_t *search, int32 *out_score) return NULL; } - /* If bestpath is enabled and the utterance is complete, then run it. */ + /* If bestpath is enabled and the utterance is complete, then run it. + * Note that setting bestpath in fsg_search_init is disabled by default. */ if (fsgs->bestpath && fsgs->final) { ps_lattice_t *dag; ps_latlink_t *link; @@ -1062,12 +1068,17 @@ fsg_seg_bp2itor(ps_seg_t *seg, fsg_hist_entry_t *hist_entry) if ((bp = fsg_hist_entry_pred(hist_entry)) >= 0) ph = fsg_history_entry_get(fsgs->history, bp); - seg->word = fsg_model_word_str(fsgs->fsg, hist_entry->fsglink->wid); + seg->text = fsg_model_word_str(fsgs->fsg, hist_entry->fsglink->wid); + /* Make sure to convert the word IDs!!! (unless they're null) */ + /* FIXME: Need to deal with tag transitions somehow. */ + if (hist_entry->fsglink->wid < 0) + seg->wid = hist_entry->fsglink->wid; + else + seg->wid = dict_wordid(seg->search->dict, seg->text); seg->ef = fsg_hist_entry_frame(hist_entry); seg->sf = ph ? fsg_hist_entry_frame(ph) + 1 : 0; /* This is kind of silly but it happens for null transitions. */ if (seg->sf > seg->ef) seg->sf = seg->ef; - seg->prob = 0; /* Bogus value... */ /* "Language model" score = transition probability. */ seg->lback = 1; seg->lscr = fsg_link_logs2prob(hist_entry->fsglink) >> SENSCR_SHIFT; @@ -1077,6 +1088,7 @@ fsg_seg_bp2itor(ps_seg_t *seg, fsg_hist_entry_t *hist_entry) } else seg->ascr = hist_entry->score - seg->lscr; + seg->prob = seg->lscr + seg->ascr; /* Somewhat approximate value... */ } @@ -1120,7 +1132,8 @@ fsg_search_seg_iter(ps_search_t *search) if (bpidx <= 0) return NULL; - /* If bestpath is enabled and the utterance is complete, then run it. */ + /* If bestpath is enabled and the utterance is complete, then run it. + * Note that setting bestpath in fsg_search_init is disabled by default. */ if (fsgs->bestpath && fsgs->final) { ps_lattice_t *dag; ps_latlink_t *link; @@ -1172,7 +1185,8 @@ fsg_search_prob(ps_search_t *search) { fsg_search_t *fsgs = (fsg_search_t *)search; - /* If bestpath is enabled and the utterance is complete, then run it. */ + /* If bestpath is enabled and the utterance is complete, then run it. + * Note that setting bestpath in fsg_search_init is disabled by default. */ if (fsgs->bestpath && fsgs->final) { ps_lattice_t *dag; ps_latlink_t *link; @@ -1194,6 +1208,7 @@ find_node(ps_lattice_t *dag, fsg_model_t *fsg, int sf, int32 wid, int32 node_id) { ps_latnode_t *node; + (void)fsg; for (node = dag->nodes; node; node = node->next) if ((node->sf == sf) && (node->wid == wid) && (node->node_id == node_id)) break; @@ -1247,7 +1262,7 @@ find_start_node(fsg_search_t *fsgs, ps_lattice_t *dag) /* Look for all nodes starting in frame zero with some exits. */ for (node = dag->nodes; node; node = node->next) { if (node->sf == 0 && node->exits) { - E_INFO("Start node %s.%d:%d:%d\n", + E_INFO("Start node candidate %s.%d:%d:%d\n", fsg_model_word_str(fsgs->fsg, node->wid), node->sf, node->fef, node->lef); start = glist_add_ptr(start, node); @@ -1286,7 +1301,7 @@ find_end_node(fsg_search_t *fsgs, ps_lattice_t *dag) /* Look for all nodes ending in last frame with some entries. */ for (node = dag->nodes; node; node = node->next) { if (node->lef == dag->n_frames - 1 && node->entries) { - E_INFO("End node %s.%d:%d:%d (%d)\n", + E_INFO("End node candidate %s.%d:%d:%d (%d)\n", fsg_model_word_str(fsgs->fsg, node->wid), node->sf, node->fef, node->lef, node->info.best_exit); end = glist_add_ptr(end, node); @@ -1341,6 +1356,7 @@ mark_reachable(ps_lattice_t *dag, ps_latnode_t *end) { glist_t q; + (void)dag; /* It doesn't matter which order we do this in. */ end->reachable = TRUE; q = glist_add_ptr(NULL, end); @@ -1537,11 +1553,11 @@ fsg_search_lattice(ps_search_t *search) int32 silpen, fillpen; silpen = (int32)(logmath_log(fsg->lmath, - cmd_ln_float32_r(ps_search_config(fsgs), "-silprob")) + ps_config_float(ps_search_config(fsgs), "silprob")) * fsg->lw) >> SENSCR_SHIFT; fillpen = (int32)(logmath_log(fsg->lmath, - cmd_ln_float32_r(ps_search_config(fsgs), "-fillprob")) + ps_config_float(ps_search_config(fsgs), "fillprob")) * fsg->lw) >> SENSCR_SHIFT; diff --git a/src/libpocketsphinx/fsg_search_internal.h b/src/fsg_search_internal.h similarity index 93% rename from src/libpocketsphinx/fsg_search_internal.h rename to src/fsg_search_internal.h index 7f31359..2bcba6c 100644 --- a/src/libpocketsphinx/fsg_search_internal.h +++ b/src/fsg_search_internal.h @@ -41,17 +41,22 @@ #define __S2_FSG_SEARCH_H__ -/* SphinxBase headers. */ -#include -#include -#include +#include -/* Local headers. */ +#include "util/glist.h" +#include "lm/fsg_model.h" #include "pocketsphinx_internal.h" #include "hmm.h" #include "fsg_history.h" #include "fsg_lextree.h" +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + /** * Segmentation "iterator" for FSG history. */ @@ -85,7 +90,8 @@ typedef struct fsg_search_s { beams to determine actual effective beams. For implementing absolute pruning. */ int32 beam, pbeam, wbeam; /**< Effective beams after applying beam_factor */ - int32 lw, pip, wip; /**< Language weights */ + float32 lw; /**< Language weight */ + int32 pip, wip; /**< Log insertion penalties */ frame_idx_t frame; /**< Current frame. */ uint8 final; /**< Decoding is finished for this utterance. */ @@ -114,7 +120,7 @@ typedef struct fsg_search_s { */ ps_search_t *fsg_search_init(const char *name, fsg_model_t *fsg, - cmd_ln_t *config, + ps_config_t *config, acmod_t *acmod, dict_t *dict, dict2pid_t *d2p); @@ -150,4 +156,8 @@ int fsg_search_finish(ps_search_t *search); */ char const *fsg_search_hyp(ps_search_t *search, int32 *out_score); +#ifdef __cplusplus +} /* extern "C" */ +#endif + #endif diff --git a/src/gst-plugin/Makefile.am b/src/gst-plugin/Makefile.am deleted file mode 100644 index d3f70bf..0000000 --- a/src/gst-plugin/Makefile.am +++ /dev/null @@ -1,29 +0,0 @@ -my_plugins = -my_headers = -my_files = -if BUILD_GST -my_plugins += libgstpocketsphinx.la -endif - -plugin_LTLIBRARIES = $(my_plugins) - -libgstpocketsphinx_la_SOURCES = gstpocketsphinx.c - -libgstpocketsphinx_la_LIBADD = \ - $(GST_LIBS) \ - -lgstaudio-$(GST_MAJORMINOR) \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la \ - -lsphinxbase - -libgstpocketsphinx_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) - -noinst_HEADERS = gstpocketsphinx.h - -AM_CFLAGS = \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include \ - $(GST_CFLAGS) \ - -DMODELDIR=\"$(pkgdatadir)/model\" - -EXTRA_DIST = livedemo.py livedemo.c - diff --git a/src/gst-plugin/Makefile.in b/src/gst-plugin/Makefile.in deleted file mode 100644 index 51b3b17..0000000 --- a/src/gst-plugin/Makefile.in +++ /dev/null @@ -1,685 +0,0 @@ -# Makefile.in generated by automake 1.13.4 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2013 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - - -VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -@BUILD_GST_TRUE@am__append_1 = libgstpocketsphinx.la -subdir = src/gst-plugin -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/depcomp $(noinst_HEADERS) -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ - $(top_srcdir)/m4/ax_python_devel.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(plugindir)" -LTLIBRARIES = $(plugin_LTLIBRARIES) -am__DEPENDENCIES_1 = -libgstpocketsphinx_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -am_libgstpocketsphinx_la_OBJECTS = gstpocketsphinx.lo -libgstpocketsphinx_la_OBJECTS = $(am_libgstpocketsphinx_la_OBJECTS) -AM_V_lt = $(am__v_lt_@AM_V@) -am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) -am__v_lt_0 = --silent -am__v_lt_1 = -libgstpocketsphinx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ - $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ - $(AM_CFLAGS) $(CFLAGS) $(libgstpocketsphinx_la_LDFLAGS) \ - $(LDFLAGS) -o $@ -@BUILD_GST_TRUE@am_libgstpocketsphinx_la_rpath = -rpath $(plugindir) -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -AM_V_CC = $(am__v_CC_@AM_V@) -am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) -am__v_CC_0 = @echo " CC " $@; -am__v_CC_1 = -CCLD = $(CC) -LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CCLD = $(am__v_CCLD_@AM_V@) -am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) -am__v_CCLD_0 = @echo " CCLD " $@; -am__v_CCLD_1 = -SOURCES = $(libgstpocketsphinx_la_SOURCES) -DIST_SOURCES = $(libgstpocketsphinx_la_SOURCES) -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -HEADERS = $(noinst_HEADERS) -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GST_CFLAGS = @GST_CFLAGS@ -GST_LIBS = @GST_LIBS@ -GST_MAJORMINOR = @GST_MAJORMINOR@ -GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ -GStreamer_CFLAGS = @GStreamer_CFLAGS@ -GStreamer_LIBS = @GStreamer_LIBS@ -HAVE_DOXYGEN = @HAVE_DOXYGEN@ -HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PKG_CONFIG = @PKG_CONFIG@ -PYTHON = @PYTHON@ -PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ -PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ -PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ -PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ -PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ -PYTHON_PLATFORM = @PYTHON_PLATFORM@ -PYTHON_PREFIX = @PYTHON_PREFIX@ -PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ -PYTHON_VERSION = @PYTHON_VERSION@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ -SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ -SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ -STRIP = @STRIP@ -SWIG = @SWIG@ -SWIG_LIB = @SWIG_LIB@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -pkgpyexecdir = @pkgpyexecdir@ -pkgpythondir = @pkgpythondir@ -plugindir = @plugindir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -pyexecdir = @pyexecdir@ -pythondir = @pythondir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -my_plugins = $(am__append_1) -my_headers = -my_files = -plugin_LTLIBRARIES = $(my_plugins) -libgstpocketsphinx_la_SOURCES = gstpocketsphinx.c -libgstpocketsphinx_la_LIBADD = \ - $(GST_LIBS) \ - -lgstaudio-$(GST_MAJORMINOR) \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la \ - -lsphinxbase - -libgstpocketsphinx_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -noinst_HEADERS = gstpocketsphinx.h -AM_CFLAGS = \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include \ - $(GST_CFLAGS) \ - -DMODELDIR=\"$(pkgdatadir)/model\" - -EXTRA_DIST = livedemo.py livedemo.c -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/gst-plugin/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign src/gst-plugin/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) - @$(NORMAL_INSTALL) - @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ - list2=; for p in $$list; do \ - if test -f $$p; then \ - list2="$$list2 $$p"; \ - else :; fi; \ - done; \ - test -z "$$list2" || { \ - echo " $(MKDIR_P) '$(DESTDIR)$(plugindir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(plugindir)" || exit 1; \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ - } - -uninstall-pluginLTLIBRARIES: - @$(NORMAL_UNINSTALL) - @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ - for p in $$list; do \ - $(am__strip_dir) \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ - done - -clean-pluginLTLIBRARIES: - -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) - @list='$(plugin_LTLIBRARIES)'; \ - locs=`for p in $$list; do echo $$p; done | \ - sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ - sort -u`; \ - test -z "$$locs" || { \ - echo rm -f $${locs}; \ - rm -f $${locs}; \ - } - -libgstpocketsphinx.la: $(libgstpocketsphinx_la_OBJECTS) $(libgstpocketsphinx_la_DEPENDENCIES) $(EXTRA_libgstpocketsphinx_la_DEPENDENCIES) - $(AM_V_CCLD)$(libgstpocketsphinx_la_LINK) $(am_libgstpocketsphinx_la_rpath) $(libgstpocketsphinx_la_OBJECTS) $(libgstpocketsphinx_la_LIBADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstpocketsphinx.Plo@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-am - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-am - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(LTLIBRARIES) $(HEADERS) -installdirs: - for dir in "$(DESTDIR)$(plugindir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: install-pluginLTLIBRARIES - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-pluginLTLIBRARIES - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-pluginLTLIBRARIES cscopelist-am ctags \ - ctags-am distclean distclean-compile distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-pluginLTLIBRARIES install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ - uninstall-pluginLTLIBRARIES - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/src/libpocketsphinx/hmm.c b/src/hmm.c similarity index 99% rename from src/libpocketsphinx/hmm.c rename to src/hmm.c index 73b2c98..396282c 100644 --- a/src/libpocketsphinx/hmm.c +++ b/src/hmm.c @@ -39,17 +39,14 @@ * @file hmm.h Implementation of HMM base structure. */ -/* System headers. */ #include #include #include #include -/* SphinxBase headers. */ -#include -#include +#include -/* Local headers. */ +#include "util/ckd_alloc.h" #include "hmm.h" hmm_context_t * @@ -110,6 +107,7 @@ hmm_init(hmm_context_t *ctx, hmm_t *hmm, int mpx, int ssid, int tmatid) void hmm_deinit(hmm_t *hmm) { + (void)hmm; } void diff --git a/src/libpocketsphinx/hmm.h b/src/hmm.h similarity index 97% rename from src/libpocketsphinx/hmm.h rename to src/hmm.h index 2bfb462..8755c34 100644 --- a/src/libpocketsphinx/hmm.h +++ b/src/hmm.h @@ -42,19 +42,18 @@ #ifndef __HMM_H__ #define __HMM_H__ -/* System headers. */ #include -/* SphinxBase headers. */ -#include -#include - -/* PocketSphinx headers. */ +#include "fe/fixpoint.h" +#include "util/listelem_alloc.h" #include "bin_mdef.h" #ifdef __cplusplus extern "C" { #endif +#if 0 +} +#endif /** * Type for frame index values. Used in HMM indexes and @@ -140,7 +139,7 @@ typedef int32 frame_idx_t; * * We assume that the initial state is emitting and that the * transition matrix is n_emit_state x (n_emit_state+1), where the - * extra destination dimension correponds to the non-emitting final or + * extra destination dimension corresponds to the non-emitting final or * exit state. */ typedef struct hmm_context_s { @@ -300,7 +299,7 @@ void hmm_dump(hmm_t *h, /**< In/Out: HMM being updated */ #ifdef __cplusplus -} +} /* extern "C" */ #endif #endif /* __HMM_H__ */ diff --git a/src/jsmn.h b/src/jsmn.h new file mode 100644 index 0000000..acb753f --- /dev/null +++ b/src/jsmn.h @@ -0,0 +1,473 @@ +/* + * MIT License + * + * Copyright (c) 2010 Serge Zaitsev + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#ifndef JSMN_H +#define JSMN_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef JSMN_STATIC +#define JSMN_API static +#else +#define JSMN_API extern +#endif + +/** + * JSON type identifier. Basic types are: + * o Object + * o Array + * o String + * o Other primitive: number, boolean (true/false) or null + */ +typedef enum { + JSMN_UNDEFINED = 0, + JSMN_OBJECT = 1 << 0, + JSMN_ARRAY = 1 << 1, + JSMN_STRING = 1 << 2, + JSMN_PRIMITIVE = 1 << 3 +} jsmntype_t; + +enum jsmnerr { + /* Not enough tokens were provided */ + JSMN_ERROR_NOMEM = -1, + /* Invalid character inside JSON string */ + JSMN_ERROR_INVAL = -2, + /* The string is not a full JSON packet, more bytes expected */ + JSMN_ERROR_PART = -3 +}; + +/** + * JSON token description. + * type type (object, array, string etc.) + * start start position in JSON data string + * end end position in JSON data string + */ +typedef struct jsmntok { + jsmntype_t type; + int start; + int end; + int size; +#ifdef JSMN_PARENT_LINKS + int parent; +#endif +} jsmntok_t; + +/** + * JSON parser. Contains an array of token blocks available. Also stores + * the string being parsed now and current position in that string. + */ +typedef struct jsmn_parser { + unsigned int pos; /* offset in the JSON string */ + unsigned int toknext; /* next token to allocate */ + int toksuper; /* superior token node, e.g. parent object or array */ +} jsmn_parser; + +/** + * Create JSON parser over an array of tokens + */ +JSMN_API void jsmn_init(jsmn_parser *parser); + +/** + * Run JSON parser. It parses a JSON data string into and array of tokens, each + * describing + * a single JSON object. + */ +JSMN_API int jsmn_parse(jsmn_parser *parser, const char *js, const size_t len, + jsmntok_t *tokens, const unsigned int num_tokens); + +#ifndef JSMN_HEADER +/** + * Allocates a fresh unused token from the token pool. + */ +static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser, jsmntok_t *tokens, + const size_t num_tokens) { + jsmntok_t *tok; + if (parser->toknext >= num_tokens) { + return NULL; + } + tok = &tokens[parser->toknext++]; + tok->start = tok->end = -1; + tok->size = 0; +#ifdef JSMN_PARENT_LINKS + tok->parent = -1; +#endif + return tok; +} + +/** + * Fills token type and boundaries. + */ +static void jsmn_fill_token(jsmntok_t *token, const jsmntype_t type, + const int start, const int end) { + token->type = type; + token->start = start; + token->end = end; + token->size = 0; +} + +/** + * Fills next available token with JSON primitive. + */ +static int jsmn_parse_primitive(jsmn_parser *parser, const char *js, + const size_t len, jsmntok_t *tokens, + const size_t num_tokens) { + jsmntok_t *token; + int start; + + start = parser->pos; + + for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { + switch (js[parser->pos]) { +#ifndef JSMN_STRICT + /* In strict mode primitive must be followed by "," or "}" or "]" */ + case ':': +#endif + case '\t': + case '\r': + case '\n': + case ' ': + case ',': + case ']': + case '}': + goto found; + default: + /* to quiet a warning from gcc*/ + break; + } + if (js[parser->pos] < 32 || js[parser->pos] >= 127) { + parser->pos = start; + return JSMN_ERROR_INVAL; + } + } +#ifdef JSMN_STRICT + /* In strict mode primitive must be followed by a comma/object/array */ + parser->pos = start; + return JSMN_ERROR_PART; +#endif + +found: + if (tokens == NULL) { + parser->pos--; + return 0; + } + token = jsmn_alloc_token(parser, tokens, num_tokens); + if (token == NULL) { + parser->pos = start; + return JSMN_ERROR_NOMEM; + } + jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos); +#ifdef JSMN_PARENT_LINKS + token->parent = parser->toksuper; +#endif + parser->pos--; + return 0; +} + +/** + * Fills next token with JSON string. + */ +static int jsmn_parse_string(jsmn_parser *parser, const char *js, + const size_t len, jsmntok_t *tokens, + const size_t num_tokens) { + jsmntok_t *token; + + int start = parser->pos; + + /* Skip starting quote */ + parser->pos++; + + for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { + char c = js[parser->pos]; + + /* Quote: end of string */ + if (c == '\"') { + if (tokens == NULL) { + return 0; + } + token = jsmn_alloc_token(parser, tokens, num_tokens); + if (token == NULL) { + parser->pos = start; + return JSMN_ERROR_NOMEM; + } + jsmn_fill_token(token, JSMN_STRING, start + 1, parser->pos); +#ifdef JSMN_PARENT_LINKS + token->parent = parser->toksuper; +#endif + return 0; + } + + /* Backslash: Quoted symbol expected */ + if (c == '\\' && parser->pos + 1 < len) { + /* int i; */ + parser->pos++; + switch (js[parser->pos]) { + /* Allowed escaped symbols */ + case '\"': + case '/': + case '\\': + case 'b': + case 'f': + case 'r': + case 'n': + case 't': + break; +#if 0 /* FIXME: PocketSphinx not supporting these at the moment */ + /* Allows escaped symbol \uXXXX */ + case 'u': + parser->pos++; + for (i = 0; i < 4 && parser->pos < len && js[parser->pos] != '\0'; + i++) { + /* If it isn't a hex character we have an error */ + if (!((js[parser->pos] >= 48 && js[parser->pos] <= 57) || /* 0-9 */ + (js[parser->pos] >= 65 && js[parser->pos] <= 70) || /* A-F */ + (js[parser->pos] >= 97 && js[parser->pos] <= 102))) { /* a-f */ + parser->pos = start; + return JSMN_ERROR_INVAL; + } + parser->pos++; + } + parser->pos--; + break; +#endif + /* Unexpected symbol */ + default: + parser->pos = start; + return JSMN_ERROR_INVAL; + } + } + } + parser->pos = start; + return JSMN_ERROR_PART; +} + +/** + * Parse JSON string and fill tokens. + */ +JSMN_API int jsmn_parse(jsmn_parser *parser, const char *js, const size_t len, + jsmntok_t *tokens, const unsigned int num_tokens) { + int r; + int i; + jsmntok_t *token; + int count = parser->toknext; + + for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { + char c; + jsmntype_t type; + + c = js[parser->pos]; + switch (c) { + case '{': + case '[': + count++; + if (tokens == NULL) { + break; + } + token = jsmn_alloc_token(parser, tokens, num_tokens); + if (token == NULL) { + return JSMN_ERROR_NOMEM; + } + if (parser->toksuper != -1) { + jsmntok_t *t = &tokens[parser->toksuper]; +#ifdef JSMN_STRICT + /* In strict mode an object or array can't become a key */ + if (t->type == JSMN_OBJECT) { + return JSMN_ERROR_INVAL; + } +#endif + t->size++; +#ifdef JSMN_PARENT_LINKS + token->parent = parser->toksuper; +#endif + } + token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY); + token->start = parser->pos; + parser->toksuper = parser->toknext - 1; + break; + case '}': + case ']': + if (tokens == NULL) { + break; + } + type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY); +#ifdef JSMN_PARENT_LINKS + if (parser->toknext < 1) { + return JSMN_ERROR_INVAL; + } + token = &tokens[parser->toknext - 1]; + for (;;) { + if (token->start != -1 && token->end == -1) { + if (token->type != type) { + return JSMN_ERROR_INVAL; + } + token->end = parser->pos + 1; + parser->toksuper = token->parent; + break; + } + if (token->parent == -1) { + if (token->type != type || parser->toksuper == -1) { + return JSMN_ERROR_INVAL; + } + break; + } + token = &tokens[token->parent]; + } +#else + for (i = parser->toknext - 1; i >= 0; i--) { + token = &tokens[i]; + if (token->start != -1 && token->end == -1) { + if (token->type != type) { + return JSMN_ERROR_INVAL; + } + parser->toksuper = -1; + token->end = parser->pos + 1; + break; + } + } + /* Error if unmatched closing bracket */ + if (i == -1) { + return JSMN_ERROR_INVAL; + } + for (; i >= 0; i--) { + token = &tokens[i]; + if (token->start != -1 && token->end == -1) { + parser->toksuper = i; + break; + } + } +#endif + break; + case '\"': + r = jsmn_parse_string(parser, js, len, tokens, num_tokens); + if (r < 0) { + return r; + } + count++; + if (parser->toksuper != -1 && tokens != NULL) { + tokens[parser->toksuper].size++; + } + break; + case '\t': + case '\r': + case '\n': + case ' ': + break; + case ':': + parser->toksuper = parser->toknext - 1; + break; + case ',': + if (tokens != NULL && parser->toksuper != -1 && + tokens[parser->toksuper].type != JSMN_ARRAY && + tokens[parser->toksuper].type != JSMN_OBJECT) { +#ifdef JSMN_PARENT_LINKS + parser->toksuper = tokens[parser->toksuper].parent; +#else + for (i = parser->toknext - 1; i >= 0; i--) { + if (tokens[i].type == JSMN_ARRAY || tokens[i].type == JSMN_OBJECT) { + if (tokens[i].start != -1 && tokens[i].end == -1) { + parser->toksuper = i; + break; + } + } + } +#endif + } + break; +#ifdef JSMN_STRICT + /* In strict mode primitives are: numbers and booleans */ + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 't': + case 'f': + case 'n': + /* And they must not be keys of the object */ + if (tokens != NULL && parser->toksuper != -1) { + const jsmntok_t *t = &tokens[parser->toksuper]; + if (t->type == JSMN_OBJECT || + (t->type == JSMN_STRING && t->size != 0)) { + return JSMN_ERROR_INVAL; + } + } +#else + /* In non-strict mode every unquoted value is a primitive */ + default: +#endif + r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens); + if (r < 0) { + return r; + } + count++; + if (parser->toksuper != -1 && tokens != NULL) { + tokens[parser->toksuper].size++; + } + break; + +#ifdef JSMN_STRICT + /* Unexpected char in strict mode */ + default: + return JSMN_ERROR_INVAL; +#endif + } + } + + if (tokens != NULL) { + for (i = parser->toknext - 1; i >= 0; i--) { + /* Unmatched opened object or array */ + if (tokens[i].start != -1 && tokens[i].end == -1) { + return JSMN_ERROR_PART; + } + } + } + + return count; +} + +/** + * Creates a new parser based over a given buffer with an array of tokens + * available. + */ +JSMN_API void jsmn_init(jsmn_parser *parser) { + parser->pos = 0; + parser->toknext = 0; + parser->toksuper = -1; +} + +#endif /* JSMN_HEADER */ + +#ifdef __cplusplus +} +#endif + +#endif /* JSMN_H */ diff --git a/src/libpocketsphinx/kws_detections.c b/src/kws_detections.c similarity index 96% rename from src/libpocketsphinx/kws_detections.c rename to src/kws_detections.c index 1a5890e..22f956a 100644 --- a/src/libpocketsphinx/kws_detections.c +++ b/src/kws_detections.c @@ -102,6 +102,7 @@ kws_detections_hyp_str(kws_detections_t *detections, int frame, int delay) hyp_str = (char *)ckd_calloc(len, sizeof(char)); c = hyp_str; + detections->detect_list = glist_reverse(detections->detect_list); for (gn = detections->detect_list; gn; gn = gnode_next(gn)) { kws_detection_t *det = (kws_detection_t *)gnode_ptr(gn); if (det->ef < frame - delay) { @@ -115,6 +116,7 @@ kws_detections_hyp_str(kws_detections_t *detections, int frame, int delay) c--; *c = '\0'; } + detections->detect_list = glist_reverse(detections->detect_list); return hyp_str; } diff --git a/src/libpocketsphinx/kws_detections.h b/src/kws_detections.h similarity index 95% rename from src/libpocketsphinx/kws_detections.h rename to src/kws_detections.h index 855c3bc..c79a5cd 100644 --- a/src/libpocketsphinx/kws_detections.h +++ b/src/kws_detections.h @@ -39,13 +39,17 @@ #ifndef __KWS_DETECTIONS_H__ #define __KWS_DETECTIONS_H__ -/* SphinxBase headers. */ -#include - -/* Local headers. */ +#include "util/glist.h" #include "pocketsphinx_internal.h" #include "hmm.h" +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + typedef struct kws_detection_s { const char* keyphrase; frame_idx_t sf; @@ -73,4 +77,8 @@ void kws_detections_add(kws_detections_t *detections, const char* keyphrase, int */ char* kws_detections_hyp_str(kws_detections_t *detections, int frame, int delay); +#ifdef __cplusplus +} /* extern "C" */ +#endif + #endif /* __KWS_DETECTIONS_H__ */ diff --git a/src/libpocketsphinx/kws_search.c b/src/kws_search.c similarity index 92% rename from src/libpocketsphinx/kws_search.c rename to src/kws_search.c index 9f7fbd2..35c38df 100644 --- a/src/libpocketsphinx/kws_search.c +++ b/src/kws_search.c @@ -40,12 +40,11 @@ #include #include -#include -#include -#include -#include -#include +#include +#include "util/ckd_alloc.h" +#include "util/strfuncs.h" +#include "util/pio.h" #include "pocketsphinx_internal.h" #include "kws_search.h" @@ -62,12 +61,14 @@ different models. Corresponds to threshold of about 1e+50 */ static ps_lattice_t * kws_search_lattice(ps_search_t * search) { + (void)search; return NULL; } static int kws_search_prob(ps_search_t * search) { + (void)search; return 0; } @@ -75,15 +76,17 @@ static void kws_seg_free(ps_seg_t *seg) { kws_seg_t *itor = (kws_seg_t *)seg; + ckd_free(itor->detections); ckd_free(itor); } static void kws_seg_fill(kws_seg_t *itor) { - kws_detection_t* detection = (kws_detection_t*)gnode_ptr(itor->detection); + kws_detection_t* detection = itor->detections[itor->pos]; - itor->base.word = detection->keyphrase; + itor->base.text = detection->keyphrase; + itor->base.wid = BAD_S3WID; itor->base.sf = detection->sf; itor->base.ef = detection->ef; itor->base.prob = detection->prob; @@ -96,12 +99,7 @@ kws_seg_next(ps_seg_t *seg) { kws_seg_t *itor = (kws_seg_t *)seg; - gnode_t *detect_head = gnode_next(itor->detection); - while (detect_head != NULL && ((kws_detection_t*)gnode_ptr(detect_head))->ef > itor->last_frame) - detect_head = gnode_next(detect_head); - itor->detection = detect_head; - - if (!itor->detection) { + if (++itor->pos == itor->n_detections) { kws_seg_free(seg); return NULL; } @@ -122,6 +120,7 @@ kws_search_seg_iter(ps_search_t * search) kws_search_t *kwss = (kws_search_t *)search; kws_seg_t *itor; gnode_t *detect_head = kwss->detections->detect_list; + gnode_t *gn; while (detect_head != NULL && ((kws_detection_t*)gnode_ptr(detect_head))->ef > kwss->frame - kwss->delay) detect_head = gnode_next(detect_head); @@ -129,11 +128,23 @@ kws_search_seg_iter(ps_search_t * search) if (!detect_head) return NULL; - itor = (kws_seg_t *)ckd_calloc(1, sizeof(*itor)); + /* Count and reverse them into the vector. */ + itor = ckd_calloc(1, sizeof(*itor)); + for (gn = detect_head; gn; gn = gnode_next(gn)) + itor->n_detections++; + itor->detections = ckd_calloc(itor->n_detections, sizeof(*itor->detections)); + itor->pos = itor->n_detections - 1; + for (gn = detect_head; gn; gn = gnode_next(gn)) + itor->detections[itor->pos--] = (kws_detection_t *)gnode_ptr(gn); + itor->pos = 0; + + /* Copy the detections here to get them in the right order and + * avoid undefined behaviour if recognition continues during + * iteration. */ + itor->base.vt = &kws_segfuncs; itor->base.search = search; itor->base.lwf = 1.0; - itor->detection = detect_head; itor->last_frame = kwss->frame - kwss->delay; kws_seg_fill(itor); return (ps_seg_t *)itor; @@ -374,7 +385,7 @@ ps_search_t * kws_search_init(const char *name, const char *keyphrase, const char *keyfile, - cmd_ln_t * config, + ps_config_t * config, acmod_t * acmod, dict_t * dict, dict2pid_t * d2p) { kws_search_t *kwss = (kws_search_t *) ckd_calloc(1, sizeof(*kwss)); @@ -385,22 +396,19 @@ kws_search_init(const char *name, kwss->beam = (int32) logmath_log(acmod->lmath, - cmd_ln_float64_r(config, - "-beam")) >> SENSCR_SHIFT; + ps_config_float(config, "beam")) >> SENSCR_SHIFT; kwss->plp = (int32) logmath_log(acmod->lmath, - cmd_ln_float32_r(config, - "-kws_plp")) >> SENSCR_SHIFT; + ps_config_float(config, "kws_plp")) >> SENSCR_SHIFT; kwss->def_threshold = (int32) logmath_log(acmod->lmath, - cmd_ln_float64_r(config, - "-kws_threshold")) >> - SENSCR_SHIFT; + ps_config_float(config, + "kws_threshold")) >> SENSCR_SHIFT; - kwss->delay = (int32) cmd_ln_int32_r(config, "-kws_delay"); + kwss->delay = (int32) ps_config_int(config, "kws_delay"); E_INFO("KWS(beam: %d, plp: %d, default threshold %d, delay %d)\n", kwss->beam, kwss->plp, kwss->def_threshold, kwss->delay); @@ -441,7 +449,7 @@ kws_search_free(ps_search_t * search) kwss = (kws_search_t *) search; n_speech = (double)kwss->n_tot_frame - / cmd_ln_int32_r(ps_search_config(kwss), "-frate"); + / ps_config_int(ps_search_config(kwss), "frate"); E_INFO("TOTAL kws %.2f CPU %.3f xRT\n", kwss->perf.t_tot_cpu, @@ -651,7 +659,7 @@ kws_search_finish(ps_search_t * search) cf = ps_search_acmod(kwss)->output_frame; if (cf > 0) { double n_speech = (double) (cf + 1) - / cmd_ln_int32_r(ps_search_config(kwss), "-frate"); + / ps_config_int(ps_search_config(kwss), "frate"); E_INFO("kws %.2f CPU %.3f xRT\n", kwss->perf.t_cpu, kwss->perf.t_cpu / n_speech); E_INFO("kws %.2f wall %.3f xRT\n", diff --git a/src/libpocketsphinx/kws_search.h b/src/kws_search.h similarity index 88% rename from src/libpocketsphinx/kws_search.h rename to src/kws_search.h index c820afb..9f9a7b2 100644 --- a/src/libpocketsphinx/kws_search.h +++ b/src/kws_search.h @@ -39,22 +39,29 @@ #ifndef __KWS_SEARCH_H__ #define __KWS_SEARCH_H__ -/* SphinxBase headers. */ -#include -#include +#include -/* Local headers. */ +#include "util/glist.h" #include "pocketsphinx_internal.h" #include "kws_detections.h" #include "hmm.h" +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + /** * Segmentation "iterator" for KWS history. */ typedef struct kws_seg_s { - ps_seg_t base; /**< Base structure. */ - gnode_t *detection; /**< Keyphrase detection correspondent to segment. */ - frame_idx_t last_frame; /**< Last frame to raise the detection */ + ps_seg_t base; /**< Base structure. */ + kws_detection_t **detections; /**< Vector of current detections. */ + frame_idx_t last_frame; /**< Last frame to raise the detection. */ + int n_detections; /**< Size of vector. */ + int pos; /**< Position of iterator. */ } kws_seg_t; typedef struct kws_keyphrase_s { @@ -99,7 +106,7 @@ typedef struct kws_search_s { ps_search_t *kws_search_init(const char *name, const char *keyphrase, const char *keyfile, - cmd_ln_t * config, + ps_config_t * config, acmod_t * acmod, dict_t * dict, dict2pid_t * d2p); @@ -139,4 +146,8 @@ char const *kws_search_hyp(ps_search_t * search, int32 * out_score); */ char* kws_search_get_keyphrases(ps_search_t * search); +#ifdef __cplusplus +} /* extern "C" */ +#endif + #endif /* __KWS_SEARCH_H__ */ diff --git a/src/libpocketsphinx/Makefile.am b/src/libpocketsphinx/Makefile.am deleted file mode 100644 index 0c70ca2..0000000 --- a/src/libpocketsphinx/Makefile.am +++ /dev/null @@ -1,75 +0,0 @@ -ARCH = `uname -m | sed s/i.86/i386/`_`uname -s | tr A-Z a-z` - -lib_LTLIBRARIES = libpocketsphinx.la - -libpocketsphinx_la_LDFLAGS = -version-info 3:0:0 -lm - -libpocketsphinx_la_SOURCES = \ - acmod.c \ - bin_mdef.c \ - blkarray_list.c \ - dict.c \ - dict2pid.c \ - fsg_history.c \ - fsg_lextree.c \ - fsg_search.c \ - allphone_search.c \ - kws_search.c \ - kws_detections.c \ - hmm.c \ - mdef.c \ - ms_gauden.c \ - ms_mgau.c \ - ms_senone.c \ - ngram_search.c \ - ngram_search_fwdtree.c \ - ngram_search_fwdflat.c \ - phone_loop_search.c \ - ps_alignment.c \ - ps_lattice.c \ - ps_mllr.c \ - ptm_mgau.c \ - s2_semi_mgau.c \ - state_align_search.c \ - tmat.c \ - vector.c \ - pocketsphinx.c - -noinst_HEADERS = \ - pocketsphinx_internal.h \ - acmod.h \ - ngram_search.h \ - bin_mdef.h \ - blkarray_list.h \ - dict.h \ - dict2pid.h \ - fsg_history.h \ - fsg_lextree.h \ - fsg_search_internal.h \ - allphone_search.h \ - kws_search.h \ - kws_detections.h \ - hmm.h \ - mdef.h \ - ms_gauden.h \ - ms_mgau.h \ - ms_senone.h \ - ngram_search.h \ - ngram_search_fwdtree.h \ - ngram_search_fwdflat.h \ - phone_loop_search.h \ - ps_alignment.h \ - ps_lattice_internal.h \ - ptm_mgau.h \ - s2_semi_mgau.h \ - s3types.h \ - state_align_search.h \ - tied_mgau_common.h \ - tmat.h \ - vector.h - -AM_CFLAGS =\ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include \ - -DMODELDIR=\"${prefix}/share/pocketsphinx/model\" - diff --git a/src/libpocketsphinx/Makefile.in b/src/libpocketsphinx/Makefile.in deleted file mode 100644 index 71efe31..0000000 --- a/src/libpocketsphinx/Makefile.in +++ /dev/null @@ -1,767 +0,0 @@ -# Makefile.in generated by automake 1.13.4 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2013 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - - -VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = src/libpocketsphinx -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/depcomp $(noinst_HEADERS) -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ - $(top_srcdir)/m4/ax_python_devel.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(libdir)" -LTLIBRARIES = $(lib_LTLIBRARIES) -libpocketsphinx_la_LIBADD = -am_libpocketsphinx_la_OBJECTS = acmod.lo bin_mdef.lo blkarray_list.lo \ - dict.lo dict2pid.lo fsg_history.lo fsg_lextree.lo \ - fsg_search.lo allphone_search.lo kws_search.lo \ - kws_detections.lo hmm.lo mdef.lo ms_gauden.lo ms_mgau.lo \ - ms_senone.lo ngram_search.lo ngram_search_fwdtree.lo \ - ngram_search_fwdflat.lo phone_loop_search.lo ps_alignment.lo \ - ps_lattice.lo ps_mllr.lo ptm_mgau.lo s2_semi_mgau.lo \ - state_align_search.lo tmat.lo vector.lo pocketsphinx.lo -libpocketsphinx_la_OBJECTS = $(am_libpocketsphinx_la_OBJECTS) -AM_V_lt = $(am__v_lt_@AM_V@) -am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) -am__v_lt_0 = --silent -am__v_lt_1 = -libpocketsphinx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ - $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ - $(AM_CFLAGS) $(CFLAGS) $(libpocketsphinx_la_LDFLAGS) \ - $(LDFLAGS) -o $@ -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -AM_V_CC = $(am__v_CC_@AM_V@) -am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) -am__v_CC_0 = @echo " CC " $@; -am__v_CC_1 = -CCLD = $(CC) -LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CCLD = $(am__v_CCLD_@AM_V@) -am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) -am__v_CCLD_0 = @echo " CCLD " $@; -am__v_CCLD_1 = -SOURCES = $(libpocketsphinx_la_SOURCES) -DIST_SOURCES = $(libpocketsphinx_la_SOURCES) -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -HEADERS = $(noinst_HEADERS) -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GST_CFLAGS = @GST_CFLAGS@ -GST_LIBS = @GST_LIBS@ -GST_MAJORMINOR = @GST_MAJORMINOR@ -GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ -GStreamer_CFLAGS = @GStreamer_CFLAGS@ -GStreamer_LIBS = @GStreamer_LIBS@ -HAVE_DOXYGEN = @HAVE_DOXYGEN@ -HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PKG_CONFIG = @PKG_CONFIG@ -PYTHON = @PYTHON@ -PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ -PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ -PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ -PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ -PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ -PYTHON_PLATFORM = @PYTHON_PLATFORM@ -PYTHON_PREFIX = @PYTHON_PREFIX@ -PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ -PYTHON_VERSION = @PYTHON_VERSION@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ -SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ -SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ -STRIP = @STRIP@ -SWIG = @SWIG@ -SWIG_LIB = @SWIG_LIB@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -pkgpyexecdir = @pkgpyexecdir@ -pkgpythondir = @pkgpythondir@ -plugindir = @plugindir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -pyexecdir = @pyexecdir@ -pythondir = @pythondir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -ARCH = `uname -m | sed s/i.86/i386/`_`uname -s | tr A-Z a-z` -lib_LTLIBRARIES = libpocketsphinx.la -libpocketsphinx_la_LDFLAGS = -version-info 3:0:0 -lm -libpocketsphinx_la_SOURCES = \ - acmod.c \ - bin_mdef.c \ - blkarray_list.c \ - dict.c \ - dict2pid.c \ - fsg_history.c \ - fsg_lextree.c \ - fsg_search.c \ - allphone_search.c \ - kws_search.c \ - kws_detections.c \ - hmm.c \ - mdef.c \ - ms_gauden.c \ - ms_mgau.c \ - ms_senone.c \ - ngram_search.c \ - ngram_search_fwdtree.c \ - ngram_search_fwdflat.c \ - phone_loop_search.c \ - ps_alignment.c \ - ps_lattice.c \ - ps_mllr.c \ - ptm_mgau.c \ - s2_semi_mgau.c \ - state_align_search.c \ - tmat.c \ - vector.c \ - pocketsphinx.c - -noinst_HEADERS = \ - pocketsphinx_internal.h \ - acmod.h \ - ngram_search.h \ - bin_mdef.h \ - blkarray_list.h \ - dict.h \ - dict2pid.h \ - fsg_history.h \ - fsg_lextree.h \ - fsg_search_internal.h \ - allphone_search.h \ - kws_search.h \ - kws_detections.h \ - hmm.h \ - mdef.h \ - ms_gauden.h \ - ms_mgau.h \ - ms_senone.h \ - ngram_search.h \ - ngram_search_fwdtree.h \ - ngram_search_fwdflat.h \ - phone_loop_search.h \ - ps_alignment.h \ - ps_lattice_internal.h \ - ptm_mgau.h \ - s2_semi_mgau.h \ - s3types.h \ - state_align_search.h \ - tied_mgau_common.h \ - tmat.h \ - vector.h - -AM_CFLAGS = \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/include \ - -DMODELDIR=\"${prefix}/share/pocketsphinx/model\" - -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/libpocketsphinx/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign src/libpocketsphinx/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -install-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ - list2=; for p in $$list; do \ - if test -f $$p; then \ - list2="$$list2 $$p"; \ - else :; fi; \ - done; \ - test -z "$$list2" || { \ - echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ - } - -uninstall-libLTLIBRARIES: - @$(NORMAL_UNINSTALL) - @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ - for p in $$list; do \ - $(am__strip_dir) \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ - done - -clean-libLTLIBRARIES: - -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; \ - locs=`for p in $$list; do echo $$p; done | \ - sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ - sort -u`; \ - test -z "$$locs" || { \ - echo rm -f $${locs}; \ - rm -f $${locs}; \ - } - -libpocketsphinx.la: $(libpocketsphinx_la_OBJECTS) $(libpocketsphinx_la_DEPENDENCIES) $(EXTRA_libpocketsphinx_la_DEPENDENCIES) - $(AM_V_CCLD)$(libpocketsphinx_la_LINK) -rpath $(libdir) $(libpocketsphinx_la_OBJECTS) $(libpocketsphinx_la_LIBADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acmod.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/allphone_search.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bin_mdef.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blkarray_list.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dict.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dict2pid.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsg_history.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsg_lextree.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsg_search.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hmm.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kws_detections.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kws_search.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mdef.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ms_gauden.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ms_mgau.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ms_senone.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ngram_search.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ngram_search_fwdflat.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ngram_search_fwdtree.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/phone_loop_search.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pocketsphinx.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ps_alignment.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ps_lattice.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ps_mllr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptm_mgau.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s2_semi_mgau.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/state_align_search.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tmat.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector.Plo@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-am - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-am - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(LTLIBRARIES) $(HEADERS) -installdirs: - for dir in "$(DESTDIR)$(libdir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-libLTLIBRARIES - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-libLTLIBRARIES - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ - clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \ - ctags-am distclean distclean-compile distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-libLTLIBRARIES install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/src/lm/_jsgf_scanner.l b/src/lm/_jsgf_scanner.l new file mode 100644 index 0000000..8ca20ba --- /dev/null +++ b/src/lm/_jsgf_scanner.l @@ -0,0 +1,87 @@ +/* -*- mode: text -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* YOU MUST USE FLEX 2.6.1 OR NEWER TO PROCESS THIS FILE!!! */ +%{ + +#include "lm/jsgf_internal.h" +#include "lm/jsgf_parser.h" + +%} + +%option 8bit reentrant bison-bridge noyywrap yylineno never-interactive nounput nounistd +%option header-file="jsgf_scanner.h" +%s COMMENT +%s DECL +%s DECLCOMMENT + +ws [ \t\r\n] +rulename \<[^<>]+\> +tag \{(\\.|[^\}]+)*\} +weight \/[0-9]*(\.[0-9]+)?(e-)?[0-9]*\/ +token [^ \t\r\n=;|*+<>()\[\]{}*/]+ +qstring \"(\\.|[^"]+)*\" +bom [\xEF][\xBB][\xBF] + +%% + +{ws} ; /* ignore whitespace */ +\/\/.*\n ; /* single-line comments */ +\/\* { BEGIN(COMMENT); } /* C-style comments */ +\*\/ { BEGIN(INITIAL); } +. ; /* Ignore stuff in comment mode */ + +\/\/.*\n ; /* single-line comments inside decl */ +\/\* { BEGIN(DECLCOMMENT); } /* C-style comments inside decl */ +\*\/ { BEGIN(DECL); } +. ; /* Ignore stuff in comment mode */ + +{bom}?#JSGF {BEGIN(DECL); return HEADER;} +grammar {BEGIN(DECL); return GRAMMAR;} +import {BEGIN(DECL); return IMPORT;} +public {BEGIN(DECL); return PUBLIC;} + +{rulename} { BEGIN(DECL); yylval->name = strdup(yytext); return RULENAME; } +{rulename} { yylval->name = strdup(yytext); return RULENAME; } + +{tag} { yylval->name = strdup(yytext); return TAG; } +{token} { yylval->name = strdup(yytext); return TOKEN; } +; { BEGIN(INITIAL); return yytext[0]; } +{qstring} { yylval->name = strdup(yytext); return TOKEN; } +{weight} { yylval->weight = atof_c(yytext+1); return WEIGHT; } +. return yytext[0]; /* Single-character tokens */ + +%% diff --git a/src/lm/bitarr.c b/src/lm/bitarr.c new file mode 100644 index 0000000..fbb749d --- /dev/null +++ b/src/lm/bitarr.c @@ -0,0 +1,109 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * bitarr.c -- Bit array manipulations implementation. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "lm/bitarr.h" +#include "util/byteorder.h" + +uint64 bitarr_read_int57(bitarr_address_t address, uint8 length, uint64 mask) +{ + uint64 value64; + const uint8 *base_off = (const uint8 *)(address.base) + (address.offset >> 3); + (void)length; /* Yeah, what is this for anyway? */ + memcpy(&value64, base_off, sizeof(value64)); + SWAP_LE_64(&value64); + return (value64 >> (address.offset & 7)) & mask; +} + +void bitarr_write_int57(bitarr_address_t address, uint8 length, uint64 value) +{ + uint64 value64; + uint8 *base_off = (uint8 *)(address.base) + (address.offset >> 3); + (void)length; /* Yeah, what is this for anyway? */ + memcpy(&value64, base_off, sizeof(value64)); + SWAP_LE_64(&value64); + value64 |= (value << (address.offset & 7)); + SWAP_LE_64(&value64); + memcpy(base_off, &value64, sizeof(value64)); +} + +uint32 bitarr_read_int25(bitarr_address_t address, uint8 length, uint32 mask) +{ + uint32 value32; + const uint8 *base_off = (const uint8*)(address.base) + (address.offset >> 3); + (void)length; /* Yeah, what is this for anyway? */ + memcpy(&value32, base_off, sizeof(value32)); + SWAP_LE_32(&value32); + return (value32 >> (address.offset & 7)) & mask; +} + +void bitarr_write_int25(bitarr_address_t address, uint8 length, uint32 value) +{ + uint32 value32; + uint8 *base_off = (uint8 *)(address.base) + (address.offset >> 3); + (void)length; /* Yeah, what is this for anyway? */ + memcpy(&value32, base_off, sizeof(value32)); + SWAP_LE_32(&value32); + value32 |= (value << (address.offset & 7)); + SWAP_LE_32(&value32); + memcpy(base_off, &value32, sizeof(value32)); +} + +void bitarr_mask_from_max(bitarr_mask_t *bit_mask, uint32 max_value) +{ + bit_mask->bits = bitarr_required_bits(max_value); + bit_mask->mask = (uint32)((1ULL << bit_mask->bits) - 1); +} + +uint8 bitarr_required_bits(uint32 max_value) +{ + uint8 res; + + if (!max_value) return 0; + res = 1; + while (max_value >>= 1) res++; + return res; +} diff --git a/src/lm/bitarr.h b/src/lm/bitarr.h new file mode 100644 index 0000000..bd5d733 --- /dev/null +++ b/src/lm/bitarr.h @@ -0,0 +1,143 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef _LIBUTIL_BITARR_H_ +#define _LIBUTIL_BITARR_H_ + +#include + +#include + +/** + * @file bitarr.h + * @brief Cryptic KenLM-like bit arrays + * + * Implementation of basic operations of read/write digits consuming + * as little space as possible. + * + * I HAVE QUESTIONS. Why 25 and 57 bits? What are the other 7 bits + * *doing*?!? Why didn't you stop to think about architectures with + * big-endian byte ordering or strictly aligned memory access when you + * wrote this? Does it really store floats BECAUSE NO IT DOESN'T + * + * Note that because of the problems noted above data is canonically + * stored in little-endian order in memory. + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Structure that specifies bits required to efficiently store certain data + */ +typedef struct bitarr_mask_s { + uint8 bits; + uint32 mask; +} bitarr_mask_t; + +/** + * Structure that stores address of certain value in bit array + */ +typedef struct bitarr_address_s { + void *base; + uint32 offset; +} bitarr_address_t; + +/** + * Read uint64 value from bit array. + * Assumes mask == (1 << length) - 1 where length <= 57 + * @param address to read from + * @param length number of bits for value + * @param mask of read value + * @return uint64 value that was read + */ +uint64 bitarr_read_int57(bitarr_address_t address, uint8 length, uint64 mask); + +/** + * Write specified value into bit array. + * Assumes value < (1 << length) and length <= 57. + * Assumes the memory is zero initially. + * @param address to write to + * @param length amount of active bytes in value to write + * @param value integer to write + */ +void bitarr_write_int57(bitarr_address_t address, uint8 length, uint64 value); + +/** + * Read uint32 value from bit array. + * Assumes mask == (1 << length) - 1 where length <= 25 + * @param address to read from + * @param length number of bits for value + * @param mask of read value + * @return uint32 value that was read + */ +uint32 bitarr_read_int25(bitarr_address_t address, uint8 length, uint32 mask); + +/** + * Write specified value into bit array. + * Assumes value < (1 << length) and length <= 25. + * Assumes the memory is zero initially. + * @param address in bit array ti write to + * @param length amount of active bytes in value to write + * @param value integer to write + */ +void bitarr_write_int25(bitarr_address_t address, uint8 length, uint32 value); + +/** + * Fills mask for certain int range according to provided max value + * @param bit_mask mask that is filled + * @param max_value biggest integer that is going to be stored using this mask + */ +void bitarr_mask_from_max(bitarr_mask_t *bit_mask, uint32 max_value); + +/** + * Computes amount of bits required ti store integers upto value provided. + * @param max_value biggest integer that going to be stored using this amount of bits + * @return amount of bits required to store integers from range with maximum provided + */ +uint8 bitarr_required_bits(uint32 max_value); + +#ifdef __cplusplus +} +#endif + +#endif /* _LIBUTIL_BITARR_H_ */ diff --git a/src/lm/fsg_model.c b/src/lm/fsg_model.c new file mode 100644 index 0000000..9d1097f --- /dev/null +++ b/src/lm/fsg_model.c @@ -0,0 +1,1022 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include +#include +#include + +#include + +#include "util/pio.h" +#include "util/ckd_alloc.h" +#include "util/strfuncs.h" +#include "util/hash_table.h" +#include "util/bitvec.h" + +#include "lm/fsg_model.h" + +#define FSG_MODEL_BEGIN_DECL "FSG_BEGIN" +#define FSG_MODEL_END_DECL "FSG_END" +#define FSG_MODEL_N_DECL "N" +#define FSG_MODEL_NUM_STATES_DECL "NUM_STATES" +#define FSG_MODEL_S_DECL "S" +#define FSG_MODEL_START_STATE_DECL "START_STATE" +#define FSG_MODEL_F_DECL "F" +#define FSG_MODEL_FINAL_STATE_DECL "FINAL_STATE" +#define FSG_MODEL_T_DECL "T" +#define FSG_MODEL_TRANSITION_DECL "TRANSITION" +#define FSG_MODEL_COMMENT_CHAR '#' + + +static int32 +nextline_str2words(FILE * fp, int32 * lineno, + char **lineptr, char ***wordptr) +{ + for (;;) { + size_t len; + int32 n; + + ckd_free(*lineptr); + if ((*lineptr = fread_line(fp, &len)) == NULL) + return -1; + + (*lineno)++; + + if ((*lineptr)[0] == FSG_MODEL_COMMENT_CHAR) + continue; /* Skip comment lines */ + + n = str2words(*lineptr, NULL, 0); + if (n == 0) + continue; /* Skip blank lines */ + + /* Abuse of realloc(), but this doesn't have to be fast. */ + if (*wordptr == NULL) + *wordptr = ckd_calloc(n, sizeof(**wordptr)); + else + *wordptr = ckd_realloc(*wordptr, n * sizeof(**wordptr)); + return str2words(*lineptr, *wordptr, n); + } +} + +void +fsg_model_trans_add(fsg_model_t * fsg, + int32 from, int32 to, int32 logp, int32 wid) +{ + fsg_link_t *link; + glist_t gl; + gnode_t *gn; + + if (fsg->trans[from].trans == NULL) + fsg->trans[from].trans = hash_table_new(5, HASH_CASE_YES); + + /* Check for duplicate link (i.e., link already exists with label=wid) */ + for (gn = gl = fsg_model_trans(fsg, from, to); gn; gn = gnode_next(gn)) { + link = (fsg_link_t *) gnode_ptr(gn); + if (link->wid == wid) { + if (link->logs2prob < logp) + link->logs2prob = logp; + return; + } + } + + /* Create transition object */ + link = listelem_malloc(fsg->link_alloc); + link->from_state = from; + link->to_state = to; + link->logs2prob = logp; + link->wid = wid; + + /* Add it to the list of transitions and update the hash table */ + gl = glist_add_ptr(gl, (void *) link); + hash_table_replace_bkey(fsg->trans[from].trans, + (char const *) &link->to_state, + sizeof(link->to_state), gl); +} + +int32 +fsg_model_tag_trans_add(fsg_model_t * fsg, int32 from, int32 to, + int32 logp, int32 wid) +{ + fsg_link_t *link, *link2; + + (void)wid; + /* Check for transition probability */ + if (logp > 0) { + E_FATAL("Null transition prob must be <= 1.0 (state %d -> %d)\n", + from, to); + } + + /* Self-loop null transitions (with prob <= 1.0) are redundant */ + if (from == to) + return -1; + + if (fsg->trans[from].null_trans == NULL) + fsg->trans[from].null_trans = hash_table_new(5, HASH_CASE_YES); + + /* Check for a duplicate link; if found, keep the higher prob */ + link = fsg_model_null_trans(fsg, from, to); + if (link) { + if (link->logs2prob < logp) { + link->logs2prob = logp; + return 0; + } + else + return -1; + } + + /* Create null transition object */ + link = listelem_malloc(fsg->link_alloc); + link->from_state = from; + link->to_state = to; + link->logs2prob = logp; + link->wid = -1; + + link2 = (fsg_link_t *) + hash_table_enter_bkey(fsg->trans[from].null_trans, + (char const *) &link->to_state, + sizeof(link->to_state), link); + assert(link == link2); + (void)link2; + + return 1; +} + +int32 +fsg_model_null_trans_add(fsg_model_t * fsg, int32 from, int32 to, + int32 logp) +{ + return fsg_model_tag_trans_add(fsg, from, to, logp, -1); +} + +glist_t +fsg_model_null_trans_closure(fsg_model_t * fsg, glist_t nulls) +{ + gnode_t *gn1; + int updated; + fsg_link_t *tl1, *tl2; + int32 k, n; + + E_INFO("Computing transitive closure for null transitions\n"); + + /* If our caller didn't give us a list of null-transitions, + make such a list. Just loop through all the FSG states, + and all the null-transitions in that state (which are kept in + their own hash table). */ + if (nulls == NULL) { + int i; + for (i = 0; i < fsg->n_state; ++i) { + hash_iter_t *itor; + hash_table_t *null_trans = fsg->trans[i].null_trans; + if (null_trans == NULL) + continue; + for (itor = hash_table_iter(null_trans); + itor != NULL; itor = hash_table_iter_next(itor)) { + nulls = glist_add_ptr(nulls, hash_entry_val(itor->ent)); + } + } + } + + /* + * Probably not the most efficient closure implementation, in general, but + * probably reasonably efficient for a sparse null transition matrix. + */ + n = 0; + do { + updated = FALSE; + + for (gn1 = nulls; gn1; gn1 = gnode_next(gn1)) { + hash_iter_t *itor; + + tl1 = (fsg_link_t *) gnode_ptr(gn1); + assert(tl1->wid < 0); + + if (fsg->trans[tl1->to_state].null_trans == NULL) + continue; + + for (itor = + hash_table_iter(fsg->trans[tl1->to_state].null_trans); + itor; itor = hash_table_iter_next(itor)) { + + tl2 = (fsg_link_t *) hash_entry_val(itor->ent); + + k = fsg_model_null_trans_add(fsg, + tl1->from_state, + tl2->to_state, + tl1->logs2prob + + tl2->logs2prob); + if (k >= 0) { + updated = TRUE; + if (k > 0) { + nulls = glist_add_ptr(nulls, (void *) + fsg_model_null_trans + (fsg, tl1->from_state, + tl2->to_state)); + n++; + } + } + } + } + } while (updated); + + E_INFO("%d null transitions added\n", n); + + return nulls; +} + +glist_t +fsg_model_trans(fsg_model_t * fsg, int32 i, int32 j) +{ + void *val; + + if (fsg->trans[i].trans == NULL) + return NULL; + if (hash_table_lookup_bkey(fsg->trans[i].trans, (char const *) &j, + sizeof(j), &val) < 0) + return NULL; + return (glist_t) val; +} + +fsg_link_t * +fsg_model_null_trans(fsg_model_t * fsg, int32 i, int32 j) +{ + void *val; + + if (fsg->trans[i].null_trans == NULL) + return NULL; + if (hash_table_lookup_bkey(fsg->trans[i].null_trans, (char const *) &j, + sizeof(j), &val) < 0) + return NULL; + return (fsg_link_t *) val; +} + +fsg_arciter_t * +fsg_model_arcs(fsg_model_t * fsg, int32 i) +{ + fsg_arciter_t *itor; + + if (fsg->trans[i].trans == NULL && fsg->trans[i].null_trans == NULL) + return NULL; + itor = ckd_calloc(1, sizeof(*itor)); + if (fsg->trans[i].null_trans) + itor->null_itor = hash_table_iter(fsg->trans[i].null_trans); + if (fsg->trans[i].trans) + itor->itor = hash_table_iter(fsg->trans[i].trans); + if (itor->itor != NULL) + itor->gn = hash_entry_val(itor->itor->ent); + return itor; +} + +fsg_link_t * +fsg_arciter_get(fsg_arciter_t * itor) +{ + /* Iterate over non-null arcs first. */ + if (itor->gn) + return (fsg_link_t *) gnode_ptr(itor->gn); + else if (itor->null_itor) + return (fsg_link_t *) hash_entry_val(itor->null_itor->ent); + else + return NULL; +} + +fsg_arciter_t * +fsg_arciter_next(fsg_arciter_t * itor) +{ + /* Iterate over non-null arcs first. */ + if (itor->gn) { + itor->gn = gnode_next(itor->gn); + /* Move to the next destination arc. */ + if (itor->gn == NULL) { + itor->itor = hash_table_iter_next(itor->itor); + if (itor->itor != NULL) + itor->gn = hash_entry_val(itor->itor->ent); + else if (itor->null_itor == NULL) + goto stop_iteration; + } + } + else { + if (itor->null_itor == NULL) + goto stop_iteration; + itor->null_itor = hash_table_iter_next(itor->null_itor); + if (itor->null_itor == NULL) + goto stop_iteration; + } + return itor; + stop_iteration: + fsg_arciter_free(itor); + return NULL; + +} + +void +fsg_arciter_free(fsg_arciter_t * itor) +{ + if (itor == NULL) + return; + hash_table_iter_free(itor->null_itor); + hash_table_iter_free(itor->itor); + ckd_free(itor); +} + +int +fsg_model_word_id(fsg_model_t * fsg, char const *word) +{ + int wid; + + /* Search for an existing word matching this. */ + for (wid = 0; wid < fsg->n_word; ++wid) { + if (0 == strcmp(fsg->vocab[wid], word)) + break; + } + /* If not found, add this to the vocab. */ + if (wid == fsg->n_word) + return -1; + return wid; +} + +int +fsg_model_word_add(fsg_model_t * fsg, char const *word) +{ + int wid, old_size; + + /* Search for an existing word matching this. */ + wid = fsg_model_word_id(fsg, word); + /* If not found, add this to the vocab. */ + if (wid == -1) { + wid = fsg->n_word; + if (fsg->n_word == fsg->n_word_alloc) { + old_size = fsg->n_word_alloc; + fsg->n_word_alloc += 10; + fsg->vocab = ckd_realloc(fsg->vocab, + fsg->n_word_alloc * + sizeof(*fsg->vocab)); + if (fsg->silwords) + fsg->silwords = + bitvec_realloc(fsg->silwords, old_size, + fsg->n_word_alloc); + if (fsg->altwords) + fsg->altwords = + bitvec_realloc(fsg->altwords, old_size, + fsg->n_word_alloc); + } + ++fsg->n_word; + fsg->vocab[wid] = ckd_salloc(word); + } + return wid; +} + +int +fsg_model_add_silence(fsg_model_t * fsg, char const *silword, + int state, float32 silprob) +{ + int32 logsilp; + int n_trans, silwid, src; + + E_INFO("Adding silence transitions for %s to FSG\n", silword); + + silwid = fsg_model_word_add(fsg, silword); + logsilp = (int32) (logmath_log(fsg->lmath, silprob) * fsg->lw); + if (fsg->silwords == NULL) + fsg->silwords = bitvec_alloc(fsg->n_word_alloc); + bitvec_set(fsg->silwords, silwid); + + n_trans = 0; + if (state == -1) { + for (src = 0; src < fsg->n_state; src++) { + fsg_model_trans_add(fsg, src, src, logsilp, silwid); + ++n_trans; + } + } + else { + fsg_model_trans_add(fsg, state, state, logsilp, silwid); + ++n_trans; + } + + E_INFO("Added %d silence word transitions\n", n_trans); + return n_trans; +} + +int +fsg_model_add_alt(fsg_model_t * fsg, char const *baseword, + char const *altword) +{ + int i, basewid, altwid; + int ntrans; + + /* FIXME: This will get slow, eventually... */ + for (basewid = 0; basewid < fsg->n_word; ++basewid) + if (0 == strcmp(fsg->vocab[basewid], baseword)) + break; + if (basewid == fsg->n_word) { + E_ERROR("Base word %s not present in FSG vocabulary!\n", baseword); + return -1; + } + altwid = fsg_model_word_add(fsg, altword); + if (fsg->altwords == NULL) + fsg->altwords = bitvec_alloc(fsg->n_word_alloc); + bitvec_set(fsg->altwords, altwid); + if (fsg_model_is_filler(fsg, basewid)) { + if (fsg->silwords == NULL) + fsg->silwords = bitvec_alloc(fsg->n_word_alloc); + bitvec_set(fsg->silwords, altwid); + } + + E_DEBUG("Adding alternate word transitions (%s,%s) to FSG\n", + baseword, altword); + + /* Look for all transitions involving baseword and duplicate them. */ + /* FIXME: This will also get slow, eventually... */ + ntrans = 0; + for (i = 0; i < fsg->n_state; ++i) { + hash_iter_t *itor; + if (fsg->trans[i].trans == NULL) + continue; + for (itor = hash_table_iter(fsg->trans[i].trans); itor; + itor = hash_table_iter_next(itor)) { + glist_t trans; + gnode_t *gn; + + trans = hash_entry_val(itor->ent); + for (gn = trans; gn; gn = gnode_next(gn)) { + fsg_link_t *fl = gnode_ptr(gn); + if (fl->wid == basewid) { + fsg_link_t *link; + + /* Create transition object */ + link = listelem_malloc(fsg->link_alloc); + link->from_state = fl->from_state; + link->to_state = fl->to_state; + link->logs2prob = fl->logs2prob; /* FIXME!!!??? */ + link->wid = altwid; + + trans = glist_add_ptr(trans, (void *) link); + ++ntrans; + } + } + hash_entry_val(itor->ent) = trans; + } + } + + E_DEBUG("Added %d alternate word transitions\n", ntrans); + return ntrans; +} + + +fsg_model_t * +fsg_model_init(char const *name, logmath_t * lmath, float32 lw, + int32 n_state) +{ + fsg_model_t *fsg; + + /* Allocate basic stuff. */ + fsg = ckd_calloc(1, sizeof(*fsg)); + fsg->refcount = 1; + fsg->link_alloc = listelem_alloc_init(sizeof(fsg_link_t)); + fsg->lmath = lmath; + fsg->name = name ? ckd_salloc(name) : NULL; + fsg->n_state = n_state; + fsg->lw = lw; + + fsg->trans = ckd_calloc(fsg->n_state, sizeof(*fsg->trans)); + + return fsg; +} + +fsg_model_t * +fsg_model_read(FILE * fp, logmath_t * lmath, float32 lw) +{ + fsg_model_t *fsg; + hash_table_t *vocab; + hash_iter_t *itor; + int32 lastwid; + char **wordptr; + char *lineptr; + char *fsgname; + int32 lineno; + int32 n, i, j; + int n_state, n_trans, n_null_trans; + glist_t nulls; + float32 p; + + lineno = 0; + vocab = hash_table_new(32, FALSE); + wordptr = NULL; + lineptr = NULL; + nulls = NULL; + fsgname = NULL; + fsg = NULL; + + /* Scan upto FSG_BEGIN header */ + for (;;) { + n = nextline_str2words(fp, &lineno, &lineptr, &wordptr); + if (n < 0) { + E_ERROR("%s declaration missing\n", FSG_MODEL_BEGIN_DECL); + goto parse_error; + } + + if ((strcmp(wordptr[0], FSG_MODEL_BEGIN_DECL) == 0)) { + if (n > 2) { + E_ERROR("Line[%d]: malformed FSG_BEGIN declaration\n", + lineno); + goto parse_error; + } + break; + } + } + /* Save FSG name, or it will get clobbered below :(. + * If name is missing, try the default. + */ + if (n == 2) { + fsgname = ckd_salloc(wordptr[1]); + } + else { + E_WARN("FSG name is missing\n"); + fsgname = ckd_salloc("unknown"); + } + + /* Read #states */ + n = nextline_str2words(fp, &lineno, &lineptr, &wordptr); + if ((n != 2) + || ((strcmp(wordptr[0], FSG_MODEL_N_DECL) != 0) + && (strcmp(wordptr[0], FSG_MODEL_NUM_STATES_DECL) != 0)) + || (sscanf(wordptr[1], "%d", &n_state) != 1) + || (n_state <= 0)) { + E_ERROR + ("Line[%d]: #states declaration line missing or malformed\n", + lineno); + goto parse_error; + } + + /* Now create the FSG. */ + fsg = fsg_model_init(fsgname, lmath, lw, n_state); + ckd_free(fsgname); + fsgname = NULL; + + /* Read start state */ + n = nextline_str2words(fp, &lineno, &lineptr, &wordptr); + if ((n != 2) + || ((strcmp(wordptr[0], FSG_MODEL_S_DECL) != 0) + && (strcmp(wordptr[0], FSG_MODEL_START_STATE_DECL) != 0)) + || (sscanf(wordptr[1], "%d", &(fsg->start_state)) != 1) + || (fsg->start_state < 0) + || (fsg->start_state >= fsg->n_state)) { + E_ERROR + ("Line[%d]: start state declaration line missing or malformed\n", + lineno); + goto parse_error; + } + + /* Read final state */ + n = nextline_str2words(fp, &lineno, &lineptr, &wordptr); + if ((n != 2) + || ((strcmp(wordptr[0], FSG_MODEL_F_DECL) != 0) + && (strcmp(wordptr[0], FSG_MODEL_FINAL_STATE_DECL) != 0)) + || (sscanf(wordptr[1], "%d", &(fsg->final_state)) != 1) + || (fsg->final_state < 0) + || (fsg->final_state >= fsg->n_state)) { + E_ERROR + ("Line[%d]: final state declaration line missing or malformed\n", + lineno); + goto parse_error; + } + + /* Read transitions */ + lastwid = 0; + n_trans = n_null_trans = 0; + for (;;) { + int32 wid, tprob; + + n = nextline_str2words(fp, &lineno, &lineptr, &wordptr); + if (n <= 0) { + E_ERROR("Line[%d]: transition or FSG_END statement expected\n", + lineno); + goto parse_error; + } + + if ((strcmp(wordptr[0], FSG_MODEL_END_DECL) == 0)) { + break; + } + + if ((strcmp(wordptr[0], FSG_MODEL_T_DECL) == 0) + || (strcmp(wordptr[0], FSG_MODEL_TRANSITION_DECL) == 0)) { + + + if (((n != 4) && (n != 5)) + || (sscanf(wordptr[1], "%d", &i) != 1) + || (sscanf(wordptr[2], "%d", &j) != 1) + || (i < 0) || (i >= fsg->n_state) + || (j < 0) || (j >= fsg->n_state)) { + E_ERROR + ("Line[%d]: transition spec malformed; Expecting: from-state to-state trans-prob [word]\n", + lineno); + goto parse_error; + } + + p = atof_c(wordptr[3]); + if ((p <= 0.0) || (p > 1.0)) { + E_ERROR + ("Line[%d]: transition spec malformed; Expecting float as transition probability\n", + lineno); + goto parse_error; + } + } + else { + E_ERROR("Line[%d]: transition or FSG_END statement expected\n", + lineno); + goto parse_error; + } + + tprob = (int32) (logmath_log(lmath, p) * fsg->lw); + /* Add word to "dictionary". */ + if (n > 4) { + if (hash_table_lookup_int32(vocab, wordptr[4], &wid) < 0) { + (void) hash_table_enter_int32(vocab, + ckd_salloc(wordptr[4]), + lastwid); + wid = lastwid; + ++lastwid; + } + fsg_model_trans_add(fsg, i, j, tprob, wid); + ++n_trans; + } + else { + if (fsg_model_null_trans_add(fsg, i, j, tprob) == 1) { + ++n_null_trans; + nulls = + glist_add_ptr(nulls, fsg_model_null_trans(fsg, i, j)); + } + } + } + + E_INFO("FSG: %d states, %d unique words, %d transitions (%d null)\n", + fsg->n_state, hash_table_inuse(vocab), n_trans, n_null_trans); + + + /* Now create a string table from the "dictionary" */ + fsg->n_word = hash_table_inuse(vocab); + fsg->n_word_alloc = fsg->n_word + 10; /* Pad it a bit. */ + fsg->vocab = ckd_calloc(fsg->n_word_alloc, sizeof(*fsg->vocab)); + for (itor = hash_table_iter(vocab); itor; + itor = hash_table_iter_next(itor)) { + char const *word = hash_entry_key(itor->ent); + int32 wid = (int32) (size_t) hash_entry_val(itor->ent); + fsg->vocab[wid] = (char *) word; + } + hash_table_free(vocab); + + /* Do transitive closure on null transitions. FIXME: This is + * actually quite inefficient as it *creates* a lot of new links + * as opposed to just *calculating* the epsilon-closure for each + * state. Ideally we would epsilon-remove or determinize the FSG + * (but note that tag transitions are not really epsilons...) */ + nulls = fsg_model_null_trans_closure(fsg, nulls); + glist_free(nulls); + + ckd_free(lineptr); + ckd_free(wordptr); + + return fsg; + + parse_error: + for (itor = hash_table_iter(vocab); itor; + itor = hash_table_iter_next(itor)) + ckd_free((char *) hash_entry_key(itor->ent)); + glist_free(nulls); + hash_table_free(vocab); + ckd_free(fsgname); + ckd_free(lineptr); + ckd_free(wordptr); + fsg_model_free(fsg); + return NULL; +} + + +fsg_model_t * +fsg_model_readfile(const char *file, logmath_t * lmath, float32 lw) +{ + FILE *fp; + fsg_model_t *fsg; + + if ((fp = fopen(file, "r")) == NULL) { + E_ERROR_SYSTEM("Failed to open FSG file '%s' for reading", file); + return NULL; + } + fsg = fsg_model_read(fp, lmath, lw); + fclose(fp); + return fsg; +} + +fsg_model_t * +fsg_model_retain(fsg_model_t * fsg) +{ + ++fsg->refcount; + return fsg; +} + +static void +trans_list_free(fsg_model_t * fsg, int32 i) +{ + hash_iter_t *itor; + + /* FIXME (maybe): FSG links will all get freed when we call + * listelem_alloc_free() so don't bother freeing them explicitly + * here. */ + if (fsg->trans[i].trans) { + for (itor = hash_table_iter(fsg->trans[i].trans); + itor; itor = hash_table_iter_next(itor)) { + glist_t gl = (glist_t) hash_entry_val(itor->ent); + glist_free(gl); + } + } + hash_table_free(fsg->trans[i].trans); + hash_table_free(fsg->trans[i].null_trans); +} + +int +fsg_model_free(fsg_model_t * fsg) +{ + int i; + + if (fsg == NULL) + return 0; + + if (--fsg->refcount > 0) + return fsg->refcount; + + for (i = 0; i < fsg->n_word; ++i) + ckd_free(fsg->vocab[i]); + for (i = 0; i < fsg->n_state; ++i) + trans_list_free(fsg, i); + ckd_free(fsg->trans); + ckd_free(fsg->vocab); + listelem_alloc_free(fsg->link_alloc); + bitvec_free(fsg->silwords); + bitvec_free(fsg->altwords); + ckd_free(fsg->name); + ckd_free(fsg); + return 0; +} + + +void +fsg_model_write(fsg_model_t * fsg, FILE * fp) +{ + int32 i; + + fprintf(fp, "%s %s\n", FSG_MODEL_BEGIN_DECL, + fsg->name ? fsg->name : ""); + fprintf(fp, "%s %d\n", FSG_MODEL_NUM_STATES_DECL, fsg->n_state); + fprintf(fp, "%s %d\n", FSG_MODEL_START_STATE_DECL, fsg->start_state); + fprintf(fp, "%s %d\n", FSG_MODEL_FINAL_STATE_DECL, fsg->final_state); + + for (i = 0; i < fsg->n_state; i++) { + fsg_arciter_t *itor; + + for (itor = fsg_model_arcs(fsg, i); itor; + itor = fsg_arciter_next(itor)) { + fsg_link_t *tl = fsg_arciter_get(itor); + + fprintf(fp, "%s %d %d %f %s\n", FSG_MODEL_TRANSITION_DECL, + tl->from_state, tl->to_state, + logmath_exp(fsg->lmath, + (int32) (tl->logs2prob / fsg->lw)), + (tl->wid < 0) ? "" : fsg_model_word_str(fsg, tl->wid)); + } + } + + fprintf(fp, "%s\n", FSG_MODEL_END_DECL); + + fflush(fp); +} + +void +fsg_model_writefile(fsg_model_t * fsg, char const *file) +{ + FILE *fp; + + assert(fsg); + + E_INFO("Writing FSG file '%s'\n", file); + + if ((fp = fopen(file, "w")) == NULL) { + E_ERROR_SYSTEM("Failed to open FSG file '%s' for reading", file); + return; + } + + fsg_model_write(fsg, fp); + + fclose(fp); +} + +static void +fsg_model_write_fsm_trans(fsg_model_t * fsg, int i, FILE * fp) +{ + fsg_arciter_t *itor; + + for (itor = fsg_model_arcs(fsg, i); itor; + itor = fsg_arciter_next(itor)) { + fsg_link_t *tl = fsg_arciter_get(itor); + fprintf(fp, "%d %d %s %f\n", + tl->from_state, tl->to_state, + (tl->wid < 0) ? "" : fsg_model_word_str(fsg, tl->wid), + -logmath_log_to_ln(fsg->lmath, tl->logs2prob / fsg->lw)); + } +} + +void +fsg_model_write_fsm(fsg_model_t * fsg, FILE * fp) +{ + int i; + + /* Write transitions from initial state first. */ + fsg_model_write_fsm_trans(fsg, fsg_model_start_state(fsg), fp); + + /* Other states. */ + for (i = 0; i < fsg->n_state; i++) { + if (i == fsg_model_start_state(fsg)) + continue; + fsg_model_write_fsm_trans(fsg, i, fp); + } + + /* Final state. */ + fprintf(fp, "%d 0\n", fsg_model_final_state(fsg)); + + fflush(fp); +} + +void +fsg_model_writefile_fsm(fsg_model_t * fsg, char const *file) +{ + FILE *fp; + + assert(fsg); + + E_INFO("Writing FSM file '%s'\n", file); + + if ((fp = fopen(file, "w")) == NULL) { + E_ERROR_SYSTEM("Failed to open fsm file '%s' for writing", file); + return; + } + + fsg_model_write_fsm(fsg, fp); + + fclose(fp); +} + +void +fsg_model_write_symtab(fsg_model_t * fsg, FILE * file) +{ + int i; + + fprintf(file, " 0\n"); + for (i = 0; i < fsg_model_n_word(fsg); ++i) { + fprintf(file, "%s %d\n", fsg_model_word_str(fsg, i), i + 1); + } + fflush(file); +} + +void +fsg_model_writefile_symtab(fsg_model_t * fsg, char const *file) +{ + FILE *fp; + + assert(fsg); + + E_INFO("Writing FSM symbol table '%s'\n", file); + + if ((fp = fopen(file, "w")) == NULL) { + E_ERROR("Failed to open symbol table '%s' for writing", file); + return; + } + + fsg_model_write_symtab(fsg, fp); + + fclose(fp); +} + +static void +apply_closure(fsg_model_t *fsg, bitvec_t *active) +{ + int state; + + /* This is a bit slow, sorry. */ + for (state = 0; state < fsg_model_n_state(fsg); ++state) { + hash_table_t *null_trans; + hash_iter_t *itor; + + if (!bitvec_is_set(active, state)) + continue; + null_trans = fsg->trans[state].null_trans; + if (null_trans == NULL) + continue; + /* We assume closure has already been done, so no need to + * continue following epsilons. */ + for (itor = hash_table_iter(null_trans); + itor != NULL; itor = hash_table_iter_next(itor)) { + fsg_link_t *link = (fsg_link_t *)hash_entry_val(itor->ent); + bitvec_set(active, link->to_state); + E_INFO("epsilon %d -> %d\n", state, link->to_state); + } + } +} + +int +fsg_model_accept(fsg_model_t *fsg, char const *words) +{ + char *ptr, *mutable_words, *word, delimfound; + bitvec_t *active, *next; + int n, found = 0; + + if (fsg == NULL || words == NULL) + return 0; + + active = bitvec_alloc(fsg_model_n_state(fsg)); + next = bitvec_alloc(fsg_model_n_state(fsg)); + bitvec_set(active, fsg_model_start_state(fsg)); + + /* For each input word */ + ptr = mutable_words = ckd_salloc(words); + while ((n = nextword(ptr, " \t\r\n\v\f", + &word, &delimfound)) >= 0) { + int wid = fsg_model_word_id(fsg, word); + int state; + bitvec_t *tmp; + + E_INFO("word: %s\n", word); + /* Expand using previously calculated closure. */ + apply_closure(fsg, active); + + /* Consume the current word, following all non-epsilon + * transitions possible. */ + if (wid < 0) { + /* Immediate fail */ + E_INFO("word %s not found!\n", word); + goto done; + } + /* Again, my apologies, this is a bit slow. */ + for (state = 0; state < fsg_model_n_state(fsg); ++state) { + fsg_arciter_t *itor; + if (!bitvec_is_set(active, state)) + continue; + for (itor = fsg_model_arcs(fsg, state); + itor != NULL; itor = fsg_arciter_next(itor)) { + fsg_link_t *link = fsg_arciter_get(itor); + /* Ignore epsilons, we already did them. */ + if (link->wid == wid) { + bitvec_set(next, link->to_state); + E_INFO("%s %d -> %d\n", + word, state, link->to_state); + } + } + } + + /* Update active list. */ + tmp = active; + active = next; + next = tmp; + bitvec_clear_all(next, fsg_model_n_state(fsg)); + + word[n] = delimfound; + ptr = word + n; + } + /* Did we reach the final state? First expand any epsilons, then + * we'll find out! */ + apply_closure(fsg, active); + found = bitvec_is_set(active, fsg_model_final_state(fsg)); + +done: + bitvec_free(active); + bitvec_free(next); + ckd_free(mutable_words); + return found != 0; +} diff --git a/src/lm/fsg_model.h b/src/lm/fsg_model.h new file mode 100644 index 0000000..bce84b3 --- /dev/null +++ b/src/lm/fsg_model.h @@ -0,0 +1,276 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 2003 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + */ + +/** + * @file fsg_model.h + * @brief Finite-state grammars for recognition + */ + + +#ifndef __FSG_MODEL_H__ +#define __FSG_MODEL_H__ + +#include +#include + +#include +#include + +#include "util/glist.h" +#include "util/bitvec.h" +#include "util/hash_table.h" +#include "util/listelem_alloc.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * @struct fsg_link_t + * @brief A single transition in the FSG. + */ +typedef struct fsg_link_s { + int32 from_state; + int32 to_state; + int32 logs2prob; /**< log(transition probability)*lw */ + int32 wid; /**< Word-ID; <0 if epsilon or null transition */ +} fsg_link_t; + +/* Access macros */ +#define fsg_link_from_state(l) ((l)->from_state) +#define fsg_link_to_state(l) ((l)->to_state) +#define fsg_link_wid(l) ((l)->wid) +#define fsg_link_logs2prob(l) ((l)->logs2prob) + +/** + * @struct trans_list_t + * @brief Adjacency list for a state in an FSG. + * + * Actually we use hash tables so that random access is a bit faster. + * Plus it allows us to make the lookup code a bit less ugly. + */ +typedef struct trans_list_s { + hash_table_t *null_trans; /* Null transitions keyed by state. */ + hash_table_t *trans; /* Lists of non-null transitions keyed by state. */ +} trans_list_t; + +/** + * @struct fsg_model_t + * @brief Word level FSG definition. + * + * States are simply integers 0..n_state-1. + * A transition emits a word and has a given probability of being taken. + * There can also be null or epsilon transitions, with no associated emitted + * word. + */ +typedef struct fsg_model_s { + int refcount; /**< Reference count. */ + char *name; /**< A unique string identifier for this FSG */ + int32 n_word; /**< Number of unique words in this FSG */ + int32 n_word_alloc; /**< Number of words allocated in vocab */ + char **vocab; /**< Vocabulary for this FSG. */ + bitvec_t *silwords; /**< Indicates which words are silence/fillers. */ + bitvec_t *altwords; /**< Indicates which words are pronunciation alternates. */ + logmath_t *lmath; /**< Pointer to log math computation object. */ + int32 n_state; /**< number of states in FSG */ + int32 start_state; /**< Must be in the range [0..n_state-1] */ + int32 final_state; /**< Must be in the range [0..n_state-1] */ + float32 lw; /**< Language weight that's been applied to transition + logprobs */ + trans_list_t *trans; /**< Transitions out of each state, if any. */ + listelem_alloc_t *link_alloc; /**< Allocator for FSG links. */ +} fsg_model_t; + +/* Access macros */ +#define fsg_model_name(f) ((f)->name) +#define fsg_model_n_state(f) ((f)->n_state) +#define fsg_model_start_state(f) ((f)->start_state) +#define fsg_model_final_state(f) ((f)->final_state) +#define fsg_model_log(f,p) logmath_log((f)->lmath, p) +#define fsg_model_lw(f) ((f)->lw) +#define fsg_model_n_word(f) ((f)->n_word) +#define fsg_model_word_str(f,wid) (wid == -1 ? "(NULL)" : (f)->vocab[wid]) + +/** + * Iterator over arcs. + * Implementation of arc iterator. + */ +typedef struct fsg_arciter_s { + hash_iter_t *itor, *null_itor; + gnode_t *gn; +} fsg_arciter_t; + +/** + * Have silence transitions been added? + */ +#define fsg_model_has_sil(f) ((f)->silwords != NULL) + +/** + * Have alternate word transitions been added? + */ +#define fsg_model_has_alt(f) ((f)->altwords != NULL) + +#define fsg_model_is_filler(f,wid) \ + (fsg_model_has_sil(f) ? bitvec_is_set((f)->silwords, wid) : FALSE) +#define fsg_model_is_alt(f,wid) \ + (fsg_model_has_alt(f) ? bitvec_is_set((f)->altwords, wid) : FALSE) + +/** + * Create a new FSG. + */ +fsg_model_t *fsg_model_init(char const *name, logmath_t *lmath, + float32 lw, int32 n_state); + +/** + * Add a word to the FSG vocabulary. + * + * @return Word ID for this new word. + */ +int fsg_model_word_add(fsg_model_t *fsg, char const *word); + +/** + * Look up a word in the FSG vocabulary. + * + * @return Word ID for this word + */ +int fsg_model_word_id(fsg_model_t *fsg, char const *word); + +/** + * Add the given transition to the FSG transition matrix. + * + * Duplicates (i.e., two transitions between the same states, with the + * same word label) are flagged and only the highest prob retained. + */ +void fsg_model_trans_add(fsg_model_t * fsg, + int32 from, int32 to, int32 logp, int32 wid); + +/** + * Add a null transition between the given states. + * + * There can be at most one null transition between the given states; + * duplicates are flagged and only the best prob retained. Transition + * probs must be <= 1 (i.e., logprob <= 0). + * + * @return 1 if a new transition was added, 0 if the prob of an existing + * transition was upgraded; -1 if nothing was changed. + */ +int32 fsg_model_null_trans_add(fsg_model_t * fsg, int32 from, int32 to, int32 logp); + +/** + * Add a "tag" transition between the given states. + * + * A "tag" transition is a null transition with a non-null word ID, + * which corresponds to a semantic tag or other symbol to be output + * when this transition is taken. + * + * As above, there can be at most one null or tag transition between + * the given states; duplicates are flagged and only the best prob + * retained. Transition probs must be <= 1 (i.e., logprob <= 0). + * + * @return 1 if a new transition was added, 0 if the prob of an existing + * transition was upgraded; -1 if nothing was changed. + */ +int32 fsg_model_tag_trans_add(fsg_model_t * fsg, int32 from, int32 to, + int32 logp, int32 wid); + +/** + * Obtain transitive closure of null transitions in the given FSG. + * + * @param nulls List of null transitions, or NULL to find them automatically. + * @return Updated list of null transitions. + */ +POCKETSPHINX_EXPORT +glist_t fsg_model_null_trans_closure(fsg_model_t * fsg, glist_t nulls); + +/** + * Get the list of transitions (if any) from state i to j. + */ +glist_t fsg_model_trans(fsg_model_t *fsg, int32 i, int32 j); + +/** + * Get an iterator over the outgoing transitions from state i. + */ +fsg_arciter_t *fsg_model_arcs(fsg_model_t *fsg, int32 i); + +/** + * Get the current arc from the arc iterator. + */ +fsg_link_t *fsg_arciter_get(fsg_arciter_t *itor); + +/** + * Move the arc iterator forward. + */ +fsg_arciter_t *fsg_arciter_next(fsg_arciter_t *itor); + +/** + * Free the arc iterator (early termination) + */ +void fsg_arciter_free(fsg_arciter_t *itor); +/** + * Get the null transition (if any) from state i to j. + */ +fsg_link_t *fsg_model_null_trans(fsg_model_t *fsg, int32 i, int32 j); + +/** + * Add silence word transitions to each state in given FSG. + * + * @param state state to add a self-loop to, or -1 for all states. + * @param silprob probability of silence transition. + */ +int fsg_model_add_silence(fsg_model_t * fsg, char const *silword, + int state, float32 silprob); + +/** + * Add alternate pronunciation transitions for a word in given FSG. + */ +int fsg_model_add_alt(fsg_model_t * fsg, char const *baseword, + char const *altword); + + +#ifdef __cplusplus +} +#endif + +#endif /* __FSG_MODEL_H__ */ diff --git a/src/lm/jsgf.c b/src/lm/jsgf.c new file mode 100644 index 0000000..30901fa --- /dev/null +++ b/src/lm/jsgf.c @@ -0,0 +1,920 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include +#include + +#include + +#include "util/ckd_alloc.h" +#include "util/strfuncs.h" +#include "util/hash_table.h" +#include "util/filename.h" + +#include "lm/jsgf.h" +#include "lm/jsgf_internal.h" +#include "lm/jsgf_parser.h" +#include "lm/jsgf_scanner.h" + +extern int yyparse(void *scanner, jsgf_t * jsgf); + +/** + * \file jsgf.c + * + * This file implements the data structures for parsing JSGF grammars + * into Sphinx finite-state grammars. + **/ + +jsgf_atom_t * +jsgf_atom_new(char *name, float weight) +{ + jsgf_atom_t *atom; + + atom = ckd_calloc(1, sizeof(*atom)); + atom->name = ckd_salloc(name); + atom->weight = weight; + return atom; +} + +int +jsgf_atom_free(jsgf_atom_t * atom) +{ + if (atom == NULL) + return 0; + ckd_free(atom->name); + ckd_free(atom); + return 0; +} + +jsgf_t * +jsgf_grammar_new(jsgf_t * parent) +{ + jsgf_t *grammar; + + grammar = ckd_calloc(1, sizeof(*grammar)); + /* If this is an imported/subgrammar, then we will share a global + * namespace with the parent grammar. */ + if (parent) { + grammar->rules = parent->rules; + grammar->imports = parent->imports; + grammar->searchpath = parent->searchpath; + grammar->parent = parent; + } + else { + grammar->rules = hash_table_new(64, 0); + grammar->imports = hash_table_new(16, 0); + } + + return grammar; +} + +void +jsgf_grammar_free(jsgf_t * jsgf) +{ + /* FIXME: Probably should just use refcounting instead. */ + if (jsgf->parent == NULL) { + hash_iter_t *itor; + gnode_t *gn; + + for (itor = hash_table_iter(jsgf->rules); itor; + itor = hash_table_iter_next(itor)) { + ckd_free((char *) itor->ent->key); + jsgf_rule_free((jsgf_rule_t *) itor->ent->val); + } + hash_table_free(jsgf->rules); + for (itor = hash_table_iter(jsgf->imports); itor; + itor = hash_table_iter_next(itor)) { + ckd_free((char *) itor->ent->key); + jsgf_grammar_free((jsgf_t *) itor->ent->val); + } + hash_table_free(jsgf->imports); + for (gn = jsgf->searchpath; gn; gn = gnode_next(gn)) + ckd_free(gnode_ptr(gn)); + glist_free(jsgf->searchpath); + for (gn = jsgf->links; gn; gn = gnode_next(gn)) + ckd_free(gnode_ptr(gn)); + glist_free(jsgf->links); + } + ckd_free(jsgf->name); + ckd_free(jsgf->version); + ckd_free(jsgf->charset); + ckd_free(jsgf->locale); + ckd_free(jsgf); +} + +static void +jsgf_rhs_free(jsgf_rhs_t * rhs) +{ + gnode_t *gn; + + if (rhs == NULL) + return; + + jsgf_rhs_free(rhs->alt); + for (gn = rhs->atoms; gn; gn = gnode_next(gn)) + jsgf_atom_free(gnode_ptr(gn)); + glist_free(rhs->atoms); + ckd_free(rhs); +} + +jsgf_atom_t * +jsgf_kleene_new(jsgf_t * jsgf, jsgf_atom_t * atom, int plus) +{ + jsgf_rule_t *rule; + jsgf_atom_t *rule_atom; + jsgf_rhs_t *rhs; + + /* Generate an "internal" rule of the form ( | ) */ + /* Or if plus is true, ( | ) */ + rhs = ckd_calloc(1, sizeof(*rhs)); + if (plus) + rhs->atoms = glist_add_ptr(NULL, jsgf_atom_new(atom->name, 1.0)); + else + rhs->atoms = glist_add_ptr(NULL, jsgf_atom_new("", 1.0)); + rule = jsgf_define_rule(jsgf, NULL, rhs, 0); + rule_atom = jsgf_atom_new(rule->name, 1.0); + rhs = ckd_calloc(1, sizeof(*rhs)); + rhs->atoms = glist_add_ptr(NULL, rule_atom); + rhs->atoms = glist_add_ptr(rhs->atoms, atom); + rule->rhs->alt = rhs; + + return jsgf_atom_new(rule->name, 1.0); +} + +jsgf_rule_t * +jsgf_optional_new(jsgf_t * jsgf, jsgf_rhs_t * exp) +{ + jsgf_rhs_t *rhs = ckd_calloc(1, sizeof(*rhs)); + jsgf_atom_t *atom = jsgf_atom_new("", 1.0); + rhs->alt = exp; + rhs->atoms = glist_add_ptr(NULL, atom); + return jsgf_define_rule(jsgf, NULL, rhs, 0); +} + +void +jsgf_add_link(jsgf_t * grammar, jsgf_atom_t * atom, int from, int to) +{ + jsgf_link_t *link; + + link = ckd_calloc(1, sizeof(*link)); + link->from = from; + link->to = to; + link->atom = atom; + grammar->links = glist_add_ptr(grammar->links, link); +} + +static char * +extract_grammar_name(char *rule_name) +{ + char *dot_pos; + char *grammar_name = ckd_salloc(rule_name + 1); + if ((dot_pos = strrchr(grammar_name + 1, '.')) == NULL) { + ckd_free(grammar_name); + return NULL; + } + *dot_pos = '\0'; + return grammar_name; +} + +char const * +jsgf_grammar_name(jsgf_t * jsgf) +{ + return jsgf->name; +} + +static char * +jsgf_fullname(jsgf_t * jsgf, const char *name) +{ + char *fullname; + + /* Check if it is already qualified */ + if (strchr(name + 1, '.')) + return ckd_salloc(name); + + /* Skip leading < in name */ + fullname = ckd_malloc(strlen(jsgf->name) + strlen(name) + 4); + sprintf(fullname, "<%s.%s", jsgf->name, name + 1); + return fullname; +} + +static char * +jsgf_fullname_from_rule(jsgf_rule_t * rule, const char *name) +{ + char *fullname, *grammar_name; + + /* Check if it is already qualified */ + if (strchr(name + 1, '.')) + return ckd_salloc(name); + + /* Skip leading < in name */ + if ((grammar_name = extract_grammar_name(rule->name)) == NULL) + return ckd_salloc(name); + fullname = ckd_malloc(strlen(grammar_name) + strlen(name) + 4); + sprintf(fullname, "<%s.%s", grammar_name, name + 1); + ckd_free(grammar_name); + + return fullname; +} + +/* Extract as rulename everything after the secondlast dot, if existent. + * Because everything before the secondlast dot is the path-specification. */ +static char * +importname2rulename(char *importname) +{ + char *rulename = ckd_salloc(importname); + char *last_dotpos; + char *secondlast_dotpos; + + if ((last_dotpos = strrchr(rulename + 1, '.')) != NULL) { + *last_dotpos = '\0'; + if ((secondlast_dotpos = strrchr(rulename + 1, '.')) != NULL) { + *last_dotpos = '.'; + *secondlast_dotpos = '<'; + secondlast_dotpos = ckd_salloc(secondlast_dotpos); + ckd_free(rulename); + return secondlast_dotpos; + } + else { + *last_dotpos = '.'; + return rulename; + } + } + else { + return rulename; + } +} + +#define RECURSION -2 +static int expand_rule(jsgf_t *grammar, jsgf_rule_t *rule); +static int +expand_rhs(jsgf_t *grammar, jsgf_rule_t *rule, jsgf_rhs_t *rhs) +{ + gnode_t *gn; + int lastnode; + + /* Last node expanded in this sequence. */ + lastnode = rule->entry; + + /* Iterate over atoms in rhs and generate links/nodes */ + for (gn = rhs->atoms; gn; gn = gnode_next(gn)) { + jsgf_atom_t *atom = gnode_ptr(gn); + + if (jsgf_atom_is_rule(atom)) { + jsgf_rule_t *subrule; + char *fullname; + gnode_t *subnode; + void *val; + + /* Special case for and pseudo-rules */ + if (0 == strcmp(atom->name, "")) { + /* Emit a NULL transition */ + jsgf_add_link(grammar, atom, + lastnode, grammar->nstate); + lastnode = grammar->nstate; + ++grammar->nstate; + continue; + } + else if (0 == strcmp(atom->name, "")) { + /* Make this entire RHS unspeakable */ + return -1; + } + + fullname = jsgf_fullname_from_rule(rule, atom->name); + if (hash_table_lookup(grammar->rules, fullname, &val) == -1) { + E_ERROR("Undefined rule in RHS: %s\n", fullname); + ckd_free(fullname); + return -1; + } + ckd_free(fullname); + + /* Look for this subrule in the stack of expanded rules */ + subrule = val; + /* Look for this in the stack of expanded rules */ + for (subnode = grammar->rulestack; subnode; subnode = gnode_next(subnode)) + if (gnode_ptr(subnode) == (void *)subrule) + break; + + if (subnode != NULL) { + /* Allow right-recursion only. */ + if (gnode_next(gn) != NULL) { + E_ERROR + ("Only right-recursion is permitted (in %s.%s)\n", + grammar->name, rule->name); + return -1; + } + /* Add a link back to the beginning of this rule instance */ + E_INFO("Right recursion %s %d => %d\n", atom->name, lastnode, + subrule->entry); + jsgf_add_link(grammar, atom, lastnode, subrule->entry); + return RECURSION; + } + else { + /* Expand the subrule */ + if (expand_rule(grammar, subrule) == -1) + return -1; + /* Add a link into the subrule. */ + jsgf_add_link(grammar, atom, + lastnode, subrule->entry); + lastnode = subrule->exit; + } + } + else { + /* Add a link for this token and create a new exit node. */ + jsgf_add_link(grammar, atom, lastnode, grammar->nstate); + lastnode = grammar->nstate; + ++grammar->nstate; + } + } + + return lastnode; +} + +static int +expand_rule(jsgf_t * grammar, jsgf_rule_t * rule) +{ + jsgf_rhs_t *rhs; + float norm; + + /* Push this rule onto the stack */ + grammar->rulestack = glist_add_ptr(grammar->rulestack, rule); + + /* Normalize weights for all alternatives exiting rule->entry */ + norm = 0; + for (rhs = rule->rhs; rhs; rhs = rhs->alt) { + if (rhs->atoms) { + jsgf_atom_t *atom = gnode_ptr(rhs->atoms); + norm += atom->weight; + } + } + + rule->entry = grammar->nstate++; + rule->exit = grammar->nstate++; + if (norm == 0) norm = 1; + for (rhs = rule->rhs; rhs; rhs = rhs->alt) { + int lastnode; + + if (rhs->atoms) { + jsgf_atom_t *atom = gnode_ptr(rhs->atoms); + atom->weight /= norm; + } + lastnode = expand_rhs(grammar, rule, rhs); + if (lastnode == -1) { + return -1; + } + else if (lastnode == RECURSION) { + /* Do nothing. */ + } + else { + jsgf_add_link(grammar, NULL, lastnode, rule->exit); + } + } + + /* Pop this rule from the rule stack */ + grammar->rulestack = gnode_free(grammar->rulestack, NULL); + return rule->exit; +} + +jsgf_rule_iter_t * +jsgf_rule_iter(jsgf_t * grammar) +{ + return hash_table_iter(grammar->rules); +} + +jsgf_rule_t * +jsgf_get_rule(jsgf_t * grammar, char const *name) +{ + void *val; + char *fullname; + + fullname = string_join("<", name, ">", NULL); + if (hash_table_lookup(grammar->rules, fullname, &val) < 0) { + ckd_free(fullname); + return NULL; + } + ckd_free(fullname); + return (jsgf_rule_t *) val; +} + +jsgf_rule_t * +jsgf_get_public_rule(jsgf_t * grammar) +{ + jsgf_rule_iter_t *itor; + jsgf_rule_t *public_rule = NULL; + + for (itor = jsgf_rule_iter(grammar); itor; + itor = jsgf_rule_iter_next(itor)) { + jsgf_rule_t *rule = jsgf_rule_iter_rule(itor); + if (jsgf_rule_public(rule)) { + const char *rule_name = jsgf_rule_name(rule); + char *dot_pos; + if ((dot_pos = strrchr(rule_name + 1, '.')) == NULL) { + public_rule = rule; + jsgf_rule_iter_free(itor); + break; + } + if (0 == + strncmp(rule_name + 1, jsgf_grammar_name(grammar), + dot_pos - rule_name - 1)) { + public_rule = rule; + jsgf_rule_iter_free(itor); + break; + } + } + } + return public_rule; +} + +char const * +jsgf_rule_name(jsgf_rule_t * rule) +{ + return rule->name; +} + +int +jsgf_rule_public(jsgf_rule_t * rule) +{ + return rule->is_public; +} + +static fsg_model_t * +jsgf_build_fsg_internal(jsgf_t * grammar, jsgf_rule_t * rule, + logmath_t * lmath, float32 lw, int do_closure) +{ + fsg_model_t *fsg; + glist_t nulls; + gnode_t *gn; + + if (grammar == NULL || rule == NULL) + return NULL; + + /* Clear previous links */ + for (gn = grammar->links; gn; gn = gnode_next(gn)) { + ckd_free(gnode_ptr(gn)); + } + glist_free(grammar->links); + grammar->links = NULL; + rule->entry = rule->exit = 0; + grammar->nstate = 0; + expand_rule(grammar, rule); + + fsg = fsg_model_init(rule->name, lmath, lw, grammar->nstate); + fsg->start_state = rule->entry; + fsg->final_state = rule->exit; + grammar->links = glist_reverse(grammar->links); + for (gn = grammar->links; gn; gn = gnode_next(gn)) { + jsgf_link_t *link = gnode_ptr(gn); + + if (link->atom) { + if (jsgf_atom_is_rule(link->atom)) { + fsg_model_null_trans_add(fsg, link->from, link->to, + logmath_log(lmath, + link->atom->weight)); + } + else { + int wid = fsg_model_word_add(fsg, link->atom->name); + fsg_model_trans_add(fsg, link->from, link->to, + logmath_log(lmath, link->atom->weight), + wid); + } + } + else { + fsg_model_null_trans_add(fsg, link->from, link->to, 0); + } + } + if (do_closure) { + nulls = fsg_model_null_trans_closure(fsg, NULL); + glist_free(nulls); + } + + return fsg; +} + +fsg_model_t * +jsgf_build_fsg(jsgf_t * grammar, jsgf_rule_t * rule, + logmath_t * lmath, float32 lw) +{ + return jsgf_build_fsg_internal(grammar, rule, lmath, lw, TRUE); +} + +fsg_model_t * +jsgf_build_fsg_raw(jsgf_t * grammar, jsgf_rule_t * rule, + logmath_t * lmath, float32 lw) +{ + return jsgf_build_fsg_internal(grammar, rule, lmath, lw, FALSE); +} + +fsg_model_t * +jsgf_read_file(const char *file, logmath_t * lmath, float32 lw) +{ + fsg_model_t *fsg; + jsgf_rule_t *rule; + jsgf_t *jsgf; + jsgf_rule_iter_t *itor; + + if ((jsgf = jsgf_parse_file(file, NULL)) == NULL) { + E_ERROR("Error parsing file: %s\n", file); + return NULL; + } + + rule = NULL; + for (itor = jsgf_rule_iter(jsgf); itor; + itor = jsgf_rule_iter_next(itor)) { + rule = jsgf_rule_iter_rule(itor); + if (jsgf_rule_public(rule)) { + jsgf_rule_iter_free(itor); + break; + } + } + if (rule == NULL) { + E_ERROR("No public rules found in %s\n", file); + return NULL; + } + fsg = jsgf_build_fsg(jsgf, rule, lmath, lw); + jsgf_grammar_free(jsgf); + return fsg; +} + +fsg_model_t * +jsgf_read_string(const char *string, logmath_t * lmath, float32 lw) +{ + fsg_model_t *fsg; + jsgf_rule_t *rule; + jsgf_t *jsgf; + jsgf_rule_iter_t *itor; + + if ((jsgf = jsgf_parse_string(string, NULL)) == NULL) { + E_ERROR("Error parsing input string\n"); + return NULL; + } + + rule = NULL; + for (itor = jsgf_rule_iter(jsgf); itor; + itor = jsgf_rule_iter_next(itor)) { + rule = jsgf_rule_iter_rule(itor); + if (jsgf_rule_public(rule)) { + jsgf_rule_iter_free(itor); + break; + } + } + if (rule == NULL) { + jsgf_grammar_free(jsgf); + E_ERROR("No public rules found in input string\n"); + return NULL; + } + fsg = jsgf_build_fsg(jsgf, rule, lmath, lw); + jsgf_grammar_free(jsgf); + return fsg; +} + + +int +jsgf_write_fsg(jsgf_t * grammar, jsgf_rule_t * rule, FILE * outfh) +{ + fsg_model_t *fsg; + logmath_t *lmath = logmath_init(1.0001, 0, 0); + + if ((fsg = jsgf_build_fsg_raw(grammar, rule, lmath, 1.0)) == NULL) + goto error_out; + + fsg_model_write(fsg, outfh); + logmath_free(lmath); + return 0; + + error_out: + logmath_free(lmath); + return -1; +} +jsgf_rule_t * +jsgf_define_rule(jsgf_t * jsgf, char *name, jsgf_rhs_t * rhs, + int is_public) +{ + jsgf_rule_t *rule; + void *val; + + if (name == NULL) { + name = ckd_malloc(strlen(jsgf->name) + 16); + sprintf(name, "<%s.g%05d>", jsgf->name, + hash_table_inuse(jsgf->rules)); + } + else { + char *newname; + + newname = jsgf_fullname(jsgf, name); + name = newname; + } + + rule = ckd_calloc(1, sizeof(*rule)); + rule->refcnt = 1; + rule->name = ckd_salloc(name); + rule->rhs = rhs; + rule->is_public = is_public; + + E_INFO("Defined rule: %s%s\n", + rule->is_public ? "PUBLIC " : "", rule->name); + val = hash_table_enter(jsgf->rules, name, rule); + if (val != (void *) rule) { + E_WARN("Multiply defined symbol: %s\n", name); + } + return rule; +} + +jsgf_rule_t * +jsgf_rule_retain(jsgf_rule_t * rule) +{ + ++rule->refcnt; + return rule; +} + +int +jsgf_rule_free(jsgf_rule_t * rule) +{ + if (rule == NULL) + return 0; + if (--rule->refcnt > 0) + return rule->refcnt; + jsgf_rhs_free(rule->rhs); + ckd_free(rule->name); + ckd_free(rule); + return 0; +} + + +/* FIXME: This should go in libsphinxutil */ +static char * +path_list_search(glist_t paths, char *path) +{ + gnode_t *gn; + + for (gn = paths; gn; gn = gnode_next(gn)) { + char *fullpath; + FILE *tmp; + + fullpath = string_join(gnode_ptr(gn), "/", path, NULL); + tmp = fopen(fullpath, "r"); + if (tmp != NULL) { + fclose(tmp); + return fullpath; + } + else { + ckd_free(fullpath); + } + } + return NULL; +} + +jsgf_rule_t * +jsgf_import_rule(jsgf_t * jsgf, char *name) +{ + char *c, *path, *newpath; + size_t namelen, packlen; + void *val; + jsgf_t *imp; + int import_all; + + /* Trim the leading and trailing <> */ + namelen = strlen(name); + path = ckd_malloc(namelen - 2 + 6); /* room for a trailing .gram */ + strcpy(path, name + 1); + /* Split off the first part of the name */ + c = strrchr(path, '.'); + if (c == NULL) { + E_ERROR("Imported rule is not qualified: %s\n", name); + ckd_free(path); + return NULL; + } + packlen = c - path; + *c = '\0'; + + /* Look for import foo.* */ + import_all = (strlen(name) > 2 + && 0 == strcmp(name + namelen - 3, ".*>")); + + /* Construct a filename. */ + for (c = path; *c; ++c) + if (*c == '.') + *c = '/'; + strcat(path, ".gram"); + newpath = path_list_search(jsgf->searchpath, path); + if (newpath == NULL) { + E_ERROR("Failed to find grammar %s\n", path); + ckd_free(path); + return NULL; + } + ckd_free(path); + + path = newpath; + E_INFO("Importing %s from %s to %s\n", name, path, jsgf->name); + + /* FIXME: Also, we need to make sure that path is fully qualified + * here, by adding any prefixes from jsgf->name to it. */ + /* See if we have parsed it already */ + if (hash_table_lookup(jsgf->imports, path, &val) == 0) { + E_INFO("Already imported %s\n", path); + imp = val; + ckd_free(path); + } + else { + /* If not, parse it. */ + imp = jsgf_parse_file(path, jsgf); + val = hash_table_enter(jsgf->imports, path, imp); + if (val != (void *) imp) { + E_WARN("Multiply imported file: %s\n", path); + } + } + if (imp != NULL) { + hash_iter_t *itor; + /* Look for public rules matching rulename. */ + for (itor = hash_table_iter(imp->rules); itor; + itor = hash_table_iter_next(itor)) { + hash_entry_t *he = itor->ent; + jsgf_rule_t *rule = hash_entry_val(he); + int rule_matches; + char *rule_name = importname2rulename(name); + + if (import_all) { + /* Match package name (symbol table is shared) */ + rule_matches = + !strncmp(rule_name, rule->name, packlen + 1); + } + else { + /* Exact match */ + rule_matches = !strcmp(rule_name, rule->name); + } + ckd_free(rule_name); + if (rule->is_public && rule_matches) { + void *val; + char *newname; + + /* Link this rule into the current namespace. */ + c = strrchr(rule->name, '.'); + assert(c != NULL); + newname = jsgf_fullname(jsgf, c); + + E_INFO("Imported %s\n", newname); + val = hash_table_enter(jsgf->rules, newname, + jsgf_rule_retain(rule)); + if (val != (void *) rule) { + E_WARN("Multiply defined symbol: %s\n", newname); + } + if (!import_all) { + hash_table_iter_free(itor); + return rule; + } + } + } + } + + return NULL; +} + +static void +jsgf_set_search_path(jsgf_t * jsgf, const char *filename) +{ + char *jsgf_path; + +#if !defined(_WIN32_WCE) + if ((jsgf_path = getenv("JSGF_PATH")) != NULL) { + char *word, *c; + word = jsgf_path = ckd_salloc(jsgf_path); + while ((c = strchr(word, ':'))) { + *c = '\0'; + jsgf->searchpath = glist_add_ptr(jsgf->searchpath, word); + word = c + 1; + } + jsgf->searchpath = glist_add_ptr(jsgf->searchpath, word); + jsgf->searchpath = glist_reverse(jsgf->searchpath); + return; + } +#endif + + if (!filename) { + jsgf->searchpath = + glist_add_ptr(jsgf->searchpath, ckd_salloc(".")); + return; + } + + jsgf_path = ckd_salloc(filename); + path2dirname(filename, jsgf_path); + jsgf->searchpath = glist_add_ptr(jsgf->searchpath, jsgf_path); +} + +jsgf_t * +jsgf_parse_file(const char *filename, jsgf_t * parent) +{ + yyscan_t yyscanner; + jsgf_t *jsgf; + int yyrv; + FILE *in = NULL; + + yylex_init(&yyscanner); + if (filename == NULL) { + yyset_in(stdin, yyscanner); + } + else { + in = fopen(filename, "r"); + if (in == NULL) { + E_ERROR_SYSTEM("Failed to open %s for parsing", filename); + return NULL; + } + yyset_in(in, yyscanner); + } + + jsgf = jsgf_grammar_new(parent); + + if (!parent) + jsgf_set_search_path(jsgf, filename); + + yyrv = yyparse(yyscanner, jsgf); + if (yyrv != 0) { + E_ERROR("Failed to parse JSGF grammar from '%s'\n", + filename ? filename : "(stdin)"); + jsgf_grammar_free(jsgf); + yylex_destroy(yyscanner); + return NULL; + } + if (in) + fclose(in); + yylex_destroy(yyscanner); + + return jsgf; +} + +jsgf_t * +jsgf_parse_string(const char *string, jsgf_t * parent) +{ + yyscan_t yyscanner; + jsgf_t *jsgf; + int yyrv; + YY_BUFFER_STATE buf; + + yylex_init(&yyscanner); + buf = yy_scan_string(string, yyscanner); + + jsgf = jsgf_grammar_new(parent); + if (!parent) + jsgf_set_search_path(jsgf, NULL); + + yyrv = yyparse(yyscanner, jsgf); + if (yyrv != 0) { + E_ERROR("Failed to parse JSGF grammar from input string\n"); + jsgf_grammar_free(jsgf); + yy_delete_buffer(buf, yyscanner); + yylex_destroy(yyscanner); + return NULL; + } + yy_delete_buffer(buf, yyscanner); + yylex_destroy(yyscanner); + + return jsgf; +} + +jsgf_rule_iter_t * +jsgf_rule_iter_next(jsgf_rule_iter_t *itor) +{ + return hash_table_iter_next(itor); +} + +jsgf_rule_t *jsgf_rule_iter_rule(jsgf_rule_iter_t *itor) +{ + return ((jsgf_rule_t *)(itor)->ent->val); +} + +void +jsgf_rule_iter_free(jsgf_rule_iter_t *itor) +{ + return hash_table_iter_free(itor); +} diff --git a/src/lm/jsgf.h b/src/lm/jsgf.h new file mode 100644 index 0000000..448cfdd --- /dev/null +++ b/src/lm/jsgf.h @@ -0,0 +1,78 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef __JSGF_H__ +#define __JSGF_H__ + +/** + * @file jsgf.h + * @brief JSGF grammar compiler + * + * This file defines the data structures for parsing JSGF grammars + * into Sphinx finite-state grammars. + **/ + +/* Not much here anymore! */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Create a new JSGF grammar. + * + * @param parent optional parent grammar for this one (NULL, usually). + * @return new JSGF grammar object, or NULL on failure. + */ +jsgf_t *jsgf_grammar_new(jsgf_t *parent); + +POCKETSPHINX_EXPORT +fsg_model_t *jsgf_build_fsg_raw(jsgf_t * grammar, jsgf_rule_t * rule, + logmath_t * lmath, float32 lw); + + +#ifdef __cplusplus +} +#endif + +#endif /* __JSGF_H__ */ diff --git a/src/lm/jsgf_internal.h b/src/lm/jsgf_internal.h new file mode 100644 index 0000000..64a11af --- /dev/null +++ b/src/lm/jsgf_internal.h @@ -0,0 +1,138 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef __JSGF_INTERNAL_H__ +#define __JSGF_INTERNAL_H__ + +/** + * @file jsgf_internal.h Internal definitions for JSGF grammar compiler + */ + +#include + +#include + +#include "util/hash_table.h" +#include "util/glist.h" +#include "util/strfuncs.h" + +#include "lm/fsg_model.h" +#include "lm/jsgf.h" + + +/* Flex uses strdup which is missing on WinCE */ +#if defined(_WIN32) || defined(_WIN32_WCE) +#define strdup _strdup +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#define YY_NO_INPUT /* Silence a compiler warning. */ + +typedef struct jsgf_rhs_s jsgf_rhs_t; +typedef struct jsgf_atom_s jsgf_atom_t; +typedef struct jsgf_link_s jsgf_link_t; + +struct jsgf_s { + char *version; /**< JSGF version (from header) */ + char *charset; /**< JSGF charset (default UTF-8) */ + char *locale; /**< JSGF locale (default C) */ + char *name; /**< Grammar name */ + + hash_table_t *rules; /**< Defined or imported rules in this grammar. */ + hash_table_t *imports; /**< Pointers to imported grammars. */ + jsgf_t *parent; /**< Parent grammar (if this is an imported one) */ + glist_t searchpath; /**< List of directories to search for grammars. */ + + /* Scratch variables for FSG conversion. */ + int nstate; /**< Number of generated states. */ + glist_t links; /**< Generated FSG links. */ + glist_t rulestack; /**< Stack of currently expanded rules. */ +}; + +struct jsgf_rule_s { + int refcnt; /**< Reference count. */ + char *name; /**< Rule name (NULL for an alternation/grouping) */ + int is_public; /**< Is this rule marked 'public'? */ + jsgf_rhs_t *rhs; /**< Expansion */ + + int entry; /**< Entry state for current instance of this rule. */ + int exit; /**< Exit state for current instance of this rule. */ +}; + +struct jsgf_rhs_s { + glist_t atoms; /**< Sequence of items */ + jsgf_rhs_t *alt; /**< Linked list of alternates */ +}; + +struct jsgf_atom_s { + char *name; /**< Rule or token name */ + glist_t tags; /**< Tags, if any (glist_t of char *) */ + float weight; /**< Weight (default 1) */ +}; + +struct jsgf_link_s { + jsgf_atom_t *atom; /**< Name, tags, weight */ + int from; /**< From state */ + int to; /**< To state */ +}; + +#define jsgf_atom_is_rule(atom) ((atom)->name[0] == '<') + +void jsgf_add_link(jsgf_t *grammar, jsgf_atom_t *atom, int from, int to); +jsgf_atom_t *jsgf_atom_new(char *name, float weight); +jsgf_atom_t *jsgf_kleene_new(jsgf_t *jsgf, jsgf_atom_t *atom, int plus); +jsgf_rule_t *jsgf_optional_new(jsgf_t *jsgf, jsgf_rhs_t *exp); +jsgf_rule_t *jsgf_define_rule(jsgf_t *jsgf, char *name, jsgf_rhs_t *rhs, int is_public); +jsgf_rule_t *jsgf_import_rule(jsgf_t *jsgf, char *name); + +int jsgf_atom_free(jsgf_atom_t *atom); +int jsgf_rule_free(jsgf_rule_t *rule); +jsgf_rule_t *jsgf_rule_retain(jsgf_rule_t *rule); + +#ifdef __cplusplus +} +#endif + + +#endif /* __JSGF_H__ */ diff --git a/src/lm/jsgf_parser.c b/src/lm/jsgf_parser.c new file mode 100644 index 0000000..e3c105e --- /dev/null +++ b/src/lm/jsgf_parser.c @@ -0,0 +1,1801 @@ + +/* A Bison parser, made by GNU Bison 2.4.1. */ + +/* Skeleton implementation for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "2.4.1" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 1 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + + + +/* Copy the first part of user declarations. */ + +/* Line 189 of yacc.c */ +#line 37 "jsgf_parser.y" + +#define YYERROR_VERBOSE + +#include +#include + +#include + +#include "util/hash_table.h" +#include "util/ckd_alloc.h" + +#include "jsgf_internal.h" +#include "jsgf_parser.h" +#include "jsgf_scanner.h" + +/* Suppress warnings from generated code */ +#if defined _MSC_VER +#pragma warning(disable: 4273) +#endif + +void yyerror(yyscan_t lex, jsgf_t *jsgf, const char *s); + + + +/* Line 189 of yacc.c */ +#line 97 "jsgf_parser.c" + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + HEADER = 258, + GRAMMAR = 259, + IMPORT = 260, + PUBLIC = 261, + TOKEN = 262, + RULENAME = 263, + TAG = 264, + WEIGHT = 265 + }; +#endif +/* Tokens. */ +#define HEADER 258 +#define GRAMMAR 259 +#define IMPORT 260 +#define PUBLIC 261 +#define TOKEN 262 +#define RULENAME 263 +#define TAG 264 +#define WEIGHT 265 + + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +{ + +/* Line 214 of yacc.c */ +#line 65 "jsgf_parser.y" + + char *name; + float weight; + jsgf_rule_t *rule; + jsgf_rhs_t *rhs; + jsgf_atom_t *atom; + + + +/* Line 214 of yacc.c */ +#line 163 "jsgf_parser.c" +} YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + + +/* Copy the second part of user declarations. */ + + +/* Line 264 of yacc.c */ +#line 175 "jsgf_parser.c" + +#ifdef short +# undef short +#endif + +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif + +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#elif (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +typedef signed char yytype_int8; +#else +typedef short int yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned int +# endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) + +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(e) ((void) (e)) +#else +# define YYUSE(e) /* empty */ +#endif + +/* Identity function, used to suppress warnings about constant conditions. */ +#ifndef lint +# define YYID(n) (n) +#else +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static int +YYID (int yyi) +#else +static int +YYID (yyi) + int yyi; +#endif +{ + return yyi; +} +#endif + +#if ! defined yyoverflow || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined _STDLIB_H \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ + + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yytype_int16 yyss_alloc; + YYSTYPE yyvs_alloc; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (YYID (0)) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) + +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 7 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 54 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 20 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 16 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 33 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 58 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 265 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const yytype_uint8 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 14, 15, 18, 19, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 11, + 2, 12, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 16, 2, 17, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 13, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const yytype_uint8 yyprhs[] = +{ + 0, 0, 3, 5, 8, 12, 15, 18, 22, 27, + 33, 37, 39, 42, 46, 48, 51, 56, 62, 64, + 68, 70, 73, 75, 78, 80, 83, 87, 91, 93, + 95, 97, 99, 102 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yytype_int8 yyrhs[] = +{ + 21, 0, -1, 22, -1, 22, 27, -1, 22, 25, + 27, -1, 23, 24, -1, 3, 11, -1, 3, 7, + 11, -1, 3, 7, 7, 11, -1, 3, 7, 7, + 7, 11, -1, 4, 7, 11, -1, 26, -1, 25, + 26, -1, 5, 8, 11, -1, 28, -1, 27, 28, + -1, 8, 12, 29, 11, -1, 6, 8, 12, 29, + 11, -1, 30, -1, 29, 13, 30, -1, 31, -1, + 30, 31, -1, 32, -1, 31, 9, -1, 35, -1, + 10, 35, -1, 14, 29, 15, -1, 16, 29, 17, + -1, 7, -1, 8, -1, 33, -1, 34, -1, 35, + 18, -1, 35, 19, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const yytype_uint8 yyrline[] = +{ + 0, 82, 82, 83, 84, 87, 90, 91, 92, 93, + 97, 100, 101, 104, 107, 108, 111, 112, 115, 116, + 121, 123, 127, 128, 132, 133, 136, 139, 142, 143, + 144, 145, 146, 147 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "HEADER", "GRAMMAR", "IMPORT", "PUBLIC", + "TOKEN", "RULENAME", "TAG", "WEIGHT", "';'", "'='", "'|'", "'('", "')'", + "'['", "']'", "'*'", "'+'", "$accept", "grammar", "header", + "jsgf_header", "grammar_header", "import_header", "import_statement", + "rule_list", "rule", "alternate_list", "rule_expansion", + "tagged_rule_item", "rule_item", "rule_group", "rule_optional", + "rule_atom", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const yytype_uint16 yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 59, 61, 124, 40, 41, 91, 93, 42, 43 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint8 yyr1[] = +{ + 0, 20, 21, 21, 21, 22, 23, 23, 23, 23, + 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, + 30, 30, 31, 31, 32, 32, 33, 34, 35, 35, + 35, 35, 35, 35 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 1, 2, 3, 2, 2, 3, 4, 5, + 3, 1, 2, 3, 1, 2, 4, 5, 1, 3, + 1, 2, 1, 2, 1, 2, 3, 3, 1, 1, + 1, 1, 2, 2 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const yytype_uint8 yydefact[] = +{ + 0, 0, 0, 2, 0, 0, 6, 1, 0, 0, + 0, 0, 11, 3, 14, 0, 5, 0, 7, 0, + 0, 0, 12, 4, 15, 0, 0, 8, 13, 0, + 28, 29, 0, 0, 0, 0, 18, 20, 22, 30, + 31, 24, 10, 9, 0, 25, 0, 0, 16, 0, + 21, 23, 32, 33, 17, 26, 27, 19 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int8 yydefgoto[] = +{ + -1, 2, 3, 4, 16, 11, 12, 13, 14, 35, + 36, 37, 38, 39, 40, 41 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -37 +static const yytype_int8 yypact[] = +{ + -1, -2, 36, 22, 35, 8, -37, -37, 32, 33, + 30, 22, -37, 17, -37, 37, -37, 13, -37, 34, + 31, -4, -37, 17, -37, 38, 39, -37, -37, -4, + -37, -37, 0, -4, -4, 18, -4, 42, -37, -37, + -37, 19, -37, -37, 21, 19, 20, 9, -37, -4, + 42, -37, -37, -37, -37, -37, -37, -4 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int8 yypgoto[] = +{ + -37, -37, -37, -37, -37, -37, 41, 43, -12, -16, + -3, -36, -37, -37, -37, 15 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -1 +static const yytype_uint8 yytable[] = +{ + 50, 24, 1, 30, 31, 5, 32, 30, 31, 6, + 33, 24, 34, 44, 33, 17, 34, 46, 47, 18, + 26, 50, 49, 9, 27, 10, 56, 8, 9, 48, + 10, 49, 54, 49, 49, 55, 7, 52, 53, 15, + 19, 20, 21, 29, 25, 28, 57, 45, 0, 42, + 43, 51, 22, 0, 23 +}; + +static const yytype_int8 yycheck[] = +{ + 36, 13, 3, 7, 8, 7, 10, 7, 8, 11, + 14, 23, 16, 29, 14, 7, 16, 33, 34, 11, + 7, 57, 13, 6, 11, 8, 17, 5, 6, 11, + 8, 13, 11, 13, 13, 15, 0, 18, 19, 4, + 8, 8, 12, 12, 7, 11, 49, 32, -1, 11, + 11, 9, 11, -1, 11 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint8 yystos[] = +{ + 0, 3, 21, 22, 23, 7, 11, 0, 5, 6, + 8, 25, 26, 27, 28, 4, 24, 7, 11, 8, + 8, 12, 26, 27, 28, 7, 7, 11, 11, 12, + 7, 8, 10, 14, 16, 29, 30, 31, 32, 33, + 34, 35, 11, 11, 29, 35, 29, 29, 11, 13, + 31, 9, 18, 19, 11, 15, 17, 30 +}; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK (1); \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (yyscanner, jsgf, YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (YYID (0)) + + +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (YYID (N)) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (YYID (0)) +#endif + + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# if YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif + + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (&yylval, YYLEX_PARAM) +#else +# define YYLEX yylex (&yylval, yyscanner) +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (YYID (0)) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value, yyscanner, jsgf); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (YYID (0)) + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, void* yyscanner, jsgf_t *jsgf) +#else +static void +yy_symbol_value_print (yyoutput, yytype, yyvaluep, yyscanner, jsgf) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; + void* yyscanner; + jsgf_t *jsgf; +#endif +{ + if (!yyvaluep) + return; + YYUSE (yyscanner); + YYUSE (jsgf); +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# else + YYUSE (yyoutput); +# endif + switch (yytype) + { + default: + break; + } +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, void* yyscanner, jsgf_t *jsgf) +#else +static void +yy_symbol_print (yyoutput, yytype, yyvaluep, yyscanner, jsgf) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; + void* yyscanner; + jsgf_t *jsgf; +#endif +{ + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + yy_symbol_value_print (yyoutput, yytype, yyvaluep, yyscanner, jsgf); + YYFPRINTF (yyoutput, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) +#else +static void +yy_stack_print (yybottom, yytop) + yytype_int16 *yybottom; + yytype_int16 *yytop; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (YYID (0)) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_reduce_print (YYSTYPE *yyvsp, int yyrule, void* yyscanner, jsgf_t *jsgf) +#else +static void +yy_reduce_print (yyvsp, yyrule, yyscanner, jsgf) + YYSTYPE *yyvsp; + int yyrule; + void* yyscanner; + jsgf_t *jsgf; +#endif +{ + int yynrhs = yyr2[yyrule]; + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]) + , yyscanner, jsgf); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyvsp, Rule, yyscanner, jsgf); \ +} while (YYID (0)) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static YYSIZE_T +yystrlen (const char *yystr) +#else +static YYSIZE_T +yystrlen (yystr) + const char *yystr; +#endif +{ + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +# endif + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static char * +yystpcpy (char *yydest, const char *yysrc) +#else +static char * +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +#endif +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into YYRESULT an error message about the unexpected token + YYCHAR while in state YYSTATE. Return the number of bytes copied, + including the terminating null byte. If YYRESULT is null, do not + copy anything; just return the number of bytes that would be + copied. As a special case, return 0 if an ordinary "syntax error" + message will do. Return YYSIZE_MAXIMUM if overflow occurs during + size calculation. */ +static YYSIZE_T +yysyntax_error (char *yyresult, int yystate, int yychar) +{ + int yyn = yypact[yystate]; + + if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) + return 0; + else + { + int yytype = YYTRANSLATE (yychar); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + int yyx; + +# if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +# endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; + } + + yyf = YY_(yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + + if (yysize_overflow) + return YYSIZE_MAXIMUM; + + if (yyresult) + { + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + char *yyp = yyresult; + int yyi = 0; + while ((*yyp = *yyf) != '\0') + { + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } + } + } + return yysize; + } +} +#endif /* YYERROR_VERBOSE */ + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, void* yyscanner, jsgf_t *jsgf) +#else +static void +yydestruct (yymsg, yytype, yyvaluep, yyscanner, jsgf) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; + void* yyscanner; + jsgf_t *jsgf; +#endif +{ + YYUSE (yyvaluep); + YYUSE (yyscanner); + YYUSE (jsgf); + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + + default: + break; + } +} + +/* Prevent warnings from -Wmissing-prototypes. */ +#ifdef YYPARSE_PARAM +#if defined __STDC__ || defined __cplusplus +int yyparse (void *YYPARSE_PARAM); +#else +int yyparse (); +#endif +#else /* ! YYPARSE_PARAM */ +#if defined __STDC__ || defined __cplusplus +int yyparse (void* yyscanner, jsgf_t *jsgf); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + + + +/*-------------------------. +| yyparse or yypush_parse. | +`-------------------------*/ + +#ifdef YYPARSE_PARAM +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void *YYPARSE_PARAM) +#else +int +yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +#endif +#else /* ! YYPARSE_PARAM */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void* yyscanner, jsgf_t *jsgf) +#else +int +yyparse (yyscanner, jsgf) + void* yyscanner; + jsgf_t *jsgf; +#endif +#endif +{ +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + + /* Number of syntax errors so far. */ + int yynerrs; + + int yystate; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + + /* The stacks and their tools: + `yyss': related to states. + `yyvs': related to semantic values. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs; + YYSTYPE *yyvsp; + + YYSIZE_T yystacksize; + + int yyn; + int yyresult; + /* Lookahead token as an internal (translated) token number. */ + int yytoken; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + yytoken = 0; + yyss = yyssa; + yyvs = yyvsa; + yystacksize = YYINITDEPTH; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + if (yystate == YYFINAL) + YYACCEPT; + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + + /* Do appropriate processing given the current state. Read a + lookahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to lookahead token. */ + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token. */ + yychar = YYEMPTY; + + yystate = yyn; + *++yyvsp = yylval; + + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 5: + +/* Line 1455 of yacc.c */ +#line 87 "jsgf_parser.y" + { jsgf->name = (yyvsp[(2) - (2)].name); } + break; + + case 7: + +/* Line 1455 of yacc.c */ +#line 91 "jsgf_parser.y" + { jsgf->version = (yyvsp[(2) - (3)].name); } + break; + + case 8: + +/* Line 1455 of yacc.c */ +#line 92 "jsgf_parser.y" + { jsgf->version = (yyvsp[(2) - (4)].name); jsgf->charset = (yyvsp[(3) - (4)].name); } + break; + + case 9: + +/* Line 1455 of yacc.c */ +#line 93 "jsgf_parser.y" + { jsgf->version = (yyvsp[(2) - (5)].name); jsgf->charset = (yyvsp[(3) - (5)].name); + jsgf->locale = (yyvsp[(4) - (5)].name); } + break; + + case 10: + +/* Line 1455 of yacc.c */ +#line 97 "jsgf_parser.y" + { (yyval.name) = (yyvsp[(2) - (3)].name); } + break; + + case 13: + +/* Line 1455 of yacc.c */ +#line 104 "jsgf_parser.y" + { jsgf_import_rule(jsgf, (yyvsp[(2) - (3)].name)); ckd_free((yyvsp[(2) - (3)].name)); } + break; + + case 16: + +/* Line 1455 of yacc.c */ +#line 111 "jsgf_parser.y" + { jsgf_define_rule(jsgf, (yyvsp[(1) - (4)].name), (yyvsp[(3) - (4)].rhs), 0); ckd_free((yyvsp[(1) - (4)].name)); } + break; + + case 17: + +/* Line 1455 of yacc.c */ +#line 112 "jsgf_parser.y" + { jsgf_define_rule(jsgf, (yyvsp[(2) - (5)].name), (yyvsp[(4) - (5)].rhs), 1); ckd_free((yyvsp[(2) - (5)].name)); } + break; + + case 18: + +/* Line 1455 of yacc.c */ +#line 115 "jsgf_parser.y" + { (yyval.rhs) = (yyvsp[(1) - (1)].rhs); (yyval.rhs)->atoms = glist_reverse((yyval.rhs)->atoms); } + break; + + case 19: + +/* Line 1455 of yacc.c */ +#line 116 "jsgf_parser.y" + { (yyval.rhs) = (yyvsp[(3) - (3)].rhs); + (yyval.rhs)->atoms = glist_reverse((yyval.rhs)->atoms); + (yyval.rhs)->alt = (yyvsp[(1) - (3)].rhs); } + break; + + case 20: + +/* Line 1455 of yacc.c */ +#line 121 "jsgf_parser.y" + { (yyval.rhs) = ckd_calloc(1, sizeof(*(yyval.rhs))); + (yyval.rhs)->atoms = glist_add_ptr((yyval.rhs)->atoms, (yyvsp[(1) - (1)].atom)); } + break; + + case 21: + +/* Line 1455 of yacc.c */ +#line 123 "jsgf_parser.y" + { (yyval.rhs) = (yyvsp[(1) - (2)].rhs); + (yyval.rhs)->atoms = glist_add_ptr((yyval.rhs)->atoms, (yyvsp[(2) - (2)].atom)); } + break; + + case 23: + +/* Line 1455 of yacc.c */ +#line 128 "jsgf_parser.y" + { (yyval.atom) = (yyvsp[(1) - (2)].atom); + (yyval.atom)->tags = glist_add_ptr((yyval.atom)->tags, (yyvsp[(2) - (2)].name)); } + break; + + case 25: + +/* Line 1455 of yacc.c */ +#line 133 "jsgf_parser.y" + { (yyval.atom) = (yyvsp[(2) - (2)].atom); (yyval.atom)->weight = (yyvsp[(1) - (2)].weight); } + break; + + case 26: + +/* Line 1455 of yacc.c */ +#line 136 "jsgf_parser.y" + { (yyval.rule) = jsgf_define_rule(jsgf, NULL, (yyvsp[(2) - (3)].rhs), 0); } + break; + + case 27: + +/* Line 1455 of yacc.c */ +#line 139 "jsgf_parser.y" + { (yyval.rule) = jsgf_optional_new(jsgf, (yyvsp[(2) - (3)].rhs)); } + break; + + case 28: + +/* Line 1455 of yacc.c */ +#line 142 "jsgf_parser.y" + { (yyval.atom) = jsgf_atom_new((yyvsp[(1) - (1)].name), 1.0); ckd_free((yyvsp[(1) - (1)].name)); } + break; + + case 29: + +/* Line 1455 of yacc.c */ +#line 143 "jsgf_parser.y" + { (yyval.atom) = jsgf_atom_new((yyvsp[(1) - (1)].name), 1.0); ckd_free((yyvsp[(1) - (1)].name)); } + break; + + case 30: + +/* Line 1455 of yacc.c */ +#line 144 "jsgf_parser.y" + { (yyval.atom) = jsgf_atom_new((yyvsp[(1) - (1)].rule)->name, 1.0); } + break; + + case 31: + +/* Line 1455 of yacc.c */ +#line 145 "jsgf_parser.y" + { (yyval.atom) = jsgf_atom_new((yyvsp[(1) - (1)].rule)->name, 1.0); } + break; + + case 32: + +/* Line 1455 of yacc.c */ +#line 146 "jsgf_parser.y" + { (yyval.atom) = jsgf_kleene_new(jsgf, (yyvsp[(1) - (2)].atom), 0); } + break; + + case 33: + +/* Line 1455 of yacc.c */ +#line 147 "jsgf_parser.y" + { (yyval.atom) = jsgf_kleene_new(jsgf, (yyvsp[(1) - (2)].atom), 1); } + break; + + + +/* Line 1455 of yacc.c */ +#line 1580 "jsgf_parser.c" + default: break; + } + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (yyscanner, jsgf, YY_("syntax error")); +#else + { + YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); + if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) + { + YYSIZE_T yyalloc = 2 * yysize; + if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) + yyalloc = YYSTACK_ALLOC_MAXIMUM; + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yyalloc); + if (yymsg) + yymsg_alloc = yyalloc; + else + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + } + } + + if (0 < yysize && yysize <= yymsg_alloc) + { + (void) yysyntax_error (yymsg, yystate, yychar); + yyerror (yyscanner, jsgf, yymsg); + } + else + { + yyerror (yyscanner, jsgf, YY_("syntax error")); + if (yysize != 0) + goto yyexhaustedlab; + } + } +#endif + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval, yyscanner, jsgf); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (/*CONSTCOND*/ 0) + goto yyerrorlab; + + /* Do not reclaim the symbols of the rule which action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + yystos[yystate], yyvsp, yyscanner, jsgf); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + *++yyvsp = yylval; + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#if !defined(yyoverflow) || YYERROR_VERBOSE +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (yyscanner, jsgf, YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval, yyscanner, jsgf); + /* Do not reclaim the symbols of the rule which action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp, yyscanner, jsgf); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif +#if YYERROR_VERBOSE + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); +#endif + /* Make sure YYID is used. */ + return YYID (yyresult); +} + + + +/* Line 1675 of yacc.c */ +#line 150 "jsgf_parser.y" + + +void +yyerror(yyscan_t lex, jsgf_t *jsgf, const char *s) +{ + (void)jsgf; + E_ERROR("%s at line %d current token '%s'\n", s, yyget_lineno(lex), yyget_text(lex)); +} + diff --git a/src/lm/jsgf_parser.h b/src/lm/jsgf_parser.h new file mode 100644 index 0000000..95f68e3 --- /dev/null +++ b/src/lm/jsgf_parser.h @@ -0,0 +1,90 @@ + +/* A Bison parser, made by GNU Bison 2.4.1. */ + +/* Skeleton interface for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + HEADER = 258, + GRAMMAR = 259, + IMPORT = 260, + PUBLIC = 261, + TOKEN = 262, + RULENAME = 263, + TAG = 264, + WEIGHT = 265 + }; +#endif +/* Tokens. */ +#define HEADER 258 +#define GRAMMAR 259 +#define IMPORT 260 +#define PUBLIC 261 +#define TOKEN 262 +#define RULENAME 263 +#define TAG 264 +#define WEIGHT 265 + + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +{ + +/* Line 1676 of yacc.c */ +#line 65 "jsgf_parser.y" + + char *name; + float weight; + jsgf_rule_t *rule; + jsgf_rhs_t *rhs; + jsgf_atom_t *atom; + + + +/* Line 1676 of yacc.c */ +#line 82 "jsgf_parser.h" +} YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + + + + diff --git a/src/lm/jsgf_parser.y b/src/lm/jsgf_parser.y new file mode 100644 index 0000000..37c564d --- /dev/null +++ b/src/lm/jsgf_parser.y @@ -0,0 +1,157 @@ +/* -*- c-basic-offset:4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +%{ +#define YYERROR_VERBOSE + +#include +#include + +#include + +#include "util/hash_table.h" +#include "util/ckd_alloc.h" + +#include "jsgf_internal.h" +#include "jsgf_parser.h" +#include "jsgf_scanner.h" + +/* Suppress warnings from generated code */ +#if defined _MSC_VER +#pragma warning(disable: 4273) +#endif + +void yyerror(yyscan_t lex, jsgf_t *jsgf, const char *s); + +%} + +%pure-parser +%lex-param { void* yyscanner } +%parse-param { void* yyscanner } +%parse-param { jsgf_t *jsgf } + +%union { + char *name; + float weight; + jsgf_rule_t *rule; + jsgf_rhs_t *rhs; + jsgf_atom_t *atom; +} + +%token HEADER GRAMMAR IMPORT PUBLIC +%token TOKEN RULENAME TAG +%token WEIGHT +%type rule_atom rule_item tagged_rule_item +%type rule_expansion alternate_list +%type grammar_header +%type rule_group rule_optional +%% + +grammar: header + | header rule_list + | header import_header rule_list + ; + +header: jsgf_header grammar_header { jsgf->name = $2; } + ; + +jsgf_header: HEADER ';' + | HEADER TOKEN ';' { jsgf->version = $2; } + | HEADER TOKEN TOKEN ';' { jsgf->version = $2; jsgf->charset = $3; } + | HEADER TOKEN TOKEN TOKEN ';' { jsgf->version = $2; jsgf->charset = $3; + jsgf->locale = $4; } + ; + +grammar_header: GRAMMAR TOKEN ';' { $$ = $2; } + ; + +import_header: import_statement + | import_header import_statement + ; + +import_statement: IMPORT RULENAME ';' { jsgf_import_rule(jsgf, $2); ckd_free($2); } + ; + +rule_list: rule + | rule_list rule + ; + +rule: RULENAME '=' alternate_list ';' { jsgf_define_rule(jsgf, $1, $3, 0); ckd_free($1); } +| PUBLIC RULENAME '=' alternate_list ';' { jsgf_define_rule(jsgf, $2, $4, 1); ckd_free($2); } + ; + +alternate_list: rule_expansion { $$ = $1; $$->atoms = glist_reverse($$->atoms); } + | alternate_list '|' rule_expansion { $$ = $3; + $$->atoms = glist_reverse($$->atoms); + $$->alt = $1; } + ; + +rule_expansion: tagged_rule_item { $$ = ckd_calloc(1, sizeof(*$$)); + $$->atoms = glist_add_ptr($$->atoms, $1); } + | rule_expansion tagged_rule_item { $$ = $1; + $$->atoms = glist_add_ptr($$->atoms, $2); } + ; + +tagged_rule_item: rule_item + | tagged_rule_item TAG { $$ = $1; + $$->tags = glist_add_ptr($$->tags, $2); } + ; + +rule_item: rule_atom + | WEIGHT rule_atom { $$ = $2; $$->weight = $1; } + ; + +rule_group: '(' alternate_list ')' { $$ = jsgf_define_rule(jsgf, NULL, $2, 0); } + ; + +rule_optional: '[' alternate_list ']' { $$ = jsgf_optional_new(jsgf, $2); } + ; + +rule_atom: TOKEN { $$ = jsgf_atom_new($1, 1.0); ckd_free($1); } + | RULENAME { $$ = jsgf_atom_new($1, 1.0); ckd_free($1); } + | rule_group { $$ = jsgf_atom_new($1->name, 1.0); } + | rule_optional { $$ = jsgf_atom_new($1->name, 1.0); } + | rule_atom '*' { $$ = jsgf_kleene_new(jsgf, $1, 0); } + | rule_atom '+' { $$ = jsgf_kleene_new(jsgf, $1, 1); } + ; + +%% + +void +yyerror(yyscan_t lex, jsgf_t *jsgf, const char *s) +{ + E_ERROR("%s at line %d current token '%s'\n", s, yyget_lineno(lex), yyget_text(lex)); +} diff --git a/src/lm/jsgf_scanner.c b/src/lm/jsgf_scanner.c new file mode 100644 index 0000000..86623af --- /dev/null +++ b/src/lm/jsgf_scanner.c @@ -0,0 +1,2221 @@ +#line 2 "jsgf_scanner.c" + +#line 4 "jsgf_scanner.c" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 6 +#define YY_FLEX_SUBMINOR_VERSION 1 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! C99 */ + +#endif /* ! FLEXINT_H */ + +/* TODO: this is always defined, so inline it */ +#define yyconst const + +#if defined(__GNUC__) && __GNUC__ >= 3 +#define yynoreturn __attribute__((__noreturn__)) +#else +#define yynoreturn +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* An opaque pointer. */ +#ifndef YY_TYPEDEF_YY_SCANNER_T +#define YY_TYPEDEF_YY_SCANNER_T +typedef void* yyscan_t; +#endif + +/* For convenience, these vars (plus the bison vars far below) + are macros in the reentrant scanner. */ +#define yyin yyg->yyin_r +#define yyout yyg->yyout_r +#define yyextra yyg->yyextra_r +#define yyleng yyg->yyleng_r +#define yytext yyg->yytext_r +#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) +#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) +#define yy_flex_debug yyg->yy_flex_debug_r + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yyg->yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yyg->yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart(yyin ,yyscanner ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k. + * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. + * Ditto for the __ia64__ case accordingly. + */ +#define YY_BUF_SIZE 32768 +#else +#define YY_BUF_SIZE 16384 +#endif /* __ia64__ */ +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires + * access to the local variable yy_act. Since yyless() is a macro, it would break + * existing scanners that call yyless() from OUTSIDE yylex. + * One obvious solution it to make yy_act a global. I tried that, and saw + * a 5% performance hit in a non-yylineno scanner, because yy_act is + * normally declared as a register variable-- so it is not worth it. + */ + #define YY_LESS_LINENO(n) \ + do { \ + int yyl;\ + for ( yyl = n; yyl < yyleng; ++yyl )\ + if ( yytext[yyl] == '\n' )\ + --yylineno;\ + }while(0) + #define YY_LINENO_REWIND_TO(dst) \ + do {\ + const char *p;\ + for ( p = yy_cp-1; p >= (dst); --p)\ + if ( *p == '\n' )\ + --yylineno;\ + }while(0) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = yyg->yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner ) + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + int yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \ + ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] + +void yyrestart (FILE *input_file ,yyscan_t yyscanner ); +void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ,yyscan_t yyscanner ); +void yy_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void yy_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +void yypop_buffer_state (yyscan_t yyscanner ); + +static void yyensure_buffer_stack (yyscan_t yyscanner ); +static void yy_load_buffer_state (yyscan_t yyscanner ); +static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yyscanner ); + +#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ,yyscanner) + +YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner ); + +void *yyalloc (yy_size_t ,yyscan_t yyscanner ); +void *yyrealloc (void *,yy_size_t ,yyscan_t yyscanner ); +void yyfree (void * ,yyscan_t yyscanner ); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + yyensure_buffer_stack (yyscanner); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + yyensure_buffer_stack (yyscanner); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +#define yywrap(yyscanner) (/*CONSTCOND*/1) +#define YY_SKIP_YYWRAP + +typedef unsigned char YY_CHAR; + +typedef int yy_state_type; + +#define yytext_ptr yytext_r + +static yy_state_type yy_get_previous_state (yyscan_t yyscanner ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ,yyscan_t yyscanner); +static int yy_get_next_buffer (yyscan_t yyscanner ); +static void yynoreturn yy_fatal_error (yyconst char* msg ,yyscan_t yyscanner ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yyg->yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yyg->yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yyg->yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 22 +#define YY_END_OF_BUFFER 23 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_accept[98] = + { 0, + 0, 0, 0, 0, 0, 0, 0, 0, 23, 22, + 1, 22, 22, 22, 22, 22, 22, 22, 5, 1, + 5, 17, 1, 17, 21, 21, 18, 21, 21, 9, + 1, 9, 0, 3, 0, 0, 0, 0, 0, 0, + 4, 17, 17, 0, 17, 17, 7, 0, 20, 0, + 0, 0, 0, 0, 16, 8, 0, 0, 2, 14, + 0, 0, 0, 0, 19, 0, 17, 0, 17, 17, + 0, 0, 6, 20, 0, 15, 0, 0, 16, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 10, 0, + 0, 0, 0, 12, 13, 11, 0 + + } ; + +static yyconst YY_CHAR yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 4, 5, 1, 1, 1, 1, 6, + 6, 7, 6, 1, 8, 9, 10, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 1, 12, 13, + 6, 14, 1, 1, 1, 1, 1, 1, 1, 15, + 16, 1, 1, 17, 1, 1, 1, 1, 1, 1, + 1, 1, 18, 1, 1, 1, 1, 1, 1, 1, + 6, 19, 6, 1, 1, 1, 20, 21, 22, 1, + + 23, 1, 24, 1, 25, 1, 1, 26, 27, 1, + 28, 29, 1, 30, 1, 31, 32, 1, 1, 1, + 1, 1, 33, 6, 34, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 35, 1, 1, 1, + 36, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst YY_CHAR yy_meta[38] = + { 0, + 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, + 1, 2, 3, 3, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 2, 1, 1, 1 + } ; + +static yyconst flex_uint16_t yy_base[113] = + { 0, + 0, 36, 4, 12, 72, 105, 14, 20, 135, 312, + 312, 117, 2, 0, 103, 105, 99, 95, 312, 312, + 119, 0, 312, 138, 312, 21, 312, 0, 1, 312, + 312, 118, 109, 312, 123, 111, 104, 94, 101, 85, + 312, 0, 171, 14, 0, 204, 312, 109, 113, 41, + 106, 96, 21, 23, 312, 312, 88, 98, 312, 312, + 73, 71, 70, 89, 312, 44, 0, 39, 0, 237, + 43, 90, 312, 312, 57, 312, 37, 69, 43, 77, + 64, 57, 58, 64, 76, 94, 79, 59, 312, 39, + 14, 14, 4, 312, 312, 312, 312, 271, 274, 277, + + 280, 283, 0, 285, 288, 290, 293, 296, 299, 302, + 305, 308 + } ; + +static yyconst flex_int16_t yy_def[113] = + { 0, + 98, 98, 99, 99, 100, 100, 101, 101, 97, 97, + 97, 97, 97, 102, 97, 97, 97, 97, 97, 97, + 97, 103, 97, 104, 97, 97, 97, 105, 106, 97, + 97, 97, 97, 97, 107, 102, 97, 97, 97, 97, + 97, 103, 104, 108, 103, 109, 97, 97, 110, 97, + 97, 105, 106, 111, 97, 97, 97, 107, 97, 97, + 97, 97, 97, 97, 97, 112, 43, 108, 43, 109, + 97, 110, 97, 97, 97, 97, 106, 111, 106, 97, + 97, 97, 97, 97, 108, 112, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 0, 97, 97, 97, + + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97 + } ; + +static yyconst flex_uint16_t yy_nxt[350] = + { 0, + 42, 11, 11, 97, 12, 20, 11, 97, 34, 13, + 21, 35, 14, 20, 11, 31, 11, 65, 21, 54, + 32, 31, 11, 15, 16, 53, 32, 47, 17, 48, + 49, 50, 66, 96, 55, 95, 18, 11, 11, 54, + 12, 78, 65, 51, 94, 13, 44, 85, 14, 48, + 74, 50, 74, 87, 55, 54, 79, 66, 93, 15, + 16, 54, 86, 51, 17, 51, 74, 88, 74, 88, + 55, 53, 18, 23, 11, 24, 55, 25, 25, 65, + 33, 26, 92, 27, 28, 25, 91, 78, 74, 87, + 90, 89, 73, 84, 66, 83, 44, 85, 82, 81, + + 59, 51, 79, 80, 29, 25, 23, 11, 24, 76, + 25, 25, 86, 75, 26, 73, 27, 28, 25, 71, + 64, 63, 62, 61, 60, 59, 57, 56, 41, 40, + 39, 38, 37, 33, 97, 97, 97, 29, 25, 44, + 44, 45, 97, 44, 44, 97, 97, 44, 97, 44, + 44, 44, 97, 97, 97, 97, 46, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 44, 44, 44, 44, 45, 97, 44, 44, 97, 97, + 44, 97, 44, 44, 44, 97, 97, 97, 97, 46, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + + 97, 97, 97, 44, 44, 68, 44, 69, 97, 68, + 68, 97, 97, 68, 97, 68, 68, 68, 97, 97, + 97, 97, 70, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 68, 68, 68, 44, + 69, 97, 68, 68, 97, 97, 68, 97, 68, 68, + 68, 97, 97, 97, 97, 70, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 68, + 68, 10, 10, 10, 19, 19, 19, 22, 22, 22, + 30, 30, 30, 36, 36, 43, 43, 43, 52, 52, + 53, 53, 53, 58, 58, 58, 44, 44, 44, 67, + + 67, 67, 72, 72, 72, 77, 77, 77, 68, 68, + 68, 9, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97 + } ; + +static yyconst flex_int16_t yy_chk[350] = + { 0, + 103, 1, 1, 0, 1, 3, 3, 0, 13, 1, + 3, 13, 1, 4, 4, 7, 7, 44, 4, 29, + 7, 8, 8, 1, 1, 54, 8, 26, 1, 26, + 26, 26, 44, 93, 29, 92, 1, 2, 2, 53, + 2, 54, 68, 26, 91, 2, 66, 66, 2, 50, + 50, 50, 71, 71, 53, 77, 54, 68, 90, 2, + 2, 79, 66, 50, 2, 71, 75, 75, 88, 88, + 77, 78, 2, 5, 5, 5, 79, 5, 5, 85, + 84, 5, 83, 5, 5, 5, 82, 78, 87, 87, + 81, 80, 72, 64, 85, 63, 86, 86, 62, 61, + + 58, 87, 78, 57, 5, 5, 6, 6, 6, 52, + 6, 6, 86, 51, 6, 49, 6, 6, 6, 48, + 40, 39, 38, 37, 36, 35, 33, 32, 21, 18, + 17, 16, 15, 12, 9, 0, 0, 6, 6, 24, + 24, 24, 0, 24, 24, 0, 0, 24, 0, 24, + 24, 24, 0, 0, 0, 0, 24, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 24, 43, 43, 43, 0, 43, 43, 0, 0, + 43, 0, 43, 43, 43, 0, 0, 0, 0, 43, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 43, 43, 46, 46, 46, 0, 46, + 46, 0, 0, 46, 0, 46, 46, 46, 0, 0, + 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 46, 46, 70, 70, + 70, 0, 70, 70, 0, 0, 70, 0, 70, 70, + 70, 0, 0, 0, 0, 70, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, + 70, 98, 98, 98, 99, 99, 99, 100, 100, 100, + 101, 101, 101, 102, 102, 104, 104, 104, 105, 105, + 106, 106, 106, 107, 107, 107, 108, 108, 108, 109, + + 109, 109, 110, 110, 110, 111, 111, 111, 112, 112, + 112, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97 + } ; + +/* Table of booleans, true if rule could match eol. */ +static yyconst flex_int32_t yy_rule_can_match_eol[23] = + { 0, +1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, + 0, 0, 0, }; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +#line 1 "_jsgf_scanner.l" +/* -*- mode: text -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* YOU MUST USE FLEX 2.6.1 OR NEWER TO PROCESS THIS FILE!!! */ +#line 39 "_jsgf_scanner.l" + +#include "lm/jsgf_internal.h" +#include "lm/jsgf_parser.h" + +#define YY_NO_UNISTD_H 1 + + + +#line 612 "jsgf_scanner.c" + +#define INITIAL 0 +#define COMMENT 1 +#define DECL 2 +#define DECLCOMMENT 3 + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +/* Holds the entire state of the reentrant scanner. */ +struct yyguts_t + { + + /* User-defined. Not touched by flex. */ + YY_EXTRA_TYPE yyextra_r; + + /* The rest are the same as the globals declared in the non-reentrant scanner. */ + FILE *yyin_r, *yyout_r; + size_t yy_buffer_stack_top; /**< index of top of stack. */ + size_t yy_buffer_stack_max; /**< capacity of stack. */ + YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */ + char yy_hold_char; + int yy_n_chars; + int yyleng_r; + char *yy_c_buf_p; + int yy_init; + int yy_start; + int yy_did_buffer_switch_on_eof; + int yy_start_stack_ptr; + int yy_start_stack_depth; + int *yy_start_stack; + yy_state_type yy_last_accepting_state; + char* yy_last_accepting_cpos; + + int yylineno_r; + int yy_flex_debug_r; + + char *yytext_r; + int yy_more_flag; + int yy_more_len; + + YYSTYPE * yylval_r; + + }; /* end struct yyguts_t */ + +static int yy_init_globals (yyscan_t yyscanner ); + + /* This must go here because YYSTYPE and YYLTYPE are included + * from bison output in section 1.*/ + # define yylval yyg->yylval_r + +int yylex_init (yyscan_t* scanner); + +int yylex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int yylex_destroy (yyscan_t yyscanner ); + +int yyget_debug (yyscan_t yyscanner ); + +void yyset_debug (int debug_flag ,yyscan_t yyscanner ); + +YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner ); + +void yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner ); + +FILE *yyget_in (yyscan_t yyscanner ); + +void yyset_in (FILE * _in_str ,yyscan_t yyscanner ); + +FILE *yyget_out (yyscan_t yyscanner ); + +void yyset_out (FILE * _out_str ,yyscan_t yyscanner ); + + int yyget_leng (yyscan_t yyscanner ); + +char *yyget_text (yyscan_t yyscanner ); + +int yyget_lineno (yyscan_t yyscanner ); + +void yyset_lineno (int _line_number ,yyscan_t yyscanner ); + +int yyget_column (yyscan_t yyscanner ); + +void yyset_column (int _column_no ,yyscan_t yyscanner ); + +YYSTYPE * yyget_lval (yyscan_t yyscanner ); + +void yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap (yyscan_t yyscanner ); +#else +extern int yywrap (yyscan_t yyscanner ); +#endif +#endif + +#ifndef YY_NO_UNPUT + +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (yyscan_t yyscanner ); +#else +static int input (yyscan_t yyscanner ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k */ +#define YY_READ_BUF_SIZE 16384 +#else +#define YY_READ_BUF_SIZE 8192 +#endif /* __ia64__ */ +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + size_t n; \ + for ( n = 0; n < (size_t)max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = (int) fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(yyin); \ + } \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex \ + (YYSTYPE * yylval_param ,yyscan_t yyscanner); + +#define YY_DECL int yylex \ + (YYSTYPE * yylval_param , yyscan_t yyscanner) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK /*LINTED*/break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + yy_state_type yy_current_state; + char *yy_cp, *yy_bp; + int yy_act; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + yylval = yylval_param; + + if ( !yyg->yy_init ) + { + yyg->yy_init = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yyg->yy_start ) + yyg->yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + yyensure_buffer_stack (yyscanner); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); + } + + yy_load_buffer_state(yyscanner ); + } + + { +#line 59 "_jsgf_scanner.l" + + +#line 883 "jsgf_scanner.c" + + while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ + { + yy_cp = yyg->yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yyg->yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yyg->yy_start; +yy_match: + do + { + YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; + if ( yy_accept[yy_current_state] ) + { + yyg->yy_last_accepting_state = yy_current_state; + yyg->yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 98 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; + ++yy_cp; + } + while ( yy_current_state != 97 ); + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->yy_last_accepting_state; + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + + YY_DO_BEFORE_ACTION; + + if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) + { + yy_size_t yyl; + for ( yyl = 0; yyl < (yy_size_t)yyleng; ++yyl ) + if ( yytext[yyl] == '\n' ) + + do{ yylineno++; + yycolumn=0; + }while(0) +; + } + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = yyg->yy_hold_char; + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->yy_last_accepting_state; + goto yy_find_action; + +case 1: +/* rule 1 can match eol */ +YY_RULE_SETUP +#line 61 "_jsgf_scanner.l" +; /* ignore whitespace */ + YY_BREAK +case 2: +/* rule 2 can match eol */ +YY_RULE_SETUP +#line 62 "_jsgf_scanner.l" +; /* single-line comments */ + YY_BREAK +case 3: +YY_RULE_SETUP +#line 63 "_jsgf_scanner.l" +{ BEGIN(COMMENT); } /* C-style comments */ + YY_BREAK +case 4: +YY_RULE_SETUP +#line 64 "_jsgf_scanner.l" +{ BEGIN(INITIAL); } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 65 "_jsgf_scanner.l" +; /* Ignore stuff in comment mode */ + YY_BREAK +case 6: +/* rule 6 can match eol */ +YY_RULE_SETUP +#line 67 "_jsgf_scanner.l" +; /* single-line comments inside decl */ + YY_BREAK +case 7: +YY_RULE_SETUP +#line 68 "_jsgf_scanner.l" +{ BEGIN(DECLCOMMENT); } /* C-style comments inside decl */ + YY_BREAK +case 8: +YY_RULE_SETUP +#line 69 "_jsgf_scanner.l" +{ BEGIN(DECL); } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 70 "_jsgf_scanner.l" +; /* Ignore stuff in comment mode */ + YY_BREAK +case 10: +YY_RULE_SETUP +#line 72 "_jsgf_scanner.l" +{BEGIN(DECL); return HEADER;} + YY_BREAK +case 11: +YY_RULE_SETUP +#line 73 "_jsgf_scanner.l" +{BEGIN(DECL); return GRAMMAR;} + YY_BREAK +case 12: +YY_RULE_SETUP +#line 74 "_jsgf_scanner.l" +{BEGIN(DECL); return IMPORT;} + YY_BREAK +case 13: +YY_RULE_SETUP +#line 75 "_jsgf_scanner.l" +{BEGIN(DECL); return PUBLIC;} + YY_BREAK +case 14: +/* rule 14 can match eol */ +YY_RULE_SETUP +#line 77 "_jsgf_scanner.l" +{ BEGIN(DECL); yylval->name = strdup(yytext); return RULENAME; } + YY_BREAK +case 15: +/* rule 15 can match eol */ +YY_RULE_SETUP +#line 78 "_jsgf_scanner.l" +{ yylval->name = strdup(yytext); return RULENAME; } + YY_BREAK +case 16: +/* rule 16 can match eol */ +YY_RULE_SETUP +#line 80 "_jsgf_scanner.l" +{ yylval->name = strdup(yytext); return TAG; } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 81 "_jsgf_scanner.l" +{ yylval->name = strdup(yytext); return TOKEN; } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 82 "_jsgf_scanner.l" +{ BEGIN(INITIAL); return yytext[0]; } + YY_BREAK +case 19: +/* rule 19 can match eol */ +YY_RULE_SETUP +#line 83 "_jsgf_scanner.l" +{ yylval->name = strdup(yytext); return TOKEN; } + YY_BREAK +case 20: +YY_RULE_SETUP +#line 84 "_jsgf_scanner.l" +{ yylval->weight = atof_c(yytext+1); return WEIGHT; } + YY_BREAK +case 21: +YY_RULE_SETUP +#line 85 "_jsgf_scanner.l" +return yytext[0]; /* Single-character tokens */ + YY_BREAK +case 22: +YY_RULE_SETUP +#line 87 "_jsgf_scanner.l" +ECHO; + YY_BREAK +#line 1065 "jsgf_scanner.c" +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(COMMENT): +case YY_STATE_EOF(DECL): +case YY_STATE_EOF(DECLCOMMENT): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yyg->yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( yyscanner ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner); + + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yyg->yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->yy_last_accepting_state; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( yyscanner ) ) + { + case EOB_ACT_END_OF_FILE: + { + yyg->yy_did_buffer_switch_on_eof = 0; + + if ( yywrap(yyscanner ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yyg->yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yyg->yy_c_buf_p = + yyg->yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( yyscanner ); + + yy_cp = yyg->yy_c_buf_p; + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yyg->yy_c_buf_p = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]; + + yy_current_state = yy_get_previous_state( yyscanner ); + + yy_cp = yyg->yy_c_buf_p; + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of user's declarations */ +} /* end of yylex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + char *source = yyg->yytext_ptr; + yy_size_t number_to_move, i; + int ret_val; + + if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (yy_size_t) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0; + + else + { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; + + int yy_c_buf_p_offset = + (int) (yyg->yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ,yyscanner ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = NULL; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + yyg->yy_n_chars, num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + if ( yyg->yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart(yyin ,yyscanner); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if ((int) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ,yyscanner ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + } + + yyg->yy_n_chars += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (yyscan_t yyscanner) +{ + yy_state_type yy_current_state; + char *yy_cp; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + yy_current_state = yyg->yy_start; + + for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp ) + { + YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + yyg->yy_last_accepting_state = yy_current_state; + yyg->yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 98 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner) +{ + int yy_is_jam; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */ + char *yy_cp = yyg->yy_c_buf_p; + + YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + yyg->yy_last_accepting_state = yy_current_state; + yyg->yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 98 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; + yy_is_jam = (yy_current_state == 97); + + (void)yyg; + return yy_is_jam ? 0 : yy_current_state; +} + +#ifndef YY_NO_UNPUT + +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (yyscan_t yyscanner) +#else + static int input (yyscan_t yyscanner) +#endif + +{ + int c; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + *yyg->yy_c_buf_p = yyg->yy_hold_char; + + if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) + /* This was really a NUL. */ + *yyg->yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yyg->yy_c_buf_p - yyg->yytext_ptr; + ++yyg->yy_c_buf_p; + + switch ( yy_get_next_buffer( yyscanner ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart(yyin ,yyscanner); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap(yyscanner ) ) + return 0; + + if ( ! yyg->yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(yyscanner); +#else + return input(yyscanner); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yyg->yy_c_buf_p = yyg->yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */ + *yyg->yy_c_buf_p = '\0'; /* preserve yytext */ + yyg->yy_hold_char = *++yyg->yy_c_buf_p; + + if ( c == '\n' ) + + do{ yylineno++; + yycolumn=0; + }while(0) +; + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * @param yyscanner The scanner object. + * @note This function does not reset the start condition to @c INITIAL . + */ + void yyrestart (FILE * input_file , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if ( ! YY_CURRENT_BUFFER ){ + yyensure_buffer_stack (yyscanner); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); + } + + yy_init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner); + yy_load_buffer_state(yyscanner ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * @param yyscanner The scanner object. + */ + void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* TODO. We should be able to replace this entire function body + * with + * yypop_buffer_state(); + * yypush_buffer_state(new_buffer); + */ + yyensure_buffer_stack (yyscanner); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *yyg->yy_c_buf_p = yyg->yy_hold_char; + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + yy_load_buffer_state(yyscanner ); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yyg->yy_did_buffer_switch_on_eof = 1; +} + +static void yy_load_buffer_state (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + yyg->yy_hold_char = *yyg->yy_c_buf_p; +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * @param yyscanner The scanner object. + * @return the allocated buffer state. + */ + YY_BUFFER_STATE yy_create_buffer (FILE * file, int size , yyscan_t yyscanner) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = (yy_size_t)size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ,yyscanner ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer(b,file ,yyscanner); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * @param yyscanner The scanner object. + */ + void yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yyfree((void *) b->yy_ch_buf ,yyscanner ); + + yyfree((void *) b ,yyscanner ); +} + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ + static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner) + +{ + int oerrno = errno; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + yy_flush_buffer(b ,yyscanner); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then yy_init_buffer was _probably_ + * called from yyrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * @param yyscanner The scanner object. + */ + void yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + yy_load_buffer_state(yyscanner ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * @param yyscanner The scanner object. + */ +void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if (new_buffer == NULL) + return; + + yyensure_buffer_stack(yyscanner); + + /* This block is copied from yy_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *yyg->yy_c_buf_p = yyg->yy_hold_char; + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + yyg->yy_buffer_stack_top++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from yy_switch_to_buffer. */ + yy_load_buffer_state(yyscanner ); + yyg->yy_did_buffer_switch_on_eof = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * @param yyscanner The scanner object. + */ +void yypop_buffer_state (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if (!YY_CURRENT_BUFFER) + return; + + yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner); + YY_CURRENT_BUFFER_LVALUE = NULL; + if (yyg->yy_buffer_stack_top > 0) + --yyg->yy_buffer_stack_top; + + if (YY_CURRENT_BUFFER) { + yy_load_buffer_state(yyscanner ); + yyg->yy_did_buffer_switch_on_eof = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void yyensure_buffer_stack (yyscan_t yyscanner) +{ + int num_to_alloc; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (!yyg->yy_buffer_stack) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ + yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + , yyscanner); + if ( ! yyg->yy_buffer_stack ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + yyg->yy_buffer_stack_max = num_to_alloc; + yyg->yy_buffer_stack_top = 0; + return; + } + + if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + yy_size_t grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = yyg->yy_buffer_stack_max + grow_size; + yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc + (yyg->yy_buffer_stack, + num_to_alloc * sizeof(struct yy_buffer_state*) + , yyscanner); + if ( ! yyg->yy_buffer_stack ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*)); + yyg->yy_buffer_stack_max = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return NULL; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = NULL; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer(b ,yyscanner ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to yylex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * yy_scan_bytes() instead. + */ +YY_BUFFER_STATE yy_scan_string (yyconst char * yystr , yyscan_t yyscanner) +{ + + return yy_scan_bytes(yystr,(int) strlen(yystr) ,yyscanner); +} + +/** Setup the input buffer state to scan the given bytes. The next call to yylex() will + * scan from a @e copy of @a bytes. + * @param yybytes the byte buffer to scan + * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len , yyscan_t yyscanner) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + yy_size_t i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = (yy_size_t) _yybytes_len + 2; + buf = (char *) yyalloc(n ,yyscanner ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < (yy_size_t)_yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer(buf,n ,yyscanner); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yynoreturn yy_fatal_error (yyconst char* msg , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + yytext[yyleng] = yyg->yy_hold_char; \ + yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ + yyg->yy_hold_char = *yyg->yy_c_buf_p; \ + *yyg->yy_c_buf_p = '\0'; \ + yyleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the user-defined data for this scanner. + * @param yyscanner The scanner object. + */ +YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyextra; +} + +/** Get the current line number. + * @param yyscanner The scanner object. + */ +int yyget_lineno (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (! YY_CURRENT_BUFFER) + return 0; + + return yylineno; +} + +/** Get the current column number. + * @param yyscanner The scanner object. + */ +int yyget_column (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (! YY_CURRENT_BUFFER) + return 0; + + return yycolumn; +} + +/** Get the input stream. + * @param yyscanner The scanner object. + */ +FILE *yyget_in (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyin; +} + +/** Get the output stream. + * @param yyscanner The scanner object. + */ +FILE *yyget_out (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyout; +} + +/** Get the length of the current token. + * @param yyscanner The scanner object. + */ +int yyget_leng (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyleng; +} + +/** Get the current token. + * @param yyscanner The scanner object. + */ + +char *yyget_text (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yytext; +} + +/** Set the user-defined data. This data is never touched by the scanner. + * @param user_defined The data to be associated with this scanner. + * @param yyscanner The scanner object. + */ +void yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyextra = user_defined ; +} + +/** Set the current line number. + * @param _line_number line number + * @param yyscanner The scanner object. + */ +void yyset_lineno (int _line_number , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* lineno is only valid if an input buffer exists. */ + if (! YY_CURRENT_BUFFER ) + YY_FATAL_ERROR( "yyset_lineno called with no buffer" ); + + yylineno = _line_number; +} + +/** Set the current column. + * @param _column_no column number + * @param yyscanner The scanner object. + */ +void yyset_column (int _column_no , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* column is only valid if an input buffer exists. */ + if (! YY_CURRENT_BUFFER ) + YY_FATAL_ERROR( "yyset_column called with no buffer" ); + + yycolumn = _column_no; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param _in_str A readable stream. + * @param yyscanner The scanner object. + * @see yy_switch_to_buffer + */ +void yyset_in (FILE * _in_str , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyin = _in_str ; +} + +void yyset_out (FILE * _out_str , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyout = _out_str ; +} + +int yyget_debug (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yy_flex_debug; +} + +void yyset_debug (int _bdebug , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yy_flex_debug = _bdebug ; +} + +/* Accessor methods for yylval and yylloc */ + +YYSTYPE * yyget_lval (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yylval; +} + +void yyset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yylval = yylval_param; +} + +/* User-visible API */ + +/* yylex_init is special because it creates the scanner itself, so it is + * the ONLY reentrant function that doesn't take the scanner as the last argument. + * That's why we explicitly handle the declaration, instead of using our macros. + */ + +int yylex_init(yyscan_t* ptr_yy_globals) + +{ + if (ptr_yy_globals == NULL){ + errno = EINVAL; + return 1; + } + + *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL ); + + if (*ptr_yy_globals == NULL){ + errno = ENOMEM; + return 1; + } + + /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + + return yy_init_globals ( *ptr_yy_globals ); +} + +/* yylex_init_extra has the same functionality as yylex_init, but follows the + * convention of taking the scanner as the last argument. Note however, that + * this is a *pointer* to a scanner, as it will be allocated by this call (and + * is the reason, too, why this function also must handle its own declaration). + * The user defined value in the first argument will be available to yyalloc in + * the yyextra field. + */ + +int yylex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals ) + +{ + struct yyguts_t dummy_yyguts; + + yyset_extra (yy_user_defined, &dummy_yyguts); + + if (ptr_yy_globals == NULL){ + errno = EINVAL; + return 1; + } + + *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); + + if (*ptr_yy_globals == NULL){ + errno = ENOMEM; + return 1; + } + + /* By setting to 0xAA, we expose bugs in + yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + + yyset_extra (yy_user_defined, *ptr_yy_globals); + + return yy_init_globals ( *ptr_yy_globals ); +} + +static int yy_init_globals (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from yylex_destroy(), so don't allocate here. + */ + + yyg->yy_buffer_stack = NULL; + yyg->yy_buffer_stack_top = 0; + yyg->yy_buffer_stack_max = 0; + yyg->yy_c_buf_p = NULL; + yyg->yy_init = 0; + yyg->yy_start = 0; + + yyg->yy_start_stack_ptr = 0; + yyg->yy_start_stack_depth = 0; + yyg->yy_start_stack = NULL; + +/* Defined in main.c */ +#ifdef YY_STDINIT + yyin = stdin; + yyout = stdout; +#else + yyin = NULL; + yyout = NULL; +#endif + + /* For future reference: Set errno on error, since we are called by + * yylex_init() + */ + return 0; +} + +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner ); + YY_CURRENT_BUFFER_LVALUE = NULL; + yypop_buffer_state(yyscanner); + } + + /* Destroy the stack itself. */ + yyfree(yyg->yy_buffer_stack ,yyscanner); + yyg->yy_buffer_stack = NULL; + + /* Destroy the start condition stack. */ + yyfree(yyg->yy_start_stack ,yyscanner ); + yyg->yy_start_stack = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * yylex() is called, initialization will occur. */ + yy_init_globals( yyscanner); + + /* Destroy the main struct (reentrant only). */ + yyfree ( yyscanner , yyscanner ); + yyscanner = NULL; + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + + int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s , yyscan_t yyscanner) +{ + int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *yyalloc (yy_size_t size , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + return malloc(size); +} + +void *yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return realloc(ptr, size); +} + +void yyfree (void * ptr , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#line 87 "_jsgf_scanner.l" + + + diff --git a/src/lm/jsgf_scanner.h b/src/lm/jsgf_scanner.h new file mode 100644 index 0000000..8ccc56e --- /dev/null +++ b/src/lm/jsgf_scanner.h @@ -0,0 +1,342 @@ +#ifndef yyHEADER_H +#define yyHEADER_H 1 +#define yyIN_HEADER 1 + +#line 6 "jsgf_scanner.h" + +#line 8 "jsgf_scanner.h" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 6 +#define YY_FLEX_SUBMINOR_VERSION 1 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! C99 */ + +#endif /* ! FLEXINT_H */ + +/* TODO: this is always defined, so inline it */ +#define yyconst const + +#if defined(__GNUC__) && __GNUC__ >= 3 +#define yynoreturn __attribute__((__noreturn__)) +#else +#define yynoreturn +#endif + +/* An opaque pointer. */ +#ifndef YY_TYPEDEF_YY_SCANNER_T +#define YY_TYPEDEF_YY_SCANNER_T +typedef void* yyscan_t; +#endif + +/* For convenience, these vars (plus the bison vars far below) + are macros in the reentrant scanner. */ +#define yyin yyg->yyin_r +#define yyout yyg->yyout_r +#define yyextra yyg->yyextra_r +#define yyleng yyg->yyleng_r +#define yytext yyg->yytext_r +#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) +#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) +#define yy_flex_debug yyg->yy_flex_debug_r + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k. + * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. + * Ditto for the __ia64__ case accordingly. + */ +#define YY_BUF_SIZE 32768 +#else +#define YY_BUF_SIZE 16384 +#endif /* __ia64__ */ +#endif + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + int yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +void yyrestart (FILE *input_file ,yyscan_t yyscanner ); +void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ,yyscan_t yyscanner ); +void yy_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void yy_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +void yypop_buffer_state (yyscan_t yyscanner ); + +YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner ); + +void *yyalloc (yy_size_t ,yyscan_t yyscanner ); +void *yyrealloc (void *,yy_size_t ,yyscan_t yyscanner ); +void yyfree (void * ,yyscan_t yyscanner ); + +/* Begin user sect3 */ + +#define yywrap(yyscanner) (/*CONSTCOND*/1) +#define YY_SKIP_YYWRAP + +#define yytext_ptr yytext_r + +#ifdef YY_HEADER_EXPORT_START_CONDITIONS +#define INITIAL 0 +#define COMMENT 1 +#define DECL 2 +#define DECLCOMMENT 3 + +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +int yylex_init (yyscan_t* scanner); + +int yylex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int yylex_destroy (yyscan_t yyscanner ); + +int yyget_debug (yyscan_t yyscanner ); + +void yyset_debug (int debug_flag ,yyscan_t yyscanner ); + +YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner ); + +void yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner ); + +FILE *yyget_in (yyscan_t yyscanner ); + +void yyset_in (FILE * _in_str ,yyscan_t yyscanner ); + +FILE *yyget_out (yyscan_t yyscanner ); + +void yyset_out (FILE * _out_str ,yyscan_t yyscanner ); + + int yyget_leng (yyscan_t yyscanner ); + +char *yyget_text (yyscan_t yyscanner ); + +int yyget_lineno (yyscan_t yyscanner ); + +void yyset_lineno (int _line_number ,yyscan_t yyscanner ); + +int yyget_column (yyscan_t yyscanner ); + +void yyset_column (int _column_no ,yyscan_t yyscanner ); + +YYSTYPE * yyget_lval (yyscan_t yyscanner ); + +void yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap (yyscan_t yyscanner ); +#else +extern int yywrap (yyscan_t yyscanner ); +#endif +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner); +#endif + +#ifndef YY_NO_INPUT + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k */ +#define YY_READ_BUF_SIZE 16384 +#else +#define YY_READ_BUF_SIZE 8192 +#endif /* __ia64__ */ +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex \ + (YYSTYPE * yylval_param ,yyscan_t yyscanner); + +#define YY_DECL int yylex \ + (YYSTYPE * yylval_param , yyscan_t yyscanner) +#endif /* !YY_DECL */ + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +#undef YY_NEW_FILE +#undef YY_FLUSH_BUFFER +#undef yy_set_bol +#undef yy_new_buffer +#undef yy_set_interactive +#undef YY_DO_BEFORE_ACTION + +#ifdef YY_DECL_IS_OURS +#undef YY_DECL_IS_OURS +#undef YY_DECL +#endif + +#line 87 "_jsgf_scanner.l" + + +#line 341 "jsgf_scanner.h" +#undef yyIN_HEADER +#endif /* yyHEADER_H */ diff --git a/src/lm/lm_trie.c b/src/lm/lm_trie.c new file mode 100644 index 0000000..eb85bab --- /dev/null +++ b/src/lm/lm_trie.c @@ -0,0 +1,915 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include +#include +#include + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "util/byteorder.h" +#include "util/ckd_alloc.h" +#include "util/priority_queue.h" + +#include "lm/lm_trie.h" +#include "lm/lm_trie_quant.h" + +static void lm_trie_alloc_ngram(lm_trie_t * trie, uint32 * counts, int order); + +static uint32 +base_size(uint32 entries, uint32 max_vocab, uint8 remaining_bits) +{ + uint8 total_bits = bitarr_required_bits(max_vocab) + remaining_bits; + /* Extra entry for next pointer at the end. + * +7 then / 8 to round up bits and convert to bytes + * +sizeof(uint64) so that ReadInt57 etc don't go segfault. + * Note that this waste is O(order), not O(number of ngrams).*/ + return ((1 + entries) * total_bits + 7) / 8 + sizeof(uint64); +} + +uint32 +middle_size(uint8 quant_bits, uint32 entries, uint32 max_vocab, + uint32 max_ptr) +{ + return base_size(entries, max_vocab, + quant_bits + bitarr_required_bits(max_ptr)); +} + +uint32 +longest_size(uint8 quant_bits, uint32 entries, uint32 max_vocab) +{ + return base_size(entries, max_vocab, quant_bits); +} + +static void +base_init(base_t * base, void *base_mem, uint32 max_vocab, + uint8 remaining_bits) +{ + base->word_bits = bitarr_required_bits(max_vocab); + base->word_mask = (1U << base->word_bits) - 1U; + if (base->word_bits > 25) + E_ERROR + ("Sorry, word indices more than %d are not implemented. Edit util/bit_packing.hh and fix the bit packing functions\n", + (1U << 25)); + base->total_bits = base->word_bits + remaining_bits; + + base->base = (uint8 *) base_mem; + base->insert_index = 0; + base->max_vocab = max_vocab; +} + +void +middle_init(middle_t * middle, void *base_mem, uint8 quant_bits, + uint32 entries, uint32 max_vocab, uint32 max_next, + void *next_source) +{ + middle->quant_bits = quant_bits; + bitarr_mask_from_max(&middle->next_mask, max_next); + middle->next_source = next_source; + if (entries + 1 >= (1U << 25) || (max_next >= (1U << 25))) + E_ERROR + ("Sorry, this does not support more than %d n-grams of a particular order. Edit util/bit_packing.hh and fix the bit packing functions\n", + (1U << 25)); + base_init(&middle->base, base_mem, max_vocab, + quant_bits + middle->next_mask.bits); +} + +void +longest_init(longest_t * longest, void *base_mem, uint8 quant_bits, + uint32 max_vocab) +{ + base_init(&longest->base, base_mem, max_vocab, quant_bits); +} + +static bitarr_address_t +middle_insert(middle_t * middle, uint32 word, int order, int max_order) +{ + uint32 at_pointer; + uint32 next; + bitarr_address_t address; + assert(word <= middle->base.word_mask); + address.base = middle->base.base; + address.offset = middle->base.insert_index * middle->base.total_bits; + bitarr_write_int25(address, middle->base.word_bits, word); + address.offset += middle->base.word_bits; + at_pointer = address.offset; + address.offset += middle->quant_bits; + if (order == max_order - 1) { + next = ((longest_t *) middle->next_source)->base.insert_index; + } + else { + next = ((middle_t *) middle->next_source)->base.insert_index; + } + + bitarr_write_int25(address, middle->next_mask.bits, next); + middle->base.insert_index++; + address.offset = at_pointer; + return address; +} + +static bitarr_address_t +longest_insert(longest_t * longest, uint32 index) +{ + bitarr_address_t address; + assert(index <= longest->base.word_mask); + address.base = longest->base.base; + address.offset = longest->base.insert_index * longest->base.total_bits; + bitarr_write_int25(address, longest->base.word_bits, index); + address.offset += longest->base.word_bits; + longest->base.insert_index++; + return address; +} + +static void +middle_finish_loading(middle_t * middle, uint32 next_end) +{ + bitarr_address_t address; + address.base = middle->base.base; + address.offset = + (middle->base.insert_index + 1) * middle->base.total_bits - + middle->next_mask.bits; + bitarr_write_int25(address, middle->next_mask.bits, next_end); +} + +static uint32 +unigram_next(lm_trie_t * trie, int order) +{ + return order == + 2 ? trie->longest->base.insert_index : trie->middle_begin->base. + insert_index; +} + +void +lm_trie_fix_counts(ngram_raw_t ** raw_ngrams, uint32 * counts, + uint32 * fixed_counts, int order) +{ + priority_queue_t *ngrams = + priority_queue_create(order - 1, &ngram_ord_comparator); + uint32 raw_ngram_ptrs[NGRAM_MAX_ORDER - 1]; + uint32 words[NGRAM_MAX_ORDER]; + int i; + + memset(words, -1, sizeof(words)); + memcpy(fixed_counts, counts, order * sizeof(*fixed_counts)); + for (i = 2; i <= order; i++) { + ngram_raw_t *tmp_ngram; + + if (counts[i - 1] <= 0) + continue; + + raw_ngram_ptrs[i - 2] = 0; + + tmp_ngram = + (ngram_raw_t *) ckd_calloc(1, sizeof(*tmp_ngram)); + *tmp_ngram = raw_ngrams[i - 2][0]; + tmp_ngram->order = i; + priority_queue_add(ngrams, tmp_ngram); + } + + for (;;) { + int32 to_increment = TRUE; + ngram_raw_t *top; + if (priority_queue_size(ngrams) == 0) { + break; + } + top = (ngram_raw_t *) priority_queue_poll(ngrams); + if (top->order == 2) { + memcpy(words, top->words, 2 * sizeof(*words)); + } + else { + for (i = 0; (uint32)i < top->order - 1; i++) { + if (words[i] != top->words[i]) { + int num; + num = (i == 0) ? 1 : i; + memcpy(words, top->words, + (num + 1) * sizeof(*words)); + fixed_counts[num]++; + to_increment = FALSE; + break; + } + } + words[top->order - 1] = top->words[top->order - 1]; + } + if (to_increment) { + raw_ngram_ptrs[top->order - 2]++; + } + if (raw_ngram_ptrs[top->order - 2] < counts[top->order - 1]) { + *top = raw_ngrams[top->order - 2][raw_ngram_ptrs[top->order - 2]]; + priority_queue_add(ngrams, top); + } + else { + ckd_free(top); + } + } + + assert(priority_queue_size(ngrams) == 0); + priority_queue_free(ngrams, NULL); +} + + +static void +recursive_insert(lm_trie_t * trie, ngram_raw_t ** raw_ngrams, + uint32 * counts, int order) +{ + uint32 unigram_idx = 0; + uint32 *words; + float *probs; + const uint32 unigram_count = (uint32) counts[0]; + priority_queue_t *ngrams = + priority_queue_create(order, &ngram_ord_comparator); + ngram_raw_t *ngram; + uint32 *raw_ngrams_ptr; + int i; + + words = (uint32 *) ckd_calloc(order, sizeof(*words)); + probs = (float *) ckd_calloc(order - 1, sizeof(*probs)); + ngram = (ngram_raw_t *) ckd_calloc(1, sizeof(*ngram)); + ngram->order = 1; + ngram->words = &unigram_idx; + priority_queue_add(ngrams, ngram); + raw_ngrams_ptr = + (uint32 *) ckd_calloc(order - 1, sizeof(*raw_ngrams_ptr)); + for (i = 2; i <= order; ++i) { + ngram_raw_t *tmp_ngram; + + if (counts[i - 1] <= 0) + continue; + + raw_ngrams_ptr[i - 2] = 0; + tmp_ngram = + (ngram_raw_t *) ckd_calloc(1, sizeof(*tmp_ngram)); + *tmp_ngram = raw_ngrams[i - 2][0]; + tmp_ngram->order = i; + + priority_queue_add(ngrams, tmp_ngram); + } + + for (;;) { + ngram_raw_t *top = + (ngram_raw_t *) priority_queue_poll(ngrams); + + if (top->order == 1) { + trie->unigrams[unigram_idx].next = unigram_next(trie, order); + words[0] = unigram_idx; + probs[0] = trie->unigrams[unigram_idx].prob; + if (++unigram_idx == unigram_count + 1) { + ckd_free(top); + break; + } + priority_queue_add(ngrams, top); + } + else { + for (i = 0; (uint32)i < top->order - 1; i++) { + if (words[i] != top->words[i]) { + /* need to insert dummy suffixes to make ngram of higher order reachable */ + int j; + assert(i > 0); /* unigrams are not pruned without removing ngrams that contains them */ + for (j = i; (uint32)j < top->order - 1; j++) { + middle_t *middle = &trie->middle_begin[j - 1]; + bitarr_address_t address = + middle_insert(middle, top->words[j], + j + 1, order); + /* calculate prob for blank */ + float calc_prob = + probs[j - 1] + + trie->unigrams[top->words[j]].bo; + probs[j] = calc_prob; + lm_trie_quant_mwrite(trie->quant, address, j - 1, + calc_prob, 0.0f); + } + } + } + memcpy(words, top->words, + top->order * sizeof(*words)); + if (top->order == (uint32)order) { + bitarr_address_t address = + longest_insert(trie->longest, + top->words[top->order - 1]); + lm_trie_quant_lwrite(trie->quant, address, top->prob); + } + else { + middle_t *middle = &trie->middle_begin[top->order - 2]; + bitarr_address_t address = + middle_insert(middle, + top->words[top->order - 1], + top->order, order); + /* write prob and backoff */ + probs[top->order - 1] = top->prob; + lm_trie_quant_mwrite(trie->quant, address, top->order - 2, + top->prob, top->backoff); + } + raw_ngrams_ptr[top->order - 2]++; + if (raw_ngrams_ptr[top->order - 2] < counts[top->order - 1]) { + *top = raw_ngrams[top->order - + 2][raw_ngrams_ptr[top->order - 2]]; + + priority_queue_add(ngrams, top); + } + else { + ckd_free(top); + } + } + } + assert(priority_queue_size(ngrams) == 0); + priority_queue_free(ngrams, NULL); + ckd_free(raw_ngrams_ptr); + ckd_free(words); + ckd_free(probs); +} + +static lm_trie_t * +lm_trie_init(uint32 unigram_count) +{ + lm_trie_t *trie; + + trie = (lm_trie_t *) ckd_calloc(1, sizeof(*trie)); + memset(trie->hist_cache, -1, sizeof(trie->hist_cache)); /* prepare request history */ + memset(trie->backoff_cache, 0, sizeof(trie->backoff_cache)); + trie->unigrams = + (unigram_t *) ckd_calloc((unigram_count + 1), + sizeof(*trie->unigrams)); + trie->ngram_mem = NULL; + return trie; +} + +lm_trie_t * +lm_trie_create(uint32 unigram_count, int order) +{ + lm_trie_t *trie = lm_trie_init(unigram_count); + trie->quant = + (order > 1) ? lm_trie_quant_create(order) : 0; + return trie; +} + +static size_t +lm_trie_read_ug(lm_trie_t * trie, uint32 * counts, FILE * fp) +{ + size_t rv = fread(trie->unigrams, sizeof(*trie->unigrams), + (counts[0] + 1), fp); + if (SWAP_LM_TRIE) { + int i; + for (i = 0; (uint32)i < counts[0] + 1; ++i) { + SWAP_FLOAT32(&trie->unigrams[i].prob); + SWAP_FLOAT32(&trie->unigrams[i].bo); + SWAP_INT32(&trie->unigrams[i].next); + } + } + return rv; +} + +lm_trie_t * +lm_trie_read_bin(uint32 * counts, int order, FILE * fp) +{ + lm_trie_t *trie = lm_trie_init(counts[0]); + trie->quant = (order > 1) ? lm_trie_quant_read_bin(fp, order) : NULL; + E_INFO("pos after quant: %ld\n", ftell(fp)); + lm_trie_read_ug(trie, counts, fp); + E_INFO("pos after ug: %ld\n", ftell(fp)); + if (order > 1) { + lm_trie_alloc_ngram(trie, counts, order); + fread(trie->ngram_mem, 1, trie->ngram_mem_size, fp); + E_INFO("#ngram_mem: %ld\n", trie->ngram_mem_size); + } + return trie; +} + +static size_t +lm_trie_write_ug(lm_trie_t * trie, uint32 unigram_count, FILE * fp) +{ + if (SWAP_LM_TRIE) { + int i; + for (i = 0; (uint32)i < unigram_count + 1; ++i) { + unigram_t ug = trie->unigrams[i]; + SWAP_FLOAT32(&ug.prob); + SWAP_FLOAT32(&ug.bo); + SWAP_INT32(&ug.next); + if (fwrite(&ug, sizeof(ug), 1, fp) != 1) + return -1; + } + return (size_t)i; + } + else + return fwrite(trie->unigrams, sizeof(*trie->unigrams), + (unigram_count + 1), fp); +} + +void +lm_trie_write_bin(lm_trie_t * trie, uint32 unigram_count, FILE * fp) +{ + + if (trie->quant) + lm_trie_quant_write_bin(trie->quant, fp); + E_INFO("pos after quant: %ld\n", ftell(fp)); + lm_trie_write_ug(trie, unigram_count, fp); + E_INFO("pos after ug: %ld\n", ftell(fp)); + if (trie->ngram_mem) { + fwrite(trie->ngram_mem, 1, trie->ngram_mem_size, fp); + E_INFO("#ngram_mem: %ld\n", trie->ngram_mem_size); + } +} + +void +lm_trie_free(lm_trie_t * trie) +{ + if (trie->ngram_mem) { + ckd_free(trie->ngram_mem); + ckd_free(trie->middle_begin); + ckd_free(trie->longest); + } + if (trie->quant) + lm_trie_quant_free(trie->quant); + ckd_free(trie->unigrams); + ckd_free(trie); +} + +static void +lm_trie_alloc_ngram(lm_trie_t * trie, uint32 * counts, int order) +{ + int i; + uint8 *mem_ptr; + uint8 **middle_starts; + + trie->ngram_mem_size = 0; + for (i = 1; i < order - 1; i++) { + trie->ngram_mem_size += + middle_size(lm_trie_quant_msize(trie->quant), counts[i], + counts[0], counts[i + 1]); + } + trie->ngram_mem_size += + longest_size(lm_trie_quant_lsize(trie->quant), counts[order - 1], + counts[0]); + trie->ngram_mem = + (uint8 *) ckd_calloc(trie->ngram_mem_size, + sizeof(*trie->ngram_mem)); + mem_ptr = trie->ngram_mem; + trie->middle_begin = + (middle_t *) ckd_calloc(order - 2, sizeof(*trie->middle_begin)); + trie->middle_end = trie->middle_begin + (order - 2); + middle_starts = + (uint8 **) ckd_calloc(order - 2, sizeof(*middle_starts)); + for (i = 2; i < order; i++) { + middle_starts[i - 2] = mem_ptr; + mem_ptr += + middle_size(lm_trie_quant_msize(trie->quant), counts[i - 1], + counts[0], counts[i]); + } + trie->longest = (longest_t *) ckd_calloc(1, sizeof(*trie->longest)); + /* Crazy backwards thing so we initialize using pointers to ones that have already been initialized */ + for (i = order - 1; i >= 2; --i) { + middle_t *middle_ptr = &trie->middle_begin[i - 2]; + middle_init(middle_ptr, middle_starts[i - 2], + lm_trie_quant_msize(trie->quant), counts[i - 1], + counts[0], counts[i], + (i == + order - + 1) ? (void *) trie->longest : (void *) &trie-> + middle_begin[i - 1]); + } + ckd_free(middle_starts); + longest_init(trie->longest, mem_ptr, lm_trie_quant_lsize(trie->quant), + counts[0]); +} + +void +lm_trie_build(lm_trie_t * trie, ngram_raw_t ** raw_ngrams, uint32 * counts, uint32 *out_counts, + int order) +{ + int i; + + lm_trie_fix_counts(raw_ngrams, counts, out_counts, order); + lm_trie_alloc_ngram(trie, out_counts, order); + + if (order > 1) + E_INFO("Training quantizer\n"); + for (i = 2; i < order; i++) { + lm_trie_quant_train(trie->quant, i, counts[i - 1], + raw_ngrams[i - 2]); + } + lm_trie_quant_train_prob(trie->quant, order, counts[order - 1], + raw_ngrams[order - 2]); + + E_INFO("Building LM trie\n"); + recursive_insert(trie, raw_ngrams, counts, order); + /* Set ending offsets so the last entry will be sized properly */ + /* Last entry for unigrams was already set. */ + if (trie->middle_begin != trie->middle_end) { + middle_t *middle_ptr; + for (middle_ptr = trie->middle_begin; + middle_ptr != trie->middle_end - 1; ++middle_ptr) { + middle_t *next_middle_ptr = middle_ptr + 1; + middle_finish_loading(middle_ptr, + next_middle_ptr->base.insert_index); + } + middle_ptr = trie->middle_end - 1; + middle_finish_loading(middle_ptr, + trie->longest->base.insert_index); + } +} + +unigram_t * +unigram_find(unigram_t * u, uint32 word, node_range_t * next) +{ + unigram_t *ptr = &u[word]; + next->begin = ptr->next; + next->end = (ptr + 1)->next; + return ptr; +} + +static size_t +calc_pivot(uint32 off, uint32 range, uint32 width) +{ + return (size_t) ((off * width) / (range + 1)); +} + +static uint8 +uniform_find(void *base, uint8 total_bits, uint8 key_bits, uint32 key_mask, + uint32 before_it, uint32 before_v, + uint32 after_it, uint32 after_v, uint32 key, uint32 * out) +{ + bitarr_address_t address; + address.base = base; + + /* If we look for unigram added later */ + if (key > after_v) + return FALSE; + + while (after_it - before_it > 1) { + uint32 mid; + uint32 pivot = + before_it + (1 + + calc_pivot(key - before_v, after_v - before_v, + after_it - before_it - 1)); + /* access by pivot */ + address.offset = pivot * (uint32) total_bits; + mid = bitarr_read_int25(address, key_bits, key_mask); + if (mid < key) { + before_it = pivot; + before_v = mid; + } + else if (mid > key) { + after_it = pivot; + after_v = mid; + } + else { + *out = pivot; + return TRUE; + } + } + return FALSE; +} + +static bitarr_address_t +middle_find(middle_t * middle, uint32 word, node_range_t * range) +{ + uint32 at_pointer; + bitarr_address_t address; + + /* finding BitPacked with uniform find */ + if (!uniform_find + ((void *) middle->base.base, middle->base.total_bits, + middle->base.word_bits, middle->base.word_mask, range->begin - 1, + 0, range->end, middle->base.max_vocab, word, &at_pointer)) { + address.base = NULL; + address.offset = 0; + return address; + } + + address.base = middle->base.base; + at_pointer *= middle->base.total_bits; + at_pointer += middle->base.word_bits; + address.offset = at_pointer + middle->quant_bits; + range->begin = + bitarr_read_int25(address, middle->next_mask.bits, + middle->next_mask.mask); + address.offset += middle->base.total_bits; + range->end = + bitarr_read_int25(address, middle->next_mask.bits, + middle->next_mask.mask); + address.offset = at_pointer; + + return address; +} + +static bitarr_address_t +longest_find(longest_t * longest, uint32 word, node_range_t * range) +{ + uint32 at_pointer; + bitarr_address_t address; + + /* finding BitPacked with uniform find */ + if (!uniform_find + ((void *) longest->base.base, longest->base.total_bits, + longest->base.word_bits, longest->base.word_mask, + range->begin - 1, 0, range->end, longest->base.max_vocab, word, + &at_pointer)) { + address.base = NULL; + address.offset = 0; + return address; + } + address.base = longest->base.base; + address.offset = + at_pointer * longest->base.total_bits + longest->base.word_bits; + return address; +} + +static float +get_available_prob(lm_trie_t * trie, int32 wid, int32 * hist, + int max_order, int32 n_hist, int32 * n_used) +{ + float prob; + node_range_t node; + bitarr_address_t address; + int order_minus_2; + uint8 independent_left; + int32 *hist_iter, *hist_end; + + *n_used = 1; + prob = unigram_find(trie->unigrams, wid, &node)->prob; + if (n_hist == 0) { + return prob; + } + + /* find ngrams of higher order if any */ + order_minus_2 = 0; + independent_left = (node.begin == node.end); + hist_iter = hist; + hist_end = hist + n_hist; + for (;; order_minus_2++, hist_iter++) { + if (hist_iter == hist_end) + return prob; + if (independent_left) + return prob; + if (order_minus_2 == max_order - 2) + break; + + address = + middle_find(&trie->middle_begin[order_minus_2], *hist_iter, + &node); + independent_left = (address.base == NULL) + || (node.begin == node.end); + + /* didn't find entry */ + if (address.base == NULL) + return prob; + prob = lm_trie_quant_mpread(trie->quant, address, order_minus_2); + *n_used = order_minus_2 + 2; + } + + address = longest_find(trie->longest, *hist_iter, &node); + if (address.base != NULL) { + prob = lm_trie_quant_lpread(trie->quant, address); + *n_used = max_order; + } + return prob; +} + +static float +get_available_backoff(lm_trie_t * trie, int32 start, int32 * hist, + int32 n_hist) +{ + float backoff = 0.0f; + int order_minus_2; + int32 *hist_iter; + node_range_t node; + unigram_t *first_hist = unigram_find(trie->unigrams, hist[0], &node); + if (start <= 1) { + backoff += first_hist->bo; + start = 2; + } + order_minus_2 = start - 2; + for (hist_iter = hist + start - 1; hist_iter < hist + n_hist; + hist_iter++, order_minus_2++) { + bitarr_address_t address = + middle_find(&trie->middle_begin[order_minus_2], *hist_iter, + &node); + if (address.base == NULL) + break; + backoff += + lm_trie_quant_mboread(trie->quant, address, order_minus_2); + } + return backoff; +} + +static float +lm_trie_nobo_score(lm_trie_t * trie, int32 wid, int32 * hist, + int max_order, int32 n_hist, int32 * n_used) +{ + float prob = + get_available_prob(trie, wid, hist, max_order, n_hist, n_used); + if (n_hist < *n_used) + return prob; + return prob + get_available_backoff(trie, *n_used, hist, n_hist); +} + +static float +lm_trie_hist_score(lm_trie_t * trie, int32 wid, int32 * hist, int32 n_hist, + int32 * n_used) +{ + float prob; + int i, j; + node_range_t node; + bitarr_address_t address; + + *n_used = 1; + prob = unigram_find(trie->unigrams, wid, &node)->prob; + if (n_hist == 0) + return prob; + for (i = 0; i < n_hist - 1; i++) { + address = middle_find(&trie->middle_begin[i], hist[i], &node); + if (address.base == NULL) { + for (j = i; j < n_hist; j++) { + prob += trie->backoff_cache[j]; + } + return prob; + } + else { + (*n_used)++; + prob = lm_trie_quant_mpread(trie->quant, address, i); + } + } + address = longest_find(trie->longest, hist[n_hist - 1], &node); + if (address.base == NULL) { + return prob + trie->backoff_cache[n_hist - 1]; + } + else { + (*n_used)++; + return lm_trie_quant_lpread(trie->quant, address); + } +} + +static uint8 +history_matches(int32 * hist, int32 * prev_hist, int32 n_hist) +{ + int i; + for (i = 0; i < n_hist; i++) { + if (hist[i] != prev_hist[i]) { + return FALSE; + } + } + return TRUE; +} + +static void +update_backoff(lm_trie_t * trie, int32 * hist, int32 n_hist) +{ + int i; + node_range_t node; + bitarr_address_t address; + + memset(trie->backoff_cache, 0, sizeof(trie->backoff_cache)); + trie->backoff_cache[0] = unigram_find(trie->unigrams, hist[0], &node)->bo; + for (i = 1; i < n_hist; i++) { + address = middle_find(&trie->middle_begin[i - 1], hist[i], &node); + if (address.base == NULL) { + break; + } + trie->backoff_cache[i] = + lm_trie_quant_mboread(trie->quant, address, i - 1); + } + memcpy(trie->hist_cache, hist, n_hist * sizeof(*hist)); +} + +float +lm_trie_score(lm_trie_t * trie, int order, int32 wid, int32 * hist, + int32 n_hist, int32 * n_used) +{ + if (n_hist < order - 1) { + return lm_trie_nobo_score(trie, wid, hist, order, n_hist, n_used); + } + else { + assert(n_hist == order - 1); + if (!history_matches(hist, (int32 *) trie->hist_cache, n_hist)) { + update_backoff(trie, hist, n_hist); + } + return lm_trie_hist_score(trie, wid, hist, n_hist, n_used); + } +} + +void +lm_trie_fill_raw_ngram(lm_trie_t * trie, + ngram_raw_t * raw_ngrams, uint32 * raw_ngram_idx, + uint32 * counts, node_range_t range, uint32 * hist, + int n_hist, int order, int max_order) +{ + if (n_hist > 0 && range.begin == range.end) { + return; + } + if (n_hist == 0) { + uint32 i; + for (i = 0; i < counts[0]; i++) { + node_range_t node; + unigram_find(trie->unigrams, i, &node); + hist[0] = i; + lm_trie_fill_raw_ngram(trie, raw_ngrams, raw_ngram_idx, counts, + node, hist, 1, order, max_order); + } + } + else if (n_hist < order - 1) { + uint32 ptr; + node_range_t node; + bitarr_address_t address; + uint32 new_word; + middle_t *middle = &trie->middle_begin[n_hist - 1]; + for (ptr = range.begin; ptr < range.end; ptr++) { + address.base = middle->base.base; + address.offset = ptr * middle->base.total_bits; + new_word = + bitarr_read_int25(address, middle->base.word_bits, + middle->base.word_mask); + hist[n_hist] = new_word; + address.offset += middle->base.word_bits + middle->quant_bits; + node.begin = + bitarr_read_int25(address, middle->next_mask.bits, + middle->next_mask.mask); + address.offset = + (ptr + 1) * middle->base.total_bits + + middle->base.word_bits + middle->quant_bits; + node.end = + bitarr_read_int25(address, middle->next_mask.bits, + middle->next_mask.mask); + lm_trie_fill_raw_ngram(trie, raw_ngrams, raw_ngram_idx, counts, + node, hist, n_hist + 1, order, max_order); + } + } + else { + bitarr_address_t address; + uint32 ptr; + float prob, backoff; + int i; + assert(n_hist == order - 1); + for (ptr = range.begin; ptr < range.end; ptr++) { + ngram_raw_t *raw_ngram = &raw_ngrams[*raw_ngram_idx]; + if (order == max_order) { + longest_t *longest = trie->longest; + address.base = longest->base.base; + address.offset = ptr * longest->base.total_bits; + hist[n_hist] = + bitarr_read_int25(address, longest->base.word_bits, + longest->base.word_mask); + address.offset += longest->base.word_bits; + prob = lm_trie_quant_lpread(trie->quant, address); + } + else { + middle_t *middle = &trie->middle_begin[n_hist - 1]; + address.base = middle->base.base; + address.offset = ptr * middle->base.total_bits; + hist[n_hist] = + bitarr_read_int25(address, middle->base.word_bits, + middle->base.word_mask); + address.offset += middle->base.word_bits; + prob = + lm_trie_quant_mpread(trie->quant, address, n_hist - 1); + backoff = + lm_trie_quant_mboread(trie->quant, address, + n_hist - 1); + raw_ngram->backoff = backoff; + } + raw_ngram->prob = prob; + raw_ngram->words = + (uint32 *) ckd_calloc(order, sizeof(*raw_ngram->words)); + for (i = 0; i <= n_hist; i++) { + raw_ngram->words[i] = hist[n_hist - i]; + } + (*raw_ngram_idx)++; + } + } +} diff --git a/src/lm/lm_trie.h b/src/lm/lm_trie.h new file mode 100644 index 0000000..e6e9e37 --- /dev/null +++ b/src/lm/lm_trie.h @@ -0,0 +1,113 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef __LM_TRIE_H__ +#define __LM_TRIE_H__ + +#include "util/pio.h" +#include "lm/bitarr.h" +#include "lm/ngram_model_internal.h" +#include "lm/lm_trie_quant.h" + +typedef struct unigram_s { + float prob; + float bo; + uint32 next; +} unigram_t; + +typedef struct node_range_s { + uint32 begin; + uint32 end; +} node_range_t; + +typedef struct base_s { + uint8 word_bits; + uint8 total_bits; + uint32 word_mask; + uint8 *base; + uint32 insert_index; + uint32 max_vocab; +} base_t; + +typedef struct middle_s { + base_t base; + bitarr_mask_t next_mask; + uint8 quant_bits; + void *next_source; +} middle_t; + +typedef struct longest_s { + base_t base; + uint8 quant_bits; +} longest_t; + +typedef struct lm_trie_s { + uint8 *ngram_mem; /*<< This appears to be a bitarr.h bit array */ + size_t ngram_mem_size; + unigram_t *unigrams; + middle_t *middle_begin; + middle_t *middle_end; + longest_t *longest; + lm_trie_quant_t *quant; + + float backoff_cache[NGRAM_MAX_ORDER]; + uint32 hist_cache[NGRAM_MAX_ORDER - 1]; +} lm_trie_t; + +/** + * Creates lm_trie structure. Fills it if binary file with correspondent data is provided + */ +lm_trie_t *lm_trie_create(uint32 unigram_count, int order); + +lm_trie_t *lm_trie_read_bin(uint32 * counts, int order, FILE * fp); + +void lm_trie_write_bin(lm_trie_t * trie, uint32 unigram_count, FILE * fp); + +void lm_trie_free(lm_trie_t * trie); + +void lm_trie_build(lm_trie_t * trie, ngram_raw_t ** raw_ngrams, + uint32 * counts, uint32 *out_counts, int order); + +void lm_trie_fill_raw_ngram(lm_trie_t * trie, + ngram_raw_t * raw_ngrams, uint32 * raw_ngram_idx, + uint32 * counts, node_range_t range, uint32 * hist, + int n_hist, int order, int max_order); + +float lm_trie_score(lm_trie_t * trie, int order, int32 wid, int32 * hist, + int32 n_hist, int32 * n_used); + +#endif /* __LM_TRIE_H__ */ diff --git a/src/lm/lm_trie_quant.c b/src/lm/lm_trie_quant.c new file mode 100644 index 0000000..e6fd051 --- /dev/null +++ b/src/lm/lm_trie_quant.c @@ -0,0 +1,354 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include + +#include +#include + +#include "util/ckd_alloc.h" +#include "util/byteorder.h" + +#include "ngram_model_internal.h" +#include "lm_trie_quant.h" + +/* FIXME: WTF, no, that's not how this works!!! */ +#define FLOAT_INF (0x7f800000) + +typedef struct bins_s { + float32 *begin; + const float32 *end; +} bins_t; + +struct lm_trie_quant_s { + bins_t tables[NGRAM_MAX_ORDER - 1][2]; + bins_t *longest; + float32 *values; + size_t nvalues; + uint8 prob_bits; + uint8 bo_bits; + uint32 prob_mask; + uint32 bo_mask; +}; + +static void +bins_create(bins_t * bins, uint8 bits, float32 *begin) +{ + bins->begin = begin; + bins->end = bins->begin + (1ULL << bits); +} + +static float32 * +lower_bound(float32 *first, const float32 *last, float32 val) +{ + int count, step; + float32 *it; + + count = last - first; + while (count > 0) { + it = first; + step = count / 2; + it += step; + if (*it < val) { + first = ++it; + count -= step + 1; + } + else { + count = step; + } + } + return first; +} + +static uint64 +bins_encode(bins_t * bins, float32 value) +{ + float32 *above = lower_bound(bins->begin, bins->end, value); + if (above == bins->begin) + return 0; + if (above == bins->end) + return bins->end - bins->begin - 1; + return above - bins->begin - (value - *(above - 1) < *above - value); +} + +static float32 +bins_decode(bins_t * bins, size_t off) +{ + return bins->begin[off]; +} + +static size_t +quant_size(int order) +{ + int prob_bits = 16; + int bo_bits = 16; + size_t longest_table = (1U << prob_bits); + size_t middle_table = (1U << bo_bits) + longest_table; + /* unigrams are currently not quantized so no need for a table. */ + return (order - 2) * middle_table + longest_table; +} + +lm_trie_quant_t * +lm_trie_quant_create(int order) +{ + float32 *start; + int i; + lm_trie_quant_t *quant = + (lm_trie_quant_t *) ckd_calloc(1, sizeof(*quant)); + quant->nvalues = quant_size(order); + quant->values = + (float32 *) ckd_calloc(quant->nvalues, sizeof(*quant->values)); + + quant->prob_bits = 16; + quant->bo_bits = 16; + quant->prob_mask = (1U << quant->prob_bits) - 1; + quant->bo_mask = (1U << quant->bo_bits) - 1; + + start = (float32 *) (quant->values); + for (i = 0; i < order - 2; i++) { + bins_create(&quant->tables[i][0], quant->prob_bits, start); + start += (1ULL << quant->prob_bits); + bins_create(&quant->tables[i][1], quant->bo_bits, start); + start += (1ULL << quant->bo_bits); + } + bins_create(&quant->tables[order - 2][0], quant->prob_bits, start); + quant->longest = &quant->tables[order - 2][0]; + return quant; +} + + +lm_trie_quant_t * +lm_trie_quant_read_bin(FILE * fp, int order) +{ + int dummy; + lm_trie_quant_t *quant; + + fread(&dummy, sizeof(dummy), 1, fp); + quant = lm_trie_quant_create(order); + if (fread(quant->values, sizeof(*quant->values), + quant->nvalues, fp) != quant->nvalues) { + E_ERROR("Failed to read %d quantization values\n", + quant->nvalues); + lm_trie_quant_free(quant); + return NULL; + } + if (SWAP_LM_TRIE) { + size_t i; + for (i = 0; i < quant->nvalues; ++i) + SWAP_FLOAT32(&quant->values[i]); + } + + return quant; +} + +void +lm_trie_quant_write_bin(lm_trie_quant_t * quant, FILE * fp) +{ + /* Before it was quantization type */ + int dummy = 1; + fwrite(&dummy, sizeof(dummy), 1, fp); + if (SWAP_LM_TRIE) { + size_t i; + for (i = 0; i < quant->nvalues; ++i) { + float32 value = quant->values[i]; + SWAP_FLOAT32(&value); + if (fwrite(&value, sizeof(value), 1, fp) != 1) { + E_ERROR("Failed to write quantization value\n"); + return; /* WTF, FIXME */ + } + } + } + else { + if (fwrite(quant->values, sizeof(*quant->values), + quant->nvalues, fp) != quant->nvalues) { + E_ERROR("Failed to write %d quantization values\n", + quant->nvalues); + } + } +} + +void +lm_trie_quant_free(lm_trie_quant_t * quant) +{ + if (quant->values) + ckd_free(quant->values); + ckd_free(quant); +} + +uint8 +lm_trie_quant_msize(lm_trie_quant_t * quant) +{ + (void)quant; + return 32; +} + +uint8 +lm_trie_quant_lsize(lm_trie_quant_t * quant) +{ + (void)quant; + return 16; +} + +static int +weights_comparator(const void *a, const void *b) +{ + return (int) (*(float32 *) a - *(float32 *) b); +} + +static void +make_bins(float32 *values, uint32 values_num, float32 *centers, uint32 bins) +{ + float32 *finish, *start; + uint32 i; + + qsort(values, values_num, sizeof(*values), &weights_comparator); + start = values; + for (i = 0; i < bins; i++, centers++, start = finish) { + finish = values + (size_t) ((uint64) values_num * (i + 1) / bins); + if (finish == start) { + /* zero length bucket. */ + *centers = i ? *(centers - 1) : -FLOAT_INF; + } + else { + float32 sum = 0.0f; + float32 *ptr; + for (ptr = start; ptr != finish; ptr++) { + sum += *ptr; + } + *centers = sum / (float32) (finish - start); + } + } +} + +void +lm_trie_quant_train(lm_trie_quant_t * quant, int order, uint32 counts, + ngram_raw_t * raw_ngrams) +{ + float32 *probs; + float32 *backoffs; + float32 *centers; + uint32 backoff_num; + uint32 prob_num; + ngram_raw_t *raw_ngrams_end; + + probs = (float32 *) ckd_calloc(counts, sizeof(*probs)); + backoffs = (float32 *) ckd_calloc(counts, sizeof(*backoffs)); + raw_ngrams_end = raw_ngrams + counts; + + for (backoff_num = 0, prob_num = 0; raw_ngrams != raw_ngrams_end; + raw_ngrams++) { + probs[prob_num++] = raw_ngrams->prob; + backoffs[backoff_num++] = raw_ngrams->backoff; + } + + make_bins(probs, prob_num, quant->tables[order - 2][0].begin, + 1ULL << quant->prob_bits); + centers = quant->tables[order - 2][1].begin; + make_bins(backoffs, backoff_num, centers, (1ULL << quant->bo_bits)); + ckd_free(probs); + ckd_free(backoffs); +} + +void +lm_trie_quant_train_prob(lm_trie_quant_t * quant, int order, uint32 counts, + ngram_raw_t * raw_ngrams) +{ + float32 *probs; + uint32 prob_num; + ngram_raw_t *raw_ngrams_end; + + probs = (float32 *) ckd_calloc(counts, sizeof(*probs)); + raw_ngrams_end = raw_ngrams + counts; + + for (prob_num = 0; raw_ngrams != raw_ngrams_end; raw_ngrams++) { + probs[prob_num++] = raw_ngrams->prob; + } + + make_bins(probs, prob_num, quant->tables[order - 2][0].begin, + 1ULL << quant->prob_bits); + ckd_free(probs); +} + +void +lm_trie_quant_mwrite(lm_trie_quant_t * quant, bitarr_address_t address, + int order_minus_2, float32 prob, float32 backoff) +{ + bitarr_write_int57(address, quant->prob_bits + quant->bo_bits, + (uint64) ((bins_encode + (&quant->tables[order_minus_2][0], + prob) << quant-> + bo_bits) | bins_encode(&quant-> + tables + [order_minus_2] + [1], + backoff))); +} + +void +lm_trie_quant_lwrite(lm_trie_quant_t * quant, bitarr_address_t address, + float32 prob) +{ + bitarr_write_int25(address, quant->prob_bits, + (uint32) bins_encode(quant->longest, prob)); +} + +float32 +lm_trie_quant_mboread(lm_trie_quant_t * quant, bitarr_address_t address, + int order_minus_2) +{ + return bins_decode(&quant->tables[order_minus_2][1], + bitarr_read_int25(address, quant->bo_bits, + quant->bo_mask)); +} + +float32 +lm_trie_quant_mpread(lm_trie_quant_t * quant, bitarr_address_t address, + int order_minus_2) +{ + address.offset += quant->bo_bits; + return bins_decode(&quant->tables[order_minus_2][0], + bitarr_read_int25(address, quant->prob_bits, + quant->prob_mask)); +} + +float32 +lm_trie_quant_lpread(lm_trie_quant_t * quant, bitarr_address_t address) +{ + return bins_decode(quant->longest, + bitarr_read_int25(address, quant->prob_bits, + quant->prob_mask)); +} diff --git a/src/lm/lm_trie_quant.h b/src/lm/lm_trie_quant.h new file mode 100644 index 0000000..b2bc6c9 --- /dev/null +++ b/src/lm/lm_trie_quant.h @@ -0,0 +1,133 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +#ifndef __LM_TRIE_QUANT_H__ +#define __LM_TRIE_QUANT_H__ + +#include "lm/bitarr.h" +#include "lm/ngrams_raw.h" + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#if defined(DEBUG_ENDIAN) || defined(WORDS_BIGENDIAN) +/* For some reason nobody ever considered the endianness of + this file. I declare it to be canonically little-endian. */ +#define SWAP_LM_TRIE 1 +#else +#define SWAP_LM_TRIE 0 +#endif + + +typedef struct lm_trie_quant_s lm_trie_quant_t; + +/** + * Create qunatizing + */ +lm_trie_quant_t *lm_trie_quant_create(int order); + +/** + * Write quant data to binary file + */ +lm_trie_quant_t *lm_trie_quant_read_bin(FILE * fp, int order); + +/** + * Write quant data to binary file + */ +void lm_trie_quant_write_bin(lm_trie_quant_t * quant, FILE * fp); + +/** + * Free quant + */ +void lm_trie_quant_free(lm_trie_quant_t * quant); + +/** + * Memory required for storing weights of middle-order ngrams. + * Both backoff and probability should be stored + */ +uint8 lm_trie_quant_msize(lm_trie_quant_t * quant); + +/** + * Memory required for storing weights of largest-order ngrams. + * Only probability should be stored + */ +uint8 lm_trie_quant_lsize(lm_trie_quant_t * quant); + +/** + * Trains prob and backoff quantizer for specified ngram order on provided raw ngram list + */ +void lm_trie_quant_train(lm_trie_quant_t * quant, int order, uint32 counts, + ngram_raw_t * raw_ngrams); + +/** + * Trains only prob quantizer for specified ngram order on provided raw ngram list + */ +void lm_trie_quant_train_prob(lm_trie_quant_t * quant, int order, + uint32 counts, ngram_raw_t * raw_ngrams); + +/** + * Writes specified weight for middle-order ngram. Quantize it if needed + */ +void lm_trie_quant_mwrite(lm_trie_quant_t * quant, + bitarr_address_t address, int order_minus_2, + float prob, float backoff); + +/** + * Writes specified weight for largest-order ngram. Quantize it if needed + */ +void lm_trie_quant_lwrite(lm_trie_quant_t * quant, + bitarr_address_t address, float prob); + +/** + * Reads and decodes if needed backoff for middle-order ngram + */ +float lm_trie_quant_mboread(lm_trie_quant_t * quant, + bitarr_address_t address, int order_minus_2); + +/** + * Reads and decodes if needed prob for middle-order ngram + */ +float lm_trie_quant_mpread(lm_trie_quant_t * quant, + bitarr_address_t address, int order_minus_2); + +/** + * Reads and decodes if needed prob for largest-order ngram + */ +float lm_trie_quant_lpread(lm_trie_quant_t * quant, + bitarr_address_t address); + +#endif /* __LM_TRIE_QUANT_H__ */ diff --git a/src/lm/ngram_model.c b/src/lm/ngram_model.c new file mode 100644 index 0000000..6ba024b --- /dev/null +++ b/src/lm/ngram_model.c @@ -0,0 +1,1063 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * \file ngram_model.c N-Gram language models. + * + * Author: David Huggins-Daines, much code taken from sphinx3/src/libs3decoder/liblm + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include +#include + +#include "lm/ngram_model.h" +#include "util/ckd_alloc.h" +#include "util/filename.h" +#include "util/pio.h" +#include "util/strfuncs.h" +#include "util/case.h" + +#include "pocketsphinx_internal.h" +#include "ngram_model_internal.h" +#include "ngram_model_trie.h" + +ngram_file_type_t +ngram_file_name_to_type(const char *file_name) +{ + const char *ext; + + ext = strrchr(file_name, '.'); + if (ext == NULL) { + return NGRAM_INVALID; + } + if (0 == strcmp_nocase(ext, ".gz")) { + while (--ext >= file_name) { + if (*ext == '.') + break; + } + if (ext < file_name) { + return NGRAM_INVALID; + } + } + else if (0 == strcmp_nocase(ext, ".bz2")) { + while (--ext >= file_name) { + if (*ext == '.') + break; + } + if (ext < file_name) { + return NGRAM_INVALID; + } + } + /* We use strncmp because there might be a .gz on the end. */ + if (0 == strncmp_nocase(ext, ".ARPA", 5)) + return NGRAM_ARPA; + if (0 == strncmp_nocase(ext, ".DMP", 4) + || 0 == strncmp_nocase(ext, ".BIN", 4)) + return NGRAM_BIN; + return NGRAM_INVALID; +} + +ngram_file_type_t +ngram_str_to_type(const char *str_name) +{ + if (0 == strcmp_nocase(str_name, "arpa")) + return NGRAM_ARPA; + if (0 == strcmp_nocase(str_name, "dmp") + || 0 == strcmp_nocase(str_name, "bin")) + return NGRAM_BIN; + return NGRAM_INVALID; +} + +char const * +ngram_type_to_str(int type) +{ + switch (type) { + case NGRAM_ARPA: + return "arpa"; + case NGRAM_BIN: + return "dmp/bin"; + default: + return NULL; + } +} + + +ngram_model_t * +ngram_model_read(cmd_ln_t * config, + const char *file_name, + ngram_file_type_t file_type, logmath_t * lmath) +{ + ngram_model_t *model = NULL; + switch (file_type) { + case NGRAM_AUTO:{ + if ((model = + ngram_model_trie_read_bin(config, file_name, + lmath)) != NULL) + break; + if ((model = + ngram_model_trie_read_arpa(config, file_name, + lmath)) != NULL) + break; + if ((model = + ngram_model_trie_read_dmp(config, file_name, + lmath)) != NULL) + break; + return NULL; + } + case NGRAM_ARPA: + model = ngram_model_trie_read_arpa(config, file_name, lmath); + break; + case NGRAM_BIN: + if ((model = + ngram_model_trie_read_bin(config, file_name, lmath)) != NULL) + break; + if ((model = + ngram_model_trie_read_dmp(config, file_name, lmath)) != NULL) + break; + return NULL; + default: + E_ERROR("language model file type not supported\n"); + return NULL; + } + + /* Now set weights based on config if present. */ + if (config) { + float32 lw = 1.0; + float32 wip = 1.0; + + lw = ps_config_float(config, "lw"); + wip = ps_config_float(config, "wip"); + + ngram_model_apply_weights(model, lw, wip); + } + + return model; +} + +int +ngram_model_write(ngram_model_t * model, const char *file_name, + ngram_file_type_t file_type) +{ + switch (file_type) { + case NGRAM_AUTO:{ + file_type = ngram_file_name_to_type(file_name); + /* Default to ARPA (catches .lm and other things) */ + if (file_type == NGRAM_INVALID) + file_type = NGRAM_ARPA; + return ngram_model_write(model, file_name, file_type); + } + case NGRAM_ARPA: + return ngram_model_trie_write_arpa(model, file_name); + case NGRAM_BIN: + return ngram_model_trie_write_bin(model, file_name); + default: + E_ERROR("language model file type not supported\n"); + return -1; + } + E_ERROR("language model file type not supported\n"); + return -1; +} + +int32 +ngram_model_init(ngram_model_t * base, + ngram_funcs_t * funcs, + logmath_t * lmath, int32 n, int32 n_unigram) +{ + base->refcount = 1; + base->funcs = funcs; + base->n = n; + /* If this was previously initialized... */ + if (base->n_counts == NULL) + base->n_counts = (uint32 *) ckd_calloc(n, sizeof(*base->n_counts)); + /* Don't reset weights if logmath object hasn't changed. */ + if (base->lmath != lmath) { + /* Set default values for weights. */ + base->lw = 1.0; + base->log_wip = 0; /* i.e. 1.0 */ + base->log_zero = logmath_get_zero(lmath); + base->lmath = lmath; + } + /* Allocate or reallocate space for word strings. */ + if (base->word_str) { + /* Free all previous word strings if they were allocated. */ + if (base->writable) { + int32 i; + for (i = 0; i < base->n_words; ++i) { + ckd_free(base->word_str[i]); + base->word_str[i] = NULL; + } + } + base->word_str = + (char **) ckd_realloc(base->word_str, + n_unigram * sizeof(char *)); + } + else { + base->word_str = (char **) ckd_calloc(n_unigram, sizeof(char *)); + } + /* NOTE: They are no longer case-insensitive since we are allowing + * other encodings for word strings. Beware. */ + if (base->wid) + hash_table_empty(base->wid); + else + base->wid = hash_table_new(n_unigram, FALSE); + base->n_counts[0] = base->n_1g_alloc = base->n_words = n_unigram; + + return 0; +} + +ngram_model_t * +ngram_model_retain(ngram_model_t * model) +{ + ++model->refcount; + return model; +} + +void +ngram_model_flush(ngram_model_t * model) +{ + if (model->funcs && model->funcs->flush) + (*model->funcs->flush) (model); +} + +int +ngram_model_free(ngram_model_t * model) +{ + int i; + + if (model == NULL) + return 0; + if (--model->refcount > 0) + return model->refcount; + if (model->funcs && model->funcs->free) + (*model->funcs->free) (model); + if (model->writable) { + /* Free all words. */ + for (i = 0; i < model->n_words; ++i) { + ckd_free(model->word_str[i]); + } + } + else { + /* Free all class words. */ + for (i = 0; i < model->n_classes; ++i) { + ngram_class_t *lmclass; + int32 j; + + lmclass = model->classes[i]; + for (j = 0; j < lmclass->n_words; ++j) { + ckd_free(model->word_str[lmclass->start_wid + j]); + } + for (j = 0; j < lmclass->n_hash; ++j) { + if (lmclass->nword_hash[j].wid != -1) { + ckd_free(model->word_str[lmclass->nword_hash[j].wid]); + } + } + } + } + for (i = 0; i < model->n_classes; ++i) { + ngram_class_free(model->classes[i]); + } + ckd_free(model->classes); + hash_table_free(model->wid); + ckd_free(model->word_str); + ckd_free(model->n_counts); + ckd_free(model); + return 0; +} + +int +ngram_model_casefold(ngram_model_t * model, int kase) +{ + int writable, i; + hash_table_t *new_wid; + + /* Were word strings already allocated? */ + writable = model->writable; + /* Either way, we are going to allocate some word strings. */ + model->writable = TRUE; + + /* And, don't forget, we need to rebuild the word to unigram ID + * mapping. */ + new_wid = hash_table_new(model->n_words, FALSE); + for (i = 0; i < model->n_words; ++i) { + char *outstr; + if (writable) { + outstr = model->word_str[i]; + } + else { + outstr = ckd_salloc(model->word_str[i]); + } + /* Don't case-fold or [classes] */ + if (outstr[0] == '<' || outstr[0] == '[') { + } + else { + switch (kase) { + case NGRAM_UPPER: + ucase(outstr); + break; + case NGRAM_LOWER: + lcase(outstr); + break; + default: + ; + } + } + model->word_str[i] = outstr; + + /* Now update the hash table. We might have terrible + * collisions here, so warn about them. */ + if (hash_table_enter_int32(new_wid, model->word_str[i], i) != i) { + E_WARN("Duplicate word in dictionary after conversion: %s\n", + model->word_str[i]); + } + } + /* Swap out the hash table. */ + hash_table_free(model->wid); + model->wid = new_wid; + return 0; +} + +int +ngram_model_apply_weights(ngram_model_t * model, float32 lw, float32 wip) +{ + return (*model->funcs->apply_weights) (model, lw, wip); +} + +float32 +ngram_model_get_weights(ngram_model_t * model, int32 * out_log_wip) +{ + if (out_log_wip) + *out_log_wip = model->log_wip; + return model->lw; +} + + +int32 +ngram_ng_score(ngram_model_t * model, int32 wid, int32 * history, + int32 n_hist, int32 * n_used) +{ + int32 score, class_weight = 0; + int i; + + /* Closed vocabulary, OOV word probability is zero */ + if (wid == NGRAM_INVALID_WID) + return model->log_zero; + + /* "Declassify" wid and history */ + if (NGRAM_IS_CLASSWID(wid)) { + ngram_class_t *lmclass = model->classes[NGRAM_CLASSID(wid)]; + + class_weight = ngram_class_prob(lmclass, wid); + if (class_weight == 1) /* Meaning, not found in class. */ + return model->log_zero; + wid = lmclass->tag_wid; + } + for (i = 0; i < n_hist; ++i) { + if (history[i] != NGRAM_INVALID_WID + && NGRAM_IS_CLASSWID(history[i])) + history[i] = + model->classes[NGRAM_CLASSID(history[i])]->tag_wid; + } + score = (*model->funcs->score) (model, wid, history, n_hist, n_used); + + /* Multiply by unigram in-class weight. */ + return score + class_weight; +} + +int32 +ngram_score(ngram_model_t * model, const char *word, ...) +{ + va_list history; + const char *hword; + int32 *histid; + int32 n_hist; + int32 n_used; + int32 prob; + + va_start(history, word); + n_hist = 0; + while ((hword = va_arg(history, const char *)) != NULL) + ++n_hist; + va_end(history); + + histid = ckd_calloc(n_hist, sizeof(*histid)); + va_start(history, word); + n_hist = 0; + while ((hword = va_arg(history, const char *)) != NULL) { + histid[n_hist] = ngram_wid(model, hword); + ++n_hist; + } + va_end(history); + + prob = ngram_ng_score(model, ngram_wid(model, word), + histid, n_hist, &n_used); + ckd_free(histid); + return prob; +} + +int32 +ngram_tg_score(ngram_model_t * model, int32 w3, int32 w2, int32 w1, + int32 * n_used) +{ + int32 hist[2]; + hist[0] = w2; + hist[1] = w1; + return ngram_ng_score(model, w3, hist, 2, n_used); +} + +int32 +ngram_bg_score(ngram_model_t * model, int32 w2, int32 w1, int32 * n_used) +{ + return ngram_ng_score(model, w2, &w1, 1, n_used); +} + +int32 +ngram_ng_prob(ngram_model_t * model, int32 wid, int32 * history, + int32 n_hist, int32 * n_used) +{ + int32 prob, class_weight = 0; + int i; + + /* Closed vocabulary, OOV word probability is zero */ + if (wid == NGRAM_INVALID_WID) + return model->log_zero; + + /* "Declassify" wid and history */ + if (NGRAM_IS_CLASSWID(wid)) { + ngram_class_t *lmclass = model->classes[NGRAM_CLASSID(wid)]; + + class_weight = ngram_class_prob(lmclass, wid); + if (class_weight == 1) /* Meaning, not found in class. */ + return class_weight; + wid = lmclass->tag_wid; + } + for (i = 0; i < n_hist; ++i) { + if (history[i] != NGRAM_INVALID_WID + && NGRAM_IS_CLASSWID(history[i])) + history[i] = + model->classes[NGRAM_CLASSID(history[i])]->tag_wid; + } + prob = (*model->funcs->raw_score) (model, wid, history, + n_hist, n_used); + /* Multiply by unigram in-class weight. */ + return prob + class_weight; +} + +int32 +ngram_probv(ngram_model_t * model, const char *word, ...) +{ + va_list history; + const char *hword; + int32 *histid; + int32 n_hist; + int32 n_used; + int32 prob; + + va_start(history, word); + n_hist = 0; + while ((hword = va_arg(history, const char *)) != NULL) + ++n_hist; + va_end(history); + + histid = ckd_calloc(n_hist, sizeof(*histid)); + va_start(history, word); + n_hist = 0; + while ((hword = va_arg(history, const char *)) != NULL) { + histid[n_hist] = ngram_wid(model, hword); + ++n_hist; + } + va_end(history); + + prob = ngram_ng_prob(model, ngram_wid(model, word), + histid, n_hist, &n_used); + ckd_free(histid); + return prob; +} + +int32 +ngram_prob(ngram_model_t * model, const char* const *words, int32 n) +{ + int32 *ctx_id; + int32 nused; + int32 prob; + int32 wid; + uint32 i; + + ctx_id = (int32 *) ckd_calloc(n - 1, sizeof(*ctx_id)); + for (i = 1; i < (uint32) n; ++i) + ctx_id[i - 1] = ngram_wid(model, words[i]); + + wid = ngram_wid(model, *words); + prob = ngram_ng_prob(model, wid, ctx_id, n - 1, &nused); + ckd_free(ctx_id); + + return prob; +} + +int32 +ngram_score_to_prob(ngram_model_t * base, int32 score) +{ + int32 prob; + + /* Undo insertion penalty. */ + prob = score - base->log_wip; + /* Undo language weight. */ + prob = (int32) (prob / base->lw); + + return prob; +} + +int32 +ngram_unknown_wid(ngram_model_t * model) +{ + int32 val; + + /* FIXME: This could be memoized for speed if necessary. */ + /* Look up , if not found return NGRAM_INVALID_WID. */ + if (hash_table_lookup_int32(model->wid, "", &val) == -1) + return NGRAM_INVALID_WID; + else + return val; +} + +int32 +ngram_zero(ngram_model_t * model) +{ + return model->log_zero; +} + +int32 +ngram_model_get_size(ngram_model_t * model) +{ + if (model != NULL) + return model->n; + return 0; +} + +uint32 const * +ngram_model_get_counts(ngram_model_t * model) +{ + if (model != NULL) + return model->n_counts; + return NULL; +} + +int32 +ngram_wid(ngram_model_t * model, const char *word) +{ + int32 val; + + if (hash_table_lookup_int32(model->wid, word, &val) == -1) + return ngram_unknown_wid(model); + else + return val; +} + +const char * +ngram_word(ngram_model_t * model, int32 wid) +{ + /* Remove any class tag */ + wid = NGRAM_BASEWID(wid); + if (wid >= model->n_words) + return NULL; + return model->word_str[wid]; +} + +/** + * Add a word to the word string and ID mapping. + */ +int32 +ngram_add_word_internal(ngram_model_t * model, + const char *word, int32 classid) +{ + + /* Check for hash collisions. */ + int32 wid; + if (hash_table_lookup_int32(model->wid, word, &wid) == 0) { + E_WARN("Omit duplicate word '%s'\n", word); + return wid; + } + + /* Take the next available word ID */ + wid = model->n_words; + if (classid >= 0) { + wid = NGRAM_CLASSWID(wid, classid); + } + + /* Reallocate word_str if necessary. */ + if (model->n_words >= model->n_1g_alloc) { + model->n_1g_alloc += UG_ALLOC_STEP; + model->word_str = ckd_realloc(model->word_str, + sizeof(*model->word_str) * + model->n_1g_alloc); + } + /* Add the word string in the appropriate manner. */ + /* Class words are always dynamically allocated. */ + model->word_str[model->n_words] = ckd_salloc(word); + /* Now enter it into the hash table. */ + if (hash_table_enter_int32 + (model->wid, model->word_str[model->n_words], wid) != wid) { + E_ERROR + ("Hash insertion failed for word %s => %p (should not happen)\n", + model->word_str[model->n_words], (void *) (size_t) (wid)); + } + /* Increment number of words. */ + ++model->n_words; + return wid; +} + +int32 +ngram_model_add_word(ngram_model_t * model, + const char *word, float32 weight) +{ + int32 wid, prob = model->log_zero; + + /* If we add word to unwritable model, we need to make it writable */ + if (!model->writable) { + E_WARN("Can't add word '%s' to read-only language model. " + "Disable mmap with '-mmap no' to make it writable\n", word); + return -1; + } + + wid = ngram_add_word_internal(model, word, -1); + if (wid == NGRAM_INVALID_WID) + return wid; + + /* Do what needs to be done to add the word to the unigram. */ + if (model->funcs && model->funcs->add_ug) + prob = + (*model->funcs->add_ug) (model, wid, + logmath_log(model->lmath, weight)); + if (prob == 0) + return -1; + + return wid; +} + +ngram_class_t * +ngram_class_new(ngram_model_t * model, int32 tag_wid, int32 start_wid, + glist_t classwords) +{ + ngram_class_t *lmclass; + gnode_t *gn; + float32 tprob; + int i; + + lmclass = ckd_calloc(1, sizeof(*lmclass)); + lmclass->tag_wid = tag_wid; + /* wid_base is the wid (minus class tag) of the first word in the list. */ + lmclass->start_wid = start_wid; + lmclass->n_words = glist_count(classwords); + lmclass->prob1 = ckd_calloc(lmclass->n_words, sizeof(*lmclass->prob1)); + lmclass->nword_hash = NULL; + lmclass->n_hash = 0; + tprob = 0.0; + for (gn = classwords; gn; gn = gnode_next(gn)) { + tprob += gnode_float32(gn); + } + if (tprob > 1.1 || tprob < 0.9) { + E_INFO("Total class probability is %f, will normalize\n", tprob); + for (gn = classwords; gn; gn = gnode_next(gn)) { + gn->data.fl /= tprob; + } + } + for (i = 0, gn = classwords; gn; ++i, gn = gnode_next(gn)) { + lmclass->prob1[i] = logmath_log(model->lmath, gnode_float32(gn)); + } + + return lmclass; +} + +int32 +ngram_class_add_word(ngram_class_t * lmclass, int32 wid, int32 lweight) +{ + int32 hash; + + if (lmclass->nword_hash == NULL) { + /* Initialize everything in it to -1 */ + lmclass->nword_hash = + ckd_malloc(NGRAM_HASH_SIZE * sizeof(*lmclass->nword_hash)); + memset(lmclass->nword_hash, 0xff, + NGRAM_HASH_SIZE * sizeof(*lmclass->nword_hash)); + lmclass->n_hash = NGRAM_HASH_SIZE; + lmclass->n_hash_inuse = 0; + } + /* Stupidest possible hash function. This will work pretty well + * when this function is called repeatedly with contiguous word + * IDs, though... */ + hash = wid & (lmclass->n_hash - 1); + if (lmclass->nword_hash[hash].wid == -1) { + /* Good, no collision. */ + lmclass->nword_hash[hash].wid = wid; + lmclass->nword_hash[hash].prob1 = lweight; + ++lmclass->n_hash_inuse; + return hash; + } + else { + int32 next; /**< Next available bucket. */ + /* Collision... Find the end of the hash chain. */ + while (lmclass->nword_hash[hash].next != -1) + hash = lmclass->nword_hash[hash].next; + assert(hash != -1); + /* Does we has any more bukkit? */ + if (lmclass->n_hash_inuse == lmclass->n_hash) { + /* Oh noes! Ok, we makes more. */ + lmclass->nword_hash = ckd_realloc(lmclass->nword_hash, + lmclass->n_hash * 2 * + sizeof(*lmclass-> + nword_hash)); + memset(lmclass->nword_hash + lmclass->n_hash, 0xff, + lmclass->n_hash * sizeof(*lmclass->nword_hash)); + /* Just use the next allocated one (easy) */ + next = lmclass->n_hash; + lmclass->n_hash *= 2; + } + else { + /* Look for any available bucket. We hope this doesn't happen. */ + for (next = 0; next < lmclass->n_hash; ++next) + if (lmclass->nword_hash[next].wid == -1) + break; + /* This should absolutely not happen. */ + assert(next != lmclass->n_hash); + } + lmclass->nword_hash[next].wid = wid; + lmclass->nword_hash[next].prob1 = lweight; + lmclass->nword_hash[hash].next = next; + ++lmclass->n_hash_inuse; + return next; + } +} + +void +ngram_class_free(ngram_class_t * lmclass) +{ + ckd_free(lmclass->nword_hash); + ckd_free(lmclass->prob1); + ckd_free(lmclass); +} + +int32 +ngram_model_add_class_word(ngram_model_t * model, + const char *classname, + const char *word, float32 weight) +{ + ngram_class_t *lmclass; + int32 classid, tag_wid, wid, i, scale; + float32 fprob; + + /* Find the class corresponding to classname. Linear search + * probably okay here since there won't be very many classes, and + * this doesn't have to be fast. */ + tag_wid = ngram_wid(model, classname); + if (tag_wid == NGRAM_INVALID_WID) { + E_ERROR("No such word or class tag: %s\n", classname); + return tag_wid; + } + for (classid = 0; classid < model->n_classes; ++classid) { + if (model->classes[classid]->tag_wid == tag_wid) + break; + } + /* Hmm, no such class. It's probably not a good idea to create one. */ + if (classid == model->n_classes) { + E_ERROR + ("Word %s is not a class tag (call ngram_model_add_class() first)\n", + classname); + return NGRAM_INVALID_WID; + } + lmclass = model->classes[classid]; + + /* Add this word to the model's set of words. */ + wid = ngram_add_word_internal(model, word, classid); + if (wid == NGRAM_INVALID_WID) + return wid; + + /* This is the fixed probability of the new word. */ + fprob = weight * 1.0f / (lmclass->n_words + lmclass->n_hash_inuse + 1); + /* Now normalize everything else to fit it in. This is + * accomplished by simply scaling all the other probabilities + * by (1-fprob). */ + scale = logmath_log(model->lmath, 1.0 - fprob); + for (i = 0; i < lmclass->n_words; ++i) + lmclass->prob1[i] += scale; + for (i = 0; i < lmclass->n_hash; ++i) + if (lmclass->nword_hash[i].wid != -1) + lmclass->nword_hash[i].prob1 += scale; + + /* Now add it to the class hash table. */ + return ngram_class_add_word(lmclass, wid, + logmath_log(model->lmath, fprob)); +} + +int32 +ngram_model_add_class(ngram_model_t * model, + const char *classname, + float32 classweight, + char **words, const float32 * weights, int32 n_words) +{ + ngram_class_t *lmclass; + glist_t classwords = NULL; + int32 i, start_wid = -1; + int32 classid, tag_wid; + + /* Check if classname already exists in model. If not, add it. */ + if ((tag_wid = + ngram_wid(model, classname)) == ngram_unknown_wid(model)) { + tag_wid = ngram_model_add_word(model, classname, classweight); + if (tag_wid == NGRAM_INVALID_WID) + return -1; + } + + if (model->n_classes == 128) { + E_ERROR("Number of classes cannot exceed 128 (sorry)\n"); + return -1; + } + classid = model->n_classes; + for (i = 0; i < n_words; ++i) { + int32 wid; + + wid = ngram_add_word_internal(model, words[i], classid); + if (wid == NGRAM_INVALID_WID) + return -1; + if (start_wid == -1) + start_wid = NGRAM_BASEWID(wid); + classwords = glist_add_float32(classwords, weights[i]); + } + classwords = glist_reverse(classwords); + lmclass = ngram_class_new(model, tag_wid, start_wid, classwords); + glist_free(classwords); + if (lmclass == NULL) + return -1; + + ++model->n_classes; + if (model->classes == NULL) + model->classes = ckd_calloc(1, sizeof(*model->classes)); + else + model->classes = ckd_realloc(model->classes, + model->n_classes * + sizeof(*model->classes)); + model->classes[classid] = lmclass; + return classid; +} + +int32 +ngram_class_prob(ngram_class_t * lmclass, int32 wid) +{ + int32 base_wid = NGRAM_BASEWID(wid); + + if (base_wid < lmclass->start_wid + || base_wid > lmclass->start_wid + lmclass->n_words) { + int32 hash; + + /* Look it up in the hash table. */ + hash = wid & (lmclass->n_hash - 1); + while (hash != -1 && lmclass->nword_hash[hash].wid != wid) + hash = lmclass->nword_hash[hash].next; + if (hash == -1) + return 1; + return lmclass->nword_hash[hash].prob1; + } + else { + return lmclass->prob1[base_wid - lmclass->start_wid]; + } +} + +int32 +read_classdef_file(hash_table_t * classes, const char *file_name) +{ + FILE *fp; + int32 is_pipe; + int inclass; /**< Are we currently reading a list of class words? */ + int32 rv = -1; + gnode_t *gn; + glist_t classwords = NULL; + glist_t classprobs = NULL; + char *classname = NULL; + + if ((fp = fopen_comp(file_name, "r", &is_pipe)) == NULL) { + E_ERROR("File %s not found\n", file_name); + return -1; + } + + inclass = FALSE; + while (!feof(fp)) { + char line[512]; + char *wptr[2]; + int n_words; + + if (fgets(line, sizeof(line), fp) == NULL) + break; + + n_words = str2words(line, wptr, 2); + if (n_words <= 0) + continue; + + if (inclass) { + /* Look for an end of class marker. */ + if (n_words == 2 && 0 == strcmp(wptr[0], "END")) { + classdef_t *classdef; + gnode_t *word, *weight; + int32 i; + + if (classname == NULL || 0 != strcmp(wptr[1], classname)) + goto error_out; + inclass = FALSE; + + /* Construct a class from the list of words collected. */ + classdef = ckd_calloc(1, sizeof(*classdef)); + classwords = glist_reverse(classwords); + classprobs = glist_reverse(classprobs); + classdef->n_words = glist_count(classwords); + classdef->words = ckd_calloc(classdef->n_words, + sizeof(*classdef->words)); + classdef->weights = ckd_calloc(classdef->n_words, + sizeof(*classdef->weights)); + word = classwords; + weight = classprobs; + for (i = 0; i < classdef->n_words; ++i) { + classdef->words[i] = gnode_ptr(word); + classdef->weights[i] = gnode_float32(weight); + word = gnode_next(word); + weight = gnode_next(weight); + } + + /* Add this class to the hash table. */ + if (hash_table_enter(classes, classname, classdef) != + classdef) { + classdef_free(classdef); + goto error_out; + } + + /* Reset everything. */ + glist_free(classwords); + glist_free(classprobs); + classwords = NULL; + classprobs = NULL; + classname = NULL; + } + else { + float32 fprob; + + if (n_words == 2) + fprob = atof_c(wptr[1]); + else + fprob = 1.0f; + /* Add it to the list of words for this class. */ + classwords = + glist_add_ptr(classwords, ckd_salloc(wptr[0])); + classprobs = glist_add_float32(classprobs, fprob); + } + } + else { + /* Start a new LM class if the LMCLASS marker is seen */ + if (n_words == 2 && 0 == strcmp(wptr[0], "LMCLASS")) { + if (inclass) + goto error_out; + inclass = TRUE; + classname = ckd_salloc(wptr[1]); + } + /* Otherwise, just ignore whatever junk we got */ + } + } + rv = 0; /* Success. */ + + error_out: + /* Free all the stuff we might have allocated. */ + fclose_comp(fp, is_pipe); + for (gn = classwords; gn; gn = gnode_next(gn)) + ckd_free(gnode_ptr(gn)); + glist_free(classwords); + glist_free(classprobs); + ckd_free(classname); + + return rv; +} + +void +classdef_free(classdef_t * classdef) +{ + int32 i; + for (i = 0; i < classdef->n_words; ++i) + ckd_free(classdef->words[i]); + ckd_free(classdef->words); + ckd_free(classdef->weights); + ckd_free(classdef); +} + + +int32 +ngram_model_read_classdef(ngram_model_t * model, const char *file_name) +{ + hash_table_t *classes; + glist_t hl = NULL; + gnode_t *gn; + int32 rv = -1; + + classes = hash_table_new(0, FALSE); + if (read_classdef_file(classes, file_name) < 0) { + hash_table_free(classes); + return -1; + } + + /* Create a new class in the language model for each classdef. */ + hl = hash_table_tolist(classes, NULL); + for (gn = hl; gn; gn = gnode_next(gn)) { + hash_entry_t *he = gnode_ptr(gn); + classdef_t *classdef = he->val; + + if (ngram_model_add_class(model, he->key, 1.0, + classdef->words, + classdef->weights, + classdef->n_words) < 0) + goto error_out; + } + rv = 0; + + error_out: + for (gn = hl; gn; gn = gnode_next(gn)) { + hash_entry_t *he = gnode_ptr(gn); + ckd_free((char *) he->key); + classdef_free(he->val); + } + glist_free(hl); + hash_table_free(classes); + return rv; +} diff --git a/swig/ps_lattice.i b/src/lm/ngram_model.h similarity index 76% rename from swig/ps_lattice.i rename to src/lm/ngram_model.h index 3cf1f51..4cfedb6 100644 --- a/swig/ps_lattice.i +++ b/src/lm/ngram_model.h @@ -1,6 +1,6 @@ /* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== - * Copyright (c) 2013 Carnegie Mellon University. All rights + * Copyright (c) 2007 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,26 +34,28 @@ * ==================================================================== * */ +/** + * @file ngram_model.h + * @brief N-Gram language models + * @author David Huggins-Daines + */ +#ifndef __NGRAM_MODEL_H__ +#define __NGRAM_MODEL_H__ -%extend Lattice { - Lattice(const char *path) { - return ps_lattice_read(NULL, path); - } +#include - Lattice(Decoder *decoder, char *path) { - return ps_lattice_read(decoder, path); - } +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif - ~Lattice() { - ps_lattice_free($self); - } +#ifdef __cplusplus +} +#endif - void write(char const *path, int *errcode) { - *errcode = ps_lattice_write($self, path); - } - void write_htk(char const *path, int *errcode) { - *errcode = ps_lattice_write_htk($self, path); - } -} +#endif /* __NGRAM_MODEL_H__ */ diff --git a/src/lm/ngram_model_internal.h b/src/lm/ngram_model_internal.h new file mode 100644 index 0000000..17c1f75 --- /dev/null +++ b/src/lm/ngram_model_internal.h @@ -0,0 +1,197 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * \file ngram_model_internal.h Internal structures for N-Gram models + * + * Author: David Huggins-Daines + */ + +#ifndef __NGRAM_MODEL_INTERNAL_H__ +#define __NGRAM_MODEL_INTERNAL_H__ + +#include "lm/ngram_model.h" +#include "util/hash_table.h" + +/** + * Common implementation of ngram_model_t. + * + * The details of bigram, trigram, and higher-order N-gram storage, if any, can + * vary somewhat depending on the file format in use. + */ +struct ngram_model_s { + int refcount; /**< Reference count */ + uint32 *n_counts; /**< Counts for 1, 2, 3, ... grams */ + int32 n_1g_alloc; /**< Number of allocated word strings (for new word addition) */ + int32 n_words; /**< Number of actual word strings (NOT the same as the + number of unigrams, due to class words). */ + + uint8 n; /**< This is an n-gram model (1, 2, 3, ...). */ + uint8 n_classes; /**< Number of classes (maximum 128) */ + uint8 writable; /**< Are word strings writable? */ + uint8 flags; /**< Any other flags we might care about + (FIXME: Merge this and writable) */ + logmath_t *lmath; /**< Log-math object */ + float32 lw; /**< Language model scaling factor */ + int32 log_wip; /**< Log of word insertion penalty */ + int32 log_zero; /**< Zero probability, cached here for quick lookup */ + char **word_str; /**< Unigram names */ + hash_table_t *wid; /**< Mapping of unigram names to word IDs. */ + int32 *tmp_wids; /**< Temporary array of word IDs for ngram_model_get_ngram() */ + struct ngram_class_s **classes; /**< Word class definitions. */ + struct ngram_funcs_s *funcs; /**< Implementation-specific methods. */ +}; + +/** + * Implementation of ngram_class_t. + */ +struct ngram_class_s { + int32 tag_wid; /**< Base word ID for this class tag */ + int32 start_wid; /**< Starting base word ID for this class' words */ + int32 n_words; /**< Number of base words for this class */ + int32 *prob1; /**< Probability table for base words */ + /** + * Custom hash table for additional words. + */ + struct ngram_hash_s { + int32 wid; /**< Word ID of this bucket */ + int32 prob1; /**< Probability for this word */ + int32 next; /**< Index of next bucket (or -1 for no collision) */ + } *nword_hash; + int32 n_hash; /**< Number of buckets in nword_hash (power of 2) */ + int32 n_hash_inuse; /**< Number of words in nword_hash */ +}; + +#define NGRAM_MAX_ORDER 5 + +#define NGRAM_HASH_SIZE 128 + +#define NGRAM_BASEWID(wid) ((wid)&0xffffff) +#define NGRAM_CLASSID(wid) (((wid)>>24) & 0x7f) +#define NGRAM_CLASSWID(wid,classid) (((classid)<<24) | 0x80000000 | (wid)) +#define NGRAM_IS_CLASSWID(wid) ((wid)&0x80000000) + +#define UG_ALLOC_STEP 10 + +/** Implementation-specific functions for operating on ngram_model_t objects */ +typedef struct ngram_funcs_s { + /** + * Implementation-specific function for freeing an ngram_model_t. + */ + void (*free) (ngram_model_t * model); + /** + * Implementation-specific function for applying language model weights. + */ + int (*apply_weights) (ngram_model_t * model, float32 lw, float32 wip); + /** + * Implementation-specific function for querying language model score. + */ + int32(*score) (ngram_model_t * model, + int32 wid, + int32 * history, int32 n_hist, int32 * n_used); + /** + * Implementation-specific function for querying raw language + * model probability. + */ + int32(*raw_score) (ngram_model_t * model, + int32 wid, + int32 * history, int32 n_hist, int32 * n_used); + /** + * Implementation-specific function for adding unigrams. + * + * This function updates the internal structures of a language + * model to add the given unigram with the given weight (defined + * as a log-factor applied to the uniform distribution). This + * includes reallocating or otherwise resizing the set of unigrams. + * + * @return The language model score (not raw log-probability) of + * the new word, or 0 for failure. + */ + int32(*add_ug) (ngram_model_t * model, int32 wid, int32 lweight); + + /** + * Implementation-specific function for purging N-Gram cache + */ + void (*flush) (ngram_model_t * model); +} ngram_funcs_t; + +/** + * One class definition from a classdef file. + */ +typedef struct classdef_s { + char **words; + float32 *weights; + int32 n_words; +} classdef_t; + +/** + * Initialize the base ngram_model_t structure. + */ +int32 +ngram_model_init(ngram_model_t * model, + ngram_funcs_t * funcs, + logmath_t * lmath, int32 n, int32 n_unigram); + +/** + * Read a probdef file. + */ +int32 read_classdef_file(hash_table_t * classes, + const char *classdef_file); + +/** + * Free a class definition. + */ +void classdef_free(classdef_t * classdef); + +/** + * Allocate and initialize an N-Gram class. + */ +ngram_class_t *ngram_class_new(ngram_model_t * model, int32 tag_wid, + int32 start_wid, glist_t classwords); + +/** + * Deallocate an N-Gram class. + */ +void ngram_class_free(ngram_class_t * lmclass); + +/** + * Get the in-class log probability for a word in an N-Gram class. + * + * @return This probability, or 1 if word not found. + */ +int32 ngram_class_prob(ngram_class_t * lmclass, int32 wid); + +#endif /* __NGRAM_MODEL_INTERNAL_H__ */ diff --git a/src/lm/ngram_model_set.c b/src/lm/ngram_model_set.c new file mode 100644 index 0000000..6cb74d2 --- /dev/null +++ b/src/lm/ngram_model_set.c @@ -0,0 +1,868 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file ngram_model_set.c Set of language models. + * @author David Huggins-Daines + */ + +#include +#include + +#include +#include "util/ckd_alloc.h" +#include "util/strfuncs.h" +#include "util/filename.h" + +#include "lm/ngram_model_set.h" + +static ngram_funcs_t ngram_model_set_funcs; + +static int +my_compare(const void *a, const void *b) +{ + /* Make sure floats to the beginning. */ + if (strcmp(*(char *const *) a, "") == 0) + return -1; + else if (strcmp(*(char *const *) b, "") == 0) + return 1; + else + return strcmp(*(char *const *) a, *(char *const *) b); +} + +static void +build_widmap(ngram_model_t * base, logmath_t * lmath, int32 n) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + ngram_model_t **models = set->lms; + hash_table_t *vocab; + glist_t hlist; + gnode_t *gn; + int32 i; + + /* Construct a merged vocabulary and a set of word-ID mappings. */ + vocab = hash_table_new(models[0]->n_words, FALSE); + /* Create the set of merged words. */ + for (i = 0; i < set->n_models; ++i) { + int32 j; + for (j = 0; j < models[i]->n_words; ++j) { + /* Ignore collisions. */ + (void) hash_table_enter_int32(vocab, models[i]->word_str[j], + j); + } + } + /* Create the array of words, then sort it. */ + if (hash_table_lookup(vocab, "", NULL) != 0) + (void) hash_table_enter_int32(vocab, "", 0); + /* Now we know the number of unigrams, initialize the base model. */ + ngram_model_init(base, &ngram_model_set_funcs, lmath, n, + hash_table_inuse(vocab)); + base->writable = FALSE; /* We will reuse the pointers from the submodels. */ + i = 0; + hlist = hash_table_tolist(vocab, NULL); + for (gn = hlist; gn; gn = gnode_next(gn)) { + hash_entry_t *ent = gnode_ptr(gn); + base->word_str[i++] = (char *) ent->key; + } + glist_free(hlist); + qsort(base->word_str, base->n_words, sizeof(*base->word_str), + my_compare); + + /* Now create the word ID mappings. */ + if (set->widmap) + ckd_free_2d((void **) set->widmap); + set->widmap = (int32 **) ckd_calloc_2d(base->n_words, set->n_models, + sizeof(**set->widmap)); + for (i = 0; i < base->n_words; ++i) { + int32 j; + /* Also create the master wid mapping. */ + (void) hash_table_enter_int32(base->wid, base->word_str[i], i); + /* printf("%s: %d => ", base->word_str[i], i); */ + for (j = 0; j < set->n_models; ++j) { + set->widmap[i][j] = ngram_wid(models[j], base->word_str[i]); + /* printf("%d ", set->widmap[i][j]); */ + } + /* printf("\n"); */ + } + hash_table_free(vocab); +} + +ngram_model_t * +ngram_model_set_init(ps_config_t * config, + ngram_model_t ** models, + char **names, const float32 * weights, int32 n_models) +{ + ngram_model_set_t *model; + ngram_model_t *base; + logmath_t *lmath; + int32 i, n; + + (void)config; + if (n_models == 0) /* WTF */ + return NULL; + + /* Do consistency checking on the models. They must all use the + * same logbase and shift. */ + lmath = models[0]->lmath; + for (i = 1; i < n_models; ++i) { + if (logmath_get_base(models[i]->lmath) != logmath_get_base(lmath) + || logmath_get_shift(models[i]->lmath) != + logmath_get_shift(lmath)) { + E_ERROR + ("Log-math parameters don't match, will not create LM set\n"); + return NULL; + } + } + + /* Allocate the combined model, initialize it. */ + model = ckd_calloc(1, sizeof(*model)); + base = &model->base; + model->n_models = n_models; + model->lms = ckd_calloc(n_models, sizeof(*model->lms)); + model->names = ckd_calloc(n_models, sizeof(*model->names)); + /* Initialize weights to a uniform distribution */ + model->lweights = ckd_calloc(n_models, sizeof(*model->lweights)); + { + int32 uniform = logmath_log(lmath, 1.0 / n_models); + for (i = 0; i < n_models; ++i) + model->lweights[i] = uniform; + } + /* Default to interpolate if weights were given. */ + if (weights) + model->cur = -1; + + n = 0; + for (i = 0; i < n_models; ++i) { + model->lms[i] = ngram_model_retain(models[i]); + model->names[i] = ckd_salloc(names[i]); + if (weights) + model->lweights[i] = logmath_log(lmath, weights[i]); + /* N is the maximum of all merged models. */ + if (models[i]->n > n) + n = models[i]->n; + } + /* Allocate the history mapping table. */ + model->maphist = ckd_calloc(n - 1, sizeof(*model->maphist)); + + /* Now build the word-ID mapping and merged vocabulary. */ + build_widmap(base, lmath, n); + return base; +} + +ngram_model_t * +ngram_model_set_read(ps_config_t * config, + const char *lmctlfile, logmath_t * lmath) +{ + FILE *ctlfp; + glist_t lms = NULL; + glist_t lmnames = NULL; + __BIGSTACKVARIABLE__ char str[1024]; + ngram_model_t *set = NULL; + hash_table_t *classes; + char *basedir, *c; + + /* Read all the class definition files to accumulate a mapping of + * classnames to definitions. */ + classes = hash_table_new(0, FALSE); + if ((ctlfp = fopen(lmctlfile, "r")) == NULL) { + E_ERROR_SYSTEM("Failed to open %s", lmctlfile); + return NULL; + } + + /* Try to find the base directory to append to relative paths in + * the lmctl file. */ + if ((c = strrchr(lmctlfile, '/')) || (c = strrchr(lmctlfile, '\\'))) { + /* Include the trailing slash. */ + basedir = ckd_calloc(c - lmctlfile + 2, 1); + memcpy(basedir, lmctlfile, c - lmctlfile + 1); + } + else { + basedir = NULL; + } + E_INFO("Reading LM control file '%s'\n", lmctlfile); + if (basedir) + E_INFO("Will prepend '%s' to unqualified paths\n", basedir); + + if (fscanf(ctlfp, "%1023s", str) == 1) { + if (strcmp(str, "{") == 0) { + /* Load LMclass files */ + while ((fscanf(ctlfp, "%1023s", str) == 1) + && (strcmp(str, "}") != 0)) { + char *deffile; + if (basedir && !path_is_absolute(str)) + deffile = string_join(basedir, str, NULL); + else + deffile = ckd_salloc(str); + E_INFO("Reading classdef from '%s'\n", deffile); + if (read_classdef_file(classes, deffile) < 0) { + ckd_free(deffile); + goto error_out; + } + ckd_free(deffile); + } + + if (strcmp(str, "}") != 0) { + E_ERROR("Unexpected EOF in %s\n", lmctlfile); + goto error_out; + } + + /* This might be the first LM name. */ + if (fscanf(ctlfp, "%1023s", str) != 1) + str[0] = '\0'; + } + } + else + str[0] = '\0'; + + /* Read in one LM at a time and add classes to them as necessary. */ + while (str[0] != '\0') { + char *lmfile; + ngram_model_t *lm; + + if (basedir && str[0] != '/' && str[0] != '\\') + lmfile = string_join(basedir, str, NULL); + else + lmfile = ckd_salloc(str); + E_INFO("Reading lm from '%s'\n", lmfile); + lm = ngram_model_read(config, lmfile, NGRAM_AUTO, lmath); + if (lm == NULL) { + ckd_free(lmfile); + goto error_out; + } + if (fscanf(ctlfp, "%1023s", str) != 1) { + E_ERROR("LMname missing after LMFileName '%s'\n", lmfile); + ckd_free(lmfile); + goto error_out; + } + ckd_free(lmfile); + lms = glist_add_ptr(lms, lm); + lmnames = glist_add_ptr(lmnames, ckd_salloc(str)); + + if (fscanf(ctlfp, "%1023s", str) == 1) { + if (strcmp(str, "{") == 0) { + /* LM uses classes; read their names */ + while ((fscanf(ctlfp, "%1023s", str) == 1) && + (strcmp(str, "}") != 0)) { + void *val; + classdef_t *classdef; + + if (hash_table_lookup(classes, str, &val) == -1) { + E_ERROR("Unknown class %s in control file\n", str); + goto error_out; + } + classdef = val; + if (ngram_model_add_class(lm, str, 1.0, + classdef->words, + classdef->weights, + classdef->n_words) < 0) { + goto error_out; + } + E_INFO("Added class %s containing %d words\n", + str, classdef->n_words); + } + if (strcmp(str, "}") != 0) { + E_ERROR("Unexpected EOF in %s\n", lmctlfile); + goto error_out; + } + if (fscanf(ctlfp, "%1023s", str) != 1) + str[0] = '\0'; + } + } + else + str[0] = '\0'; + } + fclose(ctlfp); + + /* Now construct arrays out of lms and lmnames, and build an + * ngram_model_set. */ + lms = glist_reverse(lms); + lmnames = glist_reverse(lmnames); + { + int32 n_models; + ngram_model_t **lm_array; + char **name_array; + gnode_t *lm_node, *name_node; + int32 i; + + n_models = glist_count(lms); + lm_array = ckd_calloc(n_models, sizeof(*lm_array)); + name_array = ckd_calloc(n_models, sizeof(*name_array)); + lm_node = lms; + name_node = lmnames; + for (i = 0; i < n_models; ++i) { + lm_array[i] = gnode_ptr(lm_node); + name_array[i] = gnode_ptr(name_node); + lm_node = gnode_next(lm_node); + name_node = gnode_next(name_node); + } + set = ngram_model_set_init(config, lm_array, name_array, + NULL, n_models); + + for (i = 0; i < n_models; ++i) { + ngram_model_free(lm_array[i]); + } + ckd_free(lm_array); + ckd_free(name_array); + } + error_out: + { + gnode_t *gn; + glist_t hlist; + + if (set == NULL) { + for (gn = lms; gn; gn = gnode_next(gn)) { + ngram_model_free(gnode_ptr(gn)); + } + } + glist_free(lms); + for (gn = lmnames; gn; gn = gnode_next(gn)) { + ckd_free(gnode_ptr(gn)); + } + glist_free(lmnames); + hlist = hash_table_tolist(classes, NULL); + for (gn = hlist; gn; gn = gnode_next(gn)) { + hash_entry_t *he = gnode_ptr(gn); + ckd_free((char *) he->key); + classdef_free(he->val); + } + glist_free(hlist); + hash_table_free(classes); + ckd_free(basedir); + } + return set; +} + +int32 +ngram_model_set_count(ngram_model_t * base) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + return set->n_models; +} + +ngram_model_set_iter_t * +ngram_model_set_iter(ngram_model_t * base) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + ngram_model_set_iter_t *itor; + + if (set == NULL || set->n_models == 0) + return NULL; + itor = ckd_calloc(1, sizeof(*itor)); + itor->set = set; + return itor; +} + +ngram_model_set_iter_t * +ngram_model_set_iter_next(ngram_model_set_iter_t * itor) +{ + if (++itor->cur == itor->set->n_models) { + ngram_model_set_iter_free(itor); + return NULL; + } + return itor; +} + +void +ngram_model_set_iter_free(ngram_model_set_iter_t * itor) +{ + ckd_free(itor); +} + +ngram_model_t * +ngram_model_set_iter_model(ngram_model_set_iter_t * itor, + char const **lmname) +{ + if (lmname) + *lmname = itor->set->names[itor->cur]; + return itor->set->lms[itor->cur]; +} + +ngram_model_t * +ngram_model_set_lookup(ngram_model_t * base, const char *name) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 i; + + if (name == NULL) { + if (set->cur == -1) + return NULL; + else + return set->lms[set->cur]; + } + + /* There probably won't be very many submodels. */ + for (i = 0; i < set->n_models; ++i) + if (0 == strcmp(set->names[i], name)) + break; + if (i == set->n_models) + return NULL; + return set->lms[i]; +} + +ngram_model_t * +ngram_model_set_select(ngram_model_t * base, const char *name) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 i; + + /* There probably won't be very many submodels. */ + for (i = 0; i < set->n_models; ++i) + if (0 == strcmp(set->names[i], name)) + break; + if (i == set->n_models) + return NULL; + set->cur = i; + return set->lms[set->cur]; +} + +const char * +ngram_model_set_current(ngram_model_t * base) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + + if (set->cur == -1) + return NULL; + else + return set->names[set->cur]; +} + +int32 +ngram_model_set_current_wid(ngram_model_t * base, int32 set_wid) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + + if (set->cur == -1 || set_wid >= base->n_words) + return NGRAM_INVALID_WID; + else + return set->widmap[set_wid][set->cur]; +} + +int32 +ngram_model_set_known_wid(ngram_model_t * base, int32 set_wid) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + + if (set_wid >= base->n_words) + return FALSE; + else if (set->cur == -1) { + int32 i; + for (i = 0; i < set->n_models; ++i) { + if (set->widmap[set_wid][i] != ngram_unknown_wid(set->lms[i])) + return TRUE; + } + return FALSE; + } + else + return (set->widmap[set_wid][set->cur] + != ngram_unknown_wid(set->lms[set->cur])); +} + +ngram_model_t * +ngram_model_set_interp(ngram_model_t * base, + const char **names, const float32 * weights) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + + /* If we have a set of weights here, then set them. */ + if (names && weights) { + int32 i, j; + + /* We hope there aren't many models. */ + for (i = 0; i < set->n_models; ++i) { + for (j = 0; j < set->n_models; ++j) + if (0 == strcmp(names[i], set->names[j])) + break; + if (j == set->n_models) { + E_ERROR("Unknown LM name %s\n", names[i]); + return NULL; + } + set->lweights[j] = logmath_log(base->lmath, weights[i]); + } + } + else if (weights) { + memcpy(set->lweights, weights, + set->n_models * sizeof(*set->lweights)); + } + /* Otherwise just enable existing weights. */ + set->cur = -1; + return base; +} + +ngram_model_t * +ngram_model_set_add(ngram_model_t * base, + ngram_model_t * model, + const char *name, float32 weight, int reuse_widmap) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + float32 fprob; + int32 scale, i; + + /* Add it to the array of lms. */ + ++set->n_models; + set->lms = ckd_realloc(set->lms, set->n_models * sizeof(*set->lms)); + set->lms[set->n_models - 1] = model; + set->names = + ckd_realloc(set->names, set->n_models * sizeof(*set->names)); + set->names[set->n_models - 1] = ckd_salloc(name); + /* Expand the history mapping table if necessary. */ + if (model->n > base->n) { + base->n = model->n; + set->maphist = ckd_realloc(set->maphist, + (model->n - 1) * sizeof(*set->maphist)); + } + + /* Renormalize the interpolation weights. */ + fprob = weight * 1.0f / set->n_models; + set->lweights = ckd_realloc(set->lweights, + set->n_models * sizeof(*set->lweights)); + set->lweights[set->n_models - 1] = logmath_log(base->lmath, fprob); + /* Now normalize everything else to fit it in. This is + * accomplished by simply scaling all the other probabilities + * by (1-fprob). */ + scale = logmath_log(base->lmath, 1.0 - fprob); + for (i = 0; i < set->n_models - 1; ++i) + set->lweights[i] += scale; + + /* Reuse the old word ID mapping if requested. */ + if (reuse_widmap) { + int32 **new_widmap; + + /* Tack another column onto the widmap array. */ + new_widmap = (int32 **) ckd_calloc_2d(base->n_words, set->n_models, + sizeof(**new_widmap)); + for (i = 0; i < base->n_words; ++i) { + /* Copy all the existing mappings. */ + memcpy(new_widmap[i], set->widmap[i], + (set->n_models - 1) * sizeof(**new_widmap)); + /* Create the new mapping. */ + new_widmap[i][set->n_models - 1] = + ngram_wid(model, base->word_str[i]); + } + ckd_free_2d((void **) set->widmap); + set->widmap = new_widmap; + } + else { + build_widmap(base, base->lmath, base->n); + } + return model; +} + +ngram_model_t * +ngram_model_set_remove(ngram_model_t * base, + const char *name, int reuse_widmap) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + ngram_model_t *submodel; + int32 lmidx, scale, n, i; + float32 fprob; + + for (lmidx = 0; lmidx < set->n_models; ++lmidx) + if (0 == strcmp(name, set->names[lmidx])) + break; + if (lmidx == set->n_models) + return NULL; + submodel = set->lms[lmidx]; + + /* Renormalize the interpolation weights by scaling them by + * 1/(1-fprob) */ + fprob = (float32) logmath_exp(base->lmath, set->lweights[lmidx]); + scale = logmath_log(base->lmath, 1.0 - fprob); + + /* Remove it from the array of lms, renormalize remaining weights, + * and recalcluate n. */ + --set->n_models; + n = 0; + ckd_free(set->names[lmidx]); + set->names[lmidx] = NULL; + for (i = 0; i < set->n_models; ++i) { + if (i >= lmidx) { + set->lms[i] = set->lms[i + 1]; + set->names[i] = set->names[i + 1]; + set->lweights[i] = set->lweights[i + 1]; + } + set->lweights[i] -= scale; + if (set->lms[i]->n > n) + n = set->lms[i]->n; + } + /* There's no need to shrink these arrays. */ + set->lms[set->n_models] = NULL; + set->lweights[set->n_models] = base->log_zero; + /* No need to shrink maphist either. */ + + /* Reuse the existing word ID mapping if requested. */ + if (reuse_widmap) { + /* Just go through and shrink each row. */ + for (i = 0; i < base->n_words; ++i) { + memmove(set->widmap[i] + lmidx, set->widmap[i] + lmidx + 1, + (set->n_models - lmidx) * sizeof(**set->widmap)); + } + } + else { + build_widmap(base, base->lmath, n); + } + return submodel; +} + +void +ngram_model_set_map_words(ngram_model_t * base, + const char **words, int32 n_words) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 i; + + /* Recreate the word mapping. */ + if (base->writable) { + for (i = 0; i < base->n_words; ++i) { + ckd_free(base->word_str[i]); + } + } + ckd_free(base->word_str); + ckd_free_2d((void **) set->widmap); + base->writable = TRUE; + base->n_words = base->n_1g_alloc = n_words; + base->word_str = ckd_calloc(n_words, sizeof(*base->word_str)); + set->widmap = + (int32 **) ckd_calloc_2d(n_words, set->n_models, + sizeof(**set->widmap)); + hash_table_empty(base->wid); + for (i = 0; i < n_words; ++i) { + int32 j; + base->word_str[i] = ckd_salloc(words[i]); + (void) hash_table_enter_int32(base->wid, base->word_str[i], i); + for (j = 0; j < set->n_models; ++j) { + set->widmap[i][j] = ngram_wid(set->lms[j], base->word_str[i]); + } + } +} + +static int +ngram_model_set_apply_weights(ngram_model_t * base, float32 lw, + float32 wip) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 i; + + /* Apply weights to each sub-model. */ + for (i = 0; i < set->n_models; ++i) + ngram_model_apply_weights(set->lms[i], lw, wip); + return 0; +} + +static int32 +ngram_model_set_score(ngram_model_t * base, int32 wid, + int32 * history, int32 n_hist, int32 * n_used) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 mapwid; + int32 score; + int32 i; + + /* Truncate the history. */ + if (n_hist > base->n - 1) + n_hist = base->n - 1; + + /* Interpolate if there is no current. */ + if (set->cur == -1) { + score = base->log_zero; + for (i = 0; i < set->n_models; ++i) { + int32 j; + /* Map word and history IDs for each model. */ + mapwid = set->widmap[wid][i]; + for (j = 0; j < n_hist; ++j) { + if (history[j] == NGRAM_INVALID_WID) + set->maphist[j] = NGRAM_INVALID_WID; + else + set->maphist[j] = set->widmap[history[j]][i]; + } + score = logmath_add(base->lmath, score, + set->lweights[i] + + ngram_ng_score(set->lms[i], + mapwid, set->maphist, + n_hist, n_used)); + } + } + else { + int32 j; + /* Map word and history IDs (FIXME: do this in a function?) */ + mapwid = set->widmap[wid][set->cur]; + for (j = 0; j < n_hist; ++j) { + if (history[j] == NGRAM_INVALID_WID) + set->maphist[j] = NGRAM_INVALID_WID; + else + set->maphist[j] = set->widmap[history[j]][set->cur]; + } + score = ngram_ng_score(set->lms[set->cur], + mapwid, set->maphist, n_hist, n_used); + } + + return score; +} + +static int32 +ngram_model_set_raw_score(ngram_model_t * base, int32 wid, + int32 * history, int32 n_hist, int32 * n_used) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 mapwid; + int32 score; + int32 i; + + /* Truncate the history. */ + if (n_hist > base->n - 1) + n_hist = base->n - 1; + + /* Interpolate if there is no current. */ + if (set->cur == -1) { + score = base->log_zero; + for (i = 0; i < set->n_models; ++i) { + int32 j; + /* Map word and history IDs for each model. */ + mapwid = set->widmap[wid][i]; + for (j = 0; j < n_hist; ++j) { + if (history[j] == NGRAM_INVALID_WID) + set->maphist[j] = NGRAM_INVALID_WID; + else + set->maphist[j] = set->widmap[history[j]][i]; + } + score = logmath_add(base->lmath, score, + set->lweights[i] + + ngram_ng_prob(set->lms[i], + mapwid, set->maphist, n_hist, + n_used)); + } + } + else { + int32 j; + /* Map word and history IDs (FIXME: do this in a function?) */ + mapwid = set->widmap[wid][set->cur]; + for (j = 0; j < n_hist; ++j) { + if (history[j] == NGRAM_INVALID_WID) + set->maphist[j] = NGRAM_INVALID_WID; + else + set->maphist[j] = set->widmap[history[j]][set->cur]; + } + score = ngram_ng_prob(set->lms[set->cur], + mapwid, set->maphist, n_hist, n_used); + } + + return score; +} + +static int32 +ngram_model_set_add_ug(ngram_model_t * base, int32 wid, int32 lweight) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 *newwid; + int32 i, prob; + + /* At this point the word has already been added to the master + model and we have a new word ID for it. Add it to active + submodels and track the word IDs. */ + newwid = ckd_calloc(set->n_models, sizeof(*newwid)); + prob = base->log_zero; + for (i = 0; i < set->n_models; ++i) { + int32 wprob, n_hist; + + /* Only add to active models. */ + if (set->cur == -1 || set->cur == i) { + /* Did this word already exist? */ + newwid[i] = ngram_wid(set->lms[i], base->word_str[wid]); + if (newwid[i] == NGRAM_INVALID_WID) { + /* Add it to the submodel. */ + newwid[i] = + ngram_model_add_word(set->lms[i], base->word_str[wid], + (float32) logmath_exp(base->lmath, + lweight)); + if (newwid[i] == NGRAM_INVALID_WID) { + ckd_free(newwid); + return base->log_zero; + } + } + /* Now get the unigram probability for the new word and either + * interpolate it or use it (if this is the current model). */ + wprob = + ngram_ng_prob(set->lms[i], newwid[i], NULL, 0, &n_hist); + if (set->cur == i) + prob = wprob; + else if (set->cur == -1) + prob = + logmath_add(base->lmath, prob, + set->lweights[i] + wprob); + } + else { + newwid[i] = NGRAM_INVALID_WID; + } + } + /* Okay we have the word IDs for this in all the submodels. Now + do some complicated memory mangling to add this to the + widmap. */ + set->widmap = + ckd_realloc(set->widmap, base->n_words * sizeof(*set->widmap)); + set->widmap[0] = + ckd_realloc(set->widmap[0], + base->n_words * set->n_models * sizeof(**set->widmap)); + for (i = 0; i < base->n_words; ++i) + set->widmap[i] = set->widmap[0] + i * set->n_models; + memcpy(set->widmap[wid], newwid, set->n_models * sizeof(*newwid)); + ckd_free(newwid); + return prob; +} + +static void +ngram_model_set_free(ngram_model_t * base) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 i; + + for (i = 0; i < set->n_models; ++i) + ngram_model_free(set->lms[i]); + ckd_free(set->lms); + for (i = 0; i < set->n_models; ++i) + ckd_free(set->names[i]); + ckd_free(set->names); + ckd_free(set->lweights); + ckd_free(set->maphist); + ckd_free_2d((void **) set->widmap); +} + +static ngram_funcs_t ngram_model_set_funcs = { + ngram_model_set_free, /* free */ + ngram_model_set_apply_weights, /* apply_weights */ + ngram_model_set_score, /* score */ + ngram_model_set_raw_score, /* raw_score */ + ngram_model_set_add_ug, /* add_ug */ + NULL /* flush */ +}; diff --git a/src/lm/ngram_model_set.h b/src/lm/ngram_model_set.h new file mode 100644 index 0000000..eab38f0 --- /dev/null +++ b/src/lm/ngram_model_set.h @@ -0,0 +1,70 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file ngram_model_set.h Set of language models. + * @author David Huggins-Daines + */ + +#ifndef __NGRAM_MODEL_SET_H__ +#define __NGRAM_MODEL_SET_H__ + +#include "lm/ngram_model_internal.h" + +/** + * Subclass of ngram_model for grouping language models. + */ +typedef struct ngram_model_set_s { + ngram_model_t base; /**< Base ngram_model_t structure. */ + + int32 n_models; /**< Number of models in this set. */ + int32 cur; /**< Currently selected model, or -1 for none. */ + ngram_model_t **lms; /**< Language models in this set. */ + char **names; /**< Names for language models. */ + int32 *lweights; /**< Log interpolation weights. */ + int32 **widmap; /**< Word ID mapping for submodels. */ + int32 *maphist; /**< Word ID mapping for N-Gram history. */ +} ngram_model_set_t; + +/** + * Iterator over a model set. + */ +struct ngram_model_set_iter_s { + ngram_model_set_t *set; + int32 cur; +}; + +#endif /* __NGRAM_MODEL_SET_H__ */ diff --git a/src/lm/ngram_model_trie.c b/src/lm/ngram_model_trie.c new file mode 100644 index 0000000..84a5c03 --- /dev/null +++ b/src/lm/ngram_model_trie.c @@ -0,0 +1,711 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include +#include + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "util/pio.h" +#include "util/strfuncs.h" +#include "util/ckd_alloc.h" +#include "util/byteorder.h" +#include "lm/ngram_model_trie.h" + +static const char trie_hdr[] = "Trie Language Model"; +static const char dmp_hdr[] = "Darpa Trigram LM"; +static ngram_funcs_t ngram_model_trie_funcs; + +/* + * Read and return #unigrams, #bigrams, #trigrams as stated in input file. + */ +static int +read_counts_arpa(lineiter_t ** li, uint32 * counts, int *order) +{ + int32 ngram, prev_ngram; + uint32 ngram_cnt; + + /* skip file until past the '\data\' marker */ + while (*li) { + if (strcmp((*li)->buf, "\\data\\") == 0) + break; + *li = lineiter_next(*li); + } + + if (*li == NULL || strcmp((*li)->buf, "\\data\\") != 0) { + E_INFO("No \\data\\ mark in LM file\n"); + return -1; + } + + prev_ngram = 0; + *order = 0; + while ((*li = lineiter_next(*li))) { + if (sscanf((*li)->buf, "ngram %d=%d", &ngram, &ngram_cnt) != 2) + break; + if (ngram != prev_ngram + 1) { + E_ERROR + ("Ngram counts in LM file is not in order. %d goes after %d\n", + ngram, prev_ngram); + return -1; + } + prev_ngram = ngram; + counts[*order] = ngram_cnt; + (*order)++; + } + + if (*li == NULL) { + E_ERROR("EOF while reading ngram counts\n"); + return -1; + } + + return 0; +} + +static int +read_1grams_arpa(lineiter_t ** li, uint32 count, ngram_model_t * base, + unigram_t * unigrams) +{ + uint32 i; + int n; + int n_parts; + char *wptr[3]; + + while (*li && strcmp((*li)->buf, "\\1-grams:") != 0) { + *li = lineiter_next(*li); + } + if (*li == NULL) { + E_ERROR_SYSTEM("Failed to read \\1-grams: mark"); + return -1; + } + + n_parts = 2; + for (i = 0; i < count; i++) { + unigram_t *unigram; + + *li = lineiter_next(*li); + if (*li == NULL) { + E_ERROR + ("Unexpected end of ARPA file. Failed to read unigram %d\n", + i + 1); + return -1; + } + if ((n = str2words((*li)->buf, wptr, 3)) < n_parts) { + E_ERROR("Format error at line %d, Failed to read unigrams\n", (*li)->lineno); + return -1; + } + + unigram = &unigrams[i]; + unigram->prob = + logmath_log10_to_log_float(base->lmath, atof_c(wptr[0])); + if (unigram->prob > 0) { + E_WARN("Unigram '%s' has positive probability\n", wptr[1]); + unigram->prob = 0; + } + if (n == n_parts + 1) { + unigram->bo = + logmath_log10_to_log_float(base->lmath, + atof_c(wptr[2])); + } + else { + unigram->bo = 0.0f; + } + + /* TODO: classify float with fpclassify and warn if bad value occurred */ + base->word_str[i] = ckd_salloc(wptr[1]); + } + + /* fill hash-table that maps unigram names to their word ids */ + for (i = 0; i < count; i++) { + if ((hash_table_enter + (base->wid, base->word_str[i], + (void *) (size_t) i)) != (void *) (size_t) i) { + E_WARN("Duplicate word in dictionary: %s\n", + base->word_str[i]); + } + } + return 0; +} + +ngram_model_t * +ngram_model_trie_read_arpa(ps_config_t * config, + const char *path, logmath_t * lmath) +{ + FILE *fp; + lineiter_t *li; + ngram_model_trie_t *model; + ngram_model_t *base; + ngram_raw_t **raw_ngrams; + int32 is_pipe; + uint32 counts[NGRAM_MAX_ORDER]; + int order; + int i; + + (void)config; + E_INFO("Trying to read LM in arpa format\n"); + if ((fp = fopen_comp(path, "r", &is_pipe)) == NULL) { + E_ERROR("File %s not found\n", path); + return NULL; + } + + model = (ngram_model_trie_t *) ckd_calloc(1, sizeof(*model)); + li = lineiter_start_clean(fp); + /* Read n-gram counts from file */ + if (read_counts_arpa(&li, counts, &order) == -1) { + ckd_free(model); + lineiter_free(li); + fclose_comp(fp, is_pipe); + return NULL; + } + + E_INFO("LM of order %d\n", order); + for (i = 0; i < order; i++) { + E_INFO("#%d-grams: %d\n", i + 1, counts[i]); + } + + base = &model->base; + ngram_model_init(base, &ngram_model_trie_funcs, lmath, order, + (int32) counts[0]); + base->writable = TRUE; + + model->trie = lm_trie_create(counts[0], order); + if (read_1grams_arpa(&li, counts[0], base, model->trie->unigrams) < 0) { + ngram_model_free(base); + lineiter_free(li); + fclose_comp(fp, is_pipe); + return NULL; + } + + if (order > 1) { + raw_ngrams = + ngrams_raw_read_arpa(&li, base->lmath, counts, order, + base->wid); + if (raw_ngrams == NULL) { + ngram_model_free(base); + lineiter_free(li); + fclose_comp(fp, is_pipe); + return NULL; + } + lm_trie_build(model->trie, raw_ngrams, counts, base->n_counts, order); + ngrams_raw_free(raw_ngrams, counts, order); + } + + lineiter_free(li); + fclose_comp(fp, is_pipe); + + return base; +} + +int +ngram_model_trie_write_arpa(ngram_model_t * base, const char *path) +{ + int i; + uint32 j; + ngram_model_trie_t *model = (ngram_model_trie_t *) base; + FILE *fp = fopen(path, "w"); + if (!fp) { + E_ERROR("Unable to open %s to write arpa LM from trie\n", path); + return -1; + } + fprintf(fp, + "This is an ARPA-format language model file, generated by CMU Sphinx\n"); + /* Write N-gram counts. */ + fprintf(fp, "\\data\\\n"); + for (i = 0; i < base->n; ++i) { + fprintf(fp, "ngram %d=%d\n", i + 1, base->n_counts[i]); + } + /* Write 1-grams */ + fprintf(fp, "\n\\1-grams:\n"); + for (j = 0; j < base->n_counts[0]; j++) { + unigram_t *unigram = &model->trie->unigrams[j]; + fprintf(fp, "%.4f\t%s", + logmath_log_float_to_log10(base->lmath, unigram->prob), + base->word_str[j]); + if (base->n > 1) { + fprintf(fp, "\t%.4f", + logmath_log_float_to_log10(base->lmath, unigram->bo)); + } + fprintf(fp, "\n"); + } + /* Write ngrams */ + if (base->n > 1) { + for (i = 2; i <= base->n; ++i) { + ngram_raw_t *raw_ngrams = + (ngram_raw_t *) ckd_calloc((size_t) base->n_counts[i - 1], + sizeof(*raw_ngrams)); + uint32 raw_ngram_idx; + uint32 j; + uint32 hist[NGRAM_MAX_ORDER]; + node_range_t range; + raw_ngram_idx = 0; + range.begin = range.end = 0; + + /* we need to iterate over a trie here. recursion should do the job */ + lm_trie_fill_raw_ngram(model->trie, raw_ngrams, + &raw_ngram_idx, base->n_counts, range, hist, 0, + i, base->n); + assert(raw_ngram_idx == base->n_counts[i - 1]); + qsort(raw_ngrams, (size_t) base->n_counts[i - 1], + sizeof(ngram_raw_t), &ngram_ord_comparator); + + fprintf(fp, "\n\\%d-grams:\n", i); + for (j = 0; j < base->n_counts[i - 1]; j++) { + int k; + fprintf(fp, "%.4f", logmath_log_float_to_log10(base->lmath, raw_ngrams[j].prob)); + for (k = 0; k < i; k++) { + fprintf(fp, "\t%s", + base->word_str[raw_ngrams[j].words[k]]); + } + ckd_free(raw_ngrams[j].words); + if (i < base->n) { + fprintf(fp, "\t%.4f", logmath_log_float_to_log10(base->lmath, raw_ngrams[j].backoff)); + } + fprintf(fp, "\n"); + } + ckd_free(raw_ngrams); + } + } + fprintf(fp, "\n\\end\\\n"); + return fclose(fp); +} + +static void +read_word_str(ngram_model_t * base, FILE * fp, int do_swap) +{ + int32 k; + uint32 i, j; + char *tmp_word_str; + /* read ascii word strings */ + base->writable = TRUE; + fread(&k, sizeof(k), 1, fp); + if (do_swap) + SWAP_INT32(&k); + E_INFO("#word_str: %d\n", k); + tmp_word_str = (char *) ckd_calloc((size_t) k, 1); + fread(tmp_word_str, 1, (size_t) k, fp); + + /* First make sure string just read contains n_counts[0] words (PARANOIA!!) */ + for (i = 0, j = 0; i < (uint32) k; i++) + if (tmp_word_str[i] == '\0') + j++; + if (j != base->n_counts[0]) { + E_ERROR + ("Error reading word strings (%d doesn't match n_unigrams %d)\n", + j, base->n_counts[0]); + } + + /* Break up string just read into words */ + j = 0; + for (i = 0; i < base->n_counts[0]; i++) { + base->word_str[i] = ckd_salloc(tmp_word_str + j); + if (hash_table_enter(base->wid, base->word_str[i], + (void *) (size_t) i) != (void *) (size_t) i) { + E_WARN("Duplicate word in dictionary: %s\n", + base->word_str[i]); + } + j += strlen(base->word_str[i]) + 1; + } + free(tmp_word_str); +} + +ngram_model_t * +ngram_model_trie_read_bin(ps_config_t * config, + const char *path, logmath_t * lmath) +{ + int32 is_pipe; + FILE *fp; + size_t hdr_size; + char *hdr; + int cmp_res; + uint8 i, order; + uint32 counts[NGRAM_MAX_ORDER]; + ngram_model_trie_t *model; + ngram_model_t *base; + + (void)config; + E_INFO("Trying to read LM in trie binary format\n"); + if ((fp = fopen_comp(path, "rb", &is_pipe)) == NULL) { + E_ERROR("File %s not found\n", path); + return NULL; + } + hdr_size = strlen(trie_hdr); + hdr = (char *) ckd_calloc(hdr_size + 1, sizeof(*hdr)); + fread(hdr, sizeof(*hdr), hdr_size, fp); + cmp_res = strcmp(hdr, trie_hdr); + ckd_free(hdr); + if (cmp_res) { + E_INFO("Header doesn't match\n"); + fclose_comp(fp, is_pipe); + return NULL; + } + model = (ngram_model_trie_t *) ckd_calloc(1, sizeof(*model)); + base = &model->base; + fread(&order, sizeof(order), 1, fp); + for (i = 0; i < order; i++) { + fread(&counts[i], sizeof(counts[i]), 1, fp); + if (SWAP_LM_TRIE) + SWAP_INT32(&counts[i]); + E_INFO("#%d-grams: %d\n", i + 1, counts[i]); + } + ngram_model_init(base, &ngram_model_trie_funcs, lmath, order, + (int32) counts[0]); + for (i = 0; i < order; i++) { + base->n_counts[i] = counts[i]; + } + + model->trie = lm_trie_read_bin(counts, order, fp); + read_word_str(base, fp, SWAP_LM_TRIE); + fclose_comp(fp, is_pipe); + + return base; +} + +static void +write_word_str(FILE * fp, ngram_model_t * model, int do_swap) +{ + int32 k; + uint32 i; + + k = 0; + for (i = 0; i < model->n_counts[0]; i++) + k += strlen(model->word_str[i]) + 1; + E_INFO("#word_str: %d\n", k); + if (do_swap) + SWAP_INT32(&k); + fwrite(&k, sizeof(k), 1, fp); + for (i = 0; i < model->n_counts[0]; i++) + fwrite(model->word_str[i], 1, strlen(model->word_str[i]) + 1, fp); +} + +int +ngram_model_trie_write_bin(ngram_model_t * base, const char *path) +{ + int i; + int32 is_pipe; + ngram_model_trie_t *model = (ngram_model_trie_t *) base; + FILE *fp = fopen_comp(path, "wb", &is_pipe); + if (!fp) { + E_ERROR("Unable to open %s to write binary trie LM\n", path); + return -1; + } + + fwrite(trie_hdr, sizeof(*trie_hdr), strlen(trie_hdr), fp); + fwrite(&model->base.n, sizeof(model->base.n), 1, fp); + for (i = 0; i < model->base.n; i++) { + uint32 count = model->base.n_counts[i]; + if (SWAP_LM_TRIE) + SWAP_INT32(&count); + fwrite(&count, sizeof(count), 1, fp); + } + lm_trie_write_bin(model->trie, base->n_counts[0], fp); + write_word_str(fp, base, SWAP_LM_TRIE); + fclose_comp(fp, is_pipe); + return 0; +} + +ngram_model_t * +ngram_model_trie_read_dmp(ps_config_t * config, + const char *file_name, logmath_t * lmath) +{ + uint8 do_swap; + int32 is_pipe; + int32 k; + uint32 j; + int32 vn, ts; + int32 count; + uint32 counts[3]; + uint32 *unigram_next; + int order; + char str[1024]; + FILE *fp; + ngram_model_trie_t *model; + ngram_model_t *base; + ngram_raw_t **raw_ngrams; + + (void)config; + E_INFO("Trying to read LM in dmp format\n"); + if ((fp = fopen_comp(file_name, "rb", &is_pipe)) == NULL) { + E_ERROR("Dump file %s not found\n", file_name); + return NULL; + } + + do_swap = FALSE; + fread(&k, sizeof(k), 1, fp); + if (k != strlen(dmp_hdr) + 1) { + SWAP_INT32(&k); + if (k != strlen(dmp_hdr) + 1) { + E_ERROR + ("Wrong magic header size number %x: %s is not a dump file\n", + k, file_name); + return NULL; + } + do_swap = 1; + } + if (fread(str, 1, k, fp) != (size_t) k) { + E_ERROR("Cannot read header\n"); + return NULL; + } + if (strncmp(str, dmp_hdr, k) != 0) { + E_ERROR("Wrong header %s: %s is not a dump file\n", dmp_hdr); + return NULL; + } + + if (fread(&k, sizeof(k), 1, fp) != 1) + return NULL; + if (do_swap) + SWAP_INT32(&k); + if (fread(str, 1, k, fp) != (size_t) k) { + E_ERROR("Cannot read LM filename in header\n"); + return NULL; + } + + /* read version#, if present (must be <= 0) */ + if (fread(&vn, sizeof(vn), 1, fp) != 1) + return NULL; + if (do_swap) + SWAP_INT32(&vn); + if (vn <= 0) { + /* read and don't compare timestamps (we don't care) */ + if (fread(&ts, sizeof(ts), 1, fp) != 1) + return NULL; + if (do_swap) + SWAP_INT32(&ts); + + /* read and skip format description */ + for (;;) { + if (fread(&k, sizeof(k), 1, fp) != 1) + return NULL; + if (do_swap) + SWAP_INT32(&k); + if (k == 0) + break; + if (fread(str, 1, k, fp) != (size_t) k) { + E_ERROR("Failed to read word\n"); + return NULL; + } + } + /* read model->ucount */ + if (fread(&count, sizeof(count), 1, fp) != 1) + return NULL; + if (do_swap) + SWAP_INT32(&count); + counts[0] = count; + } + else { + counts[0] = vn; + } + /* read model->bcount, tcount */ + if (fread(&count, sizeof(count), 1, fp) != 1) + return NULL; + if (do_swap) + SWAP_INT32(&count); + counts[1] = count; + if (fread(&count, sizeof(count), 1, fp) != 1) + return NULL; + if (do_swap) + SWAP_INT32(&count); + counts[2] = count; + E_INFO("ngrams 1=%d, 2=%d, 3=%d\n", counts[0], counts[1], counts[2]); + + model = (ngram_model_trie_t *) ckd_calloc(1, sizeof(*model)); + base = &model->base; + if (counts[2] > 0) + order = 3; + else if (counts[1] > 0) + order = 2; + else + order = 1; + ngram_model_init(base, &ngram_model_trie_funcs, lmath, order, + (int32) counts[0]); + + model->trie = lm_trie_create(counts[0], order); + + unigram_next = + (uint32 *) ckd_calloc((int32) counts[0] + 1, sizeof(unigram_next)); + for (j = 0; j <= counts[0]; j++) { + int32 bigrams; + int32 mapid; + dmp_weight_t weightp; + dmp_weight_t weightb; + + /* Skip over the mapping ID, we don't care about it. */ + /* Read the weights from actual unigram structure. */ + fread(&mapid, sizeof(int32), 1, fp); + fread(&weightp, sizeof(weightp), 1, fp); + fread(&weightb, sizeof(weightb), 1, fp); + fread(&bigrams, sizeof(int32), 1, fp); + if (do_swap) { + SWAP_INT32(&weightp.l); + SWAP_INT32(&weightb.l); + SWAP_INT32(&bigrams); + } + model->trie->unigrams[j].prob = logmath_log10_to_log_float(lmath, weightp.f); + model->trie->unigrams[j].bo = logmath_log10_to_log_float(lmath, weightb.f); + model->trie->unigrams[j].next = bigrams; + unigram_next[j] = bigrams; + } + + if (order > 1) { + raw_ngrams = + ngrams_raw_read_dmp(fp, lmath, counts, order, unigram_next, + do_swap); + if (raw_ngrams == NULL) { + ngram_model_free(base); + ckd_free(unigram_next); + fclose_comp(fp, is_pipe); + return NULL; + } + lm_trie_build(model->trie, raw_ngrams, counts, base->n_counts, order); + ngrams_raw_free(raw_ngrams, counts, order); + } + + /* Sentinel unigram and bigrams read before */ + ckd_free(unigram_next); + + /* read ascii word strings */ + read_word_str(base, fp, do_swap); + + fclose_comp(fp, is_pipe); + return base; +} + +static void +ngram_model_trie_free(ngram_model_t * base) +{ + ngram_model_trie_t *model = (ngram_model_trie_t *) base; + lm_trie_free(model->trie); +} + +static int +trie_apply_weights(ngram_model_t * base, float32 lw, float32 wip) +{ + /* just update weights that are going to be used on score calculation */ + base->lw = lw; + base->log_wip = logmath_log(base->lmath, wip); + return 0; +} + +static int32 +weight_score(ngram_model_t * base, int32 score) +{ + return (int32) (score * base->lw + base->log_wip); +} + +static int32 +ngram_model_trie_raw_score(ngram_model_t * base, int32 wid, int32 * hist, + int32 n_hist, int32 * n_used) +{ + int32 i; + ngram_model_trie_t *model = (ngram_model_trie_t *) base; + + if (n_hist > model->base.n - 1) + n_hist = model->base.n - 1; + for (i = 0; i < n_hist; i++) { + if (hist[i] < 0) { + n_hist = i; + break; + } + } + + return (int32) lm_trie_score(model->trie, model->base.n, wid, hist, + n_hist, n_used); +} + +static int32 +ngram_model_trie_score(ngram_model_t * base, int32 wid, int32 * hist, + int32 n_hist, int32 * n_used) +{ + return weight_score(base, + ngram_model_trie_raw_score(base, wid, hist, n_hist, + n_used)); +} + +static int32 +lm_trie_add_ug(ngram_model_t * base, int32 wid, int32 lweight) +{ + ngram_model_trie_t *model = (ngram_model_trie_t *) base; + + /* This would be very bad if this happened! */ + assert(!NGRAM_IS_CLASSWID(wid)); + + /* Reallocate unigram array. */ + model->trie->unigrams = + (unigram_t *) ckd_realloc(model->trie->unigrams, + sizeof(*model->trie->unigrams) * + (base->n_1g_alloc + 1)); + memset(model->trie->unigrams + (base->n_counts[0] + 1), 0, + (size_t) (base->n_1g_alloc - + base->n_counts[0]) * sizeof(*model->trie->unigrams)); + ++base->n_counts[0]; + lweight += logmath_log(base->lmath, 1.0 / base->n_counts[0]); + model->trie->unigrams[wid + 1].next = model->trie->unigrams[wid].next; + model->trie->unigrams[wid].prob = (float) lweight; + /* This unigram by definition doesn't participate in any bigrams, + * so its backoff weight is undefined and next pointer same as in finish unigram*/ + model->trie->unigrams[wid].bo = 0; + /* Finally, increase the unigram count */ + /* FIXME: Note that this can actually be quite bogus due to the + * presence of class words. If wid falls outside the unigram + * count, increase it to compensate, at the cost of no longer + * really knowing how many unigrams we have :( */ + if ((uint32) wid >= base->n_counts[0]) + base->n_counts[0] = wid + 1; + + return (int32) weight_score(base, lweight); +} + +static void +lm_trie_flush(ngram_model_t * base) +{ + ngram_model_trie_t *model = (ngram_model_trie_t *) base; + lm_trie_t *trie = model->trie; + memset(trie->hist_cache, -1, sizeof(trie->hist_cache)); + memset(trie->backoff_cache, 0, sizeof(trie->backoff_cache)); + return; +} + +static ngram_funcs_t ngram_model_trie_funcs = { + ngram_model_trie_free, /* free */ + trie_apply_weights, /* apply_weights */ + ngram_model_trie_score, /* score */ + ngram_model_trie_raw_score, /* raw_score */ + lm_trie_add_ug, /* add_ug */ + lm_trie_flush /* flush */ +}; diff --git a/src/lm/ngram_model_trie.h b/src/lm/ngram_model_trie.h new file mode 100644 index 0000000..ff614d5 --- /dev/null +++ b/src/lm/ngram_model_trie.h @@ -0,0 +1,79 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +#ifndef __NGRAM_MODEL_TRIE_H__ +#define __NGRAM_MODEL_TRIE_H__ + +#include "lm/ngram_model_internal.h" +#include "lm/lm_trie.h" + +typedef struct ngram_model_trie_s { + ngram_model_t base; /**< Base ngram_model_t structure */ + lm_trie_t *trie; /**< Trie structure that stores ngram relations and weights */ +} ngram_model_trie_t; + +/** + * Read N-Gram model from and ARPABO text file and arrange it in trie structure + */ +ngram_model_t *ngram_model_trie_read_arpa(ps_config_t * config, + const char *path, + logmath_t * lmath); + +/** + * Write N-Gram model stored in trie structure in ARPABO format + */ +int ngram_model_trie_write_arpa(ngram_model_t * base, const char *path); + +/** + * Read N-Gram model from the binary file and arrange it in a trie structure + */ +ngram_model_t *ngram_model_trie_read_bin(ps_config_t * config, + const char *path, + logmath_t * lmath); + +/** + * Write trie to binary file + */ +int ngram_model_trie_write_bin(ngram_model_t * model, const char *path); + +/** + * Read N-Gram model from DMP file and arrange it in trie structure + */ +ngram_model_t *ngram_model_trie_read_dmp(ps_config_t * config, + const char *file_name, + logmath_t * lmath); + +#endif /* __NGRAM_MODEL_TRIE_H__ */ diff --git a/src/lm/ngrams_raw.c b/src/lm/ngrams_raw.c new file mode 100644 index 0000000..d42b60e --- /dev/null +++ b/src/lm/ngrams_raw.c @@ -0,0 +1,387 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include + +#include + +#include "util/pio.h" +#include "util/strfuncs.h" +#include "util/ckd_alloc.h" +#include "util/byteorder.h" +#include "lm/ngram_model_internal.h" +#include "lm/ngrams_raw.h" + +int +ngram_ord_comparator(const void *a_raw, const void *b_raw) +{ + ngram_raw_t *a = (ngram_raw_t *) a_raw; + ngram_raw_t *b = (ngram_raw_t *) b_raw; + int a_w_ptr = 0; + int b_w_ptr = 0; + while ((uint32)a_w_ptr < a->order && (uint32)b_w_ptr < b->order) { + if (a->words[a_w_ptr] == b->words[b_w_ptr]) { + a_w_ptr++; + b_w_ptr++; + continue; + } + if (a->words[a_w_ptr] < b->words[b_w_ptr]) + return -1; + else + return 1; + } + return a->order - b->order; +} + +static int +ngrams_raw_read_line(lineiter_t *li, hash_table_t *wid, + logmath_t *lmath, int order, int order_max, + ngram_raw_t *raw_ngram) +{ + int n, i; + int words_expected; + char *wptr[NGRAM_MAX_ORDER + 1]; + uint32 *word_out; + + words_expected = order + 1; + if ((n = + str2words(li->buf, wptr, + NGRAM_MAX_ORDER + 1)) < words_expected) { + E_ERROR("Format error; %d-gram ignored at line %d\n", order, li->lineno); + return -1; + } + + raw_ngram->order = order; + + if (order == order_max) { + raw_ngram->prob = atof_c(wptr[0]); + if (raw_ngram->prob > 0) { + E_WARN("%d-gram '%s' has positive probability\n", order, wptr[1]); + raw_ngram->prob = 0.0f; + } + raw_ngram->prob = + logmath_log10_to_log_float(lmath, raw_ngram->prob); + } + else { + float weight, backoff; + + weight = atof_c(wptr[0]); + if (weight > 0) { + E_WARN("%d-gram '%s' has positive probability\n", order, wptr[1]); + raw_ngram->prob = 0.0f; + } + else { + raw_ngram->prob = + logmath_log10_to_log_float(lmath, weight); + } + + if (n == order + 1) { + raw_ngram->backoff = 0.0f; + } + else { + backoff = atof_c(wptr[order + 1]); + raw_ngram->backoff = + logmath_log10_to_log_float(lmath, backoff); + } + } + raw_ngram->words = + (uint32 *) ckd_calloc(order, sizeof(*raw_ngram->words)); + for (word_out = raw_ngram->words + order - 1, i = 1; + word_out >= raw_ngram->words; --word_out, i++) { + hash_table_lookup_int32(wid, wptr[i], (int32 *) word_out); + } + return 0; +} + +static int +ngrams_raw_read_section(ngram_raw_t ** raw_ngrams, lineiter_t ** li, + hash_table_t * wid, logmath_t * lmath, uint32 *count, + int order, int order_max) +{ + char expected_header[20]; + uint32 i, cur; + + sprintf(expected_header, "\\%d-grams:", order); + while (*li && strcmp((*li)->buf, expected_header) != 0) { + *li = lineiter_next(*li); + } + + if (*li == NULL) { + E_ERROR("Failed to find '%s', language model file truncated\n", expected_header); + return -1; + } + + *raw_ngrams = (ngram_raw_t *) ckd_calloc(*count, sizeof(ngram_raw_t)); + for (i = 0, cur = 0; i < *count && *li != NULL; i++) { + *li = lineiter_next(*li); + if (*li == NULL) { + E_ERROR("Unexpected end of ARPA file. Failed to read %d-gram\n", + order); + return -1; + } + if (ngrams_raw_read_line(*li, wid, lmath, order, order_max, + *raw_ngrams + cur) == 0) { + cur++; + } + } + *count = cur; + qsort(*raw_ngrams, *count, sizeof(ngram_raw_t), &ngram_ord_comparator); + return 0; +} + +ngram_raw_t ** +ngrams_raw_read_arpa(lineiter_t ** li, logmath_t * lmath, uint32 * counts, + int order, hash_table_t * wid) +{ + ngram_raw_t **raw_ngrams; + int order_it; + + raw_ngrams = + (ngram_raw_t **) ckd_calloc(order - 1, sizeof(*raw_ngrams)); + + for (order_it = 2; order_it <= order; order_it++) { + if (ngrams_raw_read_section(&raw_ngrams[order_it - 2], li, wid, lmath, + counts + order_it - 1, order_it, order) < 0) + break; + } + + /* Check if we found ARPA end-mark */ + if (*li == NULL) { + E_ERROR("ARPA file ends without end-mark\n"); + ngrams_raw_free(raw_ngrams, counts, order); + return NULL; + } else { + *li = lineiter_next(*li); + if (strcmp((*li)->buf, "\\end\\") != 0) { + E_WARN + ("Finished reading ARPA file. Expecting end mark but found '%s'\n", + (*li)->buf); + } + } + + return raw_ngrams; +} + +static void +read_dmp_weight_array(FILE * fp, logmath_t * lmath, uint8 do_swap, + int32 counts, ngram_raw_t * raw_ngrams, + int weight_idx) +{ + int32 i, k; + dmp_weight_t *tmp_weight_arr; + + fread(&k, sizeof(k), 1, fp); + if (do_swap) + SWAP_INT32(&k); + tmp_weight_arr = + (dmp_weight_t *) ckd_calloc(k, sizeof(*tmp_weight_arr)); + fread(tmp_weight_arr, sizeof(*tmp_weight_arr), k, fp); + for (i = 0; i < k; i++) { + if (do_swap) + SWAP_INT32(&tmp_weight_arr[i].l); + /* Convert values to log. */ + tmp_weight_arr[i].f = + logmath_log10_to_log_float(lmath, tmp_weight_arr[i].f); + } + /* replace indexes with real probs in raw bigrams */ + for (i = 0; i < counts; i++) { + if (weight_idx == 0) { + raw_ngrams[i].prob = + tmp_weight_arr[(int) raw_ngrams[i].prob].f; + } else { + raw_ngrams[i].backoff = + tmp_weight_arr[(int) raw_ngrams[i].backoff].f; + } + } + ckd_free(tmp_weight_arr); +} + +#define BIGRAM_SEGMENT_SIZE 9 + +ngram_raw_t ** +ngrams_raw_read_dmp(FILE * fp, logmath_t * lmath, uint32 * counts, + int order, uint32 * unigram_next, uint8 do_swap) +{ + uint32 j, ngram_idx; + uint16 *bigrams_next; + ngram_raw_t **raw_ngrams = + (ngram_raw_t **) ckd_calloc(order - 1, sizeof(*raw_ngrams)); + + /* read bigrams */ + raw_ngrams[0] = + (ngram_raw_t *) ckd_calloc((size_t) (counts[1] + 1), + sizeof(*raw_ngrams[0])); + bigrams_next = + (uint16 *) ckd_calloc((size_t) (counts[1] + 1), + sizeof(*bigrams_next)); + ngram_idx = 1; + for (j = 0; j <= counts[1]; j++) { + uint16 wid, prob_idx, bo_idx; + ngram_raw_t *raw_ngram = &raw_ngrams[0][j]; + + fread(&wid, sizeof(wid), 1, fp); + if (do_swap) + SWAP_INT16(&wid); + raw_ngram->order = 2; + while (ngram_idx < counts[0] && j == unigram_next[ngram_idx]) { + ngram_idx++; + } + + if (j != counts[1]) { + raw_ngram->words = + (uint32 *) ckd_calloc(2, sizeof(*raw_ngram->words)); + raw_ngram->words[0] = (uint32) wid; + raw_ngram->words[1] = (uint32) ngram_idx - 1; + } + + fread(&prob_idx, sizeof(prob_idx), 1, fp); + fread(&bo_idx, sizeof(bo_idx), 1, fp); + fread(&bigrams_next[j], sizeof(bigrams_next[j]), 1, fp); + if (do_swap) { + SWAP_INT16(&prob_idx); + SWAP_INT16(&bo_idx); + SWAP_INT16(&bigrams_next[j]); + } + + if (j != counts[1]) { + raw_ngram->prob = prob_idx + 0.5f; /* keep index in float. ugly but avoiding using extra memory */ + raw_ngram->backoff = bo_idx + 0.5f; + } + } + + if (ngram_idx < counts[0]) { + E_ERROR("Corrupted model, not enough unigrams %d %d\n", ngram_idx, counts[0]); + ckd_free(bigrams_next); + ngrams_raw_free(raw_ngrams, counts, order); + return NULL; + } + + /* read trigrams */ + if (order > 2) { + raw_ngrams[1] = + (ngram_raw_t *) ckd_calloc((size_t) counts[2], + sizeof(*raw_ngrams[1])); + for (j = 0; j < counts[2]; j++) { + uint16 wid, prob_idx; + ngram_raw_t *raw_ngram = &raw_ngrams[1][j]; + + fread(&wid, sizeof(wid), 1, fp); + fread(&prob_idx, sizeof(prob_idx), 1, fp); + if (do_swap) { + SWAP_INT16(&wid); + SWAP_INT16(&prob_idx); + } + + raw_ngram->order = 3; + raw_ngram->words = + (uint32 *) ckd_calloc(3, sizeof(*raw_ngram->words)); + raw_ngram->words[0] = (uint32) wid; + raw_ngram->prob = prob_idx + 0.5f; /* keep index in float. ugly but avoiding using extra memory */ + } + } + + /* read prob2 */ + read_dmp_weight_array(fp, lmath, do_swap, (int32) counts[1], + raw_ngrams[0], 0); + /* read bo2 */ + if (order > 2) { + int32 k; + int32 *tseg_base; + read_dmp_weight_array(fp, lmath, do_swap, (int32) counts[1], + raw_ngrams[0], 1); + /* read prob3 */ + read_dmp_weight_array(fp, lmath, do_swap, (int32) counts[2], + raw_ngrams[1], 0); + /* Read tseg_base size and tseg_base to fill trigram's first words */ + fread(&k, sizeof(k), 1, fp); + if (do_swap) + SWAP_INT32(&k); + tseg_base = (int32 *) ckd_calloc(k, sizeof(int32)); + fread(tseg_base, sizeof(int32), k, fp); + if (do_swap) { + for (j = 0; j < (uint32) k; j++) { + SWAP_INT32(&tseg_base[j]); + } + } + ngram_idx = 0; + for (j = 1; j <= counts[1]; j++) { + uint32 next_ngram_idx = + (uint32) (tseg_base[j >> BIGRAM_SEGMENT_SIZE] + + bigrams_next[j]); + while (ngram_idx < next_ngram_idx) { + raw_ngrams[1][ngram_idx].words[1] = + raw_ngrams[0][j - 1].words[0]; + raw_ngrams[1][ngram_idx].words[2] = + raw_ngrams[0][j - 1].words[1]; + ngram_idx++; + } + } + ckd_free(tseg_base); + + if (ngram_idx < counts[2]) { + E_ERROR("Corrupted model, some trigrams have no corresponding bigram\n"); + ckd_free(bigrams_next); + ngrams_raw_free(raw_ngrams, counts, order); + return NULL; + } + } + ckd_free(bigrams_next); + + /* sort raw ngrams for reverse trie */ + qsort(raw_ngrams[0], (size_t) counts[1], sizeof(*raw_ngrams[0]), + &ngram_ord_comparator); + if (order > 2) { + qsort(raw_ngrams[1], (size_t) counts[2], sizeof(*raw_ngrams[1]), + &ngram_ord_comparator); + } + return raw_ngrams; +} + +void +ngrams_raw_free(ngram_raw_t ** raw_ngrams, uint32 * counts, int order) +{ + uint32 num; + int order_it; + + for (order_it = 0; order_it < order - 1; order_it++) { + for (num = 0; num < counts[order_it + 1]; num++) { + ckd_free(raw_ngrams[order_it][num].words); + } + ckd_free(raw_ngrams[order_it]); + } + ckd_free(raw_ngrams); +} diff --git a/src/lm/ngrams_raw.h b/src/lm/ngrams_raw.h new file mode 100644 index 0000000..3c940b9 --- /dev/null +++ b/src/lm/ngrams_raw.h @@ -0,0 +1,93 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef __NGRAMS_RAW_H__ +#define __NGRAMS_RAW_H__ + +#include + +#include "util/hash_table.h" +#include "util/pio.h" + +typedef struct ngram_raw_s { + uint32 *words; /* array of word indexes, length corresponds to ngram order */ + float32 prob; + float32 backoff; + uint32 order; +} ngram_raw_t; + +typedef union { + float32 f; + int32 l; +} dmp_weight_t; + +/** + * Raw ordered ngrams comparator + */ +int ngram_ord_comparator(const void *a_raw, const void *b_raw); + +/** + * Read ngrams of order > 1 from ARPA file + * @param li [in] sphinxbase file line iterator that point to bigram description in ARPA file + * @param wid [in] hashtable that maps string word representation to id + * @param lmath [in] log math used for log conversions + * @param counts [in] amount of ngrams for each order + * @param order [in] maximum order of ngrams + * @return raw ngrams of order bigger than 1 + */ +ngram_raw_t **ngrams_raw_read_arpa(lineiter_t ** li, logmath_t * lmath, + uint32 * counts, int order, + hash_table_t * wid); + +/** + * Reads ngrams of order > 1 from DMP file. + * @param fp [in] file to read from. Position in file corresponds to start of bigram description + * @param lmath [in] log math used for log conversions + * @param counts [in] amount of ngrams for each order + * @param order [in] maximum order of ngrams + * @param unigram_next [in] array of next word pointers for unigrams. Needed to define first word of bigrams + * @param do_swap [in] whether to do swap of bits + * @return raw ngrams of order bigger than 1 + */ +ngram_raw_t **ngrams_raw_read_dmp(FILE * fp, logmath_t * lmath, + uint32 * counts, int order, + uint32 * unigram_next, uint8 do_swap); + +void ngrams_raw_free(ngram_raw_t ** raw_ngrams, uint32 * counts, + int order); + +#endif /* __LM_NGRAMS_RAW_H__ */ diff --git a/src/libpocketsphinx/mdef.c b/src/mdef.c similarity index 98% rename from src/libpocketsphinx/mdef.c rename to src/mdef.c index b4ca73c..4234fbf 100644 --- a/src/libpocketsphinx/mdef.c +++ b/src/mdef.c @@ -82,17 +82,14 @@ * CI phones must appear first in model definition file. */ -/* System headers. */ #include #include #include #include -/* SphinxBase headers. */ -#include -#include +#include -/* Local headers. */ +#include "util/ckd_alloc.h" #include "mdef.h" @@ -105,7 +102,7 @@ ciphone_add(mdef_t * m, char *ci, int p) m->ciphone[p].name = (char *) ckd_salloc(ci); /* freed in mdef_free */ if (hash_table_enter(m->ciphone_ht, m->ciphone[p].name, - (void *)(long)p) != (void *)(long)p) + (void *)(size_t)p) != (void *)(size_t)p) E_FATAL("hash_table_enter(%s) failed; duplicate CIphone?\n", m->ciphone[p].name); } @@ -348,7 +345,7 @@ parse_base_line(mdef_t * m, char *line, int p) /* Read filler attribute, if present */ if (sscanf(lp, "%s%n", word, &wlen) != 1) - E_FATAL("Missing filler atribute field: %s\n", line); + E_FATAL("Missing filler attribute field: %s\n", line); lp += wlen; if (strcmp(word, "filler") == 0) m->ciphone[(int) ci].filler = 1; @@ -472,7 +469,7 @@ sseq_compress(mdef_t * m) for (gn = g; gn; gn = gnode_next(gn)) { he = (hash_entry_t *) gnode_ptr(gn); - j = (int32)(long)hash_entry_val(he); + j = (int32)(size_t)hash_entry_val(he); memcpy(sseq[j], hash_entry_key(he), k); } glist_free(g); @@ -534,7 +531,7 @@ mdef_init(char *mdeffile, int32 breport) return NULL; } if (strncmp(buf, MODEL_DEF_VERSION, strlen(MODEL_DEF_VERSION)) != 0) - E_FATAL("Version error: Expecing %s, but read %s\n", + E_FATAL("Version error: Expecting %s, but read %s\n", MODEL_DEF_VERSION, buf); /* Read #base phones, #triphones, #senone mappings defined in header */ @@ -576,7 +573,7 @@ mdef_init(char *mdeffile, int32 breport) if (n_ci >= MAX_INT16) E_FATAL("%s: #CI phones (%d) exceeds limit (%d)\n", mdeffile, n_ci, MAX_INT16); - if (n_ci + n_tri >= MAX_INT32) /* Comparison is always false... */ + if ((int64)n_ci + n_tri >= MAX_INT32) E_FATAL("%s: #Phones (%d) exceeds limit (%d)\n", mdeffile, n_ci + n_tri, MAX_INT32); if (m->n_sen >= MAX_INT16) diff --git a/src/libpocketsphinx/mdef.h b/src/mdef.h similarity index 98% rename from src/libpocketsphinx/mdef.h rename to src/mdef.h index b0a7ced..8a4d497 100644 --- a/src/libpocketsphinx/mdef.h +++ b/src/mdef.h @@ -51,15 +51,16 @@ #define __MDEF_H__ -/* System headers. */ #include -/* SphinxBase headers. */ -#include +#include "util/hash_table.h" #ifdef __cplusplus extern "C" { #endif +#if 0 +} +#endif /** \file mdef.h * \brief Model definition @@ -84,7 +85,7 @@ typedef enum { \struct ciphone_t \brief CI phone information */ -typedef struct { +typedef struct ciphone_s { char *name; /**< The name of the CI phone */ int32 filler; /**< Whether a filler phone; if so, can be substituted by silence phone in left or right context position */ @@ -94,7 +95,7 @@ typedef struct { * \struct phone_t * \brief Triphone information, including base phones as a subset. For the latter, lc, rc and wpos are non-existent. */ -typedef struct { +typedef struct phone_s { int32 ssid; /**< State sequence (or senone sequence) ID, considering the n_emit_state senone-ids are a unit. The senone sequences themselves are in a separate table */ @@ -130,9 +131,9 @@ typedef struct ph_lc_s { /** The main model definition structure */ /** \struct mdef_t - \brief strcture for storing the model definition. + \brief structure for storing the model definition. */ -typedef struct { +typedef struct mdef_s { int32 n_ciphone; /**< number basephones actually present */ int32 n_phone; /**< number basephones + number triphones actually present */ int32 n_emit_state; /**< number emitting states per phone */ @@ -265,7 +266,7 @@ void mdef_free (mdef_t *mdef /**< In : The model definition*/ #ifdef __cplusplus -} +} /* extern "C" */ #endif #endif diff --git a/src/libpocketsphinx/ms_gauden.c b/src/ms_gauden.c similarity index 95% rename from src/libpocketsphinx/ms_gauden.c rename to src/ms_gauden.c index ea8e914..1b80f11 100644 --- a/src/libpocketsphinx/ms_gauden.c +++ b/src/ms_gauden.c @@ -40,9 +40,10 @@ #include #include -#include -#include -#include +#include + +#include "util/bio.h" +#include "util/ckd_alloc.h" #include "ms_gauden.h" @@ -52,7 +53,7 @@ #define M_PI 3.1415926535897932385e0 #endif -#define WORST_DIST (int32)(0x80000000) +#define WORST_DIST MAX_NEG_INT32 void gauden_dump(const gauden_t * g) @@ -157,7 +158,7 @@ gauden_param_read(const char *file_name, /* #Codebooks */ if (bio_fread(&n_mgau, sizeof(int32), 1, fp, byteswap, &chksum) != 1) { - E_ERROR("Failed to read number fo codebooks from %s\n", file_name); + E_ERROR("Failed to read number of codebooks from %s\n", file_name); fclose(fp); return NULL; } @@ -318,7 +319,7 @@ gauden_init(char const *meanfile, char const *varfile, float32 varfloor, logmath assert(varfloor > 0.0); g = (gauden_t *) ckd_calloc(1, sizeof(gauden_t)); - g->lmath = lmath; + g->lmath = logmath_retain(lmath); g->mean = (mfcc_t ****)gauden_param_read(meanfile, &g->n_mgau, &g->n_feat, &g->n_density, &g->featlen); @@ -340,7 +341,7 @@ gauden_init(char const *meanfile, char const *varfile, float32 varfloor, logmath } for (i = 0; i < g->n_feat; i++) { if (g->featlen[i] != flen[i]) { - E_FATAL("Feature lengths for means and variances differ\n"); + E_ERROR("Feature lengths for means and variances differ\n"); ckd_free(flen); gauden_free(g); return NULL; @@ -367,6 +368,8 @@ gauden_free(gauden_t * g) ckd_free_3d(g->det); if (g->featlen) ckd_free(g->featlen); + if (g->lmath) + logmath_free(g->lmath); ckd_free(g); } @@ -498,15 +501,15 @@ gauden_dist(gauden_t * g, obs[f], g->featlen[f], g->mean[mgau][f], g->var[mgau][f], g->det[mgau][f], g->n_density); - E_DEBUG(3, ("Top CW(%d,%d) = %d %d\n", mgau, f, out_dist[f][0].id, - (int)out_dist[f][0].dist >> SENSCR_SHIFT)); + E_DEBUG("Top CW(%d,%d) = %d %d\n", mgau, f, out_dist[f][0].id, + (int)out_dist[f][0].dist >> SENSCR_SHIFT); } return 0; } int32 -gauden_mllr_transform(gauden_t *g, ps_mllr_t *mllr, cmd_ln_t *config) +gauden_mllr_transform(gauden_t *g, ps_mllr_t *mllr, ps_config_t *config) { int32 i, m, f, d, *flen; @@ -523,9 +526,9 @@ gauden_mllr_transform(gauden_t *g, ps_mllr_t *mllr, cmd_ln_t *config) g->featlen = NULL; /* Reload means and variances (un-precomputed). */ - g->mean = (mfcc_t ****)gauden_param_read(cmd_ln_str_r(config, "_mean"), &g->n_mgau, &g->n_feat, &g->n_density, + g->mean = (mfcc_t ****)gauden_param_read(ps_config_str(config, "mean"), &g->n_mgau, &g->n_feat, &g->n_density, &g->featlen); - g->var = (mfcc_t ****)gauden_param_read(cmd_ln_str_r(config, "_var"), &m, &f, &d, &flen); + g->var = (mfcc_t ****)gauden_param_read(ps_config_str(config, "var"), &m, &f, &d, &flen); /* Verify mean and variance parameter dimensions */ if ((m != g->n_mgau) || (f != g->n_feat) || (d != g->n_density)) @@ -564,6 +567,6 @@ gauden_mllr_transform(gauden_t *g, ps_mllr_t *mllr, cmd_ln_t *config) /* Re-precompute (if we aren't adapting variances this isn't * actually necessary...) */ - gauden_dist_precompute(g, g->lmath, cmd_ln_float32_r(config, "-varfloor")); + gauden_dist_precompute(g, g->lmath, ps_config_float(config, "varfloor")); return 0; } diff --git a/src/libpocketsphinx/ms_gauden.h b/src/ms_gauden.h similarity index 95% rename from src/libpocketsphinx/ms_gauden.h rename to src/ms_gauden.h index 9c26cef..40de333 100644 --- a/src/libpocketsphinx/ms_gauden.h +++ b/src/ms_gauden.h @@ -50,25 +50,25 @@ * */ -/* SphinxBase headers. */ -#include -#include -#include +#include -/* Local headers. */ -#include "vector.h" +#include "feat/feat.h" +#include "util/vector.h" #include "pocketsphinx_internal.h" #include "hmm.h" #ifdef __cplusplus extern "C" { #endif +#if 0 +} +#endif /** * \struct gauden_dist_t * \brief Structure to store distance (density) values for a given input observation wrt density values in some given codebook. */ -typedef struct { +typedef struct gauden_dist_s { int32 id; /**< Index of codeword (gaussian density) */ mfcc_t dist; /**< Density value for input observation wrt above codeword; NOTE: result in logs3 domain, but var_t used for speed */ @@ -79,7 +79,7 @@ typedef struct { * \struct gauden_t * \brief Multivariate gaussian mixture density parameters */ -typedef struct { +typedef struct gauden_s { mfcc_t ****mean; /**< mean[codebook][feature][codeword] vector */ mfcc_t ****var; /**< like mean; diagonal covariance vector only */ mfcc_t ***det; /**< log(determinant) for each variance vector; @@ -109,7 +109,7 @@ gauden_init (char const *meanfile,/**< Input: File containing means of mixture g void gauden_free(gauden_t *g); /**< In: The gauden_t to free */ /** Transform Gaussians according to an MLLR matrix (or, eventually, more). */ -int32 gauden_mllr_transform(gauden_t *s, ps_mllr_t *mllr, cmd_ln_t *config); +int32 gauden_mllr_transform(gauden_t *s, ps_mllr_t *mllr, ps_config_t *config); /** * Compute gaussian density values for the given input observation vector wrt the @@ -144,7 +144,7 @@ void gauden_dump_ind (const gauden_t *g, /**< In: Gaussian distribution g*/ ); #ifdef __cplusplus -} +} /* extern "C" */ #endif #endif /* GAUDEN_H */ diff --git a/src/libpocketsphinx/ms_mgau.c b/src/ms_mgau.c similarity index 90% rename from src/libpocketsphinx/ms_mgau.c rename to src/ms_mgau.c index e0ab20e..64adc06 100644 --- a/src/libpocketsphinx/ms_mgau.c +++ b/src/ms_mgau.c @@ -68,7 +68,6 @@ * */ -/* Local headers. */ #include "ms_mgau.h" static ps_mgaufuncs_t ms_mgau_funcs = { @@ -96,9 +95,9 @@ ms_mgau_init(acmod_t *acmod, logmath_t *lmath, bin_mdef_t *mdef) msg->g = NULL; msg->s = NULL; - if ((g = msg->g = gauden_init(cmd_ln_str_r(config, "_mean"), - cmd_ln_str_r(config, "_var"), - cmd_ln_float32_r(config, "-varfloor"), + if ((g = msg->g = gauden_init(ps_config_str(config, "mean"), + ps_config_str(config, "var"), + ps_config_float(config, "varfloor"), lmath)) == NULL) { E_ERROR("Failed to read means and variances\n"); goto error_out; @@ -111,7 +110,7 @@ ms_mgau_init(acmod_t *acmod, logmath_t *lmath, bin_mdef_t *mdef) goto error_out; } for (i = 0; i < g->n_feat; ++i) { - if (g->featlen[i] != feat_dimension2(acmod->fcb, i)) { + if ((uint32)g->featlen[i] != feat_dimension2(acmod->fcb, i)) { E_ERROR("Dimension of stream %d does not match: %d != %d\n", i, g->featlen[i], feat_dimension2(acmod->fcb, i)); goto error_out; @@ -119,28 +118,28 @@ ms_mgau_init(acmod_t *acmod, logmath_t *lmath, bin_mdef_t *mdef) } s = msg->s = senone_init(msg->g, - cmd_ln_str_r(config, "_mixw"), - cmd_ln_str_r(config, "_senmgau"), - cmd_ln_float32_r(config, "-mixwfloor"), + ps_config_str(config, "mixw"), + ps_config_str(config, "senmgau"), + ps_config_float(config, "mixwfloor"), lmath, mdef); - s->aw = cmd_ln_int32_r(config, "-aw"); + s->aw = ps_config_int(config, "aw"); /* Verify senone parameters against gauden parameters */ - if (s->n_feat != g->n_feat) + if (s->n_feat != (uint32)g->n_feat) E_FATAL("#Feature mismatch: gauden= %d, senone= %d\n", g->n_feat, s->n_feat); - if (s->n_cw != g->n_density) + if (s->n_cw != (uint32)g->n_density) E_FATAL("#Densities mismatch: gauden= %d, senone= %d\n", g->n_density, s->n_cw); - if (s->n_gauden > g->n_mgau) + if (s->n_gauden > (uint32)g->n_mgau) E_FATAL("Senones need more codebooks (%d) than present (%d)\n", s->n_gauden, g->n_mgau); - if (s->n_gauden < g->n_mgau) + if (s->n_gauden < (uint32)g->n_mgau) E_ERROR("Senones use fewer codebooks (%d) than present (%d)\n", s->n_gauden, g->n_mgau); - msg->topn = cmd_ln_int32_r(config, "-topn"); + msg->topn = ps_config_int(config, "topn"); E_INFO("The value of topn: %d\n", msg->topn); if (msg->topn == 0 || msg->topn > msg->g->n_density) { E_WARN @@ -205,6 +204,7 @@ ms_cont_mgau_frame_eval(ps_mgau_t * mg, gauden_t *g; senone_t *sen; + (void)frame; topn = ms_mgau_topn(msg); g = ms_mgau_gauden(msg); sen = ms_mgau_senone(msg); @@ -215,8 +215,8 @@ ms_cont_mgau_frame_eval(ps_mgau_t * mg, for (gid = 0; gid < g->n_mgau; gid++) gauden_dist(g, gid, topn, feat, msg->dist[gid]); - best = (int32) 0x7fffffff; - for (s = 0; s < sen->n_sen; s++) { + best = MAX_INT32; + for (s = 0; (uint32)s < sen->n_sen; s++) { senscr[s] = senone_eval(sen, s, msg->dist[sen->mgau[s]], topn); if (best > senscr[s]) { best = senscr[s]; @@ -224,7 +224,7 @@ ms_cont_mgau_frame_eval(ps_mgau_t * mg, } /* Normalize senone scores */ - for (s = 0; s < sen->n_sen; s++) { + for (s = 0; (uint32)s < sen->n_sen; s++) { int32 bs = senscr[s] - best; if (bs > 32767) bs = 32767; @@ -253,7 +253,7 @@ ms_cont_mgau_frame_eval(ps_mgau_t * mg, gauden_dist(g, gid, topn, feat, msg->dist[gid]); } - best = (int32) 0x7fffffff; + best = MAX_INT32; n = 0; for (i = 0; i < n_senone_active; i++) { int32 s = senone_active[i] + n; diff --git a/src/libpocketsphinx/ms_mgau.h b/src/ms_mgau.h similarity index 96% rename from src/libpocketsphinx/ms_mgau.h rename to src/ms_mgau.h index b018dcc..22ac3a4 100644 --- a/src/libpocketsphinx/ms_mgau.h +++ b/src/ms_mgau.h @@ -96,22 +96,26 @@ #ifndef _LIBFBS_MS_CONT_MGAU_H_ #define _LIBFBS_MS_CONT_MGAU_H_ -/* SphinxBase headers. */ -#include -#include -#include +#include -/* Local headers. */ +#include "feat/feat.h" #include "acmod.h" #include "bin_mdef.h" #include "ms_gauden.h" #include "ms_senone.h" +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + /** \struct ms_mgau_t \brief Multi-stream mixture gaussian. It is not necessary to be continr */ -typedef struct { +typedef struct ms_mgau_model_s { ps_mgau_t base; gauden_t* g; /**< The codebook */ senone_t* s; /**< The senone */ @@ -139,5 +143,8 @@ int32 ms_cont_mgau_frame_eval(ps_mgau_t * msg, int32 ms_mgau_mllr_transform(ps_mgau_t *s, ps_mllr_t *mllr); -#endif /* _LIBFBS_MS_CONT_MGAU_H_*/ +#ifdef __cplusplus +} /* extern "C" */ +#endif +#endif /* _LIBFBS_MS_CONT_MGAU_H_*/ diff --git a/src/libpocketsphinx/ms_senone.c b/src/ms_senone.c similarity index 91% rename from src/libpocketsphinx/ms_senone.c rename to src/ms_senone.c index d92e9ee..32e3ad5 100644 --- a/src/libpocketsphinx/ms_senone.c +++ b/src/ms_senone.c @@ -35,15 +35,11 @@ * */ -/* System headers. */ #include #include #include -/* SphinxBase headers. */ -#include - -/* Local headers. */ +#include "util/bio.h" #include "ms_senone.h" #define MIXW_PARAM_VERSION "1.0" @@ -115,7 +111,7 @@ senone_mgau_map_read(senone_t * s, char const *file_name) /* Infer n_gauden if not present in this version */ if (!n_gauden_present) { s->n_gauden = 1; - for (i = 0; i < s->n_sen; i++) + for (i = 0; (uint32)i < s->n_sen; i++) if (s->mgau[i] >= s->n_gauden) s->n_gauden = s->mgau[i] + 1; } @@ -183,7 +179,7 @@ senone_mixw_read(senone_t * s, char const *file_name, logmath_t *lmath) || (bio_fread(&i, sizeof(int32), 1, fp, byteswap, &chksum) != 1)) { E_FATAL("bio_fread(%s) (arraysize) failed\n", file_name); } - if (i != s->n_sen * s->n_feat * s->n_cw) { + if ((uint32)i != s->n_sen * s->n_feat * s->n_cw) { E_FATAL ("%s: #float32s(%d) doesn't match dimensions: %d x %d x %d\n", file_name, i, s->n_sen, s->n_feat, s->n_cw); @@ -221,12 +217,12 @@ senone_mixw_read(senone_t * s, char const *file_name, logmath_t *lmath) /* Read senone probs data, normalize, floor, convert to logs3, truncate to 8 bits */ n_err = 0; - for (i = 0; i < s->n_sen; i++) { - for (f = 0; f < s->n_feat; f++) { + for (i = 0; (uint32)i < s->n_sen; i++) { + for (f = 0; (uint32)f < s->n_feat; f++) { if (bio_fread ((void *) pdf, sizeof(float32), s->n_cw, fp, byteswap, &chksum) - != s->n_cw) { + != (int32)s->n_cw) { E_FATAL("bio_fread(%s) (arraydata) failed\n", file_name); } @@ -237,7 +233,7 @@ senone_mixw_read(senone_t * s, char const *file_name, logmath_t *lmath) vector_sum_norm(pdf, s->n_cw); /* Convert to logs3, truncate to 8 bits, and store in s->pdf */ - for (c = 0; c < s->n_cw; c++) { + for (c = 0; (uint32)c < s->n_cw; c++) { p = -(logmath_log(lmath, pdf[c])); p += (1 << (SENSCR_SHIFT - 1)) - 1; /* Rounding before truncation */ @@ -294,7 +290,7 @@ senone_init(gauden_t *g, char const *mixwfile, char const *sen2mgau_map_file, else { if (s->n_gauden == 1) sen2mgau_map_file = ".semi."; - else if (s->n_gauden == bin_mdef_n_ciphone(mdef)) + else if (s->n_gauden == (uint32)bin_mdef_n_ciphone(mdef)) sen2mgau_map_file = ".ptm."; else sen2mgau_map_file = ".cont."; @@ -311,7 +307,7 @@ senone_init(gauden_t *g, char const *mixwfile, char const *sen2mgau_map_file, /* All-to-ciphone-id senones-codebook mapping */ E_INFO("Mapping senones to context-independent phone codebooks\n"); s->mgau = (uint32 *) ckd_calloc(s->n_sen, sizeof(*s->mgau)); - for (i = 0; i < s->n_sen; i++) + for (i = 0; (uint32)i < s->n_sen; i++) s->mgau[i] = bin_mdef_sen2cimap(mdef, i); } else if (strcmp(sen2mgau_map_file, ".cont.") == 0 @@ -322,13 +318,13 @@ senone_init(gauden_t *g, char const *mixwfile, char const *sen2mgau_map_file, E_FATAL("#senone=%d; must be >1\n", s->n_sen); s->mgau = (uint32 *) ckd_calloc(s->n_sen, sizeof(*s->mgau)); - for (i = 0; i < s->n_sen; i++) + for (i = 0; (uint32)i < s->n_sen; i++) s->mgau[i] = i; /* Not sure why this is here, it probably does nothing. */ s->n_gauden = s->n_sen; } else { - if (s->n_sen != n) + if (s->n_sen != (uint32)n) E_FATAL("#senones inconsistent: %d in %s; %d in %s\n", n, sen2mgau_map_file, s->n_sen, mixwfile); } @@ -368,36 +364,32 @@ senone_eval(senone_t * s, int id, gauden_dist_t ** dist, int32 n_top) int32 f, t; gauden_dist_t *fdist; - assert((id >= 0) && (id < s->n_sen)); - assert((n_top > 0) && (n_top <= s->n_cw)); + assert((id >= 0) && ((uint32)id < s->n_sen)); + assert((n_top > 0) && ((uint32)n_top <= s->n_cw)); scr = 0; - for (f = 0; f < s->n_feat; f++) { -#ifdef SPHINX_DEBUG - int top; -#endif + for (f = 0; (uint32)f < s->n_feat; f++) { fdist = dist[f]; - /* Top codeword for feature f */ -#ifdef SPHINX_DEBUG - top = -#endif - fden = ((int32)fdist[0].dist + ((1<> SENSCR_SHIFT; + if (fdist[0].dist < (mfcc_t)MAX_NEG_INT32) + fden = MAX_NEG_INT32 >> SENSCR_SHIFT; + else + fden = ((int32)fdist[0].dist + ((1<> SENSCR_SHIFT; fscr = (s->n_gauden > 1) ? (fden + -s->pdf[id][f][fdist[0].id]) /* untransposed */ : (fden + -s->pdf[f][fdist[0].id][id]); /* transposed */ - E_DEBUG(1, ("fden[%d][%d] l+= %d + %d = %d\n", - id, f, -(fscr - fden), -(fden-top), -(fscr-top))); /* Remaining of n_top codewords for feature f */ for (t = 1; t < n_top; t++) { - fden = ((int32)fdist[t].dist + ((1<> SENSCR_SHIFT; + if (fdist[t].dist < (mfcc_t)MAX_NEG_INT32) + fden = MAX_NEG_INT32 >> SENSCR_SHIFT; + else + fden = ((int32)fdist[t].dist + ((1<> SENSCR_SHIFT; + fwscr = (s->n_gauden > 1) ? (fden + -s->pdf[id][f][fdist[t].id]) : (fden + -s->pdf[f][fdist[t].id][id]); fscr = logmath_add(s->lmath, fscr, fwscr); - E_DEBUG(1, ("fden[%d][%d] l+= %d + %d = %d\n", - id, f, -(fwscr - fden), -(fden-top), -(fscr-top))); } /* Senone scores are also scaled, negated logs3 values. Hence * we have to negate the stuff we calculated above. */ diff --git a/src/libpocketsphinx/ms_senone.h b/src/ms_senone.h similarity index 92% rename from src/libpocketsphinx/ms_senone.h rename to src/ms_senone.h index d92b638..6420390 100644 --- a/src/libpocketsphinx/ms_senone.h +++ b/src/ms_senone.h @@ -41,14 +41,8 @@ #ifndef _MS_SENONE_H_ #define _MS_SENONE_H_ +#include -/* SphinxBase headers. */ -#include -#include -#include -#include - -/* Local headers. */ #include "ms_gauden.h" #include "bin_mdef.h" @@ -63,6 +57,9 @@ #ifdef __cplusplus extern "C" { #endif +#if 0 +} +#endif typedef uint8 senprob_t; /**< Senone logs3-probs, truncated to 8 bits */ @@ -73,7 +70,7 @@ typedef uint8 senprob_t; /**< Senone logs3-probs, truncated to 8 bits */ * 8-bit senone PDF structure. Senone pdf values are normalized, floored, converted to * logs3 domain, and finally truncated to 8 bits precision to conserve memory space. */ -typedef struct { +typedef struct senone_s { senprob_t ***pdf; /**< gaussian density mixture weights, organized two possible ways depending on n_gauden: if (n_gauden > 1): pdf[sen][feat][codeword]. Not an @@ -101,9 +98,10 @@ typedef struct { */ senone_t *senone_init (gauden_t *g, /**< In: codebooks */ char const *mixwfile, /**< In: mixing weights file */ - char const *mgau_mapfile,/**< In: file specifying mapping from each - senone to mixture gaussian codebook. - If NULL all senones map to codebook 0 */ + char const *mgau_mapfile,/**< In: file or magic string specifying + mapping from each senone to mixture + gaussian codebook. + If NULL divine it from gauden_t */ float32 mixwfloor, /**< In: Floor value for senone weights */ logmath_t *lmath, /**< In: log math computation */ bin_mdef_t *mdef /**< In: model definition */ @@ -125,7 +123,7 @@ int32 senone_eval (senone_t *s, int id, /**< In: senone for which score desired ); #ifdef __cplusplus -} +} /* extern "C" */ #endif #endif diff --git a/src/libpocketsphinx/ngram_search.c b/src/ngram_search.c similarity index 93% rename from src/libpocketsphinx/ngram_search.c rename to src/ngram_search.c index 3a896fc..f6f4020 100644 --- a/src/libpocketsphinx/ngram_search.c +++ b/src/ngram_search.c @@ -39,16 +39,11 @@ * @file ngram_search.c N-Gram based multi-pass search ("FBS") */ -/* System headers. */ #include #include -/* SphinxBase headers. */ -#include -#include -#include - -/* Local headers. */ +#include "util/ckd_alloc.h" +#include "util/listelem_alloc.h" #include "pocketsphinx_internal.h" #include "ps_lattice_internal.h" #include "ngram_search.h" @@ -103,37 +98,37 @@ ngram_search_calc_beams(ngram_search_t *ngs) acmod = ps_search_acmod(ngs); /* Log beam widths. */ - ngs->beam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-beam"))>>SENSCR_SHIFT; - ngs->wbeam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-wbeam"))>>SENSCR_SHIFT; - ngs->pbeam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-pbeam"))>>SENSCR_SHIFT; - ngs->lpbeam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-lpbeam"))>>SENSCR_SHIFT; - ngs->lponlybeam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-lponlybeam"))>>SENSCR_SHIFT; - ngs->fwdflatbeam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-fwdflatbeam"))>>SENSCR_SHIFT; - ngs->fwdflatwbeam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-fwdflatwbeam"))>>SENSCR_SHIFT; + ngs->beam = logmath_log(acmod->lmath, ps_config_float(config, "beam"))>>SENSCR_SHIFT; + ngs->wbeam = logmath_log(acmod->lmath, ps_config_float(config, "wbeam"))>>SENSCR_SHIFT; + ngs->pbeam = logmath_log(acmod->lmath, ps_config_float(config, "pbeam"))>>SENSCR_SHIFT; + ngs->lpbeam = logmath_log(acmod->lmath, ps_config_float(config, "lpbeam"))>>SENSCR_SHIFT; + ngs->lponlybeam = logmath_log(acmod->lmath, ps_config_float(config, "lponlybeam"))>>SENSCR_SHIFT; + ngs->fwdflatbeam = logmath_log(acmod->lmath, ps_config_float(config, "fwdflatbeam"))>>SENSCR_SHIFT; + ngs->fwdflatwbeam = logmath_log(acmod->lmath, ps_config_float(config, "fwdflatwbeam"))>>SENSCR_SHIFT; /* Absolute pruning parameters. */ - ngs->maxwpf = cmd_ln_int32_r(config, "-maxwpf"); - ngs->maxhmmpf = cmd_ln_int32_r(config, "-maxhmmpf"); + ngs->maxwpf = ps_config_int(config, "maxwpf"); + ngs->maxhmmpf = ps_config_int(config, "maxhmmpf"); /* Various penalties which may or may not be useful. */ - ngs->wip = logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-wip")) >>SENSCR_SHIFT; - ngs->nwpen = logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-nwpen")) >>SENSCR_SHIFT; - ngs->pip = logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-pip")) >>SENSCR_SHIFT; + ngs->wip = logmath_log(acmod->lmath, ps_config_float(config, "wip")) >>SENSCR_SHIFT; + ngs->nwpen = logmath_log(acmod->lmath, ps_config_float(config, "nwpen")) >>SENSCR_SHIFT; + ngs->pip = logmath_log(acmod->lmath, ps_config_float(config, "pip")) >>SENSCR_SHIFT; ngs->silpen = ngs->pip - + (logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-silprob"))>>SENSCR_SHIFT); + + (logmath_log(acmod->lmath, ps_config_float(config, "silprob"))>>SENSCR_SHIFT); ngs->fillpen = ngs->pip - + (logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-fillprob"))>>SENSCR_SHIFT); + + (logmath_log(acmod->lmath, ps_config_float(config, "fillprob"))>>SENSCR_SHIFT); /* Language weight ratios for fwdflat and bestpath search. */ ngs->fwdflat_fwdtree_lw_ratio = - cmd_ln_float32_r(config, "-fwdflatlw") - / cmd_ln_float32_r(config, "-lw"); + ps_config_float(config, "fwdflatlw") + / ps_config_float(config, "lw"); ngs->bestpath_fwdtree_lw_ratio = - cmd_ln_float32_r(config, "-bestpathlw") - / cmd_ln_float32_r(config, "-lw"); + ps_config_float(config, "bestpathlw") + / ps_config_float(config, "lw"); /* Acoustic score scale for posterior probabilities. */ - ngs->ascale = 1.0 / cmd_ln_float32_r(config, "-ascale"); + ngs->ascale = 1.0 / ps_config_float(config, "ascale"); } ps_search_t * @@ -149,8 +144,8 @@ ngram_search_init(const char *name, /* Make the acmod's feature buffer growable if we are doing two-pass * search. */ - acmod_set_grow(acmod, cmd_ln_boolean_r(config, "-fwdflat") && - cmd_ln_boolean_r(config, "-fwdtree")); + acmod_set_grow(acmod, ps_config_bool(config, "fwdflat") && + ps_config_bool(config, "fwdtree")); ngs = ckd_calloc(1, sizeof(*ngs)); ps_search_init(&ngs->base, &ngram_funcs, PS_SEARCH_TYPE_NGRAM, name, config, acmod, dict, d2p); @@ -179,7 +174,7 @@ ngram_search_init(const char *name, /* FIXME: All these structures need to be made dynamic with * garbage collection. */ - ngs->bp_table_size = cmd_ln_int32_r(config, "-latsize"); + ngs->bp_table_size = ps_config_int(config, "latsize"); ngs->bp_table = ckd_calloc(ngs->bp_table_size, sizeof(*ngs->bp_table)); /* FIXME: This thing is frickin' huge. */ @@ -211,19 +206,19 @@ ngram_search_init(const char *name, ngram_search_update_widmap(ngs); /* Initialize fwdtree, fwdflat, bestpath modules if necessary. */ - if (cmd_ln_boolean_r(config, "-fwdtree")) { + if (ps_config_bool(config, "fwdtree")) { ngram_fwdtree_init(ngs); ngs->fwdtree = TRUE; ngs->fwdtree_perf.name = "fwdtree"; ptmr_init(&ngs->fwdtree_perf); } - if (cmd_ln_boolean_r(config, "-fwdflat")) { + if (ps_config_bool(config, "fwdflat")) { ngram_fwdflat_init(ngs); ngs->fwdflat = TRUE; ngs->fwdflat_perf.name = "fwdflat"; ptmr_init(&ngs->fwdflat_perf); } - if (cmd_ln_boolean_r(config, "-bestpath")) { + if (ps_config_bool(config, "bestpath")) { ngs->bestpath = TRUE; ngs->bestpath_perf.name = "bestpath"; ptmr_init(&ngs->bestpath_perf); @@ -296,7 +291,7 @@ ngram_search_free(ps_search_t *search) ngram_fwdflat_deinit(ngs); if (ngs->bestpath) { double n_speech = (double)ngs->n_tot_frame - / cmd_ln_int32_r(ps_search_config(ngs), "-frate"); + / ps_config_int(ps_search_config(ngs), "frate"); E_INFO("TOTAL bestpath %.2f CPU %.3f xRT\n", ngs->bestpath_perf.t_tot_cpu, @@ -406,8 +401,8 @@ ngram_search_save_bp(ngram_search_t *ngs, int frame_idx, /* But, sometimes, the history *is* lost. If we wanted to * do exact language model scoring we'd have to preserve * these alternate histories. */ - E_DEBUG(2,("Updating path history %d => %d frame %d\n", - ngs->bp_table[bp].bp, path, frame_idx)); + E_DEBUG("Updating path history %d => %d frame %d\n", + ngs->bp_table[bp].bp, path, frame_idx); bplh[0] = ngs->bp_table[bp].bp == -1 ? -1 : ngs->bp_table[ngs->bp_table[bp].bp].prev_real_wid; bplh[1] = ngs->bp_table[bp].bp == -1 @@ -422,12 +417,12 @@ ngram_search_save_bp(ngram_search_t *ngs, int frame_idx, /* It's fairly rare that the actual language model * state changes, but it does happen some * times. */ - E_DEBUG(1, ("Updating language model state %s,%s => %s,%s frame %d\n", + E_DEBUG("Updating language model state %s,%s => %s,%s frame %d\n", dict_wordstr(ps_search_dict(ngs), bplh[0]), dict_wordstr(ps_search_dict(ngs), bplh[1]), dict_wordstr(ps_search_dict(ngs), newlh[0]), dict_wordstr(ps_search_dict(ngs), newlh[1]), - frame_idx)); + frame_idx); set_real_wid(ngs, bp); } ngs->bp_table[bp].bp = path; @@ -618,10 +613,10 @@ ngram_search_alloc_all_rc(ngram_search_t *ngs, int32 w) hmm->info.rc_id = 0; hmm->ciphone = ciphone; hmm_init(ngs->hmmctx, &hmm->hmm, FALSE, rssid->ssid[0], tmatid); - E_DEBUG(3,("allocated rc_id 0 ssid %d ciphone %d lc %d word %s\n", - rssid->ssid[0], hmm->ciphone, - dict_second_last_phone(ps_search_dict(ngs),w), - dict_wordstr(ps_search_dict(ngs),w))); + E_DEBUG("allocated rc_id 0 ssid %d ciphone %d lc %d word %s\n", + rssid->ssid[0], hmm->ciphone, + dict_second_last_phone(ps_search_dict(ngs),w), + dict_wordstr(ps_search_dict(ngs),w)); } for (i = 1; i < rssid->n_ssid; ++i) { if ((hmm->next == NULL) || (hmm_nonmpx_ssid(&hmm->next->hmm) != rssid->ssid[i])) { @@ -633,10 +628,10 @@ ngram_search_alloc_all_rc(ngram_search_t *ngs, int32 w) hmm->info.rc_id = i; hmm->ciphone = ciphone; hmm_init(ngs->hmmctx, &hmm->hmm, FALSE, rssid->ssid[i], tmatid); - E_DEBUG(3,("allocated rc_id %d ssid %d ciphone %d lc %d word %s\n", - i, rssid->ssid[i], hmm->ciphone, - dict_second_last_phone(ps_search_dict(ngs),w), - dict_wordstr(ps_search_dict(ngs),w))); + E_DEBUG("allocated rc_id %d ssid %d ciphone %d lc %d word %s\n", + i, rssid->ssid[i], hmm->ciphone, + dict_second_last_phone(ps_search_dict(ngs),w), + dict_wordstr(ps_search_dict(ngs),w)); } else hmm = hmm->next; @@ -828,6 +823,7 @@ ngram_search_bestpath(ps_search_t *search, int32 *out_score, int backward) { ngram_search_t *ngs = (ngram_search_t *)search; + (void)backward; if (search->last_link == NULL) { search->last_link = ps_lattice_bestpath(search->dag, ngs->lmset, ngs->bestpath_fwdtree_lw_ratio, @@ -866,7 +862,7 @@ ngram_search_hyp(ps_search_t *search, int32 *out_score) hyp = ps_lattice_hyp(dag, link); ptmr_stop(&ngs->bestpath_perf); n_speech = (double)dag->n_frames - / cmd_ln_int32_r(ps_search_config(ngs), "-frate"); + / ps_config_int(ps_search_config(ngs), "frate"); E_INFO("bestpath %.2f CPU %.3f xRT\n", ngs->bestpath_perf.t_cpu, ngs->bestpath_perf.t_cpu / n_speech); @@ -895,7 +891,8 @@ ngram_search_bp2itor(ps_seg_t *seg, int bp) be = &ngs->bp_table[bp]; pbe = be->bp == -1 ? NULL : &ngs->bp_table[be->bp]; - seg->word = dict_wordstr(ps_search_dict(ngs), be->wid); + seg->text = dict_wordstr(ps_search_dict(ngs), be->wid); + seg->wid = be->wid; seg->ef = be->frame; seg->sf = pbe ? pbe->frame + 1 : 0; seg->prob = 0; /* Bogus value... */ @@ -1021,7 +1018,7 @@ ngram_search_seg_iter(ps_search_t *search) ngs->bestpath_fwdtree_lw_ratio); ptmr_stop(&ngs->bestpath_perf); n_speech = (double)dag->n_frames - / cmd_ln_int32_r(ps_search_config(ngs), "-frate"); + / ps_config_int(ps_search_config(ngs), "frate"); E_INFO("bestpath %.2f CPU %.3f xRT\n", ngs->bestpath_perf.t_cpu, ngs->bestpath_perf.t_cpu / n_speech); @@ -1222,7 +1219,7 @@ ngram_search_lattice(ps_search_t *search) float lwf; ngs = (ngram_search_t *)search; - min_endfr = cmd_ln_int32_r(ps_search_config(search), "-min_endfr"); + min_endfr = ps_config_int(ps_search_config(search), "min_endfr"); /* If the best score is WORST_SCORE or worse, there is no way to * make a lattice. */ diff --git a/src/libpocketsphinx/ngram_search.h b/src/ngram_search.h similarity index 97% rename from src/libpocketsphinx/ngram_search.h rename to src/ngram_search.h index fe0a98d..c00f782 100644 --- a/src/libpocketsphinx/ngram_search.h +++ b/src/ngram_search.h @@ -42,17 +42,20 @@ #ifndef __NGRAM_SEARCH_H__ #define __NGRAM_SEARCH_H__ -/* SphinxBase headers. */ -#include -#include -#include -#include -#include - -/* Local headers. */ +#include + +#include "lm/ngram_model.h" +#include "util/listelem_alloc.h" #include "pocketsphinx_internal.h" #include "hmm.h" +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + /** * Lexical tree node data type. * @@ -148,14 +151,14 @@ typedef struct lastphn_cand_s { * just the first time and cache it for future occurrences. Structure for such * a cache. */ -typedef struct { +typedef struct last_ltrans_s { int32 sf; /* Start frame */ int32 dscr; /* Delta-score upon entering last phone */ int32 bp; /* Best BP */ } last_ltrans_t; #define CAND_SF_ALLOCSIZE 32 -typedef struct { +typedef struct cand_sf_s { int32 bp_ef; int32 cand; } cand_sf_t; @@ -204,7 +207,7 @@ struct ngram_search_s { uint8 fwdflat; uint8 bestpath; - /* State of procesing. */ + /* State of processing. */ uint8 done; /* Allocators */ @@ -218,7 +221,7 @@ struct ngram_search_s { * The word triphone sequences (HMM instances) are transformed * into tree structures, one tree per unique left triphone in the * entire dictionary (actually diphone, since its left context - * varies dyamically during the search process). The entire set + * varies dynamically during the search process). The entire set * of trees of channels is allocated once and for all during * initialization (since dynamic management of active CHANs is * time consuming), with one exception: the last phones of words, @@ -431,4 +434,8 @@ int32 ngram_search_exit_score(ngram_search_t *ngs, bptbl_t *pbe, int rcphone); */ void ngram_search_set_lm(ngram_model_t *lm); +#ifdef __cplusplus +} /* extern "C" */ +#endif + #endif /* __NGRAM_SEARCH_H__ */ diff --git a/src/libpocketsphinx/ngram_search_fwdflat.c b/src/ngram_search_fwdflat.c similarity index 97% rename from src/libpocketsphinx/ngram_search_fwdflat.c rename to src/ngram_search_fwdflat.c index d094722..34e7664 100644 --- a/src/libpocketsphinx/ngram_search_fwdflat.c +++ b/src/ngram_search_fwdflat.c @@ -39,16 +39,13 @@ * @file ngram_search_fwdflat.c Flat lexicon search. */ -/* System headers. */ #include #include -/* SphinxBase headers. */ -#include -#include -#include +#include -/* Local headers. */ +#include "util/ckd_alloc.h" +#include "util/listelem_alloc.h" #include "ngram_search.h" #include "ps_lattice_internal.h" @@ -151,8 +148,8 @@ ngram_fwdflat_init(ngram_search_t *ngs) ngs->expand_word_flag = bitvec_alloc(n_words); ngs->expand_word_list = ckd_calloc(n_words + 1, sizeof(*ngs->expand_word_list)); ngs->frm_wordlist = ckd_calloc(ngs->n_frame_alloc, sizeof(*ngs->frm_wordlist)); - ngs->min_ef_width = cmd_ln_int32_r(ps_search_config(ngs), "-fwdflatefwid"); - ngs->max_sf_win = cmd_ln_int32_r(ps_search_config(ngs), "-fwdflatsfwin"); + ngs->min_ef_width = ps_config_int(ps_search_config(ngs), "fwdflatefwid"); + ngs->max_sf_win = ps_config_int(ps_search_config(ngs), "fwdflatsfwin"); E_INFO("fwdflat: min_ef_width = %d, max_sf_win = %d\n", ngs->min_ef_width, ngs->max_sf_win); @@ -169,7 +166,7 @@ void ngram_fwdflat_deinit(ngram_search_t *ngs) { double n_speech = (double)ngs->n_tot_frame - / cmd_ln_int32_r(ps_search_config(ngs), "-frate"); + / ps_config_int(ps_search_config(ngs), "frate"); E_INFO("TOTAL fwdflat %.2f CPU %.3f xRT\n", ngs->fwdflat_perf.t_tot_cpu, @@ -499,7 +496,7 @@ fwdflat_prune_chan(ngram_search_t *ngs, int frame_idx) thresh = ngs->best_score + ngs->fwdflatbeam; wordthresh = ngs->best_score + ngs->fwdflatwbeam; pip = ngs->pip; - E_DEBUG(3,("frame %d thresh %d wordthresh %d\n", frame_idx, thresh, wordthresh)); + E_DEBUG("frame %d thresh %d wordthresh %d\n", frame_idx, thresh, wordthresh); /* Scan all active words. */ for (i = 0; i < nw; i++) { @@ -721,9 +718,9 @@ fwdflat_word_transition(ngram_search_t *ngs, int frame_idx) dict2pid_ldiph_lc(d2p, rhmm->ciphone, rhmm->ci2phone, dict_last_phone(dict, bp->wid)); assert(IS_S3SSID(hmm_mpx_ssid(&rhmm->hmm, 0))); - E_DEBUG(6,("ssid %d(%d,%d) = %d\n", - rhmm->ciphone, dict_last_phone(dict, bp->wid), rhmm->ci2phone, - hmm_mpx_ssid(&rhmm->hmm, 0))); + E_DEBUG("ssid %d(%d,%d) = %d\n", + rhmm->ciphone, dict_last_phone(dict, bp->wid), rhmm->ci2phone, + hmm_mpx_ssid(&rhmm->hmm, 0)); bitvec_set(ngs->word_active, w); } } @@ -943,7 +940,7 @@ ngram_fwdflat_finish(ngram_search_t *ngs) /* Print out some statistics. */ if (cf > 0) { double n_speech = (double)(cf + 1) - / cmd_ln_int32_r(ps_search_config(ngs), "-frate"); + / ps_config_int(ps_search_config(ngs), "frate"); E_INFO("%8d words recognized (%d/fr)\n", ngs->bpidx, (ngs->bpidx + (cf >> 1)) / (cf + 1)); E_INFO("%8d senones evaluated (%d/fr)\n", ngs->st.n_senone_active_utt, diff --git a/src/libpocketsphinx/ngram_search_fwdflat.h b/src/ngram_search_fwdflat.h similarity index 96% rename from src/libpocketsphinx/ngram_search_fwdflat.h rename to src/ngram_search_fwdflat.h index 026b397..417f630 100644 --- a/src/libpocketsphinx/ngram_search_fwdflat.h +++ b/src/ngram_search_fwdflat.h @@ -42,11 +42,15 @@ #ifndef __NGRAM_SEARCH_FWDFLAT_H__ #define __NGRAM_SEARCH_FWDFLAT_H__ -/* SphinxBase headers. */ - -/* Local headers. */ #include "ngram_search.h" +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + /** * Initialize N-Gram search for fwdflat decoding. */ @@ -77,5 +81,8 @@ int ngram_fwdflat_search(ngram_search_t *ngs, int frame_idx); */ void ngram_fwdflat_finish(ngram_search_t *ngs); +#ifdef __cplusplus +} /* extern "C" */ +#endif #endif /* __NGRAM_SEARCH_FWDFLAT_H__ */ diff --git a/src/libpocketsphinx/ngram_search_fwdtree.c b/src/ngram_search_fwdtree.c similarity index 96% rename from src/libpocketsphinx/ngram_search_fwdtree.c rename to src/ngram_search_fwdtree.c index c1a9fd9..586cf05 100644 --- a/src/libpocketsphinx/ngram_search_fwdtree.c +++ b/src/ngram_search_fwdtree.c @@ -39,14 +39,13 @@ * @file ngram_search_fwdtree.c Lexicon tree search. */ -/* System headers. */ #include #include -/* SphinxBase headers. */ -#include -#include -#include +#include + +#include "util/ckd_alloc.h" +#include "util/listelem_alloc.h" /* Local headers. */ #include "ngram_search_fwdtree.h" @@ -201,8 +200,8 @@ create_search_channels(ngram_search_t *ngs) /* Handle single-phone words individually; not in channel tree */ if (dict_is_single_phone(dict, w)) { - E_DEBUG(1,("single_phone_wid[%d] = %s\n", - ngs->n_1ph_LMwords, dict_wordstr(dict, w))); + E_DEBUG("single_phone_wid[%d] = %s\n", + ngs->n_1ph_LMwords, dict_wordstr(dict, w)); ngs->single_phone_wid[ngs->n_1ph_LMwords++] = w; continue; } @@ -229,7 +228,7 @@ create_search_channels(ngram_search_t *ngs) else rhmm = &(ngs->root_chan[i]); - E_DEBUG(3,("word %s rhmm %d\n", dict_wordstr(dict, w), rhmm - ngs->root_chan)); + E_DEBUG("word %s rhmm %d\n", dict_wordstr(dict, w), rhmm - ngs->root_chan); /* Now, rhmm = root channel for w. Go on to remaining phones */ if (dict_pronlen(dict, w) == 2) { /* Next phone is the last; not kept in tree; add w to penult_phn_wid set */ @@ -261,9 +260,9 @@ create_search_channels(ngram_search_t *ngs) ngs->n_nonroot_chan++; } } - E_DEBUG(3,("phone %s = %d\n", + E_DEBUG("phone %s = %d\n", bin_mdef_ciphone_str(ps_search_acmod(ngs)->mdef, - dict_second_phone(dict, w)), ph)); + dict_second_phone(dict, w)), ph); for (p = 2; p < dict_pronlen(dict, w) - 1; p++) { ph = dict2pid_internal(d2p, w, p); tmatid = bin_mdef_pid2tmatid(ps_search_acmod(ngs)->mdef, dict_pron(dict, w, p)); @@ -285,9 +284,9 @@ create_search_channels(ngram_search_t *ngs) ngs->n_nonroot_chan++; } } - E_DEBUG(3,("phone %s = %d\n", - bin_mdef_ciphone_str(ps_search_acmod(ngs)->mdef, - dict_pron(dict, w, p)), ph)); + E_DEBUG("phone %s = %d\n", + bin_mdef_ciphone_str(ps_search_acmod(ngs)->mdef, + dict_pron(dict, w, p)), ph); } /* All but last phone of w in tree; add w to hmm->info.penult_phn_wid set */ @@ -312,8 +311,8 @@ create_search_channels(ngram_search_t *ngs) continue; if (ngram_model_set_known_wid(ngs->lmset, dict_basewid(dict, w))) continue; - E_DEBUG(1,("single_phone_wid[%d] = %s\n", - ngs->n_1ph_words, dict_wordstr(dict, w))); + E_DEBUG("single_phone_wid[%d] = %s\n", + ngs->n_1ph_words, dict_wordstr(dict, w)); ngs->single_phone_wid[ngs->n_1ph_words++] = w; } @@ -422,7 +421,7 @@ void ngram_fwdtree_deinit(ngram_search_t *ngs) { double n_speech = (double)ngs->n_tot_frame - / cmd_ln_int32_r(ps_search_config(ngs), "-frate"); + / ps_config_int(ps_search_config(ngs), "frate"); E_INFO("TOTAL fwdtree %.2f CPU %.3f xRT\n", ngs->fwdtree_perf.t_tot_cpu, @@ -739,15 +738,15 @@ prune_root_chan(ngram_search_t *ngs, int frame_idx) pls = (phone_loop_search_t *)ps_search_lookahead(ngs); for (i = 0, rhmm = ngs->root_chan; i < ngs->n_root_chan; i++, rhmm++) { - E_DEBUG(3,("Root channel %d frame %d score %d thresh %d\n", - i, hmm_frame(&rhmm->hmm), hmm_bestscore(&rhmm->hmm), thresh)); + E_DEBUG("Root channel %d frame %d score %d thresh %d\n", + i, hmm_frame(&rhmm->hmm), hmm_bestscore(&rhmm->hmm), thresh); /* First check if this channel was active in current frame */ if (hmm_frame(&rhmm->hmm) < frame_idx) continue; if (hmm_bestscore(&rhmm->hmm) BETTER_THAN thresh) { hmm_frame(&rhmm->hmm) = nf; /* rhmm will be active in next frame */ - E_DEBUG(3,("Preserving root channel %d score %d\n", i, hmm_bestscore(&rhmm->hmm))); + E_DEBUG("Preserving root channel %d score %d\n", i, hmm_bestscore(&rhmm->hmm)); /* transitions out of this root channel */ /* transition to all next-level channels in the HMM tree */ newphone_score = hmm_out_score(&rhmm->hmm) + ngs->pip; @@ -777,7 +776,7 @@ prune_root_chan(ngram_search_t *ngs, int frame_idx) int32 pl_newphone_score = newphone_score + phone_loop_search_score (pls, dict_last_phone(ps_search_dict(ngs),w)); - E_DEBUG(3,("word %s newphone_score %d\n", dict_wordstr(ps_search_dict(ngs), w), newphone_score)); + E_DEBUG("word %s newphone_score %d\n", dict_wordstr(ps_search_dict(ngs), w), newphone_score); if (pl_newphone_score BETTER_THAN lastphn_thresh) { candp = ngs->lastphn_cand + ngs->n_lastphn_cand; ngs->n_lastphn_cand++; @@ -1104,10 +1103,10 @@ prune_word_chan(ngram_search_t *ngs, int frame_idx) for (i = 0; i < ngs->n_1ph_words; i++) { w = ngs->single_phone_wid[i]; rhmm = (root_chan_t *) ngs->word_chan[w]; - E_DEBUG(3,("Single phone word %s frame %d score %d thresh %d outscore %d nwthresh %d\n", - dict_wordstr(ps_search_dict(ngs),w), - hmm_frame(&rhmm->hmm), hmm_bestscore(&rhmm->hmm), - lastphn_thresh, hmm_out_score(&rhmm->hmm), newword_thresh)); + E_DEBUG("Single phone word %s frame %d score %d thresh %d outscore %d nwthresh %d\n", + dict_wordstr(ps_search_dict(ngs),w), + hmm_frame(&rhmm->hmm), hmm_bestscore(&rhmm->hmm), + lastphn_thresh, hmm_out_score(&rhmm->hmm), newword_thresh); if (hmm_frame(&rhmm->hmm) < frame_idx) continue; if (hmm_bestscore(&rhmm->hmm) BETTER_THAN lastphn_thresh) { @@ -1115,10 +1114,10 @@ prune_word_chan(ngram_search_t *ngs, int frame_idx) /* Could if ((! skip_alt_frm) || (frame_idx & 0x1)) the following */ if (hmm_out_score(&rhmm->hmm) BETTER_THAN newword_thresh) { - E_DEBUG(4,("Exiting single phone word %s with %d > %d, %d\n", - dict_wordstr(ps_search_dict(ngs),w), - hmm_out_score(&rhmm->hmm), - lastphn_thresh, newword_thresh)); + E_DEBUG("Exiting single phone word %s with %d > %d, %d\n", + dict_wordstr(ps_search_dict(ngs),w), + hmm_out_score(&rhmm->hmm), + lastphn_thresh, newword_thresh); ngram_search_save_bp(ngs, frame_idx, w, hmm_out_score(&rhmm->hmm), hmm_out_history(&rhmm->hmm), 0); @@ -1197,7 +1196,7 @@ bptable_maxwpf(ngram_search_t *ngs, int frame_idx) return; /* Allow only one filler word exit (the best) per frame */ - bestscr = (int32) 0x80000000; + bestscr = MAX_NEG_INT32; bestbpe = NULL; n = 0; for (bp = ngs->bp_table_idx[frame_idx]; bp < ngs->bpidx; bp++) { @@ -1222,7 +1221,7 @@ bptable_maxwpf(ngram_search_t *ngs, int frame_idx) - ngs->bp_table_idx[frame_idx]) - n; /* No. of entries after limiting fillers */ for (; n > ngs->maxwpf; --n) { /* Find worst BPTable entry */ - worstscr = (int32) 0x7fffffff; + worstscr = MAX_INT32; worstbpe = NULL; for (bp = ngs->bp_table_idx[frame_idx]; (bp < ngs->bpidx); bp++) { bpe = &(ngs->bp_table[bp]); @@ -1278,8 +1277,8 @@ word_transition(ngram_search_t *ngs, int frame_idx) /* No right context expansion. */ for (rc = 0; rc < bin_mdef_n_ciphone(ps_search_acmod(ngs)->mdef); ++rc) { if (bpe->score BETTER_THAN ngs->bestbp_rc[rc].score) { - E_DEBUG(4,("bestbp_rc[0] = %d lc %d\n", - bpe->score, bpe->last_phone)); + E_DEBUG("bestbp_rc[0] = %d lc %d\n", + bpe->score, bpe->last_phone); ngs->bestbp_rc[rc].score = bpe->score; ngs->bestbp_rc[rc].path = bp; ngs->bestbp_rc[rc].lc = bpe->last_phone; @@ -1291,8 +1290,8 @@ word_transition(ngram_search_t *ngs, int frame_idx) int32 *rcss = &(ngs->bscore_stack[bpe->s_idx]); for (rc = 0; rc < bin_mdef_n_ciphone(ps_search_acmod(ngs)->mdef); ++rc) { if (rcss[rssid->cimap[rc]] BETTER_THAN ngs->bestbp_rc[rc].score) { - E_DEBUG(4,("bestbp_rc[%d] = %d lc %d\n", - rc, rcss[rssid->cimap[rc]], bpe->last_phone)); + E_DEBUG("bestbp_rc[%d] = %d lc %d\n", + rc, rcss[rssid->cimap[rc]], bpe->last_phone); ngs->bestbp_rc[rc].score = rcss[rssid->cimap[rc]]; ngs->bestbp_rc[rc].path = bp; ngs->bestbp_rc[rc].lc = bpe->last_phone; @@ -1335,7 +1334,7 @@ word_transition(ngram_search_t *ngs, int frame_idx) */ for (i = 0; i < ngs->n_1ph_LMwords; i++) { w = ngs->single_phone_wid[i]; - ngs->last_ltrans[w].dscr = (int32) 0x80000000; + ngs->last_ltrans[w].dscr = MAX_NEG_INT32; } for (bp = ngs->bp_table_idx[frame_idx]; bp < ngs->bpidx; bp++) { bpe = &(ngs->bp_table[bp]); @@ -1347,8 +1346,8 @@ word_transition(ngram_search_t *ngs, int frame_idx) w = ngs->single_phone_wid[i]; newscore = ngram_search_exit_score (ngs, bpe, dict_first_phone(dict, w)); - E_DEBUG(4, ("initial newscore for %s: %d\n", - dict_wordstr(dict, w), newscore)); + E_DEBUG("initial newscore for %s: %d\n", + dict_wordstr(dict, w), newscore); if (newscore != WORST_SCORE) newscore += ngram_tg_score(ngs->lmset, dict_basewid(dict, w), @@ -1545,7 +1544,7 @@ ngram_fwdtree_finish(ngram_search_t *ngs) /* Print out some statistics. */ if (cf > 0) { double n_speech = (double)(cf + 1) - / cmd_ln_int32_r(ps_search_config(ngs), "-frate"); + / ps_config_int(ps_search_config(ngs), "frate"); E_INFO("%8d words recognized (%d/fr)\n", ngs->bpidx, (ngs->bpidx + (cf >> 1)) / (cf + 1)); E_INFO("%8d senones evaluated (%d/fr)\n", ngs->st.n_senone_active_utt, diff --git a/src/libpocketsphinx/ngram_search_fwdtree.h b/src/ngram_search_fwdtree.h similarity index 96% rename from src/libpocketsphinx/ngram_search_fwdtree.h rename to src/ngram_search_fwdtree.h index 8063ab7..d373fbe 100644 --- a/src/libpocketsphinx/ngram_search_fwdtree.h +++ b/src/ngram_search_fwdtree.h @@ -42,11 +42,15 @@ #ifndef __NGRAM_SEARCH_FWDTREE_H__ #define __NGRAM_SEARCH_FWDTREE_H__ -/* SphinxBase headers. */ - -/* Local headers. */ #include "ngram_search.h" +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + /** * Initialize N-Gram search for fwdtree decoding. */ @@ -79,5 +83,8 @@ int ngram_fwdtree_search(ngram_search_t *ngs, int frame_idx); */ void ngram_fwdtree_finish(ngram_search_t *ngs); +#ifdef __cplusplus +} /* extern "C" */ +#endif #endif /* __NGRAM_SEARCH_FWDTREE_H__ */ diff --git a/src/libpocketsphinx/phone_loop_search.c b/src/phone_loop_search.c similarity index 95% rename from src/libpocketsphinx/phone_loop_search.c rename to src/phone_loop_search.c index f93c1e8..670e496 100644 --- a/src/libpocketsphinx/phone_loop_search.c +++ b/src/phone_loop_search.c @@ -39,7 +39,7 @@ * @file phone_loop_search.h Fast and rough context-independent phoneme loop search. */ -#include +#include #include "phone_loop_search.h" @@ -85,7 +85,7 @@ phone_loop_search_reinit(ps_search_t *search, dict_t *dict, dict2pid_t *d2p) /* Initialize penalty storage */ pls->n_phones = bin_mdef_n_ciphone(acmod->mdef); - pls->window = cmd_ln_int32_r(config, "-pl_window"); + pls->window = ps_config_int(config, "pl_window"); if (pls->penalties) ckd_free(pls->penalties); pls->penalties = (int32 *)ckd_calloc(pls->n_phones, sizeof(*pls->penalties)); @@ -106,10 +106,10 @@ phone_loop_search_reinit(ps_search_t *search, dict_t *dict, dict2pid_t *d2p) bin_mdef_pid2ssid(acmod->mdef, i), bin_mdef_pid2tmatid(acmod->mdef, i)); } - pls->penalty_weight = cmd_ln_float64_r(config, "-pl_weight"); - pls->beam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-pl_beam")) >> SENSCR_SHIFT; - pls->pbeam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-pl_pbeam")) >> SENSCR_SHIFT; - pls->pip = logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-pl_pip")) >> SENSCR_SHIFT; + pls->penalty_weight = ps_config_float(config, "pl_weight"); + pls->beam = logmath_log(acmod->lmath, ps_config_float(config, "pl_beam")) >> SENSCR_SHIFT; + pls->pbeam = logmath_log(acmod->lmath, ps_config_float(config, "pl_pbeam")) >> SENSCR_SHIFT; + pls->pip = logmath_log(acmod->lmath, ps_config_float(config, "pl_pip")) >> SENSCR_SHIFT; E_INFO("State beam %d Phone exit beam %d Insertion penalty %d\n", pls->beam, pls->pbeam, pls->pip); @@ -225,6 +225,7 @@ store_scores(phone_loop_search_t *pls, int frame_idx) { int i, j, itr; + (void)frame_idx; for (i = 0; i < pls->n_phones; ++i) { hmm_t *hmm = (hmm_t *)&pls->hmms[i]; pls->pen_buf[pls->pen_buf_ptr][i] = (hmm_bestscore(hmm) - pls->best_score) * pls->penalty_weight; @@ -341,12 +342,15 @@ static int phone_loop_search_finish(ps_search_t *search) { /* Actually nothing to do here really. */ + (void)search; return 0; } static char const * phone_loop_search_hyp(ps_search_t *search, int32 *out_score) { + (void)search; + (void)out_score; E_WARN("Hypotheses are not returned from phone loop search"); return NULL; } @@ -354,6 +358,7 @@ phone_loop_search_hyp(ps_search_t *search, int32 *out_score) static int32 phone_loop_search_prob(ps_search_t *search) { + (void)search; /* FIXME: Actually... they ought to be. */ E_WARN("Posterior probabilities are not returned from phone loop search"); return 0; @@ -362,6 +367,7 @@ phone_loop_search_prob(ps_search_t *search) static ps_seg_t * phone_loop_search_seg_iter(ps_search_t *search) { + (void)search; E_WARN("Hypotheses are not returned from phone loop search"); return NULL; } diff --git a/src/libpocketsphinx/phone_loop_search.h b/src/phone_loop_search.h similarity index 95% rename from src/libpocketsphinx/phone_loop_search.h rename to src/phone_loop_search.h index db776e9..1f6cbb9 100644 --- a/src/libpocketsphinx/phone_loop_search.h +++ b/src/phone_loop_search.h @@ -47,16 +47,20 @@ #ifndef __PHONE_LOOP_SEARCH_H__ #define __PHONE_LOOP_SEARCH_H__ -/* SphinxBase headers. */ -#include -#include -#include -#include +#include -/* Local headers. */ +#include "lm/ngram_model.h" +#include "util/listelem_alloc.h" #include "pocketsphinx_internal.h" #include "hmm.h" +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + /** * Renormalization event. */ @@ -99,4 +103,8 @@ ps_search_t *phone_loop_search_init(cmd_ln_t *config, #define phone_loop_search_score(pls,ci) \ ((pls == NULL) ? 0 : (pls->penalties[ci])) +#ifdef __cplusplus +} /* extern "C" */ +#endif + #endif /* __PHONE_LOOP_SEARCH_H__ */ diff --git a/src/libpocketsphinx/pocketsphinx.c b/src/pocketsphinx.c similarity index 67% rename from src/libpocketsphinx/pocketsphinx.c rename to src/pocketsphinx.c index 5852a31..84cfc4b 100644 --- a/src/libpocketsphinx/pocketsphinx.c +++ b/src/pocketsphinx.c @@ -43,19 +43,16 @@ #include #endif -/* SphinxBase headers. */ -#include -#include -#include -#include -#include -#include - -/* Local headers. */ -#include "cmdln_macro.h" -#include "pocketsphinx.h" +#include + +#include "util/strfuncs.h" +#include "util/filename.h" +#include "util/pio.h" +#include "lm/jsgf.h" +#include "util/hash_table.h" #include "pocketsphinx_internal.h" #include "ps_lattice_internal.h" +#include "ps_alignment_internal.h" #include "phone_loop_search.h" #include "kws_search.h" #include "fsg_search_internal.h" @@ -63,11 +60,8 @@ #include "ngram_search_fwdtree.h" #include "ngram_search_fwdflat.h" #include "allphone_search.h" - -static const arg_t ps_args_def[] = { - POCKETSPHINX_OPTIONS, - CMDLN_EMPTY_OPTION -}; +#include "state_align_search.h" +#include "fe/fe_internal.h" /* I'm not sure what the portable way to do this is. */ static int @@ -80,82 +74,60 @@ file_exists(const char *path) return (tmp != NULL); } -#ifdef MODELDIR static int hmmdir_exists(const char *path) { FILE *tmp; - char *mdef = string_join(path, "/mdef", NULL); + char *mdef = string_join(path, "/means", NULL); tmp = fopen(mdef, "rb"); if (tmp) fclose(tmp); ckd_free(mdef); return (tmp != NULL); } -#endif static void -ps_expand_file_config(ps_decoder_t *ps, const char *arg, const char *extra_arg, +ps_expand_file_config(ps_config_t *config, const char *arg, const char *hmmdir, const char *file) { const char *val; - if ((val = cmd_ln_str_r(ps->config, arg)) != NULL) { - cmd_ln_set_str_extra_r(ps->config, extra_arg, val); - } else if (hmmdir == NULL) { - cmd_ln_set_str_extra_r(ps->config, extra_arg, NULL); - } else { + if ((val = ps_config_str(config, arg)) == NULL) { char *tmp = string_join(hmmdir, "/", file, NULL); if (file_exists(tmp)) - cmd_ln_set_str_extra_r(ps->config, extra_arg, tmp); + ps_config_set_str(config, arg, tmp); else - cmd_ln_set_str_extra_r(ps->config, extra_arg, NULL); + ps_config_set_str(config, arg, NULL); ckd_free(tmp); } } -/* Feature and front-end parameters that may be in feat.params */ -static const arg_t feat_defn[] = { - waveform_to_cepstral_command_line_macro(), - cepstral_to_feature_command_line_macro(), - CMDLN_EMPTY_OPTION -}; - -static void -ps_expand_model_config(ps_decoder_t *ps) +void +ps_expand_model_config(ps_config_t *config) { char const *hmmdir, *featparams; - /* Disable memory mapping on Blackfin (FIXME: should be uClinux in general). */ -#ifdef __ADSPBLACKFIN__ - E_INFO("Will not use mmap() on uClinux/Blackfin."); - cmd_ln_set_boolean_r(ps->config, "-mmap", FALSE); -#endif - /* Get acoustic model filenames and add them to the command-line */ - hmmdir = cmd_ln_str_r(ps->config, "-hmm"); - ps_expand_file_config(ps, "-mdef", "_mdef", hmmdir, "mdef"); - ps_expand_file_config(ps, "-mean", "_mean", hmmdir, "means"); - ps_expand_file_config(ps, "-var", "_var", hmmdir, "variances"); - ps_expand_file_config(ps, "-tmat", "_tmat", hmmdir, "transition_matrices"); - ps_expand_file_config(ps, "-mixw", "_mixw", hmmdir, "mixture_weights"); - ps_expand_file_config(ps, "-sendump", "_sendump", hmmdir, "sendump"); - ps_expand_file_config(ps, "-fdict", "_fdict", hmmdir, "noisedict"); - ps_expand_file_config(ps, "-lda", "_lda", hmmdir, "feature_transform"); - ps_expand_file_config(ps, "-featparams", "_featparams", hmmdir, "feat.params"); - ps_expand_file_config(ps, "-senmgau", "_senmgau", hmmdir, "senmgau"); + hmmdir = ps_config_str(config, "hmm"); + if (hmmdir) { + ps_expand_file_config(config, "mdef", hmmdir, "mdef"); + ps_expand_file_config(config, "mean", hmmdir, "means"); + ps_expand_file_config(config, "var", hmmdir, "variances"); + ps_expand_file_config(config, "tmat", hmmdir, "transition_matrices"); + ps_expand_file_config(config, "mixw", hmmdir, "mixture_weights"); + ps_expand_file_config(config, "sendump", hmmdir, "sendump"); + ps_expand_file_config(config, "fdict", hmmdir, "noisedict"); + ps_expand_file_config(config, "lda", hmmdir, "feature_transform"); + ps_expand_file_config(config, "featparams", hmmdir, "feat.params"); + ps_expand_file_config(config, "senmgau", hmmdir, "senmgau"); + } /* Look for feat.params in acoustic model dir. */ - if ((featparams = cmd_ln_str_r(ps->config, "_featparams"))) { + if ((featparams = ps_config_str(config, "featparams"))) { if (NULL != - cmd_ln_parse_file_r(ps->config, feat_defn, featparams, FALSE)) + cmd_ln_parse_file_r(config, ps_args(), featparams, FALSE)) E_INFO("Parsed model-specific feature parameters from %s\n", featparams); } - - /* Print here because acmod_init might load feat.params file */ - if (err_get_logfp() != NULL) { - cmd_ln_print_values_r(ps->config, err_get_logfp(), ps_args()); - } } static void @@ -178,71 +150,137 @@ static ps_search_t * ps_find_search(ps_decoder_t *ps, char const *name) { void *search = NULL; + if (name == NULL) + return ps->search; hash_table_lookup(ps->searches, name, &search); - return (ps_search_t *) search; } +const char * +ps_default_modeldir(void) +{ + const char *modeldir = getenv("POCKETSPHINX_PATH"); +#ifdef MODELDIR + if (modeldir == NULL) + modeldir = MODELDIR; +#endif + return modeldir; +} + /* Set default acoustic and language models if they are not defined in configuration. */ void -ps_default_search_args(cmd_ln_t *config) +ps_default_search_args(ps_config_t *config) { -#ifdef MODELDIR - const char *hmmdir = cmd_ln_str_r(config, "-hmm"); - const char *lmfile = cmd_ln_str_r(config, "-lm"); - const char *dictfile = cmd_ln_str_r(config, "-dict"); + const char *modeldir = ps_default_modeldir(); - if (hmmdir == NULL && hmmdir_exists(MODELDIR "/en-us/en-us")) { - hmmdir = MODELDIR "/en-us/en-us"; - cmd_ln_set_str_r(config, "-hmm", hmmdir); - } + if (modeldir) { + const char *hmmdir = ps_config_str(config, "hmm"); + const char *lmfile = ps_config_str(config, "lm"); + const char *dictfile = ps_config_str(config, "dict"); + int maxlen; + char *path; + + maxlen = snprintf(NULL, 0, "%s/en-us/cmudict-en-us.dict", modeldir); + if (maxlen < 0) + E_FATAL_SYSTEM("snprintf() failed, giving up all hope"); + path = ckd_malloc(++maxlen); + + E_INFO("Looking for default model in %s\n", modeldir); + snprintf(path, maxlen, "%s/en-us/en-us", modeldir); + if (hmmdir == NULL && hmmdir_exists(path)) { + hmmdir = path; + E_INFO("Loading default acoustic model from %s\n", hmmdir); + ps_config_set_str(config, "hmm", hmmdir); + } + + snprintf(path, maxlen, "%s/en-us/en-us.lm.bin", modeldir); + if (lmfile == NULL && !ps_config_str(config, "fsg") + && !ps_config_str(config, "jsgf") + && !ps_config_str(config, "lmctl") + && !ps_config_str(config, "kws") + && !ps_config_str(config, "keyphrase") + && file_exists(path)) { + lmfile = path; + E_INFO("Loading default language model from %s\n", lmfile); + ps_config_set_str(config, "lm", lmfile); + } - if (lmfile == NULL && !cmd_ln_str_r(config, "-fsg") - && !cmd_ln_str_r(config, "-jsgf") - && !cmd_ln_str_r(config, "-lmctl") - && !cmd_ln_str_r(config, "-kws") - && !cmd_ln_str_r(config, "-keyphrase") - && file_exists(MODELDIR "/en-us/en-us.lm.bin")) { - lmfile = MODELDIR "/en-us/en-us.lm.bin"; - cmd_ln_set_str_r(config, "-lm", lmfile); + snprintf(path, maxlen, "%s/en-us/cmudict-en-us.dict", modeldir); + if (dictfile == NULL && file_exists(path)) { + dictfile = path; + E_INFO("Loading default dictionary from %s\n", dictfile); + ps_config_set_str(config, "dict", dictfile); + } + ckd_free(path); } + else + E_INFO("No system default model directory exists " + "and POCKETSPHINX_PATH is not set." + "(Python users can probably ignore this message)\n"); +} - if (dictfile == NULL && file_exists(MODELDIR "/en-us/cmudict-en-us.dict")) { - dictfile = MODELDIR "/en-us/cmudict-en-us.dict"; - cmd_ln_set_str_r(config, "-dict", dictfile); +int +ps_reinit_feat(ps_decoder_t *ps, ps_config_t *config) +{ + if (config && config != ps->config) { + ps_config_free(ps->config); + ps->config = ps_config_retain(config); } -#endif + return acmod_reinit_feat(ps->acmod, NULL, NULL); } int -ps_reinit(ps_decoder_t *ps, cmd_ln_t *config) +ps_reinit(ps_decoder_t *ps, ps_config_t *config) { const char *path; const char *keyphrase; int32 lw; + /* Enforce only one of keyphrase, kws, fsg, jsgf, allphone, lm */ + if (config) { + if (ps_config_validate(config) < 0) + return -1; + } + else if (ps->config) { + if (ps_config_validate(ps->config) < 0) + return -1; + } + if (config && config != ps->config) { - cmd_ln_free_r(ps->config); - ps->config = cmd_ln_retain(config); + ps_config_free(ps->config); + ps->config = ps_config_retain(config); } - err_set_debug_level(cmd_ln_int32_r(ps->config, "-debug")); /* Set up logging. We need to do this earlier because we want to dump * the information to the configured log, not to the stderr. */ - if (config && cmd_ln_str_r(ps->config, "-logfn")) { - if (err_set_logfile(cmd_ln_str_r(ps->config, "-logfn")) < 0) { - E_ERROR("Cannot redirect log output\n"); - return -1; + if (config) { + const char *logfn, *loglevel; + logfn = ps_config_str(ps->config, "logfn"); + if (logfn) { + if (err_set_logfile(logfn) < 0) { + E_ERROR("Cannot redirect log output\n"); + return -1; + } + } + loglevel = ps_config_str(ps->config, "loglevel"); + if (loglevel) { + if (err_set_loglevel_str(loglevel) == NULL) { + E_ERROR("Invalid log level: %s\n", loglevel); + return -1; + } } } - ps->mfclogdir = cmd_ln_str_r(ps->config, "-mfclogdir"); - ps->rawlogdir = cmd_ln_str_r(ps->config, "-rawlogdir"); - ps->senlogdir = cmd_ln_str_r(ps->config, "-senlogdir"); + ps->mfclogdir = ps_config_str(ps->config, "mfclogdir"); + ps->rawlogdir = ps_config_str(ps->config, "rawlogdir"); + ps->senlogdir = ps_config_str(ps->config, "senlogdir"); /* Fill in some default arguments. */ - ps_expand_model_config(ps); + ps_expand_model_config(ps->config); + /* Print out the config for logging. */ + cmd_ln_log_values_r(ps->config, ps_args()); + /* Free old searches (do this before other reinit) */ ps_free_searches(ps); ps->searches = hash_table_new(3, HASH_CASE_YES); @@ -262,12 +300,11 @@ ps_reinit(ps_decoder_t *ps, cmd_ln_t *config) /* Logmath computation (used in acmod and search) */ if (ps->lmath == NULL || (logmath_get_base(ps->lmath) != - (float64)cmd_ln_float32_r(ps->config, "-logbase"))) { + ps_config_float(ps->config, "logbase"))) { if (ps->lmath) logmath_free(ps->lmath); ps->lmath = logmath_init - ((float64)cmd_ln_float32_r(ps->config, "-logbase"), 0, - cmd_ln_boolean_r(ps->config, "-bestpath")); + (ps_config_float(ps->config, "logbase"), 0, TRUE); } /* Acoustic model (this is basically everything that @@ -275,9 +312,7 @@ ps_reinit(ps_decoder_t *ps, cmd_ln_t *config) if ((ps->acmod = acmod_init(ps->config, ps->lmath, NULL, NULL)) == NULL) return -1; - - - if (cmd_ln_int32_r(ps->config, "-pl_window") > 0) { + if (ps_config_int(ps->config, "pl_window") > 0) { /* Initialize an auxiliary phone loop search, which will run in * "parallel" with FSG or N-Gram search. */ if ((ps->phone_loop = @@ -295,58 +330,48 @@ ps_reinit(ps_decoder_t *ps, cmd_ln_t *config) if ((ps->d2p = dict2pid_build(ps->acmod->mdef, ps->dict)) == NULL) return -1; - lw = cmd_ln_float32_r(ps->config, "-lw"); + lw = ps_config_float(ps->config, "lw"); /* Determine whether we are starting out in FSG or N-Gram search mode. * If neither is used skip search initialization. */ - /* Load KWS if one was specified in config */ - if ((keyphrase = cmd_ln_str_r(ps->config, "-keyphrase"))) { - if (ps_set_keyphrase(ps, PS_DEFAULT_SEARCH, keyphrase)) + if ((keyphrase = ps_config_str(ps->config, "keyphrase"))) { + if (ps_add_keyphrase(ps, PS_DEFAULT_SEARCH, keyphrase)) return -1; - ps_set_search(ps, PS_DEFAULT_SEARCH); + ps_activate_search(ps, PS_DEFAULT_SEARCH); } - - if ((path = cmd_ln_str_r(ps->config, "-kws"))) { - if (ps_set_kws(ps, PS_DEFAULT_SEARCH, path)) + else if ((path = ps_config_str(ps->config, "kws"))) { + if (ps_add_kws(ps, PS_DEFAULT_SEARCH, path)) return -1; - ps_set_search(ps, PS_DEFAULT_SEARCH); + ps_activate_search(ps, PS_DEFAULT_SEARCH); } - - /* Load an FSG if one was specified in config */ - if ((path = cmd_ln_str_r(ps->config, "-fsg"))) { + else if ((path = ps_config_str(ps->config, "fsg"))) { fsg_model_t *fsg = fsg_model_readfile(path, ps->lmath, lw); if (!fsg) return -1; - if (ps_set_fsg(ps, PS_DEFAULT_SEARCH, fsg)) { + if (ps_add_fsg(ps, PS_DEFAULT_SEARCH, fsg)) { fsg_model_free(fsg); return -1; } fsg_model_free(fsg); - ps_set_search(ps, PS_DEFAULT_SEARCH); + ps_activate_search(ps, PS_DEFAULT_SEARCH); } - - /* Or load a JSGF grammar */ - if ((path = cmd_ln_str_r(ps->config, "-jsgf"))) { - if (ps_set_jsgf_file(ps, PS_DEFAULT_SEARCH, path) - || ps_set_search(ps, PS_DEFAULT_SEARCH)) + else if ((path = ps_config_str(ps->config, "jsgf"))) { + if (ps_add_jsgf_file(ps, PS_DEFAULT_SEARCH, path) + || ps_activate_search(ps, PS_DEFAULT_SEARCH)) return -1; } - - if ((path = cmd_ln_str_r(ps->config, "-allphone"))) { - if (ps_set_allphone_file(ps, PS_DEFAULT_SEARCH, path) - || ps_set_search(ps, PS_DEFAULT_SEARCH)) - return -1; + else if ((path = ps_config_str(ps->config, "allphone"))) { + if (ps_add_allphone_file(ps, PS_DEFAULT_SEARCH, path) + || ps_activate_search(ps, PS_DEFAULT_SEARCH)) + return -1; } - - if ((path = cmd_ln_str_r(ps->config, "-lm")) && - !cmd_ln_boolean_r(ps->config, "-allphone")) { - if (ps_set_lm_file(ps, PS_DEFAULT_SEARCH, path) - || ps_set_search(ps, PS_DEFAULT_SEARCH)) + else if ((path = ps_config_str(ps->config, "lm"))) { + if (ps_add_lm_file(ps, PS_DEFAULT_SEARCH, path) + || ps_activate_search(ps, PS_DEFAULT_SEARCH)) return -1; } - - if ((path = cmd_ln_str_r(ps->config, "-lmctl"))) { + else if ((path = ps_config_str(ps->config, "lmctl"))) { const char *name; ngram_model_t *lmset; ngram_model_set_iter_t *lmset_it; @@ -360,7 +385,7 @@ ps_reinit(ps_decoder_t *ps, cmd_ln_t *config) lmset_it; lmset_it = ngram_model_set_iter_next(lmset_it)) { ngram_model_t *lm = ngram_model_set_iter_model(lmset_it, &name); E_INFO("adding search %s\n", name); - if (ps_set_lm(ps, name, lm)) { + if (ps_add_lm(ps, name, lm)) { ngram_model_set_iter_free(lmset_it); ngram_model_free(lmset); return -1; @@ -368,9 +393,9 @@ ps_reinit(ps_decoder_t *ps, cmd_ln_t *config) } ngram_model_free(lmset); - name = cmd_ln_str_r(ps->config, "-lmname"); + name = ps_config_str(ps->config, "lmname"); if (name) - ps_set_search(ps, name); + ps_activate_search(ps, name); else { E_ERROR("No default LM name (-lmname) for `-lmctl'\n"); return -1; @@ -384,31 +409,37 @@ ps_reinit(ps_decoder_t *ps, cmd_ln_t *config) return 0; } +const char * +ps_get_cmn(ps_decoder_t *ps, int update) +{ + if (update) + cmn_live_update(ps->acmod->fcb->cmn_struct); + return cmn_repr(ps->acmod->fcb->cmn_struct); +} + +int +ps_set_cmn(ps_decoder_t *ps, const char *cmn) +{ + return cmn_set_repr(ps->acmod->fcb->cmn_struct, cmn); +} + + ps_decoder_t * -ps_init(cmd_ln_t *config) +ps_init(ps_config_t *config) { ps_decoder_t *ps; - if (!config) { - E_ERROR("No configuration specified"); - return NULL; - } - ps = ckd_calloc(1, sizeof(*ps)); ps->refcount = 1; - if (ps_reinit(ps, config) < 0) { - ps_free(ps); - return NULL; + if (config) { + if (ps_reinit(ps, config) < 0) { + ps_free(ps); + return NULL; + } } return ps; } -arg_t const * -ps_args(void) -{ - return ps_args_def; -} - ps_decoder_t * ps_retain(ps_decoder_t *ps) { @@ -428,12 +459,12 @@ ps_free(ps_decoder_t *ps) dict2pid_free(ps->d2p); acmod_free(ps->acmod); logmath_free(ps->lmath); - cmd_ln_free_r(ps->config); + ps_config_free(ps->config); ckd_free(ps); return 0; } -cmd_ln_t * +ps_config_t * ps_get_config(ps_decoder_t *ps) { return ps->config; @@ -464,7 +495,7 @@ ps_update_mllr(ps_decoder_t *ps, ps_mllr_t *mllr) } int -ps_set_search(ps_decoder_t *ps, const char *name) +ps_activate_search(ps_decoder_t *ps, const char *name) { ps_search_t *search; @@ -473,14 +504,16 @@ ps_set_search(ps_decoder_t *ps, const char *name) return -1; } - if (!(search = ps_find_search(ps, name))) { + if (name == NULL) + name = PS_DEFAULT_SEARCH; + + if (!(search = ps_find_search(ps, name))) return -1; - } ps->search = search; /* Set pl window depending on the search */ if (!strcmp(PS_SEARCH_TYPE_NGRAM, ps_search_type(search))) { - ps->pl_window = cmd_ln_int32_r(ps->config, "-pl_window"); + ps->pl_window = ps_config_int(ps->config, "pl_window"); } else { ps->pl_window = 0; } @@ -489,7 +522,7 @@ ps_set_search(ps_decoder_t *ps, const char *name) } const char* -ps_get_search(ps_decoder_t *ps) +ps_current_search(ps_decoder_t *ps) { hash_iter_t *search_it; const char* name = NULL; @@ -504,7 +537,7 @@ ps_get_search(ps_decoder_t *ps) } int -ps_unset_search(ps_decoder_t *ps, const char *name) +ps_remove_search(ps_decoder_t *ps, const char *name) { ps_search_t *search = hash_table_delete(ps->searches, name); if (!search) @@ -543,27 +576,43 @@ ngram_model_t * ps_get_lm(ps_decoder_t *ps, const char *name) { ps_search_t *search = ps_find_search(ps, name); - if (search && strcmp(PS_SEARCH_TYPE_NGRAM, ps_search_type(search))) + if (search == NULL) return NULL; - return search ? ((ngram_search_t *) search)->lmset : NULL; + if (0 != strcmp(PS_SEARCH_TYPE_NGRAM, ps_search_type(search))) + return NULL; + return ((ngram_search_t *) search)->lmset; } fsg_model_t * ps_get_fsg(ps_decoder_t *ps, const char *name) { ps_search_t *search = ps_find_search(ps, name); - if (search && strcmp(PS_SEARCH_TYPE_FSG, ps_search_type(search))) + if (search == NULL) + return NULL; + if (0 != strcmp(PS_SEARCH_TYPE_FSG, ps_search_type(search))) return NULL; - return search ? ((fsg_search_t *) search)->fsg : NULL; + return ((fsg_search_t *) search)->fsg; } const char* -ps_get_kws(ps_decoder_t *ps, const char* name) +ps_get_kws(ps_decoder_t *ps, const char *name) { ps_search_t *search = ps_find_search(ps, name); - if (search && strcmp(PS_SEARCH_TYPE_KWS, ps_search_type(search))) + if (search == NULL) return NULL; - return search ? kws_search_get_keyphrases(search) : NULL; + if (0 != strcmp(PS_SEARCH_TYPE_KWS, ps_search_type(search))) + return NULL; + return kws_search_get_keyphrases(search); +} + +ps_alignment_t * +ps_get_alignment(ps_decoder_t *ps) +{ + if (ps->search == NULL) + return NULL; + if (0 != strcmp(PS_SEARCH_TYPE_STATE_ALIGN, ps_search_type(ps->search))) + return NULL; + return ((state_align_search_t *) ps->search)->al; } static int @@ -583,7 +632,7 @@ set_search_internal(ps_decoder_t *ps, ps_search_t *search) } int -ps_set_lm(ps_decoder_t *ps, const char *name, ngram_model_t *lm) +ps_add_lm(ps_decoder_t *ps, const char *name, ngram_model_t *lm) { ps_search_t *search; search = ngram_search_init(name, lm, ps->config, ps->acmod, ps->dict, ps->d2p); @@ -591,7 +640,7 @@ ps_set_lm(ps_decoder_t *ps, const char *name, ngram_model_t *lm) } int -ps_set_lm_file(ps_decoder_t *ps, const char *name, const char *path) +ps_add_lm_file(ps_decoder_t *ps, const char *name, const char *path) { ngram_model_t *lm; int result; @@ -600,13 +649,13 @@ ps_set_lm_file(ps_decoder_t *ps, const char *name, const char *path) if (!lm) return -1; - result = ps_set_lm(ps, name, lm); + result = ps_add_lm(ps, name, lm); ngram_model_free(lm); return result; } int -ps_set_allphone(ps_decoder_t *ps, const char *name, ngram_model_t *lm) +ps_add_allphone(ps_decoder_t *ps, const char *name, ngram_model_t *lm) { ps_search_t *search; search = allphone_search_init(name, lm, ps->config, ps->acmod, ps->dict, ps->d2p); @@ -614,7 +663,7 @@ ps_set_allphone(ps_decoder_t *ps, const char *name, ngram_model_t *lm) } int -ps_set_allphone_file(ps_decoder_t *ps, const char *name, const char *path) +ps_add_allphone_file(ps_decoder_t *ps, const char *name, const char *path) { ngram_model_t *lm; int result; @@ -622,14 +671,109 @@ ps_set_allphone_file(ps_decoder_t *ps, const char *name, const char *path) lm = NULL; if (path) lm = ngram_model_read(ps->config, path, NGRAM_AUTO, ps->lmath); - result = ps_set_allphone(ps, name, lm); + result = ps_add_allphone(ps, name, lm); if (lm) ngram_model_free(lm); return result; } int -ps_set_kws(ps_decoder_t *ps, const char *name, const char *keyfile) +ps_set_align_text(ps_decoder_t *ps, const char *text) +{ + fsg_model_t *fsg; + char *textbuf = ckd_salloc(text); + char *ptr, *word, delimfound; + int n, nwords; + + textbuf = string_trim(textbuf, STRING_BOTH); + /* First pass: count and verify words */ + nwords = 0; + ptr = textbuf; + while ((n = nextword(ptr, " \t\n\r", &word, &delimfound)) >= 0) { + int wid; + if ((wid = dict_wordid(ps->dict, word)) == BAD_S3WID) { + E_ERROR("Unknown word %s\n", word); + ckd_free(textbuf); + return -1; + } + ptr = word + n; + *ptr = delimfound; + ++nwords; + } + /* Second pass: make fsg */ + fsg = fsg_model_init("_align", ps->lmath, + ps_config_float(ps->config, "lw"), + nwords + 1); + nwords = 0; + ptr = textbuf; + while ((n = nextword(ptr, " \t\n\r", &word, &delimfound)) >= 0) { + int wid; + if ((wid = dict_wordid(ps->dict, word)) == BAD_S3WID) { + E_ERROR("Unknown word %s\n", word); + ckd_free(textbuf); + return -1; + } + wid = fsg_model_word_add(fsg, word); + fsg_model_trans_add(fsg, nwords, nwords + 1, 0, wid); + ptr = word + n; + *ptr = delimfound; + ++nwords; + } + ckd_free(textbuf); + fsg->start_state = 0; + fsg->final_state = nwords; + if (ps_add_fsg(ps, PS_DEFAULT_ALIGN_SEARCH, fsg) < 0) { + fsg_model_free(fsg); + return -1; + } + fsg_model_free(fsg); + return ps_activate_search(ps, PS_DEFAULT_ALIGN_SEARCH); +} + +int +ps_set_alignment(ps_decoder_t *ps, ps_alignment_t *al) +{ + ps_search_t *search; + int new_alignment = FALSE; + + if (al == NULL) { + ps_seg_t *seg; + seg = ps_seg_iter(ps); + if (seg == NULL) + return -1; + al = ps_alignment_init(ps->d2p); + new_alignment = TRUE; + while (seg) { + if (seg->wid == BAD_S3WID) { + E_ERROR("No word ID for segment %s, cannot align\n", + seg->text); + goto error_out; + } + ps_alignment_add_word(al, seg->wid, seg->sf, seg->ef - seg->sf + 1); + seg = ps_seg_next(seg); + } + /* FIXME: Add cionly parameter as in SoundSwallower */ + if (ps_alignment_populate(al) < 0) + goto error_out; + } + else + al = ps_alignment_retain(al); + search = state_align_search_init("_state_align", ps->config, ps->acmod, al); + if (search == NULL) + goto error_out; + if (new_alignment) + ps_alignment_free(al); + if (set_search_internal(ps, search) < 0) + goto error_out; + return ps_activate_search(ps, "_state_align"); +error_out: + if (new_alignment) + ps_alignment_free(al); + return -1; +} + +int +ps_add_kws(ps_decoder_t *ps, const char *name, const char *keyfile) { ps_search_t *search; search = kws_search_init(name, NULL, keyfile, ps->config, ps->acmod, ps->dict, ps->d2p); @@ -637,7 +781,7 @@ ps_set_kws(ps_decoder_t *ps, const char *name, const char *keyfile) } int -ps_set_keyphrase(ps_decoder_t *ps, const char *name, const char *keyphrase) +ps_add_keyphrase(ps_decoder_t *ps, const char *name, const char *keyphrase) { ps_search_t *search; search = kws_search_init(name, keyphrase, NULL, ps->config, ps->acmod, ps->dict, ps->d2p); @@ -645,7 +789,7 @@ ps_set_keyphrase(ps_decoder_t *ps, const char *name, const char *keyphrase) } int -ps_set_fsg(ps_decoder_t *ps, const char *name, fsg_model_t *fsg) +ps_add_fsg(ps_decoder_t *ps, const char *name, fsg_model_t *fsg) { ps_search_t *search; search = fsg_search_init(name, fsg, ps->config, ps->acmod, ps->dict, ps->d2p); @@ -653,7 +797,7 @@ ps_set_fsg(ps_decoder_t *ps, const char *name, fsg_model_t *fsg) } int -ps_set_jsgf_file(ps_decoder_t *ps, const char *name, const char *path) +ps_add_jsgf_file(ps_decoder_t *ps, const char *name, const char *path) { fsg_model_t *fsg; jsgf_rule_t *rule; @@ -667,7 +811,7 @@ ps_set_jsgf_file(ps_decoder_t *ps, const char *name, const char *path) rule = NULL; /* Take the -toprule if specified. */ - if ((toprule = cmd_ln_str_r(ps->config, "-toprule"))) { + if ((toprule = ps_config_str(ps->config, "toprule"))) { rule = jsgf_get_rule(jsgf, toprule); if (rule == NULL) { E_ERROR("Start rule %s not found\n", toprule); @@ -683,16 +827,16 @@ ps_set_jsgf_file(ps_decoder_t *ps, const char *name, const char *path) } } - lw = cmd_ln_float32_r(ps->config, "-lw"); + lw = ps_config_float(ps->config, "lw"); fsg = jsgf_build_fsg(jsgf, rule, ps->lmath, lw); - result = ps_set_fsg(ps, name, fsg); + result = ps_add_fsg(ps, name, fsg); fsg_model_free(fsg); jsgf_grammar_free(jsgf); return result; } int -ps_set_jsgf_string(ps_decoder_t *ps, const char *name, const char *jsgf_string) +ps_add_jsgf_string(ps_decoder_t *ps, const char *name, const char *jsgf_string) { fsg_model_t *fsg; jsgf_rule_t *rule; @@ -706,24 +850,27 @@ ps_set_jsgf_string(ps_decoder_t *ps, const char *name, const char *jsgf_string) rule = NULL; /* Take the -toprule if specified. */ - if ((toprule = cmd_ln_str_r(ps->config, "-toprule"))) { + if ((toprule = ps_config_str(ps->config, "toprule"))) { rule = jsgf_get_rule(jsgf, toprule); if (rule == NULL) { E_ERROR("Start rule %s not found\n", toprule); + jsgf_grammar_free(jsgf); return -1; } } else { rule = jsgf_get_public_rule(jsgf); if (rule == NULL) { E_ERROR("No public rules found in input string\n"); + jsgf_grammar_free(jsgf); return -1; } } - lw = cmd_ln_float32_r(ps->config, "-lw"); + lw = ps_config_float(ps->config, "lw"); fsg = jsgf_build_fsg(jsgf, rule, ps->lmath, lw); - result = ps_set_fsg(ps, name, fsg); + result = ps_add_fsg(ps, name, fsg); fsg_model_free(fsg); + jsgf_grammar_free(jsgf); return result; } @@ -735,35 +882,36 @@ ps_load_dict(ps_decoder_t *ps, char const *dictfile, dict2pid_t *d2p; dict_t *dict; hash_iter_t *search_it; - cmd_ln_t *newconfig; + ps_config_t *newconfig; + (void)format; /* Create a new scratch config to load this dict (so existing one * won't be affected if it fails) */ - newconfig = cmd_ln_init(NULL, ps_args(), TRUE, NULL); - cmd_ln_set_boolean_r(newconfig, "-dictcase", - cmd_ln_boolean_r(ps->config, "-dictcase")); - cmd_ln_set_str_r(newconfig, "-dict", dictfile); + newconfig = ps_config_init(NULL); + ps_config_set_bool(newconfig, "dictcase", + ps_config_bool(ps->config, "dictcase")); + ps_config_set_str(newconfig, "dict", dictfile); if (fdictfile) - cmd_ln_set_str_extra_r(newconfig, "_fdict", fdictfile); + ps_config_set_str(newconfig, "fdict", fdictfile); else - cmd_ln_set_str_extra_r(newconfig, "_fdict", - cmd_ln_str_r(ps->config, "_fdict")); + ps_config_set_str(newconfig, "fdict", + ps_config_str(ps->config, "fdict")); /* Try to load it. */ if ((dict = dict_init(newconfig, ps->acmod->mdef)) == NULL) { - cmd_ln_free_r(newconfig); + ps_config_free(newconfig); return -1; } /* Reinit the dict2pid. */ if ((d2p = dict2pid_build(ps->acmod->mdef, dict)) == NULL) { - cmd_ln_free_r(newconfig); + ps_config_free(newconfig); return -1; } /* Success! Update the existing config to reflect new dicts and * drop everything into place. */ - cmd_ln_free_r(newconfig); + ps_config_free(newconfig); dict_free(ps->dict); ps->dict = dict; dict2pid_free(ps->d2p); @@ -845,7 +993,7 @@ ps_add_word(ps_decoder_t *ps, } if (update) { - if ((rv = ps_search_reinit(search, ps->dict, ps->d2p) < 0)) { + if ((rv = ps_search_reinit(search, ps->dict, ps->d2p)) < 0) { hash_table_iter_free(search_it); return rv; } @@ -886,7 +1034,6 @@ ps_decode_raw(ps_decoder_t *ps, FILE *rawfh, int16 *data; long total, pos, endpos; - ps_start_stream(ps); ps_start_utt(ps); /* If this file is seekable or maxsamps is specified, then decode @@ -925,10 +1072,22 @@ ps_decode_raw(ps_decoder_t *ps, FILE *rawfh, int ps_start_stream(ps_decoder_t *ps) { - acmod_start_stream(ps->acmod); + if (ps->acmod == NULL) + return -1; + if (ps->acmod->fe == NULL) + return -1; + if (ps->acmod->fe->noise_stats == NULL) + return -1; + fe_reset_noisestats(ps->acmod->fe->noise_stats); return 0; } +int +ps_get_in_speech(ps_decoder_t *ps) +{ + return (ps->acmod->state == ACMOD_STARTED || ps->acmod->state == ACMOD_PROCESSING); +} + int ps_start_utt(ps_decoder_t *ps) { @@ -1015,6 +1174,11 @@ ps_search_forward(ps_decoder_t *ps) { int nfr; + if (ps->search == NULL) { + E_ERROR("No search module is selected, did you forget to " + "specify a language model or grammar?\n"); + return -1; + } nfr = 0; while (ps->acmod->n_feat_frame > 0) { int k; @@ -1091,13 +1255,23 @@ ps_process_raw(ps_decoder_t *ps, int ps_process_cep(ps_decoder_t *ps, - mfcc_t **data, + float32 **data, int32 n_frames, int no_search, int full_utt) { int n_searchfr = 0; +#ifdef FIXED_POINT + mfcc_t **idata, **ptr; + ptr = idata = ckd_calloc_2d(n_frames, + fe_get_output_size(ps->acmod->fe), + sizeof(**idata)); + fe_float_to_mfcc(ps->acmod->fe, data, idata, n_frames); +#else + mfcc_t **ptr = data; +#endif + if (no_search) acmod_set_grow(ps->acmod, TRUE); @@ -1105,7 +1279,7 @@ ps_process_cep(ps_decoder_t *ps, int nfr; /* Process some data into features. */ - if ((nfr = acmod_process_cep(ps->acmod, &data, + if ((nfr = acmod_process_cep(ps->acmod, &ptr, &n_frames, full_utt)) < 0) return nfr; @@ -1116,6 +1290,9 @@ ps_process_cep(ps_decoder_t *ps, return nfr; n_searchfr += nfr; } +#ifdef FIXED_POINT + ckd_free_2d(idata); +#endif return n_searchfr; } @@ -1125,6 +1302,11 @@ ps_end_utt(ps_decoder_t *ps) { int rv, i; + if (ps->search == NULL) { + E_ERROR("No search module is selected, did you forget to " + "specify a language model or grammar?\n"); + return -1; + } if (ps->acmod->state == ACMOD_ENDED || ps->acmod->state == ACMOD_IDLE) { E_ERROR("Utterance is not started\n"); return -1; @@ -1157,7 +1339,7 @@ ps_end_utt(ps_decoder_t *ps) ptmr_stop(&ps->perf); /* Log a backtrace if requested. */ - if (cmd_ln_boolean_r(ps->config, "-backtrace")) { + if (ps_config_bool(ps->config, "backtrace")) { const char* hyp; ps_seg_t *seg; int32 score; @@ -1191,6 +1373,11 @@ ps_get_hyp(ps_decoder_t *ps, int32 *out_best_score) { char const *hyp; + if (ps->search == NULL) { + E_ERROR("No search module is selected, did you forget to " + "specify a language model or grammar?\n"); + return NULL; + } ptmr_start(&ps->perf); hyp = ps_search_hyp(ps->search, out_best_score); ptmr_stop(&ps->perf); @@ -1202,6 +1389,11 @@ ps_get_prob(ps_decoder_t *ps) { int32 prob; + if (ps->search == NULL) { + E_ERROR("No search module is selected, did you forget to " + "specify a language model or grammar?\n"); + return -1; + } ptmr_start(&ps->perf); prob = ps_search_prob(ps->search); ptmr_stop(&ps->perf); @@ -1213,6 +1405,11 @@ ps_seg_iter(ps_decoder_t *ps) { ps_seg_t *itor; + if (ps->search == NULL) { + E_ERROR("No search module is selected, did you forget to " + "specify a language model or grammar?\n"); + return NULL; + } ptmr_start(&ps->perf); itor = ps_search_seg_iter(ps->search); ptmr_stop(&ps->perf); @@ -1228,16 +1425,14 @@ ps_seg_next(ps_seg_t *seg) char const * ps_seg_word(ps_seg_t *seg) { - return seg->word; + return seg->text; } void ps_seg_frames(ps_seg_t *seg, int *out_sf, int *out_ef) { - int uf; - uf = acmod_stream_offset(seg->search->acmod); - if (out_sf) *out_sf = seg->sf + uf; - if (out_ef) *out_ef = seg->ef + uf; + if (out_sf) *out_sf = seg->sf; + if (out_ef) *out_ef = seg->ef; } int32 @@ -1258,6 +1453,11 @@ ps_seg_free(ps_seg_t *seg) ps_lattice_t * ps_get_lattice(ps_decoder_t *ps) { + if (ps->search == NULL) { + E_ERROR("No search module is selected, did you forget to " + "specify a language model or grammar?\n"); + return NULL; + } return ps_search_lattice(ps->search); } @@ -1269,8 +1469,11 @@ ps_nbest(ps_decoder_t *ps) ps_astar_t *nbest; float32 lwf; - if (ps->search == NULL) + if (ps->search == NULL) { + E_ERROR("No search module is selected, did you forget to " + "specify a language model or grammar?\n"); return NULL; + } if ((dag = ps_get_lattice(ps)) == NULL) return NULL; @@ -1343,7 +1546,7 @@ ps_get_utt_time(ps_decoder_t *ps, double *out_nspeech, { int32 frate; - frate = cmd_ln_int32_r(ps->config, "-frate"); + frate = ps_config_int(ps->config, "frate"); *out_nspeech = (double)ps->acmod->output_frame / frate; *out_ncpu = ps->perf.t_cpu; *out_nwall = ps->perf.t_elapsed; @@ -1355,23 +1558,17 @@ ps_get_all_time(ps_decoder_t *ps, double *out_nspeech, { int32 frate; - frate = cmd_ln_int32_r(ps->config, "-frate"); + frate = ps_config_int(ps->config, "frate"); *out_nspeech = (double)ps->n_frame / frate; *out_ncpu = ps->perf.t_tot_cpu; *out_nwall = ps->perf.t_tot_elapsed; } -uint8 -ps_get_in_speech(ps_decoder_t *ps) -{ - return fe_get_vad_state(ps->acmod->fe); -} - void ps_search_init(ps_search_t *search, ps_searchfuncs_t *vt, const char *type, const char *name, - cmd_ln_t *config, acmod_t *acmod, dict_t *dict, + ps_config_t *config, acmod_t *acmod, dict_t *dict, dict2pid_t *d2p) { search->vt = vt; @@ -1435,15 +1632,3 @@ ps_search_base_reinit(ps_search_t *search, dict_t *dict, else search->d2p = NULL; } - -void -ps_set_rawdata_size(ps_decoder_t *ps, int32 size) -{ - acmod_set_rawdata_size(ps->acmod, size); -} - -void -ps_get_rawdata(ps_decoder_t *ps, int16 **buffer, int32 *size) -{ - acmod_get_rawdata(ps->acmod, buffer, size); -} diff --git a/src/libpocketsphinx/pocketsphinx_internal.h b/src/pocketsphinx_internal.h similarity index 93% rename from src/libpocketsphinx/pocketsphinx_internal.h rename to src/pocketsphinx_internal.h index 3f7dd98..b421df9 100644 --- a/src/libpocketsphinx/pocketsphinx_internal.h +++ b/src/pocketsphinx_internal.h @@ -38,26 +38,29 @@ /** * @file pocketsphinx_internal.h Internal implementation of * PocketSphinx decoder. - * @author David Huggins-Daines + * @author David Huggins-Daines */ #ifndef __POCKETSPHINX_INTERNAL_H__ #define __POCKETSPHINX_INTERNAL_H__ -/* SphinxBase headers. */ -#include -#include -#include -#include -#include -#include +#include "fe/fe.h" +#include "feat/feat.h" +#include "util/cmd_ln.h" +#include "util/hash_table.h" +#include "util/profile.h" -/* Local headers. */ -#include "pocketsphinx.h" #include "acmod.h" #include "dict.h" #include "dict2pid.h" +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + /** * Search algorithm structure. */ @@ -66,6 +69,7 @@ typedef struct ps_search_s ps_search_t; /* Search names*/ #define PS_DEFAULT_SEARCH "_default" +#define PS_DEFAULT_ALIGN_SEARCH "_align" #define PS_DEFAULT_PL_SEARCH "_default_pl" /* Search types */ @@ -101,7 +105,10 @@ struct ps_search_s { char *type; char *name; - ps_search_t *pls; /**< Phoneme loop for lookahead. */ + /** + * Phoneme loop for lookahead. Reference (not retained) to + * phone_loop in the parent ps_decoder_t. */ + ps_search_t *pls; cmd_ln_t *config; /**< Configuration. */ acmod_t *acmod; /**< Acoustic model. */ dict_t *dict; /**< Pronunciation dictionary. */ @@ -178,9 +185,10 @@ typedef struct ps_segfuncs_s { struct ps_seg_s { ps_segfuncs_t *vt; /**< V-table of seg methods */ ps_search_t *search; /**< Search object from whence this came */ - char const *word; /**< Word string (pointer into dictionary hash) */ + const char *text; /**< Textual representation of segment */ frame_idx_t sf; /**< Start frame. */ frame_idx_t ef; /**< End frame. */ + s3wid_t wid; /**< Word ID (*not* base word ID). */ int32 ascr; /**< Acoustic score. */ int32 lscr; /**< Language model score. */ int32 prob; /**< Log posterior probability. */ @@ -231,4 +239,8 @@ struct ps_search_iter_s { hash_iter_t itor; }; +#ifdef __cplusplus +} /* extern "C" */ +#endif + #endif /* __POCKETSPHINX_INTERNAL_H__ */ diff --git a/src/programs/Makefile.am b/src/programs/Makefile.am deleted file mode 100644 index eb882b5..0000000 --- a/src/programs/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ -bin_PROGRAMS = \ - pocketsphinx_batch \ - pocketsphinx_continuous \ - pocketsphinx_mdef_convert - -pocketsphinx_mdef_convert_SOURCES = mdef_convert.c -pocketsphinx_mdef_convert_LDADD = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la - -pocketsphinx_batch_SOURCES = batch.c -pocketsphinx_batch_LDADD = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la - -pocketsphinx_continuous_SOURCES = continuous.c -pocketsphinx_continuous_LDADD = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -lsphinxad - -AM_CFLAGS =-I$(top_srcdir)/include \ - -I$(top_srcdir)/src/libpocketsphinx \ - -I$(top_builddir)/include diff --git a/src/programs/Makefile.in b/src/programs/Makefile.in deleted file mode 100644 index efaf6c9..0000000 --- a/src/programs/Makefile.in +++ /dev/null @@ -1,685 +0,0 @@ -# Makefile.in generated by automake 1.13.4 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2013 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -bin_PROGRAMS = pocketsphinx_batch$(EXEEXT) \ - pocketsphinx_continuous$(EXEEXT) \ - pocketsphinx_mdef_convert$(EXEEXT) -subdir = src/programs -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/depcomp -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ - $(top_srcdir)/m4/ax_python_devel.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -am__installdirs = "$(DESTDIR)$(bindir)" -PROGRAMS = $(bin_PROGRAMS) -am_pocketsphinx_batch_OBJECTS = batch.$(OBJEXT) -pocketsphinx_batch_OBJECTS = $(am_pocketsphinx_batch_OBJECTS) -pocketsphinx_batch_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -AM_V_lt = $(am__v_lt_@AM_V@) -am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) -am__v_lt_0 = --silent -am__v_lt_1 = -am_pocketsphinx_continuous_OBJECTS = continuous.$(OBJEXT) -pocketsphinx_continuous_OBJECTS = \ - $(am_pocketsphinx_continuous_OBJECTS) -pocketsphinx_continuous_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -am_pocketsphinx_mdef_convert_OBJECTS = mdef_convert.$(OBJEXT) -pocketsphinx_mdef_convert_OBJECTS = \ - $(am_pocketsphinx_mdef_convert_OBJECTS) -pocketsphinx_mdef_convert_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -AM_V_CC = $(am__v_CC_@AM_V@) -am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) -am__v_CC_0 = @echo " CC " $@; -am__v_CC_1 = -CCLD = $(CC) -LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CCLD = $(am__v_CCLD_@AM_V@) -am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) -am__v_CCLD_0 = @echo " CCLD " $@; -am__v_CCLD_1 = -SOURCES = $(pocketsphinx_batch_SOURCES) \ - $(pocketsphinx_continuous_SOURCES) \ - $(pocketsphinx_mdef_convert_SOURCES) -DIST_SOURCES = $(pocketsphinx_batch_SOURCES) \ - $(pocketsphinx_continuous_SOURCES) \ - $(pocketsphinx_mdef_convert_SOURCES) -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GST_CFLAGS = @GST_CFLAGS@ -GST_LIBS = @GST_LIBS@ -GST_MAJORMINOR = @GST_MAJORMINOR@ -GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ -GStreamer_CFLAGS = @GStreamer_CFLAGS@ -GStreamer_LIBS = @GStreamer_LIBS@ -HAVE_DOXYGEN = @HAVE_DOXYGEN@ -HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PKG_CONFIG = @PKG_CONFIG@ -PYTHON = @PYTHON@ -PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ -PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ -PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ -PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ -PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ -PYTHON_PLATFORM = @PYTHON_PLATFORM@ -PYTHON_PREFIX = @PYTHON_PREFIX@ -PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ -PYTHON_VERSION = @PYTHON_VERSION@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ -SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ -SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ -STRIP = @STRIP@ -SWIG = @SWIG@ -SWIG_LIB = @SWIG_LIB@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -pkgpyexecdir = @pkgpyexecdir@ -pkgpythondir = @pkgpythondir@ -plugindir = @plugindir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -pyexecdir = @pyexecdir@ -pythondir = @pythondir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -pocketsphinx_mdef_convert_SOURCES = mdef_convert.c -pocketsphinx_mdef_convert_LDADD = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la - -pocketsphinx_batch_SOURCES = batch.c -pocketsphinx_batch_LDADD = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la - -pocketsphinx_continuous_SOURCES = continuous.c -pocketsphinx_continuous_LDADD = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -lsphinxad - -AM_CFLAGS = -I$(top_srcdir)/include \ - -I$(top_srcdir)/src/libpocketsphinx \ - -I$(top_builddir)/include - -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/programs/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign src/programs/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ - fi; \ - for p in $$list; do echo "$$p $$p"; done | \ - sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p \ - || test -f $$p1 \ - ; then echo "$$p"; echo "$$p"; else :; fi; \ - done | \ - sed -e 'p;s,.*/,,;n;h' \ - -e 's|.*|.|' \ - -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ - sed 'N;N;N;s,\n, ,g' | \ - $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ - { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ - if ($$2 == $$4) files[d] = files[d] " " $$1; \ - else { print "f", $$3 "/" $$4, $$1; } } \ - END { for (d in files) print "f", d, files[d] }' | \ - while read type dir files; do \ - if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ - test -z "$$files" || { \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ - } \ - ; done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - files=`for p in $$list; do echo "$$p"; done | \ - sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' \ - `; \ - test -n "$$list" || exit 0; \ - echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(bindir)" && rm -f $$files - -clean-binPROGRAMS: - @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ - echo " rm -f" $$list; \ - rm -f $$list || exit $$?; \ - test -n "$(EXEEXT)" || exit 0; \ - list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f" $$list; \ - rm -f $$list - -pocketsphinx_batch$(EXEEXT): $(pocketsphinx_batch_OBJECTS) $(pocketsphinx_batch_DEPENDENCIES) $(EXTRA_pocketsphinx_batch_DEPENDENCIES) - @rm -f pocketsphinx_batch$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(pocketsphinx_batch_OBJECTS) $(pocketsphinx_batch_LDADD) $(LIBS) - -pocketsphinx_continuous$(EXEEXT): $(pocketsphinx_continuous_OBJECTS) $(pocketsphinx_continuous_DEPENDENCIES) $(EXTRA_pocketsphinx_continuous_DEPENDENCIES) - @rm -f pocketsphinx_continuous$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(pocketsphinx_continuous_OBJECTS) $(pocketsphinx_continuous_LDADD) $(LIBS) - -pocketsphinx_mdef_convert$(EXEEXT): $(pocketsphinx_mdef_convert_OBJECTS) $(pocketsphinx_mdef_convert_DEPENDENCIES) $(EXTRA_pocketsphinx_mdef_convert_DEPENDENCIES) - @rm -f pocketsphinx_mdef_convert$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(pocketsphinx_mdef_convert_OBJECTS) $(pocketsphinx_mdef_convert_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/batch.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/continuous.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mdef_convert.Po@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-am - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-am - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(PROGRAMS) -installdirs: - for dir in "$(DESTDIR)$(bindir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-binPROGRAMS - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-binPROGRAMS - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ - clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ - ctags ctags-am distclean distclean-compile distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-binPROGRAMS \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags tags-am uninstall uninstall-am uninstall-binPROGRAMS - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/src/programs/continuous.c b/src/programs/continuous.c deleted file mode 100644 index 1fd1223..0000000 --- a/src/programs/continuous.c +++ /dev/null @@ -1,344 +0,0 @@ -/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ -/* ==================================================================== - * Copyright (c) 1999-2010 Carnegie Mellon University. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * This work was supported in part by funding from the Defense Advanced - * Research Projects Agency and the National Science Foundation of the - * United States of America, and the CMU Sphinx Speech Consortium. - * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY - * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * ==================================================================== - * - */ -/* - * continuous.c - Simple pocketsphinx command-line application to test - * both continuous listening/silence filtering from microphone - * and continuous file transcription. - */ - -/* - * This is a simple example of pocketsphinx application that uses continuous listening - * with silence filtering to automatically segment a continuous stream of audio input - * into utterances that are then decoded. - * - * Remarks: - * - Each utterance is ended when a silence segment of at least 1 sec is recognized. - * - Single-threaded implementation for portability. - * - Uses audio library; can be replaced with an equivalent custom library. - */ - -#include -#include -#include - -#if defined(_WIN32) && !defined(__CYGWIN__) -#include -#else -#include -#endif - -#include -#include - -#include "pocketsphinx.h" - -static const arg_t cont_args_def[] = { - POCKETSPHINX_OPTIONS, - /* Argument file. */ - {"-argfile", - ARG_STRING, - NULL, - "Argument file giving extra arguments."}, - {"-adcdev", - ARG_STRING, - NULL, - "Name of audio device to use for input."}, - {"-infile", - ARG_STRING, - NULL, - "Audio file to transcribe."}, - {"-inmic", - ARG_BOOLEAN, - "no", - "Transcribe audio from microphone."}, - {"-time", - ARG_BOOLEAN, - "no", - "Print word times in file transcription."}, - CMDLN_EMPTY_OPTION -}; - -static ps_decoder_t *ps; -static cmd_ln_t *config; -static FILE *rawfd; - -static void -print_word_times() -{ - int frame_rate = cmd_ln_int32_r(config, "-frate"); - ps_seg_t *iter = ps_seg_iter(ps); - while (iter != NULL) { - int32 sf, ef, pprob; - float conf; - - ps_seg_frames(iter, &sf, &ef); - pprob = ps_seg_prob(iter, NULL, NULL, NULL); - conf = logmath_exp(ps_get_logmath(ps), pprob); - printf("%s %.3f %.3f %f\n", ps_seg_word(iter), ((float)sf / frame_rate), - ((float) ef / frame_rate), conf); - iter = ps_seg_next(iter); - } -} - -static int -check_wav_header(char *header, int expected_sr) -{ - int sr; - - if (header[34] != 0x10) { - E_ERROR("Input audio file has [%d] bits per sample instead of 16\n", header[34]); - return 0; - } - if (header[20] != 0x1) { - E_ERROR("Input audio file has compression [%d] and not required PCM\n", header[20]); - return 0; - } - if (header[22] != 0x1) { - E_ERROR("Input audio file has [%d] channels, expected single channel mono\n", header[22]); - return 0; - } - sr = ((header[24] & 0xFF) | ((header[25] & 0xFF) << 8) | ((header[26] & 0xFF) << 16) | ((header[27] & 0xFF) << 24)); - if (sr != expected_sr) { - E_ERROR("Input audio file has sample rate [%d], but decoder expects [%d]\n", sr, expected_sr); - return 0; - } - return 1; -} - -/* - * Continuous recognition from a file - */ -static void -recognize_from_file() -{ - int16 adbuf[2048]; - const char *fname; - const char *hyp; - int32 k; - uint8 utt_started, in_speech; - int32 print_times = cmd_ln_boolean_r(config, "-time"); - - fname = cmd_ln_str_r(config, "-infile"); - if ((rawfd = fopen(fname, "rb")) == NULL) { - E_FATAL_SYSTEM("Failed to open file '%s' for reading", - fname); - } - - if (strlen(fname) > 4 && strcmp(fname + strlen(fname) - 4, ".wav") == 0) { - char waveheader[44]; - fread(waveheader, 1, 44, rawfd); - if (!check_wav_header(waveheader, (int)cmd_ln_float32_r(config, "-samprate"))) - E_FATAL("Failed to process file '%s' due to format mismatch.\n", fname); - } - - if (strlen(fname) > 4 && strcmp(fname + strlen(fname) - 4, ".mp3") == 0) { - E_FATAL("Can not decode mp3 files, convert input file to WAV 16kHz 16-bit mono before decoding.\n"); - } - - ps_start_utt(ps); - utt_started = FALSE; - - while ((k = fread(adbuf, sizeof(int16), 2048, rawfd)) > 0) { - ps_process_raw(ps, adbuf, k, FALSE, FALSE); - in_speech = ps_get_in_speech(ps); - if (in_speech && !utt_started) { - utt_started = TRUE; - } - if (!in_speech && utt_started) { - ps_end_utt(ps); - hyp = ps_get_hyp(ps, NULL); - if (hyp != NULL) - printf("%s\n", hyp); - if (print_times) - print_word_times(); - fflush(stdout); - - ps_start_utt(ps); - utt_started = FALSE; - } - } - ps_end_utt(ps); - if (utt_started) { - hyp = ps_get_hyp(ps, NULL); - if (hyp != NULL) { - printf("%s\n", hyp); - if (print_times) { - print_word_times(); - } - } - } - - fclose(rawfd); -} - -/* Sleep for specified msec */ -static void -sleep_msec(int32 ms) -{ -#if (defined(_WIN32) && !defined(GNUWINCE)) || defined(_WIN32_WCE) - Sleep(ms); -#else - /* ------------------- Unix ------------------ */ - struct timeval tmo; - - tmo.tv_sec = 0; - tmo.tv_usec = ms * 1000; - - select(0, NULL, NULL, NULL, &tmo); -#endif -} - -/* - * Main utterance processing loop: - * for (;;) { - * start utterance and wait for speech to process - * decoding till end-of-utterance silence will be detected - * print utterance result; - * } - */ -static void -recognize_from_microphone() -{ - ad_rec_t *ad; - int16 adbuf[2048]; - uint8 utt_started, in_speech; - int32 k; - char const *hyp; - - if ((ad = ad_open_dev(cmd_ln_str_r(config, "-adcdev"), - (int) cmd_ln_float32_r(config, - "-samprate"))) == NULL) - E_FATAL("Failed to open audio device\n"); - if (ad_start_rec(ad) < 0) - E_FATAL("Failed to start recording\n"); - - if (ps_start_utt(ps) < 0) - E_FATAL("Failed to start utterance\n"); - utt_started = FALSE; - E_INFO("Ready....\n"); - - for (;;) { - if ((k = ad_read(ad, adbuf, 2048)) < 0) - E_FATAL("Failed to read audio\n"); - ps_process_raw(ps, adbuf, k, FALSE, FALSE); - in_speech = ps_get_in_speech(ps); - if (in_speech && !utt_started) { - utt_started = TRUE; - E_INFO("Listening...\n"); - } - if (!in_speech && utt_started) { - /* speech -> silence transition, time to start new utterance */ - ps_end_utt(ps); - hyp = ps_get_hyp(ps, NULL ); - if (hyp != NULL) { - printf("%s\n", hyp); - fflush(stdout); - } - - if (ps_start_utt(ps) < 0) - E_FATAL("Failed to start utterance\n"); - utt_started = FALSE; - E_INFO("Ready....\n"); - } - sleep_msec(100); - } - ad_close(ad); -} - -int -main(int argc, char *argv[]) -{ - char const *cfg; - - config = cmd_ln_parse_r(NULL, cont_args_def, argc, argv, TRUE); - - /* Handle argument file as -argfile. */ - if (config && (cfg = cmd_ln_str_r(config, "-argfile")) != NULL) { - config = cmd_ln_parse_file_r(config, cont_args_def, cfg, FALSE); - } - - if (config == NULL || (cmd_ln_str_r(config, "-infile") == NULL && cmd_ln_boolean_r(config, "-inmic") == FALSE)) { - E_INFO("Specify '-infile ' to recognize from file or '-inmic yes' to recognize from microphone.\n"); - cmd_ln_free_r(config); - return 1; - } - - ps_default_search_args(config); - ps = ps_init(config); - if (ps == NULL) { - cmd_ln_free_r(config); - return 1; - } - - E_INFO("%s COMPILED ON: %s, AT: %s\n\n", argv[0], __DATE__, __TIME__); - - if (cmd_ln_str_r(config, "-infile") != NULL) { - recognize_from_file(); - } else if (cmd_ln_boolean_r(config, "-inmic")) { - recognize_from_microphone(); - } - - ps_free(ps); - cmd_ln_free_r(config); - - return 0; -} - -#if defined(_WIN32_WCE) -#pragma comment(linker,"/entry:mainWCRTStartup") -#include -//Windows Mobile has the Unicode main only -int -wmain(int32 argc, wchar_t * wargv[]) -{ - char **argv; - size_t wlen; - size_t len; - int i; - - argv = malloc(argc * sizeof(char *)); - for (i = 0; i < argc; i++) { - wlen = lstrlenW(wargv[i]); - len = wcstombs(NULL, wargv[i], wlen); - argv[i] = malloc(len + 1); - wcstombs(argv[i], wargv[i], wlen); - } - - //assuming ASCII parameters - return main(argc, argv); -} -#endif diff --git a/src/libpocketsphinx/ps_alignment.c b/src/ps_alignment.c similarity index 85% rename from src/libpocketsphinx/ps_alignment.c rename to src/ps_alignment.c index f1cd7c9..2c4c40e 100644 --- a/src/libpocketsphinx/ps_alignment.c +++ b/src/ps_alignment.c @@ -39,19 +39,22 @@ * @file ps_alignment.c Multi-level alignment structure */ -/* System headers. */ - -/* SphinxBase headers. */ -#include - -/* Local headers. */ -#include "ps_alignment.h" +#include "util/ckd_alloc.h" +#include "ps_alignment_internal.h" ps_alignment_t * ps_alignment_init(dict2pid_t *d2p) { ps_alignment_t *al = ckd_calloc(1, sizeof(*al)); al->d2p = dict2pid_retain(d2p); + al->refcount = 1; + return al; +} + +ps_alignment_t * +ps_alignment_retain(ps_alignment_t *al) +{ + ++al->refcount; return al; } @@ -60,6 +63,8 @@ ps_alignment_free(ps_alignment_t *al) { if (al == NULL) return 0; + if (--al->refcount > 0) + return al->refcount; dict2pid_free(al->d2p); ckd_free(al->word.seq); ckd_free(al->sseq.seq); @@ -106,17 +111,14 @@ ps_alignment_vector_empty(ps_alignment_vector_t *vec) int ps_alignment_add_word(ps_alignment_t *al, - int32 wid, int duration) + int32 wid, int start, int duration) { ps_alignment_entry_t *ent; if ((ent = ps_alignment_vector_grow_one(&al->word)) == NULL) return 0; ent->id.wid = wid; - if (al->word.n_ent > 1) - ent->start = ent[-1].start + ent[-1].duration; - else - ent->start = 0; + ent->start = start; ent->duration = duration; ent->score = 0; ent->parent = PS_ALIGNMENT_NONE; @@ -347,24 +349,6 @@ ps_alignment_propagate(ps_alignment_t *al) return 0; } -int -ps_alignment_n_words(ps_alignment_t *al) -{ - return (int)al->word.n_ent; -} - -int -ps_alignment_n_phones(ps_alignment_t *al) -{ - return (int)al->sseq.n_ent; -} - -int -ps_alignment_n_states(ps_alignment_t *al) -{ - return (int)al->state.n_ent; -} - ps_alignment_iter_t * ps_alignment_words(ps_alignment_t *al) { @@ -376,6 +360,7 @@ ps_alignment_words(ps_alignment_t *al) itor->al = al; itor->vec = &al->word; itor->pos = 0; + itor->parent = PS_ALIGNMENT_NONE; return itor; } @@ -390,6 +375,8 @@ ps_alignment_phones(ps_alignment_t *al) itor->al = al; itor->vec = &al->sseq; itor->pos = 0; + /* Iterate over *all* phones */ + itor->parent = PS_ALIGNMENT_NONE; return itor; } @@ -404,6 +391,8 @@ ps_alignment_states(ps_alignment_t *al) itor->al = al; itor->vec = &al->state; itor->pos = 0; + /* Iterate over *all* states */ + itor->parent = PS_ALIGNMENT_NONE; return itor; } @@ -413,9 +402,59 @@ ps_alignment_iter_get(ps_alignment_iter_t *itor) return itor->vec->seq + itor->pos; } +const char * +ps_alignment_iter_name(ps_alignment_iter_t *itor) +{ + ps_alignment_entry_t *ent; + if (itor == NULL) + return NULL; + ent = ps_alignment_iter_get(itor); + if (itor->vec == &itor->al->word) { + return dict_wordstr(itor->al->d2p->dict, + ent->id.wid); + } + else if (itor->vec == &itor->al->sseq) { + return bin_mdef_ciphone_str(itor->al->d2p->mdef, + ent->id.pid.cipid); + } + else if (itor->vec == &itor->al->state) { + int len = snprintf(NULL, 0, "%u", ent->id.senid); + if (len == 0) { + E_ERROR_SYSTEM("snprintf() failed"); + return NULL; + } + if (itor->name) + ckd_free(itor->name); + itor->name = ckd_malloc(len + 1); + if (snprintf(itor->name, len + 1, "%u", ent->id.senid) != len) { + E_ERROR_SYSTEM("snprintf() failed"); + return NULL; + } + return itor->name; + } + else + return NULL; +} + +int +ps_alignment_iter_seg(ps_alignment_iter_t *itor, int *start, int *duration) +{ + ps_alignment_entry_t *ent; + if (itor == NULL) + return 0; + ent = ps_alignment_iter_get(itor); + if (start) + *start = ent->start; + if (duration) + *duration = ent->duration; + return ent->score; +} + int ps_alignment_iter_free(ps_alignment_iter_t *itor) { + if (itor->name) + ckd_free(itor->name); ckd_free(itor); return 0; } @@ -430,6 +469,9 @@ ps_alignment_iter_goto(ps_alignment_iter_t *itor, int pos) return NULL; } itor->pos = pos; + /* Switch to this word/phone as parent */ + if (itor->parent != PS_ALIGNMENT_NONE) + itor->parent = itor->vec->seq[itor->pos].parent; return itor; } @@ -442,15 +484,8 @@ ps_alignment_iter_next(ps_alignment_iter_t *itor) ps_alignment_iter_free(itor); return NULL; } - return itor; -} - -ps_alignment_iter_t * -ps_alignment_iter_prev(ps_alignment_iter_t *itor) -{ - if (itor == NULL) - return NULL; - if (--itor->pos < 0) { + if (itor->parent != PS_ALIGNMENT_NONE + && itor->vec->seq[itor->pos].parent != itor->parent) { ps_alignment_iter_free(itor); return NULL; } @@ -458,27 +493,7 @@ ps_alignment_iter_prev(ps_alignment_iter_t *itor) } ps_alignment_iter_t * -ps_alignment_iter_up(ps_alignment_iter_t *itor) -{ - ps_alignment_iter_t *itor2; - if (itor == NULL) - return NULL; - if (itor->vec == &itor->al->word) - return NULL; - if (itor->vec->seq[itor->pos].parent == PS_ALIGNMENT_NONE) - return NULL; - itor2 = ckd_calloc(1, sizeof(*itor2)); - itor2->al = itor->al; - itor2->pos = itor->vec->seq[itor->pos].parent; - if (itor->vec == &itor->al->sseq) - itor2->vec = &itor->al->word; - else - itor2->vec = &itor->al->sseq; - return itor2; -} - -ps_alignment_iter_t * -ps_alignment_iter_down(ps_alignment_iter_t *itor) +ps_alignment_iter_children(ps_alignment_iter_t *itor) { ps_alignment_iter_t *itor2; if (itor == NULL) @@ -490,6 +505,8 @@ ps_alignment_iter_down(ps_alignment_iter_t *itor) itor2 = ckd_calloc(1, sizeof(*itor2)); itor2->al = itor->al; itor2->pos = itor->vec->seq[itor->pos].child; + /* Iterate over only parent's phones/states */ + itor2->parent = itor->pos; if (itor->vec == &itor->al->word) itor2->vec = &itor->al->sseq; else diff --git a/src/libpocketsphinx/ps_alignment.h b/src/ps_alignment_internal.h similarity index 60% rename from src/libpocketsphinx/ps_alignment.h rename to src/ps_alignment_internal.h index 4774bef..72e2d6a 100644 --- a/src/libpocketsphinx/ps_alignment.h +++ b/src/ps_alignment_internal.h @@ -35,41 +35,55 @@ * */ -/** - * @file ps_alignment.h Multi-level alignment structure - */ - -#ifndef __PS_ALIGNMENT_H__ -#define __PS_ALIGNMENT_H__ +#ifndef __PS_ALIGNMENT_INTERNAL_H__ +#define __PS_ALIGNMENT_INTERNAL_H__ -/* System headers. */ +#include -/* SphinxBase headers. */ -#include - -/* Local headers. */ #include "dict2pid.h" #include "hmm.h" -#define PS_ALIGNMENT_NONE ((uint16)0xffff) - -struct ps_alignment_entry_s { +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * @struct ps_alignment_entry_t + * @brief Entry (phone, word, or state) in an alignment + */ +typedef struct ps_alignment_entry_s { + int32 start; /**< Start frame index. */ + int32 duration; /**< Duration in frames. */ + int32 score; /**< Alignment score (fairly meaningless). */ + /** + * Index of parent node. + * + * You can use this to determine if you have crossed a parent + * boundary. For example if you wish to iterate only over phones + * inside a word, you can store this for the first phone and stop + * iterating once it changes. */ + int parent; + int child; /**< Index of child node. */ + /** + * ID or IDs for this entry. + * + * This is complex, though perhaps not needlessly so. We need all + * this information to do state alignment. + */ union { - int32 wid; + int32 wid; /**< Word ID (for words) */ struct { - uint16 ssid; - uint16 cipid; - uint16 tmatid; + int16 cipid; /**< Phone ID, which you care about. */ + uint16 ssid; /**< Senone sequence ID, which you don't. */ + int32 tmatid; /**< Transition matrix ID, almost certainly + the same as cipid. */ } pid; uint16 senid; } id; - int16 start; - int16 duration; - int32 score; - uint16 parent; - uint16 child; -}; -typedef struct ps_alignment_entry_s ps_alignment_entry_t; +} ps_alignment_entry_t; struct ps_alignment_vector_s { ps_alignment_entry_t *seq; @@ -78,35 +92,35 @@ struct ps_alignment_vector_s { typedef struct ps_alignment_vector_s ps_alignment_vector_t; struct ps_alignment_s { + int refcount; dict2pid_t *d2p; ps_alignment_vector_t word; ps_alignment_vector_t sseq; ps_alignment_vector_t state; }; -typedef struct ps_alignment_s ps_alignment_t; struct ps_alignment_iter_s { ps_alignment_t *al; ps_alignment_vector_t *vec; int pos; + int parent; + char *name; }; -typedef struct ps_alignment_iter_s ps_alignment_iter_t; + +#define ps_alignment_n_words(al) (int)(al)->word.n_ent +#define ps_alignment_n_phones(al) (int)(al)->sseq.n_ent +#define ps_alignment_n_states(al) (int)(al)->state.n_ent /** * Create a new, empty alignment. */ ps_alignment_t *ps_alignment_init(dict2pid_t *d2p); -/** - * Release an alignment - */ -int ps_alignment_free(ps_alignment_t *al); - /** * Append a word. */ int ps_alignment_add_word(ps_alignment_t *al, - int32 wid, int duration); + int32 wid, int start, int duration); /** * Populate lower layers using available word information. @@ -123,38 +137,10 @@ int ps_alignment_populate_ci(ps_alignment_t *al); */ int ps_alignment_propagate(ps_alignment_t *al); -/** - * Number of words. - */ -int ps_alignment_n_words(ps_alignment_t *al); - -/** - * Number of phones. - */ -int ps_alignment_n_phones(ps_alignment_t *al); - -/** - * Number of states. - */ -int ps_alignment_n_states(ps_alignment_t *al); - -/** - * Iterate over the alignment starting at the first word. - */ -ps_alignment_iter_t *ps_alignment_words(ps_alignment_t *al); - -/** - * Iterate over the alignment starting at the first phone. - */ -ps_alignment_iter_t *ps_alignment_phones(ps_alignment_t *al); - -/** - * Iterate over the alignment starting at the first state. - */ -ps_alignment_iter_t *ps_alignment_states(ps_alignment_t *al); - /** * Get the alignment entry pointed to by an iterator. + * + * The iterator retains ownership of this so don't try to free it. */ ps_alignment_entry_t *ps_alignment_iter_get(ps_alignment_iter_t *itor); @@ -163,28 +149,8 @@ ps_alignment_entry_t *ps_alignment_iter_get(ps_alignment_iter_t *itor); */ ps_alignment_iter_t *ps_alignment_iter_goto(ps_alignment_iter_t *itor, int pos); -/** - * Move an alignment iterator forward. - */ -ps_alignment_iter_t *ps_alignment_iter_next(ps_alignment_iter_t *itor); - -/** - * Move an alignment iterator back. - */ -ps_alignment_iter_t *ps_alignment_iter_prev(ps_alignment_iter_t *itor); - -/** - * Get a new iterator starting at the parent of the current node. - */ -ps_alignment_iter_t *ps_alignment_iter_up(ps_alignment_iter_t *itor); -/** - * Get a new iterator starting at the first child of the current node. - */ -ps_alignment_iter_t *ps_alignment_iter_down(ps_alignment_iter_t *itor); - -/** - * Release an iterator before completing all iterations. - */ -int ps_alignment_iter_free(ps_alignment_iter_t *itor); +#ifdef __cplusplus +} /* extern "C" */ +#endif -#endif /* __PS_ALIGNMENT_H__ */ +#endif /* __PS_ALIGNMENT_INTERNAL_H__ */ diff --git a/src/ps_config.c b/src/ps_config.c new file mode 100644 index 0000000..8821fca --- /dev/null +++ b/src/ps_config.c @@ -0,0 +1,832 @@ +/* -*- c-basic-offset:4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2022 David Huggins-Daines. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ + + +#include + +#include "util/cmd_ln.h" +#include "util/strfuncs.h" + +#include "pocketsphinx_internal.h" +#include "config_macro.h" +#include "jsmn.h" + +static const ps_arg_t ps_args_def[] = { + POCKETSPHINX_OPTIONS, + CMDLN_EMPTY_OPTION +}; + +ps_arg_t const * +ps_args(void) +{ + return ps_args_def; +} + +ps_config_t * +ps_config_init(const ps_arg_t *defn) +{ + ps_config_t *config = ckd_calloc(1, sizeof(*config)); + int i, ndef; + + config->refcount = 1; + if (defn) + config->defn = defn; + else + config->defn = ps_args_def; + for (ndef = 0; config->defn[ndef].name; ndef++) + ; + config->ht = hash_table_new(ndef, FALSE); + for (i = 0; i < ndef; i++) { + cmd_ln_val_t *val; + if ((val = cmd_ln_val_init(config->defn[i].type, + config->defn[i].name, + config->defn[i].deflt)) == NULL) { + E_ERROR + ("Bad default argument value for %s: %s\n", + config->defn[i].name, config->defn[i].deflt); + continue; + } + hash_table_enter(config->ht, val->name, (void *)val); + } + return config; +} + +ps_config_t * +ps_config_retain(ps_config_t *config) +{ + ++config->refcount; + return config; +} + +int +ps_config_free(ps_config_t *config) +{ + if (config == NULL) + return 0; + if (--config->refcount > 0) + return config->refcount; + if (config->ht) { + glist_t entries; + gnode_t *gn; + int32 n; + + entries = hash_table_tolist(config->ht, &n); + for (gn = entries; gn; gn = gnode_next(gn)) { + hash_entry_t *e = (hash_entry_t *)gnode_ptr(gn); + cmd_ln_val_free((cmd_ln_val_t *)e->val); + } + glist_free(entries); + hash_table_free(config->ht); + config->ht = NULL; + } + + if (config->f_argv) { + int32 i; + for (i = 0; i < (int32)config->f_argc; ++i) { + ckd_free(config->f_argv[i]); + } + ckd_free(config->f_argv); + config->f_argv = NULL; + config->f_argc = 0; + } + if (config->json) + ckd_free(config->json); + ckd_free(config); + return 0; +} + +static const char *searches[] = { + "lm", + "jsgf", + "fsg", + "keyphrase", + "kws", + "allphone", + "lmctl" +}; +static const int nsearches = sizeof(searches)/sizeof(searches[0]); + +int +ps_config_validate(ps_config_t *config) +{ + int i, found = 0; + for (i = 0; i < nsearches; ++i) { + if (ps_config_str(config, searches[i]) != NULL) + if (++found > 1) + break; + } + if (found > 1) { + int len = strlen("Only one of "); + char *msg; + for (i = 0; i < nsearches; ++i) + len += strlen(searches[i]) + 2; + len += strlen("can be enabled at a time in config\n"); + msg = ckd_malloc(len + 1); + strcpy(msg, "Only one of "); + for (i = 0; i < nsearches; ++i) { + strcat(msg, searches[i]); + strcat(msg, ", "); + } + strcat(msg, "can be enabled at a time in config\n"); + E_ERROR(msg); + ckd_free(msg); + return -1; + } + return 0; +} + +void +json_error(int err) +{ + const char *errstr; + switch (err) { + case JSMN_ERROR_INVAL: + errstr = "JSMN_ERROR_INVAL - bad token, JSON string is corrupted"; + break; + case JSMN_ERROR_NOMEM: + errstr = "JSMN_ERROR_NOMEM - not enough tokens, JSON string is too large"; + break; + case JSMN_ERROR_PART: + errstr = "JSMN_ERROR_PART - JSON string is too short, expecting more JSON data"; + break; + case 0: + errstr = "JSON string appears to be empty"; + break; + default: + errstr = "Unknown error"; + } + E_ERROR("JSON parsing failed: %s\n", errstr); +} + +size_t +unescape(char *out, const char *in, size_t len) +{ + char *ptr = out; + size_t i; + + for (i = 0; i < len; ++i) { + int c = in[i]; + if (c == '\\') { + switch (in[i+1]) { + case '"': *ptr++ = '"'; i++; break; + case '\\': *ptr++ = '\\'; i++; break; + case 'b': *ptr++ = '\b'; i++; break; + case 'f': *ptr++ = '\f'; i++; break; + case 'n': *ptr++ = '\n'; i++; break; + case 'r': *ptr++ = '\r'; i++; break; + case 't': *ptr++ = '\t'; i++; break; + default: + E_WARN("Unsupported escape sequence \\%c\n", in[i+1]); + *ptr++ = c; + } + } + else { + *ptr++ = c; + } + } + *ptr = '\0'; + return ptr - out; +} + +ps_config_t * +ps_config_parse_json(ps_config_t *config, + const char *json) +{ + jsmn_parser parser; + jsmntok_t *tokens = NULL; + char *key = NULL, *val = NULL; + int i, jslen, ntok, new_config = FALSE; + + if (json == NULL) + return NULL; + if (config == NULL) { + if ((config = ps_config_init(NULL)) == NULL) + return NULL; + new_config = TRUE; + } + jsmn_init(&parser); + jslen = strlen(json); + if ((ntok = jsmn_parse(&parser, json, jslen, NULL, 0)) <= 0) { + json_error(ntok); + goto error_out; + } + /* Need to reset the parser before second pass! */ + jsmn_init(&parser); + tokens = ckd_calloc(ntok, sizeof(*tokens)); + if ((i = jsmn_parse(&parser, json, jslen, tokens, ntok)) != ntok) { + json_error(i); + goto error_out; + } + /* Accept missing top-level object. */ + i = 0; + if (tokens[0].type == JSMN_OBJECT) + ++i; + while (i < ntok) { + key = ckd_malloc(tokens[i].end - tokens[i].start + 1); + unescape(key, json + tokens[i].start, tokens[i].end - tokens[i].start); + if (tokens[i].type != JSMN_STRING && tokens[i].type != JSMN_PRIMITIVE) { + E_ERROR("Expected string or primitive key, got %s\n", key); + goto error_out; + } + if (++i == ntok) { + E_ERROR("Missing value for %s\n", key); + goto error_out; + } + val = ckd_malloc(tokens[i].end - tokens[i].start + 1); + unescape(val, json + tokens[i].start, tokens[i].end - tokens[i].start); + if (ps_config_set_str(config, key, val) == NULL) { + E_ERROR("Unknown or invalid parameter %s\n", key); + goto error_out; + } + ckd_free(key); + ckd_free(val); + key = val = NULL; + ++i; + } + + ckd_free(key); + ckd_free(val); + ckd_free(tokens); + return config; + +error_out: + if (key) + ckd_free(key); + if (val) + ckd_free(val); + if (tokens) + ckd_free(tokens); + if (new_config) + ps_config_free(config); + return NULL; +} + +/* Following two functions are: + * + * Copyright (C) 2014 James McLaughlin. All rights reserved. + * https://github.com/udp/json-builder + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +static size_t measure_string (unsigned int length, + const char *str) +{ + unsigned int i; + size_t measured_length = 0; + + for(i = 0; i < length; ++ i) + { + int c = str[i]; + + switch (c) + { + case '"': + case '\\': + case '\b': + case '\f': + case '\n': + case '\r': + case '\t': + + measured_length += 2; + break; + + default: + + ++ measured_length; + break; + }; + }; + + return measured_length; +} + +#define PRINT_ESCAPED(c) do { \ + *buf ++ = '\\'; \ + *buf ++ = (c); \ +} while(0); \ + +static size_t serialize_string(char *buf, + unsigned int length, + const char *str) +{ + char *orig_buf = buf; + unsigned int i; + + for(i = 0; i < length; ++ i) + { + int c = str [i]; + + switch (c) + { + case '"': PRINT_ESCAPED ('\"'); continue; + case '\\': PRINT_ESCAPED ('\\'); continue; + case '\b': PRINT_ESCAPED ('b'); continue; + case '\f': PRINT_ESCAPED ('f'); continue; + case '\n': PRINT_ESCAPED ('n'); continue; + case '\r': PRINT_ESCAPED ('r'); continue; + case '\t': PRINT_ESCAPED ('t'); continue; + + default: + + *buf ++ = c; + break; + }; + }; + + return buf - orig_buf; +} +/* End code from json-builder */ + +static int +serialize_key(char *ptr, int maxlen, const char *key) +{ + int slen, len = 0; + if (ptr) { + *ptr++ = '\t'; + *ptr++ = '"'; + maxlen -= 2; + } + len += 2; /* \t\" */ + if (ptr) { + assert(maxlen > 0); + slen = serialize_string(ptr, strlen(key), key); + ptr += slen; + maxlen -= slen; + } + else { + slen = measure_string(strlen(key), key); + } + len += slen; + + if (ptr) { + assert(maxlen > 0); + *ptr++ = '"'; + *ptr++ = ':'; + *ptr++ = ' '; + maxlen -= 3; + } + len += 3; /* "\": " */ + return len; +} + +static int +serialize_value(char *ptr, int maxlen, const char *val) +{ + int slen, len = 0; + if (ptr) { + *ptr++ = '"'; + maxlen--; + } + len++; /* \" */ + if (ptr) { + assert(maxlen > 0); + slen = serialize_string(ptr, strlen(val), val); + ptr += slen; + maxlen -= slen; + } + else { + slen = measure_string(strlen(val), val); + } + len += slen; + + if (ptr) { + assert(maxlen > 0); + *ptr++ = '"'; + *ptr++ = ','; + *ptr++ = '\n'; + maxlen -= 3; + } + len += 3; /* "\",\n" */ + return len; +} + +static int +build_json(ps_config_t *config, char *json, int len) +{ + hash_iter_t *itor; + char *ptr = json; + int l, rv = 0; + + if ((l = snprintf(ptr, len, "{\n")) < 0) + return -1; + rv += l; + if (ptr) { + len -= l; + ptr += l; + } + for (itor = hash_table_iter(config->ht); itor; + itor = hash_table_iter_next(itor)) { + const char *key = hash_entry_key(itor->ent); + cmd_ln_val_t *cval = hash_entry_val(itor->ent); + if (cval->type & ARG_STRING && cval->val.ptr == NULL) + continue; + if ((l = serialize_key(ptr, len, key)) < 0) + return -1; + rv += l; + if (ptr) { + len -= l; + ptr += l; + } + if (cval->type & ARG_STRING) { + if ((l = serialize_value(ptr, len, + (char *)cval->val.ptr)) < 0) + return -1; + } + else if (cval->type & ARG_INTEGER) { + if ((l = snprintf(ptr, len, "%ld,\n", + cval->val.i)) < 0) + return -1; + } + else if (cval->type & ARG_BOOLEAN) { + if ((l = snprintf(ptr, len, "%s,\n", + cval->val.i ? "true" : "false")) < 0) + return -1; + } + else if (cval->type & ARG_FLOATING) { + if ((l = snprintf(ptr, len, "%g,\n", + cval->val.fl)) < 0) + return -1; + } + else { + E_ERROR("Unknown type %d for parameter %s\n", + cval->type, key); + } + rv += l; + if (ptr) { + len -= l; + ptr += l; + } + } + /* Back off last comma because JSON is awful */ + if (ptr && ptr > json + 1) { + len += 2; + ptr -= 2; + } + if ((l = snprintf(ptr, len, "\n}\n")) < 0) + return -1; + rv += l; + if (ptr) { + len -= l; + ptr += l; + } + return rv; +} + +const char * +ps_config_serialize_json(ps_config_t *config) +{ + int len = build_json(config, NULL, 0); + if (len < 0) + return NULL; + if (config->json) + ckd_free(config->json); + config->json = ckd_malloc(len + 1); + if (build_json(config, config->json, len + 1) != len) { + ckd_free(config->json); + config->json = NULL; + } + return config->json; +} + +ps_type_t +ps_config_typeof(ps_config_t *config, char const *name) +{ + void *val; + if (hash_table_lookup(config->ht, name, &val) < 0) + return 0; + if (val == NULL) + return 0; + return ((cmd_ln_val_t *)val)->type; +} + +const anytype_t * +ps_config_get(ps_config_t *config, const char *name) +{ + void *val; + if (hash_table_lookup(config->ht, name, &val) < 0) + return NULL; + if (val == NULL) + return NULL; + return &((cmd_ln_val_t *)val)->val; +} + +long +ps_config_int(cmd_ln_t *config, char const *name) +{ + cmd_ln_val_t *val; + val = cmd_ln_access_r(config, name); + if (val == NULL) + return 0L; + if (!(val->type & (ARG_INTEGER | ARG_BOOLEAN))) { + E_ERROR("Argument %s does not have integer type\n", name); + return 0L; + } + return val->val.i; +} + +int +ps_config_bool(ps_config_t *config, char const *name) +{ + long val = ps_config_int(config, name); + return val != 0; +} + +double +ps_config_float(ps_config_t *config, char const *name) +{ + cmd_ln_val_t *val; + val = cmd_ln_access_r(config, name); + if (val == NULL) + return 0.0; + if (!(val->type & ARG_FLOATING)) { + E_ERROR("Argument %s does not have floating-point type\n", name); + return 0.0; + } + return val->val.fl; +} + +char const * +ps_config_str(cmd_ln_t *config, char const *name) +{ + cmd_ln_val_t *val; + val = cmd_ln_access_r(config, name); + if (val == NULL) + return NULL; + if (!(val->type & ARG_STRING)) { + E_ERROR("Argument %s does not have string type\n", name); + return NULL; + } + return (char const *)val->val.ptr; +} + +static const anytype_t * +ps_config_unset(ps_config_t *config, char const *name) +{ + cmd_ln_val_t *cval = cmd_ln_access_r(config, name); + const ps_arg_t *arg; + if (cval == NULL) { + E_ERROR("Unknown parameter %s\n", name); + return NULL; + } + /* FIXME: Perhaps cmd_ln_val_t should store a pointer to ps_arg_t */ + for (arg = config->defn; arg->name; ++arg) { + if (0 == strcmp(arg->name, name)) { + if (anytype_from_str(&cval->val, cval->type, arg->deflt) == NULL) + return NULL; + break; + } + } + if (arg->name == NULL) { + E_ERROR("No definition found for %s\n", name); + return NULL; + } + return &cval->val; +} + +const anytype_t * +ps_config_set(ps_config_t *config, const char *name, const anytype_t *val, ps_type_t t) +{ + if (val == NULL) { + /* Restore default parameter */ + return ps_config_unset(config, name); + } + else if (t & ARG_STRING) + return ps_config_set_str(config, name, val->ptr); + else if (t & ARG_INTEGER) + return ps_config_set_int(config, name, val->i); + else if (t & ARG_BOOLEAN) + return ps_config_set_bool(config, name, val->i); + else if (t & ARG_FLOATING) + return ps_config_set_bool(config, name, val->fl); + else { + E_ERROR("Value has unknown type %d\n", name, t); + return NULL; + } +} + +anytype_t * +anytype_from_str(anytype_t *val, int t, const char *str) +{ + if (val == NULL) + return NULL; + if (str == NULL) { + if (val->ptr && (t & ARG_STRING)) + ckd_free(val->ptr); + memset(val, 0, sizeof(*val)); + return val; + } + if (strlen(str) == 0) + return NULL; + switch (t) { + case ARG_INTEGER: + case REQARG_INTEGER: + if (sscanf(str, "%ld", &val->i) != 1) + return NULL; + break; + case ARG_FLOATING: + case REQARG_FLOATING: + val->fl = atof_c(str); + break; + case ARG_BOOLEAN: + case REQARG_BOOLEAN: + if ((str[0] == 'y') || (str[0] == 't') || + (str[0] == 'Y') || (str[0] == 'T') || (str[0] == '1')) { + val->i = TRUE; + } + else if ((str[0] == 'n') || (str[0] == 'f') || + (str[0] == 'N') || (str[0] == 'F') | + (str[0] == '0')) { + val->i = FALSE; + } + else { + E_ERROR("Unparsed boolean value '%s'\n", str); + return NULL; + } + break; + case ARG_STRING: + case REQARG_STRING: + if (val->ptr) + ckd_free(val->ptr); + val->ptr = ckd_salloc(str); + break; + default: + E_ERROR("Unknown argument type: %d\n", t); + return NULL; + } + return val; +} + +const anytype_t * +ps_config_set_str(ps_config_t *config, char const *name, char const *val) +{ + cmd_ln_val_t *cval = cmd_ln_access_r(config, name); + if (cval == NULL) { + E_ERROR("Unknown parameter %s\n", name); + return NULL; + } + if (anytype_from_str(&cval->val, cval->type, val) == NULL) { + return NULL; + } + return &cval->val; +} + +anytype_t * +anytype_from_int(anytype_t *val, int t, long i) +{ + if (val == NULL) + return NULL; + switch (t) { + case ARG_INTEGER: + case REQARG_INTEGER: + val->i = i; + break; + case ARG_FLOATING: + case REQARG_FLOATING: + val->fl = (double)i; + break; + case ARG_BOOLEAN: + case REQARG_BOOLEAN: + val->i = (i != 0); + break; + case ARG_STRING: + case REQARG_STRING: { + int len = snprintf(NULL, 0, "%ld", i); + if (len < 0) { + E_ERROR_SYSTEM("snprintf() failed"); + return NULL; + } + val->ptr = ckd_malloc(len + 1); + if (snprintf(val->ptr, len + 1, "%ld", i) != len) { + E_ERROR_SYSTEM("snprintf() failed"); + return NULL; + } + break; + } + default: + E_ERROR("Unknown argument type: %d\n", t); + return NULL; + } + return val; +} + +const anytype_t * +ps_config_set_int(ps_config_t *config, char const *name, long val) +{ + cmd_ln_val_t *cval = cmd_ln_access_r(config, name); + if (cval == NULL) { + E_ERROR("Unknown parameter %s\n", name); + return NULL; + } + if (anytype_from_int(&cval->val, cval->type, val) == NULL) { + return NULL; + } + return &cval->val; +} + +anytype_t * +anytype_from_float(anytype_t *val, int t, double f) +{ + if (val == NULL) + return NULL; + switch (t) { + case ARG_INTEGER: + case REQARG_INTEGER: + val->i = (long)f; + break; + case ARG_FLOATING: + case REQARG_FLOATING: + val->fl = f; + break; + case ARG_BOOLEAN: + case REQARG_BOOLEAN: + val->i = (f != 0.0); + break; + case ARG_STRING: + case REQARG_STRING: { + int len = snprintf(NULL, 0, "%g", f); + if (len < 0) { + E_ERROR_SYSTEM("snprintf() failed"); + return NULL; + } + val->ptr = ckd_malloc(len + 1); + if (snprintf(val->ptr, len + 1, "%g", f) != len) { + E_ERROR_SYSTEM("snprintf() failed"); + return NULL; + } + break; + } + default: + E_ERROR("Unknown argument type: %d\n", t); + return NULL; + } + return val; +} + +const anytype_t * +ps_config_set_float(ps_config_t *config, char const *name, double val) +{ + cmd_ln_val_t *cval = cmd_ln_access_r(config, name); + if (cval == NULL) { + E_ERROR("Unknown parameter %s\n", name); + return NULL; + } + if (anytype_from_float(&cval->val, cval->type, val) == NULL) { + return NULL; + } + return &cval->val; +} + +const anytype_t * +ps_config_set_bool(ps_config_t *config, char const *name, int val) +{ + return ps_config_set_int(config, name, val != 0); +} diff --git a/src/ps_endpointer.c b/src/ps_endpointer.c new file mode 100644 index 0000000..3fc463f --- /dev/null +++ b/src/ps_endpointer.c @@ -0,0 +1,344 @@ +/* -*- c-basic-offset:4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2022 David Huggins-Daines. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ + +#include +#include + +#include + +#include "util/ckd_alloc.h" + +struct ps_endpointer_s { + ps_vad_t *vad; + int refcount; + int start_frames, end_frames; + double frame_length; + int in_speech; + int frame_size; + int maxlen; + int16 *buf; + int8 *is_speech; + int pos, n; + double qstart_time, timestamp; + double speech_start, speech_end; +}; + +ps_endpointer_t * +ps_endpointer_init(double window, + double ratio, + ps_vad_mode_t mode, + int sample_rate, double frame_length) +{ + ps_endpointer_t *ep = ckd_calloc(1, sizeof(*ep)); + ep->refcount = 1; + if ((ep->vad = ps_vad_init(mode, sample_rate, frame_length)) == NULL) + goto error_out; + if (window == 0.0) + window = PS_ENDPOINTER_DEFAULT_WINDOW; + if (ratio == 0.0) + ratio = PS_ENDPOINTER_DEFAULT_RATIO; + ep->frame_length = ps_vad_frame_length(ep->vad); + ep->maxlen = (int)(window / ep->frame_length + 0.5); + ep->start_frames = (int)(ratio * ep->maxlen); + ep->end_frames = (int)((1.0 - ratio) * ep->maxlen + 0.5); + /* Make sure endpointing is possible ;-) */ + if (ep->start_frames <= 0 || ep->start_frames >= ep->maxlen) { + E_ERROR("Ratio %.2f makes start-pointing stupid or impossible (%d frames of %d)\n", + ratio, ep->start_frames, ep->maxlen); + goto error_out; + } + if (ep->end_frames <= 0 || ep->end_frames >= ep->maxlen) { + E_ERROR("Ratio %.2f makes end-pointing stupid or impossible (%d frames of %d)\n", + ratio, ep->end_frames, ep->maxlen); + goto error_out; + } + E_INFO("Threshold %d%% of %.3fs window (>%d frames <%d frames of %d)\n", + (int)(ratio * 100.0 + 0.5), + ep->maxlen * ep->frame_length, ep->start_frames, ep->end_frames, ep->maxlen); + ep->frame_size = ps_endpointer_frame_size(ep); + ep->buf = ckd_calloc(sizeof(*ep->buf), + ep->maxlen * ep->frame_size); + ep->is_speech = ckd_calloc(1, ep->maxlen); + ep->pos = ep->n = 0; + return ep; +error_out: + ps_endpointer_free(ep); + return NULL; +} + +ps_endpointer_t * +ps_endpointer_retain(ps_endpointer_t *ep) +{ + ++ep->refcount; + return ep; +} + +int +ps_endpointer_free(ps_endpointer_t *ep) +{ + if (ep == NULL) + return 0; + if (--ep->refcount > 0) + return ep->refcount; + ps_vad_free(ep->vad); + if (ep->buf) + ckd_free(ep->buf); + if (ep->is_speech) + ckd_free(ep->is_speech); + ckd_free(ep); + return 0; +} + +ps_vad_t * +ps_endpointer_vad(ps_endpointer_t *ep) +{ + if (ep == NULL) + return NULL; + return ep->vad; +} + +static int +ep_empty(ps_endpointer_t *ep) +{ + return ep->n == 0; +} + +static int +ep_full(ps_endpointer_t *ep) +{ + return ep->n == ep->maxlen; +} + +static void +ep_clear(ps_endpointer_t *ep) +{ + ep->n = 0; +} + +static int +ep_speech_count(ps_endpointer_t *ep) +{ + int count = 0; + if (ep_empty(ep)) + ; + else if (ep_full(ep)) { + int i; + for (i = 0; i < ep->maxlen; ++i) + count += ep->is_speech[i]; + } + else { + int i = ep->pos, end = (ep->pos + ep->n) % ep->maxlen; + count = ep->is_speech[i++]; + while (i != end) { + count += ep->is_speech[i++]; + i = i % ep->maxlen; + } + } + return count; +} + +static int +ep_push(ps_endpointer_t *ep, int is_speech, const int16 *frame) +{ + int i = (ep->pos + ep->n) % ep->maxlen; + int16 *dest = ep->buf + (i * ep->frame_size); + memcpy(dest, frame, sizeof(*ep->buf) * ep->frame_size); + ep->is_speech[i] = is_speech; + if (ep_full(ep)) { + ep->qstart_time += ep->frame_length; + ep->pos = (ep->pos + 1) % ep->maxlen; + } + else + ep->n++; + return ep->n; +} + +static int16 * +ep_pop(ps_endpointer_t *ep, int *out_is_speech) +{ + int16 *pcm; + if (ep_empty(ep)) + return NULL; + ep->qstart_time += ep->frame_length; + if (out_is_speech) + *out_is_speech = ep->is_speech[ep->pos]; + pcm = ep->buf + (ep->pos * ep->frame_size); + ep->pos = (ep->pos + 1) % ep->maxlen; + ep->n--; + return pcm; +} + +static void +ep_linearize(ps_endpointer_t *ep) +{ + int16 *tmp_pcm; + uint8 *tmp_is_speech; + + if (ep->pos == 0) + return; + /* Second part of data: | **** ^ .. | */ + tmp_pcm = ckd_calloc(sizeof(*ep->buf), + ep->pos * ep->frame_size); + tmp_is_speech = ckd_calloc(sizeof(*ep->is_speech), ep->pos); + memcpy(tmp_pcm, ep->buf, + sizeof(*ep->buf) * ep->pos * ep->frame_size); + memcpy(tmp_is_speech, ep->is_speech, + sizeof(*ep->is_speech) * ep->pos); + + /* First part of data: | .... ^ ** | -> | ** ---- | */ + memmove(ep->buf, ep->buf + ep->pos * ep->frame_size, + sizeof(*ep->buf) * (ep->maxlen - ep->pos) * ep->frame_size); + memmove(ep->is_speech, ep->is_speech + ep->pos, + sizeof(*ep->is_speech) * (ep->maxlen - ep->pos)); + + /* Second part of data: | .. **** | */ + memcpy(ep->buf + (ep->maxlen - ep->pos) * ep->frame_size, tmp_pcm, + sizeof(*ep->buf) * ep->pos * ep->frame_size); + memcpy(ep->is_speech + (ep->maxlen - ep->pos), tmp_is_speech, + sizeof(*ep->is_speech) * ep->pos); + + /* Update pointer */ + ep->pos = 0; + ckd_free(tmp_pcm); + ckd_free(tmp_is_speech); +} + +const int16 * +ps_endpointer_end_stream(ps_endpointer_t *ep, + const int16 *frame, + size_t nsamp, + size_t *out_nsamp) +{ + if (nsamp > (size_t)ep->frame_size) { + E_ERROR("Final frame must be %d samples or less\n", + ep->frame_size); + return NULL; + } + + if (out_nsamp) + *out_nsamp = 0; + if (!ep->in_speech) + return NULL; + ep->in_speech = FALSE; + ep->speech_end = ep->qstart_time; + + /* Rotate the buffer so we can return data in a single call. */ + ep_linearize(ep); + assert(ep->pos == 0); + while (!ep_empty(ep)) { + int is_speech; + ep_pop(ep, &is_speech); + if (is_speech) { + if (out_nsamp) + *out_nsamp += ep->frame_size; + ep->speech_end = ep->qstart_time; + } + else + break; + } + /* If we used all the VAD queue, add the trailing samples. */ + if (ep_empty(ep) && ep->speech_end == ep->qstart_time) { + if (ep->pos == ep->maxlen) { + E_ERROR("VAD queue overflow (should not happen)"); + /* Not fatal, we just lose data. */ + } + else { + ep->timestamp += + (double)nsamp / ps_endpointer_sample_rate(ep); + if (out_nsamp) + *out_nsamp += nsamp; + memcpy(ep->buf + ep->pos * ep->frame_size, + frame, nsamp * sizeof(*ep->buf)); + ep->speech_end = ep->timestamp; + } + } + ep_clear(ep); + return ep->buf; +} + +const int16 * +ps_endpointer_process(ps_endpointer_t *ep, + const int16 *frame) +{ + int is_speech, speech_count; + if (ep == NULL || ep->vad == NULL) + return NULL; + if (ep->in_speech && ep_full(ep)) { + E_ERROR("VAD queue overflow (should not happen)"); + /* Not fatal, we just lose data. */ + } + is_speech = ps_vad_classify(ep->vad, frame); + ep_push(ep, is_speech, frame); + ep->timestamp += ep->frame_length; + speech_count = ep_speech_count(ep); + E_DEBUG("%.2f %d %d %d\n", ep->timestamp, speech_count, + ep->start_frames, ep->end_frames); + if (ep->in_speech) { + if (speech_count < ep->end_frames) { + /* Return only the first frame. Either way it's sort of + arbitrary, but this avoids having to drain the queue to + prevent overlapping segments. It's also closer to what + human annotators will do. */ + int16 *pcm = ep_pop(ep, NULL); + ep->speech_end = ep->qstart_time; + ep->in_speech = FALSE; + return pcm; + } + } + else { + if (speech_count > ep->start_frames) { + ep->speech_start = ep->qstart_time; + ep->speech_end = 0; + ep->in_speech = TRUE; + } + } + if (ep->in_speech) + return ep_pop(ep, NULL); + else + return NULL; +} + +int +ps_endpointer_in_speech(ps_endpointer_t *ep) +{ + return ep->in_speech; +} + +double +ps_endpointer_speech_start(ps_endpointer_t *ep) +{ + return ep->speech_start; +} + +double +ps_endpointer_speech_end(ps_endpointer_t *ep) +{ + return ep->speech_end; +} diff --git a/src/libpocketsphinx/ps_lattice.c b/src/ps_lattice.c similarity index 96% rename from src/libpocketsphinx/ps_lattice.c rename to src/ps_lattice.c index 3b326f8..b749b90 100644 --- a/src/libpocketsphinx/ps_lattice.c +++ b/src/ps_lattice.c @@ -39,19 +39,17 @@ * @file ps_lattice.c Word graph search. */ -/* System headers. */ #include #include #include -/* SphinxBase headers. */ -#include -#include -#include -#include -#include +#include + +#include "util/ckd_alloc.h" +#include "util/listelem_alloc.h" +#include "util/strfuncs.h" +#include "util/pio.h" -/* Local headers. */ #include "pocketsphinx_internal.h" #include "ps_lattice_internal.h" #include "ngram_search.h" @@ -235,9 +233,12 @@ ps_lattice_write(ps_lattice_t *dag, char const *filename) "Nodes %d (NODEID WORD STARTFRAME FIRST-ENDFRAME LAST-ENDFRAME)\n", i); for (i = 0, d = dag->nodes; d; d = d->next, i++) { + const char *word = dict_wordstr(dag->dict, d->wid); + if (word == NULL) + word = "(null)"; d->id = i; fprintf(fp, "%d %s %d %d %d ; %d\n", - i, dict_wordstr(dag->dict, d->wid), + i, word, d->sf, d->fef, d->lef, d->node_id); } fprintf(fp, "#\n"); @@ -392,11 +393,11 @@ ps_lattice_read(ps_decoder_t *ps, lineiter_t *line; float64 lb; float32 logratio; - ps_latnode_t *tail; ps_latnode_t **darray; ps_lattice_t *dag; int i, k, n_nodes; int32 pip, silpen, fillpen; + ps_latnode_t **pnodes; dag = ckd_calloc(1, sizeof(*dag)); @@ -404,7 +405,7 @@ ps_lattice_read(ps_decoder_t *ps, dag->search = ps->search; dag->dict = dict_retain(ps->dict); dag->lmath = logmath_retain(ps->lmath); - dag->frate = cmd_ln_int32_r(dag->search->config, "-frate"); + dag->frate = ps_config_int(dag->search->config, "frate"); } else { dag->dict = dict_init(NULL, NULL); @@ -417,7 +418,6 @@ ps_lattice_read(ps_decoder_t *ps, dag->latlink_list_alloc = listelem_alloc_init(sizeof(latlink_list_t)); dag->refcount = 1; - tail = NULL; darray = NULL; E_INFO("Reading DAG file: %s\n", file); @@ -471,11 +471,12 @@ ps_lattice_read(ps_decoder_t *ps, /* Read nodes */ darray = ckd_calloc(n_nodes, sizeof(*darray)); + pnodes = &dag->nodes; for (i = 0; i < n_nodes; i++) { - ps_latnode_t *d; int32 w; int seqid, sf, fef, lef; char wd[256]; + ps_latnode_t *node; if ((line = lineiter_next(line)) == NULL) { E_ERROR("Premature EOF while loading Nodes(%s)\n", file); @@ -511,23 +512,19 @@ ps_lattice_read(ps_decoder_t *ps, goto load_error; } - d = listelem_malloc(dag->latnode_alloc); - darray[i] = d; - d->wid = w; - d->basewid = dict_basewid(dag->dict, w); - d->id = seqid; - d->sf = sf; - d->fef = fef; - d->lef = lef; - d->reachable = 0; - d->exits = d->entries = NULL; - d->next = NULL; - - if (!dag->nodes) - dag->nodes = d; - else - tail->next = d; - tail = d; + *pnodes = listelem_malloc(dag->latnode_alloc); + node = *pnodes; + darray[i] = node; + node->wid = w; + node->basewid = dict_basewid(dag->dict, w); + node->id = seqid; + node->sf = sf; + node->fef = fef; + node->lef = lef; + node->reachable = 0; + node->exits = node->entries = NULL; + node->next = NULL; + pnodes = &node->next; } /* Read initial node ID */ @@ -581,6 +578,7 @@ ps_lattice_read(ps_decoder_t *ps, pd = darray[from]; d = darray[to]; if (logratio != 1.0f) + /* FIXME: possible under/overflow!!! */ ascr = (int32)(ascr * logratio); ps_lattice_link(dag, pd, d, ascr, d->sf - 1); } @@ -609,13 +607,13 @@ ps_lattice_read(ps_decoder_t *ps, if (ps) { /* Build links around silence and filler words, since they do * not exist in the language model. FIXME: This is - * potentially buggy, as we already do this before outputing + * potentially buggy, as we already do this before outputting * lattices. */ - pip = logmath_log(dag->lmath, cmd_ln_float32_r(ps->config, "-pip")); + pip = logmath_log(dag->lmath, ps_config_float(ps->config, "pip")); silpen = pip + logmath_log(dag->lmath, - cmd_ln_float32_r(ps->config, "-silprob")); + ps_config_float(ps->config, "silprob")); fillpen = pip + logmath_log(dag->lmath, - cmd_ln_float32_r(ps->config, "-fillprob")); + ps_config_float(ps->config, "fillprob")); ps_lattice_penalize_fillers(dag, silpen, fillpen); } @@ -624,7 +622,7 @@ ps_lattice_read(ps_decoder_t *ps, load_error: E_ERROR("Failed to load %s\n", file); lineiter_free(line); - if (fp) fclose_comp(fp, ispipe); + fclose_comp(fp, ispipe); ckd_free(darray); return NULL; } @@ -644,7 +642,7 @@ ps_lattice_init_search(ps_search_t *search, int n_frame) dag->search = search; dag->dict = dict_retain(search->dict); dag->lmath = logmath_retain(search->acmod->lmath); - dag->frate = cmd_ln_int32_r(dag->search->config, "-frate"); + dag->frate = ps_config_int(dag->search->config, "frate"); dag->silence = dict_silwid(dag->dict); dag->n_frames = n_frame; dag->latnode_alloc = listelem_alloc_init(sizeof(ps_latnode_t)); @@ -700,6 +698,7 @@ void ps_latnode_iter_free(ps_latnode_iter_t *itor) { /* Do absolutely nothing. */ + (void)itor; } ps_latnode_t * @@ -767,6 +766,7 @@ void ps_latlink_iter_free(ps_latlink_iter_t *itor) { /* Do absolutely nothing. */ + (void)itor; } ps_latlink_t * @@ -851,7 +851,7 @@ ps_lattice_hyp(ps_lattice_t *dag, ps_latlink_t *link) /* Backtrace again to construct hypothesis string. */ ckd_free(dag->hyp_str); - dag->hyp_str = ckd_calloc(1, len+1); /* extra one incase the hyp is empty */ + dag->hyp_str = ckd_calloc(1, len+1); /* extra one in case the hyp is empty */ c = dag->hyp_str + len - 1; if (dict_real_word(dag->dict, link->to->basewid)) { char *wstr = dict_wordstr(dag->dict, link->to->basewid); @@ -960,7 +960,8 @@ ps_lattice_link2itor(ps_seg_t *seg, ps_latlink_t *link, int to) } } } - seg->word = dict_wordstr(ps_search_dict(seg->search), node->wid); + seg->text = dict_wordstr(ps_search_dict(seg->search), node->wid); + seg->wid = node->wid; seg->sf = node->sf; seg->ascr = link->ascr << SENSCR_SHIFT; /* Compute language model score from best predecessors. */ @@ -987,7 +988,7 @@ ps_lattice_seg_next(ps_seg_t *seg) return NULL; } else if (itor->cur == itor->n_links) { - /* Re-use the last link but with the "to" node. */ + /* Reuse the last link but with the "to" node. */ ps_lattice_link2itor(seg, itor->links[itor->cur - 1], TRUE); } else { @@ -1375,6 +1376,7 @@ ps_lattice_bestpath(ps_lattice_t *dag, ngram_model_t *lmset, } } /* FIXME: floating point... */ + /* FIXME: possible under/overflow!!! */ dag->norm += (int32)(dag->final_node_ascr << SENSCR_SHIFT) * ascale; E_INFO("Bestpath score: %d\n", bestescr); @@ -1397,7 +1399,7 @@ ps_lattice_joint(ps_lattice_t *dag, ps_latlink_t *link, float32 ascale) else lmset = NULL; - jprob = (dag->final_node_ascr << SENSCR_SHIFT) * ascale; + jprob = (int32)((dag->final_node_ascr << SENSCR_SHIFT) * ascale); while (link) { if (lmset) { int lback; @@ -1434,7 +1436,7 @@ ps_lattice_joint(ps_lattice_t *dag, ps_latlink_t *link, float32 ascale) /* If there is no language model, we assume that the language model probability (such as it is) has been included in the link score. */ - jprob += (link->ascr << SENSCR_SHIFT) * ascale; + jprob += (int32)((link->ascr << SENSCR_SHIFT) * ascale); link = link->best_prev; } @@ -1504,14 +1506,14 @@ ps_lattice_posterior(ps_lattice_t *dag, ngram_model_t *lmset, bestend = link; } /* Imaginary exit link from final node has beta = 1.0 */ - link->beta = bprob + (dag->final_node_ascr << SENSCR_SHIFT) * ascale; + link->beta = bprob + (int32)((dag->final_node_ascr << SENSCR_SHIFT) * ascale); } else { /* Update beta from all outgoing betas. */ for (x = link->to->exits; x; x = x->next) { link->beta = logmath_add(lmath, link->beta, x->link->beta + bprob - + (x->link->ascr << SENSCR_SHIFT) * ascale); + + (int)((x->link->ascr << SENSCR_SHIFT) * ascale)); } } } @@ -1859,7 +1861,8 @@ ps_astar_node2itor(astar_seg_t *itor) seg->ef = node->lef; else seg->ef = itor->nodes[itor->cur + 1]->sf - 1; - seg->word = dict_wordstr(ps_search_dict(seg->search), node->wid); + seg->text = dict_wordstr(ps_search_dict(seg->search), node->wid); + seg->wid = node->wid; seg->sf = node->sf; seg->prob = 0; /* FIXME: implement forward-backward */ } diff --git a/src/libpocketsphinx/ps_lattice_internal.h b/src/ps_lattice_internal.h similarity index 98% rename from src/libpocketsphinx/ps_lattice_internal.h rename to src/ps_lattice_internal.h index 4e5f7dd..69dce62 100644 --- a/src/libpocketsphinx/ps_lattice_internal.h +++ b/src/ps_lattice_internal.h @@ -42,6 +42,15 @@ #ifndef __PS_LATTICE_INTERNAL_H__ #define __PS_LATTICE_INTERNAL_H__ +#include "pocketsphinx_internal.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + /** * Linked list of DAG link pointers. * @@ -278,5 +287,8 @@ char const *ps_astar_hyp(ps_astar_t *nbest, ps_latpath_t *path); */ ps_seg_t *ps_astar_seg_iter(ps_astar_t *astar, ps_latpath_t *path, float32 lwf); +#ifdef __cplusplus +} /* extern "C" */ +#endif #endif /* __PS_LATTICE_INTERNAL_H__ */ diff --git a/src/libpocketsphinx/ps_mllr.c b/src/ps_mllr.c similarity index 98% rename from src/libpocketsphinx/ps_mllr.c rename to src/ps_mllr.c index b43f6fb..02e70ee 100644 --- a/src/libpocketsphinx/ps_mllr.c +++ b/src/ps_mllr.c @@ -39,13 +39,9 @@ * @file ps_mllr.c Model-space linear transforms for speaker adaptation */ -/* System headers. */ #include -/* SphinxBase headers. */ -#include - -/* Local headers. */ +#include "util/ckd_alloc.h" #include "acmod.h" ps_mllr_t * diff --git a/src/ps_vad.c b/src/ps_vad.c new file mode 100644 index 0000000..69d3075 --- /dev/null +++ b/src/ps_vad.c @@ -0,0 +1,151 @@ +/* -*- c-basic-offset:4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2022 David Huggins-Daines. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ + +#include +#include + +#include +#include + +#include "util/ckd_alloc.h" + +#include "common_audio/vad/include/webrtc_vad.h" +#include "common_audio/vad/vad_core.h" + +struct ps_vad_s { + VadInstT v; + int refcount; + int sample_rate; + int closest_sample_rate; + int frame_size; +}; + +ps_vad_t * +ps_vad_init(ps_vad_mode_t mode, int sample_rate, double frame_length) +{ + ps_vad_t *vad = ckd_calloc(1, sizeof(*vad)); + vad->refcount = 1; + WebRtcVad_Init((VadInst *)vad); + if (WebRtcVad_set_mode((VadInst *)vad, mode) < 0) { + E_ERROR("Invalid VAD mode %d\n", mode); + goto error_out; + } + if (ps_vad_set_input_params(vad, sample_rate, frame_length) < 0) + goto error_out; + return vad; +error_out: + ps_vad_free(vad); + return NULL; +} + +ps_vad_t * +ps_vad_retain(ps_vad_t *vad) +{ + ++vad->refcount; + return vad; +} + +int +ps_vad_free(ps_vad_t *vad) +{ + if (vad == NULL) + return 0; + if (--vad->refcount > 0) + return vad->refcount; + ckd_free(vad); + return 0; +} + +static const int sample_rates[] = { + 8000, 16000, 32000, 48000 +}; +static const int n_sample_rates = sizeof(sample_rates)/sizeof(sample_rates[0]); + +int +ps_vad_set_input_params(ps_vad_t *vad, int sample_rate, double frame_length) +{ + size_t frame_size; + int i, rv; + int closest_sample_rate = 0; + double best_diff = 0.5; + + if (sample_rate == 0) + sample_rate = PS_VAD_DEFAULT_SAMPLE_RATE; + if (frame_length == 0) + frame_length = PS_VAD_DEFAULT_FRAME_LENGTH; + for (i = 0; i < n_sample_rates; ++i) { + double diff = fabs(1.0 - (double)sample_rates[i] / sample_rate); + if (diff < best_diff) { + closest_sample_rate = sample_rates[i]; + best_diff = diff; + } + } + if (closest_sample_rate == 0) { + E_ERROR("No suitable sampling rate found for %d\n", sample_rate); + return -1; + } + frame_size = (size_t)(closest_sample_rate * frame_length); + if (closest_sample_rate != sample_rate) { + E_INFO("Closest supported sampling rate to %d is %d, frame size %d (%.3fs)\n", + sample_rate, closest_sample_rate, frame_size, (double)frame_size / sample_rate); + } + if ((rv = WebRtcVad_ValidRateAndFrameLength(closest_sample_rate, frame_size)) < 0) { + E_WARN("Unsupported frame length %f\n", frame_length); + return rv; + } + vad->sample_rate = sample_rate; + vad->closest_sample_rate = closest_sample_rate; + vad->frame_size = frame_size; + return rv; +} + +int +ps_vad_sample_rate(ps_vad_t *vad) +{ + if (vad == NULL) + return -1; + return vad->sample_rate; +} + +size_t +ps_vad_frame_size(ps_vad_t *vad) +{ + if (vad == NULL) + return -1; + return vad->frame_size; +} + +ps_vad_class_t +ps_vad_classify(ps_vad_t *vad, const short *frame) +{ + return WebRtcVad_Process((VadInst *)vad, + vad->closest_sample_rate, + frame, vad->frame_size); +} diff --git a/src/libpocketsphinx/ptm_mgau.c b/src/ptm_mgau.c similarity index 94% rename from src/libpocketsphinx/ptm_mgau.c rename to src/ptm_mgau.c index c7f0620..f8bac27 100644 --- a/src/libpocketsphinx/ptm_mgau.c +++ b/src/ptm_mgau.c @@ -35,7 +35,6 @@ * */ -/* System headers */ #include #include #include @@ -47,16 +46,11 @@ #include #endif -/* SphinxBase headers */ -#include -#include -#include -#include -#include -#include -#include +#include -/* Local headers */ +#include "fe/fixpoint.h" +#include "util/ckd_alloc.h" +#include "util/bio.h" #include "tied_mgau_common.h" #include "ptm_mgau.h" @@ -132,7 +126,10 @@ eval_topn(ptm_mgau_t *s, int cb, int feat, mfcc_t *z) obs += 4; mean += 4; } - insertion_sort_topn(topn, i, (int32)d); + if (d < (mfcc_t)MAX_NEG_INT32) /* Redundant if FIXED_POINT */ + insertion_sort_topn(topn, i, MAX_NEG_INT32); + else + insertion_sort_topn(topn, i, (int32)d); } return topn[0].score; @@ -219,7 +216,10 @@ eval_cb(ptm_mgau_t *s, int cb, int feat, mfcc_t *z) } if (i < s->max_topn) continue; /* already there. Don't insert */ - insertion_sort_cb(&cur, worst, best, cw, (int32)d); + if (d < (mfcc_t)MAX_NEG_INT32) /* Redundant if FIXED_POINT */ + insertion_sort_cb(&cur, worst, best, cw, MAX_NEG_INT32); + else + insertion_sort_cb(&cur, worst, best, cw, (int32)d); } return best->score; @@ -267,6 +267,8 @@ ptm_mgau_codebook_norm(ptm_mgau_t *s, mfcc_t **z, int frame) { int i, j; + (void)z; + (void)frame; for (j = 0; j < s->g->n_feat; ++j) { int32 norm = WORST_SCORE; for (i = 0; i < s->g->n_mgau; ++i) { @@ -275,7 +277,6 @@ ptm_mgau_codebook_norm(ptm_mgau_t *s, mfcc_t **z, int frame) if (norm < s->f->topn[i][j][0].score >> SENSCR_SHIFT) norm = s->f->topn[i][j][0].score >> SENSCR_SHIFT; } - assert(norm != WORST_SCORE); for (i = 0; i < s->g->n_mgau; ++i) { int32 k; if (bitvec_is_clear(s->f->mgau_active, i)) @@ -310,13 +311,12 @@ ptm_mgau_calc_cb_active(ptm_mgau_t *s, uint8 *senone_active, bitvec_set(s->f->mgau_active, cb); lastsen = sen; } - E_DEBUG(1, ("Active codebooks:")); + E_DEBUG("Active codebooks:"); for (i = 0; i < s->g->n_mgau; ++i) { if (bitvec_is_clear(s->f->mgau_active, i)) continue; - E_DEBUGCONT(1, (" %d", i)); + E_DEBUG(" %d", i); } - E_DEBUGCONT(1, ("\n")); return 0; } @@ -385,8 +385,8 @@ ptm_mgau_senone_eval(ptm_mgau_t *s, int16 *senone_scores, else fden = fast_logmath_add(s->lmath_8b, fden, mixw + topn[j].score); - E_DEBUG(3, ("fden[%d][%d] l+= %d + %d = %d\n", - sen, f, mixw, topn[j].score, fden)); + E_DEBUG("fden[%d][%d] l+= %d + %d = %d\n", + sen, f, mixw, topn[j].score, fden); } ascore += fden; } @@ -468,7 +468,7 @@ read_sendump(ptm_mgau_t *s, bin_mdef_t *mdef, char const *file) int n_bits = 8; s->n_sen = n_sen; /* FIXME: Should have been done earlier */ - do_mmap = cmd_ln_boolean_r(s->config, "-mmap"); + do_mmap = ps_config_bool(s->config, "mmap"); if ((fp = fopen(file, "rb")) == NULL) return -1; @@ -489,7 +489,7 @@ read_sendump(ptm_mgau_t *s, bin_mdef_t *mdef, char const *file) } do_swap = 1; } - if (fread(line, sizeof(char), n, fp) != n) { + if (fread(line, sizeof(char), n, fp) != (size_t)n) { E_ERROR_SYSTEM("Cannot read title"); goto error_out; } @@ -505,7 +505,7 @@ read_sendump(ptm_mgau_t *s, bin_mdef_t *mdef, char const *file) goto error_out; } if (do_swap) SWAP_INT32(&n); - if (fread(line, sizeof(char), n, fp) != n) { + if (fread(line, sizeof(char), n, fp) != (size_t)n) { E_ERROR_SYSTEM("Cannot read header"); goto error_out; } @@ -523,7 +523,7 @@ read_sendump(ptm_mgau_t *s, bin_mdef_t *mdef, char const *file) if (do_swap) SWAP_INT32(&n); if (n == 0) break; - if (fread(line, sizeof(char), n, fp) != n) { + if (fread(line, sizeof(char), n, fp) != (size_t)n) { E_ERROR_SYSTEM("Cannot read header"); goto error_out; } @@ -766,6 +766,34 @@ read_mixw(ptm_mgau_t * s, char const *file_name, double SmoothMin) return n_sen; } +void +ptm_mgau_reset_fast_hist(ps_mgau_t *ps) +{ + ptm_mgau_t *s = (ptm_mgau_t *)ps; + int i; + + for (i = 0; i < s->n_fast_hist; ++i) { + int j, k, m; + /* Top-N codewords for every codebook and feature. */ + s->hist[i].topn = ckd_calloc_3d(s->g->n_mgau, s->g->n_feat, + s->max_topn, sizeof(ptm_topn_t)); + /* Initialize them to sane (yet arbitrary) defaults. */ + for (j = 0; j < s->g->n_mgau; ++j) { + for (k = 0; k < s->g->n_feat; ++k) { + for (m = 0; m < s->max_topn; ++m) { + s->hist[i].topn[j][k][m].cw = m; + s->hist[i].topn[j][k][m].score = WORST_DIST; + } + } + } + /* Active codebook mapping (just codebook, not features, + at least not yet) */ + s->hist[i].mgau_active = bitvec_alloc(s->g->n_mgau); + /* Start with them all on, prune them later. */ + bitvec_set_all(s->hist[i].mgau_active, s->g->n_mgau); + } +} + ps_mgau_t * ptm_mgau_init(acmod_t *acmod, bin_mdef_t *mdef) { @@ -790,9 +818,9 @@ ptm_mgau_init(acmod_t *acmod, bin_mdef_t *mdef) } /* Read means and variances. */ - if ((s->g = gauden_init(cmd_ln_str_r(s->config, "_mean"), - cmd_ln_str_r(s->config, "_var"), - cmd_ln_float32_r(s->config, "-varfloor"), + if ((s->g = gauden_init(ps_config_str(s->config, "mean"), + ps_config_str(s->config, "var"), + ps_config_float(s->config, "varfloor"), s->lmath)) == NULL) { E_ERROR("Failed to read means and variances\n"); goto error_out; @@ -815,26 +843,26 @@ ptm_mgau_init(acmod_t *acmod, bin_mdef_t *mdef) goto error_out; } for (i = 0; i < s->g->n_feat; ++i) { - if (s->g->featlen[i] != feat_dimension2(acmod->fcb, i)) { + if ((uint32)s->g->featlen[i] != feat_dimension2(acmod->fcb, i)) { E_ERROR("Dimension of stream %d does not match: %d != %d\n", s->g->featlen[i], feat_dimension2(acmod->fcb, i)); goto error_out; } } /* Read mixture weights. */ - if ((sendump_path = cmd_ln_str_r(s->config, "_sendump"))) { + if ((sendump_path = ps_config_str(s->config, "sendump"))) { if (read_sendump(s, acmod->mdef, sendump_path) < 0) { goto error_out; } } else { - if (read_mixw(s, cmd_ln_str_r(s->config, "_mixw"), - cmd_ln_float32_r(s->config, "-mixwfloor")) < 0) { + if (read_mixw(s, ps_config_str(s->config, "mixw"), + ps_config_float(s->config, "mixwfloor")) < 0) { goto error_out; } } - s->ds_ratio = cmd_ln_int32_r(s->config, "-ds"); - s->max_topn = cmd_ln_int32_r(s->config, "-topn"); + s->ds_ratio = ps_config_int(s->config, "ds"); + s->max_topn = ps_config_int(s->config, "topn"); E_INFO("Maximum top-N: %d\n", s->max_topn); /* Assume mapping of senones to their base phones, though this @@ -846,32 +874,13 @@ ptm_mgau_init(acmod_t *acmod, bin_mdef_t *mdef) /* Allocate fast-match history buffers. We need enough for the * phoneme lookahead window, plus the current frame, plus one for * good measure? (FIXME: I don't remember why) */ - s->n_fast_hist = cmd_ln_int32_r(s->config, "-pl_window") + 2; + s->n_fast_hist = ps_config_int(s->config, "pl_window") + 2; s->hist = ckd_calloc(s->n_fast_hist, sizeof(*s->hist)); /* s->f will be a rotating pointer into s->hist. */ s->f = s->hist; - for (i = 0; i < s->n_fast_hist; ++i) { - int j, k, m; - /* Top-N codewords for every codebook and feature. */ - s->hist[i].topn = ckd_calloc_3d(s->g->n_mgau, s->g->n_feat, - s->max_topn, sizeof(ptm_topn_t)); - /* Initialize them to sane (yet arbitrary) defaults. */ - for (j = 0; j < s->g->n_mgau; ++j) { - for (k = 0; k < s->g->n_feat; ++k) { - for (m = 0; m < s->max_topn; ++m) { - s->hist[i].topn[j][k][m].cw = m; - s->hist[i].topn[j][k][m].score = WORST_DIST; - } - } - } - /* Active codebook mapping (just codebook, not features, - at least not yet) */ - s->hist[i].mgau_active = bitvec_alloc(s->g->n_mgau); - /* Start with them all on, prune them later. */ - bitvec_set_all(s->hist[i].mgau_active, s->g->n_mgau); - } ps = (ps_mgau_t *)s; + ptm_mgau_reset_fast_hist(ps); ps->vt = &ptm_mgau_funcs; return ps; error_out: diff --git a/src/libpocketsphinx/ptm_mgau.h b/src/ptm_mgau.h similarity index 93% rename from src/libpocketsphinx/ptm_mgau.h rename to src/ptm_mgau.h index 0b3ac63..48185d8 100644 --- a/src/libpocketsphinx/ptm_mgau.h +++ b/src/ptm_mgau.h @@ -36,23 +36,28 @@ */ /** * @file ptm_mgau.h Fast phonetically-tied mixture evaluation. - * @author David Huggins-Daines + * @author David Huggins-Daines */ #ifndef __PTM_MGAU_H__ #define __PTM_MGAU_H__ -/* SphinxBase headesr. */ -#include -#include -#include +#include -/* Local headers. */ +#include "fe/fe.h" +#include "util/mmio.h" #include "acmod.h" #include "hmm.h" #include "bin_mdef.h" #include "ms_gauden.h" +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + typedef struct ptm_mgau_s ptm_mgau_t; typedef struct ptm_topn_s { @@ -98,6 +103,10 @@ int ptm_mgau_frame_eval(ps_mgau_t *s, int32 compallsen); int ptm_mgau_mllr_transform(ps_mgau_t *s, ps_mllr_t *mllr); +void ptm_mgau_reset_fast_hist(ps_mgau_t *ps); +#ifdef __cplusplus +} /* extern "C" */ +#endif #endif /* __PTM_MGAU_H__ */ diff --git a/src/rtc_base/checks.h b/src/rtc_base/checks.h new file mode 100644 index 0000000..799a0b8 --- /dev/null +++ b/src/rtc_base/checks.h @@ -0,0 +1,525 @@ +/* + * Copyright 2006 The WebRTC Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef RTC_BASE_CHECKS_H_ +#define RTC_BASE_CHECKS_H_ + +// If you for some reason need to know if DCHECKs are on, test the value of +// RTC_DCHECK_IS_ON. (Test its value, not if it's defined; it'll always be +// defined, to either a true or a false value.) +#if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) +#define RTC_DCHECK_IS_ON 1 +#else +#define RTC_DCHECK_IS_ON 0 +#endif + +// Annotate a function that will not return control flow to the caller. +#if defined(_MSC_VER) +#define RTC_NORETURN __declspec(noreturn) +#elif defined(__GNUC__) +#define RTC_NORETURN __attribute__((__noreturn__)) +#else +#define RTC_NORETURN +#endif + +/* Vade Retro C++ */ +/* #ifdef __cplusplus +extern "C" { +#endif +RTC_NORETURN void rtc_FatalMessage(const char* file, int line, const char* msg); +#ifdef __cplusplus +} // extern "C" +#endif */ +#include +#define rtc_FatalMessage(file, line, msg) E_FATAL(msg) + +#ifdef RTC_DISABLE_CHECK_MSG +#define RTC_CHECK_MSG_ENABLED 0 +#else +#define RTC_CHECK_MSG_ENABLED 1 +#endif + +#if RTC_CHECK_MSG_ENABLED +#define RTC_CHECK_EVAL_MESSAGE(message) message +#else +#define RTC_CHECK_EVAL_MESSAGE(message) "" +#endif + +#ifdef __cplusplus +// C++ version. + +#include + +#include "absl/meta/type_traits.h" +#include "absl/strings/string_view.h" +#include "api/scoped_refptr.h" +#include "rtc_base/numerics/safe_compare.h" +#include "rtc_base/system/inline.h" +#include "rtc_base/system/rtc_export.h" + +// The macros here print a message to stderr and abort under various +// conditions. All will accept additional stream messages. For example: +// RTC_DCHECK_EQ(foo, bar) << "I'm printed when foo != bar."; +// +// - RTC_CHECK(x) is an assertion that x is always true, and that if it isn't, +// it's better to terminate the process than to continue. During development, +// the reason that it's better to terminate might simply be that the error +// handling code isn't in place yet; in production, the reason might be that +// the author of the code truly believes that x will always be true, but that +// they recognizes that if they are wrong, abrupt and unpleasant process +// termination is still better than carrying on with the assumption violated. +// +// RTC_CHECK always evaluates its argument, so it's OK for x to have side +// effects. +// +// - RTC_DCHECK(x) is the same as RTC_CHECK(x)---an assertion that x is always +// true---except that x will only be evaluated in debug builds; in production +// builds, x is simply assumed to be true. This is useful if evaluating x is +// expensive and the expected cost of failing to detect the violated +// assumption is acceptable. You should not handle cases where a production +// build fails to spot a violated condition, even those that would result in +// crashes. If the code needs to cope with the error, make it cope, but don't +// call RTC_DCHECK; if the condition really can't occur, but you'd sleep +// better at night knowing that the process will suicide instead of carrying +// on in case you were wrong, use RTC_CHECK instead of RTC_DCHECK. +// +// RTC_DCHECK only evaluates its argument in debug builds, so if x has visible +// side effects, you need to write e.g. +// bool w = x; RTC_DCHECK(w); +// +// - RTC_CHECK_EQ, _NE, _GT, ..., and RTC_DCHECK_EQ, _NE, _GT, ... are +// specialized variants of RTC_CHECK and RTC_DCHECK that print prettier +// messages if the condition doesn't hold. Prefer them to raw RTC_CHECK and +// RTC_DCHECK. +// +// - RTC_FATAL() aborts unconditionally. + +namespace rtc { +namespace webrtc_checks_impl { +enum class CheckArgType : int8_t { + kEnd = 0, + kInt, + kLong, + kLongLong, + kUInt, + kULong, + kULongLong, + kDouble, + kLongDouble, + kCharP, + kStdString, + kStringView, + kVoidP, + + // kCheckOp doesn't represent an argument type. Instead, it is sent as the + // first argument from RTC_CHECK_OP to make FatalLog use the next two + // arguments to build the special CHECK_OP error message + // (the "a == b (1 vs. 2)" bit). + kCheckOp, +}; + +// These two functions are public so they can be overridden from +// webrtc_overrides in chromium. +RTC_NORETURN void WriteFatalLog(const char* file, + int line, + absl::string_view output); +RTC_NORETURN void WriteFatalLog(absl::string_view output); + +#if RTC_CHECK_MSG_ENABLED +RTC_NORETURN RTC_EXPORT void FatalLog(const char* file, + int line, + const char* message, + const CheckArgType* fmt, + ...); +#else +RTC_NORETURN RTC_EXPORT void FatalLog(const char* file, int line); +#endif + +// Wrapper for log arguments. Only ever make values of this type with the +// MakeVal() functions. +template +struct Val { + static constexpr CheckArgType Type() { return N; } + T GetVal() const { return val; } + T val; +}; + +// Case for when we need to construct a temp string and then print that. +// (We can't use Val +// because we need somewhere to store the temp string.) +struct ToStringVal { + static constexpr CheckArgType Type() { return CheckArgType::kStdString; } + const std::string* GetVal() const { return &val; } + std::string val; +}; + +inline Val MakeVal(int x) { + return {x}; +} +inline Val MakeVal(long x) { + return {x}; +} +inline Val MakeVal(long long x) { + return {x}; +} +inline Val MakeVal(unsigned int x) { + return {x}; +} +inline Val MakeVal(unsigned long x) { + return {x}; +} +inline Val MakeVal( + unsigned long long x) { + return {x}; +} + +inline Val MakeVal(double x) { + return {x}; +} +inline Val MakeVal(long double x) { + return {x}; +} + +inline Val MakeVal(const char* x) { + return {x}; +} +inline Val MakeVal( + const std::string& x) { + return {&x}; +} +inline Val MakeVal( + const absl::string_view& x) { + return {&x}; +} + +inline Val MakeVal(const void* x) { + return {x}; +} + +template +inline Val MakeVal( + const rtc::scoped_refptr& p) { + return {p.get()}; +} + +// The enum class types are not implicitly convertible to arithmetic types. +template ::value && + !std::is_arithmetic::value>* = nullptr> +inline decltype(MakeVal(std::declval>())) MakeVal( + T x) { + return {static_cast>(x)}; +} + +template ()))* = nullptr> +ToStringVal MakeVal(const T& x) { + return {ToLogString(x)}; +} + +// Ephemeral type that represents the result of the logging << operator. +template +class LogStreamer; + +// Base case: Before the first << argument. +template <> +class LogStreamer<> final { + public: + template ())), + absl::enable_if_t::value || + std::is_enum::value>* = nullptr> + RTC_FORCE_INLINE LogStreamer operator<<(U arg) const { + return LogStreamer(MakeVal(arg), this); + } + + template ())), + absl::enable_if_t::value && + !std::is_enum::value>* = nullptr> + RTC_FORCE_INLINE LogStreamer operator<<(const U& arg) const { + return LogStreamer(MakeVal(arg), this); + } + +#if RTC_CHECK_MSG_ENABLED + template + RTC_NORETURN RTC_FORCE_INLINE static void Call(const char* file, + const int line, + const char* message, + const Us&... args) { + static constexpr CheckArgType t[] = {Us::Type()..., CheckArgType::kEnd}; + FatalLog(file, line, message, t, args.GetVal()...); + } + + template + RTC_NORETURN RTC_FORCE_INLINE static void CallCheckOp(const char* file, + const int line, + const char* message, + const Us&... args) { + static constexpr CheckArgType t[] = {CheckArgType::kCheckOp, Us::Type()..., + CheckArgType::kEnd}; + FatalLog(file, line, message, t, args.GetVal()...); + } +#else + template + RTC_NORETURN RTC_FORCE_INLINE static void Call(const char* file, + const int line) { + FatalLog(file, line); + } +#endif +}; + +// Inductive case: We've already seen at least one << argument. The most recent +// one had type `T`, and the earlier ones had types `Ts`. +template +class LogStreamer final { + public: + RTC_FORCE_INLINE LogStreamer(T arg, const LogStreamer* prior) + : arg_(arg), prior_(prior) {} + + template ())), + absl::enable_if_t::value || + std::is_enum::value>* = nullptr> + RTC_FORCE_INLINE LogStreamer operator<<(U arg) const { + return LogStreamer(MakeVal(arg), this); + } + + template ())), + absl::enable_if_t::value && + !std::is_enum::value>* = nullptr> + RTC_FORCE_INLINE LogStreamer operator<<(const U& arg) const { + return LogStreamer(MakeVal(arg), this); + } + +#if RTC_CHECK_MSG_ENABLED + template + RTC_NORETURN RTC_FORCE_INLINE void Call(const char* file, + const int line, + const char* message, + const Us&... args) const { + prior_->Call(file, line, message, arg_, args...); + } + + template + RTC_NORETURN RTC_FORCE_INLINE void CallCheckOp(const char* file, + const int line, + const char* message, + const Us&... args) const { + prior_->CallCheckOp(file, line, message, arg_, args...); + } +#else + template + RTC_NORETURN RTC_FORCE_INLINE void Call(const char* file, + const int line) const { + prior_->Call(file, line); + } +#endif + + private: + // The most recent argument. + T arg_; + + // Earlier arguments. + const LogStreamer* prior_; +}; + +template +class FatalLogCall final { + public: + FatalLogCall(const char* file, int line, const char* message) + : file_(file), line_(line), message_(message) {} + + // This can be any binary operator with precedence lower than <<. + template + RTC_NORETURN RTC_FORCE_INLINE void operator&( + const LogStreamer& streamer) { +#if RTC_CHECK_MSG_ENABLED + isCheckOp ? streamer.CallCheckOp(file_, line_, message_) + : streamer.Call(file_, line_, message_); +#else + streamer.Call(file_, line_); +#endif + } + + private: + const char* file_; + int line_; + const char* message_; +}; + +#if RTC_DCHECK_IS_ON + +// Be helpful, and include file and line in the RTC_CHECK_NOTREACHED error +// message. +#define RTC_UNREACHABLE_FILE_AND_LINE_CALL_ARGS __FILE__, __LINE__ +RTC_NORETURN RTC_EXPORT void UnreachableCodeReached(const char* file, int line); + +#else + +// Be mindful of binary size, and don't include file and line in the +// RTC_CHECK_NOTREACHED error message. +#define RTC_UNREACHABLE_FILE_AND_LINE_CALL_ARGS +RTC_NORETURN RTC_EXPORT void UnreachableCodeReached(); + +#endif + +} // namespace webrtc_checks_impl + +// The actual stream used isn't important. We reference `ignored` in the code +// but don't evaluate it; this is to avoid "unused variable" warnings (we do so +// in a particularly convoluted way with an extra ?: because that appears to be +// the simplest construct that keeps Visual Studio from complaining about +// condition being unused). +#define RTC_EAT_STREAM_PARAMETERS(ignored) \ + (true ? true : ((void)(ignored), true)) \ + ? static_cast(0) \ + : ::rtc::webrtc_checks_impl::FatalLogCall("", 0, "") & \ + ::rtc::webrtc_checks_impl::LogStreamer<>() + +// Call RTC_EAT_STREAM_PARAMETERS with an argument that fails to compile if +// values of the same types as `a` and `b` can't be compared with the given +// operation, and that would evaluate `a` and `b` if evaluated. +#define RTC_EAT_STREAM_PARAMETERS_OP(op, a, b) \ + RTC_EAT_STREAM_PARAMETERS(((void)::rtc::Safe##op(a, b))) + +// RTC_CHECK dies with a fatal error if condition is not true. It is *not* +// controlled by NDEBUG or anything else, so the check will be executed +// regardless of compilation mode. +// +// We make sure RTC_CHECK et al. always evaluates `condition`, as +// doing RTC_CHECK(FunctionWithSideEffect()) is a common idiom. +// +// RTC_CHECK_OP is a helper macro for binary operators. +// Don't use this macro directly in your code, use RTC_CHECK_EQ et al below. +#if RTC_CHECK_MSG_ENABLED +#define RTC_CHECK(condition) \ + (condition) ? static_cast(0) \ + : ::rtc::webrtc_checks_impl::FatalLogCall( \ + __FILE__, __LINE__, #condition) & \ + ::rtc::webrtc_checks_impl::LogStreamer<>() + +#define RTC_CHECK_OP(name, op, val1, val2) \ + ::rtc::Safe##name((val1), (val2)) \ + ? static_cast(0) \ + : ::rtc::webrtc_checks_impl::FatalLogCall( \ + __FILE__, __LINE__, #val1 " " #op " " #val2) & \ + ::rtc::webrtc_checks_impl::LogStreamer<>() << (val1) << (val2) +#else +#define RTC_CHECK(condition) \ + (condition) \ + ? static_cast(0) \ + : true ? ::rtc::webrtc_checks_impl::FatalLogCall(__FILE__, \ + __LINE__, "") & \ + ::rtc::webrtc_checks_impl::LogStreamer<>() \ + : ::rtc::webrtc_checks_impl::FatalLogCall("", 0, "") & \ + ::rtc::webrtc_checks_impl::LogStreamer<>() + +#define RTC_CHECK_OP(name, op, val1, val2) \ + ::rtc::Safe##name((val1), (val2)) \ + ? static_cast(0) \ + : true ? ::rtc::webrtc_checks_impl::FatalLogCall(__FILE__, \ + __LINE__, "") & \ + ::rtc::webrtc_checks_impl::LogStreamer<>() \ + : ::rtc::webrtc_checks_impl::FatalLogCall("", 0, "") & \ + ::rtc::webrtc_checks_impl::LogStreamer<>() +#endif + +#define RTC_CHECK_EQ(val1, val2) RTC_CHECK_OP(Eq, ==, val1, val2) +#define RTC_CHECK_NE(val1, val2) RTC_CHECK_OP(Ne, !=, val1, val2) +#define RTC_CHECK_LE(val1, val2) RTC_CHECK_OP(Le, <=, val1, val2) +#define RTC_CHECK_LT(val1, val2) RTC_CHECK_OP(Lt, <, val1, val2) +#define RTC_CHECK_GE(val1, val2) RTC_CHECK_OP(Ge, >=, val1, val2) +#define RTC_CHECK_GT(val1, val2) RTC_CHECK_OP(Gt, >, val1, val2) + +// The RTC_DCHECK macro is equivalent to RTC_CHECK except that it only generates +// code in debug builds. It does reference the condition parameter in all cases, +// though, so callers won't risk getting warnings about unused variables. +#if RTC_DCHECK_IS_ON +#define RTC_DCHECK(condition) RTC_CHECK(condition) +#define RTC_DCHECK_EQ(v1, v2) RTC_CHECK_EQ(v1, v2) +#define RTC_DCHECK_NE(v1, v2) RTC_CHECK_NE(v1, v2) +#define RTC_DCHECK_LE(v1, v2) RTC_CHECK_LE(v1, v2) +#define RTC_DCHECK_LT(v1, v2) RTC_CHECK_LT(v1, v2) +#define RTC_DCHECK_GE(v1, v2) RTC_CHECK_GE(v1, v2) +#define RTC_DCHECK_GT(v1, v2) RTC_CHECK_GT(v1, v2) +#else +#define RTC_DCHECK(condition) RTC_EAT_STREAM_PARAMETERS(condition) +#define RTC_DCHECK_EQ(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Eq, v1, v2) +#define RTC_DCHECK_NE(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Ne, v1, v2) +#define RTC_DCHECK_LE(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Le, v1, v2) +#define RTC_DCHECK_LT(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Lt, v1, v2) +#define RTC_DCHECK_GE(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Ge, v1, v2) +#define RTC_DCHECK_GT(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Gt, v1, v2) +#endif + +#define RTC_UNREACHABLE_CODE_HIT false +#define RTC_DCHECK_NOTREACHED() RTC_DCHECK(RTC_UNREACHABLE_CODE_HIT) + +// Kills the process with an error message. Never returns. Use when you wish to +// assert that a point in the code is never reached. +#define RTC_CHECK_NOTREACHED() \ + do { \ + ::rtc::webrtc_checks_impl::UnreachableCodeReached( \ + RTC_UNREACHABLE_FILE_AND_LINE_CALL_ARGS); \ + } while (0) + +#define RTC_FATAL() \ + ::rtc::webrtc_checks_impl::FatalLogCall(__FILE__, __LINE__, \ + "FATAL()") & \ + ::rtc::webrtc_checks_impl::LogStreamer<>() + +// Performs the integer division a/b and returns the result. CHECKs that the +// remainder is zero. +template +inline T CheckedDivExact(T a, T b) { + RTC_CHECK_EQ(a % b, 0) << a << " is not evenly divisible by " << b; + return a / b; +} + +} // namespace rtc + +#else // __cplusplus not defined +// C version. Lacks many features compared to the C++ version, but usage +// guidelines are the same. + +#define RTC_CHECK(condition) \ + do { \ + if (!(condition)) { \ + rtc_FatalMessage(__FILE__, __LINE__, \ + RTC_CHECK_EVAL_MESSAGE("CHECK failed: " #condition)); \ + } \ + } while (0) + +#define RTC_CHECK_EQ(a, b) RTC_CHECK((a) == (b)) +#define RTC_CHECK_NE(a, b) RTC_CHECK((a) != (b)) +#define RTC_CHECK_LE(a, b) RTC_CHECK((a) <= (b)) +#define RTC_CHECK_LT(a, b) RTC_CHECK((a) < (b)) +#define RTC_CHECK_GE(a, b) RTC_CHECK((a) >= (b)) +#define RTC_CHECK_GT(a, b) RTC_CHECK((a) > (b)) + +#define RTC_DCHECK(condition) \ + do { \ + if (RTC_DCHECK_IS_ON && !(condition)) { \ + rtc_FatalMessage(__FILE__, __LINE__, \ + RTC_CHECK_EVAL_MESSAGE("DCHECK failed: " #condition)); \ + } \ + } while (0) + +#define RTC_DCHECK_EQ(a, b) RTC_DCHECK((a) == (b)) +#define RTC_DCHECK_NE(a, b) RTC_DCHECK((a) != (b)) +#define RTC_DCHECK_LE(a, b) RTC_DCHECK((a) <= (b)) +#define RTC_DCHECK_LT(a, b) RTC_DCHECK((a) < (b)) +#define RTC_DCHECK_GE(a, b) RTC_DCHECK((a) >= (b)) +#define RTC_DCHECK_GT(a, b) RTC_DCHECK((a) > (b)) + +#endif // __cplusplus + +#endif // RTC_BASE_CHECKS_H_ diff --git a/src/rtc_base/compile_assert_c.h b/src/rtc_base/compile_assert_c.h new file mode 100644 index 0000000..db2e4a8 --- /dev/null +++ b/src/rtc_base/compile_assert_c.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef RTC_BASE_COMPILE_ASSERT_C_H_ +#define RTC_BASE_COMPILE_ASSERT_C_H_ + +// Use this macro to verify at compile time that certain restrictions are met. +// The argument is the boolean expression to evaluate. +// Example: +// RTC_COMPILE_ASSERT(sizeof(foo) < 128); +// Note: In C++, use static_assert instead! +#define RTC_COMPILE_ASSERT(expression) \ + switch (0) { \ + case 0: \ + case expression:; \ + } + +#endif // RTC_BASE_COMPILE_ASSERT_C_H_ diff --git a/src/rtc_base/sanitizer.h b/src/rtc_base/sanitizer.h new file mode 100644 index 0000000..b326bdc --- /dev/null +++ b/src/rtc_base/sanitizer.h @@ -0,0 +1,160 @@ +/* + * Copyright 2016 The WebRTC Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef RTC_BASE_SANITIZER_H_ +#define RTC_BASE_SANITIZER_H_ + +#include // For size_t. + +#ifdef __cplusplus +#include "absl/meta/type_traits.h" +#endif + +#if defined(__has_feature) +#if __has_feature(address_sanitizer) +#define RTC_HAS_ASAN 1 +#endif +#if __has_feature(memory_sanitizer) +#define RTC_HAS_MSAN 1 +#endif +#endif +#ifndef RTC_HAS_ASAN +#define RTC_HAS_ASAN 0 +#endif +#ifndef RTC_HAS_MSAN +#define RTC_HAS_MSAN 0 +#endif + +#if RTC_HAS_ASAN +#include +#endif +#if RTC_HAS_MSAN +#include +#endif + +#ifdef __has_attribute +#if __has_attribute(no_sanitize) +#define RTC_NO_SANITIZE(what) __attribute__((no_sanitize(what))) +#endif +#endif +#ifndef RTC_NO_SANITIZE +#define RTC_NO_SANITIZE(what) +#endif + +// Ask ASan to mark the memory range [ptr, ptr + element_size * num_elements) +// as being unaddressable, so that reads and writes are not allowed. ASan may +// narrow the range to the nearest alignment boundaries. +static inline void rtc_AsanPoison(const volatile void* ptr, + size_t element_size, + size_t num_elements) { +#if RTC_HAS_ASAN + ASAN_POISON_MEMORY_REGION(ptr, element_size * num_elements); +#else + (void)ptr; + (void)element_size; + (void)num_elements; +#endif +} + +// Ask ASan to mark the memory range [ptr, ptr + element_size * num_elements) +// as being addressable, so that reads and writes are allowed. ASan may widen +// the range to the nearest alignment boundaries. +static inline void rtc_AsanUnpoison(const volatile void* ptr, + size_t element_size, + size_t num_elements) { +#if RTC_HAS_ASAN + ASAN_UNPOISON_MEMORY_REGION(ptr, element_size * num_elements); +#else + (void)ptr; + (void)element_size; + (void)num_elements; +#endif +} + +// Ask MSan to mark the memory range [ptr, ptr + element_size * num_elements) +// as being uninitialized. +static inline void rtc_MsanMarkUninitialized(const volatile void* ptr, + size_t element_size, + size_t num_elements) { +#if RTC_HAS_MSAN + __msan_poison(ptr, element_size * num_elements); +#else + (void)ptr; + (void)element_size; + (void)num_elements; +#endif +} + +// Force an MSan check (if any bits in the memory range [ptr, ptr + +// element_size * num_elements) are uninitialized the call will crash with an +// MSan report). +static inline void rtc_MsanCheckInitialized(const volatile void* ptr, + size_t element_size, + size_t num_elements) { +#if RTC_HAS_MSAN + __msan_check_mem_is_initialized(ptr, element_size * num_elements); +#else + (void)ptr; + (void)element_size; + (void)num_elements; +#endif +} + +#ifdef __cplusplus + +namespace rtc { +namespace sanitizer_impl { + +template +constexpr bool IsTriviallyCopyable() { + return static_cast(absl::is_trivially_copy_constructible::value && + (absl::is_trivially_copy_assignable::value || + !std::is_copy_assignable::value) && + absl::is_trivially_destructible::value); +} + +} // namespace sanitizer_impl + +template +inline void AsanPoison(const T& mem) { + rtc_AsanPoison(mem.data(), sizeof(mem.data()[0]), mem.size()); +} + +template +inline void AsanUnpoison(const T& mem) { + rtc_AsanUnpoison(mem.data(), sizeof(mem.data()[0]), mem.size()); +} + +template +inline void MsanMarkUninitialized(const T& mem) { + rtc_MsanMarkUninitialized(mem.data(), sizeof(mem.data()[0]), mem.size()); +} + +template +inline T MsanUninitialized(T t) { +#if RTC_HAS_MSAN + // TODO(bugs.webrtc.org/8762): Switch to std::is_trivially_copyable when it + // becomes available in downstream projects. + static_assert(sanitizer_impl::IsTriviallyCopyable(), ""); +#endif + rtc_MsanMarkUninitialized(&t, sizeof(T), 1); + return t; +} + +template +inline void MsanCheckInitialized(const T& mem) { + rtc_MsanCheckInitialized(mem.data(), sizeof(mem.data()[0]), mem.size()); +} + +} // namespace rtc + +#endif // __cplusplus + +#endif // RTC_BASE_SANITIZER_H_ diff --git a/src/rtc_base/system/arch.h b/src/rtc_base/system/arch.h new file mode 100644 index 0000000..be2367b --- /dev/null +++ b/src/rtc_base/system/arch.h @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +// This file contains platform-specific typedefs and defines. +// Much of it is derived from Chromium's build/build_config.h. + +#ifndef RTC_BASE_SYSTEM_ARCH_H_ +#define RTC_BASE_SYSTEM_ARCH_H_ + +// Processor architecture detection. For more info on what's defined, see: +// https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros +// https://www.agner.org/optimize/calling_conventions.pdf +// https://sourceforge.net/p/predef/wiki/Architectures/ +// or with gcc, run: "echo | gcc -E -dM -" +#if defined(_M_X64) || defined(__x86_64__) +#define WEBRTC_ARCH_X86_FAMILY +#define WEBRTC_ARCH_X86_64 +#define WEBRTC_ARCH_64_BITS +#define WEBRTC_ARCH_LITTLE_ENDIAN +#elif defined(_M_ARM64) || defined(__aarch64__) +#define WEBRTC_ARCH_ARM_FAMILY +#define WEBRTC_ARCH_64_BITS +#define WEBRTC_ARCH_LITTLE_ENDIAN +#elif defined(_M_IX86) || defined(__i386__) +#define WEBRTC_ARCH_X86_FAMILY +#define WEBRTC_ARCH_X86 +#define WEBRTC_ARCH_32_BITS +#define WEBRTC_ARCH_LITTLE_ENDIAN +#elif defined(_M_ARM) || defined(__ARMEL__) +#define WEBRTC_ARCH_ARM_FAMILY +#define WEBRTC_ARCH_32_BITS +#define WEBRTC_ARCH_LITTLE_ENDIAN +#elif defined(__MIPSEL__) || defined(__MIPSEB__) +#define WEBRTC_ARCH_MIPS_FAMILY +#if defined(__LP64__) +#define WEBRTC_ARCH_64_BITS +#else +#define WEBRTC_ARCH_32_BITS +#endif +#if defined(__MIPSEL__) +#define WEBRTC_ARCH_LITTLE_ENDIAN +#else +#define WEBRTC_ARCH_BIG_ENDIAN +#endif +#elif defined(__PPC__) +#if defined(__PPC64__) +#define WEBRTC_ARCH_64_BITS +#else +#define WEBRTC_ARCH_32_BITS +#endif +#if defined(__LITTLE_ENDIAN__) +#define WEBRTC_ARCH_LITTLE_ENDIAN +#else +#define WEBRTC_ARCH_BIG_ENDIAN +#endif +#elif defined(__sparc) || defined(__sparc__) +#if __SIZEOF_LONG__ == 8 +#define WEBRTC_ARCH_64_BITS +#else +#define WEBRTC_ARCH_32_BITS +#endif +#define WEBRTC_ARCH_BIG_ENDIAN +#elif defined(__riscv) && __riscv_xlen == 64 +#define WEBRTC_ARCH_64_BITS +#define WEBRTC_ARCH_LITTLE_ENDIAN +#elif defined(__riscv) && __riscv_xlen == 32 +#define WEBRTC_ARCH_32_BITS +#define WEBRTC_ARCH_LITTLE_ENDIAN +#elif defined(__pnacl__) +#define WEBRTC_ARCH_32_BITS +#define WEBRTC_ARCH_LITTLE_ENDIAN +#elif defined(__EMSCRIPTEN__) +#define WEBRTC_ARCH_32_BITS +#define WEBRTC_ARCH_LITTLE_ENDIAN +#else +#error Please add support for your architecture in rtc_base/system/arch.h +#endif + +#if !(defined(WEBRTC_ARCH_LITTLE_ENDIAN) ^ defined(WEBRTC_ARCH_BIG_ENDIAN)) +#error Define either WEBRTC_ARCH_LITTLE_ENDIAN or WEBRTC_ARCH_BIG_ENDIAN +#endif + +#endif // RTC_BASE_SYSTEM_ARCH_H_ diff --git a/src/rtc_base/typedefs.h b/src/rtc_base/typedefs.h new file mode 100644 index 0000000..9d37995 --- /dev/null +++ b/src/rtc_base/typedefs.h @@ -0,0 +1,25 @@ +/** + * Define basic types in case there is no + */ + +#ifndef __RTC_BASE_TYPEDEFS_H__ +#define __RTC_BASE_TYPEDEFS_H__ + +#include +#include + +#ifndef HAVE_STDINT_H +typedef int32 int32_t; +typedef int16 int16_t; +typedef int8 int8_t; +typedef uint32 uint32_t; +typedef uint16 uint16_t; +typedef uint8 uint8_t; +typedef int64 int64_t; +typedef uint64 uint64_t; + +#define INT32_MAX MAX_INT32 +#define INT32_MIN MIN_INT32 +#endif + +#endif /* __RTC_BASE_TYPEDEFS_H__ */ diff --git a/src/libpocketsphinx/s2_semi_mgau.c b/src/s2_semi_mgau.c similarity index 96% rename from src/libpocketsphinx/s2_semi_mgau.c rename to src/s2_semi_mgau.c index 568eb4c..bd9a2bb 100644 --- a/src/libpocketsphinx/s2_semi_mgau.c +++ b/src/s2_semi_mgau.c @@ -35,7 +35,6 @@ * */ -/* System headers */ #include #include #include @@ -47,16 +46,11 @@ #include #endif -/* SphinxBase headers */ -#include -#include -#include -#include -#include -#include -#include +#include -/* Local headers */ +#include "fe/fixpoint.h" +#include "util/ckd_alloc.h" +#include "util/bio.h" #include "s2_semi_mgau.h" #include "tied_mgau_common.h" @@ -100,11 +94,14 @@ eval_topn(s2_semi_mgau_t *s, int32 feat, mfcc_t *z) d = GMMSUB(d, compl); ++var; } - topn[i].score = (int32)d; + if (d < (mfcc_t)MAX_NEG_INT32) /* Redundant if FIXED_POINT */ + topn[i].score = MAX_NEG_INT32; + else + topn[i].score = (int32)d; if (i == 0) continue; vtmp = topn[i]; - for (j = i - 1; j >= 0 && (int32)d > topn[j].score; j--) { + for (j = i - 1; j >= 0 && vtmp.score > topn[j].score; j--) { topn[j + 1] = topn[j]; } topn[j + 1] = vtmp; @@ -132,7 +129,7 @@ eval_cb(s2_semi_mgau_t *s, int32 feat, mfcc_t *z) mfcc_t d; mfcc_t *obs; vqFeature_t *cur; - int32 cw, j; + int32 cw, j, d_int; d = *detP; obs = z; @@ -150,7 +147,11 @@ eval_cb(s2_semi_mgau_t *s, int32 feat, mfcc_t *z) var += (ceplen - j); continue; } - if ((int32)d < worst->score) + if (d < (mfcc_t)MAX_NEG_INT32) + d_int = MAX_NEG_INT32; + else + d_int = (int32) d; + if (d_int < worst->score) continue; for (i = 0; i < s->max_topn; i++) { /* already there, so don't need to insert */ @@ -160,11 +161,11 @@ eval_cb(s2_semi_mgau_t *s, int32 feat, mfcc_t *z) if (i < s->max_topn) continue; /* already there. Don't insert */ /* remaining code inserts codeword and dist in correct spot */ - for (cur = worst - 1; cur >= best && (int32)d >= cur->score; --cur) + for (cur = worst - 1; cur >= best && d_int >= cur->score; --cur) memcpy(cur + 1, cur, sizeof(vqFeature_t)); ++cur; cur->codeword = cw; - cur->score = (int32)d; + cur->score = d_int; } } @@ -896,7 +897,7 @@ read_sendump(s2_semi_mgau_t *s, bin_mdef_t *mdef, char const *file) int n_bits = 8; s->n_sen = n_sen; /* FIXME: Should have been done earlier */ - do_mmap = cmd_ln_boolean_r(s->config, "-mmap"); + do_mmap = ps_config_bool(s->config, "mmap"); if ((fp = fopen(file, "rb")) == NULL) return -1; @@ -917,7 +918,7 @@ read_sendump(s2_semi_mgau_t *s, bin_mdef_t *mdef, char const *file) } do_swap = 1; } - if (fread(line, sizeof(char), n, fp) != n) { + if (fread(line, sizeof(char), n, fp) != (size_t)n) { E_ERROR_SYSTEM("Cannot read title"); goto error_out; } @@ -933,7 +934,7 @@ read_sendump(s2_semi_mgau_t *s, bin_mdef_t *mdef, char const *file) goto error_out; } if (do_swap) SWAP_INT32(&n); - if (fread(line, sizeof(char), n, fp) != n) { + if (fread(line, sizeof(char), n, fp) != (size_t)n) { E_ERROR_SYSTEM("Cannot read header"); goto error_out; } @@ -951,7 +952,7 @@ read_sendump(s2_semi_mgau_t *s, bin_mdef_t *mdef, char const *file) if (do_swap) SWAP_INT32(&n); if (n == 0) break; - if (fread(line, sizeof(char), n, fp) != n) { + if (fread(line, sizeof(char), n, fp) != (size_t)n) { E_ERROR_SYSTEM("Cannot read header"); goto error_out; } @@ -1249,9 +1250,9 @@ s2_semi_mgau_init(acmod_t *acmod) } /* Read means and variances. */ - if ((s->g = gauden_init(cmd_ln_str_r(s->config, "_mean"), - cmd_ln_str_r(s->config, "_var"), - cmd_ln_float32_r(s->config, "-varfloor"), + if ((s->g = gauden_init(ps_config_str(s->config, "mean"), + ps_config_str(s->config, "var"), + ps_config_float(s->config, "varfloor"), s->lmath)) == NULL) { E_ERROR("Failed to read means and variances\n"); goto error_out; @@ -1270,30 +1271,30 @@ s2_semi_mgau_init(acmod_t *acmod) goto error_out; } for (i = 0; i < n_feat; ++i) { - if (s->g->featlen[i] != feat_dimension2(acmod->fcb, i)) { + if ((uint32)s->g->featlen[i] != feat_dimension2(acmod->fcb, i)) { E_ERROR("Dimension of stream %d does not match: %d != %d\n", i, s->g->featlen[i], feat_dimension2(acmod->fcb, i)); goto error_out; } } /* Read mixture weights */ - if ((sendump_path = cmd_ln_str_r(s->config, "_sendump"))) { + if ((sendump_path = ps_config_str(s->config, "sendump"))) { if (read_sendump(s, acmod->mdef, sendump_path) < 0) { goto error_out; } } else { - if (read_mixw(s, cmd_ln_str_r(s->config, "_mixw"), - cmd_ln_float32_r(s->config, "-mixwfloor")) < 0) { + if (read_mixw(s, ps_config_str(s->config, "mixw"), + ps_config_float(s->config, "mixwfloor")) < 0) { goto error_out; } } - s->ds_ratio = cmd_ln_int32_r(s->config, "-ds"); + s->ds_ratio = ps_config_int(s->config, "ds"); /* Determine top-N for each feature */ s->topn_beam = ckd_calloc(n_feat, sizeof(*s->topn_beam)); - s->max_topn = cmd_ln_int32_r(s->config, "-topn"); - split_topn(cmd_ln_str_r(s->config, "-topn_beam"), s->topn_beam, n_feat); + s->max_topn = ps_config_int(s->config, "topn"); + split_topn(ps_config_str(s->config, "topn_beam"), s->topn_beam, n_feat); E_INFO("Maximum top-N: %d ", s->max_topn); E_INFOCONT("Top-N beams:"); for (i = 0; i < n_feat; ++i) { @@ -1302,7 +1303,7 @@ s2_semi_mgau_init(acmod_t *acmod) E_INFOCONT("\n"); /* Top-N scores from recent frames */ - s->n_topn_hist = cmd_ln_int32_r(s->config, "-pl_window") + 2; + s->n_topn_hist = ps_config_int(s->config, "pl_window") + 2; s->topn_hist = (vqFeature_t ***) ckd_calloc_3d(s->n_topn_hist, n_feat, s->max_topn, sizeof(***s->topn_hist)); diff --git a/src/libpocketsphinx/s2_semi_mgau.h b/src/s2_semi_mgau.h similarity index 95% rename from src/libpocketsphinx/s2_semi_mgau.h rename to src/s2_semi_mgau.h index f127b5d..b8f6d83 100644 --- a/src/libpocketsphinx/s2_semi_mgau.h +++ b/src/s2_semi_mgau.h @@ -42,17 +42,22 @@ #ifndef __S2_SEMI_MGAU_H__ #define __S2_SEMI_MGAU_H__ -/* SphinxBase headesr. */ -#include -#include -#include +#include -/* Local headers. */ +#include "fe/fe.h" +#include "util/mmio.h" #include "acmod.h" #include "hmm.h" #include "bin_mdef.h" #include "ms_gauden.h" +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + typedef struct vqFeature_s vqFeature_t; typedef struct s2_semi_mgau_s s2_semi_mgau_t; @@ -94,5 +99,8 @@ int s2_semi_mgau_frame_eval(ps_mgau_t *s, int s2_semi_mgau_mllr_transform(ps_mgau_t *s, ps_mllr_t *mllr); +#ifdef __cplusplus +} /* extern "C" */ +#endif #endif /* __S2_SEMI_MGAU_H__ */ diff --git a/src/libpocketsphinx/s3types.h b/src/s3types.h similarity index 97% rename from src/libpocketsphinx/s3types.h rename to src/s3types.h index b40f4c1..e677de6 100644 --- a/src/libpocketsphinx/s3types.h +++ b/src/s3types.h @@ -41,9 +41,7 @@ #include #include -#include -#include -#include +#include /** \file s3types.h * \brief Size definition of semantically units. Common for both s3 and s3.X decoder. @@ -52,6 +50,9 @@ #ifdef __cplusplus extern "C" { #endif +#if 0 +} +#endif /** * Size definitions for more semantially meaningful units. @@ -93,7 +94,7 @@ typedef int32 s3wid_t; /** Dictionary word id */ #define MAX_S3WID ((int32)0x7ffffffe) #ifdef __cplusplus -} +} /* extern "C" */ #endif #endif diff --git a/src/libpocketsphinx/state_align_search.c b/src/state_align_search.c similarity index 60% rename from src/libpocketsphinx/state_align_search.c rename to src/state_align_search.c index ce76b80..391d2f9 100644 --- a/src/libpocketsphinx/state_align_search.c +++ b/src/state_align_search.c @@ -8,27 +8,27 @@ * are met: * * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. + * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * - * This work was supported in part by funding from the Defense Advanced - * Research Projects Agency and the National Science Foundation of the + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== @@ -56,6 +56,7 @@ static void renormalize_hmms(state_align_search_t *sas, int frame_idx, int32 norm) { int i; + (void) frame_idx; for (i = 0; i < sas->n_phones; ++i) hmm_normalize(sas->hmms + i, norm); } @@ -93,6 +94,11 @@ prune_hmms(state_align_search_t *sas, int frame_idx) hmm_t *hmm = sas->hmms + i; if (hmm_frame(hmm) < frame_idx) continue; + /* Enforce alignment constraint: due to non-emitting states, + * previous phone's HMM remains active in first frame of its + * successor. */ + if (nf > sas->ef[i]) + continue; hmm_frame(hmm) = nf; } } @@ -110,6 +116,9 @@ phone_transition(state_align_search_t *sas, int frame_idx) hmm = sas->hmms + i; if (hmm_frame(hmm) != nf) continue; + /* Enforce alignment constraint for initial state of each phone. */ + if (nf < sas->sf[i + 1]) + continue; newphone_score = hmm_out_score(hmm); /* Transition into next phone using the usual Viterbi rule. */ @@ -173,7 +182,8 @@ state_align_search_step(ps_search_t *search, int frame_idx) /* Calculate senone scores. */ for (i = 0; i < sas->n_phones; ++i) - acmod_activate_hmm(acmod, sas->hmms + i); + if (hmm_frame(&sas->hmms[i]) == frame_idx) + acmod_activate_hmm(acmod, &sas->hmms[i]); senscr = acmod_score(acmod, &frame_idx); /* Renormalize here if needed. */ @@ -183,7 +193,7 @@ state_align_search_step(ps_search_t *search, int frame_idx) frame_idx, sas->best_score); renormalize_hmms(sas, frame_idx, sas->best_score); } - + /* Viterbi step. */ sas->best_score = evaluate_hmms(sas, senscr, frame_idx); prune_hmms(sas, frame_idx); @@ -214,7 +224,7 @@ state_align_search_finish(ps_search_t *search) /* Best state exiting the last cur_frame. */ last.id = cur.id = hmm_out_history(final_phone); last.score = hmm_out_score(final_phone); - if (last.id == 0xffff) { + if (last.id == -1) { E_ERROR("Failed to reach final state in alignment\n"); return -1; } @@ -222,6 +232,10 @@ state_align_search_finish(ps_search_t *search) last_frame = sas->frame + 1; for (cur_frame = sas->frame - 1; cur_frame >= 0; --cur_frame) { cur = sas->tokens[cur_frame * sas->n_emit_state + cur.id]; + if (cur.id == -1) { + E_ERROR("Alignment failed in frame %d\n", cur_frame); + return -1; + } /* State boundary, update alignment entry for next state. */ if (cur.id != last.id) { itor = ps_alignment_iter_goto(itor, last.id); @@ -230,8 +244,8 @@ state_align_search_finish(ps_search_t *search) ent->start = cur_frame + 1; ent->duration = last_frame - ent->start; ent->score = last.score - cur.score; - E_DEBUG(1,("state %d start %d end %d\n", last.id, - ent->start, last_frame)); + E_DEBUG("state %d start %d end %d\n", last.id, + ent->start, last_frame); last = cur; last_frame = cur_frame + 1; } @@ -242,8 +256,8 @@ state_align_search_finish(ps_search_t *search) ent = ps_alignment_iter_get(itor); ent->start = 0; ent->duration = last_frame; - E_DEBUG(1,("state %d start %d end %d\n", 0, - ent->start, last_frame)); + E_DEBUG("state %d start %d end %d\n", 0, + ent->start, last_frame); ps_alignment_iter_free(itor); ps_alignment_propagate(sas->al); @@ -253,7 +267,10 @@ state_align_search_finish(ps_search_t *search) static int state_align_search_reinit(ps_search_t *search, dict_t *dict, dict2pid_t *d2p) { - /* This does nothing. */ + /* This does nothing, you need to make a new search for each utterance. */ + (void) search; + (void) dict; + (void) d2p; return 0; } @@ -264,10 +281,138 @@ state_align_search_free(ps_search_t *search) ps_search_base_free(search); ckd_free(sas->hmms); ckd_free(sas->tokens); + ckd_free(sas->sf); + ckd_free(sas->ef); hmm_context_free(sas->hmmctx); + ps_alignment_free(sas->al); ckd_free(sas); } +struct state_align_seg_s { + ps_seg_t base; + ps_alignment_iter_t *itor; +}; +typedef struct state_align_seg_s state_align_seg_t; + +static void +state_align_search_seg_free(ps_seg_t * seg) +{ + state_align_seg_t *itor = (state_align_seg_t *)seg; + if (itor->itor != NULL) { + /* If we hit the end of the alignment, it was already freed! */ + ps_alignment_iter_free(itor->itor); + } + ckd_free(itor); +} + +static void +state_align_search_fill_iter(ps_seg_t *seg) +{ + state_align_seg_t *itor = (state_align_seg_t *)seg; + ps_alignment_entry_t *entry = ps_alignment_iter_get(itor->itor); + + seg->sf = entry->start; + seg->ef = entry->start + entry->duration - 1; + seg->ascr = entry->score; + seg->lscr = 0; + seg->text = dict_wordstr(ps_search_dict(seg->search), entry->id.wid); + seg->wid = entry->id.wid; +} + +static ps_seg_t * +state_align_search_seg_next(ps_seg_t * seg) +{ + state_align_seg_t *itor = (state_align_seg_t *)seg; + + itor->itor = ps_alignment_iter_next(itor->itor); + if (itor->itor == NULL) { + state_align_search_seg_free(seg); + return NULL; + } + state_align_search_fill_iter(seg); + return seg; +} + +static ps_segfuncs_t state_align_segfuncs = { + /* seg_next */ state_align_search_seg_next, + /* seg_free */ state_align_search_seg_free +}; + + +static ps_seg_t * +state_align_search_seg_iter(ps_search_t * search) +{ + state_align_search_t *sas = (state_align_search_t *) search; + state_align_seg_t *seg; + ps_alignment_iter_t *itor; + + if (sas->al == NULL) + return NULL; + /* Even though the alignment has a bunch of levels, for the + purposes of the decoder API we will just iterate over words, + which is the most likely/useful use case. We will also expose + the rest of the alignment API separately. */ + + itor = ps_alignment_words(sas->al); + if (itor == NULL) + return NULL; + seg = ckd_calloc(1, sizeof(state_align_seg_t)); + seg->base.vt = &state_align_segfuncs; + seg->base.search = search; + seg->itor = itor; + state_align_search_fill_iter((ps_seg_t *)seg); + + return (ps_seg_t *)seg; +} + +static char const * +state_align_search_hyp(ps_search_t *search, int32 *out_score) +{ + state_align_search_t *sas = (state_align_search_t *)search; + ps_alignment_iter_t *itor; + size_t hyp_len; + + if (search->hyp_str) + ckd_free(search->hyp_str); + search->hyp_str = NULL; + if (sas->al == NULL) + return NULL; + itor = ps_alignment_words(sas->al); + if (itor == NULL) + return NULL; + for (hyp_len = 0; itor; itor = ps_alignment_iter_next(itor)) { + const char *word; + int32 wid = ps_alignment_iter_get(itor)->id.wid; + + if (dict_real_word(ps_search_dict(search), wid)) { + word = dict_basestr(ps_search_dict(search), + ps_alignment_iter_get(itor)->id.wid); + if (word == NULL) { + E_ERROR("Unknown word id %d in alignment", + ps_alignment_iter_get(itor)->id.wid); + return NULL; + } + hyp_len += strlen(word) + 1; + } + } + search->hyp_str = ckd_calloc(hyp_len + 1, sizeof(*search->hyp_str)); + for (itor = ps_alignment_words(sas->al); + itor; itor = ps_alignment_iter_next(itor)) { + ps_alignment_entry_t *ent = ps_alignment_iter_get(itor); + int32 wid = ent->id.wid; + const char *word; + if (dict_real_word(ps_search_dict(search), wid)) { + word = dict_basestr(ps_search_dict(search), + ent->id.wid); + strcat(search->hyp_str, word); + strcat(search->hyp_str, " "); + } + *out_score = ent->score; + } + search->hyp_str[strlen(search->hyp_str) - 1] = '\0'; + return search->hyp_str; +} + static ps_searchfuncs_t state_align_search_funcs = { /* start: */ state_align_search_start, /* step: */ state_align_search_step, @@ -275,9 +420,9 @@ static ps_searchfuncs_t state_align_search_funcs = { /* reinit: */ state_align_search_reinit, /* free: */ state_align_search_free, /* lattice: */ NULL, - /* hyp: */ NULL, + /* hyp: */ state_align_search_hyp, /* prob: */ NULL, - /* seg_iter: */ NULL, + /* seg_iter: */ state_align_search_seg_iter, }; ps_search_t * @@ -288,7 +433,7 @@ state_align_search_init(const char *name, { state_align_search_t *sas; ps_alignment_iter_t *itor; - hmm_t *hmm; + int i; sas = ckd_calloc(1, sizeof(*sas)); ps_search_init(ps_search_base(sas), &state_align_search_funcs, @@ -300,17 +445,36 @@ state_align_search_init(const char *name, ckd_free(sas); return NULL; } - sas->al = al; + sas->al = ps_alignment_retain(al); /* Generate HMM vector from phone level of alignment. */ sas->n_phones = ps_alignment_n_phones(al); sas->n_emit_state = ps_alignment_n_states(al); sas->hmms = ckd_calloc(sas->n_phones, sizeof(*sas->hmms)); - for (hmm = sas->hmms, itor = ps_alignment_phones(al); itor; - ++hmm, itor = ps_alignment_iter_next(itor)) { + sas->sf = ckd_calloc(sas->n_phones, sizeof(*sas->sf)); + sas->ef = ckd_calloc(sas->n_phones, sizeof(*sas->ef)); + for (i = 0, itor = ps_alignment_phones(al); + i < sas->n_phones && itor; + ++i, itor = ps_alignment_iter_next(itor)) { ps_alignment_entry_t *ent = ps_alignment_iter_get(itor); - hmm_init(sas->hmmctx, hmm, FALSE, + int min_nframes; + + hmm_init(sas->hmmctx, &sas->hmms[i], FALSE, ent->id.pid.ssid, ent->id.pid.tmatid); + /* Can't align less than the number of frames in an HMM! */ + min_nframes = hmm_n_emit_state(&sas->hmms[i]); + if (ent->duration < min_nframes) + E_WARN("phone %d has impossible duration %d " + "(consider disabling bestpath search)\n", + i, ent->duration); + if (ent->start > 0 && ent->duration >= min_nframes) + sas->sf[i] = ent->start; + else + sas->sf[i] = 0; /* Always active */ + if (ent->duration >= min_nframes) + sas->ef[i] = ent->start + ent->duration; + else + sas->ef[i] = INT_MAX; /* Always active */ } return ps_search_base(sas); } diff --git a/src/libpocketsphinx/state_align_search.h b/src/state_align_search.h similarity index 88% rename from src/libpocketsphinx/state_align_search.h rename to src/state_align_search.h index af102a6..4bae9c4 100644 --- a/src/libpocketsphinx/state_align_search.h +++ b/src/state_align_search.h @@ -42,32 +42,38 @@ #ifndef __STATE_ALIGN_SEARCH_H__ #define __STATE_ALIGN_SEARCH_H__ -/* SphinxBase headers. */ -#include - -/* Local headers. */ +#include #include "pocketsphinx_internal.h" -#include "ps_alignment.h" +#include "ps_alignment_internal.h" #include "hmm.h" +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif /** * History structure */ struct state_align_hist_s { - uint16 id; + int32 id; int32 score; }; typedef struct state_align_hist_s state_align_hist_t; /** - * Phone loop search structure. + * Forced alignment search structure. */ struct state_align_search_s { ps_search_t base; /**< Base search structure. */ hmm_context_t *hmmctx; /**< HMM context structure. */ ps_alignment_t *al; /**< Alignment structure being operated on. */ hmm_t *hmms; /**< Vector of HMMs corresponding to phone level. */ + int *sf; /**< Vector of minimum start frames for HMMs. */ + int *ef; /**< Vector of maximum exit frames for HMMs. + (note that exit frame = end frame + 1) */ int n_phones; /**< Number of HMMs (phones). */ int frame; /**< Current frame being processed. */ @@ -84,4 +90,8 @@ ps_search_t *state_align_search_init(const char *name, acmod_t *acmod, ps_alignment_t *al); +#ifdef __cplusplus +} /* extern "C" */ +#endif + #endif /* __STATE_ALIGN_SEARCH_H__ */ diff --git a/src/libpocketsphinx/tied_mgau_common.h b/src/tied_mgau_common.h similarity index 95% rename from src/libpocketsphinx/tied_mgau_common.h rename to src/tied_mgau_common.h index c8c5320..507023b 100644 --- a/src/libpocketsphinx/tied_mgau_common.h +++ b/src/tied_mgau_common.h @@ -43,13 +43,21 @@ #ifndef __TIED_MGAU_COMMON_H__ #define __TIED_MGAU_COMMON_H__ -#include -#include +#include + +#include "fe/fixpoint.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif #define MGAU_MIXW_VERSION "1.0" /* Sphinx-3 file format version for mixw */ #define MGAU_PARAM_VERSION "1.0" /* Sphinx-3 file format version for mean/var */ #define NONE -1 -#define WORST_DIST (int32)(0x80000000) +#define WORST_DIST MAX_NEG_INT32 /** Subtract GMM component b (assumed to be positive) and saturate */ #ifdef FIXED_POINT @@ -118,4 +126,8 @@ fast_logmath_add(logmath_t *lmath, int mlx, int mly) return r - (((uint8 *)t->table)[d]); } +#ifdef __cplusplus +} /* extern "C" */ +#endif + #endif /* __TIED_MGAU_COMMON_H__ */ diff --git a/src/libpocketsphinx/tmat.c b/src/tmat.c similarity index 97% rename from src/libpocketsphinx/tmat.c rename to src/tmat.c index 3ea402e..a71014c 100644 --- a/src/libpocketsphinx/tmat.c +++ b/src/tmat.c @@ -35,19 +35,16 @@ * */ -/* System headers. */ #include -/* SphinxBase headers. */ -#include -#include -#include -#include +#include + +#include "util/ckd_alloc.h" +#include "util/bio.h" +#include "util/vector.h" -/* Local headers. */ #include "tmat.h" #include "hmm.h" -#include "vector.h" #define TMAT_PARAM_VERSION "1.0" @@ -96,6 +93,7 @@ tmat_chk_uppertri(tmat_t * tmat, logmath_t *lmath) { int32 i, src, dst; + (void) lmath; /* Check that each tmat is upper-triangular */ for (i = 0; i < tmat->n_tmat; i++) { for (dst = 0; dst < tmat->n_state; dst++) @@ -116,6 +114,7 @@ tmat_chk_1skip(tmat_t * tmat, logmath_t *lmath) { int32 i, src, dst; + (void) lmath; for (i = 0; i < tmat->n_tmat; i++) { for (src = 0; src < tmat->n_state; src++) for (dst = src + 3; dst <= tmat->n_state; dst++) diff --git a/src/libpocketsphinx/tmat.h b/src/tmat.h similarity index 97% rename from src/libpocketsphinx/tmat.h rename to src/tmat.h index 5b64211..d9fca6c 100644 --- a/src/libpocketsphinx/tmat.h +++ b/src/tmat.h @@ -38,7 +38,8 @@ #define _S3_TMAT_H_ #include -#include + +#include /** \file tmat.h * \brief Transition matrix data structure. @@ -46,13 +47,16 @@ #ifdef __cplusplus extern "C" { #endif +#if 0 +} +#endif /** * \struct tmat_t * \brief Transition matrix data structure. All phone HMMs are assumed to have the same * topology. */ -typedef struct { +typedef struct tmat_s { uint8 ***tp; /**< The transition matrices; kept in the same scale as acoustic scores; tp[tmatid][from-state][to-state] */ int16 n_tmat; /**< Number matrices */ @@ -92,7 +96,7 @@ void tmat_report(tmat_t *t /**< In: transition matrix*/ ); #ifdef __cplusplus -} +} /* extern "C" */ #endif #endif diff --git a/src/util/README.python b/src/util/README.python new file mode 100644 index 0000000..d7f04a0 --- /dev/null +++ b/src/util/README.python @@ -0,0 +1,41 @@ +Regenerating lapack_lite source +=============================== + +:Author: David M. Cooke +:Modified by David Huggins-Daines for Sphinx + +``blas_lite.c``, ``slapack_lite.c``, are ``f2c``'d versions of the +LAPACK routines required by the ``LinearAlgebra`` module, and wrapped +by the ``lapack_lite`` module. The scripts in this directory can be +used to create these files automatically from a directory of LAPACK +source files. + +You'll need `Plex 1.1.4`_ installed to do the appropriate scrubbing. + +.. _Plex 1.1.4: http://www.cosc.canterbury.ac.nz/~greg/python/Plex/ + +The routines that ``lapack_litemodule.c`` wraps are listed in +``wrapped_routines``, along with a few exceptions that aren't picked up +properly. Assuming that you have an unpacked LAPACK source tree in +``~/LAPACK``, you generate the new routines in a directory ``new-lite/`` with:: + +$ python ./make_lite.py wrapped_routines ~/LAPACK new-lite/ + +This will grab the right routines, with dependencies, put them into the +appropriate ``blas_lite.f``, ``dlapack_lite.f``, or ``zlapack_lite.f`` files, +run ``f2c`` over them, then do some scrubbing similar to that done to +generate the CLAPACK_ distribution. + +.. _CLAPACK: http://netlib.org/clapack/index.html + +The versions in CVS as of 2005-04-12 use the LAPACK source from the +`Debian package lapack3`_, version 3.0.20000531a-6. It was found that these +(being regularly maintained) worked better than the patches to the last +released version of LAPACK available at the LAPACK_ page. + +.. _Debian package lapack3: http://packages.debian.org/unstable/libs/lapack3 +.. _LAPACK: http://netlib.org/lapack/index.html + +A slightly-patched ``f2c`` was used to add parentheses around ``||`` expressions +and the arguments to ``<<`` to silence gcc warnings. Edit +the ``src/output.c`` in the ``f2c`` source to do this. diff --git a/src/util/bio.c b/src/util/bio.c new file mode 100644 index 0000000..84632a6 --- /dev/null +++ b/src/util/bio.c @@ -0,0 +1,646 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * bio.c -- Sphinx-3 binary file I/O functions. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1996 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log$ + * Revision 1.4 2005/06/21 20:40:46 arthchan2003 + * 1, Fixed doxygen documentation, 2, Add the $ keyword. + * + * Revision 1.3 2005/03/30 01:22:46 archan + * Fixed mistakes in last updates. Add + * + * + * 02-Jul-1997 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Bugfix: Added byteswapping in bio_verify_chksum(). + * + * 18-Dec-1996 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created. + */ + +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning (disable: 4996) +#endif + +#include + +#include "util/bio.h" +#include "util/ckd_alloc.h" + + +#define BIO_HDRARG_MAX 32 +#define END_COMMENT "*end_comment*\n" + + +static void +bcomment_read(FILE * fp) +{ + __BIGSTACKVARIABLE__ char iline[16384]; + + while (fgets(iline, sizeof(iline), fp) != NULL) { + if (strcmp(iline, END_COMMENT) == 0) + return; + } + E_FATAL("Missing %s marker\n", END_COMMENT); +} + + +static int32 +swap_check(FILE * fp) +{ + uint32 magic; + + if (fread(&magic, sizeof(uint32), 1, fp) != 1) { + E_ERROR("Cannot read BYTEORDER MAGIC NO.\n"); + return -1; + } + + if (magic != BYTE_ORDER_MAGIC) { + /* either need to swap or got bogus magic number */ + SWAP_INT32(&magic); + + if (magic == BYTE_ORDER_MAGIC) + return 1; + + SWAP_INT32(&magic); + E_ERROR("Bad BYTEORDER MAGIC NO: %08x, expecting %08x\n", + magic, BYTE_ORDER_MAGIC); + return -1; + } + + return 0; +} + + +void +bio_hdrarg_free(char **argname, char **argval) +{ + int32 i; + + if (argname == NULL) + return; + for (i = 0; argname[i]; i++) { + ckd_free(argname[i]); + ckd_free(argval[i]); + } + ckd_free(argname); + ckd_free(argval); +} + + +int32 +bio_writehdr_version(FILE * fp, char *version) +{ + uint32 b; + + fprintf(fp, "s3\n"); + fprintf(fp, "version %s\n", version); + fprintf(fp, "endhdr\n"); + fflush(fp); + + b = (uint32) BYTE_ORDER_MAGIC; + fwrite(&b, sizeof(uint32), 1, fp); + fflush(fp); + + return 0; +} + + +int32 +bio_writehdr(FILE *fp, ...) +{ + char const *key; + va_list args; + uint32 b; + + fprintf(fp, "s3\n"); + va_start(args, fp); + while ((key = va_arg(args, char const *)) != NULL) { + char const *val = va_arg(args, char const *); + if (val == NULL) { + E_ERROR("Wrong number of arguments\n"); + va_end(args); + return -1; + } + fprintf(fp, "%s %s\n", key, val); + } + va_end(args); + + fprintf(fp, "endhdr\n"); + fflush(fp); + + b = (uint32) BYTE_ORDER_MAGIC; + if (fwrite(&b, sizeof(uint32), 1, fp) != 1) + return -1; + fflush(fp); + + return 0; +} + + +int32 +bio_readhdr(FILE * fp, char ***argname, char ***argval, int32 * swap) +{ + __BIGSTACKVARIABLE__ char line[16384], word[4096]; + int32 i, l; + int32 lineno; + + *argname = (char **) ckd_calloc(BIO_HDRARG_MAX + 1, sizeof(char *)); + *argval = (char **) ckd_calloc(BIO_HDRARG_MAX, sizeof(char *)); + + lineno = 0; + if (fgets(line, sizeof(line), fp) == NULL){ + E_ERROR("Premature EOF, line %d\n", lineno); + goto error_out; + } + lineno++; + + if ((line[0] == 's') && (line[1] == '3') && (line[2] == '\n')) { + /* New format (post Dec-1996, including checksums); read argument-value pairs */ + for (i = 0;;) { + if (fgets(line, sizeof(line), fp) == NULL) { + E_ERROR("Premature EOF, line %d\n", lineno); + goto error_out; + } + lineno++; + + if (sscanf(line, "%s%n", word, &l) != 1) { + E_ERROR("Header format error, line %d\n", lineno); + goto error_out; + } + if (strcmp(word, "endhdr") == 0) + break; + if (word[0] == '#') /* Skip comments */ + continue; + + if (i >= BIO_HDRARG_MAX) { + E_ERROR + ("Max arg-value limit(%d) exceeded; increase BIO_HDRARG_MAX\n", + BIO_HDRARG_MAX); + goto error_out; + } + + (*argname)[i] = ckd_salloc(word); + if (sscanf(line + l, "%s", word) != 1) { /* Multi-word values not allowed */ + E_ERROR("Header format error, line %d\n", lineno); + goto error_out; + } + (*argval)[i] = ckd_salloc(word); + i++; + } + } + else { + /* Old format (without checksums); the first entry must be the version# */ + if (sscanf(line, "%s", word) != 1) { + E_ERROR("Header format error, line %d\n", lineno); + goto error_out; + } + + (*argname)[0] = ckd_salloc("version"); + (*argval)[0] = ckd_salloc(word); + i = 1; + + bcomment_read(fp); + } + (*argname)[i] = NULL; + + if ((*swap = swap_check(fp)) < 0) { + E_ERROR("swap_check failed\n"); + goto error_out; + } + + return 0; +error_out: + bio_hdrarg_free(*argname, *argval); + *argname = *argval = NULL; + return -1; +} + + +static uint32 +chksum_accum(const void *buf, int32 el_sz, int32 n_el, uint32 sum) +{ + int32 i; + uint8 *i8; + uint16 *i16; + uint32 *i32; + + switch (el_sz) { + case 1: + i8 = (uint8 *) buf; + for (i = 0; i < n_el; i++) + sum = (sum << 5 | sum >> 27) + i8[i]; + break; + case 2: + i16 = (uint16 *) buf; + for (i = 0; i < n_el; i++) + sum = (sum << 10 | sum >> 22) + i16[i]; + break; + case 4: + i32 = (uint32 *) buf; + for (i = 0; i < n_el; i++) + sum = (sum << 20 | sum >> 12) + i32[i]; + break; + default: + E_FATAL("Unsupported elemsize for checksum: %d\n", el_sz); + break; + } + + return sum; +} + + +static void +swap_buf(void *buf, int32 el_sz, int32 n_el) +{ + int32 i; + uint16 *buf16; + uint32 *buf32; + + switch (el_sz) { + case 1: + break; + case 2: + buf16 = (uint16 *) buf; + for (i = 0; i < n_el; i++) + SWAP_INT16(buf16 + i); + break; + case 4: + buf32 = (uint32 *) buf; + for (i = 0; i < n_el; i++) + SWAP_INT32(buf32 + i); + break; + default: + E_FATAL("Unsupported elemsize for byteswapping: %d\n", el_sz); + break; + } +} + + +int32 +bio_fread(void *buf, int32 el_sz, int32 n_el, FILE * fp, int32 swap, + uint32 * chksum) +{ + if (fread(buf, el_sz, n_el, fp) != (size_t) n_el) + return -1; + + if (swap) + swap_buf(buf, el_sz, n_el); + + if (chksum) + *chksum = chksum_accum(buf, el_sz, n_el, *chksum); + + return n_el; +} + +int32 +bio_fwrite(const void *buf, int32 el_sz, int32 n_el, FILE *fp, + int32 swap, uint32 *chksum) +{ + if (chksum) + *chksum = chksum_accum(buf, el_sz, n_el, *chksum); + if (swap) { + void *nbuf; + int rv; + + nbuf = ckd_calloc(n_el, el_sz); + memcpy(nbuf, buf, n_el * el_sz); + swap_buf(nbuf, el_sz, n_el); + rv = fwrite(nbuf, el_sz, n_el, fp); + ckd_free(nbuf); + return rv; + } + else { + return fwrite(buf, el_sz, n_el, fp); + } +} + +int32 +bio_fread_1d(void **buf, size_t el_sz, uint32 * n_el, FILE * fp, + int32 sw, uint32 * ck) +{ + /* Read 1-d array size */ + if (bio_fread(n_el, sizeof(int32), 1, fp, sw, ck) != 1) + E_FATAL("fread(arraysize) failed\n"); + if (*n_el <= 0) + E_FATAL("Bad arraysize: %d\n", *n_el); + + /* Allocate memory for array data */ + *buf = (void *) ckd_calloc(*n_el, el_sz); + + /* Read array data */ + if (bio_fread(*buf, el_sz, *n_el, fp, sw, ck) != (int32)*n_el) + E_FATAL("fread(arraydata) failed\n"); + + return *n_el; +} + +int32 +bio_fread_2d(void ***arr, + size_t e_sz, + uint32 *d1, + uint32 *d2, + FILE *fp, + uint32 swap, + uint32 *chksum) +{ + uint32 l_d1, l_d2; + uint32 n; + size_t ret; + void *raw; + + ret = bio_fread(&l_d1, sizeof(uint32), 1, fp, swap, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to read complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fread_2d"); + } + return -1; + } + ret = bio_fread(&l_d2, sizeof(uint32), 1, fp, swap, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to read complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fread_2d"); + } + return -1; + } + if (bio_fread_1d(&raw, e_sz, &n, fp, swap, chksum) != (int32)n) + return -1; + + assert(n == l_d1*l_d2); + + *d1 = l_d1; + *d2 = l_d2; + *arr = ckd_alloc_2d_ptr(l_d1, l_d2, raw, e_sz); + + return n; +} + +int32 +bio_fread_3d(void ****arr, + size_t e_sz, + uint32 *d1, + uint32 *d2, + uint32 *d3, + FILE *fp, + uint32 swap, + uint32 *chksum) +{ + uint32 l_d1; + uint32 l_d2; + uint32 l_d3; + uint32 n; + void *raw; + size_t ret; + + ret = bio_fread(&l_d1, sizeof(uint32), 1, fp, swap, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to read complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fread_3d"); + } + return -1; + } + ret = bio_fread(&l_d2, sizeof(uint32), 1, fp, swap, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to read complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fread_3d"); + } + return -1; + } + ret = bio_fread(&l_d3, sizeof(uint32), 1, fp, swap, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to read complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fread_3d"); + } + return -1; + } + + if (bio_fread_1d(&raw, e_sz, &n, fp, swap, chksum) != (int32)n) { + return -1; + } + + assert(n == l_d1 * l_d2 * l_d3); + + *arr = ckd_alloc_3d_ptr(l_d1, l_d2, l_d3, raw, e_sz); + *d1 = l_d1; + *d2 = l_d2; + *d3 = l_d3; + + return n; +} + +void +bio_verify_chksum(FILE * fp, int32 byteswap, uint32 chksum) +{ + uint32 file_chksum; + + if (fread(&file_chksum, sizeof(uint32), 1, fp) != 1) + E_FATAL("fread(chksum) failed\n"); + if (byteswap) + SWAP_INT32(&file_chksum); + if (file_chksum != chksum) + E_FATAL + ("Checksum error; file-checksum %08x, computed %08x\n", + file_chksum, chksum); +} + +int +bio_fwrite_3d(void ***arr, + size_t e_sz, + uint32 d1, + uint32 d2, + uint32 d3, + FILE *fp, + uint32 *chksum) +{ + size_t ret; + + /* write out first dimension 1 */ + ret = bio_fwrite(&d1, sizeof(uint32), 1, fp, 0, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to write complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fwrite_3d"); + } + return -1; + } + + /* write out first dimension 2 */ + ret = bio_fwrite(&d2, sizeof(uint32), 1, fp, 0, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to write complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fwrite_3d"); + } + return -1; + } + + /* write out first dimension 3 */ + ret = bio_fwrite(&d3, sizeof(uint32), 1, fp, 0, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to write complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fwrite_3d"); + } + return -1; + } + + /* write out the data in the array as one big block */ + return bio_fwrite_1d(arr[0][0], e_sz, d1 * d2 * d3, fp, chksum); +} + +int +bio_fwrite_1d(void *arr, + size_t e_sz, + uint32 d1, + FILE *fp, + uint32 *chksum) +{ + size_t ret; + ret = bio_fwrite(&d1, sizeof(uint32), 1, fp, 0, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to write complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fwrite_1d"); + } + return -1; + } + + ret = bio_fwrite(arr, e_sz, d1, fp, 0, chksum); + if (ret != d1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to write complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fwrite_1d"); + } + + return -1; + } + + return ret; +} + +int16* +bio_read_wavfile(char const *directory, + char const *filename, + char const *extension, + int32 header, + int32 endian, + size_t *nsamps) +{ + FILE *uttfp; + char *inputfile; + size_t n, l; + int16 *data; + + (void)endian; + n = strlen(extension); + l = strlen(filename); + if ((n <= l) && (0 == strcmp(filename + l - n, extension))) + extension = ""; + inputfile = ckd_calloc(strlen(directory) + l + n + 2, 1); + if (directory) { + sprintf(inputfile, "%s/%s%s", directory, filename, extension); + } else { + sprintf(inputfile, "%s%s", filename, extension); + } + + if ((uttfp = fopen(inputfile, "rb")) == NULL) { + E_FATAL_SYSTEM("Failed to open file '%s' for reading", inputfile); + } + fseek(uttfp, 0, SEEK_END); + n = ftell(uttfp); + fseek(uttfp, 0, SEEK_SET); + if (header > 0) { + if (fseek(uttfp, header, SEEK_SET) < 0) { + E_ERROR_SYSTEM("Failed to move to an offset %d in a file '%s'", header, inputfile); + fclose(uttfp); + ckd_free(inputfile); + return NULL; + } + n -= header; + } + n /= sizeof(int16); + data = ckd_calloc(n, sizeof(*data)); + if ((l = fread(data, sizeof(int16), n, uttfp)) < n) { + E_ERROR_SYSTEM("Failed to read %d samples from %s: %d", n, inputfile, l); + ckd_free(data); + ckd_free(inputfile); + fclose(uttfp); + return NULL; + } + ckd_free(inputfile); + fclose(uttfp); + if (nsamps) *nsamps = n; + + return data; +} diff --git a/src/util/bio.h b/src/util/bio.h new file mode 100644 index 0000000..6472bbc --- /dev/null +++ b/src/util/bio.h @@ -0,0 +1,302 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * bio.h -- Sphinx-3 binary file I/O functions. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1996 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: bio.h,v $ + * Revision 1.8 2005/06/21 20:40:46 arthchan2003 + * 1, Fixed doxygen documentation, 2, Add the $ keyword. + * + * Revision 1.5 2005/06/13 04:02:57 archan + * Fixed most doxygen-style documentation under libs3decoder. + * + * Revision 1.4 2005/05/10 21:21:52 archan + * Three functionalities added but not tested. Code on 1) addition/deletion of LM in mode 4. 2) reading text-based LM 3) Converting txt-based LM to dmp-based LM. + * + * Revision 1.3 2005/03/30 01:22:46 archan + * Fixed mistakes in last updates. Add + * + * + * 28-Apr-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created. + */ + + +#ifndef _S3_BIO_H_ +#define _S3_BIO_H_ + +#include +#include + +#include + +#include "util/byteorder.h" + +/** \file bio.h + * \brief Cross platform binary IO to process files in sphinx3 format. + * + * + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#define BYTE_ORDER_MAGIC (0x11223344) + +/** "reversed senses" SWAP, ARCHAN: This is still incorporated in + Sphinx 3 because lm3g2dmp used it. Don't think that I am very + happy with it. */ + +#if (__BIG_ENDIAN__) +#define REVERSE_SENSE_SWAP_INT16(x) x = ( (((x)<<8)&0x0000ff00) | (((x)>>8)&0x00ff) ) +#define REVERSE_SENSE_SWAP_INT32(x) x = ( (((x)<<24)&0xff000000) | (((x)<<8)&0x00ff0000) | \ + (((x)>>8)&0x0000ff00) | (((x)>>24)&0x000000ff) ) +#else +#define REVERSE_SENSE_SWAP_INT16(x) +#define REVERSE_SENSE_SWAP_INT32(x) + +#endif + + + +/** + * Read binary file format header: has the following format + *
+ *     s3
+ *      
+ *      
+ *     ...
+ *     endhdr
+ *     4-byte byte-order word used to find file byte ordering relative to host machine.
+ * 
+ * Lines beginning with # are ignored. + * Memory for name and val allocated by this function; use bio_hdrarg_free to free them. + * @return 0 if successful, -1 otherwise. + */ +int32 bio_readhdr (FILE *fp, /**< In: File to read */ + char ***name, /**< Out: array of argument name strings read */ + char ***val, /**< Out: corresponding value strings read */ + int32 *swap /**< Out: file needs byteswapping iff (*swap) */ + ); +/** + * Write a simple binary file header, containing only the version string. Also write + * the byte order magic word. + * @return 0 if successful, -1 otherwise. + */ +int32 bio_writehdr_version (FILE *fp, /**< Output: File to write */ + char *version /**< Input: A string of version */ + ); + + +/** + * Write a simple binary file header with only byte order magic word. + * @return 0 if successful, -1 otherwise. + */ +int32 bio_writehdr(FILE *fp, ...); + +/** + * Free name and value strings previously allocated and returned by bio_readhdr. + */ +void bio_hdrarg_free (char **name, /**< In: Array previously returned by bio_readhdr */ + char **val /**< In: Array previously returned by bio_readhdr */ + ); + +/** + * Like fread but perform byteswapping and accumulate checksum (the 2 extra arguments). + * + * @return unlike fread, returns -1 if required number of elements (n_el) not read; also, + * no byteswapping or checksum accumulation is performed in that case. + */ +int32 bio_fread (void *buf, /**< In: buffer to write */ + int32 el_sz, /**< In: element size */ + int32 n_el, /**< In: number of elements */ + FILE *fp, /**< In: An input file pointer */ + int32 swap, /**< In: Byteswap iff (swap != 0) */ + uint32 *chksum /**< In/Out: Accumulated checksum */ + ); + +/** + * Like fwrite but perform byteswapping and accumulate checksum (the 2 extra arguments). + * + * @return the number of elements written (like fwrite). + */ +int32 bio_fwrite(const void *buf, /**< In: buffer to write */ + int32 el_sz, /**< In: element size */ + int32 n_el, /**< In: number of elements */ + FILE *fp, /**< In: An input file pointer */ + int32 swap, /**< In: Byteswap iff (swap != 0) */ + uint32 *chksum /**< In/Out: Accumulated checksum */ + ); + +/** + * Read a 1-d array (fashioned after fread): + * + * - 4-byte array size (returned in n_el) + * - memory allocated for the array and read (returned in buf) + * + * Byteswapping and checksum accumulation performed as necessary. + * Fails fatally if expected data not read. + * @return number of array elements allocated and read; -1 if error. + */ +int32 bio_fread_1d (void **buf, /**< Out: contains array data; allocated by this + function; can be freed using ckd_free */ + size_t el_sz, /**< In: Array element size */ + uint32 *n_el, /**< Out: Number of array elements allocated/read */ + FILE *fp, /**< In: File to read */ + int32 sw, /**< In: Byteswap iff (swap != 0) */ + uint32 *ck /**< In/Out: Accumulated checksum */ + ); + +/** + * Read a 2-d matrix: + * + * - 4-byte # rows, # columns (returned in d1, d2, d3) + * - memory allocated for the array and read (returned in buf) + * + * Byteswapping and checksum accumulation performed as necessary. + * Fails fatally if expected data not read. + * @return number of array elements allocated and read; -1 if error. + */ +int32 bio_fread_2d(void ***arr, + size_t e_sz, + uint32 *d1, + uint32 *d2, + FILE *fp, + uint32 swap, + uint32 *chksum); + +/** + * Read a 3-d array (set of matrices) + * + * - 4-byte # matrices, # rows, # columns (returned in d1, d2, d3) + * - memory allocated for the array and read (returned in buf) + * + * Byteswapping and checksum accumulation performed as necessary. + * Fails fatally if expected data not read. + * @return number of array elements allocated and read; -1 if error. + */ +int32 bio_fread_3d(void ****arr, + size_t e_sz, + uint32 *d1, + uint32 *d2, + uint32 *d3, + FILE *fp, + uint32 swap, + uint32 *chksum); + +int +bio_fread_intv_3d(void ****arr, + size_t e_sz, + uint32 s, + uint32 e, + uint32 *d1, + uint32 *d2, + uint32 *d3, + FILE *fp, + uint32 swap, + uint32 *chksum); + +/** + * Read and verify checksum at the end of binary file. Fails fatally if there is + * a mismatch. + */ +void bio_verify_chksum (FILE *fp, /**< In: File to read */ + int32 byteswap, /**< In: Byteswap iff (swap != 0) */ + uint32 chksum /**< In: Value to compare with checksum in file */ + ); + + + +/** + * Write a 1-d array. + * Checksum accumulation performed as necessary. + * + * @return number of array elements successfully written or -1 if error. + */ +int bio_fwrite_1d(void *arr, /**< In: Data to write */ + size_t e_sz, /**< In: Size of the elements in bytes */ + uint32 d1, /**< In: First dimension */ + FILE *fp, /**< In: File to write to */ + uint32 *chksum /**< In/Out: Checksum accumulator */ + ); + +/** + * Write a 3-d array (set of matrices). + * Checksum accumulation performed as necessary. + * + * @return number of array elements successfully written or -1 if error. + */ +int bio_fwrite_3d(void ***arr, /**< In: Data to write */ + size_t e_sz, /**< In: Size of the elements in bytes */ + uint32 d1, /**< In: First dimension */ + uint32 d2, /**< In: Second dimension */ + uint32 d3, /**< In: Third dimension */ + FILE *fp, /**< In: File to write to */ + uint32 *chksum /**< In/Out: Checksum accumulator */ + ); + +/** + * Read raw data from the wav file. + * + * @return pointer to the data. + */ +int16* bio_read_wavfile(char const *directory, /**< In: the folder where the file is located */ + char const *filename, /**< In: the name of the file */ + char const *extension, /**< In: file extension */ + int32 header, /**< In: the size of the header to skip usually 44 bytes */ + int32 endian, /**< In: endian of the data */ + size_t *nsamps /**< Out: number of samples read */ + ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/util/bitvec.c b/src/util/bitvec.c new file mode 100644 index 0000000..06e9cb6 --- /dev/null +++ b/src/util/bitvec.c @@ -0,0 +1,101 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * bitvec.c -- Bit vector type. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: bitvec.c,v $ + * Revision 1.4 2005/06/22 02:58:22 arthchan2003 + * Added keyword + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 05-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Started. + */ + + +#include "util/bitvec.h" + +bitvec_t * +bitvec_realloc(bitvec_t *vec, + size_t old_len, + size_t new_len) +{ + bitvec_t *new_vec; + size_t old_size = bitvec_size(old_len); + size_t new_size = bitvec_size(new_len); + + new_vec = ckd_realloc(vec, new_size * sizeof(bitvec_t)); + if (new_size > old_size) + memset(new_vec + old_size, 0, (new_size - old_size) * sizeof(bitvec_t)); + + return new_vec; +} + +size_t +bitvec_count_set(bitvec_t *vec, size_t len) +{ + size_t words, bits, w, b, n; + bitvec_t *v; + + words = len / BITVEC_BITS; + bits = len % BITVEC_BITS; + v = vec; + n = 0; + for (w = 0; w < words; ++w, ++v) { + if (*v == 0) + continue; + for (b = 0; b < BITVEC_BITS; ++b) + if (*v & (1< + +#include + +#include "util/ckd_alloc.h" + +/** + * @file bitvec.h + * @brief An implementation of bit vectors. + * + * Implementation of basic operations of bit vectors. + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#define BITVEC_BITS 32 +typedef uint32 bitvec_t; + +/** + * Number of bitvec_t in a bit vector + */ +#define bitvec_size(n) (((n)+BITVEC_BITS-1)/BITVEC_BITS) + +/** + * Allocate a bit vector, all bits are clear + */ +#define bitvec_alloc(n) ckd_calloc(bitvec_size(n), sizeof(bitvec_t)) + +/** + * Resize a bit vector, clear the remaining bits + */ +bitvec_t *bitvec_realloc(bitvec_t *vec, /* In: Bit vector to search */ + size_t old_len, /* In: Old length */ + size_t new_len); /* In: New length of above bit vector */ +/** + * Free a bit vector. + */ +#define bitvec_free(v) ckd_free(v) + +/** + * Set the b-th bit of bit vector v + * @param v is a vector + * @param b is the bit which will be set + */ + +#define bitvec_set(v,b) (v[(b)/BITVEC_BITS] |= (1UL << ((b) & (BITVEC_BITS-1)))) + +/** + * Set all n bits in bit vector v + * @param v is a vector + * @param n is the number of bits + */ + +#define bitvec_set_all(v,n) memset(v, (bitvec_t)-1, \ + (((n)+BITVEC_BITS-1)/BITVEC_BITS) * \ + sizeof(bitvec_t)) +/** + * Clear the b-th bit of bit vector v + * @param v is a vector + * @param b is the bit which will be set + */ + +#define bitvec_clear(v,b) (v[(b)/BITVEC_BITS] &= ~(1UL << ((b) & (BITVEC_BITS-1)))) + +/** + * Clear all n bits in bit vector v + * @param v is a vector + * @param n is the number of bits + */ + +#define bitvec_clear_all(v,n) memset(v, 0, (((n)+BITVEC_BITS-1)/BITVEC_BITS) * \ + sizeof(bitvec_t)) + +/** + * Check whether the b-th bit is set in vector v + * @param v is a vector + * @param b is the bit which will be checked + */ + +#define bitvec_is_set(v,b) (v[(b)/BITVEC_BITS] & (1UL << ((b) & (BITVEC_BITS-1)))) + +/** + * Check whether the b-th bit is cleared in vector v + * @param v is a vector + * @param b is the bit which will be checked + */ + +#define bitvec_is_clear(v,b) (! (bitvec_is_set(v,b))) + + +/** + * Return the number of bits set in the given bitvector. + * + * @param vec is the bit vector + * @param len is the length of bit vector vec + * @return the number of bits being set in vector vec + */ +size_t bitvec_count_set(bitvec_t *vec, /* In: Bit vector to search */ + size_t len); /* In: Length of above bit vector */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/util/blas_lite.c b/src/util/blas_lite.c new file mode 100644 index 0000000..f930b91 --- /dev/null +++ b/src/util/blas_lite.c @@ -0,0 +1,2147 @@ +/* +NOTE: This is generated code. Look in README.python for information on + remaking this file. +*/ +#include "util/f2c.h" + +#ifdef HAVE_CONFIG +#include "config.h" +#else +extern doublereal slamch_(char *); +#define EPSILON slamch_("Epsilon") +#define SAFEMINIMUM slamch_("Safe minimum") +#define PRECISION slamch_("Precision") +#define BASE slamch_("Base") +#endif + + +extern doublereal slapy2_(real *, real *); + + + +/* Table of constant values */ + +static integer c__1 = 1; + +logical lsame_(char *ca, char *cb) +{ + /* System generated locals */ + logical ret_val; + + /* Local variables */ + static integer inta, intb, zcode; + + +/* + -- LAPACK auxiliary routine (version 3.0) -- + Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., + Courant Institute, Argonne National Lab, and Rice University + September 30, 1994 + + + Purpose + ======= + + LSAME returns .TRUE. if CA is the same letter as CB regardless of + case. + + Arguments + ========= + + CA (input) CHARACTER*1 + CB (input) CHARACTER*1 + CA and CB specify the single characters to be compared. + + ===================================================================== + + + Test if the characters are equal +*/ + + ret_val = *(unsigned char *)ca == *(unsigned char *)cb; + if (ret_val) { + return ret_val; + } + +/* Now test for equivalence if both characters are alphabetic. */ + + zcode = 'Z'; + +/* + Use 'Z' rather than 'A' so that ASCII can be detected on Prime + machines, on which ICHAR returns a value with bit 8 set. + ICHAR('A') on Prime machines returns 193 which is the same as + ICHAR('A') on an EBCDIC machine. +*/ + + inta = *(unsigned char *)ca; + intb = *(unsigned char *)cb; + + if (zcode == 90 || zcode == 122) { + +/* + ASCII is assumed - ZCODE is the ASCII code of either lower or + upper case 'Z'. +*/ + + if (inta >= 97 && inta <= 122) { + inta += -32; + } + if (intb >= 97 && intb <= 122) { + intb += -32; + } + + } else if (zcode == 233 || zcode == 169) { + +/* + EBCDIC is assumed - ZCODE is the EBCDIC code of either lower or + upper case 'Z'. +*/ + + if ((inta >= 129 && inta <= 137) || (inta >= 145 && inta <= 153) || + (inta >= 162 && inta <= 169)) { + inta += 64; + } + if ((intb >= 129 && intb <= 137) || (intb >= 145 && intb <= 153) || + (intb >= 162 && intb <= 169)) { + intb += 64; + } + + } else if (zcode == 218 || zcode == 250) { + +/* + ASCII is assumed, on Prime machines - ZCODE is the ASCII code + plus 128 of either lower or upper case 'Z'. +*/ + + if (inta >= 225 && inta <= 250) { + inta += -32; + } + if (intb >= 225 && intb <= 250) { + intb += -32; + } + } + ret_val = inta == intb; + +/* + RETURN + + End of LSAME +*/ + + return ret_val; +} /* lsame_ */ + +doublereal sdot_(integer *n, real *sx, integer *incx, real *sy, integer *incy) +{ + /* System generated locals */ + integer i__1; + real ret_val; + + /* Local variables */ + static integer i__, m, ix, iy, mp1; + static real stemp; + + +/* + forms the dot product of two vectors. + uses unrolled loops for increments equal to one. + jack dongarra, linpack, 3/11/78. + modified 12/3/93, array(1) declarations changed to array(*) +*/ + + + /* Parameter adjustments */ + --sy; + --sx; + + /* Function Body */ + stemp = 0.f; + ret_val = 0.f; + if (*n <= 0) { + return ret_val; + } + if (*incx == 1 && *incy == 1) { + goto L20; + } + +/* + code for unequal increments or equal increments + not equal to 1 +*/ + + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + stemp += sx[ix] * sy[iy]; + ix += *incx; + iy += *incy; +/* L10: */ + } + ret_val = stemp; + return ret_val; + +/* + code for both increments equal to 1 + + + clean-up loop +*/ + +L20: + m = *n % 5; + if (m == 0) { + goto L40; + } + i__1 = m; + for (i__ = 1; i__ <= i__1; ++i__) { + stemp += sx[i__] * sy[i__]; +/* L30: */ + } + if (*n < 5) { + goto L60; + } +L40: + mp1 = m + 1; + i__1 = *n; + for (i__ = mp1; i__ <= i__1; i__ += 5) { + stemp = stemp + sx[i__] * sy[i__] + sx[i__ + 1] * sy[i__ + 1] + sx[ + i__ + 2] * sy[i__ + 2] + sx[i__ + 3] * sy[i__ + 3] + sx[i__ + + 4] * sy[i__ + 4]; +/* L50: */ + } +L60: + ret_val = stemp; + return ret_val; +} /* sdot_ */ + +/* Subroutine */ int sgemm_(char *transa, char *transb, integer *m, integer * + n, integer *k, real *alpha, real *a, integer *lda, real *b, integer * + ldb, real *beta, real *c__, integer *ldc) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, + i__3; + + /* Local variables */ + static integer i__, j, l, info; + static logical nota, notb; + static real temp; + static integer ncola; + extern logical lsame_(char *, char *); + static integer nrowa, nrowb; + extern /* Subroutine */ int xerbla_(char *, integer *); + + +/* + Purpose + ======= + + SGEMM performs one of the matrix-matrix operations + + C := alpha*op( A )*op( B ) + beta*C, + + where op( X ) is one of + + op( X ) = X or op( X ) = X', + + alpha and beta are scalars, and A, B and C are matrices, with op( A ) + an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. + + Parameters + ========== + + TRANSA - CHARACTER*1. + On entry, TRANSA specifies the form of op( A ) to be used in + the matrix multiplication as follows: + + TRANSA = 'N' or 'n', op( A ) = A. + + TRANSA = 'T' or 't', op( A ) = A'. + + TRANSA = 'C' or 'c', op( A ) = A'. + + Unchanged on exit. + + TRANSB - CHARACTER*1. + On entry, TRANSB specifies the form of op( B ) to be used in + the matrix multiplication as follows: + + TRANSB = 'N' or 'n', op( B ) = B. + + TRANSB = 'T' or 't', op( B ) = B'. + + TRANSB = 'C' or 'c', op( B ) = B'. + + Unchanged on exit. + + M - INTEGER. + On entry, M specifies the number of rows of the matrix + op( A ) and of the matrix C. M must be at least zero. + Unchanged on exit. + + N - INTEGER. + On entry, N specifies the number of columns of the matrix + op( B ) and the number of columns of the matrix C. N must be + at least zero. + Unchanged on exit. + + K - INTEGER. + On entry, K specifies the number of columns of the matrix + op( A ) and the number of rows of the matrix op( B ). K must + be at least zero. + Unchanged on exit. + + ALPHA - REAL . + On entry, ALPHA specifies the scalar alpha. + Unchanged on exit. + + A - REAL array of DIMENSION ( LDA, ka ), where ka is + k when TRANSA = 'N' or 'n', and is m otherwise. + Before entry with TRANSA = 'N' or 'n', the leading m by k + part of the array A must contain the matrix A, otherwise + the leading k by m part of the array A must contain the + matrix A. + Unchanged on exit. + + LDA - INTEGER. + On entry, LDA specifies the first dimension of A as declared + in the calling (sub) program. When TRANSA = 'N' or 'n' then + LDA must be at least max( 1, m ), otherwise LDA must be at + least max( 1, k ). + Unchanged on exit. + + B - REAL array of DIMENSION ( LDB, kb ), where kb is + n when TRANSB = 'N' or 'n', and is k otherwise. + Before entry with TRANSB = 'N' or 'n', the leading k by n + part of the array B must contain the matrix B, otherwise + the leading n by k part of the array B must contain the + matrix B. + Unchanged on exit. + + LDB - INTEGER. + On entry, LDB specifies the first dimension of B as declared + in the calling (sub) program. When TRANSB = 'N' or 'n' then + LDB must be at least max( 1, k ), otherwise LDB must be at + least max( 1, n ). + Unchanged on exit. + + BETA - REAL . + On entry, BETA specifies the scalar beta. When BETA is + supplied as zero then C need not be set on input. + Unchanged on exit. + + C - REAL array of DIMENSION ( LDC, n ). + Before entry, the leading m by n part of the array C must + contain the matrix C, except when beta is zero, in which + case C need not be set on entry. + On exit, the array C is overwritten by the m by n matrix + ( alpha*op( A )*op( B ) + beta*C ). + + LDC - INTEGER. + On entry, LDC specifies the first dimension of C as declared + in the calling (sub) program. LDC must be at least + max( 1, m ). + Unchanged on exit. + + + Level 3 Blas routine. + + -- Written on 8-February-1989. + Jack Dongarra, Argonne National Laboratory. + Iain Duff, AERE Harwell. + Jeremy Du Croz, Numerical Algorithms Group Ltd. + Sven Hammarling, Numerical Algorithms Group Ltd. + + + Set NOTA and NOTB as true if A and B respectively are not + transposed and set NROWA, NCOLA and NROWB as the number of rows + and columns of A and the number of rows of B respectively. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + + /* Function Body */ + nota = lsame_(transa, "N"); + notb = lsame_(transb, "N"); + if (nota) { + nrowa = *m; + ncola = *k; + } else { + nrowa = *k; + ncola = *m; + } + if (notb) { + nrowb = *k; + } else { + nrowb = *n; + } + (void) ncola; +/* Test the input parameters. */ + + info = 0; + if (! nota && ! lsame_(transa, "C") && ! lsame_( + transa, "T")) { + info = 1; + } else if (! notb && ! lsame_(transb, "C") && ! + lsame_(transb, "T")) { + info = 2; + } else if (*m < 0) { + info = 3; + } else if (*n < 0) { + info = 4; + } else if (*k < 0) { + info = 5; + } else if (*lda < max(1,nrowa)) { + info = 8; + } else if (*ldb < max(1,nrowb)) { + info = 10; + } else if (*ldc < max(1,*m)) { + info = 13; + } + if (info != 0) { + xerbla_("SGEMM ", &info); + return 0; + } + +/* Quick return if possible. */ + + if (*m == 0 || *n == 0 || ((*alpha == 0.f || *k == 0) && *beta == 1.f)) { + return 0; + } + +/* And if alpha.eq.zero. */ + + if (*alpha == 0.f) { + if (*beta == 0.f) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L10: */ + } +/* L20: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L30: */ + } +/* L40: */ + } + } + return 0; + } + +/* Start the operations. */ + + if (notb) { + if (nota) { + +/* Form C := alpha*A*B + beta*C. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L50: */ + } + } else if (*beta != 1.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L60: */ + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + if (b[l + j * b_dim1] != 0.f) { + temp = *alpha * b[l + j * b_dim1]; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp * a[i__ + l * + a_dim1]; +/* L70: */ + } + } +/* L80: */ + } +/* L90: */ + } + } else { + +/* Form C := alpha*A'*B + beta*C */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = 0.f; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp += a[l + i__ * a_dim1] * b[l + j * b_dim1]; +/* L100: */ + } + if (*beta == 0.f) { + c__[i__ + j * c_dim1] = *alpha * temp; + } else { + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ + i__ + j * c_dim1]; + } +/* L110: */ + } +/* L120: */ + } + } + } else { + if (nota) { + +/* Form C := alpha*A*B' + beta*C */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L130: */ + } + } else if (*beta != 1.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L140: */ + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + if (b[j + l * b_dim1] != 0.f) { + temp = *alpha * b[j + l * b_dim1]; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp * a[i__ + l * + a_dim1]; +/* L150: */ + } + } +/* L160: */ + } +/* L170: */ + } + } else { + +/* Form C := alpha*A'*B' + beta*C */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = 0.f; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp += a[l + i__ * a_dim1] * b[j + l * b_dim1]; +/* L180: */ + } + if (*beta == 0.f) { + c__[i__ + j * c_dim1] = *alpha * temp; + } else { + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ + i__ + j * c_dim1]; + } +/* L190: */ + } +/* L200: */ + } + } + } + + return 0; + +/* End of SGEMM . */ + +} /* sgemm_ */ + +/* Subroutine */ int sgemv_(char *trans, integer *m, integer *n, real *alpha, + real *a, integer *lda, real *x, integer *incx, real *beta, real *y, + integer *incy) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + + /* Local variables */ + static integer i__, j, ix, iy, jx, jy, kx, ky, info; + static real temp; + static integer lenx, leny; + extern logical lsame_(char *, char *); + extern /* Subroutine */ int xerbla_(char *, integer *); + + +/* + Purpose + ======= + + SGEMV performs one of the matrix-vector operations + + y := alpha*A*x + beta*y, or y := alpha*A'*x + beta*y, + + where alpha and beta are scalars, x and y are vectors and A is an + m by n matrix. + + Parameters + ========== + + TRANS - CHARACTER*1. + On entry, TRANS specifies the operation to be performed as + follows: + + TRANS = 'N' or 'n' y := alpha*A*x + beta*y. + + TRANS = 'T' or 't' y := alpha*A'*x + beta*y. + + TRANS = 'C' or 'c' y := alpha*A'*x + beta*y. + + Unchanged on exit. + + M - INTEGER. + On entry, M specifies the number of rows of the matrix A. + M must be at least zero. + Unchanged on exit. + + N - INTEGER. + On entry, N specifies the number of columns of the matrix A. + N must be at least zero. + Unchanged on exit. + + ALPHA - REAL . + On entry, ALPHA specifies the scalar alpha. + Unchanged on exit. + + A - REAL array of DIMENSION ( LDA, n ). + Before entry, the leading m by n part of the array A must + contain the matrix of coefficients. + Unchanged on exit. + + LDA - INTEGER. + On entry, LDA specifies the first dimension of A as declared + in the calling (sub) program. LDA must be at least + max( 1, m ). + Unchanged on exit. + + X - REAL array of DIMENSION at least + ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n' + and at least + ( 1 + ( m - 1 )*abs( INCX ) ) otherwise. + Before entry, the incremented array X must contain the + vector x. + Unchanged on exit. + + INCX - INTEGER. + On entry, INCX specifies the increment for the elements of + X. INCX must not be zero. + Unchanged on exit. + + BETA - REAL . + On entry, BETA specifies the scalar beta. When BETA is + supplied as zero then Y need not be set on input. + Unchanged on exit. + + Y - REAL array of DIMENSION at least + ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n' + and at least + ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. + Before entry with BETA non-zero, the incremented array Y + must contain the vector y. On exit, Y is overwritten by the + updated vector y. + + INCY - INTEGER. + On entry, INCY specifies the increment for the elements of + Y. INCY must not be zero. + Unchanged on exit. + + + Level 2 Blas routine. + + -- Written on 22-October-1986. + Jack Dongarra, Argonne National Lab. + Jeremy Du Croz, Nag Central Office. + Sven Hammarling, Nag Central Office. + Richard Hanson, Sandia National Labs. + + + Test the input parameters. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --x; + --y; + + /* Function Body */ + info = 0; + if (! lsame_(trans, "N") && ! lsame_(trans, "T") && ! lsame_(trans, "C") + ) { + info = 1; + } else if (*m < 0) { + info = 2; + } else if (*n < 0) { + info = 3; + } else if (*lda < max(1,*m)) { + info = 6; + } else if (*incx == 0) { + info = 8; + } else if (*incy == 0) { + info = 11; + } + if (info != 0) { + xerbla_("SGEMV ", &info); + return 0; + } + +/* Quick return if possible. */ + + if (*m == 0 || *n == 0 || (*alpha == 0.f && *beta == 1.f)) { + return 0; + } + +/* + Set LENX and LENY, the lengths of the vectors x and y, and set + up the start points in X and Y. +*/ + + if (lsame_(trans, "N")) { + lenx = *n; + leny = *m; + } else { + lenx = *m; + leny = *n; + } + if (*incx > 0) { + kx = 1; + } else { + kx = 1 - (lenx - 1) * *incx; + } + if (*incy > 0) { + ky = 1; + } else { + ky = 1 - (leny - 1) * *incy; + } + +/* + Start the operations. In this version the elements of A are + accessed sequentially with one pass through A. + + First form y := beta*y. +*/ + + if (*beta != 1.f) { + if (*incy == 1) { + if (*beta == 0.f) { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + y[i__] = 0.f; +/* L10: */ + } + } else { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + y[i__] = *beta * y[i__]; +/* L20: */ + } + } + } else { + iy = ky; + if (*beta == 0.f) { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + y[iy] = 0.f; + iy += *incy; +/* L30: */ + } + } else { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + y[iy] = *beta * y[iy]; + iy += *incy; +/* L40: */ + } + } + } + } + if (*alpha == 0.f) { + return 0; + } + if (lsame_(trans, "N")) { + +/* Form y := alpha*A*x + y. */ + + jx = kx; + if (*incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[jx] != 0.f) { + temp = *alpha * x[jx]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + y[i__] += temp * a[i__ + j * a_dim1]; +/* L50: */ + } + } + jx += *incx; +/* L60: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[jx] != 0.f) { + temp = *alpha * x[jx]; + iy = ky; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + y[iy] += temp * a[i__ + j * a_dim1]; + iy += *incy; +/* L70: */ + } + } + jx += *incx; +/* L80: */ + } + } + } else { + +/* Form y := alpha*A'*x + y. */ + + jy = ky; + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = 0.f; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp += a[i__ + j * a_dim1] * x[i__]; +/* L90: */ + } + y[jy] += *alpha * temp; + jy += *incy; +/* L100: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = 0.f; + ix = kx; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp += a[i__ + j * a_dim1] * x[ix]; + ix += *incx; +/* L110: */ + } + y[jy] += *alpha * temp; + jy += *incy; +/* L120: */ + } + } + } + + return 0; + +/* End of SGEMV . */ + +} /* sgemv_ */ + +/* Subroutine */ int sscal_(integer *n, real *sa, real *sx, integer *incx) +{ + /* System generated locals */ + integer i__1, i__2; + + /* Local variables */ + static integer i__, m, mp1, nincx; + + +/* + scales a vector by a constant. + uses unrolled loops for increment equal to 1. + jack dongarra, linpack, 3/11/78. + modified 3/93 to return if incx .le. 0. + modified 12/3/93, array(1) declarations changed to array(*) +*/ + + + /* Parameter adjustments */ + --sx; + + /* Function Body */ + if (*n <= 0 || *incx <= 0) { + return 0; + } + if (*incx == 1) { + goto L20; + } + +/* code for increment not equal to 1 */ + + nincx = *n * *incx; + i__1 = nincx; + i__2 = *incx; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + sx[i__] = *sa * sx[i__]; +/* L10: */ + } + return 0; + +/* + code for increment equal to 1 + + + clean-up loop +*/ + +L20: + m = *n % 5; + if (m == 0) { + goto L40; + } + i__2 = m; + for (i__ = 1; i__ <= i__2; ++i__) { + sx[i__] = *sa * sx[i__]; +/* L30: */ + } + if (*n < 5) { + return 0; + } +L40: + mp1 = m + 1; + i__2 = *n; + for (i__ = mp1; i__ <= i__2; i__ += 5) { + sx[i__] = *sa * sx[i__]; + sx[i__ + 1] = *sa * sx[i__ + 1]; + sx[i__ + 2] = *sa * sx[i__ + 2]; + sx[i__ + 3] = *sa * sx[i__ + 3]; + sx[i__ + 4] = *sa * sx[i__ + 4]; +/* L50: */ + } + return 0; +} /* sscal_ */ + +/* Subroutine */ int ssymm_(char *side, char *uplo, integer *m, integer *n, + real *alpha, real *a, integer *lda, real *b, integer *ldb, real *beta, + real *c__, integer *ldc) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, + i__3; + + /* Local variables */ + static integer i__, j, k, info; + static real temp1, temp2; + extern logical lsame_(char *, char *); + static integer nrowa; + static logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *); + + +/* + Purpose + ======= + + SSYMM performs one of the matrix-matrix operations + + C := alpha*A*B + beta*C, + + or + + C := alpha*B*A + beta*C, + + where alpha and beta are scalars, A is a symmetric matrix and B and + C are m by n matrices. + + Parameters + ========== + + SIDE - CHARACTER*1. + On entry, SIDE specifies whether the symmetric matrix A + appears on the left or right in the operation as follows: + + SIDE = 'L' or 'l' C := alpha*A*B + beta*C, + + SIDE = 'R' or 'r' C := alpha*B*A + beta*C, + + Unchanged on exit. + + UPLO - CHARACTER*1. + On entry, UPLO specifies whether the upper or lower + triangular part of the symmetric matrix A is to be + referenced as follows: + + UPLO = 'U' or 'u' Only the upper triangular part of the + symmetric matrix is to be referenced. + + UPLO = 'L' or 'l' Only the lower triangular part of the + symmetric matrix is to be referenced. + + Unchanged on exit. + + M - INTEGER. + On entry, M specifies the number of rows of the matrix C. + M must be at least zero. + Unchanged on exit. + + N - INTEGER. + On entry, N specifies the number of columns of the matrix C. + N must be at least zero. + Unchanged on exit. + + ALPHA - REAL . + On entry, ALPHA specifies the scalar alpha. + Unchanged on exit. + + A - REAL array of DIMENSION ( LDA, ka ), where ka is + m when SIDE = 'L' or 'l' and is n otherwise. + Before entry with SIDE = 'L' or 'l', the m by m part of + the array A must contain the symmetric matrix, such that + when UPLO = 'U' or 'u', the leading m by m upper triangular + part of the array A must contain the upper triangular part + of the symmetric matrix and the strictly lower triangular + part of A is not referenced, and when UPLO = 'L' or 'l', + the leading m by m lower triangular part of the array A + must contain the lower triangular part of the symmetric + matrix and the strictly upper triangular part of A is not + referenced. + Before entry with SIDE = 'R' or 'r', the n by n part of + the array A must contain the symmetric matrix, such that + when UPLO = 'U' or 'u', the leading n by n upper triangular + part of the array A must contain the upper triangular part + of the symmetric matrix and the strictly lower triangular + part of A is not referenced, and when UPLO = 'L' or 'l', + the leading n by n lower triangular part of the array A + must contain the lower triangular part of the symmetric + matrix and the strictly upper triangular part of A is not + referenced. + Unchanged on exit. + + LDA - INTEGER. + On entry, LDA specifies the first dimension of A as declared + in the calling (sub) program. When SIDE = 'L' or 'l' then + LDA must be at least max( 1, m ), otherwise LDA must be at + least max( 1, n ). + Unchanged on exit. + + B - REAL array of DIMENSION ( LDB, n ). + Before entry, the leading m by n part of the array B must + contain the matrix B. + Unchanged on exit. + + LDB - INTEGER. + On entry, LDB specifies the first dimension of B as declared + in the calling (sub) program. LDB must be at least + max( 1, m ). + Unchanged on exit. + + BETA - REAL . + On entry, BETA specifies the scalar beta. When BETA is + supplied as zero then C need not be set on input. + Unchanged on exit. + + C - REAL array of DIMENSION ( LDC, n ). + Before entry, the leading m by n part of the array C must + contain the matrix C, except when beta is zero, in which + case C need not be set on entry. + On exit, the array C is overwritten by the m by n updated + matrix. + + LDC - INTEGER. + On entry, LDC specifies the first dimension of C as declared + in the calling (sub) program. LDC must be at least + max( 1, m ). + Unchanged on exit. + + + Level 3 Blas routine. + + -- Written on 8-February-1989. + Jack Dongarra, Argonne National Laboratory. + Iain Duff, AERE Harwell. + Jeremy Du Croz, Numerical Algorithms Group Ltd. + Sven Hammarling, Numerical Algorithms Group Ltd. + + + Set NROWA as the number of rows of A. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + + /* Function Body */ + if (lsame_(side, "L")) { + nrowa = *m; + } else { + nrowa = *n; + } + upper = lsame_(uplo, "U"); + +/* Test the input parameters. */ + + info = 0; + if (! lsame_(side, "L") && ! lsame_(side, "R")) { + info = 1; + } else if (! upper && ! lsame_(uplo, "L")) { + info = 2; + } else if (*m < 0) { + info = 3; + } else if (*n < 0) { + info = 4; + } else if (*lda < max(1,nrowa)) { + info = 7; + } else if (*ldb < max(1,*m)) { + info = 9; + } else if (*ldc < max(1,*m)) { + info = 12; + } + if (info != 0) { + xerbla_("SSYMM ", &info); + return 0; + } + +/* Quick return if possible. */ + + if (*m == 0 || *n == 0 || (*alpha == 0.f && *beta == 1.f)) { + return 0; + } + +/* And when alpha.eq.zero. */ + + if (*alpha == 0.f) { + if (*beta == 0.f) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L10: */ + } +/* L20: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L30: */ + } +/* L40: */ + } + } + return 0; + } + +/* Start the operations. */ + + if (lsame_(side, "L")) { + +/* Form C := alpha*A*B + beta*C. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp1 = *alpha * b[i__ + j * b_dim1]; + temp2 = 0.f; + i__3 = i__ - 1; + for (k = 1; k <= i__3; ++k) { + c__[k + j * c_dim1] += temp1 * a[k + i__ * a_dim1]; + temp2 += b[k + j * b_dim1] * a[k + i__ * a_dim1]; +/* L50: */ + } + if (*beta == 0.f) { + c__[i__ + j * c_dim1] = temp1 * a[i__ + i__ * a_dim1] + + *alpha * temp2; + } else { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + + temp1 * a[i__ + i__ * a_dim1] + *alpha * + temp2; + } +/* L60: */ + } +/* L70: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + for (i__ = *m; i__ >= 1; --i__) { + temp1 = *alpha * b[i__ + j * b_dim1]; + temp2 = 0.f; + i__2 = *m; + for (k = i__ + 1; k <= i__2; ++k) { + c__[k + j * c_dim1] += temp1 * a[k + i__ * a_dim1]; + temp2 += b[k + j * b_dim1] * a[k + i__ * a_dim1]; +/* L80: */ + } + if (*beta == 0.f) { + c__[i__ + j * c_dim1] = temp1 * a[i__ + i__ * a_dim1] + + *alpha * temp2; + } else { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + + temp1 * a[i__ + i__ * a_dim1] + *alpha * + temp2; + } +/* L90: */ + } +/* L100: */ + } + } + } else { + +/* Form C := alpha*B*A + beta*C. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp1 = *alpha * a[j + j * a_dim1]; + if (*beta == 0.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = temp1 * b[i__ + j * b_dim1]; +/* L110: */ + } + } else { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + + temp1 * b[i__ + j * b_dim1]; +/* L120: */ + } + } + i__2 = j - 1; + for (k = 1; k <= i__2; ++k) { + if (upper) { + temp1 = *alpha * a[k + j * a_dim1]; + } else { + temp1 = *alpha * a[j + k * a_dim1]; + } + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp1 * b[i__ + k * b_dim1]; +/* L130: */ + } +/* L140: */ + } + i__2 = *n; + for (k = j + 1; k <= i__2; ++k) { + if (upper) { + temp1 = *alpha * a[j + k * a_dim1]; + } else { + temp1 = *alpha * a[k + j * a_dim1]; + } + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp1 * b[i__ + k * b_dim1]; +/* L150: */ + } +/* L160: */ + } +/* L170: */ + } + } + + return 0; + +/* End of SSYMM . */ + +} /* ssymm_ */ + +/* Subroutine */ int ssyrk_(char *uplo, char *trans, integer *n, integer *k, + real *alpha, real *a, integer *lda, real *beta, real *c__, integer * + ldc) +{ + /* System generated locals */ + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3; + + /* Local variables */ + static integer i__, j, l, info; + static real temp; + extern logical lsame_(char *, char *); + static integer nrowa; + static logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *); + + +/* + Purpose + ======= + + SSYRK performs one of the symmetric rank k operations + + C := alpha*A*A' + beta*C, + + or + + C := alpha*A'*A + beta*C, + + where alpha and beta are scalars, C is an n by n symmetric matrix + and A is an n by k matrix in the first case and a k by n matrix + in the second case. + + Parameters + ========== + + UPLO - CHARACTER*1. + On entry, UPLO specifies whether the upper or lower + triangular part of the array C is to be referenced as + follows: + + UPLO = 'U' or 'u' Only the upper triangular part of C + is to be referenced. + + UPLO = 'L' or 'l' Only the lower triangular part of C + is to be referenced. + + Unchanged on exit. + + TRANS - CHARACTER*1. + On entry, TRANS specifies the operation to be performed as + follows: + + TRANS = 'N' or 'n' C := alpha*A*A' + beta*C. + + TRANS = 'T' or 't' C := alpha*A'*A + beta*C. + + TRANS = 'C' or 'c' C := alpha*A'*A + beta*C. + + Unchanged on exit. + + N - INTEGER. + On entry, N specifies the order of the matrix C. N must be + at least zero. + Unchanged on exit. + + K - INTEGER. + On entry with TRANS = 'N' or 'n', K specifies the number + of columns of the matrix A, and on entry with + TRANS = 'T' or 't' or 'C' or 'c', K specifies the number + of rows of the matrix A. K must be at least zero. + Unchanged on exit. + + ALPHA - REAL . + On entry, ALPHA specifies the scalar alpha. + Unchanged on exit. + + A - REAL array of DIMENSION ( LDA, ka ), where ka is + k when TRANS = 'N' or 'n', and is n otherwise. + Before entry with TRANS = 'N' or 'n', the leading n by k + part of the array A must contain the matrix A, otherwise + the leading k by n part of the array A must contain the + matrix A. + Unchanged on exit. + + LDA - INTEGER. + On entry, LDA specifies the first dimension of A as declared + in the calling (sub) program. When TRANS = 'N' or 'n' + then LDA must be at least max( 1, n ), otherwise LDA must + be at least max( 1, k ). + Unchanged on exit. + + BETA - REAL . + On entry, BETA specifies the scalar beta. + Unchanged on exit. + + C - REAL array of DIMENSION ( LDC, n ). + Before entry with UPLO = 'U' or 'u', the leading n by n + upper triangular part of the array C must contain the upper + triangular part of the symmetric matrix and the strictly + lower triangular part of C is not referenced. On exit, the + upper triangular part of the array C is overwritten by the + upper triangular part of the updated matrix. + Before entry with UPLO = 'L' or 'l', the leading n by n + lower triangular part of the array C must contain the lower + triangular part of the symmetric matrix and the strictly + upper triangular part of C is not referenced. On exit, the + lower triangular part of the array C is overwritten by the + lower triangular part of the updated matrix. + + LDC - INTEGER. + On entry, LDC specifies the first dimension of C as declared + in the calling (sub) program. LDC must be at least + max( 1, n ). + Unchanged on exit. + + + Level 3 Blas routine. + + -- Written on 8-February-1989. + Jack Dongarra, Argonne National Laboratory. + Iain Duff, AERE Harwell. + Jeremy Du Croz, Numerical Algorithms Group Ltd. + Sven Hammarling, Numerical Algorithms Group Ltd. + + + Test the input parameters. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + + /* Function Body */ + if (lsame_(trans, "N")) { + nrowa = *n; + } else { + nrowa = *k; + } + upper = lsame_(uplo, "U"); + + info = 0; + if (! upper && ! lsame_(uplo, "L")) { + info = 1; + } else if (! lsame_(trans, "N") && ! lsame_(trans, + "T") && ! lsame_(trans, "C")) { + info = 2; + } else if (*n < 0) { + info = 3; + } else if (*k < 0) { + info = 4; + } else if (*lda < max(1,nrowa)) { + info = 7; + } else if (*ldc < max(1,*n)) { + info = 10; + } + if (info != 0) { + xerbla_("SSYRK ", &info); + return 0; + } + +/* Quick return if possible. */ + + if (*n == 0 || ((*alpha == 0.f || *k == 0) && *beta == 1.f)) { + return 0; + } + +/* And when alpha.eq.zero. */ + + if (*alpha == 0.f) { + if (upper) { + if (*beta == 0.f) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L10: */ + } +/* L20: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L30: */ + } +/* L40: */ + } + } + } else { + if (*beta == 0.f) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L50: */ + } +/* L60: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L70: */ + } +/* L80: */ + } + } + } + return 0; + } + +/* Start the operations. */ + + if (lsame_(trans, "N")) { + +/* Form C := alpha*A*A' + beta*C. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.f) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L90: */ + } + } else if (*beta != 1.f) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L100: */ + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + if (a[j + l * a_dim1] != 0.f) { + temp = *alpha * a[j + l * a_dim1]; + i__3 = j; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp * a[i__ + l * + a_dim1]; +/* L110: */ + } + } +/* L120: */ + } +/* L130: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.f) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L140: */ + } + } else if (*beta != 1.f) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L150: */ + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + if (a[j + l * a_dim1] != 0.f) { + temp = *alpha * a[j + l * a_dim1]; + i__3 = *n; + for (i__ = j; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp * a[i__ + l * + a_dim1]; +/* L160: */ + } + } +/* L170: */ + } +/* L180: */ + } + } + } else { + +/* Form C := alpha*A'*A + beta*C. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = 0.f; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp += a[l + i__ * a_dim1] * a[l + j * a_dim1]; +/* L190: */ + } + if (*beta == 0.f) { + c__[i__ + j * c_dim1] = *alpha * temp; + } else { + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ + i__ + j * c_dim1]; + } +/* L200: */ + } +/* L210: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + temp = 0.f; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp += a[l + i__ * a_dim1] * a[l + j * a_dim1]; +/* L220: */ + } + if (*beta == 0.f) { + c__[i__ + j * c_dim1] = *alpha * temp; + } else { + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ + i__ + j * c_dim1]; + } +/* L230: */ + } +/* L240: */ + } + } + } + + return 0; + +/* End of SSYRK . */ + +} /* ssyrk_ */ + +/* Subroutine */ int strsm_(char *side, char *uplo, char *transa, char *diag, + integer *m, integer *n, real *alpha, real *a, integer *lda, real *b, + integer *ldb) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; + + /* Local variables */ + static integer i__, j, k, info; + static real temp; + static logical lside; + extern logical lsame_(char *, char *); + static integer nrowa; + static logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *); + static logical nounit; + + +/* + Purpose + ======= + + STRSM solves one of the matrix equations + + op( A )*X = alpha*B, or X*op( A ) = alpha*B, + + where alpha is a scalar, X and B are m by n matrices, A is a unit, or + non-unit, upper or lower triangular matrix and op( A ) is one of + + op( A ) = A or op( A ) = A'. + + The matrix X is overwritten on B. + + Parameters + ========== + + SIDE - CHARACTER*1. + On entry, SIDE specifies whether op( A ) appears on the left + or right of X as follows: + + SIDE = 'L' or 'l' op( A )*X = alpha*B. + + SIDE = 'R' or 'r' X*op( A ) = alpha*B. + + Unchanged on exit. + + UPLO - CHARACTER*1. + On entry, UPLO specifies whether the matrix A is an upper or + lower triangular matrix as follows: + + UPLO = 'U' or 'u' A is an upper triangular matrix. + + UPLO = 'L' or 'l' A is a lower triangular matrix. + + Unchanged on exit. + + TRANSA - CHARACTER*1. + On entry, TRANSA specifies the form of op( A ) to be used in + the matrix multiplication as follows: + + TRANSA = 'N' or 'n' op( A ) = A. + + TRANSA = 'T' or 't' op( A ) = A'. + + TRANSA = 'C' or 'c' op( A ) = A'. + + Unchanged on exit. + + DIAG - CHARACTER*1. + On entry, DIAG specifies whether or not A is unit triangular + as follows: + + DIAG = 'U' or 'u' A is assumed to be unit triangular. + + DIAG = 'N' or 'n' A is not assumed to be unit + triangular. + + Unchanged on exit. + + M - INTEGER. + On entry, M specifies the number of rows of B. M must be at + least zero. + Unchanged on exit. + + N - INTEGER. + On entry, N specifies the number of columns of B. N must be + at least zero. + Unchanged on exit. + + ALPHA - REAL . + On entry, ALPHA specifies the scalar alpha. When alpha is + zero then A is not referenced and B need not be set before + entry. + Unchanged on exit. + + A - REAL array of DIMENSION ( LDA, k ), where k is m + when SIDE = 'L' or 'l' and is n when SIDE = 'R' or 'r'. + Before entry with UPLO = 'U' or 'u', the leading k by k + upper triangular part of the array A must contain the upper + triangular matrix and the strictly lower triangular part of + A is not referenced. + Before entry with UPLO = 'L' or 'l', the leading k by k + lower triangular part of the array A must contain the lower + triangular matrix and the strictly upper triangular part of + A is not referenced. + Note that when DIAG = 'U' or 'u', the diagonal elements of + A are not referenced either, but are assumed to be unity. + Unchanged on exit. + + LDA - INTEGER. + On entry, LDA specifies the first dimension of A as declared + in the calling (sub) program. When SIDE = 'L' or 'l' then + LDA must be at least max( 1, m ), when SIDE = 'R' or 'r' + then LDA must be at least max( 1, n ). + Unchanged on exit. + + B - REAL array of DIMENSION ( LDB, n ). + Before entry, the leading m by n part of the array B must + contain the right-hand side matrix B, and on exit is + overwritten by the solution matrix X. + + LDB - INTEGER. + On entry, LDB specifies the first dimension of B as declared + in the calling (sub) program. LDB must be at least + max( 1, m ). + Unchanged on exit. + + + Level 3 Blas routine. + + + -- Written on 8-February-1989. + Jack Dongarra, Argonne National Laboratory. + Iain Duff, AERE Harwell. + Jeremy Du Croz, Numerical Algorithms Group Ltd. + Sven Hammarling, Numerical Algorithms Group Ltd. + + + Test the input parameters. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + + /* Function Body */ + lside = lsame_(side, "L"); + if (lside) { + nrowa = *m; + } else { + nrowa = *n; + } + nounit = lsame_(diag, "N"); + upper = lsame_(uplo, "U"); + + info = 0; + if (! lside && ! lsame_(side, "R")) { + info = 1; + } else if (! upper && ! lsame_(uplo, "L")) { + info = 2; + } else if (! lsame_(transa, "N") && ! lsame_(transa, + "T") && ! lsame_(transa, "C")) { + info = 3; + } else if (! lsame_(diag, "U") && ! lsame_(diag, + "N")) { + info = 4; + } else if (*m < 0) { + info = 5; + } else if (*n < 0) { + info = 6; + } else if (*lda < max(1,nrowa)) { + info = 9; + } else if (*ldb < max(1,*m)) { + info = 11; + } + if (info != 0) { + xerbla_("STRSM ", &info); + return 0; + } + +/* Quick return if possible. */ + + if (*n == 0) { + return 0; + } + +/* And when alpha.eq.zero. */ + + if (*alpha == 0.f) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = 0.f; +/* L10: */ + } +/* L20: */ + } + return 0; + } + +/* Start the operations. */ + + if (lside) { + if (lsame_(transa, "N")) { + +/* Form B := alpha*inv( A )*B. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*alpha != 1.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] + ; +/* L30: */ + } + } + for (k = *m; k >= 1; --k) { + if (b[k + j * b_dim1] != 0.f) { + if (nounit) { + b[k + j * b_dim1] /= a[k + k * a_dim1]; + } + i__2 = k - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[ + i__ + k * a_dim1]; +/* L40: */ + } + } +/* L50: */ + } +/* L60: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*alpha != 1.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] + ; +/* L70: */ + } + } + i__2 = *m; + for (k = 1; k <= i__2; ++k) { + if (b[k + j * b_dim1] != 0.f) { + if (nounit) { + b[k + j * b_dim1] /= a[k + k * a_dim1]; + } + i__3 = *m; + for (i__ = k + 1; i__ <= i__3; ++i__) { + b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[ + i__ + k * a_dim1]; +/* L80: */ + } + } +/* L90: */ + } +/* L100: */ + } + } + } else { + +/* Form B := alpha*inv( A' )*B. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = *alpha * b[i__ + j * b_dim1]; + i__3 = i__ - 1; + for (k = 1; k <= i__3; ++k) { + temp -= a[k + i__ * a_dim1] * b[k + j * b_dim1]; +/* L110: */ + } + if (nounit) { + temp /= a[i__ + i__ * a_dim1]; + } + b[i__ + j * b_dim1] = temp; +/* L120: */ + } +/* L130: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + for (i__ = *m; i__ >= 1; --i__) { + temp = *alpha * b[i__ + j * b_dim1]; + i__2 = *m; + for (k = i__ + 1; k <= i__2; ++k) { + temp -= a[k + i__ * a_dim1] * b[k + j * b_dim1]; +/* L140: */ + } + if (nounit) { + temp /= a[i__ + i__ * a_dim1]; + } + b[i__ + j * b_dim1] = temp; +/* L150: */ + } +/* L160: */ + } + } + } + } else { + if (lsame_(transa, "N")) { + +/* Form B := alpha*B*inv( A ). */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*alpha != 1.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] + ; +/* L170: */ + } + } + i__2 = j - 1; + for (k = 1; k <= i__2; ++k) { + if (a[k + j * a_dim1] != 0.f) { + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[ + i__ + k * b_dim1]; +/* L180: */ + } + } +/* L190: */ + } + if (nounit) { + temp = 1.f / a[j + j * a_dim1]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; +/* L200: */ + } + } +/* L210: */ + } + } else { + for (j = *n; j >= 1; --j) { + if (*alpha != 1.f) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] + ; +/* L220: */ + } + } + i__1 = *n; + for (k = j + 1; k <= i__1; ++k) { + if (a[k + j * a_dim1] != 0.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[ + i__ + k * b_dim1]; +/* L230: */ + } + } +/* L240: */ + } + if (nounit) { + temp = 1.f / a[j + j * a_dim1]; + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; +/* L250: */ + } + } +/* L260: */ + } + } + } else { + +/* Form B := alpha*B*inv( A' ). */ + + if (upper) { + for (k = *n; k >= 1; --k) { + if (nounit) { + temp = 1.f / a[k + k * a_dim1]; + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; +/* L270: */ + } + } + i__1 = k - 1; + for (j = 1; j <= i__1; ++j) { + if (a[j + k * a_dim1] != 0.f) { + temp = a[j + k * a_dim1]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] -= temp * b[i__ + k * + b_dim1]; +/* L280: */ + } + } +/* L290: */ + } + if (*alpha != 1.f) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1] + ; +/* L300: */ + } + } +/* L310: */ + } + } else { + i__1 = *n; + for (k = 1; k <= i__1; ++k) { + if (nounit) { + temp = 1.f / a[k + k * a_dim1]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; +/* L320: */ + } + } + i__2 = *n; + for (j = k + 1; j <= i__2; ++j) { + if (a[j + k * a_dim1] != 0.f) { + temp = a[j + k * a_dim1]; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + b[i__ + j * b_dim1] -= temp * b[i__ + k * + b_dim1]; +/* L330: */ + } + } +/* L340: */ + } + if (*alpha != 1.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1] + ; +/* L350: */ + } + } +/* L360: */ + } + } + } + } + + return 0; + +/* End of STRSM . */ + +} /* strsm_ */ + +/* Subroutine */ int xerbla_(char *srname, integer *info) +{ + /* Format strings */ + static char fmt_9999[] = "(\002 ** On entry to \002,a6,\002 parameter nu" + "mber \002,i2,\002 had \002,\002an illegal value\002)"; + + /* Builtin functions */ + integer s_wsfe(cilist *), do_fio(integer *, char *, ftnlen), e_wsfe(void); + /* Subroutine */ int s_stop(char *, ftnlen); + + /* Fortran I/O blocks */ + static cilist io___60 = { 0, 6, 0, fmt_9999, 0 }; + + +/* + -- LAPACK auxiliary routine (preliminary version) -- + Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., + Courant Institute, Argonne National Lab, and Rice University + February 29, 1992 + + + Purpose + ======= + + XERBLA is an error handler for the LAPACK routines. + It is called by an LAPACK routine if an input parameter has an + invalid value. A message is printed and execution stops. + + Installers may consider modifying the STOP statement in order to + call system-specific exception-handling facilities. + + Arguments + ========= + + SRNAME (input) CHARACTER*6 + The name of the routine which called XERBLA. + + INFO (input) INTEGER + The position of the invalid parameter in the parameter list + of the calling routine. +*/ + + + s_wsfe(&io___60); + do_fio(&c__1, srname, (ftnlen)6); + do_fio(&c__1, (char *)&(*info), (ftnlen)sizeof(integer)); + e_wsfe(); + + s_stop("", (ftnlen)0); + + +/* End of XERBLA */ + + return 0; +} /* xerbla_ */ + diff --git a/src/libpocketsphinx/blkarray_list.c b/src/util/blkarray_list.c similarity index 95% rename from src/libpocketsphinx/blkarray_list.c rename to src/util/blkarray_list.c index 4b9eb67..fd3bf74 100644 --- a/src/libpocketsphinx/blkarray_list.c +++ b/src/util/blkarray_list.c @@ -41,16 +41,12 @@ * Started. */ -/* System headers. */ #include -/* SphinxBase headers. */ -#include -#include -#include +#include -/* Local headers. */ -#include "blkarray_list.h" +#include "util/ckd_alloc.h" +#include "util/blkarray_list.h" #define BLKARRAY_DEFAULT_MAXBLKS 16380 diff --git a/src/libpocketsphinx/blkarray_list.h b/src/util/blkarray_list.h similarity index 97% rename from src/libpocketsphinx/blkarray_list.h rename to src/util/blkarray_list.h index a2e8513..19e0c85 100644 --- a/src/libpocketsphinx/blkarray_list.h +++ b/src/util/blkarray_list.h @@ -66,8 +66,14 @@ #define __S2_BLKARRAY_LIST_H__ -#include +#include +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif /* * For maintaining a (conceptual) "list" of pointers to arbitrary data. @@ -136,4 +142,8 @@ void blkarray_list_reset (blkarray_list_t *); /* Gets n-th element of the array list */ void * blkarray_list_get(blkarray_list_t *, int32 n); +#ifdef __cplusplus +} /* extern "C" */ +#endif + #endif diff --git a/src/util/byteorder.h b/src/util/byteorder.h new file mode 100644 index 0000000..11f0836 --- /dev/null +++ b/src/util/byteorder.h @@ -0,0 +1,102 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2001 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1996 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * + * $Log: byteorder.h,v $ + * Revision 1.8 2005/09/01 21:09:54 dhdfu + * Really, actually, truly consolidate byteswapping operations into + * byteorder.h. Where unconditional byteswapping is needed, SWAP_INT32() + * and SWAP_INT16() are to be used. The WORDS_BIGENDIAN macro from + * autoconf controls the functioning of the conditional swap macros + * (SWAP_?[LW]) whose names and semantics have been regularized. + * Private, adhoc macros have been removed. + * + */ + +/** + * @file byteorder.h + * @brief Byte order swapping macros. + */ + +#ifndef __S2_BYTEORDER_H__ +#define __S2_BYTEORDER_H__ 1 + +#ifdef HAVE_CONFIG_H +#include +#endif + +/* Macro to byteswap an int16 variable. x = ptr to variable */ +#define SWAP_INT16(x) *(x) = ((0x00ff & (*(x))>>8) | (0xff00 & (*(x))<<8)) + +/* Macro to byteswap an int32 variable. x = ptr to variable */ +#define SWAP_INT32(x) *(x) = ((0x000000ff & (*(x))>>24) | \ + (0x0000ff00 & (*(x))>>8) | \ + (0x00ff0000 & (*(x))<<8) | \ + (0xff000000 & (*(x))<<24)) + +/* Macro to byteswap a float32 variable. x = ptr to variable */ +#define SWAP_FLOAT32(x) SWAP_INT32((int32 *) x) + +/* Macro to byteswap a float64 variable. x = ptr to variable */ +#define SWAP_FLOAT64(x) { int *low = (int *) (x), *high = (int *) (x) + 1,\ + temp;\ + SWAP_INT32(low); SWAP_INT32(high);\ + temp = *low; *low = *high; *high = temp;} + +#ifdef WORDS_BIGENDIAN +#define SWAP_BE_64(x) +#define SWAP_BE_32(x) +#define SWAP_BE_16(x) +#define SWAP_LE_64(x) SWAP_FLOAT64(x) +#define SWAP_LE_32(x) SWAP_INT32(x) +#define SWAP_LE_16(x) SWAP_INT16(x) +#else +#define SWAP_LE_64(x) +#define SWAP_LE_32(x) +#define SWAP_LE_16(x) +#define SWAP_BE_64(x) SWAP_FLOAT64(x) +#define SWAP_BE_32(x) SWAP_INT32(x) +#define SWAP_BE_16(x) SWAP_INT16(x) +#endif + +#endif diff --git a/src/util/case.c b/src/util/case.c new file mode 100644 index 0000000..62f56d1 --- /dev/null +++ b/src/util/case.c @@ -0,0 +1,142 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * case.c -- Upper/lower case conversion routines + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: case.c,v $ + * Revision 1.7 2005/06/22 02:58:54 arthchan2003 + * Added keyword + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 18-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Added strcmp_nocase. Moved UPPER_CASE and LOWER_CASE definitions to .h. + * + * 16-Feb-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Created. + */ + + +#include +#include + +#include + +#include "util/case.h" + + +void +lcase(register char *cp) +{ + if (cp) { + while (*cp) { + *cp = LOWER_CASE(*cp); + cp++; + } + } +} + +void +ucase(register char *cp) +{ + if (cp) { + while (*cp) { + *cp = UPPER_CASE(*cp); + cp++; + } + } +} + +int32 +strcmp_nocase(const char *str1, const char *str2) +{ + char c1, c2; + + if (str1 == str2) + return 0; + if (str1 && str2) { + for (;;) { + c1 = *(str1++); + c1 = UPPER_CASE(c1); + c2 = *(str2++); + c2 = UPPER_CASE(c2); + if (c1 != c2) + return (c1 - c2); + if (c1 == '\0') + return 0; + } + } + else + return (str1 == NULL) ? -1 : 1; + + return 0; +} + +int32 +strncmp_nocase(const char *str1, const char *str2, size_t len) +{ + char c1, c2; + + if (str1 && str2) { + size_t n; + + for (n = 0; n < len; ++n) { + c1 = *(str1++); + c1 = UPPER_CASE(c1); + c2 = *(str2++); + c2 = UPPER_CASE(c2); + if (c1 != c2) + return (c1 - c2); + if (c1 == '\0') + return 0; + } + } + else + return (str1 == NULL) ? -1 : 1; + + return 0; +} diff --git a/src/util/case.h b/src/util/case.h new file mode 100644 index 0000000..aa47335 --- /dev/null +++ b/src/util/case.h @@ -0,0 +1,130 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * case.h -- Upper/lower case conversion routines + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: case.h,v $ + * Revision 1.7 2005/06/22 02:58:54 arthchan2003 + * Added keyword + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 18-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Added strcmp_nocase, UPPER_CASE and LOWER_CASE definitions. + * + * 16-Feb-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Created. + */ + + +/** + * @file case.h + * @brief Locale-independent implementation of case swapping operation. + * + * This function implements ASCII-only case switching and comparison + * related operations, which do not depend on the locale and are + * guaranteed to exist on all versions of Windows. + */ + +#ifndef _LIBUTIL_CASE_H_ +#define _LIBUTIL_CASE_H_ + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + + /** + * Return upper case form for c + */ +#define UPPER_CASE(c) ((((c) >= 'a') && ((c) <= 'z')) ? (c-32) : c) + + /** + * Return lower case form for c + */ +#define LOWER_CASE(c) ((((c) >= 'A') && ((c) <= 'Z')) ? (c+32) : c) + + + /** + * Convert str to all upper case. + * @param str is a string. + */ +void ucase(char *str); + + /** + * Convert str to all lower case + * @param str is a string. + */ +void lcase(char *str); + + /** + * (FIXME! The implementation is incorrect!) + * Case insensitive string compare. Return the usual -1, 0, +1, depending on + * str1 <, =, > str2 (case insensitive, of course). + * @param str1 is the first string. + * @param str2 is the second string. + */ +int32 strcmp_nocase(const char *str1, const char *str2); + +/** + * Like strcmp_nocase() but with a maximum length. + */ +int32 strncmp_nocase(const char *str1, const char *str2, size_t len); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/util/ckd_alloc.c b/src/util/ckd_alloc.c new file mode 100644 index 0000000..2c86d69 --- /dev/null +++ b/src/util/ckd_alloc.c @@ -0,0 +1,428 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * ckd_alloc.c -- Memory allocation package. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: ckd_alloc.c,v $ + * Revision 1.6 2005/06/22 02:59:25 arthchan2003 + * Added keyword + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 19-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Removed file,line arguments from free functions. + * Removed debugging stuff. + * + * 01-Jan-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created. + */ + + +/********************************************************************* + * + * $Header: /cvsroot/cmusphinx/sphinx3/src/libutil/ckd_alloc.c,v 1.6 2005/06/22 02:59:25 arthchan2003 Exp $ + * + * Carnegie Mellon ARPA Speech Group + * + * Copyright (c) 1994 Carnegie Mellon University. + * All rights reserved. + * + ********************************************************************* + * + * file: ckd_alloc.c + * + * traceability: + * + * description: + * + * author: + * + *********************************************************************/ + + +#include +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning (disable: 4996) +#endif + +#include + +#include "util/ckd_alloc.h" + +/** + * Target for longjmp() on failure. + * + * FIXME: This should be in thread-local storage. + */ +static jmp_buf *ckd_target; +static int jmp_abort; + +jmp_buf * +ckd_set_jump(jmp_buf *env, int abort) +{ + jmp_buf *old; + + if (abort) + jmp_abort = 1; + + old = ckd_target; + ckd_target = env; + return old; +} + +void +ckd_fail(char *format, ...) +{ + va_list args; + + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + + if (jmp_abort) + /* abort() doesn't exist in Windows CE */ + #if defined(_WIN32_WCE) + exit(-1); + #else + abort(); + #endif + else if (ckd_target) + longjmp(*ckd_target, 1); + else + exit(-1); +} + +void * +__ckd_calloc__(size_t n_elem, size_t elem_size, + const char *caller_file, int caller_line) +{ + void *mem; + +#if defined(__ADSPBLACKFIN__) && !defined(__linux__) + if ((mem = heap_calloc(heap_lookup(1),n_elem, elem_size)) == NULL) + if ((mem = heap_calloc(heap_lookup(0),n_elem, elem_size)) == NULL) + { + ckd_fail("calloc(%d,%d) failed from %s(%d), free space: %d\n", n_elem, + elem_size, caller_file, caller_line,space_unused()); + } +#else + if ((mem = calloc(n_elem, elem_size)) == NULL) { + ckd_fail("calloc(%d,%d) failed from %s(%d)\n", n_elem, + elem_size, caller_file, caller_line); + } +#endif + + + return mem; +} + + +void * +__ckd_malloc__(size_t size, const char *caller_file, int caller_line) +{ + void *mem; + +#if defined(__ADSPBLACKFIN__) && !defined(__linux__) + if ((mem = heap_malloc(heap_lookup(0),size)) == NULL) + if ((mem = heap_malloc(heap_lookup(1),size)) == NULL) +#else + if ((mem = malloc(size)) == NULL) +#endif + ckd_fail("malloc(%d) failed from %s(%d)\n", size, + caller_file, caller_line); + + return mem; +} + + +void * +__ckd_realloc__(void *ptr, size_t new_size, + const char *caller_file, int caller_line) +{ + void *mem; +#if defined(__ADSPBLACKFIN__) && !defined(__linux__) + if ((mem = heap_realloc(heap_lookup(0),ptr, new_size)) == NULL) { +#else + if ((mem = realloc(ptr, new_size)) == NULL) { +#endif + ckd_fail("malloc(%d) failed from %s(%d)\n", new_size, + caller_file, caller_line); + } + + return mem; +} + + +char * +__ckd_salloc__(const char *orig, const char *caller_file, + int caller_line) +{ + size_t len; + char *buf; + + if (!orig) + return NULL; + + len = strlen(orig) + 1; + buf = (char *) __ckd_malloc__(len, caller_file, caller_line); + + strcpy(buf, orig); + return (buf); +} + + +void * +__ckd_calloc_2d__(size_t d1, size_t d2, size_t elemsize, + const char *caller_file, int caller_line) +{ + char **ref, *mem; + size_t i, offset; + + mem = + (char *) __ckd_calloc__(d1 * d2, elemsize, caller_file, + caller_line); + ref = + (char **) __ckd_malloc__(d1 * sizeof(void *), caller_file, + caller_line); + + for (i = 0, offset = 0; i < d1; i++, offset += d2 * elemsize) + ref[i] = mem + offset; + + return ref; +} + + +void +ckd_free(void *ptr) +{ +#if defined(__ADSPBLACKFIN__) && !defined(__linux__) + if (ptr) + heap_free(0,ptr); +#else + free(ptr); +#endif +} + +void +ckd_free_2d(void *tmpptr) +{ + void **ptr = (void **)tmpptr; + if (ptr) + ckd_free(ptr[0]); + ckd_free(ptr); +} + + +void * +__ckd_calloc_3d__(size_t d1, size_t d2, size_t d3, size_t elemsize, + const char *caller_file, int caller_line) +{ + char ***ref1, **ref2, *mem; + size_t i, j, offset; + + mem = + (char *) __ckd_calloc__(d1 * d2 * d3, elemsize, caller_file, + caller_line); + ref1 = + (char ***) __ckd_malloc__(d1 * sizeof(void **), caller_file, + caller_line); + ref2 = + (char **) __ckd_malloc__(d1 * d2 * sizeof(void *), caller_file, + caller_line); + + for (i = 0, offset = 0; i < d1; i++, offset += d2) + ref1[i] = ref2 + offset; + + offset = 0; + for (i = 0; i < d1; i++) { + for (j = 0; j < d2; j++) { + ref1[i][j] = mem + offset; + offset += d3 * elemsize; + } + } + + return ref1; +} + + +void +ckd_free_3d(void *inptr) +{ + void ***ptr = (void ***)inptr; + + if (ptr && ptr[0]) + ckd_free(ptr[0][0]); + if (ptr) + ckd_free(ptr[0]); + ckd_free(ptr); +} + + +void **** +__ckd_calloc_4d__(size_t d1, + size_t d2, + size_t d3, + size_t d4, + size_t elem_size, + char *file, + int line) +{ + void *store; + void **tmp1; + void ***tmp2; + void ****out; + size_t i, j; + + store = calloc(d1 * d2 * d3 * d4, elem_size); + if (store == NULL) { + E_FATAL("ckd_calloc_4d failed for caller at %s(%d) at %s(%d)\n", + file, line, __FILE__, __LINE__); + } + + tmp1 = calloc(d1 * d2 * d3, sizeof(void *)); + if (tmp1 == NULL) { + E_FATAL("ckd_calloc_4d failed for caller at %s(%d) at %s(%d)\n", + file, line, __FILE__, __LINE__); + } + + tmp2 = ckd_calloc(d1 * d2, sizeof(void **)); + if (tmp2 == NULL) { + E_FATAL("ckd_calloc_4d failed for caller at %s(%d) at %s(%d)\n", + file, line, __FILE__, __LINE__); + } + + out = ckd_calloc(d1, sizeof(void ***)); + if (out == NULL) { + E_FATAL("ckd_calloc_4d failed for caller at %s(%d) at %s(%d)\n", + file, line, __FILE__, __LINE__); + } + + for (i = 0, j = 0; i < d1*d2*d3; i++, j += d4) { + tmp1[i] = &((char *)store)[j*elem_size]; + } + + for (i = 0, j = 0; i < d1*d2; i++, j += d3) { + tmp2[i] = &tmp1[j]; + } + + for (i = 0, j = 0; i < d1; i++, j += d2) { + out[i] = &tmp2[j]; + } + + return out; +} + +void +ckd_free_4d(void *inptr) +{ + void ****ptr = (void ****)inptr; + if (ptr == NULL) + return; + /* free the underlying store */ + ckd_free(ptr[0][0][0]); + + /* free the access overhead */ + ckd_free(ptr[0][0]); + ckd_free(ptr[0]); + ckd_free(ptr); +} + +/* Layers a 3d array access structure over a preallocated storage area */ +void * +__ckd_alloc_3d_ptr(size_t d1, + size_t d2, + size_t d3, + void *store, + size_t elem_size, + char *file, + int line) +{ + void **tmp1; + void ***out; + size_t i, j; + + tmp1 = __ckd_calloc__(d1 * d2, sizeof(void *), file, line); + + out = __ckd_calloc__(d1, sizeof(void **), file, line); + + for (i = 0, j = 0; i < d1*d2; i++, j += d3) { + tmp1[i] = &((char *)store)[j*elem_size]; + } + + for (i = 0, j = 0; i < d1; i++, j += d2) { + out[i] = &tmp1[j]; + } + + return out; +} + +void * +__ckd_alloc_2d_ptr(size_t d1, + size_t d2, + void *store, + size_t elem_size, + char *file, + int line) +{ + void **out; + size_t i, j; + + out = __ckd_calloc__(d1, sizeof(void *), file, line); + + for (i = 0, j = 0; i < d1; i++, j += d2) { + out[i] = &((char *)store)[j*elem_size]; + } + + return out; +} + +/* vim: set ts=4 sw=4: */ diff --git a/src/util/ckd_alloc.h b/src/util/ckd_alloc.h new file mode 100644 index 0000000..2f5effd --- /dev/null +++ b/src/util/ckd_alloc.h @@ -0,0 +1,303 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * ckd_alloc.h -- Memory allocation package. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: ckd_alloc.h,v $ + * Revision 1.10 2005/06/22 02:59:25 arthchan2003 + * Added keyword + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 19-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Removed file,line arguments from free functions. + * + * 01-Jan-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created. + */ + + +/********************************************************************* + * + * $Header: /cvsroot/cmusphinx/sphinx3/src/libutil/ckd_alloc.h,v 1.10 2005/06/22 02:59:25 arthchan2003 Exp $ + * + * Carnegie Mellon ARPA Speech Group + * + * Copyright (c) 1994 Carnegie Mellon University. + * All rights reserved. + * + ********************************************************************* + * + * file: ckd_alloc.h + * + * traceability: + * + * description: + * + * author: + * + *********************************************************************/ + + +#ifndef _LIBUTIL_CKD_ALLOC_H_ +#define _LIBUTIL_CKD_ALLOC_H_ + +#include +#include + +#include +#include + + +/** \file ckd_alloc.h + *\brief Sphinx's memory allocation/deallocation routines. + * + *Implementation of efficient memory allocation deallocation for + *multiple dimensional arrays. + * + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Control behaviour of the program when allocation fails. + * + * Although your program is probably toast when memory allocation + * fails, it is also probably a good idea to be able to catch these + * errors and alert the user in some way. Either that, or you might + * want the program to call abort() so that you can debug the failed + * code. This function allows you to control that behaviour. + * + * @param env Pointer to a jmp_buf initialized with + * setjmp(), or NULL to remove a previously set jump target. + * @param abort If non-zero, the program will call abort() when + * allocation fails rather than exiting or calling longjmp(). + * @return Pointer to a previously set jmp_buf, if any. + */ +jmp_buf *ckd_set_jump(jmp_buf *env, int abort); + +/** + * Fail (with a message) according to behaviour specified by ckd_set_jump(). + */ +void ckd_fail(char *format, ...); + +/* + * The following functions are similar to the malloc family, except + * that they have two additional parameters, caller_file and + * caller_line, for error reporting. All functions print a diagnostic + * message if any error occurs, with any other behaviour determined by + * ckd_set_jump(), above. + */ +POCKETSPHINX_EXPORT +void *__ckd_calloc__(size_t n_elem, size_t elem_size, + const char *caller_file, int caller_line); + +POCKETSPHINX_EXPORT +void *__ckd_malloc__(size_t size, + const char *caller_file, int caller_line); + +POCKETSPHINX_EXPORT +void *__ckd_realloc__(void *ptr, size_t new_size, + const char *caller_file, int caller_line); + +/** + * Like strdup, except that if an error occurs it prints a diagnostic message and + * exits. If origin in NULL the function also returns NULL. + */ +POCKETSPHINX_EXPORT +char *__ckd_salloc__(const char *origstr, + const char *caller_file, int caller_line); + +/** + * Allocate a 2-D array and return ptr to it (ie, ptr to vector of ptrs). + * The data area is allocated in one block so it can also be treated as a 1-D array. + */ +POCKETSPHINX_EXPORT +void *__ckd_calloc_2d__(size_t d1, size_t d2, /* In: #elements in the 2 dimensions */ + size_t elemsize, /* In: Size (#bytes) of each element */ + const char *caller_file, int caller_line); /* In */ + +/** + * Allocate a 3-D array and return ptr to it. + * The data area is allocated in one block so it can also be treated as a 1-D array. + */ +void *__ckd_calloc_3d__(size_t d1, size_t d2, size_t d3, /* In: #elems in the dims */ + size_t elemsize, /* In: Size (#bytes) per element */ + const char *caller_file, int caller_line); /* In */ + +/** + * Allocate a 34D array and return ptr to it. + * The data area is allocated in one block so it can also be treated as a 1-D array. + */ +void ****__ckd_calloc_4d__(size_t d1, + size_t d2, + size_t d3, + size_t d4, + size_t elem_size, + char *caller_file, + int caller_line); + +/** + * Overlay a 3-D array over a previously allocated storage area. + **/ +void * __ckd_alloc_3d_ptr(size_t d1, + size_t d2, + size_t d3, + void *store, + size_t elem_size, + char *caller_file, + int caller_line); + +/** + * Overlay a s-D array over a previously allocated storage area. + **/ +void *__ckd_alloc_2d_ptr(size_t d1, + size_t d2, + void *store, + size_t elem_size, + char *caller_file, + int caller_line); + +/** + * Test and free a 1-D array + */ +POCKETSPHINX_EXPORT +void ckd_free(void *ptr); + +/** + * Free a 2-D array (ptr) previously allocated by ckd_calloc_2d + */ +POCKETSPHINX_EXPORT +void ckd_free_2d(void *ptr); + +/** + * Free a 3-D array (ptr) previously allocated by ckd_calloc_3d + */ +void ckd_free_3d(void *ptr); + +/** + * Free a 4-D array (ptr) previously allocated by ckd_calloc_4d + */ +void ckd_free_4d(void *ptr); + +/** + * Macros to simplify the use of above functions. + * One should use these, rather than target functions directly. + */ + +/** + * Macro for __ckd_calloc__ + */ +#define ckd_calloc(n,sz) __ckd_calloc__((n),(sz),__FILE__,__LINE__) + +/** + * Macro for __ckd_malloc__ + */ +#define ckd_malloc(sz) __ckd_malloc__((sz),__FILE__,__LINE__) + +/** + * Macro for __ckd_realloc__ + */ +#define ckd_realloc(ptr,sz) __ckd_realloc__(ptr,(sz),__FILE__,__LINE__) + +/** + * Macro for __ckd_salloc__ + */ + +#define ckd_salloc(ptr) __ckd_salloc__(ptr,__FILE__,__LINE__) + +/** + * Macro for __ckd_calloc_2d__ + */ + +#define ckd_calloc_2d(d1,d2,sz) __ckd_calloc_2d__((d1),(d2),(sz),__FILE__,__LINE__) + +/** + * Macro for __ckd_calloc_3d__ + */ + +#define ckd_calloc_3d(d1,d2,d3,sz) __ckd_calloc_3d__((d1),(d2),(d3),(sz),__FILE__,__LINE__) + +/** + * Macro for __ckd_calloc_4d__ + */ +#define ckd_calloc_4d(d1, d2, d3, d4, s) __ckd_calloc_4d__((d1), (d2), (d3), (d4), (s), __FILE__, __LINE__) + +/** + * Macro for __ckd_alloc_2d_ptr__ + */ + +#define ckd_alloc_2d_ptr(d1, d2, bf, sz) __ckd_alloc_2d_ptr((d1), (d2), (bf), (sz), __FILE__, __LINE__) + +/** + * Free only the pointer arrays allocated with ckd_alloc_2d_ptr(). + */ +#define ckd_free_2d_ptr(bf) ckd_free(bf) + +/** + * Macro for __ckd_alloc_3d_ptr__ + */ + +#define ckd_alloc_3d_ptr(d1, d2, d3, bf, sz) __ckd_alloc_3d_ptr((d1), (d2), (d3), (bf), (sz), __FILE__, __LINE__) + +/** + * Free only the pointer arrays allocated with ckd_alloc_3d_ptr(). + */ +#define ckd_free_3d_ptr(bf) ckd_free_2d(bf) + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/util/clapack_lite.h b/src/util/clapack_lite.h new file mode 100644 index 0000000..ed9e5fc --- /dev/null +++ b/src/util/clapack_lite.h @@ -0,0 +1,40 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +#ifndef __CLAPACK_LITE_H +#define __CLAPACK_LITE_H + +#include "f2c.h" + +/** + * @file clapack_lite.h + * @brief Built-in tiny subset of LAPACK for MLLR and such + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/* Subroutine */ int sgemm_(char *transa, char *transb, integer *m, integer * + n, integer *k, real *alpha, real *a, integer *lda, real *b, integer * + ldb, real *beta, real *c__, integer *ldc); +/* Subroutine */ int sgemv_(char *trans, integer *m, integer *n, real *alpha, + real *a, integer *lda, real *x, integer *incx, real *beta, real *y, + integer *incy); +/* Subroutine */ int ssymm_(char *side, char *uplo, integer *m, integer *n, + real *alpha, real *a, integer *lda, real *b, integer *ldb, real *beta, + real *c__, integer *ldc); + +/* Subroutine */ int sposv_(char *uplo, integer *n, integer *nrhs, real *a, + integer *lda, real *b, integer *ldb, integer *info); +/* Subroutine */ int spotrf_(char *uplo, integer *n, real *a, integer *lda, + integer *info); + +#ifdef __cplusplus +} +#endif + + +#endif /* __CLAPACK_LITE_H */ diff --git a/src/util/clapack_scrub.py b/src/util/clapack_scrub.py new file mode 100644 index 0000000..be663dc --- /dev/null +++ b/src/util/clapack_scrub.py @@ -0,0 +1,276 @@ +#!/usr/bin/env python2.4 + +import sys, os +from cStringIO import StringIO +import re + +from Plex import * +from Plex.Traditional import re as Re + +class MyScanner(Scanner): + def __init__(self, info, name=''): + Scanner.__init__(self, self.lexicon, info, name) + + def begin(self, state_name): +# if self.state_name == '': +# print '' +# else: +# print self.state_name + Scanner.begin(self, state_name) + +def sep_seq(sequence, sep): + pat = Str(sequence[0]) + for s in sequence[1:]: + pat += sep + Str(s) + return pat + +def runScanner(data, scanner_class, lexicon=None): + info = StringIO(data) + outfo = StringIO() + if lexicon is not None: + scanner = scanner_class(lexicon, info) + else: + scanner = scanner_class(info) + while 1: + value, text = scanner.read() + if value is None: + break + elif value is IGNORE: + pass + else: + outfo.write(value) + return outfo.getvalue(), scanner + +class LenSubsScanner(MyScanner): + """Following clapack, we remove ftnlen arguments, which f2c puts after + a char * argument to hold the length of the passed string. This is just + a nuisance in C. + """ + def __init__(self, info, name=''): + MyScanner.__init__(self, info, name) + self.paren_count = 0 + + def beginArgs(self, text): + if self.paren_count == 0: + self.begin('args') + self.paren_count += 1 + return text + + def endArgs(self, text): + self.paren_count -= 1 + if self.paren_count == 0: + self.begin('') + return text + + digits = Re('[0-9]+') + iofun = Re(r'\([^;]*;') + decl = Re(r'\([^)]*\)[,;'+'\n]') + any = Re('[.]*') + S = Re('[ \t\n]*') + cS = Str(',') + S + len_ = Re('[a-z][a-z0-9]*_len') + + iofunctions = Str("s_cat", "s_copy", "s_stop", "s_cmp", + "i_len", "do_fio", "do_lio") + iofun + + # Routines to not scrub the ftnlen argument from + keep_ftnlen = (Str('ilaenv_') | Str('s_rnge')) + Str('(') + + lexicon = Lexicon([ + (iofunctions, TEXT), + (keep_ftnlen, beginArgs), + State('args', [ + (Str(')'), endArgs), + (Str('('), beginArgs), + (AnyChar, TEXT), + ]), + (cS+Re(r'[1-9][0-9]*L'), IGNORE), + (cS+Str('ftnlen')+Opt(S+len_), IGNORE), + (cS+sep_seq(['(', 'ftnlen', ')'], S)+S+digits, IGNORE), + (Bol+Str('ftnlen ')+len_+Str(';\n'), IGNORE), + (cS+len_, TEXT), + (AnyChar, TEXT), + ]) + +def scrubFtnlen(source): + return runScanner(source, LenSubsScanner)[0] + +def cleanSource(source): + # remove whitespace at end of lines + source = re.sub(r'[\t ]+\n', '\n', source) + # remove comments like .. Scalar Arguments .. + source = re.sub(r'(?m)^[\t ]*/\* *\.\. .*?\n', '', source) + # collapse blanks of more than two in-a-row to two + source = re.sub(r'\n\n\n\n+', r'\n\n\n', source) + return source + +class LineQueue(object): + def __init__(self): + object.__init__(self) + self._queue = [] + + def add(self, line): + self._queue.append(line) + + def clear(self): + self._queue = [] + + def flushTo(self, other_queue): + for line in self._queue: + other_queue.add(line) + self.clear() + + def getValue(self): + q = LineQueue() + self.flushTo(q) + s = ''.join(q._queue) + self.clear() + return s + +class CommentQueue(LineQueue): + def __init__(self): + LineQueue.__init__(self) + + def add(self, line): + if line.strip() == '': + LineQueue.add(self, '\n') + else: + line = ' ' + line[2:-3].rstrip() + '\n' + LineQueue.add(self, line) + + def flushTo(self, other_queue): + if len(self._queue) == 0: + pass + elif len(self._queue) == 1: + other_queue.add('/*' + self._queue[0][2:].rstrip() + ' */\n') + else: + other_queue.add('/*\n') + LineQueue.flushTo(self, other_queue) + other_queue.add('*/\n') + self.clear() + +# This really seems to be about 4x longer than it needs to be +def cleanComments(source): + lines = LineQueue() + comments = CommentQueue() + def isCommentLine(line): + return line.startswith('/*') and line.endswith('*/\n') + + blanks = LineQueue() + def isBlank(line): + return line.strip() == '' + + def SourceLines(line): + if isCommentLine(line): + comments.add(line) + return HaveCommentLines + else: + lines.add(line) + return SourceLines + def HaveCommentLines(line): + if isBlank(line): + blanks.add('\n') + return HaveBlankLines + elif isCommentLine(line): + comments.add(line) + return HaveCommentLines + else: + comments.flushTo(lines) + lines.add(line) + return SourceLines + def HaveBlankLines(line): + if isBlank(line): + blanks.add('\n') + return HaveBlankLines + elif isCommentLine(line): + blanks.flushTo(comments) + comments.add(line) + return HaveCommentLines + else: + comments.flushTo(lines) + blanks.flushTo(lines) + lines.add(line) + return SourceLines + + state = SourceLines + for line in StringIO(source): + state = state(line) + comments.flushTo(lines) + return lines.getValue() + +def removeHeader(source): + lines = LineQueue() + + def LookingForHeader(line): + m = re.match(r'/\*[^\n]*-- translated', line) + if m: + return InHeader + else: + lines.add(line) + return LookingForHeader + def InHeader(line): + if line.startswith('*/'): + return OutOfHeader + else: + return InHeader + def OutOfHeader(line): + if line.startswith('#include "f2c.h"'): + pass + else: + lines.add(line) + return OutOfHeader + + state = LookingForHeader + for line in StringIO(source): + state = state(line) + return lines.getValue() + +def replaceSlamch(source): + """Replace slamch_ calls with appropriate macros""" + def repl(m): + s = m.group(1) + return dict(E='EPSILON', P='PRECISION', S='SAFEMINIMUM', + B='BASE')[s[0]] + source = re.sub(r'slamch_\("(.*?)"\)', repl, source) + source = re.sub(r'^\s+extern.*? slamch_.*?;$(?m)', '', source) + return source + +# do it + +def scrubSource(source, nsteps=None, verbose=False): + steps = [ + ('scrubbing ftnlen', scrubFtnlen), + ('remove header', removeHeader), + ('clean source', cleanSource), + ('clean comments', cleanComments), + ('replace slamch_() calls', replaceSlamch), + ] + + if nsteps is not None: + steps = steps[:nsteps] + + for msg, step in steps: + if verbose: + print msg + source = step(source) + + return source + +if __name__ == '__main__': + filename = sys.argv[1] + outfilename = os.path.join(sys.argv[2], os.path.basename(filename)) + fo = open(filename, 'r') + source = fo.read() + fo.close() + + if len(sys.argv) > 3: + nsteps = int(sys.argv[3]) + else: + nsteps = None + + source = scrub_source(source, nsteps, verbose=True) + + writefo = open(outfilename, 'w') + writefo.write(source) + writefo.close() + diff --git a/src/util/cmd_ln.c b/src/util/cmd_ln.c new file mode 100644 index 0000000..74159aa --- /dev/null +++ b/src/util/cmd_ln.c @@ -0,0 +1,590 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * cmd_ln.c -- Command line argument parsing. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * + * 10-Sep-1998 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Changed strcasecmp() call in cmp_name() to strcmp_nocase() call. + * + * 15-Jul-1997 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added required arguments handling. + * + * 07-Dec-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created, based on Eric's implementation. Basically, combined several + * functions into one, eliminated validation, and simplified the interface. + */ + + +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning (disable: 4996 4018) +#endif + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "util/cmd_ln.h" +#include "util/ckd_alloc.h" +#include "util/hash_table.h" +#include "util/case.h" +#include "util/strfuncs.h" + +#include "pocketsphinx_internal.h" + +static void +arg_log_r(ps_config_t *, ps_arg_t const *, int32, int32); + +static ps_config_t * +parse_options(ps_config_t *, const ps_arg_t *, int32, char* [], int32); + +/* + * Find max length of name and default fields in the given defn array. + * Return #items in defn array. + */ +static int32 +arg_strlen(const ps_arg_t * defn, int32 * namelen, int32 * deflen) +{ + int32 i, l; + + *namelen = *deflen = 0; + for (i = 0; defn[i].name; i++) { + l = strlen(defn[i].name) + 1; /* leading dash */ + if (*namelen < l) + *namelen = l; + + if (defn[i].deflt) + l = strlen(defn[i].deflt); + else + l = strlen("(null)"); + /* E_INFO("string default, %s , name %s, length %d\n",defn[i].deflt,defn[i].name,l); */ + if (*deflen < l) + *deflen = l; + } + + return i; +} + +static int32 +cmp_name(const void *a, const void *b) +{ + return (strcmp_nocase + ((* (ps_arg_t**) a)->name, + (* (ps_arg_t**) b)->name)); +} + +static ps_arg_t const ** +arg_sort(const ps_arg_t * defn, int32 n) +{ + const ps_arg_t ** pos; + int32 i; + + pos = (ps_arg_t const **) ckd_calloc(n, sizeof(ps_arg_t *)); + for (i = 0; i < n; ++i) + pos[i] = &defn[i]; + qsort(pos, n, sizeof(ps_arg_t *), cmp_name); + + return pos; +} + +cmd_ln_val_t * +cmd_ln_access_r(ps_config_t *cmdln, const char *name) +{ + void *val; + if (hash_table_lookup(cmdln->ht, name, &val) < 0) { + E_ERROR("Unknown argument: %s\n", name); + return NULL; + } + return (cmd_ln_val_t *)val; +} + +cmd_ln_val_t * +cmd_ln_val_init(int t, const char *name, const char *str) +{ + cmd_ln_val_t *v; + + v = ckd_calloc(1, sizeof(*v)); + if (anytype_from_str(&v->val, t, str) == NULL) { + ckd_free(v); + return NULL; + } + v->type = t; + v->name = ckd_salloc(name); + + return v; +} + +void +cmd_ln_val_free(cmd_ln_val_t *val) +{ + if (val->type & ARG_STRING) + ckd_free(val->val.ptr); + ckd_free(val->name); + ckd_free(val); +} + + +static void +arg_log_r(ps_config_t *cmdln, const ps_arg_t * defn, int32 doc, int32 lineno) +{ + ps_arg_t const **pos; + int32 i, n; + int32 namelen, deflen; + cmd_ln_val_t const *vp; + + /* No definitions, do nothing. */ + if (defn == NULL) + return; + + /* Find max lengths of name and default value fields, and #entries in defn */ + n = arg_strlen(defn, &namelen, &deflen); + namelen += 4; + deflen += 4; + if (lineno) + E_INFO("%-*s", namelen, "[NAME]"); + else + E_INFOCONT("%-*s", namelen, "[NAME]"); + E_INFOCONT("%-*s", deflen, "[DEFLT]"); + if (doc) { + E_INFOCONT(" [DESCR]\n"); + } + else { + E_INFOCONT(" [VALUE]\n"); + } + + /* Print current configuration, sorted by name */ + pos = arg_sort(defn, n); + for (i = 0; i < n; i++) { + if (lineno) + E_INFO("-%-*s", namelen, pos[i]->name); + else + E_INFOCONT("-%-*s", namelen, pos[i]->name); + if (pos[i]->deflt) + E_INFOCONT("%-*s", deflen, pos[i]->deflt); + else + E_INFOCONT("%-*s", deflen, ""); + if (doc) { + if (pos[i]->doc) + E_INFOCONT(" %s", pos[i]->doc); + } + else { + vp = cmd_ln_access_r(cmdln, pos[i]->name); + if (vp) { + switch (pos[i]->type) { + case ARG_INTEGER: + case REQARG_INTEGER: + E_INFOCONT(" %ld", vp->val.i); + break; + case ARG_FLOATING: + case REQARG_FLOATING: + E_INFOCONT(" %e", vp->val.fl); + break; + case ARG_STRING: + case REQARG_STRING: + if (vp->val.ptr) + E_INFOCONT(" %s", (char *)vp->val.ptr); + break; + case ARG_BOOLEAN: + case REQARG_BOOLEAN: + E_INFOCONT(" %s", vp->val.i ? "yes" : "no"); + break; + default: + E_ERROR("Unknown argument type: %d\n", pos[i]->type); + } + } + } + + E_INFOCONT("\n"); + } + ckd_free(pos); + E_INFOCONT("\n"); +} + + +/* + * Handles option parsing for cmd_ln_parse_file_r() and cmd_ln_init() + * also takes care of storing argv. + * DO NOT call it from cmd_ln_parse_r() + */ +static ps_config_t * +parse_options(ps_config_t *cmdln, const ps_arg_t *defn, int32 argc, char* argv[], int32 strict) +{ + ps_config_t *new_cmdln; + + new_cmdln = cmd_ln_parse_r(cmdln, defn, argc, argv, strict); + /* If this failed then clean up and return NULL. */ + if (new_cmdln == NULL) { + int32 i; + for (i = 0; i < argc; ++i) + ckd_free(argv[i]); + ckd_free(argv); + return NULL; + } + + /* Otherwise, we need to add the contents of f_argv to the new object. */ + if (new_cmdln == cmdln) { + /* If we are adding to a previously passed-in cmdln, then + * store our allocated strings in its f_argv. */ + new_cmdln->f_argv = (char **)ckd_realloc(new_cmdln->f_argv, + (new_cmdln->f_argc + argc) + * sizeof(*new_cmdln->f_argv)); + memcpy(new_cmdln->f_argv + new_cmdln->f_argc, argv, + argc * sizeof(*argv)); + ckd_free(argv); + new_cmdln->f_argc += argc; + } + else { + /* Otherwise, store f_argc and f_argv. */ + new_cmdln->f_argc = argc; + new_cmdln->f_argv = argv; + } + + return new_cmdln; +} + +ps_config_t * +cmd_ln_parse_r(ps_config_t *inout_cmdln, const ps_arg_t * defn, + int32 argc, char *argv[], int strict) +{ + int32 i, j, n, argstart; + hash_table_t *defidx = NULL; + ps_config_t *cmdln; + + /* Construct command-line object */ + if (inout_cmdln == NULL) { + cmdln = ps_config_init(defn); + cmdln->defn = defn; + } + else /* FIXME: definitions should just be in the ps_config_t */ + cmdln = inout_cmdln; + + /* Build a hash table for argument definitions */ + defidx = hash_table_new(50, 0); + if (defn) { + for (n = 0; defn[n].name; n++) { + void *v; + + v = hash_table_enter(defidx, defn[n].name, (void *)&defn[n]); + if (strict && (v != &defn[n])) { + E_ERROR("Duplicate argument name in definition: %s\n", defn[n].name); + goto error; + } + } + } + else { + /* No definitions. */ + n = 0; + } + + /* skip argv[0] if it doesn't start with dash (starting with a + * dash would only happen if called from parse_options()) */ + argstart = 0; + if (argc > 0 && argv[0][0] != '-') { + argstart = 1; + } + + /* Parse command line arguments (name-value pairs) */ + for (j = argstart; j < argc; j += 2) { + ps_arg_t *argdef; + cmd_ln_val_t *val; + char *name; + void *v; + + name = argv[j]; + if (*name && *name == '-') + ++name; + if (*name && *name == '-') + ++name; + if (hash_table_lookup(defidx, name, &v) < 0) { + if (strict) { + E_ERROR("Unknown argument name '%s'\n", name); + goto error; + } + else if (defn == NULL) + v = NULL; + else + continue; + } + argdef = (ps_arg_t *)v; + + /* Enter argument value */ + if (j + 1 >= argc) { + E_ERROR("Argument value for '%s' missing\n", name); + goto error; + } + + if (argdef == NULL) + val = cmd_ln_val_init(ARG_STRING, name, argv[j + 1]); + else { + if ((val = cmd_ln_val_init(argdef->type, name, argv[j + 1])) == NULL) { + E_ERROR("Bad argument value for %s: %s\n", name, argv[j + 1]); + goto error; + } + } + + if ((v = hash_table_enter(cmdln->ht, val->name, (void *)val)) != + (void *)val) + { + v = hash_table_replace(cmdln->ht, val->name, (void *)val); + cmd_ln_val_free((cmd_ln_val_t *)v); + } + } + + /* Check for required arguments; exit if any missing */ + j = 0; + for (i = 0; i < n; i++) { + if (defn[i].type & ARG_REQUIRED) { + void *v; + if (hash_table_lookup(cmdln->ht, defn[i].name, &v) != 0) + E_ERROR("Missing required argument %s\n", defn[i].name); + } + } + if (j > 0) { + goto error; + } + + if (strict && argc == 1) { + E_ERROR("No arguments given\n"); + if (defidx) + hash_table_free(defidx); + if (inout_cmdln == NULL) + ps_config_free(cmdln); + return NULL; + } + + hash_table_free(defidx); + return cmdln; + + error: + if (defidx) + hash_table_free(defidx); + if (inout_cmdln == NULL) + ps_config_free(cmdln); + E_ERROR("Failed to parse arguments list\n"); + return NULL; +} + +ps_config_t * +cmd_ln_parse_file_r(ps_config_t *inout_cmdln, const ps_arg_t * defn, const char *filename, int32 strict) +{ + FILE *file; + int argc; + int argv_size; + char *str; + int arg_max_length = 512; + int len = 0; + int quoting, ch; + char **f_argv; + int rv = 0; + const char separator[] = " \t\r\n"; + + if ((file = fopen(filename, "r")) == NULL) { + E_ERROR("Cannot open configuration file %s for reading\n", + filename); + return NULL; + } + + ch = fgetc(file); + /* Skip to the next interesting character */ + for (; ch != EOF && strchr(separator, ch); ch = fgetc(file)) ; + + if (ch == EOF) { + fclose(file); + return NULL; + } + + /* + * Initialize default argv, argc, and argv_size. + */ + argv_size = 30; + argc = 0; + f_argv = (char **)ckd_calloc(argv_size, sizeof(char *)); + /* Silently make room for \0 */ + str = (char* )ckd_calloc(arg_max_length + 1, sizeof(char)); + quoting = 0; + + do { + /* Handle arguments that are commented out */ + if (len == 0 && argc % 2 == 0) { + while (ch == '#') { + /* Skip everything until newline */ + for (ch = fgetc(file); ch != EOF && ch != '\n'; ch = fgetc(file)) ; + /* Skip to the next interesting character */ + for (ch = fgetc(file); ch != EOF && strchr(separator, ch); ch = fgetc(file)) ; + } + + /* Check if we are at the last line (without anything interesting in it) */ + if (ch == EOF) + break; + } + + /* Handle quoted arguments */ + if (ch == '"' || ch == '\'') { + if (quoting == ch) /* End a quoted section with the same type */ + quoting = 0; + else if (quoting) { + E_ERROR("Nesting quotations is not supported!\n"); + rv = 1; + break; + } + else + quoting = ch; /* Start a quoted section */ + } + else if (ch == EOF || (!quoting && strchr(separator, ch))) { + /* Reallocate argv so it is big enough to contain all the arguments */ + if (argc >= argv_size) { + char **tmp_argv; + if (!(tmp_argv = + (char **)ckd_realloc(f_argv, argv_size * 2 * sizeof(char *)))) { + rv = 1; + break; + } + f_argv = tmp_argv; + argv_size *= 2; + } + + /* Add the string to the list of arguments */ + f_argv[argc] = ckd_salloc(str); + len = 0; + str[0] = '\0'; + argc++; + + if (quoting) + E_WARN("Unclosed quotation, having EOF close it...\n"); + + /* Skip to the next interesting character */ + for (; ch != EOF && strchr(separator, ch); ch = fgetc(file)) ; + + if (ch == EOF) + break; + + /* We already have the next character */ + continue; + } + else { + if (len >= arg_max_length) { + /* Make room for more chars (including the \0 !) */ + char *tmp_str = str; + if ((tmp_str = (char *)ckd_realloc(str, (1 + arg_max_length * 2) * sizeof(char))) == NULL) { + rv = 1; + break; + } + str = tmp_str; + arg_max_length *= 2; + } + /* Add the char to the argument string */ + str[len++] = ch; + /* Always null terminate */ + str[len] = '\0'; + } + + ch = fgetc(file); + } while (1); + + fclose(file); + + ckd_free(str); + + if (rv) { + for (ch = 0; ch < argc; ++ch) + ckd_free(f_argv[ch]); + ckd_free(f_argv); + return NULL; + } + + return parse_options(inout_cmdln, defn, argc, f_argv, strict); +} + +void +cmd_ln_log_help_r(ps_config_t *cmdln, ps_arg_t const* defn) +{ + if (defn == NULL) + return; + E_INFO("Arguments list definition:\n"); + if (cmdln == NULL) { + cmdln = cmd_ln_parse_r(NULL, defn, 0, NULL, FALSE); + arg_log_r(cmdln, defn, TRUE, FALSE); + ps_config_free(cmdln); + } + else + arg_log_r(cmdln, defn, TRUE, FALSE); +} + +void +cmd_ln_log_values_r(ps_config_t *cmdln, ps_arg_t const* defn) +{ + if (defn == NULL) + return; + E_INFO("Current configuration:\n"); + arg_log_r(cmdln, defn, FALSE, FALSE); +} + +void +cmd_ln_set_str_extra_r(ps_config_t *cmdln, char const *name, char const *str) +{ + cmd_ln_val_t *val; + if (hash_table_lookup(cmdln->ht, name, (void **)&val) < 0) { + val = cmd_ln_val_init(ARG_STRING, name, str); + hash_table_enter(cmdln->ht, val->name, (void *)val); + } else { + if (!(val->type & ARG_STRING)) { + E_ERROR("Argument %s does not have string type\n", name); + return; + } + ckd_free(val->val.ptr); + val->val.ptr = ckd_salloc(str); + } +} + +/* vim: set ts=4 sw=4: */ diff --git a/src/util/cmd_ln.h b/src/util/cmd_ln.h new file mode 100644 index 0000000..7a25b4f --- /dev/null +++ b/src/util/cmd_ln.h @@ -0,0 +1,284 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * cmd_ln.h -- Command line argument parsing. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * + * 15-Jul-1997 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added required arguments types. + * + * 07-Dec-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created, based on Eric's implementation. Basically, combined several + * functions into one, eliminated validation, and simplified the interface. + */ + + +#ifndef _LIBUTIL_CMD_LN_H_ +#define _LIBUTIL_CMD_LN_H_ + +#include +#include + +#include +#include + +#include "util/hash_table.h" + +/** + * @file cmd_ln.h + * @brief Command-line and other configuration parsing and handling. + * + * Configuration parameters, optionally parsed from the command line. + */ + + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * @struct cmd_ln_val_t + * Configuration parameter structure. + */ +typedef struct cmd_ln_val_s { + anytype_t val; + int type; + char *name; +} cmd_ln_val_t; + +/** + * @name Values for ps_arg_t::type + */ +/* @{ */ +/** + * Bit indicating a required argument. + */ +#define ARG_REQUIRED (1<<0) +/** + * Integer argument (optional). + */ +#define ARG_INTEGER (1<<1) +/** + * Floating point argument (optional). + */ +#define ARG_FLOATING (1<<2) +/** + * String argument (optional). + */ +#define ARG_STRING (1<<3) +/** + * Boolean (true/false) argument (optional). + */ +#define ARG_BOOLEAN (1<<4) +/** + * String array argument (optional). + */ +#define ARG_STRING_LIST (1<<5) + +/** + * Required integer argument. + */ +#define REQARG_INTEGER (ARG_INTEGER | ARG_REQUIRED) +/** + * Required floating point argument. + */ +#define REQARG_FLOATING (ARG_FLOATING | ARG_REQUIRED) +/** + * Required string argument. + */ +#define REQARG_STRING (ARG_STRING | ARG_REQUIRED) +/** + * Required boolean argument. + */ +#define REQARG_BOOLEAN (ARG_BOOLEAN | ARG_REQUIRED) + +/* @} */ + + +/** + * Helper macro to stringify enums and other non-string values for + * default arguments. + **/ +#define ARG_STRINGIFY(s) ARG_STRINGIFY1(s) +#define ARG_STRINGIFY1(s) #s + +/** + * @struct cmd_ln_t + * Structure (no longer opaque) used to hold the results of command-line parsing. + */ +typedef struct cmd_ln_s { + int refcount; + hash_table_t *ht; + char **f_argv; + uint32 f_argc; + ps_arg_t const *defn; + char *json; +} cmd_ln_t; + +/** + * Retain ownership of a command-line argument set. + * + * @return pointer to retained command-line argument set. + */ +cmd_ln_t *cmd_ln_retain(cmd_ln_t *cmdln); + +/** + * Release a command-line argument set and all associated strings. + * + * @return new reference count (0 if freed completely) + */ +int cmd_ln_free_r(cmd_ln_t *cmdln); + +/** + * Parse a list of strings into arguments. + * + * Parse the given list of arguments (name-value pairs) according to + * the given definitions. Argument values can be retrieved in future + * using cmd_ln_access(). argv[0] is assumed to be the program name + * and skipped. Any unknown argument name causes a fatal error. The + * routine also prints the prevailing argument values (to stderr) + * after parsing. + * + * @note It is currently assumed that the strings in argv are + * allocated statically, or at least that they will be valid as + * long as the cmd_ln_t returned from this function. + * Unpredictable behaviour will result if they are freed or + * otherwise become invalidated. + * + * @return A cmd_ln_t containing the results of command line parsing, + * or NULL on failure. + **/ +POCKETSPHINX_EXPORT +cmd_ln_t *cmd_ln_parse_r(cmd_ln_t *inout_cmdln, /**< In/Out: Previous command-line to update, + or NULL to create a new one. */ + ps_arg_t const *defn, /**< In: Array of argument name definitions */ + int32 argc, /**< In: Number of actual arguments */ + char *argv[], /**< In: Actual arguments */ + int32 strict /**< In: Fail on duplicate or unknown + arguments, or no arguments? */ + ); + +#define ps_config_parse_args(defn, argc, argv) \ + cmd_ln_parse_r(NULL, (defn) == NULL ? ps_args() : (defn), argc, argv, FALSE) + +/** + * Parse an arguments file by deliminating on " \r\t\n" and putting each tokens + * into an argv[] for cmd_ln_parse(). + * + * @return A cmd_ln_t containing the results of command line parsing, or NULL on failure. + */ +POCKETSPHINX_EXPORT +cmd_ln_t *cmd_ln_parse_file_r(cmd_ln_t *inout_cmdln, /**< In/Out: Previous command-line to update, + or NULL to create a new one. */ + ps_arg_t const *defn, /**< In: Array of argument name definitions*/ + char const *filename,/**< In: A file that contains all + the arguments */ + int32 strict /**< In: Fail on duplicate or unknown + arguments, or no arguments? */ + ); + +/** + * Access the value and metadata for a configuration parameter. + * + * This structure is owned by the cmd_ln_t, assume that you must copy + * anything inside it, including strings, if you wish to retain it, + * and should never free it manually. + * + * @param cmdln Command-line object. + * @param name the command-line flag to retrieve. + * @return the value and metadata associated with name, or + * NULL if name does not exist. You must use + * cmd_ln_exists_r() to distinguish between cases where a + * value is legitimately NULL and where the corresponding flag + * is unknown. + */ +cmd_ln_val_t *cmd_ln_access_r(cmd_ln_t *cmdln, char const *name); + +/** + * Set a string in a command-line object even if it is not present in argument + * description. Useful for setting extra values computed from configuration, propagated + * to other parts. + * + * @param cmdln Command-line object. + * @param name The command-line flag to set. + * @param str String value to set. The command-line object does not + * retain ownership of this pointer. + */ +void cmd_ln_set_str_extra_r(cmd_ln_t *cmdln, char const *name, char const *str); + +/** + * Print a help message listing the valid argument names, and the associated + * attributes as given in defn. + * + * @param cmdln command-line object + * @param defn array of argument name definitions. + */ +POCKETSPHINX_EXPORT +void cmd_ln_log_help_r (cmd_ln_t *cmdln, const ps_arg_t *defn); + +/** + * Print current configuration values and defaults. + * + * @param cmdln command-line object + * @param defn array of argument name definitions. + */ +void cmd_ln_log_values_r (cmd_ln_t *cmdln, const ps_arg_t *defn); + +cmd_ln_val_t *cmd_ln_val_init(int t, const char *name, const char *str); +void cmd_ln_val_free(cmd_ln_val_t *val); + +anytype_t *anytype_from_str(anytype_t *val, int t, const char *str); +anytype_t *anytype_from_int(anytype_t *val, int t, long i); +anytype_t *anytype_from_float(anytype_t *val, int t, double f); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/util/dtoa.c b/src/util/dtoa.c new file mode 100644 index 0000000..77d4c45 --- /dev/null +++ b/src/util/dtoa.c @@ -0,0 +1,2985 @@ +/**************************************************************** + * + * The author of this software is David M. Gay. + * + * Copyright (c) 1991, 2000, 2001 by Lucent Technologies. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software and in all copies of the supporting + * documentation for such software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY + * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY + * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + * + ***************************************************************/ + +/**************************************************************** + * This is dtoa.c by David M. Gay, downloaded from + * http://www.netlib.org/fp/dtoa.c on April 15, 2009 and modified for + * inclusion into the Python core by Mark E. T. Dickinson and Eric V. Smith. + * It was taken from Python distribution then and imported into sphinxbase. + * Python version is preferred due to cleanups, though original + * version at netlib is still maintained. + * + * Please remember to check http://www.netlib.org/fp regularly for bugfixes and updates. + * + * The major modifications from Gay's original code are as follows: + * + * 0. The original code has been specialized to Sphinxbase's needs by removing + * many of the #ifdef'd sections. In particular, code to support VAX and + * IBM floating-point formats, hex NaNs, hex floats, locale-aware + * treatment of the decimal point, and setting of the inexact flag have + * been removed. + * + * 1. We use cdk_calloc and ckd_free in place of malloc and free. + * + * 2. The public functions strtod, dtoa and freedtoa all now have + * a sb_ prefix. + * + * 3. Instead of assuming that malloc always succeeds, we thread + * malloc failures through the code. The functions + * + * Balloc, multadd, s2b, i2b, mult, pow5mult, lshift, diff, d2b + * + * of return type *Bigint all return NULL to indicate a malloc failure. + * Similarly, rv_alloc and nrv_alloc (return type char *) return NULL on + * failure. bigcomp now has return type int (it used to be void) and + * returns -1 on failure and 0 otherwise. sb_dtoa returns NULL + * on failure. sb_strtod indicates failure due to malloc failure + * by returning -1.0, setting errno=ENOMEM and *se to s00. + * + * 4. The static variable dtoa_result has been removed. Callers of + * sb_dtoa are expected to call sb_freedtoa to free the memory allocated + * by sb_dtoa. + * + * 5. The code has been reformatted to better fit with C style. + * + * 6. A bug in the memory allocation has been fixed: to avoid FREEing memory + * that hasn't been MALLOC'ed, private_mem should only be used when k <= + * Kmax. + * + * 7. sb_strtod has been modified so that it doesn't accept strings with + * leading whitespace. + * + * 8. Global static variables are not used due to memory access issues. Fixes + * usage from multiple threads. + * + ***************************************************************/ + +/* Please send bug reports for the original dtoa.c code to David M. Gay (dmg + * at acm dot org, with " at " changed at "@" and " dot " changed to "."). + */ + +/* On a machine with IEEE extended-precision registers, it is + * necessary to specify double-precision (53-bit) rounding precision + * before invoking strtod or dtoa. If the machine uses (the equivalent + * of) Intel 80x87 arithmetic, the call + * _control87(PC_53, MCW_PC); + * does this with many compilers. Whether this or another call is + * appropriate depends on the compiler; for this to work, it may be + * necessary to #include "float.h" or another system-dependent header + * file. + */ + +/* strtod for IEEE-, VAX-, and IBM-arithmetic machines. + * + * This strtod returns a nearest machine number to the input decimal + * string (or sets errno to ERANGE). With IEEE arithmetic, ties are + * broken by the IEEE round-even rule. Otherwise ties are broken by + * biased rounding (add half and chop). + * + * Inspired loosely by William D. Clinger's paper "How to Read Floating + * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101]. + * + * Modifications: + * + * 1. We only require IEEE, IBM, or VAX double-precision + * arithmetic (not IEEE double-extended). + * 2. We get by with floating-point arithmetic in a case that + * Clinger missed -- when we're computing d * 10^n + * for a small integer d and the integer n is not too + * much larger than 22 (the maximum integer k for which + * we can represent 10^k exactly), we may be able to + * compute (d*10^k) * 10^(e-k) with just one roundoff. + * 3. Rather than a bit-at-a-time adjustment of the binary + * result in the hard case, we use floating-point + * arithmetic to determine the adjustment to within + * one bit; only in really hard cases do we need to + * compute a second residual. + * 4. Because of 3., we don't need a large table of powers of 10 + * for ten-to-e (just some small tables, e.g. of 10^k + * for 0 <= k <= 22). + */ + +/* Linking of sphinxbase's #defines to Gay's #defines starts here. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include + +#include +#include "util/ckd_alloc.h" + +#ifdef WORDS_BIGENDIAN +#define IEEE_MC68k +#else +#define IEEE_8087 +#endif + +#define Long int32 /* ZOMG */ +#define ULong uint32 /* WTF */ +#ifdef HAVE_LONG_LONG +#define ULLong uint64 +#endif + +#define MALLOC ckd_malloc +#define FREE ckd_free + +#define DBL_DIG 15 +#define DBL_MAX_10_EXP 308 +#define DBL_MAX_EXP 1024 +#define FLT_RADIX 2 + +/* maximum permitted exponent value for strtod; exponents larger than + MAX_ABS_EXP in absolute value get truncated to +-MAX_ABS_EXP. MAX_ABS_EXP + should fit into an int. */ +#ifndef MAX_ABS_EXP +#define MAX_ABS_EXP 1100000000U +#endif +/* Bound on length of pieces of input strings in sb_strtod; specifically, + this is used to bound the total number of digits ignoring leading zeros and + the number of digits that follow the decimal point. Ideally, MAX_DIGITS + should satisfy MAX_DIGITS + 400 < MAX_ABS_EXP; that ensures that the + exponent clipping in sb_strtod can't affect the value of the output. */ +#ifndef MAX_DIGITS +#define MAX_DIGITS 1000000000U +#endif + +/* End sphinxbase #define linking */ + +#ifdef DEBUG +#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);} +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef union { double d; ULong L[2]; } U; + +#ifdef IEEE_8087 +#define word0(x) (x)->L[1] +#define word1(x) (x)->L[0] +#else +#define word0(x) (x)->L[0] +#define word1(x) (x)->L[1] +#endif +#define dval(x) (x)->d + +#ifndef STRTOD_DIGLIM +#define STRTOD_DIGLIM 40 +#endif + +/* maximum permitted exponent value for strtod; exponents larger than + MAX_ABS_EXP in absolute value get truncated to +-MAX_ABS_EXP. MAX_ABS_EXP + should fit into an int. */ +#ifndef MAX_ABS_EXP +#define MAX_ABS_EXP 1100000000U +#endif +/* Bound on length of pieces of input strings in sb_strtod; specifically, + this is used to bound the total number of digits ignoring leading zeros and + the number of digits that follow the decimal point. Ideally, MAX_DIGITS + should satisfy MAX_DIGITS + 400 < MAX_ABS_EXP; that ensures that the + exponent clipping in sb_strtod can't affect the value of the output. */ +#ifndef MAX_DIGITS +#define MAX_DIGITS 1000000000U +#endif + +/* Guard against trying to use the above values on unusual platforms with ints + * of width less than 32 bits. */ +#if MAX_ABS_EXP > 0x7fffffff +#error "MAX_ABS_EXP should fit in an int" +#endif +#if MAX_DIGITS > 0x7fffffff +#error "MAX_DIGITS should fit in an int" +#endif + +/* The following definition of Storeinc is appropriate for MIPS processors. + * An alternative that might be better on some machines is + * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff) + */ +#if defined(IEEE_8087) +#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \ + ((unsigned short *)a)[0] = (unsigned short)c, a++) +#else +#define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \ + ((unsigned short *)a)[1] = (unsigned short)c, a++) +#endif + +/* #define P DBL_MANT_DIG */ +/* Ten_pmax = floor(P*log(2)/log(5)) */ +/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */ +/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */ +/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */ + +#define Exp_shift 20 +#define Exp_shift1 20 +#define Exp_msk1 0x100000 +#define Exp_msk11 0x100000 +#define Exp_mask 0x7ff00000 +#define P 53 +#define Nbits 53 +#define Bias 1023 +#define Emax 1023 +#define Emin (-1022) +#define Etiny (-1074) /* smallest denormal is 2**Etiny */ +#define Exp_1 0x3ff00000 +#define Exp_11 0x3ff00000 +#define Ebits 11 +#define Frac_mask 0xfffff +#define Frac_mask1 0xfffff +#define Ten_pmax 22 +#define Bletch 0x10 +#define Bndry_mask 0xfffff +#define Bndry_mask1 0xfffff +#define Sign_bit 0x80000000 +#define Log2P 1 +#define Tiny0 0 +#define Tiny1 1 +#define Quick_max 14 +#define Int_max 14 + +#ifndef Flt_Rounds +#ifdef FLT_ROUNDS +#define Flt_Rounds FLT_ROUNDS +#else +#define Flt_Rounds 1 +#endif +#endif /*Flt_Rounds*/ + +#define Rounding Flt_Rounds + +#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1)) +#define Big1 0xffffffff + +/* Standard NaN used by sb_stdnan. */ + +#define NAN_WORD0 0x7ff80000 +#define NAN_WORD1 0 + +/* Bits of the representation of positive infinity. */ + +#define POSINF_WORD0 0x7ff00000 +#define POSINF_WORD1 0 + +/* struct BCinfo is used to pass information from sb_strtod to bigcomp */ + +typedef struct BCinfo BCinfo; +struct +BCinfo { + int e0, nd, nd0, scale; +}; + +#define FFFFFFFF 0xffffffffUL + +#define Kmax 7 + +/* struct Bigint is used to represent arbitrary-precision integers. These + integers are stored in sign-magnitude format, with the magnitude stored as + an array of base 2**32 digits. Bigints are always normalized: if x is a + Bigint then x->wds >= 1, and either x->wds == 1 or x[wds-1] is nonzero. + + The Bigint fields are as follows: + + - next is a header used by Balloc and Bfree to keep track of lists + of freed Bigints; it's also used for the linked list of + powers of 5 of the form 5**2**i used by pow5mult. + - k indicates which pool this Bigint was allocated from + - maxwds is the maximum number of words space was allocated for + (usually maxwds == 2**k) + - sign is 1 for negative Bigints, 0 for positive. The sign is unused + (ignored on inputs, set to 0 on outputs) in almost all operations + involving Bigints: a notable exception is the diff function, which + ignores signs on inputs but sets the sign of the output correctly. + - wds is the actual number of significant words + - x contains the vector of words (digits) for this Bigint, from least + significant (x[0]) to most significant (x[wds-1]). +*/ + +struct +Bigint { + struct Bigint *next; + int k, maxwds, sign, wds; + ULong x[1]; +}; + +typedef struct Bigint Bigint; + +#define SPHINXBASE_USING_MEMORY_DEBUGGER 1 + +#ifndef SPHINXBASE_USING_MEMORY_DEBUGGER + +#ifndef PRIVATE_MEM +#define PRIVATE_MEM 2304 +#endif +#define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double)) +static double private_mem[PRIVATE_mem], *pmem_next = private_mem; + +/* Memory management: memory is allocated from, and returned to, Kmax+1 pools + of memory, where pool k (0 <= k <= Kmax) is for Bigints b with b->maxwds == + 1 << k. These pools are maintained as linked lists, with freelist[k] + pointing to the head of the list for pool k. + + On allocation, if there's no free slot in the appropriate pool, MALLOC is + called to get more memory. This memory is not returned to the system until + Python quits. There's also a private memory pool that's allocated from + in preference to using MALLOC. + + For Bigints with more than (1 << Kmax) digits (which implies at least 1233 + decimal digits), memory is directly allocated using MALLOC, and freed using + FREE. + + XXX: it would be easy to bypass this memory-management system and + translate each call to Balloc into a call to PyMem_Malloc, and each + Bfree to PyMem_Free. Investigate whether this has any significant + performance on impact. */ + +static Bigint *freelist[Kmax+1]; + +/* Allocate space for a Bigint with up to 1<next; + else { + x = 1 << k; + len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1) + /sizeof(double); + if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) { + rv = (Bigint*)pmem_next; + pmem_next += len; + } + else { + rv = (Bigint*)MALLOC(len*sizeof(double)); + if (rv == NULL) + return NULL; + } + rv->k = k; + rv->maxwds = x; + } + rv->sign = rv->wds = 0; + return rv; +} + +/* Free a Bigint allocated with Balloc */ + +static void +Bfree(Bigint *v) +{ + if (v) { + if (v->k > Kmax) + FREE((void*)v); + else { + v->next = freelist[v->k]; + freelist[v->k] = v; + } + } +} + +#else + +/* Alternative versions of Balloc and Bfree that use PyMem_Malloc and + PyMem_Free directly in place of the custom memory allocation scheme above. + These are provided for the benefit of memory debugging tools like + Valgrind. */ + +/* Allocate space for a Bigint with up to 1<k = k; + rv->maxwds = x; + rv->sign = rv->wds = 0; + return rv; +} + +/* Free a Bigint allocated with Balloc */ + +static void +Bfree(Bigint *v) +{ + if (v) { + FREE((void*)v); + } +} + +#endif /* SPHINXBASE_USING_MEMORY_DEBUGGER */ + +#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \ + y->wds*sizeof(Long) + 2*sizeof(int)) + +/* Multiply a Bigint b by m and add a. Either modifies b in place and returns + a pointer to the modified b, or Bfrees b and returns a pointer to a copy. + On failure, return NULL. In this case, b will have been already freed. */ + +static Bigint * +multadd(Bigint *b, int m, int a) /* multiply by m and add a */ +{ + int i, wds; +#ifdef ULLong + ULong *x; + ULLong carry, y; +#else + ULong carry, *x, y; + ULong xi, z; +#endif + Bigint *b1; + + wds = b->wds; + x = b->x; + i = 0; + carry = a; + do { +#ifdef ULLong + y = *x * (ULLong)m + carry; + carry = y >> 32; + *x++ = (ULong)(y & FFFFFFFF); +#else + xi = *x; + y = (xi & 0xffff) * m + carry; + z = (xi >> 16) * m + (y >> 16); + carry = z >> 16; + *x++ = (z << 16) + (y & 0xffff); +#endif + } + while(++i < wds); + if (carry) { + if (wds >= b->maxwds) { + b1 = Balloc(b->k+1); + if (b1 == NULL){ + Bfree(b); + return NULL; + } + Bcopy(b1, b); + Bfree(b); + b = b1; + } + b->x[wds++] = (ULong)carry; + b->wds = wds; + } + return b; +} + +/* convert a string s containing nd decimal digits (possibly containing a + decimal separator at position nd0, which is ignored) to a Bigint. This + function carries on where the parsing code in sb_strtod leaves off: on + entry, y9 contains the result of converting the first 9 digits. Returns + NULL on failure. */ + +static Bigint * +s2b(const char *s, int nd0, int nd, ULong y9) +{ + Bigint *b; + int i, k; + Long x, y; + + x = (nd + 8) / 9; + for(k = 0, y = 1; x > y; y <<= 1, k++) ; + b = Balloc(k); + if (b == NULL) + return NULL; + b->x[0] = y9; + b->wds = 1; + + if (nd <= 9) + return b; + + s += 9; + for (i = 9; i < nd0; i++) { + b = multadd(b, 10, *s++ - '0'); + if (b == NULL) + return NULL; + } + s++; + for(; i < nd; i++) { + b = multadd(b, 10, *s++ - '0'); + if (b == NULL) + return NULL; + } + return b; +} + +/* count leading 0 bits in the 32-bit integer x. */ + +static int +hi0bits(ULong x) +{ + int k = 0; + + if (!(x & 0xffff0000)) { + k = 16; + x <<= 16; + } + if (!(x & 0xff000000)) { + k += 8; + x <<= 8; + } + if (!(x & 0xf0000000)) { + k += 4; + x <<= 4; + } + if (!(x & 0xc0000000)) { + k += 2; + x <<= 2; + } + if (!(x & 0x80000000)) { + k++; + if (!(x & 0x40000000)) + return 32; + } + return k; +} + +/* count trailing 0 bits in the 32-bit integer y, and shift y right by that + number of bits. */ + +static int +lo0bits(ULong *y) +{ + int k; + ULong x = *y; + + if (x & 7) { + if (x & 1) + return 0; + if (x & 2) { + *y = x >> 1; + return 1; + } + *y = x >> 2; + return 2; + } + k = 0; + if (!(x & 0xffff)) { + k = 16; + x >>= 16; + } + if (!(x & 0xff)) { + k += 8; + x >>= 8; + } + if (!(x & 0xf)) { + k += 4; + x >>= 4; + } + if (!(x & 0x3)) { + k += 2; + x >>= 2; + } + if (!(x & 1)) { + k++; + x >>= 1; + if (!x) + return 32; + } + *y = x; + return k; +} + +/* convert a small nonnegative integer to a Bigint */ + +static Bigint * +i2b(int i) +{ + Bigint *b; + + b = Balloc(1); + if (b == NULL) + return NULL; + b->x[0] = i; + b->wds = 1; + return b; +} + +/* multiply two Bigints. Returns a new Bigint, or NULL on failure. Ignores + the signs of a and b. */ + +static Bigint * +mult(Bigint *a, Bigint *b) +{ + Bigint *c; + int k, wa, wb, wc; + ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0; + ULong y; +#ifdef ULLong + ULLong carry, z; +#else + ULong carry, z; + ULong z2; +#endif + + if ((!a->x[0] && a->wds == 1) || (!b->x[0] && b->wds == 1)) { + c = Balloc(0); + if (c == NULL) + return NULL; + c->wds = 1; + c->x[0] = 0; + return c; + } + + if (a->wds < b->wds) { + c = a; + a = b; + b = c; + } + k = a->k; + wa = a->wds; + wb = b->wds; + wc = wa + wb; + if (wc > a->maxwds) + k++; + c = Balloc(k); + if (c == NULL) + return NULL; + for(x = c->x, xa = x + wc; x < xa; x++) + *x = 0; + xa = a->x; + xae = xa + wa; + xb = b->x; + xbe = xb + wb; + xc0 = c->x; +#ifdef ULLong + for(; xb < xbe; xc0++) { + if ((y = *xb++)) { + x = xa; + xc = xc0; + carry = 0; + do { + z = *x++ * (ULLong)y + *xc + carry; + carry = z >> 32; + *xc++ = (ULong)(z & FFFFFFFF); + } + while(x < xae); + *xc = (ULong)carry; + } + } +#else + for(; xb < xbe; xb++, xc0++) { + if (y = *xb & 0xffff) { + x = xa; + xc = xc0; + carry = 0; + do { + z = (*x & 0xffff) * y + (*xc & 0xffff) + carry; + carry = z >> 16; + z2 = (*x++ >> 16) * y + (*xc >> 16) + carry; + carry = z2 >> 16; + Storeinc(xc, z2, z); + } + while(x < xae); + *xc = carry; + } + if (y = *xb >> 16) { + x = xa; + xc = xc0; + carry = 0; + z2 = *xc; + do { + z = (*x & 0xffff) * y + (*xc >> 16) + carry; + carry = z >> 16; + Storeinc(xc, z, z2); + z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry; + carry = z2 >> 16; + } + while(x < xae); + *xc = z2; + } + } +#endif + for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ; + c->wds = wc; + return c; +} + +#ifndef SPHINXBASE_USING_MEMORY_DEBUGGER + +/* p5s is a linked list of powers of 5 of the form 5**(2**i), i >= 2 */ + +static Bigint *p5s; + +/* multiply the Bigint b by 5**k. Returns a pointer to the result, or NULL on + failure; if the returned pointer is distinct from b then the original + Bigint b will have been Bfree'd. Ignores the sign of b. */ + +static Bigint * +pow5mult(Bigint *b, int k) +{ + Bigint *b1, *p5, *p51; + int i; + static int p05[3] = { 5, 25, 125 }; + + if ((i = k & 3)) { + b = multadd(b, p05[i-1], 0); + if (b == NULL) + return NULL; + } + + if (!(k >>= 2)) + return b; + p5 = p5s; + if (!p5) { + /* first time */ + p5 = i2b(625); + if (p5 == NULL) { + Bfree(b); + return NULL; + } + p5s = p5; + p5->next = 0; + } + for(;;) { + if (k & 1) { + b1 = mult(b, p5); + Bfree(b); + b = b1; + if (b == NULL) + return NULL; + } + if (!(k >>= 1)) + break; + p51 = p5->next; + if (!p51) { + p51 = mult(p5,p5); + if (p51 == NULL) { + Bfree(b); + return NULL; + } + p51->next = 0; + p5->next = p51; + } + p5 = p51; + } + return b; +} + +#else + +/* Version of pow5mult that doesn't cache powers of 5. Provided for + the benefit of memory debugging tools like Valgrind. */ + +static Bigint * +pow5mult(Bigint *b, int k) +{ + Bigint *b1, *p5, *p51; + int i; + static int p05[3] = { 5, 25, 125 }; + + if ((i = k & 3)) { + b = multadd(b, p05[i-1], 0); + if (b == NULL) + return NULL; + } + + if (!(k >>= 2)) + return b; + p5 = i2b(625); + if (p5 == NULL) { + Bfree(b); + return NULL; + } + + for(;;) { + if (k & 1) { + b1 = mult(b, p5); + Bfree(b); + b = b1; + if (b == NULL) { + Bfree(p5); + return NULL; + } + } + if (!(k >>= 1)) + break; + p51 = mult(p5, p5); + Bfree(p5); + p5 = p51; + if (p5 == NULL) { + Bfree(b); + return NULL; + } + } + Bfree(p5); + return b; +} + +#endif /* SPHINXBASE_USING_MEMORY_DEBUGGER */ + +/* shift a Bigint b left by k bits. Return a pointer to the shifted result, + or NULL on failure. If the returned pointer is distinct from b then the + original b will have been Bfree'd. Ignores the sign of b. */ + +static Bigint * +lshift(Bigint *b, int k) +{ + int i, k1, n, n1; + Bigint *b1; + ULong *x, *x1, *xe, z; + + if (!k || (!b->x[0] && b->wds == 1)) + return b; + + n = k >> 5; + k1 = b->k; + n1 = n + b->wds + 1; + for(i = b->maxwds; n1 > i; i <<= 1) + k1++; + b1 = Balloc(k1); + if (b1 == NULL) { + Bfree(b); + return NULL; + } + x1 = b1->x; + for(i = 0; i < n; i++) + *x1++ = 0; + x = b->x; + xe = x + b->wds; + if (k &= 0x1f) { + k1 = 32 - k; + z = 0; + do { + *x1++ = *x << k | z; + z = *x++ >> k1; + } + while(x < xe); + if ((*x1 = z)) + ++n1; + } + else do + *x1++ = *x++; + while(x < xe); + b1->wds = n1 - 1; + Bfree(b); + return b1; +} + +/* Do a three-way compare of a and b, returning -1 if a < b, 0 if a == b and + 1 if a > b. Ignores signs of a and b. */ + +static int +cmp(Bigint *a, Bigint *b) +{ + ULong *xa, *xa0, *xb, *xb0; + int i, j; + + i = a->wds; + j = b->wds; +#ifdef DEBUG + if (i > 1 && !a->x[i-1]) + Bug("cmp called with a->x[a->wds-1] == 0"); + if (j > 1 && !b->x[j-1]) + Bug("cmp called with b->x[b->wds-1] == 0"); +#endif + if (i -= j) + return i; + xa0 = a->x; + xa = xa0 + j; + xb0 = b->x; + xb = xb0 + j; + for(;;) { + if (*--xa != *--xb) + return *xa < *xb ? -1 : 1; + if (xa <= xa0) + break; + } + return 0; +} + +/* Take the difference of Bigints a and b, returning a new Bigint. Returns + NULL on failure. The signs of a and b are ignored, but the sign of the + result is set appropriately. */ + +static Bigint * +diff(Bigint *a, Bigint *b) +{ + Bigint *c; + int i, wa, wb; + ULong *xa, *xae, *xb, *xbe, *xc; +#ifdef ULLong + ULLong borrow, y; +#else + ULong borrow, y; + ULong z; +#endif + + i = cmp(a,b); + if (!i) { + c = Balloc(0); + if (c == NULL) + return NULL; + c->wds = 1; + c->x[0] = 0; + return c; + } + if (i < 0) { + c = a; + a = b; + b = c; + i = 1; + } + else + i = 0; + c = Balloc(a->k); + if (c == NULL) + return NULL; + c->sign = i; + wa = a->wds; + xa = a->x; + xae = xa + wa; + wb = b->wds; + xb = b->x; + xbe = xb + wb; + xc = c->x; + borrow = 0; +#ifdef ULLong + do { + y = (ULLong)*xa++ - *xb++ - borrow; + borrow = y >> 32 & (ULong)1; + *xc++ = (ULong)(y & FFFFFFFF); + } + while(xb < xbe); + while(xa < xae) { + y = *xa++ - borrow; + borrow = y >> 32 & (ULong)1; + *xc++ = (ULong)(y & FFFFFFFF); + } +#else + do { + y = (*xa & 0xffff) - (*xb & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + z = (*xa++ >> 16) - (*xb++ >> 16) - borrow; + borrow = (z & 0x10000) >> 16; + Storeinc(xc, z, y); + } + while(xb < xbe); + while(xa < xae) { + y = (*xa & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + z = (*xa++ >> 16) - borrow; + borrow = (z & 0x10000) >> 16; + Storeinc(xc, z, y); + } +#endif + while(!*--xc) + wa--; + c->wds = wa; + return c; +} + +/* Given a positive normal double x, return the difference between x and the + next double up. Doesn't give correct results for subnormals. */ + +static double +ulp(U *x) +{ + Long L; + U u; + + L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1; + word0(&u) = L; + word1(&u) = 0; + return dval(&u); +} + +/* Convert a Bigint to a double plus an exponent */ + +static double +b2d(Bigint *a, int *e) +{ + ULong *xa, *xa0, w, y, z; + int k; + U d; + + xa0 = a->x; + xa = xa0 + a->wds; + y = *--xa; +#ifdef DEBUG + if (!y) Bug("zero y in b2d"); +#endif + k = hi0bits(y); + *e = 32 - k; + if (k < Ebits) { + word0(&d) = Exp_1 | y >> (Ebits - k); + w = xa > xa0 ? *--xa : 0; + word1(&d) = y << ((32-Ebits) + k) | w >> (Ebits - k); + goto ret_d; + } + z = xa > xa0 ? *--xa : 0; + if (k -= Ebits) { + word0(&d) = Exp_1 | y << k | z >> (32 - k); + y = xa > xa0 ? *--xa : 0; + word1(&d) = z << k | y >> (32 - k); + } + else { + word0(&d) = Exp_1 | y; + word1(&d) = z; + } + ret_d: + return dval(&d); +} + +/* Convert a scaled double to a Bigint plus an exponent. Similar to d2b, + except that it accepts the scale parameter used in sb_strtod (which + should be either 0 or 2*P), and the normalization for the return value is + different (see below). On input, d should be finite and nonnegative, and d + / 2**scale should be exactly representable as an IEEE 754 double. + + Returns a Bigint b and an integer e such that + + dval(d) / 2**scale = b * 2**e. + + Unlike d2b, b is not necessarily odd: b and e are normalized so + that either 2**(P-1) <= b < 2**P and e >= Etiny, or b < 2**P + and e == Etiny. This applies equally to an input of 0.0: in that + case the return values are b = 0 and e = Etiny. + + The above normalization ensures that for all possible inputs d, + 2**e gives ulp(d/2**scale). + + Returns NULL on failure. +*/ + +static Bigint * +sd2b(U *d, int scale, int *e) +{ + Bigint *b; + + b = Balloc(1); + if (b == NULL) + return NULL; + + /* First construct b and e assuming that scale == 0. */ + b->wds = 2; + b->x[0] = word1(d); + b->x[1] = word0(d) & Frac_mask; + *e = Etiny - 1 + (int)((word0(d) & Exp_mask) >> Exp_shift); + if (*e < Etiny) + *e = Etiny; + else + b->x[1] |= Exp_msk1; + + /* Now adjust for scale, provided that b != 0. */ + if (scale && (b->x[0] || b->x[1])) { + *e -= scale; + if (*e < Etiny) { + scale = Etiny - *e; + *e = Etiny; + /* We can't shift more than P-1 bits without shifting out a 1. */ + assert(0 < scale && scale <= P - 1); + if (scale >= 32) { + /* The bits shifted out should all be zero. */ + assert(b->x[0] == 0); + b->x[0] = b->x[1]; + b->x[1] = 0; + scale -= 32; + } + if (scale) { + /* The bits shifted out should all be zero. */ + assert(b->x[0] << (32 - scale) == 0); + b->x[0] = (b->x[0] >> scale) | (b->x[1] << (32 - scale)); + b->x[1] >>= scale; + } + } + } + /* Ensure b is normalized. */ + if (!b->x[1]) + b->wds = 1; + + return b; +} + +/* Convert a double to a Bigint plus an exponent. Return NULL on failure. + + Given a finite nonzero double d, return an odd Bigint b and exponent *e + such that fabs(d) = b * 2**e. On return, *bbits gives the number of + significant bits of b; that is, 2**(*bbits-1) <= b < 2**(*bbits). + + If d is zero, then b == 0, *e == -1010, *bbits = 0. + */ + +static Bigint * +d2b(U *d, int *e, int *bits) +{ + Bigint *b; + int de, k; + ULong *x, y, z; + int i; + + b = Balloc(1); + if (b == NULL) + return NULL; + x = b->x; + + z = word0(d) & Frac_mask; + word0(d) &= 0x7fffffff; /* clear sign bit, which we ignore */ + if ((de = (int)(word0(d) >> Exp_shift))) + z |= Exp_msk1; + if ((y = word1(d))) { + if ((k = lo0bits(&y))) { + x[0] = y | z << (32 - k); + z >>= k; + } + else + x[0] = y; + i = + b->wds = (x[1] = z) ? 2 : 1; + } + else { + k = lo0bits(&z); + x[0] = z; + i = + b->wds = 1; + k += 32; + } + if (de) { + *e = de - Bias - (P-1) + k; + *bits = P - k; + } + else { + *e = de - Bias - (P-1) + 1 + k; + *bits = 32*i - hi0bits(x[i-1]); + } + return b; +} + +/* Compute the ratio of two Bigints, as a double. The result may have an + error of up to 2.5 ulps. */ + +static double +ratio(Bigint *a, Bigint *b) +{ + U da, db; + int k, ka, kb; + + dval(&da) = b2d(a, &ka); + dval(&db) = b2d(b, &kb); + k = ka - kb + 32*(a->wds - b->wds); + if (k > 0) + word0(&da) += k*Exp_msk1; + else { + k = -k; + word0(&db) += k*Exp_msk1; + } + return dval(&da) / dval(&db); +} + +static const double +tens[] = { + 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, + 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, + 1e20, 1e21, 1e22 +}; + +static const double +bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 }; +static const double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, + 9007199254740992.*9007199254740992.e-256 + /* = 2^106 * 1e-256 */ +}; +/* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */ +/* flag unnecessarily. It leads to a song and dance at the end of strtod. */ +#define Scale_Bit 0x10 +#define n_bigtens 5 + +#define ULbits 32 +#define kshift 5 +#define kmask 31 + + +static int +dshift(Bigint *b, int p2) +{ + int rv = hi0bits(b->x[b->wds-1]) - 4; + if (p2 > 0) + rv -= p2; + return rv & kmask; +} + +/* special case of Bigint division. The quotient is always in the range 0 <= + quotient < 10, and on entry the divisor S is normalized so that its top 4 + bits (28--31) are zero and bit 27 is set. */ + +static int +quorem(Bigint *b, Bigint *S) +{ + int n; + ULong *bx, *bxe, q, *sx, *sxe; +#ifdef ULLong + ULLong borrow, carry, y, ys; +#else + ULong borrow, carry, y, ys; + ULong si, z, zs; +#endif + + n = S->wds; +#ifdef DEBUG + /*debug*/ if (b->wds > n) + /*debug*/ Bug("oversize b in quorem"); +#endif + if (b->wds < n) + return 0; + sx = S->x; + sxe = sx + --n; + bx = b->x; + bxe = bx + n; + q = *bxe / (*sxe + 1); /* ensure q <= true quotient */ +#ifdef DEBUG + /*debug*/ if (q > 9) + /*debug*/ Bug("oversized quotient in quorem"); +#endif + if (q) { + borrow = 0; + carry = 0; + do { +#ifdef ULLong + ys = *sx++ * (ULLong)q + carry; + carry = ys >> 32; + y = *bx - (ys & FFFFFFFF) - borrow; + borrow = y >> 32 & (ULong)1; + *bx++ = (ULong)(y & FFFFFFFF); +#else + si = *sx++; + ys = (si & 0xffff) * q + carry; + zs = (si >> 16) * q + (ys >> 16); + carry = zs >> 16; + y = (*bx & 0xffff) - (ys & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + z = (*bx >> 16) - (zs & 0xffff) - borrow; + borrow = (z & 0x10000) >> 16; + Storeinc(bx, z, y); +#endif + } + while(sx <= sxe); + if (!*bxe) { + bx = b->x; + while(--bxe > bx && !*bxe) + --n; + b->wds = n; + } + } + if (cmp(b, S) >= 0) { + q++; + borrow = 0; + carry = 0; + bx = b->x; + sx = S->x; + do { +#ifdef ULLong + ys = *sx++ + carry; + carry = ys >> 32; + y = *bx - (ys & FFFFFFFF) - borrow; + borrow = y >> 32 & (ULong)1; + *bx++ = (ULong)(y & FFFFFFFF); +#else + si = *sx++; + ys = (si & 0xffff) + carry; + zs = (si >> 16) + (ys >> 16); + carry = zs >> 16; + y = (*bx & 0xffff) - (ys & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + z = (*bx >> 16) - (zs & 0xffff) - borrow; + borrow = (z & 0x10000) >> 16; + Storeinc(bx, z, y); +#endif + } + while(sx <= sxe); + bx = b->x; + bxe = bx + n; + if (!*bxe) { + while(--bxe > bx && !*bxe) + --n; + b->wds = n; + } + } + return q; +} + +/* sulp(x) is a version of ulp(x) that takes bc.scale into account. + + Assuming that x is finite and nonnegative (positive zero is fine + here) and x / 2^bc.scale is exactly representable as a double, + sulp(x) is equivalent to 2^bc.scale * ulp(x / 2^bc.scale). */ + +static double +sulp(U *x, BCinfo *bc) +{ + U u; + + if (bc->scale && 2*P + 1 > (int)((word0(x) & Exp_mask) >> Exp_shift)) { + /* rv/2^bc->scale is subnormal */ + word0(&u) = (P+2)*Exp_msk1; + word1(&u) = 0; + return u.d; + } + else { + assert(word0(x) || word1(x)); /* x != 0.0 */ + return ulp(x); + } +} + +/* The bigcomp function handles some hard cases for strtod, for inputs + with more than STRTOD_DIGLIM digits. It's called once an initial + estimate for the double corresponding to the input string has + already been obtained by the code in sb_strtod. + + The bigcomp function is only called after sb_strtod has found a + double value rv such that either rv or rv + 1ulp represents the + correctly rounded value corresponding to the original string. It + determines which of these two values is the correct one by + computing the decimal digits of rv + 0.5ulp and comparing them with + the corresponding digits of s0. + + In the following, write dv for the absolute value of the number represented + by the input string. + + Inputs: + + s0 points to the first significant digit of the input string. + + rv is a (possibly scaled) estimate for the closest double value to the + value represented by the original input to sb_strtod. If + bc->scale is nonzero, then rv/2^(bc->scale) is the approximation to + the input value. + + bc is a struct containing information gathered during the parsing and + estimation steps of sb_strtod. Description of fields follows: + + bc->e0 gives the exponent of the input value, such that dv = (integer + given by the bd->nd digits of s0) * 10**e0 + + bc->nd gives the total number of significant digits of s0. It will + be at least 1. + + bc->nd0 gives the number of significant digits of s0 before the + decimal separator. If there's no decimal separator, bc->nd0 == + bc->nd. + + bc->scale is the value used to scale rv to avoid doing arithmetic with + subnormal values. It's either 0 or 2*P (=106). + + Outputs: + + On successful exit, rv/2^(bc->scale) is the closest double to dv. + + Returns 0 on success, -1 on failure (e.g., due to a failed malloc call). */ + +static int +bigcomp(U *rv, const char *s0, BCinfo *bc) +{ + Bigint *b, *d; + int b2, d2, dd, i, nd, nd0, odd, p2, p5; + + nd = bc->nd; + nd0 = bc->nd0; + p5 = nd + bc->e0; + b = sd2b(rv, bc->scale, &p2); + if (b == NULL) + return -1; + + /* record whether the lsb of rv/2^(bc->scale) is odd: in the exact halfway + case, this is used for round to even. */ + odd = b->x[0] & 1; + + /* left shift b by 1 bit and or a 1 into the least significant bit; + this gives us b * 2**p2 = rv/2^(bc->scale) + 0.5 ulp. */ + b = lshift(b, 1); + if (b == NULL) + return -1; + b->x[0] |= 1; + p2--; + + p2 -= p5; + d = i2b(1); + if (d == NULL) { + Bfree(b); + return -1; + } + /* Arrange for convenient computation of quotients: + * shift left if necessary so divisor has 4 leading 0 bits. + */ + if (p5 > 0) { + d = pow5mult(d, p5); + if (d == NULL) { + Bfree(b); + return -1; + } + } + else if (p5 < 0) { + b = pow5mult(b, -p5); + if (b == NULL) { + Bfree(d); + return -1; + } + } + if (p2 > 0) { + b2 = p2; + d2 = 0; + } + else { + b2 = 0; + d2 = -p2; + } + i = dshift(d, d2); + if ((b2 += i) > 0) { + b = lshift(b, b2); + if (b == NULL) { + Bfree(d); + return -1; + } + } + if ((d2 += i) > 0) { + d = lshift(d, d2); + if (d == NULL) { + Bfree(b); + return -1; + } + } + + /* Compare s0 with b/d: set dd to -1, 0, or 1 according as s0 < b/d, s0 == + * b/d, or s0 > b/d. Here the digits of s0 are thought of as representing + * a number in the range [0.1, 1). */ + if (cmp(b, d) >= 0) + /* b/d >= 1 */ + dd = -1; + else { + i = 0; + for(;;) { + b = multadd(b, 10, 0); + if (b == NULL) { + Bfree(d); + return -1; + } + dd = s0[i < nd0 ? i : i+1] - '0' - quorem(b, d); + i++; + + if (dd) + break; + if (!b->x[0] && b->wds == 1) { + /* b/d == 0 */ + dd = i < nd; + break; + } + if (!(i < nd)) { + /* b/d != 0, but digits of s0 exhausted */ + dd = -1; + break; + } + } + } + Bfree(b); + Bfree(d); + if (dd > 0 || (dd == 0 && odd)) + dval(rv) += sulp(rv, bc); + return 0; +} + +/* Return a 'standard' NaN value. + + There are exactly two quiet NaNs that don't arise by 'quieting' signaling + NaNs (see IEEE 754-2008, section 6.2.1). If sign == 0, return the one whose + sign bit is cleared. Otherwise, return the one whose sign bit is set. +*/ + +double +sb_stdnan(int sign) +{ + U rv; + word0(&rv) = NAN_WORD0; + word1(&rv) = NAN_WORD1; + if (sign) + word0(&rv) |= Sign_bit; + return dval(&rv); +} + +/* Return positive or negative infinity, according to the given sign (0 for + * positive infinity, 1 for negative infinity). */ + +double +sb_infinity(int sign) +{ + U rv; + word0(&rv) = POSINF_WORD0; + word1(&rv) = POSINF_WORD1; + return sign ? -dval(&rv) : dval(&rv); +} + +double +sb_strtod(const char *s00, char **se) +{ + int bb2, bb5, bbe, bd2, bd5, bs2, c, dsign, e, e1, error; + int esign, i, j, k, lz, nd, nd0, odd, sign; + const char *s, *s0, *s1; + double aadj, aadj1; + U aadj2, adj, rv, rv0; + ULong y, z, abs_exp; + Long L; + BCinfo bc; + Bigint *bb, *bb1, *bd, *bd0, *bs, *delta; + size_t ndigits, fraclen; + + dval(&rv) = 0.; + + /* Start parsing. */ + c = *(s = s00); + + /* Parse optional sign, if present. */ + sign = 0; + switch (c) { + case '-': + sign = 1; + /* FALLTHRU */ + case '+': + c = *++s; + } + + /* Skip leading zeros: lz is true iff there were leading zeros. */ + s1 = s; + while (c == '0') + c = *++s; + lz = s != s1; + + /* Point s0 at the first nonzero digit (if any). fraclen will be the + number of digits between the decimal point and the end of the + digit string. ndigits will be the total number of digits ignoring + leading zeros. */ + s0 = s1 = s; + while ('0' <= c && c <= '9') + c = *++s; + ndigits = s - s1; + fraclen = 0; + + /* Parse decimal point and following digits. */ + if (c == '.') { + c = *++s; + if (!ndigits) { + s1 = s; + while (c == '0') + c = *++s; + lz = lz || s != s1; + fraclen += (s - s1); + s0 = s; + } + s1 = s; + while ('0' <= c && c <= '9') + c = *++s; + ndigits += s - s1; + fraclen += s - s1; + } + + /* Now lz is true if and only if there were leading zero digits, and + ndigits gives the total number of digits ignoring leading zeros. A + valid input must have at least one digit. */ + if (!ndigits && !lz) { + if (se) + *se = (char *)s00; + goto parse_error; + } + + /* Range check ndigits and fraclen to make sure that they, and values + computed with them, can safely fit in an int. */ + if (ndigits > MAX_DIGITS || fraclen > MAX_DIGITS) { + if (se) + *se = (char *)s00; + goto parse_error; + } + nd = (int)ndigits; + nd0 = (int)ndigits - (int)fraclen; + + /* Parse exponent. */ + e = 0; + if (c == 'e' || c == 'E') { + s00 = s; + c = *++s; + + /* Exponent sign. */ + esign = 0; + switch (c) { + case '-': + esign = 1; + /* FALLTHRU */ + case '+': + c = *++s; + } + + /* Skip zeros. lz is true iff there are leading zeros. */ + s1 = s; + while (c == '0') + c = *++s; + lz = s != s1; + + /* Get absolute value of the exponent. */ + s1 = s; + abs_exp = 0; + while ('0' <= c && c <= '9') { + abs_exp = 10*abs_exp + (c - '0'); + c = *++s; + } + + /* abs_exp will be correct modulo 2**32. But 10**9 < 2**32, so if + there are at most 9 significant exponent digits then overflow is + impossible. */ + if (s - s1 > 9 || abs_exp > MAX_ABS_EXP) + e = (int)MAX_ABS_EXP; + else + e = (int)abs_exp; + if (esign) + e = -e; + + /* A valid exponent must have at least one digit. */ + if (s == s1 && !lz) + s = s00; + } + + /* Adjust exponent to take into account position of the point. */ + e -= nd - nd0; + if (nd0 <= 0) + nd0 = nd; + + /* Finished parsing. Set se to indicate how far we parsed */ + if (se) + *se = (char *)s; + + /* If all digits were zero, exit with return value +-0.0. Otherwise, + strip trailing zeros: scan back until we hit a nonzero digit. */ + if (!nd) + goto ret; + for (i = nd; i > 0; ) { + --i; + if (s0[i < nd0 ? i : i+1] != '0') { + ++i; + break; + } + } + e += nd - i; + nd = i; + if (nd0 > nd) + nd0 = nd; + + /* Summary of parsing results. After parsing, and dealing with zero + * inputs, we have values s0, nd0, nd, e, sign, where: + * + * - s0 points to the first significant digit of the input string + * + * - nd is the total number of significant digits (here, and + * below, 'significant digits' means the set of digits of the + * significand of the input that remain after ignoring leading + * and trailing zeros). + * + * - nd0 indicates the position of the decimal point, if present; it + * satisfies 1 <= nd0 <= nd. The nd significant digits are in + * s0[0:nd0] and s0[nd0+1:nd+1] using the usual Python half-open slice + * notation. (If nd0 < nd, then s0[nd0] contains a '.' character; if + * nd0 == nd, then s0[nd0] could be any non-digit character.) + * + * - e is the adjusted exponent: the absolute value of the number + * represented by the original input string is n * 10**e, where + * n is the integer represented by the concatenation of + * s0[0:nd0] and s0[nd0+1:nd+1] + * + * - sign gives the sign of the input: 1 for negative, 0 for positive + * + * - the first and last significant digits are nonzero + */ + + /* put first DBL_DIG+1 digits into integer y and z. + * + * - y contains the value represented by the first min(9, nd) + * significant digits + * + * - if nd > 9, z contains the value represented by significant digits + * with indices in [9, min(16, nd)). So y * 10**(min(16, nd) - 9) + z + * gives the value represented by the first min(16, nd) sig. digits. + */ + + bc.e0 = e1 = e; + y = z = 0; + for (i = 0; i < nd; i++) { + if (i < 9) + y = 10*y + s0[i < nd0 ? i : i+1] - '0'; + else if (i < DBL_DIG+1) + z = 10*z + s0[i < nd0 ? i : i+1] - '0'; + else + break; + } + + k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; + dval(&rv) = y; + if (k > 9) { + dval(&rv) = tens[k - 9] * dval(&rv) + z; + } + bd0 = 0; + if (nd <= DBL_DIG + && Flt_Rounds == 1 + ) { + if (!e) + goto ret; + if (e > 0) { + if (e <= Ten_pmax) { + dval(&rv) *= tens[e]; + goto ret; + } + i = DBL_DIG - nd; + if (e <= Ten_pmax + i) { + /* A fancier test would sometimes let us do + * this for larger i values. + */ + e -= i; + dval(&rv) *= tens[i]; + dval(&rv) *= tens[e]; + goto ret; + } + } + else if (e >= -Ten_pmax) { + dval(&rv) /= tens[-e]; + goto ret; + } + } + e1 += nd - k; + + bc.scale = 0; + + /* Get starting approximation = rv * 10**e1 */ + + if (e1 > 0) { + if ((i = e1 & 15)) + dval(&rv) *= tens[i]; + if (e1 &= ~15) { + if (e1 > DBL_MAX_10_EXP) + goto ovfl; + e1 >>= 4; + for(j = 0; e1 > 1; j++, e1 >>= 1) + if (e1 & 1) + dval(&rv) *= bigtens[j]; + /* The last multiplication could overflow. */ + word0(&rv) -= P*Exp_msk1; + dval(&rv) *= bigtens[j]; + if ((z = word0(&rv) & Exp_mask) + > Exp_msk1*(DBL_MAX_EXP+Bias-P)) + goto ovfl; + if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) { + /* set to largest number */ + /* (Can't trust DBL_MAX) */ + word0(&rv) = Big0; + word1(&rv) = Big1; + } + else + word0(&rv) += P*Exp_msk1; + } + } + else if (e1 < 0) { + /* The input decimal value lies in [10**e1, 10**(e1+16)). + + If e1 <= -512, underflow immediately. + If e1 <= -256, set bc.scale to 2*P. + + So for input value < 1e-256, bc.scale is always set; + for input value >= 1e-240, bc.scale is never set. + For input values in [1e-256, 1e-240), bc.scale may or may + not be set. */ + + e1 = -e1; + if ((i = e1 & 15)) + dval(&rv) /= tens[i]; + if (e1 >>= 4) { + if (e1 >= 1 << n_bigtens) + goto undfl; + if (e1 & Scale_Bit) + bc.scale = 2*P; + for(j = 0; e1 > 0; j++, e1 >>= 1) + if (e1 & 1) + dval(&rv) *= tinytens[j]; + if (bc.scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask) + >> Exp_shift)) > 0) { + /* scaled rv is denormal; clear j low bits */ + if (j >= 32) { + word1(&rv) = 0; + if (j >= 53) + word0(&rv) = (P+2)*Exp_msk1; + else + word0(&rv) &= 0xffffffff << (j-32); + } + else + word1(&rv) &= 0xffffffff << j; + } + if (!dval(&rv)) + goto undfl; + } + } + + /* Now the hard part -- adjusting rv to the correct value.*/ + + /* Put digits into bd: true value = bd * 10^e */ + + bc.nd = nd; + bc.nd0 = nd0; /* Only needed if nd > STRTOD_DIGLIM, but done here */ + /* to silence an erroneous warning about bc.nd0 */ + /* possibly not being initialized. */ + if (nd > STRTOD_DIGLIM) { + /* ASSERT(STRTOD_DIGLIM >= 18); 18 == one more than the */ + /* minimum number of decimal digits to distinguish double values */ + /* in IEEE arithmetic. */ + + /* Truncate input to 18 significant digits, then discard any trailing + zeros on the result by updating nd, nd0, e and y suitably. (There's + no need to update z; it's not reused beyond this point.) */ + for (i = 18; i > 0; ) { + /* scan back until we hit a nonzero digit. significant digit 'i' + is s0[i] if i < nd0, s0[i+1] if i >= nd0. */ + --i; + if (s0[i < nd0 ? i : i+1] != '0') { + ++i; + break; + } + } + e += nd - i; + nd = i; + if (nd0 > nd) + nd0 = nd; + if (nd < 9) { /* must recompute y */ + y = 0; + for(i = 0; i < nd0; ++i) + y = 10*y + s0[i] - '0'; + for(; i < nd; ++i) + y = 10*y + s0[i+1] - '0'; + } + } + bd0 = s2b(s0, nd0, nd, y); + if (bd0 == NULL) + goto failed_malloc; + + /* Notation for the comments below. Write: + + - dv for the absolute value of the number represented by the original + decimal input string. + + - if we've truncated dv, write tdv for the truncated value. + Otherwise, set tdv == dv. + + - srv for the quantity rv/2^bc.scale; so srv is the current binary + approximation to tdv (and dv). It should be exactly representable + in an IEEE 754 double. + */ + + for(;;) { + + /* This is the main correction loop for sb_strtod. + + We've got a decimal value tdv, and a floating-point approximation + srv=rv/2^bc.scale to tdv. The aim is to determine whether srv is + close enough (i.e., within 0.5 ulps) to tdv, and to compute a new + approximation if not. + + To determine whether srv is close enough to tdv, compute integers + bd, bb and bs proportional to tdv, srv and 0.5 ulp(srv) + respectively, and then use integer arithmetic to determine whether + |tdv - srv| is less than, equal to, or greater than 0.5 ulp(srv). + */ + + bd = Balloc(bd0->k); + if (bd == NULL) { + Bfree(bd0); + goto failed_malloc; + } + Bcopy(bd, bd0); + bb = sd2b(&rv, bc.scale, &bbe); /* srv = bb * 2^bbe */ + if (bb == NULL) { + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + /* Record whether lsb of bb is odd, in case we need this + for the round-to-even step later. */ + odd = bb->x[0] & 1; + + /* tdv = bd * 10**e; srv = bb * 2**bbe */ + bs = i2b(1); + if (bs == NULL) { + Bfree(bb); + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + + if (e >= 0) { + bb2 = bb5 = 0; + bd2 = bd5 = e; + } + else { + bb2 = bb5 = -e; + bd2 = bd5 = 0; + } + if (bbe >= 0) + bb2 += bbe; + else + bd2 -= bbe; + bs2 = bb2; + bb2++; + bd2++; + + /* At this stage bd5 - bb5 == e == bd2 - bb2 + bbe, bb2 - bs2 == 1, + and bs == 1, so: + + tdv == bd * 10**e = bd * 2**(bbe - bb2 + bd2) * 5**(bd5 - bb5) + srv == bb * 2**bbe = bb * 2**(bbe - bb2 + bb2) + 0.5 ulp(srv) == 2**(bbe-1) = bs * 2**(bbe - bb2 + bs2) + + It follows that: + + M * tdv = bd * 2**bd2 * 5**bd5 + M * srv = bb * 2**bb2 * 5**bb5 + M * 0.5 ulp(srv) = bs * 2**bs2 * 5**bb5 + + for some constant M. (Actually, M == 2**(bb2 - bbe) * 5**bb5, but + this fact is not needed below.) + */ + + /* Remove factor of 2**i, where i = min(bb2, bd2, bs2). */ + i = bb2 < bd2 ? bb2 : bd2; + if (i > bs2) + i = bs2; + if (i > 0) { + bb2 -= i; + bd2 -= i; + bs2 -= i; + } + + /* Scale bb, bd, bs by the appropriate powers of 2 and 5. */ + if (bb5 > 0) { + bs = pow5mult(bs, bb5); + if (bs == NULL) { + Bfree(bb); + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + bb1 = mult(bs, bb); + Bfree(bb); + bb = bb1; + if (bb == NULL) { + Bfree(bs); + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + } + if (bb2 > 0) { + bb = lshift(bb, bb2); + if (bb == NULL) { + Bfree(bs); + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + } + if (bd5 > 0) { + bd = pow5mult(bd, bd5); + if (bd == NULL) { + Bfree(bb); + Bfree(bs); + Bfree(bd0); + goto failed_malloc; + } + } + if (bd2 > 0) { + bd = lshift(bd, bd2); + if (bd == NULL) { + Bfree(bb); + Bfree(bs); + Bfree(bd0); + goto failed_malloc; + } + } + if (bs2 > 0) { + bs = lshift(bs, bs2); + if (bs == NULL) { + Bfree(bb); + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + } + + /* Now bd, bb and bs are scaled versions of tdv, srv and 0.5 ulp(srv), + respectively. Compute the difference |tdv - srv|, and compare + with 0.5 ulp(srv). */ + + delta = diff(bb, bd); + if (delta == NULL) { + Bfree(bb); + Bfree(bs); + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + dsign = delta->sign; + delta->sign = 0; + i = cmp(delta, bs); + if (bc.nd > nd && i <= 0) { + if (dsign) + break; /* Must use bigcomp(). */ + + /* Here rv overestimates the truncated decimal value by at most + 0.5 ulp(rv). Hence rv either overestimates the true decimal + value by <= 0.5 ulp(rv), or underestimates it by some small + amount (< 0.1 ulp(rv)); either way, rv is within 0.5 ulps of + the true decimal value, so it's possible to exit. + + Exception: if scaled rv is a normal exact power of 2, but not + DBL_MIN, then rv - 0.5 ulp(rv) takes us all the way down to the + next double, so the correctly rounded result is either rv - 0.5 + ulp(rv) or rv; in this case, use bigcomp to distinguish. */ + + if (!word1(&rv) && !(word0(&rv) & Bndry_mask)) { + /* rv can't be 0, since it's an overestimate for some + nonzero value. So rv is a normal power of 2. */ + j = (int)(word0(&rv) & Exp_mask) >> Exp_shift; + /* rv / 2^bc.scale = 2^(j - 1023 - bc.scale); use bigcomp if + rv / 2^bc.scale >= 2^-1021. */ + if (j - bc.scale >= 2) { + dval(&rv) -= 0.5 * sulp(&rv, &bc); + break; /* Use bigcomp. */ + } + } + + { + bc.nd = nd; + i = -1; /* Discarded digits make delta smaller. */ + } + } + + if (i < 0) { + /* Error is less than half an ulp -- check for + * special case of mantissa a power of two. + */ + if (dsign || word1(&rv) || word0(&rv) & Bndry_mask + || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1 + ) { + break; + } + if (!delta->x[0] && delta->wds <= 1) { + /* exact result */ + break; + } + delta = lshift(delta,Log2P); + if (delta == NULL) { + Bfree(bb); + Bfree(bs); + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + if (cmp(delta, bs) > 0) + goto drop_down; + break; + } + if (i == 0) { + /* exactly half-way between */ + if (dsign) { + if ((word0(&rv) & Bndry_mask1) == Bndry_mask1 + && word1(&rv) == ( + (bc.scale && + (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1) ? + (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) : + 0xffffffff)) { + /*boundary case -- increment exponent*/ + word0(&rv) = (word0(&rv) & Exp_mask) + + Exp_msk1 + ; + word1(&rv) = 0; + /* dsign = 0; */ + break; + } + } + else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) { + drop_down: + /* boundary case -- decrement exponent */ + if (bc.scale) { + L = word0(&rv) & Exp_mask; + if (L <= (2*P+1)*Exp_msk1) { + if (L > (P+2)*Exp_msk1) + /* round even ==> */ + /* accept rv */ + break; + /* rv = smallest denormal */ + if (bc.nd > nd) + break; + goto undfl; + } + } + L = (word0(&rv) & Exp_mask) - Exp_msk1; + word0(&rv) = L | Bndry_mask1; + word1(&rv) = 0xffffffff; + break; + } + if (!odd) + break; + if (dsign) + dval(&rv) += sulp(&rv, &bc); + else { + dval(&rv) -= sulp(&rv, &bc); + if (!dval(&rv)) { + if (bc.nd >nd) + break; + goto undfl; + } + } + /* dsign = 1 - dsign; */ + break; + } + if ((aadj = ratio(delta, bs)) <= 2.) { + if (dsign) + aadj = aadj1 = 1.; + else if (word1(&rv) || word0(&rv) & Bndry_mask) { + if (word1(&rv) == Tiny1 && !word0(&rv)) { + if (bc.nd >nd) + break; + goto undfl; + } + aadj = 1.; + aadj1 = -1.; + } + else { + /* special case -- power of FLT_RADIX to be */ + /* rounded down... */ + + if (aadj < 2./FLT_RADIX) + aadj = 1./FLT_RADIX; + else + aadj *= 0.5; + aadj1 = -aadj; + } + } + else { + aadj *= 0.5; + aadj1 = dsign ? aadj : -aadj; + if (Flt_Rounds == 0) + aadj1 += 0.5; + } + y = word0(&rv) & Exp_mask; + + /* Check for overflow */ + + if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) { + dval(&rv0) = dval(&rv); + word0(&rv) -= P*Exp_msk1; + adj.d = aadj1 * ulp(&rv); + dval(&rv) += adj.d; + if ((word0(&rv) & Exp_mask) >= + Exp_msk1*(DBL_MAX_EXP+Bias-P)) { + if (word0(&rv0) == Big0 && word1(&rv0) == Big1) { + Bfree(bb); + Bfree(bd); + Bfree(bs); + Bfree(bd0); + Bfree(delta); + goto ovfl; + } + word0(&rv) = Big0; + word1(&rv) = Big1; + goto cont; + } + else + word0(&rv) += P*Exp_msk1; + } + else { + if (bc.scale && y <= 2*P*Exp_msk1) { + if (aadj <= 0x7fffffff) { + if ((z = (ULong)aadj) <= 0) + z = 1; + aadj = z; + aadj1 = dsign ? aadj : -aadj; + } + dval(&aadj2) = aadj1; + word0(&aadj2) += (2*P+1)*Exp_msk1 - y; + aadj1 = dval(&aadj2); + } + adj.d = aadj1 * ulp(&rv); + dval(&rv) += adj.d; + } + z = word0(&rv) & Exp_mask; + if (bc.nd == nd) { + if (!bc.scale) + if (y == z) { + /* Can we stop now? */ + L = (Long)aadj; + aadj -= L; + /* The tolerances below are conservative. */ + if (dsign || word1(&rv) || word0(&rv) & Bndry_mask) { + if (aadj < .4999999 || aadj > .5000001) + break; + } + else if (aadj < .4999999/FLT_RADIX) + break; + } + } + cont: + Bfree(bb); + Bfree(bd); + Bfree(bs); + Bfree(delta); + } + Bfree(bb); + Bfree(bd); + Bfree(bs); + Bfree(bd0); + Bfree(delta); + if (bc.nd > nd) { + error = bigcomp(&rv, s0, &bc); + if (error) + goto failed_malloc; + } + + if (bc.scale) { + word0(&rv0) = Exp_1 - 2*P*Exp_msk1; + word1(&rv0) = 0; + dval(&rv) *= dval(&rv0); + } + + ret: + return sign ? -dval(&rv) : dval(&rv); + + parse_error: + return 0.0; + + failed_malloc: + errno = ENOMEM; + return -1.0; + + undfl: + return sign ? -0.0 : 0.0; + + ovfl: + errno = ERANGE; + /* Can't trust HUGE_VAL */ + word0(&rv) = Exp_mask; + word1(&rv) = 0; + return sign ? -dval(&rv) : dval(&rv); + +} + +static char * +rv_alloc(int i) +{ + int j, k, *r; + + j = sizeof(ULong); + for(k = 0; + sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= (unsigned)i; + j <<= 1) + k++; + r = (int*)Balloc(k); + if (r == NULL) + return NULL; + *r = k; + return (char *)(r+1); +} + +static char * +nrv_alloc(char *s, char **rve, int n) +{ + char *rv, *t; + + rv = rv_alloc(n); + if (rv == NULL) + return NULL; + t = rv; + while((*t = *s++)) t++; + if (rve) + *rve = t; + return rv; +} + +/* freedtoa(s) must be used to free values s returned by dtoa + * when MULTIPLE_THREADS is #defined. It should be used in all cases, + * but for consistency with earlier versions of dtoa, it is optional + * when MULTIPLE_THREADS is not defined. + */ + +void +sb_freedtoa(char *s) +{ + Bigint *b = (Bigint *)((int *)s - 1); + b->maxwds = 1 << (b->k = *(int*)b); + Bfree(b); +} + +/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string. + * + * Inspired by "How to Print Floating-Point Numbers Accurately" by + * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126]. + * + * Modifications: + * 1. Rather than iterating, we use a simple numeric overestimate + * to determine k = floor(log10(d)). We scale relevant + * quantities using O(log2(k)) rather than O(k) multiplications. + * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't + * try to generate digits strictly left to right. Instead, we + * compute with fewer bits and propagate the carry if necessary + * when rounding the final digit up. This is often faster. + * 3. Under the assumption that input will be rounded nearest, + * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22. + * That is, we allow equality in stopping tests when the + * round-nearest rule will give the same floating-point value + * as would satisfaction of the stopping test with strict + * inequality. + * 4. We remove common factors of powers of 2 from relevant + * quantities. + * 5. When converting floating-point integers less than 1e16, + * we use floating-point arithmetic rather than resorting + * to multiple-precision integers. + * 6. When asked to produce fewer than 15 digits, we first try + * to get by with floating-point arithmetic; we resort to + * multiple-precision integer arithmetic only if we cannot + * guarantee that the floating-point calculation has given + * the correctly rounded result. For k requested digits and + * "uniformly" distributed input, the probability is + * something like 10^(k-15) that we must resort to the Long + * calculation. + */ + +/* Additional notes (METD): (1) returns NULL on failure. (2) to avoid memory + leakage, a successful call to sb_dtoa should always be matched by a + call to sb_freedtoa. */ + +char * +sb_dtoa(double dd, int mode, int ndigits, + int *decpt, int *sign, char **rve) +{ + /* Arguments ndigits, decpt, sign are similar to those + of ecvt and fcvt; trailing zeros are suppressed from + the returned string. If not null, *rve is set to point + to the end of the return value. If d is +-Infinity or NaN, + then *decpt is set to 9999. + + mode: + 0 ==> shortest string that yields d when read in + and rounded to nearest. + 1 ==> like 0, but with Steele & White stopping rule; + e.g. with IEEE P754 arithmetic , mode 0 gives + 1e23 whereas mode 1 gives 9.999999999999999e22. + 2 ==> max(1,ndigits) significant digits. This gives a + return value similar to that of ecvt, except + that trailing zeros are suppressed. + 3 ==> through ndigits past the decimal point. This + gives a return value similar to that from fcvt, + except that trailing zeros are suppressed, and + ndigits can be negative. + 4,5 ==> similar to 2 and 3, respectively, but (in + round-nearest mode) with the tests of mode 0 to + possibly return a shorter string that rounds to d. + With IEEE arithmetic and compilation with + -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same + as modes 2 and 3 when FLT_ROUNDS != 1. + 6-9 ==> Debugging modes similar to mode - 4: don't try + fast floating-point estimate (if applicable). + + Values of mode other than 0-9 are treated as mode 0. + + Sufficient space is allocated to the return value + to hold the suppressed trailing zeros. + */ + + int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1, + j, j1, k, k0, k_check, leftright, m2, m5, s2, s5, + spec_case, try_quick; + Long L; + int denorm; + ULong x; + Bigint *b, *b1, *delta, *mlo, *mhi, *S; + U d2, eps, u; + double ds; + char *s, *s0; + + /* set pointers to NULL, to silence gcc compiler warnings and make + cleanup easier on error */ + mlo = mhi = S = 0; + s0 = 0; + + u.d = dd; + if (word0(&u) & Sign_bit) { + /* set sign for everything, including 0's and NaNs */ + *sign = 1; + word0(&u) &= ~Sign_bit; /* clear sign bit */ + } + else + *sign = 0; + + /* quick return for Infinities, NaNs and zeros */ + if ((word0(&u) & Exp_mask) == Exp_mask) + { + /* Infinity or NaN */ + *decpt = 9999; + if (!word1(&u) && !(word0(&u) & 0xfffff)) + return nrv_alloc("Infinity", rve, 8); + return nrv_alloc("NaN", rve, 3); + } + if (!dval(&u)) { + *decpt = 1; + return nrv_alloc("0", rve, 1); + } + + /* compute k = floor(log10(d)). The computation may leave k + one too large, but should never leave k too small. */ + b = d2b(&u, &be, &bbits); + if (b == NULL) + goto failed_malloc; + if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1)))) { + dval(&d2) = dval(&u); + word0(&d2) &= Frac_mask1; + word0(&d2) |= Exp_11; + + /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 + * log10(x) = log(x) / log(10) + * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10)) + * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2) + * + * This suggests computing an approximation k to log10(d) by + * + * k = (i - Bias)*0.301029995663981 + * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 ); + * + * We want k to be too large rather than too small. + * The error in the first-order Taylor series approximation + * is in our favor, so we just round up the constant enough + * to compensate for any error in the multiplication of + * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077, + * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14, + * adding 1e-13 to the constant term more than suffices. + * Hence we adjust the constant term to 0.1760912590558. + * (We could get a more accurate k by invoking log10, + * but this is probably not worthwhile.) + */ + + i -= Bias; + denorm = 0; + } + else { + /* d is denormalized */ + + i = bbits + be + (Bias + (P-1) - 1); + x = i > 32 ? word0(&u) << (64 - i) | word1(&u) >> (i - 32) + : word1(&u) << (32 - i); + dval(&d2) = x; + word0(&d2) -= 31*Exp_msk1; /* adjust exponent */ + i -= (Bias + (P-1) - 1) + 1; + denorm = 1; + } + ds = (dval(&d2)-1.5)*0.289529654602168 + 0.1760912590558 + + i*0.301029995663981; + k = (int)ds; + if (ds < 0. && ds != k) + k--; /* want k = floor(ds) */ + k_check = 1; + if (k >= 0 && k <= Ten_pmax) { + if (dval(&u) < tens[k]) + k--; + k_check = 0; + } + j = bbits - i - 1; + if (j >= 0) { + b2 = 0; + s2 = j; + } + else { + b2 = -j; + s2 = 0; + } + if (k >= 0) { + b5 = 0; + s5 = k; + s2 += k; + } + else { + b2 -= k; + b5 = -k; + s5 = 0; + } + if (mode < 0 || mode > 9) + mode = 0; + + try_quick = 1; + + if (mode > 5) { + mode -= 4; + try_quick = 0; + } + leftright = 1; + ilim = ilim1 = -1; /* Values for cases 0 and 1; done here to */ + /* silence erroneous "gcc -Wall" warning. */ + switch(mode) { + case 0: + case 1: + i = 18; + ndigits = 0; + break; + case 2: + leftright = 0; + /* FALLTHRU */ + case 4: + if (ndigits <= 0) + ndigits = 1; + ilim = ilim1 = i = ndigits; + break; + case 3: + leftright = 0; + /* FALLTHRU */ + case 5: + i = ndigits + k + 1; + ilim = i; + ilim1 = i - 1; + if (i <= 0) + i = 1; + } + s0 = rv_alloc(i); + if (s0 == NULL) + goto failed_malloc; + s = s0; + + + if (ilim >= 0 && ilim <= Quick_max && try_quick) { + + /* Try to get by with floating-point arithmetic. */ + + i = 0; + dval(&d2) = dval(&u); + k0 = k; + ilim0 = ilim; + ieps = 2; /* conservative */ + if (k > 0) { + ds = tens[k&0xf]; + j = k >> 4; + if (j & Bletch) { + /* prevent overflows */ + j &= Bletch - 1; + dval(&u) /= bigtens[n_bigtens-1]; + ieps++; + } + for(; j; j >>= 1, i++) + if (j & 1) { + ieps++; + ds *= bigtens[i]; + } + dval(&u) /= ds; + } + else if ((j1 = -k)) { + dval(&u) *= tens[j1 & 0xf]; + for(j = j1 >> 4; j; j >>= 1, i++) + if (j & 1) { + ieps++; + dval(&u) *= bigtens[i]; + } + } + if (k_check && dval(&u) < 1. && ilim > 0) { + if (ilim1 <= 0) + goto fast_failed; + ilim = ilim1; + k--; + dval(&u) *= 10.; + ieps++; + } + dval(&eps) = ieps*dval(&u) + 7.; + word0(&eps) -= (P-1)*Exp_msk1; + if (ilim == 0) { + S = mhi = 0; + dval(&u) -= 5.; + if (dval(&u) > dval(&eps)) + goto one_digit; + if (dval(&u) < -dval(&eps)) + goto no_digits; + goto fast_failed; + } + if (leftright) { + /* Use Steele & White method of only + * generating digits needed. + */ + dval(&eps) = 0.5/tens[ilim-1] - dval(&eps); + for(i = 0;;) { + L = (Long)dval(&u); + dval(&u) -= L; + *s++ = '0' + (int)L; + if (dval(&u) < dval(&eps)) + goto ret1; + if (1. - dval(&u) < dval(&eps)) + goto bump_up; + if (++i >= ilim) + break; + dval(&eps) *= 10.; + dval(&u) *= 10.; + } + } + else { + /* Generate ilim digits, then fix them up. */ + dval(&eps) *= tens[ilim-1]; + for(i = 1;; i++, dval(&u) *= 10.) { + L = (Long)(dval(&u)); + if (!(dval(&u) -= L)) + ilim = i; + *s++ = '0' + (int)L; + if (i == ilim) { + if (dval(&u) > 0.5 + dval(&eps)) + goto bump_up; + else if (dval(&u) < 0.5 - dval(&eps)) { + while(*--s == '0'); + s++; + goto ret1; + } + break; + } + } + } + fast_failed: + s = s0; + dval(&u) = dval(&d2); + k = k0; + ilim = ilim0; + } + + /* Do we have a "small" integer? */ + + if (be >= 0 && k <= Int_max) { + /* Yes. */ + ds = tens[k]; + if (ndigits < 0 && ilim <= 0) { + S = mhi = 0; + if (ilim < 0 || dval(&u) <= 5*ds) + goto no_digits; + goto one_digit; + } + for(i = 1;; i++, dval(&u) *= 10.) { + L = (Long)(dval(&u) / ds); + dval(&u) -= L*ds; + *s++ = '0' + (int)L; + if (!dval(&u)) { + break; + } + if (i == ilim) { + dval(&u) += dval(&u); + if (dval(&u) > ds || (dval(&u) == ds && L & 1)) { + bump_up: + while(*--s == '9') + if (s == s0) { + k++; + *s = '0'; + break; + } + ++*s++; + } + break; + } + } + goto ret1; + } + + m2 = b2; + m5 = b5; + if (leftright) { + i = + denorm ? be + (Bias + (P-1) - 1 + 1) : + 1 + P - bbits; + b2 += i; + s2 += i; + mhi = i2b(1); + if (mhi == NULL) + goto failed_malloc; + } + if (m2 > 0 && s2 > 0) { + i = m2 < s2 ? m2 : s2; + b2 -= i; + m2 -= i; + s2 -= i; + } + if (b5 > 0) { + if (leftright) { + if (m5 > 0) { + mhi = pow5mult(mhi, m5); + if (mhi == NULL) + goto failed_malloc; + b1 = mult(mhi, b); + Bfree(b); + b = b1; + if (b == NULL) + goto failed_malloc; + } + if ((j = b5 - m5)) { + b = pow5mult(b, j); + if (b == NULL) + goto failed_malloc; + } + } + else { + b = pow5mult(b, b5); + if (b == NULL) + goto failed_malloc; + } + } + S = i2b(1); + if (S == NULL) + goto failed_malloc; + if (s5 > 0) { + S = pow5mult(S, s5); + if (S == NULL) + goto failed_malloc; + } + + /* Check for special case that d is a normalized power of 2. */ + + spec_case = 0; + if ((mode < 2 || leftright) + ) { + if (!word1(&u) && !(word0(&u) & Bndry_mask) + && word0(&u) & (Exp_mask & ~Exp_msk1) + ) { + /* The special case */ + b2 += Log2P; + s2 += Log2P; + spec_case = 1; + } + } + + /* Arrange for convenient computation of quotients: + * shift left if necessary so divisor has 4 leading 0 bits. + * + * Perhaps we should just compute leading 28 bits of S once + * and for all and pass them and a shift to quorem, so it + * can do shifts and ors to compute the numerator for q. + */ +#define iInc 28 + i = dshift(S, s2); + b2 += i; + m2 += i; + s2 += i; + if (b2 > 0) { + b = lshift(b, b2); + if (b == NULL) + goto failed_malloc; + } + if (s2 > 0) { + S = lshift(S, s2); + if (S == NULL) + goto failed_malloc; + } + if (k_check) { + if (cmp(b,S) < 0) { + k--; + b = multadd(b, 10, 0); /* we botched the k estimate */ + if (b == NULL) + goto failed_malloc; + if (leftright) { + mhi = multadd(mhi, 10, 0); + if (mhi == NULL) + goto failed_malloc; + } + ilim = ilim1; + } + } + if (ilim <= 0 && (mode == 3 || mode == 5)) { + if (ilim < 0) { + /* no digits, fcvt style */ + no_digits: + k = -1 - ndigits; + goto ret; + } + else { + S = multadd(S, 5, 0); + if (S == NULL) + goto failed_malloc; + if (cmp(b, S) <= 0) + goto no_digits; + } + one_digit: + *s++ = '1'; + k++; + goto ret; + } + if (leftright) { + if (m2 > 0) { + mhi = lshift(mhi, m2); + if (mhi == NULL) + goto failed_malloc; + } + + /* Compute mlo -- check for special case + * that d is a normalized power of 2. + */ + + mlo = mhi; + if (spec_case) { + mhi = Balloc(mhi->k); + if (mhi == NULL) + goto failed_malloc; + Bcopy(mhi, mlo); + mhi = lshift(mhi, Log2P); + if (mhi == NULL) + goto failed_malloc; + } + + for(i = 1;;i++) { + dig = quorem(b,S) + '0'; + /* Do we yet have the shortest decimal string + * that will round to d? + */ + j = cmp(b, mlo); + delta = diff(S, mhi); + if (delta == NULL) + goto failed_malloc; + j1 = delta->sign ? 1 : cmp(b, delta); + Bfree(delta); + if (j1 == 0 && mode != 1 && !(word1(&u) & 1) + ) { + if (dig == '9') + goto round_9_up; + if (j > 0) + dig++; + *s++ = dig; + goto ret; + } + if (j < 0 || (j == 0 && mode != 1 + && !(word1(&u) & 1) + )) { + if (!b->x[0] && b->wds <= 1) { + goto accept_dig; + } + if (j1 > 0) { + b = lshift(b, 1); + if (b == NULL) + goto failed_malloc; + j1 = cmp(b, S); + if ((j1 > 0 || (j1 == 0 && dig & 1)) + && dig++ == '9') + goto round_9_up; + } + accept_dig: + *s++ = dig; + goto ret; + } + if (j1 > 0) { + if (dig == '9') { /* possible if i == 1 */ + round_9_up: + *s++ = '9'; + goto roundoff; + } + *s++ = dig + 1; + goto ret; + } + *s++ = dig; + if (i == ilim) + break; + b = multadd(b, 10, 0); + if (b == NULL) + goto failed_malloc; + if (mlo == mhi) { + mlo = mhi = multadd(mhi, 10, 0); + if (mlo == NULL) + goto failed_malloc; + } + else { + mlo = multadd(mlo, 10, 0); + if (mlo == NULL) + goto failed_malloc; + mhi = multadd(mhi, 10, 0); + if (mhi == NULL) + goto failed_malloc; + } + } + } + else + for(i = 1;; i++) { + *s++ = dig = quorem(b,S) + '0'; + if (!b->x[0] && b->wds <= 1) { + goto ret; + } + if (i >= ilim) + break; + b = multadd(b, 10, 0); + if (b == NULL) + goto failed_malloc; + } + + /* Round off last digit */ + + b = lshift(b, 1); + if (b == NULL) + goto failed_malloc; + j = cmp(b, S); + if (j > 0 || (j == 0 && dig & 1)) { + roundoff: + while(*--s == '9') + if (s == s0) { + k++; + *s++ = '1'; + goto ret; + } + ++*s++; + } + else { + while(*--s == '0'); + s++; + } + ret: + Bfree(S); + if (mhi) { + if (mlo && mlo != mhi) + Bfree(mlo); + Bfree(mhi); + } + ret1: + Bfree(b); + *s = 0; + *decpt = k + 1; + if (rve) + *rve = s; + return s0; + failed_malloc: + if (S) + Bfree(S); + if (mlo && mlo != mhi) + Bfree(mlo); + if (mhi) + Bfree(mhi); + if (b) + Bfree(b); + if (s0) + sb_freedtoa(s0); + return NULL; +} +#ifdef __cplusplus +} +#endif diff --git a/src/util/err.c b/src/util/err.c new file mode 100644 index 0000000..c21caa1 --- /dev/null +++ b/src/util/err.c @@ -0,0 +1,305 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file err.c + * @brief Somewhat antiquated logging and error interface. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include + +#include + +#include "util/filename.h" +#include "util/ckd_alloc.h" + +static FILE* logfp = NULL; +static int logfp_disabled = FALSE; + +#if defined(__ANDROID__) +#include +static void +err_logcat_cb(void* user_data, err_lvl_t level, const char *fmt, ...); +#elif defined(_WIN32_WCE) +#include +#define vsnprintf _vsnprintf +static void +err_wince_cb(void* user_data, err_lvl_t level, const char *fmt, ...); +#endif + +#if defined(__ANDROID__) +static err_cb_f err_cb = err_logcat_cb; +#elif defined(_WIN32_WCE) +static err_cb_f err_cb = err_wince_cb; +#else +static err_cb_f err_cb = err_logfp_cb; +#endif +static void* err_user_data; +static err_lvl_t min_loglevel = ERR_WARN; +static const char *err_level[ERR_MAX] = + { + "DEBUG", "INFO", "WARN", "ERROR", "FATAL" + }; + +int +err_set_loglevel(err_lvl_t lvl) +{ + int rv = min_loglevel; + min_loglevel = lvl; + return rv; +} + +const char * +err_set_loglevel_str(char const *lvl) +{ + const char *rv = err_level[min_loglevel]; + int i; + + if (lvl == NULL) + return NULL; + if (!strncmp(lvl, "ERR_", 4)) + lvl += 4; + for (i = 0; i < ERR_MAX; ++i) { + if (!strcmp(lvl, err_level[i])) { + min_loglevel = i; + return rv; + } + } + return NULL; +} + +void +err_msg(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...) +{ + + char msg[1024]; + va_list ap; + + if (!err_cb) + return; + if (lvl < min_loglevel) + return; + + va_start(ap, fmt); + vsnprintf(msg, sizeof(msg), fmt, ap); + va_end(ap); + + if (path) { + const char *fname = path2basename(path); + if (lvl == ERR_INFO) + err_cb(err_user_data, lvl, "%s: %s(%ld): %s", err_level[lvl], fname, ln, msg); + else + err_cb(err_user_data, lvl, "%s: \"%s\", line %ld: %s", err_level[lvl], fname, ln, msg); + } else { + err_cb(err_user_data, lvl, "%s", msg); + } +} + +#ifdef _WIN32_WCE /* No strerror for WinCE, so a separate implementation */ +void +err_msg_system(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...) +{ + va_list ap; + LPVOID error_wstring; + DWORD error; + char msg[1024]; + char error_string[1024]; + + if (!err_cb) + return; + if (lvl < min_loglevel) + return; + + error = GetLastError(); + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + error, + 0, // Default language + (LPTSTR) &error_wstring, + 0, + NULL); + wcstombs(error_string, error_wstring, 1023); + LocalFree(error_wstring); + + va_start(ap, fmt); + vsnprintf(msg, sizeof(msg), fmt, ap); + va_end(ap); + + if (path) { + const char *fname = path2basename(path); + if (lvl == ERR_INFO) + err_cb(err_user_data, lvl, "%s: %s(%ld): %s: %s\n", err_prefix[lvl], fname, ln, msg, error_string); + else + err_cb(err_user_data, lvl, "%s: \"%s\", line %ld: %s: %s\n", err_prefix[lvl], fname, ln, msg, error_string); + } else { + err_cb(err_user_data, lvl, "%s: %s\n", msg, error_string); + } +} +#else +void +err_msg_system(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...) +{ + int local_errno = errno; + + char msg[1024]; + va_list ap; + + if (!err_cb) + return; + if (lvl < min_loglevel) + return; + + va_start(ap, fmt); + vsnprintf(msg, sizeof(msg), fmt, ap); + va_end(ap); + + if (path) { + const char *fname = path2basename(path); + if (lvl == ERR_INFO) + err_cb(err_user_data, lvl, "%s: %s(%ld): %s: %s\n", err_level[lvl], fname, ln, msg, strerror(local_errno)); + else + err_cb(err_user_data, lvl, "%s: \"%s\", line %ld: %s: %s\n", err_level[lvl], fname, ln, msg, strerror(local_errno)); + } else { + err_cb(err_user_data, lvl, "%s: %s\n", msg, strerror(local_errno)); + } +} +#endif + +#if defined(__ANDROID__) +static void +err_logcat_cb(void *user_data, err_lvl_t lvl, const char *fmt, ...) +{ + static const int android_level[ERR_MAX] = {ANDROID_LOG_DEBUG, ANDROID_LOG_INFO, + ANDROID_LOG_INFO, ANDROID_LOG_WARN, ANDROID_LOG_ERROR, ANDROID_LOG_ERROR}; + + va_list ap; + va_start(ap, fmt); + __android_log_vprint(android_level[lvl], "cmusphinx", fmt, ap); + va_end(ap); +} +#elif defined(_WIN32_WCE) +static void +err_wince_cb(void *user_data, err_lvl_t lvl, const char *fmt, ...) +{ + char msg[1024]; + WCHAR *wmsg; + size_t size; + va_list ap; + + va_start(ap, fmt); + _vsnprintf(msg, sizeof(msg), fmt, ap); + va_end(ap); + + size = mbstowcs(NULL, msg, 0) + 1; + wmsg = ckd_calloc(size, sizeof(*wmsg)); + mbstowcs(wmsg, msg, size); + + OutputDebugStringW(wmsg); + ckd_free(wmsg); +} +#else +void +err_logfp_cb(void *user_data, err_lvl_t lvl, const char *fmt, ...) +{ + va_list ap; + FILE *fp = err_get_logfp(); + + (void)user_data; + (void)lvl; /* FIXME?!?! */ + + if (!fp) + return; + + va_start(ap, fmt); + vfprintf(fp, fmt, ap); + va_end(ap); + fflush(fp); +} +#endif + +int +err_set_logfile(const char *path) +{ + FILE *newfp; + + if ((newfp = fopen(path, "a")) == NULL) + return -1; + err_set_logfp(newfp); + return 0; +} + +void +err_set_logfp(FILE *stream) +{ + if (logfp != NULL && logfp != stdout && logfp != stderr) + fclose(logfp); + if (stream == NULL) { + logfp_disabled = TRUE; + logfp = NULL; + return; + } + logfp_disabled = FALSE; + logfp = stream; + return; +} + +FILE * +err_get_logfp(void) +{ + if (logfp_disabled) + return NULL; + if (logfp == NULL) + return stderr; + + return logfp; +} + +void +err_set_callback(err_cb_f cb, void* user_data) +{ + err_cb = cb; + err_user_data= user_data; +} diff --git a/src/util/errno.c b/src/util/errno.c new file mode 100644 index 0000000..844b6f5 --- /dev/null +++ b/src/util/errno.c @@ -0,0 +1,51 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + */ +/********************************************************************* + * + * File: errno.c + * + * Description: functions and variables missing from Windows CE standard + * library + * + * Author: Silvio Moioli + * + *********************************************************************/ + +#include + +#if defined(_WIN32_WCE) +int errno; +#endif diff --git a/src/util/f2c.h b/src/util/f2c.h new file mode 100644 index 0000000..b3929f8 --- /dev/null +++ b/src/util/f2c.h @@ -0,0 +1,221 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/** + * @file f2c.h + * @brief Standard Fortran to C header file + */ + +/** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." + + - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ + +#ifndef F2C_INCLUDE +#define F2C_INCLUDE + +typedef int integer; +typedef char *address; +typedef short int shortint; +typedef float real; +typedef double doublereal; +typedef struct { real r, i; } complex; +typedef struct { doublereal r, i; } doublecomplex; +typedef int logical; +typedef short int shortlogical; +typedef char logical1; +typedef char integer1; + +#define TRUE_ (1) +#define FALSE_ (0) + +/* Extern is for use with -E */ +#ifndef Extern +#define Extern extern +#endif + +/* I/O stuff */ + +#ifdef f2c_i2 +/* for -i2 */ +typedef short flag; +typedef short ftnlen; +typedef short ftnint; +#else +typedef int flag; +typedef int ftnlen; +typedef int ftnint; +#endif + +/*external read, write*/ +typedef struct +{ flag cierr; + ftnint ciunit; + flag ciend; + char *cifmt; + ftnint cirec; +} cilist; + +/*internal read, write*/ +typedef struct +{ flag icierr; + char *iciunit; + flag iciend; + char *icifmt; + ftnint icirlen; + ftnint icirnum; +} icilist; + +/*open*/ +typedef struct +{ flag oerr; + ftnint ounit; + char *ofnm; + ftnlen ofnmlen; + char *osta; + char *oacc; + char *ofm; + ftnint orl; + char *oblnk; +} olist; + +/*close*/ +typedef struct +{ flag cerr; + ftnint cunit; + char *csta; +} cllist; + +/*rewind, backspace, endfile*/ +typedef struct +{ flag aerr; + ftnint aunit; +} alist; + +/* inquire */ +typedef struct +{ flag inerr; + ftnint inunit; + char *infile; + ftnlen infilen; + ftnint *inex; /*parameters in standard's order*/ + ftnint *inopen; + ftnint *innum; + ftnint *innamed; + char *inname; + ftnlen innamlen; + char *inacc; + ftnlen inacclen; + char *inseq; + ftnlen inseqlen; + char *indir; + ftnlen indirlen; + char *infmt; + ftnlen infmtlen; + char *inform; + ftnint informlen; + char *inunf; + ftnlen inunflen; + ftnint *inrecl; + ftnint *innrec; + char *inblank; + ftnlen inblanklen; +} inlist; + +#define VOID void + +union Multitype { /* for multiple entry points */ + shortint h; + integer i; + real r; + doublereal d; + complex c; + doublecomplex z; + }; + +typedef union Multitype Multitype; + +typedef long Long; /* No longer used; formerly in Namelist */ + +struct Vardesc { /* for Namelist */ + char *name; + char *addr; + ftnlen *dims; + int type; + }; +typedef struct Vardesc Vardesc; + +struct Namelist { + char *name; + Vardesc **vars; + int nvars; + }; +typedef struct Namelist Namelist; + +#ifndef abs +#define abs(x) ((x) >= 0 ? (x) : -(x)) +#endif +#define dabs(x) (doublereal)abs(x) +#ifndef min +#define min(a,b) ((a) <= (b) ? (a) : (b)) +#endif +#ifndef max +#define max(a,b) ((a) >= (b) ? (a) : (b)) +#endif +#define dmin(a,b) (doublereal)min(a,b) +#define dmax(a,b) (doublereal)max(a,b) + +/* procedure parameter types for -A and -C++ */ + +#define F2C_proc_par_types 1 +#ifdef __cplusplus +typedef int /* Unknown procedure type */ (*U_fp)(...); +typedef shortint (*J_fp)(...); +typedef integer (*I_fp)(...); +typedef real (*R_fp)(...); +typedef doublereal (*D_fp)(...), (*E_fp)(...); +typedef /* Complex */ VOID (*C_fp)(...); +typedef /* Double Complex */ VOID (*Z_fp)(...); +typedef logical (*L_fp)(...); +typedef shortlogical (*K_fp)(...); +typedef /* Character */ VOID (*H_fp)(...); +typedef /* Subroutine */ int (*S_fp)(...); +#else +typedef int /* Unknown procedure type */ (*U_fp)(void); +typedef shortint (*J_fp)(void); +typedef integer (*I_fp)(void); +typedef real (*R_fp)(void); +typedef doublereal (*D_fp)(void), (*E_fp)(void); +typedef /* Complex */ VOID (*C_fp)(void); +typedef /* Double Complex */ VOID (*Z_fp)(void); +typedef logical (*L_fp)(void); +typedef shortlogical (*K_fp)(void); +typedef /* Character */ VOID (*H_fp)(void); +typedef /* Subroutine */ int (*S_fp)(void); +#endif +/* E_fp is for real functions when -R is not specified */ +typedef VOID C_f; /* complex function */ +typedef VOID H_f; /* character function */ +typedef VOID Z_f; /* double complex function */ +typedef doublereal E_f; /* real function with -R not specified */ + +/* undef any lower-case symbols that your C compiler predefines, e.g.: */ + +#ifndef Skip_f2c_Undefs +#undef cray +#undef gcos +#undef mc68010 +#undef mc68020 +#undef mips +#undef pdp11 +#undef sgi +#undef sparc +#undef sun +#undef sun2 +#undef sun3 +#undef sun4 +#undef u370 +#undef u3b +#undef u3b2 +#undef u3b5 +#undef unix +#undef vax +#endif +#endif diff --git a/src/util/f2c_lite.c b/src/util/f2c_lite.c new file mode 100644 index 0000000..767e7bd --- /dev/null +++ b/src/util/f2c_lite.c @@ -0,0 +1,551 @@ +#include +#include +#include +#include +#include + +#include "util/f2c.h" + +#ifdef _MSC_VER +#pragma warning (disable: 4244) +#endif + + +extern void +s_wsfe(cilist * f) +{(void)f; +} +extern void +e_wsfe(void) +{; +} +extern void +do_fio(integer * c, char *s, ftnlen l) +{(void)c;(void)s;(void)l; +} + +/* You'll want this if you redo the *_lite.c files with the -C option + * to f2c for checking array subscripts. (It's not suggested you do that + * for production use, of course.) */ +extern int +s_rnge(char *var, int index, char *routine, int lineno) +{ + fprintf(stderr, + "array index out-of-bounds for %s[%d] in routine %s:%d\n", var, + index, routine, lineno); + fflush(stderr); + assert(2+2 == 5); + return 0; +} + + +#ifdef KR_headers +extern double sqrt(); +float +f__cabs(real, imag) +float real, imag; +#else +#undef abs + +float +f__cabs(float real, float imag) +#endif +{ + float temp; + + if (real < 0) + real = -real; + if (imag < 0) + imag = -imag; + if (imag > real) { + temp = real; + real = imag; + imag = temp; + } + if ((imag + real) == real) + return ((float) real); + + temp = imag / real; + temp = real * sqrt(1.0 + temp * temp); /*overflow!! */ + return (temp); +} + + +VOID +#ifdef KR_headers +s_cnjg(r, z) +complex *r, *z; +#else +s_cnjg(complex * r, complex * z) +#endif +{ + r->r = z->r; + r->i = -z->i; +} + + +#ifdef KR_headers +float +r_imag(z) +complex *z; +#else +float +r_imag(complex * z) +#endif +{ + return (z->i); +} + + +#define log10e 0.43429448190325182765 + +#ifdef KR_headers +double log(); +float +r_lg10(x) +real *x; +#else +#undef abs + +float +r_lg10(real * x) +#endif +{ + return (log10e * log(*x)); +} + + +#ifdef KR_headers +float +r_sign(a, b) +real *a, *b; +#else +float +r_sign(real * a, real * b) +#endif +{ + float x; + x = (*a >= 0 ? *a : -*a); + return (*b >= 0 ? x : -x); +} + + +#ifdef KR_headers +double floor(); +integer +i_dnnt(x) +real *x; +#else +#undef abs + +integer +i_dnnt(real * x) +#endif +{ + return ((*x) >= 0 ? floor(*x + .5) : -floor(.5 - *x)); +} + + +#ifdef KR_headers +double pow(); +double +pow_dd(ap, bp) +doublereal *ap, *bp; +#else +#undef abs + +double +pow_dd(doublereal * ap, doublereal * bp) +#endif +{ + return (pow(*ap, *bp)); +} + + +#ifdef KR_headers +float +pow_ri(ap, bp) +real *ap; +integer *bp; +#else +float +pow_ri(real * ap, integer * bp) +#endif +{ + float pow, x; + integer n; + unsigned long u; + + pow = 1; + x = *ap; + n = *bp; + + if (n != 0) { + if (n < 0) { + n = -n; + x = 1 / x; + } + for (u = n;;) { + if (u & 01) + pow *= x; + if (u >>= 1) + x *= x; + else + break; + } + } + return (pow); +} + +/* Unless compiled with -DNO_OVERWRITE, this variant of s_cat allows the + * target of a concatenation to appear on its right-hand side (contrary + * to the Fortran 77 Standard, but in accordance with Fortran 90). + */ +#define NO_OVERWRITE + + +#ifndef NO_OVERWRITE + +#undef abs +#ifdef KR_headers +extern char *F77_aloc(); +extern void free(); +extern void exit_(); +#else + +extern char *F77_aloc(ftnlen, char *); +#endif + +#endif /* NO_OVERWRITE */ + +VOID +#ifdef KR_headers +s_cat(lp, rpp, rnp, np, ll) +char *lp, *rpp[]; +ftnlen rnp[], *np, ll; +#else +s_cat(char *lp, char *rpp[], ftnlen rnp[], ftnlen * np, ftnlen ll) +#endif +{ + ftnlen i, nc; + char *rp; + ftnlen n = *np; +#ifndef NO_OVERWRITE + ftnlen L, m; + char *lp0, *lp1; + + lp0 = 0; + lp1 = lp; + L = ll; + i = 0; + while (i < n) { + rp = rpp[i]; + m = rnp[i++]; + if (rp >= lp1 || rp + m <= lp) { + if ((L -= m) <= 0) { + n = i; + break; + } + lp1 += m; + continue; + } + lp0 = lp; + lp = lp1 = F77_aloc(L = ll, "s_cat"); + break; + } + lp1 = lp; +#endif /* NO_OVERWRITE */ + for (i = 0; i < n; ++i) { + nc = ll; + if (rnp[i] < nc) + nc = rnp[i]; + ll -= nc; + rp = rpp[i]; + while (--nc >= 0) + *lp++ = *rp++; + } + while (--ll >= 0) + *lp++ = ' '; +#ifndef NO_OVERWRITE + if (lp0) { + memmove(lp0, lp1, L); + free(lp1); + } +#endif +} + + +/* compare two strings */ + +#ifdef KR_headers +integer +s_cmp(a0, b0, la, lb) +char *a0, *b0; +ftnlen la, lb; +#else +integer +s_cmp(char *a0, char *b0, ftnlen la, ftnlen lb) +#endif +{ + register unsigned char *a, *aend, *b, *bend; + a = (unsigned char *) a0; + b = (unsigned char *) b0; + aend = a + la; + bend = b + lb; + + if (la <= lb) { + while (a < aend) + if (*a != *b) + return (*a - *b); + else { + ++a; + ++b; + } + + while (b < bend) + if (*b != ' ') + return (' ' - *b); + else + ++b; + } + + else { + while (b < bend) + if (*a == *b) { + ++a; + ++b; + } + else + return (*a - *b); + while (a < aend) + if (*a != ' ') + return (*a - ' '); + else + ++a; + } + return (0); +} + +/* Unless compiled with -DNO_OVERWRITE, this variant of s_copy allows the + * target of an assignment to appear on its right-hand side (contrary + * to the Fortran 77 Standard, but in accordance with Fortran 90), + * as in a(2:5) = a(4:7) . + */ + + + +/* assign strings: a = b */ + +#ifdef KR_headers +VOID +s_copy(a, b, la, lb) +register char *a, *b; +ftnlen la, lb; +#else +void +s_copy(register char *a, register char *b, ftnlen la, ftnlen lb) +#endif +{ + register char *aend, *bend; + + aend = a + la; + + if (la <= lb) +#ifndef NO_OVERWRITE + if (a <= b || a >= b + la) +#endif + while (a < aend) + *a++ = *b++; +#ifndef NO_OVERWRITE + else + for (b += la; a < aend;) + *--aend = *--b; +#endif + + else { + bend = b + lb; +#ifndef NO_OVERWRITE + if (a <= b || a >= bend) +#endif + while (b < bend) + *a++ = *b++; +#ifndef NO_OVERWRITE + else { + a += lb; + while (b < bend) + *--a = *--bend; + a += lb; + } +#endif + while (a < aend) + *a++ = ' '; + } +} + + +#ifdef KR_headers +float f__cabs(); +float +z_abs(z) +complex *z; +#else +float f__cabs(float, float); +float +z_abs(complex * z) +#endif +{ + return (f__cabs(z->r, z->i)); +} + + +#ifdef KR_headers +extern void sig_die(); +VOID +z_div(c, a, b) +complex *a, *b, *c; +#else +extern void sig_die(char *, int); +void +z_div(complex * c, complex * a, complex * b) +#endif +{ + float ratio, den; + float abr, abi; + + if ((abr = b->r) < 0.) + abr = -abr; + if ((abi = b->i) < 0.) + abi = -abi; + if (abr <= abi) { + /*Let IEEE Infinties handle this ;( */ + /*if(abi == 0) + sig_die("complex division by zero", 1); */ + ratio = b->r / b->i; + den = b->i * (1 + ratio * ratio); + c->r = (a->r * ratio + a->i) / den; + c->i = (a->i * ratio - a->r) / den; + } + + else { + ratio = b->i / b->r; + den = b->r * (1 + ratio * ratio); + c->r = (a->r + a->i * ratio) / den; + c->i = (a->i - a->r * ratio) / den; + } + +} + + +#ifdef KR_headers +double sqrt(); +double f__cabs(); +VOID +z_sqrt(r, z) +complex *r, *z; +#else +#undef abs + +extern float f__cabs(float, float); +void +z_sqrt(complex * r, complex * z) +#endif +{ + float mag; + + if ((mag = f__cabs(z->r, z->i)) == 0.) + r->r = r->i = 0.; + else if (z->r > 0) { + r->r = sqrt(0.5 * (mag + z->r)); + r->i = z->i / r->r / 2; + } + else { + r->i = sqrt(0.5 * (mag - z->r)); + if (z->i < 0) + r->i = -r->i; + r->r = z->i / r->i / 2; + } +} + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers + integer pow_ii(ap, bp) integer *ap, *bp; +#else + integer pow_ii(integer * ap, integer * bp) +#endif + { + integer pow, x, n; + unsigned long u; + + x = *ap; + n = *bp; + + if (n <= 0) { + if (n == 0 || x == 1) + return 1; + if (x != -1) + return x != 0 ? 1 / x : 0; + n = -n; + } u = n; + for (pow = 1;;) { + if (u & 01) + pow *= x; + if (u >>= 1) + x *= x; + else + break; + } + return (pow); + } +#ifdef __cplusplus +} +#endif + +#ifdef KR_headers +extern void f_exit(); +VOID +s_stop(s, n) +char *s; +ftnlen n; +#else +#undef abs +#undef min +#undef max +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus + extern "C" { +#endif + void f_exit(void); + + int s_stop(char *s, ftnlen n) +#endif + { + int i; + + if (n > 0) { + fprintf(stderr, "STOP "); + for (i = 0; i < n; ++i) + putc(*s++, stderr); + fprintf(stderr, " statement executed\n"); + } +#ifdef NO_ONEXIT + f_exit(); +#endif + exit(0); + +/* We cannot avoid (useless) compiler diagnostics here: */ +/* some compilers complain if there is no return statement, */ +/* and others complain that this one cannot be reached. */ + + return 0; /* NOT REACHED */ + } +#ifdef __cplusplus + } +#endif +#ifdef __cplusplus +} +#endif diff --git a/src/util/filename.c b/src/util/filename.c new file mode 100644 index 0000000..f9e3459 --- /dev/null +++ b/src/util/filename.c @@ -0,0 +1,120 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * filename.c -- File and path name operations. + */ + +#include +#include +#include +#include + +#include "util/filename.h" + +#ifdef _MSC_VER +#pragma warning (disable: 4996) +#endif + +const char * +path2basename(const char *path) +{ + const char *result; + +#if defined(_WIN32) || defined(__CYGWIN__) + result = strrchr(path, '\\'); +#else + result = strrchr(path, '/'); +#endif + + return (result == NULL ? path : result + 1); +} + +/* Return all leading pathname components */ +void +path2dirname(const char *path, char *dir) +{ + size_t i, l; + + l = strlen(path); +#if defined(_WIN32) || defined(__CYGWIN__) + for (i = l - 1; (i > 0) && !(path[i] == '/' || path[i] == '\\'); --i); +#else + for (i = l - 1; (i > 0) && !(path[i] == '/'); --i); +#endif + if (i == 0) { + dir[0] = '.'; + dir[1] = '\0'; + } else { + memcpy(dir, path, i); + dir[i] = '\0'; + } +} + + +/* Strip off the shortest trailing .xyz suffix */ +void +strip_fileext(const char *path, char *root) +{ + size_t i, l; + + l = strlen(path); + for (i = l - 1; (i > 0) && (path[i] != '.'); --i); + if (i == 0) { + strcpy(root, path); /* Didn't find a . */ + } else { + strncpy(root, path, i); + } +} + +/* Test if this path is absolute. */ +int +path_is_absolute(const char *path) +{ +#if defined(_WIN32) && !defined(_WIN32_WCE) /* FIXME: Also SymbianOS */ + return /* Starts with drive letter : \ or / */ + (strlen(path) >= 3 + && + ((path[0] >= 'A' && path[0] <= 'Z') + || (path[0] >= 'a' && path[0] <= 'z')) + && path[1] == ':' + && (path[2] == '/' || path[2] == '\\')); +#elif defined(_WIN32_WCE) + return path[0] == '\\' || path[0] == '/'; +#else /* Assume Unix */ + return path[0] == '/'; +#endif +} diff --git a/src/util/filename.h b/src/util/filename.h new file mode 100644 index 0000000..e06ecda --- /dev/null +++ b/src/util/filename.h @@ -0,0 +1,108 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * filename.h -- File and path name operations. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: filename.h,v $ + * Revision 1.7 2005/06/22 03:01:07 arthchan2003 + * Added keyword + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 30-Oct-1997 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. + * Started. + */ + + +#ifndef _LIBUTIL_FILENAME_H_ +#define _LIBUTIL_FILENAME_H_ + +#include +#include + +/**\file filename.h + *\brief File names related operation + */ +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Returns the last part of the path, without modifying anything in memory. + */ +const char *path2basename(const char *path); + +/** + * Strip off filename from the given path and copy the directory name into dir + * Caller must have allocated dir (hint: it's always shorter than path). + */ +POCKETSPHINX_EXPORT +void path2dirname(const char *path, char *dir); + + +/** + * Strip off the smallest trailing file-extension suffix and copy + * the rest into the given root argument. Caller must have + * allocated root. + */ +void strip_fileext(const char *file, char *root); + +/** + * Test whether a pathname is absolute for the current OS. + */ +int path_is_absolute(const char *file); + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/src/util/fortran.py b/src/util/fortran.py new file mode 100644 index 0000000..679256a --- /dev/null +++ b/src/util/fortran.py @@ -0,0 +1,114 @@ +import re +import itertools + +def isBlank(line): + return not line +def isLabel(line): + return line[0].isdigit() +def isComment(line): + return line[0] != ' ' +def isContinuation(line): + return line[5] != ' ' + +COMMENT, STATEMENT, CONTINUATION = 0, 1, 2 +def lineType(line): + """Return the type of a line of Fortran code.""" + if isBlank(line): + return COMMENT + elif isLabel(line): + return STATEMENT + elif isComment(line): + return COMMENT + elif isContinuation(line): + return CONTINUATION + else: + return STATEMENT + +class LineIterator(object): + """LineIterator(iterable) + + Return rstrip()'d lines from iterable, while keeping a count of the + line number in the .lineno attribute. + """ + def __init__(self, iterable): + object.__init__(self) + self.iterable = iter(iterable) + self.lineno = 0 + def __iter__(self): + return self + def next(self): + self.lineno += 1 + line = self.iterable.next() + line = line.rstrip() + return line + +class PushbackIterator(object): + """PushbackIterator(iterable) + + Return an iterator for which items can be pushed back into. + Call the .pushback(item) method to have item returned as the next + value of .next(). + """ + def __init__(self, iterable): + object.__init__(self) + self.iterable = iter(iterable) + self.buffer = [] + + def __iter__(self): + return self + + def next(self): + if self.buffer: + return self.buffer.pop() + else: + return self.iterable.next() + + def pushback(self, item): + self.buffer.append(item) + +def fortranSourceLines(fo): + """Return an iterator over statement lines of a Fortran source file. + + Comment and blank lines are stripped out, and continuation lines are + merged. + """ + numberingiter = LineIterator(fo) + # add an extra '' at the end + with_extra = itertools.chain(numberingiter, ['']) + pushbackiter = PushbackIterator(with_extra) + for line in pushbackiter: + t = lineType(line) + if t == COMMENT: + continue + elif t == STATEMENT: + lines = [line] + # this is where we need the extra '', so we don't finish reading + # the iterator when we don't want to handle that + for next_line in pushbackiter: + t = lineType(next_line) + if t == CONTINUATION: + lines.append(next_line[6:]) + else: + pushbackiter.pushback(next_line) + break + yield numberingiter.lineno, ''.join(lines) + else: + raise ValueError("jammed: continuation line not expected: %s:%d" % + (fo.name, numberingiter.lineno)) + +def getDependencies(filename): + """For a Fortran source file, return a list of routines declared as EXTERNAL + in it. + """ + fo = open(filename) + external_pat = re.compile(r'^\s*EXTERNAL\s', re.I) + routines = [] + for lineno, line in fortranSourceLines(fo): + m = external_pat.match(line) + if m: + names = line = line[m.end():].strip().split(',') + names = [n.strip().lower() for n in names] + names = [n for n in names if n] + routines.extend(names) + fo.close() + return routines diff --git a/src/util/genrand.c b/src/util/genrand.c new file mode 100644 index 0000000..e0593a2 --- /dev/null +++ b/src/util/genrand.c @@ -0,0 +1,198 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + A C-program for MT19937, with initialization improved 2002/1/26. + Coded by Takuji Nishimura and Makoto Matsumoto. + + Before using, initialize the state by using init_genrand(seed) + or init_by_array(init_key, key_length). + + Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright +` notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. The names of its contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + Any feedback is very welcome. + http://www.math.keio.ac.jp/matumoto/emt.html + email: matumoto@math.keio.ac.jp +*/ + +#include + +#include "util/genrand.h" + +/* Period parameters */ +#define N 624 +#define M 397 +#define MATRIX_A 0x9908b0dfUL /* constant vector a */ +#define UPPER_MASK 0x80000000UL /* most significant w-r bits */ +#define LOWER_MASK 0x7fffffffUL /* least significant r bits */ + +void init_genrand(unsigned long s); + +void +genrand_seed(unsigned long s) +{ + init_genrand(s); +} + + +static unsigned long mt[N]; /* the array for the state vector */ +static int mti = N + 1; /* mti==N+1 means mt[N] is not initialized */ + +/* initializes mt[N] with a seed */ +void +init_genrand(unsigned long s) +{ + mt[0] = s & 0xffffffffUL; + for (mti = 1; mti < N; mti++) { + mt[mti] = + (1812433253UL * (mt[mti - 1] ^ (mt[mti - 1] >> 30)) + mti); + /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ + /* In the previous versions, MSBs of the seed affect */ + /* only MSBs of the array mt[]. */ + /* 2002/01/09 modified by Makoto Matsumoto */ + mt[mti] &= 0xffffffffUL; + /* for >32 bit machines */ + } +} + +/* generates a random number on [0,0xffffffff]-interval */ +unsigned long +genrand_int32(void) +{ + unsigned long y; + static unsigned long mag01[2] = { 0x0UL, MATRIX_A }; + /* mag01[x] = x * MATRIX_A for x=0,1 */ + + if (mti >= N) { /* generate N words at one time */ + int kk; + + if (mti == N + 1) /* if init_genrand() has not been called, */ + init_genrand(5489UL); /* a default initial seed is used */ + + for (kk = 0; kk < N - M; kk++) { + y = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK); + mt[kk] = mt[kk + M] ^ (y >> 1) ^ mag01[y & 0x1UL]; + } + for (; kk < N - 1; kk++) { + y = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK); + mt[kk] = mt[kk + (M - N)] ^ (y >> 1) ^ mag01[y & 0x1UL]; + } + y = (mt[N - 1] & UPPER_MASK) | (mt[0] & LOWER_MASK); + mt[N - 1] = mt[M - 1] ^ (y >> 1) ^ mag01[y & 0x1UL]; + + mti = 0; + } + + y = mt[mti++]; + + /* Tempering */ + y ^= (y >> 11); + y ^= (y << 7) & 0x9d2c5680UL; + y ^= (y << 15) & 0xefc60000UL; + y ^= (y >> 18); + + return y; +} + +/* generates a random number on [0,0x7fffffff]-interval */ +long +genrand_int31(void) +{ + return (long) (genrand_int32() >> 1); +} + +/* generates a random number on [0,1]-real-interval */ +double +genrand_real1(void) +{ + return genrand_int32() * (1.0 / 4294967295.0); + /* divided by 2^32-1 */ +} + +/* generates a random number on [0,1)-real-interval */ +double +genrand_real2(void) +{ + return genrand_int32() * (1.0 / 4294967296.0); + /* divided by 2^32 */ +} + +/* generates a random number on (0,1)-real-interval */ +double +genrand_real3(void) +{ + return (((double) genrand_int32()) + 0.5) * (1.0 / 4294967296.0); + /* divided by 2^32 */ +} + +/* generates a random number on [0,1) with 53-bit resolution*/ +double +genrand_res53(void) +{ + unsigned long a = genrand_int32() >> 5, b = genrand_int32() >> 6; + return (a * 67108864.0 + b) * (1.0 / 9007199254740992.0); +} + +/* These real versions are due to Isaku Wada, 2002/01/09 added */ diff --git a/src/util/genrand.h b/src/util/genrand.h new file mode 100644 index 0000000..b29d299 --- /dev/null +++ b/src/util/genrand.h @@ -0,0 +1,170 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* + A C-program for MT19937, with initialization improved 2002/1/26. + Coded by Takuji Nishimura and Makoto Matsumoto. + + Before using, initialize the state by using init_genrand(seed) + or init_by_array(init_key, key_length). + + Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright +` notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. The names of its contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + Any feedback is very welcome. + http://www.math.keio.ac.jp/matumoto/emt.html + email: matumoto@math.keio.ac.jp +*/ + +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * randgen.c : a portable random generator + * + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: genrand.h,v $ + * Revision 1.3 2005/06/22 03:01:50 arthchan2003 + * Added keyword + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 18-Nov-04 ARCHAN (archan@cs.cmu.edu) at Carnegie Mellon University + * First incorporated from the Mersenne Twister Random + * Number Generator package. It was chosen because it is + * in BSD-license and its performance is quite + * reasonable. Of course if you look at the inventors's + * page. This random generator can actually gives + * 19937-bits period. This is already far from we need. + * This will possibly good enough for the next 10 years. + * + * I also downgrade the code a little bit to avoid Sphinx's + * developers misused it. + */ + +#ifndef _LIBUTIL_GENRAND_H_ +#define _LIBUTIL_GENRAND_H_ + +#define S3_RAND_MAX_INT32 0x7fffffff +#include + +/** \file genrand.h + *\brief High performance prortable random generator created by Takuji + *Nishimura and Makoto Matsumoto. + * + * A high performance which applied Mersene twister primes to generate + * random number. If probably seeded, the random generator can achieve + * 19937-bits period. For technical detail. Please take a look at + * (FIXME! Need to search for the web site.) http://www. + */ +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Macros to simplify calling of random generator function. + * + */ +#define s3_rand_seed(s) genrand_seed(s); +#define s3_rand_int31() genrand_int31() +#define s3_rand_real() genrand_real3() +#define s3_rand_res53() genrand_res53() + +/** + *Initialize the seed of the random generator. + */ +void genrand_seed(unsigned long s); + +/** + *generates a random number on [0,0x7fffffff]-interval + */ +long genrand_int31(void); + +/** + *generates a random number on (0,1)-real-interval + */ +double genrand_real3(void); + +/** + *generates a random number on [0,1) with 53-bit resolution + */ +double genrand_res53(void); + +#ifdef __cplusplus +} +#endif + +#endif /*_LIBUTIL_GENRAND_H_*/ diff --git a/src/util/glist.c b/src/util/glist.c new file mode 100644 index 0000000..f908184 --- /dev/null +++ b/src/util/glist.c @@ -0,0 +1,271 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * glist.h -- Module for maintaining a generic, linear linked-list structure. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: glist.c,v $ + * Revision 1.8 2005/06/22 03:02:51 arthchan2003 + * 1, Fixed doxygen documentation, 2, add keyword. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 09-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added glist_chkdup_*(). + * + * 13-Feb-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created from earlier version. + */ + + +#include +#include +#include +#include + +#include "util/glist.h" +#include "util/ckd_alloc.h" + + +glist_t +glist_add_ptr(glist_t g, void *ptr) +{ + gnode_t *gn; + + gn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + gn->data.ptr = ptr; + gn->next = g; + return ((glist_t) gn); /* Return the new head of the list */ +} + + +glist_t +glist_add_int32(glist_t g, int32 val) +{ + gnode_t *gn; + + gn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + gn->data.i = (long)val; + gn->next = g; + return ((glist_t) gn); /* Return the new head of the list */ +} + + +glist_t +glist_add_uint32(glist_t g, uint32 val) +{ + gnode_t *gn; + + gn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + gn->data.ui = (unsigned long)val; + gn->next = g; + return ((glist_t) gn); /* Return the new head of the list */ +} + + +glist_t +glist_add_float32(glist_t g, float32 val) +{ + gnode_t *gn; + + gn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + gn->data.fl = (double)val; + gn->next = g; + return ((glist_t) gn); /* Return the new head of the list */ +} + + +glist_t +glist_add_float64(glist_t g, float64 val) +{ + gnode_t *gn; + + gn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + gn->data.fl = (double)val; + gn->next = g; + return ((glist_t) gn); /* Return the new head of the list */ +} + +void +glist_free(glist_t g) +{ + gnode_t *gn; + + while (g) { + gn = g; + g = gn->next; + ckd_free((void *) gn); + } +} + +int32 +glist_count(glist_t g) +{ + gnode_t *gn; + int32 n; + + for (gn = g, n = 0; gn; gn = gn->next, n++); + return n; +} + + +gnode_t * +glist_tail(glist_t g) +{ + gnode_t *gn; + + if (!g) + return NULL; + + for (gn = g; gn->next; gn = gn->next); + return gn; +} + + +glist_t +glist_reverse(glist_t g) +{ + gnode_t *gn, *nextgn; + gnode_t *rev; + + rev = NULL; + for (gn = g; gn; gn = nextgn) { + nextgn = gn->next; + + gn->next = rev; + rev = gn; + } + + return rev; +} + + +gnode_t * +glist_insert_ptr(gnode_t * gn, void *ptr) +{ + gnode_t *newgn; + + newgn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + newgn->data.ptr = ptr; + newgn->next = gn->next; + gn->next = newgn; + + return newgn; +} + + +gnode_t * +glist_insert_int32(gnode_t * gn, int32 val) +{ + gnode_t *newgn; + + newgn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + newgn->data.i = val; + newgn->next = gn->next; + gn->next = newgn; + + return newgn; +} + + +gnode_t * +glist_insert_uint32(gnode_t * gn, uint32 val) +{ + gnode_t *newgn; + + newgn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + newgn->data.ui = val; + newgn->next = gn->next; + + gn->next = newgn; + + return newgn; +} + + +gnode_t * +glist_insert_float32(gnode_t * gn, float32 val) +{ + gnode_t *newgn; + + newgn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + newgn->data.fl = (double)val; + newgn->next = gn->next; + gn->next = newgn; + + return newgn; +} + + +gnode_t * +glist_insert_float64(gnode_t * gn, float64 val) +{ + gnode_t *newgn; + + newgn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + newgn->data.fl = (double)val; + newgn->next = gn->next; + gn->next = newgn; + + return newgn; +} + +gnode_t * +gnode_free(gnode_t * gn, gnode_t * pred) +{ + gnode_t *next; + + next = gn->next; + if (pred) { + assert(pred->next == gn); + + pred->next = next; + } + + ckd_free((char *) gn); + + return next; +} diff --git a/src/util/glist.h b/src/util/glist.h new file mode 100644 index 0000000..1703ee1 --- /dev/null +++ b/src/util/glist.h @@ -0,0 +1,226 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * glist.h -- Module for maintaining a generic, linear linked-list structure. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: glist.h,v $ + * Revision 1.9 2005/06/22 03:02:51 arthchan2003 + * 1, Fixed doxygen documentation, 2, add keyword. + * + * Revision 1.4 2005/05/03 04:09:11 archan + * Implemented the heart of word copy search. For every ci-phone, every word end, a tree will be allocated to preserve its pathscore. This is different from 3.5 or below, only the best score for a particular ci-phone, regardless of the word-ends will be preserved at every frame. The graph propagation will not collect unused word tree at this point. srch_WST_propagate_wd_lv2 is also as the most stupid in the century. But well, after all, everything needs a start. I will then really get the results from the search and see how it looks. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 09-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added glist_chkdup_*(). + * + * 13-Feb-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created from earlier version. + */ + + +/** + * \file glist.h + * \brief Generic linked-lists maintenance. + * + * Only insert at the head of the list. A convenient little + * linked-list package, but a double-edged sword: the user must keep + * track of the data type within the linked list elements. When it + * was first written, there was no selective deletions except to + * destroy the entire list. This is modified in later version. + * + * + * (C++ would be good for this, but that's a double-edged sword as well.) + */ + + +#ifndef _LIBUTIL_GLIST_H_ +#define _LIBUTIL_GLIST_H_ + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** A node in a generic list + */ +typedef struct gnode_s { + anytype_t data; /** See prim_type.h */ + struct gnode_s *next; /** Next node in list */ +} gnode_t; +typedef gnode_t *glist_t; /** Head of a list of gnodes */ + + +/** Access macros, for convenience + */ +#define gnode_ptr(g) ((g)->data.ptr) +#define gnode_int32(g) ((g)->data.i) +#define gnode_uint32(g) ((g)->data.ui) +#define gnode_float32(g) ((float32)(g)->data.fl) +#define gnode_float64(g) ((g)->data.fl) +#define gnode_next(g) ((g)->next) + + +/** + * Create and prepend a new list node, with the given user-defined data, at the HEAD + * of the given generic list. Return the new list thus formed. + * g may be NULL to indicate an initially empty list. + */ +glist_t glist_add_ptr (glist_t g, /**< a link list */ + void *ptr /**< a pointer */ + ); + +/** + * Create and prepend a new list node containing an integer. + */ +glist_t glist_add_int32 (glist_t g, /**< a link list */ + int32 val /**< an integer value */ + ); +/** + * Create and prepend a new list node containing an unsigned integer. + */ +glist_t glist_add_uint32 (glist_t g, /**< a link list */ + uint32 val /**< an unsigned integer value */ + ); +/** + * Create and prepend a new list node containing a single-precision float. + */ +glist_t glist_add_float32 (glist_t g, /**< a link list */ + float32 val /**< a float32 value */ + ); +/** + * Create and prepend a new list node containing a double-precision float. + */ +glist_t glist_add_float64 (glist_t g, /**< a link list */ + float64 val /**< a float64 value */ + ); + + + +/** + * Create and insert a new list node, with the given user-defined data, after + * the given generic node gn. gn cannot be NULL. + * Return ptr to the newly created gnode_t. + */ +gnode_t *glist_insert_ptr (gnode_t *gn, /**< a generic node which ptr will be inserted after it*/ + void *ptr /**< pointer inserted */ + ); +/** + * Create and insert a new list node containing an integer. + */ +gnode_t *glist_insert_int32 (gnode_t *gn, /**< a generic node which a value will be inserted after it*/ + int32 val /**< int32 inserted */ + ); +/** + * Create and insert a new list node containing an unsigned integer. + */ +gnode_t *glist_insert_uint32 (gnode_t *gn, /**< a generic node which a value will be inserted after it*/ + uint32 val /**< uint32 inserted */ + ); +/** + * Create and insert a new list node containing a single-precision float. + */ +gnode_t *glist_insert_float32 (gnode_t *gn, /**< a generic node which a value will be inserted after it*/ + float32 val /**< float32 inserted */ + ); +/** + * Create and insert a new list node containing a double-precision float. + */ +gnode_t *glist_insert_float64 (gnode_t *gn, /**< a generic node which a value will be inserted after it*/ + float64 val /**< float64 inserted */ + ); + +/** + * Reverse the order of the given glist. (glist_add() adds to the head; one might + * ultimately want the reverse of that.) + * NOTE: The list is reversed "in place"; i.e., no new memory is allocated. + * @return: The head of the new list. + */ +glist_t glist_reverse (glist_t g /**< input link list */ + ); + + +/** + Count the number of element in a given link list + @return the number of elements in the given glist_t +*/ +int32 glist_count (glist_t g /**< input link list */ + ); + +/** + * Free the given generic list; user-defined data contained within is not + * automatically freed. The caller must have done that already. + */ +void glist_free (glist_t g); + + +/** + * Free the given node, gn, of a glist, pred being its predecessor in the list. + * Return ptr to the next node in the list after the freed node. + */ +gnode_t *gnode_free(gnode_t *gn, + gnode_t *pred + ); + +/** + * Return the last node in the given list. + */ +gnode_t *glist_tail (glist_t g); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/util/hash_table.c b/src/util/hash_table.c new file mode 100644 index 0000000..f120dd6 --- /dev/null +++ b/src/util/hash_table.c @@ -0,0 +1,707 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * hash.c -- Hash table module. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: hash.c,v $ + * Revision 1.5 2005/06/22 03:04:01 arthchan2003 + * 1, Implemented hash_delete and hash_display, 2, Fixed doxygen documentation, 3, Added keyword. + * + * Revision 1.9 2005/05/25 06:17:53 archan + * Delete the test code in cmd_ln.c and fixed platform specific code of hash.c + * + * Revision 1.8 2005/05/24 01:10:54 archan + * Fix a bug when the value only appear in the hash but there is no chain. Also make sure that prev was initialized to NULL. All success cases were tested, but not tested with the deletion is tested. + * + * Revision 1.6 2005/05/24 00:00:45 archan + * Added basic functionalities to hash_t: 1, display and 2, delete a key from a hash. \n + * + * Revision 1.5 2005/05/11 07:01:38 archan + * Added comments on the usage of the current implementation of hash tables. + * + * Revision 1.4 2005/05/03 04:09:11 archan + * Implemented the heart of word copy search. For every ci-phone, every word end, a tree will be allocated to preserve its pathscore. This is different from 3.5 or below, only the best score for a particular ci-phone, regardless of the word-ends will be preserved at every frame. The graph propagation will not collect unused word tree at this point. srch_WST_propagate_wd_lv2 is also as the most stupid in the century. But well, after all, everything needs a start. I will then really get the results from the search and see how it looks. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 05-May-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Removed hash_key2hash(). Added hash_enter_bkey() and hash_lookup_bkey(), + * and len attribute to hash_entry_t. + * + * 30-Apr-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Added hash_key2hash(). + * + * 18-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Included case sensitive/insensitive option. Removed local, static + * maintenance of all hash tables. + * + * 31-Jul-95 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Created. + */ + + +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning (disable: 4018) +#endif + +#include + +#include "util/hash_table.h" +#include "util/ckd_alloc.h" +#include "util/case.h" + + +#if 0 +static void +prime_sieve(int32 max) +{ + char *notprime; + int32 p, pp; + + notprime = (char *) ckd_calloc(max + 1, 1); + p = 2; + for (;;) { + printf("%d\n", p); + for (pp = p + p; pp <= max; pp += p) + notprime[pp] = 1; + for (++p; (p <= max) && notprime[p]; p++); + if (p > max) + break; + } +} +#endif + + +/* + * HACK!! Initial hash table size is restricted by this set of primes. (Of course, + * collision resolution by chaining will accommodate more entries indefinitely, but + * efficiency will drop.) + */ +const int32 prime[] = { + 101, 211, 307, 401, 503, 601, 701, 809, 907, + 1009, 1201, 1601, 2003, 2411, 3001, 4001, 5003, 6007, 7001, 8009, + 9001, + 10007, 12007, 16001, 20011, 24001, 30011, 40009, 50021, 60013, + 70001, 80021, 90001, + 100003, 120011, 160001, 200003, 240007, 300007, 400009, 500009, + 600011, 700001, 800011, 900001, + -1 +}; + + +/** + * This function returns a very large prime. + */ +static int32 +prime_size(int32 size) +{ + int32 i; + + for (i = 0; (prime[i] > 0) && (prime[i] < size); i++); + if (prime[i] <= 0) { + E_WARN("Very large hash table requested (%d entries)\n", size); + --i; + } + return (prime[i]); +} + + +hash_table_t * +hash_table_new(int32 size, int32 casearg) +{ + hash_table_t *h; + + h = (hash_table_t *) ckd_calloc(1, sizeof(hash_table_t)); + h->size = prime_size(size + (size >> 1)); + h->nocase = (casearg == HASH_CASE_NO); + h->table = (hash_entry_t *) ckd_calloc(h->size, sizeof(hash_entry_t)); + /* The above calloc clears h->table[*].key and .next to NULL, i.e. an empty table */ + + return h; +} + + +/* + * Compute hash value for given key string. + * Somewhat tuned for English text word strings. + */ +static uint32 +key2hash(hash_table_t * h, const char *key) +{ + + register const char *cp; + + /* This is a hack because the best way to solve it is to make sure + all character representation is unsigned character in the first place. + (or better unicode.) */ + register unsigned char c; + register int32 s; + register uint32 hash; + + hash = 0; + s = 0; + + if (h->nocase) { + for (cp = key; *cp; cp++) { + c = *cp; + c = UPPER_CASE(c); + hash += c << s; + s += 5; + if (s >= 25) + s -= 24; + } + } + else { + for (cp = key; *cp; cp++) { + hash += (*cp) << s; + s += 5; + if (s >= 25) + s -= 24; + } + } + + return (hash % h->size); +} + + +static char * +makekey(uint8 * data, size_t len, char *key) +{ + size_t i, j; + + if (!key) + key = (char *) ckd_calloc(len * 2 + 1, sizeof(char)); + + for (i = 0, j = 0; i < len; i++, j += 2) { + key[j] = 'A' + (data[i] & 0x000f); + key[j + 1] = 'J' + ((data[i] >> 4) & 0x000f); + } + key[j] = '\0'; + + return key; +} + + +static int32 +keycmp_nocase(hash_entry_t * entry, const char *key) +{ + char c1, c2; + int32 i; + const char *str; + + str = entry->key; + for (i = 0; (uint32)i < entry->len; i++) { + c1 = *(str++); + c1 = UPPER_CASE(c1); + c2 = *(key++); + c2 = UPPER_CASE(c2); + if (c1 != c2) + return (c1 - c2); + } + + return 0; +} + + +static int32 +keycmp_case(hash_entry_t * entry, const char *key) +{ + char c1, c2; + int32 i; + const char *str; + + str = entry->key; + for (i = 0; (uint32)i < entry->len; i++) { + c1 = *(str++); + c2 = *(key++); + if (c1 != c2) + return (c1 - c2); + } + + return 0; +} + + +/* + * Lookup entry with hash-value hash in table h for given key + * Return value: hash_entry_t for key + */ +static hash_entry_t * +lookup(hash_table_t * h, uint32 hash, const char *key, size_t len) +{ + hash_entry_t *entry; + + entry = &(h->table[hash]); + if (entry->key == NULL) + return NULL; + + if (h->nocase) { + while (entry && ((entry->len != len) + || (keycmp_nocase(entry, key) != 0))) + entry = entry->next; + } + else { + while (entry && ((entry->len != len) + || (keycmp_case(entry, key) != 0))) + entry = entry->next; + } + + return entry; +} + + +int32 +hash_table_lookup(hash_table_t * h, const char *key, void ** val) +{ + hash_entry_t *entry; + uint32 hash; + size_t len; + + hash = key2hash(h, key); + len = strlen(key); + + entry = lookup(h, hash, key, len); + if (entry) { + if (val) + *val = entry->val; + return 0; + } + else + return -1; +} + +int32 +hash_table_lookup_int32(hash_table_t * h, const char *key, int32 *val) +{ + void *vval; + int32 rv; + + rv = hash_table_lookup(h, key, &vval); + if (rv != 0) + return rv; + if (val) + *val = (int32)(size_t)vval; + return 0; +} + + +int32 +hash_table_lookup_bkey(hash_table_t * h, const char *key, size_t len, void ** val) +{ + hash_entry_t *entry; + uint32 hash; + char *str; + + str = makekey((uint8 *) key, len, NULL); + hash = key2hash(h, str); + ckd_free(str); + + entry = lookup(h, hash, key, len); + if (entry) { + if (val) + *val = entry->val; + return 0; + } + else + return -1; +} + +int32 +hash_table_lookup_bkey_int32(hash_table_t * h, const char *key, size_t len, int32 *val) +{ + void *vval; + int32 rv; + + rv = hash_table_lookup_bkey(h, key, len, &vval); + if (rv != 0) + return rv; + if (val) + *val = (int32)(size_t)vval; + return 0; +} + + +static void * +enter(hash_table_t * h, uint32 hash, const char *key, size_t len, void *val, int32 replace) +{ + hash_entry_t *cur, *new; + + if ((cur = lookup(h, hash, key, len)) != NULL) { + void *oldval; + /* Key already exists. */ + oldval = cur->val; + if (replace) { + /* Replace the pointer if replacement is requested, + * because this might be a different instance of the same + * string (this verges on magic, sorry) */ + cur->key = key; + cur->val = val; + } + return oldval; + } + + cur = &(h->table[hash]); + if (cur->key == NULL) { + /* Empty slot at hashed location; add this entry */ + cur->key = key; + cur->len = len; + cur->val = val; + + /* Added by ARCHAN at 20050515. This allows deletion could work. */ + cur->next = NULL; + + } + else { + /* Key collision; create new entry and link to hashed location */ + new = (hash_entry_t *) ckd_calloc(1, sizeof(hash_entry_t)); + new->key = key; + new->len = len; + new->val = val; + new->next = cur->next; + cur->next = new; + } + ++h->inuse; + + return val; +} + +/* 20050523 Added by ARCHAN to delete a key from a hash table */ +static void * +delete(hash_table_t * h, uint32 hash, const char *key, size_t len) +{ + hash_entry_t *entry, *prev; + void *val; + + prev = NULL; + entry = &(h->table[hash]); + if (entry->key == NULL) + return NULL; + + if (h->nocase) { + while (entry && ((entry->len != len) + || (keycmp_nocase(entry, key) != 0))) { + prev = entry; + entry = entry->next; + } + } + else { + while (entry && ((entry->len != len) + || (keycmp_case(entry, key) != 0))) { + prev = entry; + entry = entry->next; + } + } + + if (entry == NULL) + return NULL; + + /* At this point, entry will be the one required to be deleted, prev + will contain the previous entry + */ + val = entry->val; + + if (prev == NULL) { + /* That is to say the entry in the hash table (not the chain) matched the key. */ + /* We will then copy the things from the next entry to the hash table */ + prev = entry; + if (entry->next) { /* There is a next entry, great, copy it. */ + entry = entry->next; + prev->key = entry->key; + prev->len = entry->len; + prev->val = entry->val; + prev->next = entry->next; + ckd_free(entry); + } + else { /* There is not a next entry, just set the key to null */ + prev->key = NULL; + prev->len = 0; + prev->next = NULL; + } + + } + else { /* This case is simple */ + prev->next = entry->next; + ckd_free(entry); + } + + /* Do wiring and free the entry */ + + --h->inuse; + + return val; +} + +void +hash_table_empty(hash_table_t *h) +{ + hash_entry_t *e, *e2; + int32 i; + + for (i = 0; i < h->size; i++) { + /* Free collision lists. */ + for (e = h->table[i].next; e; e = e2) { + e2 = e->next; + ckd_free((void *) e); + } + memset(&h->table[i], 0, sizeof(h->table[i])); + } + h->inuse = 0; +} + + +void * +hash_table_enter(hash_table_t * h, const char *key, void *val) +{ + uint32 hash; + size_t len; + + hash = key2hash(h, key); + len = strlen(key); + return (enter(h, hash, key, len, val, 0)); +} + +void * +hash_table_replace(hash_table_t * h, const char *key, void *val) +{ + uint32 hash; + size_t len; + + hash = key2hash(h, key); + len = strlen(key); + return (enter(h, hash, key, len, val, 1)); +} + +void * +hash_table_delete(hash_table_t * h, const char *key) +{ + uint32 hash; + size_t len; + + hash = key2hash(h, key); + len = strlen(key); + + return (delete(h, hash, key, len)); +} + +void * +hash_table_enter_bkey(hash_table_t * h, const char *key, size_t len, void *val) +{ + uint32 hash; + char *str; + + str = makekey((uint8 *) key, len, NULL); + hash = key2hash(h, str); + ckd_free(str); + + return (enter(h, hash, key, len, val, 0)); +} + +void * +hash_table_replace_bkey(hash_table_t * h, const char *key, size_t len, void *val) +{ + uint32 hash; + char *str; + + str = makekey((uint8 *) key, len, NULL); + hash = key2hash(h, str); + ckd_free(str); + + return (enter(h, hash, key, len, val, 1)); +} + +void * +hash_table_delete_bkey(hash_table_t * h, const char *key, size_t len) +{ + uint32 hash; + char *str; + + str = makekey((uint8 *) key, len, NULL); + hash = key2hash(h, str); + ckd_free(str); + + return (delete(h, hash, key, len)); +} + +void +hash_table_display(hash_table_t * h, int32 showdisplay) +{ + hash_entry_t *e; + int i, j; + j = 0; + + printf("Hash with chaining representation of the hash table\n"); + + for (i = 0; i < h->size; i++) { + e = &(h->table[i]); + if (e->key != NULL) { + printf("|key:"); + if (showdisplay) + printf("%s", e->key); + else + printf("%p", e->key); + + printf("|len:%zd|val=%zd|->", e->len, (size_t)e->val); + if (e->next == NULL) { + printf("NULL\n"); + } + j++; + + for (e = e->next; e; e = e->next) { + printf("|key:"); + if (showdisplay) + printf("%s", e->key); + + printf("|len:%zd|val=%zd|->", e->len, (size_t)e->val); + if (e->next == NULL) { + printf("NULL\n"); + } + j++; + } + } + } + + printf("The total number of keys =%d\n", j); +} + + +glist_t +hash_table_tolist(hash_table_t * h, int32 * count) +{ + glist_t g; + hash_entry_t *e; + int32 i, j; + + g = NULL; + + j = 0; + for (i = 0; i < h->size; i++) { + e = &(h->table[i]); + + if (e->key != NULL) { + g = glist_add_ptr(g, (void *) e); + j++; + + for (e = e->next; e; e = e->next) { + g = glist_add_ptr(g, (void *) e); + j++; + } + } + } + + if (count) + *count = j; + + return g; +} + +hash_iter_t * +hash_table_iter(hash_table_t *h) +{ + hash_iter_t *itor; + + itor = ckd_calloc(1, sizeof(*itor)); + itor->ht = h; + return hash_table_iter_next(itor); +} + +hash_iter_t * +hash_table_iter_next(hash_iter_t *itor) +{ + /* If there is an entry, walk down its list. */ + if (itor->ent) + itor->ent = itor->ent->next; + /* If we got to the end of the chain, or we had no entry, scan + * forward in the table to find the next non-empty bucket. */ + if (itor->ent == NULL) { + while (itor->idx < (size_t)itor->ht->size + && itor->ht->table[itor->idx].key == NULL) + ++itor->idx; + /* If we did not find one then delete the iterator and + * return NULL. */ + if (itor->idx == (size_t)itor->ht->size) { + hash_table_iter_free(itor); + return NULL; + } + /* Otherwise use this next entry. */ + itor->ent = itor->ht->table + itor->idx; + /* Increase idx for the next time around. */ + ++itor->idx; + } + return itor; +} + +void +hash_table_iter_free(hash_iter_t *itor) +{ + ckd_free(itor); +} + +void +hash_table_free(hash_table_t * h) +{ + hash_entry_t *e, *e2; + int32 i; + + if (h == NULL) + return; + + /* Free additional entries created for key collision cases */ + for (i = 0; i < h->size; i++) { + for (e = h->table[i].next; e; e = e2) { + e2 = e->next; + ckd_free((void *) e); + } + } + + ckd_free((void *) h->table); + ckd_free((void *) h); +} diff --git a/src/util/hash_table.h b/src/util/hash_table.h new file mode 100644 index 0000000..e0e9192 --- /dev/null +++ b/src/util/hash_table.h @@ -0,0 +1,424 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * hash.h -- Hash table module. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: hash.h,v $ + * Revision 1.7 2005/06/22 03:04:01 arthchan2003 + * 1, Implemented hash_delete and hash_display, 2, Fixed doxygen documentation, 3, Added keyword. + * + * Revision 1.8 2005/05/24 01:10:54 archan + * Fix a bug when the value only appear in the hash but there is no chain. Also make sure that prev was initialized to NULL. All success cases were tested, but not tested with the deletion is tested. + * + * Revision 1.7 2005/05/24 00:12:31 archan + * Also add function prototype for hash_display in hash.h + * + * Revision 1.4 2005/05/03 04:09:11 archan + * Implemented the heart of word copy search. For every ci-phone, every word end, a tree will be allocated to preserve its pathscore. This is different from 3.5 or below, only the best score for a particular ci-phone, regardless of the word-ends will be preserved at every frame. The graph propagation will not collect unused word tree at this point. srch_WST_propagate_wd_lv2 is also as the most stupid in the century. But well, after all, everything needs a start. I will then really get the results from the search and see how it looks. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 05-May-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Removed hash_key2hash(). Added hash_enter_bkey() and hash_lookup_bkey(), + * and len attribute to hash_entry_t. + * + * 30-Apr-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Added hash_key2hash(). + * + * 18-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Included case sensitive/insensitive option. + * + * 08-31-95 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Created. + */ + + +/** + * @file hash_table.h + * @brief Hash table implementation + * + * This hash tables are intended for associating a pointer/integer + * "value" with a char string "key", (e.g., an ID with a word string). + * Subsequently, one can retrieve the value by providing the string + * key. (The reverse functionality--obtaining the string given the + * value--is not provided with the hash table module.) + */ + +/** + * A note by ARCHAN at 20050510: Technically what we use is so-called + * "hash table with buckets" which is very nice way to deal with + * external hashing. There are definitely better ways to do internal + * hashing (i.e. when everything is stored in the memory.) In Sphinx + * 3, this is a reasonable practice because hash table is only used in + * lookup in initialization or in lookups which is not critical for + * speed. + */ + +/** + * Another note by ARCHAN at 20050703: To use this data structure + * properly, it is very important to realize that the users are + * required to handle memory allocation of the C-style keys. The hash + * table will not make a copy of the memory allocated for any of the + * C-style key. It will not allocate memory for it. It will not delete + * memory for it. As a result, the following code sniplet will cause + * memory leak. + * + * while (1){ + * str=(char*)ckd_calloc(str_length,sizeof(char*)) + * if(hash_enter(ht,str,id)!=id){ printf("fail to add key str %s with val id %d\n",str,id)} + * } + * + */ + +/** + * A note by dhuggins on 20061010: Changed this to use void * instead + * of int32 as the value type, so that arbitrary objects can be + * inserted into a hash table (in a way that won't crash on 64-bit + * machines ;) + */ + +#ifndef _LIBUTIL_HASH_H_ +#define _LIBUTIL_HASH_H_ + +#include + +#include "util/glist.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * The hash table structures. + * Each hash table is identified by a hash_table_t structure. hash_table_t.table is + * pre-allocated for a user-controlled max size, and is initially empty. As new + * entries are created (using hash_enter()), the empty entries get filled. If multiple + * keys hash to the same entry, new entries are allocated and linked together in a + * linear list. + */ + +typedef struct hash_entry_s { + const char *key; /** Key string, NULL if this is an empty slot. + NOTE that the key must not be changed once the entry + has been made. */ + size_t len; /** Key-length; the key string does not have to be a C-style NULL + terminated string; it can have arbitrary binary bytes */ + void *val; /** Value associated with above key */ + struct hash_entry_s *next; /** For collision resolution */ +} hash_entry_t; + +typedef struct hash_table_s { + hash_entry_t *table; /**Primary hash table, excluding entries that collide */ + int32 size; /** Primary hash table size, (is a prime#); NOTE: This is the + number of primary entries ALLOCATED, NOT the number of valid + entries in the table */ + int32 inuse; /** Number of valid entries in the table. */ + int32 nocase; /** Whether case insensitive for key comparisons */ +} hash_table_t; + +typedef struct hash_iter_s { + hash_table_t *ht; /**< Hash table we are iterating over. */ + hash_entry_t *ent; /**< Current entry in that table. */ + size_t idx; /**< Index of next bucket to search. */ +} hash_iter_t; + +/** Access macros */ +#define hash_entry_val(e) ((e)->val) +#define hash_entry_key(e) ((e)->key) +#define hash_entry_len(e) ((e)->len) +#define hash_table_inuse(h) ((h)->inuse) +#define hash_table_size(h) ((h)->size) + + +/** + * Allocate a new hash table for a given expected size. + * + * @note Case sensitivity of hash keys applies to 7-bit ASCII + * characters only, and is not locale-dependent. + * + * @return handle to allocated hash table. + */ +hash_table_t * hash_table_new(int32 size, /**< In: Expected number of entries in the table */ + int32 casearg /**< In: Whether case insensitive for key + comparisons. When 1, case is insentitive, + 0, case is sensitive. */ + ); + +#define HASH_CASE_YES 0 +#define HASH_CASE_NO 1 + +/** + * Free the specified hash table; the caller is responsible for freeing the key strings + * pointed to by the table entries. + */ +void hash_table_free(hash_table_t *h /**< In: Handle of hash table to free */ + ); + + +/** + * Try to add a new entry with given key and associated value to hash table h. If key doesn't + * already exist in hash table, the addition is successful, and the return value is val. But + * if key already exists, return its existing associated value. (The hash table is unchanged; + * it is up to the caller to resolve the conflict.) + */ +void *hash_table_enter(hash_table_t *h, /**< In: Handle of hash table in which to create entry */ + const char *key, /**< In: C-style NULL-terminated key string + for the new entry */ + void *val /**< In: Value to be associated with above key */ + ); + +/** + * Add a 32-bit integer value to a hash table. + * + * This macro is the clean way to do this and avoid compiler warnings + * on 64-bit platforms. + */ +#define hash_table_enter_int32(h,k,v) \ + ((int32)(size_t)hash_table_enter((h),(k),(void *)(size_t)(v))) + +/** + * Add a new entry with given key and value to hash table h. If the + * key already exists, its value is replaced with the given value, and + * the previous value is returned, otherwise val is returned. + * + * A very important but subtle point: The key pointer in the hash + * table is replaced with the pointer passed to this function. + * In general you should always pass a pointer to hash_table_enter() + * whose lifetime matches or exceeds that of the hash table. In some + * rare cases it is convenient to initially enter a value with a + * short-lived key, then later replace that with a long-lived one. + * This behaviour allows this to happen. + */ +void *hash_table_replace(hash_table_t *h, /**< In: Handle of hash table in which to create entry */ + const char *key, /**< In: C-style NULL-terminated key string + for the new entry */ + void *val /**< In: Value to be associated with above key */ + ); + +/** + * Replace a 32-bit integer value in a hash table. + * + * This macro is the clean way to do this and avoid compiler warnings + * on 64-bit platforms. + */ +#define hash_table_replace_int32(h,k,v) \ + ((int32)(long)hash_table_replace((h),(k),(void *)(long)(v))) + +/** + * Delete an entry with given key and associated value to hash table + * h. Return the value associated with the key (NULL if it did not exist) + */ + +void *hash_table_delete(hash_table_t *h, /**< In: Handle of hash table in + which a key will be deleted */ + const char *key /**< In: C-style NULL-terminated + key string for the new entry */ + ); + +/** + * Like hash_table_delete, but with an explicitly specified key length, + * instead of a NULL-terminated, C-style key string. So the key + * string is a binary key (or bkey). Hash tables containing such keys + * should be created with the HASH_CASE_YES option. Otherwise, the + * results are unpredictable. + */ +void *hash_table_delete_bkey(hash_table_t *h, /**< In: Handle of hash table in + which a key will be deleted */ + const char *key, /**< In: C-style NULL-terminated + key string for the new entry */ + size_t len + ); + +/** + * Delete all entries from a hash_table. + */ +void hash_table_empty(hash_table_t *h /**< In: Handle of hash table */ + ); + +/** + * Like hash_table_enter, but with an explicitly specified key length, + * instead of a NULL-terminated, C-style key string. So the key + * string is a binary key (or bkey). Hash tables containing such keys + * should be created with the HASH_CASE_YES option. Otherwise, the + * results are unpredictable. + */ +void *hash_table_enter_bkey(hash_table_t *h, /**< In: Handle of hash table + in which to create entry */ + const char *key, /**< In: Key buffer */ + size_t len, /**< In: Length of above key buffer */ + void *val /**< In: Value to be associated with above key */ + ); + +/** + * Enter a 32-bit integer value in a hash table. + * + * This macro is the clean way to do this and avoid compiler warnings + * on 64-bit platforms. + */ +#define hash_table_enter_bkey_int32(h,k,l,v) \ + ((int32)(size_t)hash_table_enter_bkey((h),(k),(l),(void *)(size_t)(v))) + +/** + * Like hash_table_replace, but with an explicitly specified key length, + * instead of a NULL-terminated, C-style key string. So the key + * string is a binary key (or bkey). Hash tables containing such keys + * should be created with the HASH_CASE_YES option. Otherwise, the + * results are unpredictable. + */ +void *hash_table_replace_bkey(hash_table_t *h, /**< In: Handle of hash table in which to create entry */ + const char *key, /**< In: Key buffer */ + size_t len, /**< In: Length of above key buffer */ + void *val /**< In: Value to be associated with above key */ + ); + +/** + * Replace a 32-bit integer value in a hash table. + * + * This macro is the clean way to do this and avoid compiler warnings + * on 64-bit platforms. + */ +#define hash_table_replace_bkey_int32(h,k,l,v) \ + ((int32)(long)hash_table_replace_bkey((h),(k),(l),(void *)(long)(v))) + +/** + * Look up a key in a hash table and optionally return the associated + * value. + * @return 0 if key found in hash table, else -1. + */ +int32 hash_table_lookup(hash_table_t *h, /**< In: Handle of hash table being searched */ + const char *key, /**< In: C-style NULL-terminated string whose value is sought */ + void **val /**< Out: *val = value associated with key. + If this is NULL, no value will be returned. */ + ); + +/** + * Look up a 32-bit integer value in a hash table. + * + * This function is the clean way to do this and avoid compiler warnings + * on 64-bit platforms. + */ +int32 hash_table_lookup_int32(hash_table_t *h, /**< In: Handle of hash table being searched */ + const char *key, /**< In: C-style NULL-terminated string whose value is sought */ + int32 *val /**< Out: *val = value associated with key. + If this is NULL, no value will be returned. */ + ); + +/** + * Like hash_lookup, but with an explicitly specified key length, instead of a NULL-terminated, + * C-style key string. So the key string is a binary key (or bkey). Hash tables containing + * such keys should be created with the HASH_CASE_YES option. Otherwise, the results are + * unpredictable. + */ +int32 hash_table_lookup_bkey(hash_table_t *h, /**< In: Handle of hash table being searched */ + const char *key, /**< In: Key buffer */ + size_t len, /**< In: Length of above key buffer */ + void **val /**< Out: *val = value associated with key. + If this is NULL, no value will be returned. */ + ); + +/** + * Look up a 32-bit integer value in a hash table. + * + * This function is the clean way to do this and avoid compiler warnings + * on 64-bit platforms. + */ +int32 hash_table_lookup_bkey_int32(hash_table_t *h,/**< In: Handle of hash table being searched */ + const char *key,/**< In: Key buffer */ + size_t len, /**< In: Length of above key buffer */ + int32 *val /**< Out: *val = value associated with key. + If this is NULL, no value will be returned. */ + ); + +/** + * Start iterating over key-value pairs in a hash table. + */ +hash_iter_t *hash_table_iter(hash_table_t *h); + +/** + * Get the next key-value pair in iteration. + * + * This function automatically frees the iterator object upon reaching + * the final entry. + * + * @return the next entry in the hash table, or NULL if done. + */ +hash_iter_t *hash_table_iter_next(hash_iter_t *itor); + +/** + * Delete an unfinished iterator. + */ +void hash_table_iter_free(hash_iter_t *itor); + +/** + * Build a glist of valid hash_entry_t pointers from the given hash table. Return the list. + */ +glist_t hash_table_tolist(hash_table_t *h, /**< In: Hash table from which list is to be generated */ + int32 *count /**< Out: Number of entries in the list. + If this is NULL, no count will be returned. */ + + ); + +/** + * Display a hash-with-chaining representation on the screen. + * Currently, it will only works for situation where hash_enter was + * used to enter the keys. + */ +void hash_table_display(hash_table_t *h, /**< In: Hash table to display */ + int32 showkey /**< In: Show the string or not, + Use 0 if hash_enter_bkey was + used. */ + ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/util/heap.c b/src/util/heap.c new file mode 100644 index 0000000..4c28b53 --- /dev/null +++ b/src/util/heap.c @@ -0,0 +1,293 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * heap.c -- Generic heap structure for inserting in any and popping in sorted + * order. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: heap.c,v $ + * Revision 1.4 2005/06/22 03:05:49 arthchan2003 + * 1, Fixed doxygen documentation, 2, Add keyword. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 05-Mar-99 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Fixed bug in heap_destroy() (in while loop exit condition). + * + * 23-Dec-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Started. + */ + + +#include +#include +#include +#include + +#include + +#include "util/heap.h" +#include "util/ckd_alloc.h" + +/** + * One node on the heap + */ +typedef struct heapnode_s { + void *data; /**< Application data at this node */ + int32 val; /**< Associated with above application data; according to which + heap is sorted (in ascending order) */ + int32 nl, nr; /**< left/right descendants of this node (for balancing heap) */ + struct heapnode_s *l; /**< Root of left descendant heap */ + struct heapnode_s *r; /**< Root of right descendant heap */ +} heapnode_t; + +/** + * Internal heap data structure. + */ +struct heap_s { + heapnode_t *top; +}; + + +#if 0 +static void +heap_dump(heapnode_t * top, int32 level) +{ + int32 i; + + if (!top) + return; + + for (i = 0; i < level; i++) + printf(" "); + /* print top info */ + heap_dump(top->l, level + 1); + heap_dump(top->r, level + 1); +} +#endif + + +heap_t * +heap_new(void) +{ + heap_t *h = ckd_calloc(1, sizeof(*h)); + return h; +} + + +static heapnode_t * +subheap_insert(heapnode_t * root, void *data, int32 val) +{ + heapnode_t *h; + void *tmpdata; + int32 tmpval; + + if (!root) { + h = (heapnode_t *) ckd_calloc(1, sizeof(heapnode_t)); + h->data = data; + h->val = val; + h->l = h->r = NULL; + h->nl = h->nr = 0; + return h; + } + + /* Root already exists; if new value is less, replace root node */ + if (root->val > val) { + tmpdata = root->data; + tmpval = root->val; + root->data = data; + root->val = val; + data = tmpdata; + val = tmpval; + } + + /* Insert new or old (replaced) node in right or left subtree; keep them balanced */ + if (root->nl > root->nr) { + root->r = subheap_insert(root->r, data, val); + root->nr++; + } + else { + root->l = subheap_insert(root->l, data, val); + root->nl++; + } + + return root; +} + + +int +heap_insert(heap_t *heap, void *data, int32 val) +{ + heap->top = subheap_insert(heap->top, data, val); + return 0; +} + + +static heapnode_t * +subheap_pop(heapnode_t * root) +{ + heapnode_t *l, *r; + + /* Propagate best value from below into root, if any */ + l = root->l; + r = root->r; + + if (!l) { + if (!r) { + ckd_free((char *) root); + return NULL; + } + else { + root->data = r->data; + root->val = r->val; + root->r = subheap_pop(r); + root->nr--; + } + } + else { + if ((!r) || (l->val < r->val)) { + root->data = l->data; + root->val = l->val; + root->l = subheap_pop(l); + root->nl--; + } + else { + root->data = r->data; + root->val = r->val; + root->r = subheap_pop(r); + root->nr--; + } + } + + return root; +} + + +int +heap_pop(heap_t *heap, void **data, int32 * val) +{ + if (heap->top == NULL) + return 0; + *data = heap->top->data; + *val = heap->top->val; + heap->top = subheap_pop(heap->top); + return 1; +} + + +int +heap_top(heap_t *heap, void **data, int32 * val) +{ + if (heap->top == NULL) + return 0; + *data = heap->top->data; + *val = heap->top->val; + return 1; +} + +static int +heap_remove_one(heap_t *heap, heapnode_t *top, void *data) +{ + if (top == NULL) + return -1; + else if (top->data == data) { + assert(top == heap->top); + heap->top = subheap_pop(heap->top); + return 0; + } + if (top->l) { + if (top->l->data == data) { + top->l = subheap_pop(top->l); + --top->nl; + return 0; + } + else if (heap_remove_one(heap, top->l, data) == 0) { + --top->nl; + return 0; + } + } + if (top->r) { + if (top->r->data == data) { + top->r = subheap_pop(top->r); + --top->nr; + return 0; + } + else if (heap_remove_one(heap, top->r, data) == 0) { + --top->nr; + return 0; + } + } + return -1; +} + +int +heap_remove(heap_t *heap, void *data) +{ + return heap_remove_one(heap, heap->top, data); +} + + +size_t +heap_size(heap_t *heap) +{ + if (heap->top == NULL) + return 0; + return heap->top->nl + heap->top->nr + 1; +} + +int +heap_destroy(heap_t *heap) +{ + void *data; + int32 val; + + /* Empty the heap and free it */ + while (heap_pop(heap, &data, &val) > 0) + ; + ckd_free(heap); + + return 0; +} diff --git a/src/util/heap.h b/src/util/heap.h new file mode 100644 index 0000000..8ab581f --- /dev/null +++ b/src/util/heap.h @@ -0,0 +1,144 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * heap.h -- Generic heap structure for inserting in any and popping in sorted + * order. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: heap.h,v $ + * Revision 1.7 2005/06/22 03:05:49 arthchan2003 + * 1, Fixed doxygen documentation, 2, Add keyword. + * + * Revision 1.4 2005/06/15 04:21:46 archan + * 1, Fixed doxygen-documentation, 2, Add keyword such that changes will be logged into a file. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 23-Dec-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Started. + */ + + +#ifndef _LIBUTIL_HEAP_H_ +#define _LIBUTIL_HEAP_H_ + +#include + +#include + + /** \file heap.h + * \brief Heap Implementation. + * + * General Comment: Sorted heap structure with three main operations: + * + * 1. Insert a data item (with two attributes: an application supplied pointer and an + * integer value; the heap is maintained in ascending order of the integer value). + * 2. Return the currently topmost item (i.e., item with smallest associated value). + * 3. Return the currently topmost item and pop it off the heap. + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + + +typedef struct heap_s heap_t; + + +/** + * Allocate a new heap and return handle to it. + */ +heap_t *heap_new(void); + + +/** + * Insert a new item into the given heap. + * Return value: 0 if successful, -1 otherwise. + */ +int heap_insert(heap_t *heap, /**< In: Heap into which item is to be inserted */ + void *data, /**< In: Application-determined data pointer */ + int32 val /**< In: According to item entered in sorted heap */ + ); +/** + * Return the topmost item in the heap. + * Return value: 1 if heap is not empty and the topmost value is returned; + * 0 if heap is empty; -1 if some error occurred. + */ +int heap_top(heap_t *heap, /**< In: Heap whose topmost item is to be returned */ + void **data, /**< Out: Data pointer associated with the topmost item */ + int32 *val /**< Out: Value associated with the topmost item */ + ); +/** + * Like heap_top but also pop the top item off the heap. + */ +int heap_pop(heap_t *heap, void **data, int32 *val); + +/** + * Remove an item from the heap. + */ +int heap_remove(heap_t *heap, void *data); + +/** + * Return the number of items in the heap. + */ +size_t heap_size(heap_t *heap); + +/** + * Destroy the given heap; free the heap nodes. NOTE: Data pointers in the nodes are NOT freed. + * Return value: 0 if successful, -1 otherwise. + */ + +int heap_destroy(heap_t *heap); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/util/listelem_alloc.c b/src/util/listelem_alloc.c new file mode 100644 index 0000000..ec6a434 --- /dev/null +++ b/src/util/listelem_alloc.c @@ -0,0 +1,296 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include +#include + +#include + +#include "util/ckd_alloc.h" +#include "util/listelem_alloc.h" +#include "util/glist.h" + +/** + * Fast linked list allocator. + * + * We keep a separate linked list for each element-size. Element-size + * must be a multiple of pointer-size. + * + * Initially a block of empty elements is allocated, where the first + * machine word in each element points to the next available element. + * To allocate, we use this pointer to move the freelist to the next + * element, then return the current element. + * + * The last element in the list starts with a NULL pointer, which is + * used as a signal to allocate a new block of elements. + * + * In order to be able to actually release the memory allocated, we + * have to add a linked list of block pointers. This shouldn't create + * much overhead since we never access it except when freeing the + * allocator. + */ +struct listelem_alloc_s { + char **freelist; /**< ptr to first element in freelist */ + glist_t blocks; /**< Linked list of blocks allocated. */ + glist_t blocksize; /**< Number of elements in each block */ + size_t elemsize; /**< Number of (char *) in element */ + size_t blk_alloc; /**< Number of alloc operations before increasing blocksize */ + size_t n_blocks; + size_t n_alloc; + size_t n_freed; +}; + +#define MIN_ALLOC 50 /**< Minimum number of elements to allocate in one block */ +#define BLKID_SHIFT 16 /**< Bit position of block number in element ID */ +#define BLKID_MASK ((1<freelist = NULL; + list->blocks = NULL; + list->elemsize = elemsize; + /* Intent of this is to increase block size once we allocate + * 256KiB (i.e. 1<<18). If somehow the element size is big enough + * to overflow that, just fail, people should use malloc anyway. */ + list->blk_alloc = (1 << 18) / (MIN_ALLOC * elemsize); + if (list->blk_alloc <= 0) { + E_ERROR("Element size * block size exceeds 256k, use malloc instead.\n"); + ckd_free(list); + return NULL; + } + list->n_alloc = 0; + list->n_freed = 0; + + /* Allocate an initial block to minimize latency. */ + listelem_add_block(list, __FILE__, __LINE__); + return list; +} + +void +listelem_alloc_free(listelem_alloc_t *list) +{ + gnode_t *gn; + if (list == NULL) + return; + for (gn = list->blocks; gn; gn = gnode_next(gn)) + ckd_free(gnode_ptr(gn)); + glist_free(list->blocks); + glist_free(list->blocksize); + ckd_free(list); +} + +static void +listelem_add_block(listelem_alloc_t *list, char *caller_file, int caller_line) +{ + char **cpp, *cp; + size_t j; + int32 blocksize; + + blocksize = list->blocksize ? gnode_int32(list->blocksize) : MIN_ALLOC; + /* Check if block size should be increased (if many requests for this size) */ + if (list->blk_alloc == 0) { + /* See above. No sense in allocating blocks bigger than + * 256KiB (well, actually, there might be, but we'll worry + * about that later). */ + blocksize <<= 1; + if (blocksize * list->elemsize > (1 << 18)) + blocksize = (1 << 18) / list->elemsize; + list->blk_alloc = (1 << 18) / (blocksize * list->elemsize); + } + + /* Allocate block */ + cpp = list->freelist = + (char **) __ckd_calloc__(blocksize, list->elemsize, + caller_file, caller_line); + list->blocks = glist_add_ptr(list->blocks, cpp); + list->blocksize = glist_add_int32(list->blocksize, blocksize); + cp = (char *) cpp; + /* Link up the blocks via their first machine word. */ + for (j = blocksize - 1; j > 0; --j) { + cp += list->elemsize; + *cpp = cp; + cpp = (char **) cp; + } + /* Make sure the last element's forward pointer is NULL */ + *cpp = NULL; + --list->blk_alloc; + ++list->n_blocks; +} + + +void * +__listelem_malloc__(listelem_alloc_t *list, char *caller_file, int caller_line) +{ + char **ptr; + + /* Allocate a new block if list empty */ + if (list->freelist == NULL) + listelem_add_block(list, caller_file, caller_line); + + /* Unlink and return first element in freelist */ + ptr = list->freelist; + list->freelist = (char **) (*(list->freelist)); + (list->n_alloc)++; + + return (void *)ptr; +} + +void * +__listelem_malloc_id__(listelem_alloc_t *list, char *caller_file, + int caller_line, int32 *out_id) +{ + char **ptr; + + /* Allocate a new block if list empty */ + if (list->freelist == NULL) + listelem_add_block(list, caller_file, caller_line); + + /* Unlink and return first element in freelist */ + ptr = list->freelist; + list->freelist = (char **) (*(list->freelist)); + (list->n_alloc)++; + + if (out_id) { + int32 blksize, blkidx, ptridx; + gnode_t *gn, *gn2; + char **block; + + gn2 = list->blocksize; + block = NULL; + blkidx = 0; + for (gn = list->blocks; gn; gn = gnode_next(gn)) { + block = gnode_ptr(gn); + blksize = gnode_int32(gn2) * list->elemsize / sizeof(*block); + if (ptr >= block && ptr < block + blksize) + break; + gn2 = gnode_next(gn2); + ++blkidx; + } + if (gn == NULL) { + E_ERROR("Failed to find block index for pointer %p!\n", ptr); + } + ptridx = (ptr - block) / (list->elemsize / sizeof(*block)); + E_DEBUG("ptr %p block %p blkidx %d ptridx %d\n", + ptr, block, list->n_blocks - blkidx - 1, ptridx); + *out_id = ((list->n_blocks - blkidx - 1) << BLKID_SHIFT) | ptridx; + } + + return ptr; +} + +void * +listelem_get_item(listelem_alloc_t *list, int32 id) +{ + int32 blkidx, ptridx, i; + gnode_t *gn; + + blkidx = (id >> BLKID_SHIFT) & BLKID_MASK; + ptridx = id & BLKID_MASK; + + i = 0; + blkidx = list->n_blocks - blkidx; + for (gn = list->blocks; gn; gn = gnode_next(gn)) { + if (++i == blkidx) + break; + } + if (gn == NULL) { + E_ERROR("Failed to find block index %d\n", blkidx); + return NULL; + } + + return (void *)((char **)gnode_ptr(gn) + + ptridx * (list->elemsize / sizeof(void *))); +} + +void +__listelem_free__(listelem_alloc_t *list, void *elem, + char *caller_file, int caller_line) +{ + char **cpp; + (void)caller_file; + (void)caller_line; + /* + * Insert freed item at head of list. + */ + cpp = (char **) elem; + *cpp = (char *) list->freelist; + list->freelist = cpp; + (list->n_freed)++; +} + + +void +listelem_stats(listelem_alloc_t *list) +{ + gnode_t *gn, *gn2; + char **cpp; + size_t n; + + E_INFO("Linklist stats:\n"); + for (n = 0, cpp = list->freelist; cpp; + cpp = (char **) (*cpp), n++); + E_INFO + ("elemsize %lu, #alloc %lu, #freed %lu, #freelist %lu\n", + (unsigned long)list->elemsize, + (unsigned long)list->n_alloc, + (unsigned long)list->n_freed, + (unsigned long)n); + E_INFO("Allocated blocks:\n"); + gn2 = list->blocksize; + for (gn = list->blocks; gn; gn = gnode_next(gn)) { + E_INFO("%p (%d * %d bytes)\n", gnode_ptr(gn), gnode_int32(gn2), list->elemsize); + gn2 = gnode_next(gn2); + } +} diff --git a/src/util/listelem_alloc.h b/src/util/listelem_alloc.h new file mode 100644 index 0000000..489035d --- /dev/null +++ b/src/util/listelem_alloc.h @@ -0,0 +1,116 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef __LISTELEM_ALLOC_H__ +#define __LISTELEM_ALLOC_H__ + +/** @file listelem_alloc.h + * @brief Fast memory allocator for uniformly sized objects + * @author M K Ravishankar + */ +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#include +#ifdef S60 +#include +#endif + +#include + +/** + * List element allocator object. + */ +typedef struct listelem_alloc_s listelem_alloc_t; + +/** + * Initialize and return a list element allocator. + */ +listelem_alloc_t * listelem_alloc_init(size_t elemsize); + +/** + * Finalize and release all memory associated with a list element allocator. + */ +void listelem_alloc_free(listelem_alloc_t *le); + + +void *__listelem_malloc__(listelem_alloc_t *le, char *file, int line); + +/** + * Allocate a list element and return pointer to it. + */ +#define listelem_malloc(le) __listelem_malloc__((le),__FILE__,__LINE__) + +void *__listelem_malloc_id__(listelem_alloc_t *le, char *file, int line, + int32 *out_id); + +/** + * Allocate a list element, returning a unique identifier. + */ +#define listelem_malloc_id(le, oid) __listelem_malloc_id__((le),__FILE__,__LINE__,(oid)) + +/** + * Retrieve a list element by its identifier. + */ +void *listelem_get_item(listelem_alloc_t *le, int32 id); + +/** + * Free list element of given size + */ +void __listelem_free__(listelem_alloc_t *le, void *elem, char *file, int line); + +/** + * Macro of __listelem_free__ + */ +#define listelem_free(le,el) __listelem_free__((le),(el),__FILE__,__LINE__) + +/** + Print number of allocation, number of free operation stats +*/ +void listelem_stats(listelem_alloc_t *le); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/util/logmath.c b/src/util/logmath.c new file mode 100644 index 0000000..05eeaa2 --- /dev/null +++ b/src/util/logmath.c @@ -0,0 +1,504 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include +#include +#include + +#include +#include + +#include "util/ckd_alloc.h" +#include "util/mmio.h" +#include "util/bio.h" +#include "util/strfuncs.h" + +struct logmath_s { + logadd_t t; + int refcount; + mmio_file_t *filemap; + float64 base; + float64 log_of_base; + float64 log10_of_base; + float64 inv_log_of_base; + float64 inv_log10_of_base; + int32 zero; +}; + +logmath_t * +logmath_init(float64 base, int shift, int use_table) +{ + logmath_t *lmath; + uint32 maxyx, i; + float64 byx; + int width; + + /* Check that the base is correct. */ + if (base <= 1.0) { + E_ERROR("Base must be greater than 1.0\n"); + return NULL; + } + + /* Set up various necessary constants. */ + lmath = ckd_calloc(1, sizeof(*lmath)); + lmath->refcount = 1; + lmath->base = base; + lmath->log_of_base = log(base); + lmath->log10_of_base = log10(base); + lmath->inv_log_of_base = 1.0/lmath->log_of_base; + lmath->inv_log10_of_base = 1.0/lmath->log10_of_base; + lmath->t.shift = shift; + /* Shift this sufficiently that overflows can be avoided. */ + lmath->zero = MAX_NEG_INT32 >> (shift + 2); + + if (!use_table) + return lmath; + + /* Create a logadd table with the appropriate width */ + maxyx = (uint32) (log(2.0) / log(base) + 0.5) >> shift; + /* Poor man's log2 */ + if (maxyx < 256) width = 1; + else if (maxyx < 65536) width = 2; + else width = 4; + + lmath->t.width = width; + /* Figure out size of add table required. */ + byx = 1.0; /* Maximum possible base^{y-x} value - note that this implies that y-x == 0 */ + for (i = 0;; ++i) { + float64 lobyx = log(1.0 + byx) * lmath->inv_log_of_base; /* log_{base}(1 + base^{y-x}); */ + int32 k = (int32) (lobyx + 0.5 * (1<> shift; /* Round to shift */ + + /* base^{y-x} has reached the smallest representable value. */ + if (k <= 0) + break; + + /* This table is indexed by -(y-x), so we multiply byx by + * base^{-1} here which is equivalent to subtracting one from + * (y-x). */ + byx /= base; + } + i >>= shift; + + /* Never produce a table smaller than 256 entries. */ + if (i < 255) i = 255; + + lmath->t.table = ckd_calloc(i+1, width); + lmath->t.table_size = i + 1; + /* Create the add table (see above). */ + byx = 1.0; + for (i = 0;; ++i) { + float64 lobyx = log(1.0 + byx) * lmath->inv_log_of_base; + int32 k = (int32) (lobyx + 0.5 * (1<> shift; /* Round to shift */ + uint32 prev = 0; + + /* Check any previous value - if there is a shift, we want to + * only store the highest one. */ + switch (width) { + case 1: + prev = ((uint8 *)lmath->t.table)[i >> shift]; + break; + case 2: + prev = ((uint16 *)lmath->t.table)[i >> shift]; + break; + case 4: + prev = ((uint32 *)lmath->t.table)[i >> shift]; + break; + } + if (prev == 0) { + switch (width) { + case 1: + ((uint8 *)lmath->t.table)[i >> shift] = (uint8) k; + break; + case 2: + ((uint16 *)lmath->t.table)[i >> shift] = (uint16) k; + break; + case 4: + ((uint32 *)lmath->t.table)[i >> shift] = (uint32) k; + break; + } + } + if (k <= 0) + break; + + /* Decay base^{y-x} exponentially according to base. */ + byx /= base; + } + + return lmath; +} + +logmath_t * +logmath_read(const char *file_name) +{ + logmath_t *lmath; + char **argname, **argval; + int32 byteswap, i; + int chksum_present, do_mmap; + uint32 chksum; + long pos; + FILE *fp; + + E_INFO("Reading log table file '%s'\n", file_name); + if ((fp = fopen(file_name, "rb")) == NULL) { + E_ERROR_SYSTEM("Failed to open log table file '%s' for reading", file_name); + return NULL; + } + + /* Read header, including argument-value info and 32-bit byteorder magic */ + if (bio_readhdr(fp, &argname, &argval, &byteswap) < 0) { + E_ERROR("Failed to read the header from the file '%s'\n", file_name); + fclose(fp); + return NULL; + } + + lmath = ckd_calloc(1, sizeof(*lmath)); + /* Default values. */ + lmath->t.shift = 0; + lmath->t.width = 2; + lmath->base = 1.0001; + + /* Parse argument-value list */ + chksum_present = 0; + for (i = 0; argname[i]; i++) { + if (strcmp(argname[i], "version") == 0) { + } + else if (strcmp(argname[i], "chksum0") == 0) { + if (strcmp(argval[i], "yes") == 0) + chksum_present = 1; + } + else if (strcmp(argname[i], "width") == 0) { + lmath->t.width = atoi(argval[i]); + } + else if (strcmp(argname[i], "shift") == 0) { + lmath->t.shift = atoi(argval[i]); + } + else if (strcmp(argname[i], "logbase") == 0) { + lmath->base = atof_c(argval[i]); + } + } + bio_hdrarg_free(argname, argval); + chksum = 0; + + /* Set up various necessary constants. */ + lmath->log_of_base = log(lmath->base); + lmath->log10_of_base = log10(lmath->base); + lmath->inv_log_of_base = 1.0/lmath->log_of_base; + lmath->inv_log10_of_base = 1.0/lmath->log10_of_base; + /* Shift this sufficiently that overflows can be avoided. */ + lmath->zero = MAX_NEG_INT32 >> (lmath->t.shift + 2); + + /* #Values to follow */ + if (bio_fread(&lmath->t.table_size, sizeof(int32), 1, fp, byteswap, &chksum) != 1) { + E_ERROR("Failed to read values from the file '%s'", file_name); + goto error_out; + } + + /* Check alignment constraints for memory mapping */ + do_mmap = 1; + pos = ftell(fp); + if (pos & ((long)lmath->t.width - 1)) { + E_WARN("%s: Data start %ld is not aligned on %d-byte boundary, will not memory map\n", + file_name, pos, lmath->t.width); + do_mmap = 0; + } + /* Check byte order for memory mapping */ + if (byteswap) { + E_WARN("%s: Data is wrong-endian, will not memory map\n", file_name); + do_mmap = 0; + } + + if (do_mmap) { + lmath->filemap = mmio_file_read(file_name); + lmath->t.table = (char *)mmio_file_ptr(lmath->filemap) + pos; + } + else { + lmath->t.table = ckd_calloc(lmath->t.table_size, lmath->t.width); + if ((uint32)bio_fread(lmath->t.table, lmath->t.width, lmath->t.table_size, + fp, byteswap, &chksum) != lmath->t.table_size) { + E_ERROR("Failed to read data (%d x %d bytes) from the file '%s' failed", + lmath->t.table_size, lmath->t.width, file_name); + goto error_out; + } + if (chksum_present) + bio_verify_chksum(fp, byteswap, chksum); + + if (fread(&i, 1, 1, fp) == 1) { + E_ERROR("%s: More data than expected\n", file_name); + goto error_out; + } + } + fclose(fp); + + return lmath; +error_out: + logmath_free(lmath); + return NULL; +} + +int32 +logmath_write(logmath_t *lmath, const char *file_name) +{ + FILE *fp; + long pos; + uint32 chksum; + + if (lmath->t.table == NULL) { + E_ERROR("No log table to write!\n"); + return -1; + } + + E_INFO("Writing log table file '%s'\n", file_name); + if ((fp = fopen(file_name, "wb")) == NULL) { + E_ERROR_SYSTEM("Failed to open logtable file '%s' for writing", file_name); + return -1; + } + + /* For whatever reason, we have to do this manually at the + * moment. */ + fprintf(fp, "s3\nversion 1.0\nchksum0 yes\n"); + fprintf(fp, "width %d\n", lmath->t.width); + fprintf(fp, "shift %d\n", lmath->t.shift); + fprintf(fp, "logbase %f\n", lmath->base); + /* Pad it out to ensure alignment. */ + pos = ftell(fp) + strlen("endhdr\n"); + if (pos & ((long)lmath->t.width - 1)) { + size_t align = lmath->t.width - (pos & ((long)lmath->t.width - 1)); + assert(lmath->t.width <= 8); + fwrite(" " /* 8 spaces */, 1, align, fp); + } + fprintf(fp, "endhdr\n"); + + /* Now write the binary data. */ + chksum = (uint32)BYTE_ORDER_MAGIC; + fwrite(&chksum, sizeof(uint32), 1, fp); + chksum = 0; + /* #Values to follow */ + if (bio_fwrite(&lmath->t.table_size, sizeof(uint32), + 1, fp, 0, &chksum) != 1) { + E_ERROR("Failed to write data to a file '%s'", file_name); + goto error_out; + } + + if ((uint32)bio_fwrite(lmath->t.table, lmath->t.width, lmath->t.table_size, + fp, 0, &chksum) != lmath->t.table_size) { + E_ERROR("Failed to write data (%d x %d bytes) to the file '%s'", + lmath->t.table_size, lmath->t.width, file_name); + goto error_out; + } + if (bio_fwrite(&chksum, sizeof(uint32), 1, fp, 0, NULL) != 1) { + E_ERROR("Failed to write checksum to the file '%s'", file_name); + goto error_out; + } + + fclose(fp); + return 0; + +error_out: + fclose(fp); + return -1; +} + +logmath_t * +logmath_retain(logmath_t *lmath) +{ + ++lmath->refcount; + return lmath; +} + +int +logmath_free(logmath_t *lmath) +{ + if (lmath == NULL) + return 0; + if (--lmath->refcount > 0) + return lmath->refcount; + if (lmath->filemap) + mmio_file_unmap(lmath->filemap); + else + ckd_free(lmath->t.table); + ckd_free(lmath); + return 0; +} + +int32 +logmath_get_table_shape(logmath_t *lmath, uint32 *out_size, + uint32 *out_width, uint32 *out_shift) +{ + if (out_size) *out_size = lmath->t.table_size; + if (out_width) *out_width = lmath->t.width; + if (out_shift) *out_shift = lmath->t.shift; + + return lmath->t.table_size * lmath->t.width; +} + +float64 +logmath_get_base(logmath_t *lmath) +{ + return lmath->base; +} + +int +logmath_get_zero(logmath_t *lmath) +{ + return lmath->zero; +} + +int +logmath_get_width(logmath_t *lmath) +{ + return lmath->t.width; +} + +int +logmath_get_shift(logmath_t *lmath) +{ + return lmath->t.shift; +} + +int +logmath_add(logmath_t *lmath, int logb_x, int logb_y) +{ + logadd_t *t = LOGMATH_TABLE(lmath); + int d, r; + + /* handle 0 + x = x case. */ + if (logb_x <= lmath->zero) + return logb_y; + if (logb_y <= lmath->zero) + return logb_x; + + if (t->table == NULL) + return logmath_add_exact(lmath, logb_x, logb_y); + + /* d must be positive, obviously. */ + if (logb_x > logb_y) { + d = (logb_x - logb_y); + r = logb_x; + } + else { + d = (logb_y - logb_x); + r = logb_y; + } + + if (d < 0) { + /* Some kind of overflow has occurred, fail gracefully. */ + return r; + } + if ((size_t)d >= t->table_size) { + /* If this happens, it's not actually an error, because the + * last entry in the logadd table is guaranteed to be zero. + * Therefore we just return the larger of the two values. */ + return r; + } + + switch (t->width) { + case 1: + return r + (((uint8 *)t->table)[d]); + case 2: + return r + (((uint16 *)t->table)[d]); + case 4: + return r + (((uint32 *)t->table)[d]); + } + return r; +} + +int +logmath_add_exact(logmath_t *lmath, int logb_p, int logb_q) +{ + return logmath_log(lmath, + logmath_exp(lmath, logb_p) + + logmath_exp(lmath, logb_q)); +} + +int +logmath_log(logmath_t *lmath, float64 p) +{ + if (p <= 0) { + return lmath->zero; + } + return (int)(log(p) * lmath->inv_log_of_base) >> lmath->t.shift; +} + +float64 +logmath_exp(logmath_t *lmath, int logb_p) +{ + return pow(lmath->base, (float64)(logb_p << lmath->t.shift)); +} + +int +logmath_ln_to_log(logmath_t *lmath, float64 log_p) +{ + return (int)(log_p * lmath->inv_log_of_base) >> lmath->t.shift; +} + +float64 +logmath_log_to_ln(logmath_t *lmath, int logb_p) +{ + return (float64)(logb_p << lmath->t.shift) * lmath->log_of_base; +} + +int +logmath_log10_to_log(logmath_t *lmath, float64 log_p) +{ + return (int)(log_p * lmath->inv_log10_of_base) >> lmath->t.shift; +} + +float +logmath_log10_to_log_float(logmath_t *lmath, float64 log_p) +{ + int i; + float res = (float)(log_p * lmath->inv_log10_of_base); + for (i = 0; i < lmath->t.shift; i++) + res /= 2.0f; + return res; +} + +float64 +logmath_log_to_log10(logmath_t *lmath, int logb_p) +{ + return (float64)(logb_p << lmath->t.shift) * lmath->log10_of_base; +} + +float64 +logmath_log_float_to_log10(logmath_t *lmath, float log_p) +{ + int i; + for (i = 0; i < lmath->t.shift; i++) { + log_p *= 2; + } + return log_p * lmath->log10_of_base; +} diff --git a/src/util/make_lite.py b/src/util/make_lite.py new file mode 100755 index 0000000..b0ea263 --- /dev/null +++ b/src/util/make_lite.py @@ -0,0 +1,265 @@ +#!/usr/bin/env python + +import sys, os +import fortran +import clapack_scrub + +try: set +except NameError: + from sets import Set as set + +# Arguments to pass to f2c. You'll always want -A for ANSI C prototypes +# Others of interest: -a to not make variables static by default +# -C to check array subscripts +F2C_ARGS = '-A' + +# The header to add to the top of the *_lite.c file. Note that slamch_() calls +# will be replaced by the macros below by clapack_scrub.scrub_source() +HEADER = '''\ +/* +NOTE: This is generated code. Look in README.python for information on + remaking this file. +*/ +#include "f2c.h" + +#ifdef HAVE_CONFIG +#include "config.h" +#else +extern doublereal slamch_(char *); +#define EPSILON slamch_("Epsilon") +#define SAFEMINIMUM slamch_("Safe minimum") +#define PRECISION slamch_("Precision") +#define BASE slamch_("Base") +#endif + + +extern doublereal slapy2_(real *, real *); + +''' + +class FortranRoutine: + """Wrapper for a Fortran routine in a file. + """ + type = 'generic' + def __init__(self, name=None, filename=None): + self.filename = filename + if name is None: + root, ext = os.path.splitext(filename) + name = root + self.name = name + self._dependencies = None + + def dependencies(self): + if self._dependencies is None: + deps = fortran.getDependencies(self.filename) + self._dependencies = [d.lower() for d in deps] + return self._dependencies + +class UnknownFortranRoutine(FortranRoutine): + """Wrapper for a Fortran routine for which the corresponding file + is not known. + """ + type = 'unknown' + def __init__(self, name): + FortranRoutine.__init__(self, name=name, filename='') + + def dependencies(self): + return [] + +class FortranLibrary: + """Container for a bunch of Fortran routines. + """ + def __init__(self, src_dirs): + self._src_dirs = src_dirs + self.names_to_routines = {} + + def _findRoutine(self, rname): + rname = rname.lower() + for s in self._src_dirs: + ffilename = os.path.join(s, rname + '.f') + if os.path.exists(ffilename): + return self._newFortranRoutine(rname, ffilename) + return UnknownFortranRoutine(rname) + + def _newFortranRoutine(self, rname, filename): + return FortranRoutine(rname, filename) + + def addIgnorableRoutine(self, rname): + """Add a routine that we don't want to consider when looking at + dependencies. + """ + rname = rname.lower() + routine = UnknownFortranRoutine(rname) + self.names_to_routines[rname] = routine + + def addRoutine(self, rname): + """Add a routine to the library. + """ + self.getRoutine(rname) + + def getRoutine(self, rname): + """Get a routine from the library. Will add if it's not found. + """ + unique = [] + rname = rname.lower() + routine = self.names_to_routines.get(rname, unique) + if routine is unique: + routine = self._findRoutine(rname) + self.names_to_routines[rname] = routine + return routine + + def allRoutineNames(self): + """Return the names of all the routines. + """ + return self.names_to_routines.keys() + + def allRoutines(self): + """Return all the routines. + """ + return self.names_to_routines.values() + + def resolveAllDependencies(self): + """Try to add routines to the library to satisfy all the dependencies + for each routine in the library. + + Returns a set of routine names that have the dependencies unresolved. + """ + done_this = set() + last_todo = set() + while 1: + todo = set(self.allRoutineNames()) - done_this + if todo == last_todo: + break + for rn in todo: + r = self.getRoutine(rn) + deps = r.dependencies() + for d in deps: + self.addRoutine(d) + done_this.add(rn) + last_todo = todo + return todo + +class LapackLibrary(FortranLibrary): + def _newFortranRoutine(self, rname, filename): + routine = FortranLibrary._newFortranRoutine(self, rname, filename) + if filename.find('BLAS') != -1: + routine.type = 'blas' + elif rname.startswith('z'): + routine.type = 'zlapack' + else: + routine.type = 'slapack' + return routine + + def allRoutinesByType(self, typename): + routines = [(r.name,r) for r in self.allRoutines() if r.type == typename] + routines.sort() + return [a[1] for a in routines] + +def printRoutineNames(desc, routines): + print desc + for r in routines: + print '\t%s' % r.name + +def getLapackRoutines(wrapped_routines, ignores, lapack_dir): + blas_src_dir = os.path.join(lapack_dir, 'BLAS', 'SRC') + if not os.path.exists(blas_src_dir): + blas_src_dir = os.path.join(lapack_dir, 'blas', 'src') + lapack_src_dir = os.path.join(lapack_dir, 'SRC') + if not os.path.exists(lapack_src_dir): + lapack_src_dir = os.path.join(lapack_dir, 'src') + library = LapackLibrary([blas_src_dir, lapack_src_dir]) + + for r in ignores: + library.addIgnorableRoutine(r) + + for w in wrapped_routines: + library.addRoutine(w) + + library.resolveAllDependencies() + + return library + +def getWrappedRoutineNames(wrapped_routines_file): + fo = open(wrapped_routines_file) + routines = [] + ignores = [] + for line in fo: + line = line.strip() + if not line or line.startswith('#'): + continue + if line.startswith('IGNORE:'): + line = line[7:].strip() + ig = line.split() + ignores.extend(ig) + else: + routines.append(line) + return routines, ignores + +def dumpRoutineNames(library, output_dir): + for typename in ['unknown', 'blas', 'slapack', 'zlapack']: + routines = library.allRoutinesByType(typename) + filename = os.path.join(output_dir, typename + '_routines.lst') + fo = open(filename, 'w') + for r in routines: + deps = r.dependencies() + fo.write('%s: %s\n' % (r.name, ' '.join(deps))) + fo.close() + +def concatenateRoutines(routines, output_file): + output_fo = open(output_file, 'w') + for r in routines: + fo = open(r.filename, 'r') + source = fo.read() + fo.close() + output_fo.write(source) + output_fo.close() + +class F2CError(Exception): + pass + +def runF2C(fortran_filename, output_dir): + # we're assuming no funny business that needs to be quoted for the shell + cmd = "f2c %s -d %s %s" % (F2C_ARGS, output_dir, fortran_filename) + rc = os.system(cmd) + if rc != 0: + raise F2CError + +def scrubF2CSource(c_file): + fo = open(c_file, 'r') + source = fo.read() + fo.close() + source = clapack_scrub.scrubSource(source, verbose=True) + fo = open(c_file, 'w') + fo.write(HEADER) + fo.write(source) + fo.close() + +def main(): + if len(sys.argv) != 4: + print 'Usage: %s wrapped_routines_file lapack_dir output_dir' % \ + (sys.argv[0],) + return + wrapped_routines_file = sys.argv[1] + lapack_src_dir = sys.argv[2] + output_dir = sys.argv[3] + + wrapped_routines, ignores = getWrappedRoutineNames(wrapped_routines_file) + library = getLapackRoutines(wrapped_routines, ignores, lapack_src_dir) + + dumpRoutineNames(library, output_dir) + + for typename in ['blas', 'slapack']: + print 'creating %s_lite.c ...' % typename + routines = library.allRoutinesByType(typename) + fortran_file = os.path.join(output_dir, typename+'_lite.f') + c_file = fortran_file[:-2] + '.c' + concatenateRoutines(routines, fortran_file) + try: + runF2C(fortran_file, output_dir) + except F2CError: + print 'f2c failed on %s' % fortran_file + break + scrubF2CSource(c_file) + +if __name__ == '__main__': + main() diff --git a/src/util/matrix.c b/src/util/matrix.c new file mode 100644 index 0000000..7c48f20 --- /dev/null +++ b/src/util/matrix.c @@ -0,0 +1,280 @@ +/* -*- c-basic-offset: 4 -*- */ +/* ==================================================================== + * Copyright (c) 1997-2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +#include +#include + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "util/clapack_lite.h" +#include "util/matrix.h" +#include "util/ckd_alloc.h" + +void +norm_3d(float32 ***arr, + uint32 d1, + uint32 d2, + uint32 d3) +{ + uint32 i, j, k; + float64 s; + + for (i = 0; i < d1; i++) { + for (j = 0; j < d2; j++) { + + /* compute sum (i, j) as over all k */ + for (k = 0, s = 0; k < d3; k++) { + s += arr[i][j][k]; + } + + /* do 1 floating point divide */ + s = 1.0 / s; + + /* divide all k by sum over k */ + for (k = 0; k < d3; k++) { + arr[i][j][k] *= s; + } + } + } +} + +void +accum_3d(float32 ***out, + float32 ***in, + uint32 d1, + uint32 d2, + uint32 d3) +{ + uint32 i, j, k; + + for (i = 0; i < d1; i++) { + for (j = 0; j < d2; j++) { + for (k = 0; k < d3; k++) { + out[i][j][k] += in[i][j][k]; + } + } + } +} + +void +floor_nz_3d(float32 ***m, + uint32 d1, + uint32 d2, + uint32 d3, + float32 floor) +{ + uint32 i, j, k; + + for (i = 0; i < d1; i++) { + for (j = 0; j < d2; j++) { + for (k = 0; k < d3; k++) { + if ((m[i][j][k] != 0) && (m[i][j][k] < floor)) + m[i][j][k] = floor; + } + } + } +} +void +floor_nz_1d(float32 *v, + uint32 d1, + float32 floor) +{ + uint32 i; + + for (i = 0; i < d1; i++) { + if ((v[i] != 0) && (v[i] < floor)) + v[i] = floor; + } +} + +void +band_nz_1d(float32 *v, + uint32 d1, + float32 band) +{ + uint32 i; + + for (i = 0; i < d1; i++) { + if (v[i] != 0) { + if ((v[i] > 0) && (v[i] < band)) { + v[i] = band; + } + else if ((v[i] < 0) && (v[i] > -band)) { + v[i] = -band; + } + } + } +} + +/* Find determinant through LU decomposition. */ +float64 +determinant(float32 ** a, int32 n) +{ + float32 **tmp_a; + float64 det; + char uplo; + int32 info, i; + + /* a is assumed to be symmetric, so we don't need to switch the + * ordering of the data. But we do need to copy it since it is + * overwritten by LAPACK. */ + tmp_a = (float32 **)ckd_calloc_2d(n, n, sizeof(float32)); + memcpy(tmp_a[0], a[0], n*n*sizeof(float32)); + + uplo = 'L'; + spotrf_(&uplo, &n, tmp_a[0], &n, &info); + det = tmp_a[0][0]; + /* det = prod(diag(l))^2 */ + for (i = 1; i < n; ++i) + det *= tmp_a[i][i]; + ckd_free_2d((void **)tmp_a); + if (info > 0) + return -1.0; /* Generic "not positive-definite" answer */ + else + return det * det; +} + +int32 +solve(float32 **a, /*Input : an n*n matrix A */ + float32 *b, /*Input : a n dimension vector b */ + float32 *out_x, /*Output : a n dimension vector x */ + int32 n) +{ + char uplo; + float32 **tmp_a; + int32 info, nrhs; + + /* a is assumed to be symmetric, so we don't need to switch the + * ordering of the data. But we do need to copy it since it is + * overwritten by LAPACK. */ + tmp_a = (float32 **)ckd_calloc_2d(n, n, sizeof(float32)); + memcpy(tmp_a[0], a[0], n*n*sizeof(float32)); + memcpy(out_x, b, n*sizeof(float32)); + uplo = 'L'; + nrhs = 1; + sposv_(&uplo, &n, &nrhs, tmp_a[0], &n, out_x, &n, &info); + ckd_free_2d((void **)tmp_a); + + if (info != 0) + return -1; + else + return info; +} + +/* Find inverse by solving AX=I. */ +int32 +invert(float32 ** ainv, float32 ** a, int32 n) +{ + char uplo; + float32 **tmp_a; + int32 info, nrhs, i; + + /* a is assumed to be symmetric, so we don't need to switch the + * ordering of the data. But we do need to copy it since it is + * overwritten by LAPACK. */ + tmp_a = (float32 **)ckd_calloc_2d(n, n, sizeof(float32)); + memcpy(tmp_a[0], a[0], n*n*sizeof(float32)); + + /* Construct an identity matrix. */ + memset(ainv[0], 0, sizeof(float32) * n * n); + for (i = 0; i < n; i++) + ainv[i][i] = 1.0; + + uplo = 'L'; + nrhs = n; + sposv_(&uplo, &n, &nrhs, tmp_a[0], &n, ainv[0], &n, &info); + + ckd_free_2d((void **)tmp_a); + + if (info != 0) + return -1; + else + return info; +} + +void +matrixmultiply(float32 ** c, float32 ** a, float32 ** b, int32 n) +{ + char side, uplo; + float32 alpha; + + side = 'L'; + uplo = 'L'; + alpha = 1.0; + ssymm_(&side, &uplo, &n, &n, &alpha, a[0], &n, b[0], &n, &alpha, c[0], &n); +} + +void +outerproduct(float32 ** a, float32 * x, float32 * y, int32 len) +{ + int32 i, j; + + for (i = 0; i < len; ++i) { + a[i][i] = x[i] * y[i]; + for (j = i + 1; j < len; ++j) { + a[i][j] = x[i] * y[j]; + a[j][i] = x[j] * y[i]; + } + } +} + +void +scalarmultiply(float32 ** a, float32 x, int32 n) +{ + int32 i, j; + + for (i = 0; i < n; ++i) { + a[i][i] *= x; + for (j = i+1; j < n; ++j) { + a[i][j] *= x; + a[j][i] *= x; + } + } +} + +void +matrixadd(float32 ** a, float32 ** b, int32 n) +{ + int32 i, j; + + for (i = 0; i < n; ++i) + for (j = 0; j < n; ++j) + a[i][j] += b[i][j]; +} diff --git a/src/util/matrix.h b/src/util/matrix.h new file mode 100644 index 0000000..b80ac00 --- /dev/null +++ b/src/util/matrix.h @@ -0,0 +1,203 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1997-2000 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/********************************************************************* + * + * File: matrix.h + * + * Description: Matrix and linear algebra functions + * + * Author: + * + *********************************************************************/ + +#ifndef MATRIX_H +#define MATRIX_H + +/** \file matrix.h + * \brief Matrix and linear algebra functions. + * + * This file contains some basic matrix and linear algebra operations. + * In general these operate on positive definite matrices ONLY, + * because all matrices we're likely to encounter are either + * covariance matrices or are derived from them, and therefore a + * non-positive-definite matrix indicates some kind of pathological + * condition. + */ +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#include + +/** + * Norm an array + * @param arr array + * @param d1 dimension + * @param d2 dimension + * @param d3 dimension + **/ +void norm_3d(float32 ***arr, uint32 d1, uint32 d2, uint32 d3); + +/** + * Floor 3-d array + * @param out output array + * @param in input array + * @param d1 dimension + * @param d2 dimension + * @param d3 dimension + **/ +void accum_3d(float32 ***out, float32 ***in, uint32 d1, uint32 d2, uint32 d3); + +/** Ensures that non-zero values x such that -band < x < band, band > 0 are set to -band if x < 0 and band if x > 0. + * @param v array + * @param d1 array size + * @param band band value + */ +void band_nz_1d(float32 *v, uint32 d1, float32 band); + +/** + * Floor 3-d array + * @param m array + * @param d1 dimension + * @param d2 dimension + * @param d3 dimension + * @param floor floor value + **/ +void floor_nz_3d(float32 ***m, uint32 d1, uint32 d2, uint32 d3, float32 floor); + +/** + * Floor 1-d array + * @param v array + * @param d1 dimension + * @param floor floor value + **/ +void floor_nz_1d(float32 *v, uint32 d1, float32 floor); + +/** + * Calculate the determinant of a positive definite matrix. + * @param a The input matrix, must be positive definite. + * @param len The dimension of the input matrix. + * @return The determinant of the input matrix, or -1.0 if the matrix is + * not positive definite. + * + * \note These can be vanishingly small hence the float64 return type. + * Also note that only the upper triangular portion of a is + * considered, therefore the check for positive-definiteness is not + * reliable. + **/ +float64 determinant(float32 **a, int32 len); + +/** + * Invert (if possible) a positive definite matrix with QR + * algorithm. + * + * @param out_ainv The inverse of a will be stored here. + * @param a The input matrix, must be positive definite. + * @param len The dimension of the input matrix. + * @return 0 for success or -1 for a non-positive-definite matrix. + * + * \note Only the upper triangular portion of a is considered, + * therefore the check for positive-definiteness is not reliable. + * + * \note The inversion can be done in-place, so you can use the same matrix + * if you do not need to keep a. + **/ +int32 invert(float32 **out_ainv, float32 **a, int32 len); + +/** + * Solve (if possible) a positive-definite system of linear equations AX=B for X. + * @param a The A matrix on the left-hand side of the equation, must be positive-definite. + * @param b The B vector on the right-hand side of the equation. + * @param out_x The X vector will be stored here. + * @param n The dimension of the A matrix (n by n) and the B and X vectors. + * @return 0 for success or -1 for a non-positive-definite matrix. + * + * \note Only the upper triangular portion of a is considered, + * therefore the check for positive-definiteness is not reliable. + **/ +int32 solve(float32 **a, float32 *b, + float32 *out_x, int32 n); + +/** + * Calculate the outer product of two vectors. + * @param out_a A (pre-allocated) len x len array. The outer product + * will be stored here. + * @param x A vector of length len. + * @param y A vector of length len. + * @param len The length of the input vectors. + **/ +void outerproduct(float32 **out_a, float32 *x, float32 *y, int32 len); + +/** + * Multiply C=AB where A and B are symmetric matrices. + * @param out_c The output matrix C. + * @param a The input matrix A. + * @param b The input matrix B. + * @param n Dimensionality of A and B. + **/ +void matrixmultiply(float32 **out_c, /* = */ + float32 **a, /* * */ float32 **b, + int32 n); + +/** + * Multiply a symmetric matrix by a constant in-place. + * @param inout_a The matrix to multiply. + * @param x The constant to multiply it by. + * @param n dimension of a. + **/ +void scalarmultiply(float32 **inout_a, float32 x, int32 n); + +/** + * Add A += B. + * @param inout_a The A matrix to add. + * @param b The B matrix to add to A. + * @param n dimension of a and b. + **/ +void matrixadd(float32 **inout_a, float32 **b, int32 n); + +#if 0 +{ /* Fool indent. */ +#endif +#ifdef __cplusplus +} +#endif + +#endif /* MATRIX_H */ diff --git a/src/util/mmio.c b/src/util/mmio.c new file mode 100644 index 0000000..79a792c --- /dev/null +++ b/src/util/mmio.c @@ -0,0 +1,258 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2005 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/********************************************************************* + * + * File: mmio.c + * + * Description: mmap() wrappers for Unix/Windows + * + * Author: David Huggins-Daines + * + *********************************************************************/ + +#include +#include + + +#ifdef GNUWINCE +# include +# include +# include +# include +#elif defined(__SYMBIAN32__) /* SYMBIAN32 must be before WIN32 since Symbian SDK defines WIN32 as well */ +# include +# include +# include +# include +#elif defined(_WIN32) +# include +#else +# include +# include +# include +# include +# include +#endif + +#include +#include + +#include "util/mmio.h" +#include "util/ckd_alloc.h" + +#if defined(_WIN32_WCE) || defined(GNUWINCE) +struct mmio_file_s { + int dummy; +}; + +mmio_file_t * +mmio_file_read(const char *filename) +{ + HANDLE ffm, fd; + WCHAR *wfilename; + void *rv; + int len; + + len = mbstowcs(NULL, filename, 0) + 1; + wfilename = malloc(len * sizeof(WCHAR)); + mbstowcs(wfilename, filename, len); + + if ((ffm = + CreateFileForMappingW(wfilename, GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, + NULL)) == INVALID_HANDLE_VALUE) { + E_ERROR("Failed to create mapping for the file '%s': %08x\n", filename, + GetLastError()); + return NULL; + } + if ((fd = + CreateFileMappingW(ffm, NULL, PAGE_READONLY, 0, 0, NULL)) == NULL) { + E_ERROR("Failed to CreateFileMapping: %08x\n", GetLastError()); + CloseHandle(ffm); + return NULL; + } + rv = MapViewOfFile(fd, FILE_MAP_READ, 0, 0, 0); + free(wfilename); + CloseHandle(ffm); + CloseHandle(fd); + + return (mmio_file_t *) rv; +} + +void +mmio_file_unmap(mmio_file_t *mf) +{ + if (!UnmapViewOfFile((void *)mf)) { + E_ERROR("Failed to UnmapViewOfFile: %08x\n", GetLastError()); + } +} + +void * +mmio_file_ptr(mmio_file_t *mf) +{ + return (void *)mf; +} + +#elif defined(_WIN32) && !defined(_WIN32_WP) /* !WINCE */ +struct mmio_file_s { + int dummy; +}; + +mmio_file_t * +mmio_file_read(const char *filename) +{ + HANDLE ffm, fd; + void *rv; + + if ((ffm = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, + NULL)) == INVALID_HANDLE_VALUE) { + E_ERROR("Failed to create file '%s': %08x\n", + filename, GetLastError()); + return NULL; + } + if ((fd = CreateFileMapping(ffm, NULL, + PAGE_READONLY, 0, 0, NULL)) == NULL) { + E_ERROR("Failed to CreateFileMapping: %08x\n", GetLastError()); + CloseHandle(ffm); + } + rv = MapViewOfFile(fd, FILE_MAP_READ, 0, 0, 0); + CloseHandle(ffm); + CloseHandle(fd); + + return (mmio_file_t *)rv; +} + +void +mmio_file_unmap(mmio_file_t *mf) +{ + if (!UnmapViewOfFile((void *)mf)) { + E_ERROR("Failed to UnmapViewOfFile: %08x\n", GetLastError()); + } +} + +void * +mmio_file_ptr(mmio_file_t *mf) +{ + return (void *)mf; +} + +#else /* !WIN32, !WINCE */ +#if defined(__ADSPBLACKFIN__) || defined(_WIN32_WP) + /* This is true for both uClinux and VisualDSP++, + but actually we need a better way to detect it. */ +struct mmio_file_s { + int dummy; +}; + +mmio_file_t * +mmio_file_read(const char *filename) +{ + E_ERROR("mmio is not implemented on this platform!"); + return NULL; +} + +void +mmio_file_unmap(mmio_file_t *mf) +{ + E_ERROR("mmio is not implemented on this platform!"); +} + +void * +mmio_file_ptr(mmio_file_t *mf) +{ + E_ERROR("mmio is not implemented on this platform!"); + return NULL; +} +#else /* !__ADSPBLACKFIN__ */ +struct mmio_file_s { + void *ptr; + size_t mapsize; +}; + +mmio_file_t * +mmio_file_read(const char *filename) +{ + mmio_file_t *mf; + struct stat buf; + void *ptr; + int fd; + size_t pagesize; + + if ((fd = open(filename, O_RDONLY)) == -1) { + E_ERROR_SYSTEM("Failed to open %s", filename); + return NULL; + } + if (fstat(fd, &buf) == -1) { + E_ERROR_SYSTEM("Failed to stat %s", filename); + close(fd); + return NULL; + } + ptr = mmap(NULL, buf.st_size, PROT_READ, MAP_SHARED, fd, 0); + if (ptr == (void *)-1) { + E_ERROR_SYSTEM("Failed to mmap %lld bytes", (unsigned long long)buf.st_size); + close(fd); + return NULL; + } + close(fd); + mf = ckd_calloc(1, sizeof(*mf)); + mf->ptr = ptr; + /* Align map size to next page. */ + pagesize = sysconf(_SC_PAGESIZE); + mf->mapsize = (buf.st_size + pagesize - 1) / pagesize * pagesize; + + return mf; +} + +void +mmio_file_unmap(mmio_file_t *mf) +{ + if (mf == NULL) + return; + if (munmap(mf->ptr, mf->mapsize) < 0) { + E_ERROR_SYSTEM("Failed to unmap %ld bytes at %p", mf->mapsize, mf->ptr); + } + ckd_free(mf); +} + +void * +mmio_file_ptr(mmio_file_t *mf) +{ + return mf->ptr; +} +#endif /* !__ADSPBLACKFIN__ */ +#endif /* !(WINCE || WIN32) */ diff --git a/src/util/mmio.h b/src/util/mmio.h new file mode 100644 index 0000000..ccc5fc3 --- /dev/null +++ b/src/util/mmio.h @@ -0,0 +1,80 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2006-2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file mmio.h + * @brief Memory-mapped I/O wrappers for files. + * @author David Huggins-Daines + **/ + +#ifndef __MMIO_H__ +#define __MMIO_H__ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Abstract structure representing a memory-mapped file. + **/ +typedef struct mmio_file_s mmio_file_t; + +/** + * Memory-map a file for reading. + * @return a mmio_file_t * or NULL for failure. + **/ +mmio_file_t *mmio_file_read(const char *filename); + +/** + * Get a pointer to the memory mapped for a file. + **/ +void *mmio_file_ptr(mmio_file_t *mf); + +/** + * Unmap a file, releasing memory associated with it. + **/ +void mmio_file_unmap(mmio_file_t *mf); + +#ifdef __cplusplus +} +#endif + + +#endif /* __MMIO_H__ */ diff --git a/src/util/pio.c b/src/util/pio.c new file mode 100644 index 0000000..71c3ffe --- /dev/null +++ b/src/util/pio.c @@ -0,0 +1,658 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef HAVE_SYS_TYPES_H +#include +#endif + +#ifdef HAVE_SYS_STAT_H +#include +#endif + +#if defined(_WIN32) && !defined(CYGWIN) +#include +#endif + +#include + +#include "util/pio.h" +#include "util/filename.h" +#include "util/strfuncs.h" +#include "util/ckd_alloc.h" + +#ifndef EXEEXT +#define EXEEXT "" +#endif + +enum { + COMP_NONE, + COMP_COMPRESS, + COMP_GZIP, + COMP_BZIP2 +}; + +static void +guess_comptype(char const *file, int32 *ispipe, int32 *isgz) +{ + size_t k; + + k = strlen(file); + *ispipe = 0; + *isgz = COMP_NONE; + if ((k > 2) + && ((strcmp(file + k - 2, ".Z") == 0) + || (strcmp(file + k - 2, ".z") == 0))) { + *ispipe = 1; + *isgz = COMP_COMPRESS; + } + else if ((k > 3) && ((strcmp(file + k - 3, ".gz") == 0) + || (strcmp(file + k - 3, ".GZ") == 0))) { + *ispipe = 1; + *isgz = COMP_GZIP; + } + else if ((k > 4) && ((strcmp(file + k - 4, ".bz2") == 0) + || (strcmp(file + k - 4, ".BZ2") == 0))) { + *ispipe = 1; + *isgz = COMP_BZIP2; + } +} + +FILE * +fopen_comp(const char *file, const char *mode, int32 * ispipe) +{ + FILE *fp; + +#ifndef HAVE_POPEN + *ispipe = 0; /* No popen() on WinCE */ +#else /* HAVE_POPEN */ + int32 isgz; + guess_comptype(file, ispipe, &isgz); +#endif /* HAVE_POPEN */ + + if (*ispipe) { +#ifndef HAVE_POPEN + /* Shouldn't get here, anyway */ + E_FATAL("No popen() on WinCE\n"); +#else + if (strcmp(mode, "r") == 0) { + char *command; + switch (isgz) { + case COMP_GZIP: + command = string_join("gunzip" EXEEXT, " -c ", file, NULL); + break; + case COMP_COMPRESS: + command = string_join("zcat" EXEEXT, " ", file, NULL); + break; + case COMP_BZIP2: + command = string_join("bunzip2" EXEEXT, " -c ", file, NULL); + break; + default: + command = NULL; /* Make compiler happy. */ + E_FATAL("Unknown compression type %d\n", isgz); + } + if ((fp = popen(command, mode)) == NULL) { + E_ERROR_SYSTEM("Failed to open a pipe for a command '%s' mode '%s'", command, mode); + ckd_free(command); + return NULL; + } + ckd_free(command); + } + else if (strcmp(mode, "w") == 0) { + char *command; + switch (isgz) { + case COMP_GZIP: + command = string_join("gzip" EXEEXT, " > ", file, NULL); + break; + case COMP_COMPRESS: + command = string_join("compress" EXEEXT, " -c > ", file, NULL); + break; + case COMP_BZIP2: + command = string_join("bzip2" EXEEXT, " > ", file, NULL); + break; + default: + command = NULL; /* Make compiler happy. */ + E_FATAL("Unknown compression type %d\n", isgz); + } + if ((fp = popen(command, mode)) == NULL) { + E_ERROR_SYSTEM("Failed to open a pipe for a command '%s' mode '%s'", command, mode); + ckd_free(command); + return NULL; + } + ckd_free(command); + } + else { + E_ERROR("Compressed file operation for mode %s is not supported\n", mode); + return NULL; + } +#endif /* HAVE_POPEN */ + } + else { + fp = fopen(file, mode); + } + + return (fp); +} + + +void +fclose_comp(FILE * fp, int32 ispipe) +{ + if (ispipe) { +#ifdef HAVE_POPEN +#if defined(_WIN32) && (!defined(__SYMBIAN32__)) + _pclose(fp); +#else + pclose(fp); +#endif +#endif + } + else + fclose(fp); +} + + +FILE * +fopen_compchk(const char *file, int32 * ispipe) +{ +#ifndef HAVE_POPEN + *ispipe = 0; /* No popen() on WinCE */ + /* And therefore the rest of this function is useless. */ + return (fopen_comp(file, "r", ispipe)); +#else /* HAVE_POPEN */ + int32 isgz; + FILE *fh; + + /* First just try to fopen_comp() it */ + if ((fh = fopen_comp(file, "r", ispipe)) != NULL) + return fh; + else { + char *tmpfile; + size_t k; + + /* File doesn't exist; try other compressed/uncompressed form, as appropriate */ + guess_comptype(file, ispipe, &isgz); + k = strlen(file); + tmpfile = ckd_calloc(k+5, 1); + strcpy(tmpfile, file); + switch (isgz) { + case COMP_GZIP: + tmpfile[k - 3] = '\0'; + break; + case COMP_BZIP2: + tmpfile[k - 4] = '\0'; + break; + case COMP_COMPRESS: + tmpfile[k - 2] = '\0'; + break; + case COMP_NONE: + strcpy(tmpfile + k, ".gz"); + if ((fh = fopen_comp(tmpfile, "r", ispipe)) != NULL) { + E_WARN("Using %s instead of %s\n", tmpfile, file); + ckd_free(tmpfile); + return fh; + } + strcpy(tmpfile + k, ".bz2"); + if ((fh = fopen_comp(tmpfile, "r", ispipe)) != NULL) { + E_WARN("Using %s instead of %s\n", tmpfile, file); + ckd_free(tmpfile); + return fh; + } + strcpy(tmpfile + k, ".Z"); + if ((fh = fopen_comp(tmpfile, "r", ispipe)) != NULL) { + E_WARN("Using %s instead of %s\n", tmpfile, file); + ckd_free(tmpfile); + return fh; + } + ckd_free(tmpfile); + return NULL; + } + E_WARN("Using %s instead of %s\n", tmpfile, file); + fh = fopen_comp(tmpfile, "r", ispipe); + ckd_free(tmpfile); + return NULL; + } +#endif /* HAVE_POPEN */ +} + +lineiter_t * +lineiter_start(FILE *fh) +{ + lineiter_t *li; + + li = (lineiter_t *)ckd_calloc(1, sizeof(*li)); + li->buf = (char *)ckd_malloc(128); + li->buf[0] = '\0'; + li->bsiz = 128; + li->len = 0; + li->fh = fh; + + li = lineiter_next(li); + + /* Strip the UTF-8 BOM */ + + if (li && 0 == strncmp(li->buf, "\xef\xbb\xbf", 3)) { + memmove(li->buf, li->buf + 3, strlen(li->buf + 1)); + li->len -= 3; + } + + return li; +} + +lineiter_t * +lineiter_start_clean(FILE *fh) +{ + lineiter_t *li; + + li = lineiter_start(fh); + + if (li == NULL) + return li; + + li->clean = TRUE; + + if (li->buf && li->buf[0] == '#') { + li = lineiter_next(li); + } else { + string_trim(li->buf, STRING_BOTH); + } + + return li; +} + + +static lineiter_t * +lineiter_next_plain(lineiter_t *li) +{ + /* We are reading the next line */ + li->lineno++; + + /* Read a line and check for EOF. */ + if (fgets(li->buf, li->bsiz, li->fh) == NULL) { + lineiter_free(li); + return NULL; + } + /* If we managed to read the whole thing, then we are done + * (this will be by far the most common result). */ + li->len = (int32)strlen(li->buf); + if (li->len < li->bsiz - 1 || li->buf[li->len - 1] == '\n') + return li; + + /* Otherwise we have to reallocate and keep going. */ + while (1) { + li->bsiz *= 2; + li->buf = (char *)ckd_realloc(li->buf, li->bsiz); + /* If we get an EOF, we are obviously done. */ + if (fgets(li->buf + li->len, li->bsiz - li->len, li->fh) == NULL) { + li->len += strlen(li->buf + li->len); + return li; + } + li->len += strlen(li->buf + li->len); + /* If we managed to read the whole thing, then we are done. */ + if (li->len < li->bsiz - 1 || li->buf[li->len - 1] == '\n') + return li; + } + + /* Shouldn't get here. */ + return li; +} + + +lineiter_t * +lineiter_next(lineiter_t *li) +{ + if (!li->clean) + return lineiter_next_plain(li); + + for (li = lineiter_next_plain(li); li; li = lineiter_next_plain(li)) { + if (li->buf) { + li->buf = string_trim(li->buf, STRING_BOTH); + if (li->buf[0] != 0 && li->buf[0] != '#') + break; + } + } + return li; +} + +int lineiter_lineno(lineiter_t *li) +{ + return li->lineno; +} + +void +lineiter_free(lineiter_t *li) +{ + if (li == NULL) + return; + ckd_free(li->buf); + ckd_free(li); +} + +char * +fread_line(FILE *stream, size_t *out_len) +{ + char *output, *outptr; + char buf[128]; + + output = outptr = NULL; + while (fgets(buf, sizeof(buf), stream)) { + size_t len = strlen(buf); + /* Append this data to the buffer. */ + if (output == NULL) { + output = (char *)ckd_malloc(len + 1); + outptr = output; + } + else { + size_t cur = outptr - output; + output = (char *)ckd_realloc(output, cur + len + 1); + outptr = output + cur; + } + memcpy(outptr, buf, len + 1); + outptr += len; + /* Stop on a short read or end of line. */ + if (len < sizeof(buf)-1 || buf[len-1] == '\n') + break; + } + if (out_len) *out_len = outptr - output; + return output; +} + +#define FREAD_RETRY_COUNT 60 + +int32 +fread_retry(void *pointer, int32 size, int32 num_items, FILE * stream) +{ + char *data; + size_t n_items_read; + size_t n_items_rem; + uint32 n_retry_rem; + int32 loc; + + n_retry_rem = FREAD_RETRY_COUNT; + + data = (char *)pointer; + loc = 0; + n_items_rem = num_items; + + do { + n_items_read = fread(&data[loc], size, n_items_rem, stream); + + n_items_rem -= n_items_read; + + if (n_items_rem > 0) { + /* an incomplete read occurred */ + + if (n_retry_rem == 0) + return -1; + + if (n_retry_rem == FREAD_RETRY_COUNT) { + E_ERROR_SYSTEM("fread() failed; retrying...\n"); + } + + --n_retry_rem; + + loc += n_items_read * size; +#if !defined(_WIN32) && defined(HAVE_UNISTD_H) + sleep(1); +#endif + } + } while (n_items_rem > 0); + + return num_items; +} + + +#ifdef _WIN32_WCE /* No stat() on WinCE */ +int32 +stat_retry(const char *file, struct stat * statbuf) +{ + WIN32_FIND_DATAW file_data; + HANDLE *h; + wchar_t *wfile; + size_t len; + + len = mbstowcs(NULL, file, 0) + 1; + wfile = ckd_calloc(len, sizeof(*wfile)); + mbstowcs(wfile, file, len); + if ((h = FindFirstFileW(wfile, &file_data)) == INVALID_HANDLE_VALUE) { + ckd_free(wfile); + return -1; + } + ckd_free(wfile); + memset(statbuf, 0, sizeof(*statbuf)); + statbuf->st_mtime = file_data.ftLastWriteTime.dwLowDateTime; + statbuf->st_size = file_data.nFileSizeLow; + FindClose(h); + + return 0; +} + + +int32 +stat_mtime(const char *file) +{ + struct stat statbuf; + + if (stat_retry(file, &statbuf) != 0) + return -1; + + return ((int32) statbuf.st_mtime); +} +#else +#define STAT_RETRY_COUNT 10 +int32 +stat_retry(const char *file, struct stat * statbuf) +{ + int32 i; + + for (i = 0; i < STAT_RETRY_COUNT; i++) { +#ifndef HAVE_SYS_STAT_H + FILE *fp; + + if ((fp = (FILE *)fopen(file, "r")) != 0) { + fseek(fp, 0, SEEK_END); + statbuf->st_size = ftell(fp); + fclose(fp); + return 0; + } +#else /* HAVE_SYS_STAT_H */ + if (stat(file, statbuf) == 0) + return 0; +#endif + if (i == 0) { + E_ERROR_SYSTEM("Failed to stat file '%s'; retrying...", file); + } +#ifdef HAVE_UNISTD_H + sleep(1); +#endif + } + + return -1; +} + +int32 +stat_mtime(const char *file) +{ + struct stat statbuf; + +#ifdef HAVE_SYS_STAT_H + if (stat(file, &statbuf) != 0) + return -1; +#else /* HAVE_SYS_STAT_H */ + if (stat_retry(file, &statbuf) != 0) + return -1; +#endif /* HAVE_SYS_STAT_H */ + + return ((int32) statbuf.st_mtime); +} +#endif /* !_WIN32_WCE */ + +struct bit_encode_s { + FILE *fh; + unsigned char buf, bbits; + int16 refcount; +}; + +bit_encode_t * +bit_encode_attach(FILE *outfh) +{ + bit_encode_t *be; + + be = (bit_encode_t *)ckd_calloc(1, sizeof(*be)); + be->refcount = 1; + be->fh = outfh; + return be; +} + +bit_encode_t * +bit_encode_retain(bit_encode_t *be) +{ + ++be->refcount; + return be; +} + +int +bit_encode_free(bit_encode_t *be) +{ + if (be == NULL) + return 0; + if (--be->refcount > 0) + return be->refcount; + ckd_free(be); + + return 0; +} + +int +bit_encode_write(bit_encode_t *be, unsigned char const *bits, int nbits) +{ + int tbits; + + tbits = nbits + be->bbits; + if (tbits < 8) { + /* Append to buffer. */ + be->buf |= ((bits[0] >> (8 - nbits)) << (8 - tbits)); + } + else { + int i = 0; + while (tbits >= 8) { + /* Shift bits out of the buffer and splice with high-order bits */ + fputc(be->buf | ((bits[i]) >> be->bbits), be->fh); + /* Put low-order bits back into buffer */ + be->buf = (bits[i] << (8 - be->bbits)) & 0xff; + tbits -= 8; + ++i; + } + } + /* tbits contains remaining number of bits. */ + be->bbits = tbits; + + return nbits; +} + +int +bit_encode_write_cw(bit_encode_t *be, uint32 codeword, int nbits) +{ + unsigned char bits[4]; + codeword <<= (32 - nbits); + bits[0] = (codeword >> 24) & 0xff; + bits[1] = (codeword >> 16) & 0xff; + bits[2] = (codeword >> 8) & 0xff; + bits[3] = codeword & 0xff; + return bit_encode_write(be, bits, nbits); +} + +int +bit_encode_flush(bit_encode_t *be) +{ + if (be->bbits) { + fputc(be->buf, be->fh); + be->bbits = 0; + } + return 0; +} + +int +build_directory(const char *path) +{ + int rv; + + /* Utterly failed... */ + if (strlen(path) == 0) + return -1; + +#if defined(_WIN32) && !defined(CYGWIN) + else if ((rv = _mkdir(path)) == 0) + return 0; +#elif defined(HAVE_SYS_STAT_H) /* Unix, Cygwin, doesn't work on MINGW */ + else if ((rv = mkdir(path, 0777)) == 0) + return 0; +#endif + + /* Or, it already exists... */ + else if (errno == EEXIST) + return 0; + else if (errno != ENOENT) { + E_ERROR_SYSTEM("Failed to create %s", path); + return -1; + } + else { + char *dirname = ckd_salloc(path); + path2dirname(path, dirname); + build_directory(dirname); + ckd_free(dirname); + +#if defined(_WIN32) && !defined(CYGWIN) + return _mkdir(path); +#elif defined(HAVE_SYS_STAT_H) /* Unix, Cygwin, doesn't work on MINGW */ + return mkdir(path, 0777); +#endif + } + return -1; //control should never reach here; fixes some compiler warnings +} diff --git a/src/util/pio.h b/src/util/pio.h new file mode 100644 index 0000000..2eb23ac --- /dev/null +++ b/src/util/pio.h @@ -0,0 +1,291 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * pio.h -- Packaged I/O routines. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: pio.h,v $ + * Revision 1.3 2005/06/22 08:00:09 arthchan2003 + * Completed all doxygen documentation on file description for libs3decoder/libutil/libs3audio and programs. + * + * Revision 1.2 2005/06/22 03:09:52 arthchan2003 + * 1, Fixed doxygen documentation, 2, Added keyword. + * + * Revision 1.2 2005/06/16 00:14:08 archan + * Added const keyword to file argument for file_open + * + * Revision 1.1 2005/06/15 06:11:03 archan + * sphinx3 to s3.generic: change io.[ch] to pio.[ch] + * + * Revision 1.5 2005/06/15 04:21:46 archan + * 1, Fixed doxygen-documentation, 2, Add keyword such that changes will be logged into a file. + * + * Revision 1.4 2005/04/20 03:49:32 archan + * Add const to string argument of myfopen. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 08-Dec-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added stat_mtime(). + * + * 11-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added _myfopen() and myfopen macro. + * + * 05-Sep-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Started. + */ + + +#ifndef _LIBUTIL_IO_H_ +#define _LIBUTIL_IO_H_ + +#include +#if !defined(_WIN32_WCE) && !(defined(__ADSPBLACKFIN__) && !defined(__linux__)) +#include +#endif + +#include +#include + +/** \file pio.h + * \brief file IO related operations. + * + * Custom fopen with error checking is implemented. fopen_comp can + * open a file with .z, .Z, .gz or .GZ extension + * + * WARNING: Usage of stat_retry will results in 100s of waiting time + * if the file doesn't exist. +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Like fopen, but use popen and zcat if it is determined that "file" is compressed + * (i.e., has a .z, .Z, .gz, or .GZ extension). + */ +FILE *fopen_comp (const char *file, /**< In: File to be opened */ + const char *mode, /**< In: "r" or "w", as with normal fopen */ + int32 *ispipe /**< Out: On return *ispipe is TRUE iff file + was opened via a pipe */ + ); + +/** + * Close a file opened using fopen_comp. + */ +void fclose_comp (FILE *fp, /**< In: File pointer to be closed */ + int32 ispipe /**< In: ispipe argument that was returned by the + corresponding fopen_comp() call */ + ); + +/** + * Open a file for reading, but if file not present try to open compressed version (if + * file is uncompressed, and vice versa). + */ +FILE *fopen_compchk (const char *file, /**< In: File to be opened */ + int32 *ispipe /**< Out: On return *ispipe is TRUE iff file + was opened via a pipe */ + ); + +/** + * Wrapper around fopen to check for failure and E_FATAL if failed. + */ +FILE *_myfopen(const char *file, const char *mode, + const char *pgm, int32 line); /* In: __FILE__, __LINE__ from where called */ +#define myfopen(file,mode) _myfopen((file),(mode),__FILE__,__LINE__) + + +/** + * NFS file reads seem to fail now and then. Use the following functions in place of + * the regular fread. It retries failed freads several times and quits only if all of + * them fail. Be aware, however, that even normal failures such as attempting to read + * beyond EOF will trigger such retries, wasting about a minute in retries. + * Arguments identical to regular fread. + */ +int32 fread_retry(void *pointer, int32 size, int32 num_items, FILE *stream); + +/** + * Read a line of arbitrary length from a file and return it as a + * newly allocated string. + * + * @deprecated Use line iterators instead. + * + * @param stream The file handle to read from. + * @param out_len Output: if not NULL, length of the string read. + * @return allocated string containing the line, or NULL on error or EOF. + */ +POCKETSPHINX_EXPORT +char *fread_line(FILE *stream, size_t *out_len); + +/** + * Line iterator for files. + */ +typedef struct lineiter_t { + char *buf; + FILE *fh; + int32 bsiz; + int32 len; + int32 clean; + int32 lineno; +} lineiter_t; + +/** + * Start reading lines from a file. + */ +POCKETSPHINX_EXPORT +lineiter_t *lineiter_start(FILE *fh); + +/** + * Start reading lines from a file, skip comments and trim lines. + */ +lineiter_t *lineiter_start_clean(FILE *fh); + +/** + * Move to the next line in the file. + */ +POCKETSPHINX_EXPORT +lineiter_t *lineiter_next(lineiter_t *li); + +/** + * Stop reading lines from a file. + */ +void lineiter_free(lineiter_t *li); + +/** + * Returns current line number. + */ +int lineiter_lineno(lineiter_t *li); + + +#ifdef _WIN32_WCE +/* Fake this for WinCE which has no stat() */ +#include +struct stat { + DWORD st_mtime; + DWORD st_size; +}; +#endif /* _WIN32_WCE */ + +#if defined(__ADSPBLACKFIN__) && !defined(__linux__) +struct stat { + int32 st_mtime; + int32 st_size; +}; + +#endif + +/** + * Bitstream encoder - for writing compressed files. + */ +typedef struct bit_encode_s bit_encode_t; + +/** + * Attach bitstream encoder to a file. + */ +bit_encode_t *bit_encode_attach(FILE *outfh); + +/** + * Retain pointer to a bit encoder. + */ +bit_encode_t *bit_encode_retain(bit_encode_t *be); + +/** + * Release pointer to a bit encoder. + * + * Note that this does NOT flush any leftover bits. + */ +int bit_encode_free(bit_encode_t *be); + +/** + * Write bits to encoder. + */ +int bit_encode_write(bit_encode_t *be, unsigned char const *bits, int nbits); + +/** + * Write lowest-order bits of codeword to encoder. + */ +int bit_encode_write_cw(bit_encode_t *be, uint32 codeword, int nbits); + +/** + * Flush any unwritten bits, zero-padding if necessary. + */ +int bit_encode_flush(bit_encode_t *be); + +/** + * There is no bitstream decoder, because a stream abstraction is too + * slow. Instead we read blocks of bits and treat them as bitvectors. + */ + +/** + * Like fread_retry, but for stat. Arguments identical to regular stat. + * Return value: 0 if successful, -1 if stat failed several attempts. + */ +int32 stat_retry (const char *file, struct stat *statbuf); + +/** + * Return time of last modification for the given file, or -1 if stat fails. + */ + +int32 stat_mtime (const char *file); + +/** + * Create a directory and all of its parent directories, as needed. + * + * @return 0 on success, <0 on failure. + */ +POCKETSPHINX_EXPORT +int build_directory(const char *path); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/util/priority_queue.c b/src/util/priority_queue.c new file mode 100644 index 0000000..991bba1 --- /dev/null +++ b/src/util/priority_queue.c @@ -0,0 +1,145 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "util/priority_queue.h" +#include "util/ckd_alloc.h" + +struct priority_queue_s { + void **pointers; + size_t alloc_size; + size_t size; + void *max_element; + int (*compare)(const void *a, const void *b); +}; + +priority_queue_t* priority_queue_create(size_t len, int (*compare)(const void *a, const void *b)) +{ + priority_queue_t* queue; + + queue = (priority_queue_t *)ckd_calloc(1, sizeof(*queue)); + queue->alloc_size = len; + queue->pointers = (void **)ckd_calloc(len, sizeof(*queue->pointers)); + queue->size = 0; + queue->max_element = NULL; + queue->compare = compare; + + return queue; +} + +void* priority_queue_poll(priority_queue_t *queue) +{ + + size_t i; + void *res; + + if (queue->size == 0) { + E_WARN("Trying to poll from empty queue\n"); + return NULL; + } + if (queue->max_element == NULL) { + E_ERROR("Trying to poll from queue and max element is undefined\n"); + return NULL; + } + res = queue->max_element; + for (i = 0; i < queue->alloc_size; i++) { + if (queue->pointers[i] == queue->max_element) { + queue->pointers[i] = NULL; + break; + } + } + queue->max_element = NULL; + for (i = 0; i < queue->alloc_size; i++) { + if (queue->pointers[i] == 0) + continue; + if (queue->max_element == NULL) { + queue->max_element = queue->pointers[i]; + } else { + if (queue->compare(queue->pointers[i], queue->max_element) < 0) + queue->max_element = queue->pointers[i]; + } + } + queue->size--; + return res; +} + +void priority_queue_add(priority_queue_t *queue, void *element) +{ + size_t i; + if (queue->size == queue->alloc_size) { + E_ERROR("Trying to add element into full queue\n"); + return; + } + for (i = 0; i < queue->alloc_size; i++) { + if (queue->pointers[i] == NULL) { + queue->pointers[i] = element; + break; + } + } + + if (queue->max_element == NULL || queue->compare(element, queue->max_element) < 0) { + queue->max_element = element; + } + queue->size++; +} + +size_t priority_queue_size(priority_queue_t *queue) +{ + return queue->size; +} + +void priority_queue_free(priority_queue_t *queue, void (*free_ptr)(void *a)) +{ + size_t i; + + for (i = 0; i < queue->alloc_size; i++) { + if (queue->pointers[i] != NULL) { + if (free_ptr == NULL) { + ckd_free(queue->pointers[i]); + } else { + free_ptr(queue->pointers[i]); + } + } + } + ckd_free(queue->pointers); + ckd_free(queue); +} diff --git a/src/util/priority_queue.h b/src/util/priority_queue.h new file mode 100644 index 0000000..cc9eafd --- /dev/null +++ b/src/util/priority_queue.h @@ -0,0 +1,41 @@ +#ifndef __PRIORITY_QUEUE_H__ +#define __PRIORITY_QUEUE_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * @file priority_queue.h + * @brief Priority queue for max element tracking. + * + * The one expects heap here, but for current application + * (sorting of ngram entries one per order, i.e. maximum 10) + * i'll put just and array here, so each operation takes linear time. + * I swear to rework it some day! + * TODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODO!!!!! + */ + +typedef struct priority_queue_s priority_queue_t; + +priority_queue_t* priority_queue_create(size_t len, int (*compare)(const void *a, const void *b)); + +void* priority_queue_poll(priority_queue_t *queue); + +void priority_queue_add(priority_queue_t *queue, void *element); + +size_t priority_queue_size(priority_queue_t *queue); + +void priority_queue_free(priority_queue_t *queue, void (*free_ptr)(void *a)); + +#ifdef __cplusplus +} +#endif + +#endif /* __PRIORITY_QUEUE_H__ */ diff --git a/src/util/profile.c b/src/util/profile.c new file mode 100644 index 0000000..d446cde --- /dev/null +++ b/src/util/profile.c @@ -0,0 +1,346 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2001 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * profile.c -- For timing and event counting. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: profile.c,v $ + * Revision 1.7 2005/06/22 03:10:59 arthchan2003 + * 1, Fixed doxygen documentation, 2, Added keyword. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 11-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added ptmr_init(). + * + * 19-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#if defined(_WIN32) && !defined(__SYMBIAN32__) +# include +# ifndef _WIN32_WCE +# include +# endif +#elif defined(HAVE_UNISTD_H) /* I know this, this is Unix... */ +# include +# include +# include +#endif + +#ifdef _MSC_VER +#pragma warning (disable: 4996) +#endif + +#include + +#include "util/profile.h" +#include "util/ckd_alloc.h" + +#if defined(_WIN32_WCE) || defined(_WIN32_WP) +DWORD unlink(const char *filename) +{ + WCHAR *wfilename; + DWORD rv; + size_t len; + + len = mbstowcs(NULL, filename, 0); + wfilename = ckd_calloc(len+1, sizeof(*wfilename)); + mbstowcs(wfilename, filename, len); + rv = DeleteFileW(wfilename); + ckd_free(wfilename); + + return rv; +} +#endif + +pctr_t * +pctr_new(char *nm) +{ + pctr_t *pc; + + pc = ckd_calloc(1, sizeof(pctr_t)); + pc->name = ckd_salloc(nm); + pc->count = 0; + + return pc; +} + +void +pctr_reset(pctr_t * ctr) +{ + ctr->count = 0; +} + + +void +pctr_increment(pctr_t * ctr, int32 inc) +{ + ctr->count += inc; + /* E_INFO("Name %s, Count %d, inc %d\n",ctr->name, ctr->count, inc); */ +} + +void +pctr_print(FILE * fp, pctr_t * ctr) +{ + fprintf(fp, "CTR:"); + fprintf(fp, "[%d %s]", ctr->count, ctr->name); +} + +void +pctr_free(pctr_t * pc) +{ + if (pc) { + if (pc->name) + ckd_free(pc->name); + } + ckd_free(pc); +} + + +#if defined(_WIN32) && !defined(GNUWINCE) && !defined(__SYMBIAN32__) + +#define TM_LOWSCALE 1e-7 +#define TM_HIGHSCALE (4294967296.0 * TM_LOWSCALE); + +static float64 +make_sec(FILETIME * tm) +{ + float64 dt; + + dt = tm->dwLowDateTime * TM_LOWSCALE; + dt += tm->dwHighDateTime * TM_HIGHSCALE; + + return (dt); +} + +#else /* NOT WINDOWS */ + +static float64 +make_sec(struct timeval *s) +{ + return (s->tv_sec + s->tv_usec * 0.000001); +} + +#endif + + +void +ptmr_start(ptmr_t * tm) +{ +#if (! defined(_WIN32)) || defined(GNUWINCE) || defined(__SYMBIAN32__) + struct timeval e_start; /* Elapsed time */ + +#if (! defined(_HPUX_SOURCE)) && (! defined(__SYMBIAN32__)) + struct rusage start; /* CPU time */ + + /* Unix but not HPUX */ + getrusage(RUSAGE_SELF, &start); + tm->start_cpu = make_sec(&start.ru_utime) + make_sec(&start.ru_stime); +#endif + /* Unix + HP */ + gettimeofday(&e_start, 0); + tm->start_elapsed = make_sec(&e_start); +#elif defined(_WIN32_WP) + tm->start_cpu = GetTickCount64() / 1000; + tm->start_elapsed = GetTickCount64() / 1000; +#elif defined(_WIN32_WCE) + /* No GetProcessTimes() on WinCE. (Note CPU time will be bogus) */ + tm->start_cpu = GetTickCount() / 1000; + tm->start_elapsed = GetTickCount() / 1000; +#else + HANDLE pid; + FILETIME t_create, t_exit, kst, ust; + + /* PC */ + pid = GetCurrentProcess(); + GetProcessTimes(pid, &t_create, &t_exit, &kst, &ust); + tm->start_cpu = make_sec(&ust) + make_sec(&kst); + + tm->start_elapsed = (float64) clock() / CLOCKS_PER_SEC; +#endif +} + + +void +ptmr_stop(ptmr_t * tm) +{ + float64 dt_cpu, dt_elapsed; + +#if (! defined(_WIN32)) || defined(GNUWINCE) || defined(__SYMBIAN32__) + struct timeval e_stop; /* Elapsed time */ + +#if (! defined(_HPUX_SOURCE)) && (! defined(__SYMBIAN32__)) + struct rusage stop; /* CPU time */ + + /* Unix but not HPUX */ + getrusage(RUSAGE_SELF, &stop); + dt_cpu = + make_sec(&stop.ru_utime) + make_sec(&stop.ru_stime) - + tm->start_cpu; +#else + dt_cpu = 0.0; +#endif + /* Unix + HP */ + gettimeofday(&e_stop, 0); + dt_elapsed = (make_sec(&e_stop) - tm->start_elapsed); +#elif defined(_WIN32_WP) + dt_cpu = GetTickCount64() / 1000 - tm->start_cpu; + dt_elapsed = GetTickCount64() / 1000 - tm->start_elapsed; +#elif defined(_WIN32_WCE) + /* No GetProcessTimes() on WinCE. (Note CPU time will be bogus) */ + dt_cpu = GetTickCount() / 1000 - tm->start_cpu; + dt_elapsed = GetTickCount() / 1000 - tm->start_elapsed; +#else + HANDLE pid; + FILETIME t_create, t_exit, kst, ust; + + /* PC */ + pid = GetCurrentProcess(); + GetProcessTimes(pid, &t_create, &t_exit, &kst, &ust); + dt_cpu = make_sec(&ust) + make_sec(&kst) - tm->start_cpu; + dt_elapsed = ((float64) clock() / CLOCKS_PER_SEC) - tm->start_elapsed; +#endif + + tm->t_cpu += dt_cpu; + tm->t_elapsed += dt_elapsed; + + tm->t_tot_cpu += dt_cpu; + tm->t_tot_elapsed += dt_elapsed; +} + + +void +ptmr_reset(ptmr_t * tm) +{ + tm->t_cpu = 0.0; + tm->t_elapsed = 0.0; +} + + +void +ptmr_init(ptmr_t * tm) +{ + tm->t_cpu = 0.0; + tm->t_elapsed = 0.0; + tm->t_tot_cpu = 0.0; + tm->t_tot_elapsed = 0.0; +} + + +void +ptmr_reset_all(ptmr_t * tm) +{ + for (; tm->name; tm++) + ptmr_reset(tm); +} + + +void +ptmr_print_all(FILE * fp, ptmr_t * tm, float64 norm) +{ + if (norm != 0.0) { + norm = 1.0 / norm; + for (; tm->name; tm++) + fprintf(fp, " %6.2fx %s", tm->t_cpu * norm, tm->name); + } +} + + +int32 +host_endian(void) +{ + FILE *fp; + int32 BYTE_ORDER_MAGIC; + char *file; + char buf[8]; + int32 k, endian; + + file = "/tmp/__EnDiAn_TeSt__"; + + if ((fp = fopen(file, "wb")) == NULL) { + E_ERROR("Failed to open file '%s' for writing", file); + return -1; + } + + BYTE_ORDER_MAGIC = (int32) 0x11223344; + + k = (int32) BYTE_ORDER_MAGIC; + if (fwrite(&k, sizeof(int32), 1, fp) != 1) { + E_ERROR("Failed to write to file '%s'\n", file); + fclose(fp); + unlink(file); + return -1; + } + + fclose(fp); + if ((fp = fopen(file, "rb")) == NULL) { + E_ERROR_SYSTEM("Failed to open file '%s' for reading", file); + unlink(file); + return -1; + } + if (fread(buf, 1, sizeof(int32), fp) != sizeof(int32)) { + E_ERROR("Failed to read from file '%s'\n", file); + fclose(fp); + unlink(file); + return -1; + } + fclose(fp); + unlink(file); + + /* If buf[0] == lsB of BYTE_ORDER_MAGIC, we are little-endian */ + endian = (buf[0] == (BYTE_ORDER_MAGIC & 0x000000ff)) ? 1 : 0; + + return (endian); +} diff --git a/src/util/profile.h b/src/util/profile.h new file mode 100644 index 0000000..72ba834 --- /dev/null +++ b/src/util/profile.h @@ -0,0 +1,216 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2001 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * profile.h -- For timing and event counting. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: profile.h,v $ + * Revision 1.10 2005/06/22 03:10:59 arthchan2003 + * 1, Fixed doxygen documentation, 2, Added keyword. + * + * Revision 1.5 2005/06/15 04:21:47 archan + * 1, Fixed doxygen-documentation, 2, Add keyword such that changes will be logged into a file. + * + * Revision 1.4 2005/04/25 19:22:48 archan + * Refactor out the code of rescoring from lexical tree. Potentially we want to turn off the rescoring if we need. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 11-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added ptmr_init(). + * + * 19-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created from earlier Sphinx-3 version. + */ + + +#ifndef _LIBUTIL_PROFILE_H_ +#define _LIBUTIL_PROFILE_H_ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} /* Fool Emacs into not indenting things. */ +#endif + +/** \file profile.h + * \brief Implementation of profiling, include counting , timing, cpu clock checking + * + * Currently, function host_endian is also in this function. It is + * not documented. + */ + +#include + +#include + + +/** + * \struct pctr_t + * + * Generic event counter for profiling. User is responsible for allocating an array + * of the desired number. There should be a sentinel with name = NULL. + */ +typedef struct { + char *name; /**< Counter print name; NULL + terminates array of counters + Used by pctr_print_all */ + int32 count; /**< Counter value */ +} pctr_t; + +/** + * operations of pctr_t + */ + +/** + * Initialize a counter + * @return an initialized counter + */ +pctr_t* pctr_new ( + char *name /**< The name of the counter */ + ); + +/** + * Reset a counter + */ + +void pctr_reset (pctr_t *ctr /**< A pointer of a counter */ + ); + +/** + * Print a counter + */ +void pctr_print(FILE *fp, /**< A file pointer */ + pctr_t *ctr /**< A pointer of a counter */ + ); + +/** + * Increment a counter + */ +void pctr_increment (pctr_t *ctr, /**< A pointer of a counter */ + int32 inc /**< The increment of the counter */ + ); + +/** + Free the counter +*/ +void pctr_free(pctr_t* ctr /**< A pointer of a counter */ + ); + + +/** + * \struct ptmr_t + * Generic timer structures and functions for coarse-grained performance measurements + * using standard system calls. + */ +typedef struct { + const char *name; /**< Timer print name; NULL terminates an array of timers. + Used by ptmr_print_all */ + float64 t_cpu; /**< CPU time accumulated since most recent reset op */ + float64 t_elapsed; /**< Elapsed time accumulated since most recent reset */ + float64 t_tot_cpu; /**< Total CPU time since creation */ + float64 t_tot_elapsed; /**< Total elapsed time since creation */ + float64 start_cpu; /**< ---- FOR INTERNAL USE ONLY ---- */ + float64 start_elapsed; /**< ---- FOR INTERNAL USE ONLY ---- */ +} ptmr_t; + + + +/** Start timing using tmr */ +void ptmr_start (ptmr_t *tmr /**< The timer*/ + ); + +/** Stop timing and accumulate tmr->{t_cpu, t_elapsed, t_tot_cpu, t_tot_elapsed} */ +void ptmr_stop (ptmr_t *tmr /**< The timer*/ + ); + +/** Reset tmr->{t_cpu, t_elapsed} to 0.0 */ +void ptmr_reset (ptmr_t *tmr /**< The timer*/ + ); + +/** Reset tmr->{t_cpu, t_elapsed, t_tot_cpu, t_tot_elapsed} to 0.0 + */ +void ptmr_init (ptmr_t *tmr /**< The timer*/ + ); + + +/** + * Reset t_cpu, t_elapsed of all timer modules in array tmr[] to 0.0. + * The array should be terminated with a sentinel with .name = NULL. + */ +void ptmr_reset_all (ptmr_t *tmr /**< The timer*/ + ); + +/** + * Print t_cpu for all timer modules in tmr[], normalized by norm (i.e., t_cpu/norm). + * The array should be terminated with a sentinel with .name = NULL. + */ +void ptmr_print_all (FILE *fp, /**< The file pointer */ + ptmr_t *tmr, /**< The timer*/ + float64 norm + ); + + +/** + * Return the processor clock speed (in MHz); only available on some machines (Alphas). + * The dummy argument can be any integer value. + */ +int32 host_pclk (int32 dummy); + + +/* + * Check the native byte-ordering of the machine by writing a magic + * number to a temporary file and reading it back. * Return value: + * 0 if BIG-ENDIAN, 1 if LITTLE-ENDIAN, -1 if error. + */ +int32 host_endian ( void ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/util/slamch.c b/src/util/slamch.c new file mode 100644 index 0000000..1016223 --- /dev/null +++ b/src/util/slamch.c @@ -0,0 +1,1029 @@ +/* src/slamch.f -- translated by f2c (version 20050501). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#include "util/f2c.h" + +#ifdef _MSC_VER +#pragma warning (disable: 4244) +#endif + +/* Table of constant values */ + +static integer c__1 = 1; +static real c_b32 = 0.f; + +doublereal +slamch_(char *cmach, ftnlen cmach_len) +{ + /* Initialized data */ + (void)cmach_len; + static logical first = TRUE_; + + /* System generated locals */ + integer i__1; + real ret_val; + + /* Builtin functions */ + double pow_ri(real *, integer *); + + /* Local variables */ + static real t; + static integer it; + static real rnd, eps, base; + static integer beta; + static real emin, prec, emax; + static integer imin, imax; + static logical lrnd; + static real rmin, rmax, rmach; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + static real small, sfmin; + extern /* Subroutine */ int slamc2_(integer *, integer *, logical *, real + *, integer *, real *, integer *, + real *); + + +/* -- LAPACK auxiliary routine (version 3.0) -- */ +/* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */ +/* Courant Institute, Argonne National Lab, and Rice University */ +/* October 31, 1992 */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* Purpose */ +/* ======= */ + +/* SLAMCH determines single precision machine parameters. */ + +/* Arguments */ +/* ========= */ + +/* CMACH (input) CHARACTER*1 */ +/* Specifies the value to be returned by SLAMCH: */ +/* = 'E' or 'e', SLAMCH := eps */ +/* = 'S' or 's , SLAMCH := sfmin */ +/* = 'B' or 'b', SLAMCH := base */ +/* = 'P' or 'p', SLAMCH := eps*base */ +/* = 'N' or 'n', SLAMCH := t */ +/* = 'R' or 'r', SLAMCH := rnd */ +/* = 'M' or 'm', SLAMCH := emin */ +/* = 'U' or 'u', SLAMCH := rmin */ +/* = 'L' or 'l', SLAMCH := emax */ +/* = 'O' or 'o', SLAMCH := rmax */ + +/* where */ + +/* eps = relative machine precision */ +/* sfmin = safe minimum, such that 1/sfmin does not overflow */ +/* base = base of the machine */ +/* prec = eps*base */ +/* t = number of (base) digits in the mantissa */ +/* rnd = 1.0 when rounding occurs in addition, 0.0 otherwise */ +/* emin = minimum exponent before (gradual) underflow */ +/* rmin = underflow threshold - base**(emin-1) */ +/* emax = largest exponent before overflow */ +/* rmax = overflow threshold - (base**emax)*(1-eps) */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Save statement .. */ +/* .. */ +/* .. Data statements .. */ +/* .. */ +/* .. Executable Statements .. */ + + if (first) { + first = FALSE_; + slamc2_(&beta, &it, &lrnd, &eps, &imin, &rmin, &imax, &rmax); + base = (real) beta; + t = (real) it; + if (lrnd) { + rnd = 1.f; + i__1 = 1 - it; + eps = pow_ri(&base, &i__1) / 2; + } + else { + rnd = 0.f; + i__1 = 1 - it; + eps = pow_ri(&base, &i__1); + } + prec = eps * base; + emin = (real) imin; + emax = (real) imax; + sfmin = rmin; + small = 1.f / rmax; + if (small >= sfmin) { + +/* Use SMALL plus a bit, to avoid the possibility of rounding */ +/* causing overflow when computing 1/sfmin. */ + + sfmin = small * (eps + 1.f); + } + } + + if (lsame_(cmach, "E", (ftnlen) 1, (ftnlen) 1)) { + rmach = eps; + } + else if (lsame_(cmach, "S", (ftnlen) 1, (ftnlen) 1)) { + rmach = sfmin; + } + else if (lsame_(cmach, "B", (ftnlen) 1, (ftnlen) 1)) { + rmach = base; + } + else if (lsame_(cmach, "P", (ftnlen) 1, (ftnlen) 1)) { + rmach = prec; + } + else if (lsame_(cmach, "N", (ftnlen) 1, (ftnlen) 1)) { + rmach = t; + } + else if (lsame_(cmach, "R", (ftnlen) 1, (ftnlen) 1)) { + rmach = rnd; + } + else if (lsame_(cmach, "M", (ftnlen) 1, (ftnlen) 1)) { + rmach = emin; + } + else if (lsame_(cmach, "U", (ftnlen) 1, (ftnlen) 1)) { + rmach = rmin; + } + else if (lsame_(cmach, "L", (ftnlen) 1, (ftnlen) 1)) { + rmach = emax; + } + else if (lsame_(cmach, "O", (ftnlen) 1, (ftnlen) 1)) { + rmach = rmax; + } + + ret_val = rmach; + return ret_val; + +/* End of SLAMCH */ + +} /* slamch_ */ + + +/* *********************************************************************** */ + +/* Subroutine */ int +slamc1_(integer * beta, integer * t, logical * rnd, logical * ieee1) +{ + /* Initialized data */ + + static logical first = TRUE_; + + /* System generated locals */ + real r__1, r__2; + + /* Local variables */ + static real a, b, c__, f, t1, t2; + static integer lt; + static real one, qtr; + static logical lrnd; + static integer lbeta; + static real savec; + static logical lieee1; + extern doublereal slamc3_(real *, real *); + + +/* -- LAPACK auxiliary routine (version 3.0) -- */ +/* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */ +/* Courant Institute, Argonne National Lab, and Rice University */ +/* October 31, 1992 */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* Purpose */ +/* ======= */ + +/* SLAMC1 determines the machine parameters given by BETA, T, RND, and */ +/* IEEE1. */ + +/* Arguments */ +/* ========= */ + +/* BETA (output) INTEGER */ +/* The base of the machine. */ + +/* T (output) INTEGER */ +/* The number of ( BETA ) digits in the mantissa. */ + +/* RND (output) LOGICAL */ +/* Specifies whether proper rounding ( RND = .TRUE. ) or */ +/* chopping ( RND = .FALSE. ) occurs in addition. This may not */ +/* be a reliable guide to the way in which the machine performs */ +/* its arithmetic. */ + +/* IEEE1 (output) LOGICAL */ +/* Specifies whether rounding appears to be done in the IEEE */ +/* 'round to nearest' style. */ + +/* Further Details */ +/* =============== */ + +/* The routine is based on the routine ENVRON by Malcolm and */ +/* incorporates suggestions by Gentleman and Marovich. See */ + +/* Malcolm M. A. (1972) Algorithms to reveal properties of */ +/* floating-point arithmetic. Comms. of the ACM, 15, 949-951. */ + +/* Gentleman W. M. and Marovich S. B. (1974) More on algorithms */ +/* that reveal properties of floating point arithmetic units. */ +/* Comms. of the ACM, 17, 276-277. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Save statement .. */ +/* .. */ +/* .. Data statements .. */ +/* .. */ +/* .. Executable Statements .. */ + + if (first) { + first = FALSE_; + one = 1.f; + +/* LBETA, LIEEE1, LT and LRND are the local values of BETA, */ +/* IEEE1, T and RND. */ + +/* Throughout this routine we use the function SLAMC3 to ensure */ +/* that relevant values are stored and not held in registers, or */ +/* are not affected by optimizers. */ + +/* Compute a = 2.0**m with the smallest positive integer m such */ +/* that */ + +/* fl( a + 1.0 ) = a. */ + + a = 1.f; + c__ = 1.f; + +/* + WHILE( C.EQ.ONE )LOOP */ + L10: + if (c__ == one) { + a *= 2; + c__ = slamc3_(&a, &one); + r__1 = -a; + c__ = slamc3_(&c__, &r__1); + goto L10; + } +/* + END WHILE */ + +/* Now compute b = 2.0**m with the smallest positive integer m */ +/* such that */ + +/* fl( a + b ) .gt. a. */ + + b = 1.f; + c__ = slamc3_(&a, &b); + +/* + WHILE( C.EQ.A )LOOP */ + L20: + if (c__ == a) { + b *= 2; + c__ = slamc3_(&a, &b); + goto L20; + } +/* + END WHILE */ + +/* Now compute the base. a and c are neighbouring floating point */ +/* numbers in the interval ( beta**t, beta**( t + 1 ) ) and so */ +/* their difference is beta. Adding 0.25 to c is to ensure that it */ +/* is truncated to beta and not ( beta - 1 ). */ + + qtr = one / 4; + savec = c__; + r__1 = -a; + c__ = slamc3_(&c__, &r__1); + lbeta = c__ + qtr; + +/* Now determine whether rounding or chopping occurs, by adding a */ +/* bit less than beta/2 and a bit more than beta/2 to a. */ + + b = (real) lbeta; + r__1 = b / 2; + r__2 = -b / 100; + f = slamc3_(&r__1, &r__2); + c__ = slamc3_(&f, &a); + if (c__ == a) { + lrnd = TRUE_; + } + else { + lrnd = FALSE_; + } + r__1 = b / 2; + r__2 = b / 100; + f = slamc3_(&r__1, &r__2); + c__ = slamc3_(&f, &a); + if (lrnd && c__ == a) { + lrnd = FALSE_; + } + +/* Try and decide whether rounding is done in the IEEE 'round to */ +/* nearest' style. B/2 is half a unit in the last place of the two */ +/* numbers A and SAVEC. Furthermore, A is even, i.e. has last bit */ +/* zero, and SAVEC is odd. Thus adding B/2 to A should not change */ +/* A, but adding B/2 to SAVEC should change SAVEC. */ + + r__1 = b / 2; + t1 = slamc3_(&r__1, &a); + r__1 = b / 2; + t2 = slamc3_(&r__1, &savec); + lieee1 = t1 == a && t2 > savec && lrnd; + +/* Now find the mantissa, t. It should be the integer part of */ +/* log to the base beta of a, however it is safer to determine t */ +/* by powering. So we find t as the smallest positive integer for */ +/* which */ + +/* fl( beta**t + 1.0 ) = 1.0. */ + + lt = 0; + a = 1.f; + c__ = 1.f; + +/* + WHILE( C.EQ.ONE )LOOP */ + L30: + if (c__ == one) { + ++lt; + a *= lbeta; + c__ = slamc3_(&a, &one); + r__1 = -a; + c__ = slamc3_(&c__, &r__1); + goto L30; + } +/* + END WHILE */ + + } + + *beta = lbeta; + *t = lt; + *rnd = lrnd; + *ieee1 = lieee1; + return 0; + +/* End of SLAMC1 */ + +} /* slamc1_ */ + + +/* *********************************************************************** */ + +/* Subroutine */ int +slamc2_(integer * beta, integer * t, logical * rnd, real * + eps, integer * emin, real * rmin, integer * emax, real * rmax) +{ + /* Initialized data */ + + static logical first = TRUE_; + static logical iwarn = FALSE_; + + /* Format strings */ + static char fmt_9999[] = + "(//\002 WARNING. The value EMIN may be incorre" + "ct:-\002,\002 EMIN = \002,i8,/\002 If, after inspection, the va" + "lue EMIN looks\002,\002 acceptable please comment out \002,/\002" + " the IF block as marked within the code of routine\002,\002 SLAM" + "C2,\002,/\002 otherwise supply EMIN explicitly.\002,/)"; + + /* System generated locals */ + integer i__1; + real r__1, r__2, r__3, r__4, r__5; + + /* Builtin functions */ + double pow_ri(real *, integer *); + integer s_wsfe(cilist *), do_fio(integer *, char *, ftnlen), + e_wsfe(void); + + /* Local variables */ + static real a, b, c__; + static integer i__, lt; + static real one, two; + static logical ieee; + static real half; + static logical lrnd; + static real leps, zero; + static integer lbeta; + static real rbase; + static integer lemin, lemax, gnmin; + static real small; + static integer gpmin; + static real third, lrmin, lrmax, sixth; + static logical lieee1; + extern /* Subroutine */ int slamc1_(integer *, integer *, logical *, + logical *); + extern doublereal slamc3_(real *, real *); + extern /* Subroutine */ int slamc4_(integer *, real *, integer *), + slamc5_(integer *, integer *, integer *, logical *, integer *, + real *); + static integer ngnmin, ngpmin; + + /* Fortran I/O blocks */ + static cilist io___58 = { 0, 6, 0, fmt_9999, 0 }; + + + +/* -- LAPACK auxiliary routine (version 3.0) -- */ +/* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */ +/* Courant Institute, Argonne National Lab, and Rice University */ +/* October 31, 1992 */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* Purpose */ +/* ======= */ + +/* SLAMC2 determines the machine parameters specified in its argument */ +/* list. */ + +/* Arguments */ +/* ========= */ + +/* BETA (output) INTEGER */ +/* The base of the machine. */ + +/* T (output) INTEGER */ +/* The number of ( BETA ) digits in the mantissa. */ + +/* RND (output) LOGICAL */ +/* Specifies whether proper rounding ( RND = .TRUE. ) or */ +/* chopping ( RND = .FALSE. ) occurs in addition. This may not */ +/* be a reliable guide to the way in which the machine performs */ +/* its arithmetic. */ + +/* EPS (output) REAL */ +/* The smallest positive number such that */ + +/* fl( 1.0 - EPS ) .LT. 1.0, */ + +/* where fl denotes the computed value. */ + +/* EMIN (output) INTEGER */ +/* The minimum exponent before (gradual) underflow occurs. */ + +/* RMIN (output) REAL */ +/* The smallest normalized number for the machine, given by */ +/* BASE**( EMIN - 1 ), where BASE is the floating point value */ +/* of BETA. */ + +/* EMAX (output) INTEGER */ +/* The maximum exponent before overflow occurs. */ + +/* RMAX (output) REAL */ +/* The largest positive number for the machine, given by */ +/* BASE**EMAX * ( 1 - EPS ), where BASE is the floating point */ +/* value of BETA. */ + +/* Further Details */ +/* =============== */ + +/* The computation of EPS is based on a routine PARANOIA by */ +/* W. Kahan of the University of California at Berkeley. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Save statement .. */ +/* .. */ +/* .. Data statements .. */ +/* .. */ +/* .. Executable Statements .. */ + + if (first) { + first = FALSE_; + zero = 0.f; + one = 1.f; + two = 2.f; + +/* LBETA, LT, LRND, LEPS, LEMIN and LRMIN are the local values of */ +/* BETA, T, RND, EPS, EMIN and RMIN. */ + +/* Throughout this routine we use the function SLAMC3 to ensure */ +/* that relevant values are stored and not held in registers, or */ +/* are not affected by optimizers. */ + +/* SLAMC1 returns the parameters LBETA, LT, LRND and LIEEE1. */ + + slamc1_(&lbeta, <, &lrnd, &lieee1); + +/* Start to find EPS. */ + + b = (real) lbeta; + i__1 = -lt; + a = pow_ri(&b, &i__1); + leps = a; + +/* Try some tricks to see whether or not this is the correct EPS. */ + + b = two / 3; + half = one / 2; + r__1 = -half; + sixth = slamc3_(&b, &r__1); + third = slamc3_(&sixth, &sixth); + r__1 = -half; + b = slamc3_(&third, &r__1); + b = slamc3_(&b, &sixth); + b = dabs(b); + if (b < leps) { + b = leps; + } + + leps = 1.f; + +/* + WHILE( ( LEPS.GT.B ).AND.( B.GT.ZERO ) )LOOP */ + L10: + if (leps > b && b > zero) { + leps = b; + r__1 = half * leps; +/* Computing 5th power */ + r__3 = two, r__4 = r__3, r__3 *= r__3; +/* Computing 2nd power */ + r__5 = leps; + r__2 = r__4 * (r__3 * r__3) * (r__5 * r__5); + c__ = slamc3_(&r__1, &r__2); + r__1 = -c__; + c__ = slamc3_(&half, &r__1); + b = slamc3_(&half, &c__); + r__1 = -b; + c__ = slamc3_(&half, &r__1); + b = slamc3_(&half, &c__); + goto L10; + } +/* + END WHILE */ + + if (a < leps) { + leps = a; + } + +/* Computation of EPS complete. */ + +/* Now find EMIN. Let A = + or - 1, and + or - (1 + BASE**(-3)). */ +/* Keep dividing A by BETA until (gradual) underflow occurs. This */ +/* is detected when we cannot recover the previous A. */ + + rbase = one / lbeta; + small = one; + for (i__ = 1; i__ <= 3; ++i__) { + r__1 = small * rbase; + small = slamc3_(&r__1, &zero); +/* L20: */ + } + a = slamc3_(&one, &small); + slamc4_(&ngpmin, &one, &lbeta); + r__1 = -one; + slamc4_(&ngnmin, &r__1, &lbeta); + slamc4_(&gpmin, &a, &lbeta); + r__1 = -a; + slamc4_(&gnmin, &r__1, &lbeta); + ieee = FALSE_; + + if (ngpmin == ngnmin && gpmin == gnmin) { + if (ngpmin == gpmin) { + lemin = ngpmin; +/* ( Non twos-complement machines, no gradual underflow; */ +/* e.g., VAX ) */ + } + else if (gpmin - ngpmin == 3) { + lemin = ngpmin - 1 + lt; + ieee = TRUE_; +/* ( Non twos-complement machines, with gradual underflow; */ +/* e.g., IEEE standard followers ) */ + } + else { + lemin = min(ngpmin, gpmin); +/* ( A guess; no known machine ) */ + iwarn = TRUE_; + } + + } + else if (ngpmin == gpmin && ngnmin == gnmin) { + if ((i__1 = ngpmin - ngnmin, abs(i__1)) == 1) { + lemin = max(ngpmin, ngnmin); +/* ( Twos-complement machines, no gradual underflow; */ +/* e.g., CYBER 205 ) */ + } + else { + lemin = min(ngpmin, ngnmin); +/* ( A guess; no known machine ) */ + iwarn = TRUE_; + } + + } + else if ((i__1 = ngpmin - ngnmin, abs(i__1)) == 1 + && gpmin == gnmin) { + if (gpmin - min(ngpmin, ngnmin) == 3) { + lemin = max(ngpmin, ngnmin) - 1 + lt; +/* ( Twos-complement machines with gradual underflow; */ +/* no known machine ) */ + } + else { + lemin = min(ngpmin, ngnmin); +/* ( A guess; no known machine ) */ + iwarn = TRUE_; + } + + } + else { +/* Computing MIN */ + i__1 = min(ngpmin, ngnmin), i__1 = min(i__1, gpmin); + lemin = min(i__1, gnmin); +/* ( A guess; no known machine ) */ + iwarn = TRUE_; + } +/* ** */ +/* Comment out this if block if EMIN is ok */ + if (iwarn) { + first = TRUE_; + s_wsfe(&io___58); + do_fio(&c__1, (char *) &lemin, (ftnlen) sizeof(integer)); + e_wsfe(); + } +/* ** */ + +/* Assume IEEE arithmetic if we found denormalised numbers above, */ +/* or if arithmetic seems to round in the IEEE style, determined */ +/* in routine SLAMC1. A true IEEE machine should have both things */ +/* true; however, faulty machines may have one or the other. */ + + ieee = ieee || lieee1; + +/* Compute RMIN by successive division by BETA. We could compute */ +/* RMIN as BASE**( EMIN - 1 ), but some machines underflow during */ +/* this computation. */ + + lrmin = 1.f; + i__1 = 1 - lemin; + for (i__ = 1; i__ <= i__1; ++i__) { + r__1 = lrmin * rbase; + lrmin = slamc3_(&r__1, &zero); +/* L30: */ + } + +/* Finally, call SLAMC5 to compute EMAX and RMAX. */ + + slamc5_(&lbeta, <, &lemin, &ieee, &lemax, &lrmax); + } + + *beta = lbeta; + *t = lt; + *rnd = lrnd; + *eps = leps; + *emin = lemin; + *rmin = lrmin; + *emax = lemax; + *rmax = lrmax; + + return 0; + + +/* End of SLAMC2 */ + +} /* slamc2_ */ + + +/* *********************************************************************** */ + +doublereal +slamc3_(real * a, real * b) +{ + /* System generated locals */ + real ret_val; + + +/* -- LAPACK auxiliary routine (version 3.0) -- */ +/* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */ +/* Courant Institute, Argonne National Lab, and Rice University */ +/* October 31, 1992 */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* Purpose */ +/* ======= */ + +/* SLAMC3 is intended to force A and B to be stored prior to doing */ +/* the addition of A and B , for use in situations where optimizers */ +/* might hold one of these in a register. */ + +/* Arguments */ +/* ========= */ + +/* A, B (input) REAL */ +/* The values A and B. */ + +/* ===================================================================== */ + +/* .. Executable Statements .. */ + + ret_val = *a + *b; + + return ret_val; + +/* End of SLAMC3 */ + +} /* slamc3_ */ + + +/* *********************************************************************** */ + +/* Subroutine */ int +slamc4_(integer * emin, real * start, integer * base) +{ + /* System generated locals */ + integer i__1; + real r__1; + + /* Local variables */ + static real a; + static integer i__; + static real b1, b2, c1, c2, d1, d2, one, zero, rbase; + extern doublereal slamc3_(real *, real *); + + +/* -- LAPACK auxiliary routine (version 3.0) -- */ +/* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */ +/* Courant Institute, Argonne National Lab, and Rice University */ +/* October 31, 1992 */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* Purpose */ +/* ======= */ + +/* SLAMC4 is a service routine for SLAMC2. */ + +/* Arguments */ +/* ========= */ + +/* EMIN (output) EMIN */ +/* The minimum exponent before (gradual) underflow, computed by */ +/* setting A = START and dividing by BASE until the previous A */ +/* can not be recovered. */ + +/* START (input) REAL */ +/* The starting point for determining EMIN. */ + +/* BASE (input) INTEGER */ +/* The base of the machine. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + a = *start; + one = 1.f; + rbase = one / *base; + zero = 0.f; + *emin = 1; + r__1 = a * rbase; + b1 = slamc3_(&r__1, &zero); + c1 = a; + c2 = a; + d1 = a; + d2 = a; +/* + WHILE( ( C1.EQ.A ).AND.( C2.EQ.A ).AND. */ +/* $ ( D1.EQ.A ).AND.( D2.EQ.A ) )LOOP */ + L10: + if (c1 == a && c2 == a && d1 == a && d2 == a) { + --(*emin); + a = b1; + r__1 = a / *base; + b1 = slamc3_(&r__1, &zero); + r__1 = b1 * *base; + c1 = slamc3_(&r__1, &zero); + d1 = zero; + i__1 = *base; + for (i__ = 1; i__ <= i__1; ++i__) { + d1 += b1; +/* L20: */ + } + r__1 = a * rbase; + b2 = slamc3_(&r__1, &zero); + r__1 = b2 / rbase; + c2 = slamc3_(&r__1, &zero); + d2 = zero; + i__1 = *base; + for (i__ = 1; i__ <= i__1; ++i__) { + d2 += b2; +/* L30: */ + } + goto L10; + } +/* + END WHILE */ + + return 0; + +/* End of SLAMC4 */ + +} /* slamc4_ */ + + +/* *********************************************************************** */ + +/* Subroutine */ int +slamc5_(integer * beta, integer * p, integer * emin, + logical * ieee, integer * emax, real * rmax) +{ + /* System generated locals */ + integer i__1; + real r__1; + + /* Local variables */ + static integer i__; + static real y, z__; + static integer try__, lexp; + static real oldy; + static integer uexp, nbits; + extern doublereal slamc3_(real *, real *); + static real recbas; + static integer exbits, expsum; + + +/* -- LAPACK auxiliary routine (version 3.0) -- */ +/* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */ +/* Courant Institute, Argonne National Lab, and Rice University */ +/* October 31, 1992 */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* Purpose */ +/* ======= */ + +/* SLAMC5 attempts to compute RMAX, the largest machine floating-point */ +/* number, without overflow. It assumes that EMAX + abs(EMIN) sum */ +/* approximately to a power of 2. It will fail on machines where this */ +/* assumption does not hold, for example, the Cyber 205 (EMIN = -28625, */ +/* EMAX = 28718). It will also fail if the value supplied for EMIN is */ +/* too large (i.e. too close to zero), probably with overflow. */ + +/* Arguments */ +/* ========= */ + +/* BETA (input) INTEGER */ +/* The base of floating-point arithmetic. */ + +/* P (input) INTEGER */ +/* The number of base BETA digits in the mantissa of a */ +/* floating-point value. */ + +/* EMIN (input) INTEGER */ +/* The minimum exponent before (gradual) underflow. */ + +/* IEEE (input) LOGICAL */ +/* A logical flag specifying whether or not the arithmetic */ +/* system is thought to comply with the IEEE standard. */ + +/* EMAX (output) INTEGER */ +/* The largest exponent before overflow */ + +/* RMAX (output) REAL */ +/* The largest machine floating-point number. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* First compute LEXP and UEXP, two powers of 2 that bound */ +/* abs(EMIN). We then assume that EMAX + abs(EMIN) will sum */ +/* approximately to the bound that is closest to abs(EMIN). */ +/* (EMAX is the exponent of the required number RMAX). */ + + lexp = 1; + exbits = 1; + L10: + try__ = lexp << 1; + if (try__ <= -(*emin)) { + lexp = try__; + ++exbits; + goto L10; + } + if (lexp == -(*emin)) { + uexp = lexp; + } + else { + uexp = try__; + ++exbits; + } + +/* Now -LEXP is less than or equal to EMIN, and -UEXP is greater */ +/* than or equal to EMIN. EXBITS is the number of bits needed to */ +/* store the exponent. */ + + if (uexp + *emin > -lexp - *emin) { + expsum = lexp << 1; + } + else { + expsum = uexp << 1; + } + +/* EXPSUM is the exponent range, approximately equal to */ +/* EMAX - EMIN + 1 . */ + + *emax = expsum + *emin - 1; + nbits = exbits + 1 + *p; + +/* NBITS is the total number of bits needed to store a */ +/* floating-point number. */ + + if (nbits % 2 == 1 && *beta == 2) { + +/* Either there are an odd number of bits used to store a */ +/* floating-point number, which is unlikely, or some bits are */ +/* not used in the representation of numbers, which is possible, */ +/* (e.g. Cray machines) or the mantissa has an implicit bit, */ +/* (e.g. IEEE machines, Dec Vax machines), which is perhaps the */ +/* most likely. We have to assume the last alternative. */ +/* If this is true, then we need to reduce EMAX by one because */ +/* there must be some way of representing zero in an implicit-bit */ +/* system. On machines like Cray, we are reducing EMAX by one */ +/* unnecessarily. */ + + --(*emax); + } + + if (*ieee) { + +/* Assume we are on an IEEE machine which reserves one exponent */ +/* for infinity and NaN. */ + + --(*emax); + } + +/* Now create RMAX, the largest machine number, which should */ +/* be equal to (1.0 - BETA**(-P)) * BETA**EMAX . */ + +/* First compute 1.0 - BETA**(-P), being careful that the */ +/* result is less than 1.0 . */ + + recbas = 1.f / *beta; + z__ = *beta - 1.f; + y = 0.f; + i__1 = *p; + for (i__ = 1; i__ <= i__1; ++i__) { + z__ *= recbas; + if (y < 1.f) { + oldy = y; + } + y = slamc3_(&y, &z__); +/* L20: */ + } + if (y >= 1.f) { + y = oldy; + } + +/* Now multiply by BETA**EMAX to get RMAX. */ + + i__1 = *emax; + for (i__ = 1; i__ <= i__1; ++i__) { + r__1 = y * *beta; + y = slamc3_(&r__1, &c_b32); +/* L30: */ + } + + *rmax = y; + return 0; + +/* End of SLAMC5 */ + +} /* slamc5_ */ diff --git a/src/util/slapack_lite.c b/src/util/slapack_lite.c new file mode 100644 index 0000000..a63e713 --- /dev/null +++ b/src/util/slapack_lite.c @@ -0,0 +1,1463 @@ +/* +NOTE: This is generated code. Look in README.python for information on + remaking this file. +*/ +#include "util/f2c.h" + +#ifdef HAVE_CONFIG +#include "config.h" +#else +extern doublereal slamch_(char *); +#define EPSILON slamch_("Epsilon") +#define SAFEMINIMUM slamch_("Safe minimum") +#define PRECISION slamch_("Precision") +#define BASE slamch_("Base") +#endif + + +extern doublereal slapy2_(real *, real *); + + + +/* Table of constant values */ + +static integer c__0 = 0; +static real c_b163 = 0.f; +static real c_b164 = 1.f; +static integer c__1 = 1; +static real c_b181 = -1.f; +static integer c_n1 = -1; + +integer ieeeck_(integer *ispec, real *zero, real *one) +{ + /* System generated locals */ + integer ret_val; + + /* Local variables */ + static real nan1, nan2, nan3, nan4, nan5, nan6, neginf, posinf, negzro, + newzro; + + +/* + -- LAPACK auxiliary routine (version 3.0) -- + Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., + Courant Institute, Argonne National Lab, and Rice University + June 30, 1998 + + + Purpose + ======= + + IEEECK is called from the ILAENV to verify that Infinity and + possibly NaN arithmetic is safe (i.e. will not trap). + + Arguments + ========= + + ISPEC (input) INTEGER + Specifies whether to test just for infinity arithmetic + or whether to test for infinity and NaN arithmetic. + = 0: Verify infinity arithmetic only. + = 1: Verify infinity and NaN arithmetic. + + ZERO (input) REAL + Must contain the value 0.0 + This is passed to prevent the compiler from optimizing + away this code. + + ONE (input) REAL + Must contain the value 1.0 + This is passed to prevent the compiler from optimizing + away this code. + + RETURN VALUE: INTEGER + = 0: Arithmetic failed to produce the correct answers + = 1: Arithmetic produced the correct answers +*/ + + ret_val = 1; + + posinf = *one / *zero; + if (posinf <= *one) { + ret_val = 0; + return ret_val; + } + + neginf = -(*one) / *zero; + if (neginf >= *zero) { + ret_val = 0; + return ret_val; + } + + negzro = *one / (neginf + *one); + if (negzro != *zero) { + ret_val = 0; + return ret_val; + } + + neginf = *one / negzro; + if (neginf >= *zero) { + ret_val = 0; + return ret_val; + } + + newzro = negzro + *zero; + if (newzro != *zero) { + ret_val = 0; + return ret_val; + } + + posinf = *one / newzro; + if (posinf <= *one) { + ret_val = 0; + return ret_val; + } + + neginf *= posinf; + if (neginf >= *zero) { + ret_val = 0; + return ret_val; + } + + posinf *= posinf; + if (posinf <= *one) { + ret_val = 0; + return ret_val; + } + + +/* Return if we were only asked to check infinity arithmetic */ + + if (*ispec == 0) { + return ret_val; + } + + nan1 = posinf + neginf; + + nan2 = posinf / neginf; + + nan3 = posinf / posinf; + + nan4 = posinf * *zero; + + nan5 = neginf * negzro; + + nan6 = nan5 * 0.f; + + if (nan1 == nan1) { + ret_val = 0; + return ret_val; + } + + if (nan2 == nan2) { + ret_val = 0; + return ret_val; + } + + if (nan3 == nan3) { + ret_val = 0; + return ret_val; + } + + if (nan4 == nan4) { + ret_val = 0; + return ret_val; + } + + if (nan5 == nan5) { + ret_val = 0; + return ret_val; + } + + if (nan6 == nan6) { + ret_val = 0; + return ret_val; + } + + return ret_val; +} /* ieeeck_ */ + +integer ilaenv_(integer *ispec, char *name__, char *opts, integer *n1, + integer *n2, integer *n3, integer *n4, ftnlen name_len, ftnlen + opts_len) +{ + /* System generated locals */ + integer ret_val; + + /* Builtin functions */ + /* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen); + integer s_cmp(char *, char *, ftnlen, ftnlen); + + /* Local variables */ + static integer i__; + static char c1[1], c2[2], c3[3], c4[2]; + static integer ic, nb, iz, nx; + static logical cname, sname; + static integer nbmin; + extern integer ieeeck_(integer *, real *, real *); + static char subnam[6]; + + (void)opts; + (void)n3; + (void)opts_len; +/* + -- LAPACK auxiliary routine (version 3.0) -- + Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., + Courant Institute, Argonne National Lab, and Rice University + June 30, 1999 + + + Purpose + ======= + + ILAENV is called from the LAPACK routines to choose problem-dependent + parameters for the local environment. See ISPEC for a description of + the parameters. + + This version provides a set of parameters which should give good, + but not optimal, performance on many of the currently available + computers. Users are encouraged to modify this subroutine to set + the tuning parameters for their particular machine using the option + and problem size information in the arguments. + + This routine will not function correctly if it is converted to all + lower case. Converting it to all upper case is allowed. + + Arguments + ========= + + ISPEC (input) INTEGER + Specifies the parameter to be returned as the value of + ILAENV. + = 1: the optimal blocksize; if this value is 1, an unblocked + algorithm will give the best performance. + = 2: the minimum block size for which the block routine + should be used; if the usable block size is less than + this value, an unblocked routine should be used. + = 3: the crossover point (in a block routine, for N less + than this value, an unblocked routine should be used) + = 4: the number of shifts, used in the nonsymmetric + eigenvalue routines + = 5: the minimum column dimension for blocking to be used; + rectangular blocks must have dimension at least k by m, + where k is given by ILAENV(2,...) and m by ILAENV(5,...) + = 6: the crossover point for the SVD (when reducing an m by n + matrix to bidiagonal form, if max(m,n)/min(m,n) exceeds + this value, a QR factorization is used first to reduce + the matrix to a triangular form.) + = 7: the number of processors + = 8: the crossover point for the multishift QR and QZ methods + for nonsymmetric eigenvalue problems. + = 9: maximum size of the subproblems at the bottom of the + computation tree in the divide-and-conquer algorithm + (used by xGELSD and xGESDD) + =10: ieee NaN arithmetic can be trusted not to trap + =11: infinity arithmetic can be trusted not to trap + + NAME (input) CHARACTER*(*) + The name of the calling subroutine, in either upper case or + lower case. + + OPTS (input) CHARACTER*(*) + The character options to the subroutine NAME, concatenated + into a single character string. For example, UPLO = 'U', + TRANS = 'T', and DIAG = 'N' for a triangular routine would + be specified as OPTS = 'UTN'. + + N1 (input) INTEGER + N2 (input) INTEGER + N3 (input) INTEGER + N4 (input) INTEGER + Problem dimensions for the subroutine NAME; these may not all + be required. + + (ILAENV) (output) INTEGER + >= 0: the value of the parameter specified by ISPEC + < 0: if ILAENV = -k, the k-th argument had an illegal value. + + Further Details + =============== + + The following conventions have been used when calling ILAENV from the + LAPACK routines: + 1) OPTS is a concatenation of all of the character options to + subroutine NAME, in the same order that they appear in the + argument list for NAME, even if they are not used in determining + the value of the parameter specified by ISPEC. + 2) The problem dimensions N1, N2, N3, N4 are specified in the order + that they appear in the argument list for NAME. N1 is used + first, N2 second, and so on, and unused problem dimensions are + passed a value of -1. + 3) The parameter value returned by ILAENV is checked for validity in + the calling subroutine. For example, ILAENV is used to retrieve + the optimal blocksize for STRTRI as follows: + + NB = ILAENV( 1, 'STRTRI', UPLO // DIAG, N, -1, -1, -1 ) + IF( NB.LE.1 ) NB = MAX( 1, N ) + + ===================================================================== +*/ + + + switch (*ispec) { + case 1: goto L100; + case 2: goto L100; + case 3: goto L100; + case 4: goto L400; + case 5: goto L500; + case 6: goto L600; + case 7: goto L700; + case 8: goto L800; + case 9: goto L900; + case 10: goto L1000; + case 11: goto L1100; + } + +/* Invalid value for ISPEC */ + + ret_val = -1; + return ret_val; + +L100: + +/* Convert NAME to upper case if the first character is lower case. */ + + ret_val = 1; + s_copy(subnam, name__, (ftnlen)6, name_len); + ic = *(unsigned char *)subnam; + iz = 'Z'; + if (iz == 90 || iz == 122) { + +/* ASCII character set */ + + if (ic >= 97 && ic <= 122) { + *(unsigned char *)subnam = (char) (ic - 32); + for (i__ = 2; i__ <= 6; ++i__) { + ic = *(unsigned char *)&subnam[i__ - 1]; + if (ic >= 97 && ic <= 122) { + *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); + } +/* L10: */ + } + } + + } else if (iz == 233 || iz == 169) { + +/* EBCDIC character set */ + + if ((ic >= 129 && ic <= 137) || (ic >= 145 && ic <= 153) || (ic >= 162 && + ic <= 169)) { + *(unsigned char *)subnam = (char) (ic + 64); + for (i__ = 2; i__ <= 6; ++i__) { + ic = *(unsigned char *)&subnam[i__ - 1]; + if ((ic >= 129 && ic <= 137) || (ic >= 145 && ic <= 153) || (ic >= + 162 && ic <= 169)) { + *(unsigned char *)&subnam[i__ - 1] = (char) (ic + 64); + } +/* L20: */ + } + } + + } else if (iz == 218 || iz == 250) { + +/* Prime machines: ASCII+128 */ + + if (ic >= 225 && ic <= 250) { + *(unsigned char *)subnam = (char) (ic - 32); + for (i__ = 2; i__ <= 6; ++i__) { + ic = *(unsigned char *)&subnam[i__ - 1]; + if (ic >= 225 && ic <= 250) { + *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); + } +/* L30: */ + } + } + } + + *(unsigned char *)c1 = *(unsigned char *)subnam; + sname = *(unsigned char *)c1 == 'S' || *(unsigned char *)c1 == 'D'; + cname = *(unsigned char *)c1 == 'C' || *(unsigned char *)c1 == 'Z'; + if (! (cname || sname)) { + return ret_val; + } + s_copy(c2, subnam + 1, (ftnlen)2, (ftnlen)2); + s_copy(c3, subnam + 3, (ftnlen)3, (ftnlen)3); + s_copy(c4, c3 + 1, (ftnlen)2, (ftnlen)2); + + switch (*ispec) { + case 1: goto L110; + case 2: goto L200; + case 3: goto L300; + } + +L110: + +/* + ISPEC = 1: block size + + In these examples, separate code is provided for setting NB for + real and complex. We assume that NB will take the same value in + single or double precision. +*/ + + nb = 1; + + if (s_cmp(c2, "GE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } else if (s_cmp(c3, "QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, + "RQF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "LQF", (ftnlen) + 3, (ftnlen)3) == 0 || s_cmp(c3, "QLF", (ftnlen)3, (ftnlen)3) + == 0) { + if (sname) { + nb = 32; + } else { + nb = 32; + } + } else if (s_cmp(c3, "HRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 32; + } else { + nb = 32; + } + } else if (s_cmp(c3, "BRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 32; + } else { + nb = 32; + } + } else if (s_cmp(c3, "TRI", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } + } else if (s_cmp(c2, "PO", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } + } else if (s_cmp(c2, "SY", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } else if (sname && s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { + nb = 32; + } else if (sname && s_cmp(c3, "GST", (ftnlen)3, (ftnlen)3) == 0) { + nb = 64; + } + } else if (cname && s_cmp(c2, "HE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { + nb = 64; + } else if (s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { + nb = 32; + } else if (s_cmp(c3, "GST", (ftnlen)3, (ftnlen)3) == 0) { + nb = 64; + } + } else if (sname && s_cmp(c2, "OR", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nb = 32; + } + } else if (*(unsigned char *)c3 == 'M') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nb = 32; + } + } + } else if (cname && s_cmp(c2, "UN", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nb = 32; + } + } else if (*(unsigned char *)c3 == 'M') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nb = 32; + } + } + } else if (s_cmp(c2, "GB", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + if (*n4 <= 64) { + nb = 1; + } else { + nb = 32; + } + } else { + if (*n4 <= 64) { + nb = 1; + } else { + nb = 32; + } + } + } + } else if (s_cmp(c2, "PB", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + if (*n2 <= 64) { + nb = 1; + } else { + nb = 32; + } + } else { + if (*n2 <= 64) { + nb = 1; + } else { + nb = 32; + } + } + } + } else if (s_cmp(c2, "TR", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRI", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } + } else if (s_cmp(c2, "LA", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "UUM", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } + } else if (sname && s_cmp(c2, "ST", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "EBZ", (ftnlen)3, (ftnlen)3) == 0) { + nb = 1; + } + } + ret_val = nb; + return ret_val; + +L200: + +/* ISPEC = 2: minimum block size */ + + nbmin = 2; + if (s_cmp(c2, "GE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "RQF", ( + ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "LQF", (ftnlen)3, ( + ftnlen)3) == 0 || s_cmp(c3, "QLF", (ftnlen)3, (ftnlen)3) == 0) + { + if (sname) { + nbmin = 2; + } else { + nbmin = 2; + } + } else if (s_cmp(c3, "HRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nbmin = 2; + } else { + nbmin = 2; + } + } else if (s_cmp(c3, "BRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nbmin = 2; + } else { + nbmin = 2; + } + } else if (s_cmp(c3, "TRI", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nbmin = 2; + } else { + nbmin = 2; + } + } + } else if (s_cmp(c2, "SY", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nbmin = 8; + } else { + nbmin = 8; + } + } else if (sname && s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { + nbmin = 2; + } + } else if (cname && s_cmp(c2, "HE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { + nbmin = 2; + } + } else if (sname && s_cmp(c2, "OR", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nbmin = 2; + } + } else if (*(unsigned char *)c3 == 'M') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nbmin = 2; + } + } + } else if (cname && s_cmp(c2, "UN", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nbmin = 2; + } + } else if (*(unsigned char *)c3 == 'M') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nbmin = 2; + } + } + } + ret_val = nbmin; + return ret_val; + +L300: + +/* ISPEC = 3: crossover point */ + + nx = 0; + if (s_cmp(c2, "GE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "RQF", ( + ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "LQF", (ftnlen)3, ( + ftnlen)3) == 0 || s_cmp(c3, "QLF", (ftnlen)3, (ftnlen)3) == 0) + { + if (sname) { + nx = 128; + } else { + nx = 128; + } + } else if (s_cmp(c3, "HRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nx = 128; + } else { + nx = 128; + } + } else if (s_cmp(c3, "BRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nx = 128; + } else { + nx = 128; + } + } + } else if (s_cmp(c2, "SY", (ftnlen)2, (ftnlen)2) == 0) { + if (sname && s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { + nx = 32; + } + } else if (cname && s_cmp(c2, "HE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { + nx = 32; + } + } else if (sname && s_cmp(c2, "OR", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nx = 128; + } + } + } else if (cname && s_cmp(c2, "UN", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nx = 128; + } + } + } + ret_val = nx; + return ret_val; + +L400: + +/* ISPEC = 4: number of shifts (used by xHSEQR) */ + + ret_val = 6; + return ret_val; + +L500: + +/* ISPEC = 5: minimum column dimension (not used) */ + + ret_val = 2; + return ret_val; + +L600: + +/* ISPEC = 6: crossover point for SVD (used by xGELSS and xGESVD) */ + + ret_val = (integer) ((real) min(*n1,*n2) * 1.6f); + return ret_val; + +L700: + +/* ISPEC = 7: number of processors (not used) */ + + ret_val = 1; + return ret_val; + +L800: + +/* ISPEC = 8: crossover point for multishift (used by xHSEQR) */ + + ret_val = 50; + return ret_val; + +L900: + +/* + ISPEC = 9: maximum size of the subproblems at the bottom of the + computation tree in the divide-and-conquer algorithm + (used by xGELSD and xGESDD) +*/ + + ret_val = 25; + return ret_val; + +L1000: + +/* + ISPEC = 10: ieee NaN arithmetic can be trusted not to trap + + ILAENV = 0 +*/ + ret_val = 1; + if (ret_val == 1) { + ret_val = ieeeck_(&c__0, &c_b163, &c_b164); + } + return ret_val; + +L1100: + +/* + ISPEC = 11: infinity arithmetic can be trusted not to trap + + ILAENV = 0 +*/ + ret_val = 1; + if (ret_val == 1) { + ret_val = ieeeck_(&c__1, &c_b163, &c_b164); + } + return ret_val; + +/* End of ILAENV */ + +} /* ilaenv_ */ + +/* Subroutine */ int sposv_(char *uplo, integer *n, integer *nrhs, real *a, + integer *lda, real *b, integer *ldb, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1; + + /* Local variables */ + extern logical lsame_(char *, char *); + extern /* Subroutine */ int xerbla_(char *, integer *), spotrf_( + char *, integer *, real *, integer *, integer *), spotrs_( + char *, integer *, integer *, real *, integer *, real *, integer * + , integer *); + + +/* + -- LAPACK driver routine (version 3.0) -- + Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., + Courant Institute, Argonne National Lab, and Rice University + March 31, 1993 + + + Purpose + ======= + + SPOSV computes the solution to a real system of linear equations + A * X = B, + where A is an N-by-N symmetric positive definite matrix and X and B + are N-by-NRHS matrices. + + The Cholesky decomposition is used to factor A as + A = U**T* U, if UPLO = 'U', or + A = L * L**T, if UPLO = 'L', + where U is an upper triangular matrix and L is a lower triangular + matrix. The factored form of A is then used to solve the system of + equations A * X = B. + + Arguments + ========= + + UPLO (input) CHARACTER*1 + = 'U': Upper triangle of A is stored; + = 'L': Lower triangle of A is stored. + + N (input) INTEGER + The number of linear equations, i.e., the order of the + matrix A. N >= 0. + + NRHS (input) INTEGER + The number of right hand sides, i.e., the number of columns + of the matrix B. NRHS >= 0. + + A (input/output) REAL array, dimension (LDA,N) + On entry, the symmetric matrix A. If UPLO = 'U', the leading + N-by-N upper triangular part of A contains the upper + triangular part of the matrix A, and the strictly lower + triangular part of A is not referenced. If UPLO = 'L', the + leading N-by-N lower triangular part of A contains the lower + triangular part of the matrix A, and the strictly upper + triangular part of A is not referenced. + + On exit, if INFO = 0, the factor U or L from the Cholesky + factorization A = U**T*U or A = L*L**T. + + LDA (input) INTEGER + The leading dimension of the array A. LDA >= max(1,N). + + B (input/output) REAL array, dimension (LDB,NRHS) + On entry, the N-by-NRHS right hand side matrix B. + On exit, if INFO = 0, the N-by-NRHS solution matrix X. + + LDB (input) INTEGER + The leading dimension of the array B. LDB >= max(1,N). + + INFO (output) INTEGER + = 0: successful exit + < 0: if INFO = -i, the i-th argument had an illegal value + > 0: if INFO = i, the leading minor of order i of A is not + positive definite, so the factorization could not be + completed, and the solution has not been computed. + + ===================================================================== + + + Test the input parameters. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + + /* Function Body */ + *info = 0; + if (! lsame_(uplo, "U") && ! lsame_(uplo, "L")) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*nrhs < 0) { + *info = -3; + } else if (*lda < max(1,*n)) { + *info = -5; + } else if (*ldb < max(1,*n)) { + *info = -7; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_("SPOSV ", &i__1); + return 0; + } + +/* Compute the Cholesky factorization A = U'*U or A = L*L'. */ + + spotrf_(uplo, n, &a[a_offset], lda, info); + if (*info == 0) { + +/* Solve the system A*X = B, overwriting B with X. */ + + spotrs_(uplo, n, nrhs, &a[a_offset], lda, &b[b_offset], ldb, info); + + } + return 0; + +/* End of SPOSV */ + +} /* sposv_ */ + +/* Subroutine */ int spotf2_(char *uplo, integer *n, real *a, integer *lda, + integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + real r__1; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + static integer j; + static real ajj; + extern doublereal sdot_(integer *, real *, integer *, real *, integer *); + extern logical lsame_(char *, char *); + extern /* Subroutine */ int sscal_(integer *, real *, real *, integer *), + sgemv_(char *, integer *, integer *, real *, real *, integer *, + real *, integer *, real *, real *, integer *); + static logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *); + + +/* + -- LAPACK routine (version 3.0) -- + Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., + Courant Institute, Argonne National Lab, and Rice University + February 29, 1992 + + + Purpose + ======= + + SPOTF2 computes the Cholesky factorization of a real symmetric + positive definite matrix A. + + The factorization has the form + A = U' * U , if UPLO = 'U', or + A = L * L', if UPLO = 'L', + where U is an upper triangular matrix and L is lower triangular. + + This is the unblocked version of the algorithm, calling Level 2 BLAS. + + Arguments + ========= + + UPLO (input) CHARACTER*1 + Specifies whether the upper or lower triangular part of the + symmetric matrix A is stored. + = 'U': Upper triangular + = 'L': Lower triangular + + N (input) INTEGER + The order of the matrix A. N >= 0. + + A (input/output) REAL array, dimension (LDA,N) + On entry, the symmetric matrix A. If UPLO = 'U', the leading + n by n upper triangular part of A contains the upper + triangular part of the matrix A, and the strictly lower + triangular part of A is not referenced. If UPLO = 'L', the + leading n by n lower triangular part of A contains the lower + triangular part of the matrix A, and the strictly upper + triangular part of A is not referenced. + + On exit, if INFO = 0, the factor U or L from the Cholesky + factorization A = U'*U or A = L*L'. + + LDA (input) INTEGER + The leading dimension of the array A. LDA >= max(1,N). + + INFO (output) INTEGER + = 0: successful exit + < 0: if INFO = -k, the k-th argument had an illegal value + > 0: if INFO = k, the leading minor of order k is not + positive definite, and the factorization could not be + completed. + + ===================================================================== + + + Test the input parameters. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, "U"); + if (! upper && ! lsame_(uplo, "L")) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*n)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_("SPOTF2", &i__1); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + + if (upper) { + +/* Compute the Cholesky factorization A = U'*U. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + +/* Compute U(J,J) and test for non-positive-definiteness. */ + + i__2 = j - 1; + ajj = a[j + j * a_dim1] - sdot_(&i__2, &a[j * a_dim1 + 1], &c__1, + &a[j * a_dim1 + 1], &c__1); + if (ajj <= 0.f) { + a[j + j * a_dim1] = ajj; + goto L30; + } + ajj = sqrt(ajj); + a[j + j * a_dim1] = ajj; + +/* Compute elements J+1:N of row J. */ + + if (j < *n) { + i__2 = j - 1; + i__3 = *n - j; + sgemv_("Transpose", &i__2, &i__3, &c_b181, &a[(j + 1) * + a_dim1 + 1], lda, &a[j * a_dim1 + 1], &c__1, &c_b164, + &a[j + (j + 1) * a_dim1], lda); + i__2 = *n - j; + r__1 = 1.f / ajj; + sscal_(&i__2, &r__1, &a[j + (j + 1) * a_dim1], lda); + } +/* L10: */ + } + } else { + +/* Compute the Cholesky factorization A = L*L'. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + +/* Compute L(J,J) and test for non-positive-definiteness. */ + + i__2 = j - 1; + ajj = a[j + j * a_dim1] - sdot_(&i__2, &a[j + a_dim1], lda, &a[j + + a_dim1], lda); + if (ajj <= 0.f) { + a[j + j * a_dim1] = ajj; + goto L30; + } + ajj = sqrt(ajj); + a[j + j * a_dim1] = ajj; + +/* Compute elements J+1:N of column J. */ + + if (j < *n) { + i__2 = *n - j; + i__3 = j - 1; + sgemv_("No transpose", &i__2, &i__3, &c_b181, &a[j + 1 + + a_dim1], lda, &a[j + a_dim1], lda, &c_b164, &a[j + 1 + + j * a_dim1], &c__1); + i__2 = *n - j; + r__1 = 1.f / ajj; + sscal_(&i__2, &r__1, &a[j + 1 + j * a_dim1], &c__1); + } +/* L20: */ + } + } + goto L40; + +L30: + *info = j; + +L40: + return 0; + +/* End of SPOTF2 */ + +} /* spotf2_ */ + +/* Subroutine */ int spotrf_(char *uplo, integer *n, real *a, integer *lda, + integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4; + + /* Local variables */ + static integer j, jb, nb; + extern logical lsame_(char *, char *); + extern /* Subroutine */ int sgemm_(char *, char *, integer *, integer *, + integer *, real *, real *, integer *, real *, integer *, real *, + real *, integer *); + static logical upper; + extern /* Subroutine */ int strsm_(char *, char *, char *, char *, + integer *, integer *, real *, real *, integer *, real *, integer * + ), ssyrk_(char *, char *, integer + *, integer *, real *, real *, integer *, real *, real *, integer * + ), spotf2_(char *, integer *, real *, integer *, + integer *), xerbla_(char *, integer *); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + + +/* + -- LAPACK routine (version 3.0) -- + Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., + Courant Institute, Argonne National Lab, and Rice University + March 31, 1993 + + + Purpose + ======= + + SPOTRF computes the Cholesky factorization of a real symmetric + positive definite matrix A. + + The factorization has the form + A = U**T * U, if UPLO = 'U', or + A = L * L**T, if UPLO = 'L', + where U is an upper triangular matrix and L is lower triangular. + + This is the block version of the algorithm, calling Level 3 BLAS. + + Arguments + ========= + + UPLO (input) CHARACTER*1 + = 'U': Upper triangle of A is stored; + = 'L': Lower triangle of A is stored. + + N (input) INTEGER + The order of the matrix A. N >= 0. + + A (input/output) REAL array, dimension (LDA,N) + On entry, the symmetric matrix A. If UPLO = 'U', the leading + N-by-N upper triangular part of A contains the upper + triangular part of the matrix A, and the strictly lower + triangular part of A is not referenced. If UPLO = 'L', the + leading N-by-N lower triangular part of A contains the lower + triangular part of the matrix A, and the strictly upper + triangular part of A is not referenced. + + On exit, if INFO = 0, the factor U or L from the Cholesky + factorization A = U**T*U or A = L*L**T. + + LDA (input) INTEGER + The leading dimension of the array A. LDA >= max(1,N). + + INFO (output) INTEGER + = 0: successful exit + < 0: if INFO = -i, the i-th argument had an illegal value + > 0: if INFO = i, the leading minor of order i is not + positive definite, and the factorization could not be + completed. + + ===================================================================== + + + Test the input parameters. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, "U"); + if (! upper && ! lsame_(uplo, "L")) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*n)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_("SPOTRF", &i__1); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + +/* Determine the block size for this environment. */ + + nb = ilaenv_(&c__1, "SPOTRF", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, ( + ftnlen)1); + if (nb <= 1 || nb >= *n) { + +/* Use unblocked code. */ + + spotf2_(uplo, n, &a[a_offset], lda, info); + } else { + +/* Use blocked code. */ + + if (upper) { + +/* Compute the Cholesky factorization A = U'*U. */ + + i__1 = *n; + i__2 = nb; + for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { + +/* + Update and factorize the current diagonal block and test + for non-positive-definiteness. + + Computing MIN +*/ + i__3 = nb, i__4 = *n - j + 1; + jb = min(i__3,i__4); + i__3 = j - 1; + ssyrk_("Upper", "Transpose", &jb, &i__3, &c_b181, &a[j * + a_dim1 + 1], lda, &c_b164, &a[j + j * a_dim1], lda); + spotf2_("Upper", &jb, &a[j + j * a_dim1], lda, info); + if (*info != 0) { + goto L30; + } + if (j + jb <= *n) { + +/* Compute the current block row. */ + + i__3 = *n - j - jb + 1; + i__4 = j - 1; + sgemm_("Transpose", "No transpose", &jb, &i__3, &i__4, & + c_b181, &a[j * a_dim1 + 1], lda, &a[(j + jb) * + a_dim1 + 1], lda, &c_b164, &a[j + (j + jb) * + a_dim1], lda); + i__3 = *n - j - jb + 1; + strsm_("Left", "Upper", "Transpose", "Non-unit", &jb, & + i__3, &c_b164, &a[j + j * a_dim1], lda, &a[j + (j + + jb) * a_dim1], lda); + } +/* L10: */ + } + + } else { + +/* Compute the Cholesky factorization A = L*L'. */ + + i__2 = *n; + i__1 = nb; + for (j = 1; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { + +/* + Update and factorize the current diagonal block and test + for non-positive-definiteness. + + Computing MIN +*/ + i__3 = nb, i__4 = *n - j + 1; + jb = min(i__3,i__4); + i__3 = j - 1; + ssyrk_("Lower", "No transpose", &jb, &i__3, &c_b181, &a[j + + a_dim1], lda, &c_b164, &a[j + j * a_dim1], lda); + spotf2_("Lower", &jb, &a[j + j * a_dim1], lda, info); + if (*info != 0) { + goto L30; + } + if (j + jb <= *n) { + +/* Compute the current block column. */ + + i__3 = *n - j - jb + 1; + i__4 = j - 1; + sgemm_("No transpose", "Transpose", &i__3, &jb, &i__4, & + c_b181, &a[j + jb + a_dim1], lda, &a[j + a_dim1], + lda, &c_b164, &a[j + jb + j * a_dim1], lda); + i__3 = *n - j - jb + 1; + strsm_("Right", "Lower", "Transpose", "Non-unit", &i__3, & + jb, &c_b164, &a[j + j * a_dim1], lda, &a[j + jb + + j * a_dim1], lda); + } +/* L20: */ + } + } + } + goto L40; + +L30: + *info = *info + j - 1; + +L40: + return 0; + +/* End of SPOTRF */ + +} /* spotrf_ */ + +/* Subroutine */ int spotrs_(char *uplo, integer *n, integer *nrhs, real *a, + integer *lda, real *b, integer *ldb, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1; + + /* Local variables */ + extern logical lsame_(char *, char *); + static logical upper; + extern /* Subroutine */ int strsm_(char *, char *, char *, char *, + integer *, integer *, real *, real *, integer *, real *, integer * + ), xerbla_(char *, integer *); + + +/* + -- LAPACK routine (version 3.0) -- + Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., + Courant Institute, Argonne National Lab, and Rice University + March 31, 1993 + + + Purpose + ======= + + SPOTRS solves a system of linear equations A*X = B with a symmetric + positive definite matrix A using the Cholesky factorization + A = U**T*U or A = L*L**T computed by SPOTRF. + + Arguments + ========= + + UPLO (input) CHARACTER*1 + = 'U': Upper triangle of A is stored; + = 'L': Lower triangle of A is stored. + + N (input) INTEGER + The order of the matrix A. N >= 0. + + NRHS (input) INTEGER + The number of right hand sides, i.e., the number of columns + of the matrix B. NRHS >= 0. + + A (input) REAL array, dimension (LDA,N) + The triangular factor U or L from the Cholesky factorization + A = U**T*U or A = L*L**T, as computed by SPOTRF. + + LDA (input) INTEGER + The leading dimension of the array A. LDA >= max(1,N). + + B (input/output) REAL array, dimension (LDB,NRHS) + On entry, the right hand side matrix B. + On exit, the solution matrix X. + + LDB (input) INTEGER + The leading dimension of the array B. LDB >= max(1,N). + + INFO (output) INTEGER + = 0: successful exit + < 0: if INFO = -i, the i-th argument had an illegal value + + ===================================================================== + + + Test the input parameters. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, "U"); + if (! upper && ! lsame_(uplo, "L")) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*nrhs < 0) { + *info = -3; + } else if (*lda < max(1,*n)) { + *info = -5; + } else if (*ldb < max(1,*n)) { + *info = -7; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_("SPOTRS", &i__1); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0 || *nrhs == 0) { + return 0; + } + + if (upper) { + +/* + Solve A*X = B where A = U'*U. + + Solve U'*X = B, overwriting B with X. +*/ + + strsm_("Left", "Upper", "Transpose", "Non-unit", n, nrhs, &c_b164, &a[ + a_offset], lda, &b[b_offset], ldb); + +/* Solve U*X = B, overwriting B with X. */ + + strsm_("Left", "Upper", "No transpose", "Non-unit", n, nrhs, &c_b164, + &a[a_offset], lda, &b[b_offset], ldb); + } else { + +/* + Solve A*X = B where A = L*L'. + + Solve L*X = B, overwriting B with X. +*/ + + strsm_("Left", "Lower", "No transpose", "Non-unit", n, nrhs, &c_b164, + &a[a_offset], lda, &b[b_offset], ldb); + +/* Solve L'*X = B, overwriting B with X. */ + + strsm_("Left", "Lower", "Transpose", "Non-unit", n, nrhs, &c_b164, &a[ + a_offset], lda, &b[b_offset], ldb); + } + + return 0; + +/* End of SPOTRS */ + +} /* spotrs_ */ + diff --git a/src/util/soundfiles.c b/src/util/soundfiles.c new file mode 100644 index 0000000..71ba212 --- /dev/null +++ b/src/util/soundfiles.c @@ -0,0 +1,288 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include "util/byteorder.h" +#include "util/ckd_alloc.h" + +#define TRY_FREAD(ptr, size, nmemb, stream) \ + if (fread(ptr, size, nmemb, stream) != (nmemb)) { \ + E_ERROR_SYSTEM("Failed to read %d bytes", size * nmemb); \ + rv = -1; \ + goto error_out; \ + } + +int +ps_config_soundfile(ps_config_t *config, FILE *infh, const char *file) +{ + char header[4]; + int rv = 0; + + if (file == NULL) + file = "(input filehandle)"; + fseek(infh, 0, SEEK_SET); + TRY_FREAD(header, 1, 4, infh); + fseek(infh, 0, SEEK_SET); + + if (0 == memcmp(header, "RIFF", 4)) { + E_INFO("%s appears to be a WAV file\n", file); + rv = ps_config_wavfile(config, infh, file); + } + else if (0 == memcmp(header, "NIST", 4)) { + E_INFO("%s appears to be a NIST SPHERE file\n", file); + rv = ps_config_nistfile(config, infh, file); + } + else if (0 == memcmp(header, "OggS", 4)) { + E_INFO("%s appears to be an UNSUPPORTED Ogg file\n", file); + rv = -1; + goto error_out; + } + else if (0 == memcmp(header, "fLaC", 4)) { + E_INFO("%s appears to be an UNSUPPORTED FLAC file\n", file); + rv = -1; + goto error_out; + } + else if (0 == memcmp(header, "\xff\xff\xff", 3) + || 0 == memcmp(header, "\xff\xff\xfe", 3)) { + E_INFO("%s might be an MP3 file, but who knows really! " + "UNSUPPORTED!\n", file); + rv = -1; + goto error_out; + } + else { + E_INFO("%s appears to be raw data\n", file); + } + +error_out: + return rv; +} + +int +ps_config_wavfile(ps_config_t *config, FILE *infh, const char *file) +{ + char id[4]; + int32 intval, header_len; + int16 shortval; + int rv = 0; + + if (file == NULL) + file = "(input filehandle)"; + + /* RIFF files are little-endian by definition. */ + ps_config_set_str(config, "input_endian", "little"); + + /* Read in all the header chunks and etcetera. */ + TRY_FREAD(id, 1, 4, infh); + /* Total file length (we don't care) */ + TRY_FREAD(&intval, 4, 1, infh); + /* 'WAVE' */ + TRY_FREAD(id, 1, 4, infh); + if (0 != memcmp(id, "WAVE", 4)) { + E_ERROR("%s is not a WAVE file\n", file); + rv = -1; + goto error_out; + } + /* 'fmt ' */ + TRY_FREAD(id, 1, 4, infh); + if (0 != memcmp(id, "fmt ", 4)) { + E_ERROR("Format chunk missing\n"); + rv = -1; + goto error_out; + } + /* Length of 'fmt ' chunk */ + TRY_FREAD(&intval, 4, 1, infh); + SWAP_LE_32(&intval); + header_len = intval; + + /* Data format. */ + TRY_FREAD(&shortval, 2, 1, infh); + SWAP_LE_16(&shortval); + if (shortval != 1) { /* PCM */ + E_ERROR("%s is not in PCM format\n", file); + rv = -1; + goto error_out; + } + + /* Number of channels. */ + TRY_FREAD(&shortval, 2, 1, infh); + SWAP_LE_16(&shortval); + if (shortval != 1) { /* PCM */ + E_ERROR("%s is not single channel\n", file); + rv = -1; + goto error_out; + } + + /* Sampling rate (finally!) */ + TRY_FREAD(&intval, 4, 1, infh); + SWAP_LE_32(&intval); + if (ps_config_int(config, "samprate") == 0) + ps_config_set_int(config, "samprate", intval); + else if (ps_config_int(config, "samprate") != intval) { + E_WARN("WAVE file sampling rate %d != samprate %d\n", + intval, ps_config_int(config, "samprate")); + } + + /* Average bytes per second (we don't care) */ + TRY_FREAD(&intval, 4, 1, infh); + + /* Block alignment (we don't care) */ + TRY_FREAD(&shortval, 2, 1, infh); + + /* Bits per sample (must be 16) */ + TRY_FREAD(&shortval, 2, 1, infh); + SWAP_LE_16(&shortval); + if (shortval != 16) { + E_ERROR("%s is not 16-bit\n", file); + rv = -1; + goto error_out; + } + + /* Any extra parameters. */ + if (header_len > 16) { + /* Avoid seeking... */ + char *spam = malloc(header_len - 16); + if (fread(spam, 1, header_len - 16, infh) != (size_t)(header_len - 16)) { + E_ERROR_SYSTEM("%s: Failed to read extra header", file); + rv = -1; + } + ckd_free(spam); + if (rv == -1) + goto error_out; + } + + /* Now skip to the 'data' chunk. */ + while (1) { + TRY_FREAD(id, 1, 4, infh); + if (0 == memcmp(id, "data", 4)) { + /* Total number of bytes of data (we don't care). */ + TRY_FREAD(&intval, 4, 1, infh); + break; + } + else { + char *spam; + /* Some other stuff... */ + /* Number of bytes of ... whatever */ + TRY_FREAD(&intval, 4, 1, infh); + SWAP_LE_32(&intval); + /* Avoid seeking... */ + spam = malloc(intval); + if (fread(spam, 1, intval, infh) != (size_t)intval) { + E_ERROR_SYSTEM("%s: Failed to read %s chunk", file, id); + rv = -1; + } + ckd_free(spam); + if (rv == -1) + goto error_out; + } + } + +error_out: + return rv; +} + +int +ps_config_nistfile(ps_config_t *config, FILE *infh, const char *file) +{ + char hdr[1024]; + char *line, *c; + int rv = 0; + + if (file == NULL) + file = "(input filehandle)"; + + TRY_FREAD(hdr, 1, 1024, infh); + hdr[1023] = '\0'; + + /* Roughly parse it to find the sampling rate and byte order + * (don't bother with other stuff) */ + if ((line = strstr(hdr, "sample_rate")) == NULL) { + E_ERROR("No sampling rate in NIST header!\n"); + rv = -1; + goto error_out; + } + c = strchr(line, '\n'); + if (c) *c = '\0'; + c = strrchr(line, ' '); + if (c == NULL) { + E_ERROR("Could not find sampling rate!\n"); + rv = -1; + goto error_out; + } + ++c; + if (ps_config_int(config, "samprate") == 0) + ps_config_set_int(config, "samprate", atoi(c)); + else if (ps_config_int(config, "samprate") != atoi(c)) { + E_WARN("NIST file sampling rate %d != samprate %d\n", + atoi(c), ps_config_int(config, "samprate")); + } + + if (line + strlen(line) < hdr + 1023) + line[strlen(line)] = ' '; + if ((line = strstr(hdr, "sample_byte_format")) == NULL) { + E_ERROR("No sample byte format in NIST header!\n"); + rv = -1; + goto error_out; + } + c = strchr(line, '\n'); + if (c) *c = '\0'; + c = strrchr(line, ' '); + if (c == NULL) { + E_ERROR("Could not find sample byte order!\n"); + rv = -1; + goto error_out; + } + ++c; + if (0 == memcmp(c, "01", 2)) { + ps_config_set_str(config, "input_endian", "little"); + } + else if (0 == memcmp(c, "10", 2)) { + ps_config_set_str(config, "input_endian", "big"); + } + else { + E_ERROR("Unknown byte order %s\n", c); + rv = -1; + goto error_out; + } + +error_out: + return rv; +} diff --git a/src/util/strfuncs.c b/src/util/strfuncs.c new file mode 100644 index 0000000..2614134 --- /dev/null +++ b/src/util/strfuncs.c @@ -0,0 +1,194 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * strfuncs.c -- String functions + */ + + +#include +#include +#include +#include +#include + +#include "util/ckd_alloc.h" +#include "util/strfuncs.h" + +/* Defined in dtoa.c */ +double sb_strtod(const char *s00, char **se); + +double +atof_c(char const *str) +{ + return sb_strtod(str, NULL); +} + +/* Locale-independent isspace to avoid different incompatibilities */ +static int +isspace_c(char ch) +{ + if (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r') + return 1; + return 0; +} + +char * +string_join(const char *base, ...) +{ + va_list args; + size_t len; + const char *c; + char *out; + + va_start(args, base); + len = strlen(base); + while ((c = va_arg(args, const char *)) != NULL) { + len += strlen(c); + } + len++; + va_end(args); + + out = ckd_calloc(len, 1); + va_start(args, base); + strcpy(out, base); + while ((c = va_arg(args, const char *)) != NULL) { + strcat(out, c); + } + va_end(args); + + return out; +} + +char * +string_trim(char *string, enum string_edge_e which) +{ + size_t len; + + len = strlen(string); + if (which == STRING_START || which == STRING_BOTH) { + size_t sub = strspn(string, " \t\n\r\f"); + if (sub > 0) { + memmove(string, string + sub, len + 1 - sub); + len -= sub; + } + } + if (which == STRING_END || which == STRING_BOTH) { + long sub = len; + while (--sub >= 0) + if (strchr(" \t\n\r\f", string[sub]) == NULL) + break; + if (sub == -1) + string[0] = '\0'; + else + string[sub+1] = '\0'; + } + return string; +} + +int32 +str2words(char *line, char **ptr, int32 max_ptr) +{ + int32 i, n; + + n = 0; /* #words found so far */ + i = 0; /* For scanning through the input string */ + while (1) { + /* Skip whitespace before next word */ + while (line[i] && isspace_c(line[i])) + ++i; + if (!line[i]) + break; + + if (ptr != NULL && n >= max_ptr) { + /* + * Pointer array size insufficient. Restore NULL chars inserted so far + * to space chars. Not a perfect restoration, but better than nothing. + */ + for (; i >= 0; --i) + if (line[i] == '\0') + line[i] = ' '; + + return -1; + } + + /* Scan to end of word */ + if (ptr != NULL) + ptr[n] = line + i; + ++n; + while (line[i] && !isspace_c(line[i])) + ++i; + if (!line[i]) + break; + if (ptr != NULL) + line[i] = '\0'; + ++i; + } + + return n; +} + + +int32 +nextword(char *line, const char *delim, char **word, char *delimfound) +{ + const char *d; + char *w; + + /* Skip past any preceding delimiters */ + for (w = line; *w; w++) { + for (d = delim; *d && (*d != *w); d++); + if (!*d) + break; + } + if (!*w) + return -1; + + *word = w; /* Beginning of word */ + + /* Skip until first delimiter char */ + for (w++; *w; w++) { + for (d = delim; *d && (*d != *w); d++); + if (*d) + break; + } + + /* Replace delimiter with NULL char, but return the original first */ + *delimfound = *w; + *w = '\0'; + + return (w - *word); +} diff --git a/src/util/strfuncs.h b/src/util/strfuncs.h new file mode 100644 index 0000000..e7a6442 --- /dev/null +++ b/src/util/strfuncs.h @@ -0,0 +1,155 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1995-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file strfuncs.h + * @brief Miscellaneous useful string functions + */ + +#ifndef __SB_STRFUNCS_H__ +#define __SB_STRFUNCS_H__ + +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Concatenate a NULL-terminated argument list of strings, returning a + * newly allocated string. + **/ +POCKETSPHINX_EXPORT +char *string_join(const char *base, ...); + +/** + * Which end of a string to operate on for string_trim(). + */ +enum string_edge_e { + STRING_START, /**< Beginning of string. */ + STRING_END, /**< End of string. */ + STRING_BOTH /**< Both ends of string. */ +}; + +/** + * Remove whitespace from a string, modifying it in-place. + * + * @param string string to trim, contents will be modified. + * @param which one of STRING_START, STRING_END, or STRING_BOTH. + */ +POCKETSPHINX_EXPORT +char *string_trim(char *string, enum string_edge_e which); + +/** + * Locale independent version of atof(). + * + * This function behaves like atof() in the "C" locale. Switching + * locale in a threaded program is extremely uncool, therefore we need + * this since we pass floats as strings in 1000 different places. + */ +POCKETSPHINX_EXPORT +double atof_c(char const *str); + +/* FIXME: Both of these string splitting functions basically suck. I + have attempted to fix them as best I can. (dhuggins@cs, 20070808) */ + +/** + * Convert a line to an array of "words", based on whitespace separators. A word + * is a string with no whitespace chars in it. + * Note that the string line is modified as a result: NULL chars are placed after + * every word in the line. + * Return value: No. of words found; -1 if no. of words in line exceeds n_wptr. + */ +POCKETSPHINX_EXPORT +int32 str2words (char *line, /**< In/Out: line to be parsed. This + string will be modified! (NUL + characters inserted at word + boundaries) */ + char **wptr, /**< In/Out: Array of pointers to + words found in line. The array + must be allocated by the caller. + It may be NULL in which case the + number of words will be counted. + This allows you to allocate it to + the proper size, e.g.: + + n = str2words(line, NULL, 0); + wptr = ckd_calloc(n, sizeof(*wptr)); + str2words(line, wptr, n); + */ + int32 n_wptr /**< In: Size of wptr array, ignored + if wptr == NULL */ + ); + +/** + * Yet another attempt at a clean "next-word-in-string" function. See arguments below. + * @return Length of word returned, or -1 if nothing found. + * This allows you to scan through a line: + * + *
+ * while ((n = nextword(line, delim, &word, &delimfound)) >= 0) {
+ *     ... do something with word ..
+ *     word[n] = delimfound;
+ *     line = word + n;
+ * }
+ * 
+ */ +int32 nextword (char *line, /**< Input: String being searched for next word. + Will be modified by this function (NUL characters inserted) */ + const char *delim, /**< Input: A word, if found, must be delimited at either + end by a character from this string (or at the end + by the NULL char) */ + char **word,/**< Output: *word = ptr within line to beginning of first + word, if found. Delimiter at the end of word replaced + with the NULL char. */ + char *delimfound /**< Output: *delimfound = original delimiter found at the end + of the word. (This way, the caller can restore the + delimiter, preserving the original string.) */ + ); + +#ifdef __cplusplus +} +#endif + + +#endif /* __SB_STRFUNCS_H__ */ diff --git a/src/libpocketsphinx/vector.c b/src/util/vector.c similarity index 95% rename from src/libpocketsphinx/vector.c rename to src/util/vector.c index edb8699..b5dd5e3 100644 --- a/src/libpocketsphinx/vector.c +++ b/src/util/vector.c @@ -65,20 +65,17 @@ * Copied from Eric Thayer. */ -/* System headers. */ #include #include #include #include #include -/* SphinxBase headers. */ -#include -#include -#include +#include -/* Local headers. */ -#include "vector.h" +#include "util/ckd_alloc.h" +#include "util/bitvec.h" +#include "util/vector.h" #if defined(_WIN32) #define srandom srand diff --git a/src/libpocketsphinx/vector.h b/src/util/vector.h similarity index 96% rename from src/libpocketsphinx/vector.h rename to src/util/vector.h index ed81398..1b5de44 100644 --- a/src/libpocketsphinx/vector.h +++ b/src/util/vector.h @@ -49,11 +49,14 @@ #ifndef __VECTOR_H__ #define __VECTOR_H__ -/* System headers. */ #include -/* SphinxBase headers. */ -#include +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif typedef float32 *vector_t; @@ -86,4 +89,8 @@ void vector_print(FILE *fp, vector_t v, int32 dim); int32 vector_is_zero (float32 *vec, /* In: Vector to be checked */ int32 len); /* In: Length of above vector */ +#ifdef __cplusplus +} /* extern "C" */ +#endif + #endif /* VECTOR_H */ diff --git a/src/util/wrapped_routines b/src/util/wrapped_routines new file mode 100644 index 0000000..d78c8db --- /dev/null +++ b/src/util/wrapped_routines @@ -0,0 +1,4 @@ +ssymm +sposv +spotrf +IGNORE: slamch diff --git a/swig/Makefile.am b/swig/Makefile.am deleted file mode 100644 index 22ee7d1..0000000 --- a/swig/Makefile.am +++ /dev/null @@ -1,7 +0,0 @@ -SUBDIRS = python - -swigdir = $(pkgdatadir)/swig -dist_swig_DATA = \ - pocketsphinx.i \ - ps_decoder.i \ - ps_lattice.i diff --git a/swig/Makefile.in b/swig/Makefile.in deleted file mode 100644 index 076ff4f..0000000 --- a/swig/Makefile.in +++ /dev/null @@ -1,695 +0,0 @@ -# Makefile.in generated by automake 1.13.4 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2013 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = swig -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(dist_swig_DATA) -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ - $(top_srcdir)/m4/ax_python_devel.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -SOURCES = -DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ - ctags-recursive dvi-recursive html-recursive info-recursive \ - install-data-recursive install-dvi-recursive \ - install-exec-recursive install-html-recursive \ - install-info-recursive install-pdf-recursive \ - install-ps-recursive install-recursive installcheck-recursive \ - installdirs-recursive pdf-recursive ps-recursive \ - tags-recursive uninstall-recursive -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(swigdir)" -DATA = $(dist_swig_DATA) -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -am__recursive_targets = \ - $(RECURSIVE_TARGETS) \ - $(RECURSIVE_CLEAN_TARGETS) \ - $(am__extra_recursive_targets) -AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ - distdir -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = $(SUBDIRS) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -am__relativize = \ - dir0=`pwd`; \ - sed_first='s,^\([^/]*\)/.*$$,\1,'; \ - sed_rest='s,^[^/]*/*,,'; \ - sed_last='s,^.*/\([^/]*\)$$,\1,'; \ - sed_butlast='s,/*[^/]*$$,,'; \ - while test -n "$$dir1"; do \ - first=`echo "$$dir1" | sed -e "$$sed_first"`; \ - if test "$$first" != "."; then \ - if test "$$first" = ".."; then \ - dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ - dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ - else \ - first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ - if test "$$first2" = "$$first"; then \ - dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ - else \ - dir2="../$$dir2"; \ - fi; \ - dir0="$$dir0"/"$$first"; \ - fi; \ - fi; \ - dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ - done; \ - reldir="$$dir2" -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GST_CFLAGS = @GST_CFLAGS@ -GST_LIBS = @GST_LIBS@ -GST_MAJORMINOR = @GST_MAJORMINOR@ -GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ -GStreamer_CFLAGS = @GStreamer_CFLAGS@ -GStreamer_LIBS = @GStreamer_LIBS@ -HAVE_DOXYGEN = @HAVE_DOXYGEN@ -HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PKG_CONFIG = @PKG_CONFIG@ -PYTHON = @PYTHON@ -PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ -PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ -PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ -PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ -PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ -PYTHON_PLATFORM = @PYTHON_PLATFORM@ -PYTHON_PREFIX = @PYTHON_PREFIX@ -PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ -PYTHON_VERSION = @PYTHON_VERSION@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ -SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ -SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ -STRIP = @STRIP@ -SWIG = @SWIG@ -SWIG_LIB = @SWIG_LIB@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -pkgpyexecdir = @pkgpyexecdir@ -pkgpythondir = @pkgpythondir@ -plugindir = @plugindir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -pyexecdir = @pyexecdir@ -pythondir = @pythondir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUBDIRS = python -swigdir = $(pkgdatadir)/swig -dist_swig_DATA = \ - pocketsphinx.i \ - ps_decoder.i \ - ps_lattice.i - -all: all-recursive - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign swig/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign swig/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-dist_swigDATA: $(dist_swig_DATA) - @$(NORMAL_INSTALL) - @list='$(dist_swig_DATA)'; test -n "$(swigdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(swigdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(swigdir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(swigdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(swigdir)" || exit $$?; \ - done - -uninstall-dist_swigDATA: - @$(NORMAL_UNINSTALL) - @list='$(dist_swig_DATA)'; test -n "$(swigdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(swigdir)'; $(am__uninstall_files_from_dir) - -# This directory's subdirectories are mostly independent; you can cd -# into them and run 'make' without going through this Makefile. -# To change the values of 'make' variables: instead of editing Makefiles, -# (1) if the variable is set in 'config.status', edit 'config.status' -# (which will cause the Makefiles to be regenerated when you run 'make'); -# (2) otherwise, pass the desired values on the 'make' command line. -$(am__recursive_targets): - @fail=; \ - if $(am__make_keepgoing); then \ - failcom='fail=yes'; \ - else \ - failcom='exit 1'; \ - fi; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-recursive -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-recursive - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-recursive - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - $(am__make_dryrun) \ - || test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ - $(am__relativize); \ - new_distdir=$$reldir; \ - dir1=$$subdir; dir2="$(top_distdir)"; \ - $(am__relativize); \ - new_top_distdir=$$reldir; \ - echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ - echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ - ($(am__cd) $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$new_top_distdir" \ - distdir="$$new_distdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - am__skip_mode_fix=: \ - distdir) \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-recursive -all-am: Makefile $(DATA) -installdirs: installdirs-recursive -installdirs-am: - for dir in "$(DESTDIR)$(swigdir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-recursive - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -html-am: - -info: info-recursive - -info-am: - -install-data-am: install-dist_swigDATA - -install-dvi: install-dvi-recursive - -install-dvi-am: - -install-exec-am: - -install-html: install-html-recursive - -install-html-am: - -install-info: install-info-recursive - -install-info-am: - -install-man: - -install-pdf: install-pdf-recursive - -install-pdf-am: - -install-ps: install-ps-recursive - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: uninstall-dist_swigDATA - -.MAKE: $(am__recursive_targets) install-am install-strip - -.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ - check-am clean clean-generic clean-libtool cscopelist-am ctags \ - ctags-am distclean distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am \ - install-dist_swigDATA install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ - uninstall-am uninstall-dist_swigDATA - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/swig/pocketsphinx.i b/swig/pocketsphinx.i deleted file mode 100644 index cd28a60..0000000 --- a/swig/pocketsphinx.i +++ /dev/null @@ -1,215 +0,0 @@ -/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ -/* ==================================================================== - * Copyright (c) 2013 Carnegie Mellon University. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * This work was supported in part by funding from the Defense Advanced - * Research Projects Agency and the National Science Foundation of the - * United States of America, and the CMU Sphinx Speech Consortium. - * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY - * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * ==================================================================== - * - */ - - -%define DOCSTRING -"This documentation was automatically generated using original comments in -Doxygen format. As some C types and data structures cannot be directly mapped -into Python types, some non-trivial type conversion could have place. -Basically a type is replaced with another one that has the closest match, and -sometimes one argument of generated function comprises several arguments of the -original function (usually two). - -Functions having error code as the return value and returning effective -value in one of its arguments are transformed so that the effective value is -returned in a regular fashion and run-time exception is being thrown in case of -negative error code." -%enddef - -#if SWIGJAVA -%module PocketSphinx -#else -%module(docstring=DOCSTRING) pocketsphinx -#endif - -%feature("autodoc", "1"); - -%include typemaps.i -%include iterators.i -%import sphinxbase.i - -#if SWIGPYTHON -%include pybuffer.i -#endif - -%{ -typedef cmd_ln_t Config; -typedef feat_t Feature; -typedef fe_t FrontEnd; -typedef fsg_model_t FsgModel; -typedef logmath_t LogMath; -typedef ngram_model_t NGramModel; -typedef ngram_model_t NGramModelSet; -%} - -#if SWIGPYTHON -%begin %{ -#include -%} -#endif - -#if SWIGJAVASCRIPT -%begin %{ -#include -#include -#include -%} -#endif - - -%begin %{ - -#ifndef __cplusplus -typedef int bool; -#define true 1 -#define false 0 -#endif - -#include - -typedef ps_decoder_t Decoder; -typedef ps_decoder_t SegmentList; -typedef ps_decoder_t NBestList; -typedef ps_lattice_t Lattice; -%} - - -%inline %{ - -// TODO: make private with %immutable -typedef struct { - char *hypstr; - int best_score; - int prob; -} Hypothesis; - -typedef struct { - char *word; - int32 ascore; - int32 lscore; - int32 lback; - int32 prob; - int start_frame; - int end_frame; -} Segment; - -typedef struct { - char *hypstr; - int32 score; -} NBest; - -%} - -%nodefaultctor SegmentList; -%nodefaultctor NBestList; - -sb_iterator(Segment, ps_seg, Segment) -sb_iterator(NBest, ps_nbest, NBest) -sb_iterable(SegmentList, Segment, ps_seg, ps_seg_iter, Segment) -sb_iterable(NBestList, NBest, ps_nbest, ps_nbest, NBest) - -typedef struct {} Decoder; -typedef struct {} Lattice; -typedef struct {} NBestList; -typedef struct {} SegmentList; - - -#ifdef HAS_DOC -%include pydoc.i -#endif - -%extend Hypothesis { - Hypothesis(char const *hypstr, int best_score, int prob) { - Hypothesis *h = (Hypothesis *)ckd_malloc(sizeof *h); - if (hypstr) - h->hypstr = ckd_salloc(hypstr); - else - h->hypstr = NULL; - h->best_score = best_score; - h->prob = prob; - return h; - } - - ~Hypothesis() { - if ($self->hypstr) - ckd_free($self->hypstr); - ckd_free($self); - } -} - -%extend Segment { - - static Segment* fromIter(ps_seg_t *itor) { - Segment *seg; - if (!itor) - return NULL; - seg = (Segment *)ckd_malloc(sizeof(Segment)); - seg->word = ckd_salloc(ps_seg_word(itor)); - seg->prob = ps_seg_prob(itor, &(seg->ascore), &(seg->lscore), &(seg->lback)); - ps_seg_frames(itor, &seg->start_frame, &seg->end_frame); - return seg; - } - ~Segment() { - ckd_free($self->word); - ckd_free($self); - } -} - -%extend NBest { - - static NBest* fromIter(ps_nbest_t *itor) { - NBest *nbest; - if (!itor) - return NULL; - nbest = (NBest *)ckd_malloc(sizeof(NBest)); - nbest->hypstr = ckd_salloc(ps_nbest_hyp(itor, &(nbest->score))); - return nbest; - } - - %newobject hyp; - Hypothesis* hyp() { - return $self->hypstr ? new_Hypothesis($self->hypstr, $self->score, 0) : NULL; - } - - ~NBest() { - ckd_free($self->hypstr); - ckd_free($self); - } -} - -%include ps_decoder.i -%include ps_lattice.i diff --git a/swig/ps_decoder.i b/swig/ps_decoder.i deleted file mode 100644 index a58bf48..0000000 --- a/swig/ps_decoder.i +++ /dev/null @@ -1,256 +0,0 @@ -/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ -/* ==================================================================== - * Copyright (c) 2013 Carnegie Mellon University. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * This work was supported in part by funding from the Defense Advanced - * Research Projects Agency and the National Science Foundation of the - * United States of America, and the CMU Sphinx Speech Consortium. - * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY - * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * ==================================================================== - * - */ - -%extend Decoder { - - /* Following functions have no bindings: - * ps_mllr_t *ps_update_mllr - requires - * int ps_decode_senscr - */ - Decoder(int *errcode) { - Decoder *d = ps_init(cmd_ln_init(NULL, ps_args(), FALSE, NULL)); - *errcode = d ? 0 : -1; - return d; - } - - Decoder(Config *config, int *errcode) { - Decoder *d = ps_init(config); - *errcode = d ? 0 : -1; - return d; - } - - ~Decoder() { - ps_free($self); - } - - void reinit(Config *config, int *errcode) { - *errcode = ps_reinit($self, config); - } - - void load_dict( - char const *fdict, char const *ffilter, char const *format, int *errcode) { - *errcode = ps_load_dict($self, fdict, ffilter, format); - } - - void save_dict(char const *dictfile, char const *format, int *errcode) { - *errcode = ps_save_dict($self, dictfile, format); - } - - void add_word(char const *word, char const *phones, int update, int *errcode) { - *errcode = ps_add_word($self, word, phones, update); - } - - %newobject lookup_word; - char * lookup_word(const char *word) { - return ps_lookup_word($self, word); - } - - Lattice * get_lattice() { - return ps_lattice_retain(ps_get_lattice($self)); - } - - %newobject get_config; - Config *get_config() { - return cmd_ln_retain(ps_get_config($self)); - } - - %newobject default_config; - static Config *default_config() { - return cmd_ln_parse_r(NULL, ps_args(), 0, NULL, FALSE); - } - - %newobject file_config; - static Config *file_config(char const * path) { - return cmd_ln_parse_file_r(NULL, ps_args(), path, FALSE); - } - - void start_stream(int *errcode) { - *errcode = ps_start_stream($self); - } - - void start_utt(int *errcode) { - *errcode = ps_start_utt($self); - } - - void end_utt(int *errcode) { - *errcode = ps_end_utt($self); - } - -#ifdef SWIGPYTHON - %include - %pybuffer_binary(const char* SDATA, size_t NSAMP); - int process_raw(const char* SDATA, size_t NSAMP, bool no_search, bool full_utt, - int *errcode) { - NSAMP /= sizeof(int16); - return *errcode = ps_process_raw($self, (int16 *)SDATA, NSAMP, no_search, full_utt); - } - - int process_cep(const char *SDATA, size_t NSAMP, bool no_search, bool full_utt, - int *errcode) { - mfcc_t **feats; - int ncep = fe_get_output_size(ps_get_fe($self)); - NSAMP /= ncep * sizeof(mfcc_t); - feats = ckd_calloc_2d(NSAMP, ncep, sizeof(mfcc_t)); - memcpy(feats[0], SDATA, NSAMP * ncep * sizeof(mfcc_t)); - *errcode = ps_process_cep($self, feats, NSAMP, no_search, full_utt); - ckd_free_2d(feats); - return *errcode; - } -#elif SWIGJAVASCRIPT - int process_raw(SWIG_Object ptr, bool no_search, bool full_utt, - int *errcode) { - int16* data = (int16*) node::Buffer::Data(ptr); - size_t length = node::Buffer::Length(ptr) / sizeof(int16); - return *errcode = ps_process_raw($self, data, length, no_search, full_utt); - } -#elif SWIGJAVA - int process_raw(const int16 *SDATA, size_t NSAMP, bool no_search, bool full_utt, - int *errcode) { - return *errcode = ps_process_raw($self, SDATA, NSAMP, no_search, full_utt); - } -#elif SWIGRUBY - int process_raw(const char* STRING, size_t SIZE, bool no_search, bool full_utt, - int *errcode) { - return *errcode = ps_process_raw($self, (const int16 *)STRING, SIZE / 2, no_search, full_utt); - } -#endif - -#ifdef SWIGJAVA - // Not sure how to properly return binary buffer in python yet (python3 is also an issue) - void set_rawdata_size(size_t size) { - ps_set_rawdata_size($self, size); - } - - int16 *get_rawdata(int32 *RAWDATA_SIZE) { - int16 *result; - ps_get_rawdata($self, &result, RAWDATA_SIZE); - return result; - } -#endif - - %newobject hyp; - Hypothesis * hyp() { - char const *hyp; - int32 best_score, prob; - hyp = ps_get_hyp($self, &best_score); - if (hyp) - prob = ps_get_prob($self); - return hyp ? new_Hypothesis(hyp, best_score, prob) : NULL; - } - - FrontEnd * get_fe() { - return ps_get_fe($self); - } - - Feature * get_feat() { - return ps_get_feat($self); - } - - bool get_in_speech() { - return ps_get_in_speech($self); - } - - FsgModel * get_fsg(const char *name) { - return fsg_model_retain(ps_get_fsg($self, name)); - } - - void set_fsg(const char *name, FsgModel *fsg, int *errcode) { - *errcode = ps_set_fsg($self, name, fsg); - } - - void set_jsgf_file(const char *name, const char *path, int *errcode) { - *errcode = ps_set_jsgf_file($self, name, path); - } - - void set_jsgf_string(const char *name, const char *jsgf_string, int *errcode) { - *errcode = ps_set_jsgf_string($self, name, jsgf_string); - } - - const char * get_kws(const char *name) { - return ps_get_kws($self, name); - } - - void set_kws(const char *name, const char *keyfile, int *errcode) { - *errcode = ps_set_kws($self, name, keyfile); - } - - void set_keyphrase(const char *name, const char *keyphrase, int *errcode) { - *errcode = ps_set_keyphrase($self, name, keyphrase); - } - - void set_allphone_file(const char *name, const char *lmfile, int *errcode) { - *errcode = ps_set_allphone_file($self, name, lmfile); - } - - %newobject get_lm; - NGramModel * get_lm(const char *name) { - return ngram_model_retain(ps_get_lm($self, name)); - } - - void set_lm(const char *name, NGramModel *lm, int *errcode) { - *errcode = ps_set_lm($self, name, lm); - } - - void set_lm_file(const char *name, const char *path, int *errcode) { - *errcode = ps_set_lm_file($self, name, path); - } - - %newobject get_logmath; - LogMath * get_logmath() { - return logmath_retain(ps_get_logmath($self)); - } - - void set_search(const char *search_name, int *errcode) { - *errcode = ps_set_search($self, search_name); - } - - const char * get_search() { - return ps_get_search($self); - } - - int n_frames() { - return ps_get_n_frames($self); - } - - SegmentList *seg() { - return $self; - } - - NBestList *nbest() { - return $self; - } -} diff --git a/swig/python/Makefile.am b/swig/python/Makefile.am deleted file mode 100644 index 4b1a50d..0000000 --- a/swig/python/Makefile.am +++ /dev/null @@ -1,39 +0,0 @@ -if BUILD_SWIG - -SUBDIRS = test - -SWIG_FLAGS = -I$(top_srcdir)/include -I@SPHINXBASE_SWIG@ - -SWIG_DIR = $(top_srcdir)/swig - -SWIG_FILES = \ - $(SWIG_DIR)/pocketsphinx.i \ - $(SWIG_DIR)/ps_decoder.i \ - $(SWIG_DIR)/ps_lattice.i - -if BUILD_DOXYGEN -SWIG_FLAGS += -DHAS_DOC -I$(top_builddir)/doc -SWIG_FILES += $(top_builddir)/doc/pydoc.i -endif - -CLEANFILES = pocketsphinx_wrap.c pocketsphinx.py pocketsphinx.pyc - -nodist_pkgpyexec_PYTHON = pocketsphinx.py -pkgpyexec_PYTHON = __init__.py -pkgpyexec_LTLIBRARIES = _pocketsphinx.la -nodist__pocketsphinx_la_SOURCES = pocketsphinx_wrap.c - -AM_CFLAGS =\ - $(PYTHON_CPPFLAGS) \ - -I$(top_srcdir)/include \ - -D_DATADIR=\"$(datadir)/@PACKAGE@\" - -_pocketsphinx_la_LDFLAGS = -module -_pocketsphinx_la_LIBADD = \ - -lsphinxbase \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la - -pocketsphinx_wrap.c: $(SWIG_FILES) - $(SWIG) $(SWIG_FLAGS) -outdir . -o $@ -python $< - -endif diff --git a/swig/python/Makefile.in b/swig/python/Makefile.in deleted file mode 100644 index daaf898..0000000 --- a/swig/python/Makefile.in +++ /dev/null @@ -1,912 +0,0 @@ -# Makefile.in generated by automake 1.13.4 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2013 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -@BUILD_DOXYGEN_TRUE@@BUILD_SWIG_TRUE@am__append_1 = -DHAS_DOC -I$(top_builddir)/doc -@BUILD_DOXYGEN_TRUE@@BUILD_SWIG_TRUE@am__append_2 = $(top_builddir)/doc/pydoc.i -subdir = swig/python -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/depcomp $(am__pkgpyexec_PYTHON_DIST) \ - $(top_srcdir)/py-compile -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ - $(top_srcdir)/m4/ax_python_devel.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(pkgpyexecdir)" \ - "$(DESTDIR)$(pkgpyexecdir)" "$(DESTDIR)$(pkgpyexecdir)" -LTLIBRARIES = $(pkgpyexec_LTLIBRARIES) -@BUILD_SWIG_TRUE@_pocketsphinx_la_DEPENDENCIES = $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -@BUILD_SWIG_TRUE@nodist__pocketsphinx_la_OBJECTS = \ -@BUILD_SWIG_TRUE@ pocketsphinx_wrap.lo -_pocketsphinx_la_OBJECTS = $(nodist__pocketsphinx_la_OBJECTS) -AM_V_lt = $(am__v_lt_@AM_V@) -am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) -am__v_lt_0 = --silent -am__v_lt_1 = -_pocketsphinx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ - $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ - $(AM_CFLAGS) $(CFLAGS) $(_pocketsphinx_la_LDFLAGS) $(LDFLAGS) \ - -o $@ -@BUILD_SWIG_TRUE@am__pocketsphinx_la_rpath = -rpath $(pkgpyexecdir) -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -AM_V_CC = $(am__v_CC_@AM_V@) -am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) -am__v_CC_0 = @echo " CC " $@; -am__v_CC_1 = -CCLD = $(CC) -LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CCLD = $(am__v_CCLD_@AM_V@) -am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) -am__v_CCLD_0 = @echo " CCLD " $@; -am__v_CCLD_1 = -SOURCES = $(nodist__pocketsphinx_la_SOURCES) -DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ - ctags-recursive dvi-recursive html-recursive info-recursive \ - install-data-recursive install-dvi-recursive \ - install-exec-recursive install-html-recursive \ - install-info-recursive install-pdf-recursive \ - install-ps-recursive install-recursive installcheck-recursive \ - installdirs-recursive pdf-recursive ps-recursive \ - tags-recursive uninstall-recursive -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__py_compile = PYTHON=$(PYTHON) $(SHELL) $(py_compile) -am__pep3147_tweak = \ - sed -e 's|\.py$$||' -e 's|[^/]*$$|__pycache__/&.*.py|' -am__pkgpyexec_PYTHON_DIST = __init__.py -py_compile = $(top_srcdir)/py-compile -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -am__recursive_targets = \ - $(RECURSIVE_TARGETS) \ - $(RECURSIVE_CLEAN_TARGETS) \ - $(am__extra_recursive_targets) -AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ - distdir -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = test -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -am__relativize = \ - dir0=`pwd`; \ - sed_first='s,^\([^/]*\)/.*$$,\1,'; \ - sed_rest='s,^[^/]*/*,,'; \ - sed_last='s,^.*/\([^/]*\)$$,\1,'; \ - sed_butlast='s,/*[^/]*$$,,'; \ - while test -n "$$dir1"; do \ - first=`echo "$$dir1" | sed -e "$$sed_first"`; \ - if test "$$first" != "."; then \ - if test "$$first" = ".."; then \ - dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ - dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ - else \ - first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ - if test "$$first2" = "$$first"; then \ - dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ - else \ - dir2="../$$dir2"; \ - fi; \ - dir0="$$dir0"/"$$first"; \ - fi; \ - fi; \ - dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ - done; \ - reldir="$$dir2" -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GST_CFLAGS = @GST_CFLAGS@ -GST_LIBS = @GST_LIBS@ -GST_MAJORMINOR = @GST_MAJORMINOR@ -GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ -GStreamer_CFLAGS = @GStreamer_CFLAGS@ -GStreamer_LIBS = @GStreamer_LIBS@ -HAVE_DOXYGEN = @HAVE_DOXYGEN@ -HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PKG_CONFIG = @PKG_CONFIG@ -PYTHON = @PYTHON@ -PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ -PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ -PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ -PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ -PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ -PYTHON_PLATFORM = @PYTHON_PLATFORM@ -PYTHON_PREFIX = @PYTHON_PREFIX@ -PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ -PYTHON_VERSION = @PYTHON_VERSION@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ -SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ -SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ -STRIP = @STRIP@ -SWIG = @SWIG@ -SWIG_LIB = @SWIG_LIB@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -pkgpyexecdir = @pkgpyexecdir@ -pkgpythondir = @pkgpythondir@ -plugindir = @plugindir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -pyexecdir = @pyexecdir@ -pythondir = @pythondir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -@BUILD_SWIG_TRUE@SUBDIRS = test -@BUILD_SWIG_TRUE@SWIG_FLAGS = -I$(top_srcdir)/include \ -@BUILD_SWIG_TRUE@ -I@SPHINXBASE_SWIG@ $(am__append_1) -@BUILD_SWIG_TRUE@SWIG_DIR = $(top_srcdir)/swig -@BUILD_SWIG_TRUE@SWIG_FILES = $(SWIG_DIR)/pocketsphinx.i \ -@BUILD_SWIG_TRUE@ $(SWIG_DIR)/ps_decoder.i \ -@BUILD_SWIG_TRUE@ $(SWIG_DIR)/ps_lattice.i $(am__append_2) -@BUILD_SWIG_TRUE@CLEANFILES = pocketsphinx_wrap.c pocketsphinx.py pocketsphinx.pyc -@BUILD_SWIG_TRUE@nodist_pkgpyexec_PYTHON = pocketsphinx.py -@BUILD_SWIG_TRUE@pkgpyexec_PYTHON = __init__.py -@BUILD_SWIG_TRUE@pkgpyexec_LTLIBRARIES = _pocketsphinx.la -@BUILD_SWIG_TRUE@nodist__pocketsphinx_la_SOURCES = pocketsphinx_wrap.c -@BUILD_SWIG_TRUE@AM_CFLAGS = \ -@BUILD_SWIG_TRUE@ $(PYTHON_CPPFLAGS) \ -@BUILD_SWIG_TRUE@ -I$(top_srcdir)/include \ -@BUILD_SWIG_TRUE@ -D_DATADIR=\"$(datadir)/@PACKAGE@\" - -@BUILD_SWIG_TRUE@_pocketsphinx_la_LDFLAGS = -module -@BUILD_SWIG_TRUE@_pocketsphinx_la_LIBADD = \ -@BUILD_SWIG_TRUE@ -lsphinxbase \ -@BUILD_SWIG_TRUE@ $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la - -all: all-recursive - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign swig/python/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign swig/python/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -install-pkgpyexecLTLIBRARIES: $(pkgpyexec_LTLIBRARIES) - @$(NORMAL_INSTALL) - @list='$(pkgpyexec_LTLIBRARIES)'; test -n "$(pkgpyexecdir)" || list=; \ - list2=; for p in $$list; do \ - if test -f $$p; then \ - list2="$$list2 $$p"; \ - else :; fi; \ - done; \ - test -z "$$list2" || { \ - echo " $(MKDIR_P) '$(DESTDIR)$(pkgpyexecdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(pkgpyexecdir)" || exit 1; \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkgpyexecdir)'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkgpyexecdir)"; \ - } - -uninstall-pkgpyexecLTLIBRARIES: - @$(NORMAL_UNINSTALL) - @list='$(pkgpyexec_LTLIBRARIES)'; test -n "$(pkgpyexecdir)" || list=; \ - for p in $$list; do \ - $(am__strip_dir) \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkgpyexecdir)/$$f'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkgpyexecdir)/$$f"; \ - done - -clean-pkgpyexecLTLIBRARIES: - -test -z "$(pkgpyexec_LTLIBRARIES)" || rm -f $(pkgpyexec_LTLIBRARIES) - @list='$(pkgpyexec_LTLIBRARIES)'; \ - locs=`for p in $$list; do echo $$p; done | \ - sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ - sort -u`; \ - test -z "$$locs" || { \ - echo rm -f $${locs}; \ - rm -f $${locs}; \ - } - -_pocketsphinx.la: $(_pocketsphinx_la_OBJECTS) $(_pocketsphinx_la_DEPENDENCIES) $(EXTRA__pocketsphinx_la_DEPENDENCIES) - $(AM_V_CCLD)$(_pocketsphinx_la_LINK) $(am__pocketsphinx_la_rpath) $(_pocketsphinx_la_OBJECTS) $(_pocketsphinx_la_LIBADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pocketsphinx_wrap.Plo@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-nodist_pkgpyexecPYTHON: $(nodist_pkgpyexec_PYTHON) - @$(NORMAL_INSTALL) - @list='$(nodist_pkgpyexec_PYTHON)'; dlist=; list2=; test -n "$(pkgpyexecdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(pkgpyexecdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(pkgpyexecdir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \ - if test -f $$b$$p; then \ - $(am__strip_dir) \ - dlist="$$dlist $$f"; \ - list2="$$list2 $$b$$p"; \ - else :; fi; \ - done; \ - for file in $$list2; do echo $$file; done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgpyexecdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgpyexecdir)" || exit $$?; \ - done || exit $$?; \ - if test -n "$$dlist"; then \ - $(am__py_compile) --destdir "$(DESTDIR)" \ - --basedir "$(pkgpyexecdir)" $$dlist; \ - else :; fi - -uninstall-nodist_pkgpyexecPYTHON: - @$(NORMAL_UNINSTALL) - @list='$(nodist_pkgpyexec_PYTHON)'; test -n "$(pkgpyexecdir)" || list=; \ - py_files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$py_files" || exit 0; \ - dir='$(DESTDIR)$(pkgpyexecdir)'; \ - pyc_files=`echo "$$py_files" | sed 's|$$|c|'`; \ - pyo_files=`echo "$$py_files" | sed 's|$$|o|'`; \ - py_files_pep3147=`echo "$$py_files" | $(am__pep3147_tweak)`; \ - echo "$$py_files_pep3147";\ - pyc_files_pep3147=`echo "$$py_files_pep3147" | sed 's|$$|c|'`; \ - pyo_files_pep3147=`echo "$$py_files_pep3147" | sed 's|$$|o|'`; \ - st=0; \ - for files in \ - "$$py_files" \ - "$$pyc_files" \ - "$$pyo_files" \ - "$$pyc_files_pep3147" \ - "$$pyo_files_pep3147" \ - ; do \ - $(am__uninstall_files_from_dir) || st=$$?; \ - done; \ - exit $$st -install-pkgpyexecPYTHON: $(pkgpyexec_PYTHON) - @$(NORMAL_INSTALL) - @list='$(pkgpyexec_PYTHON)'; dlist=; list2=; test -n "$(pkgpyexecdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(pkgpyexecdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(pkgpyexecdir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \ - if test -f $$b$$p; then \ - $(am__strip_dir) \ - dlist="$$dlist $$f"; \ - list2="$$list2 $$b$$p"; \ - else :; fi; \ - done; \ - for file in $$list2; do echo $$file; done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgpyexecdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgpyexecdir)" || exit $$?; \ - done || exit $$?; \ - if test -n "$$dlist"; then \ - $(am__py_compile) --destdir "$(DESTDIR)" \ - --basedir "$(pkgpyexecdir)" $$dlist; \ - else :; fi - -uninstall-pkgpyexecPYTHON: - @$(NORMAL_UNINSTALL) - @list='$(pkgpyexec_PYTHON)'; test -n "$(pkgpyexecdir)" || list=; \ - py_files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$py_files" || exit 0; \ - dir='$(DESTDIR)$(pkgpyexecdir)'; \ - pyc_files=`echo "$$py_files" | sed 's|$$|c|'`; \ - pyo_files=`echo "$$py_files" | sed 's|$$|o|'`; \ - py_files_pep3147=`echo "$$py_files" | $(am__pep3147_tweak)`; \ - echo "$$py_files_pep3147";\ - pyc_files_pep3147=`echo "$$py_files_pep3147" | sed 's|$$|c|'`; \ - pyo_files_pep3147=`echo "$$py_files_pep3147" | sed 's|$$|o|'`; \ - st=0; \ - for files in \ - "$$py_files" \ - "$$pyc_files" \ - "$$pyo_files" \ - "$$pyc_files_pep3147" \ - "$$pyo_files_pep3147" \ - ; do \ - $(am__uninstall_files_from_dir) || st=$$?; \ - done; \ - exit $$st - -# This directory's subdirectories are mostly independent; you can cd -# into them and run 'make' without going through this Makefile. -# To change the values of 'make' variables: instead of editing Makefiles, -# (1) if the variable is set in 'config.status', edit 'config.status' -# (which will cause the Makefiles to be regenerated when you run 'make'); -# (2) otherwise, pass the desired values on the 'make' command line. -$(am__recursive_targets): - @fail=; \ - if $(am__make_keepgoing); then \ - failcom='fail=yes'; \ - else \ - failcom='exit 1'; \ - fi; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-recursive -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-recursive - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-recursive - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - $(am__make_dryrun) \ - || test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ - $(am__relativize); \ - new_distdir=$$reldir; \ - dir1=$$subdir; dir2="$(top_distdir)"; \ - $(am__relativize); \ - new_top_distdir=$$reldir; \ - echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ - echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ - ($(am__cd) $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$new_top_distdir" \ - distdir="$$new_distdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - am__skip_mode_fix=: \ - distdir) \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-recursive -all-am: Makefile $(LTLIBRARIES) -installdirs: installdirs-recursive -installdirs-am: - for dir in "$(DESTDIR)$(pkgpyexecdir)" "$(DESTDIR)$(pkgpyexecdir)" "$(DESTDIR)$(pkgpyexecdir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-generic clean-libtool clean-pkgpyexecLTLIBRARIES \ - mostlyclean-am - -distclean: distclean-recursive - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -html-am: - -info: info-recursive - -info-am: - -install-data-am: - -install-dvi: install-dvi-recursive - -install-dvi-am: - -install-exec-am: install-nodist_pkgpyexecPYTHON \ - install-pkgpyexecLTLIBRARIES install-pkgpyexecPYTHON - -install-html: install-html-recursive - -install-html-am: - -install-info: install-info-recursive - -install-info-am: - -install-man: - -install-pdf: install-pdf-recursive - -install-pdf-am: - -install-ps: install-ps-recursive - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: uninstall-nodist_pkgpyexecPYTHON \ - uninstall-pkgpyexecLTLIBRARIES uninstall-pkgpyexecPYTHON - -.MAKE: $(am__recursive_targets) install-am install-strip - -.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ - check-am clean clean-generic clean-libtool \ - clean-pkgpyexecLTLIBRARIES cscopelist-am ctags ctags-am \ - distclean distclean-compile distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-nodist_pkgpyexecPYTHON \ - install-pdf install-pdf-am install-pkgpyexecLTLIBRARIES \ - install-pkgpyexecPYTHON install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs installdirs-am \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ - uninstall-nodist_pkgpyexecPYTHON \ - uninstall-pkgpyexecLTLIBRARIES uninstall-pkgpyexecPYTHON - - -@BUILD_SWIG_TRUE@pocketsphinx_wrap.c: $(SWIG_FILES) -@BUILD_SWIG_TRUE@ $(SWIG) $(SWIG_FLAGS) -outdir . -o $@ -python $< - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/swig/python/__init__.py b/swig/python/__init__.py deleted file mode 100644 index deab09a..0000000 --- a/swig/python/__init__.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ -# ==================================================================== -# Copyright (c) 2013 Carnegie Mellon University. All rights -# reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# -# This work was supported in part by funding from the Defense Advanced -# Research Projects Agency and the National Science Foundation of the -# United States of America, and the CMU Sphinx Speech Consortium. -# -# THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND -# ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY -# NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# ==================================================================== - - -from pocketsphinx import * diff --git a/swig/python/test/Makefile.am b/swig/python/test/Makefile.am deleted file mode 100644 index 5eb37f5..0000000 --- a/swig/python/test/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -EXTRA_DIST = \ - config_test.py \ - continuous_test.py \ - decoder_test.py \ - kws_test.py \ - fsg_test.py \ - jsgf_test.py \ - lattice_test.py \ - lm_test.py \ - phoneme_test.py - diff --git a/swig/python/test/Makefile.in b/swig/python/test/Makefile.in deleted file mode 100644 index c574e06..0000000 --- a/swig/python/test/Makefile.in +++ /dev/null @@ -1,463 +0,0 @@ -# Makefile.in generated by automake 1.13.4 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2013 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = swig/python/test -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ - $(top_srcdir)/m4/ax_python_devel.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -SOURCES = -DIST_SOURCES = -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GST_CFLAGS = @GST_CFLAGS@ -GST_LIBS = @GST_LIBS@ -GST_MAJORMINOR = @GST_MAJORMINOR@ -GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ -GStreamer_CFLAGS = @GStreamer_CFLAGS@ -GStreamer_LIBS = @GStreamer_LIBS@ -HAVE_DOXYGEN = @HAVE_DOXYGEN@ -HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PKG_CONFIG = @PKG_CONFIG@ -PYTHON = @PYTHON@ -PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ -PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ -PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ -PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ -PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ -PYTHON_PLATFORM = @PYTHON_PLATFORM@ -PYTHON_PREFIX = @PYTHON_PREFIX@ -PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ -PYTHON_VERSION = @PYTHON_VERSION@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ -SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ -SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ -STRIP = @STRIP@ -SWIG = @SWIG@ -SWIG_LIB = @SWIG_LIB@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -pkgpyexecdir = @pkgpyexecdir@ -pkgpythondir = @pkgpythondir@ -plugindir = @plugindir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -pyexecdir = @pyexecdir@ -pythondir = @pythondir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -EXTRA_DIST = \ - config_test.py \ - continuous_test.py \ - decoder_test.py \ - kws_test.py \ - fsg_test.py \ - jsgf_test.py \ - lattice_test.py \ - lm_test.py \ - phoneme_test.py - -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign swig/python/test/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign swig/python/test/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -tags TAGS: - -ctags CTAGS: - -cscope cscopelist: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - cscopelist-am ctags-am distclean distclean-generic \ - distclean-libtool distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags-am uninstall uninstall-am - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/swig/python/test/config_test.py b/swig/python/test/config_test.py deleted file mode 100644 index 4e665c4..0000000 --- a/swig/python/test/config_test.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/python - -from os import environ, path - -from pocketsphinx.pocketsphinx import * -from sphinxbase.sphinxbase import * - -#some dumb test for checking during developent - -MODELDIR = "../../../model" - -config = Decoder.default_config() - -intval = 256 -floatval = 8000.0 -stringval = "~/pocketsphinx" -boolval = True - -# Check values that was previously set. -s = config.get_float("-samprate") -print ("Float: ",floatval ," ", s) -config.set_float("-samprate", floatval) -s = config.get_float("-samprate") -print ("Float: ",floatval ," ", s) - -s = config.get_int("-nfft") -print ("Int:",intval, " ", s) -config.set_int("-nfft", intval) -s = config.get_int("-nfft") -print ("Int:",intval, " ", s) - -s = config.get_string("-rawlogdir") -print ("String:",stringval, " ", s) -config.set_string("-rawlogdir", stringval) -s = config.get_string("-rawlogdir") -print ("String:",stringval, " ", s) - -s = config.get_boolean("-backtrace") -print ("Boolean:", boolval, " ", s) -config.set_boolean("-backtrace", boolval); -s = config.get_boolean("-backtrace") -print ("Boolean:", boolval, " ", s) - -config.set_string_extra("-something12321", "abc") -print config.get_string("-something12321") - diff --git a/swig/python/test/continuous_test.py b/swig/python/test/continuous_test.py deleted file mode 100644 index 5fe70e5..0000000 --- a/swig/python/test/continuous_test.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/python - -from os import environ, path - -from pocketsphinx.pocketsphinx import * -from sphinxbase.sphinxbase import * - -MODELDIR = "../../../model" -DATADIR = "../../../test/data" - -config = Decoder.default_config() -config.set_string('-hmm', path.join(MODELDIR, 'en-us/en-us')) -config.set_string('-lm', path.join(MODELDIR, 'en-us/en-us.lm.bin')) -config.set_string('-dict', path.join(MODELDIR, 'en-us/cmudict-en-us.dict')) -config.set_string('-logfn', '/dev/null') -decoder = Decoder(config) - -stream = open(path.join(DATADIR, 'goforward.raw'), 'rb') -#stream = open('10001-90210-01803.wav', 'rb') - -in_speech_bf = False -decoder.start_utt() -while True: - buf = stream.read(1024) - if buf: - decoder.process_raw(buf, False, False) - if decoder.get_in_speech() != in_speech_bf: - in_speech_bf = decoder.get_in_speech() - if not in_speech_bf: - decoder.end_utt() - print 'Result:', decoder.hyp().hypstr - decoder.start_utt() - else: - break -decoder.end_utt() diff --git a/swig/python/test/decoder_test.py b/swig/python/test/decoder_test.py deleted file mode 100644 index b207856..0000000 --- a/swig/python/test/decoder_test.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/python - -from os import environ, path - - -from pocketsphinx.pocketsphinx import * -from sphinxbase.sphinxbase import * - -MODELDIR = "../../../model" -DATADIR = "../../../test/data" - -# Create a decoder with certain model -config = Decoder.default_config() -config.set_string('-hmm', path.join(MODELDIR, 'en-us/en-us')) -config.set_string('-lm', path.join(MODELDIR, 'en-us/en-us.lm.bin')) -config.set_string('-dict', path.join(MODELDIR, 'en-us/cmudict-en-us.dict')) - -# Decode streaming data. -decoder = Decoder(config) - -print ("Pronunciation for word 'hello' is ", decoder.lookup_word("hello")) -print ("Pronunciation for word 'abcdf' is ", decoder.lookup_word("abcdf")) - -decoder.start_utt() -stream = open(path.join(DATADIR, 'goforward.raw'), 'rb') -while True: - buf = stream.read(1024) - if buf: - decoder.process_raw(buf, False, False) - else: - break -decoder.end_utt() - -hypothesis = decoder.hyp() -logmath = decoder.get_logmath() -print ('Best hypothesis: ', hypothesis.hypstr, " model score: ", hypothesis.best_score, " confidence: ", logmath.exp(hypothesis.prob)) - -print ('Best hypothesis segments: ', [seg.word for seg in decoder.seg()]) - -# Access N best decodings. -print ('Best 10 hypothesis: ') -for best, i in zip(decoder.nbest(), range(10)): - print (best.hypstr, best.score) - -stream = open(path.join(DATADIR, 'goforward.mfc'), 'rb') -stream.read(4) -buf = stream.read(13780) -decoder.start_utt() -decoder.process_cep(buf, False, True) -decoder.end_utt() -hypothesis = decoder.hyp() -print ('Best hypothesis: ', hypothesis.hypstr, " model score: ", hypothesis.best_score, " confidence: ", hypothesis.prob) diff --git a/swig/python/test/fsg_test.py b/swig/python/test/fsg_test.py deleted file mode 100644 index ff5b45f..0000000 --- a/swig/python/test/fsg_test.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/python - -import sys - -from sphinxbase.sphinxbase import LogMath -from sphinxbase.sphinxbase import FsgModel - -lmath = LogMath() -fsg = FsgModel("simple_grammar", lmath, 1.0, 10) -fsg.word_add("hello") -fsg.word_add("world") -print (fsg.word_id("world")) - -fsg.add_silence("", 1, 0.5) - diff --git a/swig/python/test/jsgf_test.py b/swig/python/test/jsgf_test.py deleted file mode 100644 index 0413247..0000000 --- a/swig/python/test/jsgf_test.py +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/python - -from os import environ, path -from sys import stdout - -from pocketsphinx.pocketsphinx import * -from sphinxbase.sphinxbase import * - -MODELDIR = "../../../model" -DATADIR = "../../../test/data" - -# Create a decoder with certain model -config = Decoder.default_config() -config.set_string('-hmm', path.join(MODELDIR, 'en-us/en-us')) -config.set_string('-lm', path.join(DATADIR, 'turtle.lm.bin')) -config.set_string('-dict', path.join(DATADIR, 'turtle.dic')) -decoder = Decoder(config) - -# Decode with lm -decoder.start_utt() -stream = open(path.join(DATADIR, 'goforward.raw'), 'rb') -while True: - buf = stream.read(1024) - if buf: - decoder.process_raw(buf, False, False) - else: - break -decoder.end_utt() -print ('Decoding with "turtle" language:', decoder.hyp().hypstr) - -# Switch to JSGF grammar -jsgf = Jsgf(path.join(DATADIR, 'goforward.gram')) -rule = jsgf.get_rule('goforward.move2') -fsg = jsgf.build_fsg(rule, decoder.get_logmath(), 7.5) -fsg.writefile('goforward.fsg') - -decoder.set_fsg("goforward", fsg) -decoder.set_search("goforward") - -decoder.start_utt() -stream = open(path.join(DATADIR, 'goforward.raw'), 'rb') -while True: - buf = stream.read(1024) - if buf: - decoder.process_raw(buf, False, False) - else: - break -decoder.end_utt() -print ('Decoding with "goforward" grammar:', decoder.hyp().hypstr) diff --git a/swig/python/test/kws_test.py b/swig/python/test/kws_test.py deleted file mode 100644 index 8f84042..0000000 --- a/swig/python/test/kws_test.py +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/python - -import sys, os -from pocketsphinx.pocketsphinx import * -from sphinxbase.sphinxbase import * - - -modeldir = "../../../model" -datadir = "../../../test/data" - -# Create a decoder with certain model -config = Decoder.default_config() -config.set_string('-hmm', os.path.join(modeldir, 'en-us/en-us')) -config.set_string('-dict', os.path.join(modeldir, 'en-us/cmudict-en-us.dict')) -config.set_string('-keyphrase', 'forward') -config.set_float('-kws_threshold', 1e+20) - - -# Open file to read the data -stream = open(os.path.join(datadir, "goforward.raw"), "rb") - -# Alternatively you can read from microphone -# import pyaudio -# -# p = pyaudio.PyAudio() -# stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=1024) -# stream.start_stream() - -# Process audio chunk by chunk. On keyphrase detected perform action and restart search -decoder = Decoder(config) -decoder.start_utt() -while True: - buf = stream.read(1024) - if buf: - decoder.process_raw(buf, False, False) - else: - break - if decoder.hyp() != None: - print ([(seg.word, seg.prob, seg.start_frame, seg.end_frame) for seg in decoder.seg()]) - print ("Detected keyphrase, restarting search") - decoder.end_utt() - decoder.start_utt() diff --git a/swig/python/test/lattice_test.py b/swig/python/test/lattice_test.py deleted file mode 100644 index 479c226..0000000 --- a/swig/python/test/lattice_test.py +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/python - -from os import environ, path - -from pocketsphinx.pocketsphinx import * -from sphinxbase.sphinxbase import * - -MODELDIR = "../../../model" -DATADIR = "../../../test/data" - -# Create a decoder with certain model -config = Decoder.default_config() -config.set_string('-hmm', path.join(MODELDIR, 'en-us/en-us')) -config.set_string('-lm', path.join(MODELDIR, 'en-us/en-us.lm.bin')) -config.set_string('-dict', path.join(MODELDIR, 'en-us/cmudict-en-us.dict')) -decoder = Decoder(config) - -decoder.start_utt() -stream = open(path.join(DATADIR, 'goforward.raw'), 'rb') -while True: - buf = stream.read(1024) - if buf: - decoder.process_raw(buf, False, False) - else: - break -decoder.end_utt() - -decoder.get_lattice().write('goforward.lat') -decoder.get_lattice().write_htk('goforward.htk') diff --git a/swig/python/test/lm_test.py b/swig/python/test/lm_test.py deleted file mode 100644 index 8bf215e..0000000 --- a/swig/python/test/lm_test.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/python - -from os import environ, path -from pocketsphinx.pocketsphinx import * -from sphinxbase.sphinxbase import * - -MODELDIR = "../../../model" -DATADIR = "../../../test/data" - -# Create a decoder with certain model -config = Decoder.default_config() -config.set_string('-hmm', path.join(MODELDIR, 'en-us/en-us')) -config.set_string('-lm', path.join(MODELDIR, 'en-us/en-us.lm.bin')) -config.set_string('-dict', path.join(DATADIR, 'defective.dic')) -config.set_boolean('-mmap', False) -decoder = Decoder(config) - -decoder.start_utt() -stream = open(path.join(DATADIR, 'goforward.raw'), 'rb') -while True: - buf = stream.read(1024) - if buf: - decoder.process_raw(buf, False, False) - else: - break -decoder.end_utt() -print ('Decoding with default settings:', decoder.hyp().hypstr) - -# Load "turtle" language model and decode again. -lm = NGramModel(config, decoder.get_logmath(), path.join(DATADIR, 'turtle.lm.bin')) -print (lm.prob(['you'])) -print (lm.prob(['are','you'])) -print (lm.prob(['you', 'are', 'what'])) -print (lm.prob(['lost', 'are', 'you'])) - -decoder.set_lm('turtle', lm) -decoder.set_search('turtle') -decoder.start_utt() -stream = open(path.join(DATADIR, 'goforward.raw'), 'rb') -while True: - buf = stream.read(1024) - if buf: - decoder.process_raw(buf, False, False) - else: - break -decoder.end_utt() - -print ('Decoding with "turtle" language:', decoder.hyp().hypstr) - -## The word 'meters' isn't in the loaded dictionary. -## Let's add it manually. -decoder.add_word('foobie', 'F UW B IY', False) -decoder.add_word('meters', 'M IY T ER Z', True) -decoder.start_utt() -stream = open(path.join(DATADIR, 'goforward.raw'), 'rb') -while True: - buf = stream.read(1024) - if buf: - decoder.process_raw(buf, False, False) - else: - break -decoder.end_utt() -print ('Decoding with customized language:', decoder.hyp().hypstr) diff --git a/swig/python/test/phoneme_test.py b/swig/python/test/phoneme_test.py deleted file mode 100644 index d78076e..0000000 --- a/swig/python/test/phoneme_test.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/python - -from os import environ, path - -from pocketsphinx.pocketsphinx import * -from sphinxbase.sphinxbase import * - -MODELDIR = "../../../model" -DATADIR = "../../../test/data" - -# Create a decoder with certain model -config = Decoder.default_config() -config.set_string('-hmm', path.join(MODELDIR, 'en-us/en-us')) -config.set_string('-allphone', path.join(MODELDIR, 'en-us/en-us-phone.lm.bin')) -config.set_float('-lw', 2.0) -config.set_float('-pip', 0.3) -config.set_float('-beam', 1e-200) -config.set_float('-pbeam', 1e-20) -config.set_boolean('-mmap', False) - -# Decode streaming data. -decoder = Decoder(config) - -decoder.start_utt() -stream = open(path.join(DATADIR, 'goforward.raw'), 'rb') -while True: - buf = stream.read(1024) - if buf: - decoder.process_raw(buf, False, False) - else: - break -decoder.end_utt() - -hypothesis = decoder.hyp() -print ('Best phonemes: ', [seg.word for seg in decoder.seg()]) diff --git a/test-driver b/test-driver deleted file mode 100755 index 32bf39e..0000000 --- a/test-driver +++ /dev/null @@ -1,127 +0,0 @@ -#! /bin/sh -# test-driver - basic testsuite driver script. - -scriptversion=2012-06-27.10; # UTC - -# Copyright (C) 2011-2013 Free Software Foundation, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# This file is maintained in Automake, please report -# bugs to or send patches to -# . - -# Make unconditional expansion of undefined variables an error. This -# helps a lot in preventing typo-related bugs. -set -u - -usage_error () -{ - echo "$0: $*" >&2 - print_usage >&2 - exit 2 -} - -print_usage () -{ - cat <$log_file 2>&1 -estatus=$? -if test $enable_hard_errors = no && test $estatus -eq 99; then - estatus=1 -fi - -case $estatus:$expect_failure in - 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; - 0:*) col=$grn res=PASS recheck=no gcopy=no;; - 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; - 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; - *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; - *:*) col=$red res=FAIL recheck=yes gcopy=yes;; -esac - -# Report outcome to console. -echo "${col}${res}${std}: $test_name" - -# Register the test result, and other relevant metadata. -echo ":test-result: $res" > $trs_file -echo ":global-test-result: $res" >> $trs_file -echo ":recheck: $recheck" >> $trs_file -echo ":copy-in-global-log: $gcopy" >> $trs_file - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 0000000..b7bdc5a --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,5 @@ +find_program(BASH_PROGRAM bash) +configure_file(testfuncs.sh.in testfuncs.sh @ONLY) + +add_subdirectory(regression) +add_subdirectory(unit) diff --git a/test/Makefile.am b/test/Makefile.am deleted file mode 100644 index 32ce1c3..0000000 --- a/test/Makefile.am +++ /dev/null @@ -1,89 +0,0 @@ -SUBDIRS = unit regression - -EXTRA_DIST = \ - compare_table.pl \ - testfuncs_cygwin.sh \ - word_align.pl \ - data/an4_ci_cont/feat.params \ - data/an4_ci_cont/mdef \ - data/an4_ci_cont/means \ - data/an4_ci_cont/mixture_weights \ - data/an4_ci_cont/noisedict \ - data/an4_ci_cont/transition_matrices \ - data/an4_ci_cont/variances \ - data/cards/001.wav \ - data/cards/002.wav \ - data/cards/003.wav \ - data/cards/004.wav \ - data/cards/005.wav \ - data/cards/cards.fileids \ - data/cards/cards.gram \ - data/cards/cards.hyp \ - data/cards/cards.transcription \ - data/defective.gram \ - data/defective.dic \ - data/goforward.fsg \ - data/goforward.gram \ - data/goforward.raw \ - data/goforward.kws \ - data/goforward.mfc \ - data/mllr_matrices \ - data/numbers.raw \ - data/something.raw \ - data/test.lmctl \ - data/tidigits/dhd.2934z.raw \ - data/tidigits/man.ah.111a.mfc \ - data/tidigits/man.ah.1b.mfc \ - data/tidigits/man.ah.2934za.mfc \ - data/tidigits/man.ah.35oa.mfc \ - data/tidigits/man.ah.3oa.mfc \ - data/tidigits/man.ah.4625a.mfc \ - data/tidigits/man.ah.588zza.mfc \ - data/tidigits/man.ah.63a.mfc \ - data/tidigits/man.ah.6o838a.mfc \ - data/tidigits/man.ah.75913a.mfc \ - data/tidigits/man.ah.844o1a.mfc \ - data/tidigits/man.ah.8b.mfc \ - data/tidigits/man.ah.9b.mfc \ - data/tidigits/man.ah.o789a.mfc \ - data/tidigits/man.ah.z4548a.mfc \ - data/tidigits/man.ah.zb.mfc \ - data/tidigits/test-tidigits-fsg.match \ - data/tidigits/test-tidigits-simple.match \ - data/tidigits/tidigits.ctl \ - data/tidigits/tidigits.lsn \ - data/tidigits/woman.ak.1b.mfc \ - data/tidigits/woman.ak.276317oa.mfc \ - data/tidigits/woman.ak.334a.mfc \ - data/tidigits/woman.ak.3z3z9a.mfc \ - data/tidigits/woman.ak.48z66zza.mfc \ - data/tidigits/woman.ak.532a.mfc \ - data/tidigits/woman.ak.5z874a.mfc \ - data/tidigits/woman.ak.6728za.mfc \ - data/tidigits/woman.ak.75a.mfc \ - data/tidigits/woman.ak.84983a.mfc \ - data/tidigits/woman.ak.8a.mfc \ - data/tidigits/woman.ak.99731a.mfc \ - data/tidigits/woman.ak.o69a.mfc \ - data/tidigits/woman.ak.ooa.mfc \ - data/tidigits/woman.ak.za.mfc \ - data/tidigits/hmm/feat.params \ - data/tidigits/hmm/variances \ - data/tidigits/hmm/transition_matrices \ - data/tidigits/hmm/sendump \ - data/tidigits/hmm/mdef \ - data/tidigits/hmm/means \ - data/tidigits/lm/tidigits.dic \ - data/tidigits/lm/tidigits.lm.bin \ - data/tidigits/lm/tidigits.fsg \ - data/turtle.dic \ - data/turtle.lm.bin \ - data/unreachable.lat \ - data/librivox/fileids \ - data/librivox/sense_and_sensibility_01_austen_64kb-0880.wav \ - data/librivox/sense_and_sensibility_01_austen_64kb-0890.wav \ - data/librivox/sense_and_sensibility_01_austen_64kb-0930.wav \ - data/librivox/sense_and_sensibility_01_austen_64kb-0870.wav \ - data/librivox/sense_and_sensibility_01_austen_64kb-0920.wav \ - data/librivox/transcription \ - data/librivox/test-lm.match diff --git a/test/Makefile.in b/test/Makefile.in deleted file mode 100644 index 16aa944..0000000 --- a/test/Makefile.in +++ /dev/null @@ -1,724 +0,0 @@ -# Makefile.in generated by automake 1.13.4 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2013 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = test -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(srcdir)/testfuncs.sh.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ - $(top_srcdir)/m4/ax_python_devel.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = testfuncs.sh -CONFIG_CLEAN_VPATH_FILES = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -SOURCES = -DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ - ctags-recursive dvi-recursive html-recursive info-recursive \ - install-data-recursive install-dvi-recursive \ - install-exec-recursive install-html-recursive \ - install-info-recursive install-pdf-recursive \ - install-ps-recursive install-recursive installcheck-recursive \ - installdirs-recursive pdf-recursive ps-recursive \ - tags-recursive uninstall-recursive -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -am__recursive_targets = \ - $(RECURSIVE_TARGETS) \ - $(RECURSIVE_CLEAN_TARGETS) \ - $(am__extra_recursive_targets) -AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ - distdir -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = $(SUBDIRS) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -am__relativize = \ - dir0=`pwd`; \ - sed_first='s,^\([^/]*\)/.*$$,\1,'; \ - sed_rest='s,^[^/]*/*,,'; \ - sed_last='s,^.*/\([^/]*\)$$,\1,'; \ - sed_butlast='s,/*[^/]*$$,,'; \ - while test -n "$$dir1"; do \ - first=`echo "$$dir1" | sed -e "$$sed_first"`; \ - if test "$$first" != "."; then \ - if test "$$first" = ".."; then \ - dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ - dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ - else \ - first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ - if test "$$first2" = "$$first"; then \ - dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ - else \ - dir2="../$$dir2"; \ - fi; \ - dir0="$$dir0"/"$$first"; \ - fi; \ - fi; \ - dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ - done; \ - reldir="$$dir2" -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GST_CFLAGS = @GST_CFLAGS@ -GST_LIBS = @GST_LIBS@ -GST_MAJORMINOR = @GST_MAJORMINOR@ -GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ -GStreamer_CFLAGS = @GStreamer_CFLAGS@ -GStreamer_LIBS = @GStreamer_LIBS@ -HAVE_DOXYGEN = @HAVE_DOXYGEN@ -HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PKG_CONFIG = @PKG_CONFIG@ -PYTHON = @PYTHON@ -PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ -PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ -PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ -PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ -PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ -PYTHON_PLATFORM = @PYTHON_PLATFORM@ -PYTHON_PREFIX = @PYTHON_PREFIX@ -PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ -PYTHON_VERSION = @PYTHON_VERSION@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ -SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ -SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ -STRIP = @STRIP@ -SWIG = @SWIG@ -SWIG_LIB = @SWIG_LIB@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -pkgpyexecdir = @pkgpyexecdir@ -pkgpythondir = @pkgpythondir@ -plugindir = @plugindir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -pyexecdir = @pyexecdir@ -pythondir = @pythondir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUBDIRS = unit regression -EXTRA_DIST = \ - compare_table.pl \ - testfuncs_cygwin.sh \ - word_align.pl \ - data/an4_ci_cont/feat.params \ - data/an4_ci_cont/mdef \ - data/an4_ci_cont/means \ - data/an4_ci_cont/mixture_weights \ - data/an4_ci_cont/noisedict \ - data/an4_ci_cont/transition_matrices \ - data/an4_ci_cont/variances \ - data/cards/001.wav \ - data/cards/002.wav \ - data/cards/003.wav \ - data/cards/004.wav \ - data/cards/005.wav \ - data/cards/cards.fileids \ - data/cards/cards.gram \ - data/cards/cards.hyp \ - data/cards/cards.transcription \ - data/defective.gram \ - data/defective.dic \ - data/goforward.fsg \ - data/goforward.gram \ - data/goforward.raw \ - data/goforward.kws \ - data/goforward.mfc \ - data/mllr_matrices \ - data/numbers.raw \ - data/something.raw \ - data/test.lmctl \ - data/tidigits/dhd.2934z.raw \ - data/tidigits/man.ah.111a.mfc \ - data/tidigits/man.ah.1b.mfc \ - data/tidigits/man.ah.2934za.mfc \ - data/tidigits/man.ah.35oa.mfc \ - data/tidigits/man.ah.3oa.mfc \ - data/tidigits/man.ah.4625a.mfc \ - data/tidigits/man.ah.588zza.mfc \ - data/tidigits/man.ah.63a.mfc \ - data/tidigits/man.ah.6o838a.mfc \ - data/tidigits/man.ah.75913a.mfc \ - data/tidigits/man.ah.844o1a.mfc \ - data/tidigits/man.ah.8b.mfc \ - data/tidigits/man.ah.9b.mfc \ - data/tidigits/man.ah.o789a.mfc \ - data/tidigits/man.ah.z4548a.mfc \ - data/tidigits/man.ah.zb.mfc \ - data/tidigits/test-tidigits-fsg.match \ - data/tidigits/test-tidigits-simple.match \ - data/tidigits/tidigits.ctl \ - data/tidigits/tidigits.lsn \ - data/tidigits/woman.ak.1b.mfc \ - data/tidigits/woman.ak.276317oa.mfc \ - data/tidigits/woman.ak.334a.mfc \ - data/tidigits/woman.ak.3z3z9a.mfc \ - data/tidigits/woman.ak.48z66zza.mfc \ - data/tidigits/woman.ak.532a.mfc \ - data/tidigits/woman.ak.5z874a.mfc \ - data/tidigits/woman.ak.6728za.mfc \ - data/tidigits/woman.ak.75a.mfc \ - data/tidigits/woman.ak.84983a.mfc \ - data/tidigits/woman.ak.8a.mfc \ - data/tidigits/woman.ak.99731a.mfc \ - data/tidigits/woman.ak.o69a.mfc \ - data/tidigits/woman.ak.ooa.mfc \ - data/tidigits/woman.ak.za.mfc \ - data/tidigits/hmm/feat.params \ - data/tidigits/hmm/variances \ - data/tidigits/hmm/transition_matrices \ - data/tidigits/hmm/sendump \ - data/tidigits/hmm/mdef \ - data/tidigits/hmm/means \ - data/tidigits/lm/tidigits.dic \ - data/tidigits/lm/tidigits.lm.bin \ - data/tidigits/lm/tidigits.fsg \ - data/turtle.dic \ - data/turtle.lm.bin \ - data/unreachable.lat \ - data/librivox/fileids \ - data/librivox/sense_and_sensibility_01_austen_64kb-0880.wav \ - data/librivox/sense_and_sensibility_01_austen_64kb-0890.wav \ - data/librivox/sense_and_sensibility_01_austen_64kb-0930.wav \ - data/librivox/sense_and_sensibility_01_austen_64kb-0870.wav \ - data/librivox/sense_and_sensibility_01_austen_64kb-0920.wav \ - data/librivox/transcription \ - data/librivox/test-lm.match - -all: all-recursive - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign test/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): -testfuncs.sh: $(top_builddir)/config.status $(srcdir)/testfuncs.sh.in - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -# This directory's subdirectories are mostly independent; you can cd -# into them and run 'make' without going through this Makefile. -# To change the values of 'make' variables: instead of editing Makefiles, -# (1) if the variable is set in 'config.status', edit 'config.status' -# (which will cause the Makefiles to be regenerated when you run 'make'); -# (2) otherwise, pass the desired values on the 'make' command line. -$(am__recursive_targets): - @fail=; \ - if $(am__make_keepgoing); then \ - failcom='fail=yes'; \ - else \ - failcom='exit 1'; \ - fi; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-recursive -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-recursive - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-recursive - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - $(am__make_dryrun) \ - || test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ - $(am__relativize); \ - new_distdir=$$reldir; \ - dir1=$$subdir; dir2="$(top_distdir)"; \ - $(am__relativize); \ - new_top_distdir=$$reldir; \ - echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ - echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ - ($(am__cd) $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$new_top_distdir" \ - distdir="$$new_distdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - am__skip_mode_fix=: \ - distdir) \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-recursive -all-am: Makefile -installdirs: installdirs-recursive -installdirs-am: -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-recursive - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -html-am: - -info: info-recursive - -info-am: - -install-data-am: - -install-dvi: install-dvi-recursive - -install-dvi-am: - -install-exec-am: - -install-html: install-html-recursive - -install-html-am: - -install-info: install-info-recursive - -install-info-am: - -install-man: - -install-pdf: install-pdf-recursive - -install-pdf-am: - -install-ps: install-ps-recursive - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: - -.MAKE: $(am__recursive_targets) install-am install-strip - -.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ - check-am clean clean-generic clean-libtool cscopelist-am ctags \ - ctags-am distclean distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - installdirs-am maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ - ps ps-am tags tags-am uninstall uninstall-am - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/test/compare_table.pl b/test/compare_table.pl index f19cc17..75a1fc3 100755 --- a/test/compare_table.pl +++ b/test/compare_table.pl @@ -49,8 +49,8 @@ chomp($line1); chomp($line2); next if ($line1 eq $line2); - my @field1 = split /[,\s]+/, $line1; - my @field2 = split /[,\s]+/, $line2; + my @field1 = split /[,:\s]+/, $line1; + my @field2 = split /[,:\s]+/, $line2; # If the number of tokens in each line is different, the lines, # and therefore the files, don't match. if ($#field1 != $#field2) { @@ -66,11 +66,14 @@ $comparison = 0; last; } - } elsif (abs($field1[$i] - $field2[$i]) > $tolerance) { - # If the tokens are both numbers, check if they match within - # a tolerance - $comparison = 0; - last; + } else { + my $diff = abs($field1[$i] - $field2[$i]); + if ($diff > $tolerance) { + # If the tokens are both numbers, check if they match within + # a tolerance + $comparison = 0; + last; + } } } # If there was a mismatch, we can skip to the end of the loop diff --git a/test/data/forever/input_2_16k.wav b/test/data/forever/input_2_16k.wav new file mode 100644 index 0000000..fb6645c Binary files /dev/null and b/test/data/forever/input_2_16k.wav differ diff --git a/test/data/forever/input_4_16k.wav b/test/data/forever/input_4_16k.wav new file mode 100644 index 0000000..3b47864 Binary files /dev/null and b/test/data/forever/input_4_16k.wav differ diff --git a/test/data/goforward.kws b/test/data/goforward.kws index 45a67d4..49864ed 100644 --- a/test/data/goforward.kws +++ b/test/data/goforward.kws @@ -3,6 +3,7 @@ something bad line / here just bad line / forward +meters non_existign_word diff --git a/test/data/librivox/make_single_track.py b/test/data/librivox/make_single_track.py new file mode 100644 index 0000000..8d19c8d --- /dev/null +++ b/test/data/librivox/make_single_track.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 + +import wave +import subprocess +from contextlib import closing + + +def get_wavfile_length(path): + with closing(wave.open(path)) as reader: + nfr = reader.getnframes() + frate = reader.getframerate() + return nfr / frate + + +def get_labels(path, pos): + with open(path, "rt") as infh: + labels = [(pos, "silence")] + for spam in infh: + # The labels are a bit odd + start, _, label = spam.strip().split() + labels.append((pos + float(start), label)) + return labels + + +def make_single_track(): + labels = [] + soxcmd = ["sox"] + with open("fileids", "rt") as infh: + pos = 0.0 + for spam in infh: + fileid = spam.strip() + path = fileid + ".wav" + soxcmd.append(path) + nsec = get_wavfile_length(path) + path = fileid + ".lab" + labels.extend(get_labels(path, pos)) + pos += nsec + with open("single_track.lab", "wt") as outfh: + start_time, label = labels[0] + for end_time, next_label in labels[1:]: + if next_label != label: + outfh.write("%.3f\t%.3f\t%s\n" % (start_time, end_time, label)) + start_time = end_time + label = next_label + outfh.write("%.3f\t%.3f\t%s\n" % (start_time, pos, label)) + soxcmd.extend(["-r", "16000", "single_track.raw"]) + subprocess.run(soxcmd) + + +if __name__ == "__main__": + make_single_track() diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0870.json b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0870.json new file mode 100644 index 0000000..52c1de4 --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0870.json @@ -0,0 +1 @@ +{"b":0.000,"d":7.100,"p":1.000,"t":"and mister john dashwood had then leisure to consider how much there might be prudently in his power to do for them","w":[{"b":0.000,"d":0.200,"p":0.945,"t":""},{"b":0.200,"d":0.170,"p":0.952,"t":"and(2)"},{"b":0.370,"d":0.260,"p":0.969,"t":"mister"},{"b":0.630,"d":0.350,"p":0.978,"t":"john"},{"b":0.980,"d":0.600,"p":0.958,"t":"dashwood"},{"b":1.580,"d":0.260,"p":0.977,"t":"had"},{"b":1.840,"d":0.370,"p":0.966,"t":"then"},{"b":2.210,"d":0.040,"p":0.947,"t":""},{"b":2.250,"d":0.460,"p":0.969,"t":"leisure(2)"},{"b":2.710,"d":0.180,"p":0.972,"t":"to(3)"},{"b":2.890,"d":0.550,"p":0.964,"t":"consider"},{"b":3.440,"d":0.510,"p":0.968,"t":"how"},{"b":3.950,"d":0.050,"p":0.954,"t":""},{"b":4.000,"d":0.330,"p":0.972,"t":"much"},{"b":4.330,"d":0.190,"p":0.979,"t":"there"},{"b":4.520,"d":0.270,"p":0.971,"t":"might"},{"b":4.790,"d":0.150,"p":0.987,"t":"be"},{"b":4.940,"d":0.520,"p":0.902,"t":"prudently"},{"b":5.460,"d":0.100,"p":0.991,"t":"in"},{"b":5.560,"d":0.190,"p":0.975,"t":"his"},{"b":5.750,"d":0.290,"p":0.976,"t":"power"},{"b":6.040,"d":0.100,"p":0.982,"t":"to(2)"},{"b":6.140,"d":0.210,"p":0.968,"t":"do"},{"b":6.350,"d":0.260,"p":0.970,"t":"for"},{"b":6.610,"d":0.180,"p":0.956,"t":"them(2)"},{"b":6.790,"d":0.300,"p":0.953,"t":""}]} diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0870.lab b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0870.lab new file mode 100644 index 0000000..e8cbe9a --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0870.lab @@ -0,0 +1,2 @@ +0.235689 0.235689 speech +6.761690 6.761690 silence diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0870.phone.json b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0870.phone.json new file mode 100644 index 0000000..63c7b97 --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0870.phone.json @@ -0,0 +1 @@ +{"b":0.000,"d":7.100,"p":1.000,"t":"and mister john dashwood had then leisure to consider how much there might be prudently in his power to do for them","w":[{"b":0.000,"d":0.200,"p":0.995,"t":"","w":[{"b":0.000,"d":0.200,"p":0.995,"t":"SIL"}]},{"b":0.200,"d":0.170,"p":0.975,"t":"and(2)","w":[{"b":0.200,"d":0.110,"p":0.994,"t":"AE"},{"b":0.310,"d":0.030,"p":0.992,"t":"N"},{"b":0.340,"d":0.030,"p":0.989,"t":"D"}]},{"b":0.370,"d":0.260,"p":0.974,"t":"mister","w":[{"b":0.370,"d":0.040,"p":0.991,"t":"M"},{"b":0.410,"d":0.030,"p":0.998,"t":"IH"},{"b":0.440,"d":0.070,"p":0.994,"t":"S"},{"b":0.510,"d":0.070,"p":0.996,"t":"T"},{"b":0.580,"d":0.050,"p":0.994,"t":"ER"}]},{"b":0.630,"d":0.350,"p":0.982,"t":"john","w":[{"b":0.630,"d":0.140,"p":0.993,"t":"JH"},{"b":0.770,"d":0.140,"p":0.994,"t":"AA"},{"b":0.910,"d":0.070,"p":0.995,"t":"N"}]},{"b":0.980,"d":0.600,"p":0.943,"t":"dashwood","w":[{"b":0.980,"d":0.090,"p":0.994,"t":"D"},{"b":1.070,"d":0.150,"p":0.986,"t":"AE"},{"b":1.220,"d":0.110,"p":0.989,"t":"SH"},{"b":1.330,"d":0.130,"p":0.994,"t":"W"},{"b":1.460,"d":0.060,"p":0.996,"t":"UH"},{"b":1.520,"d":0.060,"p":0.982,"t":"D"}]},{"b":1.580,"d":0.260,"p":0.971,"t":"had","w":[{"b":1.580,"d":0.100,"p":0.989,"t":"HH"},{"b":1.680,"d":0.080,"p":0.992,"t":"AE"},{"b":1.760,"d":0.080,"p":0.990,"t":"D"}]},{"b":1.840,"d":0.370,"p":0.942,"t":"then","w":[{"b":1.840,"d":0.060,"p":0.986,"t":"DH"},{"b":1.900,"d":0.110,"p":0.989,"t":"EH"},{"b":2.010,"d":0.200,"p":0.967,"t":"N"}]},{"b":2.210,"d":0.040,"p":0.983,"t":"","w":[{"b":2.210,"d":0.040,"p":0.983,"t":"SIL"}]},{"b":2.250,"d":0.460,"p":0.974,"t":"leisure(2)","w":[{"b":2.250,"d":0.130,"p":0.993,"t":"L"},{"b":2.380,"d":0.090,"p":0.995,"t":"IY"},{"b":2.470,"d":0.130,"p":0.993,"t":"ZH"},{"b":2.600,"d":0.110,"p":0.993,"t":"ER"}]},{"b":2.710,"d":0.180,"p":0.977,"t":"to(3)","w":[{"b":2.710,"d":0.120,"p":0.981,"t":"T"},{"b":2.830,"d":0.060,"p":0.996,"t":"AH"}]},{"b":2.890,"d":0.550,"p":0.938,"t":"consider","w":[{"b":2.890,"d":0.090,"p":0.989,"t":"K"},{"b":2.980,"d":0.040,"p":0.995,"t":"AH"},{"b":3.020,"d":0.050,"p":0.987,"t":"N"},{"b":3.070,"d":0.140,"p":0.990,"t":"S"},{"b":3.210,"d":0.060,"p":0.995,"t":"IH"},{"b":3.270,"d":0.040,"p":0.995,"t":"D"},{"b":3.310,"d":0.130,"p":0.985,"t":"ER"}]},{"b":3.440,"d":0.510,"p":0.960,"t":"how","w":[{"b":3.440,"d":0.120,"p":0.984,"t":"HH"},{"b":3.560,"d":0.390,"p":0.975,"t":"AW"}]},{"b":3.950,"d":0.050,"p":0.988,"t":"","w":[{"b":3.950,"d":0.050,"p":0.988,"t":"SIL"}]},{"b":4.000,"d":0.330,"p":0.965,"t":"much","w":[{"b":4.000,"d":0.100,"p":0.984,"t":"M"},{"b":4.100,"d":0.060,"p":0.995,"t":"AH"},{"b":4.160,"d":0.170,"p":0.987,"t":"CH"}]},{"b":4.330,"d":0.190,"p":0.970,"t":"there","w":[{"b":4.330,"d":0.100,"p":0.979,"t":"DH"},{"b":4.430,"d":0.040,"p":0.994,"t":"EH"},{"b":4.470,"d":0.050,"p":0.997,"t":"R"}]},{"b":4.520,"d":0.270,"p":0.968,"t":"might","w":[{"b":4.520,"d":0.100,"p":0.992,"t":"M"},{"b":4.620,"d":0.090,"p":0.982,"t":"AY"},{"b":4.710,"d":0.080,"p":0.994,"t":"T"}]},{"b":4.790,"d":0.150,"p":0.982,"t":"be","w":[{"b":4.790,"d":0.050,"p":0.995,"t":"B"},{"b":4.840,"d":0.100,"p":0.987,"t":"IY"}]},{"b":4.940,"d":0.520,"p":0.869,"t":"prudently","w":[{"b":4.940,"d":0.110,"p":0.986,"t":"P"},{"b":5.050,"d":0.070,"p":0.993,"t":"R"},{"b":5.120,"d":0.050,"p":0.990,"t":"UW"},{"b":5.170,"d":0.030,"p":0.985,"t":"D"},{"b":5.200,"d":0.030,"p":0.974,"t":"AH"},{"b":5.230,"d":0.030,"p":0.971,"t":"N"},{"b":5.260,"d":0.030,"p":0.982,"t":"T"},{"b":5.290,"d":0.080,"p":0.987,"t":"L"},{"b":5.370,"d":0.090,"p":0.992,"t":"IY"}]},{"b":5.460,"d":0.100,"p":0.986,"t":"in","w":[{"b":5.460,"d":0.060,"p":0.997,"t":"IH"},{"b":5.520,"d":0.040,"p":0.989,"t":"N"}]},{"b":5.560,"d":0.190,"p":0.962,"t":"his","w":[{"b":5.560,"d":0.030,"p":0.980,"t":"HH"},{"b":5.590,"d":0.060,"p":0.987,"t":"IH"},{"b":5.650,"d":0.100,"p":0.994,"t":"Z"}]},{"b":5.750,"d":0.290,"p":0.975,"t":"power","w":[{"b":5.750,"d":0.050,"p":0.994,"t":"P"},{"b":5.800,"d":0.130,"p":0.988,"t":"AW"},{"b":5.930,"d":0.110,"p":0.993,"t":"ER"}]},{"b":6.040,"d":0.100,"p":0.971,"t":"to(2)","w":[{"b":6.040,"d":0.040,"p":0.978,"t":"T"},{"b":6.080,"d":0.060,"p":0.993,"t":"IH"}]},{"b":6.140,"d":0.210,"p":0.972,"t":"do","w":[{"b":6.140,"d":0.080,"p":0.989,"t":"D"},{"b":6.220,"d":0.130,"p":0.983,"t":"UW"}]},{"b":6.350,"d":0.260,"p":0.957,"t":"for","w":[{"b":6.350,"d":0.140,"p":0.994,"t":"F"},{"b":6.490,"d":0.080,"p":0.986,"t":"AO"},{"b":6.570,"d":0.040,"p":0.976,"t":"R"}]},{"b":6.610,"d":0.180,"p":0.930,"t":"them(2)","w":[{"b":6.610,"d":0.050,"p":0.977,"t":"DH"},{"b":6.660,"d":0.080,"p":0.965,"t":"AH"},{"b":6.740,"d":0.050,"p":0.987,"t":"M"}]},{"b":6.790,"d":0.300,"p":0.986,"t":"","w":[{"b":6.790,"d":0.300,"p":0.986,"t":"SIL"}]}]} diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0870.state.json b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0870.state.json new file mode 100644 index 0000000..faa5b57 --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0870.state.json @@ -0,0 +1 @@ +{"b":0.000,"d":7.100,"p":1.000,"t":"and mister john dashwood had then leisure to consider how much there might be prudently in his power to do for them","w":[{"b":0.000,"d":0.200,"p":0.995,"t":"","w":[{"b":0.000,"d":0.200,"p":0.995,"t":"SIL","w":[{"b":0.000,"d":0.010,"p":1.000,"t":"96"},{"b":0.010,"d":0.140,"p":0.997,"t":"97"},{"b":0.150,"d":0.050,"p":0.998,"t":"98"}]}]},{"b":0.200,"d":0.170,"p":0.975,"t":"and(2)","w":[{"b":0.200,"d":0.110,"p":0.994,"t":"AE","w":[{"b":0.200,"d":0.060,"p":0.997,"t":"268"},{"b":0.260,"d":0.020,"p":0.998,"t":"312"},{"b":0.280,"d":0.030,"p":0.998,"t":"327"}]},{"b":0.310,"d":0.030,"p":0.992,"t":"N","w":[{"b":0.310,"d":0.010,"p":0.999,"t":"3324"},{"b":0.320,"d":0.010,"p":0.999,"t":"3373"},{"b":0.330,"d":0.010,"p":0.994,"t":"3446"}]},{"b":0.340,"d":0.030,"p":0.989,"t":"D","w":[{"b":0.340,"d":0.010,"p":0.994,"t":"1229"},{"b":0.350,"d":0.010,"p":0.998,"t":"1267"},{"b":0.360,"d":0.010,"p":0.997,"t":"1382"}]}]},{"b":0.370,"d":0.260,"p":0.974,"t":"mister","w":[{"b":0.370,"d":0.040,"p":0.991,"t":"M","w":[{"b":0.370,"d":0.010,"p":0.994,"t":"3176"},{"b":0.380,"d":0.010,"p":0.998,"t":"3213"},{"b":0.390,"d":0.020,"p":0.999,"t":"3264"}]},{"b":0.410,"d":0.030,"p":0.998,"t":"IH","w":[{"b":0.410,"d":0.010,"p":1.000,"t":"2298"},{"b":0.420,"d":0.010,"p":0.999,"t":"2385"},{"b":0.430,"d":0.010,"p":1.000,"t":"2503"}]},{"b":0.440,"d":0.070,"p":0.994,"t":"S","w":[{"b":0.440,"d":0.030,"p":0.998,"t":"4053"},{"b":0.470,"d":0.010,"p":0.998,"t":"4110"},{"b":0.480,"d":0.030,"p":0.998,"t":"4159"}]},{"b":0.510,"d":0.070,"p":0.996,"t":"T","w":[{"b":0.510,"d":0.030,"p":0.998,"t":"4334"},{"b":0.540,"d":0.020,"p":0.999,"t":"4432"},{"b":0.560,"d":0.020,"p":0.999,"t":"4477"}]},{"b":0.580,"d":0.050,"p":0.994,"t":"ER","w":[{"b":0.580,"d":0.030,"p":0.998,"t":"1654"},{"b":0.610,"d":0.010,"p":0.997,"t":"1725"},{"b":0.620,"d":0.010,"p":0.999,"t":"1797"}]}]},{"b":0.630,"d":0.350,"p":0.982,"t":"john","w":[{"b":0.630,"d":0.140,"p":0.993,"t":"JH","w":[{"b":0.630,"d":0.050,"p":0.998,"t":"2732"},{"b":0.680,"d":0.050,"p":0.998,"t":"2736"},{"b":0.730,"d":0.040,"p":0.998,"t":"2743"}]},{"b":0.770,"d":0.140,"p":0.994,"t":"AA","w":[{"b":0.770,"d":0.050,"p":0.998,"t":"131"},{"b":0.820,"d":0.040,"p":0.998,"t":"189"},{"b":0.860,"d":0.050,"p":0.998,"t":"214"}]},{"b":0.910,"d":0.070,"p":0.995,"t":"N","w":[{"b":0.910,"d":0.040,"p":0.997,"t":"3312"},{"b":0.950,"d":0.020,"p":0.999,"t":"3371"},{"b":0.970,"d":0.010,"p":0.999,"t":"3450"}]}]},{"b":0.980,"d":0.600,"p":0.943,"t":"dashwood","w":[{"b":0.980,"d":0.090,"p":0.994,"t":"D","w":[{"b":0.980,"d":0.030,"p":0.997,"t":"1223"},{"b":1.010,"d":0.020,"p":0.999,"t":"1302"},{"b":1.030,"d":0.040,"p":0.998,"t":"1318"}]},{"b":1.070,"d":0.150,"p":0.986,"t":"AE","w":[{"b":1.070,"d":0.060,"p":0.997,"t":"226"},{"b":1.130,"d":0.050,"p":0.992,"t":"288"},{"b":1.180,"d":0.040,"p":0.998,"t":"334"}]},{"b":1.220,"d":0.110,"p":0.989,"t":"SH","w":[{"b":1.220,"d":0.040,"p":0.998,"t":"4198"},{"b":1.260,"d":0.040,"p":0.993,"t":"4208"},{"b":1.300,"d":0.030,"p":0.998,"t":"4233"}]},{"b":1.330,"d":0.130,"p":0.994,"t":"W","w":[{"b":1.330,"d":0.070,"p":0.997,"t":"4831"},{"b":1.400,"d":0.030,"p":0.998,"t":"4863"},{"b":1.430,"d":0.030,"p":0.998,"t":"4929"}]},{"b":1.460,"d":0.060,"p":0.996,"t":"UH","w":[{"b":1.460,"d":0.030,"p":0.998,"t":"4597"},{"b":1.490,"d":0.020,"p":0.999,"t":"4605"},{"b":1.510,"d":0.010,"p":0.999,"t":"4613"}]},{"b":1.520,"d":0.060,"p":0.982,"t":"D","w":[{"b":1.520,"d":0.020,"p":0.999,"t":"1202"},{"b":1.540,"d":0.010,"p":1.000,"t":"1247"},{"b":1.550,"d":0.030,"p":0.984,"t":"1353"}]}]},{"b":1.580,"d":0.260,"p":0.971,"t":"had","w":[{"b":1.580,"d":0.100,"p":0.989,"t":"HH","w":[{"b":1.580,"d":0.030,"p":0.993,"t":"2098"},{"b":1.610,"d":0.040,"p":0.998,"t":"2165"},{"b":1.650,"d":0.030,"p":0.998,"t":"2210"}]},{"b":1.680,"d":0.080,"p":0.992,"t":"AE","w":[{"b":1.680,"d":0.020,"p":0.999,"t":"243"},{"b":1.700,"d":0.020,"p":0.998,"t":"296"},{"b":1.720,"d":0.040,"p":0.995,"t":"342"}]},{"b":1.760,"d":0.080,"p":0.990,"t":"D","w":[{"b":1.760,"d":0.030,"p":0.998,"t":"1188"},{"b":1.790,"d":0.020,"p":0.999,"t":"1258"},{"b":1.810,"d":0.030,"p":0.993,"t":"1369"}]}]},{"b":1.840,"d":0.370,"p":0.942,"t":"then","w":[{"b":1.840,"d":0.060,"p":0.986,"t":"DH","w":[{"b":1.840,"d":0.010,"p":0.995,"t":"1399"},{"b":1.850,"d":0.030,"p":0.997,"t":"1436"},{"b":1.880,"d":0.020,"p":0.994,"t":"1481"}]},{"b":1.900,"d":0.110,"p":0.989,"t":"EH","w":[{"b":1.900,"d":0.030,"p":0.998,"t":"1496"},{"b":1.930,"d":0.030,"p":0.998,"t":"1575"},{"b":1.960,"d":0.050,"p":0.992,"t":"1610"}]},{"b":2.010,"d":0.200,"p":0.967,"t":"N","w":[{"b":2.010,"d":0.030,"p":0.994,"t":"3327"},{"b":2.040,"d":0.040,"p":0.989,"t":"3396"},{"b":2.080,"d":0.130,"p":0.984,"t":"3469"}]}]},{"b":2.210,"d":0.040,"p":0.983,"t":"","w":[{"b":2.210,"d":0.040,"p":0.983,"t":"SIL","w":[{"b":2.210,"d":0.010,"p":0.991,"t":"96"},{"b":2.220,"d":0.010,"p":0.996,"t":"97"},{"b":2.230,"d":0.020,"p":0.995,"t":"98"}]}]},{"b":2.250,"d":0.460,"p":0.974,"t":"leisure(2)","w":[{"b":2.250,"d":0.130,"p":0.993,"t":"L","w":[{"b":2.250,"d":0.040,"p":0.998,"t":"2991"},{"b":2.290,"d":0.050,"p":0.997,"t":"2995"},{"b":2.340,"d":0.040,"p":0.998,"t":"3075"}]},{"b":2.380,"d":0.090,"p":0.995,"t":"IY","w":[{"b":2.380,"d":0.020,"p":0.999,"t":"2561"},{"b":2.400,"d":0.050,"p":0.998,"t":"2618"},{"b":2.450,"d":0.020,"p":0.999,"t":"2696"}]},{"b":2.470,"d":0.130,"p":0.993,"t":"ZH","w":[{"b":2.470,"d":0.030,"p":0.998,"t":"5120"},{"b":2.500,"d":0.080,"p":0.996,"t":"5121"},{"b":2.580,"d":0.020,"p":0.999,"t":"5125"}]},{"b":2.600,"d":0.110,"p":0.993,"t":"ER","w":[{"b":2.600,"d":0.020,"p":0.997,"t":"1656"},{"b":2.620,"d":0.050,"p":0.998,"t":"1720"},{"b":2.670,"d":0.040,"p":0.998,"t":"1799"}]}]},{"b":2.710,"d":0.180,"p":0.977,"t":"to(3)","w":[{"b":2.710,"d":0.120,"p":0.981,"t":"T","w":[{"b":2.710,"d":0.050,"p":0.990,"t":"4281"},{"b":2.760,"d":0.030,"p":0.994,"t":"4400"},{"b":2.790,"d":0.040,"p":0.998,"t":"4443"}]},{"b":2.830,"d":0.060,"p":0.996,"t":"AH","w":[{"b":2.830,"d":0.020,"p":0.999,"t":"393"},{"b":2.850,"d":0.020,"p":0.999,"t":"563"},{"b":2.870,"d":0.020,"p":0.999,"t":"765"}]}]},{"b":2.890,"d":0.550,"p":0.938,"t":"consider","w":[{"b":2.890,"d":0.090,"p":0.989,"t":"K","w":[{"b":2.890,"d":0.040,"p":0.998,"t":"2790"},{"b":2.930,"d":0.030,"p":0.992,"t":"2826"},{"b":2.960,"d":0.020,"p":0.999,"t":"2893"}]},{"b":2.980,"d":0.040,"p":0.995,"t":"AH","w":[{"b":2.980,"d":0.020,"p":0.999,"t":"408"},{"b":3.000,"d":0.010,"p":0.997,"t":"594"},{"b":3.010,"d":0.010,"p":1.000,"t":"718"}]},{"b":3.020,"d":0.050,"p":0.987,"t":"N","w":[{"b":3.020,"d":0.010,"p":0.999,"t":"3294"},{"b":3.030,"d":0.020,"p":0.991,"t":"3356"},{"b":3.050,"d":0.020,"p":0.997,"t":"3465"}]},{"b":3.070,"d":0.140,"p":0.990,"t":"S","w":[{"b":3.070,"d":0.040,"p":0.995,"t":"4035"},{"b":3.110,"d":0.070,"p":0.997,"t":"4073"},{"b":3.180,"d":0.030,"p":0.998,"t":"4164"}]},{"b":3.210,"d":0.060,"p":0.995,"t":"IH","w":[{"b":3.210,"d":0.030,"p":0.998,"t":"2239"},{"b":3.240,"d":0.020,"p":0.998,"t":"2395"},{"b":3.260,"d":0.010,"p":0.999,"t":"2479"}]},{"b":3.270,"d":0.040,"p":0.995,"t":"D","w":[{"b":3.270,"d":0.010,"p":0.999,"t":"1203"},{"b":3.280,"d":0.010,"p":0.999,"t":"1278"},{"b":3.290,"d":0.020,"p":0.996,"t":"1315"}]},{"b":3.310,"d":0.130,"p":0.985,"t":"ER","w":[{"b":3.310,"d":0.030,"p":0.989,"t":"1656"},{"b":3.340,"d":0.080,"p":0.997,"t":"1726"},{"b":3.420,"d":0.020,"p":0.999,"t":"1823"}]}]},{"b":3.440,"d":0.510,"p":0.960,"t":"how","w":[{"b":3.440,"d":0.120,"p":0.984,"t":"HH","w":[{"b":3.440,"d":0.050,"p":0.997,"t":"2129"},{"b":3.490,"d":0.060,"p":0.990,"t":"2173"},{"b":3.550,"d":0.010,"p":0.996,"t":"2216"}]},{"b":3.560,"d":0.390,"p":0.975,"t":"AW","w":[{"b":3.560,"d":0.060,"p":0.991,"t":"903"},{"b":3.620,"d":0.090,"p":0.996,"t":"924"},{"b":3.710,"d":0.240,"p":0.988,"t":"938"}]}]},{"b":3.950,"d":0.050,"p":0.988,"t":"","w":[{"b":3.950,"d":0.050,"p":0.988,"t":"SIL","w":[{"b":3.950,"d":0.010,"p":0.998,"t":"96"},{"b":3.960,"d":0.010,"p":0.996,"t":"97"},{"b":3.970,"d":0.030,"p":0.994,"t":"98"}]}]},{"b":4.000,"d":0.330,"p":0.965,"t":"much","w":[{"b":4.000,"d":0.100,"p":0.984,"t":"M","w":[{"b":4.000,"d":0.030,"p":0.990,"t":"3170"},{"b":4.030,"d":0.020,"p":0.999,"t":"3199"},{"b":4.050,"d":0.050,"p":0.995,"t":"3242"}]},{"b":4.100,"d":0.060,"p":0.995,"t":"AH","w":[{"b":4.100,"d":0.020,"p":0.999,"t":"434"},{"b":4.120,"d":0.020,"p":0.999,"t":"541"},{"b":4.140,"d":0.020,"p":0.997,"t":"751"}]},{"b":4.160,"d":0.170,"p":0.987,"t":"CH","w":[{"b":4.160,"d":0.050,"p":0.993,"t":"1145"},{"b":4.210,"d":0.070,"p":0.996,"t":"1165"},{"b":4.280,"d":0.050,"p":0.997,"t":"1173"}]}]},{"b":4.330,"d":0.190,"p":0.970,"t":"there","w":[{"b":4.330,"d":0.100,"p":0.979,"t":"DH","w":[{"b":4.330,"d":0.040,"p":0.992,"t":"1400"},{"b":4.370,"d":0.040,"p":0.994,"t":"1438"},{"b":4.410,"d":0.020,"p":0.992,"t":"1477"}]},{"b":4.430,"d":0.040,"p":0.994,"t":"EH","w":[{"b":4.430,"d":0.010,"p":0.997,"t":"1500"},{"b":4.440,"d":0.020,"p":0.998,"t":"1597"},{"b":4.460,"d":0.010,"p":0.999,"t":"1638"}]},{"b":4.470,"d":0.050,"p":0.997,"t":"R","w":[{"b":4.470,"d":0.030,"p":0.998,"t":"3806"},{"b":4.500,"d":0.010,"p":0.999,"t":"3877"},{"b":4.510,"d":0.010,"p":0.999,"t":"4020"}]}]},{"b":4.520,"d":0.270,"p":0.968,"t":"might","w":[{"b":4.520,"d":0.100,"p":0.992,"t":"M","w":[{"b":4.520,"d":0.030,"p":0.998,"t":"3153"},{"b":4.550,"d":0.030,"p":0.996,"t":"3192"},{"b":4.580,"d":0.040,"p":0.998,"t":"3243"}]},{"b":4.620,"d":0.090,"p":0.982,"t":"AY","w":[{"b":4.620,"d":0.030,"p":0.996,"t":"952"},{"b":4.650,"d":0.040,"p":0.990,"t":"1016"},{"b":4.690,"d":0.020,"p":0.996,"t":"1050"}]},{"b":4.710,"d":0.080,"p":0.994,"t":"T","w":[{"b":4.710,"d":0.030,"p":0.998,"t":"4296"},{"b":4.740,"d":0.040,"p":0.996,"t":"4345"},{"b":4.780,"d":0.010,"p":0.999,"t":"4507"}]}]},{"b":4.790,"d":0.150,"p":0.982,"t":"be","w":[{"b":4.790,"d":0.050,"p":0.995,"t":"B","w":[{"b":4.790,"d":0.010,"p":0.997,"t":"1081"},{"b":4.800,"d":0.010,"p":1.000,"t":"1115"},{"b":4.810,"d":0.030,"p":0.998,"t":"1143"}]},{"b":4.840,"d":0.100,"p":0.987,"t":"IY","w":[{"b":4.840,"d":0.020,"p":0.998,"t":"2547"},{"b":4.860,"d":0.050,"p":0.996,"t":"2583"},{"b":4.910,"d":0.030,"p":0.993,"t":"2705"}]}]},{"b":4.940,"d":0.520,"p":0.869,"t":"prudently","w":[{"b":4.940,"d":0.110,"p":0.986,"t":"P","w":[{"b":4.940,"d":0.020,"p":0.993,"t":"3695"},{"b":4.960,"d":0.040,"p":0.998,"t":"3732"},{"b":5.000,"d":0.050,"p":0.995,"t":"3765"}]},{"b":5.050,"d":0.070,"p":0.993,"t":"R","w":[{"b":5.050,"d":0.040,"p":0.997,"t":"3825"},{"b":5.090,"d":0.020,"p":0.999,"t":"3945"},{"b":5.110,"d":0.010,"p":0.998,"t":"3960"}]},{"b":5.120,"d":0.050,"p":0.990,"t":"UW","w":[{"b":5.120,"d":0.010,"p":0.997,"t":"4621"},{"b":5.130,"d":0.010,"p":0.999,"t":"4662"},{"b":5.140,"d":0.030,"p":0.995,"t":"4695"}]},{"b":5.170,"d":0.030,"p":0.985,"t":"D","w":[{"b":5.170,"d":0.010,"p":0.999,"t":"1202"},{"b":5.180,"d":0.010,"p":0.995,"t":"1276"},{"b":5.190,"d":0.010,"p":0.990,"t":"1313"}]},{"b":5.200,"d":0.030,"p":0.974,"t":"AH","w":[{"b":5.200,"d":0.010,"p":0.993,"t":"490"},{"b":5.210,"d":0.010,"p":0.991,"t":"589"},{"b":5.220,"d":0.010,"p":0.990,"t":"721"}]},{"b":5.230,"d":0.030,"p":0.971,"t":"N","w":[{"b":5.230,"d":0.010,"p":0.990,"t":"3345"},{"b":5.240,"d":0.010,"p":0.989,"t":"3359"},{"b":5.250,"d":0.010,"p":0.991,"t":"3459"}]},{"b":5.260,"d":0.030,"p":0.982,"t":"T","w":[{"b":5.260,"d":0.010,"p":0.997,"t":"4304"},{"b":5.270,"d":0.010,"p":0.993,"t":"4426"},{"b":5.280,"d":0.010,"p":0.992,"t":"4494"}]},{"b":5.290,"d":0.080,"p":0.987,"t":"L","w":[{"b":5.290,"d":0.040,"p":0.990,"t":"2990"},{"b":5.330,"d":0.020,"p":0.999,"t":"2997"},{"b":5.350,"d":0.020,"p":0.999,"t":"3078"}]},{"b":5.370,"d":0.090,"p":0.992,"t":"IY","w":[{"b":5.370,"d":0.030,"p":0.998,"t":"2562"},{"b":5.400,"d":0.040,"p":0.997,"t":"2647"},{"b":5.440,"d":0.020,"p":0.998,"t":"2656"}]}]},{"b":5.460,"d":0.100,"p":0.986,"t":"in","w":[{"b":5.460,"d":0.060,"p":0.997,"t":"IH","w":[{"b":5.460,"d":0.030,"p":0.998,"t":"2288"},{"b":5.490,"d":0.020,"p":0.999,"t":"2338"},{"b":5.510,"d":0.010,"p":1.000,"t":"2451"}]},{"b":5.520,"d":0.040,"p":0.989,"t":"N","w":[{"b":5.520,"d":0.020,"p":0.996,"t":"3333"},{"b":5.540,"d":0.010,"p":0.995,"t":"3366"},{"b":5.550,"d":0.010,"p":0.998,"t":"3442"}]}]},{"b":5.560,"d":0.190,"p":0.962,"t":"his","w":[{"b":5.560,"d":0.030,"p":0.980,"t":"HH","w":[{"b":5.560,"d":0.010,"p":0.992,"t":"2125"},{"b":5.570,"d":0.010,"p":0.996,"t":"2189"},{"b":5.580,"d":0.010,"p":0.993,"t":"2197"}]},{"b":5.590,"d":0.060,"p":0.987,"t":"IH","w":[{"b":5.590,"d":0.010,"p":0.997,"t":"2252"},{"b":5.600,"d":0.040,"p":0.991,"t":"2389"},{"b":5.640,"d":0.010,"p":0.999,"t":"2514"}]},{"b":5.650,"d":0.100,"p":0.994,"t":"Z","w":[{"b":5.650,"d":0.020,"p":0.999,"t":"4992"},{"b":5.670,"d":0.050,"p":0.997,"t":"5038"},{"b":5.720,"d":0.030,"p":0.998,"t":"5099"}]}]},{"b":5.750,"d":0.290,"p":0.975,"t":"power","w":[{"b":5.750,"d":0.050,"p":0.994,"t":"P","w":[{"b":5.750,"d":0.010,"p":0.999,"t":"3705"},{"b":5.760,"d":0.030,"p":0.997,"t":"3734"},{"b":5.790,"d":0.010,"p":0.997,"t":"3774"}]},{"b":5.800,"d":0.130,"p":0.988,"t":"AW","w":[{"b":5.800,"d":0.040,"p":0.997,"t":"902"},{"b":5.840,"d":0.030,"p":0.998,"t":"926"},{"b":5.870,"d":0.060,"p":0.993,"t":"942"}]},{"b":5.930,"d":0.110,"p":0.993,"t":"ER","w":[{"b":5.930,"d":0.060,"p":0.997,"t":"1683"},{"b":5.990,"d":0.030,"p":0.998,"t":"1722"},{"b":6.020,"d":0.020,"p":0.998,"t":"1799"}]}]},{"b":6.040,"d":0.100,"p":0.971,"t":"to(2)","w":[{"b":6.040,"d":0.040,"p":0.978,"t":"T","w":[{"b":6.040,"d":0.020,"p":0.994,"t":"4281"},{"b":6.060,"d":0.010,"p":0.992,"t":"4400"},{"b":6.070,"d":0.010,"p":0.992,"t":"4447"}]},{"b":6.080,"d":0.060,"p":0.993,"t":"IH","w":[{"b":6.080,"d":0.020,"p":0.996,"t":"2232"},{"b":6.100,"d":0.020,"p":0.999,"t":"2401"},{"b":6.120,"d":0.020,"p":0.999,"t":"2481"}]}]},{"b":6.140,"d":0.210,"p":0.972,"t":"do","w":[{"b":6.140,"d":0.080,"p":0.989,"t":"D","w":[{"b":6.140,"d":0.040,"p":0.995,"t":"1217"},{"b":6.180,"d":0.010,"p":1.000,"t":"1292"},{"b":6.190,"d":0.030,"p":0.995,"t":"1331"}]},{"b":6.220,"d":0.130,"p":0.983,"t":"UW","w":[{"b":6.220,"d":0.040,"p":0.994,"t":"4650"},{"b":6.260,"d":0.040,"p":0.991,"t":"4674"},{"b":6.300,"d":0.050,"p":0.998,"t":"4722"}]}]},{"b":6.350,"d":0.260,"p":0.957,"t":"for","w":[{"b":6.350,"d":0.140,"p":0.994,"t":"F","w":[{"b":6.350,"d":0.020,"p":0.999,"t":"1976"},{"b":6.370,"d":0.080,"p":0.997,"t":"1993"},{"b":6.450,"d":0.040,"p":0.998,"t":"2010"}]},{"b":6.490,"d":0.080,"p":0.986,"t":"AO","w":[{"b":6.490,"d":0.020,"p":0.999,"t":"844"},{"b":6.510,"d":0.030,"p":0.997,"t":"875"},{"b":6.540,"d":0.030,"p":0.990,"t":"899"}]},{"b":6.570,"d":0.040,"p":0.976,"t":"R","w":[{"b":6.570,"d":0.010,"p":0.992,"t":"3791"},{"b":6.580,"d":0.020,"p":0.991,"t":"3862"},{"b":6.600,"d":0.010,"p":0.994,"t":"4006"}]}]},{"b":6.610,"d":0.180,"p":0.930,"t":"them(2)","w":[{"b":6.610,"d":0.050,"p":0.977,"t":"DH","w":[{"b":6.610,"d":0.020,"p":0.991,"t":"1418"},{"b":6.630,"d":0.020,"p":0.991,"t":"1447"},{"b":6.650,"d":0.010,"p":0.994,"t":"1467"}]},{"b":6.660,"d":0.080,"p":0.965,"t":"AH","w":[{"b":6.660,"d":0.030,"p":0.992,"t":"417"},{"b":6.690,"d":0.020,"p":0.985,"t":"616"},{"b":6.710,"d":0.030,"p":0.988,"t":"685"}]},{"b":6.740,"d":0.050,"p":0.987,"t":"M","w":[{"b":6.740,"d":0.030,"p":0.996,"t":"3143"},{"b":6.770,"d":0.010,"p":0.995,"t":"3236"},{"b":6.780,"d":0.010,"p":0.996,"t":"3270"}]}]},{"b":6.790,"d":0.300,"p":0.986,"t":"","w":[{"b":6.790,"d":0.300,"p":0.986,"t":"SIL","w":[{"b":6.790,"d":0.280,"p":0.994,"t":"96"},{"b":7.070,"d":0.010,"p":0.995,"t":"97"},{"b":7.080,"d":0.010,"p":0.997,"t":"98"}]}]}]} diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0870.txt b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0870.txt new file mode 100644 index 0000000..fbac43e --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0870.txt @@ -0,0 +1 @@ +and mister john dashwood had then leisure to consider how much there might be prudently in his power to do for them diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0880.json b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0880.json new file mode 100644 index 0000000..dab1b80 --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0880.json @@ -0,0 +1 @@ +{"b":0.000,"d":2.990,"p":1.000,"t":"he was not an ill disposed young man","w":[{"b":0.000,"d":0.210,"p":0.939,"t":""},{"b":0.210,"d":0.120,"p":0.987,"t":"he"},{"b":0.330,"d":0.230,"p":0.981,"t":"was(2)"},{"b":0.560,"d":0.500,"p":0.954,"t":"not"},{"b":1.060,"d":0.070,"p":0.946,"t":""},{"b":1.130,"d":0.170,"p":0.971,"t":"an(2)"},{"b":1.300,"d":0.180,"p":0.985,"t":"ill"},{"b":1.480,"d":0.630,"p":0.938,"t":"disposed"},{"b":2.110,"d":0.220,"p":0.978,"t":"young"},{"b":2.330,"d":0.410,"p":0.975,"t":"man"},{"b":2.740,"d":0.240,"p":0.948,"t":""}]} diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0880.lab b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0880.lab new file mode 100644 index 0000000..b051ec4 --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0880.lab @@ -0,0 +1,2 @@ +0.250750 0.250750 speech +2.773918 2.773918 silence diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0880.phone.json b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0880.phone.json new file mode 100644 index 0000000..545859f --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0880.phone.json @@ -0,0 +1 @@ +{"b":0.000,"d":2.990,"p":1.000,"t":"he was not an ill disposed young man","w":[{"b":0.000,"d":0.210,"p":0.982,"t":"","w":[{"b":0.000,"d":0.210,"p":0.982,"t":"SIL"}]},{"b":0.210,"d":0.120,"p":0.991,"t":"he","w":[{"b":0.210,"d":0.060,"p":0.995,"t":"HH"},{"b":0.270,"d":0.060,"p":0.996,"t":"IY"}]},{"b":0.330,"d":0.230,"p":0.986,"t":"was(2)","w":[{"b":0.330,"d":0.080,"p":0.995,"t":"W"},{"b":0.410,"d":0.040,"p":0.998,"t":"AH"},{"b":0.450,"d":0.110,"p":0.993,"t":"Z"}]},{"b":0.560,"d":0.500,"p":0.963,"t":"not","w":[{"b":0.560,"d":0.050,"p":0.997,"t":"N"},{"b":0.610,"d":0.250,"p":0.985,"t":"AA"},{"b":0.860,"d":0.200,"p":0.980,"t":"T"}]},{"b":1.060,"d":0.070,"p":0.979,"t":"","w":[{"b":1.060,"d":0.070,"p":0.979,"t":"SIL"}]},{"b":1.130,"d":0.170,"p":0.981,"t":"an(2)","w":[{"b":1.130,"d":0.100,"p":0.990,"t":"AH"},{"b":1.230,"d":0.070,"p":0.991,"t":"N"}]},{"b":1.300,"d":0.180,"p":0.986,"t":"ill","w":[{"b":1.300,"d":0.050,"p":0.997,"t":"IH"},{"b":1.350,"d":0.130,"p":0.989,"t":"L"}]},{"b":1.480,"d":0.630,"p":0.938,"t":"disposed","w":[{"b":1.480,"d":0.030,"p":0.997,"t":"D"},{"b":1.510,"d":0.030,"p":0.986,"t":"IH"},{"b":1.540,"d":0.130,"p":0.991,"t":"S"},{"b":1.670,"d":0.080,"p":0.994,"t":"P"},{"b":1.750,"d":0.220,"p":0.989,"t":"OW"},{"b":1.970,"d":0.080,"p":0.990,"t":"Z"},{"b":2.050,"d":0.060,"p":0.990,"t":"D"}]},{"b":2.110,"d":0.220,"p":0.970,"t":"young","w":[{"b":2.110,"d":0.070,"p":0.985,"t":"Y"},{"b":2.180,"d":0.060,"p":0.997,"t":"AH"},{"b":2.240,"d":0.090,"p":0.988,"t":"NG"}]},{"b":2.330,"d":0.410,"p":0.971,"t":"man","w":[{"b":2.330,"d":0.100,"p":0.994,"t":"M"},{"b":2.430,"d":0.200,"p":0.983,"t":"AE"},{"b":2.630,"d":0.110,"p":0.993,"t":"N"}]},{"b":2.740,"d":0.240,"p":0.978,"t":"","w":[{"b":2.740,"d":0.240,"p":0.978,"t":"SIL"}]}]} diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0880.state.json b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0880.state.json new file mode 100644 index 0000000..6f05c44 --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0880.state.json @@ -0,0 +1 @@ +{"b":0.000,"d":2.990,"p":1.000,"t":"he was not an ill disposed young man","w":[{"b":0.000,"d":0.210,"p":0.982,"t":"","w":[{"b":0.000,"d":0.210,"p":0.982,"t":"SIL","w":[{"b":0.000,"d":0.010,"p":1.000,"t":"96"},{"b":0.010,"d":0.060,"p":0.998,"t":"97"},{"b":0.070,"d":0.140,"p":0.984,"t":"98"}]}]},{"b":0.210,"d":0.120,"p":0.991,"t":"he","w":[{"b":0.210,"d":0.060,"p":0.995,"t":"HH","w":[{"b":0.210,"d":0.030,"p":0.998,"t":"2110"},{"b":0.240,"d":0.020,"p":0.999,"t":"2182"},{"b":0.260,"d":0.010,"p":0.998,"t":"2204"}]},{"b":0.270,"d":0.060,"p":0.996,"t":"IY","w":[{"b":0.270,"d":0.020,"p":0.999,"t":"2538"},{"b":0.290,"d":0.020,"p":0.998,"t":"2653"},{"b":0.310,"d":0.020,"p":0.999,"t":"2680"}]}]},{"b":0.330,"d":0.230,"p":0.986,"t":"was(2)","w":[{"b":0.330,"d":0.080,"p":0.995,"t":"W","w":[{"b":0.330,"d":0.040,"p":0.997,"t":"4857"},{"b":0.370,"d":0.020,"p":0.999,"t":"4883"},{"b":0.390,"d":0.020,"p":0.999,"t":"4904"}]},{"b":0.410,"d":0.040,"p":0.998,"t":"AH","w":[{"b":0.410,"d":0.010,"p":1.000,"t":"441"},{"b":0.420,"d":0.020,"p":0.999,"t":"529"},{"b":0.440,"d":0.010,"p":1.000,"t":"811"}]},{"b":0.450,"d":0.110,"p":0.993,"t":"Z","w":[{"b":0.450,"d":0.040,"p":0.997,"t":"4988"},{"b":0.490,"d":0.040,"p":0.998,"t":"5043"},{"b":0.530,"d":0.030,"p":0.998,"t":"5088"}]}]},{"b":0.560,"d":0.500,"p":0.963,"t":"not","w":[{"b":0.560,"d":0.050,"p":0.997,"t":"N","w":[{"b":0.560,"d":0.020,"p":0.999,"t":"3287"},{"b":0.580,"d":0.010,"p":0.999,"t":"3430"},{"b":0.590,"d":0.020,"p":0.999,"t":"3494"}]},{"b":0.610,"d":0.250,"p":0.985,"t":"AA","w":[{"b":0.610,"d":0.030,"p":0.998,"t":"126"},{"b":0.640,"d":0.180,"p":0.989,"t":"192"},{"b":0.820,"d":0.040,"p":0.998,"t":"211"}]},{"b":0.860,"d":0.200,"p":0.980,"t":"T","w":[{"b":0.860,"d":0.030,"p":0.996,"t":"4265"},{"b":0.890,"d":0.040,"p":0.998,"t":"4425"},{"b":0.930,"d":0.130,"p":0.986,"t":"4518"}]}]},{"b":1.060,"d":0.070,"p":0.979,"t":"","w":[{"b":1.060,"d":0.070,"p":0.979,"t":"SIL","w":[{"b":1.060,"d":0.050,"p":0.990,"t":"96"},{"b":1.110,"d":0.010,"p":0.994,"t":"97"},{"b":1.120,"d":0.010,"p":0.995,"t":"98"}]}]},{"b":1.130,"d":0.170,"p":0.981,"t":"an(2)","w":[{"b":1.130,"d":0.100,"p":0.990,"t":"AH","w":[{"b":1.130,"d":0.030,"p":0.998,"t":"506"},{"b":1.160,"d":0.060,"p":0.992,"t":"573"},{"b":1.220,"d":0.010,"p":1.000,"t":"708"}]},{"b":1.230,"d":0.070,"p":0.991,"t":"N","w":[{"b":1.230,"d":0.030,"p":0.996,"t":"3303"},{"b":1.260,"d":0.020,"p":0.999,"t":"3407"},{"b":1.280,"d":0.020,"p":0.997,"t":"3480"}]}]},{"b":1.300,"d":0.180,"p":0.986,"t":"ill","w":[{"b":1.300,"d":0.050,"p":0.997,"t":"IH","w":[{"b":1.300,"d":0.010,"p":0.999,"t":"2301"},{"b":1.310,"d":0.030,"p":0.998,"t":"2355"},{"b":1.340,"d":0.010,"p":1.000,"t":"2472"}]},{"b":1.350,"d":0.130,"p":0.989,"t":"L","w":[{"b":1.350,"d":0.040,"p":0.998,"t":"2957"},{"b":1.390,"d":0.050,"p":0.997,"t":"3067"},{"b":1.440,"d":0.040,"p":0.995,"t":"3124"}]}]},{"b":1.480,"d":0.630,"p":0.938,"t":"disposed","w":[{"b":1.480,"d":0.030,"p":0.997,"t":"D","w":[{"b":1.480,"d":0.010,"p":0.999,"t":"1245"},{"b":1.490,"d":0.010,"p":1.000,"t":"1306"},{"b":1.500,"d":0.010,"p":0.998,"t":"1327"}]},{"b":1.510,"d":0.030,"p":0.986,"t":"IH","w":[{"b":1.510,"d":0.010,"p":0.998,"t":"2260"},{"b":1.520,"d":0.010,"p":0.998,"t":"2390"},{"b":1.530,"d":0.010,"p":0.990,"t":"2502"}]},{"b":1.540,"d":0.130,"p":0.991,"t":"S","w":[{"b":1.540,"d":0.020,"p":0.996,"t":"4050"},{"b":1.560,"d":0.070,"p":0.997,"t":"4129"},{"b":1.630,"d":0.040,"p":0.998,"t":"4152"}]},{"b":1.670,"d":0.080,"p":0.994,"t":"P","w":[{"b":1.670,"d":0.030,"p":0.998,"t":"3706"},{"b":1.700,"d":0.020,"p":0.998,"t":"3715"},{"b":1.720,"d":0.030,"p":0.998,"t":"3751"}]},{"b":1.750,"d":0.220,"p":0.989,"t":"OW","w":[{"b":1.750,"d":0.030,"p":0.998,"t":"3548"},{"b":1.780,"d":0.140,"p":0.994,"t":"3598"},{"b":1.920,"d":0.050,"p":0.997,"t":"3642"}]},{"b":1.970,"d":0.080,"p":0.990,"t":"Z","w":[{"b":1.970,"d":0.050,"p":0.993,"t":"4996"},{"b":2.020,"d":0.020,"p":0.998,"t":"5050"},{"b":2.040,"d":0.010,"p":0.998,"t":"5090"}]},{"b":2.050,"d":0.060,"p":0.990,"t":"D","w":[{"b":2.050,"d":0.010,"p":0.998,"t":"1236"},{"b":2.060,"d":0.040,"p":0.993,"t":"1309"},{"b":2.100,"d":0.010,"p":0.998,"t":"1380"}]}]},{"b":2.110,"d":0.220,"p":0.970,"t":"young","w":[{"b":2.110,"d":0.070,"p":0.985,"t":"Y","w":[{"b":2.110,"d":0.030,"p":0.993,"t":"4941"},{"b":2.140,"d":0.010,"p":0.994,"t":"4956"},{"b":2.150,"d":0.030,"p":0.998,"t":"4975"}]},{"b":2.180,"d":0.060,"p":0.997,"t":"AH","w":[{"b":2.180,"d":0.020,"p":0.999,"t":"505"},{"b":2.200,"d":0.030,"p":0.998,"t":"580"},{"b":2.230,"d":0.010,"p":1.000,"t":"689"}]},{"b":2.240,"d":0.090,"p":0.988,"t":"NG","w":[{"b":2.240,"d":0.030,"p":0.993,"t":"3506"},{"b":2.270,"d":0.010,"p":0.998,"t":"3508"},{"b":2.280,"d":0.050,"p":0.997,"t":"3524"}]}]},{"b":2.330,"d":0.410,"p":0.971,"t":"man","w":[{"b":2.330,"d":0.100,"p":0.994,"t":"M","w":[{"b":2.330,"d":0.030,"p":0.998,"t":"3180"},{"b":2.360,"d":0.040,"p":0.998,"t":"3212"},{"b":2.400,"d":0.030,"p":0.998,"t":"3259"}]},{"b":2.430,"d":0.200,"p":0.983,"t":"AE","w":[{"b":2.430,"d":0.020,"p":0.999,"t":"237"},{"b":2.450,"d":0.100,"p":0.996,"t":"308"},{"b":2.550,"d":0.080,"p":0.989,"t":"321"}]},{"b":2.630,"d":0.110,"p":0.993,"t":"N","w":[{"b":2.630,"d":0.030,"p":0.998,"t":"3327"},{"b":2.660,"d":0.070,"p":0.996,"t":"3398"},{"b":2.730,"d":0.010,"p":0.999,"t":"3469"}]}]},{"b":2.740,"d":0.240,"p":0.978,"t":"","w":[{"b":2.740,"d":0.240,"p":0.978,"t":"SIL","w":[{"b":2.740,"d":0.180,"p":0.987,"t":"96"},{"b":2.920,"d":0.050,"p":0.995,"t":"97"},{"b":2.970,"d":0.010,"p":0.996,"t":"98"}]}]}]} diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0880.txt b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0880.txt new file mode 100644 index 0000000..0c9df0b --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0880.txt @@ -0,0 +1 @@ + he was not an ill disposed young man diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0890.json b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0890.json new file mode 100644 index 0000000..bc5b53a --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0890.json @@ -0,0 +1 @@ +{"b":0.000,"d":5.300,"p":1.000,"t":"unless to be rather cold hearted and rather selfish is to be ill disposed","w":[{"b":0.000,"d":0.270,"p":0.944,"t":""},{"b":0.270,"d":0.320,"p":0.961,"t":"unless"},{"b":0.590,"d":0.110,"p":0.989,"t":"to(3)"},{"b":0.700,"d":0.160,"p":0.988,"t":"be"},{"b":0.860,"d":0.360,"p":0.959,"t":"rather(2)"},{"b":1.220,"d":0.520,"p":0.936,"t":"cold"},{"b":1.740,"d":0.480,"p":0.924,"t":"hearted(2)"},{"b":2.220,"d":0.170,"p":0.970,"t":"and"},{"b":2.390,"d":0.390,"p":0.964,"t":"rather"},{"b":2.780,"d":0.810,"p":0.925,"t":"selfish"},{"b":3.590,"d":0.040,"p":0.954,"t":""},{"b":3.630,"d":0.250,"p":0.966,"t":"is"},{"b":3.880,"d":0.100,"p":0.991,"t":"to(3)"},{"b":3.980,"d":0.180,"p":0.983,"t":"be"},{"b":4.160,"d":0.210,"p":0.986,"t":"ill"},{"b":4.370,"d":0.720,"p":0.929,"t":"disposed"},{"b":5.090,"d":0.200,"p":0.954,"t":""}]} diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0890.lab b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0890.lab new file mode 100644 index 0000000..94768f0 --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0890.lab @@ -0,0 +1,2 @@ +0.260118 0.260118 speech +5.056508 5.056508 silence diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0890.phone.json b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0890.phone.json new file mode 100644 index 0000000..fae05ea --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0890.phone.json @@ -0,0 +1 @@ +{"b":0.000,"d":5.300,"p":1.000,"t":"unless to be rather cold hearted and rather selfish is to be ill disposed","w":[{"b":0.000,"d":0.270,"p":0.987,"t":"","w":[{"b":0.000,"d":0.270,"p":0.987,"t":"SIL"}]},{"b":0.270,"d":0.320,"p":0.955,"t":"unless","w":[{"b":0.270,"d":0.060,"p":0.986,"t":"AH"},{"b":0.330,"d":0.030,"p":0.993,"t":"N"},{"b":0.360,"d":0.080,"p":0.995,"t":"L"},{"b":0.440,"d":0.060,"p":0.993,"t":"EH"},{"b":0.500,"d":0.090,"p":0.987,"t":"S"}]},{"b":0.590,"d":0.110,"p":0.994,"t":"to(3)","w":[{"b":0.590,"d":0.070,"p":0.996,"t":"T"},{"b":0.660,"d":0.040,"p":0.998,"t":"AH"}]},{"b":0.700,"d":0.160,"p":0.990,"t":"be","w":[{"b":0.700,"d":0.060,"p":0.996,"t":"B"},{"b":0.760,"d":0.100,"p":0.995,"t":"IY"}]},{"b":0.860,"d":0.360,"p":0.980,"t":"rather(2)","w":[{"b":0.860,"d":0.120,"p":0.993,"t":"R"},{"b":0.980,"d":0.060,"p":0.997,"t":"AH"},{"b":1.040,"d":0.070,"p":0.996,"t":"DH"},{"b":1.110,"d":0.110,"p":0.994,"t":"ER"}]},{"b":1.220,"d":0.520,"p":0.935,"t":"cold","w":[{"b":1.220,"d":0.240,"p":0.960,"t":"K"},{"b":1.460,"d":0.190,"p":0.987,"t":"OW"},{"b":1.650,"d":0.060,"p":0.995,"t":"L"},{"b":1.710,"d":0.030,"p":0.991,"t":"D"}]},{"b":1.740,"d":0.480,"p":0.936,"t":"hearted(2)","w":[{"b":1.740,"d":0.080,"p":0.984,"t":"HH"},{"b":1.820,"d":0.100,"p":0.992,"t":"AA"},{"b":1.920,"d":0.060,"p":0.996,"t":"R"},{"b":1.980,"d":0.050,"p":0.997,"t":"T"},{"b":2.030,"d":0.080,"p":0.990,"t":"IH"},{"b":2.110,"d":0.110,"p":0.976,"t":"D"}]},{"b":2.220,"d":0.170,"p":0.969,"t":"and","w":[{"b":2.220,"d":0.080,"p":0.988,"t":"AH"},{"b":2.300,"d":0.040,"p":0.992,"t":"N"},{"b":2.340,"d":0.050,"p":0.988,"t":"D"}]},{"b":2.390,"d":0.390,"p":0.969,"t":"rather","w":[{"b":2.390,"d":0.100,"p":0.993,"t":"R"},{"b":2.490,"d":0.090,"p":0.987,"t":"AE"},{"b":2.580,"d":0.070,"p":0.996,"t":"DH"},{"b":2.650,"d":0.130,"p":0.992,"t":"ER"}]},{"b":2.780,"d":0.810,"p":0.918,"t":"selfish","w":[{"b":2.780,"d":0.190,"p":0.985,"t":"S"},{"b":2.970,"d":0.060,"p":0.996,"t":"EH"},{"b":3.030,"d":0.090,"p":0.995,"t":"L"},{"b":3.120,"d":0.090,"p":0.992,"t":"F"},{"b":3.210,"d":0.140,"p":0.954,"t":"IH"},{"b":3.350,"d":0.240,"p":0.994,"t":"SH"}]},{"b":3.590,"d":0.040,"p":0.988,"t":"","w":[{"b":3.590,"d":0.040,"p":0.988,"t":"SIL"}]},{"b":3.630,"d":0.250,"p":0.972,"t":"is","w":[{"b":3.630,"d":0.160,"p":0.983,"t":"IH"},{"b":3.790,"d":0.090,"p":0.989,"t":"Z"}]},{"b":3.880,"d":0.100,"p":0.992,"t":"to(3)","w":[{"b":3.880,"d":0.070,"p":0.993,"t":"T"},{"b":3.950,"d":0.030,"p":0.999,"t":"AH"}]},{"b":3.980,"d":0.180,"p":0.990,"t":"be","w":[{"b":3.980,"d":0.060,"p":0.996,"t":"B"},{"b":4.040,"d":0.120,"p":0.994,"t":"IY"}]},{"b":4.160,"d":0.210,"p":0.969,"t":"ill","w":[{"b":4.160,"d":0.060,"p":0.995,"t":"IH"},{"b":4.220,"d":0.150,"p":0.974,"t":"L"}]},{"b":4.370,"d":0.720,"p":0.874,"t":"disposed","w":[{"b":4.370,"d":0.030,"p":0.987,"t":"D"},{"b":4.400,"d":0.030,"p":0.985,"t":"IH"},{"b":4.430,"d":0.130,"p":0.976,"t":"S"},{"b":4.560,"d":0.070,"p":0.986,"t":"P"},{"b":4.630,"d":0.230,"p":0.971,"t":"OW"},{"b":4.860,"d":0.140,"p":0.981,"t":"Z"},{"b":5.000,"d":0.090,"p":0.980,"t":"D"}]},{"b":5.090,"d":0.200,"p":0.986,"t":"","w":[{"b":5.090,"d":0.200,"p":0.986,"t":"SIL"}]}]} diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0890.state.json b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0890.state.json new file mode 100644 index 0000000..c3fc17a --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0890.state.json @@ -0,0 +1 @@ +{"b":0.000,"d":5.300,"p":1.000,"t":"unless to be rather cold hearted and rather selfish is to be ill disposed","w":[{"b":0.000,"d":0.270,"p":0.987,"t":"","w":[{"b":0.000,"d":0.270,"p":0.987,"t":"SIL","w":[{"b":0.000,"d":0.150,"p":1.000,"t":"96"},{"b":0.150,"d":0.010,"p":0.995,"t":"97"},{"b":0.160,"d":0.110,"p":0.992,"t":"98"}]}]},{"b":0.270,"d":0.320,"p":0.955,"t":"unless","w":[{"b":0.270,"d":0.060,"p":0.986,"t":"AH","w":[{"b":0.270,"d":0.020,"p":0.998,"t":"506"},{"b":0.290,"d":0.030,"p":0.988,"t":"573"},{"b":0.320,"d":0.010,"p":1.000,"t":"708"}]},{"b":0.330,"d":0.030,"p":0.993,"t":"N","w":[{"b":0.330,"d":0.010,"p":0.999,"t":"3299"},{"b":0.340,"d":0.010,"p":0.999,"t":"3385"},{"b":0.350,"d":0.010,"p":0.994,"t":"3439"}]},{"b":0.360,"d":0.080,"p":0.995,"t":"L","w":[{"b":0.360,"d":0.020,"p":0.999,"t":"2992"},{"b":0.380,"d":0.030,"p":0.998,"t":"3010"},{"b":0.410,"d":0.030,"p":0.998,"t":"3085"}]},{"b":0.440,"d":0.060,"p":0.993,"t":"EH","w":[{"b":0.440,"d":0.020,"p":0.999,"t":"1537"},{"b":0.460,"d":0.010,"p":0.999,"t":"1586"},{"b":0.470,"d":0.030,"p":0.995,"t":"1627"}]},{"b":0.500,"d":0.090,"p":0.987,"t":"S","w":[{"b":0.500,"d":0.030,"p":0.994,"t":"4061"},{"b":0.530,"d":0.020,"p":0.996,"t":"4106"},{"b":0.550,"d":0.040,"p":0.998,"t":"4156"}]}]},{"b":0.590,"d":0.110,"p":0.994,"t":"to(3)","w":[{"b":0.590,"d":0.070,"p":0.996,"t":"T","w":[{"b":0.590,"d":0.030,"p":0.998,"t":"4326"},{"b":0.620,"d":0.020,"p":0.999,"t":"4438"},{"b":0.640,"d":0.020,"p":0.999,"t":"4442"}]},{"b":0.660,"d":0.040,"p":0.998,"t":"AH","w":[{"b":0.660,"d":0.020,"p":0.999,"t":"393"},{"b":0.680,"d":0.010,"p":0.999,"t":"649"},{"b":0.690,"d":0.010,"p":1.000,"t":"774"}]}]},{"b":0.700,"d":0.160,"p":0.990,"t":"be","w":[{"b":0.700,"d":0.060,"p":0.996,"t":"B","w":[{"b":0.700,"d":0.010,"p":0.999,"t":"1072"},{"b":0.710,"d":0.020,"p":0.999,"t":"1113"},{"b":0.730,"d":0.030,"p":0.998,"t":"1141"}]},{"b":0.760,"d":0.100,"p":0.995,"t":"IY","w":[{"b":0.760,"d":0.020,"p":0.999,"t":"2547"},{"b":0.780,"d":0.030,"p":0.998,"t":"2651"},{"b":0.810,"d":0.050,"p":0.998,"t":"2683"}]}]},{"b":0.860,"d":0.360,"p":0.980,"t":"rather(2)","w":[{"b":0.860,"d":0.120,"p":0.993,"t":"R","w":[{"b":0.860,"d":0.050,"p":0.997,"t":"3847"},{"b":0.910,"d":0.030,"p":0.998,"t":"3925"},{"b":0.940,"d":0.040,"p":0.998,"t":"3993"}]},{"b":0.980,"d":0.060,"p":0.997,"t":"AH","w":[{"b":0.980,"d":0.020,"p":0.999,"t":"451"},{"b":1.000,"d":0.030,"p":0.998,"t":"619"},{"b":1.030,"d":0.010,"p":1.000,"t":"778"}]},{"b":1.040,"d":0.070,"p":0.996,"t":"DH","w":[{"b":1.040,"d":0.030,"p":0.998,"t":"1411"},{"b":1.070,"d":0.020,"p":0.999,"t":"1454"},{"b":1.090,"d":0.020,"p":0.999,"t":"1489"}]},{"b":1.110,"d":0.110,"p":0.994,"t":"ER","w":[{"b":1.110,"d":0.030,"p":0.998,"t":"1651"},{"b":1.140,"d":0.050,"p":0.998,"t":"1729"},{"b":1.190,"d":0.030,"p":0.998,"t":"1800"}]}]},{"b":1.220,"d":0.520,"p":0.935,"t":"cold","w":[{"b":1.220,"d":0.240,"p":0.960,"t":"K","w":[{"b":1.220,"d":0.160,"p":0.964,"t":"2765"},{"b":1.380,"d":0.040,"p":0.998,"t":"2854"},{"b":1.420,"d":0.040,"p":0.998,"t":"2881"}]},{"b":1.460,"d":0.190,"p":0.987,"t":"OW","w":[{"b":1.460,"d":0.030,"p":0.998,"t":"3552"},{"b":1.490,"d":0.010,"p":0.999,"t":"3609"},{"b":1.500,"d":0.150,"p":0.990,"t":"3659"}]},{"b":1.650,"d":0.060,"p":0.995,"t":"L","w":[{"b":1.650,"d":0.010,"p":0.999,"t":"2932"},{"b":1.660,"d":0.030,"p":0.997,"t":"3049"},{"b":1.690,"d":0.020,"p":0.999,"t":"3126"}]},{"b":1.710,"d":0.030,"p":0.991,"t":"D","w":[{"b":1.710,"d":0.010,"p":0.999,"t":"1243"},{"b":1.720,"d":0.010,"p":1.000,"t":"1307"},{"b":1.730,"d":0.010,"p":0.993,"t":"1352"}]}]},{"b":1.740,"d":0.480,"p":0.936,"t":"hearted(2)","w":[{"b":1.740,"d":0.080,"p":0.984,"t":"HH","w":[{"b":1.740,"d":0.060,"p":0.987,"t":"2100"},{"b":1.800,"d":0.010,"p":0.997,"t":"2149"},{"b":1.810,"d":0.010,"p":1.000,"t":"2218"}]},{"b":1.820,"d":0.100,"p":0.992,"t":"AA","w":[{"b":1.820,"d":0.030,"p":0.998,"t":"144"},{"b":1.850,"d":0.010,"p":0.999,"t":"200"},{"b":1.860,"d":0.060,"p":0.995,"t":"218"}]},{"b":1.920,"d":0.060,"p":0.996,"t":"R","w":[{"b":1.920,"d":0.020,"p":0.999,"t":"3793"},{"b":1.940,"d":0.030,"p":0.998,"t":"3869"},{"b":1.970,"d":0.010,"p":0.999,"t":"3996"}]},{"b":1.980,"d":0.050,"p":0.997,"t":"T","w":[{"b":1.980,"d":0.020,"p":0.999,"t":"4282"},{"b":2.000,"d":0.010,"p":0.999,"t":"4374"},{"b":2.010,"d":0.020,"p":0.999,"t":"4476"}]},{"b":2.030,"d":0.080,"p":0.990,"t":"IH","w":[{"b":2.030,"d":0.010,"p":0.998,"t":"2230"},{"b":2.040,"d":0.060,"p":0.993,"t":"2403"},{"b":2.100,"d":0.010,"p":1.000,"t":"2480"}]},{"b":2.110,"d":0.110,"p":0.976,"t":"D","w":[{"b":2.110,"d":0.040,"p":0.997,"t":"1203"},{"b":2.150,"d":0.010,"p":0.999,"t":"1277"},{"b":2.160,"d":0.060,"p":0.979,"t":"1340"}]}]},{"b":2.220,"d":0.170,"p":0.969,"t":"and","w":[{"b":2.220,"d":0.080,"p":0.988,"t":"AH","w":[{"b":2.220,"d":0.040,"p":0.991,"t":"489"},{"b":2.260,"d":0.030,"p":0.998,"t":"588"},{"b":2.290,"d":0.010,"p":1.000,"t":"719"}]},{"b":2.300,"d":0.040,"p":0.992,"t":"N","w":[{"b":2.300,"d":0.020,"p":0.999,"t":"3346"},{"b":2.320,"d":0.010,"p":0.996,"t":"3378"},{"b":2.330,"d":0.010,"p":0.997,"t":"3448"}]},{"b":2.340,"d":0.050,"p":0.988,"t":"D","w":[{"b":2.340,"d":0.020,"p":0.993,"t":"1232"},{"b":2.360,"d":0.010,"p":0.999,"t":"1266"},{"b":2.370,"d":0.020,"p":0.996,"t":"1383"}]}]},{"b":2.390,"d":0.390,"p":0.969,"t":"rather","w":[{"b":2.390,"d":0.100,"p":0.993,"t":"R","w":[{"b":2.390,"d":0.040,"p":0.997,"t":"3842"},{"b":2.430,"d":0.030,"p":0.998,"t":"3929"},{"b":2.460,"d":0.030,"p":0.998,"t":"3970"}]},{"b":2.490,"d":0.090,"p":0.987,"t":"AE","w":[{"b":2.490,"d":0.020,"p":0.999,"t":"238"},{"b":2.510,"d":0.040,"p":0.995,"t":"290"},{"b":2.550,"d":0.030,"p":0.994,"t":"336"}]},{"b":2.580,"d":0.070,"p":0.996,"t":"DH","w":[{"b":2.580,"d":0.030,"p":0.998,"t":"1411"},{"b":2.610,"d":0.020,"p":0.999,"t":"1455"},{"b":2.630,"d":0.020,"p":0.999,"t":"1489"}]},{"b":2.650,"d":0.130,"p":0.992,"t":"ER","w":[{"b":2.650,"d":0.030,"p":0.998,"t":"1650"},{"b":2.680,"d":0.060,"p":0.996,"t":"1734"},{"b":2.740,"d":0.040,"p":0.998,"t":"1806"}]}]},{"b":2.780,"d":0.810,"p":0.918,"t":"selfish","w":[{"b":2.780,"d":0.190,"p":0.985,"t":"S","w":[{"b":2.780,"d":0.030,"p":0.998,"t":"4046"},{"b":2.810,"d":0.130,"p":0.988,"t":"4099"},{"b":2.940,"d":0.030,"p":0.998,"t":"4172"}]},{"b":2.970,"d":0.060,"p":0.996,"t":"EH","w":[{"b":2.970,"d":0.020,"p":0.999,"t":"1522"},{"b":2.990,"d":0.010,"p":0.999,"t":"1596"},{"b":3.000,"d":0.030,"p":0.998,"t":"1642"}]},{"b":3.030,"d":0.090,"p":0.995,"t":"L","w":[{"b":3.030,"d":0.050,"p":0.998,"t":"2948"},{"b":3.080,"d":0.020,"p":0.999,"t":"3069"},{"b":3.100,"d":0.020,"p":0.999,"t":"3118"}]},{"b":3.120,"d":0.090,"p":0.992,"t":"F","w":[{"b":3.120,"d":0.020,"p":0.999,"t":"1973"},{"b":3.140,"d":0.040,"p":0.998,"t":"1984"},{"b":3.180,"d":0.030,"p":0.996,"t":"2027"}]},{"b":3.210,"d":0.140,"p":0.954,"t":"IH","w":[{"b":3.210,"d":0.030,"p":0.990,"t":"2227"},{"b":3.240,"d":0.090,"p":0.965,"t":"2405"},{"b":3.330,"d":0.020,"p":0.999,"t":"2508"}]},{"b":3.350,"d":0.240,"p":0.994,"t":"SH","w":[{"b":3.350,"d":0.010,"p":0.999,"t":"4195"},{"b":3.360,"d":0.190,"p":0.997,"t":"4208"},{"b":3.550,"d":0.040,"p":0.998,"t":"4232"}]}]},{"b":3.590,"d":0.040,"p":0.988,"t":"","w":[{"b":3.590,"d":0.040,"p":0.988,"t":"SIL","w":[{"b":3.590,"d":0.010,"p":0.993,"t":"96"},{"b":3.600,"d":0.010,"p":0.997,"t":"97"},{"b":3.610,"d":0.020,"p":0.998,"t":"98"}]}]},{"b":3.630,"d":0.250,"p":0.972,"t":"is","w":[{"b":3.630,"d":0.160,"p":0.983,"t":"IH","w":[{"b":3.630,"d":0.080,"p":0.991,"t":"2282"},{"b":3.710,"d":0.050,"p":0.995,"t":"2377"},{"b":3.760,"d":0.030,"p":0.997,"t":"2512"}]},{"b":3.790,"d":0.090,"p":0.989,"t":"Z","w":[{"b":3.790,"d":0.030,"p":0.998,"t":"4992"},{"b":3.820,"d":0.030,"p":0.996,"t":"5049"},{"b":3.850,"d":0.030,"p":0.995,"t":"5090"}]}]},{"b":3.880,"d":0.100,"p":0.992,"t":"to(3)","w":[{"b":3.880,"d":0.070,"p":0.993,"t":"T","w":[{"b":3.880,"d":0.020,"p":0.999,"t":"4326"},{"b":3.900,"d":0.030,"p":0.995,"t":"4407"},{"b":3.930,"d":0.020,"p":0.999,"t":"4442"}]},{"b":3.950,"d":0.030,"p":0.999,"t":"AH","w":[{"b":3.950,"d":0.010,"p":1.000,"t":"393"},{"b":3.960,"d":0.010,"p":0.999,"t":"649"},{"b":3.970,"d":0.010,"p":1.000,"t":"774"}]}]},{"b":3.980,"d":0.180,"p":0.990,"t":"be","w":[{"b":3.980,"d":0.060,"p":0.996,"t":"B","w":[{"b":3.980,"d":0.020,"p":0.999,"t":"1072"},{"b":4.000,"d":0.020,"p":0.999,"t":"1113"},{"b":4.020,"d":0.020,"p":0.999,"t":"1141"}]},{"b":4.040,"d":0.120,"p":0.994,"t":"IY","w":[{"b":4.040,"d":0.030,"p":0.998,"t":"2547"},{"b":4.070,"d":0.040,"p":0.998,"t":"2598"},{"b":4.110,"d":0.050,"p":0.998,"t":"2657"}]}]},{"b":4.160,"d":0.210,"p":0.969,"t":"ill","w":[{"b":4.160,"d":0.060,"p":0.995,"t":"IH","w":[{"b":4.160,"d":0.030,"p":0.996,"t":"2286"},{"b":4.190,"d":0.020,"p":0.999,"t":"2352"},{"b":4.210,"d":0.010,"p":1.000,"t":"2472"}]},{"b":4.220,"d":0.150,"p":0.974,"t":"L","w":[{"b":4.220,"d":0.040,"p":0.998,"t":"2957"},{"b":4.260,"d":0.090,"p":0.981,"t":"3067"},{"b":4.350,"d":0.020,"p":0.994,"t":"3124"}]}]},{"b":4.370,"d":0.720,"p":0.874,"t":"disposed","w":[{"b":4.370,"d":0.030,"p":0.987,"t":"D","w":[{"b":4.370,"d":0.010,"p":0.997,"t":"1245"},{"b":4.380,"d":0.010,"p":0.996,"t":"1306"},{"b":4.390,"d":0.010,"p":0.994,"t":"1327"}]},{"b":4.400,"d":0.030,"p":0.985,"t":"IH","w":[{"b":4.400,"d":0.010,"p":0.995,"t":"2260"},{"b":4.410,"d":0.010,"p":0.998,"t":"2390"},{"b":4.420,"d":0.010,"p":0.992,"t":"2502"}]},{"b":4.430,"d":0.130,"p":0.976,"t":"S","w":[{"b":4.430,"d":0.030,"p":0.984,"t":"4050"},{"b":4.460,"d":0.060,"p":0.994,"t":"4129"},{"b":4.520,"d":0.040,"p":0.998,"t":"4152"}]},{"b":4.560,"d":0.070,"p":0.986,"t":"P","w":[{"b":4.560,"d":0.020,"p":0.999,"t":"3706"},{"b":4.580,"d":0.030,"p":0.997,"t":"3715"},{"b":4.610,"d":0.020,"p":0.991,"t":"3751"}]},{"b":4.630,"d":0.230,"p":0.971,"t":"OW","w":[{"b":4.630,"d":0.060,"p":0.980,"t":"3548"},{"b":4.690,"d":0.100,"p":0.993,"t":"3598"},{"b":4.790,"d":0.070,"p":0.998,"t":"3642"}]},{"b":4.860,"d":0.140,"p":0.981,"t":"Z","w":[{"b":4.860,"d":0.040,"p":0.998,"t":"4996"},{"b":4.900,"d":0.060,"p":0.990,"t":"5050"},{"b":4.960,"d":0.040,"p":0.994,"t":"5090"}]},{"b":5.000,"d":0.090,"p":0.980,"t":"D","w":[{"b":5.000,"d":0.010,"p":0.998,"t":"1236"},{"b":5.010,"d":0.010,"p":0.996,"t":"1309"},{"b":5.020,"d":0.070,"p":0.986,"t":"1359"}]}]},{"b":5.090,"d":0.200,"p":0.986,"t":"","w":[{"b":5.090,"d":0.200,"p":0.986,"t":"SIL","w":[{"b":5.090,"d":0.100,"p":0.994,"t":"96"},{"b":5.190,"d":0.090,"p":0.997,"t":"97"},{"b":5.280,"d":0.010,"p":0.995,"t":"98"}]}]}]} diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0890.txt b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0890.txt new file mode 100644 index 0000000..f2eaf35 --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0890.txt @@ -0,0 +1 @@ + unless to be rather cold hearted and rather selfish is to be ill disposed diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0920.json b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0920.json new file mode 100644 index 0000000..15a3fa5 --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0920.json @@ -0,0 +1 @@ +{"b":0.000,"d":6.050,"p":1.000,"t":"had he married a more a amiable woman he might have been made still more respectable than he was","w":[{"b":0.000,"d":0.220,"p":0.955,"t":""},{"b":0.220,"d":0.220,"p":0.984,"t":"had"},{"b":0.440,"d":0.100,"p":0.980,"t":"he"},{"b":0.540,"d":0.440,"p":0.963,"t":"married"},{"b":0.980,"d":0.050,"p":0.992,"t":"a"},{"b":1.030,"d":0.380,"p":0.966,"t":"more"},{"b":1.410,"d":0.050,"p":0.989,"t":"a(2)"},{"b":1.460,"d":0.550,"p":0.946,"t":"amiable"},{"b":2.010,"d":0.480,"p":0.940,"t":"woman"},{"b":2.490,"d":0.220,"p":0.984,"t":"he"},{"b":2.710,"d":0.290,"p":0.976,"t":"might"},{"b":3.000,"d":0.190,"p":0.981,"t":"have"},{"b":3.190,"d":0.170,"p":0.962,"t":"been"},{"b":3.360,"d":0.330,"p":0.979,"t":"made"},{"b":3.690,"d":0.380,"p":0.963,"t":"still"},{"b":4.070,"d":0.180,"p":0.983,"t":"more"},{"b":4.250,"d":0.750,"p":0.933,"t":"respectable"},{"b":5.000,"d":0.130,"p":0.974,"t":"than(2)"},{"b":5.130,"d":0.080,"p":0.978,"t":"he"},{"b":5.210,"d":0.620,"p":0.933,"t":"was"},{"b":5.830,"d":0.210,"p":0.951,"t":""}]} diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0920.lab b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0920.lab new file mode 100644 index 0000000..c8aff1b --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0920.lab @@ -0,0 +1,2 @@ +0.245997 0.245997 speech +5.812651 5.812651 silence diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0920.phone.json b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0920.phone.json new file mode 100644 index 0000000..6f1a744 --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0920.phone.json @@ -0,0 +1 @@ +{"b":0.000,"d":6.050,"p":1.000,"t":"had he married a more a amiable woman he might have been made still more respectable than he was","w":[{"b":0.000,"d":0.220,"p":0.994,"t":"","w":[{"b":0.000,"d":0.220,"p":0.994,"t":"SIL"}]},{"b":0.220,"d":0.220,"p":0.987,"t":"had","w":[{"b":0.220,"d":0.110,"p":0.994,"t":"HH"},{"b":0.330,"d":0.080,"p":0.995,"t":"AE"},{"b":0.410,"d":0.030,"p":0.998,"t":"D"}]},{"b":0.440,"d":0.100,"p":0.984,"t":"he","w":[{"b":0.440,"d":0.040,"p":0.990,"t":"HH"},{"b":0.480,"d":0.060,"p":0.994,"t":"IY"}]},{"b":0.540,"d":0.440,"p":0.958,"t":"married","w":[{"b":0.540,"d":0.090,"p":0.995,"t":"M"},{"b":0.630,"d":0.040,"p":0.994,"t":"EH"},{"b":0.670,"d":0.130,"p":0.993,"t":"R"},{"b":0.800,"d":0.120,"p":0.983,"t":"IY"},{"b":0.920,"d":0.060,"p":0.993,"t":"D"}]},{"b":0.980,"d":0.050,"p":0.995,"t":"a","w":[{"b":0.980,"d":0.050,"p":0.995,"t":"AH"}]},{"b":1.030,"d":0.380,"p":0.975,"t":"more","w":[{"b":1.030,"d":0.090,"p":0.995,"t":"M"},{"b":1.120,"d":0.190,"p":0.990,"t":"AO"},{"b":1.310,"d":0.100,"p":0.990,"t":"R"}]},{"b":1.410,"d":0.050,"p":0.981,"t":"a(2)","w":[{"b":1.410,"d":0.050,"p":0.981,"t":"EY"}]},{"b":1.460,"d":0.550,"p":0.943,"t":"amiable","w":[{"b":1.460,"d":0.150,"p":0.978,"t":"EY"},{"b":1.610,"d":0.090,"p":0.988,"t":"M"},{"b":1.700,"d":0.070,"p":0.992,"t":"IY"},{"b":1.770,"d":0.050,"p":0.997,"t":"AH"},{"b":1.820,"d":0.080,"p":0.995,"t":"B"},{"b":1.900,"d":0.040,"p":0.998,"t":"AH"},{"b":1.940,"d":0.070,"p":0.995,"t":"L"}]},{"b":2.010,"d":0.480,"p":0.946,"t":"woman","w":[{"b":2.010,"d":0.150,"p":0.988,"t":"W"},{"b":2.160,"d":0.070,"p":0.992,"t":"UH"},{"b":2.230,"d":0.070,"p":0.991,"t":"M"},{"b":2.300,"d":0.070,"p":0.991,"t":"AH"},{"b":2.370,"d":0.120,"p":0.983,"t":"N"}]},{"b":2.490,"d":0.220,"p":0.975,"t":"he","w":[{"b":2.490,"d":0.130,"p":0.983,"t":"HH"},{"b":2.620,"d":0.090,"p":0.993,"t":"IY"}]},{"b":2.710,"d":0.290,"p":0.959,"t":"might","w":[{"b":2.710,"d":0.110,"p":0.989,"t":"M"},{"b":2.820,"d":0.130,"p":0.981,"t":"AY"},{"b":2.950,"d":0.050,"p":0.988,"t":"T"}]},{"b":3.000,"d":0.190,"p":0.977,"t":"have","w":[{"b":3.000,"d":0.060,"p":0.995,"t":"HH"},{"b":3.060,"d":0.060,"p":0.989,"t":"AE"},{"b":3.120,"d":0.070,"p":0.993,"t":"V"}]},{"b":3.190,"d":0.170,"p":0.958,"t":"been","w":[{"b":3.190,"d":0.060,"p":0.989,"t":"B"},{"b":3.250,"d":0.060,"p":0.987,"t":"IH"},{"b":3.310,"d":0.050,"p":0.981,"t":"N"}]},{"b":3.360,"d":0.330,"p":0.969,"t":"made","w":[{"b":3.360,"d":0.100,"p":0.989,"t":"M"},{"b":3.460,"d":0.160,"p":0.987,"t":"EY"},{"b":3.620,"d":0.070,"p":0.994,"t":"D"}]},{"b":3.690,"d":0.380,"p":0.958,"t":"still","w":[{"b":3.690,"d":0.130,"p":0.993,"t":"S"},{"b":3.820,"d":0.080,"p":0.994,"t":"T"},{"b":3.900,"d":0.050,"p":0.997,"t":"IH"},{"b":3.950,"d":0.120,"p":0.974,"t":"L"}]},{"b":4.070,"d":0.180,"p":0.967,"t":"more","w":[{"b":4.070,"d":0.050,"p":0.981,"t":"M"},{"b":4.120,"d":0.090,"p":0.989,"t":"AO"},{"b":4.210,"d":0.040,"p":0.996,"t":"R"}]},{"b":4.250,"d":0.750,"p":0.913,"t":"respectable","w":[{"b":4.250,"d":0.080,"p":0.992,"t":"R"},{"b":4.330,"d":0.040,"p":0.996,"t":"IH"},{"b":4.370,"d":0.110,"p":0.986,"t":"S"},{"b":4.480,"d":0.080,"p":0.994,"t":"P"},{"b":4.560,"d":0.070,"p":0.993,"t":"EH"},{"b":4.630,"d":0.060,"p":0.981,"t":"K"},{"b":4.690,"d":0.050,"p":0.992,"t":"T"},{"b":4.740,"d":0.040,"p":0.996,"t":"AH"},{"b":4.780,"d":0.060,"p":0.995,"t":"B"},{"b":4.840,"d":0.030,"p":0.994,"t":"AH"},{"b":4.870,"d":0.130,"p":0.990,"t":"L"}]},{"b":5.000,"d":0.130,"p":0.979,"t":"than(2)","w":[{"b":5.000,"d":0.050,"p":0.992,"t":"DH"},{"b":5.050,"d":0.050,"p":0.997,"t":"AH"},{"b":5.100,"d":0.030,"p":0.990,"t":"N"}]},{"b":5.130,"d":0.080,"p":0.967,"t":"he","w":[{"b":5.130,"d":0.030,"p":0.975,"t":"HH"},{"b":5.160,"d":0.050,"p":0.992,"t":"IY"}]},{"b":5.210,"d":0.620,"p":0.913,"t":"was","w":[{"b":5.210,"d":0.100,"p":0.995,"t":"W"},{"b":5.310,"d":0.240,"p":0.954,"t":"AA"},{"b":5.550,"d":0.280,"p":0.962,"t":"Z"}]},{"b":5.830,"d":0.210,"p":0.985,"t":"","w":[{"b":5.830,"d":0.210,"p":0.985,"t":"SIL"}]}]} diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0920.state.json b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0920.state.json new file mode 100644 index 0000000..c8acbe7 --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0920.state.json @@ -0,0 +1 @@ +{"b":0.000,"d":6.050,"p":1.000,"t":"had he married a more a amiable woman he might have been made still more respectable than he was","w":[{"b":0.000,"d":0.220,"p":0.994,"t":"","w":[{"b":0.000,"d":0.220,"p":0.994,"t":"SIL","w":[{"b":0.000,"d":0.190,"p":1.000,"t":"96"},{"b":0.190,"d":0.010,"p":0.996,"t":"97"},{"b":0.200,"d":0.020,"p":0.998,"t":"98"}]}]},{"b":0.220,"d":0.220,"p":0.987,"t":"had","w":[{"b":0.220,"d":0.110,"p":0.994,"t":"HH","w":[{"b":0.220,"d":0.050,"p":0.997,"t":"2113"},{"b":0.270,"d":0.050,"p":0.997,"t":"2170"},{"b":0.320,"d":0.010,"p":1.000,"t":"2209"}]},{"b":0.330,"d":0.080,"p":0.995,"t":"AE","w":[{"b":0.330,"d":0.030,"p":0.998,"t":"243"},{"b":0.360,"d":0.030,"p":0.998,"t":"296"},{"b":0.390,"d":0.020,"p":0.999,"t":"342"}]},{"b":0.410,"d":0.030,"p":0.998,"t":"D","w":[{"b":0.410,"d":0.010,"p":0.999,"t":"1185"},{"b":0.420,"d":0.010,"p":1.000,"t":"1247"},{"b":0.430,"d":0.010,"p":0.999,"t":"1353"}]}]},{"b":0.440,"d":0.100,"p":0.984,"t":"he","w":[{"b":0.440,"d":0.040,"p":0.990,"t":"HH","w":[{"b":0.440,"d":0.020,"p":0.998,"t":"2103"},{"b":0.460,"d":0.010,"p":0.993,"t":"2180"},{"b":0.470,"d":0.010,"p":1.000,"t":"2201"}]},{"b":0.480,"d":0.060,"p":0.994,"t":"IY","w":[{"b":0.480,"d":0.010,"p":0.997,"t":"2536"},{"b":0.490,"d":0.030,"p":0.998,"t":"2606"},{"b":0.520,"d":0.020,"p":0.999,"t":"2673"}]}]},{"b":0.540,"d":0.440,"p":0.958,"t":"married","w":[{"b":0.540,"d":0.090,"p":0.995,"t":"M","w":[{"b":0.540,"d":0.020,"p":0.999,"t":"3158"},{"b":0.560,"d":0.050,"p":0.998,"t":"3209"},{"b":0.610,"d":0.020,"p":0.999,"t":"3257"}]},{"b":0.630,"d":0.040,"p":0.994,"t":"EH","w":[{"b":0.630,"d":0.020,"p":0.999,"t":"1531"},{"b":0.650,"d":0.010,"p":0.995,"t":"1600"},{"b":0.660,"d":0.010,"p":0.999,"t":"1635"}]},{"b":0.670,"d":0.130,"p":0.993,"t":"R","w":[{"b":0.670,"d":0.050,"p":0.997,"t":"3805"},{"b":0.720,"d":0.050,"p":0.997,"t":"3898"},{"b":0.770,"d":0.030,"p":0.998,"t":"3951"}]},{"b":0.800,"d":0.120,"p":0.983,"t":"IY","w":[{"b":0.800,"d":0.050,"p":0.995,"t":"2551"},{"b":0.850,"d":0.040,"p":0.989,"t":"2632"},{"b":0.890,"d":0.030,"p":0.998,"t":"2712"}]},{"b":0.920,"d":0.060,"p":0.993,"t":"D","w":[{"b":0.920,"d":0.020,"p":0.999,"t":"1212"},{"b":0.940,"d":0.020,"p":0.998,"t":"1272"},{"b":0.960,"d":0.020,"p":0.996,"t":"1339"}]}]},{"b":0.980,"d":0.050,"p":0.995,"t":"a","w":[{"b":0.980,"d":0.050,"p":0.995,"t":"AH","w":[{"b":0.980,"d":0.020,"p":0.996,"t":"482"},{"b":1.000,"d":0.020,"p":0.999,"t":"612"},{"b":1.020,"d":0.010,"p":1.000,"t":"682"}]}]},{"b":1.030,"d":0.380,"p":0.975,"t":"more","w":[{"b":1.030,"d":0.090,"p":0.995,"t":"M","w":[{"b":1.030,"d":0.030,"p":0.998,"t":"3145"},{"b":1.060,"d":0.050,"p":0.998,"t":"3190"},{"b":1.110,"d":0.010,"p":0.999,"t":"3253"}]},{"b":1.120,"d":0.190,"p":0.990,"t":"AO","w":[{"b":1.120,"d":0.020,"p":0.999,"t":"838"},{"b":1.140,"d":0.100,"p":0.995,"t":"873"},{"b":1.240,"d":0.070,"p":0.997,"t":"900"}]},{"b":1.310,"d":0.100,"p":0.990,"t":"R","w":[{"b":1.310,"d":0.050,"p":0.997,"t":"3787"},{"b":1.360,"d":0.030,"p":0.998,"t":"3900"},{"b":1.390,"d":0.020,"p":0.994,"t":"3953"}]}]},{"b":1.410,"d":0.050,"p":0.981,"t":"a(2)","w":[{"b":1.410,"d":0.050,"p":0.981,"t":"EY","w":[{"b":1.410,"d":0.020,"p":0.997,"t":"1883"},{"b":1.430,"d":0.010,"p":0.991,"t":"1911"},{"b":1.440,"d":0.020,"p":0.993,"t":"1939"}]}]},{"b":1.460,"d":0.550,"p":0.943,"t":"amiable","w":[{"b":1.460,"d":0.150,"p":0.978,"t":"EY","w":[{"b":1.460,"d":0.100,"p":0.981,"t":"1865"},{"b":1.560,"d":0.030,"p":0.998,"t":"1916"},{"b":1.590,"d":0.020,"p":0.999,"t":"1947"}]},{"b":1.610,"d":0.090,"p":0.988,"t":"M","w":[{"b":1.610,"d":0.030,"p":0.996,"t":"3156"},{"b":1.640,"d":0.030,"p":0.994,"t":"3210"},{"b":1.670,"d":0.030,"p":0.998,"t":"3255"}]},{"b":1.700,"d":0.070,"p":0.992,"t":"IY","w":[{"b":1.700,"d":0.020,"p":0.998,"t":"2555"},{"b":1.720,"d":0.020,"p":0.995,"t":"2612"},{"b":1.740,"d":0.030,"p":0.998,"t":"2666"}]},{"b":1.770,"d":0.050,"p":0.997,"t":"AH","w":[{"b":1.770,"d":0.020,"p":0.999,"t":"500"},{"b":1.790,"d":0.020,"p":0.999,"t":"602"},{"b":1.810,"d":0.010,"p":1.000,"t":"767"}]},{"b":1.820,"d":0.080,"p":0.995,"t":"B","w":[{"b":1.820,"d":0.040,"p":0.997,"t":"1061"},{"b":1.860,"d":0.020,"p":0.999,"t":"1098"},{"b":1.880,"d":0.020,"p":0.999,"t":"1120"}]},{"b":1.900,"d":0.040,"p":0.998,"t":"AH","w":[{"b":1.900,"d":0.010,"p":1.000,"t":"462"},{"b":1.910,"d":0.010,"p":0.999,"t":"671"},{"b":1.920,"d":0.020,"p":0.999,"t":"731"}]},{"b":1.940,"d":0.070,"p":0.995,"t":"L","w":[{"b":1.940,"d":0.040,"p":0.997,"t":"2938"},{"b":1.980,"d":0.010,"p":0.999,"t":"3057"},{"b":1.990,"d":0.020,"p":0.999,"t":"3133"}]}]},{"b":2.010,"d":0.480,"p":0.946,"t":"woman","w":[{"b":2.010,"d":0.150,"p":0.988,"t":"W","w":[{"b":2.010,"d":0.100,"p":0.997,"t":"4846"},{"b":2.110,"d":0.040,"p":0.998,"t":"4880"},{"b":2.150,"d":0.010,"p":0.994,"t":"4929"}]},{"b":2.160,"d":0.070,"p":0.992,"t":"UH","w":[{"b":2.160,"d":0.010,"p":0.999,"t":"4595"},{"b":2.170,"d":0.030,"p":0.995,"t":"4601"},{"b":2.200,"d":0.030,"p":0.998,"t":"4610"}]},{"b":2.230,"d":0.070,"p":0.991,"t":"M","w":[{"b":2.230,"d":0.020,"p":0.998,"t":"3147"},{"b":2.250,"d":0.030,"p":0.998,"t":"3182"},{"b":2.280,"d":0.020,"p":0.995,"t":"3247"}]},{"b":2.300,"d":0.070,"p":0.991,"t":"AH","w":[{"b":2.300,"d":0.030,"p":0.994,"t":"435"},{"b":2.330,"d":0.020,"p":0.999,"t":"567"},{"b":2.350,"d":0.020,"p":0.999,"t":"712"}]},{"b":2.370,"d":0.120,"p":0.983,"t":"N","w":[{"b":2.370,"d":0.010,"p":0.999,"t":"3297"},{"b":2.380,"d":0.090,"p":0.987,"t":"3365"},{"b":2.470,"d":0.020,"p":0.997,"t":"3442"}]}]},{"b":2.490,"d":0.220,"p":0.975,"t":"he","w":[{"b":2.490,"d":0.130,"p":0.983,"t":"HH","w":[{"b":2.490,"d":0.050,"p":0.990,"t":"2123"},{"b":2.540,"d":0.060,"p":0.994,"t":"2178"},{"b":2.600,"d":0.020,"p":0.998,"t":"2202"}]},{"b":2.620,"d":0.090,"p":0.993,"t":"IY","w":[{"b":2.620,"d":0.040,"p":0.996,"t":"2536"},{"b":2.660,"d":0.020,"p":0.998,"t":"2606"},{"b":2.680,"d":0.030,"p":0.998,"t":"2673"}]}]},{"b":2.710,"d":0.290,"p":0.959,"t":"might","w":[{"b":2.710,"d":0.110,"p":0.989,"t":"M","w":[{"b":2.710,"d":0.030,"p":0.997,"t":"3158"},{"b":2.740,"d":0.050,"p":0.995,"t":"3193"},{"b":2.790,"d":0.030,"p":0.998,"t":"3243"}]},{"b":2.820,"d":0.130,"p":0.981,"t":"AY","w":[{"b":2.820,"d":0.040,"p":0.998,"t":"952"},{"b":2.860,"d":0.040,"p":0.998,"t":"1016"},{"b":2.900,"d":0.050,"p":0.986,"t":"1050"}]},{"b":2.950,"d":0.050,"p":0.988,"t":"T","w":[{"b":2.950,"d":0.010,"p":0.996,"t":"4291"},{"b":2.960,"d":0.010,"p":0.999,"t":"4335"},{"b":2.970,"d":0.030,"p":0.993,"t":"4534"}]}]},{"b":3.000,"d":0.190,"p":0.977,"t":"have","w":[{"b":3.000,"d":0.060,"p":0.995,"t":"HH","w":[{"b":3.000,"d":0.010,"p":0.999,"t":"2098"},{"b":3.010,"d":0.020,"p":0.997,"t":"2165"},{"b":3.030,"d":0.030,"p":0.998,"t":"2210"}]},{"b":3.060,"d":0.060,"p":0.989,"t":"AE","w":[{"b":3.060,"d":0.040,"p":0.997,"t":"244"},{"b":3.100,"d":0.010,"p":0.996,"t":"300"},{"b":3.110,"d":0.010,"p":0.997,"t":"328"}]},{"b":3.120,"d":0.070,"p":0.993,"t":"V","w":[{"b":3.120,"d":0.040,"p":0.997,"t":"4740"},{"b":3.160,"d":0.020,"p":0.998,"t":"4765"},{"b":3.180,"d":0.010,"p":0.997,"t":"4794"}]}]},{"b":3.190,"d":0.170,"p":0.958,"t":"been","w":[{"b":3.190,"d":0.060,"p":0.989,"t":"B","w":[{"b":3.190,"d":0.010,"p":0.998,"t":"1075"},{"b":3.200,"d":0.030,"p":0.995,"t":"1109"},{"b":3.230,"d":0.020,"p":0.996,"t":"1138"}]},{"b":3.250,"d":0.060,"p":0.987,"t":"IH","w":[{"b":3.250,"d":0.020,"p":0.999,"t":"2267"},{"b":3.270,"d":0.010,"p":0.999,"t":"2333"},{"b":3.280,"d":0.030,"p":0.989,"t":"2456"}]},{"b":3.310,"d":0.050,"p":0.981,"t":"N","w":[{"b":3.310,"d":0.020,"p":0.991,"t":"3333"},{"b":3.330,"d":0.020,"p":0.994,"t":"3381"},{"b":3.350,"d":0.010,"p":0.996,"t":"3434"}]}]},{"b":3.360,"d":0.330,"p":0.969,"t":"made","w":[{"b":3.360,"d":0.100,"p":0.989,"t":"M","w":[{"b":3.360,"d":0.010,"p":0.998,"t":"3181"},{"b":3.370,"d":0.050,"p":0.993,"t":"3212"},{"b":3.420,"d":0.040,"p":0.998,"t":"3265"}]},{"b":3.460,"d":0.160,"p":0.987,"t":"EY","w":[{"b":3.460,"d":0.050,"p":0.996,"t":"1878"},{"b":3.510,"d":0.080,"p":0.996,"t":"1898"},{"b":3.590,"d":0.030,"p":0.994,"t":"1932"}]},{"b":3.620,"d":0.070,"p":0.994,"t":"D","w":[{"b":3.620,"d":0.020,"p":0.999,"t":"1213"},{"b":3.640,"d":0.030,"p":0.996,"t":"1259"},{"b":3.670,"d":0.020,"p":0.999,"t":"1388"}]}]},{"b":3.690,"d":0.380,"p":0.958,"t":"still","w":[{"b":3.690,"d":0.130,"p":0.993,"t":"S","w":[{"b":3.690,"d":0.040,"p":0.998,"t":"4032"},{"b":3.730,"d":0.050,"p":0.998,"t":"4115"},{"b":3.780,"d":0.040,"p":0.998,"t":"4158"}]},{"b":3.820,"d":0.080,"p":0.994,"t":"T","w":[{"b":3.820,"d":0.050,"p":0.997,"t":"4324"},{"b":3.870,"d":0.010,"p":0.998,"t":"4437"},{"b":3.880,"d":0.020,"p":0.999,"t":"4441"}]},{"b":3.900,"d":0.050,"p":0.997,"t":"IH","w":[{"b":3.900,"d":0.020,"p":0.999,"t":"2235"},{"b":3.920,"d":0.010,"p":0.999,"t":"2351"},{"b":3.930,"d":0.020,"p":0.999,"t":"2470"}]},{"b":3.950,"d":0.120,"p":0.974,"t":"L","w":[{"b":3.950,"d":0.050,"p":0.998,"t":"2957"},{"b":4.000,"d":0.030,"p":0.993,"t":"3068"},{"b":4.030,"d":0.040,"p":0.983,"t":"3130"}]}]},{"b":4.070,"d":0.180,"p":0.967,"t":"more","w":[{"b":4.070,"d":0.050,"p":0.981,"t":"M","w":[{"b":4.070,"d":0.010,"p":0.995,"t":"3149"},{"b":4.080,"d":0.020,"p":0.991,"t":"3188"},{"b":4.100,"d":0.020,"p":0.996,"t":"3253"}]},{"b":4.120,"d":0.090,"p":0.989,"t":"AO","w":[{"b":4.120,"d":0.010,"p":0.997,"t":"838"},{"b":4.130,"d":0.060,"p":0.993,"t":"873"},{"b":4.190,"d":0.020,"p":0.999,"t":"900"}]},{"b":4.210,"d":0.040,"p":0.996,"t":"R","w":[{"b":4.210,"d":0.010,"p":0.998,"t":"3783"},{"b":4.220,"d":0.020,"p":0.999,"t":"3889"},{"b":4.240,"d":0.010,"p":0.999,"t":"4018"}]}]},{"b":4.250,"d":0.750,"p":0.913,"t":"respectable","w":[{"b":4.250,"d":0.080,"p":0.992,"t":"R","w":[{"b":4.250,"d":0.050,"p":0.994,"t":"3852"},{"b":4.300,"d":0.020,"p":0.999,"t":"3934"},{"b":4.320,"d":0.010,"p":0.999,"t":"3958"}]},{"b":4.330,"d":0.040,"p":0.996,"t":"IH","w":[{"b":4.330,"d":0.010,"p":0.998,"t":"2310"},{"b":4.340,"d":0.010,"p":0.999,"t":"2387"},{"b":4.350,"d":0.020,"p":0.999,"t":"2506"}]},{"b":4.370,"d":0.110,"p":0.986,"t":"S","w":[{"b":4.370,"d":0.030,"p":0.995,"t":"4050"},{"b":4.400,"d":0.040,"p":0.993,"t":"4129"},{"b":4.440,"d":0.040,"p":0.998,"t":"4152"}]},{"b":4.480,"d":0.080,"p":0.994,"t":"P","w":[{"b":4.480,"d":0.030,"p":0.998,"t":"3706"},{"b":4.510,"d":0.030,"p":0.998,"t":"3717"},{"b":4.540,"d":0.020,"p":0.999,"t":"3772"}]},{"b":4.560,"d":0.070,"p":0.993,"t":"EH","w":[{"b":4.560,"d":0.020,"p":0.999,"t":"1514"},{"b":4.580,"d":0.040,"p":0.995,"t":"1547"},{"b":4.620,"d":0.010,"p":0.999,"t":"1622"}]},{"b":4.630,"d":0.060,"p":0.981,"t":"K","w":[{"b":4.630,"d":0.040,"p":0.992,"t":"2781"},{"b":4.670,"d":0.010,"p":0.993,"t":"2815"},{"b":4.680,"d":0.010,"p":0.995,"t":"2918"}]},{"b":4.690,"d":0.050,"p":0.992,"t":"T","w":[{"b":4.690,"d":0.010,"p":0.998,"t":"4316"},{"b":4.700,"d":0.010,"p":0.999,"t":"4398"},{"b":4.710,"d":0.030,"p":0.995,"t":"4439"}]},{"b":4.740,"d":0.040,"p":0.996,"t":"AH","w":[{"b":4.740,"d":0.020,"p":0.999,"t":"388"},{"b":4.760,"d":0.010,"p":0.998,"t":"601"},{"b":4.770,"d":0.010,"p":1.000,"t":"767"}]},{"b":4.780,"d":0.060,"p":0.995,"t":"B","w":[{"b":4.780,"d":0.030,"p":0.998,"t":"1061"},{"b":4.810,"d":0.020,"p":0.998,"t":"1098"},{"b":4.830,"d":0.010,"p":0.999,"t":"1120"}]},{"b":4.840,"d":0.030,"p":0.994,"t":"AH","w":[{"b":4.840,"d":0.010,"p":1.000,"t":"462"},{"b":4.850,"d":0.010,"p":0.999,"t":"671"},{"b":4.860,"d":0.010,"p":0.996,"t":"731"}]},{"b":4.870,"d":0.130,"p":0.990,"t":"L","w":[{"b":4.870,"d":0.080,"p":0.996,"t":"2941"},{"b":4.950,"d":0.030,"p":0.996,"t":"3053"},{"b":4.980,"d":0.020,"p":0.998,"t":"3123"}]}]},{"b":5.000,"d":0.130,"p":0.979,"t":"than(2)","w":[{"b":5.000,"d":0.050,"p":0.992,"t":"DH","w":[{"b":5.000,"d":0.010,"p":0.995,"t":"1419"},{"b":5.010,"d":0.010,"p":1.000,"t":"1452"},{"b":5.020,"d":0.030,"p":0.998,"t":"1465"}]},{"b":5.050,"d":0.050,"p":0.997,"t":"AH","w":[{"b":5.050,"d":0.020,"p":0.999,"t":"415"},{"b":5.070,"d":0.020,"p":0.999,"t":"572"},{"b":5.090,"d":0.010,"p":0.999,"t":"709"}]},{"b":5.100,"d":0.030,"p":0.990,"t":"N","w":[{"b":5.100,"d":0.010,"p":0.997,"t":"3297"},{"b":5.110,"d":0.010,"p":0.997,"t":"3365"},{"b":5.120,"d":0.010,"p":0.995,"t":"3442"}]}]},{"b":5.130,"d":0.080,"p":0.967,"t":"he","w":[{"b":5.130,"d":0.030,"p":0.975,"t":"HH","w":[{"b":5.130,"d":0.010,"p":0.994,"t":"2123"},{"b":5.140,"d":0.010,"p":0.989,"t":"2178"},{"b":5.150,"d":0.010,"p":0.991,"t":"2202"}]},{"b":5.160,"d":0.050,"p":0.992,"t":"IY","w":[{"b":5.160,"d":0.010,"p":0.995,"t":"2538"},{"b":5.170,"d":0.010,"p":0.999,"t":"2653"},{"b":5.180,"d":0.030,"p":0.998,"t":"2680"}]}]},{"b":5.210,"d":0.620,"p":0.913,"t":"was","w":[{"b":5.210,"d":0.100,"p":0.995,"t":"W","w":[{"b":5.210,"d":0.050,"p":0.998,"t":"4858"},{"b":5.260,"d":0.030,"p":0.998,"t":"4893"},{"b":5.290,"d":0.020,"p":0.999,"t":"4913"}]},{"b":5.310,"d":0.240,"p":0.954,"t":"AA","w":[{"b":5.310,"d":0.040,"p":0.998,"t":"161"},{"b":5.350,"d":0.100,"p":0.997,"t":"178"},{"b":5.450,"d":0.100,"p":0.959,"t":"210"}]},{"b":5.550,"d":0.280,"p":0.962,"t":"Z","w":[{"b":5.550,"d":0.030,"p":0.989,"t":"4999"},{"b":5.580,"d":0.190,"p":0.979,"t":"5069"},{"b":5.770,"d":0.060,"p":0.994,"t":"5093"}]}]},{"b":5.830,"d":0.210,"p":0.985,"t":"","w":[{"b":5.830,"d":0.210,"p":0.985,"t":"SIL","w":[{"b":5.830,"d":0.060,"p":0.996,"t":"96"},{"b":5.890,"d":0.140,"p":0.994,"t":"97"},{"b":6.030,"d":0.010,"p":0.994,"t":"98"}]}]}]} diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0920.txt b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0920.txt new file mode 100644 index 0000000..ccdf294 --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0920.txt @@ -0,0 +1 @@ +had he married a more a amiable woman he might have been made still more respectable than he was diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0930.json b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0930.json new file mode 100644 index 0000000..38cb57a --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0930.json @@ -0,0 +1 @@ +{"b":0.000,"d":3.290,"p":1.000,"t":"he might even have been made amiable himself","w":[{"b":0.000,"d":0.210,"p":0.945,"t":""},{"b":0.210,"d":0.170,"p":0.984,"t":"he"},{"b":0.380,"d":0.260,"p":0.967,"t":"might"},{"b":0.640,"d":0.280,"p":0.972,"t":"even"},{"b":0.920,"d":0.150,"p":0.962,"t":"have"},{"b":1.070,"d":0.260,"p":0.966,"t":"been"},{"b":1.330,"d":0.370,"p":0.967,"t":"made"},{"b":1.700,"d":0.570,"p":0.956,"t":"amiable"},{"b":2.270,"d":0.750,"p":0.920,"t":"himself"},{"b":3.020,"d":0.260,"p":0.951,"t":""}]} diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0930.lab b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0930.lab new file mode 100644 index 0000000..a5d922b --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0930.lab @@ -0,0 +1,2 @@ +0.269115 0.269115 speech +3.036561 3.036561 silence diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0930.phone.json b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0930.phone.json new file mode 100644 index 0000000..e50bbd4 --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0930.phone.json @@ -0,0 +1 @@ +{"b":0.000,"d":3.290,"p":1.000,"t":"he might even have been made amiable himself","w":[{"b":0.000,"d":0.210,"p":0.988,"t":"","w":[{"b":0.000,"d":0.210,"p":0.988,"t":"SIL"}]},{"b":0.210,"d":0.170,"p":0.990,"t":"he","w":[{"b":0.210,"d":0.090,"p":0.995,"t":"HH"},{"b":0.300,"d":0.080,"p":0.996,"t":"IY"}]},{"b":0.380,"d":0.260,"p":0.970,"t":"might","w":[{"b":0.380,"d":0.100,"p":0.981,"t":"M"},{"b":0.480,"d":0.120,"p":0.994,"t":"AY"},{"b":0.600,"d":0.040,"p":0.995,"t":"T"}]},{"b":0.640,"d":0.280,"p":0.976,"t":"even","w":[{"b":0.640,"d":0.110,"p":0.994,"t":"IY"},{"b":0.750,"d":0.070,"p":0.996,"t":"V"},{"b":0.820,"d":0.040,"p":0.996,"t":"IH"},{"b":0.860,"d":0.060,"p":0.990,"t":"N"}]},{"b":0.920,"d":0.150,"p":0.964,"t":"have","w":[{"b":0.920,"d":0.030,"p":0.981,"t":"HH"},{"b":0.950,"d":0.060,"p":0.989,"t":"AE"},{"b":1.010,"d":0.060,"p":0.995,"t":"V"}]},{"b":1.070,"d":0.260,"p":0.978,"t":"been","w":[{"b":1.070,"d":0.070,"p":0.993,"t":"B"},{"b":1.140,"d":0.100,"p":0.991,"t":"IH"},{"b":1.240,"d":0.090,"p":0.994,"t":"N"}]},{"b":1.330,"d":0.370,"p":0.954,"t":"made","w":[{"b":1.330,"d":0.070,"p":0.996,"t":"M"},{"b":1.400,"d":0.230,"p":0.990,"t":"EY"},{"b":1.630,"d":0.070,"p":0.968,"t":"D"}]},{"b":1.700,"d":0.570,"p":0.937,"t":"amiable","w":[{"b":1.700,"d":0.110,"p":0.989,"t":"EY"},{"b":1.810,"d":0.080,"p":0.984,"t":"M"},{"b":1.890,"d":0.080,"p":0.986,"t":"IY"},{"b":1.970,"d":0.060,"p":0.996,"t":"AH"},{"b":2.030,"d":0.080,"p":0.994,"t":"B"},{"b":2.110,"d":0.030,"p":0.999,"t":"AH"},{"b":2.140,"d":0.130,"p":0.988,"t":"L"}]},{"b":2.270,"d":0.750,"p":0.900,"t":"himself","w":[{"b":2.270,"d":0.030,"p":0.977,"t":"HH"},{"b":2.300,"d":0.030,"p":0.991,"t":"IH"},{"b":2.330,"d":0.090,"p":0.978,"t":"M"},{"b":2.420,"d":0.180,"p":0.992,"t":"S"},{"b":2.600,"d":0.080,"p":0.995,"t":"EH"},{"b":2.680,"d":0.130,"p":0.991,"t":"L"},{"b":2.810,"d":0.210,"p":0.970,"t":"F"}]},{"b":3.020,"d":0.260,"p":0.984,"t":"","w":[{"b":3.020,"d":0.260,"p":0.984,"t":"SIL"}]}]} diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0930.state.json b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0930.state.json new file mode 100644 index 0000000..750acb1 --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0930.state.json @@ -0,0 +1 @@ +{"b":0.000,"d":3.290,"p":1.000,"t":"he might even have been made amiable himself","w":[{"b":0.000,"d":0.210,"p":0.988,"t":"","w":[{"b":0.000,"d":0.210,"p":0.988,"t":"SIL","w":[{"b":0.000,"d":0.010,"p":1.000,"t":"96"},{"b":0.010,"d":0.080,"p":0.997,"t":"97"},{"b":0.090,"d":0.120,"p":0.990,"t":"98"}]}]},{"b":0.210,"d":0.170,"p":0.990,"t":"he","w":[{"b":0.210,"d":0.090,"p":0.995,"t":"HH","w":[{"b":0.210,"d":0.050,"p":0.997,"t":"2110"},{"b":0.260,"d":0.020,"p":0.999,"t":"2182"},{"b":0.280,"d":0.020,"p":0.999,"t":"2204"}]},{"b":0.300,"d":0.080,"p":0.996,"t":"IY","w":[{"b":0.300,"d":0.010,"p":0.999,"t":"2536"},{"b":0.310,"d":0.040,"p":0.998,"t":"2606"},{"b":0.350,"d":0.030,"p":0.998,"t":"2673"}]}]},{"b":0.380,"d":0.260,"p":0.970,"t":"might","w":[{"b":0.380,"d":0.100,"p":0.981,"t":"M","w":[{"b":0.380,"d":0.020,"p":0.993,"t":"3158"},{"b":0.400,"d":0.040,"p":0.996,"t":"3193"},{"b":0.440,"d":0.040,"p":0.993,"t":"3243"}]},{"b":0.480,"d":0.120,"p":0.994,"t":"AY","w":[{"b":0.480,"d":0.050,"p":0.998,"t":"952"},{"b":0.530,"d":0.030,"p":0.998,"t":"1016"},{"b":0.560,"d":0.040,"p":0.998,"t":"1050"}]},{"b":0.600,"d":0.040,"p":0.995,"t":"T","w":[{"b":0.600,"d":0.020,"p":0.998,"t":"4291"},{"b":0.620,"d":0.010,"p":0.998,"t":"4396"},{"b":0.630,"d":0.010,"p":0.999,"t":"4468"}]}]},{"b":0.640,"d":0.280,"p":0.976,"t":"even","w":[{"b":0.640,"d":0.110,"p":0.994,"t":"IY","w":[{"b":0.640,"d":0.010,"p":0.999,"t":"2540"},{"b":0.650,"d":0.070,"p":0.996,"t":"2604"},{"b":0.720,"d":0.030,"p":0.998,"t":"2709"}]},{"b":0.750,"d":0.070,"p":0.996,"t":"V","w":[{"b":0.750,"d":0.020,"p":0.999,"t":"4746"},{"b":0.770,"d":0.020,"p":0.999,"t":"4757"},{"b":0.790,"d":0.030,"p":0.998,"t":"4808"}]},{"b":0.820,"d":0.040,"p":0.996,"t":"IH","w":[{"b":0.820,"d":0.010,"p":1.000,"t":"2275"},{"b":0.830,"d":0.010,"p":0.998,"t":"2342"},{"b":0.840,"d":0.020,"p":0.999,"t":"2460"}]},{"b":0.860,"d":0.060,"p":0.990,"t":"N","w":[{"b":0.860,"d":0.020,"p":0.995,"t":"3333"},{"b":0.880,"d":0.020,"p":0.996,"t":"3366"},{"b":0.900,"d":0.020,"p":0.999,"t":"3442"}]}]},{"b":0.920,"d":0.150,"p":0.964,"t":"have","w":[{"b":0.920,"d":0.030,"p":0.981,"t":"HH","w":[{"b":0.920,"d":0.010,"p":0.998,"t":"2126"},{"b":0.930,"d":0.010,"p":0.987,"t":"2167"},{"b":0.940,"d":0.010,"p":0.996,"t":"2213"}]},{"b":0.950,"d":0.060,"p":0.989,"t":"AE","w":[{"b":0.950,"d":0.010,"p":0.997,"t":"244"},{"b":0.960,"d":0.020,"p":0.994,"t":"300"},{"b":0.980,"d":0.030,"p":0.997,"t":"328"}]},{"b":1.010,"d":0.060,"p":0.995,"t":"V","w":[{"b":1.010,"d":0.030,"p":0.998,"t":"4740"},{"b":1.040,"d":0.020,"p":0.999,"t":"4765"},{"b":1.060,"d":0.010,"p":0.998,"t":"4794"}]}]},{"b":1.070,"d":0.260,"p":0.978,"t":"been","w":[{"b":1.070,"d":0.070,"p":0.993,"t":"B","w":[{"b":1.070,"d":0.020,"p":0.996,"t":"1075"},{"b":1.090,"d":0.030,"p":0.997,"t":"1109"},{"b":1.120,"d":0.020,"p":0.999,"t":"1138"}]},{"b":1.140,"d":0.100,"p":0.991,"t":"IH","w":[{"b":1.140,"d":0.030,"p":0.998,"t":"2267"},{"b":1.170,"d":0.060,"p":0.995,"t":"2333"},{"b":1.230,"d":0.010,"p":0.999,"t":"2456"}]},{"b":1.240,"d":0.090,"p":0.994,"t":"N","w":[{"b":1.240,"d":0.040,"p":0.997,"t":"3333"},{"b":1.280,"d":0.030,"p":0.998,"t":"3381"},{"b":1.310,"d":0.020,"p":0.999,"t":"3434"}]}]},{"b":1.330,"d":0.370,"p":0.954,"t":"made","w":[{"b":1.330,"d":0.070,"p":0.996,"t":"M","w":[{"b":1.330,"d":0.010,"p":0.999,"t":"3181"},{"b":1.340,"d":0.030,"p":0.998,"t":"3212"},{"b":1.370,"d":0.030,"p":0.998,"t":"3265"}]},{"b":1.400,"d":0.230,"p":0.990,"t":"EY","w":[{"b":1.400,"d":0.040,"p":0.998,"t":"1878"},{"b":1.440,"d":0.160,"p":0.996,"t":"1898"},{"b":1.600,"d":0.030,"p":0.997,"t":"1932"}]},{"b":1.630,"d":0.070,"p":0.968,"t":"D","w":[{"b":1.630,"d":0.010,"p":0.999,"t":"1212"},{"b":1.640,"d":0.010,"p":0.993,"t":"1272"},{"b":1.650,"d":0.050,"p":0.976,"t":"1347"}]}]},{"b":1.700,"d":0.570,"p":0.937,"t":"amiable","w":[{"b":1.700,"d":0.110,"p":0.989,"t":"EY","w":[{"b":1.700,"d":0.050,"p":0.996,"t":"1865"},{"b":1.750,"d":0.040,"p":0.998,"t":"1917"},{"b":1.790,"d":0.020,"p":0.995,"t":"1947"}]},{"b":1.810,"d":0.080,"p":0.984,"t":"M","w":[{"b":1.810,"d":0.040,"p":0.989,"t":"3156"},{"b":1.850,"d":0.020,"p":0.996,"t":"3210"},{"b":1.870,"d":0.020,"p":0.999,"t":"3255"}]},{"b":1.890,"d":0.080,"p":0.986,"t":"IY","w":[{"b":1.890,"d":0.030,"p":0.996,"t":"2555"},{"b":1.920,"d":0.020,"p":0.994,"t":"2612"},{"b":1.940,"d":0.030,"p":0.996,"t":"2666"}]},{"b":1.970,"d":0.060,"p":0.996,"t":"AH","w":[{"b":1.970,"d":0.010,"p":1.000,"t":"500"},{"b":1.980,"d":0.030,"p":0.998,"t":"602"},{"b":2.010,"d":0.020,"p":0.999,"t":"767"}]},{"b":2.030,"d":0.080,"p":0.994,"t":"B","w":[{"b":2.030,"d":0.040,"p":0.997,"t":"1061"},{"b":2.070,"d":0.020,"p":0.999,"t":"1098"},{"b":2.090,"d":0.020,"p":0.999,"t":"1120"}]},{"b":2.110,"d":0.030,"p":0.999,"t":"AH","w":[{"b":2.110,"d":0.010,"p":1.000,"t":"462"},{"b":2.120,"d":0.010,"p":0.999,"t":"671"},{"b":2.130,"d":0.010,"p":1.000,"t":"731"}]},{"b":2.140,"d":0.130,"p":0.988,"t":"L","w":[{"b":2.140,"d":0.050,"p":0.998,"t":"2934"},{"b":2.190,"d":0.060,"p":0.996,"t":"3060"},{"b":2.250,"d":0.020,"p":0.995,"t":"3128"}]}]},{"b":2.270,"d":0.750,"p":0.900,"t":"himself","w":[{"b":2.270,"d":0.030,"p":0.977,"t":"HH","w":[{"b":2.270,"d":0.010,"p":0.990,"t":"2118"},{"b":2.280,"d":0.010,"p":0.994,"t":"2187"},{"b":2.290,"d":0.010,"p":0.993,"t":"2196"}]},{"b":2.300,"d":0.030,"p":0.991,"t":"IH","w":[{"b":2.300,"d":0.010,"p":0.998,"t":"2246"},{"b":2.310,"d":0.010,"p":0.996,"t":"2350"},{"b":2.320,"d":0.010,"p":0.997,"t":"2466"}]},{"b":2.330,"d":0.090,"p":0.978,"t":"M","w":[{"b":2.330,"d":0.030,"p":0.991,"t":"3166"},{"b":2.360,"d":0.030,"p":0.990,"t":"3223"},{"b":2.390,"d":0.030,"p":0.996,"t":"3280"}]},{"b":2.420,"d":0.180,"p":0.992,"t":"S","w":[{"b":2.420,"d":0.040,"p":0.998,"t":"4038"},{"b":2.460,"d":0.100,"p":0.997,"t":"4070"},{"b":2.560,"d":0.040,"p":0.998,"t":"4173"}]},{"b":2.600,"d":0.080,"p":0.995,"t":"EH","w":[{"b":2.600,"d":0.020,"p":0.999,"t":"1522"},{"b":2.620,"d":0.030,"p":0.998,"t":"1596"},{"b":2.650,"d":0.030,"p":0.998,"t":"1642"}]},{"b":2.680,"d":0.130,"p":0.991,"t":"L","w":[{"b":2.680,"d":0.080,"p":0.995,"t":"2948"},{"b":2.760,"d":0.030,"p":0.998,"t":"3069"},{"b":2.790,"d":0.020,"p":0.999,"t":"3118"}]},{"b":2.810,"d":0.210,"p":0.970,"t":"F","w":[{"b":2.810,"d":0.020,"p":0.999,"t":"1974"},{"b":2.830,"d":0.070,"p":0.995,"t":"2004"},{"b":2.900,"d":0.120,"p":0.976,"t":"2019"}]}]},{"b":3.020,"d":0.260,"p":0.984,"t":"","w":[{"b":3.020,"d":0.260,"p":0.984,"t":"SIL","w":[{"b":3.020,"d":0.160,"p":0.991,"t":"96"},{"b":3.180,"d":0.090,"p":0.997,"t":"97"},{"b":3.270,"d":0.010,"p":0.995,"t":"98"}]}]}]} diff --git a/test/data/librivox/sense_and_sensibility_01_austen_64kb-0930.txt b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0930.txt new file mode 100644 index 0000000..18f9276 --- /dev/null +++ b/test/data/librivox/sense_and_sensibility_01_austen_64kb-0930.txt @@ -0,0 +1 @@ +he might even have been made amiable himself diff --git a/test/data/librivox/test-align.align b/test/data/librivox/test-align.align new file mode 100644 index 0000000..03d691c --- /dev/null +++ b/test/data/librivox/test-align.align @@ -0,0 +1,5 @@ + and(2) mister john dashwood had then leisure(2) to(3) consider how much there might be prudently in his power to(2) do for them(2) (sense_and_sensibility_01_austen_64kb-0870 -9144) + he was(2) not an(2) ill disposed young man (sense_and_sensibility_01_austen_64kb-0880 -3936) + unless to(3) be rather(2) cold hearted(2) and rather selfish is to(3) be ill disposed (sense_and_sensibility_01_austen_64kb-0890 -6861) + had he married a more a(2) amiable woman he might have been made still more respectable than(2) he was (sense_and_sensibility_01_austen_64kb-0920 -6986) + he might even have been made amiable himself (sense_and_sensibility_01_austen_64kb-0930 -4129) diff --git a/test/data/librivox/test-align.matchseg b/test/data/librivox/test-align.matchseg new file mode 100644 index 0000000..32330de --- /dev/null +++ b/test/data/librivox/test-align.matchseg @@ -0,0 +1,5 @@ +sense_and_sensibility_01_austen_64kb-0870 S 0 T -9144 A -7796 L -1348 0 -223 -337 20 -491 0 and(2) 37 -312 0 mister 63 -219 0 john 98 -432 0 dashwood 158 -228 0 had 184 -347 0 then 221 -206 -337 225 -315 0 leisure(2) 271 -285 0 to(3) 289 -369 0 consider 344 -322 0 how 395 -129 -337 400 -283 0 much 433 -212 0 there 452 -294 0 might 479 -127 0 be 494 -1030 0 prudently 546 -90 0 in 556 -253 0 his 575 -241 0 power 604 -175 0 to(2) 614 -325 0 do 635 -302 0 for 661 -446 0 them(2) 679 -140 -337 708 +sense_and_sensibility_01_austen_64kb-0880 S 0 T -3936 A -2925 L -1011 0 -208 -337 20 -131 0 he 34 -176 0 was(2) 56 -464 0 not 106 -217 -337 113 -287 0 an(2) 130 -149 0 ill 148 -624 0 disposed 211 -219 0 young 233 -251 0 man 274 -199 -337 297 +sense_and_sensibility_01_austen_64kb-0890 S 0 T -6861 A -5850 L -1011 0 -185 -337 27 -398 0 unless 59 -107 0 to(3) 70 -123 0 be 86 -412 0 rather(2) 122 -658 0 cold 174 -788 0 hearted(2) 222 -304 0 and 239 -367 0 rather 278 -775 0 selfish 359 -131 -337 363 -336 0 is 388 -91 0 to(3) 398 -174 0 be 416 -136 0 ill 437 -730 0 disposed 509 -135 -337 528 +sense_and_sensibility_01_austen_64kb-0920 S 0 T -6986 A -6312 L -674 0 -117 -337 22 -156 0 had 44 -204 0 he 54 -373 0 married 98 -77 0 a 103 -346 0 more 141 -105 0 a(2) 146 -549 0 amiable 201 -608 0 woman 249 -161 0 he 271 -238 0 might 300 -194 0 have 319 -388 0 been 336 -214 0 made 369 -376 0 still 407 -182 0 more 425 -686 0 respectable 500 -257 0 than(2) 513 -224 0 he 521 -691 0 was 583 -166 -337 603 +sense_and_sensibility_01_austen_64kb-0930 S 0 T -4129 A -3455 L -674 0 -210 -337 21 -157 0 he 38 -331 0 might 64 -274 0 even 92 -384 0 have 107 -341 0 been 133 -331 0 made 170 -441 0 amiable 227 -830 0 himself 302 -156 -337 327 diff --git a/test/data/librivox/test-main.fixed.json b/test/data/librivox/test-main.fixed.json new file mode 100644 index 0000000..9c9483a --- /dev/null +++ b/test/data/librivox/test-main.fixed.json @@ -0,0 +1,3 @@ +{"b":0.240,"d":6.780,"p":0.000,"t":"mr john s. would and then a leisure to consider how watch there might be pretty late in his power to do for fun","w":[{"b":0.240,"d":0.070,"p":1.000,"t":""},{"b":0.310,"d":0.320,"p":0.997,"t":"mr"},{"b":0.630,"d":0.400,"p":0.897,"t":"john"},{"b":1.030,"d":0.310,"p":0.195,"t":"s."},{"b":1.340,"d":0.250,"p":0.910,"t":"would"},{"b":1.590,"d":0.250,"p":0.438,"t":"and(2)"},{"b":1.840,"d":0.360,"p":0.562,"t":"then"},{"b":2.200,"d":0.070,"p":0.197,"t":"a(2)"},{"b":2.270,"d":0.450,"p":0.201,"t":"leisure(2)"},{"b":2.720,"d":0.180,"p":1.000,"t":"to"},{"b":2.900,"d":0.540,"p":1.000,"t":"consider"},{"b":3.440,"d":0.460,"p":0.668,"t":"how"},{"b":3.900,"d":0.430,"p":0.298,"t":"watch"},{"b":4.330,"d":0.190,"p":0.120,"t":"there"},{"b":4.520,"d":0.250,"p":0.803,"t":"might"},{"b":4.770,"d":0.170,"p":1.000,"t":"be"},{"b":4.940,"d":0.380,"p":0.473,"t":"pretty"},{"b":5.320,"d":0.140,"p":0.150,"t":"late"},{"b":5.460,"d":0.100,"p":0.591,"t":"in"},{"b":5.560,"d":0.180,"p":0.516,"t":"his"},{"b":5.740,"d":0.300,"p":0.997,"t":"power"},{"b":6.040,"d":0.100,"p":0.740,"t":"to(2)"},{"b":6.140,"d":0.200,"p":0.963,"t":"do"},{"b":6.340,"d":0.280,"p":0.968,"t":"for"},{"b":6.620,"d":0.150,"p":0.006,"t":"fun"},{"b":6.770,"d":0.240,"p":1.000,"t":""}]} +{"b":7.320,"d":8.010,"p":0.000,"t":"he was not until this blows young man homeless to be rather cold hearted and rather selfish is to the oldest those","w":[{"b":7.320,"d":0.030,"p":0.999,"t":""},{"b":7.350,"d":0.090,"p":0.997,"t":"he"},{"b":7.440,"d":0.210,"p":0.999,"t":"was(2)"},{"b":7.650,"d":0.510,"p":0.996,"t":"not"},{"b":8.160,"d":0.070,"p":0.597,"t":""},{"b":8.230,"d":0.350,"p":0.680,"t":"until"},{"b":8.580,"d":0.200,"p":0.154,"t":"this"},{"b":8.780,"d":0.380,"p":0.027,"t":"blows"},{"b":9.160,"d":0.270,"p":0.088,"t":"young"},{"b":9.430,"d":0.410,"p":0.900,"t":"man"},{"b":9.840,"d":0.470,"p":0.986,"t":""},{"b":10.310,"d":0.370,"p":0.091,"t":"homeless"},{"b":10.680,"d":0.110,"p":0.415,"t":"to(3)"},{"b":10.790,"d":0.160,"p":0.626,"t":"be"},{"b":10.950,"d":0.360,"p":0.419,"t":"rather(2)"},{"b":11.310,"d":0.520,"p":0.990,"t":"cold"},{"b":11.830,"d":0.480,"p":0.867,"t":"hearted(2)"},{"b":12.310,"d":0.170,"p":0.373,"t":"and"},{"b":12.480,"d":0.380,"p":0.824,"t":"rather"},{"b":12.860,"d":0.820,"p":1.000,"t":"selfish"},{"b":13.680,"d":0.040,"p":0.712,"t":""},{"b":13.720,"d":0.240,"p":0.779,"t":"is"},{"b":13.960,"d":0.110,"p":0.797,"t":"to(3)"},{"b":14.070,"d":0.230,"p":0.944,"t":"the(2)"},{"b":14.300,"d":0.380,"p":0.876,"t":"oldest"},{"b":14.680,"d":0.500,"p":0.652,"t":"those"},{"b":15.180,"d":0.140,"p":1.000,"t":""}]} +{"b":15.630,"d":8.970,"p":0.000,"t":"had he married a more amiable woman he might have been made still more respectable that he was he might even have been made the amiable himself","w":[{"b":15.630,"d":0.030,"p":1.000,"t":""},{"b":15.660,"d":0.170,"p":0.036,"t":"had"},{"b":15.830,"d":0.100,"p":0.211,"t":"he"},{"b":15.930,"d":0.440,"p":0.733,"t":"married"},{"b":16.370,"d":0.050,"p":0.203,"t":"a"},{"b":16.420,"d":0.380,"p":0.990,"t":"more"},{"b":16.800,"d":0.600,"p":1.000,"t":"amiable"},{"b":17.400,"d":0.480,"p":0.842,"t":"woman"},{"b":17.880,"d":0.220,"p":0.999,"t":"he"},{"b":18.100,"d":0.270,"p":1.000,"t":"might"},{"b":18.370,"d":0.210,"p":1.000,"t":"have"},{"b":18.580,"d":0.170,"p":0.547,"t":"been(2)"},{"b":18.750,"d":0.330,"p":0.984,"t":"made"},{"b":19.080,"d":0.390,"p":1.000,"t":"still"},{"b":19.470,"d":0.170,"p":1.000,"t":"more"},{"b":19.640,"d":0.750,"p":0.781,"t":"respectable"},{"b":20.390,"d":0.130,"p":0.360,"t":"that(2)"},{"b":20.520,"d":0.070,"p":0.896,"t":"he"},{"b":20.590,"d":0.630,"p":0.918,"t":"was"},{"b":21.220,"d":0.430,"p":0.983,"t":""},{"b":21.650,"d":0.170,"p":0.979,"t":"he"},{"b":21.820,"d":0.250,"p":0.976,"t":"might"},{"b":22.070,"d":0.290,"p":1.000,"t":"even"},{"b":22.360,"d":0.150,"p":0.321,"t":"have"},{"b":22.510,"d":0.260,"p":0.802,"t":"been"},{"b":22.770,"d":0.320,"p":0.973,"t":"made"},{"b":23.090,"d":0.080,"p":0.265,"t":"the"},{"b":23.170,"d":0.540,"p":0.590,"t":"amiable"},{"b":23.710,"d":0.680,"p":0.604,"t":"himself"},{"b":24.390,"d":0.080,"p":1.000,"t":""}]} diff --git a/test/data/librivox/test-main.json b/test/data/librivox/test-main.json new file mode 100644 index 0000000..f0fc1ad --- /dev/null +++ b/test/data/librivox/test-main.json @@ -0,0 +1,3 @@ +{"b":0.240,"d":6.780,"p":0.000,"t":"mr john s. would and then a leisure to consider how watch there might be pretty late in his power to do for fun","w":[{"b":0.240,"d":0.070,"p":0.999,"t":""},{"b":0.310,"d":0.320,"p":0.997,"t":"mr"},{"b":0.630,"d":0.400,"p":0.896,"t":"john"},{"b":1.030,"d":0.310,"p":0.193,"t":"s."},{"b":1.340,"d":0.250,"p":0.911,"t":"would"},{"b":1.590,"d":0.250,"p":0.435,"t":"and(2)"},{"b":1.840,"d":0.360,"p":0.561,"t":"then"},{"b":2.200,"d":0.070,"p":0.197,"t":"a(2)"},{"b":2.270,"d":0.450,"p":0.196,"t":"leisure(2)"},{"b":2.720,"d":0.180,"p":1.000,"t":"to"},{"b":2.900,"d":0.540,"p":1.000,"t":"consider"},{"b":3.440,"d":0.460,"p":0.666,"t":"how"},{"b":3.900,"d":0.430,"p":0.305,"t":"watch"},{"b":4.330,"d":0.190,"p":0.110,"t":"there"},{"b":4.520,"d":0.250,"p":0.767,"t":"might"},{"b":4.770,"d":0.170,"p":1.000,"t":"be"},{"b":4.940,"d":0.380,"p":0.460,"t":"pretty"},{"b":5.320,"d":0.140,"p":0.144,"t":"late"},{"b":5.460,"d":0.100,"p":0.587,"t":"in"},{"b":5.560,"d":0.180,"p":0.514,"t":"his"},{"b":5.740,"d":0.300,"p":0.997,"t":"power"},{"b":6.040,"d":0.100,"p":0.742,"t":"to(2)"},{"b":6.140,"d":0.200,"p":0.964,"t":"do"},{"b":6.340,"d":0.280,"p":0.971,"t":"for"},{"b":6.620,"d":0.150,"p":0.007,"t":"fun"},{"b":6.770,"d":0.240,"p":1.000,"t":""}]} +{"b":7.320,"d":8.010,"p":0.000,"t":"he was not until this blows young man homeless to be rather cold hearted and rather selfish is to the oldest those","w":[{"b":7.320,"d":0.030,"p":1.001,"t":""},{"b":7.350,"d":0.090,"p":0.999,"t":"he"},{"b":7.440,"d":0.210,"p":1.001,"t":"was(2)"},{"b":7.650,"d":0.430,"p":0.997,"t":"not"},{"b":8.080,"d":0.150,"p":0.503,"t":""},{"b":8.230,"d":0.350,"p":0.590,"t":"until"},{"b":8.580,"d":0.200,"p":0.148,"t":"this"},{"b":8.780,"d":0.380,"p":0.035,"t":"blows"},{"b":9.160,"d":0.270,"p":0.076,"t":"young"},{"b":9.430,"d":0.410,"p":0.903,"t":"man"},{"b":9.840,"d":0.470,"p":0.986,"t":""},{"b":10.310,"d":0.370,"p":0.064,"t":"homeless"},{"b":10.680,"d":0.110,"p":0.431,"t":"to(3)"},{"b":10.790,"d":0.160,"p":0.655,"t":"be"},{"b":10.950,"d":0.360,"p":0.433,"t":"rather(2)"},{"b":11.310,"d":0.520,"p":0.989,"t":"cold"},{"b":11.830,"d":0.480,"p":0.882,"t":"hearted(2)"},{"b":12.310,"d":0.170,"p":0.362,"t":"and"},{"b":12.480,"d":0.380,"p":0.824,"t":"rather"},{"b":12.860,"d":0.820,"p":1.000,"t":"selfish"},{"b":13.680,"d":0.040,"p":0.739,"t":""},{"b":13.720,"d":0.240,"p":0.902,"t":"is"},{"b":13.960,"d":0.110,"p":0.795,"t":"to(3)"},{"b":14.070,"d":0.230,"p":0.935,"t":"the(2)"},{"b":14.300,"d":0.380,"p":0.845,"t":"oldest"},{"b":14.680,"d":0.500,"p":0.716,"t":"those"},{"b":15.180,"d":0.140,"p":1.000,"t":""}]} +{"b":15.630,"d":8.970,"p":0.000,"t":"had he married a more amiable woman he might have been made still more respectable that he was he might even have been made the amiable himself","w":[{"b":15.630,"d":0.030,"p":0.999,"t":""},{"b":15.660,"d":0.170,"p":0.037,"t":"had"},{"b":15.830,"d":0.100,"p":0.208,"t":"he"},{"b":15.930,"d":0.440,"p":0.723,"t":"married"},{"b":16.370,"d":0.050,"p":0.190,"t":"a"},{"b":16.420,"d":0.380,"p":0.989,"t":"more"},{"b":16.800,"d":0.600,"p":0.999,"t":"amiable"},{"b":17.400,"d":0.480,"p":0.800,"t":"woman"},{"b":17.880,"d":0.220,"p":0.998,"t":"he"},{"b":18.100,"d":0.270,"p":0.999,"t":"might"},{"b":18.370,"d":0.210,"p":0.999,"t":"have"},{"b":18.580,"d":0.170,"p":0.553,"t":"been(2)"},{"b":18.750,"d":0.330,"p":0.989,"t":"made"},{"b":19.080,"d":0.380,"p":0.999,"t":"still"},{"b":19.460,"d":0.180,"p":0.999,"t":"more"},{"b":19.640,"d":0.750,"p":0.771,"t":"respectable"},{"b":20.390,"d":0.130,"p":0.368,"t":"that(2)"},{"b":20.520,"d":0.070,"p":0.983,"t":"he"},{"b":20.590,"d":0.630,"p":0.920,"t":"was"},{"b":21.220,"d":0.430,"p":0.996,"t":""},{"b":21.650,"d":0.170,"p":0.976,"t":"he"},{"b":21.820,"d":0.250,"p":0.971,"t":"might"},{"b":22.070,"d":0.290,"p":1.000,"t":"even"},{"b":22.360,"d":0.150,"p":0.285,"t":"have"},{"b":22.510,"d":0.260,"p":0.785,"t":"been"},{"b":22.770,"d":0.320,"p":0.972,"t":"made"},{"b":23.090,"d":0.080,"p":0.313,"t":"the"},{"b":23.170,"d":0.540,"p":0.682,"t":"amiable"},{"b":23.710,"d":0.670,"p":0.532,"t":"himself"},{"b":24.380,"d":0.090,"p":1.000,"t":""}]} diff --git a/test/data/null-align.json b/test/data/null-align.json new file mode 100644 index 0000000..8335109 --- /dev/null +++ b/test/data/null-align.json @@ -0,0 +1 @@ +{"b":0.000,"d":0.010,"p":1.000,"t":"","w":[]} diff --git a/test/data/null.json b/test/data/null.json new file mode 100644 index 0000000..8335109 --- /dev/null +++ b/test/data/null.json @@ -0,0 +1 @@ +{"b":0.000,"d":0.010,"p":1.000,"t":"","w":[]} diff --git a/test/data/null.wav b/test/data/null.wav new file mode 100644 index 0000000..d26b87b Binary files /dev/null and b/test/data/null.wav differ diff --git a/test/data/vad/leak-test.wav b/test/data/vad/leak-test.wav new file mode 100644 index 0000000..da56743 Binary files /dev/null and b/test/data/vad/leak-test.wav differ diff --git a/test/data/vad/test-audio.raw b/test/data/vad/test-audio.raw new file mode 100644 index 0000000..c8d903e Binary files /dev/null and b/test/data/vad/test-audio.raw differ diff --git a/test/regression/CMakeLists.txt b/test/regression/CMakeLists.txt new file mode 100644 index 0000000..c461823 --- /dev/null +++ b/test/regression/CMakeLists.txt @@ -0,0 +1,17 @@ +set(TESTS + test-cards.sh + test-lm.sh + test-main.sh + test-main-align.sh + test-align.sh + test-tidigits-fsg.sh + test-tidigits-simple.sh +) +foreach(TEST ${TESTS}) + if(${TEST} MATCHES "\.(test|sh)$") + add_test(NAME ${TEST} COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/${TEST}) + else() + add_test(NAME ${TEST} COMMAND ${TEST}) + endif() + set_property(TEST ${TEST} PROPERTY ENVIRONMENT CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}) +endforeach() diff --git a/test/regression/Makefile.am b/test/regression/Makefile.am deleted file mode 100644 index c29ab22..0000000 --- a/test/regression/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -TESTS = \ - test-cards.sh \ - test-lm.sh \ - test-tidigits-fsg.sh \ - test-tidigits-simple.sh - -TESTDATA = - -EXTRA_DIST = $(TESTS) $(TESTDATA) - -CLEANFILES = *.match *.log diff --git a/test/regression/Makefile.in b/test/regression/Makefile.in deleted file mode 100644 index 4dbb1bf..0000000 --- a/test/regression/Makefile.in +++ /dev/null @@ -1,857 +0,0 @@ -# Makefile.in generated by automake 1.13.4 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2013 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = test/regression -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/test-driver -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ - $(top_srcdir)/m4/ax_python_devel.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -SOURCES = -DIST_SOURCES = -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -am__tty_colors_dummy = \ - mgn= red= grn= lgn= blu= brg= std=; \ - am__color_tests=no -am__tty_colors = { \ - $(am__tty_colors_dummy); \ - if test "X$(AM_COLOR_TESTS)" = Xno; then \ - am__color_tests=no; \ - elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ - am__color_tests=yes; \ - elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ - am__color_tests=yes; \ - fi; \ - if test $$am__color_tests = yes; then \ - red=''; \ - grn=''; \ - lgn=''; \ - blu=''; \ - mgn=''; \ - brg=''; \ - std=''; \ - fi; \ -} -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__recheck_rx = ^[ ]*:recheck:[ ]* -am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* -am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* -# A command that, given a newline-separated list of test names on the -# standard input, print the name of the tests that are to be re-run -# upon "make recheck". -am__list_recheck_tests = $(AWK) '{ \ - recheck = 1; \ - while ((rc = (getline line < ($$0 ".trs"))) != 0) \ - { \ - if (rc < 0) \ - { \ - if ((getline line2 < ($$0 ".log")) < 0) \ - recheck = 0; \ - break; \ - } \ - else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ - { \ - recheck = 0; \ - break; \ - } \ - else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ - { \ - break; \ - } \ - }; \ - if (recheck) \ - print $$0; \ - close ($$0 ".trs"); \ - close ($$0 ".log"); \ -}' -# A command that, given a newline-separated list of test names on the -# standard input, create the global log from their .trs and .log files. -am__create_global_log = $(AWK) ' \ -function fatal(msg) \ -{ \ - print "fatal: making $@: " msg | "cat >&2"; \ - exit 1; \ -} \ -function rst_section(header) \ -{ \ - print header; \ - len = length(header); \ - for (i = 1; i <= len; i = i + 1) \ - printf "="; \ - printf "\n\n"; \ -} \ -{ \ - copy_in_global_log = 1; \ - global_test_result = "RUN"; \ - while ((rc = (getline line < ($$0 ".trs"))) != 0) \ - { \ - if (rc < 0) \ - fatal("failed to read from " $$0 ".trs"); \ - if (line ~ /$(am__global_test_result_rx)/) \ - { \ - sub("$(am__global_test_result_rx)", "", line); \ - sub("[ ]*$$", "", line); \ - global_test_result = line; \ - } \ - else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ - copy_in_global_log = 0; \ - }; \ - if (copy_in_global_log) \ - { \ - rst_section(global_test_result ": " $$0); \ - while ((rc = (getline line < ($$0 ".log"))) != 0) \ - { \ - if (rc < 0) \ - fatal("failed to read from " $$0 ".log"); \ - print line; \ - }; \ - printf "\n"; \ - }; \ - close ($$0 ".trs"); \ - close ($$0 ".log"); \ -}' -# Restructured Text title. -am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } -# Solaris 10 'make', and several other traditional 'make' implementations, -# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it -# by disabling -e (using the XSI extension "set +e") if it's set. -am__sh_e_setup = case $$- in *e*) set +e;; esac -# Default flags passed to test drivers. -am__common_driver_flags = \ - --color-tests "$$am__color_tests" \ - --enable-hard-errors "$$am__enable_hard_errors" \ - --expect-failure "$$am__expect_failure" -# To be inserted before the command running the test. Creates the -# directory for the log if needed. Stores in $dir the directory -# containing $f, in $tst the test, in $log the log. Executes the -# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and -# passes TESTS_ENVIRONMENT. Set up options for the wrapper that -# will run the test scripts (or their associated LOG_COMPILER, if -# thy have one). -am__check_pre = \ -$(am__sh_e_setup); \ -$(am__vpath_adj_setup) $(am__vpath_adj) \ -$(am__tty_colors); \ -srcdir=$(srcdir); export srcdir; \ -case "$@" in \ - */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ - *) am__odir=.;; \ -esac; \ -test "x$$am__odir" = x"." || test -d "$$am__odir" \ - || $(MKDIR_P) "$$am__odir" || exit $$?; \ -if test -f "./$$f"; then dir=./; \ -elif test -f "$$f"; then dir=; \ -else dir="$(srcdir)/"; fi; \ -tst=$$dir$$f; log='$@'; \ -if test -n '$(DISABLE_HARD_ERRORS)'; then \ - am__enable_hard_errors=no; \ -else \ - am__enable_hard_errors=yes; \ -fi; \ -case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ - am__expect_failure=yes;; \ - *) \ - am__expect_failure=no;; \ -esac; \ -$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) -# A shell command to get the names of the tests scripts with any registered -# extension removed (i.e., equivalently, the names of the test logs, with -# the '.log' extension removed). The result is saved in the shell variable -# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, -# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", -# since that might cause problem with VPATH rewrites for suffix-less tests. -# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. -am__set_TESTS_bases = \ - bases='$(TEST_LOGS)'; \ - bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ - bases=`echo $$bases` -RECHECK_LOGS = $(TEST_LOGS) -AM_RECURSIVE_TARGETS = check recheck -TEST_SUITE_LOG = test-suite.log -TEST_EXTENSIONS = @EXEEXT@ .test -LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver -LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) -am__set_b = \ - case '$@' in \ - */*) \ - case '$*' in \ - */*) b='$*';; \ - *) b=`echo '$@' | sed 's/\.log$$//'`; \ - esac;; \ - *) \ - b='$*';; \ - esac -am__test_logs1 = $(TESTS:=.log) -am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) -TEST_LOGS = $(am__test_logs2:.test.log=.log) -TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver -TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ - $(TEST_LOG_FLAGS) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GST_CFLAGS = @GST_CFLAGS@ -GST_LIBS = @GST_LIBS@ -GST_MAJORMINOR = @GST_MAJORMINOR@ -GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ -GStreamer_CFLAGS = @GStreamer_CFLAGS@ -GStreamer_LIBS = @GStreamer_LIBS@ -HAVE_DOXYGEN = @HAVE_DOXYGEN@ -HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PKG_CONFIG = @PKG_CONFIG@ -PYTHON = @PYTHON@ -PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ -PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ -PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ -PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ -PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ -PYTHON_PLATFORM = @PYTHON_PLATFORM@ -PYTHON_PREFIX = @PYTHON_PREFIX@ -PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ -PYTHON_VERSION = @PYTHON_VERSION@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ -SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ -SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ -STRIP = @STRIP@ -SWIG = @SWIG@ -SWIG_LIB = @SWIG_LIB@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -pkgpyexecdir = @pkgpyexecdir@ -pkgpythondir = @pkgpythondir@ -plugindir = @plugindir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -pyexecdir = @pyexecdir@ -pythondir = @pythondir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -TESTS = \ - test-cards.sh \ - test-lm.sh \ - test-tidigits-fsg.sh \ - test-tidigits-simple.sh - -TESTDATA = -EXTRA_DIST = $(TESTS) $(TESTDATA) -CLEANFILES = *.match *.log -all: all-am - -.SUFFIXES: -.SUFFIXES: .log .test .test$(EXEEXT) .trs -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/regression/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign test/regression/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -tags TAGS: - -ctags CTAGS: - -cscope cscopelist: - - -# Recover from deleted '.trs' file; this should ensure that -# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create -# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells -# to avoid problems with "make -n". -.log.trs: - rm -f $< $@ - $(MAKE) $(AM_MAKEFLAGS) $< - -# Leading 'am--fnord' is there to ensure the list of targets does not -# expand to empty, as could happen e.g. with make check TESTS=''. -am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) -am--force-recheck: - @: - -$(TEST_SUITE_LOG): $(TEST_LOGS) - @$(am__set_TESTS_bases); \ - am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ - redo_bases=`for i in $$bases; do \ - am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ - done`; \ - if test -n "$$redo_bases"; then \ - redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ - redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ - if $(am__make_dryrun); then :; else \ - rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ - fi; \ - fi; \ - if test -n "$$am__remaking_logs"; then \ - echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ - "recursion detected" >&2; \ - else \ - am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ - fi; \ - if $(am__make_dryrun); then :; else \ - st=0; \ - errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ - for i in $$redo_bases; do \ - test -f $$i.trs && test -r $$i.trs \ - || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ - test -f $$i.log && test -r $$i.log \ - || { echo "$$errmsg $$i.log" >&2; st=1; }; \ - done; \ - test $$st -eq 0 || exit 1; \ - fi - @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ - ws='[ ]'; \ - results=`for b in $$bases; do echo $$b.trs; done`; \ - test -n "$$results" || results=/dev/null; \ - all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ - pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ - fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ - skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ - xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ - xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ - error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ - if test `expr $$fail + $$xpass + $$error` -eq 0; then \ - success=true; \ - else \ - success=false; \ - fi; \ - br='==================='; br=$$br$$br$$br$$br; \ - result_count () \ - { \ - if test x"$$1" = x"--maybe-color"; then \ - maybe_colorize=yes; \ - elif test x"$$1" = x"--no-color"; then \ - maybe_colorize=no; \ - else \ - echo "$@: invalid 'result_count' usage" >&2; exit 4; \ - fi; \ - shift; \ - desc=$$1 count=$$2; \ - if test $$maybe_colorize = yes && test $$count -gt 0; then \ - color_start=$$3 color_end=$$std; \ - else \ - color_start= color_end=; \ - fi; \ - echo "$${color_start}# $$desc $$count$${color_end}"; \ - }; \ - create_testsuite_report () \ - { \ - result_count $$1 "TOTAL:" $$all "$$brg"; \ - result_count $$1 "PASS: " $$pass "$$grn"; \ - result_count $$1 "SKIP: " $$skip "$$blu"; \ - result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ - result_count $$1 "FAIL: " $$fail "$$red"; \ - result_count $$1 "XPASS:" $$xpass "$$red"; \ - result_count $$1 "ERROR:" $$error "$$mgn"; \ - }; \ - { \ - echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ - $(am__rst_title); \ - create_testsuite_report --no-color; \ - echo; \ - echo ".. contents:: :depth: 2"; \ - echo; \ - for b in $$bases; do echo $$b; done \ - | $(am__create_global_log); \ - } >$(TEST_SUITE_LOG).tmp || exit 1; \ - mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ - if $$success; then \ - col="$$grn"; \ - else \ - col="$$red"; \ - test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ - fi; \ - echo "$${col}$$br$${std}"; \ - echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ - echo "$${col}$$br$${std}"; \ - create_testsuite_report --maybe-color; \ - echo "$$col$$br$$std"; \ - if $$success; then :; else \ - echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ - if test -n "$(PACKAGE_BUGREPORT)"; then \ - echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ - fi; \ - echo "$$col$$br$$std"; \ - fi; \ - $$success || exit 1 - -check-TESTS: - @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list - @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list - @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) - @set +e; $(am__set_TESTS_bases); \ - log_list=`for i in $$bases; do echo $$i.log; done`; \ - trs_list=`for i in $$bases; do echo $$i.trs; done`; \ - log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ - $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ - exit $$?; -recheck: all - @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) - @set +e; $(am__set_TESTS_bases); \ - bases=`for i in $$bases; do echo $$i; done \ - | $(am__list_recheck_tests)` || exit 1; \ - log_list=`for i in $$bases; do echo $$i.log; done`; \ - log_list=`echo $$log_list`; \ - $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ - am__force_recheck=am--force-recheck \ - TEST_LOGS="$$log_list"; \ - exit $$? -test-cards.sh.log: test-cards.sh - @p='test-cards.sh'; \ - b='test-cards.sh'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test-lm.sh.log: test-lm.sh - @p='test-lm.sh'; \ - b='test-lm.sh'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test-tidigits-fsg.sh.log: test-tidigits-fsg.sh - @p='test-tidigits-fsg.sh'; \ - b='test-tidigits-fsg.sh'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test-tidigits-simple.sh.log: test-tidigits-simple.sh - @p='test-tidigits-simple.sh'; \ - b='test-tidigits-simple.sh'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -.test.log: - @p='$<'; \ - $(am__set_b); \ - $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -@am__EXEEXT_TRUE@.test$(EXEEXT).log: -@am__EXEEXT_TRUE@ @p='$<'; \ -@am__EXEEXT_TRUE@ $(am__set_b); \ -@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ -@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ -@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ -@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) check-TESTS -check: check-am -all-am: Makefile -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) - -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) - -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) - -clean-generic: - -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: check-am install-am install-strip - -.PHONY: all all-am check check-TESTS check-am clean clean-generic \ - clean-libtool cscopelist-am ctags-am distclean \ - distclean-generic distclean-libtool distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \ - uninstall uninstall-am - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/test/regression/chan3-dither.cepview b/test/regression/chan3-dither.cepview new file mode 100644 index 0000000..4d62600 --- /dev/null +++ b/test/regression/chan3-dither.cepview @@ -0,0 +1,2178 @@ + 6.458 -1.580 0.214 0.167 -0.124 0.162 0.065 0.054 -0.172 -0.098 -0.090 -0.040 0.030 + 6.529 -1.616 0.271 0.104 -0.230 0.093 -0.188 -0.055 -0.241 -0.199 -0.062 -0.003 -0.117 + 6.690 -1.368 0.277 0.005 -0.346 -0.015 -0.215 0.062 -0.190 -0.105 -0.101 -0.034 -0.190 + 6.789 -1.385 0.084 0.092 -0.400 0.165 -0.166 -0.186 -0.145 -0.009 -0.142 -0.059 0.014 + 6.523 -1.346 0.040 0.157 -0.312 -0.043 -0.124 -0.110 -0.091 0.102 -0.210 -0.062 0.054 + 6.647 -1.436 0.049 0.241 -0.227 -0.199 -0.085 -0.106 -0.201 0.073 -0.246 -0.196 -0.025 + 6.388 -1.354 0.013 0.138 -0.198 -0.165 0.074 0.004 -0.289 0.023 -0.262 -0.005 -0.033 + 6.059 -1.268 0.067 0.278 0.075 -0.116 -0.120 -0.168 -0.176 -0.016 -0.175 -0.157 -0.097 + 6.127 -1.158 0.016 0.243 -0.070 -0.100 -0.344 -0.120 -0.122 0.092 -0.098 -0.160 -0.068 + 5.980 -1.153 -0.229 0.063 0.169 -0.122 -0.262 -0.121 -0.071 0.140 -0.072 -0.038 0.020 + 5.682 -1.070 -0.169 -0.077 0.014 -0.089 -0.107 -0.220 -0.280 -0.089 -0.143 -0.125 -0.037 + 5.548 -0.810 0.050 0.024 -0.010 -0.205 -0.156 0.010 -0.006 0.103 0.015 -0.081 -0.032 + 5.739 -0.378 0.597 0.315 0.014 0.063 0.113 -0.150 -0.105 -0.071 -0.066 -0.020 -0.146 + 5.000 -0.074 0.385 0.163 -0.092 0.044 0.038 0.017 0.020 0.037 -0.005 -0.122 -0.222 + 4.927 -0.223 0.321 -0.017 -0.114 0.062 -0.043 -0.040 0.063 0.115 -0.091 -0.026 -0.192 + 4.490 -0.404 0.154 -0.036 -0.130 -0.037 0.006 -0.154 -0.156 -0.024 -0.157 0.015 0.060 + 4.276 0.005 0.047 0.050 0.089 -0.012 -0.014 -0.094 -0.150 0.209 -0.028 -0.159 -0.096 + 3.756 0.075 0.077 0.190 -0.004 -0.167 -0.349 -0.087 -0.138 0.101 -0.050 -0.167 -0.063 + 3.376 0.151 -0.236 -0.002 -0.054 -0.038 -0.240 -0.115 -0.089 0.125 0.114 -0.033 0.019 + 3.283 0.111 -0.274 0.065 -0.117 0.027 -0.274 -0.254 -0.216 -0.092 0.086 0.028 0.042 + 3.775 0.254 -0.043 -0.033 -0.271 0.005 -0.155 -0.194 -0.125 -0.037 -0.056 -0.159 -0.079 + 3.939 0.265 0.107 -0.010 -0.032 -0.047 0.013 -0.131 -0.069 -0.150 -0.139 -0.198 -0.229 + 3.709 0.340 0.171 0.265 -0.050 -0.048 -0.266 -0.315 -0.163 -0.029 -0.095 -0.216 0.018 + 3.844 0.257 0.306 0.148 0.006 -0.114 -0.159 -0.426 -0.209 -0.017 0.042 0.010 0.058 + 6.780 -0.459 0.712 0.007 -0.551 0.155 -0.063 -0.293 -0.027 -0.062 -0.136 0.019 -0.164 + 9.417 -0.219 0.605 0.300 -0.431 -0.151 -0.260 -0.208 -0.062 -0.299 -0.196 0.074 -0.286 + 10.578 0.200 0.330 0.572 -0.237 -0.480 -0.531 -0.002 -0.256 -0.320 -0.224 -0.047 -0.305 + 12.180 -0.191 0.303 0.567 -0.309 -0.556 -0.614 -0.056 -0.362 -0.316 -0.271 0.043 -0.256 + 13.369 -0.265 0.158 0.461 -0.378 -0.571 -0.597 0.003 -0.469 -0.268 -0.343 0.133 -0.288 + 13.751 0.016 -0.073 0.453 -0.387 -0.609 -0.711 0.037 -0.530 -0.191 -0.385 0.157 -0.249 + 14.173 0.092 -0.208 0.450 -0.436 -0.699 -0.730 0.009 -0.565 -0.070 -0.395 0.210 -0.213 + 14.364 0.115 -0.292 0.421 -0.432 -0.819 -0.712 0.045 -0.584 0.018 -0.387 0.235 -0.179 + 13.980 0.489 -0.567 0.446 -0.426 -0.781 -0.780 0.166 -0.605 0.025 -0.275 0.065 -0.038 + 13.954 0.713 -0.790 0.373 -0.348 -0.773 -0.795 0.074 -0.448 0.017 -0.217 -0.032 0.017 + 14.157 0.741 -0.760 0.194 -0.356 -0.555 -0.970 0.041 -0.495 0.178 -0.245 -0.111 -0.005 + 13.919 0.844 -0.590 -0.083 -0.340 -0.367 -0.827 -0.150 -0.673 0.299 -0.157 -0.269 -0.065 + 13.253 1.122 -0.445 -0.220 -0.491 -0.209 -0.517 -0.266 -0.966 0.212 -0.057 -0.198 -0.137 + 12.590 1.256 -0.278 -0.308 -0.474 -0.296 -0.292 -0.244 -1.016 0.060 -0.052 -0.138 -0.061 + 12.258 1.407 -0.397 -0.268 -0.477 -0.213 -0.334 -0.138 -1.120 0.086 -0.129 -0.054 -0.171 + 12.485 1.239 -0.336 -0.236 -0.387 -0.233 -0.377 -0.184 -1.112 0.157 -0.141 -0.098 -0.267 + 12.852 1.003 -0.348 -0.212 -0.191 -0.239 -0.457 -0.271 -0.984 0.216 -0.125 -0.222 -0.278 + 13.122 0.869 -0.512 -0.031 -0.016 -0.363 -0.649 -0.236 -0.788 0.216 -0.216 -0.326 -0.186 + 13.415 0.513 -0.513 0.221 0.160 -0.646 -0.729 -0.080 -0.644 0.118 -0.368 -0.199 -0.098 + 13.669 0.215 -0.481 0.509 0.026 -0.849 -0.680 0.113 -0.701 -0.005 -0.316 -0.090 -0.085 + 14.023 -0.128 -0.311 0.636 -0.188 -0.945 -0.533 0.142 -0.768 0.000 -0.275 -0.042 -0.107 + 13.859 -0.172 -0.235 0.698 -0.380 -0.895 -0.479 0.082 -0.726 0.000 -0.280 0.032 -0.110 + 13.834 -0.192 -0.080 0.585 -0.502 -0.866 -0.421 -0.047 -0.556 -0.066 -0.266 0.089 -0.148 + 13.802 0.010 -0.197 0.466 -0.542 -0.817 -0.461 -0.033 -0.458 -0.114 -0.217 0.126 -0.135 + 13.639 0.166 -0.325 0.337 -0.615 -0.689 -0.598 0.093 -0.418 -0.110 -0.198 0.187 -0.232 + 13.564 0.200 -0.392 0.189 -0.604 -0.638 -0.647 0.158 -0.379 -0.047 -0.277 0.238 -0.244 + 13.549 0.324 -0.549 0.148 -0.601 -0.533 -0.715 0.105 -0.250 -0.101 -0.230 0.143 -0.167 + 13.358 0.536 -0.689 0.061 -0.526 -0.501 -0.777 0.040 -0.205 -0.050 -0.284 0.138 -0.127 + 13.148 0.544 -0.556 -0.173 -0.310 -0.553 -0.777 -0.085 -0.177 0.039 -0.368 0.110 -0.055 + 12.791 0.398 -0.317 -0.383 -0.165 -0.575 -0.547 -0.476 -0.049 0.129 -0.457 0.037 0.029 + 12.749 0.083 -0.087 -0.370 -0.421 -0.109 -0.598 -0.629 -0.041 0.151 -0.310 -0.039 -0.105 + 12.917 0.379 0.033 -0.432 -0.681 0.292 -0.856 -0.488 -0.169 0.139 -0.280 0.142 -0.371 + 13.190 0.533 0.040 -0.566 -0.861 0.326 -0.810 -0.355 -0.413 0.290 -0.295 0.295 -0.418 + 13.190 0.492 0.218 -0.744 -0.939 0.240 -0.737 -0.194 -0.554 0.241 -0.286 0.469 -0.442 + 12.780 0.695 0.293 -0.856 -0.976 0.125 -0.623 -0.024 -0.658 0.044 -0.252 0.494 -0.396 + 12.526 0.665 0.472 -0.872 -1.007 0.056 -0.571 0.079 -0.696 0.016 -0.361 0.406 -0.262 + 12.121 0.854 0.386 -0.666 -1.153 -0.030 -0.379 -0.069 -0.514 -0.034 -0.485 0.418 -0.307 + 11.404 0.942 0.485 -0.517 -1.179 -0.111 -0.366 -0.073 -0.360 -0.062 -0.671 0.364 -0.281 + 10.918 0.877 0.609 -0.429 -1.132 -0.126 -0.387 -0.016 -0.334 -0.074 -0.769 0.295 -0.302 + 10.774 0.844 0.664 -0.402 -1.065 -0.195 -0.370 -0.010 -0.327 -0.145 -0.768 0.219 -0.373 + 10.731 0.749 0.724 -0.341 -1.018 -0.227 -0.399 -0.028 -0.321 -0.117 -0.719 0.177 -0.471 + 10.873 0.611 0.706 -0.365 -1.032 -0.228 -0.445 -0.093 -0.235 -0.051 -0.630 0.048 -0.480 + 11.283 0.587 0.496 -0.321 -1.069 -0.279 -0.461 -0.095 -0.157 -0.054 -0.651 0.063 -0.346 + 12.396 0.282 0.385 -0.563 -1.148 -0.212 -0.399 -0.030 -0.318 0.041 -0.496 0.056 -0.132 + 13.272 0.159 0.081 -0.800 -1.168 -0.149 -0.385 0.068 -0.318 -0.078 -0.370 0.227 -0.065 + 13.305 0.093 -0.007 -0.884 -1.211 -0.007 -0.451 0.061 -0.284 0.002 -0.314 0.273 -0.083 + 13.356 0.047 -0.060 -0.941 -1.228 0.084 -0.490 0.166 -0.273 0.048 -0.246 0.234 -0.158 + 13.397 0.068 -0.129 -1.003 -1.190 0.159 -0.542 0.261 -0.320 0.104 -0.202 0.222 -0.249 + 13.444 0.152 -0.238 -1.066 -1.135 0.200 -0.459 0.222 -0.324 0.124 -0.166 0.179 -0.289 + 13.488 0.079 -0.239 -1.099 -1.059 0.244 -0.408 0.168 -0.287 0.118 -0.068 0.064 -0.335 + 13.100 0.367 -0.396 -1.032 -0.994 0.251 -0.389 0.066 -0.238 0.078 0.044 0.012 -0.345 + 12.729 0.568 -0.536 -0.917 -0.871 0.218 -0.359 0.003 -0.215 0.052 0.117 -0.050 -0.340 + 12.065 0.587 -0.459 -0.774 -0.791 0.170 -0.393 -0.009 -0.233 0.060 0.131 0.031 -0.396 + 11.842 0.408 -0.470 -0.554 -0.672 0.174 -0.316 -0.244 -0.111 0.078 0.024 0.119 -0.508 + 11.775 0.363 -0.557 -0.286 -0.662 0.136 -0.403 -0.328 -0.064 0.233 -0.113 0.101 -0.530 + 11.653 0.296 -0.762 0.167 -0.511 -0.225 -0.502 -0.179 0.035 0.176 -0.249 0.150 -0.445 + 11.024 0.307 -0.785 0.470 -0.381 -0.382 -0.605 0.021 0.073 0.039 -0.339 0.297 -0.509 + 10.386 0.201 -0.369 0.595 -0.441 -0.476 -0.536 0.144 0.167 -0.243 -0.282 0.348 -0.543 + 9.855 0.137 0.034 0.172 -0.115 -0.500 -0.399 0.184 0.056 -0.324 -0.112 -0.063 -0.384 + 9.038 0.383 0.301 -0.006 -0.015 -0.395 -0.395 0.299 -0.334 -0.253 0.103 -0.326 -0.281 + 8.126 0.681 0.255 -0.018 0.040 -0.267 -0.463 0.347 -0.414 -0.087 -0.122 -0.322 -0.249 + 7.045 0.750 0.605 -0.023 -0.098 -0.297 -0.334 0.106 -0.170 -0.133 -0.348 -0.131 -0.163 + 6.880 0.538 0.701 -0.372 0.069 -0.395 0.046 -0.147 0.026 -0.108 -0.408 -0.164 -0.085 + 8.256 -0.259 0.480 -0.437 0.069 -0.212 0.103 -0.075 0.008 -0.263 -0.202 -0.035 -0.176 + 9.530 -0.399 0.062 -0.259 -0.191 -0.127 -0.102 -0.032 -0.039 -0.155 -0.252 0.098 -0.179 + 9.698 -0.407 0.176 -0.152 -0.063 -0.370 -0.289 -0.217 0.105 -0.164 -0.357 0.042 -0.098 + 10.738 -0.079 0.169 -0.211 -0.173 -0.375 -0.459 -0.344 -0.024 -0.031 -0.433 0.039 -0.095 + 11.355 -0.032 0.033 -0.264 -0.016 -0.375 -0.651 -0.474 -0.078 -0.061 -0.467 -0.015 -0.012 + 11.118 0.149 0.098 -0.415 -0.147 -0.228 -0.580 -0.503 -0.083 -0.027 -0.417 -0.088 -0.047 + 10.765 -0.097 0.340 -0.382 -0.122 -0.219 -0.571 -0.527 -0.008 -0.146 -0.272 -0.212 0.010 + 10.621 -0.875 0.441 -0.493 -0.004 -0.076 -0.164 -0.116 0.051 -0.078 -0.300 -0.177 0.011 + 10.450 -1.087 0.510 -0.545 -0.050 -0.211 -0.069 -0.108 -0.000 -0.033 -0.337 -0.227 -0.114 + 10.686 -1.132 0.499 -0.535 0.207 -0.042 0.015 -0.081 -0.042 -0.046 -0.293 -0.050 -0.211 + 10.825 -1.058 0.429 -0.612 0.338 -0.224 -0.297 -0.165 -0.065 -0.217 -0.201 -0.040 -0.115 + 11.215 -1.050 0.402 -0.657 0.231 -0.310 -0.171 -0.060 -0.095 -0.192 -0.209 -0.100 -0.098 + 11.643 -0.874 0.481 -0.438 0.234 -0.336 -0.038 -0.099 -0.017 -0.261 -0.221 0.070 -0.055 + 11.354 -1.394 0.316 -0.498 0.129 -0.316 -0.038 -0.102 -0.130 -0.381 -0.239 -0.026 -0.066 + 11.594 -1.505 0.276 -0.329 0.134 -0.258 -0.103 -0.134 -0.174 -0.100 -0.171 -0.014 0.010 + 11.021 -1.342 -0.012 -0.131 0.083 -0.675 0.008 -0.011 -0.202 -0.275 0.046 -0.004 -0.016 + 7.127 -0.422 -0.236 -0.075 0.447 -0.613 -0.047 0.077 -0.130 -0.323 0.077 0.064 -0.157 + 4.693 0.110 -0.056 -0.658 0.184 -0.241 0.066 -0.089 -0.119 0.003 -0.022 -0.048 -0.127 + 4.780 0.196 0.004 -0.769 0.003 -0.507 -0.090 -0.220 -0.217 -0.167 -0.084 0.058 0.074 + 8.864 0.027 -0.222 -0.089 -0.733 -0.513 -0.186 -0.190 -0.073 0.030 -0.184 -0.104 -0.027 + 11.560 -0.763 -0.385 -0.013 -0.785 -0.533 -0.023 -0.250 -0.208 -0.021 -0.183 0.011 -0.030 + 12.263 -0.484 -0.157 0.472 -0.416 -0.731 -0.299 -0.230 -0.248 -0.202 -0.085 0.004 -0.163 + 13.613 -0.086 -0.574 0.358 -0.481 -0.715 -0.650 -0.094 -0.197 -0.087 -0.237 0.247 -0.317 + 14.008 -0.107 -0.674 0.101 -0.523 -0.681 -0.728 0.008 -0.163 0.107 -0.317 0.274 -0.308 + 14.086 -0.072 -0.729 -0.109 -0.606 -0.645 -0.698 0.072 -0.044 0.198 -0.271 0.045 -0.221 + 14.227 -0.163 -0.701 -0.201 -0.567 -0.515 -0.759 0.126 -0.051 0.249 -0.313 -0.036 -0.239 + 14.401 -0.052 -0.765 -0.242 -0.599 -0.406 -0.762 0.205 -0.127 0.267 -0.345 -0.161 -0.222 + 14.351 -0.115 -0.712 -0.208 -0.661 -0.301 -0.864 0.187 -0.185 0.331 -0.405 -0.038 -0.302 + 14.139 -0.021 -0.706 -0.213 -0.664 -0.330 -0.905 0.182 -0.124 0.299 -0.425 0.023 -0.291 + 13.601 0.055 -0.634 -0.285 -0.611 -0.454 -0.954 0.142 -0.016 0.272 -0.391 0.096 -0.227 + 11.971 0.528 -0.410 -0.216 -0.382 -0.661 -0.786 -0.033 0.150 -0.035 -0.196 0.202 -0.126 + 10.061 -0.477 0.126 0.122 -0.450 -0.414 -0.304 0.063 0.149 -0.122 -0.356 0.038 0.052 + 10.824 -1.212 0.572 0.811 -0.355 -0.053 -0.273 -0.206 0.124 -0.113 -0.239 -0.007 -0.070 + 11.416 -1.457 0.704 0.879 -0.354 0.029 0.062 -0.179 -0.006 -0.086 -0.395 -0.064 -0.146 + 11.839 -1.776 0.767 0.720 -0.425 0.016 0.053 -0.143 -0.097 -0.035 -0.269 -0.103 -0.178 + 11.839 -2.278 0.306 0.475 -0.595 -0.141 0.069 -0.056 0.090 0.056 -0.295 -0.125 -0.177 + 11.990 -2.469 0.285 0.764 -0.489 -0.204 -0.157 -0.013 0.072 -0.077 -0.180 -0.034 -0.098 + 11.816 -2.356 0.161 0.506 -0.619 -0.198 -0.089 0.069 0.149 0.040 -0.040 -0.149 -0.026 + 12.318 -1.802 0.355 0.841 -0.181 -0.074 -0.038 -0.134 -0.020 -0.052 -0.226 -0.172 0.049 + 11.673 -1.128 0.318 0.731 -0.140 -0.367 0.012 0.004 0.023 -0.022 -0.302 -0.113 0.064 + 10.561 -0.632 0.158 0.566 0.050 -0.152 -0.114 0.019 0.048 -0.148 -0.206 -0.031 -0.018 + 11.260 0.555 -0.479 0.173 -0.371 -0.325 -0.301 -0.050 0.042 0.082 -0.170 -0.056 -0.036 + 11.446 0.889 -0.472 0.060 -0.320 -0.319 -0.455 -0.114 0.024 0.094 -0.441 0.178 -0.289 + 11.438 0.632 -0.430 0.093 -0.422 -0.251 -0.463 -0.231 0.092 0.195 -0.403 0.132 -0.231 + 10.804 0.537 -0.333 0.234 -0.364 -0.266 -0.316 -0.433 0.090 0.257 -0.402 0.038 -0.267 + 10.273 -0.030 0.255 0.390 -0.315 -0.328 -0.166 -0.320 -0.080 0.220 -0.463 0.019 -0.190 + 10.498 -0.216 0.285 0.332 -0.171 -0.384 -0.164 -0.225 -0.170 0.329 -0.530 0.061 -0.326 + 10.644 -0.078 -0.353 0.089 0.049 -0.079 -0.564 -0.276 -0.150 0.366 -0.261 0.076 -0.201 + 11.649 0.100 -0.437 -0.035 -0.121 -0.269 -0.648 -0.141 -0.120 0.302 -0.224 -0.022 -0.246 + 11.759 0.084 -0.521 -0.040 -0.270 -0.272 -0.741 -0.107 -0.072 0.431 -0.286 0.049 -0.349 + 12.239 0.166 -0.661 -0.092 -0.514 -0.286 -0.712 -0.138 0.032 0.393 -0.230 0.028 -0.292 + 12.284 0.352 -0.627 -0.186 -0.407 -0.404 -0.480 -0.332 -0.109 0.357 -0.287 0.043 -0.239 + 10.767 0.547 -0.318 -0.342 -0.249 -0.295 -0.348 -0.541 -0.278 0.261 -0.132 -0.179 -0.285 + 9.517 0.593 -0.239 -0.100 -0.209 -0.240 -0.298 -0.566 -0.455 0.234 -0.008 -0.188 -0.280 + 5.833 0.190 0.223 0.108 -0.103 -0.002 -0.167 -0.147 -0.108 0.244 -0.034 -0.252 -0.260 + 5.505 0.191 0.201 0.169 -0.270 0.077 -0.126 -0.222 0.059 0.211 0.002 -0.244 -0.273 + 5.349 0.288 0.488 0.263 -0.313 -0.250 -0.309 -0.337 -0.008 0.117 -0.069 -0.166 -0.097 + 5.451 -0.033 0.595 0.279 -0.310 -0.294 -0.264 -0.195 -0.071 0.236 -0.187 -0.126 -0.154 + 8.193 -0.581 0.501 -0.070 -0.252 -0.312 -0.322 -0.099 -0.199 -0.022 -0.354 -0.118 -0.212 + 8.853 -0.471 -0.007 0.013 -0.176 -0.210 -0.145 -0.083 0.064 0.189 -0.070 -0.174 -0.060 + 11.472 -0.423 -0.607 0.011 -0.410 -0.348 -0.420 -0.148 -0.021 0.152 -0.160 -0.132 -0.026 + 12.762 -0.073 -0.719 -0.157 -0.593 -0.619 -0.574 -0.110 0.007 0.318 -0.207 -0.095 -0.007 + 13.090 0.012 -0.876 -0.029 -0.625 -0.604 -0.496 -0.097 0.083 0.219 -0.295 -0.081 -0.003 + 13.442 -0.135 -0.928 0.001 -0.678 -0.534 -0.528 -0.043 0.081 0.210 -0.340 -0.043 -0.093 + 13.263 -0.125 -0.955 -0.052 -0.747 -0.420 -0.643 0.121 -0.058 0.342 -0.485 0.049 -0.126 + 13.499 -0.254 -0.941 -0.148 -0.748 -0.406 -0.687 0.216 -0.099 0.443 -0.624 0.009 -0.182 + 13.650 -0.077 -1.001 -0.178 -0.642 -0.419 -0.586 0.191 -0.137 0.430 -0.592 -0.112 -0.140 + 13.632 -0.017 -1.056 -0.296 -0.604 -0.344 -0.526 0.200 -0.242 0.424 -0.559 -0.183 -0.115 + 13.201 0.011 -1.165 -0.468 -0.606 -0.343 -0.467 0.220 -0.214 0.467 -0.632 -0.225 -0.111 + 13.214 -0.050 -1.082 -0.460 -0.678 -0.274 -0.523 0.250 -0.241 0.568 -0.603 -0.237 -0.130 + 13.499 0.004 -1.058 -0.445 -0.709 -0.171 -0.542 0.230 -0.284 0.545 -0.560 -0.289 -0.120 + 13.495 -0.112 -0.976 -0.553 -0.682 -0.183 -0.474 0.229 -0.322 0.491 -0.484 -0.331 -0.108 + 12.974 -0.032 -0.899 -0.644 -0.792 -0.116 -0.516 0.245 -0.337 0.624 -0.485 -0.406 -0.120 + 13.377 -0.030 -0.777 -0.639 -0.798 -0.078 -0.525 0.174 -0.399 0.611 -0.435 -0.362 -0.130 + 13.395 0.059 -0.631 -0.738 -0.725 -0.077 -0.576 0.089 -0.460 0.562 -0.316 -0.297 -0.193 + 12.558 0.213 -0.324 -0.972 -0.696 -0.054 -0.616 -0.030 -0.344 0.515 -0.234 -0.316 -0.197 + 12.310 0.234 -0.285 -1.020 -0.733 -0.113 -0.577 -0.094 -0.346 0.557 -0.206 -0.226 -0.214 + 11.933 0.686 -0.393 -0.917 -0.726 -0.208 -0.483 -0.372 -0.338 0.548 -0.266 -0.003 -0.186 + 11.893 0.344 -0.152 -0.811 -0.572 -0.197 -0.487 -0.523 -0.420 0.511 -0.387 0.147 -0.209 + 10.342 0.273 -0.009 -0.847 -0.475 -0.286 -0.464 -0.706 -0.398 0.676 -0.303 0.251 -0.126 + 10.541 0.371 0.064 -0.639 -0.275 -0.253 -0.363 -0.762 -0.478 0.306 -0.373 0.136 -0.218 + 6.905 0.578 0.098 -0.509 -0.370 -0.224 -0.412 -0.678 -0.354 0.526 -0.510 0.181 -0.258 + 5.618 0.678 -0.078 -0.168 -0.389 -0.230 -0.288 -0.031 0.117 0.374 -0.104 -0.084 -0.149 + 5.625 0.752 -0.041 -0.075 -0.406 -0.203 -0.365 -0.009 0.018 0.421 -0.091 -0.082 -0.018 + 5.206 0.550 -0.356 -0.341 -0.578 -0.281 -0.357 -0.063 0.003 0.472 -0.013 -0.085 -0.092 + 4.998 0.472 -0.366 -0.277 -0.449 -0.212 -0.404 0.062 0.003 0.234 -0.029 -0.248 -0.151 + 4.887 0.354 -0.244 -0.216 -0.553 -0.209 -0.108 0.049 0.079 0.409 0.081 -0.049 -0.080 + 6.730 -0.080 -0.541 0.103 -0.583 -0.489 -0.031 0.003 -0.092 -0.069 -0.189 0.109 -0.046 + 6.295 0.005 -0.539 -0.084 -0.650 -0.383 0.004 -0.155 -0.135 -0.079 -0.202 0.092 -0.067 + 4.975 0.201 -0.309 -0.098 -0.520 -0.270 -0.156 -0.114 -0.082 0.200 0.104 0.159 -0.111 + 4.986 0.165 -0.598 -0.014 -0.309 -0.201 -0.158 -0.111 0.063 0.298 0.044 0.030 0.021 + 5.239 0.193 -0.452 -0.176 -0.343 -0.213 -0.163 -0.259 -0.010 0.107 0.166 0.215 -0.100 + 5.085 -0.052 -0.529 -0.246 -0.300 -0.171 -0.056 -0.173 -0.178 0.157 0.135 0.059 0.028 + 5.249 0.143 -0.593 -0.176 -0.208 -0.096 -0.178 -0.008 -0.084 0.106 0.069 0.113 -0.056 + 5.355 0.081 -0.473 0.130 -0.155 -0.138 -0.308 -0.193 -0.121 0.238 0.166 0.108 -0.074 + 5.363 0.031 -0.498 -0.093 -0.231 -0.148 -0.283 -0.267 -0.186 0.187 0.103 0.019 -0.039 + 5.562 0.093 -0.552 -0.032 -0.332 -0.161 -0.151 -0.170 -0.206 -0.089 -0.121 0.170 -0.003 + 5.733 0.148 -0.444 -0.053 -0.126 0.040 -0.287 -0.284 -0.107 0.047 -0.049 0.088 -0.221 + 5.932 0.236 -0.388 -0.041 -0.220 -0.126 -0.254 -0.138 -0.174 0.099 0.026 0.072 -0.147 + 5.953 0.162 -0.354 0.092 -0.178 -0.173 -0.287 -0.253 -0.109 0.093 0.021 -0.119 -0.070 + 6.312 0.310 -0.129 0.031 -0.205 -0.102 -0.101 -0.146 -0.137 -0.013 -0.042 0.124 0.002 + 6.340 0.422 -0.184 -0.212 -0.227 0.069 -0.153 -0.259 -0.189 -0.134 0.121 0.032 -0.165 + 6.991 0.226 -0.127 -0.289 -0.176 -0.271 -0.051 -0.289 -0.149 -0.101 -0.246 -0.184 -0.012 + 8.542 0.353 0.132 -0.293 -0.115 -0.407 0.028 -0.348 -0.026 -0.147 -0.531 -0.357 -0.009 + 7.651 0.076 0.017 0.013 -0.135 -0.269 -0.047 0.060 -0.187 -0.138 -0.267 -0.167 -0.330 + 7.568 0.005 -0.070 -0.110 -0.213 -0.285 -0.105 -0.101 -0.173 -0.211 -0.232 -0.058 -0.391 + 7.060 -0.093 -0.383 -0.577 -0.479 -0.335 -0.030 -0.215 -0.177 0.039 -0.244 -0.117 -0.184 + 7.236 0.252 -0.468 -0.396 -0.419 -0.293 -0.029 -0.065 -0.221 -0.096 -0.427 -0.079 -0.075 + 7.289 0.143 -0.546 -0.454 -0.467 -0.303 -0.064 -0.028 -0.193 -0.275 -0.378 -0.219 -0.054 + 7.441 0.113 -0.637 -0.442 -0.330 -0.303 -0.266 -0.150 -0.187 -0.282 -0.565 -0.133 0.036 + 7.168 -0.280 -0.549 -0.342 -0.322 -0.189 -0.298 -0.227 -0.115 -0.227 -0.313 0.017 0.030 + 7.317 -0.734 -0.194 -0.049 -0.174 -0.083 -0.294 -0.352 -0.219 -0.179 -0.184 0.037 0.099 + 7.195 -0.401 -0.493 -0.240 -0.326 -0.263 -0.324 -0.217 -0.212 -0.352 -0.504 -0.061 0.058 + 6.459 0.515 -0.207 -0.495 -0.484 -0.334 -0.323 0.098 0.085 -0.186 -0.466 -0.291 -0.099 + 6.131 0.339 -0.093 -0.696 -0.567 -0.224 -0.128 -0.010 0.115 -0.106 -0.474 -0.163 -0.240 + 5.659 0.059 -0.041 -0.613 -0.362 -0.149 -0.025 0.089 0.015 -0.144 -0.319 -0.096 -0.349 + 5.638 -0.077 0.063 -0.378 0.017 -0.186 -0.277 -0.128 -0.078 -0.137 -0.152 -0.052 -0.361 + 5.828 -0.132 0.171 -0.328 -0.238 -0.210 -0.192 -0.237 -0.173 -0.164 -0.083 0.129 -0.158 + 5.892 -0.121 0.205 -0.386 -0.157 -0.199 -0.237 -0.288 -0.142 -0.244 -0.151 0.037 -0.165 + 5.746 -0.021 0.068 -0.355 -0.102 -0.225 -0.129 -0.134 -0.141 -0.136 -0.133 0.040 -0.187 + 5.656 -0.031 -0.046 -0.470 -0.268 -0.365 -0.277 -0.176 -0.087 -0.059 -0.054 0.080 -0.183 + 5.569 0.129 0.039 -0.442 -0.190 -0.204 -0.227 -0.210 -0.114 -0.060 -0.080 0.094 -0.132 + 5.541 0.054 0.037 -0.399 -0.218 -0.280 -0.321 -0.098 -0.098 0.092 -0.026 -0.033 -0.247 + 5.315 0.151 -0.228 -0.492 -0.309 -0.377 -0.267 -0.112 -0.074 0.043 0.004 0.060 -0.057 + 5.553 0.330 -0.108 -0.292 -0.387 -0.204 -0.089 0.014 0.021 -0.098 -0.039 0.047 -0.173 + 5.341 0.509 -0.131 -0.433 -0.450 -0.008 -0.023 0.120 -0.037 -0.183 -0.219 -0.073 -0.198 + 5.298 0.331 -0.306 -0.461 -0.474 -0.156 -0.093 0.156 0.166 0.020 -0.169 -0.176 -0.036 + 4.820 0.111 -0.387 -0.391 -0.424 -0.133 -0.167 0.207 0.242 0.149 -0.285 -0.147 -0.026 + 4.239 0.164 -0.207 -0.289 -0.304 0.082 -0.173 0.021 -0.082 -0.202 -0.190 -0.040 0.015 + 4.705 0.209 -0.231 -0.191 0.005 -0.146 -0.289 -0.261 -0.090 0.038 -0.107 0.103 -0.030 + 4.350 -0.138 -0.313 -0.141 -0.299 -0.151 -0.260 -0.106 0.014 0.144 -0.075 0.169 -0.017 + 2.609 0.327 -0.050 -0.249 -0.090 0.038 -0.071 -0.055 -0.176 0.140 0.134 0.035 0.104 + 2.588 0.222 -0.040 0.047 -0.132 -0.027 -0.068 -0.026 -0.140 0.109 0.171 0.122 -0.031 + 2.386 0.269 0.133 0.082 -0.131 -0.048 -0.297 -0.158 -0.062 0.073 0.071 -0.046 -0.107 + 2.728 0.403 0.055 0.003 -0.073 -0.028 -0.166 -0.220 -0.151 0.022 0.149 -0.007 -0.111 + 2.491 0.317 -0.101 -0.249 -0.057 -0.187 -0.265 -0.298 -0.084 0.129 0.293 0.048 -0.145 + 2.186 0.226 -0.053 -0.179 -0.119 0.052 -0.147 -0.264 -0.020 0.079 0.107 0.043 -0.042 + 2.127 0.406 -0.090 -0.253 -0.049 0.018 -0.110 -0.099 -0.150 0.138 -0.034 -0.113 -0.027 + 2.122 0.404 -0.249 -0.332 -0.138 -0.112 -0.166 -0.066 -0.205 0.017 0.013 0.043 0.024 + 1.884 0.275 -0.132 -0.150 -0.247 -0.132 -0.189 -0.001 0.043 0.085 0.075 0.030 0.005 + 1.900 0.454 -0.027 -0.082 0.026 0.082 -0.029 -0.045 -0.005 -0.006 0.078 0.073 0.090 + 2.585 0.846 0.208 0.047 0.032 -0.082 -0.184 -0.265 -0.237 -0.067 0.089 0.227 0.125 + 5.831 1.369 0.391 -0.083 -0.095 -0.239 -0.307 -0.174 -0.251 -0.058 -0.112 -0.100 -0.155 + 7.371 1.286 0.383 0.084 -0.107 -0.283 -0.357 -0.206 -0.324 -0.053 -0.100 -0.101 -0.225 + 6.683 1.461 -0.074 0.506 -0.181 -0.644 -0.152 -0.192 -0.438 0.130 -0.107 -0.173 -0.169 + 5.514 1.268 0.271 0.492 -0.194 -0.456 -0.184 -0.238 -0.335 0.050 0.041 -0.140 -0.127 + 4.052 0.307 0.744 0.449 -0.327 0.021 -0.285 -0.309 -0.332 0.010 0.055 -0.051 -0.160 + 2.622 0.292 0.354 0.039 -0.346 -0.078 -0.210 -0.332 -0.136 0.011 -0.007 -0.010 0.071 + 4.525 0.025 0.100 0.133 -0.464 -0.296 -0.045 -0.155 -0.153 -0.041 -0.128 -0.100 -0.047 + 8.005 -0.033 -0.403 0.011 -0.545 -0.275 0.106 0.057 -0.012 0.092 -0.226 -0.201 -0.191 + 5.282 -0.095 0.085 0.008 -0.395 -0.238 0.312 0.053 0.157 0.041 -0.231 -0.240 -0.193 + 4.006 -0.890 0.354 0.082 -0.145 -0.262 0.145 -0.135 -0.027 -0.126 -0.175 -0.054 -0.125 + 4.929 -0.886 0.216 0.069 -0.069 -0.307 -0.206 -0.048 0.117 0.028 -0.147 -0.035 -0.023 + 5.372 -0.910 -0.175 -0.115 -0.127 -0.453 -0.285 0.053 0.364 0.042 -0.174 0.070 -0.046 + 5.726 -0.640 -0.129 -0.071 -0.104 -0.474 -0.174 0.196 0.320 -0.038 -0.342 -0.095 -0.116 + 4.881 -0.346 -0.129 -0.036 -0.123 -0.435 -0.095 -0.055 0.147 0.079 -0.238 -0.097 -0.253 + 3.915 0.197 0.178 -0.092 -0.382 -0.172 0.114 0.157 -0.051 -0.059 -0.027 0.029 -0.046 + 3.666 0.638 0.312 0.217 -0.144 -0.095 -0.092 -0.058 -0.178 -0.028 -0.106 -0.184 -0.118 + 3.414 0.647 0.133 0.179 -0.040 -0.110 -0.099 -0.024 -0.137 -0.108 0.010 -0.120 -0.151 + 3.120 0.565 0.132 -0.015 -0.105 -0.114 -0.081 0.110 -0.192 -0.059 -0.007 -0.054 -0.128 + 3.397 0.541 0.078 0.220 -0.102 -0.151 -0.038 -0.216 -0.230 -0.009 -0.066 -0.159 -0.108 + 3.460 0.586 0.078 0.217 -0.292 -0.135 0.014 -0.039 -0.235 -0.174 -0.060 -0.080 -0.028 + 3.656 0.235 0.340 0.209 -0.275 -0.165 0.002 0.057 -0.013 -0.050 -0.042 0.018 -0.072 + 5.588 -0.342 0.456 0.229 -0.363 -0.249 0.097 -0.285 0.212 -0.194 -0.041 -0.099 -0.172 + 4.428 -0.249 0.570 0.111 -0.365 -0.137 0.092 -0.307 0.056 -0.252 -0.015 0.042 -0.137 + 4.532 0.455 0.219 0.230 -0.462 -0.072 -0.082 -0.051 0.092 -0.152 -0.180 -0.136 -0.104 + 3.553 0.301 0.209 0.169 -0.139 -0.081 0.029 -0.040 0.103 -0.233 -0.063 -0.169 -0.018 + 3.543 0.202 0.151 0.168 -0.276 -0.114 -0.021 -0.158 -0.013 -0.289 -0.140 -0.181 -0.081 + 4.407 0.612 0.114 -0.033 -0.379 -0.058 -0.074 0.139 0.120 -0.204 -0.224 -0.183 -0.077 + 4.197 0.312 0.195 0.130 -0.140 0.025 -0.048 0.069 0.022 -0.168 -0.291 -0.208 -0.187 + 4.593 -0.038 0.085 -0.096 -0.240 -0.121 -0.046 0.205 -0.074 0.173 -0.037 -0.004 -0.166 + 4.837 -0.395 0.113 -0.249 -0.204 -0.117 0.087 0.057 -0.137 -0.049 -0.212 -0.082 -0.077 + 5.251 -0.473 -0.034 -0.165 -0.027 0.027 0.052 -0.023 0.006 -0.023 -0.254 -0.009 0.033 + 5.486 -0.496 -0.188 -0.287 -0.153 -0.066 0.193 -0.022 -0.069 -0.018 -0.129 -0.133 -0.090 + 5.211 -0.763 -0.434 -0.524 -0.356 -0.334 0.083 0.050 0.127 0.217 -0.008 -0.039 0.073 + 4.408 -0.917 -0.248 -0.142 -0.130 -0.153 0.058 -0.106 -0.014 0.120 -0.064 -0.055 0.043 + 4.133 -0.697 -0.152 -0.125 -0.132 -0.151 -0.004 -0.223 -0.070 -0.024 -0.210 -0.054 0.147 + 3.252 -0.101 -0.112 -0.225 -0.197 -0.156 0.042 0.082 -0.031 -0.086 -0.124 0.047 0.141 + 2.881 0.343 -0.075 -0.306 -0.151 -0.015 -0.109 -0.098 -0.080 0.045 -0.133 -0.206 -0.107 + 2.024 -0.012 -0.210 0.159 0.078 0.079 -0.093 -0.057 -0.054 0.142 0.017 0.019 0.032 + 2.079 -0.055 0.059 0.134 -0.054 -0.113 -0.157 0.020 -0.113 0.002 0.064 0.008 -0.068 + 2.299 0.017 0.034 0.014 -0.010 -0.022 0.114 -0.113 -0.082 0.032 -0.056 -0.012 -0.152 + 3.051 -0.594 0.312 -0.209 0.092 0.124 -0.064 -0.088 -0.113 -0.127 -0.010 -0.035 -0.126 + 3.013 -0.562 0.269 -0.188 -0.035 -0.166 -0.118 0.023 -0.004 0.065 0.140 0.052 0.033 + 1.950 -0.038 -0.378 -0.032 -0.037 0.036 -0.100 0.001 -0.206 0.020 0.087 -0.057 -0.073 + 2.149 0.043 -0.302 -0.105 0.015 0.188 -0.046 -0.085 -0.134 -0.024 0.074 -0.091 -0.014 + 2.030 0.124 -0.182 0.105 0.033 0.211 -0.013 -0.201 -0.145 0.030 0.123 0.149 -0.018 + 2.019 0.063 -0.112 -0.064 -0.242 -0.031 -0.081 -0.081 0.022 -0.049 -0.016 -0.021 0.029 + 2.126 0.201 0.228 0.064 -0.122 0.122 -0.074 -0.163 -0.080 0.048 0.159 0.029 0.027 + 2.133 0.308 0.193 0.139 -0.003 0.082 -0.088 -0.062 -0.152 0.042 0.087 0.058 -0.038 + 2.346 0.333 0.080 -0.054 0.041 0.116 -0.074 -0.161 -0.269 0.027 0.102 0.095 -0.038 + 2.341 0.393 -0.056 -0.256 -0.246 -0.106 -0.080 -0.096 -0.100 0.082 0.148 0.108 -0.009 + 1.680 0.074 -0.083 -0.283 -0.009 -0.067 -0.184 -0.218 0.102 0.199 -0.007 0.098 -0.030 + 1.978 0.355 0.130 -0.056 -0.143 -0.041 -0.257 -0.170 -0.076 -0.031 0.094 0.017 -0.094 + 1.970 0.339 0.100 0.067 -0.009 -0.205 -0.250 -0.266 -0.256 0.049 0.117 -0.035 -0.077 + 2.038 0.273 -0.252 0.005 0.007 -0.074 -0.204 -0.338 -0.008 0.026 -0.032 0.021 -0.143 + 1.492 0.026 -0.183 0.050 0.122 0.213 -0.091 -0.114 0.129 0.107 -0.005 -0.055 -0.214 + 2.303 0.458 0.200 0.331 0.110 -0.120 -0.201 -0.100 -0.052 -0.014 0.135 -0.005 -0.087 + 2.215 0.748 0.219 0.119 0.171 -0.106 -0.387 -0.326 -0.082 0.018 0.072 -0.008 -0.156 + 4.989 -0.349 -0.171 0.070 0.161 -0.032 -0.428 0.147 -0.038 -0.174 -0.043 -0.050 -0.059 + 7.100 -0.562 -0.286 0.048 -0.032 -0.224 -0.545 0.293 0.063 -0.326 -0.105 -0.017 0.005 + 3.928 -0.639 -0.716 0.267 0.072 0.112 -0.507 0.189 -0.034 -0.291 0.090 0.068 0.018 + 2.035 -0.339 -0.407 0.011 0.124 -0.036 -0.162 0.010 -0.200 -0.182 0.113 0.185 -0.115 + 2.649 -0.238 -0.291 -0.093 0.082 0.132 0.001 0.034 -0.203 0.030 0.021 -0.038 -0.047 + 5.455 -0.747 -0.590 -0.121 -0.244 -0.083 0.022 0.132 -0.149 -0.081 0.201 0.166 -0.149 + 6.972 -0.898 -1.300 -0.143 -0.320 -0.293 -0.203 0.307 -0.032 -0.205 0.040 0.193 -0.261 + 8.820 -0.812 -1.130 -0.187 -0.077 -0.249 -0.140 0.061 -0.150 -0.094 0.072 0.184 -0.310 + 10.338 -0.546 -1.082 -0.244 0.042 -0.312 0.120 0.086 -0.090 -0.145 -0.168 0.013 -0.230 + 12.020 0.358 -0.982 -0.447 -0.103 -0.498 0.013 -0.106 -0.251 -0.027 -0.386 0.071 -0.240 + 13.169 0.836 -1.361 -0.356 -0.237 -0.376 -0.255 0.111 -0.162 0.006 -0.366 -0.075 -0.166 + 14.176 0.461 -1.720 -0.169 -0.351 -0.285 -0.186 0.265 -0.086 0.028 -0.376 -0.255 -0.064 + 14.008 0.482 -1.812 -0.253 -0.343 -0.274 -0.171 0.239 -0.040 -0.028 -0.322 -0.308 0.005 + 14.332 0.400 -1.759 -0.165 -0.466 -0.144 -0.255 0.283 -0.091 0.035 -0.345 -0.327 0.020 + 14.535 0.410 -1.635 -0.243 -0.579 -0.022 -0.330 0.245 -0.190 0.160 -0.361 -0.342 -0.064 + 14.518 0.662 -1.504 -0.354 -0.684 0.081 -0.306 0.178 -0.350 0.318 -0.308 -0.315 -0.244 + 13.705 1.233 -1.230 -0.365 -0.791 -0.083 -0.194 0.022 -0.488 0.274 -0.148 -0.232 -0.239 + 12.032 1.250 -0.829 -0.014 -0.706 -0.316 0.143 -0.081 -0.439 0.221 -0.256 0.085 -0.103 + 10.844 0.640 -0.503 0.309 -0.114 -0.137 0.447 -0.063 -0.560 0.111 -0.748 0.068 -0.124 + 10.759 0.593 -0.490 0.330 -0.128 -0.191 0.437 -0.087 -0.459 0.064 -0.697 0.045 -0.026 + 10.857 0.421 -0.436 0.305 -0.082 -0.068 0.371 -0.005 -0.555 -0.009 -0.759 -0.016 0.068 + 10.622 0.494 -0.451 0.360 -0.051 -0.072 0.399 0.048 -0.700 -0.019 -0.798 0.006 0.098 + 10.367 0.784 -0.534 0.370 -0.185 -0.079 0.269 0.227 -0.697 0.018 -0.687 -0.130 0.065 + 11.584 1.080 -0.441 -0.168 -0.352 -0.264 -0.200 -0.002 -0.668 0.066 -0.087 0.003 0.139 + 13.029 1.135 -0.983 -0.458 -0.570 -0.132 -0.397 -0.090 -0.581 0.364 -0.007 -0.114 -0.111 + 13.623 0.933 -1.286 -0.345 -0.704 -0.126 -0.546 -0.131 -0.386 0.470 -0.093 -0.315 -0.260 + 13.749 0.743 -1.210 -0.284 -0.471 -0.362 -0.498 -0.275 -0.075 0.456 -0.156 -0.358 -0.128 + 13.252 0.707 -0.887 -0.270 -0.137 -0.719 -0.412 -0.374 0.042 0.466 -0.392 -0.031 -0.033 + 11.665 0.270 -0.240 0.364 -0.230 -0.759 -0.472 -0.121 0.101 -0.018 -0.317 -0.057 -0.052 + 8.778 -0.001 -0.191 0.162 -0.363 -0.181 -0.450 -0.065 0.184 0.208 -0.134 0.055 -0.069 + 7.427 0.485 -0.658 -0.085 -0.387 -0.393 -0.047 -0.203 0.221 0.240 -0.231 -0.302 -0.116 + 7.948 -0.214 -0.615 -0.185 -0.484 -0.279 0.003 -0.061 0.391 0.317 -0.200 -0.321 -0.241 + 7.034 0.123 -0.404 -0.321 -0.431 -0.324 -0.016 -0.113 0.307 0.329 -0.224 -0.170 -0.060 + 10.636 -1.339 -0.306 0.005 -0.888 0.129 -0.219 -0.143 0.067 -0.196 -0.109 -0.138 -0.148 + 11.020 -1.741 -0.102 0.012 -0.931 -0.039 -0.115 -0.223 -0.077 -0.190 -0.081 -0.136 -0.117 + 11.050 -2.473 0.023 0.354 -0.365 -0.231 -0.040 -0.094 -0.037 0.030 -0.163 -0.176 -0.009 + 12.460 -1.736 -0.437 -0.080 -0.304 -0.398 -0.292 -0.147 -0.162 -0.139 -0.154 -0.003 0.052 + 12.012 -1.182 -0.318 0.407 0.125 -0.165 -0.406 -0.095 -0.213 -0.202 -0.194 -0.171 -0.013 + 11.487 0.143 -0.210 0.117 0.661 0.095 -0.249 -0.287 -0.187 -0.371 -0.376 -0.280 -0.255 + 11.432 0.730 -0.252 -0.133 0.275 -0.168 -0.380 -0.285 -0.142 -0.044 -0.048 -0.156 -0.372 + 11.297 1.214 -0.078 0.063 0.206 -0.046 -0.210 -0.245 -0.190 -0.030 -0.098 -0.277 -0.269 + 11.039 1.294 -0.045 0.213 0.072 0.083 -0.269 -0.309 -0.181 -0.059 -0.214 -0.072 -0.272 + 11.035 1.365 0.022 0.170 -0.090 0.062 -0.322 -0.182 -0.060 -0.130 -0.272 -0.105 -0.128 + 10.255 1.338 0.110 0.142 -0.069 0.126 -0.237 -0.187 -0.328 -0.220 -0.243 -0.129 -0.305 + 9.699 0.725 -0.231 0.033 0.037 0.218 0.002 -0.071 -0.363 -0.466 -0.130 0.044 -0.123 + 9.861 0.571 -0.556 -0.093 0.045 0.214 0.077 -0.115 -0.451 -0.415 0.003 0.106 -0.076 + 9.122 0.325 -0.762 -0.296 -0.021 0.453 0.031 -0.410 -0.586 -0.289 0.050 -0.013 0.030 + 8.449 0.651 -0.328 -0.026 -0.151 0.049 -0.245 -0.547 -0.405 -0.202 -0.037 0.088 -0.085 + 6.706 0.344 -0.236 -0.208 0.003 -0.014 -0.324 -0.519 -0.356 -0.005 0.114 -0.048 -0.109 + 6.181 0.086 -0.308 -0.123 0.097 -0.139 -0.120 -0.261 -0.343 -0.023 0.055 -0.225 -0.033 + 6.311 -0.308 -0.666 0.231 -0.148 -0.050 -0.286 -0.279 -0.131 -0.141 -0.095 -0.123 0.085 + 7.215 -0.372 -0.744 0.285 -0.227 -0.274 -0.432 -0.186 0.051 -0.165 0.157 -0.050 0.233 + 8.196 -0.633 -0.770 0.100 -0.495 -0.264 -0.293 -0.120 0.112 -0.106 0.264 -0.019 0.167 + 9.218 -0.552 -0.979 -0.156 -0.328 -0.232 -0.208 0.118 0.213 -0.299 0.059 -0.021 0.129 + 10.373 -0.185 -0.645 -0.116 -0.188 -0.290 -0.473 0.165 0.012 -0.084 -0.149 0.015 -0.028 + 10.630 -0.597 -0.899 -0.309 -0.168 -0.148 -0.200 0.292 -0.079 -0.250 -0.263 0.046 -0.102 + 11.223 -0.444 -1.177 -0.364 -0.057 -0.342 -0.026 0.372 0.069 -0.389 -0.214 0.175 -0.166 + 11.752 -0.455 -1.199 -0.194 0.009 -0.488 -0.011 0.071 -0.088 -0.323 -0.081 0.283 -0.155 + 12.116 -0.480 -1.241 -0.137 0.060 -0.308 0.045 0.084 -0.205 -0.258 -0.306 -0.046 -0.215 + 12.199 -0.474 -1.131 -0.208 0.142 -0.069 -0.008 0.033 -0.192 -0.294 -0.428 0.069 -0.162 + 13.021 0.187 -0.987 -0.337 -0.081 -0.274 -0.262 0.122 -0.191 -0.099 -0.484 0.008 -0.152 + 13.968 0.564 -1.407 -0.535 -0.162 -0.365 -0.238 0.221 -0.170 -0.089 -0.376 -0.014 -0.236 + 14.614 0.366 -1.682 -0.399 -0.260 -0.267 -0.366 0.370 -0.160 -0.007 -0.361 -0.168 -0.248 + 14.580 0.420 -1.645 -0.420 -0.343 -0.314 -0.354 0.334 -0.126 -0.009 -0.383 -0.292 -0.089 + 14.867 0.336 -1.417 -0.385 -0.361 -0.320 -0.476 0.399 -0.251 0.151 -0.431 -0.297 -0.161 + 14.901 0.459 -1.318 -0.568 -0.291 -0.345 -0.480 0.254 -0.284 0.311 -0.349 -0.342 -0.304 + 14.539 0.839 -1.242 -0.587 -0.341 -0.396 -0.450 0.047 -0.382 0.524 -0.324 -0.286 -0.464 + 14.336 1.039 -0.785 -0.912 -0.440 -0.407 -0.286 -0.002 -0.608 0.485 -0.301 -0.175 -0.362 + 13.910 1.125 -0.340 -0.947 -0.542 -0.339 -0.190 -0.267 -0.764 0.278 -0.225 0.113 -0.248 + 13.371 1.023 0.122 -0.823 -0.622 -0.230 -0.325 -0.295 -0.788 0.114 -0.428 0.304 -0.241 + 12.809 0.948 0.460 -0.817 -0.522 -0.234 -0.178 -0.345 -0.838 -0.067 -0.572 0.239 -0.189 + 12.319 1.034 0.504 -0.805 -0.411 -0.317 -0.140 -0.332 -0.758 0.009 -0.658 0.130 -0.217 + 11.435 1.268 0.359 -0.761 -0.187 -0.315 -0.033 -0.329 -0.765 0.049 -0.653 0.034 -0.252 + 10.609 1.613 -0.043 -0.627 0.165 -0.360 0.129 -0.462 -0.877 0.055 -0.529 -0.065 -0.364 + 10.680 1.361 -0.391 -0.197 0.487 -0.504 -0.038 -0.586 -0.698 0.091 -0.401 -0.406 -0.258 + 11.021 0.934 -0.563 0.365 0.392 -0.723 -0.346 -0.315 -0.489 0.146 -0.511 -0.455 -0.175 + 11.154 0.355 -0.422 0.631 0.150 -0.835 -0.067 -0.159 -0.613 -0.037 -0.309 -0.294 -0.222 + 11.108 -0.316 0.036 0.807 -0.167 -0.393 0.036 -0.348 -0.505 -0.041 -0.442 -0.296 -0.366 + 10.848 -0.389 0.449 0.503 -0.194 -0.363 -0.116 -0.176 -0.489 -0.019 -0.366 -0.348 -0.291 + 11.029 -0.467 0.695 0.379 0.046 -0.290 -0.191 -0.089 -0.532 -0.032 -0.305 -0.417 -0.364 + 11.952 -0.720 0.806 0.386 -0.193 -0.150 -0.326 0.072 -0.583 0.028 -0.345 -0.325 -0.306 + 12.689 -1.045 0.758 0.511 -0.102 -0.226 -0.475 0.058 -0.536 0.130 -0.296 -0.245 -0.284 + 12.837 -1.087 0.856 0.472 -0.197 -0.187 -0.348 0.124 -0.712 0.101 -0.267 -0.295 -0.278 + 12.984 -0.972 0.768 0.478 -0.229 -0.103 -0.357 0.156 -0.776 0.093 -0.294 -0.287 -0.229 + 13.012 -0.807 0.673 0.451 -0.297 -0.114 -0.431 0.193 -0.675 0.065 -0.334 -0.273 -0.196 + 12.854 -0.561 0.476 0.561 -0.347 -0.152 -0.493 0.116 -0.646 0.081 -0.268 -0.321 -0.199 + 12.990 -0.524 0.386 0.554 -0.358 -0.104 -0.522 0.027 -0.781 0.119 -0.275 -0.251 -0.195 + 12.840 -0.398 0.269 0.565 -0.291 -0.192 -0.456 -0.086 -0.788 0.031 -0.323 -0.130 -0.259 + 12.864 -0.420 0.237 0.648 -0.218 -0.349 -0.337 -0.299 -0.664 -0.104 -0.302 -0.128 -0.239 + 13.112 -0.448 0.174 0.445 -0.301 -0.187 -0.194 -0.282 -0.768 -0.331 -0.223 -0.011 -0.394 + 13.207 -0.413 0.148 0.242 -0.071 -0.467 -0.226 -0.286 -0.548 -0.248 -0.220 -0.157 -0.434 + 12.834 -0.422 -0.070 0.190 -0.117 -0.644 -0.243 -0.328 -0.235 -0.423 -0.258 0.062 -0.434 + 12.754 -0.406 0.041 -0.027 0.009 -0.658 -0.244 -0.291 -0.338 -0.455 -0.224 -0.049 -0.433 + 12.867 -0.642 0.261 -0.186 0.041 -0.561 -0.291 -0.223 -0.451 -0.518 -0.314 -0.058 -0.271 + 12.978 -0.537 0.228 -0.109 0.018 -0.656 -0.187 -0.242 -0.289 -0.528 -0.237 -0.093 -0.350 + 13.011 -0.545 0.212 0.009 0.043 -0.492 -0.314 -0.172 -0.470 -0.411 -0.249 -0.106 -0.397 + 13.119 -0.707 0.272 0.333 -0.057 -0.459 -0.163 -0.179 -0.468 -0.358 -0.187 -0.145 -0.396 + 13.055 -0.528 0.226 0.423 -0.129 -0.358 -0.297 -0.067 -0.539 -0.367 -0.178 -0.310 -0.338 + 12.993 -0.627 0.387 0.676 -0.289 -0.395 -0.209 -0.012 -0.616 -0.167 -0.246 -0.378 -0.295 + 12.880 -0.636 0.260 0.935 -0.444 -0.174 -0.272 0.075 -0.703 -0.037 -0.415 -0.236 -0.312 + 12.766 -0.743 0.297 0.902 -0.278 -0.207 -0.257 0.032 -0.703 0.029 -0.423 -0.227 -0.274 + 12.459 -0.629 0.233 0.749 -0.096 -0.358 -0.191 0.079 -0.684 0.092 -0.408 -0.199 -0.241 + 12.133 -0.437 0.096 0.692 0.085 -0.453 -0.212 0.165 -0.653 0.093 -0.406 -0.150 -0.234 + 11.774 -0.317 0.099 0.497 0.305 -0.445 -0.335 0.203 -0.625 0.119 -0.402 -0.170 -0.142 + 11.032 -0.050 0.091 0.287 0.446 -0.324 -0.379 0.127 -0.662 0.184 -0.450 -0.182 -0.009 + 10.556 0.071 0.151 0.179 0.411 -0.203 -0.275 -0.042 -0.689 0.284 -0.543 -0.202 0.095 + 10.343 0.142 0.104 0.060 0.442 -0.103 -0.332 -0.117 -0.654 0.373 -0.534 -0.264 0.037 + 10.313 0.109 0.225 -0.015 0.433 -0.083 -0.376 -0.126 -0.643 0.381 -0.472 -0.270 -0.050 + 10.589 0.042 0.138 0.081 0.427 -0.125 -0.413 -0.044 -0.725 0.428 -0.563 -0.236 -0.078 + 10.768 0.023 0.087 0.188 0.434 -0.222 -0.454 -0.014 -0.653 0.397 -0.645 -0.166 -0.103 + 10.933 0.006 -0.057 0.434 0.355 -0.292 -0.451 0.012 -0.587 0.315 -0.669 -0.141 -0.082 + 10.814 0.080 -0.150 0.601 0.384 -0.454 -0.379 0.012 -0.467 0.106 -0.620 -0.124 -0.158 + 10.848 -0.134 -0.060 0.655 0.455 -0.565 -0.330 0.066 -0.511 0.128 -0.575 -0.139 -0.143 + 10.724 -0.205 0.048 0.660 0.350 -0.558 -0.290 0.224 -0.679 0.171 -0.511 -0.191 -0.086 + 10.241 -0.206 0.126 0.631 0.358 -0.600 -0.192 0.249 -0.763 0.285 -0.570 -0.071 -0.264 + 9.987 -0.306 0.102 0.625 0.339 -0.517 -0.148 0.220 -0.645 0.065 -0.471 -0.189 -0.152 + 9.944 -0.397 0.276 0.539 0.253 -0.375 -0.184 0.115 -0.475 0.008 -0.513 -0.393 0.040 + 10.165 -0.011 0.228 0.350 0.326 -0.210 -0.308 -0.009 -0.391 0.160 -0.517 -0.578 -0.053 + 10.060 0.163 0.136 0.133 0.461 -0.200 -0.203 -0.135 -0.446 0.330 -0.324 -0.566 0.031 + 10.179 0.401 0.374 -0.251 0.210 -0.093 -0.195 -0.158 -0.534 0.335 -0.082 -0.363 0.042 + 10.482 0.878 0.359 -0.505 0.071 -0.149 -0.188 -0.254 -0.716 0.063 -0.070 -0.510 0.039 + 10.674 1.165 0.014 -0.456 -0.188 -0.138 0.047 -0.327 -0.569 0.011 0.045 -0.333 0.083 + 10.985 1.194 0.044 -0.449 -0.365 -0.403 0.201 -0.483 -0.277 -0.175 0.063 -0.321 0.151 + 11.304 1.216 0.019 -0.548 -0.656 -0.294 0.084 -0.394 -0.207 -0.195 0.024 -0.264 0.247 + 11.424 1.133 0.017 -0.446 -0.989 -0.203 0.039 -0.257 -0.084 -0.238 -0.106 -0.096 0.158 + 11.382 0.925 0.131 -0.528 -1.013 -0.347 0.103 -0.236 0.159 -0.325 -0.023 -0.126 0.066 + 10.913 1.170 -0.019 -0.525 -1.049 -0.320 0.041 -0.228 0.315 -0.403 0.057 -0.136 -0.125 + 11.315 1.169 -0.160 -0.669 -1.170 -0.014 -0.061 -0.096 0.067 -0.263 -0.016 -0.039 -0.151 + 11.754 1.077 -0.391 -0.774 -1.111 0.162 -0.002 -0.192 -0.046 -0.112 0.015 0.025 -0.253 + 11.653 1.180 -0.573 -0.891 -0.932 0.163 -0.064 -0.173 -0.047 -0.015 -0.047 0.074 -0.402 + 11.895 0.928 -0.727 -0.736 -0.863 0.152 0.020 -0.395 0.041 0.161 -0.104 0.120 -0.549 + 11.590 1.057 -0.976 -0.503 -0.736 0.147 -0.131 -0.429 0.073 0.201 -0.127 0.091 -0.580 + 11.501 1.053 -0.927 -0.505 -0.623 0.127 -0.389 -0.366 0.081 0.234 -0.154 0.124 -0.561 + 9.569 0.569 -0.341 -0.041 -0.340 0.263 -0.315 -0.362 0.086 0.110 -0.312 0.132 -0.352 + 9.357 0.651 -0.019 0.155 -0.451 0.034 -0.246 -0.340 -0.012 0.120 -0.424 0.114 -0.292 + 9.697 0.529 -0.188 0.248 -0.420 -0.098 -0.154 -0.343 -0.082 0.123 -0.380 0.056 -0.212 + 12.598 0.242 -1.067 0.005 -0.090 -0.420 -0.591 0.065 -0.269 0.501 -0.315 0.075 -0.365 + 12.535 0.485 -1.053 -0.088 -0.313 -0.279 -0.642 0.028 -0.192 0.459 -0.345 0.013 -0.367 + 12.381 0.624 -0.951 -0.122 -0.618 -0.235 -0.630 0.029 0.003 0.340 -0.353 0.011 -0.282 + 12.218 0.753 -1.033 0.032 -0.706 -0.220 -0.701 0.049 0.105 0.216 -0.342 0.085 -0.246 + 11.740 0.858 -0.761 0.097 -0.737 -0.201 -0.719 -0.134 0.101 0.213 -0.223 0.030 -0.169 + 11.105 1.074 -0.628 0.098 -0.449 -0.265 -0.652 -0.214 -0.131 0.277 -0.254 -0.090 -0.201 + 8.647 1.024 0.011 0.032 0.144 -0.140 -0.345 -0.139 -0.213 0.169 -0.175 -0.387 -0.336 + 8.681 0.897 -0.086 0.152 0.161 -0.084 -0.339 -0.009 -0.232 0.033 -0.258 -0.583 -0.061 + 8.846 0.795 -0.052 0.117 0.210 -0.318 -0.319 0.107 -0.371 0.192 -0.245 -0.602 0.048 + 8.948 0.694 -0.111 0.161 0.169 -0.317 -0.282 0.089 -0.364 0.234 -0.293 -0.552 0.026 + 8.960 0.617 -0.066 0.138 0.166 -0.351 -0.187 -0.009 -0.329 0.273 -0.330 -0.630 0.171 + 9.241 0.579 -0.146 0.080 0.219 -0.272 -0.129 -0.054 -0.428 0.315 -0.352 -0.489 0.092 + 11.549 0.272 -0.472 0.068 -0.032 -0.313 -0.525 0.062 -0.155 0.168 -0.272 -0.131 0.054 + 12.326 -0.026 -0.265 0.179 -0.460 -0.597 -0.554 0.095 -0.324 0.163 -0.049 -0.033 0.004 + 12.629 -0.197 -0.139 0.354 -0.790 -0.525 -0.464 0.058 -0.388 0.352 -0.174 0.010 -0.107 + 12.915 -0.279 -0.101 0.364 -0.817 -0.611 -0.488 0.094 -0.443 0.377 -0.157 0.016 -0.192 + 13.127 -0.390 0.062 0.293 -0.879 -0.475 -0.659 0.162 -0.511 0.449 -0.308 0.140 -0.257 + 12.885 -0.391 0.273 0.261 -0.942 -0.436 -0.586 0.044 -0.538 0.394 -0.247 0.094 -0.190 + 12.791 -0.512 0.432 0.330 -0.937 -0.410 -0.608 0.006 -0.534 0.336 -0.226 0.093 -0.193 + 12.614 -0.614 0.650 0.371 -0.919 -0.377 -0.525 -0.129 -0.502 0.281 -0.265 0.034 -0.169 + 12.017 -0.585 0.726 0.466 -0.756 -0.267 -0.508 -0.225 -0.536 0.229 -0.327 0.015 -0.137 + 11.267 -0.641 0.776 0.575 -0.741 -0.294 -0.353 -0.227 -0.607 0.212 -0.376 -0.101 -0.174 + 8.753 -0.637 0.557 0.447 -0.459 -0.239 -0.258 -0.093 -0.359 0.181 -0.310 -0.071 0.027 + 6.756 -0.300 0.521 0.181 -0.131 -0.183 0.100 -0.163 0.092 -0.008 -0.203 -0.234 -0.260 + 5.791 -0.193 0.750 0.171 0.070 -0.156 -0.146 -0.489 -0.015 -0.150 0.010 0.008 -0.285 + 4.900 0.389 0.257 0.037 -0.203 -0.210 -0.537 -0.231 -0.311 0.249 -0.157 -0.090 -0.091 + 4.958 0.350 0.149 0.083 -0.186 -0.210 -0.513 -0.152 -0.391 0.140 -0.030 0.094 -0.215 + 6.166 -0.115 -0.171 0.121 -0.445 -0.076 -0.342 -0.228 -0.143 -0.097 -0.098 0.115 -0.142 + 10.287 -1.278 -0.414 0.031 -0.511 0.003 -0.160 -0.167 0.150 0.053 -0.078 -0.112 -0.280 + 11.804 -1.488 -0.488 -0.021 -0.721 -0.076 -0.300 -0.278 -0.049 -0.145 -0.217 -0.218 -0.180 + 11.321 -0.915 0.843 -0.106 -0.617 0.039 -0.397 -0.264 -0.446 -0.076 -0.218 -0.207 -0.092 + 11.056 -0.096 1.112 0.072 -0.449 -0.382 -0.636 -0.007 -0.561 -0.168 -0.180 -0.060 -0.100 + 11.392 0.333 0.443 0.312 -0.426 -0.577 -0.696 0.088 -0.560 -0.226 -0.073 0.120 -0.278 + 11.469 0.447 -0.033 0.290 -0.366 -0.541 -0.705 0.007 -0.421 -0.177 -0.173 0.236 -0.393 + 11.602 0.305 -0.175 0.348 -0.461 -0.417 -0.848 -0.047 -0.409 -0.204 -0.223 0.287 -0.306 + 11.257 0.162 -0.397 0.469 -0.282 -0.228 -0.757 -0.024 -0.329 -0.166 -0.344 0.248 -0.301 + 6.982 -0.372 0.291 0.512 -0.152 -0.182 -0.791 -0.041 -0.059 -0.174 -0.114 0.317 -0.061 + 6.412 -0.225 0.282 0.635 -0.157 0.027 -0.616 0.140 -0.003 -0.008 -0.001 0.112 -0.002 + 5.704 0.188 -0.346 0.267 -0.032 -0.086 -0.344 -0.052 -0.095 0.068 -0.030 0.141 -0.110 + 8.183 0.088 -1.311 -0.272 -0.114 -0.095 -0.377 -0.238 -0.234 -0.222 -0.166 -0.115 -0.031 + 8.202 -0.811 -0.416 -0.149 -0.041 -0.082 -0.406 -0.114 -0.130 -0.199 -0.063 -0.275 -0.011 + 7.941 -0.687 0.128 -0.112 -0.334 -0.203 -0.290 0.036 -0.153 0.013 -0.146 -0.105 -0.009 + 9.037 -0.888 -0.163 0.129 -0.260 -0.156 -0.207 0.075 -0.018 -0.089 -0.178 0.033 -0.087 + 10.835 -0.624 -0.631 -0.010 -0.131 -0.136 -0.190 0.094 0.003 -0.114 -0.297 -0.146 -0.156 + 11.252 -0.274 -0.477 -0.028 0.036 -0.063 -0.161 -0.040 -0.030 0.003 -0.234 -0.240 -0.144 + 11.901 0.185 -0.203 0.167 0.175 -0.177 -0.331 -0.255 -0.038 -0.159 -0.327 -0.295 -0.118 + 12.889 0.323 0.006 0.456 0.068 -0.121 -0.487 -0.408 -0.114 -0.164 -0.308 -0.420 -0.379 + 12.295 -0.016 -0.146 0.426 0.136 0.143 -0.435 -0.216 -0.144 -0.120 -0.328 -0.336 -0.236 + 11.379 0.361 -0.352 0.367 0.358 0.046 -0.543 -0.303 -0.278 -0.254 -0.142 -0.429 -0.134 + 11.494 1.385 -0.992 -0.472 -0.047 -0.095 -0.717 -0.317 -0.229 -0.167 -0.066 -0.178 -0.157 + 10.826 2.063 -0.889 -0.391 -0.015 0.124 -0.684 -0.484 -0.152 -0.120 -0.138 -0.051 -0.124 + 9.641 2.226 -0.408 -0.450 0.103 0.252 -0.503 -0.360 -0.099 -0.242 -0.080 -0.193 -0.165 + 6.752 1.691 0.255 -0.075 0.078 0.056 -0.247 -0.077 -0.047 -0.053 -0.057 -0.024 -0.181 + 4.726 0.914 0.104 0.093 0.155 0.265 -0.193 -0.250 -0.133 0.047 0.037 0.041 -0.081 + 4.444 0.706 -0.032 0.017 -0.009 0.118 -0.138 -0.240 -0.062 0.004 0.070 0.058 -0.102 + 4.429 0.413 -0.115 -0.024 -0.096 -0.113 -0.353 -0.281 -0.095 0.181 0.131 0.045 0.097 + 4.322 0.263 -0.009 -0.072 0.087 -0.048 -0.339 -0.231 -0.069 -0.004 0.061 -0.059 -0.009 + 4.685 0.340 -0.036 -0.031 0.038 -0.023 -0.173 -0.296 -0.232 0.154 -0.138 -0.011 -0.075 + 7.301 -0.821 0.030 0.269 0.042 -0.103 -0.370 -0.048 -0.148 -0.182 0.064 -0.148 0.115 + 11.949 0.507 0.313 0.046 -0.393 -0.228 -0.160 -0.103 -0.334 -0.364 -0.141 -0.250 -0.047 + 13.325 1.250 0.110 0.474 -0.511 -0.402 0.183 -0.259 -0.392 -0.313 -0.230 -0.174 -0.120 + 11.355 0.943 0.418 0.581 -0.565 -0.515 0.069 -0.215 -0.226 -0.126 -0.281 -0.142 -0.080 + 9.617 -0.447 0.460 0.627 -0.095 -0.394 0.207 -0.334 -0.494 -0.192 -0.272 -0.117 -0.131 + 10.564 -0.336 0.276 0.406 -0.430 -0.204 -0.184 -0.345 -0.364 -0.262 -0.247 -0.176 -0.121 + 11.375 -0.394 0.201 0.722 -0.212 -0.387 -0.263 -0.070 -0.635 -0.136 -0.230 -0.197 -0.082 + 11.711 -0.593 0.273 0.737 -0.261 -0.238 -0.179 -0.156 -0.755 -0.015 -0.380 -0.135 -0.142 + 11.496 -0.610 0.296 0.783 -0.190 -0.422 0.016 -0.086 -0.873 -0.010 -0.321 -0.246 -0.100 + 10.798 -0.298 -0.085 0.652 0.259 -0.533 -0.185 0.181 -0.974 -0.119 -0.393 -0.204 -0.085 + 9.375 0.454 -0.086 0.513 0.542 -0.468 -0.311 0.424 -0.788 0.061 -0.244 -0.200 -0.132 + 6.855 0.683 0.259 -0.052 0.281 0.023 -0.096 0.090 -0.305 0.097 -0.078 -0.161 -0.050 + 8.810 -0.818 0.373 0.067 0.537 -0.351 -0.029 0.033 0.110 -0.214 -0.513 0.047 -0.034 + 9.127 -1.082 0.092 0.191 0.337 -0.236 0.066 -0.072 0.108 -0.335 -0.464 0.117 -0.059 + 8.172 -0.687 -0.169 0.067 0.155 -0.029 0.070 -0.085 0.082 -0.338 -0.389 0.043 0.015 + 11.382 -0.451 0.220 0.125 -0.100 -0.028 -0.106 -0.125 -0.192 -0.152 -0.156 -0.019 -0.059 + 12.338 1.087 0.193 -0.326 -0.398 -0.210 -0.181 -0.044 -0.187 -0.263 -0.196 -0.015 0.095 + 12.217 1.199 0.340 -0.037 -0.444 -0.054 -0.318 -0.193 -0.255 -0.309 -0.239 -0.160 0.003 + 11.684 1.316 0.505 -0.121 -0.615 0.183 -0.164 -0.151 -0.089 -0.370 -0.188 -0.183 -0.040 + 11.457 1.061 0.806 -0.378 -1.005 0.011 0.024 -0.323 -0.146 -0.504 -0.104 -0.210 0.044 + 10.755 1.079 0.864 -0.760 -0.809 -0.031 -0.022 -0.323 -0.085 -0.412 -0.086 -0.048 0.114 + 10.389 0.411 0.813 -0.772 -0.662 -0.085 -0.085 -0.157 -0.265 -0.312 -0.239 0.158 -0.197 + 7.438 0.309 0.663 0.004 -0.389 -0.016 0.063 0.080 -0.208 -0.139 -0.356 0.110 -0.092 + 5.754 0.217 0.596 0.438 -0.178 -0.217 -0.036 -0.171 -0.017 0.002 -0.227 0.014 -0.103 + 5.407 0.179 0.370 0.349 -0.039 -0.120 0.050 -0.283 -0.004 -0.197 -0.089 0.180 -0.085 + 8.733 -0.956 -0.070 0.414 -0.383 -0.022 -0.329 0.046 0.139 0.055 -0.113 -0.163 -0.129 + 10.833 -1.266 0.197 0.016 -0.410 0.056 -0.377 0.001 0.105 0.107 -0.109 -0.207 -0.200 + 10.009 -0.656 0.934 -0.084 -0.470 -0.011 -0.429 -0.292 -0.410 -0.135 -0.195 -0.050 -0.295 + 10.714 0.176 0.468 -0.075 -0.335 0.339 -0.099 -0.455 -0.558 -0.179 -0.039 0.123 -0.261 + 8.317 0.965 0.537 -0.310 -0.154 0.440 -0.178 -0.524 -0.383 -0.184 0.136 0.132 -0.220 + 5.658 0.918 0.346 0.152 -0.085 0.169 0.200 -0.236 -0.390 -0.158 -0.020 -0.270 -0.151 + 5.454 0.979 0.665 -0.090 -0.048 0.166 0.315 -0.063 -0.307 -0.275 -0.197 -0.019 -0.073 + 5.633 1.076 0.456 -0.018 -0.051 0.102 0.150 -0.131 -0.251 -0.134 -0.121 -0.154 -0.032 + 5.926 1.003 0.369 0.220 -0.241 0.002 0.241 -0.049 -0.295 -0.221 -0.047 0.061 -0.056 + 5.415 0.709 0.387 0.259 -0.049 -0.125 0.212 0.010 -0.087 -0.066 -0.039 -0.003 -0.253 + 5.204 0.726 0.360 0.076 0.054 -0.034 0.045 -0.012 0.003 0.015 -0.203 0.006 -0.117 + 4.853 0.660 0.162 0.226 0.294 0.130 0.207 0.043 -0.219 0.052 -0.108 -0.171 -0.140 + 10.083 0.531 0.477 0.095 -0.048 -0.088 -0.322 -0.181 -0.320 -0.279 -0.050 -0.180 -0.112 + 11.639 1.296 0.703 0.037 -0.097 -0.191 -0.429 -0.129 -0.274 -0.451 -0.159 -0.322 -0.121 + 10.325 1.142 0.805 0.051 -0.076 -0.005 -0.471 -0.179 -0.155 -0.180 -0.037 -0.242 -0.155 + 8.349 0.519 0.830 0.117 -0.182 -0.121 -0.269 -0.057 -0.179 0.030 -0.071 -0.258 -0.137 + 8.129 0.756 1.059 -0.601 -0.726 -0.403 -0.366 -0.118 -0.279 -0.047 -0.445 -0.080 -0.251 + 9.134 0.536 1.161 -0.491 -0.835 -0.285 -0.478 -0.119 -0.154 -0.022 -0.543 -0.054 -0.257 + 9.578 0.331 1.196 -0.588 -1.067 -0.263 -0.150 -0.053 -0.180 -0.351 -0.321 -0.199 -0.228 + 10.686 0.241 0.386 -0.289 -1.002 0.031 -0.223 -0.299 -0.013 -0.513 -0.413 -0.209 -0.200 + 11.300 0.566 -0.254 -0.057 -0.560 0.288 -0.147 -0.801 -0.055 -0.285 -0.358 -0.093 -0.139 + 11.794 0.646 -0.782 0.737 -0.342 -0.022 -0.482 -0.603 -0.125 -0.193 -0.289 -0.170 -0.131 + 11.913 0.158 -0.501 1.148 -0.341 -0.363 -0.551 -0.239 -0.366 -0.165 -0.397 -0.136 -0.102 + 11.352 -0.183 0.060 1.122 -0.197 -0.643 -0.216 -0.211 -0.618 0.097 -0.520 -0.058 -0.335 + 10.868 -0.603 0.502 0.883 -0.058 -0.341 -0.293 -0.165 -0.560 0.113 -0.416 -0.136 -0.278 + 10.294 -0.501 0.379 1.092 -0.383 -0.133 -0.189 -0.163 -0.518 -0.009 -0.250 -0.183 -0.265 + 10.088 -0.558 0.452 0.879 -0.206 -0.197 -0.049 -0.170 -0.662 0.048 -0.275 -0.134 -0.119 + 10.542 -0.826 0.462 0.843 -0.206 -0.298 -0.164 0.039 -0.631 0.134 -0.350 -0.133 -0.131 + 10.213 -0.586 -0.077 1.050 -0.014 -0.481 -0.152 0.131 -0.795 0.270 -0.265 -0.147 -0.225 + 7.925 0.198 -0.191 0.771 0.095 -0.385 -0.021 0.493 -0.745 0.097 -0.411 -0.240 -0.259 + 5.184 0.937 0.208 0.294 -0.079 0.045 0.292 0.190 -0.345 -0.021 -0.239 -0.150 -0.054 + 5.138 0.856 0.051 0.464 -0.157 -0.247 0.285 0.061 -0.335 0.156 -0.055 -0.235 -0.110 + 4.742 0.702 0.044 0.426 0.124 -0.138 0.144 0.023 -0.413 0.150 -0.137 -0.028 -0.034 + 4.537 0.517 -0.151 0.282 0.034 -0.105 -0.007 -0.098 -0.419 0.006 -0.139 -0.014 -0.075 + 4.011 0.459 -0.331 0.109 0.078 -0.055 0.057 -0.125 -0.380 0.110 0.032 0.138 -0.102 + 7.172 -0.373 -0.102 0.097 0.023 0.045 -0.070 -0.040 -0.120 -0.161 -0.062 -0.024 -0.112 + 12.427 1.041 0.148 -0.088 -0.209 -0.353 -0.319 -0.092 0.032 -0.163 -0.243 -0.179 -0.368 + 12.816 1.318 0.143 0.118 -0.198 -0.290 -0.342 -0.153 0.035 -0.214 -0.281 -0.133 -0.308 + 11.135 0.884 0.817 0.233 -0.296 -0.221 -0.169 -0.009 -0.041 -0.216 -0.302 -0.064 -0.343 + 9.090 -0.086 0.739 0.590 0.043 -0.068 0.071 0.004 -0.015 -0.191 -0.130 0.040 -0.262 + 7.857 -0.547 0.456 0.272 -0.070 0.010 0.051 0.084 -0.065 -0.168 -0.147 -0.004 -0.192 + 7.601 -0.882 0.354 0.362 0.147 -0.319 -0.163 -0.084 0.091 -0.106 -0.239 -0.026 -0.060 + 8.490 -0.520 0.173 0.298 0.022 -0.208 -0.046 0.011 0.001 -0.208 -0.271 -0.007 -0.051 + 9.776 -0.310 0.179 0.212 -0.047 -0.241 -0.038 0.029 0.111 -0.397 -0.314 0.035 -0.108 + 8.920 -0.383 0.292 0.170 -0.063 -0.304 -0.199 -0.132 0.050 -0.048 -0.348 0.121 -0.234 + 9.685 0.177 -0.235 0.450 -0.480 -0.505 -0.404 -0.217 -0.085 0.118 -0.305 0.057 -0.157 + 11.714 0.399 -0.550 0.075 -0.437 -0.390 -0.724 0.170 -0.047 0.172 -0.439 0.246 -0.236 + 12.050 0.422 -0.421 -0.053 -0.556 -0.308 -1.007 0.376 0.054 0.108 -0.246 0.308 -0.341 + 11.953 0.268 -0.281 0.263 -0.866 -0.117 -0.783 0.303 -0.012 0.029 -0.122 0.240 -0.439 + 12.237 0.213 -0.113 0.007 -0.659 -0.147 -0.842 0.495 -0.260 0.094 -0.105 0.175 -0.500 + 12.414 -0.078 -0.004 0.221 -0.724 -0.238 -0.589 0.361 -0.355 0.179 -0.021 -0.039 -0.385 + 12.094 -0.254 0.256 0.274 -0.863 -0.170 -0.397 0.137 -0.268 0.179 -0.014 -0.148 -0.287 + 11.288 -0.341 0.407 0.341 -0.877 -0.150 -0.183 -0.082 -0.155 0.250 -0.124 -0.148 -0.092 + 10.395 -0.195 0.496 0.014 -0.260 -0.356 -0.164 0.016 -0.078 0.019 -0.140 -0.194 -0.020 + 9.806 0.247 0.479 -0.245 0.174 -0.550 -0.189 0.178 -0.233 0.046 -0.126 -0.303 0.065 + 9.770 0.367 0.409 -0.292 0.191 -0.574 -0.218 0.285 -0.407 0.177 -0.180 -0.320 0.052 + 9.632 0.356 0.406 -0.307 0.245 -0.614 -0.140 0.286 -0.485 0.186 -0.256 -0.310 0.093 + 9.100 0.377 0.454 -0.144 -0.024 -0.737 0.178 0.140 -0.417 0.150 -0.228 -0.386 0.130 + 8.672 0.207 0.430 0.194 0.062 -0.920 0.081 0.140 -0.318 -0.004 -0.247 -0.342 0.153 + 8.799 0.317 -0.081 0.504 -0.096 -0.683 -0.241 0.159 -0.134 0.133 -0.142 -0.367 0.131 + 9.461 0.230 -0.336 0.264 0.240 -0.501 -0.477 -0.211 -0.122 0.131 -0.224 -0.284 0.070 + 9.739 -0.200 -0.031 0.011 0.191 -0.597 -0.423 -0.141 0.127 -0.022 -0.285 -0.144 0.028 + 9.074 -0.835 0.411 0.003 0.045 -0.535 -0.216 -0.018 0.089 -0.169 -0.213 -0.124 0.080 + 8.575 -1.213 0.503 0.019 0.111 -0.320 -0.271 -0.190 -0.060 -0.151 -0.194 -0.020 0.137 + 8.875 -1.126 0.339 -0.418 0.163 -0.311 -0.143 -0.044 -0.078 -0.140 -0.194 -0.035 -0.074 + 8.976 -1.375 0.384 -0.404 0.142 -0.287 -0.116 -0.019 -0.049 -0.020 -0.146 -0.124 -0.120 + 9.366 -1.386 0.268 -0.498 0.158 -0.359 -0.061 -0.008 -0.001 -0.042 -0.113 -0.099 -0.004 + 10.069 -1.109 0.495 -0.106 0.199 -0.343 -0.316 -0.133 0.068 -0.113 -0.191 -0.053 -0.090 + 10.990 -0.533 0.454 -0.121 0.047 -0.517 -0.370 -0.376 -0.167 0.080 -0.255 -0.072 -0.185 + 11.445 0.634 -0.146 -0.169 -0.489 -0.606 -0.341 -0.454 0.055 0.006 -0.378 0.191 -0.075 + 11.821 1.043 -0.738 -0.189 -0.429 -0.570 -0.399 -0.379 0.137 0.131 -0.352 0.210 -0.094 + 12.763 0.637 -0.913 -0.122 -0.471 -0.474 -0.470 -0.065 0.126 0.031 -0.265 0.029 -0.066 + 13.209 0.305 -0.873 -0.086 -0.479 -0.606 -0.526 0.143 0.108 0.018 -0.331 0.141 -0.127 + 12.880 0.236 -0.628 -0.184 -0.593 -0.567 -0.547 0.295 0.003 0.163 -0.461 0.190 -0.247 + 13.181 0.385 -0.789 -0.373 -0.571 -0.294 -0.775 0.233 0.175 0.052 -0.409 0.082 -0.242 + 13.209 0.434 -0.914 -0.440 -0.441 -0.427 -0.669 0.331 0.043 0.002 -0.267 -0.068 -0.155 + 13.574 0.066 -0.987 -0.253 -0.559 -0.449 -0.462 0.261 0.040 0.127 -0.396 -0.072 -0.123 + 13.058 0.359 -0.956 -0.441 -0.550 -0.299 -0.676 0.317 -0.061 0.284 -0.451 -0.086 -0.146 + 13.524 0.139 -1.084 -0.299 -0.558 -0.495 -0.467 0.271 0.028 0.200 -0.437 -0.129 -0.151 + 13.290 0.254 -1.039 -0.330 -0.614 -0.401 -0.490 0.287 -0.074 0.261 -0.396 -0.201 -0.141 + 13.654 0.205 -1.037 -0.378 -0.541 -0.379 -0.506 0.314 -0.192 0.323 -0.415 -0.243 -0.092 + 13.496 0.181 -1.052 -0.367 -0.596 -0.270 -0.584 0.322 -0.128 0.233 -0.367 -0.246 -0.022 + 13.145 0.377 -1.140 -0.474 -0.483 -0.302 -0.555 0.363 -0.131 0.236 -0.424 -0.211 -0.044 + 12.916 0.407 -1.040 -0.720 -0.374 -0.383 -0.417 0.291 -0.132 0.311 -0.411 -0.377 -0.035 + 13.068 0.506 -1.219 -0.660 -0.345 -0.302 -0.540 0.312 -0.160 0.383 -0.440 -0.426 -0.011 + 13.037 0.651 -1.218 -0.785 -0.286 -0.127 -0.582 0.181 -0.191 0.446 -0.419 -0.415 -0.043 + 12.900 0.860 -1.484 -0.600 -0.336 -0.332 -0.318 -0.024 -0.089 0.358 -0.314 -0.349 -0.167 + 12.268 0.918 -1.089 -0.922 -0.389 -0.188 -0.376 0.025 -0.189 0.427 -0.259 -0.423 -0.113 + 11.904 0.949 -0.867 -1.117 -0.402 -0.075 -0.460 0.015 -0.266 0.537 -0.218 -0.402 -0.176 + 12.205 0.904 -0.716 -0.994 -0.577 -0.022 -0.480 -0.021 -0.361 0.507 -0.099 -0.326 -0.238 + 11.893 1.098 -0.645 -1.109 -0.395 -0.062 -0.550 0.032 -0.371 0.332 0.037 -0.287 -0.227 + 11.337 1.112 -0.548 -1.052 -0.420 -0.141 -0.342 -0.147 -0.387 0.304 0.102 -0.214 -0.291 + 11.228 1.040 -0.606 -0.897 -0.520 -0.191 -0.364 -0.210 -0.438 0.354 0.174 -0.199 -0.299 + 11.475 0.934 -0.626 -0.618 -0.570 -0.157 -0.450 -0.230 -0.493 0.344 0.132 -0.189 -0.222 + 11.276 0.929 -0.582 -0.791 -0.334 -0.390 -0.418 -0.509 -0.299 0.186 0.061 -0.146 -0.181 + 9.295 0.823 -0.370 -0.761 -0.232 -0.449 -0.424 -0.664 -0.161 0.252 0.241 -0.074 -0.113 + 9.190 0.857 -0.255 -0.899 0.101 -0.385 -0.499 -0.718 -0.113 0.041 0.063 -0.068 -0.136 + 6.107 0.455 -0.412 -0.514 -0.080 -0.570 -0.451 -0.675 0.032 0.528 0.226 -0.052 -0.109 + 5.610 0.533 -0.667 -0.296 -0.096 -0.433 -0.414 -0.232 0.037 0.407 0.042 -0.102 -0.177 + 5.263 0.793 -0.657 -0.338 -0.267 -0.358 -0.297 -0.121 0.052 0.389 0.108 -0.054 -0.099 + 4.894 0.600 -0.646 -0.418 -0.322 -0.381 -0.397 -0.082 0.152 0.297 0.103 -0.015 -0.092 + 4.650 0.604 -0.496 -0.451 -0.221 -0.309 -0.459 0.064 0.193 0.341 0.061 0.002 -0.166 + 4.469 0.524 -0.408 -0.188 -0.347 -0.534 -0.523 -0.103 0.003 0.312 0.079 -0.051 -0.170 + 4.678 0.624 -0.594 -0.340 -0.125 -0.248 -0.282 0.030 0.196 0.221 0.007 0.062 -0.104 + 5.063 0.702 -0.454 -0.279 -0.136 -0.212 -0.333 -0.217 0.003 0.297 0.090 0.026 -0.278 + 4.959 0.364 -0.692 -0.237 -0.085 -0.127 -0.051 -0.236 0.062 0.269 0.038 0.121 -0.347 + 8.947 -0.232 -0.631 -0.491 -0.152 -0.326 -0.379 -0.180 -0.042 -0.055 0.050 -0.046 -0.202 + 9.304 -0.203 -0.379 -0.499 -0.029 -0.342 -0.413 -0.209 0.020 -0.048 0.063 -0.056 -0.253 + 8.362 -0.936 -0.215 -0.450 0.142 -0.285 -0.227 -0.187 -0.105 -0.003 0.083 -0.195 -0.079 + 9.424 -1.377 -0.422 -0.595 0.306 -0.172 0.005 -0.044 -0.066 -0.175 -0.055 -0.043 0.014 + 10.187 -1.235 -0.385 -0.590 0.087 -0.229 -0.155 -0.040 0.050 0.035 -0.004 0.007 0.057 + 10.469 -1.092 -0.200 -0.559 -0.001 -0.267 -0.279 -0.265 -0.081 -0.177 -0.088 0.014 0.020 + 10.581 -1.053 -0.156 -0.552 0.071 -0.234 -0.043 -0.148 -0.057 -0.185 -0.224 -0.096 -0.080 + 10.604 -0.849 -0.004 -0.721 -0.033 -0.337 -0.229 0.027 -0.096 -0.130 -0.179 0.034 -0.119 + 10.499 -1.006 -0.100 -0.615 -0.105 -0.317 -0.286 -0.050 0.138 0.027 -0.221 0.013 0.076 + 10.413 -1.058 -0.164 -0.659 -0.161 -0.372 -0.241 -0.104 0.071 0.112 -0.372 0.082 -0.076 + 10.355 -0.152 0.386 -0.455 -0.207 -0.450 -0.524 -0.487 0.032 0.094 -0.394 -0.061 -0.017 + 10.454 0.667 0.259 -0.356 -0.474 -0.115 -0.575 -0.788 0.106 0.001 -0.229 0.080 -0.019 + 11.092 0.648 0.183 -0.468 -0.599 0.141 -0.769 -0.807 0.048 0.265 -0.392 0.176 -0.130 + 11.966 0.382 0.152 -0.426 -0.516 -0.143 -0.680 -0.631 0.031 0.351 -0.478 0.119 -0.128 + 12.270 0.246 -0.091 -0.392 -0.456 -0.271 -0.650 -0.560 0.159 0.243 -0.402 0.070 -0.155 + 12.497 0.031 -0.235 -0.349 -0.486 -0.446 -0.588 -0.462 0.233 0.219 -0.352 0.066 -0.075 + 12.430 0.070 -0.268 -0.299 -0.544 -0.404 -0.612 -0.379 0.183 0.292 -0.364 0.039 -0.066 + 12.602 0.099 -0.313 -0.254 -0.636 -0.297 -0.570 -0.349 0.164 0.274 -0.335 -0.139 -0.023 + 12.733 0.094 -0.602 -0.270 -0.559 -0.247 -0.537 -0.375 0.210 0.223 -0.323 -0.143 -0.030 + 11.724 0.467 -0.523 -0.474 -0.620 -0.054 -0.718 -0.311 0.232 0.295 -0.277 -0.101 -0.029 + 12.620 0.220 -0.712 -0.366 -0.586 -0.238 -0.565 -0.297 0.194 0.256 -0.242 -0.199 -0.011 + 12.506 0.419 -0.648 -0.397 -0.591 -0.213 -0.498 -0.357 0.180 0.268 -0.297 -0.272 0.027 + 11.901 0.784 -0.739 -0.455 -0.543 -0.113 -0.595 -0.254 0.102 0.236 -0.257 -0.230 -0.088 + 11.447 0.945 -0.754 -0.614 -0.453 -0.089 -0.614 -0.373 0.181 0.304 -0.259 -0.249 -0.010 + 12.129 0.726 -0.923 -0.390 -0.492 -0.217 -0.518 -0.431 0.214 0.260 -0.190 -0.258 -0.023 + 12.380 0.646 -0.864 -0.347 -0.551 -0.154 -0.525 -0.335 0.133 0.153 -0.142 -0.266 -0.031 + 12.259 0.639 -0.928 -0.225 -0.636 -0.183 -0.317 -0.375 0.109 0.168 -0.219 -0.200 -0.092 + 12.049 0.541 -1.082 -0.207 -0.659 -0.171 -0.189 -0.415 0.240 0.097 -0.121 -0.246 -0.062 + 12.117 0.256 -1.080 -0.202 -0.620 -0.156 -0.088 -0.414 0.303 0.050 -0.108 -0.242 -0.211 + 11.589 0.191 -0.911 -0.177 -0.438 -0.169 -0.166 -0.319 0.374 0.076 -0.026 -0.127 -0.269 + 10.906 0.336 -0.830 -0.177 -0.270 -0.045 -0.091 -0.536 0.351 -0.093 0.027 -0.164 -0.416 + 9.578 0.559 -0.562 -0.354 -0.137 0.078 -0.124 -0.489 0.318 -0.139 0.034 -0.263 -0.454 + 8.489 0.610 -0.369 -0.376 -0.117 0.107 -0.013 -0.412 0.333 -0.175 0.143 -0.223 -0.446 + 7.304 0.230 -0.196 -0.228 -0.068 0.073 -0.010 -0.252 0.249 -0.229 -0.065 -0.104 -0.343 + 6.843 -0.141 -0.382 -0.502 -0.049 0.306 0.070 0.071 0.186 -0.029 -0.097 -0.245 -0.265 + 6.161 -0.260 -0.069 -0.453 -0.045 0.140 -0.174 -0.024 0.311 0.043 -0.103 -0.146 -0.286 + 5.613 -0.262 -0.205 -0.558 -0.150 -0.139 -0.147 -0.022 -0.076 0.079 0.003 -0.092 -0.065 + 5.307 -0.175 0.067 -0.299 -0.306 -0.243 -0.125 -0.073 -0.059 0.132 -0.126 -0.135 -0.012 + 5.285 -0.028 -0.232 -0.067 -0.070 -0.203 -0.352 -0.192 -0.068 0.127 -0.043 0.026 -0.157 + 5.831 -0.244 -0.060 -0.125 0.167 -0.335 -0.411 -0.079 0.001 0.273 -0.084 -0.016 -0.067 + 5.718 -0.466 -0.300 -0.141 0.258 -0.140 -0.443 -0.138 0.172 0.255 -0.254 -0.035 -0.037 + 5.545 -0.327 -0.335 -0.167 0.294 -0.118 -0.345 0.036 0.011 0.156 -0.164 -0.010 0.014 + 4.629 0.008 -0.362 0.004 -0.018 -0.121 -0.120 -0.054 -0.056 0.203 0.015 -0.114 -0.044 + 6.448 -0.302 -0.300 -0.004 -0.061 -0.085 -0.322 -0.036 0.017 -0.034 -0.117 -0.078 0.040 + 9.697 -0.420 -0.362 -0.243 -0.072 -0.081 -0.466 -0.121 -0.001 -0.153 -0.185 -0.117 -0.015 + 7.535 -0.308 -0.300 -0.082 0.043 -0.073 -0.475 -0.077 0.069 -0.190 -0.227 -0.129 -0.037 + 7.413 -0.229 -0.381 0.120 0.077 -0.016 -0.286 -0.081 -0.118 -0.317 -0.511 -0.185 0.033 + 7.881 -0.190 -0.538 -0.169 -0.083 -0.067 -0.355 -0.099 0.056 -0.172 -0.203 0.031 -0.149 + 8.241 -0.390 -0.537 -0.254 -0.001 -0.211 -0.331 -0.148 -0.186 -0.200 -0.127 0.045 -0.068 + 8.608 -0.520 -0.505 -0.189 0.172 -0.198 -0.287 -0.028 -0.086 -0.016 -0.346 -0.199 -0.097 + 8.857 -0.686 -0.546 -0.268 -0.096 -0.173 -0.255 0.108 -0.131 -0.148 -0.205 0.190 0.044 + 9.050 -0.641 -0.598 -0.212 -0.131 -0.341 -0.452 -0.027 -0.285 -0.307 -0.278 0.177 -0.035 + 9.052 -0.719 -0.425 -0.214 -0.114 -0.456 -0.353 -0.022 -0.181 -0.225 -0.233 0.177 -0.040 + 8.926 -0.782 -0.471 0.051 -0.063 -0.446 -0.410 -0.065 -0.061 -0.297 -0.354 0.086 -0.108 + 9.279 -0.729 -0.359 -0.224 -0.231 -0.450 -0.343 0.063 -0.074 -0.354 -0.162 0.123 -0.056 + 9.357 -1.006 -0.525 -0.150 -0.193 -0.325 -0.256 0.065 -0.009 -0.359 -0.217 0.176 0.117 + 9.325 -1.002 -0.495 -0.232 -0.197 -0.370 -0.295 -0.010 -0.022 -0.211 -0.165 0.269 0.158 + 8.997 -0.906 -0.431 -0.173 -0.165 -0.440 -0.426 -0.060 -0.101 0.037 -0.074 0.243 -0.074 + 8.713 -0.943 -0.491 -0.188 -0.272 -0.358 -0.247 0.085 -0.061 0.104 -0.190 0.206 -0.115 + 8.861 -0.984 -0.473 -0.134 -0.358 -0.400 -0.568 0.007 -0.009 0.036 -0.109 0.209 -0.034 + 9.168 -0.872 -0.181 0.038 -0.175 -0.554 -0.500 -0.090 0.001 -0.117 -0.348 0.010 -0.084 + 9.167 -0.967 -0.389 0.221 -0.252 -0.621 -0.506 -0.024 0.149 -0.058 -0.361 -0.007 -0.081 + 9.123 -1.212 -0.440 -0.039 -0.423 -0.569 -0.573 -0.008 -0.016 -0.091 -0.247 0.047 0.141 + 9.134 -1.156 -0.323 -0.197 -0.293 -0.365 -0.411 0.163 -0.025 -0.079 -0.187 -0.046 -0.020 + 8.890 -1.078 -0.261 -0.323 -0.253 -0.273 -0.465 0.152 0.145 0.114 -0.205 -0.047 -0.035 + 9.133 -1.137 -0.341 -0.129 -0.126 -0.444 -0.569 -0.000 0.171 -0.162 -0.214 0.074 -0.064 + 9.276 -0.968 -0.440 -0.286 -0.063 -0.431 -0.509 0.018 0.058 -0.131 -0.184 0.114 -0.214 + 10.044 -0.738 -0.290 -0.206 -0.168 -0.239 -0.431 0.246 0.044 0.115 -0.259 0.043 -0.057 + 9.973 -0.964 -0.340 -0.068 -0.135 -0.388 -0.408 0.298 0.032 0.062 -0.226 -0.051 -0.116 + 9.684 -1.140 -0.344 -0.094 -0.036 -0.707 -0.742 0.088 -0.119 -0.120 -0.243 0.113 -0.235 + 9.338 -1.395 -0.220 -0.040 -0.167 -0.612 -0.622 0.118 0.032 -0.001 -0.212 0.236 -0.051 + 8.999 -1.190 -0.305 0.101 -0.121 -0.658 -0.652 0.013 0.024 0.062 -0.100 0.244 -0.043 + 8.962 -0.736 -0.277 0.089 -0.038 -0.606 -0.661 0.049 -0.203 -0.044 -0.088 0.287 -0.059 + 8.541 -0.797 -0.471 0.041 0.081 -0.683 -0.693 -0.098 -0.112 -0.006 0.009 0.453 0.008 + 8.441 -1.054 -0.161 0.003 0.138 -0.740 -0.725 -0.172 -0.064 -0.023 -0.198 0.330 0.061 + 8.529 -0.872 0.037 0.200 0.188 -0.844 -0.763 -0.038 -0.138 0.006 -0.102 0.239 0.051 + 8.775 -0.784 0.030 0.035 0.010 -0.692 -0.607 -0.019 -0.174 0.003 -0.235 0.225 0.157 + 8.385 -0.787 0.191 0.077 0.173 -0.719 -0.762 0.081 -0.247 -0.157 -0.213 0.212 0.112 + 8.065 -0.620 -0.084 0.102 0.155 -0.418 -0.706 0.045 -0.277 -0.037 -0.267 0.113 0.067 + 8.132 -0.448 -0.074 -0.068 0.226 -0.165 -0.656 -0.108 -0.072 0.074 -0.026 0.270 -0.033 + 8.076 -0.416 0.174 0.064 0.311 -0.113 -0.523 -0.143 -0.061 -0.061 -0.219 0.192 -0.035 + 7.653 -0.657 0.174 -0.041 0.347 -0.465 -0.756 -0.078 -0.173 -0.195 -0.088 0.211 0.082 + 7.020 -0.640 0.272 0.021 0.316 -0.604 -0.579 -0.139 -0.118 -0.022 -0.220 0.190 -0.012 + 7.368 -0.539 0.090 0.077 0.481 -0.513 -0.451 0.032 -0.063 -0.243 -0.312 0.229 0.020 + 7.114 -0.394 -0.155 0.196 0.343 -0.318 -0.434 0.082 0.060 -0.114 -0.296 0.342 -0.009 + 6.740 -0.270 0.159 0.300 0.280 -0.170 -0.399 0.104 0.060 -0.034 -0.162 0.185 -0.161 + 6.369 -0.354 -0.137 0.157 0.276 -0.179 -0.438 -0.098 -0.116 -0.163 -0.229 0.139 0.095 + 5.833 -0.119 -0.096 0.340 0.345 -0.328 -0.385 -0.012 -0.032 -0.370 -0.244 0.130 0.004 + 5.315 -0.347 -0.090 0.089 0.469 -0.375 -0.421 0.185 -0.056 -0.321 -0.122 0.287 0.166 + 8.295 1.522 0.206 -0.141 -0.241 -0.593 -0.184 -0.103 -0.244 -0.073 -0.221 -0.093 -0.101 + 9.609 1.776 0.115 0.038 -0.407 -0.682 -0.113 -0.272 -0.203 -0.106 -0.201 -0.100 -0.168 + 6.939 1.597 0.558 -0.417 -0.660 -0.740 -0.354 -0.219 -0.130 -0.169 -0.241 0.066 0.075 + 6.329 1.059 0.737 -0.195 -0.637 -0.477 -0.278 0.136 0.087 -0.102 -0.018 0.000 -0.145 + 5.722 0.759 0.798 -0.000 -0.385 -0.311 -0.148 0.036 -0.132 -0.247 -0.021 0.055 -0.140 + 4.844 0.321 0.608 0.069 -0.160 -0.359 -0.303 -0.056 0.082 -0.007 0.012 0.028 -0.124 + 4.496 0.454 0.356 -0.054 -0.023 -0.037 -0.201 0.048 -0.161 -0.124 -0.051 -0.051 -0.163 + 4.434 0.314 0.150 0.118 -0.011 -0.008 -0.154 0.097 0.029 -0.024 -0.135 -0.176 -0.382 + 4.824 0.407 0.315 0.137 0.077 -0.110 -0.163 0.026 -0.239 0.038 -0.076 -0.031 -0.250 + 4.798 0.199 0.170 -0.033 -0.035 -0.131 -0.127 0.148 -0.165 -0.121 -0.078 0.100 -0.232 + 4.787 0.159 0.198 0.067 -0.088 -0.228 -0.232 0.086 -0.177 -0.107 -0.018 0.096 -0.085 + 4.866 0.293 0.046 -0.094 -0.085 -0.153 -0.228 0.035 -0.071 -0.246 -0.067 0.047 -0.068 + 5.444 0.693 0.266 -0.047 -0.086 -0.337 -0.317 -0.013 -0.016 -0.102 -0.070 -0.015 0.080 + 5.551 0.736 0.305 0.052 -0.201 -0.447 -0.384 -0.122 -0.049 -0.029 -0.188 -0.075 -0.137 + 5.678 0.726 0.249 -0.016 -0.073 -0.313 -0.340 -0.007 -0.126 -0.048 -0.184 0.092 -0.082 + 7.640 1.244 0.035 -0.409 0.125 -0.025 -0.437 -0.186 -0.222 0.042 -0.234 0.003 -0.026 + 6.811 1.083 0.189 0.015 0.046 0.023 -0.212 -0.254 -0.132 0.097 -0.215 -0.133 -0.170 + 5.365 0.125 0.182 -0.006 -0.337 -0.206 -0.373 -0.222 -0.136 0.032 -0.125 -0.170 -0.180 + 6.714 -0.233 0.069 -0.009 -0.283 -0.248 -0.396 -0.251 -0.167 -0.082 -0.172 -0.159 -0.093 + 7.455 -0.382 0.174 0.116 -0.229 -0.137 -0.356 -0.172 -0.128 -0.103 -0.126 -0.149 -0.066 + 7.109 -0.242 -0.006 0.015 -0.138 -0.258 -0.340 -0.211 -0.160 0.177 -0.028 0.024 -0.038 + 7.138 -0.207 0.186 0.005 -0.206 -0.304 -0.403 -0.421 -0.226 -0.222 -0.057 0.177 -0.054 + 8.205 -0.087 0.531 0.304 -0.197 -0.234 -0.445 -0.313 -0.250 -0.139 -0.110 -0.044 -0.052 + 8.309 -0.441 0.293 0.125 -0.177 0.106 -0.354 -0.276 -0.051 -0.185 -0.174 -0.060 -0.191 + 8.561 -0.139 0.293 0.124 0.048 0.007 -0.388 -0.319 0.017 -0.030 -0.242 -0.217 -0.075 + 8.092 0.324 0.028 0.011 0.156 0.045 -0.433 -0.351 -0.022 -0.236 -0.352 -0.094 -0.012 + 6.371 0.773 -0.219 0.041 0.207 0.063 -0.266 -0.376 -0.212 -0.023 -0.392 -0.165 -0.076 + 5.559 0.983 0.108 0.028 0.296 0.188 0.035 -0.139 -0.181 -0.130 -0.347 -0.327 -0.215 + 3.753 -0.051 0.174 0.246 0.239 0.023 0.025 -0.066 -0.007 -0.046 -0.174 -0.101 -0.101 + 3.514 -0.287 0.055 0.229 0.121 0.199 -0.179 -0.005 -0.169 -0.187 -0.024 -0.263 -0.077 + 3.831 -0.143 0.002 0.170 -0.047 0.071 -0.071 0.031 -0.109 -0.111 -0.088 -0.177 0.001 + 3.445 -0.125 -0.025 0.024 0.146 -0.010 -0.113 0.082 -0.181 -0.045 -0.125 -0.106 -0.027 + 3.971 0.301 0.068 0.306 -0.074 0.004 -0.120 0.005 -0.089 -0.051 -0.119 -0.032 -0.035 + 3.603 0.056 0.062 0.351 -0.125 0.065 -0.058 -0.046 -0.069 -0.061 -0.298 -0.015 -0.015 + 3.670 0.027 0.124 0.195 0.067 0.136 -0.014 -0.019 -0.083 -0.102 -0.218 0.201 0.007 + 3.545 -0.104 0.182 0.206 0.094 0.100 -0.084 -0.059 0.142 0.114 -0.076 0.150 -0.003 + 3.788 0.067 0.148 0.071 0.021 0.056 -0.125 0.046 -0.082 0.072 -0.165 -0.107 -0.063 + 4.071 0.210 -0.061 -0.107 -0.071 0.120 -0.176 -0.114 0.047 0.041 -0.063 0.029 -0.009 + 4.158 0.046 -0.072 0.040 -0.085 0.104 -0.134 -0.043 -0.175 -0.037 0.027 0.083 -0.119 + 4.377 0.212 -0.160 -0.058 0.039 -0.161 -0.291 0.046 -0.083 -0.114 -0.095 -0.006 -0.136 + 4.812 0.239 0.024 0.050 0.039 -0.203 -0.307 0.139 -0.012 -0.080 -0.149 0.006 0.044 + 4.742 0.082 -0.151 0.208 0.210 -0.187 -0.471 0.062 -0.027 0.009 0.013 0.103 -0.047 + 4.735 0.007 -0.169 0.163 0.164 -0.304 -0.386 -0.005 -0.007 -0.053 -0.031 0.191 0.091 + 5.256 0.116 -0.200 0.142 0.037 -0.387 -0.386 0.233 0.077 -0.088 -0.078 0.083 -0.092 + 5.458 0.155 -0.373 0.249 0.297 -0.318 -0.358 0.190 -0.019 -0.150 -0.092 0.045 -0.047 + 5.479 0.090 -0.536 0.286 0.258 -0.339 -0.396 0.190 0.095 -0.137 -0.115 0.175 -0.069 + 5.550 -0.043 -0.598 0.027 0.153 -0.253 -0.420 0.242 -0.012 -0.142 0.009 0.017 -0.008 + 5.318 -0.187 -0.399 0.153 0.308 -0.514 -0.468 0.180 0.024 -0.253 -0.211 0.092 0.016 + 5.391 -0.493 -0.615 0.166 0.488 -0.450 -0.513 0.113 -0.030 -0.173 0.170 0.234 -0.072 + 5.120 -0.732 -0.487 0.302 0.375 -0.382 -0.363 0.024 0.037 -0.075 0.186 0.155 0.001 + 5.283 -0.814 -0.381 0.267 0.499 -0.174 -0.341 0.056 -0.047 -0.196 0.121 0.072 -0.055 + 5.498 -0.695 -0.534 0.170 0.456 -0.275 -0.441 0.235 0.144 -0.304 0.099 0.270 -0.059 + 5.594 -0.666 -0.664 0.201 0.254 -0.292 -0.306 0.196 0.059 -0.330 0.140 0.171 -0.028 + 5.506 -0.752 -0.470 0.192 0.556 -0.315 -0.245 0.235 0.003 -0.205 0.029 0.140 -0.095 + 5.764 -0.758 -0.683 0.113 0.247 -0.077 -0.328 0.392 0.262 -0.068 0.067 -0.089 -0.121 + 6.038 -0.533 -0.554 0.013 0.102 -0.278 -0.361 0.369 0.203 -0.073 0.099 0.028 -0.085 + 5.643 -0.748 -0.721 0.099 0.290 -0.017 -0.277 0.035 0.171 -0.159 -0.106 0.050 -0.000 + 5.998 -0.498 -0.496 0.281 0.399 -0.020 -0.230 0.313 -0.023 -0.251 0.033 -0.027 -0.127 + 5.996 -0.511 -0.514 0.110 0.372 -0.161 -0.430 0.086 0.082 -0.232 -0.007 0.007 -0.079 + 5.725 -0.516 -0.299 0.250 0.231 -0.487 -0.370 0.151 0.188 -0.298 -0.018 0.007 0.050 + 5.440 -0.248 -0.276 0.564 0.283 -0.408 -0.346 0.122 0.097 -0.361 -0.134 0.146 -0.113 + 5.759 -0.337 -0.415 0.501 0.322 -0.281 -0.459 0.141 0.030 -0.382 -0.135 0.114 -0.071 + 5.757 -0.345 -0.393 0.335 0.205 -0.397 -0.538 0.257 0.252 -0.099 -0.103 0.005 -0.192 + 5.956 -0.188 -0.264 0.272 0.082 -0.394 -0.487 0.073 0.099 -0.213 0.026 -0.010 0.030 + 6.074 0.362 0.248 0.646 0.485 -0.293 -0.744 0.049 0.031 -0.163 0.176 0.014 -0.132 + 5.938 0.136 0.180 0.640 0.372 -0.118 -0.559 0.012 0.041 0.050 0.040 0.059 -0.057 + 5.720 -0.226 -0.225 0.562 0.203 -0.523 -0.391 0.233 0.126 -0.326 -0.007 0.071 -0.164 + 5.693 -0.249 -0.334 0.134 0.075 -0.500 -0.222 0.364 0.043 -0.382 -0.023 0.061 0.004 + 5.499 -0.379 -0.341 0.113 -0.035 -0.386 -0.246 0.210 -0.051 -0.321 -0.125 -0.050 -0.041 + 5.058 -0.404 -0.512 0.120 0.238 -0.406 -0.378 0.285 -0.199 -0.362 0.095 -0.056 -0.028 + 5.191 -0.268 -0.564 0.034 0.280 -0.424 -0.468 0.221 -0.034 -0.228 -0.034 0.151 -0.017 + 5.060 -0.111 -0.499 0.086 0.226 -0.299 -0.417 -0.014 0.045 -0.273 -0.093 0.182 -0.003 + 4.719 -0.040 -0.322 0.148 0.035 -0.328 -0.464 0.096 0.039 -0.133 -0.010 0.027 -0.100 + 4.362 0.048 -0.190 0.291 -0.157 -0.262 -0.467 0.153 0.138 -0.175 0.002 0.064 0.010 + 4.460 0.020 -0.123 0.097 -0.278 -0.116 -0.253 0.046 -0.093 -0.204 -0.222 0.067 0.094 + 5.128 0.062 -0.188 0.059 -0.196 -0.165 -0.407 0.132 0.146 0.033 -0.024 0.063 -0.113 + 4.760 -0.016 -0.089 0.177 -0.065 -0.070 -0.291 0.179 0.117 -0.123 -0.165 -0.037 -0.143 + 4.506 0.059 -0.101 0.300 -0.037 -0.324 -0.605 0.106 0.176 -0.046 -0.051 0.083 -0.160 + 3.845 -0.329 -0.153 0.583 0.301 0.019 -0.398 0.093 -0.006 -0.323 -0.169 0.050 0.021 + 3.650 0.040 -0.188 0.361 0.138 -0.005 -0.264 0.103 -0.069 -0.180 -0.123 0.132 0.006 + 3.370 0.412 -0.123 0.279 0.082 -0.065 -0.157 0.255 0.048 -0.006 -0.219 0.021 -0.238 + 3.019 0.412 -0.169 0.255 -0.170 -0.042 -0.303 0.114 0.168 -0.056 -0.164 -0.014 -0.067 + 3.515 0.580 -0.021 0.387 -0.015 -0.425 -0.426 0.054 0.142 0.098 -0.164 -0.010 -0.033 + 3.265 0.079 -0.080 0.193 0.058 -0.342 -0.459 0.049 -0.016 -0.001 -0.131 0.088 0.182 + 4.288 0.016 0.395 0.134 -0.031 -0.063 -0.231 -0.087 -0.156 -0.003 -0.187 -0.164 0.003 + 4.738 -0.574 0.339 -0.135 -0.253 -0.279 -0.341 -0.081 0.056 -0.105 -0.049 0.097 0.019 + 4.809 -0.441 0.433 0.111 -0.296 -0.051 -0.312 -0.146 -0.175 0.003 0.122 0.045 -0.023 + 6.048 -0.497 0.214 0.018 -0.022 -0.009 -0.230 0.021 -0.142 -0.061 0.009 0.211 -0.169 + 7.280 -0.102 0.208 -0.201 -0.035 0.002 -0.190 0.015 -0.103 0.002 -0.135 -0.048 -0.208 + 6.414 -0.148 0.308 -0.113 -0.061 -0.121 -0.225 -0.161 -0.210 0.022 -0.239 0.152 -0.041 + 5.375 -0.470 0.645 0.315 -0.193 -0.152 -0.372 -0.076 -0.179 -0.081 -0.042 0.084 -0.091 + 4.800 -0.538 0.643 0.210 -0.049 -0.151 -0.207 0.058 -0.164 -0.157 -0.104 0.005 -0.103 + 5.260 -0.404 0.404 -0.058 -0.226 -0.310 -0.332 -0.093 -0.120 -0.039 -0.191 0.076 -0.031 + 5.329 -0.287 0.318 -0.106 -0.255 -0.294 -0.264 -0.099 -0.056 0.015 -0.063 0.044 -0.124 + 5.610 -0.233 0.849 -0.261 -0.113 0.000 -0.165 0.043 -0.192 -0.128 -0.168 0.073 -0.277 + 6.151 -0.488 0.296 -0.107 -0.015 -0.064 0.069 -0.045 -0.241 -0.048 -0.204 -0.021 -0.135 + 7.159 -0.152 -0.024 -0.231 -0.187 -0.171 -0.022 -0.280 -0.017 -0.045 -0.083 -0.137 -0.008 + 6.310 0.442 -0.293 -0.588 -0.624 -0.199 -0.271 -0.196 0.017 0.130 -0.148 -0.039 0.018 + 6.746 0.660 -0.363 -0.538 -0.390 -0.183 -0.564 -0.205 0.204 0.115 -0.388 -0.141 0.011 + 7.486 0.469 -0.632 -0.273 -0.591 -0.489 -0.655 -0.413 0.189 0.214 -0.420 -0.107 0.070 + 8.083 0.141 -0.678 -0.149 -0.578 -0.557 -0.617 -0.470 0.008 0.287 0.049 -0.094 -0.008 + 7.848 0.250 -0.611 -0.027 -0.439 -0.428 -0.559 -0.465 -0.181 0.220 -0.269 -0.039 0.026 + 7.434 0.166 -0.213 0.035 -0.110 -0.518 -0.613 -0.418 -0.087 0.236 -0.501 0.077 0.167 + 6.671 0.280 -0.149 0.107 -0.186 -0.619 -0.429 -0.140 -0.052 0.180 -0.376 0.015 0.094 + 5.723 0.257 -0.018 -0.005 -0.045 -0.345 -0.256 0.021 0.009 0.072 -0.293 -0.109 0.023 + 4.807 0.089 -0.215 0.083 0.056 -0.276 -0.197 0.003 0.171 0.348 -0.161 -0.083 0.046 + 4.741 0.322 -0.072 0.060 -0.115 -0.277 -0.134 -0.026 0.054 0.241 -0.212 -0.203 -0.072 + 4.905 0.280 -0.003 0.077 -0.288 -0.306 -0.147 -0.121 0.033 0.160 -0.109 -0.156 -0.066 + 4.873 0.093 -0.038 0.096 -0.153 -0.235 -0.072 -0.206 -0.048 0.095 -0.243 0.103 0.083 + 5.088 -0.107 -0.181 0.243 -0.517 -0.404 -0.195 -0.324 0.044 -0.028 -0.417 0.062 -0.063 + 4.939 -0.349 -0.063 0.213 -0.360 -0.042 0.049 -0.198 0.189 0.114 -0.179 -0.071 -0.076 + 5.232 -0.302 0.061 0.173 -0.440 -0.480 -0.022 -0.317 -0.085 0.084 0.073 0.195 0.054 + 6.091 -0.189 0.170 0.440 -0.660 -0.487 -0.131 -0.427 -0.028 0.095 -0.042 0.208 0.030 + 6.783 -0.316 0.233 0.324 -0.804 -0.583 -0.176 -0.396 -0.185 -0.026 -0.210 0.217 0.016 + 7.098 -0.766 -0.095 0.364 -0.891 -0.636 -0.322 -0.425 -0.245 -0.015 -0.004 0.308 0.029 + 7.487 -0.687 -0.005 0.607 -0.796 -0.613 -0.251 -0.534 -0.400 -0.080 -0.011 0.265 0.017 + 7.569 -0.731 0.107 0.876 -0.577 -0.539 -0.242 -0.647 -0.462 -0.077 -0.053 0.284 0.040 + 7.751 -0.772 0.068 0.737 -0.460 -0.535 -0.404 -0.739 -0.396 0.063 -0.184 0.217 -0.048 + 7.465 -0.662 0.256 0.686 -0.611 -0.472 -0.463 -0.662 -0.462 -0.072 -0.220 0.253 -0.100 + 6.991 -0.389 0.337 0.635 -0.756 -0.621 -0.212 -0.574 -0.402 -0.096 -0.047 0.180 -0.121 + 6.776 0.220 0.697 0.812 -0.376 -0.450 -0.054 -0.450 -0.366 -0.137 -0.205 0.062 -0.181 + 6.354 0.681 0.873 0.701 -0.092 -0.364 -0.208 -0.306 -0.228 -0.059 -0.272 0.075 -0.261 + 5.587 0.162 0.815 0.803 -0.025 -0.242 -0.031 -0.181 -0.415 -0.071 -0.167 0.027 -0.195 + 5.397 0.043 0.506 0.533 -0.173 -0.240 0.036 -0.156 -0.463 -0.318 -0.259 0.064 -0.201 + 5.320 0.226 0.325 0.378 -0.167 -0.052 0.176 -0.128 -0.206 -0.177 -0.219 -0.049 -0.171 + 6.168 0.190 0.353 0.142 -0.267 -0.128 -0.098 -0.241 -0.182 -0.103 -0.125 -0.111 -0.144 + 8.403 1.441 0.555 -0.071 -0.236 -0.157 -0.177 -0.193 -0.349 -0.118 -0.265 -0.205 -0.170 + 7.120 0.983 0.658 0.147 -0.186 -0.075 -0.028 -0.141 -0.271 -0.258 -0.184 -0.157 -0.295 + 6.601 0.411 0.491 -0.302 -0.518 -0.189 -0.045 -0.102 -0.062 -0.140 -0.226 -0.021 -0.229 + 6.444 -0.207 0.089 -0.135 -0.147 -0.046 -0.053 -0.016 -0.020 -0.081 -0.224 -0.054 -0.127 + 6.561 0.284 0.049 0.301 -0.069 -0.178 -0.327 -0.229 -0.027 -0.156 -0.211 0.266 -0.168 + 7.083 0.516 0.118 0.385 -0.243 -0.261 -0.416 -0.386 -0.078 -0.264 -0.437 0.235 -0.076 + 7.574 0.715 -0.018 0.152 -0.055 -0.130 -0.619 -0.337 -0.090 -0.078 -0.373 0.182 0.036 + 7.625 0.621 0.063 -0.055 -0.062 -0.080 -0.529 -0.351 -0.138 -0.195 -0.480 0.021 0.042 + 7.430 0.952 0.077 -0.039 0.052 -0.003 -0.435 -0.382 -0.085 -0.209 -0.398 0.026 -0.114 + 6.319 0.840 -0.168 0.150 -0.030 -0.204 -0.399 -0.205 0.010 -0.219 -0.305 0.066 -0.091 + 5.767 0.569 0.032 0.214 -0.061 -0.119 -0.308 -0.165 -0.117 0.002 -0.231 0.040 -0.124 + 5.455 0.843 0.058 0.076 -0.060 -0.013 -0.150 -0.216 -0.174 -0.039 -0.259 -0.149 -0.154 + 5.584 0.965 -0.117 0.071 0.021 0.092 0.047 -0.107 -0.121 -0.117 -0.269 -0.080 -0.075 + 5.569 1.123 0.359 0.325 -0.027 -0.217 -0.128 -0.112 -0.040 -0.288 -0.422 -0.167 -0.199 + 5.454 1.332 0.456 0.396 -0.076 -0.199 0.057 -0.107 -0.092 -0.206 -0.267 -0.166 -0.158 + 5.561 0.743 -0.118 0.346 -0.212 -0.248 -0.270 -0.219 -0.061 -0.124 -0.064 0.134 -0.159 + 7.110 0.558 -0.172 0.362 -0.443 -0.251 -0.378 -0.274 -0.202 -0.196 -0.042 0.402 -0.151 + 7.872 0.083 -0.243 0.340 -0.813 -0.468 -0.413 -0.022 0.007 -0.024 -0.120 0.591 -0.155 + 8.340 -0.059 -0.283 0.455 -0.591 -0.676 -0.499 -0.221 -0.144 -0.136 -0.066 0.570 -0.210 + 8.496 -0.179 -0.310 0.505 -0.503 -0.830 -0.605 -0.051 -0.206 -0.181 0.049 0.609 -0.083 + 8.628 -0.283 -0.206 0.451 -0.631 -0.699 -0.628 -0.280 -0.133 -0.245 0.042 0.588 -0.232 + 8.517 -0.244 -0.149 0.242 -0.724 -0.654 -0.455 -0.111 0.005 -0.151 0.016 0.516 -0.176 + 8.225 -0.139 -0.153 0.032 -0.498 -0.668 -0.323 -0.053 -0.040 -0.097 0.077 0.351 -0.364 + 7.546 -0.099 0.116 0.159 -0.350 -0.717 -0.378 -0.004 0.017 -0.074 0.062 0.408 -0.142 + 7.692 0.437 -0.043 -0.123 -0.345 -0.353 -0.307 -0.155 -0.101 -0.112 0.033 0.271 -0.267 + 6.989 0.571 0.155 -0.039 -0.230 -0.413 -0.439 -0.204 -0.146 -0.253 -0.111 0.316 -0.175 + 6.588 0.416 0.338 0.058 -0.065 -0.213 -0.106 -0.040 -0.259 -0.261 -0.291 0.083 -0.191 + 6.197 0.443 0.479 0.363 -0.279 -0.444 -0.266 -0.136 -0.191 -0.176 -0.093 0.016 -0.128 + 6.024 0.151 0.455 0.167 -0.176 -0.429 -0.395 -0.082 -0.040 -0.267 -0.045 0.353 -0.090 + 6.341 0.189 0.598 0.185 -0.118 -0.240 -0.161 0.062 -0.045 -0.234 -0.078 0.175 -0.135 + 7.829 0.575 -0.023 0.169 0.208 -0.108 0.014 -0.173 -0.173 -0.214 -0.234 0.051 -0.208 + 8.506 0.678 -0.126 0.004 0.170 -0.078 0.139 -0.133 -0.100 -0.349 -0.333 0.065 -0.252 + 6.950 0.471 0.678 -0.119 -0.251 -0.342 -0.002 -0.071 -0.309 -0.058 -0.135 0.025 0.012 + 6.905 0.322 0.807 -0.106 -0.157 -0.208 0.178 -0.033 -0.248 -0.199 -0.217 -0.058 -0.218 + 6.438 -0.089 0.526 0.075 -0.044 -0.259 -0.102 -0.107 -0.124 -0.057 -0.223 0.140 -0.095 + 6.263 -0.170 0.595 -0.212 0.051 -0.139 -0.115 -0.026 -0.114 -0.143 -0.064 -0.110 -0.112 + 6.426 -0.208 0.501 -0.089 0.222 -0.280 -0.155 -0.296 -0.161 -0.180 -0.198 -0.156 -0.037 + 6.185 -0.338 0.330 0.117 0.047 -0.464 -0.166 0.082 -0.050 -0.171 -0.216 -0.104 -0.165 + 9.374 0.072 -0.068 0.400 -0.125 -0.618 0.030 -0.079 0.147 -0.419 -0.099 -0.138 -0.260 + 10.107 0.554 -0.250 0.218 0.010 -0.419 0.144 -0.108 0.149 -0.456 -0.207 -0.196 -0.254 + 9.607 1.268 -0.377 -0.007 0.280 -0.549 0.076 0.180 -0.212 -0.332 -0.313 -0.236 -0.267 + 9.976 1.239 -0.324 -0.037 0.303 -0.515 -0.133 0.453 -0.304 -0.380 -0.296 -0.277 -0.291 + 11.173 1.169 -0.356 -0.089 -0.024 -0.464 -0.282 0.215 -0.188 -0.277 -0.140 -0.138 -0.202 + 12.303 1.604 -0.444 -0.401 -0.090 -0.539 -0.443 0.069 -0.165 -0.281 -0.129 -0.092 -0.193 + 12.056 2.451 -0.736 -0.754 -0.339 -0.532 -0.540 0.211 -0.252 -0.327 -0.238 0.148 0.090 + 12.771 2.519 -0.636 -0.895 -0.266 -0.357 -0.826 0.446 -0.366 -0.352 -0.332 0.099 0.110 + 12.629 2.777 -0.689 -1.034 -0.271 -0.224 -0.872 0.370 -0.290 -0.251 -0.340 -0.020 0.193 + 12.896 2.610 -0.630 -1.112 -0.262 -0.031 -0.897 0.180 -0.228 -0.191 -0.270 -0.107 0.240 + 13.337 2.436 -0.707 -1.080 -0.164 -0.080 -0.812 0.076 -0.330 -0.112 -0.267 0.005 0.110 + 13.128 2.736 -1.022 -1.025 -0.003 -0.075 -0.931 0.080 -0.463 0.036 -0.254 0.031 0.038 + 13.192 2.491 -0.890 -0.986 0.089 -0.121 -0.897 -0.097 -0.367 0.041 -0.246 0.094 -0.096 + 13.250 2.286 -0.949 -0.817 0.210 -0.085 -0.986 -0.217 -0.275 -0.022 -0.168 -0.012 -0.144 + 12.586 2.106 -1.026 -0.404 0.347 0.141 -1.212 -0.304 -0.137 -0.112 -0.184 -0.088 -0.174 + 11.964 1.558 -0.887 -0.304 0.625 0.089 -1.206 -0.306 -0.007 -0.291 -0.203 -0.134 -0.131 + 10.821 1.149 -0.801 -0.139 0.568 0.030 -1.113 -0.129 0.169 -0.220 -0.345 -0.169 -0.171 + 9.516 0.706 -0.717 0.306 0.645 -0.081 -0.886 0.062 0.180 -0.414 -0.479 0.025 -0.139 + 9.377 0.717 -0.519 0.439 0.581 -0.339 -0.996 0.228 0.030 -0.429 -0.330 0.114 -0.107 + 11.484 0.124 -0.551 0.400 0.438 -0.336 -0.820 0.312 -0.419 -0.549 -0.099 0.030 -0.127 + 13.238 0.289 -0.466 0.371 0.318 -0.475 -1.197 0.406 -0.499 -0.471 -0.103 0.036 -0.233 + 13.655 0.519 -0.687 0.273 0.007 -0.570 -1.165 0.430 -0.268 -0.246 -0.034 0.135 -0.251 + 13.112 1.001 -0.857 0.179 0.094 -0.521 -1.159 0.368 -0.116 -0.216 -0.157 0.170 -0.262 + 11.161 0.949 -0.727 0.248 -0.048 -0.567 -0.805 0.091 0.112 0.019 -0.361 0.168 -0.020 + 10.379 0.969 -0.548 0.200 0.012 -0.282 -0.352 -0.476 0.176 0.230 -0.761 0.092 0.057 + 10.408 1.000 -0.540 0.053 0.025 -0.197 -0.286 -0.586 0.149 0.310 -0.713 0.017 -0.047 + 10.444 1.105 -0.651 0.002 -0.069 -0.227 -0.079 -0.576 0.089 0.241 -0.510 0.083 -0.208 + 10.544 1.064 -0.610 0.062 -0.294 -0.196 0.019 -0.482 -0.106 0.196 -0.391 0.202 -0.239 + 11.325 0.856 -0.506 -0.210 -0.210 -0.209 0.006 -0.411 -0.114 0.142 -0.401 0.228 -0.265 + 11.540 1.165 -0.760 -0.278 -0.142 -0.193 -0.147 -0.272 -0.089 0.072 -0.390 0.250 -0.142 + 11.530 1.213 -0.746 -0.065 -0.280 -0.372 -0.076 -0.173 0.017 -0.159 -0.233 0.063 -0.116 + 11.563 0.640 -0.658 0.217 -0.453 -0.430 -0.007 -0.090 -0.083 0.068 -0.284 -0.026 0.001 + 11.413 0.708 -0.692 0.171 -0.354 -0.544 -0.113 -0.066 -0.001 0.048 -0.167 -0.060 0.011 + 10.867 1.390 -1.026 0.094 -0.480 -0.700 0.014 -0.107 0.160 0.038 -0.075 -0.172 -0.072 + 10.673 1.907 -1.299 -0.090 -0.453 -0.882 0.124 -0.048 0.071 0.095 -0.224 -0.059 -0.147 + 10.693 1.879 -1.327 -0.204 -0.513 -0.937 0.180 0.049 0.093 0.168 -0.302 -0.008 -0.184 + 10.776 1.665 -1.386 -0.096 -0.453 -0.810 0.246 0.031 0.075 0.054 -0.271 -0.046 -0.076 + 10.864 1.744 -1.515 0.046 -0.604 -0.690 0.198 0.094 0.046 -0.007 -0.318 -0.016 -0.069 + 10.732 1.663 -1.418 -0.074 -0.393 -0.716 0.120 0.165 -0.031 -0.089 -0.204 -0.060 -0.087 + 11.886 0.841 -0.854 -0.584 -0.528 -0.563 0.089 0.396 -0.395 -0.041 0.185 -0.208 0.049 + 12.149 0.725 -0.817 -0.698 -0.549 -0.408 -0.014 0.283 -0.363 0.080 0.196 -0.215 -0.115 + 11.383 0.828 -0.653 -0.917 -0.575 -0.274 -0.386 -0.021 -0.434 0.091 -0.004 -0.124 0.036 + 8.522 0.741 -0.460 -0.327 0.176 -0.338 -0.258 -0.053 -0.381 0.134 0.022 -0.039 0.053 + 8.744 -0.011 -0.393 -0.236 0.420 -0.462 -0.132 -0.109 -0.062 0.024 -0.092 -0.101 -0.123 + 9.912 -0.464 -0.634 -0.516 0.283 -0.524 -0.293 -0.116 -0.218 -0.003 -0.071 -0.000 0.035 + 8.868 -1.254 0.129 -0.416 0.090 -0.355 -0.227 -0.245 0.026 0.035 -0.067 -0.179 0.043 + 9.462 -1.898 0.415 -0.270 0.309 -0.263 -0.362 -0.129 -0.049 -0.097 -0.106 -0.135 -0.090 + 9.768 -1.761 0.445 -0.483 0.368 -0.299 -0.177 -0.048 -0.018 0.094 -0.038 0.034 -0.096 + 9.380 -1.865 0.201 -0.487 0.196 -0.312 0.040 0.108 0.069 -0.032 -0.266 -0.021 0.018 + 7.905 -1.453 0.282 -0.775 0.174 -0.584 -0.285 0.192 0.034 -0.061 -0.204 -0.030 -0.201 + 6.415 -0.508 0.283 -0.148 0.064 -0.476 0.021 0.029 -0.037 0.141 -0.052 -0.194 -0.169 + 5.941 0.093 -0.133 -0.125 0.079 -0.394 -0.058 -0.092 0.053 0.101 0.069 -0.075 -0.083 + 6.409 -0.117 -0.199 -0.145 0.370 -0.334 -0.180 -0.165 -0.113 0.095 -0.135 0.058 -0.012 + 9.487 -0.737 -0.313 -0.433 0.157 -0.416 -0.172 0.075 -0.315 -0.106 -0.285 0.067 -0.254 + 10.903 -0.998 0.044 -0.588 -0.076 -0.399 -0.378 -0.033 -0.311 -0.159 -0.205 0.043 -0.072 + 10.524 -0.886 0.107 -0.409 -0.295 -0.286 -0.498 -0.088 0.205 -0.094 -0.086 -0.032 0.192 + 11.672 0.727 -0.455 0.064 -0.214 -0.204 -0.546 -0.240 -0.079 -0.094 -0.184 -0.194 0.101 + 11.099 1.375 -1.006 0.366 -0.157 -0.421 -0.348 -0.466 -0.070 -0.013 -0.273 -0.007 -0.029 + 10.262 1.194 -0.875 0.303 -0.043 -0.421 -0.205 -0.458 -0.129 0.008 -0.120 -0.076 -0.147 + 8.928 0.722 -0.304 0.535 0.160 -0.325 -0.030 -0.332 -0.227 -0.043 -0.164 -0.092 -0.350 + 8.947 0.692 -0.324 0.615 0.205 -0.340 -0.184 -0.356 -0.248 0.074 -0.132 0.017 -0.413 + 8.951 0.806 -0.440 0.582 0.247 -0.361 -0.210 -0.389 -0.212 -0.053 -0.029 -0.115 -0.341 + 8.917 0.916 -0.486 0.474 0.266 -0.376 -0.185 -0.285 -0.253 -0.138 0.038 -0.222 -0.353 + 10.708 0.950 -0.818 0.034 0.420 -0.464 -0.556 -0.228 -0.132 0.026 -0.029 -0.312 0.005 + 11.577 0.955 -1.090 0.446 0.059 -0.647 -0.722 -0.060 -0.033 -0.028 -0.213 -0.024 0.119 + 11.978 0.680 -0.816 0.411 -0.080 -0.878 -0.633 0.053 -0.113 -0.055 -0.144 0.140 0.030 + 12.275 0.443 -0.557 0.410 -0.196 -0.958 -0.523 0.095 -0.261 -0.042 -0.074 0.151 -0.100 + 12.255 0.507 -0.459 0.388 -0.257 -0.934 -0.396 -0.018 -0.337 -0.044 -0.082 0.134 -0.180 + 11.880 0.144 0.030 0.553 -0.374 -0.770 -0.376 -0.037 -0.400 -0.148 -0.161 0.149 -0.215 + 10.478 -0.052 0.372 0.620 -0.495 -0.750 -0.424 -0.117 -0.403 -0.185 -0.050 0.122 -0.208 + 9.842 0.046 0.036 0.550 -0.258 -0.491 -0.243 -0.396 -0.322 -0.183 -0.124 -0.069 -0.000 + 7.444 -0.152 -0.278 0.219 -0.075 -0.467 -0.059 -0.231 -0.150 -0.044 -0.119 -0.064 -0.009 + 5.427 -0.206 0.224 0.064 0.039 -0.537 -0.527 -0.095 -0.077 0.042 -0.069 -0.059 -0.215 + 6.715 -0.571 -0.024 0.078 0.034 -0.534 -0.217 -0.125 -0.122 0.135 -0.098 0.091 0.007 + 10.340 -1.069 -0.542 0.266 -0.061 -0.424 -0.164 -0.305 -0.194 0.004 -0.166 0.034 -0.030 + 10.835 -0.759 -0.302 0.157 -0.142 -0.370 -0.346 -0.471 -0.257 -0.038 -0.260 0.109 -0.021 + 10.564 0.185 0.242 0.762 -0.319 -0.716 -0.523 -0.089 -0.504 -0.098 -0.198 -0.041 -0.166 + 11.981 0.613 0.174 0.174 -0.381 -0.500 -0.930 0.226 -0.678 0.013 -0.271 0.128 -0.149 + 12.077 1.051 -0.518 0.011 -0.034 -0.801 -0.900 0.248 -0.510 0.002 -0.240 0.189 -0.063 + 11.512 1.111 -0.555 0.016 -0.048 -0.896 -0.804 0.102 -0.305 -0.017 -0.256 0.256 -0.081 + 10.531 0.992 -0.221 -0.218 -0.039 -0.706 -0.864 -0.121 -0.304 0.108 -0.472 0.189 0.129 + 7.576 0.754 0.235 0.167 0.097 -0.359 -0.278 -0.157 -0.228 -0.077 -0.214 -0.123 -0.024 + 7.424 0.040 0.310 0.280 -0.088 -0.323 -0.337 0.135 -0.331 -0.126 -0.011 -0.097 -0.026 + 9.986 -0.365 -0.762 0.053 -0.199 -0.630 -0.333 0.314 -0.375 -0.212 0.045 0.045 -0.067 + 11.187 -0.142 -0.561 0.147 0.002 -0.598 -0.449 0.295 -0.309 -0.194 -0.182 0.020 -0.143 + 10.974 0.361 -0.791 -0.113 0.363 0.026 -0.404 0.311 -0.113 -0.124 -0.245 -0.080 -0.041 + 11.762 -0.513 -0.770 -0.397 0.174 0.260 0.037 0.114 -0.046 -0.167 -0.125 -0.104 -0.035 + 11.097 -0.354 -0.658 -0.473 0.103 0.125 0.065 0.117 -0.404 -0.185 0.078 -0.224 0.135 + 11.221 0.634 -0.281 -0.074 0.115 0.081 0.056 0.090 -0.455 -0.281 -0.307 -0.258 -0.016 + 11.692 0.009 -0.463 0.064 0.093 0.356 -0.169 0.212 -0.458 -0.044 0.073 -0.548 0.033 + 11.745 -0.567 -0.873 -0.160 -0.384 0.272 -0.182 0.271 -0.435 -0.054 0.327 -0.511 0.131 + 11.159 -0.296 -0.606 -0.118 -0.274 0.323 -0.126 0.286 -0.519 -0.012 0.084 -0.518 -0.150 + 10.778 0.634 -0.396 -0.439 -0.207 0.259 -0.065 0.337 -0.621 -0.110 -0.260 -0.423 -0.261 + 10.596 1.494 -0.335 -0.409 -0.374 -0.071 -0.107 0.132 -0.482 0.105 -0.120 -0.271 -0.219 + 11.034 2.174 -0.659 -1.087 -0.638 -0.057 -0.234 0.156 -0.414 -0.099 -0.034 -0.090 -0.085 + 11.418 2.356 -1.198 -1.047 -0.286 -0.237 -0.659 0.569 -0.567 -0.204 0.212 -0.085 -0.276 + 11.480 2.235 -1.281 -1.030 -0.276 -0.200 -0.662 0.468 -0.582 -0.132 0.280 -0.074 -0.230 + 11.667 2.061 -1.211 -1.122 -0.275 -0.136 -0.739 0.355 -0.455 -0.111 0.234 -0.029 -0.175 + 11.953 2.037 -1.319 -1.079 -0.160 -0.094 -0.860 0.269 -0.364 -0.104 0.210 -0.140 -0.034 + 11.786 2.209 -1.400 -1.168 0.030 -0.084 -0.929 0.183 -0.313 0.036 0.016 -0.127 0.102 + 11.305 2.177 -1.317 -1.197 0.009 -0.003 -0.955 0.078 -0.315 0.117 -0.021 -0.017 -0.004 + 11.383 1.798 -1.132 -1.278 0.059 -0.032 -1.008 -0.038 -0.169 0.122 0.006 -0.042 -0.018 + 11.559 1.854 -1.152 -1.195 -0.001 0.071 -1.157 -0.097 -0.115 0.141 -0.049 -0.086 0.104 + 11.706 1.805 -1.226 -1.125 -0.002 0.084 -1.115 -0.182 -0.084 0.106 -0.004 -0.149 0.091 + 11.358 1.810 -1.285 -1.025 0.042 -0.018 -1.127 -0.129 -0.118 0.173 -0.035 -0.149 0.096 + 11.073 1.855 -1.398 -0.945 0.128 -0.081 -1.179 -0.202 -0.019 0.162 -0.017 -0.144 0.117 + 11.552 1.654 -1.436 -0.780 0.223 -0.176 -1.146 -0.310 0.048 0.107 -0.113 -0.110 0.090 + 11.667 1.498 -1.304 -0.699 0.185 -0.184 -1.254 -0.205 0.042 0.068 -0.146 -0.153 0.138 + 11.261 1.414 -1.263 -0.590 0.183 -0.199 -1.373 -0.066 0.115 -0.113 -0.057 -0.088 0.043 + 11.171 1.319 -1.261 -0.488 0.250 -0.256 -1.428 -0.081 0.075 -0.130 -0.099 -0.031 0.059 + 11.435 1.392 -1.265 -0.394 0.245 -0.244 -1.428 -0.057 0.052 -0.272 -0.058 -0.121 0.151 + 11.589 1.188 -1.228 -0.169 0.108 -0.085 -1.484 0.036 0.045 -0.387 -0.059 -0.121 0.093 + 11.321 0.956 -1.184 0.056 0.187 -0.258 -1.328 -0.006 0.096 -0.474 -0.112 -0.022 0.059 + 11.136 0.892 -1.138 0.091 0.253 -0.378 -1.318 -0.015 0.067 -0.588 -0.057 -0.029 -0.012 + 10.985 0.767 -0.948 0.216 0.254 -0.283 -1.226 0.123 -0.066 -0.554 -0.196 0.001 -0.144 + 8.340 0.464 -0.945 0.279 0.621 -0.313 -0.865 0.397 -0.176 -0.372 -0.167 0.169 -0.198 + 8.966 -0.525 -0.700 0.377 0.292 -0.248 -0.246 0.193 -0.181 -0.198 -0.201 -0.081 -0.148 + 7.974 -0.180 -0.299 0.080 0.577 -0.356 -0.222 0.197 -0.128 -0.313 -0.085 -0.007 0.024 + 7.469 -0.056 0.057 -0.145 0.490 -0.180 -0.510 0.190 -0.108 -0.245 0.047 0.012 0.050 + 9.728 -0.469 -0.518 0.089 -0.036 -0.214 -0.225 -0.018 -0.161 -0.120 -0.132 -0.054 -0.102 + 11.803 -0.559 -0.555 -0.366 -0.310 -0.479 -0.111 -0.046 -0.137 -0.266 -0.248 -0.055 -0.113 + 11.107 -0.476 -0.256 -0.032 -0.257 -0.645 -0.199 -0.138 0.088 -0.387 -0.130 -0.126 -0.059 + 11.157 -0.476 -0.724 0.058 0.162 -0.318 0.055 0.114 0.153 -0.615 -0.163 -0.122 -0.115 + 10.850 -0.157 -1.251 0.183 0.104 -0.564 -0.013 0.154 0.040 -0.383 -0.109 -0.046 -0.043 + 10.947 -0.060 -1.224 0.236 -0.029 -0.323 -0.070 0.119 -0.035 -0.157 -0.071 0.001 0.015 + 11.050 -0.011 -1.092 0.047 0.035 -0.329 -0.219 0.322 0.124 -0.207 0.076 0.136 -0.255 + 10.715 -0.353 -0.894 -0.054 -0.089 -0.234 -0.313 0.018 0.126 -0.311 -0.229 0.311 -0.237 + 10.116 -0.382 -0.706 0.188 0.187 -0.192 -0.282 0.099 0.144 -0.336 -0.397 -0.021 -0.182 + 9.756 0.046 -0.414 0.228 0.421 0.038 -0.260 0.257 0.128 -0.338 -0.461 -0.272 -0.315 + 9.668 -0.328 -0.820 -0.034 0.176 -0.103 -0.348 0.208 -0.156 -0.197 -0.189 0.024 -0.150 + 9.804 -0.395 -0.835 -0.083 0.307 -0.001 -0.285 0.123 0.105 -0.258 -0.243 -0.057 -0.227 + 9.199 -0.289 -0.496 -0.101 0.510 -0.260 -0.356 0.178 -0.000 -0.161 -0.259 0.163 -0.000 + 8.766 -0.153 -0.395 -0.175 0.244 -0.273 -0.328 0.225 -0.062 -0.183 -0.109 0.252 -0.002 + 8.622 -0.020 -0.574 -0.122 0.524 -0.177 -0.143 0.357 0.095 -0.292 -0.481 0.044 -0.046 + 9.123 0.182 -0.404 -0.077 0.418 -0.484 -0.373 0.030 0.099 -0.174 -0.525 0.032 -0.051 + 9.001 0.450 -0.043 -0.010 0.065 -0.485 -0.491 -0.079 0.159 -0.073 -0.501 0.224 -0.205 + 5.838 0.567 -0.028 -0.009 -0.001 -0.307 -0.427 -0.206 0.162 0.011 -0.322 0.233 -0.239 + 5.830 0.953 -0.116 -0.099 -0.010 -0.169 -0.231 0.107 -0.114 -0.123 -0.226 -0.022 -0.066 + 5.734 0.631 -0.071 -0.390 -0.093 -0.064 -0.246 -0.037 0.032 0.023 -0.157 0.050 0.132 + 5.140 0.232 -0.322 -0.266 0.063 0.107 -0.053 0.012 -0.075 0.056 -0.106 -0.203 -0.011 + 5.295 0.297 -0.468 -0.205 0.113 -0.122 -0.238 -0.064 0.007 0.034 -0.020 -0.079 -0.013 + 5.224 0.237 -0.452 -0.189 0.164 0.043 -0.364 -0.098 -0.087 0.010 0.010 0.028 -0.062 + 8.769 0.424 -1.182 -0.153 -0.126 -0.420 -0.231 -0.244 0.066 -0.082 -0.105 -0.110 0.006 + 11.577 0.179 -1.003 -0.044 -0.360 -0.495 -0.244 -0.284 0.353 -0.089 -0.107 -0.065 0.010 + 12.215 -0.226 -0.726 -0.314 0.052 -0.292 -0.110 -0.167 0.287 -0.169 -0.270 0.068 -0.078 + 13.066 -0.405 -0.243 -0.113 0.107 -0.281 -0.128 -0.022 -0.202 -0.364 -0.304 -0.080 -0.106 + 13.753 -0.071 -0.167 -0.109 0.189 -0.503 -0.191 0.075 -0.205 -0.252 -0.279 -0.152 -0.317 + 12.760 -0.299 -0.219 -0.030 0.376 -0.197 -0.040 -0.103 -0.290 -0.016 -0.254 0.069 -0.215 + 12.041 -0.708 -0.755 0.048 0.478 0.054 -0.011 -0.243 -0.261 0.044 -0.098 0.077 -0.198 + 11.872 -0.792 -1.190 -0.100 0.486 -0.093 -0.133 -0.085 -0.099 0.227 -0.029 0.017 -0.136 + 11.576 -1.030 -1.288 -0.252 0.062 -0.490 -0.346 -0.091 0.247 0.294 0.100 0.027 -0.160 + 11.508 -1.073 -1.118 -0.170 0.150 -0.533 -0.392 0.005 0.433 0.081 0.135 0.060 -0.188 + 11.168 -1.292 -1.087 -0.181 0.166 -0.459 -0.406 -0.120 0.422 0.148 0.125 0.219 -0.067 + 10.782 -1.044 -0.754 -0.169 0.213 -0.336 -0.487 -0.294 0.331 0.137 -0.050 0.038 -0.192 + 10.799 -0.881 -0.533 -0.066 0.296 -0.397 -0.380 -0.255 0.264 0.195 0.023 -0.097 -0.157 + 10.772 -0.945 -0.663 -0.191 0.178 -0.302 -0.354 -0.161 0.206 0.301 0.137 -0.202 -0.084 + 10.693 -1.191 -0.761 -0.229 0.115 -0.621 -0.299 -0.119 0.246 0.241 0.114 -0.035 -0.196 + 10.496 -1.051 -0.686 -0.057 0.176 -0.462 -0.153 -0.095 0.141 0.172 0.270 -0.118 -0.068 + 10.366 -1.250 -0.860 -0.401 0.258 -0.556 -0.210 0.010 0.148 0.203 0.215 -0.023 0.026 + 10.306 -1.056 -0.725 -0.281 0.279 -0.541 -0.237 -0.018 0.113 0.247 0.174 -0.026 -0.066 + 10.199 -1.111 -0.739 -0.380 0.112 -0.422 -0.176 -0.016 -0.003 0.335 0.252 -0.134 -0.040 + 10.367 -1.088 -0.654 -0.235 0.195 -0.627 -0.398 -0.282 -0.132 0.129 0.294 -0.105 -0.166 + 10.551 -1.028 -0.902 -0.108 0.326 -0.670 -0.418 -0.042 -0.095 -0.038 0.232 0.037 -0.368 + 10.385 -1.049 -0.885 -0.110 0.364 -0.765 -0.541 -0.068 0.011 0.005 -0.002 0.008 -0.209 + 10.231 -0.788 -0.842 -0.147 0.326 -0.543 -0.383 -0.076 0.127 -0.054 -0.121 -0.008 -0.152 + 10.444 -0.663 -0.934 -0.065 0.266 -0.681 -0.229 0.054 0.122 -0.147 -0.216 -0.142 -0.064 + 10.079 -0.835 -0.809 -0.181 -0.105 -0.569 -0.194 -0.149 0.027 -0.105 0.002 -0.054 -0.078 + 10.036 -0.758 -0.695 -0.186 0.141 -0.427 -0.214 -0.199 0.114 0.053 -0.254 -0.152 -0.204 + 9.957 -0.614 -0.593 -0.123 -0.040 -0.458 -0.273 -0.101 -0.126 -0.219 -0.221 -0.119 -0.153 + 9.999 -0.559 -0.579 -0.004 0.125 -0.630 -0.295 -0.192 -0.127 -0.269 -0.173 -0.052 -0.115 + 9.856 -0.390 -0.606 0.009 0.090 -0.539 -0.460 -0.191 -0.102 -0.249 -0.215 -0.008 -0.080 + 9.738 -0.320 -0.703 -0.040 0.068 -0.480 -0.376 -0.291 -0.082 -0.242 -0.254 -0.064 -0.076 + 9.687 -0.336 -0.602 0.001 0.160 -0.541 -0.154 -0.228 -0.178 -0.134 -0.115 0.029 -0.178 + 9.613 -0.231 -0.506 -0.027 0.127 -0.578 -0.185 -0.210 -0.075 -0.174 -0.210 -0.008 -0.148 + 9.501 -0.233 -0.515 -0.159 0.160 -0.607 -0.181 -0.187 -0.085 -0.310 -0.072 -0.043 -0.050 + 9.464 -0.206 -0.597 -0.160 0.126 -0.649 -0.160 -0.313 -0.079 -0.196 -0.067 -0.061 -0.069 + 9.340 -0.136 -0.564 -0.134 0.108 -0.658 -0.301 -0.173 -0.036 -0.046 -0.011 -0.035 -0.085 + 8.889 -0.318 -0.635 -0.202 -0.075 -0.552 -0.357 -0.069 0.025 -0.166 -0.154 0.137 -0.066 + 8.896 -0.259 -0.389 -0.126 0.111 -0.649 -0.285 -0.054 0.177 -0.289 -0.116 0.053 -0.074 + 9.255 0.076 -0.156 -0.138 0.089 -0.424 -0.133 -0.105 0.012 -0.226 -0.182 0.083 -0.155 + 9.673 0.505 -0.090 -0.057 0.212 -0.363 -0.180 -0.007 0.014 -0.322 -0.322 0.098 -0.093 + 8.759 -0.134 -0.616 -0.353 -0.006 -0.445 -0.134 0.030 0.210 -0.254 -0.083 0.059 -0.110 + 8.247 -0.428 -0.653 -0.329 -0.228 -0.555 -0.324 -0.120 0.157 -0.081 -0.052 0.031 -0.075 + 7.799 -0.221 -0.571 -0.386 -0.054 -0.601 -0.221 0.006 0.212 -0.069 -0.108 0.109 -0.163 + 7.771 -0.493 -0.647 -0.483 -0.021 -0.475 -0.208 0.057 0.226 0.130 -0.022 0.003 -0.067 + 7.957 -0.350 -0.539 -0.516 -0.425 -0.461 -0.169 0.080 0.339 0.133 0.016 -0.034 -0.059 + 8.033 -0.150 -0.460 -0.514 -0.417 -0.643 -0.256 0.030 0.405 0.081 0.036 0.074 -0.117 + 7.712 -0.228 -0.533 -0.357 -0.216 -0.722 -0.388 -0.043 0.344 0.075 0.170 0.082 -0.134 + 7.769 -0.040 -0.566 -0.500 -0.188 -0.624 -0.353 0.116 0.371 0.081 0.070 0.087 -0.112 + 8.123 0.321 -0.351 -0.214 -0.032 -0.348 -0.335 0.082 0.386 0.020 0.015 0.089 -0.224 + 7.958 0.266 -0.339 -0.074 -0.035 -0.363 -0.388 -0.013 0.360 0.048 0.053 0.155 -0.112 + 7.702 -0.054 -0.731 -0.526 -0.202 -0.217 -0.228 0.093 0.301 -0.074 -0.052 -0.049 -0.051 + 7.481 -0.111 -0.739 -0.435 -0.326 -0.201 -0.159 0.100 0.439 -0.006 -0.147 -0.067 -0.107 + 7.576 -0.126 -0.517 -0.176 -0.252 -0.334 -0.345 0.095 0.265 -0.077 -0.177 -0.183 -0.085 + 7.386 -0.387 -0.643 -0.262 -0.145 -0.319 -0.258 0.104 0.133 -0.017 -0.296 -0.283 -0.092 + 7.446 -0.098 -0.396 -0.160 0.080 -0.138 -0.129 0.128 0.125 -0.046 -0.299 -0.283 -0.273 + 8.507 0.423 0.286 0.342 0.138 -0.153 -0.253 -0.135 -0.107 -0.105 -0.165 -0.139 -0.088 + 8.362 0.177 0.261 0.078 0.103 -0.162 -0.238 -0.055 0.048 -0.023 -0.147 -0.160 -0.123 + 8.718 -0.297 -0.371 -0.164 0.001 -0.087 -0.392 -0.118 -0.032 -0.052 -0.072 0.044 -0.155 + 8.806 -0.349 -0.329 -0.272 -0.219 -0.261 -0.233 -0.224 -0.045 -0.049 -0.115 0.006 -0.031 + 9.444 -0.419 0.001 -0.211 -0.125 -0.128 -0.165 -0.177 -0.147 -0.124 -0.115 -0.035 -0.095 + 10.074 -0.287 -0.023 -0.167 -0.180 -0.048 -0.375 -0.332 -0.167 -0.203 -0.183 -0.135 -0.195 + 10.114 -0.377 -0.249 -0.248 -0.164 -0.182 -0.298 -0.276 -0.042 -0.183 -0.218 -0.102 -0.102 + 9.716 -0.363 -0.129 -0.274 -0.247 -0.062 -0.247 -0.229 0.164 0.051 -0.282 -0.163 -0.100 + 9.498 -0.394 -0.274 -0.462 -0.068 -0.020 -0.208 -0.247 0.108 -0.065 -0.263 -0.120 -0.220 + 9.643 -0.446 -0.331 -0.421 0.043 -0.295 -0.366 -0.082 -0.035 -0.203 -0.237 0.034 -0.133 + 9.931 -0.544 -0.491 -0.180 -0.034 0.041 -0.167 -0.254 0.028 -0.225 -0.232 -0.088 -0.030 + 10.165 -0.559 -0.461 -0.510 -0.283 -0.148 -0.239 -0.228 -0.056 -0.316 -0.317 -0.162 -0.088 + 9.637 -0.907 -0.566 -0.610 -0.257 -0.178 -0.144 -0.046 0.153 -0.090 -0.175 0.012 -0.133 + 9.370 -0.478 -0.394 -0.371 -0.148 -0.275 -0.304 -0.179 0.145 -0.179 -0.273 -0.019 -0.077 + 9.232 -0.600 -0.174 -0.367 -0.130 -0.293 -0.325 -0.247 0.206 0.066 -0.148 -0.005 -0.022 + 9.191 -0.387 0.175 -0.351 -0.392 -0.543 -0.105 -0.136 0.122 0.031 -0.209 -0.185 -0.035 + 9.266 -0.052 0.163 -0.322 -0.091 -0.200 -0.220 -0.272 0.197 0.029 -0.099 -0.170 -0.239 + 8.497 -0.496 -0.011 -0.544 -0.269 -0.446 -0.368 -0.200 0.379 0.106 -0.183 0.003 -0.156 + 8.401 -0.519 -0.252 -0.514 -0.238 -0.574 -0.428 -0.224 0.344 0.029 -0.227 -0.011 -0.185 + 8.574 -0.437 -0.220 -0.437 -0.219 -0.432 -0.311 -0.230 0.301 -0.023 -0.202 -0.024 -0.199 + 8.777 -0.669 -0.369 -0.336 -0.368 -0.344 -0.316 0.037 0.348 -0.015 -0.225 -0.000 -0.146 + 8.507 -0.460 -0.271 -0.215 -0.383 -0.037 0.026 0.117 0.484 0.043 -0.244 -0.052 -0.205 + 8.374 -0.252 -0.384 -0.083 -0.388 -0.277 -0.022 0.056 0.393 0.028 -0.308 -0.065 -0.139 + 8.351 -0.470 -0.357 0.094 -0.558 -0.585 -0.062 0.208 0.260 -0.017 -0.145 -0.029 -0.090 + 7.547 -0.322 -0.120 -0.068 -0.574 -0.270 -0.167 0.124 0.312 0.145 -0.037 -0.031 -0.198 + 11.486 0.663 -0.453 0.069 -0.093 -0.297 -0.307 0.121 -0.179 -0.063 -0.343 -0.078 -0.288 + 12.931 0.653 -0.381 0.021 -0.167 -0.377 -0.388 0.204 -0.217 0.018 -0.311 0.115 -0.280 + 12.307 0.431 -0.435 0.007 -0.159 -0.530 -0.511 0.155 -0.168 0.109 -0.200 0.287 -0.162 + 8.791 0.430 0.041 -0.203 0.018 -0.476 -0.631 0.223 0.013 0.120 -0.223 0.033 -0.145 + 7.722 -0.027 -0.236 -0.140 -0.238 -0.589 -0.348 0.067 0.258 0.160 -0.243 0.034 -0.142 + 7.743 -0.180 -0.419 -0.370 -0.157 -0.603 -0.417 -0.053 0.254 0.093 -0.269 0.099 -0.074 + 8.042 -0.170 -0.328 -0.317 -0.148 -0.487 -0.265 0.024 0.243 -0.087 -0.155 0.105 0.080 + 8.176 -0.296 -0.306 -0.426 -0.124 -0.660 -0.145 0.144 0.286 -0.287 -0.264 0.214 0.132 + 8.267 -0.380 -0.236 -0.471 -0.165 -0.571 -0.190 0.226 0.068 -0.254 -0.153 0.124 0.063 + 8.311 -0.503 -0.238 -0.584 -0.066 -0.474 -0.261 0.130 0.176 -0.272 -0.341 0.048 0.060 + 7.847 -0.684 -0.339 -0.467 -0.117 -0.646 -0.187 0.107 0.359 -0.265 -0.536 0.039 0.121 + 7.864 -0.655 -0.411 -0.369 -0.050 -0.266 -0.151 0.202 0.236 -0.398 -0.396 -0.130 0.044 + 7.983 -0.555 -0.464 -0.250 0.072 -0.553 -0.043 0.168 0.320 -0.281 -0.435 -0.294 0.056 + 8.107 -0.638 -0.443 -0.346 0.099 -0.391 -0.058 0.207 0.300 -0.251 -0.324 -0.205 0.077 + 8.101 -0.450 -0.242 -0.277 -0.019 -0.439 -0.076 0.191 0.272 -0.183 -0.434 -0.277 -0.090 + 7.636 -0.507 -0.388 -0.381 0.069 -0.413 -0.113 0.087 0.221 -0.364 -0.463 -0.382 -0.154 + 7.344 -0.580 -0.454 -0.450 0.064 -0.509 -0.103 0.006 0.378 -0.200 -0.326 -0.371 -0.134 + 7.516 -0.492 -0.329 -0.386 0.087 -0.488 -0.239 -0.055 0.536 -0.030 -0.280 -0.285 -0.174 + 7.425 -0.466 -0.341 -0.357 0.068 -0.601 -0.170 0.113 0.513 -0.181 -0.424 -0.370 -0.192 + 7.804 -0.168 -0.214 -0.575 0.160 -0.659 -0.326 -0.049 0.531 -0.020 -0.353 -0.255 -0.034 + 7.595 -0.222 -0.215 -0.467 0.102 -0.596 -0.283 0.055 0.542 0.114 -0.425 -0.262 0.083 + 7.556 -0.078 -0.332 -0.504 0.149 -0.408 -0.419 0.087 0.446 0.092 -0.175 -0.205 -0.039 + 6.960 -0.459 -0.477 -0.617 0.125 -0.338 -0.404 0.025 0.501 0.017 -0.022 -0.216 -0.197 + 7.017 -0.223 -0.228 -0.411 0.267 -0.511 -0.435 -0.119 0.285 -0.100 -0.070 -0.176 -0.193 + 6.887 -0.244 -0.068 -0.320 0.376 -0.344 -0.219 0.035 0.331 -0.312 -0.079 -0.191 -0.208 + 7.164 0.086 0.163 -0.269 0.280 -0.479 -0.281 -0.209 0.268 -0.072 0.011 -0.034 -0.033 + 7.485 0.077 0.205 -0.099 0.156 -0.319 -0.133 -0.245 -0.101 -0.305 -0.135 0.001 0.052 + 7.447 -0.014 0.136 -0.042 -0.001 -0.140 -0.373 -0.373 -0.073 -0.306 -0.039 0.107 0.058 + 7.276 0.086 -0.234 -0.064 0.115 0.029 -0.242 -0.446 -0.082 -0.294 -0.059 -0.076 0.008 + 6.683 0.304 -0.068 -0.257 0.148 -0.072 -0.274 -0.127 -0.246 -0.357 -0.006 0.024 0.037 + 5.965 0.430 0.196 -0.177 0.250 -0.407 -0.383 0.036 -0.053 -0.222 -0.026 0.175 0.115 + 5.738 0.412 0.285 -0.248 0.270 -0.250 -0.244 0.149 0.126 -0.087 -0.293 -0.032 -0.043 + 5.654 0.222 -0.017 -0.122 0.020 -0.092 -0.246 -0.149 0.117 0.047 -0.161 0.082 0.201 + 5.874 0.482 -0.045 0.024 0.039 -0.046 -0.454 -0.178 -0.055 -0.118 -0.126 -0.074 -0.045 + 6.111 0.408 0.177 0.048 0.002 -0.122 -0.264 -0.136 0.015 -0.082 -0.041 0.004 0.019 + 5.843 0.575 0.001 0.002 0.062 -0.015 -0.313 -0.140 -0.033 0.022 -0.201 -0.010 0.015 + 5.656 0.631 0.032 -0.018 -0.123 -0.036 -0.325 -0.096 0.081 -0.062 -0.114 0.019 0.021 + 6.155 0.564 0.333 0.214 0.173 0.207 -0.360 -0.223 -0.257 -0.107 -0.125 -0.111 -0.054 + 5.921 0.710 0.037 -0.107 0.008 0.159 -0.321 -0.201 -0.396 -0.097 -0.021 -0.015 -0.030 + 5.563 0.395 0.015 -0.142 -0.106 0.037 -0.437 -0.142 -0.370 -0.078 -0.140 0.062 0.114 + 3.960 0.309 -0.143 -0.054 0.046 -0.114 -0.280 -0.056 -0.048 0.199 0.031 -0.141 -0.025 + 3.786 0.279 -0.381 0.121 -0.011 -0.224 -0.258 -0.093 -0.198 -0.078 -0.046 0.085 -0.048 + 3.854 0.525 -0.553 0.098 0.011 -0.460 -0.318 -0.197 -0.190 0.016 -0.108 -0.063 0.245 + 3.585 0.292 -0.488 0.150 -0.070 -0.278 0.112 -0.153 -0.213 0.258 0.157 -0.142 0.060 + 4.558 -0.122 -0.311 0.284 -0.297 -0.074 -0.020 -0.290 -0.020 0.077 0.060 0.171 -0.068 + 5.186 -0.468 0.002 0.363 -0.546 -0.139 -0.267 -0.100 0.123 0.117 -0.005 0.251 -0.057 + 5.151 -0.645 0.213 0.448 -0.504 -0.165 -0.250 -0.021 0.139 0.062 0.020 0.068 -0.161 + 5.041 -0.671 0.278 0.398 -0.285 -0.065 -0.043 -0.268 0.136 0.208 0.064 0.033 -0.042 + 5.252 -0.781 0.082 0.316 -0.399 -0.286 0.015 -0.226 0.026 0.107 0.007 0.075 0.066 + 5.989 -0.708 -0.184 0.284 -0.381 -0.246 0.249 0.042 -0.134 -0.138 -0.011 0.069 -0.082 + 6.169 -0.583 -0.235 0.133 -0.396 -0.226 0.274 0.131 -0.073 -0.265 -0.122 -0.006 -0.062 + 6.168 -0.368 -0.538 0.294 -0.298 -0.110 0.084 0.168 0.107 -0.146 -0.205 0.096 0.073 + 6.802 -0.208 -0.875 0.175 -0.334 -0.237 -0.161 0.153 0.175 -0.103 -0.118 0.059 -0.167 + 6.897 -0.085 -1.284 0.116 -0.269 0.008 -0.143 0.170 0.261 -0.198 -0.061 0.179 -0.127 + 7.053 -0.113 -1.478 -0.030 -0.173 0.119 -0.350 0.023 0.129 -0.093 -0.034 0.348 0.033 + 7.467 -0.084 -1.511 0.152 -0.244 0.187 -0.470 -0.124 0.340 -0.056 -0.130 0.253 -0.064 + 7.680 -0.089 -1.521 0.143 -0.306 0.365 -0.567 -0.210 0.290 -0.160 -0.165 0.287 0.022 + 7.953 -0.083 -1.507 -0.045 -0.249 0.404 -0.481 -0.205 0.362 -0.165 -0.077 0.256 -0.013 + 8.297 -0.244 -1.254 -0.342 -0.263 0.383 -0.477 -0.255 0.234 -0.219 -0.116 0.125 -0.044 + 8.428 -0.440 -1.202 -0.510 -0.274 0.407 -0.401 -0.142 0.355 -0.121 -0.005 0.110 0.039 + 8.317 -0.460 -1.024 -0.503 -0.312 0.553 -0.462 -0.155 0.249 -0.177 0.115 0.049 0.004 + 7.975 -0.467 -0.834 -0.482 -0.456 0.623 -0.379 -0.184 0.177 -0.172 0.187 0.095 -0.141 + 7.720 -0.421 -0.691 -0.463 -0.412 0.534 -0.304 -0.146 0.207 -0.131 0.094 0.079 -0.118 + 7.333 -0.171 -0.334 -0.300 -0.409 0.348 -0.258 -0.199 0.152 -0.049 -0.072 0.095 -0.091 + 7.162 -0.022 -0.635 -0.013 -0.358 -0.115 -0.066 0.084 0.023 0.001 -0.059 0.008 -0.013 + 7.150 0.315 -0.584 0.062 -0.215 -0.256 -0.226 -0.064 0.069 0.002 -0.133 -0.100 0.005 + 6.861 0.602 -0.555 0.054 -0.234 -0.202 -0.320 -0.029 -0.004 0.054 -0.147 -0.082 -0.038 + 6.176 0.581 -0.572 0.091 -0.213 -0.064 0.051 0.082 0.047 -0.069 -0.160 -0.074 -0.169 + 7.322 1.445 -0.133 0.181 -0.212 -0.120 -0.296 -0.068 -0.059 -0.038 -0.054 -0.111 -0.129 + 7.222 1.235 0.008 0.174 -0.048 -0.166 -0.386 0.023 -0.045 0.071 -0.051 -0.090 -0.065 + 6.226 0.170 -0.649 0.691 0.308 -0.027 -0.199 0.119 -0.110 -0.086 -0.282 -0.128 -0.112 + 6.276 0.213 -0.746 0.726 0.030 -0.276 -0.214 -0.070 -0.135 -0.154 -0.125 0.113 -0.104 + 6.538 0.260 -0.646 0.740 -0.085 -0.469 -0.426 0.033 -0.105 -0.052 -0.039 0.248 -0.034 + 6.853 0.521 -0.674 0.692 -0.112 -0.586 -0.483 0.144 -0.053 -0.204 0.041 0.354 0.099 + 6.619 0.153 -0.959 0.673 0.091 -0.778 -0.786 0.168 -0.026 -0.236 0.134 0.264 0.161 + 6.733 0.404 -0.848 0.487 0.044 -0.657 -0.789 0.218 -0.027 -0.091 -0.031 0.108 0.156 + 6.643 0.542 -0.636 0.072 -0.113 -0.623 -0.898 0.144 0.049 -0.140 -0.016 0.156 0.229 + 6.245 0.618 -0.740 0.053 -0.304 -0.636 -0.763 0.020 -0.186 -0.332 -0.077 0.054 0.054 + 6.232 0.608 -0.673 0.177 -0.234 -0.474 -0.659 0.141 -0.223 -0.225 0.028 0.099 0.258 + 6.811 0.110 -0.348 0.494 0.094 -0.597 -0.579 -0.093 -0.211 -0.274 -0.037 0.048 0.004 + 7.379 -0.129 -0.242 0.567 0.243 -0.459 -0.551 -0.062 -0.194 -0.434 -0.071 0.055 -0.004 + 7.454 0.055 -0.261 0.568 0.041 -0.581 -0.496 -0.210 -0.090 -0.290 -0.168 0.065 0.100 + 7.322 -0.067 -0.383 0.565 -0.186 -0.530 -0.320 -0.225 -0.096 -0.134 -0.030 0.051 -0.012 + 6.939 -0.097 -0.444 0.606 -0.224 -0.661 -0.420 -0.291 -0.205 0.034 0.093 0.014 0.078 + 6.633 -0.188 -0.117 0.565 -0.514 -0.572 -0.181 -0.182 0.040 0.021 -0.002 0.031 0.005 + 6.760 -0.184 -0.065 0.507 -0.474 -0.495 -0.199 -0.288 -0.003 -0.203 0.134 0.162 -0.218 + 6.858 -0.476 -0.023 0.375 -0.606 -0.552 -0.181 0.002 -0.046 -0.175 0.071 0.228 -0.294 + 6.967 -0.288 0.149 0.186 -0.309 -0.713 -0.493 -0.097 -0.077 -0.062 -0.100 0.247 -0.183 + 6.308 -0.213 0.260 0.133 -0.190 -0.582 -0.582 -0.087 -0.098 -0.166 -0.042 0.211 -0.149 + 5.922 0.097 0.230 0.238 -0.103 -0.288 -0.470 -0.007 -0.082 -0.431 -0.146 0.181 -0.216 + 5.182 0.296 0.217 0.133 -0.223 -0.205 -0.401 -0.141 -0.119 -0.259 -0.033 0.165 -0.154 + 4.593 0.325 -0.015 0.141 -0.093 -0.225 -0.324 -0.125 -0.079 -0.282 -0.182 0.140 -0.062 + 4.604 0.353 0.094 0.346 -0.000 -0.394 -0.359 -0.334 -0.184 -0.342 -0.172 0.004 -0.046 + 4.559 0.144 0.115 0.349 0.093 -0.284 -0.365 -0.268 -0.179 -0.293 -0.071 0.005 -0.224 + 4.752 0.318 0.084 0.243 0.039 -0.253 -0.363 -0.314 -0.210 -0.283 -0.200 0.011 -0.101 + 5.104 0.192 0.176 0.141 -0.249 -0.388 -0.506 -0.280 0.018 -0.128 -0.131 -0.073 -0.208 + 5.522 -0.118 0.037 0.307 -0.403 -0.330 -0.307 -0.209 0.069 0.030 0.044 -0.069 -0.168 + 5.872 -0.295 0.185 0.364 -0.304 -0.253 -0.347 -0.369 -0.037 -0.078 0.067 0.043 -0.192 + 5.962 -0.224 0.181 -0.239 -0.079 -0.001 -0.375 -0.409 -0.014 0.018 -0.051 -0.046 -0.127 + 6.131 -0.342 0.279 -0.148 -0.232 -0.182 -0.612 -0.411 0.024 0.028 -0.156 -0.045 -0.022 + 6.386 -0.329 0.054 -0.019 -0.195 0.020 -0.408 -0.486 -0.179 -0.050 -0.128 0.016 0.100 + 6.477 -0.049 0.047 -0.105 -0.258 -0.019 -0.364 -0.523 -0.212 -0.099 -0.060 0.016 -0.011 + 4.966 0.154 -0.019 0.044 -0.131 0.045 -0.236 -0.446 -0.197 -0.145 -0.193 -0.059 -0.053 + 4.040 0.470 -0.001 0.383 -0.035 -0.289 -0.624 -0.236 0.018 -0.100 -0.149 0.070 -0.050 + 4.761 0.323 -0.207 0.201 -0.074 -0.309 -0.720 -0.133 0.098 -0.071 -0.316 0.134 -0.121 + 5.489 0.377 -0.581 -0.071 -0.280 -0.314 -0.779 0.021 0.271 -0.166 -0.482 0.199 -0.249 + 6.095 0.108 -0.630 -0.336 -0.356 -0.300 -0.735 0.102 0.326 -0.240 -0.471 0.226 -0.165 + 6.160 -0.039 -0.949 -0.472 -0.101 -0.094 -0.638 0.137 0.076 -0.290 -0.587 0.065 -0.137 + 6.500 -0.015 -0.978 -0.565 -0.133 -0.002 -0.636 0.092 0.152 -0.196 -0.588 0.127 -0.201 + 6.612 -0.010 -1.001 -0.420 -0.108 0.116 -0.614 0.134 0.129 -0.194 -0.571 0.146 -0.098 + 6.603 -0.106 -1.184 -0.395 -0.305 0.283 -0.491 -0.014 0.233 -0.262 -0.405 0.158 -0.007 + 6.349 -0.067 -1.302 -0.324 -0.281 0.382 -0.410 0.032 0.268 -0.388 -0.438 0.187 -0.127 + 6.305 -0.297 -1.246 -0.546 -0.033 0.415 -0.318 0.176 0.179 -0.347 -0.544 0.340 -0.143 + 6.594 -0.126 -1.179 -0.538 -0.027 0.318 -0.401 0.149 0.113 -0.187 -0.382 0.344 -0.112 + 6.519 -0.244 -1.282 -0.635 -0.063 0.261 -0.425 -0.014 -0.016 -0.242 -0.450 0.335 -0.164 + 6.479 -0.204 -1.425 -0.573 -0.121 0.252 -0.352 -0.047 -0.006 -0.163 -0.273 0.325 -0.181 + 6.676 -0.157 -1.317 -0.646 -0.439 0.234 -0.478 -0.024 0.011 -0.137 -0.272 0.238 -0.219 + 6.573 -0.204 -1.441 -0.577 -0.598 -0.056 -0.509 -0.118 -0.036 -0.058 -0.279 0.315 -0.270 + 6.334 -0.103 -1.291 -0.372 -0.448 -0.223 -0.508 0.100 -0.110 0.074 -0.194 0.426 -0.292 + 6.269 -0.082 -1.316 -0.466 -0.227 -0.145 -0.659 0.075 -0.141 0.042 -0.196 0.370 -0.235 + 6.276 -0.014 -1.263 -0.659 -0.287 0.104 -0.441 0.027 0.098 0.020 -0.333 0.302 -0.154 + 6.008 0.241 -1.016 -0.672 -0.184 0.158 -0.329 0.151 0.226 -0.115 -0.184 0.233 -0.256 + 4.787 0.427 -0.474 -0.577 -0.075 0.086 -0.325 0.073 0.158 -0.013 -0.225 0.144 -0.114 + 4.583 0.552 -0.508 -0.504 -0.170 0.002 -0.259 -0.072 0.186 -0.087 -0.181 0.152 -0.033 + 4.648 0.421 -0.563 -0.423 -0.288 -0.060 -0.266 0.113 0.212 0.111 -0.179 0.014 -0.227 + 4.329 0.523 -0.556 -0.389 -0.192 0.044 -0.260 0.079 0.423 0.101 -0.223 -0.028 -0.153 + 3.873 0.530 -0.430 -0.112 -0.099 -0.001 -0.346 0.056 0.183 0.142 0.063 0.127 -0.114 + 5.093 -0.341 -0.460 -0.117 0.025 0.338 0.131 -0.233 0.037 -0.052 0.045 -0.014 -0.078 + 8.098 -0.766 -0.589 -0.150 -0.227 0.311 0.143 -0.527 -0.042 0.063 0.090 0.020 -0.042 + 8.906 -0.656 -0.617 -0.006 -0.232 0.097 -0.036 -0.562 -0.033 -0.035 -0.201 -0.054 -0.036 + 9.166 -0.647 -0.676 -0.098 -0.264 0.099 -0.015 -0.401 0.086 0.075 0.008 0.016 0.040 + 9.091 -0.446 -0.319 -0.161 -0.198 0.146 -0.013 -0.520 -0.050 0.155 0.003 -0.019 -0.069 + 9.523 -0.322 -0.335 -0.187 -0.328 0.072 -0.175 -0.480 -0.102 -0.010 -0.152 0.025 -0.103 + 9.732 -0.448 -0.370 -0.049 -0.131 0.012 -0.335 -0.400 0.018 0.151 -0.116 -0.025 0.010 + 9.714 -0.476 -0.477 -0.094 -0.138 0.053 -0.077 -0.318 0.201 0.024 -0.035 -0.046 0.002 + 9.654 0.038 -0.323 -0.153 -0.218 -0.088 -0.183 -0.286 0.134 0.021 -0.065 -0.119 -0.034 + 8.556 0.192 -0.045 -0.211 -0.070 0.053 -0.179 -0.363 -0.201 0.063 -0.155 -0.058 0.013 + 7.567 -0.034 -0.212 -0.301 -0.154 0.123 -0.333 -0.214 -0.045 0.153 -0.008 0.017 -0.078 + 6.856 -0.072 0.103 -0.148 -0.216 -0.129 -0.224 -0.012 0.050 0.136 0.010 -0.037 -0.043 + 5.706 -0.076 0.009 -0.009 -0.104 0.076 -0.166 0.104 0.060 0.055 -0.069 -0.220 -0.038 + 4.551 -0.079 0.091 0.051 -0.180 -0.022 -0.127 -0.177 -0.027 0.056 0.018 0.011 0.063 + 4.123 -0.302 0.110 0.017 -0.256 0.072 -0.426 -0.117 0.046 0.090 -0.164 0.035 0.167 + 4.138 -0.458 -0.144 0.150 -0.154 -0.014 -0.154 0.070 -0.102 0.073 0.064 0.081 0.065 + 4.405 -0.138 0.008 0.178 -0.088 0.057 -0.183 -0.064 -0.087 0.008 -0.112 -0.091 -0.060 + 4.692 -0.138 0.124 0.081 0.037 0.063 -0.354 -0.190 0.109 0.028 -0.095 -0.058 0.001 + 5.003 -0.354 -0.108 -0.043 -0.045 0.265 -0.147 0.025 0.151 0.058 -0.165 -0.086 -0.171 + 4.970 -0.212 0.061 0.056 -0.095 0.013 -0.147 0.155 -0.054 -0.031 -0.054 -0.054 -0.082 + 5.158 -0.183 0.037 -0.012 -0.308 -0.239 -0.365 0.005 -0.060 0.046 -0.075 0.002 -0.019 + 5.449 0.072 0.080 -0.055 -0.248 0.022 -0.119 -0.043 -0.113 -0.162 -0.139 -0.087 -0.169 + 6.496 0.401 0.212 0.111 -0.047 0.182 0.141 0.099 -0.126 -0.087 -0.168 -0.009 -0.067 + 5.695 0.215 0.332 0.152 -0.129 0.105 -0.194 0.039 -0.080 0.009 -0.076 0.009 -0.297 + 5.309 -0.149 -0.111 -0.118 -0.499 -0.174 -0.160 0.127 -0.155 -0.013 0.129 -0.058 -0.115 + 5.472 -0.125 -0.077 0.017 -0.281 -0.048 -0.203 0.031 -0.084 0.056 -0.144 -0.072 0.042 + 5.195 0.014 0.032 -0.047 -0.182 0.120 -0.101 -0.010 -0.087 -0.059 -0.061 -0.038 -0.090 + 5.398 0.092 0.040 0.194 -0.114 0.083 -0.153 0.031 -0.053 -0.110 -0.106 -0.071 -0.223 + 5.672 0.552 0.424 0.386 -0.059 -0.040 -0.360 -0.184 0.084 0.133 -0.136 -0.230 -0.078 + 5.325 0.565 0.181 0.215 0.006 0.035 -0.270 -0.386 -0.301 0.111 -0.102 -0.216 -0.011 + 7.237 0.571 -0.519 -0.328 0.052 -0.247 -0.211 -0.071 -0.107 -0.109 -0.159 -0.047 -0.087 + 8.081 0.568 -0.421 -0.386 0.198 -0.267 -0.183 -0.069 -0.073 -0.181 -0.160 -0.033 -0.128 + 4.216 0.434 0.626 0.343 -0.079 -0.073 -0.204 -0.155 -0.174 0.044 -0.124 -0.211 -0.105 + 4.190 0.501 0.460 0.183 -0.026 0.090 -0.110 -0.133 -0.211 -0.069 -0.135 -0.026 -0.220 + 4.278 0.430 0.392 0.013 -0.019 0.158 0.070 0.039 -0.080 0.005 -0.165 -0.086 -0.215 + 4.353 0.288 0.156 0.041 -0.189 -0.140 -0.053 -0.013 -0.096 0.095 -0.044 -0.092 -0.112 + 5.658 -0.244 0.055 -0.229 0.044 -0.006 -0.070 0.029 -0.222 -0.077 -0.151 -0.072 -0.053 + 3.647 0.358 -0.088 0.088 0.040 -0.109 -0.122 -0.160 -0.119 -0.039 -0.076 0.036 -0.041 + 3.444 0.283 -0.087 0.163 0.098 0.009 -0.022 0.102 -0.023 -0.028 -0.050 -0.021 -0.075 + 3.661 0.526 -0.016 0.050 -0.007 -0.088 -0.143 -0.005 -0.076 -0.038 -0.094 -0.106 -0.024 + 3.681 0.403 -0.150 0.066 0.059 -0.032 -0.090 0.065 -0.164 -0.047 -0.110 -0.113 -0.012 + 4.021 0.377 -0.093 -0.112 -0.188 -0.098 -0.136 -0.181 -0.237 -0.031 -0.035 0.020 -0.028 + 3.623 0.361 -0.157 -0.006 -0.045 -0.167 -0.265 -0.071 -0.118 -0.016 -0.076 -0.026 -0.171 + 3.760 0.336 -0.196 -0.073 -0.057 -0.047 0.087 -0.096 -0.070 -0.004 0.009 0.132 0.034 + 3.709 0.320 -0.186 0.008 -0.069 -0.144 -0.010 -0.022 -0.185 -0.103 -0.216 0.050 -0.004 + 3.953 0.349 -0.179 -0.072 -0.147 -0.194 -0.061 -0.034 -0.018 0.029 0.001 -0.097 0.060 + 5.822 -0.920 0.087 -0.002 -0.153 -0.133 -0.263 -0.167 -0.150 -0.027 -0.048 -0.017 -0.091 + 5.050 -0.354 0.366 -0.012 -0.240 -0.149 -0.150 -0.158 -0.158 -0.132 -0.131 -0.059 -0.061 + 3.892 0.438 0.070 0.324 -0.288 -0.224 -0.174 -0.164 -0.113 -0.201 0.007 0.024 0.062 + 3.512 0.500 0.248 0.033 0.011 -0.127 -0.105 -0.133 -0.221 -0.145 -0.148 -0.102 -0.058 + 3.566 0.089 -0.055 0.029 -0.053 0.072 0.050 -0.077 -0.002 -0.062 -0.148 -0.065 -0.037 + 3.329 0.000 0.069 0.021 -0.017 -0.067 -0.052 -0.189 -0.223 0.104 -0.050 -0.071 -0.182 + 2.601 0.048 -0.067 0.077 0.015 -0.173 -0.055 -0.231 -0.108 -0.094 -0.095 -0.026 -0.169 + 2.690 -0.128 -0.162 0.075 -0.011 -0.121 -0.050 0.055 -0.088 0.061 0.024 -0.063 -0.176 + 2.674 -0.142 -0.129 0.112 0.050 -0.105 -0.081 -0.013 -0.168 -0.005 -0.053 0.085 0.090 + 2.832 0.045 -0.130 0.137 -0.000 -0.152 -0.064 0.149 -0.152 -0.001 -0.146 -0.123 -0.073 + 2.501 0.039 0.065 0.258 0.045 -0.013 -0.039 -0.001 -0.236 -0.099 -0.025 -0.061 -0.096 + 2.361 -0.020 -0.035 0.156 0.105 -0.034 0.043 0.121 0.013 -0.131 -0.120 -0.114 -0.007 + 2.417 -0.132 -0.073 0.149 0.056 -0.042 0.265 0.163 0.003 -0.060 -0.006 -0.041 -0.171 + 2.469 0.153 -0.008 -0.057 -0.130 0.049 -0.048 -0.005 -0.080 0.026 0.026 0.042 -0.085 + 2.195 0.007 0.113 0.055 -0.024 0.055 -0.005 -0.087 0.007 -0.063 -0.079 0.002 -0.071 + 2.427 -0.117 0.254 -0.199 0.016 -0.071 -0.067 0.081 -0.119 -0.090 -0.149 0.005 -0.179 + 2.881 0.017 0.378 -0.382 0.032 0.047 -0.101 0.100 -0.136 0.029 0.046 -0.044 -0.160 + 2.692 0.570 -0.019 -0.084 -0.214 0.007 -0.100 -0.008 0.033 0.040 -0.031 0.023 -0.054 + 2.655 0.382 -0.157 -0.165 -0.158 0.043 0.108 0.045 -0.100 -0.132 -0.068 -0.129 -0.149 + 2.442 0.644 0.084 -0.234 -0.292 -0.027 -0.001 0.103 0.003 -0.013 0.067 -0.065 -0.173 + 2.388 0.308 -0.076 0.016 -0.218 -0.449 -0.239 -0.033 0.080 0.022 -0.103 -0.068 -0.066 + 3.191 0.308 0.255 0.218 -0.300 -0.297 -0.029 0.085 0.095 -0.031 -0.067 -0.102 -0.285 + 4.024 0.740 0.002 0.009 -0.324 -0.106 0.017 0.013 -0.182 -0.165 -0.042 -0.129 -0.108 + 4.161 0.335 0.061 -0.076 -0.570 -0.362 0.038 -0.032 -0.108 -0.062 -0.092 0.038 -0.090 + 4.103 0.314 0.142 0.055 -0.593 -0.210 0.173 -0.058 -0.210 -0.034 -0.140 -0.145 -0.171 + 3.886 0.822 -0.461 0.156 -0.402 -0.094 -0.050 -0.102 -0.171 -0.018 0.009 -0.003 -0.073 + 3.139 0.849 -0.044 0.260 -0.345 -0.113 -0.058 -0.153 -0.026 -0.056 -0.251 -0.135 -0.075 + 3.545 1.007 -0.347 -0.008 -0.279 -0.122 0.035 -0.136 -0.115 0.047 -0.049 -0.027 -0.058 + 3.441 0.977 -0.189 -0.023 -0.309 0.012 0.120 0.023 -0.057 -0.175 -0.244 -0.012 -0.021 + 3.297 0.899 -0.217 -0.012 -0.492 -0.106 -0.040 -0.047 -0.145 0.012 -0.172 -0.081 -0.060 + 3.867 1.160 -0.365 -0.116 -0.459 -0.116 -0.011 -0.100 0.011 -0.093 -0.148 -0.173 -0.030 + 3.999 1.137 -0.257 0.308 -0.367 -0.078 0.166 -0.248 -0.232 0.003 -0.145 -0.080 -0.165 + 3.674 0.774 0.079 0.373 -0.385 -0.264 0.049 -0.066 -0.212 -0.002 -0.186 -0.015 -0.038 + 3.793 1.057 -0.043 0.318 -0.560 -0.088 -0.009 -0.226 -0.086 -0.072 -0.314 0.002 0.022 + 3.559 0.728 -0.380 0.616 -0.391 -0.312 0.020 -0.021 -0.091 -0.240 -0.105 0.058 0.143 + 4.277 0.936 -0.280 0.371 -0.079 -0.176 -0.144 -0.213 -0.192 -0.039 -0.037 0.068 -0.123 + 4.825 0.641 0.119 0.317 -0.074 -0.127 -0.248 -0.445 -0.150 -0.025 0.029 0.081 -0.329 + 5.170 0.541 0.060 0.175 -0.313 -0.238 -0.183 -0.242 -0.314 0.170 -0.048 0.063 -0.219 + 5.072 0.727 0.230 0.186 -0.448 -0.150 -0.109 -0.373 -0.349 0.207 -0.093 -0.068 -0.231 + 5.111 0.641 0.297 0.161 -0.489 -0.079 -0.181 -0.328 -0.385 0.233 -0.113 -0.006 -0.225 + 5.158 0.668 0.496 0.174 -0.409 -0.145 -0.152 -0.356 -0.492 0.189 -0.029 -0.078 -0.261 + 5.568 0.650 0.022 0.111 -0.285 -0.168 -0.121 -0.363 -0.403 0.137 -0.199 0.017 -0.325 + 5.593 0.601 -0.007 0.097 -0.021 0.027 -0.092 -0.244 -0.486 -0.153 -0.130 0.063 -0.248 + 5.189 0.571 0.250 0.267 -0.108 -0.037 -0.235 -0.298 -0.527 -0.021 0.040 -0.024 -0.077 + 5.647 0.862 0.366 -0.027 -0.078 -0.083 0.125 0.087 -0.157 -0.128 -0.219 -0.249 -0.296 + 5.605 0.853 0.736 0.277 -0.123 -0.022 -0.022 -0.079 -0.179 -0.127 -0.297 -0.248 -0.286 + 5.067 0.589 0.328 0.026 -0.304 -0.098 -0.087 -0.205 -0.153 -0.030 -0.074 -0.035 0.001 + 4.774 0.112 0.172 0.316 0.003 -0.145 -0.276 -0.222 -0.303 -0.065 -0.134 -0.008 -0.015 + 5.300 -0.164 -0.019 0.359 -0.024 -0.311 -0.172 -0.400 -0.305 -0.068 -0.114 -0.019 0.056 + 6.808 0.010 0.054 0.276 -0.379 -0.310 -0.084 -0.295 -0.200 0.194 -0.096 -0.041 -0.077 + 8.777 0.393 0.281 0.124 -0.491 -0.088 -0.352 -0.300 -0.091 0.229 -0.063 -0.060 -0.191 + 7.440 0.157 0.252 0.531 -0.285 -0.230 0.110 -0.326 -0.202 0.127 -0.240 -0.046 -0.189 + 8.737 0.509 0.116 0.181 -0.258 -0.072 0.062 -0.200 -0.273 0.039 -0.299 -0.047 -0.203 + 9.199 0.668 0.204 0.171 -0.317 0.099 0.170 -0.305 -0.262 -0.046 -0.295 -0.017 -0.201 + 6.554 -0.096 0.441 0.388 -0.351 -0.212 0.393 -0.189 -0.196 0.157 -0.344 0.085 -0.163 + 5.845 -0.226 0.291 0.308 -0.585 -0.352 0.224 -0.493 -0.201 0.137 -0.235 0.125 0.005 + 5.556 -0.277 0.320 0.302 -0.472 -0.408 0.155 -0.623 -0.152 0.121 -0.247 0.267 -0.102 + 5.755 -0.182 0.455 0.544 -0.527 -0.307 0.057 -0.621 -0.291 0.068 -0.311 0.044 -0.115 + 6.441 -0.388 0.433 0.578 -0.518 -0.335 -0.117 -0.752 -0.292 0.147 -0.366 -0.065 -0.186 + 6.325 -0.278 0.456 0.623 -0.679 -0.452 0.088 -0.793 -0.420 -0.001 -0.416 -0.076 -0.250 + 6.515 -0.340 0.477 0.543 -0.747 -0.554 0.262 -0.536 -0.294 0.122 -0.412 -0.059 -0.298 + 6.474 -0.524 0.416 0.445 -0.909 -0.788 0.172 -0.538 -0.210 0.272 -0.216 0.028 -0.223 + 6.416 -0.444 0.232 0.271 -0.858 -0.641 0.277 -0.527 -0.068 0.243 -0.221 0.043 -0.113 + 6.342 -0.334 0.147 0.361 -0.860 -0.601 0.200 -0.619 -0.156 0.193 -0.201 -0.005 -0.071 + 6.172 -0.141 0.315 0.378 -0.566 -0.744 0.074 -0.454 -0.096 0.104 -0.432 0.011 -0.089 + 5.314 -0.146 0.449 0.243 -0.524 -0.353 0.285 -0.547 -0.228 0.089 -0.398 -0.010 -0.113 + 5.328 0.160 0.364 0.343 -0.344 -0.338 0.109 -0.235 -0.074 0.277 -0.331 -0.078 -0.196 + 5.328 0.161 0.327 0.268 -0.122 -0.172 0.113 -0.185 -0.066 -0.036 -0.120 0.016 -0.142 + 5.288 0.062 0.324 0.208 0.046 -0.191 0.020 -0.133 -0.119 0.043 -0.126 -0.093 -0.125 + 4.707 0.235 0.166 0.215 -0.160 -0.177 -0.142 -0.119 -0.192 -0.084 0.029 -0.038 -0.124 + 4.866 0.442 0.118 0.397 -0.237 -0.121 0.030 -0.212 -0.119 -0.009 -0.240 -0.039 -0.053 + 5.048 0.342 0.306 0.347 -0.082 0.034 -0.135 -0.120 -0.202 0.090 -0.172 -0.038 -0.095 + 4.979 -0.038 0.165 0.115 -0.213 0.082 0.074 -0.226 -0.059 0.087 -0.110 0.005 -0.015 + 5.281 -0.046 0.212 0.306 -0.322 -0.204 0.139 -0.312 -0.086 0.072 -0.259 -0.035 -0.189 + 5.306 -0.287 0.386 0.479 -0.319 -0.317 0.100 -0.422 -0.116 0.079 -0.232 -0.012 -0.164 + 5.418 -0.412 0.582 0.516 -0.557 -0.356 0.019 -0.512 -0.235 0.211 -0.128 0.028 -0.187 + 6.190 -0.339 0.462 0.633 -0.672 -0.612 -0.020 -0.319 -0.194 0.123 0.056 0.009 -0.267 + 6.315 -0.462 -0.002 0.410 -0.414 -0.558 0.055 -0.148 -0.153 -0.083 -0.151 0.100 -0.226 + 5.907 -0.678 -0.161 0.302 -0.212 -0.381 0.229 0.076 -0.096 0.049 -0.073 0.123 -0.424 + 5.973 -0.520 -0.073 0.282 -0.092 -0.386 0.025 -0.015 -0.018 -0.013 -0.067 0.089 -0.449 + 6.158 -0.377 -0.128 0.350 -0.031 -0.488 -0.049 -0.153 -0.086 -0.076 -0.077 0.158 -0.343 + 6.083 -0.310 -0.273 0.066 -0.087 -0.509 -0.011 0.043 0.025 -0.055 -0.120 0.328 -0.312 + 5.970 -0.137 -0.637 -0.244 -0.164 -0.541 -0.061 0.223 0.075 -0.137 -0.262 0.310 -0.357 + 8.920 1.368 -0.150 -0.148 -0.059 -0.264 -0.226 -0.177 -0.144 -0.204 -0.261 0.076 -0.213 + 9.455 1.320 -0.072 0.032 -0.103 -0.269 -0.188 -0.156 -0.169 -0.143 -0.191 0.080 -0.056 + 6.961 0.862 -0.056 0.169 -0.046 -0.374 -0.038 0.175 0.039 -0.288 -0.172 0.213 -0.301 + 5.693 -0.013 -0.144 -0.030 -0.130 -0.344 -0.090 0.268 0.346 -0.093 -0.255 0.304 -0.185 + 5.616 -0.116 -0.313 0.069 -0.131 -0.336 -0.189 0.378 0.183 -0.286 -0.245 0.222 -0.341 + 5.643 0.091 -0.432 -0.019 -0.224 -0.372 -0.207 0.228 -0.008 -0.187 -0.220 0.240 -0.379 + 5.752 0.460 -0.387 0.045 -0.097 -0.336 -0.300 0.215 0.240 -0.299 -0.195 0.168 -0.310 + 8.123 0.258 0.050 -0.380 -0.270 -0.363 -0.136 -0.117 -0.215 0.019 -0.244 -0.004 -0.135 + 8.404 -0.072 0.176 -0.063 -0.417 -0.354 -0.024 -0.055 -0.128 0.180 -0.200 0.031 -0.040 + 9.396 -0.410 0.331 0.035 -0.276 -0.237 -0.173 -0.009 -0.214 0.168 -0.378 -0.063 -0.037 + 5.929 0.282 0.336 0.429 0.000 -0.321 -0.239 0.091 0.003 0.148 -0.145 0.054 -0.095 + 5.351 0.497 0.376 0.132 -0.192 -0.310 -0.114 0.136 -0.018 -0.097 -0.069 -0.125 -0.317 + 4.942 0.327 0.206 0.115 -0.008 -0.227 -0.119 0.026 -0.160 -0.182 -0.190 0.010 -0.192 + 5.298 0.499 0.156 0.026 -0.194 -0.264 0.043 0.035 -0.060 -0.278 -0.039 -0.092 -0.265 + 5.425 0.479 0.418 0.213 -0.154 -0.151 -0.041 -0.071 -0.261 -0.183 -0.112 0.014 -0.205 + 5.336 0.371 0.358 0.133 -0.160 -0.031 -0.123 -0.127 -0.406 -0.183 -0.109 -0.092 -0.360 + 5.144 0.319 0.204 0.055 -0.174 -0.393 -0.096 -0.156 -0.292 -0.167 -0.106 -0.050 -0.187 + 4.790 0.132 0.163 0.208 -0.219 -0.344 -0.169 -0.083 -0.151 0.002 -0.119 -0.135 -0.104 + 4.862 0.214 0.141 0.134 -0.183 -0.378 -0.053 0.045 -0.204 -0.066 -0.157 -0.230 -0.243 + 5.471 0.369 0.268 -0.081 -0.240 -0.194 -0.137 -0.117 -0.345 -0.108 -0.030 0.061 -0.118 + 5.151 0.429 0.057 -0.066 -0.158 -0.133 0.076 0.008 -0.350 -0.255 -0.180 0.074 -0.215 + 5.426 0.398 0.103 -0.001 -0.222 -0.226 0.035 -0.017 -0.176 0.158 -0.035 -0.122 -0.155 + 5.800 0.620 0.387 0.023 -0.046 -0.022 0.186 -0.049 -0.133 0.044 0.026 -0.214 -0.241 + 5.524 0.238 0.227 -0.072 -0.067 -0.048 0.041 -0.035 -0.139 0.011 -0.044 0.026 0.019 + 5.002 -0.043 0.227 -0.085 -0.216 -0.192 -0.056 0.059 -0.118 -0.098 -0.058 -0.079 -0.232 + 4.668 -0.089 0.180 0.020 -0.268 -0.207 0.036 0.106 -0.109 -0.210 -0.094 -0.169 -0.147 + 4.591 -0.027 0.238 0.048 -0.099 -0.169 -0.055 0.100 -0.016 -0.037 -0.206 -0.279 -0.111 + 4.722 -0.060 0.182 -0.037 -0.125 -0.133 -0.104 0.016 -0.216 -0.152 -0.202 -0.109 -0.080 + 4.732 -0.086 0.247 0.001 -0.173 -0.199 -0.146 0.004 -0.024 -0.034 -0.101 -0.147 -0.107 + 4.800 -0.213 0.106 -0.320 -0.058 -0.259 -0.084 -0.046 -0.027 -0.061 -0.072 0.026 -0.235 + 4.291 -0.112 0.468 0.004 -0.192 -0.239 -0.024 0.002 -0.079 -0.075 -0.113 -0.019 -0.086 + 3.982 -0.080 0.430 -0.060 -0.235 -0.201 -0.024 0.088 0.081 -0.024 -0.074 -0.082 -0.063 + 4.187 0.131 0.271 -0.083 -0.125 0.017 0.100 -0.030 -0.197 -0.113 -0.182 -0.171 -0.178 + 3.794 -0.013 0.319 0.057 -0.135 -0.071 0.003 0.000 -0.025 0.228 0.028 -0.099 -0.123 + 3.173 0.112 0.445 0.293 -0.144 -0.147 -0.061 0.055 -0.130 -0.007 -0.077 -0.148 -0.196 + 3.568 0.198 0.471 0.129 -0.210 -0.105 -0.191 -0.029 -0.028 0.016 -0.109 -0.053 0.026 + 3.511 0.272 0.330 0.024 -0.223 -0.181 -0.055 -0.023 -0.176 -0.012 0.105 -0.054 -0.058 + 3.386 0.147 -0.020 -0.201 -0.121 -0.033 -0.160 -0.109 -0.217 -0.058 -0.112 -0.163 -0.161 + 3.070 0.139 0.027 0.030 -0.093 -0.134 -0.191 -0.076 -0.133 -0.089 -0.157 -0.230 -0.148 + 3.244 0.184 -0.014 0.190 0.040 0.007 0.039 -0.045 -0.174 -0.067 -0.114 -0.158 -0.091 + 2.986 0.188 0.100 0.311 0.009 -0.064 -0.224 -0.035 -0.210 -0.257 -0.129 -0.133 -0.031 + 2.193 0.122 0.228 0.214 -0.012 -0.103 0.007 0.128 0.084 0.154 0.101 -0.119 0.097 + 2.238 0.210 0.177 0.140 -0.080 -0.080 0.101 0.292 0.075 -0.102 -0.039 -0.172 0.014 + 2.589 0.168 -0.002 0.088 0.068 -0.097 0.164 0.254 -0.079 -0.135 -0.180 -0.253 -0.114 + 2.541 0.180 0.039 0.088 -0.041 -0.150 0.183 0.100 -0.085 0.004 -0.072 -0.146 -0.098 + 2.198 0.166 0.155 0.106 -0.137 -0.131 0.029 0.069 -0.242 -0.178 -0.052 -0.009 -0.112 + 2.412 0.488 0.238 0.044 -0.022 -0.060 0.111 0.020 -0.297 -0.231 -0.234 -0.043 -0.057 + 2.300 0.325 0.312 0.168 0.004 -0.003 -0.018 -0.043 -0.193 -0.068 -0.039 -0.098 -0.199 + 1.983 0.051 0.240 0.295 0.110 -0.134 0.096 -0.118 -0.327 -0.153 -0.005 -0.046 -0.134 + 2.239 -0.165 0.182 0.354 -0.172 -0.160 0.069 0.115 -0.033 0.045 -0.077 -0.063 -0.011 + 3.055 0.119 0.247 0.020 -0.176 -0.178 -0.114 0.120 0.011 0.142 -0.182 -0.081 -0.155 + 3.399 0.501 0.314 0.137 -0.406 -0.027 -0.001 0.019 -0.106 -0.027 0.014 -0.015 -0.119 + 5.117 0.254 0.634 0.402 -0.499 -0.182 0.063 -0.027 -0.215 -0.008 -0.111 -0.025 -0.123 + 5.144 0.029 0.358 0.637 -0.432 -0.266 -0.006 -0.159 -0.100 0.061 -0.042 0.002 -0.100 + 5.511 -0.191 0.246 0.788 -0.414 -0.155 -0.045 -0.198 -0.164 0.031 -0.016 0.067 -0.056 + 5.965 0.032 0.244 0.493 -0.446 -0.323 -0.172 -0.157 -0.249 0.035 -0.026 -0.069 -0.217 + 6.557 0.206 0.398 0.540 -0.400 -0.310 0.115 0.001 0.040 0.042 -0.094 -0.119 -0.237 + 7.089 0.862 0.566 0.255 -0.412 -0.113 0.101 -0.279 -0.209 -0.245 -0.102 0.029 -0.081 + 7.640 0.635 0.333 0.226 -0.382 -0.041 -0.085 -0.183 -0.231 -0.071 -0.232 0.049 -0.122 + 7.984 0.659 0.071 0.154 -0.103 -0.165 -0.183 -0.301 -0.207 -0.069 -0.364 0.024 -0.008 + 8.373 0.866 0.214 0.190 0.013 -0.070 -0.206 -0.332 -0.376 -0.031 -0.383 -0.083 -0.040 + 6.990 -0.006 0.158 0.135 -0.107 -0.331 -0.381 -0.156 -0.092 -0.172 -0.226 -0.016 -0.039 + 7.870 -0.616 -0.093 -0.035 -0.113 -0.330 -0.060 -0.150 -0.171 0.095 -0.180 -0.010 -0.053 + 7.025 -0.459 0.151 0.092 -0.094 -0.289 -0.186 -0.135 -0.082 0.058 -0.161 -0.021 0.003 + 6.244 -0.673 0.403 0.370 0.167 -0.008 -0.351 -0.147 -0.266 -0.202 -0.253 0.082 0.075 + 7.107 -0.645 0.424 0.189 0.063 -0.111 -0.181 -0.012 -0.179 0.012 -0.031 -0.056 0.056 + 6.624 -0.308 0.591 0.009 -0.029 -0.062 -0.217 0.092 -0.095 -0.031 -0.158 -0.175 -0.124 + 6.238 -0.384 0.526 0.066 -0.168 -0.141 -0.304 0.032 -0.288 -0.117 -0.154 -0.080 -0.192 + 5.398 -0.420 0.585 0.200 -0.073 -0.009 -0.057 -0.051 -0.292 -0.143 -0.250 -0.024 -0.099 + 4.453 -0.133 0.341 0.136 -0.031 -0.080 -0.254 -0.058 -0.088 -0.109 -0.077 -0.024 -0.074 + 4.737 0.122 0.408 0.093 0.243 0.300 -0.025 -0.028 -0.044 -0.218 -0.158 -0.024 -0.123 + 4.426 0.032 0.358 0.130 0.098 0.067 -0.078 0.003 -0.112 -0.065 -0.192 -0.107 -0.186 + 4.253 -0.161 0.226 0.175 0.025 0.003 -0.027 -0.014 -0.021 -0.063 -0.254 -0.314 -0.269 + 5.343 0.498 0.178 -0.056 -0.088 -0.146 -0.364 -0.194 -0.149 -0.139 -0.165 -0.149 -0.263 + 5.566 1.086 0.539 -0.065 -0.141 -0.207 -0.342 -0.281 -0.113 -0.065 -0.073 0.001 -0.146 + 3.918 -0.161 0.563 0.019 0.103 -0.024 -0.143 -0.179 -0.076 0.013 0.068 0.059 0.023 + 3.729 -0.238 0.094 -0.124 -0.197 -0.117 -0.123 -0.171 -0.103 -0.011 0.155 0.135 -0.083 + 3.765 -0.136 0.175 -0.031 -0.226 -0.119 -0.067 -0.132 0.052 -0.051 0.071 0.053 -0.039 + 3.217 -0.221 0.101 0.030 0.022 -0.130 -0.120 -0.077 -0.066 0.097 0.188 0.095 -0.024 + 3.450 -0.173 0.277 0.074 -0.059 -0.192 0.025 -0.043 -0.041 -0.015 -0.014 -0.000 -0.000 + 3.495 -0.224 0.272 0.164 0.032 -0.136 -0.079 -0.138 -0.146 -0.098 -0.022 -0.051 -0.011 + 3.268 0.335 0.300 0.205 -0.023 -0.146 -0.076 -0.093 -0.227 -0.146 -0.102 0.125 0.005 + 3.238 0.133 0.254 0.139 -0.132 0.008 -0.065 -0.112 -0.128 -0.156 0.081 0.032 -0.224 + 3.161 -0.012 0.164 0.077 -0.275 0.127 0.097 0.119 -0.004 -0.071 0.033 0.123 0.016 + 3.429 0.033 0.140 0.105 -0.188 -0.170 -0.155 -0.079 -0.069 0.002 0.066 0.103 -0.002 + 3.366 0.276 0.458 0.156 -0.103 0.005 -0.112 -0.160 -0.057 0.001 -0.048 0.050 -0.084 + 2.657 0.224 0.382 0.022 -0.185 -0.161 0.015 -0.003 -0.031 -0.225 0.014 0.121 -0.036 + 2.807 0.220 0.448 -0.022 -0.141 -0.155 0.016 0.088 -0.144 -0.170 0.090 0.143 -0.020 + 2.770 -0.062 0.381 0.009 -0.079 -0.166 -0.122 0.191 0.073 -0.118 0.011 0.124 0.007 + 2.940 0.261 0.439 0.016 -0.064 -0.075 0.079 -0.017 -0.232 -0.009 -0.212 -0.209 0.010 + 2.999 0.355 0.415 -0.174 -0.192 0.099 0.088 -0.159 -0.320 -0.083 -0.073 -0.037 -0.001 + 3.330 -0.027 0.754 -0.140 -0.089 -0.018 -0.135 0.062 -0.019 -0.103 -0.146 -0.058 -0.064 + 3.284 -0.304 0.702 -0.029 0.090 -0.108 -0.287 0.006 -0.033 -0.172 -0.128 -0.028 -0.057 + 3.274 -0.496 0.523 -0.136 0.228 0.110 -0.285 -0.006 -0.119 -0.058 -0.097 -0.003 0.085 + 3.671 -0.545 0.499 0.123 0.102 0.073 -0.187 -0.054 -0.241 -0.058 -0.276 -0.111 0.147 + 3.705 -0.648 0.334 0.169 -0.020 0.010 -0.186 -0.009 -0.160 0.189 0.095 0.157 0.026 + 4.411 -0.806 0.384 0.162 0.017 -0.010 0.028 -0.035 0.031 0.116 -0.025 0.006 -0.101 + 4.672 -0.960 0.103 -0.015 0.042 -0.052 -0.093 -0.182 -0.166 -0.071 0.030 -0.010 -0.048 + 4.248 -0.564 0.102 0.121 -0.151 0.014 -0.046 -0.043 -0.106 -0.045 -0.036 -0.192 -0.133 + 3.518 -0.680 0.019 0.182 -0.165 0.058 0.015 -0.023 -0.077 -0.059 -0.172 -0.152 -0.166 + 3.832 -0.292 -0.012 0.156 -0.560 -0.329 -0.254 0.052 -0.007 0.053 -0.037 0.131 -0.114 + 3.112 0.495 0.312 0.098 -0.360 -0.356 -0.088 0.158 -0.076 -0.134 -0.244 -0.038 0.102 + 2.946 -0.173 0.309 0.130 -0.203 0.101 -0.027 0.121 -0.090 -0.108 -0.090 -0.064 0.082 + 3.920 0.496 0.549 0.083 -0.474 0.111 -0.172 -0.041 -0.041 -0.041 -0.014 0.072 -0.064 + 4.310 0.757 0.606 -0.123 -0.468 0.143 0.035 -0.002 0.020 -0.040 -0.031 0.041 -0.057 + 4.758 0.777 0.454 0.078 -0.407 -0.026 0.026 0.056 -0.089 0.003 -0.162 0.066 -0.025 + 5.573 0.559 0.353 -0.104 -0.471 0.128 0.019 0.003 -0.096 -0.056 -0.018 -0.066 -0.196 + 6.506 0.395 0.349 0.132 -0.342 -0.038 -0.011 -0.248 -0.117 -0.063 -0.109 -0.042 -0.132 + 7.111 0.237 0.084 0.084 -0.227 -0.105 -0.090 -0.251 -0.100 -0.067 -0.073 -0.082 -0.093 + 6.813 0.129 0.237 -0.098 -0.234 0.024 -0.087 -0.024 -0.057 -0.102 -0.158 -0.013 -0.093 + 6.557 0.198 0.126 -0.154 -0.297 0.124 -0.097 -0.019 0.062 -0.065 -0.239 0.146 -0.012 + 6.608 0.370 -0.012 0.004 -0.296 0.069 -0.148 -0.008 -0.094 -0.054 -0.173 0.154 -0.080 + 6.865 0.303 0.174 0.067 -0.215 -0.002 0.021 -0.190 -0.250 -0.035 -0.234 -0.020 -0.173 + 6.150 -0.029 0.298 0.425 -0.167 -0.199 -0.360 -0.135 -0.034 0.075 -0.062 0.056 -0.143 + 6.981 -0.765 0.106 -0.079 -0.389 -0.424 -0.339 -0.121 0.042 0.202 0.020 0.295 0.236 + 7.741 -0.392 0.276 -0.032 -0.256 -0.096 -0.169 0.011 -0.047 0.080 0.020 -0.068 0.007 + 7.806 -0.262 0.292 0.120 -0.257 -0.193 -0.233 -0.169 -0.202 -0.098 -0.042 -0.037 -0.070 + 7.925 -0.529 0.152 0.154 -0.235 -0.090 -0.177 -0.362 -0.157 -0.055 0.048 0.056 -0.119 + 7.814 -0.593 -0.000 0.113 -0.334 -0.067 -0.133 -0.201 -0.045 0.055 0.055 0.110 0.007 + 7.457 -0.601 0.050 -0.100 -0.496 -0.147 -0.139 -0.304 -0.183 0.075 0.002 -0.091 0.046 + 7.825 -0.549 -0.014 0.096 -0.381 -0.115 -0.170 -0.356 -0.151 0.001 -0.120 0.014 -0.102 + 7.892 -0.567 0.024 0.083 -0.536 -0.361 -0.156 -0.304 -0.100 -0.143 -0.103 0.083 -0.055 + 7.246 -0.738 -0.174 0.059 -0.606 -0.310 -0.080 -0.326 -0.086 -0.014 0.031 0.079 -0.056 + 6.933 -0.676 0.006 0.069 -0.274 -0.125 0.120 -0.375 -0.090 0.029 0.015 -0.127 -0.079 + 6.765 -0.752 -0.255 0.116 -0.263 -0.267 0.130 -0.242 -0.102 -0.056 0.025 0.028 -0.077 + 6.903 -1.116 -0.361 0.142 -0.400 -0.260 0.127 -0.352 -0.129 -0.111 -0.018 0.037 -0.000 + 6.331 -1.373 -0.467 0.107 -0.048 -0.212 -0.191 -0.420 -0.123 -0.054 0.082 0.189 -0.055 + 6.221 -0.955 -0.306 0.157 -0.061 -0.107 -0.263 -0.344 -0.180 -0.023 0.013 0.149 -0.100 + 5.706 -0.786 -0.271 0.209 -0.006 0.125 -0.166 -0.456 -0.364 -0.024 -0.023 0.123 -0.045 + 5.137 0.025 -0.206 -0.067 -0.402 -0.183 -0.085 -0.042 0.048 -0.008 -0.078 0.051 -0.011 + 4.352 0.195 0.247 -0.185 -0.553 -0.032 0.017 -0.116 -0.090 0.012 -0.059 -0.022 -0.017 + 4.400 0.820 0.249 -0.024 -0.284 -0.152 -0.413 -0.233 -0.209 -0.086 -0.133 0.014 -0.088 + 6.370 1.122 -0.310 -0.082 -0.416 0.028 -0.438 -0.400 -0.062 -0.062 -0.164 -0.015 0.016 + 6.987 1.193 -0.506 -0.009 -0.518 0.105 -0.504 -0.505 -0.035 0.000 -0.186 -0.056 0.088 + 7.372 0.982 -0.384 -0.033 -0.532 0.155 -0.477 -0.546 -0.033 0.074 -0.208 -0.063 0.100 + 7.153 1.103 -0.428 0.064 -0.548 0.160 -0.422 -0.605 0.001 0.041 -0.193 -0.051 0.081 + 6.858 1.188 -0.369 0.085 -0.472 0.095 -0.363 -0.668 -0.037 0.034 -0.188 -0.012 0.041 + 6.600 1.121 -0.223 0.082 -0.346 0.080 -0.312 -0.586 -0.147 0.019 -0.171 -0.054 -0.027 + 6.243 1.005 -0.172 0.081 -0.159 0.109 -0.229 -0.566 -0.156 -0.030 -0.271 -0.051 -0.012 + 5.308 0.918 0.056 0.213 -0.118 0.027 -0.030 -0.392 -0.117 -0.063 -0.347 -0.232 0.040 + 4.596 0.600 0.206 0.269 0.020 0.060 -0.116 -0.311 -0.042 -0.091 -0.203 -0.002 0.028 + 4.334 0.608 0.298 -0.056 -0.035 -0.089 -0.375 -0.282 -0.038 -0.065 -0.022 0.072 0.081 + 3.912 0.502 0.321 0.153 0.022 -0.210 -0.349 -0.297 0.041 -0.032 -0.053 0.021 0.087 + 3.873 0.481 0.270 0.056 0.044 -0.202 -0.309 -0.248 -0.161 0.005 0.068 0.147 0.064 + 3.831 0.362 0.011 -0.055 -0.015 0.076 -0.223 -0.227 -0.057 0.016 0.043 0.056 0.061 + 3.902 0.498 0.177 -0.037 -0.189 0.028 -0.319 -0.225 -0.009 0.001 0.065 0.080 0.061 + 4.095 0.635 0.087 -0.054 -0.047 0.116 -0.100 -0.215 -0.009 -0.014 -0.015 -0.043 0.010 + 4.677 0.729 0.069 -0.214 -0.098 0.019 -0.022 -0.131 -0.121 0.144 0.091 -0.026 0.059 + 5.107 1.012 -0.137 -0.275 -0.113 0.088 0.049 -0.048 -0.004 0.202 -0.050 -0.072 0.012 + 5.367 1.192 -0.413 -0.305 -0.139 0.068 0.120 -0.053 -0.078 0.335 -0.032 -0.185 -0.068 + 5.659 1.268 -0.613 -0.285 -0.061 0.115 -0.061 -0.097 -0.034 0.251 -0.137 -0.133 -0.011 + 5.525 1.251 -0.469 -0.303 -0.243 0.093 -0.059 -0.124 -0.067 0.256 -0.082 -0.177 0.093 + 5.233 1.012 -0.426 -0.187 -0.156 -0.063 -0.127 -0.063 -0.041 0.232 -0.040 -0.014 0.065 + 4.766 0.825 -0.327 0.099 -0.236 -0.159 -0.192 -0.118 -0.027 0.125 0.045 0.025 0.144 + 4.212 0.736 -0.069 0.360 -0.263 -0.051 -0.084 -0.133 -0.044 0.258 0.143 0.007 0.115 + 3.036 0.657 0.051 0.084 -0.209 -0.090 -0.038 -0.099 -0.074 0.173 0.018 -0.064 -0.076 + 3.166 0.618 -0.051 0.099 -0.127 0.006 0.107 -0.113 -0.078 0.149 0.025 0.127 0.046 + 2.628 0.737 0.184 0.287 0.046 -0.016 -0.004 -0.026 0.103 0.067 -0.049 0.099 0.054 + 2.560 0.630 -0.098 0.079 0.120 0.189 -0.146 -0.090 0.076 0.085 -0.048 0.067 -0.032 + 2.505 0.661 -0.125 -0.020 -0.095 0.024 -0.216 -0.136 -0.106 -0.101 0.017 -0.059 -0.046 + 2.296 0.593 0.039 0.194 -0.032 -0.083 -0.232 -0.171 0.010 -0.089 0.045 -0.006 -0.022 + 2.471 0.811 0.119 0.242 0.069 0.010 -0.066 -0.188 -0.210 -0.008 0.131 -0.048 -0.005 + 2.577 0.824 -0.149 -0.018 0.058 -0.041 -0.162 -0.105 -0.030 0.149 0.084 -0.059 0.087 + 4.703 0.126 0.509 0.289 -0.057 0.191 -0.041 -0.323 -0.082 -0.095 -0.039 -0.204 -0.013 + 7.208 -0.276 0.039 0.290 0.150 0.270 -0.278 -0.392 -0.039 0.015 -0.006 -0.367 0.042 + 5.039 -0.476 -0.274 0.092 0.018 0.311 -0.153 -0.255 0.178 0.268 0.239 -0.249 -0.061 + 2.339 0.025 0.038 0.111 -0.011 0.170 -0.036 -0.016 0.009 0.093 0.123 0.007 0.084 + 3.295 -0.182 0.241 -0.114 0.083 0.088 -0.031 -0.186 -0.260 -0.021 0.022 0.006 0.045 + 3.568 -0.275 -0.018 0.083 0.175 -0.020 -0.060 -0.103 -0.142 -0.126 -0.090 0.015 0.020 + 4.937 -1.005 0.010 0.257 -0.132 -0.074 0.100 -0.302 0.048 0.140 0.043 -0.010 -0.050 + 5.580 -0.798 0.030 0.250 -0.411 0.034 0.108 -0.305 -0.129 0.128 -0.008 -0.054 -0.142 + 5.663 -1.357 -0.157 0.319 -0.189 0.226 -0.027 -0.159 -0.045 0.172 0.073 0.085 -0.091 + 5.147 -0.730 -0.010 0.330 -0.005 0.105 0.021 -0.113 -0.191 0.111 0.056 -0.145 -0.019 + 5.462 -0.142 0.123 0.123 0.164 -0.167 -0.203 -0.410 -0.241 0.222 -0.044 -0.118 -0.040 + 5.039 -0.131 0.498 0.103 -0.175 -0.191 -0.135 -0.133 0.063 0.030 0.017 0.007 -0.005 + 4.652 0.229 0.459 0.187 0.013 -0.229 -0.218 -0.179 -0.089 -0.070 -0.049 -0.137 0.002 + 4.106 0.067 -0.074 0.182 0.007 -0.040 -0.112 -0.210 -0.036 -0.125 -0.117 -0.057 0.019 + 4.200 -0.095 0.077 0.106 -0.064 -0.045 -0.057 -0.132 -0.125 -0.032 -0.092 -0.158 -0.054 + 3.872 0.224 0.103 0.066 -0.201 -0.085 0.047 -0.164 -0.079 -0.073 -0.077 -0.150 -0.228 + 3.791 0.042 0.087 0.049 -0.279 -0.097 0.026 -0.157 -0.175 -0.080 -0.107 0.036 -0.065 + 2.997 0.114 0.026 0.170 -0.056 0.093 -0.097 -0.114 -0.074 0.034 0.022 0.004 0.052 + 2.797 0.253 0.181 0.022 -0.228 0.017 -0.123 -0.130 -0.201 -0.131 0.005 0.046 -0.154 + 3.117 -0.370 -0.054 0.128 -0.281 0.067 -0.218 -0.181 -0.055 -0.147 -0.109 0.108 0.028 + 3.589 -0.339 -0.061 0.013 -0.177 0.107 0.072 -0.156 -0.016 0.041 0.027 0.019 -0.023 + 3.846 -0.115 0.146 -0.246 -0.252 0.199 0.107 -0.127 -0.035 0.037 -0.070 0.029 0.079 + 4.732 -1.154 0.098 0.124 0.140 0.169 -0.182 -0.194 -0.133 0.044 0.044 -0.004 -0.014 + 4.123 -0.857 0.174 0.081 -0.101 -0.021 -0.146 -0.136 -0.020 0.131 0.045 0.046 -0.004 + 5.101 0.351 0.674 -0.036 -0.418 -0.297 -0.354 -0.093 -0.284 -0.135 -0.136 -0.035 -0.002 + 4.679 -0.099 0.329 0.283 -0.116 -0.316 -0.228 -0.269 -0.255 0.082 -0.079 0.054 -0.086 + 6.667 -0.293 0.116 0.159 -0.442 -0.425 -0.181 -0.153 -0.279 0.086 0.007 -0.094 0.124 + 6.740 -0.342 0.208 0.222 -0.649 -0.358 -0.173 -0.294 -0.123 0.122 -0.069 -0.142 -0.000 + 6.019 -0.346 0.231 0.661 -0.842 -0.418 -0.299 -0.295 -0.235 0.063 0.045 0.046 -0.168 + 5.850 -0.282 0.127 0.557 -0.960 -0.465 -0.285 0.039 -0.257 0.023 -0.039 0.052 -0.110 + 4.296 -0.279 0.073 0.439 -0.328 -0.240 -0.270 -0.014 -0.227 0.080 -0.098 -0.017 -0.172 + 3.524 -0.156 0.333 0.252 -0.377 -0.392 -0.214 -0.061 -0.216 0.068 -0.174 0.001 -0.022 + 3.686 0.042 0.635 0.301 -0.294 -0.316 -0.167 -0.202 -0.254 -0.074 0.019 0.044 0.010 + 3.588 0.392 0.436 0.428 -0.356 -0.089 -0.113 -0.023 -0.256 -0.196 -0.104 -0.064 -0.067 + 3.235 0.071 0.288 0.263 -0.203 -0.186 -0.019 -0.066 -0.131 -0.110 -0.366 -0.105 -0.038 + 4.021 0.113 0.233 0.056 -0.389 -0.253 -0.075 -0.211 -0.170 -0.094 -0.211 0.053 0.031 + 3.723 -0.404 0.297 0.191 -0.351 -0.286 -0.184 -0.244 -0.091 -0.254 0.096 0.235 0.027 + 4.949 -0.144 -0.110 0.506 -0.278 -0.586 -0.523 -0.402 -0.024 -0.255 -0.013 0.308 0.143 + 6.283 -0.374 -0.528 0.294 -0.515 -0.526 -0.727 -0.476 -0.069 -0.301 -0.152 0.421 0.081 + 7.131 -0.316 -0.367 0.178 -0.516 -0.353 -0.741 -0.306 0.032 -0.199 -0.330 0.440 -0.091 + 7.342 -0.301 -0.409 0.052 -0.649 -0.369 -0.848 -0.221 0.143 -0.038 -0.330 0.416 -0.201 + 7.286 -0.372 -0.419 -0.027 -0.644 -0.272 -0.688 -0.085 0.295 0.097 -0.426 0.303 -0.241 + 7.419 -0.091 -0.292 0.028 -0.641 -0.327 -0.720 -0.126 0.329 0.188 -0.452 0.209 -0.159 + 7.205 0.048 -0.390 -0.283 -0.760 -0.328 -0.687 -0.216 0.283 0.081 -0.460 0.212 -0.160 + 7.052 0.186 0.292 -0.341 -0.537 -0.237 -0.628 -0.121 0.149 -0.039 -0.092 0.254 -0.241 + 6.561 0.338 -0.023 -0.171 -0.366 -0.197 -0.755 -0.196 0.063 0.040 -0.253 0.337 -0.189 + 5.655 0.709 -0.293 -0.176 -0.313 -0.138 -0.457 -0.236 0.091 0.055 -0.115 0.069 -0.128 + 4.947 0.611 -0.239 -0.126 -0.235 -0.109 -0.345 -0.008 0.208 0.051 -0.279 0.034 -0.118 + 4.956 0.754 0.047 -0.004 -0.362 -0.247 -0.264 -0.196 -0.025 0.195 -0.205 0.089 -0.141 + 4.671 0.590 -0.112 0.008 -0.184 -0.093 -0.208 -0.225 -0.284 -0.072 -0.145 -0.041 -0.180 + 4.510 0.511 -0.340 -0.172 -0.202 -0.315 -0.313 -0.332 -0.188 0.030 -0.120 -0.118 -0.112 + 4.588 0.372 -0.237 -0.182 -0.371 -0.156 -0.260 -0.286 -0.084 0.063 -0.060 -0.068 0.050 + 4.808 0.404 -0.354 -0.160 -0.407 -0.176 -0.298 -0.374 -0.220 0.061 -0.104 -0.030 0.032 + 4.933 0.365 -0.136 -0.119 -0.254 -0.257 -0.302 -0.309 -0.055 -0.001 -0.155 0.009 -0.064 + 5.158 0.418 -0.033 0.012 -0.164 -0.108 -0.237 -0.093 -0.144 -0.035 -0.250 -0.047 -0.084 + 5.228 0.431 -0.180 0.029 -0.162 0.011 -0.192 -0.278 -0.217 -0.156 -0.224 0.016 -0.012 + 5.393 0.600 0.068 -0.322 -0.198 -0.158 -0.216 -0.264 -0.189 -0.064 -0.158 -0.068 0.008 + 5.069 0.835 0.184 -0.225 -0.395 -0.137 -0.300 -0.266 -0.151 -0.067 -0.169 -0.111 0.065 + 7.129 -0.237 0.060 -0.183 -0.281 -0.330 -0.213 -0.198 -0.194 -0.051 -0.129 0.080 0.031 + 6.148 -0.044 -0.043 -0.475 -0.585 -0.430 -0.218 -0.161 -0.207 -0.095 -0.185 0.025 0.034 + 5.101 0.827 0.022 -0.528 -0.507 0.247 -0.334 -0.016 -0.131 -0.304 -0.155 -0.169 -0.133 + 4.992 0.930 -0.042 -0.478 -0.464 0.030 -0.286 -0.039 -0.082 -0.089 -0.111 -0.104 -0.163 + 5.207 1.052 -0.336 -0.661 -0.388 0.078 -0.378 -0.110 -0.171 0.079 -0.015 -0.051 -0.139 + 5.732 1.028 -0.510 -0.660 -0.294 0.262 -0.477 -0.127 -0.060 0.112 -0.110 -0.098 -0.197 + 5.989 0.509 -0.685 -0.441 -0.310 0.283 -0.421 -0.036 0.045 0.010 -0.225 -0.160 -0.315 + 6.623 0.064 -0.914 -0.420 -0.705 0.046 -0.424 0.187 0.203 -0.017 -0.276 0.092 -0.018 + 7.072 0.009 -0.949 -0.169 -0.703 -0.131 -0.545 0.201 0.217 -0.073 -0.273 0.186 -0.147 + 7.442 -0.243 -0.859 -0.113 -0.696 -0.218 -0.401 0.379 0.122 0.033 -0.218 0.263 -0.124 + 7.023 -0.462 -0.800 -0.001 -0.836 -0.430 -0.257 0.198 -0.040 0.131 -0.155 0.032 -0.272 + 6.806 -0.404 -0.502 0.269 -0.739 -0.455 -0.144 0.152 -0.125 0.254 -0.236 0.019 -0.174 + 6.514 -0.543 -0.385 0.327 -0.851 -0.513 -0.164 0.021 -0.266 0.042 -0.113 0.148 -0.015 + 5.840 -0.702 -0.262 0.444 -0.608 -0.442 0.070 0.001 -0.165 0.015 -0.093 0.143 -0.056 + 4.838 -0.355 -0.477 0.301 -0.349 -0.133 0.136 -0.189 -0.229 0.031 -0.120 0.049 -0.043 + 5.229 -0.383 0.040 0.158 -0.176 -0.132 -0.204 -0.126 -0.023 -0.090 -0.185 -0.110 0.031 + 5.389 -0.291 0.235 -0.067 0.018 -0.056 -0.267 -0.150 -0.041 -0.105 -0.213 -0.015 -0.002 + 7.062 -0.525 0.272 0.186 -0.134 -0.109 -0.459 -0.296 -0.162 -0.151 -0.147 -0.158 -0.108 + 7.790 -0.834 0.078 0.288 -0.033 0.034 -0.284 -0.262 -0.183 -0.161 -0.055 0.003 -0.151 + 7.371 -0.501 -0.063 0.041 -0.005 -0.067 -0.275 -0.176 -0.055 -0.025 0.066 -0.115 -0.091 + 7.401 -0.248 -0.128 -0.172 -0.163 -0.047 -0.100 -0.299 -0.109 0.020 -0.076 -0.262 -0.068 + 6.283 -0.085 -0.373 0.027 -0.558 0.046 -0.035 -0.074 -0.133 0.039 -0.110 -0.167 -0.049 + 6.338 -0.227 -0.335 0.201 -0.534 -0.229 -0.256 -0.343 -0.270 -0.099 -0.003 0.143 -0.090 + 8.060 -0.383 -0.304 0.217 -0.330 -0.142 -0.310 -0.198 -0.031 0.087 -0.004 0.089 -0.129 + 6.399 -0.537 -0.201 0.184 -0.275 -0.010 -0.168 0.004 -0.273 0.069 0.052 0.091 -0.069 + 4.853 0.048 -0.055 0.225 -0.223 -0.100 -0.080 -0.211 -0.307 0.053 0.073 0.030 -0.057 + 5.730 -0.532 -0.101 0.472 -0.664 -0.170 -0.118 -0.041 -0.171 0.084 0.117 0.049 -0.026 + 5.904 -0.373 -0.109 0.381 -0.503 -0.075 -0.304 -0.125 -0.273 -0.024 0.039 0.150 -0.031 + 6.211 -0.424 -0.335 0.243 -0.498 -0.165 -0.227 -0.253 -0.237 0.207 -0.071 -0.021 -0.182 + 6.143 -0.356 -0.084 0.412 -0.325 -0.080 -0.109 -0.418 -0.446 -0.009 -0.341 -0.128 -0.134 + 6.735 -0.522 -0.098 0.376 -0.117 -0.019 -0.207 -0.322 -0.385 -0.139 -0.246 -0.039 -0.149 + 6.516 -0.635 0.047 0.441 -0.062 -0.116 -0.113 -0.187 -0.265 -0.203 -0.178 -0.162 -0.345 + 5.985 -0.397 0.387 0.258 -0.243 -0.012 -0.114 -0.353 -0.338 -0.025 -0.256 -0.079 -0.141 + 5.471 -0.436 0.561 0.494 -0.363 -0.059 -0.068 -0.358 -0.274 0.163 -0.248 -0.072 -0.142 + 5.139 -0.505 0.462 0.352 -0.306 -0.051 0.148 -0.329 -0.365 0.035 -0.517 -0.166 -0.094 + 5.228 -0.295 0.681 0.522 -0.368 -0.144 0.201 -0.187 -0.308 0.039 -0.510 -0.195 -0.164 + 6.744 0.023 0.358 0.271 -0.557 -0.117 -0.043 -0.266 -0.268 0.066 -0.299 0.011 -0.014 + 7.109 0.190 0.416 -0.234 -0.609 -0.061 -0.144 -0.376 -0.334 -0.163 -0.190 -0.042 -0.023 + 6.812 0.242 0.224 -0.126 -0.600 0.022 -0.197 -0.369 -0.278 -0.046 -0.235 0.040 -0.079 + 4.897 0.118 0.269 0.009 -0.597 0.021 -0.181 -0.299 -0.232 -0.082 -0.017 -0.057 -0.113 + 4.935 -0.047 0.399 0.195 -0.503 -0.144 -0.326 -0.451 -0.261 -0.142 -0.043 0.144 -0.025 + 4.834 -0.166 -0.004 0.110 -0.631 -0.044 -0.243 -0.254 -0.047 0.102 -0.047 0.225 0.015 + 5.014 -0.486 -0.289 0.044 -0.482 0.177 -0.052 -0.241 -0.179 0.157 -0.039 0.016 -0.083 + 5.096 -0.682 -0.109 0.185 -0.513 -0.017 -0.426 -0.287 -0.168 0.086 -0.087 -0.056 0.023 + 4.672 0.146 0.066 0.280 -0.469 -0.377 -0.478 -0.386 -0.112 -0.002 -0.111 -0.081 0.012 + 2.948 0.113 0.015 0.273 -0.371 -0.092 -0.151 -0.224 -0.093 -0.042 -0.172 0.001 -0.027 + 2.381 0.257 0.129 0.351 -0.195 -0.057 -0.103 -0.078 -0.114 0.074 -0.212 0.078 0.038 + 2.392 0.386 0.107 0.118 -0.181 -0.052 0.005 -0.047 -0.041 0.010 -0.091 0.174 -0.128 + 2.401 0.244 0.090 0.028 0.017 0.074 -0.085 -0.114 -0.019 -0.079 -0.083 -0.194 -0.254 + 2.500 0.167 -0.009 0.010 0.007 0.202 0.011 -0.150 -0.053 0.025 -0.160 -0.056 -0.349 + 3.292 0.321 0.003 -0.104 -0.155 0.035 -0.304 -0.102 -0.102 0.184 0.078 0.030 -0.081 + 5.785 0.405 -0.547 -0.364 -0.427 0.063 -0.833 -0.117 -0.040 0.298 -0.145 0.049 0.018 + 6.724 0.250 -0.586 -0.505 -0.550 0.041 -0.923 -0.060 0.025 0.094 -0.346 0.016 -0.019 + 7.161 0.043 -0.620 -0.363 -0.582 0.144 -0.953 -0.094 0.021 0.032 -0.411 -0.009 -0.099 + 7.201 -0.052 -0.765 -0.274 -0.556 0.235 -0.980 -0.188 -0.095 0.019 -0.411 0.036 -0.126 + 7.383 0.109 -0.723 -0.279 -0.673 0.242 -0.857 0.064 -0.102 0.005 -0.415 0.022 -0.145 + 7.470 0.196 -0.695 -0.277 -0.579 0.219 -0.874 0.006 -0.032 -0.057 -0.445 0.169 -0.177 + 7.488 -0.048 -0.734 -0.386 -0.590 -0.045 -0.971 0.036 -0.085 -0.207 -0.401 0.184 -0.233 + 7.954 -0.202 -0.647 -0.180 -0.509 -0.098 -0.828 0.171 -0.023 0.034 -0.387 0.133 -0.469 + 7.663 -0.082 -0.772 -0.216 -0.753 -0.248 -0.539 0.265 0.115 -0.081 -0.331 0.183 -0.501 + 6.902 -0.159 -0.721 -0.215 -0.806 -0.347 -0.618 0.308 0.213 -0.057 -0.300 0.257 -0.281 + 6.115 -0.050 -0.637 -0.040 -0.627 -0.363 -0.645 0.272 0.109 -0.006 -0.154 0.308 -0.213 + 5.342 0.133 -0.498 0.091 -0.642 -0.518 -0.579 0.184 0.016 0.064 -0.062 0.193 -0.579 + 5.574 0.272 -0.524 0.146 -0.663 -0.518 -0.653 0.213 0.127 0.121 0.129 0.203 -0.199 + 5.434 0.385 -0.483 0.175 -0.712 -0.412 -0.762 0.156 0.166 -0.049 -0.091 0.121 -0.172 + 5.376 0.030 -0.560 0.240 -0.740 -0.267 -0.751 -0.030 0.040 -0.123 -0.011 0.221 -0.101 + 5.024 0.354 -0.550 0.270 -0.539 -0.253 -0.660 -0.072 -0.047 -0.115 -0.067 0.157 -0.126 + 4.649 0.353 -0.290 0.093 -0.330 -0.207 -0.572 -0.080 0.139 -0.076 -0.009 0.331 -0.105 + 4.349 0.327 -0.139 0.071 -0.224 -0.187 -0.628 -0.172 -0.038 -0.167 0.132 0.176 -0.205 + 3.967 0.159 -0.192 0.022 -0.237 -0.092 -0.374 0.080 0.096 -0.075 -0.102 -0.002 -0.117 + 3.824 0.349 -0.181 0.039 -0.186 -0.220 -0.318 0.077 -0.057 -0.024 -0.012 0.091 -0.033 + 3.527 0.151 -0.357 -0.173 -0.194 -0.192 -0.535 0.065 -0.161 0.064 0.063 0.038 -0.035 + 3.795 0.166 -0.274 0.109 0.100 0.006 -0.156 0.061 0.042 0.010 -0.038 0.087 -0.271 + 3.642 0.304 -0.186 0.131 -0.156 0.052 -0.345 -0.001 0.011 0.012 0.043 0.022 -0.199 + 3.766 0.228 -0.236 0.081 -0.097 0.063 -0.364 -0.002 -0.030 -0.103 0.022 0.134 0.001 + 3.438 0.104 -0.320 -0.028 -0.171 0.113 -0.176 0.063 0.042 -0.125 0.040 0.125 0.070 + 3.310 -0.019 -0.480 0.017 -0.112 -0.017 -0.275 -0.096 0.034 0.011 0.089 0.054 -0.057 + 3.341 0.030 -0.516 0.050 -0.071 -0.038 -0.176 0.061 0.175 0.085 0.128 0.168 0.043 + 3.390 0.244 -0.452 0.087 -0.014 0.102 -0.214 0.013 0.006 -0.099 0.090 -0.003 -0.111 + 3.485 0.293 -0.203 0.042 0.043 -0.043 -0.218 -0.060 0.057 0.018 -0.093 0.207 0.072 + 3.237 0.077 -0.350 -0.103 -0.070 -0.020 -0.095 0.038 0.167 -0.021 -0.013 0.062 0.097 + 3.164 0.259 -0.063 -0.070 -0.164 0.053 -0.293 -0.009 0.132 0.024 -0.072 0.096 0.139 + 3.105 0.177 -0.157 -0.094 -0.285 -0.205 -0.164 -0.003 0.027 -0.075 0.070 0.022 -0.043 + 2.999 -0.071 -0.436 -0.103 -0.060 -0.070 -0.168 -0.001 0.050 0.048 0.123 0.050 -0.014 + 3.186 0.147 -0.442 0.003 -0.035 -0.056 -0.258 0.015 -0.024 -0.043 -0.015 -0.051 -0.022 + 3.002 0.193 -0.252 -0.159 -0.005 0.016 -0.155 -0.148 -0.106 -0.088 0.168 0.121 0.029 + 3.002 0.257 -0.139 -0.056 0.017 -0.015 -0.215 -0.105 -0.041 0.028 -0.097 0.208 0.202 + 2.877 0.333 -0.063 -0.032 -0.199 -0.060 -0.124 0.005 -0.039 -0.066 -0.048 0.044 -0.099 + 2.787 0.151 -0.364 0.159 -0.098 -0.200 -0.244 -0.062 -0.020 0.153 -0.033 0.010 0.028 + 2.460 0.033 -0.355 0.029 -0.210 -0.154 -0.126 0.112 0.097 0.141 -0.149 -0.035 0.136 + 2.395 0.144 -0.295 0.043 -0.157 -0.027 -0.253 -0.001 -0.180 0.061 -0.067 0.029 0.057 + 2.528 0.104 -0.304 0.114 -0.124 -0.149 -0.101 -0.129 -0.086 0.077 0.066 0.131 0.036 + 2.164 0.020 -0.270 0.160 -0.015 0.019 -0.128 -0.172 -0.010 0.233 0.117 0.168 0.109 + 2.284 0.277 -0.275 0.242 -0.058 -0.027 -0.203 -0.146 -0.101 0.072 0.085 0.219 0.040 + 2.289 0.226 -0.252 0.135 -0.233 -0.091 -0.119 -0.079 0.011 -0.041 0.122 0.199 0.003 + 2.214 0.175 -0.299 -0.028 -0.305 -0.107 -0.043 -0.112 -0.066 0.089 0.144 0.183 0.030 + 2.008 0.296 0.027 0.142 -0.032 0.048 -0.293 -0.155 -0.047 0.002 0.024 -0.038 -0.044 + 1.586 0.077 -0.193 0.173 -0.164 -0.030 -0.217 -0.054 -0.003 0.074 0.018 -0.040 -0.090 + 1.384 0.114 -0.564 -0.046 0.087 -0.136 -0.202 0.065 0.123 -0.004 -0.028 0.096 0.056 + 1.495 0.265 -0.294 0.095 0.069 0.098 -0.290 -0.153 -0.037 0.017 -0.019 0.037 0.016 + 1.385 0.419 -0.052 -0.002 -0.066 0.048 -0.201 -0.185 0.102 0.031 0.092 0.033 0.043 + 1.442 0.436 -0.297 -0.056 0.070 -0.150 -0.370 -0.158 0.027 0.063 0.192 -0.035 -0.017 + 1.224 -0.086 -0.267 -0.102 -0.335 0.083 -0.035 0.026 -0.073 0.073 0.274 0.185 0.107 + 1.579 0.268 -0.272 -0.346 0.029 0.170 0.031 0.035 -0.153 0.083 0.244 0.203 0.074 + 1.800 0.400 -0.100 -0.286 -0.259 -0.008 -0.181 -0.137 -0.080 -0.042 -0.088 0.162 0.089 + 2.027 0.500 0.034 -0.025 -0.081 -0.035 -0.002 -0.147 0.102 0.172 -0.077 0.052 -0.121 + 1.321 0.490 -0.127 0.007 -0.088 -0.008 -0.238 -0.245 0.128 -0.005 0.076 0.052 0.062 + 1.812 0.350 -0.131 0.434 0.186 0.195 -0.251 -0.299 -0.046 0.112 0.093 0.125 0.055 + 1.507 -0.108 -0.349 0.188 0.268 0.113 -0.090 -0.087 -0.050 0.044 0.011 0.031 0.013 + 2.020 0.490 -0.227 0.219 0.013 -0.034 -0.027 -0.212 -0.168 -0.098 0.028 0.051 0.029 + 2.610 0.544 0.060 0.392 0.008 -0.075 -0.261 -0.349 -0.111 -0.085 0.060 0.007 -0.050 + 2.775 0.000 -0.228 0.163 -0.224 -0.060 -0.161 -0.072 0.040 -0.065 -0.040 -0.001 -0.071 + 2.420 -0.249 -0.174 0.294 -0.150 -0.156 -0.110 -0.211 -0.010 0.069 0.107 0.132 -0.044 + 2.226 -0.072 -0.172 -0.052 -0.214 -0.020 -0.075 -0.109 -0.165 0.042 0.057 0.085 -0.047 + 2.216 0.147 -0.002 0.242 -0.003 0.031 -0.007 0.121 -0.091 -0.025 -0.127 0.004 0.048 + 2.250 0.110 -0.130 0.234 0.024 -0.064 0.094 0.024 0.033 0.036 -0.053 -0.033 -0.153 + 2.525 0.282 -0.429 0.131 -0.056 -0.000 -0.007 -0.205 0.034 0.211 0.156 0.017 0.029 + 2.322 0.024 -0.418 0.059 0.045 0.054 -0.073 -0.283 -0.026 0.050 0.203 0.053 -0.059 + 2.484 0.243 -0.126 0.071 -0.039 0.141 0.049 -0.124 -0.050 -0.014 0.084 0.002 0.028 + 2.399 0.385 -0.442 -0.058 0.076 0.227 0.070 -0.161 -0.078 -0.073 -0.055 -0.054 0.116 + 2.401 0.176 -0.361 0.048 0.172 0.178 0.024 -0.108 -0.023 0.061 -0.123 0.029 -0.022 + 2.772 -0.054 -0.366 0.043 0.098 -0.019 0.021 -0.037 -0.047 0.021 0.074 0.116 0.062 + 2.754 -0.517 -0.389 -0.122 0.067 0.119 0.211 -0.039 -0.035 0.018 -0.105 -0.067 -0.065 + 3.117 -0.817 -0.323 -0.058 0.020 0.145 0.089 -0.102 -0.057 0.202 0.079 0.019 0.056 + 3.579 -1.031 -0.143 -0.036 -0.318 -0.101 0.134 0.182 -0.121 0.307 0.136 -0.052 0.097 + 4.525 -0.730 0.037 0.000 -0.224 -0.013 -0.004 0.121 -0.155 0.114 0.021 -0.061 -0.018 + 4.905 -0.812 -0.080 -0.122 -0.169 -0.064 -0.101 -0.124 -0.225 0.126 -0.088 -0.030 -0.029 + 5.158 -1.067 0.027 -0.094 -0.201 -0.023 0.028 -0.130 -0.052 -0.026 -0.137 -0.009 -0.075 + 5.502 -1.149 -0.046 0.075 0.062 0.002 -0.210 -0.072 -0.123 0.064 -0.122 0.018 0.034 + 5.309 -1.284 -0.238 0.014 0.116 0.047 -0.128 0.081 -0.031 0.158 0.107 -0.007 -0.036 + 5.790 -1.177 -0.063 0.273 0.086 -0.067 -0.359 -0.168 -0.122 0.118 0.047 0.027 0.155 + 5.873 -1.280 -0.178 -0.063 -0.117 -0.176 0.081 -0.148 -0.219 0.230 -0.016 -0.013 -0.056 + 5.855 -1.130 -0.482 -0.039 0.102 -0.045 0.108 0.034 -0.200 0.088 -0.081 -0.156 -0.074 + 5.773 -1.242 -0.413 -0.081 -0.012 0.031 -0.002 0.014 -0.139 0.034 -0.091 -0.129 -0.073 + 5.491 -1.095 -0.271 0.112 0.088 0.017 -0.000 0.069 -0.200 -0.095 0.005 -0.056 0.158 + 5.297 -1.334 -0.118 0.204 0.014 0.030 0.024 0.021 -0.077 0.014 0.060 -0.086 0.075 + 4.699 -1.375 -0.251 -0.021 -0.008 -0.251 -0.004 0.094 0.097 0.137 -0.051 0.037 0.048 + 5.206 -1.122 -0.182 0.000 -0.077 -0.021 -0.115 -0.026 -0.133 0.082 -0.069 -0.045 -0.016 + 5.454 -1.044 -0.242 0.007 -0.116 -0.083 0.133 -0.067 -0.328 0.177 -0.006 0.020 -0.055 + 4.964 -0.795 -0.226 0.062 -0.098 -0.079 0.099 -0.111 -0.243 0.095 0.076 -0.040 0.026 + 4.616 -0.365 0.047 -0.117 0.064 0.066 0.014 0.023 -0.247 -0.004 -0.002 0.088 0.024 + 4.800 -0.377 -0.471 0.351 0.117 0.173 -0.217 -0.226 -0.055 -0.047 -0.015 -0.017 -0.012 + 4.496 -0.461 -0.490 0.270 0.024 0.092 -0.366 -0.156 0.032 0.095 -0.021 0.056 -0.008 + 3.142 0.177 -0.114 0.028 0.126 0.044 -0.155 -0.109 0.012 0.160 0.050 0.045 -0.127 + 2.529 0.230 0.179 0.183 0.052 0.139 -0.041 0.051 -0.033 0.006 -0.007 -0.084 -0.104 + 4.906 -0.620 0.463 0.159 0.194 -0.330 0.055 -0.204 -0.319 0.026 0.040 -0.125 0.191 + 4.592 -0.818 0.389 0.281 0.159 -0.215 0.057 -0.266 -0.187 0.054 0.084 -0.172 0.202 + 2.351 0.018 -0.042 -0.071 0.093 0.239 0.109 -0.287 -0.096 0.021 -0.084 0.220 0.065 + 3.081 -0.303 0.116 -0.180 0.077 0.036 -0.142 -0.320 -0.223 -0.002 -0.083 0.098 0.023 + 3.253 -0.436 0.315 -0.005 0.138 0.353 -0.330 -0.200 -0.119 0.115 0.030 0.091 0.020 + 3.110 0.252 0.262 0.093 0.068 -0.055 -0.184 -0.137 -0.141 0.001 -0.049 0.110 -0.075 + 2.867 0.223 0.182 0.277 -0.137 -0.102 -0.186 -0.175 -0.087 -0.036 -0.024 0.141 -0.000 + 4.543 0.087 0.262 0.260 -0.324 0.018 -0.200 -0.096 -0.093 0.007 -0.046 0.132 -0.142 + 9.861 -0.297 0.566 0.217 -0.052 -0.205 -0.238 -0.166 -0.075 -0.246 -0.081 0.058 -0.245 + 12.345 -0.380 0.412 0.442 0.002 -0.284 -0.445 -0.161 -0.317 -0.352 -0.184 -0.104 -0.339 + 13.929 -0.458 0.120 0.624 -0.284 -0.205 -0.645 0.010 -0.585 -0.313 -0.282 0.037 -0.346 + 14.748 -0.547 0.135 0.641 -0.405 -0.248 -0.724 0.066 -0.640 -0.314 -0.266 0.020 -0.371 + 14.912 -0.590 0.153 0.673 -0.436 -0.240 -0.789 0.091 -0.679 -0.325 -0.288 0.064 -0.470 + 14.911 -0.665 0.206 0.721 -0.408 -0.286 -0.759 0.053 -0.690 -0.318 -0.297 0.075 -0.496 + 14.667 -0.597 0.223 0.709 -0.386 -0.269 -0.744 0.036 -0.694 -0.267 -0.328 0.088 -0.528 + 13.997 -0.511 0.215 0.682 -0.286 -0.208 -0.691 0.032 -0.609 -0.254 -0.381 0.122 -0.511 + 12.119 -0.109 0.125 0.196 -0.327 -0.337 -0.351 0.134 -0.427 -0.191 -0.392 0.060 -0.348 + 7.671 0.195 0.558 0.403 0.020 -0.095 -0.151 0.193 -0.263 -0.017 -0.374 0.017 -0.287 + 6.307 0.322 0.534 0.626 0.131 -0.040 -0.313 0.375 -0.221 -0.095 -0.363 0.193 -0.430 + 6.107 0.459 0.630 0.791 0.091 -0.083 -0.328 0.246 -0.156 -0.073 -0.190 0.216 -0.435 + 5.988 0.563 0.541 0.716 0.057 -0.070 -0.340 0.343 -0.205 -0.087 -0.285 0.250 -0.385 + 7.369 0.175 0.420 0.420 0.418 -0.010 -0.081 -0.278 -0.249 -0.128 -0.265 0.139 -0.328 + 11.081 -0.511 0.330 0.191 0.103 -0.219 -0.198 -0.201 -0.206 -0.296 -0.272 -0.017 -0.444 + 11.855 -0.867 0.424 0.278 0.064 -0.392 -0.281 -0.047 -0.242 -0.329 -0.133 -0.020 -0.310 + 12.547 -0.465 0.225 0.380 -0.092 -0.342 -0.368 -0.040 -0.438 -0.337 -0.298 0.032 -0.466 + 13.393 -0.339 0.073 0.544 -0.092 -0.432 -0.418 -0.139 -0.560 -0.297 -0.165 -0.020 -0.480 + 13.453 -0.145 0.031 0.660 -0.236 -0.412 -0.479 -0.113 -0.557 -0.277 -0.181 -0.073 -0.484 + 13.565 -0.063 -0.081 0.715 -0.407 -0.321 -0.506 -0.118 -0.500 -0.284 -0.232 -0.064 -0.501 + 13.135 0.040 -0.157 0.730 -0.349 -0.282 -0.525 -0.071 -0.490 -0.278 -0.250 -0.062 -0.537 + 12.013 0.099 -0.144 0.626 -0.109 -0.290 -0.373 -0.025 -0.442 -0.326 -0.279 0.009 -0.563 + 8.713 -0.020 0.263 0.591 0.096 -0.264 -0.296 0.097 -0.327 -0.237 -0.307 0.165 -0.424 + 5.951 0.349 0.607 0.620 0.199 -0.272 -0.015 0.241 -0.072 -0.241 -0.162 0.046 -0.387 + 6.095 0.238 0.391 0.331 0.028 -0.010 0.182 0.378 -0.120 -0.139 -0.217 -0.202 -0.338 + 6.048 0.302 0.743 0.207 0.046 -0.157 -0.051 0.225 -0.106 -0.228 -0.198 -0.115 -0.314 + 5.696 0.170 0.685 0.008 0.126 -0.173 -0.039 -0.167 -0.090 -0.171 -0.107 -0.163 -0.167 + 5.822 -0.069 0.893 0.234 0.252 -0.148 0.078 -0.199 -0.188 -0.309 -0.063 -0.247 -0.228 + 5.976 -0.219 0.854 0.184 0.115 0.033 0.010 0.117 -0.188 -0.276 -0.075 -0.327 -0.348 + 8.700 -0.469 0.521 -0.130 -0.111 0.097 -0.094 -0.010 -0.070 -0.027 -0.128 -0.146 -0.319 + 10.366 -0.584 0.598 0.003 -0.120 -0.115 -0.210 -0.112 -0.180 -0.168 -0.166 -0.112 -0.351 + 11.212 -0.781 0.611 0.238 -0.062 -0.470 -0.243 -0.008 -0.273 -0.459 -0.062 -0.016 -0.432 + 12.582 -0.500 0.220 0.381 0.057 -0.468 -0.346 -0.179 -0.296 -0.414 -0.156 -0.039 -0.428 + 13.656 -0.382 0.088 0.486 -0.309 -0.296 -0.459 -0.050 -0.559 -0.329 -0.173 -0.003 -0.382 + 14.085 -0.342 -0.003 0.684 -0.399 -0.250 -0.604 -0.051 -0.612 -0.273 -0.325 0.058 -0.413 + 14.383 -0.318 -0.088 0.684 -0.413 -0.298 -0.590 -0.043 -0.620 -0.298 -0.340 0.060 -0.413 + 14.441 -0.288 -0.073 0.632 -0.401 -0.348 -0.536 -0.125 -0.561 -0.349 -0.347 0.057 -0.405 + 14.048 -0.197 -0.117 0.642 -0.237 -0.352 -0.583 -0.078 -0.537 -0.364 -0.430 0.146 -0.437 + 13.398 -0.258 0.057 0.518 -0.066 -0.378 -0.579 -0.039 -0.407 -0.405 -0.470 0.184 -0.322 + 12.120 -0.122 0.234 0.273 -0.169 -0.346 -0.535 0.208 -0.265 -0.303 -0.480 0.003 -0.268 + 12.344 -0.252 0.326 0.423 -0.123 -0.253 -0.670 -0.039 -0.375 -0.286 -0.459 0.061 -0.296 + 12.637 -0.308 0.157 0.547 0.026 -0.277 -0.527 -0.163 -0.478 -0.361 -0.412 0.214 -0.137 + 12.748 0.007 -0.098 0.716 -0.192 -0.310 -0.547 -0.133 -0.421 -0.266 -0.437 0.174 -0.192 + 13.207 0.118 -0.266 0.668 -0.347 -0.180 -0.606 -0.054 -0.456 -0.350 -0.370 0.143 -0.275 + 13.601 0.075 -0.308 0.717 -0.452 -0.179 -0.655 -0.041 -0.503 -0.309 -0.345 0.143 -0.388 + 13.540 0.112 -0.390 0.774 -0.475 -0.204 -0.695 0.019 -0.477 -0.227 -0.374 0.135 -0.508 + 13.074 0.157 -0.391 0.840 -0.449 -0.167 -0.695 0.056 -0.375 -0.090 -0.483 0.074 -0.487 + 11.586 0.479 -0.543 0.817 -0.359 -0.094 -0.500 0.051 -0.211 -0.202 -0.530 -0.031 -0.369 + 7.432 0.775 -0.325 0.411 0.097 0.008 -0.154 0.067 -0.252 -0.061 -0.421 -0.344 -0.373 + 5.600 0.699 0.077 0.616 0.395 -0.044 -0.341 0.026 -0.159 -0.091 -0.331 -0.228 -0.404 + 5.770 0.879 0.084 0.453 0.401 -0.006 -0.198 -0.048 -0.166 -0.109 -0.400 -0.073 -0.448 + 5.330 0.704 0.259 0.514 0.391 -0.083 -0.157 0.021 -0.218 -0.015 -0.262 -0.192 -0.420 + 5.642 0.454 0.095 0.523 0.299 -0.067 -0.231 -0.058 -0.185 -0.236 -0.277 -0.046 -0.305 + 5.969 0.321 -0.059 0.266 0.050 -0.048 0.077 0.070 -0.033 0.028 -0.245 -0.121 -0.236 + 8.598 0.115 -0.441 0.163 -0.187 -0.181 0.020 -0.003 -0.005 -0.014 -0.416 -0.336 -0.241 + 6.319 0.407 -0.053 0.212 -0.094 -0.088 0.040 0.056 -0.023 0.023 -0.361 -0.305 -0.190 + 4.850 0.320 0.310 0.346 0.064 -0.122 -0.119 -0.071 -0.163 0.019 0.071 0.190 -0.179 + 4.847 0.240 0.016 0.211 -0.045 -0.188 -0.217 0.118 -0.118 -0.065 -0.028 -0.092 -0.087 + 4.793 0.083 -0.098 0.153 0.038 -0.179 -0.187 -0.091 -0.236 -0.164 -0.074 -0.076 -0.183 + 4.704 0.065 0.008 0.221 -0.008 -0.289 -0.134 -0.005 -0.227 -0.097 -0.160 -0.103 -0.127 + 5.033 -0.024 -0.179 0.255 0.097 -0.131 -0.048 -0.047 -0.282 -0.050 -0.012 -0.015 -0.192 + 5.289 0.072 -0.210 0.227 0.049 -0.175 -0.129 0.003 -0.219 -0.063 -0.119 0.137 -0.006 + 5.082 0.129 0.038 0.191 -0.122 -0.124 -0.203 -0.096 -0.081 -0.197 -0.055 0.095 -0.115 + 5.219 0.049 -0.032 0.115 -0.040 -0.078 -0.098 0.085 -0.157 -0.057 0.163 0.154 -0.134 + 5.335 0.010 -0.036 0.157 0.013 -0.137 -0.119 0.047 -0.070 0.054 -0.012 0.046 -0.043 + 5.636 0.060 -0.240 0.089 -0.024 0.044 -0.100 -0.093 -0.289 -0.276 -0.106 -0.008 -0.037 + 5.676 0.149 -0.202 0.133 -0.005 -0.207 -0.156 -0.071 -0.241 -0.101 -0.041 0.058 -0.019 + 5.860 0.184 -0.366 0.078 0.004 -0.064 -0.156 -0.174 -0.142 0.014 -0.052 0.009 -0.051 + 6.170 0.091 -0.083 0.236 0.081 -0.059 0.006 -0.111 -0.194 -0.149 -0.042 -0.096 -0.100 + 5.929 0.033 -0.043 0.133 -0.030 -0.188 -0.231 -0.044 -0.152 0.135 0.007 0.028 -0.068 + 6.065 0.062 0.017 0.075 0.131 -0.036 -0.235 -0.163 -0.167 0.024 0.086 0.079 -0.131 + 6.393 0.017 -0.052 0.258 0.145 0.014 -0.079 -0.143 -0.260 0.029 0.116 0.101 -0.067 + 9.469 0.005 -0.318 0.245 -0.126 -0.273 -0.686 -0.486 -0.210 -0.026 -0.123 -0.227 -0.039 + 9.175 0.146 -0.257 0.135 -0.089 -0.345 -0.968 -0.720 -0.094 0.160 0.017 -0.230 0.104 + 7.788 -0.562 0.061 0.223 -0.269 -0.873 -0.602 -0.359 0.278 0.481 0.266 -0.343 0.051 + 7.824 -0.274 -0.513 0.016 -0.029 -0.353 -0.432 -0.075 0.130 0.159 -0.022 -0.265 -0.099 + 9.996 0.317 -1.146 -0.331 -0.336 -0.057 -0.383 -0.085 -0.200 0.269 -0.013 -0.200 0.089 + 12.329 0.825 -1.190 -0.852 -0.340 0.079 -0.435 0.216 -0.355 0.243 -0.355 -0.305 -0.057 + 12.946 0.858 -1.402 -0.655 -0.379 0.038 -0.346 0.226 -0.302 0.277 -0.582 -0.241 -0.061 + 13.531 0.542 -1.440 -0.304 -0.515 -0.088 -0.315 0.161 -0.148 0.277 -0.650 -0.190 -0.004 + 13.694 0.644 -1.359 -0.276 -0.490 -0.215 -0.278 0.096 -0.134 0.159 -0.503 -0.211 -0.047 + 14.416 0.358 -1.272 -0.136 -0.495 -0.437 -0.277 0.170 -0.089 0.091 -0.508 -0.102 -0.143 + 14.057 0.524 -1.064 -0.035 -0.477 -0.623 -0.351 0.172 -0.188 0.063 -0.431 0.101 -0.281 + 13.989 0.491 -0.847 0.289 -0.534 -0.655 -0.541 0.166 -0.425 0.076 -0.469 0.220 -0.338 + 13.116 0.463 -0.685 0.639 -0.444 -0.660 -0.580 0.017 -0.492 0.016 -0.547 0.332 -0.381 + 12.539 0.403 -0.572 0.814 -0.361 -0.506 -0.424 -0.115 -0.469 -0.090 -0.676 0.303 -0.386 + 12.496 0.565 -0.482 0.760 -0.355 -0.602 -0.464 -0.218 -0.472 -0.054 -0.587 0.325 -0.411 + 13.256 0.316 -0.416 0.811 -0.454 -0.590 -0.457 -0.160 -0.520 -0.037 -0.448 0.219 -0.450 + 13.631 0.206 -0.435 0.816 -0.576 -0.636 -0.399 -0.086 -0.550 -0.020 -0.413 0.149 -0.465 + 13.548 0.119 -0.326 0.819 -0.658 -0.566 -0.396 -0.084 -0.579 -0.046 -0.358 0.015 -0.418 + 13.414 -0.129 -0.120 0.881 -0.634 -0.535 -0.422 -0.064 -0.541 0.044 -0.316 0.035 -0.383 + 12.802 -0.033 -0.071 0.732 -0.707 -0.419 -0.213 0.037 -0.454 0.040 -0.349 -0.067 -0.375 + 11.928 0.184 -0.033 0.564 -0.609 -0.391 -0.004 0.052 -0.387 0.046 -0.279 -0.139 -0.304 + 10.359 0.646 0.098 0.317 0.035 -0.294 0.099 0.041 -0.364 0.119 -0.376 -0.161 -0.311 + 10.015 0.809 0.113 0.199 0.187 -0.447 0.204 -0.062 -0.260 0.324 -0.598 -0.113 -0.227 + 10.467 0.673 0.166 0.130 0.182 -0.491 0.121 0.014 -0.332 0.280 -0.612 -0.136 -0.158 + 10.694 0.516 0.198 0.205 0.109 -0.503 0.060 -0.017 -0.314 0.231 -0.599 -0.191 -0.116 + 11.222 0.068 0.339 0.341 -0.236 -0.321 -0.060 -0.130 -0.296 0.175 -0.453 -0.201 -0.147 + 11.791 -0.140 0.378 0.334 -0.631 -0.198 -0.097 -0.202 -0.267 0.332 -0.326 -0.242 -0.195 + 11.805 -0.240 0.269 0.381 -0.876 0.001 -0.234 -0.103 -0.401 0.309 -0.291 -0.319 -0.217 + 11.714 -0.353 0.430 0.343 -0.821 0.035 -0.250 -0.113 -0.400 0.167 -0.312 -0.394 -0.191 + 11.586 -0.348 0.505 0.389 -0.736 0.026 -0.296 -0.090 -0.454 0.112 -0.292 -0.391 -0.181 + 11.590 -0.418 0.566 0.418 -0.660 -0.023 -0.301 -0.154 -0.497 0.117 -0.215 -0.347 -0.212 + 11.715 -0.419 0.401 0.526 -0.666 -0.218 -0.201 -0.117 -0.534 0.099 -0.232 -0.301 -0.212 + 11.612 0.037 -0.004 0.573 -0.300 -0.589 -0.102 -0.037 -0.593 0.051 -0.220 -0.339 -0.140 + 11.077 0.419 -0.101 0.353 0.152 -0.706 -0.272 0.063 -0.636 0.026 -0.218 -0.397 -0.051 + 10.416 0.801 -0.207 0.347 0.349 -0.652 -0.324 -0.099 -0.553 0.028 -0.252 -0.352 -0.027 + 10.217 1.055 -0.323 0.409 0.121 -0.537 -0.337 0.023 -0.412 -0.069 -0.367 -0.304 0.020 + 10.704 0.610 0.049 0.271 0.107 -0.569 -0.325 0.093 -0.392 -0.116 -0.313 -0.405 0.088 + 10.819 0.631 -0.029 0.511 -0.058 -0.632 -0.276 0.092 -0.542 0.001 -0.228 -0.358 -0.035 + 11.424 0.328 -0.094 0.831 -0.190 -0.727 -0.226 0.069 -0.507 -0.021 -0.207 -0.224 -0.166 + 11.200 0.155 0.180 0.788 -0.341 -0.543 -0.207 0.111 -0.469 0.034 -0.272 -0.128 -0.145 + 9.417 0.566 0.514 0.525 0.092 -0.272 -0.174 -0.031 -0.239 0.085 -0.581 -0.059 -0.243 + 9.256 0.492 0.595 0.514 0.166 -0.304 -0.129 -0.139 -0.005 -0.198 -0.471 0.043 -0.265 + 9.322 0.540 0.622 0.323 0.128 -0.249 -0.018 -0.132 -0.086 -0.248 -0.486 -0.022 -0.161 + 9.195 0.385 0.756 0.336 0.005 -0.257 0.032 -0.098 -0.217 -0.034 -0.468 -0.075 -0.310 + 8.682 0.417 0.527 0.338 -0.031 -0.429 0.096 0.002 -0.043 -0.016 -0.411 -0.149 -0.268 + 7.702 0.354 0.049 0.273 -0.030 -0.145 0.158 -0.096 0.022 -0.004 -0.273 -0.218 -0.297 + 6.358 0.372 0.183 0.294 -0.070 -0.206 0.082 0.018 0.151 0.062 -0.326 -0.230 -0.235 + 5.847 0.125 -0.081 0.109 -0.197 -0.216 0.186 0.183 0.260 0.101 -0.472 -0.210 -0.188 + 5.254 0.096 -0.007 0.001 -0.333 -0.120 0.074 0.116 0.028 -0.011 -0.466 -0.174 -0.186 + 9.107 -0.779 -0.147 0.181 -0.483 0.095 -0.394 -0.015 -0.092 -0.194 -0.044 -0.139 -0.132 + 11.707 -1.464 0.131 -0.173 -0.313 0.078 -0.391 -0.254 -0.073 -0.144 -0.182 -0.070 -0.234 + 12.255 -2.321 0.533 -0.007 -0.265 0.045 -0.368 -0.187 -0.063 -0.177 -0.068 -0.149 -0.170 + 12.408 -2.807 0.653 0.120 -0.482 0.158 -0.089 -0.290 0.001 -0.085 0.002 -0.077 -0.174 + 12.780 -2.699 0.550 0.309 -0.461 0.084 0.019 -0.219 -0.147 -0.274 -0.131 -0.174 -0.119 + 12.748 -2.500 0.418 0.414 -0.418 0.050 -0.024 -0.289 -0.200 -0.194 -0.028 -0.136 -0.312 + 12.519 -2.437 0.248 0.494 -0.202 -0.075 0.006 -0.025 -0.093 -0.230 0.001 -0.054 -0.284 + 12.791 -2.228 0.415 0.562 -0.326 -0.146 0.022 -0.023 -0.111 -0.238 -0.014 0.037 -0.085 + 12.106 -2.009 0.167 0.704 -0.545 -0.156 -0.059 -0.065 -0.091 -0.304 -0.205 0.141 -0.098 + 10.358 -1.293 0.126 0.980 -0.448 -0.130 0.044 -0.078 -0.070 -0.109 -0.182 0.035 -0.188 + 12.689 0.575 -0.516 0.274 -0.408 -0.647 -0.246 -0.218 -0.131 -0.192 -0.205 0.057 -0.236 + 14.627 0.471 -0.894 0.232 -0.518 -0.797 -0.324 -0.129 -0.224 -0.064 -0.201 0.203 -0.291 + 15.281 0.122 -0.813 0.084 -0.663 -0.832 -0.452 0.085 -0.224 0.059 -0.211 0.140 -0.367 + 15.462 0.049 -0.904 -0.006 -0.681 -0.750 -0.606 0.231 -0.327 0.061 -0.230 0.152 -0.426 + 15.488 -0.124 -0.828 -0.250 -0.580 -0.775 -0.488 0.415 -0.328 0.179 -0.325 0.046 -0.463 + 15.174 -0.242 -0.773 -0.249 -0.493 -0.783 -0.483 0.412 -0.298 0.219 -0.269 0.023 -0.413 + 14.856 -0.245 -0.790 -0.269 -0.497 -0.823 -0.440 0.388 -0.328 0.193 -0.233 0.003 -0.377 + 14.229 0.002 -0.624 -0.192 -0.434 -0.954 -0.403 0.231 -0.321 0.189 -0.147 0.024 -0.361 + 12.811 0.124 -0.062 0.115 -0.598 -1.103 -0.212 0.048 -0.276 0.167 -0.197 0.104 -0.355 + 10.743 -0.220 0.222 0.246 -0.579 -0.994 -0.168 -0.204 -0.321 0.126 -0.117 0.077 -0.184 + 8.176 -0.133 -0.212 0.045 -0.445 -0.664 -0.046 0.229 -0.045 0.305 0.091 -0.002 -0.201 + 7.172 -0.070 0.011 0.044 -0.688 -0.778 -0.380 0.332 -0.059 0.034 0.112 0.179 -0.350 + 6.753 -0.210 -0.033 0.083 -0.410 -0.785 -0.268 0.352 -0.108 0.098 0.130 0.157 -0.188 + 7.785 -1.173 0.134 0.364 -0.578 -0.244 -0.592 0.106 0.044 -0.076 0.073 -0.008 -0.200 + 8.243 -1.231 -0.024 0.135 -0.566 -0.113 -0.579 0.027 0.219 0.071 0.089 -0.138 -0.257 + 6.364 -0.179 -0.115 -0.081 -0.378 -0.618 -0.437 0.150 0.123 0.178 -0.038 -0.019 -0.154 + 6.268 -0.289 -0.151 -0.304 -0.430 -0.523 -0.316 0.371 0.177 0.268 -0.058 -0.055 -0.124 + 6.433 -0.198 -0.136 -0.161 -0.264 -0.678 -0.507 0.406 -0.025 0.104 -0.076 0.079 -0.237 + 10.851 -1.364 -0.067 -0.217 -0.184 -0.075 -0.441 0.003 -0.060 -0.230 -0.239 0.024 -0.042 + 11.475 -1.293 -0.278 -0.321 -0.341 -0.164 -0.507 -0.039 -0.124 -0.170 -0.153 0.061 0.005 + 8.586 -1.260 0.083 -0.411 -0.244 -0.052 -0.344 0.112 -0.084 -0.086 -0.101 0.023 -0.039 + 9.614 -0.887 0.537 -0.499 -0.281 -0.005 -0.469 0.048 -0.199 -0.096 -0.163 -0.123 -0.117 + 10.890 -0.474 0.531 -0.115 -0.327 -0.255 -0.401 -0.190 -0.328 -0.301 -0.117 -0.185 -0.242 + 12.153 -0.140 0.378 0.259 -0.332 -0.531 -0.691 0.178 -0.724 -0.061 -0.224 0.002 -0.372 + 12.656 0.113 0.134 0.178 -0.377 -0.641 -0.657 0.084 -0.582 -0.167 -0.162 0.062 -0.240 + 12.772 0.110 0.168 0.132 -0.556 -0.612 -0.667 0.106 -0.412 -0.125 -0.164 0.076 -0.215 + 13.121 0.178 -0.204 0.066 -0.489 -0.561 -0.815 0.204 -0.422 -0.007 -0.192 0.321 -0.351 + 13.332 0.147 -0.358 -0.107 -0.393 -0.630 -0.809 0.300 -0.233 0.030 -0.235 0.312 -0.455 + 13.306 0.162 -0.387 -0.204 -0.353 -0.621 -0.846 0.258 -0.130 0.065 -0.293 0.321 -0.372 + 13.037 0.314 -0.242 -0.356 -0.406 -0.459 -0.826 -0.024 0.045 0.162 -0.464 0.412 -0.339 + 12.327 0.164 -0.185 -0.385 -0.298 -0.393 -0.527 -0.183 0.169 0.201 -0.536 0.195 -0.123 + 11.416 0.080 -0.451 -0.557 -0.303 -0.312 -0.514 -0.017 0.202 0.135 -0.521 -0.015 -0.090 + 10.398 -1.473 0.690 -0.596 -0.005 -0.198 -0.365 0.124 0.180 0.013 -0.243 -0.134 -0.018 + 10.456 -2.030 0.997 -0.687 0.155 -0.020 -0.158 -0.059 0.006 -0.166 -0.128 -0.124 -0.033 + 9.918 -2.050 1.212 -0.749 -0.021 -0.079 -0.124 -0.019 0.036 -0.150 -0.220 0.052 -0.001 + 10.014 -1.980 1.153 -0.726 0.051 -0.236 -0.319 -0.081 -0.202 -0.121 -0.263 0.105 -0.014 + 9.797 -1.854 1.064 -0.552 0.058 -0.423 -0.227 0.045 -0.106 -0.063 -0.164 -0.049 -0.260 + 8.645 -1.625 0.692 -0.533 0.087 -0.305 -0.253 -0.078 -0.189 -0.015 0.027 0.053 -0.034 + 7.806 -0.852 0.536 -0.560 -0.184 -0.411 -0.409 -0.244 -0.287 -0.247 -0.155 0.094 -0.074 + 8.013 -0.834 0.310 -0.332 -0.231 -0.058 -0.485 -0.098 -0.354 -0.160 -0.357 -0.197 -0.215 + 9.198 -1.256 0.486 -0.263 -0.369 0.034 -0.530 -0.081 -0.317 -0.238 -0.272 -0.293 -0.232 + 10.381 -1.978 0.731 0.152 -0.568 0.076 -0.350 -0.013 -0.162 -0.093 -0.237 -0.174 -0.096 + 12.469 -1.735 0.441 -0.150 -0.707 -0.023 -0.312 -0.106 -0.171 -0.160 -0.157 -0.179 -0.215 + 12.916 -1.440 0.096 -0.179 -0.794 -0.081 -0.356 -0.215 -0.208 -0.245 -0.203 -0.063 -0.192 + 12.006 -0.243 0.227 0.403 -0.408 -0.305 -0.419 -0.320 -0.083 -0.174 -0.364 0.024 -0.082 + 11.765 0.694 -0.265 0.341 -0.023 -0.562 -0.649 0.014 -0.530 0.003 -0.507 -0.001 -0.085 + 11.708 0.587 -0.286 0.360 -0.001 -0.391 -0.978 0.358 -0.627 -0.043 -0.407 0.040 -0.095 + 11.264 0.365 -0.269 0.635 -0.013 -0.283 -0.805 -0.018 -0.410 -0.085 -0.435 0.046 0.027 + 9.203 0.263 -0.071 0.827 0.188 -0.436 -0.700 -0.068 -0.356 -0.121 -0.383 -0.003 0.102 + 6.832 -0.120 0.304 0.577 0.075 -0.160 -0.247 0.078 -0.013 -0.057 -0.405 -0.124 0.212 + 6.721 -0.399 0.480 0.760 0.248 -0.095 0.011 0.010 -0.059 -0.162 -0.348 -0.333 -0.083 + 7.811 -0.261 0.101 0.565 -0.150 -0.013 -0.204 -0.100 0.019 -0.078 -0.320 -0.091 -0.085 + 12.181 -0.322 -0.335 0.481 -0.251 -0.288 -0.698 0.022 -0.329 -0.093 -0.382 0.160 -0.146 + 12.988 0.022 -0.368 0.106 -0.128 -0.765 -0.637 0.021 -0.313 0.043 -0.294 0.205 -0.067 + 13.053 0.151 -0.439 0.065 -0.096 -0.947 -0.610 -0.025 -0.314 0.143 -0.306 0.339 -0.133 + 13.354 0.173 -0.490 0.108 -0.249 -0.942 -0.584 -0.009 -0.337 0.137 -0.258 0.281 -0.171 + 13.472 0.012 -0.353 0.202 -0.331 -0.897 -0.535 0.020 -0.364 0.065 -0.145 0.160 -0.118 + 13.067 0.049 -0.289 0.332 -0.371 -0.821 -0.604 0.177 -0.509 0.057 -0.075 0.027 -0.056 + 12.857 -0.026 -0.211 0.367 -0.321 -0.801 -0.538 0.057 -0.502 0.107 -0.174 0.079 -0.078 + 12.497 0.009 -0.208 0.430 -0.302 -0.790 -0.519 0.118 -0.675 0.173 -0.205 0.057 -0.100 + 12.231 -0.004 -0.194 0.415 -0.095 -0.863 -0.502 0.205 -0.789 0.136 -0.185 -0.038 -0.125 + 12.032 0.092 -0.072 0.241 0.293 -0.834 -0.558 0.168 -0.779 0.067 -0.387 -0.023 -0.216 + 11.373 0.619 -0.043 -0.036 0.243 -0.416 -0.411 -0.169 -0.745 0.204 -0.450 -0.264 -0.202 + 10.458 0.900 0.215 -0.367 0.033 -0.241 -0.119 -0.159 -0.809 0.058 -0.442 -0.029 -0.134 + 9.945 0.855 0.471 -0.427 -0.213 -0.294 -0.002 -0.081 -0.774 0.027 -0.474 -0.034 -0.090 + 9.993 0.836 0.516 -0.374 -0.272 -0.353 -0.076 0.048 -0.793 0.011 -0.451 -0.148 -0.108 + 10.493 0.806 0.467 -0.370 -0.406 -0.362 -0.161 0.115 -0.847 -0.062 -0.423 -0.176 -0.071 + 11.001 0.966 0.286 -0.503 -0.419 -0.358 -0.187 0.072 -1.003 0.016 -0.293 -0.084 -0.083 + 11.808 0.834 0.099 -0.441 -0.367 -0.342 -0.297 -0.048 -0.865 0.074 -0.148 -0.019 -0.118 + 12.169 0.900 -0.200 -0.543 -0.425 -0.360 -0.292 -0.221 -0.718 0.247 0.025 -0.017 -0.111 + 12.541 0.868 -0.504 -0.592 -0.408 -0.321 -0.392 -0.320 -0.504 0.270 0.060 -0.139 -0.112 + 12.813 0.824 -0.676 -0.504 -0.465 -0.399 -0.385 -0.380 -0.321 0.437 0.126 -0.262 -0.129 + 13.071 0.645 -0.834 -0.309 -0.487 -0.382 -0.396 -0.391 -0.204 0.490 -0.010 -0.355 -0.112 + 13.257 0.520 -0.963 -0.306 -0.626 -0.385 -0.368 -0.224 -0.112 0.429 -0.257 -0.203 -0.069 + 13.428 0.283 -0.788 -0.192 -0.748 -0.161 -0.599 -0.135 -0.093 0.434 -0.395 -0.129 -0.056 + 13.056 0.310 -0.674 -0.229 -0.665 -0.191 -0.587 -0.184 -0.111 0.445 -0.366 -0.086 -0.026 + 12.647 0.332 -0.596 -0.208 -0.685 -0.152 -0.761 -0.222 -0.175 0.619 -0.388 -0.051 0.033 + 11.954 0.118 -0.314 0.044 -0.537 -0.038 -0.864 -0.326 -0.458 0.638 -0.373 -0.093 0.049 + 10.548 0.153 -0.039 0.071 -0.288 0.041 -0.609 -0.276 -0.531 0.330 -0.338 -0.209 -0.024 + 10.989 0.149 -0.094 0.084 -0.313 0.139 -0.759 -0.235 -0.464 0.299 -0.457 -0.087 -0.029 + 11.850 0.031 -0.176 0.153 -0.496 0.054 -0.808 -0.288 -0.348 0.407 -0.456 -0.055 0.046 + 12.362 0.012 -0.238 0.087 -0.497 -0.074 -0.931 -0.255 -0.307 0.468 -0.464 0.009 0.064 + 12.642 -0.012 -0.290 0.064 -0.477 -0.196 -0.954 -0.256 -0.221 0.455 -0.410 -0.010 0.102 + 12.728 0.094 -0.467 0.233 -0.443 -0.357 -0.873 -0.252 -0.184 0.350 -0.359 -0.111 0.076 + 12.507 0.404 -0.655 0.123 -0.040 -0.487 -0.902 -0.062 -0.317 0.177 -0.194 -0.146 -0.078 + 11.682 1.104 -0.893 -0.226 0.278 -0.377 -0.996 -0.063 -0.211 -0.008 -0.206 0.055 -0.265 + 10.922 1.355 -0.784 -0.377 0.355 -0.246 -0.991 -0.228 -0.205 -0.010 -0.296 0.133 -0.267 + 10.332 1.567 -0.727 -0.508 0.317 -0.205 -0.846 -0.418 -0.209 0.030 -0.333 0.102 -0.170 + 9.890 1.837 -0.675 -0.588 0.121 -0.032 -0.719 -0.461 -0.232 -0.091 -0.269 0.133 -0.151 + 10.130 1.987 -0.766 -0.645 0.069 -0.129 -0.558 -0.367 -0.287 -0.205 -0.237 0.161 -0.181 + 10.146 1.775 -0.595 -0.654 0.066 -0.174 -0.504 -0.259 -0.396 -0.255 -0.181 0.221 -0.187 + 9.831 1.417 -0.544 -0.646 0.047 -0.259 -0.498 -0.295 -0.391 -0.381 -0.056 0.300 -0.218 + 10.626 1.430 -0.570 -0.766 0.206 -0.482 -0.349 -0.275 -0.525 -0.284 -0.087 0.255 -0.310 + 10.794 1.188 -0.402 -0.698 0.180 -0.417 -0.356 -0.211 -0.513 -0.251 0.095 0.060 -0.315 + 10.394 1.107 -0.525 -0.614 0.134 -0.439 -0.361 -0.354 -0.507 -0.246 0.215 0.030 -0.394 + 11.021 1.189 -0.715 -0.446 0.092 -0.569 -0.398 -0.459 -0.466 -0.130 0.202 -0.009 -0.475 + 11.426 1.010 -0.627 -0.126 -0.049 -0.553 -0.420 -0.421 -0.370 -0.023 0.139 -0.186 -0.289 + 11.651 0.714 -0.522 0.014 -0.156 -0.389 -0.507 -0.504 -0.280 0.128 -0.168 -0.113 -0.152 + 11.949 0.338 -0.408 0.099 -0.239 -0.285 -0.747 -0.389 -0.359 0.288 -0.292 -0.076 0.028 + 12.312 0.088 -0.241 0.042 -0.319 -0.218 -0.806 -0.316 -0.336 0.315 -0.401 -0.078 0.047 + 11.885 -0.029 -0.119 0.059 -0.251 -0.100 -0.612 -0.297 -0.253 0.321 -0.487 -0.144 0.087 + 11.125 -0.517 0.548 -0.189 -0.108 -0.024 -0.715 -0.129 -0.162 -0.043 -0.472 -0.116 -0.013 + 10.291 -1.458 0.922 -0.293 0.245 -0.085 -0.666 -0.058 -0.237 -0.079 -0.463 0.007 -0.030 + 9.920 -1.769 1.273 -0.287 0.086 -0.065 -0.590 -0.135 -0.247 -0.084 -0.466 0.025 -0.013 + 10.002 -1.860 1.285 -0.426 0.031 -0.051 -0.581 -0.120 -0.238 -0.080 -0.265 0.033 -0.090 + 10.606 -1.609 1.030 -0.502 -0.095 0.108 -0.597 0.090 -0.009 -0.011 -0.370 -0.090 -0.122 + 10.401 -1.571 0.827 -0.227 -0.263 0.257 -0.816 0.025 -0.065 -0.113 -0.283 0.102 0.119 + 9.293 -0.732 0.352 0.295 -0.427 0.077 -0.622 -0.153 0.252 -0.218 -0.201 0.077 0.104 + 8.472 0.469 0.151 -0.077 -0.192 -0.277 -0.248 -0.108 0.089 0.018 -0.391 -0.078 -0.003 + 8.515 0.538 0.163 0.126 0.367 -0.247 -0.139 -0.076 0.044 -0.250 -0.341 -0.226 -0.122 + 8.966 0.699 0.093 0.083 0.309 -0.273 -0.047 -0.149 -0.073 -0.089 -0.281 -0.262 -0.283 + 9.478 0.455 0.133 0.097 0.303 -0.204 -0.173 -0.121 -0.073 0.022 -0.150 -0.307 -0.291 + 9.974 0.509 -0.164 0.330 0.391 -0.409 -0.102 -0.109 -0.192 -0.047 -0.157 -0.239 -0.243 + 9.961 0.086 0.124 0.324 0.443 -0.314 -0.095 -0.034 -0.505 0.161 -0.230 -0.193 -0.286 + 9.788 0.169 0.251 0.144 0.395 -0.360 -0.025 -0.028 -0.584 0.089 -0.219 -0.166 -0.141 + 10.316 0.438 0.175 -0.149 0.195 -0.381 -0.166 -0.130 -0.474 0.119 -0.016 -0.244 -0.088 + 11.061 0.666 0.025 -0.338 0.038 -0.471 -0.401 -0.111 -0.605 0.271 -0.000 -0.232 -0.051 + 11.465 0.605 0.129 -0.447 0.134 -0.383 -0.503 -0.113 -0.627 0.378 -0.098 -0.256 -0.024 + 11.629 0.584 -0.018 -0.279 0.198 -0.447 -0.525 -0.109 -0.643 0.407 -0.104 -0.401 0.079 + 11.946 0.458 -0.105 -0.218 0.182 -0.416 -0.539 -0.090 -0.610 0.318 -0.133 -0.391 -0.018 + 11.659 0.502 -0.072 -0.214 0.194 -0.454 -0.502 -0.148 -0.643 0.344 -0.202 -0.348 -0.041 + 11.526 0.592 -0.157 -0.204 0.278 -0.513 -0.501 -0.162 -0.670 0.319 -0.258 -0.351 -0.075 + 11.563 0.601 -0.257 -0.067 0.319 -0.488 -0.507 -0.240 -0.674 0.226 -0.234 -0.366 -0.079 + 11.714 0.577 -0.306 -0.102 0.199 -0.346 -0.512 -0.282 -0.644 0.154 -0.183 -0.493 0.039 + 11.471 0.589 -0.221 -0.059 0.237 -0.244 -0.485 -0.109 -0.654 0.239 -0.316 -0.321 -0.049 + 11.190 0.419 -0.100 -0.095 0.225 -0.201 -0.385 -0.180 -0.474 0.155 -0.219 -0.399 -0.077 + 10.461 0.351 -0.104 -0.229 0.138 -0.165 -0.396 -0.095 -0.501 0.260 -0.122 -0.291 -0.067 + 10.141 0.046 -0.107 -0.223 0.025 -0.286 -0.599 -0.089 -0.587 0.305 -0.138 -0.348 -0.015 + 10.139 0.088 -0.332 -0.106 0.095 -0.422 -0.576 0.104 -0.363 0.246 -0.176 -0.366 0.039 + 11.133 0.164 -0.453 -0.192 -0.080 -0.344 -0.596 0.143 -0.493 0.229 -0.193 -0.339 0.032 + 11.558 0.113 -0.673 -0.247 -0.099 -0.543 -0.732 0.213 -0.510 0.238 -0.171 -0.328 0.096 + 12.210 0.148 -0.705 -0.082 -0.153 -0.636 -0.761 0.230 -0.391 0.351 -0.110 -0.231 0.203 + 12.489 0.199 -0.844 0.060 -0.282 -0.903 -0.631 0.194 -0.219 0.207 0.029 -0.192 0.232 + 13.211 0.131 -0.651 0.125 -0.244 -0.875 -0.557 0.318 -0.205 0.105 0.023 -0.316 0.139 + 12.978 0.196 -0.826 0.325 -0.435 -0.656 -0.515 0.325 -0.243 0.158 0.035 -0.163 0.047 + 12.593 0.155 -0.877 0.526 -0.715 -0.540 -0.377 0.449 -0.340 0.279 0.001 -0.087 -0.053 + 12.301 0.079 -0.596 0.459 -0.786 -0.598 -0.237 0.429 -0.424 0.358 -0.041 -0.140 -0.071 + 11.931 0.295 -0.592 0.490 -0.796 -0.628 -0.128 0.380 -0.552 0.493 -0.174 -0.084 -0.140 + 11.316 0.333 -0.342 0.308 -0.613 -0.521 0.094 0.140 -0.523 0.493 -0.198 -0.200 -0.076 + 10.381 0.366 0.004 -0.072 -0.280 -0.390 0.011 0.106 -0.381 0.382 -0.431 -0.111 0.007 + 9.576 0.511 -0.194 -0.298 -0.012 -0.612 -0.062 0.197 -0.318 0.251 -0.275 -0.009 -0.079 + 8.855 0.333 -0.060 -0.073 0.230 -0.613 0.059 0.149 -0.268 0.085 -0.287 -0.008 -0.032 + 8.041 -0.233 0.366 0.039 0.187 -0.720 0.046 0.018 -0.258 0.034 -0.374 -0.218 -0.101 + 6.923 0.094 0.076 0.548 -0.376 -0.461 -0.330 0.192 -0.229 -0.044 -0.197 -0.153 -0.025 + 6.673 -0.023 -0.054 0.612 -0.485 -0.320 -0.190 0.214 -0.413 -0.361 -0.223 -0.068 -0.038 + 6.633 -0.069 -0.139 0.657 -0.405 -0.169 -0.198 0.109 -0.355 -0.186 -0.150 -0.084 -0.078 + 6.754 0.049 -0.064 0.737 -0.303 -0.110 -0.383 0.163 -0.415 -0.194 -0.117 -0.130 -0.035 + 6.692 0.099 -0.115 0.753 -0.233 -0.303 -0.537 -0.000 -0.340 -0.296 -0.199 -0.022 0.055 + 6.535 0.167 -0.092 0.690 -0.153 -0.204 -0.335 0.059 -0.426 -0.262 -0.350 -0.228 -0.082 + 6.214 0.222 -0.081 0.614 -0.044 -0.202 -0.377 -0.031 -0.255 -0.255 -0.310 -0.213 -0.089 + 6.291 0.200 -0.135 0.566 -0.178 -0.243 -0.463 -0.068 -0.324 -0.292 -0.174 -0.213 0.014 + 6.686 0.319 -0.338 0.493 -0.106 -0.206 -0.419 0.049 -0.130 -0.249 -0.269 -0.076 0.045 + 7.230 -0.079 -0.376 0.415 -0.248 -0.029 -0.279 0.001 0.105 -0.195 -0.225 0.024 -0.001 + 7.370 0.086 -0.280 0.408 -0.274 -0.140 -0.389 -0.118 0.096 -0.166 -0.173 0.031 -0.018 + 7.266 0.447 -0.130 0.254 -0.247 -0.205 -0.464 -0.101 -0.063 -0.373 -0.230 -0.174 0.058 + 7.560 0.650 -0.309 0.301 -0.186 -0.269 -0.518 -0.291 0.034 -0.336 -0.374 -0.198 0.003 + 7.376 0.768 -0.424 0.306 -0.115 -0.224 -0.741 -0.253 0.005 -0.364 -0.455 -0.306 -0.020 + 7.591 0.589 -0.496 0.317 0.026 -0.278 -0.699 -0.287 -0.286 -0.303 -0.360 -0.219 -0.055 + 7.660 0.546 -0.533 0.047 -0.158 -0.279 -0.679 -0.346 -0.316 -0.088 -0.276 -0.144 -0.019 + 7.607 0.509 -0.400 -0.136 -0.320 -0.293 -0.514 -0.093 -0.436 -0.282 -0.287 -0.158 0.050 + 7.680 0.302 -0.204 0.134 -0.258 -0.201 -0.356 -0.005 -0.550 -0.188 -0.413 -0.161 -0.056 + 7.722 0.378 -0.157 0.264 -0.330 -0.411 -0.366 0.217 -0.387 -0.196 -0.334 -0.261 -0.217 + 7.748 0.453 -0.243 0.130 -0.324 -0.414 -0.255 0.170 -0.384 -0.270 -0.380 -0.192 -0.101 + 7.812 0.308 -0.197 0.114 -0.394 -0.308 -0.212 0.023 -0.370 -0.119 -0.391 -0.186 -0.217 + 7.794 0.303 -0.282 0.183 -0.411 -0.333 -0.042 0.045 -0.551 -0.361 -0.402 -0.158 -0.141 + 7.914 0.364 -0.355 0.150 -0.539 -0.354 -0.161 -0.027 -0.579 -0.330 -0.224 -0.047 -0.018 + 7.771 0.363 -0.510 -0.075 -0.407 -0.261 -0.182 -0.043 -0.402 -0.133 -0.005 0.084 -0.178 + 7.689 0.246 -0.662 0.105 -0.344 -0.198 -0.224 -0.107 -0.264 0.043 0.008 -0.040 -0.337 + 7.634 0.241 -0.645 -0.024 -0.230 -0.182 -0.213 -0.106 -0.355 -0.009 0.128 -0.087 -0.257 + 7.355 0.011 -0.816 0.107 -0.352 -0.194 -0.346 -0.072 -0.155 0.272 0.244 0.099 -0.361 + 6.920 -0.108 -0.593 0.219 -0.225 -0.323 -0.419 -0.027 -0.228 0.144 -0.033 -0.065 -0.281 + 6.783 -0.362 -0.602 0.134 -0.091 -0.234 -0.254 0.179 -0.262 0.101 0.048 -0.053 -0.300 + 6.500 -0.539 -0.285 0.139 0.001 -0.262 -0.255 0.112 -0.085 0.169 0.034 -0.148 -0.352 + 6.966 -0.466 -0.290 0.192 -0.329 -0.303 -0.319 0.155 -0.193 0.033 0.123 0.060 -0.272 + 7.200 -0.483 -0.454 0.007 -0.279 -0.339 -0.342 0.194 -0.078 0.199 0.106 -0.052 -0.311 + 7.345 -0.426 -0.429 -0.181 -0.421 -0.209 -0.313 0.154 0.049 0.305 0.074 -0.149 -0.207 + 7.242 -0.437 -0.507 -0.374 -0.651 -0.248 -0.264 0.241 0.167 0.221 0.069 -0.001 -0.220 + 7.418 -0.299 -0.488 -0.417 -0.551 -0.288 -0.316 0.219 0.017 0.107 0.047 0.074 -0.322 + 7.545 -0.352 -0.396 -0.366 -0.467 -0.259 -0.351 0.305 0.064 0.016 -0.185 0.014 -0.165 + 7.281 -0.374 -0.290 -0.157 -0.376 -0.242 -0.454 0.254 0.297 0.066 -0.257 0.029 -0.171 + 7.280 -0.409 -0.232 0.061 -0.161 -0.260 -0.465 0.366 0.127 -0.025 -0.143 0.041 -0.195 + 7.051 -0.617 -0.175 0.192 -0.074 -0.170 -0.361 0.434 0.070 0.044 -0.120 0.006 -0.166 + 7.142 -0.361 -0.017 -0.002 -0.263 -0.380 -0.429 0.377 0.184 0.041 -0.227 0.154 -0.054 + 6.744 -0.595 -0.070 0.077 -0.202 -0.465 -0.419 0.329 0.072 0.030 -0.033 0.153 -0.110 + 6.041 -1.077 -0.232 0.183 -0.182 -0.355 -0.283 0.346 0.021 0.002 -0.060 0.009 -0.117 + 5.962 -0.915 -0.384 0.202 -0.072 -0.454 -0.419 0.206 -0.086 0.148 0.037 0.002 -0.107 + 5.910 -1.052 -0.244 0.166 0.130 -0.379 -0.462 0.131 -0.086 0.110 0.205 0.135 -0.162 + 5.832 -1.106 -0.161 0.011 -0.077 -0.226 -0.373 0.117 -0.026 0.037 0.183 -0.022 -0.072 + 5.635 -1.129 -0.113 -0.121 -0.284 -0.375 -0.520 0.157 0.082 0.121 0.193 0.153 -0.067 + 5.709 -1.102 0.088 -0.034 -0.110 -0.241 -0.207 0.253 -0.061 -0.040 0.203 0.074 -0.116 + 5.234 -1.238 0.106 0.058 -0.215 -0.153 -0.165 0.169 -0.115 0.090 0.265 0.169 -0.056 + 5.579 -1.286 -0.164 0.160 -0.119 -0.356 -0.201 0.286 -0.055 0.036 0.181 0.180 -0.075 + 5.793 -1.203 -0.102 0.114 -0.040 -0.417 -0.284 0.411 0.127 -0.023 0.221 0.052 -0.092 + 5.541 -1.065 -0.253 -0.006 -0.129 -0.272 -0.302 0.341 -0.152 -0.133 0.045 0.013 -0.168 + 5.415 -1.081 -0.306 -0.032 -0.194 -0.223 -0.335 0.299 -0.079 -0.046 0.047 0.219 0.039 + 5.281 -1.139 -0.303 0.146 -0.176 -0.348 -0.357 0.165 -0.069 -0.044 0.057 0.077 0.069 + 5.579 -0.594 -0.180 0.161 -0.167 -0.409 -0.453 0.236 -0.120 -0.076 0.089 -0.023 -0.204 + 6.673 -0.059 -0.102 0.102 -0.029 -0.280 -0.577 -0.013 -0.175 -0.156 0.009 0.011 0.072 + 7.412 0.213 -0.147 -0.335 -0.138 -0.156 -0.554 -0.193 -0.109 0.034 -0.016 -0.059 0.054 + 7.622 0.396 -0.469 -0.487 -0.190 -0.339 -0.727 0.014 0.015 0.013 -0.013 -0.069 -0.101 + 7.667 0.447 -0.422 -0.285 -0.350 -0.406 -0.742 -0.211 -0.002 0.109 0.142 -0.176 -0.074 + 7.764 0.644 -0.382 -0.323 -0.323 -0.240 -0.565 -0.250 0.021 0.099 0.115 -0.078 -0.066 + 8.093 0.366 -0.499 -0.173 -0.294 -0.265 -0.530 -0.114 -0.069 0.153 0.103 -0.017 -0.123 + 8.178 0.513 -0.470 -0.197 -0.372 -0.322 -0.584 -0.391 -0.113 0.039 -0.093 0.040 -0.056 + 8.257 0.545 -0.413 -0.205 -0.300 -0.293 -0.842 -0.369 -0.087 -0.071 -0.100 -0.029 -0.110 + 8.107 0.492 -0.430 0.076 -0.308 -0.276 -0.731 -0.270 -0.041 0.040 -0.046 -0.042 -0.087 + 8.065 0.490 -0.467 0.231 -0.205 -0.233 -0.672 -0.302 -0.159 0.054 -0.121 -0.171 -0.106 + 8.076 0.239 -0.255 0.694 -0.304 -0.379 -0.689 -0.237 -0.037 0.037 -0.114 -0.128 -0.083 + 7.655 0.171 -0.280 0.504 -0.439 -0.097 -0.644 -0.223 0.025 0.003 0.044 0.067 -0.083 + 7.026 0.502 -0.118 0.568 -0.167 -0.489 -0.597 -0.276 -0.044 0.032 -0.089 -0.053 -0.126 + 5.818 0.139 -0.310 0.369 -0.034 -0.113 -0.476 -0.103 0.073 0.169 0.005 -0.078 -0.066 + 5.888 0.424 -0.247 0.133 -0.079 -0.350 -0.574 -0.058 0.030 0.170 -0.010 -0.014 -0.096 + 5.472 0.257 -0.326 0.159 -0.106 -0.160 -0.568 -0.189 -0.112 0.150 -0.237 -0.138 0.071 + 6.026 -0.153 -0.434 0.083 0.098 -0.364 -0.442 -0.091 0.044 0.004 -0.127 -0.062 -0.078 + 6.383 -0.190 -0.143 0.013 0.186 -0.600 -0.549 -0.126 -0.025 -0.344 -0.149 0.013 -0.018 + 6.526 -0.281 -0.172 0.140 -0.177 -0.367 -0.331 -0.388 0.056 -0.255 -0.339 0.013 0.000 + 6.500 -0.492 -0.139 0.596 -0.177 -0.220 -0.530 -0.311 -0.014 -0.226 -0.235 0.092 -0.146 + 7.302 -0.294 -0.054 0.630 -0.401 -0.216 -0.690 -0.295 0.011 -0.263 -0.159 0.090 -0.247 + 7.186 -0.520 -0.049 0.737 -0.384 -0.283 -0.607 -0.109 0.115 -0.196 -0.055 0.309 -0.209 + 7.013 -0.358 0.113 0.824 -0.410 -0.306 -0.709 -0.166 -0.065 -0.107 0.042 0.280 -0.257 + 7.080 -0.482 0.021 0.777 -0.452 -0.289 -0.739 -0.177 -0.155 -0.156 0.054 0.276 -0.209 + 7.179 -0.457 -0.084 0.689 -0.527 -0.267 -0.856 -0.236 -0.148 -0.175 0.001 0.046 -0.227 + 7.264 -0.352 -0.079 0.531 -0.676 -0.523 -0.790 -0.075 -0.201 -0.185 -0.102 0.087 -0.338 + 6.363 -0.265 -0.120 0.500 -0.475 -0.522 -0.740 -0.057 -0.050 -0.075 -0.125 0.147 -0.140 + 6.107 0.110 -0.001 0.228 -0.188 -0.261 -0.680 0.018 -0.135 -0.190 -0.279 0.074 -0.224 + 5.970 0.219 -0.039 0.357 -0.075 -0.252 -0.803 -0.081 -0.238 -0.187 -0.236 0.110 -0.228 + 5.788 0.162 -0.026 0.542 -0.019 -0.146 -0.664 -0.129 -0.205 -0.324 -0.274 0.044 -0.163 + 5.096 0.212 -0.071 0.448 -0.199 -0.160 -0.678 -0.172 -0.190 -0.327 -0.183 0.148 -0.237 + 5.014 0.366 -0.081 0.333 -0.092 -0.164 -0.618 -0.197 -0.050 -0.159 -0.280 0.095 -0.078 + 5.226 0.140 -0.070 0.448 -0.110 -0.267 -0.749 -0.138 -0.142 -0.195 -0.177 0.090 -0.168 + 4.878 0.167 0.064 0.500 -0.218 -0.266 -0.562 -0.136 -0.219 -0.187 -0.337 0.111 -0.159 + 4.402 0.131 -0.078 0.358 -0.141 -0.341 -0.560 0.026 -0.187 -0.056 -0.182 -0.056 -0.062 + 4.198 0.055 -0.072 0.375 -0.130 -0.311 -0.497 0.041 -0.167 -0.194 -0.233 0.151 -0.211 + 4.474 -0.033 -0.087 0.428 0.048 0.011 -0.751 -0.112 0.049 0.006 -0.164 0.003 -0.200 + 4.612 -0.141 -0.369 0.368 0.064 -0.007 -0.653 -0.132 -0.053 -0.163 -0.228 0.253 0.050 + 4.301 0.097 -0.220 0.282 -0.180 -0.054 -0.556 0.000 -0.004 -0.080 -0.258 -0.203 -0.147 + 4.559 0.210 -0.307 0.189 -0.276 0.080 -0.536 -0.042 0.129 0.016 -0.229 -0.170 -0.153 + 4.856 0.394 -0.588 0.092 -0.403 -0.191 -0.503 0.119 0.192 0.131 -0.224 -0.242 -0.060 + 5.008 0.387 -0.706 -0.147 -0.296 0.134 -0.641 -0.049 0.195 0.164 -0.125 -0.247 -0.131 + 5.642 0.026 -0.692 0.014 -0.361 0.217 -0.713 0.005 0.300 0.206 -0.299 -0.194 -0.030 + 6.024 -0.036 -0.648 0.009 -0.335 0.236 -0.755 0.006 0.309 0.314 -0.219 -0.126 0.133 + 6.339 0.228 -0.514 0.001 -0.325 0.031 -0.702 -0.014 0.156 0.378 -0.150 0.016 -0.085 + 5.384 0.473 -0.359 0.214 -0.272 -0.185 -0.708 -0.002 0.130 0.302 -0.243 -0.075 0.003 + 4.893 0.690 -0.148 0.300 -0.109 -0.110 -0.777 -0.015 -0.035 0.071 -0.290 -0.143 -0.065 + 4.216 0.716 -0.087 0.051 -0.353 -0.281 -0.677 -0.122 -0.130 0.051 -0.353 -0.154 -0.122 + 3.589 0.306 -0.437 -0.020 -0.200 -0.294 -0.491 -0.032 0.050 0.232 -0.314 -0.179 -0.035 + 3.596 0.276 -0.225 -0.019 -0.061 -0.130 -0.245 -0.112 0.023 0.234 -0.237 -0.115 0.083 + 4.243 -0.330 0.133 0.147 -0.102 0.078 -0.432 -0.169 0.012 0.000 -0.077 -0.133 -0.057 + 3.588 -0.051 0.133 0.093 -0.105 -0.072 -0.239 -0.178 -0.074 -0.064 -0.035 -0.081 -0.166 + 3.216 -0.071 -0.032 0.133 -0.098 -0.080 -0.185 -0.266 -0.217 -0.108 -0.129 -0.070 -0.010 + 3.500 -0.109 -0.073 0.223 -0.087 -0.028 -0.321 -0.210 -0.085 -0.023 -0.061 0.085 -0.021 + 3.976 -0.057 0.134 0.464 -0.117 -0.073 -0.353 -0.154 -0.150 -0.172 -0.201 -0.135 0.073 + 3.950 -0.155 -0.205 0.434 0.069 -0.088 -0.384 -0.130 -0.233 -0.163 -0.204 -0.183 0.037 + 4.062 -0.077 -0.401 0.209 -0.208 -0.380 -0.157 -0.110 -0.207 -0.276 -0.227 -0.078 -0.036 + 4.308 -0.083 -0.548 0.276 -0.237 -0.160 -0.032 -0.116 -0.080 -0.311 -0.214 -0.159 -0.014 + 4.786 -0.215 -0.687 0.260 -0.320 -0.123 0.000 0.171 -0.083 -0.251 -0.145 -0.112 -0.117 + 5.108 -0.181 -0.650 0.471 -0.299 -0.076 -0.036 0.105 -0.135 -0.232 -0.135 -0.313 -0.357 + 5.654 0.022 -0.400 0.487 -0.554 -0.414 -0.175 0.198 -0.022 -0.051 -0.158 -0.300 -0.336 + 6.081 0.094 -0.694 0.272 -0.647 -0.260 -0.323 0.118 -0.103 0.044 0.031 -0.117 -0.273 + 5.418 0.134 -0.653 0.331 -0.648 -0.184 -0.197 0.127 -0.172 0.014 -0.068 -0.159 -0.043 + 5.748 -0.040 -0.547 0.386 -0.847 -0.209 -0.164 0.208 -0.081 -0.013 -0.177 -0.161 -0.204 + 5.745 -0.093 -0.554 0.286 -0.836 -0.313 0.049 0.227 -0.095 0.078 -0.157 -0.105 -0.151 + 5.932 0.014 -0.224 0.296 -0.977 -0.303 -0.032 0.265 -0.162 -0.015 -0.228 -0.097 -0.181 + 5.469 0.076 0.022 0.116 -0.971 -0.096 0.039 0.263 -0.160 -0.131 -0.312 -0.022 -0.206 + 4.988 -0.030 0.114 0.306 -0.766 -0.183 -0.056 0.033 -0.125 0.147 -0.151 -0.052 -0.124 + 4.487 -0.201 -0.159 0.127 -0.765 -0.303 -0.013 -0.100 -0.064 0.144 -0.243 -0.090 -0.072 + 3.816 0.227 -0.340 0.115 -0.479 -0.100 -0.024 0.034 -0.133 0.038 -0.085 -0.093 -0.091 + 3.765 -0.010 -0.499 0.415 -0.254 -0.349 -0.081 0.096 0.003 -0.033 -0.243 -0.106 -0.117 + 4.811 -0.505 -0.537 0.283 0.196 -0.075 0.075 0.128 -0.059 -0.090 -0.183 -0.004 -0.001 + 5.778 -1.184 -0.290 -0.051 -0.033 -0.079 -0.102 0.086 0.091 -0.155 -0.162 0.070 -0.013 + 6.523 -1.523 -0.300 0.073 -0.097 -0.048 -0.144 -0.215 -0.089 -0.106 -0.272 -0.019 0.024 + 6.999 -1.637 -0.250 0.270 -0.172 -0.207 -0.165 -0.023 -0.121 -0.137 -0.169 -0.004 -0.188 + 7.419 -1.510 -0.204 -0.030 -0.226 -0.140 -0.259 0.049 0.164 -0.159 -0.103 -0.016 -0.052 + 7.873 -1.473 -0.176 0.253 0.016 -0.169 -0.160 -0.051 0.046 -0.029 -0.036 0.043 -0.119 + 8.003 -1.322 -0.302 0.184 -0.051 -0.233 -0.185 0.001 -0.041 -0.189 -0.391 0.076 0.029 + 8.055 -0.812 -0.498 0.054 0.011 0.037 -0.306 0.122 -0.096 -0.098 -0.321 0.175 0.054 + 7.355 -0.020 -0.357 -0.026 0.144 -0.037 -0.167 0.018 -0.014 -0.004 -0.260 0.080 -0.016 + 9.279 0.784 0.333 0.009 -0.151 -0.429 -0.569 -0.112 -0.020 0.158 -0.427 0.094 -0.060 + 11.291 0.704 0.079 -0.181 -0.277 -0.345 -0.782 -0.151 -0.086 0.285 -0.392 0.133 -0.083 + 12.124 0.657 -0.173 -0.366 -0.306 -0.273 -1.054 0.034 -0.162 0.369 -0.403 0.158 -0.189 + 10.834 1.000 -0.257 -0.041 -0.308 -0.454 -1.159 0.145 0.174 0.250 -0.275 -0.130 -0.184 + 10.935 0.859 -0.304 0.034 -0.338 -0.408 -0.984 0.157 -0.039 0.331 -0.311 -0.136 -0.095 + 10.908 0.827 -0.354 -0.200 -0.252 -0.334 -0.890 0.069 0.015 0.374 -0.217 -0.139 -0.291 + 11.154 0.776 -0.406 -0.331 -0.243 -0.295 -0.863 0.109 -0.008 0.403 -0.190 -0.154 -0.264 + 11.658 0.744 -0.497 -0.393 -0.335 -0.242 -0.807 0.145 -0.045 0.439 -0.223 -0.202 -0.226 + 12.190 0.659 -0.546 -0.432 -0.326 -0.284 -0.694 0.123 -0.157 0.568 -0.339 -0.156 -0.265 + 12.435 0.518 -0.544 -0.430 -0.354 -0.240 -0.601 -0.011 -0.076 0.535 -0.298 -0.234 -0.244 + 12.406 0.583 -0.643 -0.388 -0.369 -0.294 -0.467 -0.060 -0.131 0.571 -0.298 -0.232 -0.264 + 12.076 0.609 -0.592 -0.459 -0.341 -0.328 -0.404 -0.069 -0.151 0.592 -0.258 -0.231 -0.323 + 11.958 0.571 -0.522 -0.496 -0.345 -0.331 -0.371 -0.092 -0.162 0.566 -0.202 -0.212 -0.342 + 12.006 0.626 -0.529 -0.480 -0.401 -0.303 -0.324 -0.171 -0.136 0.538 -0.146 -0.227 -0.340 + 11.934 0.766 -0.617 -0.383 -0.464 -0.206 -0.408 -0.103 -0.220 0.525 -0.133 -0.180 -0.384 + 11.927 0.738 -0.532 -0.336 -0.511 -0.213 -0.321 -0.130 -0.258 0.513 -0.138 -0.118 -0.386 + 11.636 0.845 -0.545 -0.328 -0.572 -0.268 -0.105 -0.153 -0.313 0.452 -0.117 0.011 -0.392 + 11.351 0.791 -0.385 -0.425 -0.624 -0.302 0.061 -0.238 -0.279 0.366 -0.080 0.041 -0.286 + 11.093 0.742 -0.313 -0.480 -0.613 -0.441 0.224 -0.188 -0.243 0.148 -0.090 0.125 -0.121 + 10.210 0.824 -0.094 -0.400 -0.649 -0.629 0.461 -0.007 0.069 -0.318 -0.155 0.126 0.019 + 8.990 0.529 0.454 -0.345 -0.431 -0.502 0.393 -0.093 0.154 -0.221 -0.366 0.036 -0.034 + 7.876 -0.294 0.071 -0.013 -0.135 -0.411 0.153 -0.120 0.020 0.101 -0.268 0.027 -0.155 + 7.286 -0.329 0.018 -0.156 -0.120 -0.063 0.138 0.035 0.103 0.014 -0.302 0.004 -0.116 + 7.239 -0.291 0.102 -0.148 -0.106 0.093 -0.004 0.178 0.118 0.147 -0.232 0.027 -0.081 + 7.239 -0.361 0.334 0.077 0.051 -0.114 -0.166 -0.024 -0.107 0.143 -0.125 0.142 0.078 + 7.602 -0.617 0.446 0.086 -0.035 -0.262 -0.014 -0.046 -0.131 0.106 -0.056 0.141 -0.146 + 7.652 -0.707 0.399 0.003 0.162 -0.219 0.193 -0.034 -0.220 0.028 -0.167 -0.121 -0.203 + 7.569 -0.554 0.298 -0.001 0.043 -0.253 0.087 0.006 -0.156 0.172 -0.205 -0.111 -0.086 + 7.299 -0.679 0.324 0.169 -0.071 -0.149 0.027 -0.073 -0.141 0.171 -0.177 0.125 0.011 + 7.719 -0.365 0.419 0.017 -0.089 -0.216 0.001 0.038 -0.137 0.130 -0.249 -0.178 -0.067 + 7.997 -0.028 0.173 -0.320 -0.239 -0.152 0.104 0.027 0.063 0.211 -0.184 -0.182 -0.104 + 7.943 0.167 -0.020 -0.498 -0.211 -0.212 0.104 -0.092 -0.006 0.238 -0.010 -0.169 -0.107 + 8.011 0.479 -0.488 -0.733 -0.435 -0.047 -0.060 -0.123 0.012 0.319 -0.069 -0.151 -0.068 + 8.137 0.659 -0.514 -0.611 -0.387 -0.178 -0.226 -0.136 0.146 0.414 -0.073 -0.124 -0.152 + 7.969 0.675 -0.534 -0.722 -0.423 -0.205 -0.212 -0.205 0.170 0.315 -0.205 -0.130 -0.113 + 7.717 0.686 -0.443 -0.628 -0.472 -0.099 -0.131 -0.082 0.216 0.340 -0.272 0.066 -0.019 + 7.528 0.675 -0.503 -0.490 -0.481 -0.139 -0.095 -0.149 0.138 0.340 -0.194 0.024 -0.005 + 7.578 0.672 -0.413 -0.410 -0.462 -0.123 -0.237 -0.232 0.079 0.406 -0.133 -0.003 -0.001 + 7.444 0.710 -0.424 -0.377 -0.482 -0.269 -0.416 -0.187 0.054 0.465 -0.142 -0.211 -0.056 + 7.070 0.569 -0.356 -0.420 -0.516 -0.191 -0.269 -0.218 0.175 0.413 -0.170 -0.132 -0.080 + 6.607 0.358 -0.411 -0.465 -0.416 -0.172 -0.349 -0.298 0.189 0.362 -0.161 -0.305 -0.076 + 6.221 0.349 -0.384 -0.506 -0.341 -0.038 0.014 -0.120 0.120 0.315 -0.197 -0.199 -0.089 + 6.330 0.450 -0.389 -0.521 -0.328 -0.088 -0.124 -0.238 0.102 0.437 -0.083 -0.156 0.042 + 6.493 0.553 -0.294 -0.540 -0.295 -0.060 -0.085 -0.155 0.040 0.291 0.031 -0.145 -0.085 + 6.162 0.282 -0.388 -0.521 -0.215 -0.161 -0.112 -0.143 0.022 0.285 0.003 0.091 -0.135 + 6.167 0.400 -0.266 -0.392 -0.119 -0.051 -0.105 -0.225 -0.092 0.153 -0.116 -0.004 -0.250 + 6.307 0.453 -0.173 -0.272 -0.254 -0.144 -0.174 -0.193 -0.168 0.221 -0.007 -0.085 -0.179 + 6.799 0.156 0.060 -0.191 -0.263 -0.175 -0.323 -0.235 -0.284 0.315 -0.169 -0.047 -0.059 + 7.391 -0.657 0.249 0.341 -0.433 -0.160 -0.403 -0.403 -0.430 0.383 -0.313 0.084 0.021 + 7.760 -0.570 0.277 0.215 -0.842 -0.338 -0.464 -0.469 -0.386 0.480 -0.196 0.265 0.131 + 8.196 -0.541 0.437 0.237 -0.790 -0.246 -0.373 -0.487 -0.592 0.315 -0.216 0.325 0.173 + 8.656 -0.416 0.361 0.377 -0.885 -0.329 -0.409 -0.433 -0.530 0.336 -0.180 0.221 -0.013 + 9.123 -0.552 0.373 0.531 -0.861 -0.296 -0.484 -0.410 -0.560 0.423 -0.168 0.226 0.064 + 9.108 -0.659 0.406 0.376 -0.827 -0.457 -0.536 -0.315 -0.510 0.456 -0.154 0.208 0.074 + 9.149 -0.450 0.530 0.294 -0.817 -0.508 -0.499 -0.337 -0.553 0.391 -0.259 0.120 -0.029 diff --git a/test/regression/chan3-logspec.cepview b/test/regression/chan3-logspec.cepview new file mode 100644 index 0000000..503dec5 --- /dev/null +++ b/test/regression/chan3-logspec.cepview @@ -0,0 +1,2178 @@ + 5.389 4.810 5.125 4.165 3.566 3.932 3.529 4.031 3.448 2.431 5.657 5.540 4.806 5.420 5.056 4.680 4.944 5.669 6.161 5.786 6.441 7.007 7.950 8.784 8.374 7.769 9.344 9.315 9.740 9.657 10.222 9.850 8.788 10.339 9.979 7.982 + 4.629 3.124 3.561 5.456 5.490 4.303 4.407 3.801 3.722 3.877 4.070 4.785 5.405 4.903 5.303 4.862 5.343 5.014 5.953 5.966 6.774 6.947 7.934 7.903 7.103 7.853 10.083 10.235 9.747 10.154 10.467 10.033 9.853 10.023 10.003 8.046 + 4.210 4.083 3.981 5.656 5.662 4.151 5.915 5.171 4.703 4.731 5.825 6.092 4.736 4.585 5.498 4.980 5.532 5.654 5.362 5.721 7.011 7.298 8.233 7.266 6.777 7.853 10.034 9.380 9.298 10.411 9.983 9.865 10.016 10.360 9.645 7.216 + 4.346 3.959 4.195 4.672 5.132 5.597 5.139 5.006 3.870 4.447 6.045 5.108 5.056 6.081 5.626 5.746 6.457 6.671 5.883 6.331 4.831 6.802 8.386 8.448 7.866 9.915 9.605 10.048 10.248 9.989 9.930 9.642 8.986 9.554 9.315 7.037 + 4.688 3.590 4.146 4.361 4.724 5.040 5.558 3.926 4.857 5.482 4.340 5.198 4.924 4.752 4.390 5.545 6.233 6.505 5.984 6.435 5.875 6.785 7.662 8.555 9.455 10.009 7.431 9.247 9.574 9.010 9.013 9.143 9.411 9.079 8.648 7.272 + 2.193 4.558 4.155 5.176 5.156 5.311 4.683 4.231 4.062 5.684 4.990 4.288 4.746 4.326 4.050 6.148 5.951 6.081 6.324 6.449 6.486 7.982 8.861 8.900 9.820 10.296 7.435 8.752 9.227 8.640 10.053 9.391 8.755 9.929 9.690 7.525 + 2.979 4.149 3.978 5.114 4.680 3.806 4.672 4.478 3.464 4.933 5.082 5.314 5.471 5.070 4.637 5.226 5.241 5.261 5.821 6.648 6.645 7.989 8.787 7.079 10.003 9.974 7.731 7.446 7.384 8.648 9.619 9.103 8.871 9.514 9.644 6.964 + 2.761 4.491 5.456 4.913 4.653 5.106 3.900 3.184 3.204 4.609 3.683 2.693 3.776 4.197 5.397 5.598 4.693 6.256 7.283 6.335 6.121 6.610 8.422 7.739 8.930 7.577 7.074 8.081 8.044 8.216 8.396 7.783 7.887 9.454 9.845 6.690 + 3.593 3.991 4.594 4.964 4.881 5.153 5.231 4.091 5.041 4.556 3.479 4.433 2.551 4.561 5.123 6.011 5.923 6.460 6.838 6.676 6.275 6.550 7.757 8.165 7.723 7.129 7.406 8.216 7.999 8.625 8.598 8.521 7.939 8.443 8.252 6.517 + 3.773 3.696 3.852 3.460 4.364 4.005 4.615 4.868 4.112 3.523 3.510 4.283 3.635 5.081 5.401 5.917 7.041 7.996 7.184 6.857 6.897 6.739 7.949 7.371 7.500 6.872 7.322 6.834 6.828 7.322 8.296 7.759 7.619 8.351 8.577 6.534 + 2.162 1.746 3.938 5.254 4.685 4.121 3.940 4.349 3.350 3.067 4.414 5.364 4.497 5.071 5.823 6.553 5.166 6.358 5.794 6.100 6.231 6.237 6.711 7.314 7.740 6.745 5.893 6.790 7.587 7.137 7.380 7.053 7.752 8.009 8.641 6.604 + 5.713 4.351 4.127 3.772 3.693 5.441 5.117 4.609 5.141 4.838 4.155 4.605 3.974 3.331 4.880 5.151 5.350 5.834 6.075 5.800 5.449 5.880 7.669 6.843 5.893 5.384 6.239 7.263 6.259 7.309 7.030 6.299 7.510 8.038 8.022 6.037 + 8.639 8.587 7.690 7.100 5.972 5.349 5.113 5.152 4.688 4.016 3.875 4.215 4.156 5.382 4.734 3.497 3.959 4.723 4.473 4.306 4.382 5.536 6.379 6.016 5.906 7.044 7.401 6.962 6.142 6.908 6.946 6.358 6.577 7.683 8.410 6.175 + 7.683 7.662 6.692 6.305 4.112 4.879 4.603 5.479 5.287 4.827 5.168 3.422 4.302 4.507 3.717 4.480 4.036 4.332 3.459 3.639 4.541 5.122 4.360 5.595 4.928 5.171 5.077 6.252 6.024 5.335 5.173 5.875 4.970 6.198 6.049 4.656 + 5.958 6.560 6.228 4.710 4.065 4.628 4.690 5.296 5.107 5.656 4.684 3.052 4.269 4.714 4.552 3.986 4.838 4.422 4.015 3.832 4.042 4.318 4.238 4.135 5.151 6.214 5.450 5.207 5.771 5.637 5.530 6.237 5.461 6.466 6.632 4.483 + 4.562 4.152 3.670 3.765 5.057 4.952 4.765 3.140 3.092 4.261 4.018 4.462 3.924 4.366 4.388 3.567 3.947 3.754 4.407 3.962 3.240 4.107 4.875 4.880 5.500 5.578 5.324 4.438 5.096 5.318 4.943 5.704 5.328 5.824 6.599 4.278 + 5.047 5.852 5.993 4.169 3.880 4.574 4.410 3.895 4.760 4.032 3.518 2.917 3.795 4.603 4.393 4.846 5.211 4.395 4.010 3.683 3.352 4.124 5.521 5.006 4.397 4.241 3.497 3.939 3.508 3.642 4.625 4.759 4.305 4.651 5.043 3.209 + 3.086 4.834 4.464 4.872 5.053 4.557 4.751 5.155 4.083 2.625 2.963 3.112 1.924 2.029 3.280 4.666 3.955 3.580 4.308 4.315 2.945 3.913 5.088 3.795 4.329 2.935 3.134 4.199 3.050 3.999 4.334 4.342 3.470 3.496 3.347 2.705 + 3.733 3.854 2.862 2.227 3.327 5.077 5.348 3.018 3.551 4.072 2.685 3.165 3.057 3.125 4.357 5.090 4.756 3.279 3.727 3.771 3.707 2.650 4.571 3.201 3.331 3.232 2.770 2.890 3.096 3.292 3.611 2.683 3.064 2.006 2.747 1.738 + 2.745 2.220 2.940 3.731 3.694 5.188 4.711 3.862 2.182 2.186 2.659 3.295 4.128 3.736 3.533 4.918 4.782 3.271 2.590 3.549 4.944 2.985 3.031 3.298 3.624 3.220 3.280 3.460 3.870 2.971 3.599 2.898 2.184 2.052 2.678 1.874 + 3.581 3.086 4.523 5.729 4.243 4.929 4.641 4.905 4.309 4.312 4.014 4.347 3.688 4.477 3.340 4.768 4.071 3.783 2.933 2.394 3.619 3.248 3.499 3.584 3.884 4.180 3.676 3.718 3.977 3.911 3.494 2.737 3.327 2.909 2.803 1.726 + 4.860 4.678 5.475 6.113 5.297 4.935 3.243 3.725 4.619 4.783 4.528 4.317 3.394 3.997 3.764 4.890 4.052 2.723 3.360 3.547 4.064 2.916 3.790 4.009 2.916 4.030 3.723 3.734 3.872 3.241 3.085 3.237 3.102 4.124 4.347 3.008 + 4.668 4.644 5.931 6.140 5.316 6.248 5.703 3.829 3.513 2.220 3.629 4.070 1.415 3.035 3.558 4.154 4.435 4.148 2.908 3.348 2.439 2.770 3.798 4.618 3.113 3.339 3.480 3.643 4.002 4.147 3.353 2.661 3.223 2.526 2.711 2.410 + 4.723 5.778 5.108 5.060 6.203 6.394 6.213 4.665 3.635 1.726 3.474 2.594 2.410 4.449 4.714 2.821 3.680 4.021 3.062 2.456 2.919 3.138 4.102 3.361 4.024 3.693 4.450 2.907 3.282 3.794 3.742 3.225 3.421 3.325 4.150 4.272 + 7.991 7.335 7.256 7.639 7.232 7.424 7.121 7.291 6.736 6.293 6.316 5.990 6.272 5.490 5.623 5.458 4.866 4.805 4.151 3.381 5.268 5.051 4.797 5.928 7.613 9.052 9.720 8.811 8.889 8.733 8.379 8.452 8.341 8.475 8.370 7.526 + 11.920 10.660 10.062 12.050 11.971 9.869 10.993 10.382 8.618 9.713 8.532 7.882 8.053 7.546 7.304 7.425 6.971 7.240 7.661 8.869 9.438 9.317 7.856 8.217 9.603 11.612 12.311 10.689 11.082 10.551 10.215 10.383 10.063 10.340 10.275 9.239 + 12.444 12.817 12.636 13.609 14.162 13.708 12.116 11.380 11.113 10.771 9.923 8.689 8.011 7.992 8.191 8.533 8.649 9.192 9.935 11.689 13.147 12.150 10.641 9.784 10.078 11.386 12.006 10.834 9.999 10.087 11.785 11.967 10.590 8.213 9.304 9.486 + 12.146 13.526 12.921 14.630 15.013 15.678 13.753 12.574 12.058 11.498 10.917 9.790 9.564 9.428 9.469 9.623 10.113 10.639 11.640 13.552 14.984 13.978 12.433 11.887 12.450 13.762 14.012 12.825 12.046 12.340 14.056 14.469 13.312 10.802 11.090 11.581 + 12.715 14.187 13.427 15.045 15.821 16.926 14.886 13.200 13.516 12.853 12.584 11.219 11.381 11.091 11.025 11.042 11.182 11.700 12.753 15.005 16.738 15.162 13.644 13.275 13.902 15.282 15.179 13.638 12.752 13.493 15.576 15.773 15.119 12.948 11.357 12.258 + 13.199 14.493 13.831 15.207 16.841 17.844 15.760 14.184 14.539 13.641 12.969 12.225 11.967 11.914 11.820 11.875 12.129 12.653 13.989 16.130 17.119 15.440 14.283 13.849 14.384 15.371 14.330 13.171 12.923 13.550 15.212 15.355 15.225 13.044 10.293 10.867 + 13.451 14.597 14.030 15.041 17.342 18.286 16.762 15.667 15.107 14.076 13.188 13.119 12.320 12.442 12.363 12.530 12.792 13.358 14.686 16.640 17.325 16.279 14.799 14.779 15.508 15.926 14.288 13.037 13.198 13.687 14.870 15.472 15.805 13.682 9.892 10.621 + 13.604 14.468 14.092 14.732 17.294 18.061 17.661 16.620 15.089 14.467 13.623 13.464 12.508 12.538 12.525 12.728 13.079 13.785 14.832 17.127 17.894 16.486 15.363 15.502 16.310 15.597 13.976 12.835 13.100 13.464 14.564 15.777 16.114 14.005 10.067 10.560 + 13.692 14.367 14.100 14.853 16.845 17.269 18.055 17.165 14.761 14.667 13.981 13.649 12.765 12.537 12.718 12.894 13.381 14.069 15.269 17.316 17.483 16.223 15.630 15.932 15.457 13.790 12.357 11.687 12.397 13.431 14.487 13.873 14.018 11.451 9.200 8.381 + 13.765 14.299 14.249 14.834 16.581 16.995 18.459 17.421 15.442 14.906 14.215 13.733 13.200 13.019 13.166 13.536 14.272 15.363 16.464 17.682 16.465 15.906 16.115 16.161 14.718 12.998 11.906 11.807 12.154 13.053 13.377 12.192 12.588 11.114 8.870 8.202 + 13.946 14.312 14.413 14.939 16.604 17.522 18.851 17.468 15.694 15.528 14.274 13.876 13.430 13.567 13.942 14.837 14.890 17.255 16.789 16.162 15.317 15.292 16.369 15.900 13.800 12.479 11.841 11.967 12.706 14.430 13.877 12.602 13.277 12.228 9.871 6.313 + 14.111 14.144 14.538 14.869 16.764 17.992 18.659 16.557 15.362 15.431 14.501 13.983 13.778 14.189 14.578 16.663 15.944 15.807 14.703 13.556 13.754 14.549 15.869 15.266 12.933 12.048 10.858 11.162 12.168 14.355 13.648 12.378 13.540 12.514 10.062 6.904 + 13.961 13.927 14.373 15.296 17.046 18.022 18.101 15.452 14.949 14.838 14.447 14.226 14.295 15.637 16.443 15.948 13.728 12.803 12.226 11.929 12.189 13.083 15.153 14.500 12.165 11.486 10.284 9.767 10.896 13.499 12.665 11.308 12.342 11.705 9.376 6.041 + 13.678 13.753 14.091 15.440 16.964 17.219 17.273 15.374 14.289 14.165 14.114 14.223 14.711 16.088 15.475 13.855 12.188 11.171 11.045 11.316 11.271 12.333 14.172 13.825 11.222 10.539 9.803 8.201 9.302 12.252 12.039 10.303 11.336 11.000 9.138 6.906 + 13.488 13.514 13.979 15.514 17.150 16.647 16.355 15.142 14.407 13.901 13.703 14.063 14.799 16.655 15.423 13.291 12.108 11.060 10.886 11.243 11.213 12.431 14.023 13.076 10.565 10.032 9.813 7.271 8.681 11.532 11.789 10.080 11.002 10.540 8.431 4.189 + 13.264 13.777 14.186 15.782 17.263 16.539 16.270 15.082 14.398 13.973 13.352 13.680 13.926 16.299 15.796 13.850 12.528 11.425 11.181 11.189 11.468 12.906 14.420 13.403 10.848 10.068 10.566 7.798 8.730 11.738 12.444 10.726 11.690 11.492 9.385 4.701 + 13.766 13.961 14.329 15.534 17.349 16.526 16.119 14.842 14.253 13.802 12.957 13.595 13.541 14.859 15.622 16.024 13.931 12.342 11.906 11.694 12.071 13.490 14.890 13.566 11.351 10.546 10.833 8.791 9.121 12.131 13.279 11.424 11.970 12.001 11.252 5.862 + 13.686 14.098 14.374 15.446 17.406 16.575 16.106 14.817 14.257 13.677 12.858 13.116 13.149 13.278 14.847 15.346 16.136 14.699 13.335 12.925 13.189 14.473 15.770 13.826 11.783 10.819 11.220 9.503 9.362 12.037 13.788 11.833 11.965 11.735 10.728 7.062 + 13.999 14.095 14.194 15.310 17.327 16.369 15.955 14.604 13.886 13.248 12.494 12.443 12.341 12.454 12.943 13.843 15.234 15.870 16.074 14.876 14.497 15.641 16.925 14.598 12.636 11.572 11.763 10.320 9.795 12.095 13.851 13.004 12.903 13.087 11.401 8.327 + 13.841 14.020 14.210 14.930 17.251 16.439 15.902 14.674 13.851 13.193 12.354 12.121 12.036 12.041 12.119 12.723 13.083 14.836 16.088 16.688 16.577 16.592 17.691 16.642 13.609 12.479 12.479 11.372 10.571 12.874 14.783 13.821 13.486 12.988 11.911 8.741 + 13.702 13.997 14.117 14.689 17.157 16.518 16.059 14.869 14.070 13.298 12.325 12.408 11.903 11.767 11.830 11.940 12.496 13.266 14.976 16.616 17.734 17.364 17.953 17.832 15.813 13.811 13.323 12.434 11.790 13.781 15.764 14.903 14.423 14.125 12.887 9.733 + 13.609 13.783 13.778 14.519 16.822 16.269 16.436 14.869 13.857 13.120 12.381 12.290 11.749 11.544 11.421 11.505 11.768 12.802 13.802 15.716 17.687 17.247 16.972 17.218 16.593 14.934 13.868 12.877 11.995 13.653 15.850 14.941 14.023 13.824 12.343 9.673 + 13.530 13.719 13.677 14.387 16.598 16.361 16.933 15.144 14.022 13.388 12.874 12.374 11.832 11.457 11.197 11.464 11.371 12.624 13.128 14.785 17.151 16.902 15.792 15.977 16.433 15.853 14.609 13.666 12.273 13.392 15.581 14.794 13.597 14.311 12.787 10.808 + 13.535 13.807 13.609 14.104 16.422 16.374 17.315 15.807 14.567 13.692 13.336 13.030 12.515 11.914 11.454 11.693 11.980 12.754 13.372 15.109 17.128 16.537 15.316 15.166 15.550 15.805 14.564 12.966 12.754 13.277 14.754 14.282 12.754 13.601 12.612 10.186 + 13.200 13.486 13.382 13.719 15.775 16.179 17.413 15.890 15.166 14.208 13.785 13.240 12.747 12.402 11.821 11.907 12.335 12.654 13.611 15.446 17.007 16.087 14.586 14.278 14.279 15.101 14.076 12.929 13.212 13.357 14.465 13.754 12.641 13.235 12.479 7.725 + 12.829 13.129 13.150 13.515 15.095 15.892 17.120 16.046 15.571 14.419 14.233 13.384 12.936 12.668 12.153 12.041 12.477 12.797 14.270 15.971 16.412 15.353 14.165 13.573 14.395 14.773 13.166 12.899 13.088 13.145 14.145 13.953 13.196 13.547 11.986 7.167 + 12.693 13.155 12.940 13.604 15.066 15.639 17.070 16.061 15.955 14.686 14.236 13.640 13.126 13.027 12.581 12.705 12.943 13.615 15.122 16.390 15.957 14.571 14.005 13.401 14.374 14.240 12.632 13.518 13.561 13.359 13.640 13.245 12.294 12.434 11.017 7.594 + 12.508 13.028 12.733 13.549 15.140 15.703 17.146 16.181 16.024 14.762 14.158 13.750 13.258 13.192 12.988 13.097 13.438 14.477 16.025 16.362 14.945 14.040 13.425 13.391 13.988 13.121 12.053 13.162 12.936 12.545 12.612 12.239 12.329 11.939 9.731 7.185 + 12.346 12.734 12.637 13.338 15.151 15.863 17.064 16.009 15.567 14.531 13.911 13.442 13.023 12.915 12.956 13.268 13.805 15.122 16.491 15.304 13.742 13.170 12.502 13.277 13.196 11.815 11.584 12.636 11.324 11.281 12.449 12.761 12.994 11.998 10.554 8.741 + 11.912 12.291 12.141 12.942 14.926 15.822 16.443 15.199 14.560 14.083 13.304 12.890 12.517 12.432 12.698 13.348 14.326 15.610 15.025 13.190 11.895 11.364 12.042 12.475 12.699 13.072 12.493 11.333 9.560 10.423 11.801 12.292 12.996 12.475 11.982 11.869 + 11.384 12.329 12.076 12.752 14.397 15.171 15.569 14.780 14.050 13.528 12.338 12.321 12.220 12.589 13.139 14.261 15.103 14.164 12.371 12.059 11.018 9.648 11.066 11.824 13.106 13.980 13.500 12.848 12.997 12.743 12.167 12.924 13.758 13.006 11.614 11.857 + 12.931 12.934 13.163 13.441 14.965 16.124 16.645 15.114 14.731 14.223 13.143 12.667 13.129 13.283 14.344 15.528 14.713 13.027 11.845 11.516 10.641 9.790 9.352 10.115 11.502 13.086 14.861 14.336 13.619 13.496 13.190 14.273 14.204 13.019 9.869 8.658 + 13.265 13.098 13.608 13.705 14.720 16.778 17.314 16.484 15.464 14.998 13.826 13.707 14.151 14.441 16.158 15.454 13.610 12.430 11.807 11.085 10.608 9.630 9.949 10.682 11.572 12.745 14.917 14.746 12.455 12.643 14.627 16.072 15.074 12.687 9.629 7.316 + 13.032 12.835 13.478 13.684 14.456 16.935 17.313 17.088 16.001 15.076 13.972 14.218 14.683 16.025 15.814 13.578 12.592 11.288 11.400 10.829 10.593 9.971 9.662 10.177 11.224 12.237 14.473 14.467 12.383 12.165 15.406 16.710 15.993 14.568 9.019 7.986 + 12.659 12.761 13.211 13.612 14.824 16.848 17.096 17.185 15.718 14.861 14.611 14.858 16.059 15.894 14.823 12.079 10.955 10.848 10.239 10.359 10.366 10.163 9.958 9.117 9.864 10.806 13.240 13.574 12.042 11.107 14.634 16.038 15.330 14.231 8.639 7.772 + 12.644 12.637 13.024 13.614 15.058 16.700 16.665 16.927 15.560 14.089 14.835 15.906 15.999 15.098 12.271 11.456 10.828 9.999 9.777 9.807 9.384 9.659 9.973 9.769 9.229 10.381 12.201 13.266 11.730 11.489 14.644 15.850 15.456 14.668 9.379 7.352 + 12.439 12.622 12.978 13.647 15.121 16.742 16.088 16.309 15.677 14.584 15.104 15.796 15.168 13.990 12.344 10.427 9.992 9.490 9.382 9.297 9.355 9.298 9.085 9.432 10.277 11.959 13.320 11.995 11.011 11.081 12.184 13.670 13.971 13.562 8.656 6.561 + 12.430 12.201 12.552 13.725 15.045 16.317 15.446 15.324 15.034 14.155 15.238 15.236 13.924 11.798 10.120 9.478 9.142 9.033 9.043 8.728 8.205 8.027 8.555 8.989 9.651 11.468 13.272 11.862 9.865 9.782 11.030 12.521 13.379 12.637 7.456 6.059 + 12.315 11.859 12.231 13.857 14.810 15.951 14.438 14.162 14.398 13.648 15.206 14.352 12.703 10.472 9.014 8.379 8.856 8.555 8.299 8.298 7.983 7.318 8.074 8.522 9.201 10.994 13.028 11.340 9.286 9.712 10.900 12.229 13.308 12.502 7.205 5.726 + 12.263 11.528 12.104 14.314 15.136 15.734 13.960 13.488 13.861 14.364 15.040 13.725 11.838 10.192 8.980 8.131 8.205 8.346 8.173 8.392 7.921 7.760 8.128 8.143 8.922 10.741 12.874 11.141 9.044 9.485 10.856 11.891 13.251 12.188 7.758 6.075 + 11.906 11.598 12.201 14.458 15.026 15.375 13.981 13.226 13.665 14.552 14.511 12.887 10.869 9.883 9.000 8.265 8.192 8.048 7.901 8.284 8.173 8.167 8.197 8.133 8.834 10.708 12.975 11.337 9.231 9.349 11.003 12.087 13.717 11.870 8.243 6.449 + 11.542 11.315 11.883 14.266 14.719 15.146 14.119 13.291 14.114 14.885 14.390 12.614 10.275 9.393 9.520 8.894 8.835 8.499 7.949 7.831 8.302 8.313 8.578 8.295 9.075 11.004 13.177 11.781 10.088 9.599 11.441 12.680 13.664 11.287 9.055 7.353 + 11.538 11.330 11.825 14.020 14.512 15.446 14.875 13.807 14.392 15.226 14.868 13.387 10.731 10.122 9.412 9.102 9.654 9.431 9.605 8.894 8.397 9.154 9.188 9.384 9.919 11.735 13.630 12.266 10.628 9.752 11.935 12.595 12.942 11.769 9.013 7.474 + 11.578 11.522 11.799 13.487 13.946 15.712 15.891 15.604 15.028 15.341 15.712 15.449 12.833 12.383 11.244 10.028 10.744 10.908 10.178 9.308 9.250 9.842 11.470 11.333 10.774 12.783 14.382 12.999 11.665 11.995 14.917 14.673 13.988 13.411 10.276 9.560 + 11.554 11.310 11.599 12.940 13.666 15.389 16.448 17.228 15.715 15.754 16.834 16.490 16.313 14.619 12.120 11.904 11.791 11.353 11.586 11.406 11.383 11.424 11.246 11.262 11.965 13.707 15.160 13.532 12.292 13.805 16.072 15.516 14.436 13.763 11.376 10.591 + 11.292 10.842 11.368 12.621 13.246 14.088 16.772 17.064 16.756 16.102 15.562 16.460 16.508 15.792 12.789 12.185 12.042 11.750 11.898 11.509 11.182 10.914 10.823 10.978 11.980 14.107 15.235 13.818 12.450 14.465 16.570 15.933 14.541 13.569 10.867 10.550 + 11.334 10.725 11.526 12.143 12.803 13.493 16.280 17.046 17.592 16.158 15.858 16.113 16.691 16.327 12.957 12.558 12.394 11.781 11.867 11.679 11.196 11.058 10.885 11.216 11.586 13.296 15.261 14.373 12.758 15.051 16.926 16.160 14.925 13.504 10.969 9.974 + 11.450 10.890 11.570 11.662 12.807 13.393 15.805 16.954 17.788 16.807 15.844 15.968 16.605 16.874 13.648 13.138 12.510 11.929 12.078 11.726 11.537 11.119 11.042 11.190 11.244 12.420 14.833 14.596 12.807 15.312 17.089 16.313 15.346 13.786 10.803 9.084 + 11.635 11.057 11.605 11.827 12.609 13.285 15.524 16.731 17.882 17.303 16.176 16.018 16.746 17.290 15.160 13.628 12.730 12.129 12.013 11.881 11.550 11.242 11.181 11.098 11.059 12.989 14.566 13.826 12.861 14.753 16.922 16.134 14.846 13.290 10.916 9.329 + 11.622 11.378 11.529 11.711 12.364 13.128 15.084 16.390 17.651 17.215 16.465 15.853 16.160 17.215 16.059 14.286 12.891 12.287 11.864 11.670 11.329 11.347 11.585 11.410 10.854 12.413 14.628 14.248 13.562 14.580 16.777 16.070 14.922 13.097 11.448 10.304 + 11.712 11.555 11.629 11.620 12.350 13.177 15.099 16.265 17.450 16.892 16.099 15.497 15.978 16.957 16.446 14.829 13.057 12.164 11.694 11.367 11.305 11.195 11.426 11.023 9.978 11.793 14.159 13.734 13.016 13.069 15.519 14.880 13.011 11.111 10.410 9.966 + 11.728 11.743 11.869 11.650 12.082 13.005 14.994 15.931 16.975 16.186 15.815 14.978 15.395 16.531 16.852 14.769 13.196 12.139 11.698 11.515 11.353 11.108 11.367 11.065 10.224 10.672 13.083 13.057 12.989 12.177 13.617 13.462 11.903 10.002 9.457 9.518 + 11.748 11.353 11.655 11.277 11.651 12.656 14.753 15.400 15.871 15.062 14.491 13.866 14.355 15.255 16.165 13.698 12.238 11.562 11.075 11.059 10.930 10.652 10.840 10.719 9.854 9.370 12.321 12.572 12.994 11.511 11.648 12.507 11.848 10.315 8.931 8.025 + 11.699 11.457 11.248 11.168 11.469 12.367 13.845 14.962 14.120 13.828 13.772 12.925 13.274 13.959 15.507 14.403 12.503 11.399 11.177 11.043 10.654 10.490 10.848 10.857 10.208 10.487 13.571 13.585 12.713 10.317 10.035 12.037 12.133 10.898 8.987 8.214 + 11.668 11.501 11.174 11.261 11.467 12.603 13.611 15.109 13.567 13.134 13.602 12.192 11.936 12.658 14.824 14.421 13.671 12.061 11.176 11.186 10.845 10.619 11.032 11.546 11.306 11.724 13.561 13.658 12.787 10.327 9.341 11.565 12.220 11.382 8.311 6.681 + 11.593 11.406 11.127 11.130 11.424 12.705 13.417 14.844 13.236 12.377 12.850 11.300 10.824 11.174 12.161 12.533 13.758 13.270 13.031 12.577 12.557 12.794 12.351 12.014 12.047 12.714 13.354 13.196 12.076 9.785 8.765 10.566 11.792 10.906 7.925 5.680 + 11.539 11.218 11.202 10.627 11.022 12.528 12.901 13.669 11.903 11.675 11.931 10.439 9.128 9.627 10.550 10.597 12.078 13.264 13.331 13.538 13.743 13.336 12.154 11.114 11.376 11.557 13.450 13.151 10.399 9.326 7.676 9.830 11.342 10.628 6.586 4.291 + 11.725 11.415 11.238 10.388 10.956 12.331 12.348 12.455 11.034 11.250 11.348 10.076 7.806 7.465 8.881 8.674 9.427 10.141 12.040 13.580 13.745 12.977 10.592 9.637 10.123 11.527 13.426 13.237 10.337 9.120 8.085 9.108 10.913 10.223 6.325 5.872 + 11.554 11.266 11.076 10.427 11.152 11.662 10.904 10.791 10.724 10.962 10.954 10.068 7.090 7.710 8.432 8.237 8.778 9.691 10.813 11.460 11.622 11.839 10.918 8.560 8.236 8.494 10.016 11.063 10.223 9.840 8.404 8.481 11.019 10.686 8.322 9.077 + 11.329 11.304 11.371 10.694 11.273 11.394 10.330 10.156 10.336 9.837 9.917 9.156 7.684 7.858 7.808 8.006 7.839 8.441 8.250 8.839 9.827 11.222 10.433 8.312 6.368 5.700 5.965 7.916 10.422 10.841 7.912 7.786 10.500 10.323 7.842 7.877 + 10.885 10.844 11.246 10.771 10.735 10.746 9.382 9.293 9.627 9.316 9.529 8.394 7.178 7.316 6.871 7.647 7.964 8.118 7.494 8.073 8.431 9.526 8.856 6.813 5.743 4.997 4.921 5.051 8.195 9.857 7.468 7.090 9.569 8.835 6.513 4.777 + 9.974 10.168 10.990 10.169 9.980 10.538 9.237 8.751 8.111 8.773 9.036 7.282 6.187 5.160 5.515 5.847 5.215 6.080 6.946 6.953 5.577 6.143 6.083 5.284 5.326 5.519 5.152 5.306 5.901 7.285 6.002 6.918 7.934 7.667 6.277 5.277 + 9.074 9.785 10.375 8.901 9.173 9.848 7.923 7.930 8.300 8.817 8.595 8.546 5.880 5.352 6.267 5.189 6.389 5.638 6.079 6.419 4.584 5.076 4.340 5.828 6.295 5.346 5.488 5.111 4.348 4.972 6.084 6.501 7.621 8.302 9.002 8.841 + 8.192 9.865 9.904 8.187 7.872 8.764 8.716 6.944 8.279 8.909 9.210 8.859 8.021 7.796 7.938 7.099 7.313 6.447 7.716 8.120 7.865 7.081 6.806 6.748 7.547 7.986 8.114 8.115 7.846 7.892 8.583 9.140 9.807 10.694 11.551 11.414 + 8.553 9.369 10.264 8.696 8.589 9.094 9.773 9.223 9.841 9.847 9.584 9.834 9.788 9.469 8.970 9.153 8.490 8.177 10.161 10.627 9.329 8.821 8.588 8.603 10.076 10.427 10.326 9.969 9.852 9.770 10.412 10.653 11.063 11.090 10.839 10.024 + 9.105 8.994 9.740 10.186 10.476 9.482 10.259 10.258 10.067 9.910 9.102 8.504 8.768 8.216 8.789 8.154 8.865 9.789 11.471 10.846 9.680 8.694 8.035 8.933 10.758 11.052 10.106 9.743 9.860 10.070 9.728 10.509 10.968 11.746 11.388 11.410 + 10.525 9.993 10.690 12.271 12.604 12.167 12.136 12.265 11.878 11.563 10.127 9.549 9.512 10.044 10.321 9.571 10.234 11.730 11.654 11.484 10.495 8.215 8.900 9.907 11.833 12.097 10.340 9.821 10.290 11.425 10.377 10.665 12.366 12.631 11.458 10.655 + 10.562 10.266 10.749 13.040 13.644 14.031 13.388 12.119 11.931 11.567 9.894 10.775 10.476 10.026 10.788 11.264 12.345 13.825 13.218 11.698 10.679 9.946 9.196 10.241 11.923 12.190 10.302 9.971 11.357 12.249 9.988 10.797 13.563 13.084 11.933 11.001 + 10.681 10.555 10.485 12.991 13.421 14.234 12.959 12.655 11.733 11.742 11.163 11.087 10.417 10.570 11.111 11.572 12.326 13.325 12.311 9.582 9.314 9.750 9.380 8.157 11.395 11.687 10.939 9.390 10.462 12.464 10.187 10.260 12.577 12.714 11.556 10.476 + 11.087 9.997 10.082 12.111 13.492 13.913 12.325 11.550 10.739 11.225 10.602 10.087 9.206 9.698 10.173 10.579 11.845 12.572 11.080 8.806 9.013 9.095 9.562 7.709 10.100 11.522 10.910 9.631 11.814 12.199 10.993 10.535 11.869 12.309 12.298 12.374 + 11.253 10.152 9.818 9.048 10.074 10.858 9.066 9.094 10.102 10.560 10.854 10.192 9.740 9.095 9.373 10.204 10.060 11.155 10.868 9.068 9.524 9.132 9.150 9.627 10.295 11.759 10.777 10.662 11.921 12.822 12.512 13.258 13.448 14.043 14.066 14.334 + 8.745 9.354 9.350 9.719 9.765 8.118 9.640 9.373 10.053 9.886 11.007 10.422 8.497 8.804 9.439 8.918 10.033 10.551 9.643 8.612 9.588 9.372 9.348 10.173 10.065 12.048 11.023 10.447 11.387 12.471 12.404 14.052 14.181 14.187 14.820 15.025 + 10.338 10.775 10.379 9.728 8.996 7.902 9.194 9.326 8.480 10.031 10.460 9.605 9.371 10.201 10.827 9.743 9.234 10.875 10.934 9.813 9.084 9.546 10.601 9.254 10.028 11.924 11.145 10.945 11.649 12.002 12.402 14.237 15.126 15.493 15.179 15.025 + 10.579 9.206 9.321 10.405 10.780 9.470 9.988 9.467 9.646 9.458 9.118 9.854 9.684 10.359 10.084 9.809 10.793 11.262 12.303 10.759 10.177 9.836 10.583 9.048 8.921 10.676 10.548 10.990 11.803 12.692 12.059 13.630 14.982 15.751 15.236 15.696 + 10.022 10.395 9.323 9.787 11.079 10.722 9.101 10.179 10.603 10.108 11.095 10.591 9.874 11.031 10.086 10.145 10.943 11.062 11.761 11.037 10.957 11.065 10.682 9.715 9.842 11.453 10.899 10.746 11.173 13.208 13.692 13.493 14.838 16.036 16.066 15.944 + 12.242 12.163 11.261 10.952 11.340 10.029 11.342 11.371 10.224 10.211 10.881 11.111 11.125 11.041 10.125 9.866 10.192 11.318 12.026 12.094 11.637 11.521 10.190 10.220 11.804 11.920 11.849 11.414 11.588 12.460 13.226 13.438 14.801 15.756 15.935 16.584 + 8.658 9.589 8.871 9.967 10.320 10.150 9.467 8.814 9.045 10.234 10.552 10.490 11.236 10.590 9.872 9.751 9.925 10.834 11.636 12.069 11.453 11.783 11.420 10.115 12.226 11.827 12.104 12.139 12.822 13.265 13.304 14.131 15.215 15.727 17.084 16.380 + 10.329 9.864 9.384 8.866 10.169 10.256 9.722 10.206 8.557 9.357 10.204 10.352 10.001 10.303 10.349 11.132 10.608 10.763 11.756 12.631 11.656 11.280 11.549 13.074 12.709 12.261 12.330 12.501 13.212 13.717 14.270 14.873 15.562 16.408 16.324 16.002 + 9.873 8.091 8.274 8.566 9.563 9.858 10.151 10.257 8.478 9.072 10.379 9.909 9.077 10.031 9.364 9.678 9.123 9.542 11.742 12.396 14.039 13.154 12.776 13.094 12.450 11.577 10.982 11.868 12.178 12.179 12.357 12.936 13.221 14.431 15.816 15.194 + 7.343 5.957 6.732 6.840 6.096 6.939 7.124 6.514 6.077 5.965 6.326 6.528 6.491 6.518 6.930 6.490 6.698 7.173 8.760 9.188 11.219 10.434 8.482 6.626 6.537 6.432 6.317 6.241 5.983 5.764 6.815 7.336 7.841 8.282 8.939 10.257 + 4.473 3.927 4.806 3.879 4.452 5.176 5.493 5.146 4.718 5.751 6.052 6.000 5.670 5.328 5.425 6.617 6.248 3.332 5.072 4.397 4.485 4.698 3.931 4.242 2.836 2.890 3.204 2.889 2.927 3.700 3.688 4.450 5.259 6.588 7.066 5.691 + 2.181 2.452 4.004 4.560 6.352 6.490 7.188 6.651 5.458 4.809 6.598 6.583 6.789 5.264 4.820 5.782 4.516 4.312 5.264 4.482 4.330 4.107 3.742 4.015 3.819 2.348 2.990 2.921 3.379 2.948 3.857 4.171 5.075 6.559 7.479 6.019 + 6.664 7.119 7.185 8.698 9.778 10.101 11.261 11.174 11.111 10.661 9.955 9.440 9.402 8.324 6.636 7.791 8.830 9.418 7.921 7.123 8.882 9.553 9.820 9.777 10.201 10.089 9.923 9.419 8.564 8.249 8.923 8.249 8.110 8.409 8.412 7.197 + 8.897 7.592 7.912 9.916 11.620 11.167 11.787 12.526 12.787 11.779 11.265 11.595 11.739 11.611 10.486 8.963 10.872 11.594 10.111 11.305 12.103 12.792 13.502 14.126 14.826 14.541 13.655 13.101 12.349 11.837 12.283 12.096 12.068 12.325 12.347 11.119 + 11.076 11.041 11.464 12.297 13.420 13.779 14.225 12.952 11.993 11.773 10.964 10.418 9.909 10.565 10.401 10.165 10.673 11.359 12.000 13.423 15.091 14.745 13.773 14.721 14.239 15.082 13.313 12.677 13.514 13.088 11.789 11.576 12.521 13.117 12.166 11.696 + 11.996 12.660 11.943 13.050 14.857 16.266 15.634 16.176 15.022 13.248 13.015 12.859 11.835 12.041 12.255 12.605 12.965 14.009 15.775 16.323 16.199 15.630 15.727 14.974 14.142 15.084 14.511 14.471 14.822 12.773 11.029 13.106 15.120 13.835 10.685 9.417 + 12.181 11.796 12.471 12.656 13.842 15.803 16.636 17.439 15.514 14.742 13.843 13.542 12.903 12.619 12.905 13.238 13.979 15.324 16.710 16.776 15.471 15.378 16.113 15.488 13.843 15.094 14.340 14.521 15.189 12.757 12.051 13.825 16.503 15.015 11.077 8.806 + 12.058 11.370 12.180 12.745 13.443 14.461 16.372 17.820 17.768 15.135 14.759 14.313 12.873 13.186 13.247 13.522 14.154 16.384 17.153 15.577 14.798 15.074 16.102 15.799 13.519 14.665 14.284 13.974 15.012 13.177 13.410 13.958 15.455 14.333 11.195 9.856 + 11.988 11.648 12.174 12.597 13.499 14.499 15.534 17.445 17.938 15.593 14.815 14.345 13.109 13.310 13.441 13.839 15.014 17.142 17.020 15.299 14.663 15.016 15.981 15.529 13.452 14.169 14.618 14.120 15.212 13.721 14.713 14.548 15.896 15.071 11.219 9.982 + 12.075 12.158 12.492 13.065 13.792 14.658 15.192 17.707 17.493 16.519 15.892 14.872 13.513 13.659 13.931 14.507 15.776 17.328 16.686 15.134 14.952 15.269 16.153 15.461 13.279 14.356 14.599 13.893 14.778 13.887 15.834 15.686 15.301 13.877 10.810 9.913 + 11.964 11.947 12.235 13.187 14.033 14.344 15.457 17.690 17.035 16.624 15.371 13.717 13.920 13.815 13.831 14.260 16.047 16.903 16.581 14.945 14.631 15.022 15.765 15.005 12.932 15.019 15.230 14.273 14.686 14.032 16.236 16.323 16.129 14.643 9.320 9.458 + 12.078 11.813 11.993 13.065 13.949 14.516 15.711 17.796 16.968 16.256 15.493 13.773 13.643 13.486 13.387 13.992 15.572 17.056 16.884 14.650 14.412 14.808 15.275 14.353 12.534 14.726 14.965 14.082 14.640 13.583 15.543 15.634 15.615 15.031 8.907 8.836 + 11.912 10.850 11.743 12.395 13.329 14.380 16.357 17.649 16.970 15.667 14.548 13.727 12.771 12.703 12.568 13.296 14.587 17.070 16.709 14.237 13.908 14.117 14.415 12.913 11.690 14.316 14.175 12.955 13.906 13.063 14.361 14.816 14.792 14.534 9.469 8.673 + 11.716 11.806 10.759 11.947 13.193 14.659 15.934 16.032 15.394 14.942 12.296 11.340 11.752 11.468 11.243 10.948 11.805 14.248 15.204 13.540 13.561 12.206 11.109 9.421 11.577 11.771 11.259 10.827 11.369 10.689 10.352 11.241 11.330 11.105 9.529 9.269 + 10.472 9.224 9.906 9.390 9.912 10.165 10.715 11.379 10.839 10.478 10.328 9.671 8.883 7.734 6.921 7.460 8.053 9.921 11.303 11.481 10.403 9.307 9.199 10.945 12.008 11.905 11.149 9.956 12.468 11.830 9.871 10.928 11.923 10.963 10.019 10.315 + 12.935 12.315 11.091 11.039 10.022 10.625 10.040 8.922 9.431 8.708 7.790 6.769 6.902 7.400 7.409 7.950 8.325 9.073 10.362 11.962 11.237 9.468 10.457 12.735 14.825 14.777 14.561 13.556 15.097 14.988 12.922 12.391 12.850 12.967 12.600 11.647 + 13.552 13.590 12.830 10.875 10.685 9.958 9.596 8.033 8.397 9.322 8.923 7.723 7.889 7.473 8.152 8.008 8.097 9.395 9.740 11.193 11.140 10.648 12.226 13.869 15.939 16.701 15.481 14.750 15.417 14.825 13.819 14.147 14.317 14.584 13.609 12.902 + 13.153 12.887 11.839 10.807 10.822 9.914 8.738 8.834 9.595 9.662 8.204 8.120 8.470 8.040 8.822 8.162 9.122 8.186 9.816 11.381 11.230 11.320 13.046 14.499 16.142 16.877 15.915 15.585 16.181 15.753 15.861 15.517 15.751 15.083 15.173 14.292 + 9.727 9.179 9.286 9.181 8.205 7.459 8.038 9.542 9.958 10.200 9.202 8.833 7.929 8.722 8.309 8.401 9.699 10.006 9.872 12.469 12.113 11.773 13.690 15.228 17.108 17.618 16.692 15.503 16.854 16.320 16.311 15.052 15.915 16.379 15.934 14.372 + 9.624 9.440 9.667 8.721 8.102 8.603 9.217 8.137 9.148 10.024 7.975 7.141 6.674 8.884 8.404 8.111 7.810 10.705 11.641 14.366 13.502 11.362 14.972 16.125 17.344 17.128 16.304 17.433 17.913 17.089 16.368 16.073 16.024 15.984 15.490 14.890 + 9.941 8.943 8.418 6.995 7.639 8.705 7.635 10.215 10.534 9.499 8.516 9.235 8.373 7.170 8.115 9.089 9.830 9.741 10.864 12.919 12.744 12.565 14.037 16.026 16.767 16.021 15.760 17.050 17.337 17.416 15.967 15.486 15.435 15.208 15.501 14.641 + 12.882 13.197 12.349 10.862 9.418 10.265 9.443 10.036 8.704 8.500 8.393 9.183 8.849 8.683 8.264 9.201 10.627 11.951 11.797 12.838 12.445 12.736 14.975 16.365 16.236 16.726 15.560 16.311 16.426 15.744 16.075 14.867 15.145 14.967 15.127 14.727 + 13.061 13.934 13.035 9.613 10.800 10.173 10.888 10.577 9.557 9.279 9.691 9.645 8.798 7.891 7.527 7.981 9.740 11.728 11.323 13.106 11.782 11.925 14.291 15.829 14.969 13.911 13.565 14.515 13.912 12.732 13.288 13.502 13.698 13.897 13.492 13.124 + 14.521 12.779 12.074 9.525 10.683 10.297 8.912 8.951 9.946 9.023 7.989 8.961 8.237 8.865 8.751 7.272 9.768 10.249 12.153 12.529 10.733 11.008 11.335 12.835 12.541 11.424 11.258 13.216 11.984 11.614 10.791 11.799 11.727 11.172 11.464 11.068 + 14.429 12.495 12.229 10.864 12.048 12.783 13.404 13.659 13.262 12.919 12.507 11.403 10.820 10.670 11.284 11.274 11.589 12.338 12.540 12.621 11.807 11.577 11.235 12.068 12.747 11.636 10.558 11.205 9.910 10.539 9.718 9.719 9.782 8.428 8.334 8.145 + 13.385 13.814 12.252 12.818 13.165 13.469 14.651 14.121 13.990 13.705 12.589 11.957 11.618 11.299 11.348 11.585 12.392 13.225 13.443 12.952 11.447 11.200 10.685 11.018 11.595 10.880 11.509 11.864 9.167 8.220 8.323 10.302 11.386 9.519 7.435 6.366 + 12.933 13.008 12.278 11.808 12.211 13.648 14.158 14.775 13.236 13.028 12.512 11.906 10.395 11.012 11.218 11.999 12.647 13.106 13.343 11.875 11.125 10.615 10.883 11.304 12.016 12.367 12.148 11.771 10.398 9.310 8.561 10.508 11.579 9.744 8.021 6.741 + 13.019 12.140 12.249 11.149 12.000 13.188 13.553 12.971 12.383 11.392 11.988 10.678 8.933 9.624 10.549 11.854 12.631 12.295 11.275 10.740 10.165 10.024 10.782 11.328 12.204 12.586 12.171 10.766 9.947 8.977 7.101 8.989 10.975 10.049 8.170 6.613 + 12.544 12.224 12.149 10.724 11.276 12.498 12.396 11.143 10.126 9.499 10.421 9.947 8.267 6.282 8.192 10.336 10.283 9.535 9.265 9.446 9.688 9.511 10.773 11.176 12.518 13.067 11.569 10.247 10.354 9.787 8.361 10.416 12.595 11.768 9.249 8.453 + 12.329 12.304 12.178 10.892 11.224 11.984 11.726 11.076 10.180 10.180 10.095 9.423 7.684 6.975 8.786 10.417 10.042 9.754 9.872 10.249 9.541 10.573 11.155 11.672 12.353 13.222 11.854 9.739 9.772 10.093 9.118 11.600 13.736 13.453 10.698 8.102 + 11.575 11.349 11.094 9.455 10.618 11.708 12.485 11.536 9.907 9.793 9.768 8.726 8.730 9.901 11.027 12.687 13.684 12.413 11.570 11.468 11.373 10.696 9.974 10.823 11.583 12.351 10.303 9.193 10.897 10.912 9.994 10.458 12.785 12.052 8.812 7.309 + 11.802 11.689 11.825 10.753 11.809 12.863 14.021 13.282 12.890 12.429 10.623 10.778 10.360 10.963 11.277 12.775 14.514 14.232 12.628 12.151 12.166 12.432 12.126 11.497 11.600 11.745 10.916 11.155 11.654 10.760 11.219 11.772 12.445 12.635 9.864 7.642 + 11.446 11.133 11.303 11.133 11.141 12.698 14.011 14.749 13.621 12.685 10.835 11.065 10.076 11.023 11.377 12.574 14.698 15.134 13.007 11.778 11.925 12.651 12.563 11.656 11.349 12.101 11.834 11.800 11.866 10.600 10.993 12.547 12.802 12.970 9.999 5.904 + 11.378 11.186 11.065 11.150 11.326 13.257 15.002 15.744 15.035 13.451 12.727 11.711 11.141 11.695 12.048 13.024 15.169 15.361 13.396 12.213 12.175 12.906 13.060 12.331 11.611 13.295 12.817 12.894 12.504 10.862 11.095 12.963 12.795 11.385 9.352 7.148 + 11.500 11.403 11.532 11.813 12.213 14.254 15.488 15.115 14.837 13.351 13.073 12.338 11.905 12.178 12.631 14.041 14.989 14.121 13.044 12.355 12.203 12.370 12.720 12.757 13.119 12.766 12.278 12.260 10.724 9.350 10.640 12.452 12.315 11.559 9.766 8.495 + 9.875 10.267 11.502 11.891 12.352 12.832 14.060 13.469 12.490 11.992 11.253 10.710 10.506 11.490 12.489 13.221 13.786 11.273 10.048 9.606 9.527 9.848 11.214 11.240 10.516 9.780 9.756 10.570 9.205 7.651 8.662 11.033 10.525 9.724 8.868 9.279 + 9.521 9.843 10.518 10.748 12.088 12.799 12.446 11.365 10.624 9.960 9.579 8.636 9.100 9.918 11.995 12.434 11.136 9.306 8.510 8.199 8.238 8.890 10.913 11.253 9.168 7.937 8.633 9.638 8.274 6.589 7.445 9.409 8.997 8.616 6.898 7.605 + 6.977 8.256 8.187 6.767 6.243 6.569 6.796 6.567 7.228 6.028 5.506 4.750 4.367 4.490 6.242 6.315 7.348 4.774 4.606 4.759 4.019 5.593 6.216 6.364 5.345 6.151 5.150 5.912 6.064 5.718 5.790 5.868 6.417 6.028 5.594 4.174 + 6.605 7.888 7.766 6.215 5.917 5.713 6.280 6.671 7.268 6.233 5.104 4.392 4.112 3.989 5.989 6.441 6.337 4.282 4.354 4.199 3.847 4.683 5.406 5.813 5.454 6.677 6.098 6.305 6.053 5.666 5.941 4.784 4.938 5.089 4.638 4.321 + 7.116 7.059 6.852 7.373 7.828 7.675 7.934 7.547 7.114 5.135 4.362 4.388 3.959 2.240 3.460 5.238 5.721 4.561 3.493 3.245 4.298 4.627 4.479 5.702 5.282 6.354 5.894 5.655 6.006 5.024 5.603 4.533 5.103 5.248 4.890 4.216 + 6.520 6.777 7.087 7.010 7.226 6.872 7.047 7.229 7.157 5.168 5.037 3.378 2.694 2.796 4.192 3.817 4.250 4.529 4.159 3.799 4.164 3.957 5.446 6.515 6.511 6.268 5.889 5.504 5.597 5.947 5.866 6.237 6.703 6.586 5.799 4.661 + 4.928 7.610 9.312 9.489 8.112 8.796 9.040 8.316 8.370 8.170 7.458 6.756 6.990 6.299 5.320 6.436 7.841 7.086 7.050 7.732 7.142 8.281 7.234 8.638 8.861 8.432 9.085 8.948 8.847 9.267 10.038 10.593 11.139 10.968 10.055 8.821 + 10.265 8.831 8.291 7.323 8.335 8.043 8.669 9.210 10.007 9.255 7.816 7.506 7.701 7.658 7.734 8.230 9.337 10.098 8.129 8.333 8.937 8.790 9.448 10.089 10.309 9.368 9.482 9.324 9.613 9.846 9.459 9.517 10.079 9.661 9.583 9.528 + 10.215 9.043 8.933 10.412 10.242 11.371 12.243 12.589 12.913 11.811 10.902 10.818 10.827 10.383 10.940 11.675 12.583 13.666 12.705 12.442 11.956 12.077 12.814 13.637 13.410 12.173 12.033 12.391 12.689 12.012 10.798 12.366 12.174 10.490 10.236 10.119 + 10.550 9.951 10.468 11.298 11.712 13.356 15.252 16.537 15.998 14.266 12.992 12.880 11.831 11.971 12.033 12.595 13.947 15.517 14.803 13.437 13.088 13.126 13.720 15.243 14.855 12.525 12.177 12.773 13.487 12.249 10.862 13.704 13.203 11.783 10.140 10.375 + 10.911 10.568 11.101 11.943 12.143 13.281 15.095 16.175 16.541 15.358 13.293 13.197 12.556 12.588 12.402 12.789 13.859 15.535 16.173 14.726 13.687 13.541 14.070 15.268 15.827 14.227 12.885 12.798 13.333 12.670 10.889 13.060 13.287 10.451 9.781 10.707 + 10.919 10.579 11.065 12.116 12.236 13.189 14.823 16.008 16.765 16.061 13.223 13.712 12.591 12.948 12.705 13.349 14.179 15.594 16.418 15.499 14.483 14.082 14.196 15.393 16.272 15.221 13.755 13.644 13.984 13.142 11.889 14.038 13.587 11.361 9.706 10.632 + 10.542 10.138 10.736 12.046 11.530 13.203 14.585 15.772 16.905 15.269 14.038 13.805 12.544 12.997 12.577 13.234 13.891 15.551 16.842 14.774 14.135 13.807 13.823 15.082 16.128 14.486 13.394 13.448 13.752 12.550 13.163 14.656 14.219 12.268 8.811 8.068 + 10.067 9.901 10.856 11.825 11.931 12.927 14.057 15.729 17.002 16.582 14.205 13.904 12.889 12.836 12.707 13.432 14.171 16.475 16.889 14.870 14.164 13.900 13.952 15.500 16.299 14.644 13.328 13.562 14.084 12.390 14.411 15.686 15.398 13.696 8.607 8.112 + 10.761 10.610 11.540 12.196 12.478 13.099 14.179 15.602 17.036 17.078 14.666 14.234 13.514 13.256 13.277 13.861 15.030 16.761 16.706 14.997 14.289 14.185 14.466 15.989 16.115 14.292 13.115 13.042 13.033 12.355 14.428 15.233 14.898 12.602 9.307 8.529 + 10.700 10.524 11.444 12.285 12.508 12.864 14.102 15.348 16.586 17.073 14.893 15.273 13.743 13.881 13.738 14.450 15.795 16.502 16.064 14.600 14.258 14.449 14.571 15.715 15.627 14.029 12.869 12.601 12.093 12.454 15.078 15.203 14.783 12.030 8.988 8.987 + 9.591 9.266 10.946 11.496 11.604 12.089 13.840 14.201 16.768 16.909 15.776 15.289 13.584 13.733 13.772 14.273 15.905 16.605 15.509 14.208 13.663 13.717 13.988 15.241 15.248 13.473 12.072 11.865 11.148 11.593 14.722 14.562 14.270 11.956 8.576 8.556 + 9.850 9.471 10.892 10.910 11.807 12.177 13.659 14.484 16.908 17.041 15.603 14.838 13.599 13.374 13.657 14.444 16.151 16.322 14.858 13.778 13.442 13.601 13.786 15.293 15.421 13.389 12.195 12.113 11.261 12.469 15.388 14.947 14.468 12.271 9.214 7.575 + 10.288 10.314 11.179 11.690 12.059 12.745 14.021 14.639 16.957 17.011 16.351 15.151 13.673 13.849 14.237 15.294 16.663 15.952 14.680 14.064 13.701 13.647 13.763 15.348 15.596 13.880 12.572 12.222 11.232 13.966 15.912 15.172 14.207 11.965 9.634 7.495 + 10.008 9.904 11.149 11.646 11.601 12.677 13.934 14.262 16.842 16.753 16.487 15.230 13.862 13.931 14.406 15.478 16.290 15.294 14.362 13.877 13.523 13.765 13.840 15.212 15.408 13.691 12.351 11.863 11.630 14.429 16.034 15.409 14.172 12.622 10.297 8.603 + 9.359 9.251 10.785 11.024 11.463 11.999 13.448 14.390 16.974 17.262 15.641 14.958 13.496 13.505 13.570 15.252 16.608 14.460 12.985 12.566 12.422 12.775 12.877 14.495 14.914 13.028 11.601 11.118 10.900 14.473 16.015 15.049 14.170 11.730 9.386 7.766 + 9.904 10.305 11.187 11.633 12.388 12.604 14.031 15.138 17.224 17.088 15.572 15.114 14.169 13.825 14.188 15.966 16.520 14.353 12.922 12.636 12.653 13.017 13.042 14.456 15.291 13.707 12.017 11.563 11.312 15.169 16.552 15.620 14.721 12.327 9.745 8.567 + 10.177 10.573 11.390 12.285 12.895 13.022 14.553 16.036 16.875 17.221 14.667 14.755 14.697 13.941 14.921 16.445 16.112 13.697 12.760 12.580 12.333 12.791 12.991 13.450 14.480 13.008 11.984 11.460 11.259 14.914 16.498 15.740 14.831 12.662 10.038 9.271 + 9.763 10.148 10.756 12.066 12.658 12.914 14.347 15.989 16.559 16.624 14.461 13.579 13.770 13.218 14.333 15.738 15.349 12.408 11.314 10.964 10.770 10.625 10.733 11.564 12.129 11.692 10.987 10.506 10.548 13.887 15.489 15.011 14.101 11.868 9.628 10.477 + 8.961 9.946 10.608 11.222 12.550 13.132 13.996 16.602 17.046 15.384 14.565 13.810 12.732 13.378 14.529 15.780 14.107 12.168 10.769 10.577 10.311 10.321 10.480 11.127 11.377 12.534 10.960 9.903 9.589 13.451 15.157 14.805 13.934 11.618 9.659 10.556 + 9.452 10.223 10.608 11.953 12.966 13.790 15.730 17.168 16.369 14.336 14.540 13.905 12.778 13.480 14.857 15.879 13.617 11.877 10.595 10.545 9.684 9.765 9.987 9.579 12.432 13.268 10.382 8.945 8.444 10.511 12.732 13.349 11.733 11.060 8.558 9.192 + 9.416 10.117 10.585 11.859 13.263 14.492 15.359 16.009 14.297 13.361 12.853 13.062 12.361 13.047 14.286 14.717 13.630 11.689 10.985 9.874 9.312 9.433 9.889 10.435 12.403 12.961 11.415 10.032 9.334 9.311 12.989 14.203 13.098 12.979 10.883 8.888 + 8.201 8.235 8.684 9.928 11.138 13.735 15.327 14.288 12.600 11.151 10.890 10.562 10.350 10.624 13.278 14.231 11.846 9.673 9.021 8.236 7.389 7.624 7.906 8.525 11.417 12.577 9.575 7.838 7.135 7.089 11.712 13.385 11.416 11.915 10.077 8.859 + 8.501 9.545 10.333 11.586 13.334 14.338 14.230 12.718 11.536 11.010 10.729 10.776 10.785 11.286 12.928 13.351 12.035 10.264 8.871 8.526 8.480 8.391 8.510 8.988 10.774 11.941 10.244 8.541 7.519 7.702 10.081 12.402 11.947 11.347 10.648 9.552 + 5.717 6.016 5.858 8.459 10.527 11.109 10.073 9.348 9.486 7.964 7.765 7.321 5.975 6.455 9.060 10.385 8.526 5.893 5.952 4.508 4.866 3.922 4.271 5.279 7.648 9.348 6.621 4.487 3.498 3.599 6.438 8.849 8.398 7.193 6.588 3.822 + 5.366 7.316 7.227 6.153 5.343 6.625 7.951 9.564 10.257 7.882 5.957 6.107 5.920 4.382 5.815 6.175 6.907 6.050 4.983 4.971 5.418 4.577 3.817 5.359 6.099 5.471 4.879 4.090 4.007 3.915 5.667 5.408 4.692 3.674 3.192 3.659 + 6.209 7.598 7.601 6.054 5.365 7.644 9.047 9.138 9.165 8.692 5.743 5.311 5.739 4.971 5.530 6.268 6.169 6.089 5.239 5.217 4.822 3.579 5.094 5.559 6.022 4.961 4.972 4.003 3.928 4.226 6.337 5.749 5.091 2.415 3.131 2.834 + 4.542 3.829 4.134 5.176 4.584 6.404 8.787 8.345 9.362 9.343 5.859 5.617 4.773 5.618 6.262 6.447 6.744 5.266 4.734 4.915 4.353 3.759 5.218 5.161 5.719 4.782 4.400 4.011 3.532 3.738 5.885 5.250 3.959 3.489 3.130 2.308 + 2.763 4.259 4.928 4.791 4.433 6.612 7.445 6.397 8.471 9.071 5.735 5.687 5.163 4.606 4.953 6.279 7.076 5.898 3.947 5.016 4.884 5.171 5.027 4.498 4.095 4.375 4.182 4.152 4.353 4.726 5.707 4.332 3.662 3.432 3.066 1.846 + 4.767 5.190 4.157 3.778 4.153 3.956 7.615 8.170 8.254 8.443 5.360 5.173 5.351 5.203 5.127 5.784 5.319 4.584 3.949 4.124 4.725 4.695 4.439 5.129 5.809 5.356 4.602 4.277 3.579 4.315 6.061 4.816 3.988 2.708 3.006 2.854 + 3.662 5.191 5.399 4.519 6.758 7.668 8.114 8.036 7.226 7.615 8.461 8.228 7.039 5.782 6.079 5.835 5.348 6.764 7.242 7.627 8.000 8.092 8.583 8.781 8.776 7.445 8.022 7.913 6.645 5.485 5.594 5.849 6.275 6.634 5.074 4.332 + 3.428 3.664 4.672 3.940 7.001 8.242 7.858 6.467 7.234 7.425 8.831 8.281 6.593 6.386 6.222 6.386 6.012 5.513 6.203 6.736 6.684 7.049 7.539 7.845 8.115 6.864 8.120 7.563 5.439 5.372 4.913 5.028 5.893 6.128 4.562 4.007 + 4.141 3.949 3.751 3.812 4.985 5.283 7.821 8.110 6.889 6.029 5.200 4.953 5.521 5.809 5.062 5.471 5.465 3.934 4.494 4.941 4.810 5.052 5.758 5.532 5.572 5.496 5.642 5.305 4.469 3.729 4.778 4.734 3.991 4.044 3.238 1.958 + 4.705 4.339 3.747 3.239 2.996 5.739 7.133 6.870 6.428 5.647 5.347 5.421 5.443 4.395 5.225 6.888 6.395 6.516 5.600 4.476 5.279 6.115 6.041 5.270 5.936 6.052 5.558 4.394 4.123 3.117 4.462 4.649 3.365 3.140 2.943 2.632 + 3.870 4.844 3.193 3.994 4.745 6.376 7.519 7.813 6.612 5.708 5.711 5.090 5.621 5.886 7.503 7.095 4.829 5.103 5.369 5.677 6.284 5.616 4.179 5.261 5.968 6.235 5.651 5.204 4.131 3.949 4.474 4.453 3.882 3.760 3.934 3.476 + 4.661 3.701 0.936 3.804 4.886 6.058 5.713 5.901 6.216 5.384 5.439 5.829 5.538 6.837 6.563 6.389 6.234 5.082 4.789 4.900 5.569 6.059 6.012 5.941 6.017 5.967 4.365 5.139 4.995 4.827 4.911 4.037 4.686 4.356 4.137 3.429 + 5.369 3.812 3.860 4.266 4.625 4.820 5.822 7.515 6.656 5.165 5.618 6.027 5.829 7.163 6.823 5.649 6.460 5.984 6.430 5.744 6.480 5.869 5.158 5.679 5.666 5.181 4.570 5.118 4.988 4.441 4.522 4.440 4.631 4.393 3.543 2.811 + 5.352 5.497 4.073 3.892 5.175 6.434 7.001 7.104 6.622 4.010 3.682 4.924 4.663 5.526 6.578 6.320 6.920 6.250 5.768 5.855 6.146 6.211 6.751 6.275 5.476 5.431 5.574 5.331 4.816 4.745 4.959 4.316 5.150 4.106 3.618 2.736 + 2.974 4.342 4.165 3.453 5.344 6.941 7.016 6.106 6.728 4.871 5.386 4.582 5.411 5.908 7.362 6.751 6.317 6.414 5.846 5.005 6.172 6.259 6.265 5.583 6.245 6.605 4.635 4.663 5.325 5.159 4.420 4.816 5.185 4.325 4.238 2.963 + 4.410 3.563 4.213 4.883 5.572 7.437 7.201 5.697 5.177 5.872 6.531 6.406 6.503 6.438 6.188 6.606 5.888 5.527 6.285 6.391 6.448 6.125 6.089 5.863 6.383 6.812 6.627 5.544 4.388 5.077 5.208 4.774 4.278 4.398 4.321 2.981 + 4.809 4.552 6.215 6.270 4.799 6.543 7.374 5.892 6.541 5.761 4.579 5.708 5.512 7.142 7.352 7.797 6.440 6.962 6.906 5.696 6.129 6.178 5.406 5.918 5.538 5.817 6.972 6.799 4.642 5.221 5.252 5.320 4.660 5.256 4.134 2.569 + 5.316 5.896 5.297 6.070 5.431 7.380 8.166 6.596 6.680 6.896 6.296 5.481 4.829 7.756 7.511 7.066 5.730 5.905 6.717 6.478 6.323 7.075 5.611 6.491 6.192 6.011 5.404 5.345 4.865 5.475 4.767 5.204 5.022 4.715 4.171 3.393 + 3.820 6.029 6.681 5.849 6.149 7.385 6.619 7.448 7.937 5.294 5.737 4.449 5.496 6.548 6.260 6.862 6.832 6.975 6.137 6.356 5.904 6.776 6.196 6.686 6.805 6.689 5.180 5.435 5.451 5.901 5.178 4.892 4.618 4.108 4.992 4.050 + 6.679 7.963 7.305 6.543 6.078 7.937 8.503 7.139 7.828 5.292 5.863 7.048 7.639 6.717 6.338 5.327 6.744 6.099 6.165 5.731 6.503 6.132 6.277 6.596 6.526 6.642 6.144 6.432 5.630 5.796 5.070 5.417 5.272 4.925 5.092 4.233 + 6.073 6.838 7.669 7.019 6.043 8.297 8.879 6.745 7.057 6.891 6.577 6.262 7.857 8.599 8.251 7.096 6.261 6.712 5.728 5.143 5.917 6.293 5.623 5.377 5.203 5.963 5.984 6.421 6.410 5.586 5.192 4.868 5.608 5.195 4.762 3.869 + 4.877 6.359 7.905 7.788 8.216 8.565 7.485 8.140 7.772 7.796 8.027 8.171 7.512 7.438 7.321 7.425 7.237 7.545 7.088 6.391 6.106 5.597 6.864 7.135 7.362 7.587 6.431 5.587 6.339 6.414 5.676 5.344 6.293 7.216 7.155 7.190 + 6.853 9.245 10.553 10.942 10.743 9.965 9.059 9.528 9.607 9.709 10.658 10.472 8.540 6.880 7.990 8.672 8.522 8.868 9.054 7.830 6.745 6.255 7.798 8.832 9.756 8.839 7.723 5.766 6.648 8.638 6.866 5.494 8.453 10.266 9.163 9.498 + 7.592 8.601 8.459 9.576 8.528 8.392 6.768 7.553 9.100 8.166 8.692 8.201 7.320 6.838 6.428 7.286 7.693 6.290 7.364 7.991 8.079 8.641 8.451 7.791 7.386 7.615 7.197 7.705 6.806 7.379 6.726 7.415 8.497 8.592 7.372 6.304 + 7.010 6.265 8.047 9.198 8.234 8.569 7.883 7.539 8.027 8.429 8.676 8.122 7.139 7.289 7.345 7.664 7.028 7.503 6.845 7.393 8.049 8.615 8.650 6.782 6.356 8.537 8.193 7.933 7.223 6.677 6.087 7.338 8.524 8.693 7.441 6.504 + 2.544 3.306 5.486 7.175 5.840 8.198 7.922 6.854 9.372 10.018 8.351 8.223 7.934 8.702 8.025 7.665 7.359 7.183 6.450 6.780 5.836 6.551 8.152 7.299 7.675 8.053 6.518 6.653 6.331 6.484 5.912 6.580 7.492 8.321 8.056 5.479 + 4.168 5.315 6.335 7.352 7.877 8.528 8.489 7.243 7.936 9.097 10.998 10.172 7.927 7.541 8.271 8.033 6.768 7.133 8.417 7.503 6.595 6.915 7.822 7.399 8.318 7.246 6.295 6.573 5.965 5.998 5.366 6.606 7.667 7.064 6.265 4.865 + 3.804 4.556 5.504 5.909 8.860 9.713 7.761 6.446 7.071 9.287 12.085 11.978 7.605 5.889 7.895 9.119 7.995 6.508 7.578 8.348 7.048 7.458 8.561 6.988 7.565 6.645 7.045 7.412 6.379 6.832 6.113 5.837 7.170 7.065 6.743 5.306 + 3.802 3.497 5.283 7.439 8.893 10.072 8.033 7.197 5.988 8.683 11.475 11.566 8.513 5.803 6.917 9.721 9.517 7.891 8.195 9.725 7.710 6.636 7.629 7.687 7.569 7.055 7.570 6.756 6.420 7.411 5.659 6.334 7.586 7.619 6.461 5.324 + 3.627 3.197 5.014 5.569 7.259 8.963 8.835 5.171 6.470 8.074 8.528 8.066 8.889 7.824 6.187 6.648 9.449 10.334 6.844 6.695 8.611 8.329 5.558 8.019 8.338 5.746 8.952 8.219 7.171 7.737 5.578 6.917 7.839 8.091 6.861 5.692 + 4.728 4.470 5.424 5.837 6.876 8.875 8.779 5.107 4.858 5.570 5.464 7.476 8.813 6.326 5.594 5.753 9.963 10.464 5.783 5.011 9.388 8.793 5.767 9.211 9.164 6.010 10.109 9.006 9.029 9.073 6.996 7.369 9.536 9.484 8.678 6.764 + 1.240 3.497 5.110 5.625 8.544 9.653 7.576 5.522 5.326 6.469 9.401 10.013 8.363 5.147 5.689 7.500 9.611 8.736 6.693 8.685 8.676 6.522 7.960 8.268 6.922 7.687 9.026 7.418 8.234 7.279 6.695 6.569 8.772 8.006 7.523 5.506 + 3.571 5.131 6.485 7.112 8.157 8.720 7.624 7.583 8.822 10.238 10.807 10.460 5.834 4.511 6.436 6.732 6.741 6.559 7.382 7.506 5.219 5.155 6.121 4.799 5.371 5.458 5.746 5.904 5.249 6.071 5.736 5.207 5.834 5.928 5.087 4.466 + 2.940 3.472 6.866 7.349 5.604 7.052 7.660 6.983 9.475 9.700 9.981 9.114 7.680 5.611 5.245 6.572 6.532 6.219 6.231 5.068 4.548 4.125 4.969 4.478 5.113 5.458 6.062 6.570 5.120 4.440 5.296 5.957 6.378 6.764 6.898 4.242 + 3.666 3.341 5.964 6.491 4.731 6.013 5.380 5.842 7.947 8.180 9.067 8.143 5.318 6.412 6.163 5.157 5.433 5.468 4.261 5.672 5.484 4.373 4.645 4.195 4.167 5.329 5.622 5.514 5.075 4.362 4.963 5.753 6.766 6.716 6.760 4.553 + 4.328 4.211 5.559 6.673 6.594 6.376 6.295 4.462 6.580 7.494 6.479 4.361 3.707 7.285 6.904 5.278 5.124 6.144 6.217 5.786 5.722 5.285 4.646 4.369 4.172 4.344 5.431 5.742 5.502 4.982 5.203 6.089 6.993 7.225 7.091 5.291 + 3.965 4.432 5.854 5.637 6.353 8.038 7.577 6.010 5.993 6.288 6.139 5.109 6.380 6.828 5.835 5.098 4.922 5.649 5.283 5.236 4.843 5.273 5.805 5.195 4.552 5.487 6.419 6.874 6.400 5.056 5.263 6.337 7.036 7.689 8.023 5.127 + 3.622 4.181 5.954 7.022 6.696 7.607 7.344 6.301 5.926 5.567 6.462 6.201 5.725 6.010 6.373 5.379 5.504 5.970 5.807 5.326 4.570 5.391 5.538 4.523 4.636 5.387 6.058 6.357 6.953 5.423 5.147 6.015 7.024 7.934 8.292 5.916 + 4.796 4.860 5.193 6.453 6.777 6.044 7.061 6.573 5.584 5.996 6.976 6.466 4.726 6.849 6.485 4.852 5.085 5.498 5.958 5.348 5.213 5.728 5.212 5.357 4.970 4.470 5.644 5.743 5.875 5.626 4.484 5.749 7.411 7.327 7.296 5.160 + 2.202 3.825 4.757 4.854 5.774 7.662 7.833 7.218 6.721 6.325 6.645 6.993 4.159 6.535 6.077 5.197 5.804 5.964 5.162 5.096 6.204 5.455 5.156 5.164 4.585 4.279 6.208 5.731 5.578 5.341 5.011 5.830 6.589 7.193 7.098 4.448 + 4.159 5.109 4.462 5.531 6.554 7.911 6.895 7.007 6.397 6.354 6.161 6.455 5.858 6.034 6.177 5.769 6.073 4.719 5.157 5.194 5.164 4.894 4.217 4.538 4.596 4.315 5.946 5.801 4.880 4.811 5.547 5.326 5.915 6.688 6.501 4.947 + 3.636 4.522 5.206 5.198 6.055 7.009 6.893 7.234 7.968 6.576 5.702 5.990 4.581 5.727 5.912 4.874 6.538 5.928 5.093 4.697 4.670 5.535 6.211 4.432 4.046 4.127 4.894 5.500 5.360 5.277 5.055 5.601 6.505 7.398 6.530 3.656 + 3.841 3.105 3.494 3.789 5.773 7.965 7.168 6.647 7.850 6.963 5.871 6.640 5.499 6.212 5.592 5.530 5.878 5.899 4.988 5.473 5.042 4.886 6.125 4.778 4.285 3.959 4.619 4.840 4.896 4.454 4.388 4.473 5.491 6.270 5.679 3.665 + 4.326 5.876 6.287 4.913 4.658 7.557 7.704 6.800 6.521 8.307 7.857 6.183 6.046 6.545 5.853 4.138 5.839 4.964 4.684 6.074 5.097 5.495 5.092 4.796 4.364 4.555 5.890 5.467 5.411 4.964 4.401 4.193 4.761 5.579 5.144 3.791 + 3.603 5.830 6.646 5.927 4.744 5.856 7.901 6.370 5.093 8.559 9.851 8.229 5.724 6.926 5.942 4.995 5.481 4.506 4.951 4.975 4.398 4.703 4.550 4.138 3.483 4.746 5.272 5.219 4.757 5.102 4.369 4.206 4.394 5.070 3.091 2.161 + 4.022 4.620 5.273 4.030 3.655 5.777 7.735 6.896 5.833 8.700 9.898 7.941 5.842 4.701 4.674 6.246 6.154 6.453 4.710 4.843 4.854 5.268 4.596 4.671 4.518 4.589 5.278 4.957 5.149 5.217 4.267 4.555 4.475 4.434 4.176 2.696 + 3.315 4.099 3.782 2.061 3.621 5.618 6.089 4.179 6.681 8.849 8.365 5.988 6.059 3.154 4.561 4.740 6.220 7.014 5.021 4.080 5.041 4.500 4.331 4.780 4.351 4.112 5.918 4.580 4.496 4.362 4.542 4.669 4.799 4.654 4.398 2.449 + 2.748 3.933 3.358 3.625 5.312 5.506 4.993 3.524 3.802 6.177 6.197 5.634 6.044 4.567 4.927 4.082 4.847 4.729 4.331 4.006 4.100 3.184 4.545 3.482 3.468 2.993 5.005 4.422 4.409 4.340 4.248 3.667 4.000 4.053 3.557 2.281 + 3.438 4.042 4.954 5.390 4.448 5.869 6.935 5.970 4.921 4.766 4.006 4.089 5.431 5.773 5.313 5.280 5.317 6.936 5.896 4.594 4.291 5.086 4.285 3.412 4.979 4.122 4.423 4.085 3.638 4.453 4.063 3.436 3.895 4.621 4.462 3.161 + 2.949 2.048 3.396 3.377 3.706 3.167 6.454 6.478 5.051 4.405 3.871 3.666 4.966 5.170 4.425 3.613 3.921 6.100 6.618 4.386 2.314 4.952 6.023 3.938 4.067 5.491 4.569 5.237 4.869 4.234 4.323 4.306 5.277 4.597 3.844 1.925 + 3.735 3.535 2.535 1.593 2.655 3.939 4.764 3.830 2.528 2.927 3.094 4.030 3.050 4.129 3.554 3.540 2.835 3.143 2.505 0.137 1.845 3.430 2.350 1.232 2.044 2.057 1.671 0.995 1.707 2.951 3.291 2.191 2.327 1.926 1.612 0.975 + 4.540 3.482 2.907 1.893 2.432 3.769 4.829 2.789 3.590 2.366 2.275 2.600 2.742 2.639 3.543 3.407 2.003 2.093 1.934 1.684 2.323 3.344 2.866 2.581 2.328 2.061 2.686 2.377 1.978 2.237 2.766 2.566 2.165 0.904 1.364 0.812 + 3.560 2.598 3.165 3.610 3.947 3.475 3.925 3.931 3.489 2.388 1.480 1.106 2.045 2.073 1.407 3.111 3.188 2.564 1.193 1.628 2.432 1.991 1.899 1.742 2.501 1.809 2.306 2.466 2.813 2.435 2.542 2.375 2.332 1.270 1.574 1.359 + 3.995 3.990 2.810 4.045 4.076 5.044 3.957 3.514 3.915 2.824 2.387 1.147 2.576 4.219 3.560 3.098 3.025 2.884 1.374 1.911 2.573 2.462 2.867 1.863 2.374 1.821 2.309 2.617 1.069 2.578 2.582 1.829 0.876 1.856 1.929 0.328 + 2.469 1.587 1.926 2.630 2.799 4.367 5.425 3.726 4.385 3.926 1.046 1.146 2.032 4.382 4.134 3.573 3.542 2.821 1.704 1.988 2.401 2.327 2.960 1.474 1.183 0.991 2.053 1.836 1.044 2.111 1.902 1.818 1.079 1.932 1.844 0.662 + 2.792 1.645 2.003 2.604 2.790 2.537 3.845 3.414 2.689 3.282 1.026 1.679 2.362 3.747 3.688 2.797 2.455 2.362 2.555 1.656 0.552 1.383 2.038 1.720 1.729 1.640 2.128 2.664 2.034 2.264 1.518 1.004 0.968 1.200 1.294 0.693 + 2.505 2.453 1.866 3.060 2.652 3.632 3.417 2.628 2.317 3.690 3.410 1.959 2.502 3.414 3.187 3.712 2.599 1.922 2.915 1.978 0.441 1.098 2.681 2.190 1.339 0.602 1.469 1.259 1.027 1.281 1.566 1.070 1.545 1.637 1.023 0.688 + 0.726 1.201 1.549 1.990 3.272 3.336 4.232 3.027 3.044 3.746 2.687 2.811 3.273 4.153 3.293 3.052 2.415 2.058 3.371 2.842 1.636 1.670 2.828 1.283 1.860 1.223 0.279 0.815 1.025 1.266 2.032 1.163 1.364 1.975 0.609 0.151 + 2.839 0.978 0.752 1.988 1.899 2.535 4.014 3.360 3.767 2.666 2.435 2.164 1.919 2.251 1.988 1.373 2.815 2.347 1.679 1.744 2.015 1.748 1.405 1.820 1.586 1.279 1.146 2.014 1.757 1.852 1.441 1.892 0.393 1.040 1.324 0.177 + 4.666 3.656 1.879 2.993 2.256 2.418 3.050 3.064 2.916 1.823 1.863 2.033 3.065 3.325 3.234 1.221 1.623 2.862 2.354 1.800 1.012 0.987 2.189 1.407 0.935 0.872 1.207 0.950 1.824 1.678 0.741 1.458 0.332 1.284 1.471 0.016 + 5.328 5.399 4.239 4.887 5.131 5.449 5.796 5.719 3.609 0.292 1.502 3.431 3.759 3.442 3.400 1.880 2.500 2.410 2.581 2.227 1.932 1.537 2.243 1.057 1.812 0.934 1.527 1.347 1.111 1.501 0.823 1.880 0.936 1.495 1.480 0.196 + 9.409 9.512 9.702 9.864 10.414 9.543 9.838 8.966 8.435 7.119 7.041 6.634 5.991 6.088 5.934 5.919 5.690 5.288 4.653 4.705 4.960 4.385 4.496 3.967 4.181 3.489 2.981 3.769 3.833 3.995 3.977 4.209 4.430 4.368 4.062 2.911 + 11.060 11.271 11.549 11.773 11.761 11.293 11.301 10.800 9.479 8.349 7.538 7.772 7.402 6.596 7.639 7.446 6.835 6.729 6.205 6.082 6.923 6.674 6.383 6.149 5.664 5.544 4.810 5.609 5.535 5.742 5.367 5.794 6.212 5.888 5.510 4.159 + 9.785 10.258 10.564 11.014 11.080 10.769 10.594 10.498 9.184 8.194 7.415 6.141 5.869 6.230 6.740 6.708 5.996 5.705 6.407 6.258 7.435 7.930 8.195 8.144 7.638 6.305 4.001 3.729 3.629 3.808 3.442 3.584 4.010 3.659 3.102 2.269 + 9.414 10.001 9.033 9.149 10.104 10.264 9.091 8.983 7.410 6.482 5.598 4.659 4.278 4.804 5.214 4.976 4.716 3.910 4.416 4.025 5.967 5.889 6.234 6.272 5.905 4.362 3.932 3.728 3.906 3.115 3.238 3.163 2.915 2.821 2.457 2.013 + 7.532 6.616 6.228 6.417 7.753 8.097 6.504 4.114 3.871 4.335 3.217 1.284 0.976 4.040 3.824 2.971 2.271 2.217 1.802 1.732 2.550 3.147 3.734 3.754 4.476 4.162 4.639 4.896 5.546 4.590 4.780 4.497 4.144 3.498 2.872 1.968 + 2.850 3.584 2.803 3.216 5.228 5.718 5.630 3.371 2.823 2.929 2.956 1.806 1.976 2.501 2.465 2.024 2.329 2.055 1.071 0.987 1.212 1.093 1.915 2.813 2.601 2.354 3.327 3.085 3.704 2.983 2.649 2.451 2.260 1.775 2.451 1.240 + 4.657 3.237 4.183 6.162 5.845 5.589 5.486 6.358 4.449 5.636 4.957 4.816 3.906 3.340 3.753 3.397 3.293 3.123 3.612 3.646 4.004 4.509 5.263 5.783 5.836 5.445 5.115 4.933 4.994 4.729 4.012 4.214 4.447 4.434 3.785 3.731 + 7.193 7.509 7.420 7.463 7.168 7.151 8.053 8.909 9.392 10.169 10.215 9.361 7.898 6.834 7.700 8.061 7.776 7.582 7.436 7.899 8.286 8.621 9.376 9.927 9.897 9.150 8.715 8.096 8.067 8.192 6.574 7.208 7.921 7.699 6.556 6.087 + 5.252 6.269 6.129 4.987 4.018 5.295 4.374 5.344 6.298 7.738 7.940 6.291 3.822 3.671 4.844 4.467 3.556 4.186 4.000 4.220 4.529 4.852 5.780 6.600 6.578 6.297 6.538 5.035 5.174 5.466 4.074 4.737 5.598 5.766 6.165 5.450 + 2.435 2.291 3.689 3.542 3.594 3.309 2.718 3.618 1.423 3.795 4.138 2.809 1.787 2.403 2.700 2.195 2.052 2.740 2.481 3.831 4.343 3.671 4.946 5.278 5.099 5.137 6.262 5.229 5.011 4.492 4.988 5.284 6.075 6.691 6.789 6.899 + 3.330 3.855 3.592 3.418 4.051 4.031 5.418 4.521 3.464 4.113 4.979 2.976 2.240 2.383 2.860 3.322 5.067 4.944 4.742 5.549 5.840 4.363 5.806 5.607 6.041 6.012 6.215 6.275 6.261 6.645 5.549 6.787 7.439 7.245 6.988 7.027 + 3.031 2.355 2.522 3.587 2.065 4.143 5.527 6.172 5.684 4.485 5.982 4.785 3.307 2.890 2.970 4.154 6.083 7.088 7.000 6.569 6.716 6.253 5.399 6.452 5.280 6.229 8.097 6.191 6.378 6.135 6.208 6.069 7.088 8.244 7.983 6.221 + 4.308 3.751 4.011 4.429 4.599 3.897 5.344 5.739 5.526 7.228 7.507 5.882 2.722 2.910 4.222 3.931 5.259 7.310 7.514 6.885 7.450 6.496 5.481 6.866 6.396 5.750 7.329 6.424 5.981 5.818 6.108 6.666 7.477 7.299 7.263 6.855 + 2.398 3.241 4.622 4.713 4.080 3.865 4.867 5.484 5.732 6.279 5.423 3.956 2.872 3.349 4.151 4.377 4.688 5.804 5.517 5.667 5.872 5.452 4.987 6.269 6.716 4.375 6.454 5.597 4.283 3.799 4.385 5.465 5.736 5.999 5.814 5.387 + 4.618 5.224 4.893 3.252 3.936 4.898 4.996 4.671 5.442 5.545 5.271 5.277 3.925 4.273 3.785 2.150 1.938 2.628 3.481 2.743 3.618 3.569 4.231 3.848 3.236 3.437 3.878 3.540 3.342 3.898 3.422 3.775 3.538 4.158 3.538 3.372 + 4.963 6.653 7.241 6.278 5.068 5.927 5.785 4.525 4.562 3.661 5.134 4.005 1.745 3.500 3.410 3.094 2.972 2.252 2.859 2.669 2.951 2.972 4.000 3.243 3.402 2.689 2.581 2.793 3.173 2.866 3.230 3.098 2.436 2.853 2.587 1.864 + 5.496 6.171 5.426 5.802 5.704 4.460 5.314 4.315 4.341 3.870 3.515 4.053 2.747 3.637 3.297 3.175 3.028 3.053 2.790 3.189 3.032 3.807 3.917 2.616 2.293 2.003 2.259 3.174 2.685 2.065 2.604 2.550 2.515 2.215 1.888 1.442 + 5.219 4.958 4.788 3.903 5.029 5.009 4.273 4.155 3.687 4.402 4.586 3.815 2.232 3.935 3.260 3.284 1.916 2.108 3.220 2.282 3.308 2.873 2.516 2.954 2.455 1.489 2.371 2.682 2.778 2.356 1.841 2.282 3.198 2.687 1.903 0.693 + 4.717 4.834 5.668 5.121 5.776 5.584 5.200 3.389 4.135 3.414 4.026 3.144 2.741 3.162 3.131 3.909 3.575 2.581 2.175 2.556 3.389 3.346 3.763 4.103 3.383 3.710 2.851 2.404 2.679 2.680 2.268 1.562 2.489 1.901 1.891 1.419 + 5.194 4.716 5.458 5.348 5.368 5.621 5.626 3.589 4.233 3.656 4.782 4.587 3.719 3.640 3.097 2.212 2.808 2.827 1.826 2.827 3.626 3.601 3.813 3.862 3.538 2.854 2.458 3.802 3.040 2.622 1.994 2.212 2.062 2.079 1.832 1.649 + 6.020 5.588 5.517 4.653 3.797 5.463 4.924 4.938 4.496 3.873 4.457 3.883 2.746 2.787 2.783 1.520 2.051 2.560 2.546 3.167 3.146 2.875 3.796 4.188 4.175 3.446 3.230 4.481 4.419 3.375 2.914 3.310 3.606 4.047 3.185 2.918 + 6.539 6.269 6.289 5.723 6.230 6.200 6.142 6.147 5.194 5.771 5.715 5.016 4.121 2.612 3.803 4.453 3.733 3.823 4.036 4.453 4.765 5.225 5.603 6.272 6.687 7.090 7.375 8.444 7.526 6.405 3.932 4.948 5.599 7.597 7.328 7.187 + 5.005 5.260 5.031 5.055 5.060 6.192 5.426 5.018 3.617 3.868 4.351 4.975 3.103 2.820 3.362 2.754 2.037 2.736 2.250 2.758 3.105 3.688 3.877 4.697 4.999 5.264 5.715 7.723 6.340 4.949 2.963 3.630 5.320 7.043 5.673 5.869 + 5.630 6.566 6.849 5.999 5.817 6.314 6.066 5.650 5.621 5.791 6.122 5.726 4.047 2.570 3.092 4.072 3.156 3.265 3.843 3.931 3.582 3.261 4.719 4.878 4.902 4.844 5.206 6.377 5.724 4.134 3.329 3.017 3.080 3.809 2.693 2.781 + 4.861 5.737 5.996 4.794 3.363 5.486 4.314 4.339 2.881 3.747 4.830 4.984 2.922 2.150 2.255 2.377 3.046 3.759 2.601 2.888 3.248 2.921 3.720 3.655 3.342 2.615 3.326 4.713 4.696 3.566 1.560 1.920 2.172 3.523 3.643 2.805 + 3.139 4.131 5.123 4.973 5.340 4.997 4.640 2.965 3.042 4.722 4.885 4.198 1.875 3.253 3.454 2.098 2.390 3.424 2.636 2.876 2.819 3.848 3.540 2.865 3.991 4.555 3.729 3.837 4.526 4.205 2.368 1.596 2.496 3.093 3.330 2.803 + 6.653 5.885 6.235 5.899 5.323 6.233 6.020 4.658 5.652 7.313 7.550 6.850 4.182 3.601 3.584 3.979 3.332 3.980 4.458 3.420 3.524 3.608 3.147 3.160 3.650 4.048 3.968 3.445 5.534 4.884 2.470 2.953 3.465 3.783 2.550 2.753 + 6.014 6.067 6.359 6.105 5.632 5.071 3.887 3.475 4.546 5.831 5.286 5.680 2.966 2.979 3.646 3.753 3.618 3.432 4.076 3.971 3.387 3.738 3.201 3.727 3.922 4.224 4.129 3.976 4.986 4.161 3.315 3.303 4.135 4.212 3.055 2.674 + 6.007 4.817 5.107 4.287 3.192 4.546 4.963 5.677 6.253 5.386 5.504 4.272 4.692 4.232 4.482 3.739 3.675 4.366 3.912 4.068 4.114 4.982 5.106 4.910 4.499 3.955 4.314 4.560 4.980 5.050 4.018 5.558 6.379 5.469 3.981 3.533 + 4.946 2.927 4.588 4.600 4.020 4.934 3.749 4.267 4.775 5.350 5.686 5.888 5.458 4.251 4.218 3.934 3.921 4.606 4.472 3.394 4.437 5.032 4.819 5.771 5.347 4.741 4.178 5.764 5.878 5.158 4.912 5.739 7.259 6.808 6.062 5.343 + 4.353 5.297 5.308 3.323 3.994 4.796 4.270 4.342 3.571 5.132 5.574 6.069 5.592 4.958 4.026 5.390 5.452 5.755 5.588 5.384 4.428 4.783 5.192 5.763 5.690 6.245 5.404 5.628 5.979 5.911 5.319 5.631 7.216 7.067 6.457 5.757 + 4.330 3.452 4.799 4.553 4.070 3.225 4.126 5.602 5.337 5.199 5.739 7.420 6.402 5.319 4.934 6.221 6.107 5.293 4.411 5.336 5.389 5.722 6.072 6.457 6.156 6.503 5.470 5.793 6.114 6.095 5.383 6.078 6.676 6.635 7.299 6.237 + 2.518 0.844 1.805 1.416 1.628 3.230 5.097 6.083 6.097 6.735 6.319 5.521 6.298 5.291 4.627 5.003 6.282 5.967 4.918 5.451 5.754 4.974 6.229 7.088 6.672 6.149 5.026 5.048 6.427 6.307 4.708 6.179 6.909 6.839 7.183 6.313 + 0.665 2.134 2.537 1.395 1.932 2.977 3.821 2.755 4.429 3.212 4.035 3.862 3.716 4.074 4.011 3.839 4.577 5.094 4.711 4.086 3.983 5.350 5.614 6.519 6.092 6.090 4.929 5.541 5.646 5.530 4.722 5.707 6.306 5.957 6.362 5.924 + 2.167 1.249 2.181 1.840 3.921 4.872 3.810 1.147 3.651 3.441 4.355 3.623 4.210 3.464 3.896 3.127 4.523 5.156 4.817 3.869 2.467 4.553 5.326 5.569 5.143 5.878 4.732 5.111 4.986 4.990 4.023 5.023 5.696 5.472 6.045 5.225 + 3.610 2.001 1.643 2.971 2.519 3.587 3.444 3.880 3.145 2.870 5.419 5.065 3.492 3.409 2.955 2.561 2.558 3.178 3.636 3.579 2.979 2.002 3.894 3.383 2.954 2.940 2.255 3.199 3.871 3.148 2.569 3.695 3.722 3.459 3.576 3.304 + 1.488 2.982 2.912 3.812 3.627 4.006 3.772 3.078 3.905 4.211 5.205 4.254 1.376 4.077 4.075 3.854 3.605 3.315 2.762 1.549 2.603 2.057 2.339 2.458 2.547 2.375 1.882 1.806 2.592 2.697 1.600 2.071 2.757 2.764 2.319 1.492 + 3.779 3.038 1.367 0.786 1.427 3.381 2.652 0.889 0.193 1.884 2.835 1.511 -0.604 2.586 3.161 3.145 2.816 2.035 2.741 2.429 2.562 2.225 2.410 2.996 2.541 2.339 2.293 1.173 1.593 2.174 1.576 1.668 1.950 2.271 1.244 0.740 + 2.606 2.212 2.060 2.488 2.190 2.613 3.321 2.425 1.246 2.282 2.674 0.610 0.349 2.289 2.312 1.431 1.611 1.099 2.182 2.067 2.648 2.432 2.386 2.751 1.602 1.515 2.095 1.752 1.880 2.528 2.480 2.234 2.110 1.278 1.788 0.921 + 2.419 3.105 3.210 2.415 1.889 2.710 3.117 1.047 2.180 2.343 3.404 2.317 0.929 2.741 3.153 3.217 2.040 0.807 1.991 2.031 2.662 1.379 2.463 2.791 2.536 2.976 2.659 1.830 1.909 1.541 2.158 2.350 2.173 1.910 2.413 1.783 + 2.300 3.125 1.843 2.556 3.315 2.809 2.344 0.559 1.399 2.657 3.023 1.647 2.305 3.697 2.860 2.414 3.699 2.522 1.661 2.110 3.277 3.322 1.521 2.269 2.399 3.035 4.056 3.694 4.305 4.255 4.593 4.884 4.778 4.673 5.232 4.778 + 3.106 2.947 0.955 0.531 2.866 3.542 3.431 2.006 3.218 2.965 1.981 2.304 1.515 2.349 2.528 2.335 2.594 2.212 2.523 2.756 2.747 3.336 3.311 2.645 2.635 2.601 3.758 3.351 3.992 3.955 4.544 4.794 4.471 4.332 5.160 4.810 + -0.486 1.877 1.066 1.182 2.123 1.340 2.187 1.969 1.671 1.055 2.244 2.615 2.281 2.656 2.974 3.815 3.132 2.031 2.249 2.710 2.791 3.137 3.062 2.091 1.973 1.788 1.686 0.939 2.059 1.969 2.353 2.128 1.502 1.535 1.271 0.081 + 2.555 1.801 1.348 1.731 2.379 2.277 1.802 1.472 2.030 1.718 1.909 3.617 2.288 3.521 3.185 3.706 3.650 3.009 1.675 1.950 1.505 3.008 3.178 1.621 1.546 1.980 2.250 1.575 2.405 1.959 1.962 2.192 1.508 1.389 1.569 1.016 + 3.198 3.232 2.629 1.197 1.360 3.255 3.340 1.958 -0.401 1.265 1.789 2.326 1.070 3.901 3.183 3.460 2.899 2.174 1.048 1.966 2.404 2.357 2.347 1.383 2.815 2.213 2.456 2.544 1.857 1.549 1.705 1.752 1.678 1.118 0.868 1.279 + 2.457 1.168 0.273 2.621 2.964 2.197 2.385 1.884 3.193 3.539 2.021 1.926 1.884 3.161 2.621 0.942 2.070 2.294 1.639 2.624 1.709 0.925 1.528 2.261 2.847 2.174 2.070 2.425 2.540 2.690 1.800 0.889 1.728 1.476 1.833 1.051 + 4.007 3.538 3.237 3.032 2.697 2.268 3.745 3.709 2.428 1.382 0.766 1.775 2.540 2.443 3.020 1.802 1.849 1.573 1.332 0.889 0.986 0.355 2.312 2.543 1.307 1.358 2.797 2.477 2.200 2.696 2.541 1.732 1.779 1.877 1.653 0.893 + 5.141 4.202 2.861 2.788 3.639 3.589 2.139 2.434 3.233 1.610 0.330 1.915 2.037 2.545 2.702 2.064 1.926 1.251 1.857 1.675 1.472 2.292 2.005 1.352 2.142 1.537 1.954 1.580 1.784 1.292 2.617 2.681 1.876 1.085 1.253 1.183 + 4.354 3.301 3.559 3.166 3.268 3.709 3.884 2.386 2.358 2.027 1.755 2.116 2.107 4.770 4.183 2.658 2.332 1.641 1.814 1.629 2.132 2.517 1.401 1.464 2.155 1.808 1.726 0.750 1.610 2.437 1.665 2.307 1.917 1.832 1.075 1.059 + 2.512 2.444 2.638 1.039 2.487 4.829 4.810 3.363 3.615 3.492 3.659 2.941 2.011 4.005 4.321 2.160 2.188 1.814 1.056 2.024 2.569 1.194 1.751 1.975 2.113 1.696 2.010 1.324 1.638 1.239 1.790 1.739 1.174 1.810 1.442 0.834 + 1.289 0.830 1.172 1.089 0.834 2.019 3.629 3.449 1.593 1.217 2.475 2.282 0.297 1.693 3.181 2.879 2.700 2.340 1.737 1.703 0.873 0.599 0.704 1.460 1.341 1.543 1.662 1.426 1.017 1.264 0.930 1.116 2.254 2.551 1.884 1.432 + 2.050 2.717 2.153 3.361 3.194 3.384 4.629 3.415 2.048 2.687 2.173 1.533 1.593 1.109 3.139 2.515 1.314 1.161 1.355 1.280 0.997 0.721 1.237 0.685 0.793 1.297 1.924 1.997 1.907 2.112 1.819 1.099 1.218 1.544 2.008 0.656 + 0.441 2.878 3.009 2.986 4.008 4.200 4.271 2.440 3.467 2.144 -0.481 0.276 1.124 3.113 2.735 1.523 2.123 2.121 1.533 1.076 1.163 2.564 2.234 1.834 1.628 1.343 1.421 0.746 0.973 2.272 1.722 0.600 1.199 1.966 1.668 0.843 + 1.367 1.705 1.303 3.198 3.372 2.982 3.007 2.943 2.416 1.473 2.166 1.631 0.829 2.946 4.039 2.721 3.186 3.465 3.503 1.405 2.121 2.698 1.786 1.180 1.587 2.244 2.876 2.254 0.969 1.289 0.860 0.460 0.913 1.942 1.110 -0.659 + 2.670 2.028 1.873 1.365 1.426 0.615 0.327 1.355 1.418 1.812 1.106 0.718 0.297 2.274 3.346 3.242 2.877 3.055 2.270 2.187 1.945 1.678 1.190 1.240 1.989 2.454 2.175 1.832 2.198 1.927 1.121 0.649 1.203 1.380 0.641 -0.262 + 4.454 5.535 5.033 3.215 3.166 5.286 4.948 2.057 2.418 2.795 1.902 -0.207 0.522 2.767 2.452 2.071 1.680 2.359 1.590 2.150 2.882 2.815 1.927 1.487 2.292 2.005 1.208 1.591 2.062 1.974 0.634 0.947 1.181 1.156 1.314 1.042 + 2.359 5.333 5.169 4.388 4.051 5.537 5.676 3.937 2.181 2.385 1.256 0.687 0.369 2.660 3.023 3.405 3.009 2.768 2.037 1.734 1.764 1.926 0.608 1.080 1.033 0.399 1.305 1.119 1.017 1.397 -0.002 1.001 1.348 1.423 1.344 0.886 + 3.456 4.839 5.749 4.160 4.505 4.500 4.586 4.815 3.757 4.239 3.944 4.424 3.794 4.316 4.766 5.049 4.985 6.164 6.956 7.266 6.310 5.727 5.064 4.766 4.487 4.357 4.154 6.011 6.393 6.318 6.147 5.819 5.642 5.308 5.173 4.409 + 5.698 5.095 6.147 6.661 6.051 5.981 6.946 7.001 6.802 6.722 6.165 6.899 6.379 5.579 5.615 5.726 6.251 8.624 9.951 10.668 8.877 8.032 7.401 7.209 6.760 6.193 6.444 9.039 9.209 8.878 8.516 7.991 7.813 7.529 7.358 6.568 + 1.643 1.872 1.672 2.482 2.185 3.061 2.980 1.956 1.875 2.601 2.185 3.630 2.265 4.199 4.994 4.333 4.259 5.048 7.152 8.720 6.567 5.004 4.971 5.071 3.589 3.861 4.190 6.081 6.454 5.982 5.975 3.529 3.651 3.324 2.958 1.552 + 0.172 0.848 -0.039 0.453 2.414 2.278 1.345 0.763 0.456 1.621 1.366 0.473 1.929 3.701 3.564 2.208 2.043 2.229 2.083 5.030 4.595 2.623 2.446 3.058 1.611 1.525 1.659 2.828 2.788 1.719 2.034 1.441 2.537 2.741 1.589 1.046 + 1.122 2.589 2.384 1.362 1.411 1.770 2.242 1.278 1.890 1.914 2.599 2.606 2.703 4.307 3.794 3.546 2.790 3.450 3.190 2.659 3.160 3.103 3.436 3.490 2.313 2.205 2.612 3.001 2.522 2.567 3.404 3.530 2.741 2.668 2.827 1.710 + 2.263 3.260 2.798 1.922 2.929 3.116 4.592 5.689 4.458 4.631 5.439 5.894 5.817 6.135 7.236 6.341 3.709 5.462 5.227 6.874 8.334 7.568 6.234 6.950 6.427 5.696 7.078 7.313 5.917 6.067 6.674 6.594 5.384 5.524 5.802 4.915 + 1.467 1.633 1.588 3.504 3.811 4.121 4.268 6.583 7.913 7.284 6.883 7.478 8.101 7.961 8.083 7.496 6.931 8.426 9.180 10.933 11.977 10.926 8.460 8.125 8.057 8.223 8.539 8.729 8.283 6.679 7.610 7.889 7.568 5.638 5.824 5.594 + 5.573 5.148 4.060 4.903 6.351 7.667 7.152 6.625 8.838 9.040 8.278 8.430 8.935 10.817 10.759 10.086 9.606 10.298 11.015 11.183 12.498 12.710 11.013 9.676 9.413 9.615 9.700 10.868 8.831 8.171 8.856 9.191 9.102 9.892 8.886 7.212 + 7.928 8.051 7.934 7.254 7.539 9.013 7.838 8.690 9.786 10.910 11.561 11.308 11.227 11.700 12.111 10.747 11.634 12.164 12.232 13.296 13.510 12.606 12.476 12.185 11.829 10.437 9.818 11.122 10.183 8.616 9.082 9.010 10.957 11.654 10.307 9.404 + 10.751 9.979 11.728 11.209 12.120 11.973 12.785 12.910 13.600 13.537 14.287 14.015 14.281 13.942 13.603 13.552 13.517 12.931 13.933 14.789 13.246 13.042 12.670 13.365 12.885 11.668 10.647 10.179 9.126 8.375 9.813 9.446 11.870 12.821 10.172 9.319 + 11.477 12.981 13.035 12.379 12.909 13.825 14.191 14.965 15.787 16.510 16.037 15.790 15.597 15.214 15.358 15.091 15.167 15.928 16.491 16.426 15.004 13.980 14.139 14.262 13.223 12.017 11.477 10.473 10.105 10.636 11.057 9.821 10.781 11.198 9.074 7.442 + 11.641 13.427 13.121 12.126 11.740 13.700 13.678 14.685 16.156 17.515 17.521 16.936 16.434 15.763 15.862 16.043 16.714 17.755 18.314 17.553 16.449 16.093 16.655 16.745 15.352 13.771 13.335 12.175 12.100 12.972 12.762 10.850 11.661 10.892 9.318 8.308 + 10.699 13.264 12.640 11.224 11.687 13.778 13.338 14.061 16.479 17.373 17.442 17.168 16.786 15.694 16.092 15.983 16.861 18.022 18.479 17.227 16.144 16.071 16.505 16.533 14.931 13.164 12.963 12.652 11.661 12.480 12.541 11.147 10.317 10.091 9.297 8.828 + 11.504 13.538 12.781 11.949 11.728 14.012 13.424 14.682 16.532 17.392 17.659 17.281 16.965 15.996 15.822 16.231 17.289 18.497 18.069 17.123 16.286 16.170 16.810 16.948 15.539 13.664 13.636 13.696 12.571 13.187 13.854 12.380 11.430 9.511 8.841 8.749 + 11.599 13.672 13.115 12.131 12.594 14.002 14.057 15.277 16.849 17.581 18.061 17.383 16.918 16.417 16.234 16.902 17.913 18.353 17.232 16.199 15.849 15.806 16.613 16.961 15.628 13.770 13.621 14.138 13.702 13.090 14.355 13.780 12.214 10.321 8.470 8.329 + 12.536 14.175 13.121 13.200 13.087 14.333 14.839 15.856 17.558 17.829 18.658 17.319 16.831 16.809 17.812 17.924 17.849 16.925 15.829 15.132 15.217 15.143 16.079 16.728 15.395 13.381 13.101 13.689 13.969 12.257 13.832 14.233 12.680 10.770 7.493 7.364 + 13.197 14.408 13.535 13.702 14.003 15.540 16.354 16.537 17.399 17.794 17.891 16.628 16.677 16.643 17.463 17.142 15.534 14.166 13.729 13.824 13.718 13.761 14.738 15.914 14.625 11.877 11.005 11.868 12.768 11.038 10.658 12.287 10.948 9.818 6.544 6.280 + 13.620 14.236 13.510 12.926 12.249 14.422 15.344 15.557 15.087 14.580 14.713 14.747 15.406 14.821 13.544 12.571 11.895 12.110 11.501 11.875 11.809 12.383 13.458 14.345 14.065 12.344 10.639 9.894 9.417 7.994 8.260 10.266 9.697 8.396 6.575 5.773 + 13.847 14.663 12.878 12.684 12.113 12.149 10.322 9.415 10.752 10.702 12.407 13.486 13.844 11.434 10.718 10.964 10.683 11.595 10.465 10.705 11.055 11.393 12.599 13.860 13.894 12.444 10.157 8.948 7.744 6.205 8.059 10.307 11.095 10.104 8.201 5.403 + 13.926 14.240 12.658 12.524 12.054 11.436 10.601 10.207 10.328 10.149 12.652 13.481 13.321 10.938 10.501 10.350 11.029 11.044 10.648 10.999 11.205 11.175 12.200 13.741 13.967 12.854 10.262 8.849 7.206 6.871 8.697 9.651 9.800 10.177 8.500 6.074 + 13.881 14.004 12.701 12.514 12.185 11.540 10.570 8.680 9.341 10.311 12.502 13.956 13.317 11.310 9.948 10.531 11.252 10.871 11.273 11.055 11.027 11.207 12.200 13.781 13.959 12.540 10.293 8.810 7.430 8.929 9.626 9.808 10.990 10.510 8.705 6.222 + 13.814 13.889 12.810 12.631 12.314 11.451 10.392 8.346 8.687 9.627 12.334 14.035 13.387 11.498 9.623 9.918 10.760 10.774 10.939 10.831 10.854 11.245 12.487 13.950 13.849 11.899 9.641 8.274 6.720 8.935 9.145 9.436 11.123 10.293 8.404 5.067 + 13.729 13.796 12.910 12.743 12.359 11.424 10.029 9.127 10.001 10.969 12.327 13.667 13.043 11.670 9.111 10.361 10.055 10.340 10.647 10.945 10.951 11.038 12.277 13.645 13.176 10.740 8.685 7.020 7.067 9.350 8.926 9.014 9.856 9.016 5.968 4.277 + 13.503 13.815 12.797 13.603 13.186 14.419 15.097 14.926 13.593 12.455 12.459 13.585 14.323 14.612 13.718 10.874 11.082 11.887 11.762 11.769 11.298 11.235 12.260 13.225 12.076 9.544 8.083 8.556 8.849 10.722 10.778 9.824 10.068 9.286 7.819 6.752 + 13.323 13.171 12.812 13.059 14.063 15.173 16.548 16.638 17.033 15.780 14.561 15.084 15.619 16.454 16.689 16.286 15.322 13.339 13.350 12.846 13.045 12.769 13.572 14.226 12.972 10.991 10.854 9.924 9.649 12.064 12.436 11.400 10.812 9.721 7.417 6.688 + 11.889 12.055 13.356 13.206 13.727 14.911 15.852 17.637 17.899 17.460 14.987 15.306 15.133 15.456 17.200 17.963 17.335 14.967 14.480 13.778 13.888 13.598 14.800 15.442 13.942 12.462 12.632 11.678 10.747 12.915 13.235 11.828 11.194 9.305 7.634 6.500 + 12.813 12.540 12.712 12.985 13.866 14.657 16.170 17.451 17.772 17.047 14.816 14.760 14.230 14.514 15.487 17.211 18.396 16.793 15.412 14.164 13.750 13.779 15.207 16.077 13.951 13.052 13.279 11.997 10.569 12.326 12.452 11.472 10.827 10.141 10.213 8.491 + 13.574 13.270 11.813 13.162 13.930 14.750 16.698 17.240 16.744 15.355 14.124 13.345 13.176 13.377 13.890 14.661 16.386 17.304 16.420 14.250 13.000 12.877 13.915 15.550 14.013 12.511 12.559 11.042 8.901 8.762 10.694 12.037 11.387 11.502 12.520 9.147 + 12.902 12.714 11.758 12.962 13.219 13.389 14.734 13.954 13.158 13.181 11.661 10.081 9.971 8.899 9.614 9.722 11.353 13.492 13.838 13.489 13.060 12.165 13.014 12.766 12.113 13.472 11.529 10.421 11.122 10.676 9.846 10.756 9.907 11.216 11.089 9.142 + 9.883 9.826 8.031 8.701 7.743 8.923 11.023 11.045 10.400 9.659 7.704 8.552 6.943 7.364 7.747 8.878 9.412 9.144 10.252 9.577 9.322 7.625 8.389 9.213 9.406 10.894 9.075 9.033 9.881 9.347 8.357 9.211 8.549 7.975 7.886 6.045 + 7.774 6.131 7.510 7.310 7.224 7.488 8.917 9.258 10.927 9.851 9.304 9.145 7.536 5.470 7.900 8.859 9.628 9.665 8.096 6.322 7.755 8.160 8.068 8.362 8.621 9.054 7.631 5.555 5.959 6.545 4.482 4.707 5.546 5.417 6.123 4.962 + 6.490 6.150 6.652 5.814 5.339 6.187 7.683 8.950 10.383 11.734 10.393 7.367 6.956 7.418 7.351 8.521 10.195 10.405 7.351 8.026 7.693 8.132 9.177 9.097 9.882 9.462 9.123 8.682 7.861 7.857 6.452 6.823 7.548 7.707 7.516 6.888 + 6.142 6.297 6.164 5.522 5.335 6.305 8.839 8.937 9.377 10.329 9.773 7.579 6.370 6.298 7.152 7.765 8.665 8.114 6.813 7.288 6.792 5.275 6.805 7.661 9.180 8.599 6.232 6.233 6.612 6.149 5.276 5.887 6.878 6.514 6.365 6.411 + 6.863 6.709 7.049 7.339 8.678 9.218 9.081 8.879 9.986 10.535 10.724 10.842 10.165 8.654 9.765 10.480 10.461 9.710 9.861 9.827 10.758 11.366 10.836 11.738 13.099 13.468 15.151 15.287 14.884 14.879 12.712 12.143 11.752 11.874 11.091 10.476 + 5.939 5.749 7.218 8.166 8.350 9.063 9.622 9.513 9.517 10.033 10.524 10.606 9.833 9.004 9.932 9.890 9.604 9.002 9.415 10.175 10.998 11.257 12.270 13.539 13.913 14.498 15.920 15.493 15.835 15.310 13.889 13.789 12.884 13.472 12.731 12.751 + 6.875 6.885 7.185 6.843 7.656 6.810 7.232 8.184 8.312 7.989 7.871 8.387 7.257 7.835 8.577 8.631 9.397 10.131 11.560 11.225 11.808 12.088 14.156 15.701 15.077 15.377 15.488 14.771 15.262 15.888 15.319 15.063 15.084 15.118 15.410 14.776 + 8.798 6.799 7.643 8.249 10.612 11.353 10.834 10.325 10.216 10.658 11.488 10.969 10.568 11.204 11.528 11.315 12.539 12.472 13.468 14.417 14.761 13.553 14.219 14.915 15.093 15.475 14.456 14.379 14.956 15.518 15.188 14.774 15.137 15.024 15.741 14.302 + 10.455 11.104 10.805 10.794 10.905 11.642 10.102 8.973 9.694 8.497 10.105 9.470 9.733 10.352 10.695 11.331 12.181 13.896 13.783 14.167 13.890 13.898 14.481 13.369 14.290 13.565 12.996 13.355 14.291 15.247 13.368 13.577 13.621 13.622 12.908 12.532 + 15.225 13.805 13.977 14.689 13.651 12.036 9.866 8.194 9.522 10.371 10.228 10.703 11.292 10.909 12.846 13.200 13.108 13.837 14.188 12.960 11.671 12.371 11.603 10.211 10.266 10.910 10.706 10.829 10.292 11.212 9.936 10.661 11.195 11.786 11.449 11.414 + 14.736 13.963 13.905 13.373 13.322 13.305 13.041 12.668 12.532 12.401 10.716 11.006 11.132 11.497 13.717 13.907 12.836 13.198 12.428 11.837 12.203 11.533 11.065 10.441 9.415 9.347 9.937 10.070 9.890 9.646 8.953 9.893 9.919 11.380 10.252 9.447 + 17.073 16.506 15.609 14.885 14.350 12.990 13.263 13.544 12.396 12.035 11.956 11.098 11.959 11.181 13.246 13.596 12.009 12.107 12.189 10.918 10.762 10.249 11.309 11.278 9.112 9.315 8.781 9.815 9.116 9.105 9.006 8.623 8.418 9.931 9.615 7.906 + 16.623 17.042 15.511 14.802 14.453 13.494 13.410 13.129 12.071 11.256 11.503 11.127 11.270 11.475 13.011 12.445 12.003 11.361 11.443 11.357 10.279 10.103 9.414 10.012 9.991 10.189 10.089 9.617 8.704 8.871 8.834 8.817 8.230 8.792 8.276 6.738 + 17.805 17.007 14.341 15.164 14.407 13.854 14.089 13.715 11.435 12.241 12.900 12.144 11.381 10.845 11.421 11.964 11.596 11.936 11.827 10.169 10.386 9.981 9.225 9.439 9.580 9.775 10.305 10.270 8.805 9.172 9.031 8.879 8.656 7.516 7.918 6.988 + 15.768 15.300 14.920 15.237 14.551 12.449 12.653 12.133 10.962 11.174 11.194 11.248 11.432 10.957 11.478 10.919 10.703 9.913 9.314 9.661 9.835 9.420 8.764 8.754 8.084 9.083 9.574 8.943 7.880 8.562 8.819 8.612 7.843 7.478 7.447 6.017 + 13.712 13.012 12.353 12.453 10.913 11.484 10.589 8.741 8.876 9.004 10.236 11.631 13.128 11.538 10.303 10.977 9.613 9.424 9.191 10.513 10.796 10.166 8.553 8.618 8.455 9.141 8.959 9.088 8.962 8.481 8.700 8.152 7.284 8.217 7.931 6.822 + 13.432 11.879 10.105 11.624 11.761 9.724 9.948 9.508 9.448 8.466 9.706 11.804 14.094 13.551 11.927 10.765 10.562 9.697 10.302 10.838 10.935 10.614 10.120 9.600 8.670 9.342 8.658 9.479 9.322 8.076 8.668 8.185 7.723 8.031 7.862 7.271 + 10.717 7.976 9.021 9.941 10.489 9.120 8.910 8.008 7.459 7.756 8.645 10.898 12.367 14.779 14.122 11.036 9.973 10.754 9.512 8.840 8.722 8.868 9.346 9.968 8.841 7.908 8.844 9.342 8.381 8.213 8.940 8.149 6.707 6.775 7.649 6.839 + 10.287 8.503 9.174 10.648 11.500 11.444 10.598 9.102 8.196 7.997 8.537 7.464 9.772 11.769 11.132 9.710 8.882 8.582 8.364 9.029 8.264 7.226 7.414 8.821 8.551 7.974 8.522 7.819 7.793 7.159 7.074 6.198 6.461 6.812 7.013 5.491 + 6.841 6.381 6.707 6.556 9.405 10.151 8.051 6.634 7.372 6.354 5.609 5.691 7.334 8.214 8.982 9.905 8.643 5.635 7.039 6.478 6.559 5.557 6.793 6.850 5.532 6.103 5.972 5.795 6.051 6.438 5.786 5.460 5.646 6.558 6.429 5.237 + 5.920 5.370 6.210 6.897 6.932 7.203 6.485 6.353 6.337 4.753 5.602 6.721 6.578 6.827 7.362 7.777 7.637 7.225 6.099 5.379 6.707 6.496 8.367 6.912 5.651 4.858 5.419 5.374 5.157 5.928 5.628 5.530 5.326 5.765 6.877 5.361 + 5.217 3.321 5.045 5.724 6.612 7.016 5.667 5.689 4.763 5.357 5.280 5.647 6.375 6.925 5.765 7.499 7.476 8.191 8.730 6.501 7.630 7.007 7.994 8.310 7.605 6.785 7.989 7.178 7.059 7.547 6.313 4.623 5.191 5.337 5.576 4.498 + 5.470 4.927 5.317 4.496 6.706 8.203 8.148 7.918 6.414 6.354 5.553 6.694 6.789 6.688 6.484 7.662 7.909 9.217 10.206 8.675 9.216 8.849 8.960 9.348 8.308 7.363 8.926 8.539 8.231 9.153 7.051 5.765 5.276 4.774 6.634 6.241 + 5.570 5.283 5.179 3.713 6.596 8.281 8.506 9.151 8.498 7.878 7.741 7.515 7.480 8.431 8.496 7.951 8.654 8.584 10.167 9.970 9.519 10.117 9.825 9.765 10.368 9.047 10.255 10.567 9.756 9.382 9.752 7.903 5.958 6.204 7.696 8.342 + 5.725 6.945 6.000 5.120 7.137 7.154 9.085 9.539 9.078 9.755 10.150 10.298 10.048 10.347 8.550 8.961 10.121 11.178 11.882 11.940 11.771 10.809 10.563 9.871 10.202 9.301 10.726 10.966 10.432 9.578 10.420 8.394 6.991 7.747 8.850 9.100 + 8.742 9.243 9.214 9.059 8.802 10.066 11.034 11.551 11.547 10.804 10.250 10.927 11.299 9.204 9.751 10.608 11.626 12.251 11.420 13.541 13.696 10.521 10.541 10.318 10.493 10.557 10.463 10.429 9.786 10.325 11.850 11.485 9.385 8.649 9.748 8.576 + 7.622 7.945 8.043 8.613 7.776 8.684 9.320 8.784 11.337 10.809 11.350 12.604 12.643 10.620 11.041 10.872 11.227 12.154 12.766 13.825 13.559 12.767 10.383 11.191 11.493 10.177 11.544 11.551 10.593 10.162 12.045 12.514 10.958 9.555 10.456 9.544 + 9.047 8.958 8.174 8.129 7.561 9.715 9.838 9.555 11.469 12.048 13.338 14.127 13.295 11.924 11.830 10.992 12.301 12.817 14.075 15.770 15.484 13.994 12.217 11.455 11.083 10.705 12.059 12.009 10.787 9.175 10.296 11.777 10.885 10.307 11.280 10.106 + 9.370 9.733 8.409 8.133 9.479 11.065 11.387 10.802 10.703 11.806 12.490 12.924 13.632 12.891 12.904 12.136 12.367 13.465 13.741 16.461 16.621 14.282 13.638 12.751 13.080 12.368 11.161 12.409 11.977 9.295 9.784 10.628 11.046 12.438 12.579 9.813 + 9.597 9.863 9.534 10.279 10.069 10.210 10.568 9.389 10.962 11.986 13.634 13.645 13.877 12.883 12.878 13.091 14.415 14.443 13.860 15.275 16.067 15.610 14.325 13.363 13.705 13.180 11.632 11.933 11.917 10.770 10.304 11.508 11.569 12.664 12.255 9.745 + 11.179 10.068 9.611 11.126 11.323 9.264 8.948 11.148 10.742 9.794 13.593 14.749 14.216 13.253 13.308 13.367 14.694 14.622 14.151 15.724 15.965 13.769 12.966 12.700 13.552 13.856 11.864 11.713 11.995 11.592 10.763 11.471 12.929 12.778 11.841 10.110 + 11.344 12.225 12.654 11.684 13.082 12.533 12.904 12.934 14.341 14.243 14.547 15.460 15.058 13.661 14.268 13.756 14.720 15.222 16.069 16.282 14.552 13.708 13.706 13.071 13.371 13.548 11.191 10.558 12.174 12.435 11.118 11.169 13.358 14.016 10.381 9.085 + 11.579 12.993 13.597 11.619 13.439 13.477 14.949 14.562 16.289 16.599 17.496 17.203 16.573 16.229 16.035 15.836 16.157 16.788 17.358 17.613 16.149 15.494 15.215 14.283 12.884 13.313 11.989 11.134 11.617 12.397 11.450 10.376 13.444 13.235 10.805 8.467 + 11.349 13.023 13.603 11.723 13.012 13.106 14.933 14.592 16.815 17.745 18.359 17.175 16.515 16.858 16.613 16.760 17.346 18.244 18.819 18.357 17.138 16.831 17.040 15.940 13.333 14.196 13.213 12.048 13.472 13.701 13.055 11.893 13.779 13.061 9.618 8.538 + 10.694 13.125 13.381 11.950 13.084 13.631 14.730 15.374 16.512 18.489 18.246 17.792 16.567 16.357 16.302 16.341 17.305 18.380 19.073 17.694 16.265 16.585 17.078 16.303 13.543 13.874 13.395 12.114 12.690 13.629 13.777 12.375 12.507 11.930 9.814 9.300 + 11.610 13.715 13.401 13.030 13.411 14.460 14.853 16.120 16.947 18.662 17.757 17.763 16.171 15.829 15.926 16.450 17.592 18.500 18.597 17.091 16.205 16.831 17.760 16.516 13.676 13.553 13.648 12.800 12.757 13.975 14.948 14.146 14.266 13.379 9.073 9.573 + 11.508 13.930 13.703 13.326 13.647 14.807 15.135 17.055 17.794 19.006 17.353 17.252 16.286 16.149 16.509 17.457 18.727 18.729 17.034 16.419 15.709 16.586 17.463 16.261 13.322 12.783 13.086 12.536 12.492 13.166 14.286 14.423 14.526 13.898 10.377 9.459 + 11.414 14.256 14.055 13.905 14.400 15.016 15.983 18.215 18.301 19.131 16.942 16.406 15.212 16.570 17.412 18.218 18.136 17.860 15.506 15.326 14.988 15.457 16.520 15.900 13.735 12.504 11.955 11.506 11.289 11.661 12.306 13.838 14.204 13.075 10.328 7.597 + 11.752 14.648 14.282 14.700 14.926 15.812 17.117 19.086 18.264 18.262 17.692 17.363 16.923 16.078 18.345 17.509 16.275 15.271 14.088 13.481 13.694 13.766 15.121 15.003 13.301 11.534 10.921 10.205 10.304 11.164 12.900 14.070 14.713 13.497 11.613 8.282 + 11.960 14.753 14.649 15.052 15.567 17.371 18.005 18.976 17.655 15.531 16.737 17.063 17.504 17.215 17.704 16.366 13.554 13.029 12.896 12.151 11.942 12.034 13.528 14.044 12.495 11.572 11.303 10.263 9.847 10.704 12.924 13.185 13.948 14.149 12.816 8.252 + 11.641 14.815 14.780 15.537 16.320 18.145 17.774 17.040 16.767 15.400 14.452 15.786 17.285 16.873 15.189 13.565 12.125 12.118 12.037 11.008 10.876 10.627 11.728 11.543 12.154 12.358 11.408 10.340 10.184 10.984 13.579 13.195 14.057 15.035 14.118 6.339 + 11.437 14.822 14.721 16.235 16.696 17.776 17.403 14.758 15.242 13.919 14.569 15.620 17.315 15.616 12.675 12.338 12.228 10.583 10.053 9.928 9.961 10.392 10.323 10.254 11.969 12.200 10.499 9.689 9.805 10.529 13.012 12.708 13.913 15.694 14.751 7.186 + 11.378 14.569 14.595 16.600 16.918 16.255 16.176 15.010 14.935 14.669 13.602 14.965 16.082 14.690 12.641 11.568 10.947 11.319 10.150 9.203 9.208 9.742 9.634 10.345 11.562 11.544 9.428 8.681 8.671 9.521 12.062 12.362 13.393 15.175 14.061 7.477 + 11.599 14.191 14.210 16.589 16.764 14.440 14.499 14.063 14.040 14.257 13.157 13.422 14.655 14.796 13.032 11.331 10.160 10.648 9.867 9.600 8.220 8.721 9.319 9.961 10.451 10.486 7.708 6.797 6.705 7.536 10.716 11.212 11.663 13.196 12.259 7.278 + 11.444 13.829 13.984 16.676 16.492 13.371 13.115 12.868 12.659 13.183 12.085 11.917 14.266 14.888 14.222 11.917 10.870 10.422 9.521 9.265 8.974 8.875 9.629 10.627 9.554 8.199 6.544 4.768 4.669 5.062 7.163 9.227 9.653 10.801 10.507 6.382 + 11.490 13.301 13.937 16.519 15.898 13.372 12.114 12.127 12.011 11.597 11.074 10.771 11.060 13.487 13.572 13.298 13.107 12.034 11.577 10.443 10.466 10.375 11.253 12.501 11.478 7.364 6.418 5.497 5.687 5.551 6.477 8.837 7.752 9.852 10.202 7.737 + 11.733 12.343 14.421 15.703 15.035 13.213 12.366 12.014 12.151 12.116 10.245 9.787 9.458 10.304 11.512 12.429 12.524 13.822 14.030 12.682 11.868 12.496 13.016 14.425 12.654 9.076 7.616 7.313 7.071 6.957 8.117 9.981 8.459 9.223 9.250 7.260 + 10.889 12.454 13.883 14.190 13.734 13.040 12.078 11.383 10.880 11.006 10.315 9.609 9.771 10.126 10.196 10.730 10.982 11.056 11.879 13.169 13.657 14.529 14.483 15.453 13.920 10.503 9.362 9.070 8.149 8.434 9.546 10.229 8.534 11.250 10.697 7.827 + 10.468 12.419 13.716 14.332 12.851 11.904 10.717 9.342 9.517 10.253 9.671 8.849 8.166 9.532 9.774 9.956 9.838 9.823 10.612 10.869 11.049 13.012 14.727 14.598 14.235 13.609 12.869 11.668 10.605 10.220 11.454 11.458 9.679 13.134 12.250 7.918 + 10.755 12.628 12.744 13.879 12.848 11.963 10.916 9.292 10.296 10.584 9.539 8.089 9.081 8.401 8.596 8.911 9.034 9.993 9.332 9.262 10.378 11.210 13.931 13.768 11.848 11.742 11.698 11.168 11.763 11.102 11.698 12.871 11.385 13.218 13.127 8.795 + 12.147 12.982 14.038 14.694 12.840 11.633 10.528 9.646 9.793 10.894 8.684 8.299 8.385 8.723 8.987 9.182 9.602 9.428 9.573 9.663 10.143 11.487 13.373 13.248 11.021 10.567 11.029 11.063 11.916 12.073 12.605 13.718 12.710 14.370 13.662 10.393 + 11.906 14.588 14.261 14.156 13.838 11.962 11.225 11.177 10.861 10.994 9.619 9.357 9.791 9.276 8.795 9.630 9.920 9.954 10.234 10.159 10.912 11.659 14.300 13.908 12.130 12.043 12.337 12.543 14.238 14.564 14.841 15.849 15.238 15.488 14.202 10.258 + 12.090 15.003 14.849 13.410 13.789 12.403 12.258 11.822 11.388 10.450 9.247 9.215 9.187 8.889 9.814 10.294 10.650 11.197 11.613 11.844 12.177 12.970 15.014 15.204 13.400 13.205 13.537 13.572 15.101 15.990 16.064 17.196 16.865 16.392 15.382 11.353 + 12.114 15.230 15.119 13.761 13.702 12.688 12.430 11.575 11.093 10.224 10.263 10.184 9.243 9.741 10.056 9.940 10.329 10.517 10.499 11.375 11.841 13.405 15.706 16.055 13.242 13.067 13.451 13.789 15.576 16.388 16.488 17.808 17.551 16.614 15.679 11.497 + 12.693 15.504 15.239 14.102 13.791 13.240 12.765 11.339 10.683 11.049 10.720 10.466 9.512 11.001 10.229 10.368 10.425 10.555 11.177 11.373 12.070 13.340 15.820 16.070 13.754 13.024 13.286 13.796 15.647 16.524 16.669 18.015 17.602 15.955 14.860 11.118 + 12.796 15.494 15.106 14.215 13.789 13.736 13.082 11.550 11.380 11.937 11.154 10.715 9.908 10.977 9.996 10.580 10.382 11.272 11.401 11.932 12.411 13.154 15.019 15.703 13.891 12.977 13.126 13.913 15.636 16.183 16.331 17.966 17.449 14.792 13.613 11.283 + 12.670 15.368 14.928 14.321 14.022 14.139 13.626 11.833 11.632 12.206 10.847 10.611 9.757 10.513 10.448 10.822 10.953 11.585 11.322 12.160 12.151 13.457 15.525 15.650 13.715 12.726 12.970 13.903 15.439 15.215 15.430 17.001 16.289 13.218 11.927 10.676 + 12.283 15.163 14.866 14.533 14.641 14.243 14.189 12.026 11.492 12.167 10.094 10.468 11.152 10.986 11.255 10.964 11.592 11.843 11.643 11.842 12.180 13.569 15.818 16.108 14.178 12.435 13.175 14.355 15.293 14.813 15.499 17.380 16.454 13.421 11.603 10.031 + 11.706 14.855 14.671 14.785 15.233 14.099 14.252 11.994 11.280 11.676 9.941 10.365 11.573 11.449 11.146 11.031 11.488 11.764 11.808 12.171 12.533 13.660 15.931 15.661 13.767 12.371 13.881 14.636 13.486 13.174 14.624 16.982 15.832 12.955 10.941 10.350 + 11.669 14.667 14.454 15.031 15.861 14.173 14.406 12.023 10.813 11.151 9.998 10.207 11.366 10.918 11.119 11.118 11.421 11.752 12.239 12.308 12.729 14.267 16.282 15.770 13.310 13.915 14.985 14.612 12.761 12.423 13.856 16.239 14.582 12.521 11.891 12.099 + 11.530 14.316 14.172 15.239 16.141 13.988 13.798 12.230 10.410 11.144 10.748 11.947 12.964 12.805 12.199 11.526 11.339 11.077 11.755 12.237 12.872 15.319 16.409 14.984 12.479 13.611 16.029 15.643 13.934 12.120 13.794 16.355 14.567 13.616 12.842 11.677 + 11.916 13.908 13.692 15.287 16.032 14.271 13.328 12.674 12.078 11.944 11.613 11.612 11.749 12.152 11.928 12.380 12.399 12.302 12.226 12.267 14.118 16.078 15.788 13.907 12.515 13.806 15.045 14.024 12.647 12.181 13.312 16.049 14.062 14.111 14.650 13.336 + 10.171 12.724 12.313 14.193 14.930 13.560 14.342 12.133 11.925 12.413 11.810 11.728 10.860 12.002 11.583 11.320 11.673 12.461 13.235 13.505 14.920 16.198 13.809 12.932 11.792 14.907 15.934 13.761 11.895 11.026 12.312 14.096 13.077 13.476 14.349 13.738 + 9.540 12.581 12.454 14.397 14.952 13.978 14.045 11.330 12.202 12.408 12.185 11.726 11.092 11.945 11.940 11.823 11.827 11.756 12.765 13.278 15.082 15.663 13.514 12.203 11.448 13.626 14.711 12.669 11.645 11.248 12.725 14.332 13.299 14.047 14.527 14.954 + 9.269 12.420 12.243 14.383 14.995 14.106 14.284 11.215 9.932 12.415 12.458 12.874 11.308 11.456 11.923 11.486 11.320 12.120 12.688 12.636 14.820 15.034 13.209 11.765 11.697 13.056 14.239 13.010 12.319 12.032 14.244 16.123 14.223 15.127 15.612 15.809 + 9.989 12.967 12.821 14.539 15.123 13.920 13.645 11.295 12.699 12.921 11.770 11.952 12.335 11.932 11.206 11.166 11.579 11.959 12.887 13.454 14.536 15.020 14.073 12.374 11.512 13.290 14.597 13.629 12.247 11.659 13.332 15.191 13.963 14.191 16.228 16.192 + 10.083 13.318 13.338 15.147 15.404 13.097 13.257 12.459 11.924 11.434 11.598 12.183 11.714 11.718 12.004 11.751 11.618 12.339 12.479 13.556 14.592 15.129 14.164 12.798 11.978 12.793 14.074 13.742 12.504 12.801 13.664 15.957 14.450 14.863 14.955 14.570 + 11.718 13.962 13.525 15.421 15.433 12.255 12.724 12.486 11.520 11.440 11.354 10.494 11.625 11.940 11.534 10.943 11.027 11.773 12.282 13.072 14.514 15.831 15.308 14.046 13.145 14.165 15.198 14.276 13.247 13.281 14.160 16.235 14.002 14.310 15.473 14.424 + 11.727 14.440 14.022 15.479 15.511 13.640 12.725 11.249 12.025 12.290 10.951 11.283 11.243 11.450 11.490 11.236 11.080 11.825 12.542 13.035 13.753 15.947 15.853 13.931 13.023 13.152 14.608 13.737 13.908 14.354 15.179 14.791 13.052 14.679 13.960 12.667 + 12.716 14.895 14.215 15.508 15.296 13.649 12.580 11.507 11.635 11.923 11.646 10.571 9.820 11.011 9.902 10.780 10.618 10.997 11.396 11.917 13.557 15.852 16.665 15.263 13.963 14.380 14.859 13.701 13.643 14.461 16.009 15.720 13.551 14.142 13.486 12.263 + 13.248 15.048 14.192 15.507 14.849 13.331 11.897 11.415 11.109 11.099 11.552 10.153 10.157 10.719 9.936 10.264 10.580 10.931 11.629 12.184 13.217 15.405 16.505 16.019 14.826 15.226 15.623 13.922 13.893 14.973 16.472 15.494 13.958 13.982 12.737 8.230 + 13.461 14.881 13.996 15.367 14.264 13.218 11.559 11.125 10.540 10.587 11.039 9.406 10.005 10.175 10.165 10.406 10.567 11.286 11.501 12.340 13.302 15.078 16.146 15.995 15.131 15.371 14.658 13.492 13.435 14.760 16.552 15.533 14.227 14.420 13.615 8.711 + 13.535 14.552 13.733 14.885 13.453 12.799 11.639 11.167 10.438 10.850 10.793 9.243 10.128 10.120 9.863 10.728 10.149 11.494 11.588 12.587 13.419 14.900 15.593 15.739 15.125 14.007 13.099 12.169 12.183 13.520 15.589 14.935 14.037 14.469 13.870 8.910 + 13.681 14.397 13.752 14.556 12.948 12.365 11.740 10.957 10.409 11.008 10.286 9.276 10.015 10.065 9.749 10.656 10.101 11.814 11.827 13.577 13.889 14.771 14.985 15.255 14.441 13.122 11.622 10.897 11.106 12.490 14.612 14.120 13.446 13.893 13.573 8.257 + 13.620 14.185 13.556 14.110 12.693 12.169 11.730 10.533 10.287 10.873 9.610 9.104 9.789 9.848 9.859 10.597 10.714 11.981 12.345 13.984 13.509 13.352 13.996 14.679 13.171 11.214 10.215 9.776 10.190 11.763 14.571 14.145 13.254 13.241 13.420 8.615 + 13.384 13.630 13.290 13.501 12.524 11.955 11.386 9.871 9.683 10.331 8.223 9.706 9.757 9.621 10.188 10.283 11.316 11.484 12.672 12.827 11.540 11.424 12.474 13.869 11.730 9.410 8.457 8.165 8.758 10.606 13.609 13.238 12.480 12.302 12.402 7.792 + 13.269 13.355 12.981 12.868 12.603 11.851 11.291 9.267 9.052 9.468 8.146 10.209 9.794 9.477 9.912 10.132 11.893 11.147 11.954 10.481 9.958 10.010 11.410 13.682 11.630 9.086 7.951 7.639 7.872 9.536 12.762 12.755 12.143 11.898 11.687 7.489 + 12.950 13.043 12.606 12.614 12.427 11.615 11.163 8.909 9.216 9.524 8.109 9.944 9.376 9.723 10.169 10.605 13.016 11.863 11.176 9.568 9.508 9.365 11.110 12.973 10.695 8.584 7.977 7.246 7.773 8.923 12.350 12.644 12.282 11.509 10.669 7.619 + 12.861 12.899 12.671 12.824 12.410 11.419 11.191 9.074 9.605 9.962 7.377 9.667 9.389 9.376 10.469 10.655 13.018 11.434 10.370 9.529 9.313 9.249 10.850 11.939 10.409 8.493 8.033 7.177 7.991 9.201 12.548 12.974 12.652 11.745 10.649 8.264 + 12.776 12.883 12.815 13.190 12.603 11.459 11.189 9.261 9.732 10.006 7.765 9.618 9.532 9.594 10.480 10.572 13.070 12.133 10.966 10.042 10.089 10.011 11.618 12.771 10.836 9.157 8.485 7.013 8.056 9.645 12.990 13.433 13.332 12.791 9.932 7.736 + 12.829 12.888 13.155 13.489 12.698 11.498 11.491 9.507 9.944 10.099 8.379 9.018 9.417 9.382 10.473 10.252 12.328 12.885 12.077 10.997 10.594 10.363 11.856 13.019 11.495 9.342 9.308 7.252 7.989 9.720 12.830 13.212 13.718 13.227 9.594 7.760 + 12.882 12.905 13.500 13.640 12.709 11.598 11.655 9.575 9.968 9.925 9.096 8.584 9.353 8.968 10.283 10.295 11.486 13.032 12.873 12.483 11.225 11.053 12.348 13.798 12.646 10.092 10.078 8.009 8.360 9.866 12.707 12.856 13.186 12.713 8.426 7.906 + 12.738 12.848 13.844 13.765 12.715 11.700 11.537 9.144 9.993 9.878 9.350 8.191 9.097 8.486 9.665 9.977 10.878 12.083 13.567 13.645 11.999 11.677 12.770 13.753 12.534 10.012 10.062 9.023 7.927 9.301 11.285 11.365 12.383 11.828 8.520 8.090 + 12.708 12.876 13.822 13.255 12.424 11.718 11.215 8.782 9.789 9.571 9.044 7.570 8.745 8.022 9.240 9.598 10.625 11.495 13.174 14.255 12.519 11.715 13.379 14.897 12.642 9.904 9.875 8.883 8.485 9.076 11.920 11.950 12.774 12.535 9.604 8.778 + 12.622 12.884 13.661 12.792 12.235 11.675 10.964 8.644 9.699 9.465 8.888 8.038 8.648 7.919 8.743 9.066 9.929 10.525 11.957 13.500 12.552 12.089 13.719 15.077 12.486 10.045 9.188 7.820 8.726 10.303 12.739 12.251 13.172 12.713 9.019 8.600 + 12.484 12.533 13.175 12.102 11.881 11.263 10.462 8.006 9.300 9.182 8.620 7.661 7.859 7.453 8.524 8.538 9.452 9.449 10.744 12.030 12.516 12.206 13.507 13.979 11.893 9.891 9.536 6.847 7.160 9.368 11.688 12.202 14.033 13.207 8.707 7.534 + 12.101 11.959 12.636 11.628 11.630 10.785 9.813 6.815 8.642 8.866 8.498 8.056 7.499 7.368 8.294 8.130 9.058 9.081 10.774 12.202 11.970 11.773 13.256 13.682 11.395 9.725 9.088 7.579 8.143 9.899 11.474 11.239 12.938 11.976 8.982 8.675 + 12.411 11.466 12.420 12.080 12.043 10.485 8.635 7.349 8.815 8.551 8.604 8.686 6.909 7.313 7.090 8.630 8.745 9.743 10.788 11.341 10.416 10.429 11.885 13.605 11.872 9.549 9.313 8.053 8.766 11.032 12.681 11.307 11.861 11.295 9.994 10.000 + 11.511 13.268 13.680 12.797 12.910 10.310 9.053 8.908 9.936 9.493 9.563 8.081 7.456 8.398 8.668 9.207 11.024 12.046 10.894 10.356 8.948 9.927 11.802 13.189 10.340 9.232 8.444 8.288 8.387 10.720 12.553 10.661 11.557 11.105 9.416 9.507 + 13.550 12.707 13.080 12.631 12.091 10.296 9.759 9.327 10.369 9.490 8.291 8.504 8.516 9.104 9.692 10.810 11.564 12.304 10.265 9.609 8.704 9.409 11.454 13.287 11.043 7.764 6.946 7.104 7.888 10.368 11.139 9.895 11.313 11.194 9.618 9.816 + 14.321 13.970 11.692 11.819 12.520 12.313 11.669 10.191 11.349 10.501 9.116 9.536 9.878 10.428 10.798 11.947 10.879 9.740 9.168 8.595 7.986 8.556 9.882 11.848 10.571 6.663 6.746 7.056 8.639 10.551 11.519 10.014 11.527 12.065 9.684 9.871 + 12.995 12.738 13.909 13.951 14.263 13.447 13.185 11.308 11.915 11.753 11.143 11.114 11.085 12.083 13.223 11.307 10.743 9.666 9.025 8.225 8.052 8.512 10.005 10.889 9.735 6.770 5.553 6.494 7.888 11.095 11.429 9.098 10.309 10.736 9.990 10.172 + 13.668 13.488 13.565 13.059 13.367 14.111 14.296 11.943 12.796 12.705 12.288 11.923 12.939 13.690 14.048 11.523 10.317 10.068 9.122 8.531 8.707 8.562 10.351 11.823 10.425 7.714 6.661 7.505 8.173 9.944 9.263 8.275 8.570 9.086 9.042 9.521 + 13.102 13.723 13.555 13.071 13.355 15.057 15.575 12.989 13.564 13.618 13.202 12.619 14.253 12.957 12.396 11.194 10.368 10.343 9.034 8.787 9.067 8.956 10.337 12.219 11.393 9.081 7.232 8.489 9.702 9.696 7.549 6.011 8.576 9.224 10.814 10.926 + 13.137 13.327 13.291 13.133 13.035 15.542 16.352 14.222 14.333 14.418 14.140 13.811 15.607 13.282 11.946 11.227 10.559 10.781 9.224 9.124 8.572 8.660 10.225 11.507 11.789 9.828 7.832 9.162 11.117 11.159 7.373 7.508 9.059 8.210 10.569 10.398 + 12.909 13.172 13.237 12.937 12.251 15.618 16.368 14.588 14.994 14.962 14.614 15.005 15.755 12.824 11.125 10.324 10.183 10.351 9.233 9.277 8.879 8.712 9.877 10.844 12.257 11.059 9.429 11.026 12.386 10.826 7.386 9.064 9.804 7.663 9.212 9.526 + 12.562 12.722 12.811 12.061 11.840 15.141 15.280 15.304 15.634 15.201 14.818 15.175 14.692 12.085 10.488 9.768 9.783 9.816 9.358 8.883 9.447 8.772 9.828 10.352 11.739 10.689 10.566 11.979 12.454 10.409 8.034 8.691 9.031 8.672 11.156 10.855 + 12.296 12.311 12.527 11.640 11.895 14.429 14.751 15.837 15.696 15.112 15.133 15.667 13.391 11.183 11.035 10.137 9.751 9.160 9.334 8.774 9.414 8.747 9.028 9.552 9.629 9.745 10.758 12.591 11.601 9.490 6.836 6.737 7.539 7.983 9.726 9.536 + 12.292 12.325 12.381 11.914 11.923 14.249 14.712 16.214 16.123 15.555 15.061 16.531 15.708 12.858 12.158 11.039 10.645 10.006 9.241 8.923 9.034 8.792 9.321 9.391 9.829 9.680 10.665 12.770 12.263 10.681 7.578 8.480 9.565 8.502 8.064 7.893 + 12.221 12.238 12.430 11.920 11.516 13.756 14.503 16.288 16.272 16.066 15.020 15.656 16.924 15.754 13.695 12.486 11.868 11.060 9.663 9.184 8.945 9.561 9.811 10.826 10.168 10.326 11.961 13.096 12.507 10.255 8.758 9.239 10.191 9.180 8.293 7.628 + 12.041 11.742 12.348 11.982 11.268 13.251 14.107 15.861 16.722 16.518 15.126 14.824 16.824 15.997 14.911 13.594 12.025 11.743 10.211 10.352 8.946 9.389 9.899 9.870 9.508 10.218 11.318 12.448 11.214 8.875 8.854 9.144 10.273 9.294 7.903 6.954 + 11.950 11.568 12.101 11.627 10.855 12.947 13.738 15.245 16.831 16.147 14.540 14.526 15.232 15.450 16.534 14.820 12.836 12.012 10.887 10.309 10.010 9.613 10.385 10.690 11.223 12.181 13.162 12.763 10.981 8.354 9.063 9.132 10.095 10.562 9.041 6.812 + 11.778 11.447 12.153 11.269 10.978 12.920 13.678 14.592 16.336 15.322 13.715 14.019 14.285 14.280 16.030 15.723 13.829 12.433 11.786 10.654 10.319 10.497 10.364 10.597 10.947 11.875 13.222 12.289 10.306 7.853 8.188 8.078 9.013 9.773 7.336 5.246 + 11.499 11.299 12.236 11.308 11.201 12.740 14.211 15.379 15.832 14.525 13.553 13.525 13.527 13.593 15.151 15.896 14.598 12.865 11.837 11.250 10.970 10.567 9.361 9.638 10.218 11.822 12.741 11.334 10.114 8.828 8.155 8.600 10.225 9.183 6.637 5.376 + 11.555 11.373 11.220 9.884 10.127 11.332 10.505 10.825 11.594 9.956 10.382 10.123 9.731 10.155 11.231 12.164 10.697 10.756 10.200 9.522 8.385 7.464 8.117 7.875 9.406 11.296 11.187 9.886 9.386 9.182 6.672 8.161 9.326 8.936 6.574 5.088 + 11.993 11.806 11.594 10.871 11.026 12.049 11.308 10.749 11.416 10.006 10.353 9.939 8.806 8.597 9.751 10.381 9.513 9.220 8.623 9.484 7.973 7.035 7.972 8.649 10.270 11.126 10.934 9.332 8.722 8.304 6.791 8.666 9.223 8.565 6.764 4.997 + 12.018 11.557 11.422 10.668 11.233 12.242 11.303 10.782 11.244 10.307 10.243 10.411 8.793 9.304 9.929 10.423 9.964 9.637 9.626 9.294 9.109 8.922 8.920 10.080 11.560 11.833 10.908 9.322 8.992 8.319 7.335 8.794 9.042 8.583 7.311 5.695 + 11.943 12.003 11.943 11.351 11.070 13.232 14.451 14.795 14.417 13.284 12.673 12.576 11.923 12.008 13.065 15.328 16.289 15.433 14.505 14.631 14.848 15.453 14.977 12.674 12.831 13.249 12.561 10.647 8.931 11.036 11.554 13.349 13.404 11.422 9.270 6.309 + 11.865 11.850 12.007 11.954 11.726 13.402 14.072 15.832 15.259 14.298 13.036 13.165 12.495 12.525 13.446 14.885 16.027 15.854 14.664 13.414 13.625 14.414 14.372 12.252 12.034 12.943 13.132 10.688 9.433 11.525 11.138 12.677 12.464 10.855 8.615 5.228 + 11.704 11.636 12.343 11.505 11.760 13.477 14.835 15.623 16.732 15.105 13.479 13.564 13.053 12.451 12.986 13.160 14.954 15.605 14.783 12.875 12.387 12.633 13.555 12.677 11.429 12.837 13.236 11.664 10.760 11.861 10.393 11.378 11.574 10.702 8.072 4.747 + 11.938 11.618 12.458 11.389 11.878 13.677 14.924 15.774 16.740 14.809 13.668 13.292 12.834 12.218 12.811 12.626 14.067 15.344 15.640 13.480 12.558 12.720 12.732 11.809 12.565 12.572 12.748 12.581 11.567 11.124 9.864 10.794 10.626 9.375 6.834 4.038 + 12.184 11.861 12.612 11.576 12.292 13.872 15.606 16.000 15.925 13.963 12.494 12.434 12.002 11.483 11.987 12.391 13.329 14.279 14.473 11.699 11.263 11.962 11.585 11.205 12.427 11.929 11.788 12.757 11.956 9.883 9.640 10.633 9.682 8.176 6.294 5.066 + 12.309 12.260 12.831 12.004 12.940 14.380 15.265 14.712 13.987 13.051 12.373 11.453 10.775 10.991 11.533 12.444 13.896 13.471 12.434 10.926 10.804 11.153 11.376 11.636 11.148 9.842 10.033 10.870 10.333 8.115 8.296 9.911 9.858 7.994 5.450 5.101 + 12.618 12.536 12.062 11.457 11.917 10.539 11.059 10.336 10.398 8.685 10.273 9.835 6.537 7.475 9.197 10.993 10.747 10.132 8.067 7.814 7.379 8.374 9.742 8.522 6.983 5.238 5.925 7.700 7.767 6.707 5.063 7.633 8.543 8.167 6.128 5.100 + 12.768 12.301 11.768 11.607 11.805 10.882 9.995 8.370 9.996 8.875 10.360 10.166 7.549 6.259 8.682 10.946 10.319 10.426 9.222 8.483 7.596 8.551 9.843 9.227 7.897 6.071 5.151 6.185 8.935 8.863 5.979 6.868 8.041 7.433 5.727 5.661 + 12.732 12.094 11.491 11.381 11.679 10.923 10.293 9.688 10.120 8.634 10.579 10.269 7.466 6.127 7.908 10.945 10.174 10.724 8.805 8.441 8.665 9.435 10.225 10.513 8.575 6.463 3.865 5.022 8.109 9.309 6.869 7.711 8.908 7.975 6.551 6.186 + 12.607 11.874 11.282 11.162 11.605 10.848 9.761 9.881 9.999 8.791 10.768 10.091 7.085 6.569 8.238 10.893 10.247 10.530 8.914 8.965 9.152 9.226 10.123 11.245 9.112 7.461 4.427 5.181 8.031 9.081 7.802 7.518 9.083 8.336 6.661 6.028 + 12.510 11.780 11.138 10.976 11.547 10.820 9.861 9.586 9.851 8.762 10.742 10.196 7.215 6.364 7.822 10.915 10.388 10.774 8.773 8.476 8.619 8.763 10.110 11.698 10.069 8.147 3.936 5.051 7.707 9.391 7.919 7.422 8.813 8.261 7.412 7.054 + 12.614 12.014 11.352 10.926 11.635 10.862 9.957 9.338 10.021 8.723 10.591 10.347 7.884 7.759 9.110 11.532 10.587 10.746 9.446 8.673 8.816 9.230 10.415 11.797 10.255 8.238 5.526 5.029 7.123 8.988 7.963 8.894 9.572 8.380 7.310 7.429 + 12.842 12.926 11.655 11.709 12.318 12.243 13.047 12.812 13.109 12.381 10.726 11.808 10.651 10.681 11.256 12.197 13.027 13.070 13.799 13.758 13.326 11.086 11.218 13.158 12.636 10.761 9.884 9.782 9.854 11.394 12.446 11.609 11.060 9.949 9.090 8.951 + 12.212 11.778 12.382 11.796 12.067 14.224 15.223 15.344 13.940 12.719 11.905 11.429 10.932 10.874 11.215 11.383 11.956 11.721 12.582 13.472 14.523 14.150 12.995 13.372 14.053 13.393 11.182 11.298 11.370 12.780 14.732 13.585 12.102 10.612 10.212 10.320 + 12.125 12.102 12.643 12.054 12.177 14.178 15.297 15.865 14.588 13.062 12.194 11.282 11.035 10.796 10.938 10.966 11.629 11.359 11.868 12.291 13.097 14.880 14.078 14.218 15.406 15.346 13.197 12.360 12.310 13.151 15.088 15.035 13.323 11.682 9.692 9.393 + 12.086 12.106 12.724 12.195 12.555 14.430 15.831 16.205 14.792 13.685 12.162 11.337 11.222 10.674 10.965 10.910 11.803 11.542 11.990 12.130 13.368 15.840 15.328 14.475 15.047 15.799 13.498 12.741 12.680 13.922 14.917 15.246 14.515 12.956 9.876 9.440 + 12.086 12.270 12.816 12.321 12.948 14.778 16.266 16.245 14.625 13.820 12.400 11.499 11.183 10.762 10.827 11.060 11.801 11.706 12.125 12.295 13.003 14.989 14.699 14.557 14.729 15.339 14.533 13.354 13.296 14.357 16.199 16.771 15.942 14.463 10.933 7.652 + 12.237 12.213 12.712 12.297 13.356 15.095 16.188 16.031 14.172 13.435 11.868 11.386 11.362 10.328 10.823 10.267 11.272 10.816 11.222 11.054 11.838 13.822 14.633 14.658 14.118 15.079 14.201 13.547 13.705 14.425 15.840 16.313 15.581 14.397 11.726 7.975 + 12.336 12.357 12.688 12.165 13.623 15.545 15.643 15.606 13.871 12.785 11.235 11.060 10.935 9.658 10.454 9.897 10.763 10.345 11.054 10.663 11.591 13.325 14.860 14.393 14.177 14.463 14.671 14.359 14.191 14.498 15.917 16.621 15.872 14.589 11.941 8.508 + 12.481 12.448 12.765 12.546 13.819 15.818 15.158 14.372 13.449 12.518 10.847 10.352 10.356 9.238 10.075 9.477 10.194 9.704 10.405 10.007 10.882 12.341 14.163 14.664 14.255 14.626 15.132 14.444 14.149 14.623 15.852 16.570 15.577 14.723 12.838 9.466 + 12.484 12.495 12.719 12.832 13.895 15.191 14.491 12.680 12.023 11.299 9.542 9.851 9.306 8.860 9.664 8.909 9.970 9.389 9.767 9.654 10.004 11.299 13.368 13.952 13.829 14.010 14.525 13.950 13.485 13.646 15.156 16.307 14.856 14.053 11.771 9.613 + 11.827 11.849 11.365 13.407 14.056 13.509 12.412 12.013 10.610 10.855 8.852 8.867 8.088 8.663 8.146 8.104 8.917 8.028 8.649 8.584 9.304 10.611 13.307 14.329 13.553 13.365 13.722 13.281 12.842 12.554 14.072 15.833 14.383 13.209 10.584 9.764 + 9.762 9.343 8.379 10.378 9.645 8.960 10.316 9.675 7.069 7.702 7.357 7.030 6.229 6.512 5.445 6.195 7.067 7.225 7.380 7.216 7.423 8.010 10.517 11.335 10.794 10.167 10.587 10.319 9.851 9.800 11.171 12.932 11.376 9.467 9.028 8.366 + 7.935 8.545 9.317 7.712 7.129 5.500 7.154 7.536 5.528 6.953 7.462 6.325 3.561 4.362 5.580 5.637 5.800 5.449 5.020 5.596 5.753 6.322 6.983 7.295 7.290 7.819 8.502 8.163 7.078 5.991 6.896 8.641 7.664 7.046 8.616 8.977 + 5.848 8.234 8.711 7.503 7.561 6.836 6.856 7.456 4.571 4.292 3.865 2.797 3.556 4.620 5.355 4.555 4.677 4.686 4.370 4.427 4.624 5.515 4.619 5.319 4.859 6.129 7.771 7.949 6.042 4.321 6.235 7.476 6.609 6.294 8.388 8.834 + 3.980 5.652 6.252 7.085 6.912 8.033 7.400 7.785 5.974 4.661 4.529 3.612 3.316 3.510 5.049 4.950 6.262 4.244 4.455 4.494 2.982 4.147 4.632 4.941 4.525 4.182 3.998 4.678 3.501 4.217 6.101 6.443 4.836 4.832 3.615 2.498 + 4.767 4.831 6.598 6.878 6.674 7.512 7.517 7.795 6.002 4.760 2.870 4.303 4.307 4.494 5.003 5.269 5.037 4.370 4.514 4.414 5.040 4.975 4.898 5.133 3.544 4.657 4.811 4.185 4.580 4.340 5.458 6.380 5.306 5.141 3.096 1.999 + 4.515 4.666 5.899 6.177 6.749 7.915 7.039 7.011 6.778 5.755 5.427 5.632 6.002 6.240 6.208 5.714 5.802 6.020 6.336 6.307 6.166 6.433 6.195 6.036 6.856 7.559 7.762 7.660 7.227 6.547 6.435 6.181 6.047 6.048 5.084 3.692 + 7.495 7.334 6.775 7.845 7.288 7.325 8.480 9.136 10.441 10.107 9.099 8.927 8.998 9.073 9.842 10.556 11.221 10.266 10.427 10.541 10.396 11.306 11.187 12.206 12.389 12.667 13.907 14.588 13.390 11.167 12.635 12.088 11.337 11.526 11.645 10.449 + 6.158 6.704 7.122 9.353 10.243 10.103 10.370 9.276 10.772 11.973 10.983 11.544 9.853 10.610 11.061 12.186 11.864 11.915 12.153 12.042 11.335 13.014 13.330 14.084 13.989 15.045 15.191 16.377 15.905 14.122 13.770 14.223 13.368 12.859 12.958 12.141 + 10.088 10.719 10.470 12.375 13.099 12.509 11.636 11.400 9.887 10.444 10.153 10.353 9.591 9.463 9.839 9.797 8.951 9.069 8.896 8.073 8.195 9.651 11.345 11.852 11.451 11.764 13.346 14.332 14.243 13.944 15.259 16.177 15.133 13.125 12.771 13.188 + 12.069 13.046 12.848 14.046 14.064 15.574 14.706 12.697 10.713 10.684 10.604 9.924 8.724 8.522 8.306 7.564 8.145 8.202 8.632 8.800 9.629 11.198 10.408 9.828 9.511 10.147 10.934 11.836 11.846 12.147 14.412 15.536 13.942 11.989 10.977 11.832 + 12.622 12.851 13.641 13.387 14.852 15.670 15.955 14.140 11.786 10.798 11.272 10.849 9.609 9.060 9.577 8.805 9.027 9.550 9.709 11.326 13.198 13.619 11.473 10.849 9.963 9.819 11.290 12.015 11.225 11.077 12.552 13.125 12.305 11.522 9.668 8.274 + 12.251 12.110 13.061 12.854 14.213 15.938 15.073 13.770 12.312 11.980 11.224 10.563 10.396 10.102 10.159 10.594 10.196 10.834 10.995 12.840 14.132 13.698 11.325 10.748 10.168 10.855 12.260 11.663 10.503 9.950 11.490 12.292 11.341 11.125 9.423 6.560 + 11.042 11.881 12.078 12.501 14.638 15.895 15.264 13.291 12.106 11.803 10.940 10.472 10.470 10.588 10.457 10.582 10.890 11.011 12.074 13.631 14.262 12.853 11.511 10.806 11.052 11.646 12.700 12.533 11.343 11.116 11.968 12.528 11.382 10.814 9.374 5.670 + 10.929 11.419 12.211 12.857 12.998 13.068 13.719 12.320 10.856 10.707 10.389 9.772 10.195 10.748 10.434 10.656 11.192 11.398 13.263 14.255 13.762 12.137 11.424 11.164 11.637 11.796 12.416 12.502 11.006 10.669 11.495 12.394 10.953 9.918 8.970 5.055 + 7.817 7.617 6.743 7.872 8.913 8.236 8.946 8.063 6.740 5.023 3.352 4.568 4.511 4.752 4.865 4.863 5.415 6.208 8.789 9.878 7.950 6.621 6.160 6.447 7.026 7.516 9.189 8.732 8.561 8.771 8.685 9.117 8.283 7.188 6.285 5.474 + 8.578 9.181 8.350 6.293 6.302 7.306 8.272 7.422 5.520 4.906 4.569 3.284 3.880 4.242 4.939 4.192 4.963 5.813 8.547 7.620 6.182 6.962 6.353 6.509 6.599 6.628 7.931 8.048 8.313 8.856 8.456 8.154 6.802 5.971 5.015 4.093 + 6.731 6.414 6.591 6.005 5.563 5.433 8.193 7.371 4.789 5.308 4.872 4.696 5.241 5.568 6.094 6.193 6.284 6.417 7.259 7.030 6.903 6.418 5.952 6.202 6.224 5.445 5.778 6.259 5.509 4.884 5.041 5.896 4.972 4.517 4.101 2.246 + 4.016 4.048 5.550 7.629 8.419 8.126 8.727 8.298 6.616 8.580 9.358 10.074 10.365 9.318 10.196 11.583 11.950 10.877 9.998 11.180 10.759 8.703 9.768 8.649 8.428 8.286 7.211 8.281 7.844 7.529 6.412 6.672 5.929 6.480 5.748 5.061 + 4.257 5.350 5.972 7.010 7.883 7.161 6.891 7.149 6.942 7.245 6.854 7.944 8.518 6.575 7.779 9.514 10.112 9.415 8.934 9.480 9.611 9.005 9.150 8.354 9.021 8.482 7.786 9.539 10.284 10.435 9.961 8.872 8.949 8.737 9.377 8.889 + 4.879 6.720 7.636 6.965 6.623 7.660 8.501 8.093 8.340 7.722 7.009 7.485 7.462 6.739 6.440 6.322 7.078 8.097 7.959 7.382 7.271 8.173 8.644 8.458 8.853 8.431 8.011 9.140 9.456 9.824 10.080 10.201 9.840 9.571 9.098 8.210 + 8.154 7.677 7.078 8.349 7.366 6.672 8.684 8.516 8.551 7.877 8.205 8.196 8.432 7.643 7.421 8.042 7.880 9.103 10.247 10.253 9.886 9.787 9.917 10.404 10.376 10.371 10.657 11.548 10.419 10.366 10.866 10.792 10.781 9.962 10.052 8.909 + 8.639 9.802 9.414 9.546 9.249 8.278 9.498 9.691 10.856 10.599 10.694 11.560 10.859 10.415 9.676 10.622 12.372 12.502 12.909 12.608 11.722 12.219 12.754 12.254 11.096 11.498 11.945 12.605 11.626 10.781 11.197 11.968 11.617 10.685 10.824 9.787 + 12.550 11.789 10.331 10.865 10.810 9.433 10.881 10.261 10.645 11.323 11.532 11.663 10.835 10.430 11.182 12.411 13.426 12.657 12.955 11.988 11.150 12.428 12.888 12.108 10.882 11.478 11.961 11.575 11.161 10.966 11.032 11.987 11.294 11.056 10.870 10.538 + 13.843 13.699 14.061 13.872 13.506 12.207 12.169 12.473 11.363 10.846 11.538 12.400 10.928 9.470 11.520 13.302 13.701 13.151 13.582 12.879 12.547 12.225 11.661 11.644 12.563 11.707 11.662 11.501 11.063 10.977 11.766 11.043 10.753 10.917 11.441 11.363 + 14.638 15.833 16.690 16.445 15.665 14.433 13.669 13.003 12.598 12.314 11.836 12.043 9.784 9.982 13.212 13.813 14.842 13.907 12.380 13.444 14.012 12.910 12.485 12.602 13.264 13.557 13.132 12.895 12.922 12.941 12.012 11.849 11.678 11.506 11.912 11.110 + 14.959 14.697 15.455 13.620 13.931 12.892 11.685 10.559 11.395 10.663 11.420 11.289 10.065 10.860 12.336 12.541 14.561 14.400 13.325 11.915 12.855 13.237 12.827 11.734 12.392 13.039 13.279 12.805 12.851 12.541 12.960 12.952 11.439 11.221 11.145 10.253 + 13.236 13.664 14.634 14.141 13.435 13.002 12.437 9.785 9.659 9.918 10.635 9.705 10.296 10.474 12.372 13.305 14.036 13.430 13.204 12.850 11.904 12.254 12.990 10.904 10.266 10.544 10.661 10.662 11.117 11.728 11.253 10.380 8.758 9.350 10.089 9.193 + 12.332 11.221 12.179 13.546 14.326 15.203 14.718 13.881 13.895 13.562 13.104 13.469 13.301 13.913 14.862 15.681 15.302 14.254 13.833 13.484 12.117 10.793 11.230 9.200 8.793 8.298 9.294 9.083 9.350 9.459 8.590 8.385 7.947 7.596 6.622 7.035 + 13.785 13.816 13.265 13.768 15.248 15.661 14.906 14.369 13.685 12.778 12.641 13.402 13.070 14.093 14.918 15.892 14.576 13.572 13.349 12.704 10.218 8.565 8.086 8.535 8.016 7.554 8.245 8.108 8.050 7.232 6.550 6.737 5.945 5.533 5.221 4.523 + 13.815 15.200 14.338 13.479 14.146 14.625 13.121 12.633 12.330 12.786 11.580 12.536 11.686 12.918 13.674 14.011 11.906 11.530 11.411 9.996 8.425 7.003 6.086 5.894 6.081 5.623 6.337 6.406 7.004 6.910 5.656 5.429 4.706 4.317 5.411 4.725 + 13.948 12.472 12.241 11.006 9.304 10.238 10.224 9.655 9.803 9.009 6.952 8.011 7.873 8.243 7.579 7.563 6.986 6.906 6.738 6.287 5.655 4.819 4.064 4.274 4.176 4.093 3.975 4.597 4.246 4.813 3.856 4.331 4.519 3.851 4.310 3.385 + 9.000 9.155 8.468 6.765 6.359 6.409 7.040 6.418 5.353 3.605 3.941 4.101 6.101 6.032 5.728 6.293 5.566 5.221 4.998 3.913 3.383 2.986 3.771 4.007 3.156 2.656 4.253 4.149 3.531 3.498 3.282 3.554 2.443 3.757 3.423 1.817 + 6.861 7.214 7.313 5.079 5.134 6.271 7.197 5.859 4.486 4.450 4.628 4.415 5.273 5.278 5.247 6.598 4.611 4.908 4.123 3.796 4.378 2.935 4.266 3.263 3.236 3.561 4.102 4.164 3.627 2.640 3.090 3.687 2.621 2.967 3.265 2.629 + 5.917 5.231 4.605 3.626 5.436 7.198 7.562 6.709 4.338 4.221 4.243 4.388 3.238 4.379 5.309 6.752 5.126 4.225 5.059 4.365 3.979 3.430 4.076 4.737 4.162 4.113 2.893 3.911 4.305 3.898 3.610 3.965 3.105 3.283 3.183 2.679 + 5.672 5.469 3.518 5.441 6.129 6.057 5.178 5.735 4.203 4.336 3.638 3.525 3.831 4.158 5.075 5.648 5.441 5.091 3.878 4.655 4.831 4.131 3.049 3.127 3.739 4.330 3.880 2.720 4.017 4.923 4.347 3.474 3.490 3.800 4.143 3.675 + 5.163 5.967 6.101 5.158 5.591 7.103 6.551 4.821 3.837 5.285 4.357 4.153 3.876 5.819 5.411 5.763 5.969 5.353 4.766 3.448 4.056 4.617 4.209 4.394 4.844 4.694 4.173 3.745 3.406 3.428 4.112 4.684 4.842 4.288 3.568 3.120 + 7.387 6.957 5.808 6.402 7.102 7.667 7.128 5.848 4.666 5.353 5.553 5.353 5.567 5.653 5.945 6.310 7.434 7.885 7.769 8.047 8.424 8.353 8.714 8.610 7.628 7.063 8.214 8.948 9.527 9.695 9.598 8.828 8.105 7.900 8.480 8.603 + 14.138 14.408 14.940 14.813 14.748 14.450 13.455 13.502 13.291 12.279 12.689 12.927 12.714 11.916 11.080 10.024 9.997 10.978 10.543 10.630 11.710 11.626 11.378 12.132 11.676 10.951 11.311 11.591 11.974 12.126 12.297 11.463 10.556 10.389 11.241 11.288 + 18.706 18.566 17.886 17.057 17.769 17.210 16.069 15.888 14.361 14.466 15.242 15.132 14.196 13.537 12.371 11.939 10.975 11.556 11.192 11.722 13.688 13.842 13.760 14.617 14.744 13.601 12.870 12.457 11.220 10.496 11.012 10.335 9.423 10.303 10.727 10.066 + 16.564 16.140 15.380 14.708 15.398 15.189 14.391 13.930 12.933 12.918 12.737 11.696 10.092 10.091 9.457 8.537 8.914 8.823 9.507 9.834 10.846 11.907 11.615 11.312 14.212 13.411 11.021 9.764 10.352 9.375 10.049 9.393 8.896 9.254 9.064 9.340 + 12.158 10.906 11.151 12.312 12.126 10.444 9.724 8.543 6.426 7.763 8.446 7.984 7.670 7.531 8.375 7.391 6.813 7.263 8.285 8.121 9.504 11.610 12.480 11.038 12.041 13.094 10.861 9.804 9.312 9.055 10.337 10.681 10.445 10.701 11.054 10.939 + 10.578 10.692 11.122 13.149 12.981 12.333 10.473 10.472 9.464 9.687 9.640 9.054 9.492 9.068 9.421 8.921 8.934 8.719 9.384 9.819 10.111 10.826 11.858 11.601 11.276 13.536 13.040 11.431 11.131 11.355 12.355 12.501 9.317 10.191 11.358 10.310 + 12.421 12.369 12.872 13.360 13.868 13.124 11.787 10.060 10.159 9.954 8.596 9.741 9.392 9.353 9.284 8.914 9.691 9.844 10.685 11.419 12.080 13.806 14.845 13.564 12.718 13.078 12.670 11.498 11.101 12.084 14.059 13.912 11.401 10.726 11.233 10.085 + 12.431 12.676 13.311 13.219 14.335 13.183 11.861 8.710 10.356 9.900 8.627 9.676 9.982 9.672 10.239 9.277 10.043 9.819 10.558 10.743 11.834 13.732 14.994 13.996 14.101 14.669 13.423 11.967 11.852 12.111 14.704 15.038 13.781 11.452 11.165 10.368 + 12.529 12.542 13.103 13.308 14.190 12.725 11.418 8.057 10.293 9.761 8.613 9.316 9.816 9.551 9.657 8.978 8.667 9.452 9.675 10.716 11.734 14.292 16.081 14.870 14.740 13.707 12.248 11.109 11.096 11.725 14.298 14.682 13.089 11.528 11.961 10.621 + 11.759 11.511 12.408 13.349 13.716 11.991 10.581 7.020 9.514 8.628 8.642 9.252 9.578 9.685 9.266 8.983 9.260 9.868 11.602 12.639 12.765 14.888 14.977 14.032 12.291 10.817 9.339 8.543 8.943 10.019 13.325 13.512 11.815 11.185 10.161 8.727 + 13.207 12.945 13.076 12.494 11.976 10.169 9.755 8.893 9.314 8.438 7.671 7.706 8.860 8.421 8.732 8.551 8.449 9.404 11.281 12.014 11.442 12.079 12.744 12.341 7.927 6.867 5.958 5.484 6.310 7.845 10.934 10.753 9.771 8.854 7.602 5.826 + 12.410 10.988 10.060 9.370 8.278 7.721 8.147 7.271 7.411 7.677 6.743 6.339 7.267 7.421 7.891 7.169 6.760 6.385 7.030 6.618 5.899 6.285 6.335 6.437 5.481 5.196 4.019 4.196 4.639 6.611 7.283 7.068 6.303 6.469 6.312 5.515 + 10.297 10.350 10.103 8.587 8.825 7.173 7.012 6.632 7.076 7.186 6.889 7.991 7.217 6.331 6.204 6.315 7.827 9.775 11.106 11.278 9.405 7.970 9.390 8.649 9.129 9.937 8.793 9.007 8.586 7.952 9.083 11.555 12.055 11.848 12.045 12.793 + 9.580 9.805 8.078 8.535 9.037 7.109 5.961 5.935 7.330 7.172 6.386 8.360 8.413 7.406 6.942 6.234 8.591 9.681 11.442 11.803 9.751 9.237 10.442 9.350 10.220 11.557 11.060 10.705 9.762 8.666 9.242 11.556 11.662 11.568 12.261 12.553 + 8.416 8.512 7.315 7.585 7.962 6.329 5.899 6.131 5.632 6.773 7.527 8.810 8.530 7.207 6.961 7.357 7.975 9.327 9.661 9.950 9.199 8.478 7.699 8.314 9.800 9.829 9.476 9.859 8.472 7.785 8.411 9.502 8.848 8.707 10.266 9.787 + 14.068 13.244 11.642 11.270 12.059 11.641 10.881 10.735 10.401 9.678 10.375 11.117 10.509 10.677 10.661 10.571 10.190 10.758 10.796 11.462 11.243 11.427 11.183 11.728 12.326 12.403 12.244 12.248 12.427 12.190 12.906 12.596 12.349 12.634 12.134 12.033 + 16.952 16.251 14.097 14.804 15.030 15.596 16.124 15.515 14.026 14.118 14.931 15.076 14.397 13.757 11.785 10.520 11.624 12.362 11.418 11.157 11.407 10.947 10.339 10.771 10.910 10.781 10.582 10.687 10.987 11.002 11.268 11.233 10.492 10.623 10.429 10.631 + 15.768 17.142 15.868 16.679 15.355 16.296 16.011 15.411 13.312 13.268 14.430 13.748 13.839 12.982 10.835 11.290 12.071 11.513 10.643 10.545 11.093 10.678 9.840 10.453 10.954 11.226 11.684 10.541 10.971 12.270 11.609 10.762 9.530 9.662 10.050 9.362 + 16.924 17.208 16.280 15.833 15.072 14.587 15.167 14.974 13.578 13.738 14.107 14.413 13.910 12.466 10.796 11.085 10.471 9.810 9.790 9.718 8.910 8.644 9.407 8.688 9.745 11.225 11.906 10.242 11.299 12.704 10.943 9.510 8.198 9.590 9.234 8.944 + 14.202 14.958 15.326 14.877 14.771 15.735 15.753 14.622 14.302 13.189 14.881 15.189 14.416 12.045 10.269 9.147 9.174 8.270 7.525 6.922 7.494 8.648 9.249 8.688 9.031 11.712 13.068 10.969 11.263 12.661 11.448 9.726 8.288 9.652 10.792 11.264 + 14.908 13.895 12.864 12.919 14.553 15.713 15.071 14.072 14.011 12.816 14.209 14.745 14.261 11.832 9.831 9.354 8.540 8.634 7.114 6.161 6.676 7.357 7.007 7.304 7.697 9.380 11.266 10.563 8.907 11.368 10.903 9.284 8.143 10.803 11.295 11.164 + 11.334 11.807 11.325 12.607 12.477 13.747 12.675 12.915 12.704 11.765 12.876 13.134 12.323 11.595 10.405 8.476 7.418 7.461 7.546 7.192 7.784 7.911 7.093 6.588 8.680 9.339 11.375 10.521 8.560 11.261 11.554 10.895 11.355 12.730 12.153 10.181 + 11.492 10.715 9.756 9.099 9.073 9.891 8.296 7.572 8.487 8.117 8.083 9.507 8.468 6.035 5.877 5.526 4.646 4.777 6.052 5.570 5.672 6.269 6.515 5.867 7.008 8.464 8.219 7.260 6.460 7.710 8.140 8.101 8.969 8.164 7.360 6.121 + 9.238 8.971 8.845 8.071 6.854 8.084 7.114 6.490 6.592 5.680 4.657 4.488 4.619 4.105 3.016 3.834 4.126 4.649 4.501 4.565 4.964 5.419 5.388 5.473 6.997 7.712 6.180 5.987 5.782 4.864 5.454 6.115 5.745 6.047 6.199 5.116 + 7.939 8.436 8.363 6.328 6.966 6.995 5.960 6.879 4.834 4.189 3.750 4.717 5.553 4.900 4.018 4.296 3.829 3.968 5.063 5.560 4.947 4.934 4.623 5.051 6.263 6.929 6.261 6.179 5.264 4.888 3.777 4.663 5.154 5.534 6.178 5.398 + 8.659 8.426 7.135 7.414 6.972 7.062 7.972 8.097 7.994 8.008 7.791 7.391 5.807 5.269 7.076 8.237 8.501 8.838 9.077 8.968 9.327 9.847 9.929 9.734 10.313 11.234 11.644 11.651 11.327 11.075 11.250 11.026 9.767 8.448 9.092 8.349 + 10.090 9.992 9.171 7.848 9.078 9.488 9.239 10.129 10.067 10.553 10.073 9.172 8.281 7.005 9.878 10.748 10.588 10.465 10.370 9.876 10.205 11.012 11.359 10.785 11.592 12.909 13.582 14.001 13.918 14.130 14.351 14.351 13.647 12.415 12.781 11.899 + 8.865 9.596 11.235 11.969 11.920 11.591 10.899 10.052 10.159 8.807 8.213 8.089 8.920 8.207 8.506 9.204 7.385 6.813 7.744 7.267 8.277 8.616 8.615 8.891 9.466 10.982 12.892 11.160 11.096 13.590 13.687 12.995 12.732 13.664 11.824 10.848 + 13.631 12.867 13.066 13.126 12.752 12.967 11.861 11.381 10.397 8.255 9.547 11.139 11.890 12.570 12.331 11.113 9.768 7.777 7.759 8.623 8.804 8.938 9.288 9.916 9.838 11.577 12.091 10.622 12.073 11.427 11.520 10.709 11.406 11.864 11.385 8.329 + 13.093 12.391 11.665 12.086 11.290 11.591 10.925 10.426 9.525 7.708 6.697 9.349 9.838 11.733 11.713 9.461 7.640 5.661 6.833 6.230 4.853 5.299 5.224 5.527 6.525 6.787 7.033 7.975 9.300 7.643 7.097 7.022 7.853 7.665 7.975 6.275 + 9.446 10.015 10.257 9.537 8.945 7.140 6.611 5.802 6.270 6.864 5.360 5.744 6.826 8.098 6.573 5.454 4.988 3.798 3.626 3.124 4.496 4.655 5.084 5.601 6.034 4.747 3.960 4.227 5.460 4.656 4.237 4.308 3.572 3.771 4.240 4.578 + 10.282 10.994 10.665 8.759 8.535 7.609 6.245 5.853 5.939 7.073 5.689 7.116 8.289 7.380 5.301 4.391 3.051 3.193 3.134 3.331 3.995 3.934 2.828 3.792 5.322 4.575 3.364 4.096 4.114 4.280 4.383 4.741 4.654 4.362 5.614 4.665 + 9.847 10.878 10.715 8.850 7.879 8.200 7.992 6.217 6.379 6.952 6.252 7.559 6.979 6.340 6.394 5.573 4.492 4.180 3.852 4.513 2.946 4.763 4.493 3.894 5.008 5.282 3.579 3.356 4.099 4.865 4.394 4.090 3.903 3.747 4.837 4.299 + 10.382 11.152 10.376 8.814 8.650 7.392 8.258 7.847 6.678 6.313 6.388 7.817 7.114 7.560 6.404 4.111 3.591 3.442 3.805 5.612 4.598 5.288 5.439 5.488 5.590 6.299 5.005 4.974 3.945 4.653 4.591 4.891 3.681 3.779 3.618 4.292 + 9.811 10.650 9.651 6.840 7.330 6.388 6.956 6.643 5.738 6.806 6.157 5.856 4.020 5.746 5.298 4.846 3.222 2.954 4.003 5.230 5.439 5.189 4.952 5.387 4.551 5.705 5.135 4.359 3.476 4.085 4.174 4.521 4.338 4.384 4.737 4.324 + 9.359 10.227 8.489 7.359 6.611 6.364 6.746 6.286 5.856 6.563 6.574 4.714 4.519 5.837 5.373 3.978 4.318 4.688 4.886 4.868 4.343 4.115 3.502 4.125 4.719 5.299 4.273 3.317 3.128 4.213 4.055 4.351 4.600 4.575 4.079 4.511 + 9.611 10.050 9.335 7.341 4.885 5.470 5.495 3.710 4.618 5.420 4.835 4.805 5.090 5.718 5.292 5.431 5.087 4.246 4.164 4.579 5.355 4.254 5.276 5.537 4.413 4.189 3.142 3.327 3.076 3.999 3.884 3.925 4.051 4.166 4.172 3.395 + 13.294 13.573 13.677 13.437 12.989 12.605 12.452 11.290 9.768 10.210 9.277 10.252 9.090 9.604 10.337 9.745 8.837 8.238 9.199 10.265 9.729 8.506 8.880 9.841 9.117 8.007 9.190 9.716 9.556 10.832 10.746 9.253 9.426 9.419 9.872 9.414 + 17.744 16.708 17.162 17.234 17.048 16.176 15.207 13.303 13.359 13.509 12.460 12.124 11.503 10.877 11.293 10.386 10.001 10.075 10.866 11.221 10.668 9.339 9.514 10.163 8.969 8.279 9.460 10.128 10.534 11.773 10.864 9.854 9.552 9.810 10.442 10.241 + 17.450 15.734 15.976 14.402 15.068 14.175 13.478 12.713 12.568 11.638 10.114 9.624 9.206 10.082 10.350 9.255 9.629 9.239 8.838 8.751 9.171 8.020 7.313 7.815 8.362 8.296 8.064 8.903 9.975 10.849 10.291 9.259 8.668 9.059 9.115 9.043 + 12.465 12.545 12.560 12.042 10.383 10.061 10.816 10.665 10.136 9.323 7.309 7.384 7.475 6.814 7.028 6.558 7.061 7.089 6.846 4.942 7.301 7.507 6.983 6.981 7.849 7.644 6.960 7.537 8.540 8.116 10.200 9.069 8.353 8.048 7.645 8.596 + 9.150 8.579 10.196 12.118 12.892 12.369 11.756 11.990 11.407 12.065 10.820 9.442 8.438 6.364 6.603 6.498 5.424 5.287 5.296 4.203 5.183 5.538 4.707 5.245 5.825 7.326 8.151 6.381 6.458 7.197 9.457 9.925 10.122 8.921 8.080 7.904 + 9.304 10.239 11.440 13.119 13.083 12.542 13.146 12.414 12.452 13.284 10.944 10.036 8.310 7.513 6.820 6.322 6.759 6.505 5.905 5.750 6.193 5.352 5.052 6.314 7.022 9.585 10.280 7.868 8.266 9.611 10.719 11.924 11.900 9.586 8.857 9.058 + 8.321 10.247 11.706 13.055 13.837 11.128 12.206 13.053 12.992 13.327 13.014 10.898 9.662 9.482 8.132 5.330 4.840 5.373 5.757 6.101 5.925 5.730 7.127 6.908 7.807 9.564 11.003 9.437 10.013 11.293 11.649 11.321 11.069 9.769 10.695 11.194 + 9.502 9.959 11.817 12.806 14.235 12.889 11.602 11.768 12.839 12.862 13.121 13.167 12.424 10.001 8.786 9.003 9.575 9.368 8.044 8.046 8.542 8.133 8.895 8.437 9.434 12.755 12.797 13.203 12.404 11.695 11.338 10.005 9.778 10.298 10.539 9.412 + 12.240 11.686 12.574 13.325 14.989 13.611 11.881 11.701 12.319 11.801 11.260 13.137 12.794 12.482 13.117 13.315 12.673 10.963 10.783 10.293 9.618 8.041 8.718 10.607 12.533 14.238 12.970 12.249 12.178 10.620 8.878 9.053 9.139 8.725 8.885 9.481 + 12.831 12.993 13.465 13.926 15.623 14.667 12.447 12.064 12.415 12.057 9.688 11.359 10.629 11.862 12.640 13.709 13.316 13.417 13.312 13.934 13.016 11.790 12.059 12.501 14.550 15.420 12.715 11.378 12.590 11.717 9.196 8.311 7.934 7.550 6.913 6.948 + 12.740 12.901 13.500 14.372 15.884 14.372 11.911 12.227 11.555 11.185 9.066 10.169 9.120 10.159 10.199 10.801 11.417 12.535 13.540 14.718 14.095 14.148 14.443 13.810 15.259 15.816 13.493 11.498 11.701 12.813 12.250 10.432 9.618 8.855 7.713 6.911 + 12.830 12.759 13.465 14.388 15.212 13.061 11.522 11.271 10.531 9.915 8.274 9.038 7.646 8.374 8.575 9.209 9.763 10.330 10.721 11.955 12.942 14.553 15.365 14.313 14.386 15.202 13.588 10.976 9.023 9.942 12.529 12.485 11.811 11.633 9.749 7.759 + 12.808 12.695 13.202 13.349 13.588 11.651 10.671 9.759 9.435 8.402 7.328 7.609 7.223 7.612 8.214 8.425 9.193 9.787 10.024 10.521 10.928 11.730 14.063 14.299 12.620 12.571 12.478 12.123 11.086 10.837 13.328 13.688 12.797 13.374 11.780 8.457 + 12.453 12.410 12.930 12.527 12.381 11.323 10.305 8.834 9.093 7.543 7.744 7.428 7.199 7.524 7.869 7.819 8.288 7.998 8.965 9.638 9.955 11.101 14.075 14.685 12.421 11.822 13.055 13.374 12.048 11.403 11.820 11.944 11.186 11.089 9.805 6.770 + 12.069 12.141 12.642 12.131 11.845 11.075 9.938 8.621 8.677 6.654 6.989 7.943 7.885 8.188 7.867 7.329 7.849 8.228 8.562 9.056 9.436 10.752 13.798 14.717 12.222 11.570 11.731 11.458 11.002 10.860 11.810 12.325 11.663 11.887 10.267 8.038 + 12.034 12.025 12.443 11.476 11.638 11.212 9.920 9.115 8.847 7.516 8.217 7.899 7.241 7.982 7.601 7.010 8.318 8.964 9.385 10.168 10.318 11.340 14.696 15.350 12.614 11.692 11.905 12.209 11.802 11.297 13.413 14.021 13.281 13.254 10.802 8.500 + 11.797 11.405 11.849 11.006 11.470 10.769 9.188 8.559 9.060 7.764 7.265 6.804 6.890 8.226 8.231 8.332 8.663 9.303 9.423 11.398 12.615 13.643 15.151 15.593 13.668 11.764 10.233 9.781 9.600 10.391 12.708 12.355 11.230 12.012 9.630 5.765 + 10.821 10.428 10.616 11.013 9.484 7.937 7.003 6.818 6.875 7.816 8.145 7.798 5.710 6.972 6.378 6.291 6.957 6.933 7.521 9.683 10.879 11.225 11.466 11.646 9.912 7.233 6.092 5.668 5.896 7.050 9.321 8.618 8.105 8.561 5.336 2.311 + 10.318 10.238 9.723 8.488 7.299 4.997 6.085 6.050 6.634 4.614 6.710 7.609 6.259 5.740 5.385 3.288 4.013 4.338 3.612 4.382 4.237 4.043 6.391 6.951 4.755 3.497 4.327 3.145 3.452 3.835 4.075 4.228 3.694 4.104 2.295 1.778 + 9.689 9.462 8.057 7.967 7.748 5.158 6.152 7.139 6.881 5.721 5.842 5.835 4.831 4.845 5.559 4.594 3.363 3.648 4.155 4.021 4.948 5.462 7.588 8.057 6.002 4.542 4.008 3.249 2.874 3.622 3.481 3.075 3.297 3.215 2.650 2.084 + 8.932 8.737 8.506 6.804 6.711 5.344 6.053 5.580 4.856 4.296 4.551 4.054 4.299 6.106 5.737 2.945 3.650 5.038 4.377 4.365 4.603 4.940 6.712 7.125 4.578 4.791 2.937 2.954 1.992 2.511 4.279 4.484 3.544 3.300 2.788 1.733 + 6.494 5.837 6.636 7.274 6.579 4.937 5.696 4.431 5.334 3.798 3.952 3.926 4.339 6.630 5.998 3.237 4.268 4.178 5.275 5.013 4.609 4.606 5.605 6.444 4.819 4.294 4.005 2.706 2.522 2.934 3.992 4.242 3.162 3.221 2.703 1.994 + 5.524 4.968 5.802 4.694 4.631 4.661 4.529 5.015 4.988 2.905 2.730 4.362 4.591 6.409 6.350 4.573 3.873 3.706 4.335 4.699 4.389 4.643 5.204 5.076 4.129 4.769 2.313 1.989 2.596 1.999 2.825 2.794 3.616 2.597 2.042 1.349 + 8.245 7.501 7.569 6.808 6.900 6.342 6.362 6.451 5.449 6.360 6.617 6.634 6.501 7.714 7.553 6.423 7.093 7.396 7.660 7.474 7.898 7.896 7.693 7.464 7.298 7.677 7.946 8.198 7.971 7.635 7.850 7.866 7.630 7.343 7.830 7.101 + 15.783 16.301 16.342 15.560 15.034 14.698 14.971 15.592 15.434 15.120 14.305 12.990 11.501 11.994 12.622 12.026 11.483 12.660 12.797 12.341 12.025 11.621 11.546 10.321 10.431 11.533 11.374 11.365 10.968 9.841 10.673 11.327 10.712 10.324 11.232 10.432 + 17.759 18.040 17.942 15.798 16.680 16.406 15.177 16.261 15.686 15.154 14.129 13.572 12.699 11.720 12.752 12.305 12.520 12.956 13.157 12.788 12.888 11.658 11.720 10.698 10.480 12.702 11.941 11.822 10.855 9.846 10.242 11.907 9.982 9.374 10.248 10.389 + 18.405 16.444 16.017 15.637 14.296 14.095 13.487 13.164 13.443 12.966 12.279 10.516 10.906 9.453 8.643 9.072 8.953 8.532 9.700 10.503 9.620 9.354 10.287 9.683 8.393 11.578 11.180 11.004 10.293 10.136 9.461 11.586 10.962 10.132 10.248 9.676 + 16.124 14.214 12.832 10.924 10.208 9.456 9.031 8.777 8.246 7.958 7.380 8.188 6.488 7.014 7.401 6.518 6.394 6.951 7.632 9.520 8.861 8.737 9.912 8.819 8.401 10.743 11.233 9.766 9.395 9.502 9.293 9.716 10.100 9.809 10.091 9.656 + 10.878 9.719 9.854 8.302 6.898 7.045 7.177 6.713 6.566 6.684 7.186 6.943 6.817 6.470 6.173 5.788 5.797 6.640 7.133 7.444 7.510 8.470 8.486 7.863 8.072 8.514 9.920 9.918 8.569 8.655 9.615 9.676 9.165 9.580 9.559 8.504 + 9.591 7.958 7.606 6.670 8.250 7.402 6.349 5.971 6.311 5.931 5.934 5.031 4.272 5.842 4.304 4.729 7.244 8.510 7.870 8.160 8.260 8.722 8.518 8.085 8.292 9.557 9.647 8.923 8.216 8.522 8.902 9.482 9.405 9.917 10.267 9.929 + 10.392 10.134 8.708 8.283 8.795 8.626 7.635 6.545 7.484 7.919 7.387 8.091 6.587 7.136 6.685 5.870 7.605 8.549 9.046 9.232 9.297 9.452 8.791 9.262 8.833 10.543 9.707 9.405 8.783 9.064 8.955 10.271 8.865 9.540 10.130 9.284 + 12.039 11.546 10.922 10.129 10.106 10.148 9.093 8.537 9.297 9.866 9.413 9.549 9.312 8.805 7.134 6.957 8.297 10.089 10.555 10.665 10.682 10.705 9.155 9.753 9.475 11.292 11.592 10.592 10.036 10.395 9.412 9.902 10.057 10.966 10.910 10.600 + 9.186 10.320 10.154 9.268 8.842 9.529 9.232 9.264 8.617 8.599 7.871 8.137 6.465 6.709 7.554 7.718 7.548 8.817 8.468 10.263 9.675 8.527 8.064 8.408 9.478 11.481 10.975 8.752 8.616 8.612 9.642 10.449 10.288 10.525 10.233 9.499 + 8.644 10.183 10.756 9.818 11.407 11.590 12.152 11.429 11.751 10.454 9.493 7.510 7.992 8.433 8.323 8.710 9.246 9.402 10.466 11.248 10.347 10.103 10.536 10.717 11.433 12.621 11.538 9.300 8.059 8.800 9.808 10.144 7.985 8.199 7.856 6.577 + 11.537 12.342 11.353 11.267 12.275 13.779 13.630 14.870 14.338 13.391 12.866 11.869 10.151 11.136 11.029 11.554 12.024 13.011 13.977 14.607 13.563 12.050 11.112 10.873 11.418 13.189 12.643 10.474 9.905 9.955 12.521 13.094 11.449 9.597 8.658 5.968 + 12.689 11.893 12.635 11.001 12.092 13.613 15.063 16.235 16.155 13.853 13.072 11.897 10.683 11.344 11.237 11.479 11.963 12.982 14.386 15.444 13.999 11.874 10.783 10.379 9.646 11.505 13.133 12.410 11.265 11.276 13.612 14.141 12.000 9.985 8.723 5.640 + 12.970 12.392 13.099 11.308 11.685 13.311 14.457 15.286 15.713 13.470 12.323 11.780 10.805 11.007 10.924 10.926 10.970 11.340 12.075 13.574 13.914 12.518 11.124 10.998 10.840 12.424 15.040 13.930 12.348 12.546 13.853 13.408 11.175 9.693 8.635 4.919 + 12.987 12.911 13.411 11.892 11.939 13.459 14.696 15.394 15.539 13.817 12.595 12.413 11.233 11.392 11.401 11.309 11.441 11.600 11.938 13.050 14.044 13.945 11.544 10.531 10.122 10.740 13.659 13.121 12.110 13.218 15.034 14.700 13.381 11.460 9.565 5.462 + 12.951 13.143 13.544 11.945 11.857 13.353 14.388 14.773 15.239 13.711 11.517 12.115 11.201 10.772 11.053 11.044 11.210 11.202 11.183 11.712 13.180 14.991 13.750 12.385 11.948 12.168 13.720 13.509 12.665 14.076 15.600 14.583 13.399 11.780 10.548 7.158 + 12.853 13.015 13.379 11.450 11.750 13.085 14.014 14.007 14.460 13.211 10.883 11.820 10.863 9.875 10.055 10.449 10.557 10.479 9.885 9.470 11.462 13.474 13.740 12.906 12.112 13.177 14.002 14.066 13.572 14.216 15.019 13.759 13.183 12.040 11.060 8.483 + 12.700 12.448 12.883 10.269 11.294 12.048 13.024 13.224 13.028 11.913 9.770 11.321 9.763 8.762 9.084 9.331 9.062 10.010 8.881 8.490 8.919 10.878 12.958 13.331 12.621 13.597 13.863 13.010 12.845 13.201 13.877 12.317 12.371 11.555 11.177 8.884 + 12.658 12.037 12.301 10.070 11.018 11.216 11.850 11.734 11.236 10.631 10.016 10.921 8.823 7.662 8.288 8.927 8.708 9.681 8.993 9.753 9.409 9.638 11.120 10.860 10.662 10.413 10.182 10.064 11.078 11.600 11.596 10.962 11.862 11.676 12.023 10.912 + 12.772 12.413 12.521 10.725 10.626 11.429 11.800 11.570 11.013 10.160 10.066 10.746 9.475 7.121 8.038 8.797 9.006 9.992 9.200 9.548 9.342 9.497 10.463 10.201 9.015 6.676 6.389 6.681 9.049 10.142 9.872 9.908 11.513 11.331 11.833 10.474 + 12.577 12.436 12.390 10.901 10.729 11.602 11.861 11.616 11.188 10.429 10.478 10.902 9.441 7.440 8.441 8.920 9.270 9.821 9.235 9.352 9.523 9.591 10.603 11.101 8.492 6.458 4.982 6.078 8.332 9.573 10.190 10.489 11.849 11.526 10.751 9.462 + 12.425 12.265 12.120 10.785 10.940 11.382 11.772 11.227 10.079 10.242 11.022 11.005 9.098 7.379 8.441 8.780 9.227 9.298 9.148 9.013 9.748 9.854 10.209 10.720 9.106 7.066 4.460 4.907 7.861 9.344 9.987 10.555 11.863 11.511 11.071 9.346 + 12.092 11.540 11.399 10.556 10.762 10.779 11.309 10.740 9.704 10.911 10.965 10.020 8.917 7.069 7.528 7.004 7.803 7.683 7.778 7.792 8.022 9.041 11.459 11.213 9.821 7.555 5.008 5.373 6.972 8.210 8.853 8.948 10.047 10.376 10.767 9.653 + 11.810 10.630 10.778 10.878 9.953 11.215 10.797 9.213 9.433 9.709 8.687 9.442 7.715 5.079 5.580 5.572 7.112 7.966 7.966 8.314 9.066 9.939 11.409 11.331 9.401 7.489 6.027 5.534 6.442 7.856 8.412 8.288 9.241 9.453 10.800 9.558 + 11.790 11.232 9.414 10.540 9.987 10.047 11.132 10.236 9.911 9.612 9.343 8.304 5.926 6.161 6.427 6.914 8.869 8.973 9.795 9.858 9.784 10.171 11.647 11.622 10.282 8.037 7.242 6.809 7.475 8.660 9.316 7.602 7.428 7.198 8.048 6.918 + 10.443 10.129 11.040 10.338 10.513 11.599 11.277 10.101 9.183 9.692 9.242 7.091 6.823 8.163 9.256 10.027 10.898 11.450 12.345 11.797 9.905 9.436 11.100 11.238 11.005 8.154 7.942 7.529 8.001 8.215 9.888 8.093 8.125 8.898 8.740 8.132 + 8.992 10.198 10.704 9.276 10.415 10.417 11.329 10.003 10.604 9.786 9.415 7.481 7.685 7.992 7.820 8.693 10.176 11.441 12.788 11.832 9.810 9.971 9.444 10.391 11.065 8.959 8.541 8.985 9.589 8.970 9.434 9.894 10.010 10.952 11.216 10.833 + 7.336 9.502 9.174 8.453 8.543 8.729 9.237 8.886 8.759 8.294 8.180 7.224 6.756 6.768 6.537 5.882 6.966 9.597 10.634 9.590 9.373 9.253 8.672 10.235 10.411 9.085 9.045 9.745 10.094 10.171 10.744 10.835 10.897 11.512 12.429 12.807 + 8.225 7.225 7.344 8.367 7.998 8.120 8.200 8.036 6.199 5.801 5.685 7.175 6.795 5.595 6.081 6.040 7.631 9.048 8.968 8.632 8.195 8.794 8.775 9.065 9.100 10.155 9.930 9.629 9.645 10.872 11.568 11.384 10.926 12.392 12.786 12.426 + 7.735 6.769 7.371 7.975 7.640 8.049 6.845 8.218 8.074 7.059 8.048 7.960 8.039 7.174 8.086 7.331 7.899 9.259 9.240 8.634 9.311 8.979 9.003 8.067 8.483 9.312 9.579 9.647 8.100 10.957 11.257 11.946 12.048 12.843 13.217 13.197 + 5.201 7.854 8.177 6.723 6.174 7.552 7.467 7.306 8.329 7.236 7.661 7.871 7.521 6.616 7.460 8.576 8.350 8.358 8.956 8.942 8.874 9.416 8.827 9.420 8.506 10.242 9.169 9.981 9.743 10.606 12.469 12.596 12.403 13.608 13.897 13.640 + 8.065 7.380 5.890 7.362 7.743 6.900 7.298 8.427 8.566 8.213 7.955 8.541 8.279 7.931 7.937 8.162 8.773 9.456 10.240 9.434 8.596 10.161 10.010 9.559 9.173 10.395 8.975 10.125 10.386 11.102 11.891 12.391 12.886 14.069 14.637 14.289 + 9.891 9.632 9.422 9.906 9.028 9.535 9.317 8.759 9.234 9.332 7.863 6.270 8.062 8.239 7.854 8.386 8.790 10.039 11.526 10.944 9.939 9.371 9.835 10.266 9.341 11.733 10.721 10.720 11.267 11.899 12.289 12.692 13.359 13.717 13.557 14.710 + 9.910 11.139 11.314 11.542 12.081 12.475 12.247 11.686 10.776 10.762 9.024 8.575 8.410 8.928 9.869 10.481 10.543 10.276 11.496 10.712 10.132 10.190 11.113 11.516 10.657 12.179 11.030 10.451 11.114 10.653 11.185 13.636 14.252 13.148 13.256 13.844 + 11.657 11.732 11.404 12.772 13.565 14.496 15.606 15.405 13.837 13.548 11.992 12.152 11.474 11.509 10.532 10.436 11.592 12.305 12.303 11.527 10.726 10.437 10.113 10.494 12.194 13.256 11.899 10.454 9.246 8.827 9.480 9.426 10.478 11.189 10.354 9.414 + 12.410 12.280 11.882 12.020 13.146 15.061 15.831 16.467 15.580 13.579 13.988 13.460 11.685 12.972 12.276 12.749 13.145 14.259 14.297 12.816 12.188 11.452 10.704 10.993 12.182 13.473 11.729 10.083 8.017 8.247 9.316 8.283 8.552 10.536 8.967 7.182 + 12.775 12.187 12.378 11.997 12.936 14.301 15.072 16.021 16.580 15.198 13.916 14.271 13.426 12.910 13.296 12.820 14.110 15.203 15.966 14.444 14.310 12.981 12.895 12.575 13.198 13.703 12.523 11.426 11.294 10.876 11.173 10.933 9.555 10.537 9.633 8.433 + 12.532 11.881 12.317 11.815 12.890 14.049 14.521 16.697 17.191 14.930 14.643 14.356 12.948 12.930 12.898 12.642 13.364 14.637 17.146 16.448 15.357 13.888 13.659 13.140 13.912 14.170 13.453 12.167 11.670 11.556 12.619 12.941 11.037 11.839 10.446 9.118 + 12.293 11.523 12.001 11.707 12.618 13.794 13.751 16.484 17.062 15.909 14.535 13.683 12.535 12.617 11.924 12.051 12.456 13.306 16.000 15.453 14.471 13.139 12.881 12.534 13.311 13.720 13.342 11.929 10.666 11.314 13.493 14.330 12.304 12.581 9.812 8.301 + 12.073 11.836 11.980 12.154 13.042 13.961 13.949 16.610 17.376 17.169 15.165 13.712 13.402 13.593 13.346 13.381 14.004 15.125 16.906 16.307 14.097 12.776 11.260 12.062 12.284 13.046 13.540 12.849 12.074 12.403 13.471 14.250 11.905 11.380 9.479 8.560 + 12.090 11.766 11.650 12.168 13.067 13.732 13.962 16.434 17.085 17.422 15.217 14.429 13.962 13.860 13.571 13.603 14.274 15.112 16.836 16.207 15.094 13.707 12.661 12.515 12.480 11.650 11.983 12.145 11.841 12.176 13.381 14.030 11.587 10.527 9.871 9.489 + 12.074 11.629 11.134 11.795 12.780 13.159 13.478 15.952 16.803 16.984 15.891 14.931 13.005 14.150 13.328 14.058 13.830 15.750 16.477 16.632 15.027 14.329 13.787 14.714 14.678 14.053 13.442 12.869 12.251 12.771 14.005 14.399 12.376 11.815 10.470 9.855 + 11.883 11.096 11.046 11.988 12.716 13.054 13.781 15.902 16.981 17.299 15.513 14.161 13.483 13.723 13.649 14.114 14.513 15.408 16.206 15.728 13.619 12.665 12.755 13.213 13.405 12.374 11.657 11.548 11.634 12.375 13.705 14.444 12.356 11.599 8.716 7.715 + 11.756 10.973 11.224 11.987 12.427 13.106 13.583 15.752 17.237 17.525 16.352 14.520 13.290 13.764 13.831 14.103 14.583 15.414 16.985 16.378 15.135 14.305 13.961 14.535 15.055 14.057 12.814 12.143 12.067 12.394 13.600 14.432 12.214 11.656 10.030 9.553 + 11.694 11.059 11.156 12.205 12.243 13.215 13.737 15.467 17.144 17.424 16.444 14.315 13.253 13.793 13.967 14.139 14.675 15.070 15.772 15.552 14.608 13.836 13.715 14.182 14.818 13.426 12.118 11.515 11.983 12.628 13.733 14.295 11.949 11.088 9.368 8.717 + 11.983 11.469 11.499 12.349 12.786 13.351 14.196 15.430 17.164 17.504 16.668 14.639 13.826 14.275 14.537 14.608 15.082 15.924 16.225 15.646 14.478 14.322 14.486 15.106 14.865 13.442 11.845 11.382 12.195 13.427 14.398 14.951 12.706 12.122 9.963 8.725 + 11.798 11.249 11.154 11.983 12.644 13.192 14.104 15.075 16.866 17.069 16.927 14.253 13.731 14.213 14.479 14.503 14.884 15.716 16.051 16.164 14.320 13.682 13.817 14.691 14.377 13.137 12.541 11.730 12.128 13.881 15.170 14.874 12.250 10.564 9.376 9.154 + 11.651 11.204 10.757 11.923 12.522 12.852 13.717 14.934 16.676 17.084 17.034 14.170 14.478 13.866 14.454 14.262 15.346 15.320 16.631 15.723 14.151 13.584 13.290 13.693 14.052 11.833 11.640 10.855 10.890 12.656 14.216 14.097 11.720 10.566 8.950 8.227 + 11.486 10.524 10.846 11.753 12.138 12.668 13.349 14.642 16.726 17.580 17.037 14.322 14.552 13.773 14.192 14.496 15.430 16.160 15.467 13.998 13.279 13.110 13.307 14.058 12.771 11.192 10.362 9.833 10.383 11.722 13.724 13.556 11.464 11.555 10.046 9.203 + 11.362 10.791 11.264 11.788 12.301 12.800 13.527 14.807 16.867 17.796 16.864 14.513 14.557 14.221 14.685 14.875 16.392 17.524 16.201 14.234 13.484 13.290 13.601 14.591 13.108 10.851 9.894 10.208 10.576 11.917 13.869 13.594 11.256 11.327 9.180 8.011 + 11.398 11.281 11.546 11.777 12.635 12.939 13.744 14.987 16.713 17.590 16.452 14.596 15.135 14.863 15.399 15.792 17.677 17.662 15.817 13.733 12.587 12.503 13.196 13.980 12.347 10.478 9.838 10.059 10.493 11.870 12.975 13.737 11.802 10.753 8.865 7.813 + 11.311 11.274 11.159 11.843 12.728 12.901 13.827 15.475 16.704 17.717 16.594 14.388 15.354 14.779 15.576 16.504 17.741 16.209 15.626 14.068 13.638 13.537 13.900 13.966 13.330 11.525 10.759 10.179 9.520 9.542 10.973 11.642 9.940 9.160 8.661 8.015 + 10.902 10.958 10.782 11.694 12.421 12.520 13.753 15.213 16.686 17.700 15.623 14.712 15.063 14.305 15.114 16.091 16.901 14.694 13.597 12.172 11.500 11.487 12.196 12.399 11.488 9.888 9.331 8.839 8.773 10.268 11.941 11.792 10.174 9.484 8.394 8.243 + 10.779 10.526 10.772 11.505 12.098 12.527 13.610 15.238 16.949 17.477 14.809 14.448 14.542 14.235 15.152 16.845 16.038 13.749 12.586 11.057 10.355 10.250 10.809 11.230 10.756 8.932 8.352 8.113 8.631 10.361 12.401 12.048 10.347 10.349 8.535 7.574 + 10.907 11.128 11.521 11.989 12.503 13.135 14.273 16.214 17.286 17.164 14.529 14.353 14.480 14.658 16.126 16.713 14.607 13.130 12.213 10.929 10.452 10.450 11.160 11.804 11.112 9.569 9.173 9.211 9.671 11.522 13.031 12.264 10.950 10.321 9.297 7.010 + 11.348 11.309 11.549 12.199 12.619 13.327 14.658 16.260 16.729 16.491 14.484 14.179 14.374 15.031 16.083 16.088 14.189 13.033 11.979 11.247 10.575 10.378 10.728 10.296 9.123 8.058 7.944 8.441 9.315 11.128 12.348 11.419 10.124 10.480 8.802 7.504 + 11.043 10.870 11.038 12.086 12.365 12.696 14.706 15.585 16.527 15.030 13.615 13.932 13.712 14.641 15.807 15.381 13.231 11.366 10.698 10.053 9.809 9.937 10.511 10.303 8.797 7.837 8.357 8.250 8.420 9.541 11.060 10.033 9.383 10.372 9.100 7.575 + 10.626 10.185 10.656 11.777 12.553 12.475 14.729 16.224 16.084 14.607 13.246 12.858 13.234 14.431 15.994 15.303 12.348 11.233 10.540 10.035 9.578 10.174 11.012 11.452 9.164 7.720 9.047 8.526 8.458 9.826 10.804 9.820 8.902 10.293 8.703 6.911 + 10.604 10.687 11.343 11.867 12.706 13.296 15.424 15.873 15.159 14.119 13.192 12.517 12.812 14.176 15.685 15.066 12.491 11.618 11.143 10.272 10.133 10.630 11.908 12.206 10.204 8.565 10.066 9.214 9.071 10.659 11.695 10.286 8.706 10.194 8.742 6.060 + 9.522 9.834 10.708 12.072 12.987 14.034 15.555 15.358 14.957 13.564 12.844 12.418 12.560 13.516 15.056 14.900 13.405 12.053 11.472 10.305 10.128 10.767 11.103 9.723 9.556 10.490 9.173 8.456 7.942 8.888 10.607 9.561 7.864 10.059 10.712 8.536 + 7.866 8.078 8.660 9.260 11.001 12.416 14.403 13.882 12.589 11.356 9.505 9.497 9.772 10.845 12.869 13.590 11.094 9.672 9.152 8.125 8.308 8.268 8.725 7.127 7.743 9.291 7.258 6.291 6.501 6.599 8.988 7.555 5.558 8.698 9.252 8.730 + 7.755 8.397 9.265 9.904 11.514 13.404 13.560 12.240 11.325 10.820 9.921 9.435 9.761 10.891 12.089 13.566 12.450 10.287 9.409 8.431 8.726 8.319 6.395 5.958 6.417 8.426 7.305 5.590 6.204 5.922 8.159 8.005 6.512 8.505 9.649 10.267 + 4.645 4.617 3.763 3.922 7.737 9.750 9.725 9.444 10.174 7.597 5.069 4.661 5.356 5.867 7.593 11.014 9.794 6.827 6.053 5.694 5.541 5.515 5.988 6.189 5.268 6.225 5.065 3.672 3.588 4.104 4.123 4.430 4.819 5.992 6.497 5.812 + 4.709 3.710 5.123 4.828 5.351 7.426 7.953 8.186 9.369 7.737 6.322 4.709 4.284 5.994 7.969 8.759 7.432 7.325 7.792 6.165 5.896 6.236 5.575 6.035 5.646 5.318 3.769 3.705 3.794 3.365 4.486 3.945 4.570 4.222 3.510 3.773 + 5.549 4.451 4.568 4.747 4.535 7.112 8.456 8.467 9.360 8.255 6.627 5.124 5.753 6.043 7.248 8.018 6.926 6.683 6.406 5.250 5.452 5.616 5.242 5.568 4.410 5.046 3.882 2.682 2.959 3.371 3.735 3.211 3.526 2.455 2.978 2.413 + 3.654 3.629 2.786 3.776 4.695 6.210 7.686 8.256 9.162 7.740 6.529 5.001 4.298 6.233 6.365 6.523 7.031 6.398 5.954 5.781 5.319 5.205 4.028 4.633 4.439 4.686 2.998 3.541 3.429 3.900 3.888 3.182 2.872 3.034 3.026 2.509 + 3.965 3.922 4.077 3.625 3.366 5.718 7.688 7.761 8.633 8.023 6.761 4.017 3.517 5.743 6.539 5.923 6.282 5.929 6.323 5.943 5.189 3.446 3.384 4.055 3.344 3.534 2.987 2.792 3.399 3.237 3.681 3.579 3.105 3.460 2.515 1.889 + 1.316 3.310 3.954 4.308 4.871 6.130 8.201 7.969 8.508 7.096 5.151 3.614 2.571 4.567 5.890 5.600 4.728 5.322 5.221 5.735 4.899 4.915 3.921 4.789 4.920 3.456 3.623 3.216 2.768 3.476 3.790 3.339 3.223 2.680 2.186 1.439 + 5.132 4.839 3.378 4.199 4.122 4.787 7.145 6.869 8.268 7.525 5.485 5.370 5.009 5.686 5.826 6.572 5.875 6.488 6.618 5.925 5.324 4.713 3.450 4.492 3.891 4.027 3.695 2.593 3.059 3.260 3.375 2.901 3.175 3.160 2.518 1.589 + 5.072 5.202 4.709 5.621 5.603 5.945 7.577 8.203 8.522 6.894 5.142 4.966 4.291 6.456 7.688 7.893 6.153 5.523 6.527 5.213 5.291 4.701 4.222 4.655 4.343 4.458 3.879 3.816 3.357 2.720 3.375 3.417 3.867 3.758 2.578 1.361 + 3.630 4.829 4.523 4.030 3.577 4.534 6.380 6.359 7.417 6.279 5.239 4.774 4.844 7.283 7.703 7.400 6.428 6.073 6.092 5.255 5.761 5.336 5.065 4.641 5.126 5.478 5.044 4.178 3.182 2.983 2.371 3.067 4.436 4.534 3.380 2.227 + 5.612 6.124 6.160 7.099 8.492 9.365 9.592 9.932 10.137 9.958 9.321 8.910 9.036 9.732 10.450 10.308 10.837 10.723 9.569 9.837 10.456 10.369 9.264 7.982 8.103 8.755 9.115 8.585 8.856 9.033 8.290 8.650 9.183 8.788 9.458 8.762 + 7.506 7.262 7.229 8.109 9.024 10.041 10.140 10.270 10.614 10.356 9.520 8.350 8.522 10.062 10.642 10.074 11.197 11.198 9.387 10.124 10.499 10.407 9.174 7.443 8.062 8.859 9.406 8.765 9.093 9.307 8.682 9.369 9.879 9.705 10.124 10.290 + 4.333 5.753 6.307 6.571 5.908 7.146 8.250 7.910 7.493 7.146 7.781 6.745 7.721 8.303 8.777 8.913 9.989 9.290 9.459 7.955 8.898 9.559 9.699 8.763 7.835 8.242 8.077 8.207 9.748 9.436 9.269 10.109 9.929 11.079 10.982 11.634 + 5.585 6.578 5.778 5.771 5.856 7.175 7.199 5.967 7.369 8.233 8.837 9.074 9.071 10.992 10.217 9.249 10.180 11.660 10.836 10.533 11.077 10.630 10.459 9.857 9.085 9.950 10.448 9.090 10.091 10.682 11.366 11.607 11.906 12.218 13.628 13.819 + 7.979 7.353 6.014 5.781 6.724 8.451 9.105 8.980 9.154 9.376 9.625 9.835 9.966 10.261 10.707 9.699 12.097 12.093 11.408 10.820 11.014 11.362 10.541 10.857 10.040 10.537 10.999 10.651 11.168 11.014 12.111 12.743 12.428 12.666 13.868 13.330 + 6.683 6.589 8.159 7.266 9.187 9.870 10.135 9.294 9.888 8.912 9.405 9.559 11.066 10.705 10.403 10.050 11.448 11.609 11.825 10.786 11.127 10.446 10.065 11.153 10.404 10.210 11.570 11.467 11.765 11.324 11.839 12.594 12.759 12.994 13.867 13.774 + 7.593 7.790 8.546 8.645 9.228 8.545 8.720 8.701 10.268 10.322 9.508 10.131 11.363 11.680 9.751 9.720 10.920 12.467 11.602 10.275 11.019 10.506 11.367 10.778 10.571 10.774 11.284 11.472 11.258 10.756 12.015 12.276 13.223 13.401 14.180 14.074 + 8.366 8.144 7.737 8.710 9.316 10.285 9.809 9.812 11.300 11.364 9.883 11.147 10.921 11.041 9.772 10.078 10.121 11.329 11.789 10.192 11.149 10.849 10.434 9.807 8.755 10.416 11.014 10.631 10.622 11.051 12.189 13.452 14.053 13.047 13.841 13.495 + 8.582 7.719 7.304 7.115 8.278 9.415 10.770 10.744 9.369 11.037 11.160 10.298 9.766 9.657 9.655 9.342 11.669 11.982 11.964 10.765 10.113 10.272 10.070 10.614 9.519 11.340 11.830 10.787 10.838 11.707 11.630 13.815 13.750 12.056 13.483 13.843 + 6.734 6.511 8.010 6.864 7.526 9.818 10.548 10.014 9.708 11.291 11.549 10.133 8.960 10.272 9.728 9.687 11.640 11.619 10.916 11.468 10.228 9.993 9.957 9.949 10.745 12.114 11.930 10.710 9.801 10.592 11.799 14.190 14.155 12.465 13.481 13.173 + 8.803 9.008 10.741 10.765 11.543 13.178 13.019 12.565 11.350 11.040 9.918 10.238 8.591 8.451 8.919 10.246 10.925 11.562 10.842 8.639 8.203 8.897 8.229 8.837 9.765 11.556 11.065 9.487 9.179 10.303 10.366 12.552 12.623 11.044 12.164 12.624 + 11.268 11.515 11.027 11.823 13.855 14.715 15.224 13.867 12.397 11.249 10.818 10.072 10.643 10.383 10.615 11.180 11.928 11.553 9.793 8.548 7.424 7.248 7.057 7.941 9.198 11.975 11.612 10.399 10.067 9.314 8.618 10.117 9.971 8.931 9.212 10.421 + 11.655 11.421 11.698 12.400 13.591 15.164 16.009 14.931 13.236 12.027 11.193 10.868 11.250 11.484 11.765 12.625 13.987 13.164 9.707 8.711 7.545 6.631 6.762 8.160 9.987 12.984 12.566 11.425 11.049 9.519 10.052 12.315 11.667 9.864 9.390 8.327 + 11.735 12.037 12.269 12.811 13.666 14.963 16.294 15.709 14.286 13.203 11.909 11.548 11.711 11.231 11.750 12.542 14.384 14.235 11.007 10.002 9.258 8.663 8.735 9.953 11.803 13.871 13.235 11.474 10.703 10.566 11.889 13.398 12.550 12.221 11.935 9.124 + 11.455 11.567 11.824 12.707 13.276 14.474 15.478 16.440 14.095 14.063 12.634 11.371 11.548 11.760 11.913 13.156 14.325 14.825 12.380 11.457 10.796 9.892 9.701 10.507 11.905 14.407 13.856 12.021 10.792 10.584 12.647 13.024 11.621 12.362 12.186 10.427 + 11.110 11.018 11.019 12.186 13.024 13.241 15.796 16.582 14.701 14.384 12.754 11.376 11.881 11.497 12.014 12.543 14.006 14.672 13.941 12.453 11.293 10.971 10.935 11.325 12.782 14.997 14.158 12.270 10.873 11.229 13.070 13.143 11.552 12.422 12.739 11.502 + 11.123 10.912 11.500 11.956 12.808 13.005 15.613 16.508 15.402 14.144 12.615 11.468 11.830 11.553 11.805 12.524 13.675 14.999 13.604 12.080 11.587 10.868 10.847 11.557 13.233 14.707 13.820 12.165 10.734 11.409 13.474 13.236 11.784 11.806 11.839 10.839 + 11.202 11.326 11.886 12.273 12.951 13.018 15.383 15.959 15.769 14.764 13.234 11.874 11.946 11.807 12.254 12.938 13.934 14.854 13.637 11.792 11.534 10.929 11.200 12.088 14.107 14.683 13.682 12.438 11.415 12.511 14.035 13.013 11.294 11.184 11.426 10.934 + 11.147 11.069 11.249 12.141 12.640 12.739 15.070 15.403 15.599 14.801 13.607 12.165 12.700 12.215 13.008 13.863 14.846 15.642 14.581 12.402 12.060 11.785 11.596 12.064 14.309 14.889 14.022 12.623 11.401 12.539 13.403 12.477 10.994 10.800 11.184 10.926 + 10.671 10.623 10.910 11.427 11.745 12.578 14.615 15.654 15.842 14.312 12.789 12.119 11.793 12.213 12.624 13.265 14.569 14.618 13.362 10.989 10.501 9.821 8.570 9.784 12.428 12.778 12.138 11.174 10.430 11.891 12.610 11.426 10.190 9.033 8.941 8.929 + 10.902 10.705 11.329 11.445 12.496 12.747 14.620 15.883 16.280 15.239 13.617 12.458 12.770 12.848 13.282 13.922 15.163 15.670 14.168 12.778 12.117 11.349 11.529 12.397 13.664 14.006 13.389 11.940 11.099 12.925 13.371 11.818 10.569 10.211 10.675 10.365 + 11.287 11.144 11.672 12.202 12.810 12.998 14.704 15.845 16.154 15.555 14.158 12.548 12.890 12.699 13.559 13.908 15.274 15.160 13.961 12.165 11.406 10.807 10.951 12.046 13.936 14.128 12.762 11.025 10.447 12.988 12.949 11.224 9.739 10.155 10.384 10.240 + 11.291 11.231 11.498 12.195 12.571 13.020 14.729 15.367 15.899 15.124 13.927 12.982 12.704 12.881 13.102 14.084 15.442 14.887 12.950 11.731 11.047 10.859 9.946 10.746 12.100 11.891 11.267 10.704 9.949 11.445 11.528 10.313 9.095 9.057 8.941 7.558 + 11.022 10.827 11.002 11.869 12.397 12.570 14.510 15.555 16.072 14.682 13.127 12.915 12.664 12.675 13.059 14.383 15.547 15.340 13.003 10.871 9.841 9.504 9.093 9.730 11.567 10.865 10.597 9.754 8.664 10.627 10.755 9.450 8.515 8.180 8.430 7.891 + 11.143 10.948 11.497 11.892 12.513 12.921 14.726 16.023 16.265 15.171 13.135 12.893 13.035 13.036 13.497 14.623 16.361 15.585 13.609 12.384 11.480 11.040 10.849 11.701 13.019 12.700 12.078 11.092 9.510 11.261 11.049 9.779 8.781 8.305 8.957 9.370 + 11.468 11.248 11.791 12.289 12.664 13.236 14.776 15.779 16.083 15.223 13.608 13.334 13.169 13.325 13.896 14.761 15.341 15.378 13.645 12.701 11.966 11.548 11.230 11.859 13.165 12.720 12.310 11.718 10.370 12.502 11.858 10.107 9.146 8.700 9.062 9.457 + 11.508 11.304 11.492 12.308 12.469 12.838 14.475 15.033 16.010 15.215 13.484 13.690 13.149 13.496 13.653 14.405 14.694 14.851 13.258 12.209 12.014 11.701 11.520 12.554 14.261 13.248 12.760 11.855 10.416 11.497 10.474 9.692 9.343 8.718 8.631 8.860 + 11.549 10.649 10.505 11.680 11.278 12.425 13.487 14.638 15.883 14.327 13.972 14.010 12.608 13.668 13.257 14.543 15.250 14.175 13.132 12.266 12.096 11.856 11.678 12.781 13.869 13.788 13.050 12.212 10.447 11.529 9.705 8.793 8.347 7.779 8.848 9.468 + 11.347 9.911 10.749 11.373 10.229 11.885 12.670 13.528 15.495 15.047 13.529 13.172 13.133 13.028 13.534 15.022 14.683 13.928 13.154 12.640 12.262 12.269 12.258 12.865 13.723 14.379 13.961 13.051 11.080 11.418 9.886 9.007 8.647 9.139 9.590 10.273 + 11.156 11.131 10.373 9.596 10.522 10.545 12.281 13.873 14.316 13.562 13.472 11.253 11.985 11.914 13.252 13.970 13.831 13.324 13.177 12.472 12.001 11.839 11.677 11.755 12.183 13.211 13.316 12.725 10.899 10.607 9.464 8.854 9.279 9.214 9.636 10.118 + 9.811 10.988 11.637 9.836 9.875 10.900 11.651 12.031 12.625 13.119 11.904 10.597 11.406 11.670 13.637 14.409 12.921 12.537 12.553 10.816 11.099 11.485 10.518 10.424 10.181 12.610 13.159 12.276 10.095 9.371 7.975 7.407 7.619 8.924 9.458 10.039 + 8.402 11.276 10.805 9.630 9.238 10.277 10.371 10.239 11.390 12.303 11.292 9.073 10.749 10.083 12.767 13.182 12.128 10.722 10.448 9.343 9.268 8.433 8.720 8.312 7.784 9.380 10.556 10.402 9.393 8.572 6.030 6.138 6.105 8.934 8.843 8.396 + 8.496 10.637 10.247 9.612 7.130 8.636 9.666 9.927 10.221 10.930 9.876 9.022 9.233 9.372 11.599 12.043 9.739 8.826 8.813 8.332 7.819 7.329 7.070 7.184 6.504 7.639 9.372 9.265 8.265 7.634 5.584 4.468 5.224 7.977 8.460 7.765 + 7.625 8.381 8.728 8.138 6.937 6.865 6.783 7.755 8.732 8.435 8.082 7.612 7.576 8.175 8.854 8.801 7.184 7.797 8.434 7.706 6.467 6.435 6.349 5.836 6.753 6.588 8.520 8.744 6.883 6.935 5.571 4.861 5.863 7.414 8.016 6.825 + 7.596 6.475 6.883 5.554 5.212 4.316 3.918 6.384 7.868 8.537 8.928 7.866 7.180 8.385 9.607 8.401 7.277 8.231 8.158 6.697 5.952 5.520 6.540 6.545 5.553 5.915 7.090 7.532 7.326 7.717 6.442 6.469 6.673 7.371 7.791 6.156 + 6.737 5.665 5.613 5.513 4.724 4.305 4.955 6.719 7.339 7.074 7.802 5.981 5.308 5.688 7.459 7.516 6.929 7.303 7.226 5.692 5.638 4.512 4.982 4.864 5.017 5.374 6.622 7.675 6.907 6.882 5.827 6.831 7.191 7.299 7.551 6.513 + 3.818 4.106 2.978 3.854 4.945 5.470 6.443 5.617 6.103 6.884 6.872 6.426 5.668 5.928 6.720 6.799 5.953 6.354 5.789 4.813 5.508 5.282 5.504 6.250 4.674 4.494 4.547 5.578 6.518 5.917 5.401 5.887 7.559 6.784 6.486 5.875 + 3.527 4.464 4.420 4.690 5.109 5.804 6.332 6.172 6.718 6.033 6.813 5.032 4.940 4.751 5.337 4.637 4.531 5.817 5.612 4.038 3.155 4.975 5.842 6.213 5.202 5.222 4.460 5.995 5.541 5.077 5.693 6.183 6.593 6.368 5.892 5.550 + 3.459 4.610 4.952 5.369 4.762 6.324 6.307 6.912 6.050 5.150 4.458 4.509 3.913 5.765 6.150 5.597 5.634 7.090 6.368 5.490 5.146 5.583 5.845 5.762 5.109 4.889 5.682 5.494 5.141 4.466 4.875 5.236 5.396 5.869 5.634 3.283 + 5.225 5.822 4.937 5.025 5.534 6.518 6.373 6.739 6.798 6.343 4.598 3.450 4.139 5.222 5.418 6.521 6.535 7.286 7.165 6.978 6.114 6.124 5.226 6.127 6.234 5.453 4.860 5.177 4.794 5.482 6.842 7.311 7.336 6.537 6.251 6.591 + 4.968 4.548 3.928 4.712 5.343 4.385 4.786 6.097 6.183 5.467 4.153 3.756 4.352 4.493 5.942 6.692 7.728 8.620 8.872 7.031 5.794 5.412 4.864 6.254 5.925 6.152 5.908 5.581 4.839 5.528 6.704 7.079 7.183 6.767 5.980 6.435 + 5.082 4.805 4.869 4.516 3.986 4.509 5.700 5.529 4.832 5.128 5.111 4.395 4.868 4.816 6.523 6.418 6.497 8.220 8.067 7.375 6.106 5.870 5.309 5.918 5.719 5.031 4.595 4.962 4.690 5.292 6.220 6.931 7.073 6.066 5.512 5.866 + 4.869 5.263 3.500 3.116 4.288 5.788 4.577 4.152 5.224 5.602 4.773 4.093 3.412 4.899 5.872 5.728 5.555 5.289 5.557 5.371 4.835 5.192 5.652 6.183 4.856 4.598 4.196 4.007 4.051 4.502 4.200 4.268 4.114 4.371 3.918 3.554 + 6.044 5.348 5.765 5.690 5.245 6.736 7.145 5.742 5.659 6.937 5.773 6.290 6.048 5.243 6.328 6.757 7.415 7.878 7.727 7.545 7.188 6.486 6.799 6.802 6.470 6.816 7.138 6.776 6.699 7.361 7.579 6.931 6.090 6.302 6.279 5.912 + 7.288 8.083 8.719 9.084 9.112 9.319 9.648 9.557 9.628 9.630 9.199 9.377 9.518 9.525 9.800 10.309 10.806 11.430 11.610 11.189 10.258 9.550 9.143 9.002 9.410 10.242 10.511 9.680 9.959 10.971 11.641 10.394 9.633 9.498 9.865 10.135 + 5.455 6.301 7.177 8.494 6.962 6.842 7.170 7.472 7.615 7.072 7.001 6.771 6.842 7.218 7.020 7.850 8.536 9.499 9.764 9.614 8.322 7.356 6.917 6.649 7.054 7.951 8.779 7.352 7.219 8.637 9.749 7.807 6.915 7.151 7.554 7.845 + 4.723 6.783 8.219 8.923 7.702 7.357 6.397 5.733 4.706 7.604 7.419 7.948 7.273 6.372 7.088 7.613 7.805 9.131 10.376 9.276 8.132 7.637 6.909 7.920 8.366 8.128 8.033 7.428 7.142 7.828 7.963 8.685 6.446 6.480 7.100 6.677 + 5.738 6.357 6.951 7.597 6.990 8.038 7.107 7.855 8.274 8.537 7.697 7.840 7.932 8.233 8.876 8.762 9.023 8.341 10.726 10.388 8.809 7.834 7.111 7.489 7.680 7.920 9.611 8.387 7.611 7.167 8.369 8.881 7.292 6.491 7.000 7.608 + 4.239 5.553 7.222 7.984 7.204 7.591 8.715 8.206 8.146 7.177 6.943 8.524 9.377 9.089 8.151 9.317 9.592 9.059 9.759 10.323 10.378 8.787 7.942 8.660 8.253 8.039 9.053 8.220 7.387 8.247 9.289 8.937 8.210 8.227 8.475 8.473 + 4.867 7.147 8.017 8.230 7.320 6.695 7.956 7.736 7.344 8.640 8.629 8.076 8.435 7.940 8.179 9.997 10.277 10.692 11.358 9.526 10.297 9.537 8.676 9.578 8.929 8.944 8.551 8.013 7.697 8.725 9.881 9.606 9.600 9.179 9.297 8.764 + 6.237 6.467 6.500 6.210 7.092 7.828 8.680 8.385 7.276 8.489 8.962 9.429 9.826 8.883 9.273 8.051 9.977 9.270 10.262 11.729 11.515 8.978 9.113 8.858 9.260 10.075 9.696 8.909 8.693 8.894 11.049 11.197 9.610 8.971 9.547 8.841 + 5.139 5.029 5.535 7.885 9.401 9.617 8.884 8.023 8.053 8.056 8.826 10.068 8.927 9.036 8.912 9.229 9.256 9.835 10.685 12.081 12.239 10.400 8.910 8.972 9.498 10.058 9.946 8.877 9.395 8.862 10.735 10.843 9.789 9.613 9.341 8.399 + 4.951 5.577 6.659 7.588 8.415 8.366 9.806 9.472 7.617 7.981 9.093 8.897 9.558 8.580 7.175 9.255 9.257 9.404 10.054 11.924 11.873 10.294 9.018 9.289 9.592 10.030 9.441 9.519 9.080 8.480 9.904 11.510 10.377 9.982 9.474 10.110 + 4.305 5.676 7.540 7.842 7.813 9.306 8.794 8.019 6.799 8.488 8.522 8.363 7.828 7.707 6.671 8.847 9.027 10.238 10.971 11.759 12.205 10.185 9.775 9.508 8.976 10.810 11.382 9.323 9.243 8.610 9.987 10.653 9.888 9.214 9.974 9.196 + 6.555 5.486 6.897 6.800 8.938 9.893 9.514 8.090 8.993 9.515 9.482 9.785 9.005 8.160 8.832 8.016 8.262 9.836 10.332 11.955 11.948 10.295 9.770 9.424 8.695 10.046 10.791 10.017 10.003 9.758 10.500 10.886 9.995 10.408 10.354 10.152 + 6.482 5.242 5.892 7.384 7.630 7.672 8.539 8.840 8.244 7.578 9.404 9.889 9.733 9.018 8.369 7.553 8.630 10.992 11.071 12.189 12.541 10.080 10.013 9.769 9.621 11.895 11.416 10.182 9.871 10.143 12.084 11.285 9.324 9.833 11.269 10.429 + 6.389 6.091 4.579 5.660 8.065 8.978 9.398 8.828 7.548 8.369 9.253 9.581 9.356 8.772 8.429 8.515 9.076 10.086 11.173 12.354 11.395 10.084 9.976 9.683 9.884 11.288 11.414 10.220 9.230 10.367 11.422 11.067 10.429 10.394 11.019 10.474 + 5.970 5.297 5.582 6.190 7.121 9.029 9.442 9.693 8.093 9.058 7.420 7.166 8.505 8.460 8.619 8.604 9.253 9.751 10.035 11.746 10.977 10.413 9.083 9.980 10.432 9.370 10.474 10.140 9.262 8.854 10.671 11.399 11.075 10.297 9.786 9.588 + 5.099 5.358 5.622 5.775 6.183 6.717 8.527 9.364 8.550 8.618 8.401 7.501 9.054 8.054 8.215 7.792 8.878 9.870 9.018 11.068 10.573 10.078 9.613 9.066 10.700 10.262 10.489 9.498 8.653 8.826 10.316 11.600 11.141 9.730 8.821 9.171 + 4.457 5.037 4.510 5.751 7.747 7.453 9.556 10.440 8.988 7.800 7.640 8.150 8.168 7.019 8.021 8.161 9.216 10.011 10.580 10.970 10.550 10.330 9.283 10.027 8.713 10.467 11.579 10.170 9.283 10.301 10.989 11.516 10.634 9.689 9.422 8.590 + 5.485 5.827 6.897 8.611 9.539 8.040 9.530 10.318 7.868 8.594 8.839 7.283 7.821 6.100 6.792 7.955 9.565 9.834 10.530 11.732 10.851 10.096 9.529 9.769 10.422 10.732 10.661 10.752 8.908 9.740 11.086 11.367 10.410 10.575 10.930 9.778 + 3.751 6.178 7.136 7.836 7.934 7.593 9.528 10.288 8.301 9.215 8.193 7.331 6.669 6.728 5.383 7.859 9.275 11.151 11.114 12.023 11.527 10.724 10.149 10.363 11.360 11.494 11.208 10.836 9.597 9.845 10.595 11.063 10.043 10.002 10.263 9.264 + 4.628 3.366 4.001 6.842 8.523 7.944 9.638 9.647 8.235 8.746 8.189 8.368 7.639 6.772 6.501 7.726 9.047 10.395 10.851 11.782 11.157 10.509 9.498 10.954 11.445 10.838 10.709 10.788 10.541 11.176 11.605 11.861 10.242 10.315 10.943 9.306 + 4.970 5.538 5.044 6.815 7.000 7.983 8.713 7.698 8.885 9.777 8.902 8.567 7.127 8.219 7.404 8.182 9.103 9.043 11.015 11.016 11.234 9.639 10.028 10.324 9.928 9.745 11.148 10.004 10.257 11.472 12.213 11.677 11.373 10.349 10.742 10.151 + 5.620 5.315 5.814 6.327 6.118 6.249 8.864 9.361 8.938 9.870 8.054 8.589 7.280 7.066 7.774 7.762 9.883 10.349 10.557 9.624 10.427 9.088 8.637 9.138 9.515 9.854 10.341 9.879 9.473 11.144 12.451 11.271 11.218 10.542 10.855 9.584 + 3.800 5.081 7.098 6.847 6.454 7.862 9.566 8.651 8.644 9.581 6.887 7.572 7.909 7.271 7.487 7.162 9.821 10.693 12.021 11.849 11.462 9.708 8.859 10.222 9.219 9.986 11.394 10.967 10.335 10.357 11.440 11.096 11.144 10.447 11.280 10.545 + 4.586 5.066 6.484 7.998 7.123 7.210 9.294 9.585 8.963 9.960 7.699 7.862 8.446 8.232 8.758 9.099 9.480 10.129 11.655 13.005 11.632 9.880 9.017 9.579 9.414 9.506 10.913 10.516 9.337 10.095 10.847 11.424 11.462 10.465 11.084 10.385 + 8.480 8.451 8.588 7.822 6.959 9.073 9.889 10.205 10.397 10.931 9.809 9.452 8.667 9.470 8.720 9.350 9.998 11.442 11.973 12.127 11.233 9.893 10.381 10.132 10.570 10.702 10.501 10.475 10.222 11.098 12.936 12.506 11.841 11.320 10.903 9.242 + 8.289 7.801 7.417 7.156 8.132 8.349 8.841 9.530 10.017 10.864 9.744 8.576 8.094 8.573 7.991 8.542 10.494 11.339 11.401 12.297 12.264 11.066 11.255 11.210 10.693 9.684 11.565 10.931 10.067 11.220 13.129 12.018 12.166 11.878 10.543 10.036 + 3.468 4.665 7.154 8.689 8.031 8.810 10.559 9.535 9.279 9.886 7.237 7.726 6.970 7.538 8.065 8.610 9.697 10.218 12.020 13.730 13.698 11.605 9.775 9.828 10.575 10.561 10.624 9.918 9.554 11.612 12.416 11.901 12.365 12.711 10.990 10.402 + 5.692 4.975 4.627 7.116 6.819 8.298 10.276 8.716 8.687 8.979 7.444 7.051 6.704 6.491 7.271 7.772 8.158 10.329 11.158 13.113 12.483 9.794 10.142 10.229 10.493 11.093 11.514 9.922 10.641 11.538 12.504 11.795 12.815 12.635 11.663 10.090 + 5.124 5.686 5.243 5.720 7.175 8.878 10.687 9.111 8.037 8.387 6.871 6.374 5.667 6.195 7.526 7.743 8.316 10.158 11.481 11.863 12.108 10.942 9.975 9.803 10.251 10.605 11.364 9.725 9.460 10.173 11.988 11.140 11.289 11.182 10.835 9.427 + 6.199 6.203 6.955 7.716 7.615 9.585 11.500 10.131 7.403 7.458 7.723 7.277 6.311 6.949 8.166 8.587 7.818 9.142 10.978 12.439 12.399 11.094 9.199 9.020 9.724 9.923 9.733 9.070 8.285 9.263 11.860 11.237 10.632 9.681 9.792 8.690 + 5.451 5.601 5.178 5.747 6.520 10.216 11.657 9.766 6.961 5.879 6.280 6.996 6.931 6.500 7.021 8.481 9.815 9.414 10.532 12.789 12.170 10.773 9.180 9.454 8.664 8.513 10.080 9.349 8.107 7.643 9.945 10.112 10.669 9.939 9.508 8.429 + 2.803 5.721 5.803 6.893 5.404 10.449 11.607 9.086 5.794 5.940 6.313 6.204 5.834 5.946 5.161 7.948 9.116 9.788 11.062 11.721 11.444 9.680 8.860 9.312 9.163 9.252 9.737 8.936 8.787 8.415 9.928 10.723 11.616 11.568 10.545 9.822 + 4.868 7.216 7.099 6.880 7.321 10.771 11.806 9.437 7.048 5.553 6.019 6.422 4.700 4.979 4.908 7.627 8.785 8.948 9.882 12.285 12.114 10.012 9.199 9.521 8.657 9.294 8.629 7.987 8.609 9.114 10.531 10.773 11.053 11.310 10.553 9.561 + 5.495 6.920 7.645 7.318 7.144 10.962 11.725 9.128 7.441 7.326 6.822 7.498 6.756 5.783 6.038 7.525 8.225 8.907 10.443 11.470 10.758 9.634 8.419 9.703 9.552 9.305 9.563 7.945 7.461 9.935 11.893 10.952 10.490 11.542 10.424 9.600 + 4.758 6.753 7.924 8.315 7.245 10.544 11.208 9.136 6.174 6.313 6.405 6.278 5.506 6.314 4.890 5.764 7.832 9.023 9.666 12.049 11.392 9.443 7.915 8.730 8.671 7.911 7.990 8.086 7.748 9.548 11.770 11.011 11.042 11.008 10.057 9.772 + 5.493 6.647 7.405 7.873 6.950 10.319 9.761 7.090 6.705 6.104 6.731 6.047 6.107 6.081 6.376 7.154 8.430 9.235 9.780 11.338 9.993 9.014 8.098 8.500 8.212 8.337 7.761 7.405 7.859 8.660 11.435 10.498 9.460 10.254 8.373 7.546 + 9.203 7.527 7.455 6.172 7.415 10.091 9.727 7.497 8.083 6.560 5.485 5.701 7.258 6.579 8.166 9.464 8.609 9.133 9.811 10.730 9.688 8.023 6.968 6.852 7.864 8.301 8.126 7.868 8.043 9.015 9.997 9.693 9.672 9.896 8.866 7.729 + 10.035 9.368 7.412 7.484 9.162 10.155 7.808 7.484 7.177 5.317 6.279 6.745 6.595 6.078 7.107 8.178 9.330 8.404 9.864 9.636 8.914 8.093 6.878 6.597 7.747 8.352 8.744 8.052 8.025 8.540 9.740 8.989 10.532 10.196 8.858 8.480 + 7.163 6.372 5.914 7.028 8.679 10.052 8.951 8.078 5.771 4.160 5.993 6.347 4.266 5.775 6.119 7.334 7.038 8.615 9.900 10.574 9.259 8.707 7.175 6.393 6.637 6.489 7.873 8.072 6.261 9.255 10.760 8.887 10.048 10.309 9.669 9.231 + 6.754 5.537 6.005 7.045 7.805 8.870 8.295 7.279 6.412 4.727 4.181 5.190 4.754 3.471 5.244 5.825 7.125 7.736 8.065 9.545 8.753 7.084 7.280 6.261 6.970 7.164 7.298 6.127 6.456 6.980 8.671 9.100 9.619 10.455 9.130 8.872 + 7.769 6.768 7.278 8.100 7.151 8.116 7.990 7.157 5.269 4.955 5.631 6.140 6.055 4.876 4.980 6.116 7.129 8.338 10.009 10.817 10.120 8.199 6.972 6.512 7.189 7.260 7.655 6.309 5.699 7.821 8.747 8.296 9.033 10.733 9.144 8.839 + 7.583 7.808 7.267 6.492 5.523 8.139 7.851 6.436 5.710 5.418 5.861 5.401 5.870 5.711 5.411 5.972 7.376 8.651 9.717 10.709 10.779 7.164 6.128 6.959 6.812 8.149 8.265 6.394 5.637 7.035 8.204 8.193 8.095 8.568 7.782 6.682 + 8.693 9.079 8.448 6.367 6.263 7.641 6.272 6.822 6.733 5.427 4.067 5.081 4.993 4.963 4.820 5.699 6.982 7.000 8.130 9.054 8.775 7.296 6.002 5.531 6.591 7.579 6.996 6.675 6.896 6.705 7.880 7.913 8.307 7.804 6.884 6.503 + 7.398 5.952 5.166 6.833 6.808 7.864 6.639 5.007 4.756 4.705 3.912 5.602 6.196 4.601 5.289 6.113 7.155 7.948 8.301 8.778 7.900 6.914 6.064 6.225 6.544 6.822 6.279 6.255 6.675 6.340 7.063 7.158 7.855 6.927 6.176 6.590 + 6.748 6.631 6.383 6.395 7.264 8.010 6.400 3.408 4.426 5.163 4.489 4.451 4.711 3.735 4.799 5.282 5.197 6.302 8.208 9.958 8.833 6.338 5.226 5.673 5.784 6.191 5.906 5.263 5.467 5.578 5.896 5.587 6.288 5.553 5.485 6.355 + 6.524 5.826 4.309 3.904 5.377 7.420 6.451 3.386 3.383 2.893 4.797 4.876 4.718 3.303 3.374 4.945 5.246 6.075 7.565 9.535 9.001 6.071 5.233 4.762 3.733 4.837 5.140 4.463 4.456 5.489 5.987 6.716 6.306 6.186 6.277 6.335 + 11.405 11.715 11.874 12.265 12.470 12.592 12.569 12.382 11.857 11.146 10.463 9.777 9.123 8.409 8.030 7.533 7.343 7.327 7.552 8.447 7.647 7.111 7.442 7.575 7.061 6.552 5.310 4.991 4.548 5.786 5.736 5.678 6.173 6.693 6.116 5.623 + 13.658 13.376 13.477 14.395 14.482 14.349 14.621 14.521 13.767 12.670 11.726 11.191 10.699 9.485 9.359 9.014 8.164 8.729 8.758 9.071 8.864 8.655 9.418 9.361 8.922 8.428 7.031 6.847 6.457 5.680 5.566 5.394 6.618 7.018 6.855 5.997 + 9.223 8.155 9.390 11.133 11.808 13.337 13.458 12.925 11.422 10.622 9.647 9.656 7.951 7.044 5.480 3.957 5.389 5.507 5.778 5.316 5.121 4.175 4.788 4.968 4.648 5.758 4.486 4.074 4.038 4.938 4.700 4.144 5.110 5.976 5.882 4.571 + 10.033 9.392 9.035 8.207 9.531 10.239 10.444 11.010 10.893 10.128 8.774 7.323 5.555 5.532 4.819 3.561 2.966 4.045 4.956 5.464 4.415 4.027 5.071 4.984 3.561 3.841 5.586 6.223 5.421 5.279 5.631 5.309 5.911 5.368 5.170 5.088 + 9.705 9.001 8.920 7.510 9.317 9.783 8.684 8.238 7.645 7.219 7.367 5.753 5.997 4.796 3.927 3.381 3.052 2.931 3.462 4.899 4.390 5.131 4.121 4.518 3.428 4.090 5.589 5.585 5.099 5.390 5.056 5.344 5.706 5.808 5.072 5.209 + 7.991 6.509 6.991 6.100 6.861 6.590 7.281 8.247 6.336 5.698 4.176 3.470 3.797 3.328 2.466 2.801 4.135 4.048 3.608 4.574 4.053 4.246 3.741 4.184 3.599 3.704 4.707 5.107 4.871 4.803 4.649 4.148 5.456 6.001 5.500 4.600 + 7.361 6.272 6.885 6.549 6.322 6.195 5.239 5.572 5.920 4.767 4.069 5.095 4.677 4.276 3.922 3.689 4.267 3.800 3.823 3.863 4.125 3.476 4.296 3.592 2.187 2.282 4.339 4.371 3.740 3.981 4.799 5.002 3.898 4.964 4.322 3.198 + 7.202 6.310 6.149 6.847 5.310 4.758 3.685 4.880 5.654 5.774 5.263 3.830 2.462 4.453 4.419 3.744 4.450 4.606 4.363 4.106 4.036 4.834 4.647 3.520 2.900 3.286 4.701 4.808 4.285 3.773 4.123 4.407 4.024 4.841 3.870 2.176 + 7.679 7.766 6.802 7.265 6.976 5.150 6.262 6.157 5.034 4.762 5.013 3.632 3.586 4.916 4.794 4.210 3.732 4.804 4.509 3.622 4.492 5.696 5.121 3.898 3.887 3.403 4.130 4.188 3.737 4.038 4.792 5.093 5.035 5.705 3.948 2.623 + 6.536 6.137 6.065 5.489 5.969 5.243 6.184 4.544 5.390 5.581 5.658 4.476 4.055 5.394 5.155 4.044 2.577 4.331 4.657 5.620 4.925 5.218 4.845 3.583 3.507 4.411 4.368 4.315 4.843 4.154 4.425 5.507 5.415 5.645 4.307 3.499 + 7.084 5.768 4.793 6.043 5.661 6.699 6.545 5.427 4.920 5.044 4.657 5.110 3.775 4.070 4.695 3.230 3.495 4.424 4.094 5.214 5.812 4.908 4.689 4.567 3.979 4.157 4.076 4.790 4.827 4.218 5.115 4.991 5.171 5.165 4.408 3.255 + 5.990 5.845 4.978 5.487 6.244 6.895 6.162 5.567 5.092 5.095 5.666 6.201 5.377 3.965 4.552 4.616 4.203 5.237 5.056 4.888 5.749 4.802 4.970 3.633 3.705 3.146 4.390 5.570 4.652 4.057 4.109 4.158 5.064 4.699 4.336 4.118 + 8.239 7.927 6.749 6.498 8.668 8.211 7.445 8.671 7.545 5.242 6.214 6.559 5.203 4.462 4.016 4.365 5.096 5.947 5.545 4.941 5.798 4.591 4.275 4.893 4.438 3.166 4.153 4.755 4.337 4.327 4.863 4.728 4.576 4.806 4.729 4.694 + 6.658 7.711 6.829 8.186 9.556 8.528 7.706 8.456 7.992 7.836 5.987 4.145 5.011 4.354 4.198 4.842 4.773 5.087 5.550 5.589 5.282 4.788 4.501 4.504 5.211 4.795 4.388 4.511 4.108 4.251 4.774 5.126 4.491 4.428 4.853 4.030 + 7.803 8.138 7.718 7.480 8.441 8.525 8.276 7.938 7.240 7.339 5.270 5.864 5.929 5.291 4.616 4.671 5.082 5.591 6.082 5.790 5.773 4.896 4.719 4.268 4.828 3.660 4.827 4.912 3.836 3.556 5.439 5.669 5.573 4.638 4.662 3.861 + 11.313 10.844 9.905 10.404 11.026 10.985 10.535 10.289 9.680 8.798 8.277 8.699 9.359 9.326 8.824 8.486 9.274 9.557 8.676 6.893 6.118 5.397 5.873 5.260 5.570 4.088 5.238 4.917 5.107 5.676 5.676 6.928 6.862 6.626 5.752 4.489 + 11.589 11.012 10.158 9.937 9.905 9.777 8.683 8.398 8.286 8.308 7.346 6.248 7.073 7.496 7.405 7.579 7.747 7.647 6.825 5.442 4.806 5.474 5.704 5.652 5.969 5.444 4.711 5.565 5.527 4.789 4.399 5.822 5.781 5.502 5.383 3.606 + 3.778 5.187 5.716 6.740 7.792 6.646 7.050 6.838 6.843 6.085 5.140 5.019 3.443 4.768 5.098 4.740 5.471 5.508 4.497 4.562 4.110 4.967 5.232 5.572 5.350 4.987 5.248 5.750 6.194 6.012 4.950 5.388 5.935 5.587 5.384 3.628 + 4.456 5.012 6.180 8.394 7.639 7.794 8.282 7.406 6.579 6.844 6.023 5.984 5.879 5.862 4.710 6.787 6.941 7.338 6.192 5.652 7.047 6.352 6.632 7.627 6.685 6.969 6.952 7.914 7.751 7.237 7.103 7.413 7.344 7.496 7.002 6.208 + 6.593 6.872 7.303 8.779 8.578 7.212 7.882 8.400 7.399 6.477 5.983 6.587 5.956 6.998 6.029 5.442 7.766 7.705 7.368 6.978 6.970 6.973 7.877 8.442 7.815 7.777 7.238 9.448 9.666 8.576 7.947 8.534 8.721 8.120 7.908 7.334 + 6.777 6.744 6.426 6.662 7.519 7.602 9.065 8.480 7.131 6.656 5.903 5.669 5.357 6.613 7.091 7.539 6.651 7.408 7.332 7.037 7.543 6.373 7.483 8.334 7.459 7.848 7.155 7.067 7.019 7.345 7.821 8.336 8.112 7.295 7.521 6.731 + 6.694 5.456 6.168 8.478 9.248 9.373 9.533 8.182 6.658 5.660 5.332 6.191 6.870 6.112 6.654 6.532 6.698 5.862 6.996 7.033 7.678 6.867 5.940 6.451 7.679 7.511 8.237 7.996 7.594 7.134 7.658 7.565 7.388 8.445 8.011 7.413 + 8.703 9.360 10.169 10.523 10.461 10.633 10.076 9.976 7.831 6.372 6.330 6.272 6.909 6.154 6.442 7.054 6.920 6.779 7.843 7.635 7.683 7.158 8.293 8.024 8.885 8.304 8.710 9.470 8.758 9.188 9.154 9.507 8.574 8.867 8.033 8.598 + 7.717 8.829 9.477 9.620 8.089 9.252 8.223 8.242 7.278 6.638 7.307 6.911 7.035 7.430 6.926 8.271 8.300 7.554 8.357 7.842 7.660 7.360 7.105 8.111 8.473 8.877 9.980 10.903 10.367 9.656 9.193 9.426 9.816 9.300 8.604 8.725 + 10.695 10.241 9.273 10.056 10.861 9.422 8.285 8.492 8.128 8.413 7.299 6.555 6.303 7.470 7.848 8.754 8.753 9.716 8.962 8.683 7.043 7.122 7.825 7.599 9.211 9.666 7.902 9.388 9.532 9.197 10.012 8.348 8.792 9.551 9.630 8.467 + 10.993 9.110 9.297 10.303 11.108 10.675 8.491 7.121 7.507 8.240 8.033 6.971 7.518 7.754 8.897 8.148 9.161 9.584 10.100 8.991 7.253 6.663 5.969 6.556 8.075 8.143 7.317 7.981 7.790 8.138 7.613 7.055 7.303 8.116 7.636 7.155 + 9.304 7.336 8.772 9.892 9.524 8.559 6.377 6.698 6.701 6.373 6.429 5.927 6.761 7.967 7.381 7.098 8.876 8.670 7.717 6.340 5.581 4.680 5.576 6.443 6.569 5.173 4.576 5.638 4.892 3.691 4.568 5.234 4.842 5.548 4.159 3.701 + 9.542 9.880 10.001 9.820 8.135 7.203 5.423 4.108 6.258 6.686 6.564 6.270 6.150 6.566 6.683 6.073 6.757 6.903 5.284 4.977 4.135 3.871 5.105 5.195 4.719 2.553 4.108 4.472 4.217 3.455 3.218 4.423 4.393 4.149 4.364 3.444 + 6.542 5.861 5.144 5.142 4.702 3.161 2.800 2.588 2.952 3.345 2.724 2.662 2.979 2.990 3.506 3.423 3.210 4.758 3.814 3.911 3.946 3.067 4.015 4.502 4.135 3.251 3.891 4.246 3.614 3.443 3.522 3.651 4.028 4.262 4.729 3.540 + 3.753 4.411 3.915 4.644 4.645 2.852 1.639 2.837 1.731 2.079 2.387 3.480 2.145 2.604 3.718 3.286 3.754 4.617 2.853 3.514 4.002 3.744 4.413 3.898 3.378 2.650 2.911 5.020 5.739 4.962 4.029 4.445 4.432 3.092 3.533 3.283 + 4.264 4.701 4.251 4.424 4.207 3.559 3.136 3.419 2.713 3.310 3.345 4.558 3.253 3.129 3.176 3.315 4.154 3.763 3.807 3.950 3.811 3.875 4.755 4.287 4.560 3.485 3.331 4.785 5.220 4.887 3.869 4.197 4.227 3.599 3.756 3.224 + 4.023 3.893 3.473 4.033 4.084 3.148 2.639 2.859 2.770 2.675 3.064 3.613 3.008 3.549 2.875 3.323 3.762 3.769 4.813 2.624 3.874 4.481 4.314 3.369 3.071 3.427 2.234 3.299 3.573 3.712 3.879 4.436 4.136 4.058 4.108 2.835 + 6.604 5.920 5.672 5.609 4.730 5.110 4.660 4.043 4.276 3.647 3.763 3.981 3.114 3.866 3.756 2.774 3.289 4.544 4.331 3.349 4.519 4.419 3.394 4.489 4.405 4.380 3.358 4.156 3.993 3.590 3.477 3.659 2.979 3.364 2.362 1.616 + 4.182 5.192 5.321 5.251 3.784 3.841 3.769 3.480 3.005 1.817 4.121 4.137 2.159 3.197 3.048 1.976 2.667 4.680 3.943 3.035 3.408 3.222 3.533 4.430 4.744 4.122 4.690 4.178 3.757 3.281 3.439 3.487 3.558 3.664 2.392 1.310 + 5.004 6.342 5.546 3.756 3.221 4.331 4.719 3.034 1.498 1.540 3.635 4.588 3.726 3.037 3.311 3.026 3.104 3.839 3.889 3.870 3.255 3.379 3.344 2.776 4.049 4.051 4.573 4.094 3.692 3.125 3.377 4.019 4.217 4.200 3.197 2.071 + 6.161 6.133 4.598 3.475 2.749 2.381 4.359 4.506 2.953 2.145 2.210 3.058 2.287 2.637 3.178 2.743 3.336 3.869 4.236 3.679 3.523 1.971 3.276 3.253 4.219 4.718 4.008 3.519 3.913 3.828 3.409 3.932 3.991 4.327 3.590 3.234 + 5.607 5.125 5.358 4.832 3.176 4.650 4.612 2.848 3.232 4.240 4.521 3.212 2.166 3.451 4.141 2.677 4.167 4.005 3.429 3.521 3.899 2.803 3.559 3.908 4.353 3.242 2.989 3.532 4.292 3.396 3.982 4.522 5.011 3.923 2.593 2.765 + 4.859 5.390 4.611 3.952 4.051 4.537 5.369 4.380 4.446 4.245 4.561 4.274 3.559 4.663 5.195 4.876 4.072 4.658 4.320 4.658 3.281 2.766 2.523 3.871 4.403 3.572 4.012 4.059 4.042 3.607 3.837 3.728 3.876 3.335 2.714 2.511 + 4.305 4.988 5.239 3.856 3.816 5.121 4.484 4.175 3.985 3.647 3.596 4.019 4.492 4.815 4.906 4.900 3.897 3.445 4.052 4.903 3.941 4.008 4.047 4.006 4.200 3.699 4.533 4.589 4.592 4.620 4.011 4.273 4.362 3.501 3.563 2.431 + 5.990 3.433 4.669 5.562 4.960 5.519 5.307 4.617 4.553 5.165 4.944 4.382 3.771 4.509 4.594 4.142 5.048 4.933 4.943 5.909 5.484 4.672 4.044 3.725 3.135 3.362 3.892 4.331 3.895 3.746 3.990 4.022 4.318 4.348 3.652 2.835 + 6.373 6.274 5.879 4.793 5.427 6.732 6.308 5.030 4.709 5.495 5.659 4.671 4.126 3.438 4.479 3.620 4.919 5.110 6.325 5.997 5.697 4.418 4.349 4.837 4.054 3.712 4.091 4.760 4.045 4.555 5.378 5.100 4.298 4.631 4.340 3.111 + 5.354 5.954 5.946 4.909 4.008 5.831 6.501 5.339 5.136 3.795 2.863 3.603 3.931 3.461 4.056 5.191 5.245 5.792 6.492 6.662 6.859 5.567 4.718 3.964 4.570 4.303 3.573 4.685 4.376 4.280 5.603 4.975 4.181 4.302 4.201 2.949 + 5.823 5.142 4.584 4.297 4.918 6.352 5.782 5.875 5.103 2.968 3.295 4.248 4.087 4.077 2.989 5.183 4.966 5.274 6.839 7.204 6.622 5.098 4.975 4.580 4.265 5.276 4.254 3.934 4.049 4.444 4.968 4.531 4.484 5.096 3.846 4.139 + 6.139 5.342 5.809 5.921 4.668 5.609 6.386 6.800 6.318 5.787 5.366 4.261 4.014 4.256 4.584 3.941 4.213 6.510 7.363 7.772 7.578 6.432 4.943 4.876 4.751 4.998 4.653 4.518 4.385 5.379 5.622 4.838 4.568 5.368 4.432 3.730 + 6.454 6.500 6.019 6.550 5.147 5.880 6.315 4.899 6.029 5.556 4.508 4.166 4.551 5.289 5.577 3.965 5.941 7.064 8.315 8.550 8.359 7.298 5.653 5.314 4.736 5.740 4.368 4.162 3.791 5.157 6.004 4.362 4.404 4.732 4.566 3.925 + 6.023 6.223 5.879 4.631 5.187 6.050 6.125 5.524 4.943 6.239 5.059 3.501 4.655 5.277 5.539 4.100 6.045 7.810 8.360 9.574 9.580 6.214 6.303 5.370 4.964 5.835 5.490 4.147 4.343 5.260 4.802 4.555 4.426 5.104 4.324 3.384 + 5.486 4.683 4.463 4.774 5.145 4.721 6.326 6.571 4.477 5.581 5.864 5.618 4.937 5.136 5.452 5.924 6.706 7.221 7.675 9.176 8.560 7.312 6.086 5.442 4.965 4.265 4.730 4.976 5.313 5.981 5.946 4.890 4.794 5.138 4.414 3.826 + 4.482 4.427 4.300 4.986 6.053 6.004 5.496 5.093 4.491 5.025 4.843 4.697 3.912 3.754 3.953 5.002 5.140 7.393 8.468 9.562 9.580 6.374 5.606 5.571 5.108 4.973 4.549 4.624 4.364 5.476 5.377 5.334 5.480 5.469 5.636 4.946 + 4.560 4.263 2.898 3.866 4.238 5.587 5.413 5.461 3.847 3.644 2.917 3.695 3.628 4.804 5.605 6.063 5.926 7.266 8.501 10.234 10.457 8.180 6.216 5.910 5.315 4.526 4.473 5.172 5.623 5.433 5.307 5.164 5.432 6.426 5.994 5.079 + 3.698 4.736 3.549 1.069 4.303 5.305 4.138 4.884 3.975 1.931 2.290 4.085 2.760 3.630 4.114 5.805 6.423 6.569 6.530 8.979 9.569 7.536 6.850 5.882 5.337 6.161 5.008 5.502 5.885 5.720 5.170 5.600 5.549 6.046 5.555 6.291 + 3.767 4.711 4.631 4.225 3.140 3.790 4.149 4.359 3.212 1.539 2.345 3.440 3.771 4.819 4.436 5.194 6.661 7.138 6.734 8.538 9.916 7.353 6.011 5.827 5.748 5.606 4.524 6.109 6.543 6.490 6.110 6.096 5.559 6.824 6.693 6.220 + 5.659 4.522 3.561 2.586 4.151 4.746 4.273 5.185 3.133 3.182 4.459 4.146 3.288 5.179 4.641 5.708 5.364 7.658 8.603 10.368 10.582 8.041 5.505 5.031 4.874 5.471 5.553 5.934 6.511 6.540 5.938 5.259 5.890 7.012 6.716 5.439 + 5.585 3.998 2.275 3.189 4.606 4.941 4.118 4.569 3.131 5.033 4.671 3.821 4.502 5.063 5.754 5.981 5.215 6.191 8.480 11.013 9.874 8.046 6.824 5.595 6.220 6.121 5.271 6.454 6.738 6.396 6.409 4.994 5.061 6.030 6.046 5.744 + 4.380 5.046 4.858 3.533 3.703 3.520 3.749 4.391 3.714 3.375 3.314 4.020 3.937 4.757 5.222 5.553 5.453 6.726 7.888 10.864 10.012 7.899 6.067 6.011 5.869 5.441 5.140 4.662 4.817 6.815 6.423 5.369 6.391 6.912 6.970 6.508 + 4.408 4.873 4.722 2.685 2.654 2.182 2.913 5.476 5.447 4.783 4.846 4.591 4.257 4.741 5.604 5.359 7.549 8.299 8.412 9.393 9.317 8.335 7.019 5.124 6.200 6.157 6.264 5.650 7.205 8.046 7.394 5.743 5.684 5.968 6.460 5.223 + 4.982 5.463 4.262 3.016 3.287 4.784 5.379 6.280 5.976 6.193 5.841 5.522 4.993 4.079 5.964 5.880 6.680 7.596 8.030 9.943 9.373 7.860 7.154 5.926 5.761 5.564 6.162 5.809 7.431 7.588 6.847 5.489 6.230 6.999 6.500 5.028 + 4.203 4.200 3.272 3.178 3.906 3.879 3.449 3.267 4.356 3.922 4.775 4.402 4.654 5.578 5.906 6.244 7.524 8.032 8.572 9.530 9.102 6.406 5.250 6.801 6.551 6.928 5.827 6.313 7.308 6.594 6.194 5.052 5.814 6.263 6.537 5.226 + 6.966 6.622 5.827 4.288 5.013 4.905 3.044 3.655 4.796 5.044 4.638 4.390 5.266 5.624 6.262 6.078 6.629 6.730 8.022 10.353 9.971 8.271 6.324 6.425 6.046 6.350 5.359 5.422 7.325 8.025 6.611 5.835 5.881 6.029 6.356 5.214 + 5.234 4.712 4.270 5.236 5.382 3.650 5.338 5.131 4.194 5.084 4.526 4.256 5.274 5.153 5.659 6.587 7.652 7.750 8.288 10.586 9.285 7.135 6.397 5.655 5.748 5.969 5.798 5.760 6.806 7.677 6.171 5.788 5.736 6.641 6.990 5.658 + 5.559 5.494 3.127 5.093 5.129 5.795 5.937 4.867 4.242 5.156 5.653 4.001 3.978 3.902 3.395 4.872 6.171 7.261 7.995 9.365 9.511 8.164 5.962 5.816 6.338 5.656 5.562 6.105 6.383 6.817 5.982 5.274 5.186 6.533 7.352 6.255 + 5.782 6.496 5.599 5.617 5.627 5.944 5.719 4.915 2.887 4.332 4.693 4.188 2.773 3.360 3.023 4.587 5.710 5.604 7.028 10.510 10.192 7.234 5.478 5.628 6.117 6.521 5.674 5.405 6.100 6.241 4.265 4.608 5.457 5.784 5.671 4.671 + 5.788 6.159 5.270 5.288 6.425 6.305 5.354 3.790 4.304 3.615 4.573 4.822 3.689 3.412 4.615 5.220 6.150 6.779 8.364 10.676 10.475 7.188 6.391 5.847 5.909 6.328 5.947 6.038 6.559 6.860 5.268 5.170 5.441 5.728 6.007 4.180 + 4.990 5.912 5.166 4.929 4.962 5.249 4.918 6.366 5.885 5.666 5.454 3.168 2.727 4.100 4.056 4.686 6.653 7.222 9.196 9.976 8.871 7.657 6.565 5.528 5.783 5.852 5.823 5.808 6.776 6.811 5.151 5.735 6.023 6.010 5.718 4.415 + 4.902 6.122 6.046 4.812 6.106 6.861 6.761 7.042 5.423 5.007 5.375 4.682 4.054 4.262 4.623 4.610 6.655 7.034 8.059 8.780 8.658 7.920 5.645 6.271 6.209 5.402 5.927 6.003 6.779 7.066 6.579 4.664 5.726 5.639 6.074 5.611 + 10.217 10.216 9.462 8.105 8.288 7.782 8.117 7.921 6.439 4.045 2.739 2.465 2.667 4.394 4.685 4.755 5.792 7.666 8.183 8.491 8.707 7.565 5.922 4.776 4.324 4.430 5.114 5.153 6.605 7.018 6.015 5.325 4.985 5.348 5.804 4.516 + 10.506 9.714 8.544 7.606 6.521 6.286 7.873 7.278 5.589 3.763 2.165 3.612 3.229 3.319 4.452 6.126 5.854 6.864 7.688 8.355 7.310 6.378 6.093 5.277 5.744 6.502 4.687 5.424 6.564 7.001 5.681 6.186 5.896 5.355 5.218 4.464 + 6.245 6.082 6.156 7.058 6.021 4.136 5.743 7.037 6.264 3.736 4.246 3.681 3.543 3.763 3.627 3.425 4.529 6.480 8.388 9.667 10.107 8.234 6.770 5.827 5.700 6.655 5.797 5.231 6.763 6.326 5.197 5.144 4.630 5.579 5.557 5.128 + 4.893 5.227 4.976 5.425 4.574 5.447 5.843 5.485 5.751 5.765 5.912 5.805 4.485 5.572 3.789 3.542 4.381 5.648 8.183 9.826 9.363 7.277 6.709 6.197 5.423 5.531 4.692 5.080 6.337 6.659 5.267 5.174 5.391 5.634 6.346 5.568 + 3.460 3.660 4.626 5.448 5.153 5.278 4.813 4.954 5.176 5.641 5.806 5.100 4.718 5.264 3.721 3.735 5.622 5.437 7.002 8.652 8.480 6.898 6.054 6.597 5.841 5.291 5.289 5.800 5.928 6.350 6.439 5.424 4.892 5.665 6.511 4.649 + 3.145 3.034 3.723 4.441 5.208 4.744 4.168 3.992 4.903 4.253 3.465 4.459 5.119 4.286 4.197 4.424 5.525 5.747 6.542 9.123 9.845 7.488 6.714 5.302 4.973 3.935 3.272 3.961 6.396 6.657 5.301 5.191 5.310 4.853 5.497 4.827 + 2.801 3.863 3.942 4.591 4.271 4.726 5.761 4.950 5.479 4.483 3.212 4.886 5.353 4.463 4.200 5.105 5.967 6.336 8.287 9.490 9.716 6.874 5.245 5.047 4.962 4.526 4.178 4.242 4.690 5.727 5.318 5.350 5.167 4.932 5.293 4.492 + 3.553 4.072 4.485 4.480 5.577 4.765 6.115 4.932 4.959 3.467 4.254 4.610 4.618 4.757 5.017 4.629 6.069 6.695 7.529 9.147 8.412 5.928 4.404 4.312 5.334 5.470 4.550 4.623 4.985 5.371 4.423 4.162 4.576 5.012 5.121 4.478 + 3.211 4.161 4.756 4.802 4.240 5.423 5.753 5.697 5.008 4.616 4.389 3.774 3.219 3.491 4.962 4.174 4.660 5.414 7.353 7.558 6.550 5.921 5.190 4.749 4.114 4.431 4.372 4.706 4.916 5.429 4.543 3.983 4.476 4.449 4.600 3.473 + 4.556 4.297 4.378 4.171 4.064 5.230 6.246 5.157 4.746 4.449 4.057 3.823 2.891 3.092 2.846 2.851 3.883 5.324 6.014 6.681 6.263 4.892 4.793 3.924 4.113 4.471 4.557 5.029 5.573 5.411 4.267 3.545 3.572 3.803 3.085 2.150 + 2.862 4.132 4.791 4.930 4.709 5.454 5.802 4.749 3.696 5.334 4.584 4.769 5.040 4.348 3.070 3.781 2.869 5.056 5.405 5.691 5.061 4.217 3.931 4.716 5.068 5.305 4.874 3.856 5.210 5.467 4.711 4.311 3.904 4.236 3.300 2.576 + 5.865 4.873 5.141 5.259 4.007 5.356 6.422 6.776 6.656 6.360 4.652 4.380 4.586 4.168 4.283 5.203 5.159 5.566 5.881 7.078 6.710 5.135 3.788 4.925 5.041 5.284 5.186 5.098 5.348 6.087 5.675 4.863 4.434 5.013 4.525 2.968 + 5.377 5.543 5.468 5.308 4.920 4.352 4.008 5.640 5.117 5.351 4.485 4.839 3.616 3.872 3.336 4.395 4.779 4.640 5.965 7.421 5.040 4.949 4.747 4.154 4.282 5.049 5.025 5.430 4.619 6.158 4.949 4.469 4.675 4.401 4.370 3.051 + 3.874 5.182 4.958 5.030 5.278 4.598 5.874 6.594 6.162 4.806 2.892 2.496 3.002 2.628 2.853 4.192 4.246 4.460 7.118 7.724 5.869 4.931 3.960 4.329 3.832 4.548 4.569 4.903 4.461 5.308 4.383 4.442 3.424 4.349 3.748 2.333 + 5.646 4.371 4.763 3.974 4.587 4.388 3.071 1.580 1.247 1.306 2.637 2.320 2.310 2.061 2.357 3.267 4.086 4.689 6.495 7.428 5.333 5.284 4.084 4.582 3.725 3.780 4.267 5.283 5.505 5.104 3.778 3.783 4.312 4.083 2.994 2.693 + 5.889 5.614 3.002 4.254 4.656 4.979 3.981 2.178 2.885 2.368 2.920 4.202 2.522 2.691 2.961 4.080 3.681 3.577 5.229 6.353 5.003 4.555 3.985 3.021 3.834 4.253 3.340 4.151 4.375 3.656 3.221 3.547 3.878 2.933 2.373 1.587 + 6.070 5.749 4.820 4.953 4.743 2.403 2.610 4.591 4.682 3.806 3.303 3.595 2.909 2.281 2.727 3.267 3.466 3.215 5.133 5.044 4.507 3.445 3.960 2.708 2.671 3.327 3.546 2.686 2.766 2.263 2.500 3.253 2.979 2.748 1.184 0.636 + 3.591 4.459 4.271 4.126 3.979 2.937 3.287 4.344 5.449 3.867 2.444 3.523 2.122 2.807 2.329 2.173 2.506 4.696 4.748 3.933 3.814 2.390 2.612 2.917 2.753 3.006 3.319 3.087 3.307 2.838 2.575 2.231 2.060 0.855 0.877 -0.005 + 4.140 5.686 5.875 5.331 4.666 4.531 5.783 6.524 6.036 4.021 2.623 2.260 1.812 2.495 1.354 1.912 3.341 5.439 5.153 5.220 4.126 3.161 3.379 4.345 3.789 2.380 2.467 2.892 3.251 2.269 1.471 3.003 3.185 1.622 1.585 1.171 + 4.574 3.239 2.326 3.195 4.785 5.011 5.204 4.138 3.210 2.609 2.709 2.497 2.768 1.561 1.169 2.027 4.310 4.895 4.620 5.000 3.942 3.837 3.682 3.325 3.210 2.732 2.169 3.128 3.753 2.395 3.427 3.744 3.624 2.768 2.672 1.983 + 5.448 5.658 5.431 6.130 6.357 4.997 4.781 4.962 4.154 3.506 3.185 4.131 3.780 1.879 3.107 3.386 4.089 4.294 3.647 3.441 3.183 3.186 4.395 4.776 3.996 3.566 4.201 4.462 4.585 4.819 5.219 5.190 4.879 4.897 4.713 3.722 + 3.740 3.306 2.296 4.500 4.969 5.308 6.293 5.224 4.799 4.708 3.465 4.531 4.046 1.371 3.961 3.690 3.214 3.972 4.658 4.847 4.806 4.340 3.970 3.753 5.014 5.222 5.963 5.831 6.579 5.267 6.351 7.146 6.424 5.660 6.681 6.602 + 5.132 4.452 4.679 4.865 4.828 6.117 6.492 5.103 4.614 4.275 2.636 2.970 3.761 3.940 3.894 3.513 3.768 3.274 3.512 3.795 4.579 3.976 5.268 4.414 5.104 5.251 6.322 6.013 6.262 6.964 6.981 6.666 5.906 5.479 5.905 5.182 + 7.425 6.051 5.791 5.917 5.301 5.673 6.622 5.633 5.382 5.241 4.416 3.662 6.119 6.185 5.435 4.883 5.379 5.198 5.736 6.400 7.065 6.424 5.432 5.221 5.839 6.377 7.463 6.942 6.431 7.271 7.608 8.634 7.109 7.756 7.496 5.860 + 9.123 7.983 8.113 7.677 7.538 7.389 7.135 7.620 7.642 7.616 7.512 6.944 6.474 7.517 7.137 7.123 7.731 6.617 6.381 7.553 6.761 6.819 6.547 5.851 6.744 7.225 6.845 7.268 7.209 7.800 8.045 9.056 8.138 8.568 7.921 7.103 + 6.710 6.995 6.548 7.734 7.272 6.545 8.028 7.799 5.793 5.016 5.736 6.417 5.988 5.941 5.830 5.656 6.231 5.794 5.738 6.501 6.025 5.311 5.241 5.406 6.964 7.213 6.270 6.044 6.146 5.897 7.240 8.776 7.949 7.414 7.600 6.315 + 5.519 6.603 5.859 6.146 7.306 6.446 5.440 6.484 5.754 3.285 2.580 3.417 3.339 3.653 3.529 2.750 2.801 4.397 4.757 4.950 4.367 5.829 5.334 4.890 5.879 5.998 6.140 7.494 6.758 7.281 7.206 7.509 7.395 6.741 6.688 5.515 + 5.350 5.940 5.426 5.534 6.106 5.134 5.049 3.614 4.083 4.015 3.761 2.302 3.236 2.574 3.677 2.698 1.352 3.578 4.556 4.604 4.514 4.463 4.613 4.542 4.623 5.146 4.977 6.027 5.956 6.619 6.896 6.948 6.718 6.933 6.812 5.863 + 5.366 3.754 4.055 5.827 6.762 6.234 6.638 6.068 5.174 4.999 4.582 4.591 3.899 3.766 3.238 3.545 3.745 5.245 5.124 4.206 4.436 5.580 4.968 4.640 5.479 5.670 5.927 6.025 6.187 5.699 6.542 7.210 7.225 7.489 6.765 5.514 + 4.227 4.994 4.568 5.457 5.802 5.970 7.150 6.478 6.313 5.065 4.687 4.978 4.338 3.846 3.794 4.665 4.306 4.807 4.515 4.690 4.861 4.955 5.175 5.560 4.926 5.222 5.857 6.592 5.944 5.712 6.003 6.040 7.234 7.241 6.591 5.432 + 6.306 7.218 7.565 6.583 6.142 7.097 6.249 5.799 5.152 5.715 5.535 6.016 4.050 5.309 4.762 3.421 3.823 3.965 3.452 4.088 4.875 4.003 4.619 4.182 3.536 4.974 5.809 6.935 6.355 6.605 6.972 7.621 8.938 9.048 8.137 5.755 + 6.421 6.725 6.276 5.023 7.241 7.013 3.757 4.795 5.762 6.133 5.059 5.709 6.487 5.606 5.759 4.850 5.915 4.622 5.259 5.725 5.780 5.456 6.860 6.517 6.556 6.436 6.444 6.937 6.081 6.587 7.150 7.888 8.278 8.722 8.040 7.004 + 7.540 6.537 5.999 7.044 7.687 7.917 7.778 6.248 8.273 8.262 6.921 7.246 7.027 7.337 7.651 7.119 7.554 6.814 7.166 6.764 6.384 6.143 7.174 7.638 7.872 7.734 7.155 7.178 7.600 7.220 6.807 7.027 7.141 7.435 8.570 8.175 + 5.730 4.106 4.323 4.587 8.235 9.213 7.407 8.814 9.752 9.468 8.438 8.252 7.178 7.258 7.411 6.523 7.763 7.186 5.583 5.203 4.869 5.441 4.446 5.249 6.638 6.526 5.792 5.629 5.611 6.341 5.390 5.851 5.783 5.593 5.338 4.714 + 5.177 5.389 6.087 6.868 8.805 9.677 6.829 10.307 11.240 8.976 8.592 8.956 6.689 6.863 6.721 8.518 8.239 9.877 8.646 6.252 5.357 5.139 3.764 4.502 6.563 7.118 5.388 5.000 5.495 6.584 6.055 5.209 5.380 5.881 5.127 4.077 + 5.834 2.747 5.669 7.604 9.527 10.875 8.905 11.059 12.109 10.006 8.126 8.270 7.081 7.283 5.723 9.306 9.739 10.712 9.784 7.436 6.832 6.405 6.340 6.967 8.784 9.373 7.520 6.192 6.155 6.404 6.630 5.735 6.018 5.442 5.543 4.354 + 5.294 4.629 4.552 5.481 10.311 11.882 10.113 10.353 12.143 10.715 7.158 6.871 6.161 8.563 8.672 9.369 10.802 9.296 8.826 8.257 8.753 8.827 7.984 8.405 10.367 9.251 8.264 7.464 7.190 8.155 8.151 5.996 6.441 6.495 6.648 5.924 + 4.544 5.291 6.565 5.965 10.738 12.093 9.837 8.410 10.618 9.486 7.068 7.618 6.409 8.144 8.199 9.229 9.853 9.429 9.026 8.565 7.603 8.027 7.934 8.723 9.602 9.506 8.283 6.962 5.560 7.145 8.100 7.208 6.054 7.144 5.947 5.003 + 6.006 6.733 6.106 6.962 10.540 11.666 9.644 8.173 9.276 7.085 6.806 6.753 5.525 6.112 5.718 7.999 8.545 10.268 9.963 7.637 7.044 7.205 5.993 8.434 8.654 9.304 6.889 6.185 4.808 6.147 7.722 7.219 7.277 8.115 6.935 4.934 + 6.116 6.565 6.660 5.798 9.254 10.262 8.293 8.249 9.359 7.125 6.456 6.880 5.020 5.137 4.328 5.943 6.824 8.986 7.788 7.332 6.847 6.873 6.933 7.471 7.901 7.573 5.580 5.352 4.611 5.220 6.184 6.315 6.380 6.860 6.085 4.241 + 6.226 7.012 6.515 4.719 7.960 8.180 5.783 5.645 8.140 7.275 5.613 6.436 4.241 4.479 4.858 5.042 5.656 7.199 6.441 6.190 5.865 6.189 4.472 5.735 6.528 5.940 4.412 4.271 4.266 5.219 5.702 5.695 5.393 5.524 5.368 4.677 + 6.635 6.374 3.984 3.257 5.272 5.657 4.489 4.995 7.573 6.321 3.695 3.844 3.274 4.183 3.878 5.005 5.540 6.768 6.873 4.109 4.942 5.203 4.010 5.201 6.163 5.098 4.286 2.955 3.276 5.012 4.817 3.892 4.291 5.293 4.799 3.243 + 5.899 6.538 4.397 4.849 6.650 6.381 3.628 5.733 7.942 6.651 4.692 4.525 3.218 4.036 4.511 4.266 5.294 5.693 5.681 4.338 3.755 4.762 5.311 5.063 5.987 4.796 3.384 3.896 3.551 3.840 4.277 4.007 3.993 4.712 3.665 3.255 + 4.716 6.006 5.564 4.566 6.362 6.977 4.941 6.738 7.798 6.274 4.957 4.325 4.009 4.174 4.015 4.258 5.131 5.079 5.238 3.748 4.225 4.924 5.135 5.939 5.292 5.628 4.491 4.506 4.343 3.938 4.981 3.838 4.220 4.415 3.999 3.768 + 4.874 5.388 5.495 5.232 4.450 6.920 6.034 5.704 5.606 4.457 4.346 4.966 4.782 4.730 4.104 3.763 4.376 6.203 5.791 3.816 4.084 5.387 4.831 5.147 6.097 6.520 5.549 4.370 3.450 3.659 5.105 4.523 4.358 5.369 4.407 3.957 + 0.453 3.992 4.860 4.865 6.576 6.713 5.958 5.803 6.913 5.378 4.292 5.685 4.168 3.456 3.666 3.514 4.294 6.308 5.781 4.828 4.863 5.300 5.011 6.824 6.757 7.932 7.546 6.493 4.483 3.978 4.429 5.030 4.489 4.698 4.802 3.415 + 4.651 5.227 4.539 3.558 5.199 4.066 3.893 4.575 6.571 5.481 4.111 4.039 4.112 4.383 3.954 4.075 5.039 5.124 4.748 4.706 3.879 3.888 5.397 6.864 6.533 7.321 7.548 6.539 4.987 5.633 5.500 4.433 4.169 5.634 5.589 4.215 + 3.738 4.272 4.823 3.536 4.992 6.919 7.667 7.098 5.845 4.606 4.009 4.311 4.137 4.646 4.558 3.828 3.434 4.031 4.534 5.016 5.277 5.340 6.418 6.947 7.194 7.673 6.820 5.565 4.853 5.829 5.118 4.732 5.268 6.185 6.260 5.390 + 4.859 5.925 6.292 5.036 6.215 9.144 10.061 7.751 6.198 6.451 4.911 3.987 4.782 4.616 4.422 3.783 3.954 5.040 5.024 5.892 4.845 5.446 7.892 8.542 8.405 8.289 9.053 8.082 6.694 5.621 5.379 5.771 5.539 6.817 6.261 4.848 + 3.582 5.296 6.514 5.716 8.010 10.714 10.514 7.175 7.168 8.006 5.754 5.183 5.923 5.159 4.687 3.941 3.804 4.833 5.856 6.096 6.239 6.199 7.316 9.604 9.414 9.242 9.415 8.922 7.254 6.406 6.869 7.275 7.033 8.012 7.163 5.506 + 2.589 3.734 4.252 1.647 9.764 11.644 9.824 6.399 7.431 7.827 4.561 5.547 5.476 5.230 6.076 4.048 5.452 5.158 6.423 6.775 7.312 8.423 9.464 9.996 9.495 10.026 10.943 10.530 8.221 7.757 7.464 8.079 7.723 8.318 7.599 5.641 + 4.292 5.374 4.505 4.176 10.638 12.559 10.956 5.311 6.900 6.946 5.374 5.183 4.716 6.323 6.715 4.128 5.095 5.897 6.133 6.962 7.352 9.539 10.456 10.876 10.783 9.683 11.661 11.128 8.594 7.542 7.683 8.211 7.332 9.254 7.545 5.826 + 5.610 6.944 5.652 4.325 11.440 13.009 11.037 4.534 5.573 5.085 4.614 5.165 3.696 5.690 6.337 4.734 5.576 5.862 6.061 7.574 7.412 9.315 11.323 11.266 10.723 10.746 11.732 11.189 8.931 7.165 8.107 7.976 7.208 10.096 8.082 5.518 + 4.724 6.511 5.686 4.586 11.825 13.183 10.842 4.438 6.283 5.872 4.791 4.389 2.893 6.229 6.395 5.938 6.798 7.384 7.096 7.268 7.133 8.995 11.318 10.799 10.096 11.768 11.322 10.948 8.921 7.019 8.077 8.896 8.343 10.266 8.791 5.699 + 4.784 6.086 4.895 6.342 12.049 13.144 10.560 4.527 6.485 6.140 4.351 4.593 3.933 5.579 5.720 5.124 5.781 6.170 6.193 6.611 6.991 8.509 9.780 9.593 9.722 10.990 11.136 10.726 8.830 8.240 7.416 8.532 8.839 10.104 7.752 5.070 + 5.753 6.060 5.215 5.665 11.512 12.709 10.367 5.715 6.734 6.723 5.091 5.163 3.654 5.276 5.282 4.168 4.442 4.391 5.035 5.357 5.827 8.705 10.339 9.195 9.006 9.462 10.509 10.296 7.982 7.049 5.837 7.223 7.776 8.225 8.118 5.029 + 9.727 9.617 9.575 9.143 11.062 12.171 9.725 5.625 6.715 6.482 4.582 5.036 4.121 4.824 4.645 3.520 3.738 4.619 5.096 4.249 5.555 7.901 8.672 8.068 8.586 7.863 9.115 8.554 6.945 4.910 5.750 6.175 7.511 6.946 7.102 5.047 + 12.202 10.694 10.920 11.396 10.250 10.770 9.530 7.724 6.797 6.028 4.517 4.626 3.955 3.781 4.198 3.791 3.515 5.406 4.751 4.340 5.653 6.868 5.394 6.369 6.714 6.475 7.321 6.568 4.979 4.829 5.012 5.502 6.887 6.577 6.363 3.808 + 10.504 9.996 8.930 8.672 8.871 9.397 7.130 4.392 4.522 3.835 4.077 3.554 2.344 3.617 3.792 3.251 2.403 3.574 3.674 3.971 5.023 6.770 6.825 6.752 5.935 6.849 6.471 6.110 5.101 5.236 5.647 5.733 6.755 6.654 5.549 4.226 + 6.414 7.175 8.409 8.077 7.994 8.534 6.400 3.765 4.232 3.779 4.875 4.969 4.478 4.294 3.426 3.608 2.230 2.946 3.544 5.215 5.639 5.647 6.957 6.505 5.743 6.011 7.003 6.614 4.553 5.046 5.295 5.602 6.046 6.563 5.609 4.022 + 8.016 8.164 7.977 7.032 7.007 7.332 5.677 4.150 4.523 5.487 5.739 4.851 5.193 5.351 3.938 3.446 3.747 4.483 3.868 4.115 4.065 5.319 7.424 5.960 5.478 5.006 7.310 6.880 4.654 3.611 4.640 4.899 5.292 5.795 4.497 4.299 + 6.859 7.495 8.405 7.976 8.379 7.548 7.286 7.207 6.820 6.164 5.692 5.616 5.798 6.076 4.994 4.779 5.887 5.070 4.399 4.872 5.373 5.205 6.800 5.790 6.108 6.761 7.158 6.445 5.992 6.023 6.608 5.712 6.209 6.056 5.924 5.952 + 12.483 13.060 13.590 13.646 13.235 12.258 11.452 11.541 11.235 10.255 9.431 9.803 9.576 8.812 8.162 7.700 7.534 7.246 6.799 6.035 6.469 6.620 6.797 6.722 6.964 6.546 6.482 5.778 6.221 6.617 7.017 6.885 6.980 6.597 6.486 5.683 + 11.805 11.320 11.869 12.265 11.301 9.542 8.375 9.216 9.102 8.004 6.486 8.507 8.239 6.396 6.085 5.991 5.942 4.955 4.606 5.454 5.747 5.892 6.595 5.749 5.709 5.334 7.201 6.285 5.933 6.031 5.707 5.836 6.241 6.584 6.191 5.255 + 6.452 7.914 8.427 8.455 8.380 7.967 8.626 8.959 8.892 7.864 8.847 8.319 6.794 5.933 6.421 5.333 4.375 4.936 4.691 4.880 4.868 4.962 4.618 5.872 6.114 5.189 7.688 7.168 5.666 6.236 6.408 6.249 7.126 7.538 6.685 6.040 + 7.440 5.924 7.278 6.342 6.536 5.888 6.059 6.792 6.669 5.844 7.285 7.149 6.944 5.396 5.150 6.411 6.537 6.048 6.496 5.786 6.025 6.170 5.977 6.688 6.558 5.266 8.073 7.405 6.295 6.754 6.594 7.301 7.584 7.522 7.101 6.478 + 8.266 8.751 7.452 7.664 8.307 9.445 8.248 7.231 7.042 5.370 5.092 6.691 6.130 4.946 6.203 5.233 6.400 7.228 7.564 6.946 6.722 6.965 6.352 5.652 6.204 6.034 8.947 8.315 5.073 5.179 5.146 6.402 6.506 6.569 5.455 4.340 + 8.108 8.809 8.920 8.670 10.828 11.858 10.130 7.316 6.793 6.618 7.310 6.766 6.488 5.820 5.108 6.095 6.310 8.005 7.588 7.797 6.629 6.744 6.225 6.320 7.124 7.595 9.481 8.594 5.660 4.980 5.363 6.895 6.232 6.572 5.023 4.534 + 9.633 9.570 9.246 9.069 10.754 12.423 10.688 8.365 8.605 6.980 6.662 7.955 7.404 6.644 6.810 8.162 7.437 10.280 9.725 7.672 6.540 6.646 6.592 5.790 6.189 8.139 7.883 6.925 6.064 6.509 6.098 6.942 6.831 7.034 4.740 4.352 + 8.931 8.954 8.650 9.533 11.700 12.248 9.687 7.571 8.043 7.422 7.997 8.977 7.310 7.003 7.672 7.104 7.666 10.825 9.658 6.339 6.001 6.059 6.628 6.380 6.027 6.663 7.476 7.915 7.066 5.797 6.260 7.150 7.645 7.665 5.607 5.233 + 9.269 10.366 10.633 9.892 11.391 11.700 9.375 8.485 7.733 8.146 7.233 8.749 7.483 7.474 7.893 8.345 7.341 10.048 8.688 7.061 6.031 5.639 5.344 5.753 5.696 5.927 7.355 6.730 6.692 4.944 4.632 6.535 6.918 5.973 5.585 4.835 + 7.840 8.302 7.940 9.231 9.120 9.149 8.020 8.471 7.519 6.259 6.531 7.130 6.897 5.443 6.025 6.394 6.337 8.297 8.212 7.664 5.924 6.054 5.453 5.475 5.264 5.386 6.714 5.706 4.754 5.012 3.376 4.212 4.811 5.046 4.067 3.136 + 7.215 8.251 7.731 7.961 7.613 7.803 8.103 6.639 6.721 6.125 4.672 5.946 5.440 5.103 5.153 6.115 5.706 6.420 6.274 6.316 5.187 4.958 5.440 6.026 4.955 5.481 6.468 4.762 4.605 5.047 4.697 4.535 5.343 5.277 4.274 2.712 + 5.886 8.582 9.339 8.224 7.319 8.049 7.177 5.987 6.936 5.912 6.225 6.443 5.002 5.437 6.603 6.411 5.176 5.272 5.721 5.436 4.252 3.774 4.917 5.185 5.417 4.432 4.669 4.401 3.939 3.988 4.137 4.429 3.926 4.087 3.578 3.171 + 8.739 9.623 8.639 7.831 7.117 8.180 6.593 5.363 5.796 6.664 7.692 6.847 6.286 6.864 6.487 6.401 5.490 6.463 5.761 5.558 4.869 4.379 5.615 4.540 5.354 5.178 4.506 4.179 3.989 3.977 3.293 3.566 3.761 3.666 3.671 2.591 + 7.772 10.695 10.703 9.545 9.772 9.167 7.095 6.513 6.383 7.428 7.352 5.469 5.580 4.410 3.465 4.883 5.088 4.773 5.614 5.510 5.905 4.096 3.784 5.249 5.212 4.105 4.892 4.422 4.484 3.063 2.837 3.592 3.730 4.212 3.904 3.068 + 10.503 11.258 11.184 10.472 9.000 8.318 8.585 6.788 6.648 7.132 7.358 5.186 5.828 5.297 4.037 3.499 4.345 4.781 4.516 4.476 4.483 4.492 4.585 5.540 5.038 3.887 4.450 4.037 3.999 3.234 2.004 2.833 3.474 3.857 3.650 2.397 + 8.267 7.209 7.261 7.316 7.588 8.905 8.733 7.015 6.464 5.673 6.145 5.386 4.888 4.929 5.897 5.118 5.637 5.655 5.119 6.351 7.246 5.352 5.243 5.530 5.444 5.438 6.405 5.637 4.494 3.932 3.782 3.165 4.005 4.028 3.137 2.469 + 8.986 7.888 7.778 7.427 9.363 11.545 11.466 8.318 7.121 6.938 7.368 6.726 6.636 7.732 7.065 5.992 6.477 6.551 6.857 7.325 8.955 8.157 6.518 6.633 6.790 8.009 9.217 8.452 5.919 5.499 5.445 5.906 6.114 4.750 4.569 3.307 + 6.853 7.625 7.861 4.964 6.881 11.915 12.931 10.230 7.754 9.521 8.841 6.385 8.238 7.175 5.400 5.222 6.429 7.937 7.012 9.208 9.509 9.200 8.152 8.118 8.429 9.481 11.332 11.185 7.132 6.630 7.062 7.660 8.676 6.693 6.180 2.951 + 6.085 6.774 8.066 7.702 7.577 12.214 13.589 11.347 6.582 9.074 8.205 4.777 8.117 8.312 5.799 6.334 5.455 9.366 8.476 10.311 9.978 11.074 9.396 9.402 8.526 10.351 11.136 11.082 8.245 6.432 6.910 7.932 8.863 8.192 7.074 4.260 + 6.495 7.240 6.661 7.407 7.987 12.310 13.983 12.017 6.170 8.398 8.360 4.812 7.545 8.108 5.544 5.617 5.025 9.597 9.101 11.184 11.360 11.985 10.382 9.595 8.686 9.429 11.007 10.230 8.830 7.550 7.244 8.683 8.918 8.492 7.862 4.554 + 5.395 6.630 7.153 7.611 9.016 11.852 13.887 12.514 6.307 7.945 8.398 5.133 7.428 7.620 6.121 6.514 6.711 7.709 8.332 10.932 12.177 10.262 9.218 9.571 8.796 10.541 12.068 11.571 9.480 8.480 7.117 8.480 9.000 9.373 7.955 5.438 + 6.480 6.920 6.578 7.270 7.780 10.846 13.080 12.346 8.671 7.728 9.189 7.586 7.248 7.585 5.799 6.073 7.346 6.561 8.645 9.871 11.181 9.994 8.393 9.295 9.068 9.650 11.760 11.618 8.572 8.333 7.747 8.552 8.878 9.131 8.160 5.847 + 6.213 6.217 7.967 7.948 6.181 10.050 11.751 11.643 9.638 7.803 9.316 7.412 6.471 7.651 7.942 6.330 6.564 6.752 8.155 9.492 10.614 10.190 8.342 8.750 7.783 8.690 10.294 9.774 7.716 7.379 7.444 7.902 8.746 9.213 8.638 6.349 + 5.977 7.704 8.304 7.005 5.681 9.692 11.934 11.738 8.494 5.916 7.854 6.476 5.764 6.302 5.685 4.546 5.598 6.314 8.233 9.461 8.650 8.821 7.790 8.532 6.748 7.773 8.586 8.759 7.629 6.908 6.625 7.414 8.494 9.030 8.322 6.109 + 8.062 8.072 7.984 8.734 8.513 9.564 11.039 11.140 9.491 8.056 7.730 8.016 8.110 8.176 7.882 7.113 7.012 6.856 7.231 8.322 8.245 8.248 6.353 7.138 6.697 6.922 7.725 8.574 7.478 5.577 6.254 6.726 8.103 7.132 6.802 5.645 + 7.304 7.701 8.081 9.413 9.145 9.930 11.153 10.468 7.742 6.520 7.418 7.113 7.124 6.904 6.113 6.132 5.778 6.227 7.067 7.913 7.916 6.780 5.259 5.737 5.656 5.936 7.675 6.703 6.281 5.121 5.542 6.097 7.258 6.677 6.188 5.186 + 8.557 8.530 9.082 9.428 8.828 8.390 8.498 7.017 6.449 6.563 7.170 7.518 6.804 6.052 5.277 5.664 5.183 4.879 6.230 6.658 6.900 6.302 5.325 6.416 5.930 5.244 6.556 6.748 5.090 5.187 6.237 5.934 7.520 7.202 6.312 5.184 + 8.298 7.878 8.764 9.450 8.746 8.747 10.003 8.214 6.917 6.071 5.930 5.784 4.567 4.222 4.884 3.581 3.978 4.760 5.299 5.653 6.500 6.188 6.259 6.453 5.999 5.874 6.268 6.614 5.830 5.554 5.574 5.782 5.851 5.767 6.075 4.818 + 6.516 7.976 7.145 6.776 8.180 8.542 9.105 8.747 6.385 5.250 4.803 5.508 4.467 5.446 4.283 2.829 3.206 5.651 6.385 6.410 6.669 6.709 4.971 4.292 4.737 6.207 7.324 6.477 5.643 5.440 5.742 6.013 6.707 6.144 6.379 5.444 + 9.419 9.437 8.931 7.782 7.291 8.396 8.424 7.569 6.308 6.429 6.218 5.635 5.373 5.363 4.786 3.290 4.066 4.752 5.214 7.017 6.350 6.488 5.176 4.911 5.515 6.182 6.865 7.005 6.176 5.864 6.866 6.897 7.320 6.526 6.631 6.752 + 10.534 11.349 11.408 9.883 9.523 8.822 9.249 7.545 7.452 7.744 7.096 8.598 8.355 8.204 8.243 7.596 8.051 7.890 8.047 8.843 8.470 7.792 7.552 7.891 6.854 7.417 7.900 7.463 5.423 5.207 6.483 6.594 7.141 6.874 7.139 6.705 + 11.777 11.817 11.421 10.896 10.523 8.848 9.342 8.195 7.839 9.201 9.684 9.906 9.705 9.938 9.012 8.140 8.581 8.758 8.945 9.593 9.380 8.048 7.888 7.914 7.432 7.855 8.741 8.010 6.051 5.633 5.778 7.054 7.575 7.540 7.857 7.299 + 9.595 9.240 9.689 9.523 9.270 8.483 9.942 9.692 8.443 7.123 7.089 7.387 7.971 7.118 5.082 5.023 4.282 4.827 5.519 5.287 5.467 5.358 6.384 6.939 6.970 5.909 5.271 5.772 6.173 6.094 6.653 7.619 7.447 7.784 7.930 6.797 + 9.929 10.023 10.179 9.624 9.175 8.022 8.431 7.606 7.376 7.659 7.493 8.189 7.340 5.999 5.414 5.255 4.114 4.363 4.427 4.839 5.467 6.107 6.105 6.241 6.221 5.843 6.320 6.783 6.672 5.438 6.847 7.381 7.932 8.663 8.808 7.284 + 7.533 8.157 8.272 8.584 6.718 6.880 7.934 8.168 6.174 5.203 5.799 5.634 5.459 5.933 4.624 4.433 4.893 4.624 6.413 6.688 5.361 5.816 5.638 6.423 6.508 6.646 7.649 5.926 5.727 6.153 7.056 7.577 8.100 7.686 7.996 6.967 + 7.513 7.671 7.456 7.862 7.209 6.037 6.960 6.943 5.889 6.161 6.344 5.521 5.001 6.318 5.379 5.070 4.585 5.308 5.443 6.068 4.438 5.781 5.867 5.100 4.995 5.017 6.238 6.179 6.218 6.899 7.522 7.843 7.844 7.469 8.602 8.465 + 7.006 6.883 7.687 8.341 8.546 7.890 6.547 5.723 5.851 6.287 4.325 5.620 5.355 5.520 4.900 6.214 5.653 6.136 5.851 7.011 5.057 5.409 6.534 5.976 5.801 5.987 6.564 5.707 5.762 6.225 7.157 7.538 7.784 7.541 8.698 9.707 + 6.220 6.253 7.281 7.263 6.826 6.836 5.726 5.911 6.782 6.127 5.862 4.770 4.907 3.488 4.343 4.331 4.279 5.935 6.298 6.971 7.362 7.060 6.593 6.074 6.334 6.337 6.285 5.973 6.142 6.289 6.841 7.392 7.828 7.429 7.459 8.030 + 10.463 10.856 11.480 9.862 10.632 10.023 10.254 9.578 10.388 9.423 9.953 9.041 8.944 6.610 7.129 7.346 8.204 9.737 9.214 10.249 11.565 11.827 11.461 9.366 9.756 9.854 10.705 10.830 8.970 7.918 7.122 7.500 7.168 9.238 10.421 9.503 + 12.385 13.382 12.595 11.582 11.592 11.276 10.527 9.633 11.205 11.473 11.228 11.408 10.987 8.620 9.021 9.566 9.842 10.926 10.584 11.171 11.790 11.304 11.223 10.213 9.647 9.779 10.235 10.529 9.551 6.980 6.769 6.926 7.605 8.896 9.858 9.699 + 13.285 14.140 12.515 12.171 12.776 12.504 10.514 9.719 10.623 12.489 12.597 11.946 11.286 9.160 9.170 10.055 10.026 10.848 10.392 10.830 11.836 11.892 11.018 9.130 7.567 6.866 6.905 6.146 6.293 5.897 5.508 6.113 7.226 8.337 8.768 6.066 + 13.802 14.476 12.983 12.764 13.210 12.497 11.198 9.585 11.179 13.261 12.958 12.222 11.729 9.041 9.151 10.072 10.332 10.929 10.895 11.966 12.922 12.608 11.061 9.065 7.400 5.690 6.323 6.614 7.173 7.465 6.398 7.832 8.398 8.844 7.718 6.283 + 14.182 14.720 13.203 13.792 13.284 13.714 13.695 13.194 13.536 13.608 13.383 13.044 12.419 11.586 10.548 11.167 12.031 11.628 11.526 12.954 13.735 12.685 11.079 9.692 9.239 9.039 8.410 8.299 9.036 8.970 8.870 9.156 8.918 8.361 8.696 8.000 + 15.069 15.527 14.281 14.535 15.941 16.193 16.579 15.534 15.404 16.266 15.406 14.787 13.626 13.686 13.057 13.160 13.553 13.120 12.781 14.530 14.329 12.766 10.877 9.730 9.634 9.317 8.773 8.590 9.276 9.221 9.235 9.622 9.055 8.874 9.524 8.672 + 14.878 15.532 13.901 14.024 16.570 17.769 18.859 17.658 16.191 16.981 17.584 17.678 16.605 15.031 13.332 13.185 12.930 13.084 14.173 15.188 12.819 11.065 9.493 9.082 8.510 7.294 6.475 7.191 8.170 7.563 7.115 8.673 8.155 6.579 6.418 5.695 + 15.707 16.215 15.530 16.059 16.849 18.116 19.745 18.598 16.834 17.680 18.169 18.639 18.130 15.788 13.519 13.830 13.787 14.634 15.726 15.652 13.277 11.411 9.855 8.463 7.343 6.901 6.629 7.315 8.610 9.555 9.588 10.722 9.846 7.075 6.174 5.656 + 16.094 16.343 15.788 16.106 16.560 18.568 19.794 18.347 17.863 18.300 18.177 18.682 18.496 16.170 14.026 14.384 14.447 15.785 15.932 14.272 12.249 10.641 8.759 7.879 7.262 6.249 6.099 6.288 8.143 9.849 9.317 9.887 8.880 6.172 5.812 5.184 + 16.168 16.368 16.019 16.120 16.437 18.615 19.447 18.351 18.242 18.200 17.357 18.526 18.318 17.083 15.132 15.031 15.373 16.665 15.771 13.804 11.587 9.776 8.460 8.149 7.712 6.819 6.846 7.122 8.765 10.717 10.767 10.491 8.175 6.889 6.634 6.384 + 16.274 16.387 16.193 16.210 16.656 18.768 19.354 18.514 18.339 18.025 16.917 17.974 18.898 18.226 15.805 15.761 16.055 17.254 15.684 14.257 12.436 11.012 9.618 8.743 8.565 7.817 7.858 7.783 8.502 10.334 10.615 11.405 9.935 7.533 7.408 7.062 + 16.160 16.350 16.302 16.217 16.769 18.913 19.346 18.605 18.341 17.875 16.859 16.424 19.092 18.899 16.934 16.636 16.706 17.982 16.525 14.751 12.804 11.221 9.986 8.848 8.557 6.547 6.635 6.700 7.515 9.094 9.432 10.979 9.670 6.280 5.938 4.854 + 16.076 16.223 16.264 16.139 16.672 18.920 19.203 18.183 17.892 17.537 16.526 15.112 18.143 17.959 18.068 16.627 16.311 17.742 16.737 14.715 12.836 11.156 9.877 8.789 8.510 7.767 7.498 7.327 7.861 8.957 9.029 10.975 10.553 7.458 7.132 6.223 + 15.902 16.085 16.111 16.096 16.874 18.774 18.701 17.436 17.173 16.880 15.630 14.803 16.576 17.112 18.099 18.045 16.781 17.836 17.286 15.424 13.175 11.762 10.161 8.958 8.640 8.117 8.325 8.064 8.475 9.769 9.661 10.020 9.671 8.423 7.218 6.873 + 15.756 15.831 15.632 15.903 16.654 17.792 17.411 15.155 15.280 15.053 13.497 13.161 14.505 14.546 17.753 17.628 17.361 17.766 17.838 15.702 12.855 11.357 9.294 8.773 7.838 7.937 9.172 9.017 8.598 10.790 9.512 8.264 8.560 7.549 5.999 5.307 + 14.900 14.802 13.735 15.384 16.354 15.719 14.822 13.581 13.296 12.833 11.569 12.446 12.193 13.415 15.206 16.688 17.048 17.104 17.659 16.467 12.780 11.147 8.971 7.824 7.301 7.999 8.933 8.859 8.967 11.255 9.269 8.413 8.179 7.979 8.417 6.533 + 13.302 12.726 13.044 13.651 14.198 12.186 12.550 12.597 11.906 11.736 10.658 10.374 10.755 11.115 12.076 13.547 16.231 16.235 16.319 15.466 12.030 9.912 8.349 8.001 6.938 7.600 8.532 8.637 8.786 10.713 8.316 7.828 7.959 8.592 7.815 5.439 + 12.065 11.772 12.233 11.839 11.908 10.603 9.727 9.644 8.970 8.564 9.169 9.061 8.822 8.483 9.054 10.242 12.790 14.525 14.892 15.130 13.306 9.495 7.350 7.643 7.077 7.963 8.387 7.830 8.010 9.325 7.522 6.782 7.320 8.556 6.579 4.937 + 12.017 11.829 12.329 11.817 11.796 11.602 11.143 10.245 8.878 8.801 8.282 8.390 7.786 8.175 7.510 9.757 11.020 11.946 15.001 16.119 13.953 10.012 7.880 8.004 7.166 7.287 7.566 6.883 8.660 9.432 7.757 7.326 7.777 8.366 6.242 4.912 + 12.824 12.161 12.942 12.947 13.845 12.709 11.678 11.246 10.107 9.556 9.479 10.385 11.284 10.999 10.422 11.397 11.301 13.059 15.485 16.816 16.323 14.830 12.073 11.300 9.559 9.311 9.602 9.890 11.981 12.717 11.469 11.077 11.221 10.393 9.222 8.280 + 14.256 14.204 14.232 15.170 16.382 16.182 14.715 13.754 13.191 12.758 10.116 12.037 12.386 12.110 11.424 12.627 13.670 15.060 17.169 18.245 18.041 17.494 13.644 11.956 10.281 10.237 10.708 11.492 13.917 14.902 13.298 13.489 13.781 12.549 9.546 8.673 + 14.690 14.761 14.154 13.622 15.624 16.409 16.861 16.292 14.928 14.489 12.403 12.950 12.641 12.339 12.757 12.895 14.365 15.686 17.861 18.304 17.855 17.239 15.248 11.806 10.815 11.101 12.080 11.908 13.817 14.670 12.831 12.775 13.485 12.666 8.824 7.770 + 14.913 15.001 14.278 14.129 14.702 16.486 17.256 15.576 15.242 14.857 13.244 12.439 12.847 12.377 12.942 13.133 14.543 16.452 18.181 17.931 17.234 16.066 13.376 10.650 9.590 10.702 11.541 10.151 11.783 12.934 11.307 10.787 11.812 11.173 7.753 6.031 + 13.603 13.149 11.835 11.740 12.723 14.362 14.768 14.587 13.092 12.611 12.001 11.857 9.529 9.541 10.771 11.132 12.363 14.471 15.535 14.781 13.914 12.673 10.215 9.509 11.135 11.788 9.821 8.090 8.566 9.929 9.771 8.372 8.435 9.419 7.488 5.080 + 13.312 13.076 12.211 11.909 12.364 13.262 13.444 11.838 11.651 11.005 11.022 11.693 10.048 9.024 9.999 11.121 13.323 15.067 13.460 11.198 9.657 8.562 9.808 10.274 11.225 12.593 11.414 8.067 6.040 6.742 7.466 7.676 8.871 8.538 7.408 5.934 + 13.394 12.919 12.351 11.837 12.042 13.597 13.385 11.625 11.889 10.756 11.660 12.135 9.882 9.344 10.590 12.755 13.730 15.207 12.925 9.865 8.704 8.943 9.895 10.104 10.775 12.153 11.556 8.127 6.364 6.239 7.169 7.318 8.971 9.523 7.773 5.792 + 13.480 12.863 12.481 11.597 11.553 13.609 12.978 12.460 12.237 11.163 12.182 12.410 10.367 10.939 11.501 13.089 13.317 13.935 11.486 9.965 9.981 9.684 10.060 10.215 10.730 11.998 12.262 7.734 6.219 6.143 6.111 6.374 8.638 9.279 7.405 6.027 + 13.535 12.827 12.555 11.346 11.557 13.783 13.323 12.711 12.499 10.884 12.477 12.389 11.423 11.933 11.858 12.219 12.559 12.092 10.166 10.447 10.144 10.128 10.709 10.767 11.042 12.439 12.358 8.439 6.829 6.860 5.925 7.278 9.143 8.663 6.368 5.656 + 13.623 13.015 12.869 12.028 11.870 13.871 13.651 12.938 13.280 13.033 12.439 12.564 13.055 13.368 12.873 12.721 12.557 12.522 11.893 11.374 10.589 10.508 10.915 11.026 11.164 12.705 12.512 9.111 8.025 7.163 8.150 8.998 11.193 10.124 8.795 8.041 + 14.030 13.651 12.919 12.301 12.017 14.526 14.409 13.364 14.136 13.466 13.143 13.448 14.194 14.049 13.490 13.111 13.211 13.672 13.709 12.475 11.716 10.618 10.675 10.790 10.787 11.924 11.434 8.749 8.272 6.268 8.670 9.486 9.511 9.036 8.084 7.174 + 14.113 13.686 13.454 12.418 12.699 14.310 14.099 14.044 14.437 13.722 13.586 14.364 13.374 12.589 12.754 12.339 12.651 12.445 12.744 13.096 13.345 11.860 10.585 11.030 11.425 12.310 11.275 8.646 8.847 8.080 8.010 8.018 7.789 8.040 7.574 8.331 + 13.225 12.955 12.951 11.555 11.555 13.003 13.556 14.007 13.789 12.518 12.814 13.754 12.711 10.968 11.048 11.612 12.218 12.014 12.189 12.573 12.547 12.374 13.035 12.928 13.249 13.804 12.107 9.274 9.491 9.446 9.832 9.734 8.558 9.013 8.284 8.171 + 12.992 12.722 12.755 11.329 11.402 12.759 13.975 14.434 14.430 12.256 12.228 13.631 12.161 10.589 10.791 11.709 12.135 12.671 12.297 12.853 13.066 12.465 12.826 12.443 12.583 13.106 10.906 8.581 10.061 9.455 8.658 9.404 8.255 8.470 8.583 8.370 + 12.905 12.423 12.656 10.821 11.794 12.934 14.043 14.991 15.904 14.599 12.998 13.897 12.077 11.336 10.984 11.864 12.155 12.475 11.996 12.417 12.453 12.277 12.687 11.980 11.530 11.852 9.654 7.764 8.085 7.395 5.647 6.016 5.837 5.671 6.559 7.010 + 12.822 12.071 12.577 10.975 12.316 13.341 14.434 15.721 16.396 15.748 14.523 14.935 13.077 12.013 11.605 12.164 12.269 12.491 12.230 12.745 12.693 12.415 12.572 11.816 10.862 10.480 9.258 6.572 4.761 4.365 4.322 5.542 4.975 4.986 4.839 5.810 + 12.572 11.868 12.181 10.297 11.926 13.023 14.497 16.121 16.250 16.405 15.889 15.068 13.321 11.907 11.540 11.963 12.262 12.482 12.160 12.692 12.714 12.345 12.751 11.843 10.823 10.261 9.653 6.239 4.822 3.741 4.601 5.735 5.717 5.480 4.454 5.706 + 12.312 12.195 12.083 10.351 11.268 12.528 13.968 15.521 15.033 14.627 15.990 15.846 13.241 11.883 11.591 12.186 12.431 12.571 12.454 12.862 13.040 12.754 13.179 12.117 11.402 10.904 9.965 6.843 5.091 5.124 4.786 5.693 5.644 5.465 4.937 6.213 + 12.312 12.345 12.189 10.798 11.395 12.548 13.921 15.624 15.151 14.629 15.839 16.631 14.156 11.882 11.323 12.135 12.525 12.795 12.615 13.086 13.344 13.021 13.271 12.380 11.732 11.426 9.994 8.067 5.433 5.486 4.957 5.308 4.965 4.942 4.402 4.435 + 12.271 12.112 12.002 10.796 11.490 12.425 13.487 15.318 14.556 13.994 15.539 16.274 13.332 12.349 11.418 12.025 12.263 12.743 12.656 13.143 13.608 13.326 13.221 11.735 10.535 9.961 8.932 7.218 6.020 5.660 5.283 5.194 5.831 5.434 4.589 5.275 + 12.288 11.702 11.675 10.214 11.370 12.597 13.918 15.747 15.527 15.189 15.788 15.716 15.082 15.027 13.614 11.537 11.605 11.553 11.732 12.370 13.585 13.908 14.052 13.197 11.319 9.453 8.139 8.031 10.072 11.103 10.625 9.566 9.101 9.181 9.704 8.755 + 11.854 11.780 11.144 11.263 10.928 12.442 13.773 16.171 16.240 15.652 15.556 14.581 15.718 15.245 14.534 12.910 12.603 11.645 11.990 12.101 13.001 13.324 13.977 13.068 11.271 9.364 9.136 9.278 10.518 11.626 11.023 10.462 10.147 10.092 10.014 8.847 + 9.227 9.328 10.850 11.220 11.275 13.714 15.185 15.331 14.459 14.802 14.302 13.855 14.666 15.065 13.867 12.735 12.444 12.287 11.678 10.803 10.431 10.499 11.355 10.916 10.108 8.409 8.536 8.749 9.225 10.779 11.595 10.360 9.668 9.749 9.289 7.651 + 9.863 9.566 9.891 8.471 9.366 10.527 11.165 10.760 9.897 8.745 9.213 8.821 9.969 10.335 10.447 9.998 9.517 10.266 9.554 9.296 9.527 8.921 8.716 8.850 8.183 5.950 5.059 4.948 5.830 6.793 8.108 6.863 7.029 7.790 7.915 5.695 + 8.231 9.481 8.720 8.768 8.018 8.591 8.803 9.472 9.425 8.149 8.340 8.495 7.987 9.109 9.389 9.728 9.748 10.968 10.924 10.331 9.888 10.048 9.665 9.125 8.536 7.821 6.575 6.711 7.231 7.330 6.915 8.155 8.775 9.888 10.374 9.167 + 7.170 6.560 8.046 8.473 8.114 9.667 10.119 10.502 10.347 8.838 8.766 9.915 10.470 10.971 10.985 10.497 11.055 12.598 12.804 12.188 10.778 11.254 11.756 10.591 9.447 8.730 8.585 8.143 8.297 9.307 9.554 10.918 11.068 11.082 11.260 11.532 + 6.674 5.632 5.878 7.383 7.099 7.374 8.299 7.908 8.420 7.746 6.991 7.505 6.860 7.485 8.127 8.510 9.281 9.827 9.243 9.325 8.108 8.755 9.313 9.463 9.705 9.306 9.730 8.755 10.386 10.566 11.214 11.204 11.344 12.471 13.121 13.599 + 4.810 6.971 7.561 7.462 6.988 6.707 7.581 7.707 6.511 6.627 6.292 6.374 6.745 6.699 7.867 8.360 9.226 10.108 9.668 10.298 10.447 9.461 9.681 9.644 10.190 10.005 10.879 10.724 11.689 13.177 13.794 13.070 14.110 15.149 15.409 15.022 + 7.765 7.575 7.869 7.409 6.237 5.862 8.470 9.039 7.982 7.487 6.549 6.943 7.631 8.434 8.883 8.711 8.936 9.784 10.320 10.222 10.655 9.250 9.543 9.651 10.282 10.887 9.894 10.273 10.368 12.773 13.897 13.398 14.976 15.870 15.836 15.824 + 6.886 6.285 6.308 5.743 6.176 5.157 6.220 7.407 7.700 7.489 7.877 9.038 8.051 7.650 7.160 7.466 9.237 9.605 9.684 10.808 10.170 8.747 10.417 10.257 9.856 11.201 10.706 10.213 10.130 11.426 13.474 13.471 13.462 15.098 15.668 14.810 + 3.330 3.828 4.485 5.986 5.570 5.433 6.366 7.920 7.730 7.379 8.085 7.292 5.419 6.573 5.725 6.678 6.973 8.534 8.606 9.033 8.775 8.335 8.295 6.874 6.530 7.008 8.195 8.098 8.287 9.129 10.843 12.079 12.702 13.755 13.493 12.854 + 6.077 6.714 6.104 5.959 6.169 5.397 5.394 7.651 7.345 6.487 5.923 5.745 3.824 5.524 5.107 5.336 5.412 6.324 6.155 5.615 6.451 7.361 7.819 6.935 6.926 6.345 5.672 5.684 5.956 6.837 6.718 8.000 7.852 9.422 9.160 8.676 + 7.489 5.973 6.377 5.294 5.900 6.109 6.171 8.290 7.428 6.288 5.364 5.828 4.962 5.868 5.838 6.537 6.276 6.032 6.707 6.768 6.357 5.940 6.840 6.650 6.234 4.822 4.982 4.916 5.335 4.932 4.819 4.941 5.620 6.407 7.162 6.231 + 6.606 6.540 6.243 6.394 5.755 6.779 7.234 7.556 4.834 5.435 5.834 6.144 5.166 6.266 6.779 7.295 7.614 7.512 8.138 7.950 7.102 6.641 7.028 6.453 6.653 5.919 5.456 4.665 4.784 5.222 5.999 6.276 7.572 7.687 7.619 6.884 + 5.527 7.433 7.403 8.332 8.725 8.464 8.118 8.791 8.782 8.947 9.403 9.690 9.512 9.301 9.930 9.802 8.917 9.709 11.569 11.183 10.990 11.037 10.291 9.998 9.500 8.556 9.179 8.930 8.606 9.355 10.207 10.596 13.055 13.037 11.382 9.997 + 6.810 8.072 8.003 8.702 10.756 11.464 10.666 10.189 10.021 10.163 10.931 11.019 9.909 10.034 11.102 10.796 9.047 10.930 12.216 11.170 11.305 11.833 10.571 10.566 9.972 11.111 11.186 10.549 10.969 12.623 13.934 13.007 14.832 14.580 13.477 13.376 + 10.217 7.990 7.169 8.246 9.255 11.317 10.888 11.148 10.934 10.296 10.995 9.414 9.472 8.103 9.509 9.697 10.220 10.840 11.877 10.838 10.645 10.256 8.211 9.612 10.260 12.550 12.074 10.403 11.145 14.172 14.101 12.186 11.207 11.936 13.493 13.280 + 13.215 12.990 13.133 12.856 13.901 14.205 14.033 14.220 12.705 12.753 11.993 11.922 11.945 11.603 11.856 12.489 13.196 13.754 13.268 12.656 12.161 11.436 11.024 10.699 11.905 12.383 11.046 8.853 10.494 12.528 11.382 9.148 8.423 8.822 9.246 8.499 + 13.275 13.574 12.539 12.642 14.333 14.688 15.204 13.510 12.639 12.081 12.519 11.674 11.545 11.787 12.271 12.734 13.864 13.935 13.520 13.012 12.480 11.847 11.869 11.825 12.189 11.713 10.671 9.071 8.144 6.638 6.939 6.879 6.324 6.221 6.474 5.508 + 13.157 12.333 11.416 12.186 12.882 13.392 13.362 12.473 11.412 11.300 11.004 10.688 10.349 10.832 11.898 12.703 12.595 12.012 11.917 11.829 11.604 11.078 11.952 11.850 10.211 9.973 10.173 9.052 6.469 6.085 6.473 6.246 6.247 6.126 6.685 6.127 + 12.756 12.389 11.642 11.150 11.735 11.237 10.026 9.754 8.178 8.703 8.691 8.869 7.174 7.795 10.346 10.022 9.308 9.295 9.639 9.809 9.635 10.010 11.557 11.398 7.851 8.458 9.637 9.354 5.832 5.821 5.621 6.111 7.987 7.304 6.642 6.186 + 12.892 12.279 11.690 11.207 11.320 11.253 10.978 10.289 8.135 7.915 8.335 7.890 6.252 7.959 10.526 10.156 9.537 9.783 9.859 10.024 10.078 10.180 11.512 11.327 7.939 8.539 9.652 9.205 6.119 6.169 4.706 6.930 8.437 7.762 6.538 5.242 + 12.621 12.027 11.668 11.491 11.458 11.633 11.095 10.064 8.223 8.104 8.775 7.801 6.652 8.165 10.761 10.481 9.912 10.280 10.043 10.263 10.359 10.481 11.624 11.275 7.626 7.621 9.335 9.526 6.119 5.810 4.684 6.714 7.161 6.415 5.735 6.583 + 12.710 11.829 11.673 11.481 11.757 11.746 10.631 9.705 8.680 8.773 9.303 8.106 7.305 8.585 10.388 11.057 10.021 9.773 9.853 10.335 10.694 10.949 11.700 10.689 7.283 6.892 8.235 8.905 6.364 5.907 5.167 5.862 6.256 6.463 6.273 6.035 + 12.970 12.374 12.279 11.671 12.520 13.655 13.450 12.399 11.327 11.271 10.982 10.400 9.810 10.895 11.983 13.210 14.221 14.863 13.893 12.817 12.175 12.153 12.323 11.670 8.993 7.899 7.569 8.169 8.311 7.918 8.023 7.956 8.118 7.219 8.459 8.149 + 13.267 12.613 12.742 11.891 13.639 14.196 15.186 14.580 12.874 11.795 12.175 11.164 10.582 10.905 11.435 12.295 13.688 15.117 16.547 16.045 14.869 13.285 12.763 12.667 12.610 11.046 9.507 8.867 9.586 9.450 8.490 9.014 8.241 6.417 7.320 6.595 + 13.280 12.394 12.760 12.183 13.393 14.475 15.926 15.474 14.032 11.918 12.280 11.455 10.632 10.888 11.100 11.585 12.318 13.067 15.696 16.798 16.347 14.056 12.868 12.890 13.607 12.044 10.273 8.924 10.197 10.239 9.120 10.808 10.213 7.646 8.441 8.525 + 13.259 12.579 12.835 12.567 13.397 15.002 16.037 15.658 14.054 12.502 12.100 11.559 10.827 10.675 10.997 11.204 11.722 12.276 13.658 15.789 17.269 15.387 13.363 13.045 13.885 13.110 10.910 9.070 11.114 11.092 9.251 12.598 11.991 8.491 9.370 9.853 + 13.248 12.910 12.962 12.830 13.932 15.578 16.008 15.354 13.868 12.592 12.448 11.603 11.111 10.964 11.168 11.225 11.619 11.951 12.715 14.438 16.176 15.993 13.757 12.861 13.272 13.612 11.669 8.811 10.906 10.926 8.573 12.152 12.218 9.083 9.349 9.901 + 13.392 12.945 12.681 13.317 14.214 15.278 15.093 13.511 12.237 11.941 11.519 10.039 10.238 9.808 10.009 9.437 9.527 10.280 11.574 12.923 14.594 15.135 13.097 12.225 13.272 13.901 12.351 10.337 11.805 11.628 9.804 13.044 13.068 9.936 10.204 9.999 + 12.519 10.293 11.786 12.154 12.770 14.885 14.027 11.658 11.491 9.344 9.670 8.001 8.361 7.659 7.552 7.661 7.588 7.812 9.224 10.457 12.163 13.452 12.420 10.221 11.593 12.598 11.677 10.068 11.587 11.252 8.846 12.265 12.111 9.098 9.783 9.418 + 10.622 10.556 10.888 11.634 12.335 13.143 11.990 10.154 9.712 8.583 8.144 8.481 8.636 8.176 8.455 8.628 8.679 9.152 9.461 10.366 10.109 11.209 11.943 10.838 11.600 11.845 11.126 9.123 9.982 9.593 9.242 9.427 8.848 8.367 9.342 9.217 + 7.126 6.706 7.043 7.936 7.721 8.521 7.804 7.764 7.518 7.237 6.326 6.748 6.795 6.669 6.843 7.173 7.347 7.570 7.952 8.411 8.860 8.567 9.248 8.835 8.788 9.381 8.505 5.985 6.022 7.226 7.208 6.809 6.481 7.015 7.640 7.764 + 5.625 4.410 4.575 5.763 7.801 7.726 6.200 6.313 6.064 6.184 4.817 2.094 2.931 3.044 3.670 5.412 5.818 4.741 5.674 6.466 6.803 6.157 5.494 5.006 4.786 5.571 4.939 4.629 5.622 5.667 5.660 6.564 6.403 7.073 6.890 5.467 + 5.880 5.378 5.672 6.213 5.080 7.554 8.306 7.006 6.226 5.507 5.756 4.796 4.736 5.243 5.772 5.702 6.612 6.728 7.370 7.909 7.853 7.802 7.706 7.974 8.077 7.868 7.221 6.106 5.634 6.712 7.720 8.042 8.213 8.202 8.240 7.918 + 7.739 7.479 7.464 9.000 8.715 9.516 9.682 9.206 8.896 7.879 7.770 8.797 9.127 9.032 9.837 10.025 10.730 11.851 11.476 11.401 12.965 12.463 12.488 13.262 12.879 13.249 13.162 10.428 10.616 11.120 10.801 11.622 11.437 11.361 11.329 11.271 + 8.720 8.709 7.789 10.790 11.308 11.555 11.660 10.638 9.056 8.095 9.429 9.504 9.063 9.718 10.419 11.452 10.664 11.626 11.915 11.785 12.246 10.813 12.378 12.481 12.496 13.413 13.498 11.144 10.851 11.111 10.984 12.685 11.933 11.829 11.219 11.422 + 11.915 12.341 11.725 13.488 14.351 14.815 13.356 11.678 11.202 10.043 8.881 8.324 8.152 7.285 7.876 8.266 8.625 9.172 9.975 10.753 12.492 13.558 12.701 11.426 11.122 12.142 11.668 9.279 10.011 9.653 11.603 12.062 10.179 9.221 8.436 8.470 + 13.244 13.415 13.782 14.043 15.532 17.042 16.290 14.795 13.295 12.839 11.892 11.330 10.865 10.473 10.601 10.617 10.695 10.981 11.742 12.735 14.055 13.459 11.395 10.356 10.645 11.761 10.484 9.025 10.360 12.425 14.290 14.219 13.297 10.629 7.989 7.314 + 12.908 13.119 13.427 13.421 14.998 16.980 16.259 16.189 14.455 13.450 12.520 12.072 12.052 11.769 11.735 11.937 12.241 13.094 14.495 15.936 15.742 14.108 12.124 10.605 10.586 10.909 8.942 6.986 8.295 10.042 12.311 12.240 11.046 9.236 8.136 6.912 + 12.243 12.560 12.638 12.786 14.226 16.038 17.004 15.418 13.964 13.502 12.294 11.157 11.583 10.960 11.108 11.288 11.734 12.709 14.142 16.096 14.888 12.424 11.323 10.906 10.837 9.604 8.373 8.508 7.585 7.998 9.910 11.110 9.892 8.834 8.518 6.416 + 10.586 11.337 11.564 11.708 14.193 15.948 15.848 13.823 12.600 12.143 11.210 10.347 10.496 9.972 10.106 10.297 10.875 12.340 14.208 13.512 9.868 9.089 9.812 10.149 9.578 8.351 7.186 7.920 7.225 6.977 9.520 11.423 10.204 9.092 8.469 6.351 + 10.703 10.742 10.381 10.752 10.747 10.479 10.206 8.991 8.648 7.407 7.546 7.362 7.024 6.805 6.948 6.256 7.222 8.810 7.819 7.342 6.845 7.420 8.169 7.532 6.315 6.124 6.345 5.841 5.552 6.141 6.263 6.629 7.043 6.683 6.620 6.218 + 9.849 9.376 7.615 9.564 9.360 8.984 8.798 8.200 7.441 7.365 6.179 6.162 6.753 6.171 5.285 5.563 6.347 6.437 6.480 8.208 8.139 8.397 8.559 7.916 6.938 6.524 6.277 7.216 8.026 7.828 8.579 8.878 8.282 6.349 7.479 6.668 + 8.703 7.230 6.860 8.245 10.237 10.273 9.915 10.382 10.580 9.847 10.624 9.752 9.581 10.407 9.517 9.909 8.282 9.608 12.444 13.389 13.829 13.431 12.903 11.793 10.374 9.345 9.199 9.623 9.515 10.694 10.258 10.806 9.755 9.234 9.086 8.184 + 10.402 10.640 10.233 11.355 11.322 11.730 11.312 12.370 11.201 11.011 10.986 11.130 10.673 10.539 9.971 9.510 11.639 11.715 13.849 14.107 14.648 14.405 13.706 11.714 10.654 10.328 11.161 9.951 10.062 10.751 11.482 12.346 11.447 10.497 9.854 9.223 + 13.731 13.197 11.590 10.242 10.809 10.599 10.593 10.801 10.444 10.513 12.132 12.947 11.593 11.809 11.368 12.207 13.860 14.352 14.389 13.564 13.051 12.582 11.737 9.788 9.124 9.394 8.845 9.332 9.601 10.682 10.649 10.230 9.834 10.292 9.045 7.023 + 11.356 12.125 11.473 9.011 8.253 8.449 9.899 10.324 9.715 10.919 12.440 13.364 14.266 13.547 13.295 12.837 13.715 14.646 13.784 12.759 12.345 13.222 12.407 11.202 11.873 12.132 10.855 11.400 13.218 12.964 11.707 11.312 11.846 12.938 12.926 10.561 + 11.561 10.719 9.274 9.782 9.087 8.715 10.461 10.239 9.144 8.982 12.447 13.984 13.626 12.732 13.363 12.603 12.313 12.476 11.813 11.247 11.305 13.097 13.462 11.215 10.001 10.546 9.630 9.062 12.033 12.310 12.069 11.424 10.812 11.003 11.516 11.241 + 14.747 14.348 14.124 13.644 12.683 11.531 11.154 10.927 10.026 10.447 13.758 14.174 13.042 11.833 12.834 12.215 10.704 12.065 11.632 11.738 10.869 11.823 12.403 10.865 10.139 9.767 10.083 9.023 9.188 9.678 10.833 11.970 9.852 7.958 9.503 9.739 + 14.699 14.124 12.935 12.542 10.890 10.076 10.215 10.256 11.202 10.738 11.194 12.102 13.058 12.925 13.077 13.180 12.571 13.852 12.211 11.380 10.975 13.395 14.359 13.007 11.327 9.009 10.366 10.613 12.565 14.404 13.479 12.124 10.254 9.929 9.711 9.503 + 10.413 10.756 9.529 8.381 9.362 10.204 9.528 10.974 11.071 11.814 11.885 12.540 13.739 13.635 13.340 13.507 12.275 13.270 12.423 10.863 11.751 14.850 15.140 13.945 12.306 10.015 10.411 12.776 15.093 15.170 14.121 13.332 10.056 9.507 10.032 9.993 + 10.693 11.229 10.732 10.886 9.323 9.405 8.915 9.726 11.011 11.611 12.098 11.653 12.042 13.248 13.278 12.480 11.543 11.974 11.067 9.996 11.360 12.994 14.100 12.843 10.489 10.634 9.320 11.179 13.531 13.654 13.521 12.297 10.640 10.032 9.175 8.380 + 11.739 11.972 13.270 13.048 10.931 10.909 10.218 9.684 11.899 13.068 13.997 13.569 13.409 13.088 13.301 12.235 11.022 11.056 10.179 9.690 10.136 11.475 12.291 9.388 8.739 8.864 8.431 8.802 9.176 10.254 12.814 11.568 9.918 9.062 7.282 7.370 + 13.869 13.543 13.674 13.408 12.367 12.673 13.530 13.743 13.930 13.676 14.472 13.552 12.637 13.521 12.698 12.308 10.712 10.889 9.854 8.346 9.628 10.866 11.407 9.067 8.445 8.143 8.176 7.034 6.999 8.368 9.883 9.656 7.633 7.664 6.228 5.799 + 13.510 12.741 12.429 13.430 13.661 14.503 15.517 16.303 16.735 16.233 16.673 16.639 16.703 16.392 14.903 12.951 11.788 11.356 10.906 10.073 9.361 9.893 9.182 7.909 7.151 7.241 6.302 6.244 7.636 9.118 8.114 7.255 7.867 6.743 5.576 4.836 + 13.112 12.581 12.471 13.396 14.148 14.621 15.793 17.050 17.265 17.226 16.570 15.586 17.214 17.276 15.962 14.171 13.352 12.849 13.019 13.299 13.977 13.225 10.259 7.905 5.062 5.279 4.622 5.453 7.504 9.803 9.001 7.192 7.025 6.520 5.042 2.405 + 12.817 12.195 11.999 13.266 13.971 14.144 15.571 17.280 17.590 16.805 15.255 15.599 17.023 17.687 16.856 14.392 13.791 13.021 12.938 13.444 14.423 13.139 9.873 8.105 6.902 5.052 5.127 5.357 7.711 9.940 9.445 7.676 6.898 6.059 4.971 3.197 + 12.572 11.717 12.124 13.085 13.651 14.153 15.784 17.429 17.884 16.639 14.975 15.740 16.494 17.922 17.191 14.714 14.086 13.510 13.257 14.073 14.560 11.377 9.324 8.009 7.171 5.910 5.758 6.009 7.795 10.683 10.194 8.202 7.627 6.499 5.226 4.902 + 12.414 12.062 12.576 13.162 13.840 14.481 16.165 17.419 17.707 16.411 15.114 15.862 16.232 17.475 17.649 15.982 15.025 14.476 14.907 15.414 13.782 11.420 9.760 8.486 7.337 6.229 6.177 6.307 7.839 10.909 11.269 8.775 6.618 5.883 5.324 5.936 + 12.560 12.216 12.521 13.268 13.903 14.501 16.414 17.176 17.523 16.107 15.160 15.837 16.020 17.177 17.846 16.574 15.698 15.564 16.367 15.509 12.841 10.232 8.948 8.180 7.368 6.270 5.332 4.777 6.627 9.494 10.952 9.153 6.562 5.094 4.705 5.998 + 12.199 11.627 11.717 13.014 13.536 14.003 16.248 16.744 17.156 15.159 14.124 15.520 15.307 16.702 17.317 16.959 15.195 14.965 15.565 14.789 11.279 9.478 8.374 7.325 6.585 5.977 5.325 5.589 5.727 8.371 10.636 9.034 6.086 5.807 5.114 4.321 + 11.770 10.619 11.564 12.532 13.059 13.480 16.154 17.014 16.658 14.721 13.623 14.814 14.541 16.017 16.960 16.662 15.210 15.916 15.723 13.738 11.048 9.410 8.244 6.922 6.709 6.306 5.689 6.909 6.898 8.647 10.950 9.720 7.277 7.248 6.824 6.189 + 11.475 11.235 12.021 12.647 13.395 14.349 16.530 17.253 16.634 14.973 13.630 14.645 14.659 15.761 16.985 17.031 15.770 16.724 16.447 13.634 11.001 9.212 7.556 6.895 7.053 7.062 6.730 6.404 7.297 9.477 11.847 10.309 6.641 6.112 6.085 6.318 + 11.726 11.281 11.792 12.748 13.534 14.540 16.623 16.783 16.428 15.102 13.588 14.765 14.715 15.724 17.014 17.606 16.564 16.811 16.263 13.876 11.304 9.346 8.148 7.651 7.416 7.342 6.954 6.986 8.162 9.849 11.576 8.945 6.811 6.538 6.277 6.354 + 11.729 10.734 11.224 12.515 13.285 14.171 16.341 16.475 16.013 14.836 12.997 14.322 14.015 15.015 16.025 17.358 16.463 16.437 16.220 13.742 11.483 9.515 8.443 7.603 7.682 6.737 6.404 6.561 7.133 9.167 11.329 8.672 6.456 6.421 5.441 5.631 + 11.286 10.282 11.231 12.054 12.955 13.984 16.276 16.630 15.406 14.301 12.587 13.625 13.414 14.280 15.831 17.360 16.619 16.826 16.608 13.879 11.810 9.458 8.135 7.076 7.593 7.076 5.933 6.048 6.688 8.910 10.487 7.233 5.984 5.478 5.047 5.579 + 11.255 10.757 11.642 12.260 13.356 14.658 16.434 16.272 14.890 14.096 12.980 13.256 13.396 14.161 15.560 17.233 17.781 17.616 17.430 14.941 12.544 10.361 9.071 8.433 8.188 8.107 7.691 7.302 7.075 8.724 10.248 7.834 6.871 6.393 6.313 6.508 + 11.258 10.887 11.570 12.553 13.532 14.899 16.476 15.779 14.956 14.358 12.717 13.124 12.790 13.797 14.870 16.274 17.648 17.591 17.549 15.346 12.725 10.371 9.197 8.642 8.378 7.960 7.957 7.670 7.697 10.068 11.043 8.842 7.102 6.695 6.730 6.649 + 11.153 10.285 11.049 12.400 13.015 14.314 16.034 15.503 14.149 13.943 12.049 12.369 12.048 13.248 13.589 14.925 17.086 16.721 17.436 15.838 13.401 10.242 8.984 7.965 7.109 6.706 7.706 8.401 9.244 9.612 10.374 8.366 6.617 6.981 6.476 5.641 + 10.953 9.806 11.267 11.976 13.011 14.859 15.809 15.410 13.076 13.271 11.796 11.759 11.802 12.505 13.168 14.722 16.881 16.992 17.314 16.326 13.579 10.874 8.881 7.643 7.641 7.182 7.205 8.011 9.759 9.693 9.806 8.367 7.174 7.411 6.305 5.392 + 11.261 10.636 11.878 12.480 13.920 15.448 15.927 15.249 13.230 13.275 12.345 12.096 12.152 12.729 13.455 14.771 16.370 17.432 17.717 16.640 14.303 11.334 9.032 8.044 8.033 7.454 7.303 7.604 10.501 11.173 9.930 7.713 6.904 6.748 6.164 6.003 + 11.502 10.970 11.731 12.972 13.983 15.313 15.101 14.619 12.967 13.158 12.029 11.884 12.129 12.506 13.192 14.320 15.557 17.358 17.756 17.095 14.483 11.587 9.683 8.670 7.604 8.326 8.596 9.014 12.122 12.621 10.696 8.164 7.073 7.112 5.840 5.220 + 11.512 10.771 10.997 12.767 13.744 14.913 14.478 13.097 12.257 12.555 10.740 11.387 11.156 11.627 11.934 13.284 14.442 16.689 17.783 17.069 15.115 12.617 9.773 8.656 8.386 9.205 9.510 8.870 11.799 11.753 9.533 8.145 7.280 6.835 6.690 5.898 + 11.132 9.974 11.304 12.272 14.211 15.036 14.167 12.563 11.891 12.225 10.231 11.083 10.575 11.277 11.575 12.737 13.802 16.314 17.743 16.642 15.799 12.864 10.314 8.246 8.408 7.998 9.126 9.555 11.715 11.278 9.091 7.365 7.179 7.623 6.973 6.155 + 11.174 10.549 11.953 13.402 13.714 13.684 13.428 11.861 11.328 11.438 10.383 10.581 10.307 10.864 11.087 12.011 12.873 15.047 17.031 16.274 15.724 12.996 9.653 8.645 8.600 8.563 8.529 10.031 11.640 10.779 10.033 8.042 8.598 8.201 6.506 5.568 + 8.344 9.336 10.088 8.658 9.088 9.954 8.643 8.089 8.307 7.187 7.447 7.501 8.009 8.406 8.625 9.069 9.769 11.531 14.404 14.811 13.465 11.655 8.615 7.201 6.008 5.436 6.187 6.548 7.622 6.652 7.558 7.718 7.142 6.669 4.965 3.703 + 8.098 9.001 8.357 8.307 7.858 8.139 6.865 6.965 6.989 7.723 8.238 7.864 7.472 8.565 8.953 8.300 9.463 10.793 12.620 12.476 11.333 12.373 11.828 10.605 9.804 9.038 8.418 9.335 9.895 9.191 8.372 9.137 9.596 9.314 8.591 7.058 + 9.075 9.528 8.564 7.919 7.134 8.205 8.366 6.063 6.426 6.394 6.956 8.274 7.264 7.419 7.253 7.247 8.502 9.439 10.900 11.433 10.263 10.455 9.543 7.641 7.098 6.285 6.485 6.604 7.440 7.429 7.791 8.025 7.857 8.679 9.399 8.256 + 8.324 9.637 8.934 6.698 7.905 8.520 8.358 6.745 7.254 6.571 5.975 6.692 6.132 7.690 7.627 7.350 6.408 8.779 10.154 10.210 9.491 6.915 7.433 5.591 5.783 4.950 4.971 6.522 6.921 8.308 9.238 8.880 6.747 8.282 9.136 7.949 + 8.001 8.856 8.951 9.224 8.509 8.294 9.842 9.773 8.132 8.753 9.716 8.906 9.512 9.749 9.225 9.923 10.505 10.499 11.267 11.647 11.463 11.130 11.506 10.906 10.351 10.409 10.254 10.331 10.139 9.720 10.156 10.607 9.845 9.453 9.648 8.980 + 7.293 8.865 9.688 10.827 10.334 11.072 11.830 11.607 12.359 12.357 12.727 12.964 12.753 12.482 10.625 11.681 11.672 12.302 12.962 12.904 13.791 12.912 13.150 12.312 12.152 12.805 12.871 12.229 10.952 11.260 12.603 12.885 11.593 12.022 13.339 12.378 + 8.655 9.260 9.469 11.348 11.297 10.594 11.662 11.678 11.920 11.850 10.680 11.105 10.017 10.278 9.291 9.469 10.320 11.029 12.300 13.176 13.274 12.196 11.444 12.022 11.966 11.989 12.576 11.939 10.834 10.906 11.965 11.372 8.870 11.263 13.032 13.109 + 10.077 10.444 11.053 11.306 9.273 7.594 9.905 9.590 9.873 11.038 11.041 12.608 11.909 10.572 10.445 11.340 10.634 12.345 13.144 15.684 15.628 13.294 11.155 11.734 12.030 12.301 11.585 11.904 11.042 10.557 10.986 10.850 8.649 9.547 12.491 13.049 + 10.211 9.096 9.513 9.898 9.001 8.818 10.590 9.802 10.500 11.859 10.795 11.885 11.819 11.192 10.389 11.534 11.379 12.875 14.058 15.703 16.470 14.710 12.235 12.557 12.758 12.230 10.140 9.806 10.021 9.359 9.094 9.012 8.229 8.051 9.721 10.402 + 10.321 11.332 9.395 8.607 9.226 10.253 10.198 10.647 10.758 11.180 11.462 10.906 12.437 11.963 10.945 11.423 12.841 12.890 13.369 14.792 15.172 14.291 12.463 12.775 12.896 12.323 11.181 9.976 9.545 10.513 10.217 8.721 8.695 8.102 8.716 8.745 + 11.556 11.445 9.860 8.823 8.737 9.002 11.079 11.922 11.513 12.274 11.801 10.897 11.494 11.884 11.982 12.113 11.480 12.433 13.589 16.288 16.048 13.859 12.054 10.729 10.980 11.549 11.018 10.517 9.960 10.584 10.696 8.619 9.629 9.296 8.771 9.056 + 9.248 8.957 8.134 9.950 9.429 8.647 9.942 11.612 10.987 10.198 10.059 11.379 11.843 11.140 10.802 10.991 11.301 12.638 13.093 15.477 14.371 11.670 10.660 10.010 10.846 12.467 12.595 11.951 9.970 10.066 10.055 10.282 10.644 9.900 9.841 9.199 + 9.664 9.637 10.217 9.093 9.307 9.093 8.723 7.783 8.697 10.317 10.620 9.987 8.641 9.742 9.489 9.668 11.419 12.524 13.201 14.518 13.090 11.870 9.971 10.426 10.775 11.154 10.887 10.711 10.285 10.047 9.476 9.303 10.193 9.958 9.641 8.903 + 12.238 12.237 12.156 10.851 10.134 8.877 6.817 6.905 9.258 10.144 10.849 9.953 8.312 8.393 8.867 10.759 11.482 11.542 12.138 13.270 13.335 10.130 9.002 9.238 8.940 9.372 9.929 9.050 9.191 10.015 9.436 9.137 9.355 8.878 8.898 8.206 + 9.134 8.180 9.080 8.288 8.574 8.211 8.445 8.876 8.839 8.246 9.694 10.904 9.785 9.568 9.447 12.126 11.301 10.187 12.464 13.897 13.190 11.279 10.075 9.821 10.073 9.261 9.060 9.444 9.688 10.046 9.488 10.552 9.893 9.370 8.095 7.993 + 9.884 9.034 8.367 8.853 8.947 7.781 6.183 8.489 9.505 9.267 9.709 10.073 9.514 10.190 10.159 12.167 11.627 11.287 13.510 14.600 12.259 11.000 9.955 8.780 10.397 9.750 9.657 10.262 9.778 10.137 9.060 10.319 9.665 9.065 9.487 9.119 + 9.864 9.516 9.203 8.000 7.993 8.637 7.910 9.229 8.346 7.556 8.306 8.998 9.331 9.130 8.549 9.312 10.561 10.983 13.411 13.649 11.423 10.324 9.234 8.604 8.306 8.894 8.645 7.477 7.723 8.966 9.298 10.127 10.101 9.573 9.804 9.142 + 10.209 9.231 7.548 7.186 7.789 9.559 9.131 8.411 8.434 7.939 9.373 8.713 8.669 9.371 8.796 8.560 8.561 9.716 11.965 11.851 11.194 10.280 8.393 7.593 8.015 7.948 8.169 7.787 7.516 8.583 8.938 9.667 9.533 8.972 8.657 8.454 + 10.653 9.915 8.761 8.173 8.314 7.461 6.245 6.972 7.709 8.720 10.366 9.595 8.919 8.547 8.291 8.701 9.228 10.895 13.003 13.175 11.415 9.360 7.995 7.995 7.780 8.221 7.824 6.001 6.973 7.830 8.266 8.166 8.427 9.803 8.027 8.008 + 9.056 9.924 9.994 10.300 9.295 9.703 9.646 9.193 9.280 9.048 9.998 9.041 8.674 8.150 7.903 8.733 10.107 12.647 13.023 12.151 11.545 9.175 8.983 8.344 8.181 8.701 8.851 7.417 4.878 8.001 8.493 8.127 8.943 9.929 8.811 8.669 + 9.244 10.659 11.232 10.521 9.850 10.680 11.568 11.534 10.398 9.332 9.289 9.134 8.136 7.332 7.744 7.213 9.701 10.982 12.098 10.098 9.953 9.034 7.844 6.477 7.845 9.620 9.801 7.762 5.705 7.572 7.548 7.995 9.875 9.647 7.964 7.276 + 4.442 7.498 8.758 7.891 6.493 5.930 9.265 9.900 6.999 5.587 6.061 5.612 5.132 4.915 5.729 5.658 6.205 6.944 7.832 7.438 6.211 4.573 3.843 4.374 5.079 6.130 6.617 4.689 3.416 4.490 3.951 4.129 6.681 5.665 4.204 4.143 + 8.359 8.493 8.067 7.255 7.729 8.631 8.350 6.511 6.808 7.717 8.347 7.261 6.106 6.361 5.941 5.787 6.076 6.993 5.696 6.936 6.703 4.864 5.403 4.349 4.463 3.810 4.398 4.058 3.673 4.407 4.153 4.602 4.592 3.744 3.870 2.739 + 7.530 7.731 6.075 4.781 6.977 8.268 8.169 7.037 6.873 7.113 7.530 7.658 6.272 6.687 5.690 5.773 7.077 7.180 6.225 5.971 4.758 3.960 4.682 4.300 4.388 4.254 4.397 4.498 4.689 5.094 4.541 4.795 5.881 4.865 4.956 3.979 + 5.888 5.502 5.786 5.922 4.209 3.894 5.530 5.434 5.575 5.292 5.976 6.305 6.829 6.072 5.296 6.318 7.709 6.723 5.559 4.556 5.324 4.964 5.079 5.182 4.186 4.070 3.765 3.900 5.004 4.688 4.843 4.978 5.022 4.122 4.808 3.773 + 5.152 5.124 5.985 4.942 4.479 5.685 6.446 6.788 5.736 5.215 6.105 6.052 5.114 6.552 5.735 6.449 7.346 7.654 6.822 5.347 6.507 5.922 5.196 4.924 4.429 4.360 4.258 4.151 4.295 4.414 4.733 4.334 4.199 4.196 4.589 3.855 + 4.463 5.568 5.264 5.465 5.284 4.290 6.679 6.860 4.940 4.410 4.755 5.275 5.408 7.067 6.361 6.472 7.451 6.949 7.173 6.173 5.818 5.311 4.573 4.677 4.317 4.127 4.363 4.235 5.505 4.607 4.798 4.405 4.586 4.580 4.063 3.580 + 6.079 6.690 8.043 7.871 8.270 9.313 10.062 10.417 10.342 10.008 9.957 9.862 9.669 10.039 10.368 10.650 11.042 11.624 11.933 11.384 10.509 9.981 9.836 9.634 9.543 9.303 8.216 7.131 7.390 6.678 6.192 5.923 5.961 5.172 6.545 7.064 + 10.908 10.196 9.303 10.479 11.072 10.799 13.436 14.376 13.563 12.535 13.107 12.040 11.974 11.251 11.863 12.256 12.948 14.516 14.956 13.464 12.612 12.506 12.696 12.402 12.425 13.619 12.256 11.589 11.570 9.967 8.998 8.288 8.822 8.910 10.432 10.105 + 11.845 12.058 10.419 10.552 10.498 11.067 12.044 12.416 12.520 12.504 13.426 13.106 12.168 12.614 13.271 12.962 12.633 15.265 15.483 14.994 12.994 12.539 12.130 11.832 12.245 13.537 13.484 11.463 11.441 11.182 10.563 10.474 12.263 12.179 12.466 13.016 + 12.490 13.289 13.439 13.659 12.771 12.319 12.144 12.336 12.160 11.784 13.009 14.026 12.836 13.171 12.561 12.793 12.323 13.137 15.236 14.916 14.496 14.284 12.710 13.962 13.199 12.605 14.157 12.361 11.858 13.574 14.275 12.841 13.779 13.943 14.101 14.063 + 14.946 14.348 15.454 15.152 14.256 13.098 13.422 14.379 14.413 13.568 13.255 14.583 13.721 12.413 13.115 12.858 14.082 14.494 14.660 15.014 16.008 16.120 14.256 13.358 12.858 13.166 13.136 12.249 12.293 12.658 13.677 13.783 14.559 14.832 14.119 14.282 + 15.759 14.367 13.198 12.898 12.941 12.017 10.725 12.647 12.138 10.905 11.013 11.936 13.186 12.963 13.376 13.336 13.225 13.003 14.200 14.257 14.574 13.336 13.065 13.459 13.756 12.522 12.840 11.433 10.781 11.775 12.764 13.849 13.888 14.420 13.953 12.718 + 11.379 12.614 12.292 10.377 9.327 8.822 10.623 10.365 9.624 8.696 9.254 11.273 11.980 13.162 14.526 14.400 14.565 13.240 13.205 14.936 14.986 14.015 11.813 13.666 13.984 13.617 13.406 10.780 10.297 12.138 12.910 12.690 12.379 12.714 12.674 12.419 + 9.595 11.140 10.614 8.585 6.734 8.562 10.328 10.674 10.266 10.326 9.063 10.971 11.716 13.334 14.030 14.813 15.796 14.693 14.807 15.094 15.564 14.540 13.320 13.244 13.326 13.380 12.907 10.178 9.617 11.288 13.312 13.045 11.588 11.314 12.357 12.055 + 7.797 7.438 7.083 6.737 6.760 7.422 11.310 13.317 12.239 10.278 10.218 11.383 9.585 10.969 12.723 13.984 15.858 14.322 14.537 14.555 15.932 14.716 13.172 12.609 13.143 13.555 13.491 11.272 10.415 11.517 12.348 12.368 11.350 11.502 12.228 12.548 + 8.307 8.113 7.902 6.766 6.843 6.734 11.333 13.467 12.157 9.339 10.511 11.179 9.039 10.199 11.660 12.571 15.531 14.276 14.281 15.868 16.351 14.727 12.471 11.941 11.955 13.645 13.391 11.618 11.463 11.934 12.189 11.379 10.980 12.356 12.981 13.002 + 9.060 7.149 5.786 6.062 6.186 7.206 10.539 12.873 11.440 7.250 10.167 10.005 9.289 9.694 11.169 12.725 15.489 13.696 13.549 16.562 15.446 12.737 12.497 11.812 12.472 13.504 13.318 12.108 11.604 11.208 12.437 11.275 11.442 12.844 13.153 12.799 + 9.085 6.797 7.736 8.425 7.315 7.277 10.400 12.654 10.997 6.356 9.742 10.185 8.352 8.121 10.933 12.948 15.366 13.273 12.862 14.321 13.026 12.157 11.376 11.030 10.291 13.460 13.384 10.986 10.585 11.632 11.756 10.637 11.268 12.899 13.499 11.533 + 9.168 9.227 9.382 8.790 7.494 7.766 10.493 12.794 11.420 6.757 9.302 9.402 8.261 8.491 10.253 12.469 14.767 13.043 12.388 13.312 12.619 12.393 12.276 11.339 9.970 13.182 12.919 10.020 10.149 11.062 12.014 11.904 10.037 12.235 13.820 12.436 + 8.122 9.273 8.632 7.006 7.195 7.081 10.633 12.731 11.223 7.374 9.594 10.582 8.311 8.197 11.254 13.530 14.723 12.817 12.132 12.378 12.676 12.564 12.429 11.510 10.721 12.531 12.169 9.812 10.919 11.744 12.458 12.209 10.207 11.838 12.513 12.773 + 8.109 6.977 6.453 5.958 7.388 7.487 10.167 12.417 10.987 8.154 10.386 9.852 8.025 7.146 10.881 13.512 13.587 11.436 12.735 13.177 14.252 13.338 12.467 11.830 11.249 12.912 12.214 10.535 10.268 11.393 11.424 11.889 10.662 13.410 13.821 12.516 + 9.619 8.699 6.989 6.629 6.999 7.323 9.776 11.985 10.243 6.953 9.467 10.421 8.001 7.840 10.562 13.558 12.629 11.203 11.511 12.581 13.932 13.531 12.746 11.537 11.838 12.254 11.363 10.323 10.301 11.406 11.986 11.179 9.507 11.700 13.408 12.640 + 6.997 6.868 5.764 5.858 6.139 4.713 10.546 12.136 10.360 7.406 9.009 10.376 8.748 9.144 11.323 12.198 11.886 12.805 13.091 13.813 12.842 12.496 13.312 11.655 11.395 10.942 10.313 9.611 10.090 11.566 11.970 11.096 10.116 13.555 14.095 12.516 + 7.524 7.811 7.334 6.605 5.406 6.846 10.485 12.025 9.895 7.732 9.507 9.986 7.007 9.171 11.648 11.843 12.503 11.869 12.121 13.350 13.675 12.733 11.980 10.768 11.944 11.283 10.705 8.495 9.469 11.144 12.133 11.438 9.953 12.469 13.636 12.268 + 8.120 6.394 7.042 5.720 5.443 6.446 10.459 11.747 9.405 8.669 9.114 10.249 8.269 8.993 11.842 11.935 13.173 11.391 11.029 11.977 11.932 13.035 12.943 11.485 10.735 11.095 10.950 8.759 9.653 11.635 12.372 11.941 9.735 12.482 13.371 11.696 + 6.227 6.462 6.375 7.311 8.085 8.989 10.600 11.674 9.326 8.478 8.100 8.523 7.158 9.770 11.840 11.689 13.370 11.282 10.952 13.048 12.621 14.247 12.773 10.891 11.289 11.373 10.451 9.261 10.757 11.484 11.623 10.902 10.380 13.018 13.771 12.189 + 5.779 6.964 7.340 8.391 6.871 8.226 10.311 11.680 9.562 8.372 8.390 9.153 7.686 10.146 11.452 11.767 13.579 11.416 12.083 14.781 16.013 15.262 12.648 10.647 11.211 11.284 10.713 9.587 10.647 11.113 11.028 10.615 10.767 13.126 12.849 11.274 + 6.459 5.630 6.788 8.201 7.754 8.278 10.214 11.476 9.363 8.007 8.879 9.243 6.807 9.083 9.918 11.566 13.379 13.199 12.293 15.405 15.555 13.474 12.398 11.201 11.362 10.773 10.394 9.722 9.992 10.481 11.036 10.611 11.077 13.150 12.785 11.164 + 7.268 8.020 6.235 8.312 8.717 7.826 9.536 10.823 8.511 9.495 9.928 9.465 7.078 9.754 10.817 11.679 11.140 13.676 14.146 13.823 13.602 12.123 12.090 10.809 10.875 10.195 10.812 10.316 9.200 9.870 10.575 9.576 10.706 12.012 12.140 10.802 + 8.288 8.080 6.953 8.192 8.888 9.243 9.557 9.776 8.416 10.735 11.970 10.941 7.025 8.929 10.715 11.693 10.753 13.742 14.112 14.282 14.678 13.020 12.304 12.246 11.599 10.538 10.465 9.650 9.260 10.327 9.723 9.461 10.034 11.541 12.254 10.761 + 7.510 6.355 5.493 5.823 9.387 9.607 10.348 9.847 7.193 10.918 11.572 10.383 6.919 9.550 10.597 11.342 11.357 11.219 11.345 12.287 13.206 12.811 11.965 11.663 10.455 11.672 11.403 10.796 9.642 10.182 10.773 8.878 10.369 11.115 11.557 11.141 + 7.488 7.600 7.294 6.897 8.961 9.121 9.014 9.610 7.211 10.731 11.668 9.636 6.458 8.456 10.906 12.391 12.030 11.912 12.208 11.979 12.616 11.330 10.768 11.566 11.049 10.917 11.265 10.364 8.994 9.327 10.420 9.622 10.976 11.561 12.045 10.667 + 7.268 7.294 6.810 7.941 10.300 10.780 9.753 8.304 7.595 10.268 12.015 10.399 7.205 8.932 9.690 11.782 10.765 10.347 11.414 12.082 12.550 12.318 11.730 9.335 10.835 11.502 10.462 9.765 9.623 10.383 10.776 9.103 10.413 11.269 11.384 9.658 + 6.702 8.063 7.749 7.527 11.110 11.648 9.817 8.885 7.297 9.850 11.457 9.317 6.559 8.875 10.436 11.600 9.544 10.673 12.214 13.072 13.640 12.203 11.316 10.027 11.845 10.716 10.183 9.865 9.004 9.180 10.668 9.231 9.794 10.790 11.582 10.855 + 7.637 7.793 7.316 8.089 11.461 12.174 9.766 8.598 8.350 9.918 10.906 8.661 6.744 9.309 10.579 10.915 9.370 11.673 12.824 13.004 12.632 11.982 10.210 10.032 10.829 10.669 9.848 9.678 9.064 9.446 10.258 9.134 9.370 10.340 10.667 9.444 + 7.314 7.578 6.917 7.912 11.850 12.037 8.950 8.150 8.849 9.772 10.847 8.933 7.540 9.128 11.047 11.370 9.294 12.420 12.555 12.399 12.359 10.595 10.531 11.232 10.164 10.004 10.271 10.307 8.333 9.060 9.290 8.332 9.667 9.866 9.414 9.958 + 7.976 9.060 7.942 6.197 11.592 11.905 8.784 7.941 9.078 9.400 10.192 8.897 7.189 9.634 11.355 11.046 9.101 10.591 11.944 12.194 11.940 11.945 11.210 11.515 9.880 10.141 10.073 9.729 7.714 8.464 8.603 8.906 9.713 10.589 10.375 9.846 + 7.686 9.128 8.277 7.359 11.444 11.692 8.579 8.712 9.592 9.939 9.863 9.493 7.160 8.844 11.033 10.215 9.333 10.251 11.633 13.132 11.769 10.429 10.573 11.382 9.502 10.251 10.378 8.750 7.614 8.479 8.476 9.044 9.316 10.289 9.572 10.713 + 7.674 7.892 8.361 7.553 10.919 11.184 9.048 8.394 9.834 9.956 9.623 9.046 7.789 9.928 11.420 9.225 8.387 11.000 11.689 12.553 12.360 10.365 10.262 10.687 9.514 9.358 9.174 8.801 7.593 8.728 9.016 8.460 8.586 9.877 9.692 11.928 + 6.359 8.135 7.845 7.332 11.202 11.082 8.547 9.533 10.321 9.599 9.269 8.568 8.217 9.981 11.314 9.488 9.394 10.784 11.835 12.458 11.271 10.145 11.052 11.426 9.678 8.965 9.677 9.013 7.503 7.646 8.284 8.351 9.179 8.847 9.689 11.909 + 8.142 8.073 7.480 6.986 10.671 11.033 9.364 9.678 10.756 10.118 9.267 7.878 7.103 10.086 10.825 8.625 10.086 10.980 11.633 12.301 10.681 11.040 11.081 10.154 9.147 9.382 8.554 8.468 7.726 8.050 8.346 8.514 9.084 9.291 9.053 10.622 + 7.046 5.933 6.336 5.964 9.978 10.236 7.897 9.348 10.522 9.089 9.095 8.957 7.329 9.438 9.628 8.513 8.141 11.097 11.462 12.121 11.216 9.831 9.452 9.423 8.619 9.651 9.610 8.257 7.998 8.305 8.588 8.470 8.728 9.715 8.349 9.224 + 7.908 7.870 7.173 7.138 9.627 10.326 8.146 8.972 10.680 9.193 8.372 8.780 7.616 8.306 8.009 7.906 8.827 10.422 11.502 12.076 11.269 10.339 9.248 8.566 8.790 8.618 9.057 9.237 7.528 7.948 8.305 7.673 9.034 9.373 9.427 10.991 + 9.493 9.929 10.007 9.747 9.156 10.425 9.818 9.838 10.327 9.284 9.363 9.328 9.235 8.967 9.775 8.146 8.599 10.397 10.387 10.745 10.999 9.756 8.639 8.704 8.661 9.726 8.832 8.950 7.289 7.862 8.403 8.632 8.921 9.941 9.350 10.286 + 12.115 12.265 11.863 11.157 11.228 10.710 11.078 10.788 9.736 9.876 10.786 10.520 9.942 9.118 9.792 8.326 9.420 10.621 11.469 11.888 11.806 8.770 9.217 8.197 8.058 9.542 9.559 7.585 6.793 8.644 8.002 8.458 8.982 9.566 8.587 9.852 + 7.482 7.647 7.168 5.628 8.683 9.569 7.026 8.932 11.331 9.712 9.334 10.481 8.271 9.075 9.931 8.494 8.930 10.143 11.017 11.598 11.502 9.580 8.511 8.109 8.229 9.004 8.929 8.707 6.917 8.061 7.994 7.683 7.995 8.421 8.840 10.205 + 3.783 5.296 5.124 4.657 8.023 9.332 7.381 8.813 11.116 9.667 7.670 8.433 7.213 8.429 8.913 8.002 8.435 10.120 10.410 10.559 9.925 9.357 8.580 8.840 8.272 8.846 9.457 8.968 6.462 8.511 8.424 7.716 7.901 8.424 8.173 9.591 + 5.231 6.105 5.035 4.640 7.894 8.614 6.489 8.671 10.965 9.380 8.278 8.589 5.792 8.169 9.135 7.814 6.730 9.614 10.280 10.726 10.435 7.944 7.723 7.823 7.687 8.224 7.608 7.281 6.231 6.847 6.853 7.145 7.728 8.556 8.510 8.587 + 5.587 5.605 4.237 2.697 7.139 7.715 5.518 8.097 10.932 9.536 7.908 7.727 6.262 8.032 9.225 8.597 7.937 9.581 10.327 10.589 9.157 8.202 8.330 8.176 8.090 7.574 7.885 7.645 5.493 8.174 7.917 8.190 8.115 8.610 8.015 9.753 + 5.704 5.678 3.827 4.526 7.150 6.396 6.329 11.129 12.339 10.176 9.157 8.365 7.221 8.134 8.897 7.852 7.729 8.335 10.040 9.555 9.013 7.398 7.297 9.234 8.284 7.906 9.324 8.206 5.884 9.171 8.282 8.209 7.496 7.418 7.842 9.536 + 6.135 5.996 4.040 5.134 7.709 7.339 7.901 12.294 12.821 9.895 9.629 8.631 6.899 7.409 9.054 7.221 7.530 8.774 10.331 9.381 9.481 7.594 7.724 8.378 7.368 7.796 9.062 8.852 6.084 7.140 7.806 7.974 7.733 7.036 8.563 9.455 + 4.828 5.691 4.098 5.011 7.355 6.791 8.208 12.200 11.749 8.152 8.494 7.012 5.464 6.718 9.452 7.951 6.716 8.447 10.708 10.565 9.795 8.028 7.171 9.063 7.169 7.289 8.171 7.706 6.741 7.205 6.929 7.295 7.485 6.869 8.107 9.451 + 5.246 5.874 5.515 6.165 5.305 6.396 8.823 12.377 11.995 8.592 9.516 8.239 6.133 7.336 9.861 7.870 6.254 9.358 11.449 10.409 9.489 7.914 6.571 8.108 7.327 6.814 7.409 7.183 5.673 7.967 7.140 6.875 7.078 7.690 7.763 8.533 + 9.045 9.124 8.746 7.565 7.297 6.938 8.570 12.362 12.039 8.640 9.028 7.561 7.475 7.475 9.813 8.116 7.335 9.444 11.495 10.139 9.914 7.120 7.350 7.120 6.613 7.561 8.446 7.809 5.792 7.535 7.385 7.037 6.913 7.136 6.666 8.336 + 9.864 8.801 8.168 6.794 7.393 7.886 9.165 11.732 11.248 7.864 7.963 7.045 7.581 6.494 9.299 7.785 7.420 9.820 11.152 9.574 9.640 7.373 7.636 7.147 6.771 7.738 8.493 8.289 5.691 7.452 6.939 7.317 6.401 6.823 6.927 7.694 + 5.521 6.409 5.189 4.508 6.609 7.133 6.777 9.411 9.503 9.871 10.204 9.100 7.553 8.226 9.999 8.162 8.119 9.990 10.941 8.840 8.908 7.978 7.123 7.375 6.311 7.410 8.171 8.185 5.977 7.926 7.441 7.352 6.232 6.739 6.795 8.100 + 6.409 5.368 4.639 5.598 5.156 6.025 6.781 8.372 10.074 10.984 9.646 8.415 7.369 7.580 9.172 7.745 8.050 9.388 10.428 9.006 8.805 7.172 5.972 8.272 7.119 8.138 8.296 8.452 6.201 7.937 6.948 6.610 6.396 6.457 6.406 7.529 + 6.080 5.830 5.856 6.305 7.344 7.406 7.056 7.972 9.504 10.632 9.028 7.650 5.746 6.304 8.983 7.333 7.146 9.072 10.068 10.253 9.249 6.751 6.775 8.927 7.973 6.967 7.787 8.478 6.482 8.770 7.968 6.509 6.603 7.229 6.267 7.489 + 4.256 4.930 4.513 5.990 6.826 7.098 5.196 5.864 9.136 10.256 9.267 7.230 5.512 6.383 9.127 8.053 7.136 9.190 9.986 10.063 9.002 7.273 6.973 9.041 8.496 7.430 7.561 6.563 6.957 8.428 7.833 7.355 8.113 6.530 6.458 8.171 + 5.569 7.943 7.843 7.888 6.806 5.221 5.594 7.057 8.801 9.087 8.655 7.620 6.316 6.499 8.960 8.220 7.139 9.143 9.971 8.771 8.472 7.881 6.966 7.675 7.532 7.202 7.575 6.305 6.613 7.546 7.860 6.773 7.751 7.246 7.043 7.437 + 12.440 12.441 11.737 11.239 10.669 9.824 9.995 9.549 8.119 7.697 8.554 7.234 6.425 7.143 8.688 8.227 6.823 8.338 10.073 8.866 8.246 7.491 8.529 8.892 7.978 8.261 7.769 7.591 7.708 8.727 8.503 6.850 8.100 8.287 8.200 7.345 + 11.796 11.351 10.248 9.283 9.761 9.395 8.821 8.604 9.458 8.610 8.256 7.534 6.498 6.641 8.220 8.534 7.363 8.619 9.325 8.583 7.851 8.155 7.466 7.834 7.628 8.318 8.238 7.079 7.651 8.858 9.276 7.086 8.584 8.990 8.578 8.447 + 6.983 8.247 8.286 6.948 8.302 8.804 8.820 9.028 8.274 8.605 8.873 6.739 8.695 8.765 9.686 10.081 9.585 9.258 10.290 10.647 10.540 8.229 7.531 8.986 9.011 8.022 9.642 9.020 8.291 9.699 9.643 8.463 9.216 9.166 9.134 7.803 + 6.962 6.852 7.064 7.527 7.812 9.704 10.219 8.384 8.957 9.162 9.456 8.582 8.546 8.660 9.123 9.998 9.050 9.058 9.597 9.465 10.130 8.049 8.578 8.908 10.307 9.022 9.524 8.960 8.564 9.409 8.948 9.001 8.685 9.678 9.765 8.788 + 8.591 9.625 8.354 8.400 9.989 9.760 9.985 8.395 8.891 9.609 9.208 8.904 9.382 9.584 8.711 10.231 9.661 8.304 9.425 9.694 9.893 8.923 9.008 9.210 10.254 9.827 9.494 10.021 9.966 10.501 10.091 9.915 10.505 11.144 10.686 10.102 + 7.708 9.679 10.174 10.518 10.603 11.797 10.551 9.431 9.400 9.891 10.181 9.176 9.175 10.552 9.723 11.021 10.575 10.174 10.564 9.281 10.044 9.481 9.873 9.088 9.865 10.487 10.739 11.384 11.250 10.280 10.893 10.774 10.861 10.337 10.931 10.061 + 8.093 8.088 9.439 10.141 9.798 10.260 10.498 10.577 8.872 10.608 10.840 8.912 10.279 10.294 9.963 10.627 10.373 11.368 11.330 10.625 9.988 9.761 10.116 9.899 10.353 10.756 10.496 11.258 10.816 10.002 10.476 10.421 10.674 10.435 11.161 10.580 + 8.900 9.084 9.028 8.455 9.117 9.684 9.350 10.357 10.137 10.049 10.919 9.533 9.287 8.308 9.348 10.459 11.279 10.459 10.825 9.523 7.942 8.457 9.737 9.408 9.958 10.330 11.214 10.796 10.402 10.068 9.769 10.326 11.217 9.666 11.003 9.831 + 7.787 8.478 7.543 9.243 9.029 8.303 8.367 9.928 9.267 10.236 10.155 9.039 10.304 9.981 9.494 9.958 12.028 11.573 10.204 8.949 9.278 8.648 8.831 8.988 9.011 9.250 10.579 10.424 10.403 9.470 8.502 9.983 10.849 11.036 10.959 9.756 + 7.473 7.509 7.979 8.306 9.343 10.221 9.449 9.034 9.782 9.029 10.619 10.336 8.367 9.663 10.280 10.055 9.739 11.568 11.302 11.214 11.341 9.981 8.952 8.232 9.790 9.391 9.136 10.112 9.126 10.184 9.751 9.798 11.472 11.394 10.574 10.400 + 9.037 8.824 8.172 7.419 9.957 9.877 9.028 7.800 7.672 9.400 10.846 10.993 8.761 10.372 10.588 10.993 11.187 12.596 10.990 10.005 10.951 10.544 9.885 9.277 10.647 11.149 11.586 10.964 10.419 11.025 10.006 9.381 10.171 10.785 10.467 10.262 + 5.596 6.647 7.722 9.262 10.181 9.736 9.111 10.122 9.323 9.747 12.524 12.004 9.833 10.958 10.446 10.513 11.152 12.006 11.075 10.315 10.241 10.638 9.644 9.932 9.755 11.214 11.171 10.930 11.081 10.930 10.702 9.937 10.841 11.415 11.292 10.704 + 4.509 6.094 6.772 6.401 6.246 7.162 8.814 9.784 10.268 8.734 11.379 11.390 9.031 10.421 9.991 10.077 10.497 11.228 11.132 10.542 10.154 10.345 9.265 9.587 9.816 10.556 11.229 11.134 10.125 10.478 10.472 10.572 11.115 11.409 11.770 10.739 + 6.803 6.310 7.935 8.132 8.529 8.872 9.219 9.895 9.747 8.923 10.599 10.247 8.369 8.896 9.786 9.291 10.251 10.737 11.101 11.968 9.332 8.426 9.427 9.223 9.118 9.778 10.997 10.007 9.147 9.762 9.710 9.090 9.926 10.578 10.536 10.098 + 7.758 7.383 7.102 6.424 9.002 9.025 8.954 10.314 10.181 9.090 9.658 8.026 7.725 8.491 9.442 9.483 9.804 10.530 10.463 10.866 8.608 8.044 8.540 9.515 9.549 9.861 10.740 9.870 8.624 10.141 10.351 9.826 9.932 10.786 11.526 10.663 + 8.591 7.612 7.915 7.638 9.803 10.193 8.949 11.144 11.273 10.059 10.975 9.674 7.648 7.195 7.562 8.453 8.196 8.903 9.068 8.481 7.979 8.599 9.092 10.369 9.488 9.222 10.379 9.261 8.919 9.347 9.957 9.372 10.187 11.131 11.429 11.095 + 9.798 9.910 10.172 9.442 8.929 9.673 9.952 11.085 10.864 9.829 9.592 8.833 8.511 7.510 9.612 9.844 9.783 10.157 9.030 8.674 7.922 8.158 8.151 8.996 8.068 8.369 10.396 9.853 8.806 9.356 8.775 8.652 10.095 10.468 10.773 10.486 + 5.217 6.492 6.959 6.168 7.152 8.455 9.572 10.486 10.681 10.241 9.881 6.556 7.127 7.673 7.558 8.480 8.346 9.972 9.539 9.460 7.991 6.081 7.230 8.858 7.885 8.077 10.260 9.652 8.017 8.732 8.801 8.939 10.256 10.376 11.254 10.127 + 5.115 4.543 5.432 6.745 7.455 8.970 8.753 10.156 10.445 10.151 9.644 7.218 6.508 7.487 7.475 8.303 9.352 10.468 9.650 9.788 9.056 7.279 7.713 8.209 8.174 8.292 10.263 9.162 7.511 8.860 7.998 8.208 9.806 10.451 10.879 9.528 + 5.312 6.422 6.420 6.810 7.986 9.149 7.876 10.275 10.368 10.028 9.644 7.389 7.202 8.581 7.718 8.315 9.713 9.810 9.761 9.623 8.914 7.740 7.585 8.030 9.226 8.298 10.290 9.408 8.307 8.637 8.110 8.091 9.888 10.245 10.124 10.057 + 7.547 5.794 4.743 6.228 7.503 8.547 6.800 10.215 10.290 10.152 10.139 9.453 6.784 7.627 7.389 8.715 9.413 10.306 9.312 10.706 10.302 8.202 8.415 8.274 9.567 9.862 10.382 10.325 9.413 9.601 9.806 8.682 9.962 10.330 10.278 8.757 + 9.085 8.799 6.706 5.647 6.795 5.767 6.623 9.501 10.047 9.977 10.566 9.909 7.365 7.779 7.406 7.907 9.104 10.189 8.348 8.796 8.926 7.610 8.549 7.965 8.628 10.327 11.264 10.357 8.813 8.976 8.832 8.678 9.428 9.290 9.267 8.880 + 8.187 8.441 6.366 6.298 7.564 7.607 6.364 9.788 10.264 10.324 10.301 9.474 6.767 7.792 7.164 7.145 8.946 9.865 9.122 9.271 9.172 8.085 8.527 8.793 9.469 10.047 10.482 9.350 7.914 8.211 7.806 7.786 8.289 8.255 8.370 7.875 + 7.066 7.400 5.724 5.415 7.784 7.711 7.195 10.240 10.439 10.216 9.880 8.859 6.084 6.955 6.755 5.723 6.984 8.475 9.340 9.677 9.983 9.928 9.583 9.902 10.248 9.962 9.980 9.552 8.969 8.176 8.577 8.509 8.383 7.802 8.618 8.102 + 7.164 7.392 5.739 5.818 6.024 6.533 7.085 10.352 10.287 9.676 8.381 6.893 6.577 6.288 6.143 6.780 6.866 7.070 7.758 7.809 7.591 7.591 7.509 7.990 8.465 8.011 9.801 9.319 8.305 7.460 8.554 8.787 7.245 7.523 7.198 7.324 + 12.700 13.733 13.796 13.110 12.545 12.297 12.600 12.954 13.550 12.676 12.375 12.738 11.887 11.082 11.402 11.790 12.257 12.374 12.764 13.370 13.001 12.384 11.871 11.552 10.648 10.496 11.354 10.011 8.931 9.785 10.026 11.341 10.716 9.184 8.558 7.987 + 15.013 15.682 14.879 13.493 13.707 14.327 15.049 15.359 15.163 13.840 14.037 14.045 13.286 12.473 12.859 12.625 13.016 13.626 13.806 15.377 14.509 13.581 13.238 12.919 11.812 11.697 12.799 11.368 10.414 11.084 11.434 13.552 13.074 11.094 10.036 8.742 + 14.684 13.776 11.908 12.438 11.962 14.117 15.822 15.558 13.532 12.920 12.614 13.037 12.039 11.592 11.635 11.884 12.926 13.424 13.173 14.964 15.169 12.872 12.547 12.811 11.372 11.095 12.416 11.191 9.858 10.291 11.017 13.379 12.954 10.954 9.799 8.686 + 11.081 10.050 9.790 8.962 9.378 11.166 11.886 11.026 10.693 10.135 10.791 8.213 7.257 6.306 8.181 8.543 9.267 9.791 10.148 10.011 10.734 8.182 7.977 7.178 6.766 7.071 7.266 7.276 6.815 7.851 8.169 10.983 10.294 7.542 7.641 7.593 + 6.589 7.001 7.152 6.556 7.353 7.013 9.430 11.176 10.488 7.658 9.918 8.312 5.516 4.817 7.184 7.284 7.756 8.600 9.406 9.290 9.068 7.778 7.168 7.850 8.152 8.324 7.939 7.041 6.514 6.982 7.167 7.717 8.380 7.931 7.823 6.872 + 4.307 5.630 6.214 5.309 7.534 7.552 8.756 10.883 10.528 7.006 9.582 9.168 5.516 5.948 7.619 7.746 8.990 8.870 10.170 10.241 8.910 7.892 6.783 6.827 8.423 8.806 7.255 7.355 5.906 7.359 7.031 7.592 8.960 8.075 8.145 7.923 + 7.323 6.909 5.957 5.838 8.165 7.665 8.316 11.074 10.309 6.309 9.956 9.879 7.506 6.875 6.801 7.386 8.983 8.583 10.452 10.166 8.623 8.620 7.563 6.851 8.664 8.649 7.194 7.949 7.555 8.175 7.128 7.101 8.871 8.379 8.692 8.633 + 6.486 6.905 5.373 5.562 8.303 7.813 7.905 10.754 10.152 6.798 10.477 11.278 8.365 6.469 6.093 6.881 7.802 8.302 10.634 11.771 10.087 7.685 7.815 7.840 7.636 8.627 8.352 8.105 6.270 7.835 8.055 7.219 8.790 9.390 9.881 9.813 + 6.428 6.677 4.977 6.490 8.294 7.444 8.169 10.467 9.863 7.464 9.723 11.206 8.651 7.085 6.628 6.984 7.718 8.566 8.881 11.469 9.887 8.655 8.139 8.216 7.318 7.685 8.060 8.429 6.523 9.076 9.318 7.622 9.650 9.802 9.884 9.403 + 4.720 5.772 6.600 6.247 7.838 6.969 8.058 9.878 9.250 6.976 10.796 11.409 7.742 6.485 7.331 7.880 8.349 8.367 10.762 11.608 9.648 7.161 7.297 7.610 8.202 7.639 8.343 8.192 6.945 9.497 8.858 8.686 9.721 10.147 10.419 10.172 + 3.111 4.938 5.406 4.414 7.432 7.171 6.765 8.432 8.541 7.384 10.992 11.111 5.955 5.489 5.352 6.937 8.191 8.426 10.841 11.420 9.978 6.758 6.821 7.782 8.970 8.884 8.457 7.580 6.977 8.072 8.137 7.679 9.699 9.551 10.323 10.208 + 6.025 5.207 5.466 5.210 7.519 7.203 5.341 6.121 7.346 7.833 11.412 10.797 5.798 6.652 6.933 7.849 7.899 8.089 11.287 10.616 9.539 8.056 6.816 7.927 7.959 8.151 8.027 8.966 7.659 9.231 9.213 7.310 8.434 9.215 10.057 8.916 + 5.578 6.341 5.549 6.409 7.473 6.420 5.968 7.190 7.245 8.890 11.599 10.194 5.202 6.013 6.645 7.235 8.326 9.225 11.814 11.062 8.845 9.046 8.605 8.818 9.117 7.945 7.292 8.300 7.346 8.170 7.815 6.782 8.355 9.306 10.017 9.983 + 6.455 6.983 5.179 5.563 6.927 6.351 6.928 6.330 6.474 9.730 11.630 9.393 5.471 7.562 7.356 7.167 8.336 10.263 11.028 10.204 10.475 8.396 7.704 9.261 8.563 7.293 8.357 8.534 7.158 9.001 8.945 6.996 9.274 9.217 10.008 10.474 + 6.043 7.299 6.943 6.686 7.813 6.660 6.682 7.504 7.113 11.111 11.511 8.394 5.863 6.715 7.027 6.828 7.895 9.859 9.814 10.332 9.452 7.666 7.744 9.770 7.990 7.532 8.369 8.527 7.032 8.643 8.152 7.832 9.261 9.440 9.426 9.822 + 4.686 5.032 5.753 6.715 7.991 6.980 5.656 4.928 6.153 11.022 11.365 8.084 5.338 6.868 7.032 7.043 8.162 9.870 9.816 9.928 9.018 7.561 7.654 9.225 6.666 6.598 7.299 8.878 7.642 7.316 7.323 6.320 9.651 8.741 9.133 9.813 + 5.218 3.511 4.922 6.110 6.540 5.661 5.973 6.041 6.576 10.727 10.763 6.912 4.885 6.407 6.891 7.370 7.839 10.269 9.868 9.106 8.492 7.430 7.924 8.520 6.514 7.477 6.484 8.673 7.315 6.436 7.269 5.877 8.469 8.922 9.168 10.388 + 4.964 5.354 6.443 5.725 5.912 5.875 7.283 7.462 7.513 10.889 10.432 5.018 4.786 6.776 6.479 7.501 8.456 10.471 10.629 9.570 7.428 7.296 7.579 7.554 7.085 7.779 7.293 8.204 7.556 7.009 7.138 6.054 8.630 9.045 9.825 9.884 + 5.844 5.071 4.899 6.471 7.131 6.741 5.324 5.487 9.025 11.550 10.601 5.697 5.914 5.172 5.845 6.559 7.570 10.965 10.417 9.220 8.678 7.478 7.810 7.860 7.018 6.986 7.071 7.878 7.642 6.986 6.262 6.179 8.147 9.489 10.350 8.967 + 6.224 6.407 6.090 6.939 6.702 7.838 9.079 8.674 8.218 11.410 10.653 7.302 5.958 5.528 6.278 7.829 9.132 11.922 10.213 9.598 8.327 6.246 7.224 7.662 7.068 6.134 6.068 7.948 7.009 6.630 6.231 6.054 8.853 10.388 10.204 9.898 + 6.675 6.186 6.576 6.820 5.575 6.216 9.095 8.894 8.185 10.848 9.965 7.447 5.981 5.159 5.567 6.539 9.245 11.752 10.333 9.483 7.114 6.105 7.183 8.042 7.599 6.756 6.009 7.006 6.676 7.329 6.771 5.917 9.041 9.675 9.768 9.050 + 7.136 7.116 6.353 5.089 6.672 7.032 8.953 8.235 8.978 10.393 8.736 8.032 6.135 5.882 6.940 6.906 11.130 11.322 9.647 8.760 8.044 7.435 7.134 6.769 5.579 6.246 5.879 7.302 7.144 7.224 6.988 6.071 8.595 8.784 9.185 7.806 + 4.999 4.880 3.160 4.696 5.384 5.376 6.559 6.412 9.370 9.895 7.674 6.074 5.050 7.083 7.053 6.822 10.894 10.095 8.298 9.691 8.020 6.686 6.250 6.314 5.839 4.662 6.435 8.124 7.504 6.951 6.755 5.808 8.166 8.516 8.936 8.703 + 5.162 5.644 5.352 6.785 6.847 7.395 7.086 7.296 8.724 8.930 6.044 6.557 4.888 5.739 7.226 7.150 9.336 8.590 9.467 9.250 8.286 7.216 6.068 6.399 5.791 5.535 5.363 7.489 6.290 6.801 6.359 5.404 8.113 8.599 8.916 9.093 + 6.764 6.969 6.981 6.571 6.664 6.189 5.730 6.750 7.215 8.059 6.814 6.940 5.484 5.811 6.254 6.361 8.419 8.127 8.894 9.249 8.360 6.800 6.192 6.315 5.043 4.655 5.730 7.969 6.820 6.865 6.413 4.583 7.988 8.872 9.709 9.035 + 7.453 9.077 8.227 5.957 7.840 8.601 8.846 8.865 8.760 6.931 6.372 6.427 6.685 5.349 6.127 7.067 7.989 8.240 8.957 8.570 6.191 6.567 6.892 6.332 6.148 4.671 5.881 7.151 6.916 6.309 5.312 5.280 8.144 8.767 9.770 8.972 + 8.586 8.458 9.052 8.026 9.159 9.291 9.170 7.964 6.866 5.476 7.163 8.722 7.817 6.179 6.271 7.146 7.352 7.145 8.464 8.664 5.838 7.460 7.912 7.043 6.692 6.879 5.383 8.095 7.649 7.069 5.895 5.465 8.576 9.558 8.932 8.303 + 7.498 7.968 8.269 7.311 9.408 9.590 9.688 8.370 6.486 4.901 6.733 7.671 7.278 6.963 6.387 7.752 7.829 7.400 7.914 7.936 7.725 6.908 5.377 6.978 7.123 7.837 5.982 9.086 8.474 8.147 6.481 6.278 7.782 8.366 8.653 7.388 + 7.921 6.681 8.041 8.349 8.736 7.821 8.383 7.331 6.126 4.622 7.402 7.848 6.853 7.869 8.850 8.457 8.297 8.296 8.931 8.134 6.571 6.635 6.871 7.195 7.211 6.424 7.028 8.308 7.979 7.007 5.766 5.788 6.534 6.873 7.096 7.587 + 7.835 7.179 7.029 7.871 8.316 8.989 7.498 7.281 6.200 5.107 7.338 8.068 6.832 8.125 8.020 6.980 6.023 7.543 7.745 7.504 7.299 6.138 5.810 5.924 5.350 4.169 4.915 6.172 7.014 6.390 6.188 5.356 6.398 7.126 6.735 6.261 + 8.334 7.546 7.412 6.926 6.939 8.561 8.921 8.225 5.870 5.736 5.372 6.424 6.638 5.166 4.523 5.561 4.980 6.706 7.218 7.727 6.928 6.127 4.357 4.093 4.612 3.928 3.305 4.536 4.877 4.966 5.908 5.220 5.624 6.725 6.915 5.879 + 8.772 8.059 7.612 7.467 6.669 6.563 6.526 6.821 6.781 7.393 6.229 5.849 5.666 4.826 4.675 4.851 5.350 6.196 8.261 7.305 4.668 4.165 4.352 4.563 3.953 3.838 3.220 4.036 5.092 4.793 5.181 4.739 6.853 7.231 6.846 5.200 + 8.157 7.057 5.334 5.291 6.397 7.244 6.749 7.080 5.944 5.969 5.035 6.326 5.096 5.818 5.714 4.788 6.575 6.822 7.289 7.254 3.596 4.258 4.399 5.842 5.738 5.108 5.193 4.967 5.091 5.352 5.658 4.225 5.525 5.776 6.201 4.489 + 7.692 6.630 7.375 7.749 8.288 7.797 6.737 7.146 6.876 5.926 5.538 5.122 5.490 5.680 6.827 6.074 6.522 6.545 7.410 7.360 5.324 4.947 4.334 5.415 5.120 4.749 5.269 4.973 5.528 5.933 5.699 4.694 4.476 5.013 5.116 3.770 + 9.527 8.135 7.915 6.781 7.713 7.923 8.191 7.963 6.087 5.533 6.618 6.356 5.126 5.155 5.884 5.991 6.660 5.559 6.222 6.990 6.148 4.749 5.037 5.343 6.129 5.257 5.000 5.930 5.984 6.056 5.380 5.093 5.037 6.332 5.882 5.060 + 8.750 7.615 8.119 7.530 6.900 7.136 8.266 7.686 5.346 5.731 6.573 6.276 4.983 5.999 6.201 5.846 6.939 7.245 6.860 5.674 5.616 4.584 4.662 4.941 5.558 4.808 4.887 4.999 4.789 4.995 4.902 5.485 5.169 4.757 4.577 3.949 + 8.980 7.773 6.417 7.065 7.461 7.710 7.297 7.806 6.858 6.390 6.375 5.523 6.130 6.050 4.804 5.327 6.586 6.448 6.257 5.822 4.891 4.642 4.227 4.152 4.762 4.999 4.945 5.521 5.417 4.923 5.082 4.265 4.585 4.560 4.268 3.653 + 10.145 10.142 9.261 8.334 9.443 8.975 8.121 5.186 5.182 5.940 4.716 5.282 5.911 6.287 5.718 6.369 7.505 6.862 5.441 4.985 5.452 5.267 4.998 4.977 5.078 4.823 5.330 5.520 6.460 6.317 6.001 5.384 6.074 5.923 4.830 4.148 + 8.303 8.479 7.237 7.285 9.228 8.963 7.855 6.890 5.265 5.337 6.207 6.709 7.080 6.900 7.105 7.439 6.897 6.214 5.253 4.677 5.432 5.528 5.182 4.469 4.508 4.128 4.411 5.699 4.891 5.147 5.692 5.719 5.112 5.004 3.699 3.912 + 6.017 6.008 6.681 5.736 7.589 8.909 8.556 6.060 4.240 4.759 6.617 6.114 6.262 6.012 5.880 5.920 6.469 5.914 5.850 4.643 5.341 4.695 4.541 5.030 4.557 3.660 4.933 5.431 5.231 4.527 6.556 6.547 5.393 4.974 4.195 3.397 + 5.915 3.947 4.748 4.571 3.836 4.661 5.854 5.039 5.049 4.411 3.601 3.833 2.975 3.969 4.068 5.067 5.593 5.085 4.563 3.899 3.329 4.558 4.307 4.025 3.903 2.727 2.474 3.307 3.213 3.806 3.698 3.164 3.352 3.932 2.790 2.423 + 4.154 2.754 3.453 5.217 4.860 4.449 5.373 4.931 3.896 2.931 3.516 3.695 3.899 4.536 4.084 3.658 4.598 4.772 4.840 5.105 4.945 4.917 4.804 3.934 4.211 3.260 3.085 3.699 3.001 2.900 2.573 2.935 2.592 3.082 3.045 1.182 + 2.994 3.416 2.627 4.517 5.771 6.444 6.775 5.514 3.495 3.413 4.409 4.738 3.930 3.533 3.116 4.997 5.391 5.952 5.883 4.953 4.306 5.014 5.610 5.153 4.095 3.018 2.474 2.208 2.072 2.517 1.929 2.178 1.954 1.740 1.916 1.557 + 4.137 3.977 3.809 1.695 3.812 4.711 5.123 3.902 4.415 4.095 3.367 3.402 3.716 4.686 4.026 4.751 4.805 4.030 3.901 2.681 3.485 5.346 6.504 6.282 4.573 3.271 2.496 2.334 2.394 2.151 1.692 2.167 1.762 2.253 2.054 2.080 + 4.810 4.931 2.927 3.657 4.329 5.146 5.431 5.607 4.066 3.968 3.472 4.052 3.764 5.350 4.917 4.279 4.694 4.731 4.561 4.715 4.098 5.100 5.612 6.618 5.894 5.330 6.036 6.935 5.788 3.220 3.024 3.972 3.602 4.543 3.681 2.541 + 4.687 5.383 4.107 1.981 4.795 6.474 6.660 6.177 4.699 5.350 4.902 3.557 2.088 4.518 4.338 3.537 3.368 5.147 4.745 5.773 5.155 5.438 5.193 5.881 7.576 7.208 7.686 8.142 7.040 6.185 5.612 6.082 5.537 6.130 4.638 3.459 + 4.018 5.236 4.910 4.449 3.794 4.259 6.189 6.257 6.045 4.445 3.032 3.788 2.416 2.562 3.482 3.701 2.409 4.607 4.939 4.992 4.608 6.254 6.129 4.693 7.808 7.530 7.303 7.812 8.067 7.118 6.032 6.686 6.053 6.046 5.843 4.537 + 6.454 5.719 4.645 3.655 3.836 5.247 4.879 4.949 5.434 4.412 2.290 2.032 3.002 3.615 3.874 3.977 4.439 3.918 4.076 4.343 4.311 4.282 5.964 5.735 8.409 7.940 6.668 6.756 8.088 5.892 5.338 6.293 6.242 5.679 5.781 6.304 + 5.420 4.176 2.851 3.425 4.526 5.752 5.246 5.143 5.108 4.629 3.689 3.189 4.037 3.724 3.849 3.240 4.408 4.486 4.182 4.919 5.537 5.425 6.288 7.675 8.856 7.260 7.329 7.179 7.488 5.832 5.679 6.101 6.208 6.586 6.441 6.129 + 4.342 5.180 5.316 4.330 3.633 5.145 6.086 4.507 4.730 6.480 5.005 5.308 7.050 5.660 4.201 4.043 4.367 4.935 4.496 6.283 7.444 8.165 7.953 8.682 8.053 7.462 8.660 8.112 6.706 6.314 6.343 6.871 6.349 6.261 7.049 6.054 + 3.595 5.699 5.695 4.036 4.896 5.105 5.722 3.405 6.054 7.851 6.158 5.825 8.114 6.450 4.355 3.601 4.638 5.757 4.884 6.937 7.750 7.385 7.877 8.325 7.850 7.522 7.845 8.363 6.965 6.046 6.900 6.570 5.623 6.661 7.133 6.262 + 5.339 6.211 5.945 3.566 4.157 5.292 5.658 4.665 5.849 6.834 6.550 5.876 7.684 6.309 4.464 4.135 5.718 7.890 6.791 7.764 8.176 7.768 6.664 7.970 8.449 7.743 8.452 7.460 6.346 6.032 6.662 6.231 4.650 5.324 5.585 4.565 + 4.013 5.510 6.110 3.962 4.948 5.740 6.997 6.270 7.297 9.136 8.326 4.743 7.620 7.510 6.205 6.512 6.630 9.024 8.104 10.203 9.358 8.517 7.780 8.138 7.910 8.126 8.712 7.874 6.711 6.622 6.672 5.494 5.078 5.460 5.607 3.607 + 4.123 6.070 5.996 3.121 2.735 6.696 7.414 4.601 6.779 9.404 8.704 5.685 9.407 8.627 7.119 8.201 7.531 10.219 9.329 10.984 9.600 9.441 7.648 7.046 7.681 8.535 8.648 8.385 7.472 6.375 5.385 5.132 4.621 4.320 4.036 3.146 + 3.070 5.626 5.413 1.846 2.914 7.352 8.499 6.189 5.039 8.021 8.014 6.600 9.973 9.325 8.356 9.617 8.578 11.747 10.195 11.432 9.553 8.374 7.958 7.598 7.500 7.901 8.281 8.575 8.086 6.192 5.003 6.441 5.093 4.895 3.885 2.695 + 4.167 5.562 6.142 3.907 2.909 7.532 8.924 6.532 5.906 8.783 8.804 5.690 8.728 9.537 8.435 10.806 9.176 12.649 11.667 11.284 10.083 8.563 7.045 7.828 8.815 9.349 9.978 9.494 8.275 7.255 5.864 5.184 4.977 5.029 3.783 2.434 + 3.758 5.570 6.407 4.273 3.812 7.539 9.269 7.409 4.842 8.084 9.119 5.963 9.919 10.825 7.553 11.174 10.329 12.879 12.400 10.363 10.328 8.228 7.156 7.030 9.045 9.626 10.805 10.238 9.017 8.074 6.681 5.179 5.278 4.877 3.628 2.569 + 4.133 6.312 6.709 3.776 3.729 7.200 9.513 8.082 4.513 9.105 9.960 6.688 10.004 11.493 8.631 11.927 11.129 12.494 12.341 10.714 10.771 7.812 6.822 7.348 8.508 9.484 11.216 9.534 9.476 9.013 6.599 4.652 5.204 5.975 4.951 3.015 + 2.206 6.107 6.745 4.834 4.618 7.555 9.613 8.058 4.684 9.877 10.647 7.315 10.282 11.869 9.165 12.428 11.613 11.395 11.689 10.546 10.734 6.982 6.603 7.381 8.481 9.110 11.070 9.787 9.547 9.446 8.515 6.092 6.166 6.786 6.969 4.589 + 3.821 5.740 6.400 3.644 2.957 7.208 9.569 8.075 5.430 10.240 10.940 7.642 10.625 11.975 8.910 12.591 11.846 11.480 11.552 10.028 10.394 7.270 6.603 6.947 8.573 9.230 10.988 9.704 10.096 10.123 9.481 6.803 6.133 7.768 7.894 5.846 + 4.051 5.892 6.467 4.606 2.697 7.314 9.710 8.477 4.144 9.625 10.724 7.734 10.156 11.872 9.079 12.545 12.004 10.466 10.578 9.394 9.712 7.146 6.853 6.782 7.447 8.298 11.333 10.603 10.419 10.408 10.707 6.960 6.075 7.407 8.218 5.546 + 4.688 5.252 6.432 4.856 2.693 6.678 9.294 8.507 4.542 8.724 10.272 7.633 9.508 11.731 9.377 11.520 11.520 8.367 8.884 8.607 8.528 6.590 7.228 5.946 6.614 8.150 12.105 11.014 10.059 10.112 10.150 7.677 6.016 7.087 7.816 5.410 + 4.547 5.952 6.558 4.347 4.149 5.365 8.792 8.543 4.674 8.955 10.056 7.178 8.780 11.284 9.285 9.999 10.616 8.070 9.280 7.555 8.522 6.064 6.544 5.842 6.969 7.799 11.646 10.487 8.711 9.356 10.320 7.506 6.611 6.231 7.536 6.187 + 6.064 6.108 7.664 6.663 3.981 6.070 9.551 9.188 4.411 8.706 9.643 6.057 8.370 9.801 7.672 8.402 9.217 7.653 7.858 7.080 6.795 5.814 5.102 6.037 7.540 7.790 10.098 9.411 7.834 8.174 8.757 7.538 6.707 6.322 7.270 5.759 + 3.982 6.936 8.212 6.414 2.481 6.126 9.581 9.273 5.126 8.697 9.765 6.948 7.576 8.772 6.899 7.551 7.821 6.861 8.724 8.284 8.789 7.899 7.154 7.775 9.503 7.614 7.891 6.821 7.403 6.814 7.506 6.809 5.751 5.196 5.807 5.251 + 5.409 7.425 8.562 6.379 5.583 8.337 9.557 8.360 6.754 8.873 9.678 6.464 6.466 7.809 7.105 7.593 8.698 7.760 9.016 8.673 8.443 7.545 7.517 7.521 9.130 6.998 7.548 6.744 6.142 6.220 6.754 6.351 4.664 4.457 5.728 5.022 + 5.078 7.699 9.086 7.744 5.222 8.010 9.831 9.413 7.249 8.570 8.671 6.923 6.365 8.150 6.825 7.358 8.561 7.596 8.709 8.283 7.569 7.233 6.389 6.889 8.252 6.388 6.124 5.832 5.646 5.587 6.210 5.876 4.064 4.180 4.724 3.260 + 5.913 7.642 8.879 7.245 4.329 5.110 7.679 8.335 5.917 7.433 9.106 7.637 6.297 7.663 6.608 6.238 7.623 6.004 7.146 7.423 7.647 6.219 6.629 6.306 7.277 5.949 6.346 5.663 4.816 4.746 4.808 3.884 3.515 3.983 4.381 2.691 + 11.430 11.663 11.396 10.078 9.959 10.290 10.916 10.456 9.860 9.389 9.033 7.384 8.152 8.112 7.203 8.148 8.310 6.771 7.690 7.832 7.258 6.481 6.558 6.231 6.725 5.541 5.705 6.006 5.336 5.568 5.066 4.549 4.301 3.032 3.909 2.872 + 12.166 11.694 10.735 10.177 9.015 9.908 10.565 10.437 9.740 8.950 7.472 6.850 7.570 7.506 6.578 7.153 8.143 7.598 8.453 7.085 7.043 6.551 7.005 6.216 5.490 5.684 5.435 5.285 5.241 5.793 5.996 5.391 5.384 3.982 3.841 3.839 + 7.025 8.480 9.302 7.389 5.388 5.745 5.580 5.030 4.592 4.497 6.177 5.379 4.908 5.862 4.990 7.530 7.516 8.196 8.468 9.335 9.816 7.338 8.096 7.779 7.544 6.808 6.185 5.795 5.314 5.363 5.806 5.576 4.860 3.476 3.702 2.730 + 5.533 7.083 8.498 7.177 4.974 7.001 8.229 6.500 5.085 3.558 6.325 5.556 5.492 5.831 5.218 7.005 7.054 7.127 8.283 9.240 10.411 8.148 8.384 8.303 7.688 7.353 7.638 6.723 5.021 4.560 5.506 4.300 4.201 3.638 3.975 2.211 + 7.034 7.151 7.502 7.185 5.453 8.126 9.918 8.339 5.734 5.042 5.899 5.632 4.238 6.199 5.238 6.117 5.790 8.244 8.715 9.792 10.396 8.838 8.911 7.948 7.407 7.568 8.073 6.225 5.063 5.663 5.740 5.184 4.723 4.187 3.182 2.396 + 8.277 7.997 7.669 7.080 6.750 8.939 10.948 9.786 6.657 5.716 6.640 5.849 6.070 7.066 5.250 5.163 5.077 9.413 9.064 11.445 11.044 9.355 8.054 8.333 7.521 7.131 6.960 5.609 6.456 6.245 5.271 3.563 4.098 5.056 3.778 1.794 + 3.858 6.076 7.043 5.086 4.943 9.514 11.028 9.012 4.404 6.343 5.807 3.157 5.627 5.809 4.963 5.224 6.020 10.855 10.296 12.651 12.026 10.573 8.797 8.234 7.078 5.761 6.268 6.267 6.139 6.129 6.052 4.498 3.476 4.623 3.770 2.678 + 5.904 6.461 7.273 5.555 5.974 10.193 11.105 8.228 5.576 7.893 7.241 4.066 6.168 5.623 4.650 5.883 7.626 11.066 9.879 11.526 10.112 10.686 8.344 7.192 6.962 5.494 5.822 5.058 5.927 6.658 5.606 4.947 4.382 4.290 3.619 1.958 + 6.042 5.385 6.353 5.334 6.655 11.193 11.768 9.200 6.584 8.658 7.253 5.507 7.080 5.756 4.468 5.494 8.332 10.309 9.320 10.667 8.938 8.129 7.502 5.803 4.959 4.783 5.600 5.293 6.020 6.636 5.777 4.818 4.954 4.813 4.179 2.512 + 1.702 4.436 5.830 5.969 7.966 11.234 10.688 7.142 7.130 8.820 7.139 5.771 7.565 5.531 5.468 5.731 7.018 8.017 8.638 9.656 8.864 8.338 7.096 6.074 4.850 5.065 5.519 4.953 5.533 5.828 5.242 3.904 3.398 3.862 4.032 1.888 + 5.330 6.105 5.465 4.362 8.784 11.018 9.609 6.648 7.402 8.270 5.539 6.623 7.479 6.000 5.383 5.673 6.792 7.270 8.911 9.369 8.957 7.823 7.337 6.155 5.889 5.300 4.693 4.500 5.672 6.628 6.254 3.966 3.570 3.624 2.995 1.960 + 6.497 6.822 6.690 6.384 9.607 11.136 9.349 4.473 6.946 7.578 5.004 3.900 4.938 6.128 6.163 4.791 6.754 8.238 8.834 10.077 9.560 9.718 8.112 7.329 7.337 6.368 6.350 6.765 5.948 6.473 6.732 5.450 5.152 6.033 5.636 4.791 + 7.064 8.181 8.081 6.698 9.846 11.067 8.728 5.165 5.269 6.048 6.333 5.211 4.017 6.462 6.696 5.373 6.782 9.160 9.016 11.418 10.287 10.173 8.840 7.545 6.925 7.435 7.996 7.404 7.284 7.628 7.870 6.284 6.403 6.903 6.920 6.342 + 6.967 8.076 8.057 6.734 10.413 11.326 9.504 6.699 6.856 6.522 6.029 6.021 4.924 6.147 5.394 6.307 6.408 9.563 9.404 10.562 9.552 9.101 8.868 8.335 8.096 8.589 7.709 7.404 6.812 7.581 6.574 5.636 6.386 6.780 6.400 6.169 + 7.268 7.000 6.855 6.151 9.565 9.600 8.906 7.377 7.929 6.046 5.592 6.719 5.391 5.701 5.411 7.287 6.892 8.348 7.467 9.138 10.493 9.846 7.530 10.019 9.070 8.776 8.189 7.785 7.706 7.048 6.578 5.351 6.292 6.459 6.425 5.546 + 5.273 6.539 5.498 5.306 9.558 10.108 8.381 7.776 8.456 5.876 4.215 4.490 4.831 5.924 5.503 6.729 6.645 7.497 7.612 9.032 9.863 8.990 8.334 10.417 9.765 8.305 6.699 6.822 7.112 6.994 6.634 5.189 5.313 5.971 5.806 4.895 + 7.437 6.412 4.910 5.492 8.724 8.795 6.613 8.575 9.020 6.113 5.351 5.359 4.320 4.724 4.870 4.289 5.501 6.034 6.481 7.521 7.676 8.020 8.274 8.738 9.511 8.965 8.456 7.242 7.476 7.006 6.733 4.561 5.785 6.142 6.582 4.882 + 6.081 6.748 5.696 6.365 8.464 8.612 8.027 8.592 8.460 4.840 5.466 5.708 5.121 5.061 5.137 5.784 5.469 4.926 5.898 7.964 8.000 9.100 8.026 7.324 8.296 8.504 9.855 8.540 7.724 6.895 6.303 4.471 5.423 7.494 6.545 5.413 + 5.040 5.919 5.063 5.742 7.513 7.908 6.631 9.355 8.994 5.209 6.468 6.037 5.171 5.200 5.000 4.349 4.377 5.045 5.168 8.347 8.835 9.617 8.030 7.617 8.001 9.080 9.463 9.203 8.204 6.983 7.236 7.215 6.559 8.062 7.321 5.466 + 5.256 6.241 5.125 6.325 9.446 9.628 7.877 9.732 9.159 5.445 6.358 5.337 4.468 4.840 4.715 4.563 5.676 6.453 6.531 8.518 8.608 8.617 7.455 6.236 7.534 8.226 8.074 7.940 6.461 6.453 7.520 8.327 7.665 8.282 8.141 6.158 + 6.412 5.796 3.166 7.702 9.725 8.336 7.161 8.992 8.367 4.192 5.215 4.784 4.834 3.538 3.981 4.927 5.241 5.560 5.448 8.587 7.924 7.520 5.543 5.120 6.366 6.734 6.625 6.745 6.800 6.873 6.878 7.084 7.241 7.645 7.965 5.503 + 6.389 7.056 5.913 7.620 9.512 8.189 6.081 7.100 6.799 4.358 5.754 5.065 4.925 4.855 4.081 3.881 4.207 5.634 6.379 7.683 7.428 6.538 4.933 4.989 4.281 5.090 7.229 7.060 6.557 6.075 6.052 5.082 6.578 6.515 6.325 3.949 + 6.209 6.240 4.724 7.415 8.488 7.081 6.751 7.572 5.949 4.414 4.781 4.480 4.725 4.955 4.828 3.598 3.629 5.447 4.704 6.209 4.677 4.775 5.062 4.525 3.528 3.859 6.279 6.901 5.043 4.756 5.093 4.666 4.409 5.713 5.095 3.108 + 5.146 5.428 3.827 6.926 7.453 6.594 5.224 6.505 4.176 4.423 4.582 4.665 4.387 3.812 4.329 3.992 3.695 4.673 5.160 6.716 5.451 4.321 3.143 4.517 4.253 4.229 4.340 5.469 3.593 4.631 3.748 3.325 3.930 4.304 4.471 2.374 + 5.533 5.397 3.708 7.799 9.398 8.292 5.472 5.925 3.233 3.731 4.574 3.786 3.129 2.622 4.045 4.378 3.638 4.405 5.712 5.055 5.838 5.258 4.097 4.840 4.859 3.936 4.751 5.177 4.256 3.748 2.811 2.860 4.144 4.057 4.069 3.685 + 5.612 4.925 4.859 6.722 8.310 7.912 4.033 4.853 4.513 3.024 3.771 2.417 3.000 3.718 3.880 4.076 3.815 5.365 4.390 5.042 6.204 5.898 4.855 3.777 3.666 4.774 5.160 5.352 4.261 3.675 4.070 3.707 4.072 4.575 4.805 3.554 + 5.629 4.400 6.066 7.528 8.544 7.336 6.090 5.061 4.380 3.800 4.274 3.300 4.542 3.581 4.284 4.504 4.743 4.929 4.644 5.775 5.908 5.260 3.424 4.113 4.686 5.259 4.502 4.635 3.677 4.171 4.307 3.767 3.757 4.449 4.225 3.820 + 5.819 3.762 4.775 7.254 8.808 7.561 6.417 6.985 6.403 5.942 5.127 3.516 2.464 3.431 4.318 4.264 5.494 4.983 4.234 5.491 6.182 5.149 3.728 3.939 5.073 5.970 5.685 5.259 5.482 4.609 4.972 5.123 4.734 4.128 5.171 4.596 + 4.988 5.308 5.355 5.340 6.184 7.319 6.702 7.420 6.520 5.601 5.318 4.547 1.582 4.665 4.386 4.626 5.794 4.935 3.897 5.968 6.240 6.122 5.761 6.102 6.408 7.291 6.749 6.833 6.633 5.662 5.693 5.189 5.156 4.764 4.964 5.083 + 4.926 6.065 4.892 7.132 7.333 7.000 6.966 7.813 5.899 4.262 4.894 2.787 3.089 5.101 5.252 4.659 4.845 5.143 5.389 5.854 5.930 6.319 6.001 6.629 6.346 7.776 7.705 7.378 7.900 6.802 5.346 6.073 6.022 6.246 6.209 5.682 + 4.663 5.639 5.217 6.659 6.830 6.496 7.111 7.032 6.009 5.192 4.869 4.554 5.786 5.221 5.768 7.223 7.357 6.454 5.081 5.305 4.815 5.136 4.188 4.828 5.847 6.027 6.554 6.906 6.865 6.103 6.971 6.376 6.620 7.604 6.854 6.755 + 3.926 4.670 4.727 6.935 7.713 7.595 8.118 7.362 6.799 5.596 5.426 4.499 3.855 5.363 5.005 6.269 7.004 6.606 6.317 6.086 4.601 4.388 4.406 5.631 6.411 6.042 7.350 7.368 7.018 7.175 7.407 7.626 7.194 7.436 6.643 7.256 + 4.952 5.170 4.631 7.653 8.537 6.368 7.499 7.795 5.747 3.260 5.270 5.767 5.366 6.324 6.584 7.039 6.780 6.339 6.502 6.959 4.835 4.718 5.368 6.907 7.214 7.636 7.394 7.300 6.872 7.847 7.687 7.256 6.509 6.758 6.849 6.549 + 5.342 5.095 5.751 7.746 9.147 7.864 7.173 8.313 7.122 4.687 4.945 5.735 6.940 6.701 7.644 6.512 7.058 6.417 5.625 7.111 4.550 4.797 5.661 6.358 7.192 7.090 6.572 7.397 7.499 7.046 6.386 6.448 6.797 6.414 6.678 6.165 + 5.183 4.822 4.014 7.157 8.452 6.563 4.822 5.833 3.868 4.183 4.791 4.923 4.803 4.370 6.403 5.958 5.118 5.200 4.840 5.251 3.123 4.351 4.635 4.290 5.661 5.947 5.362 4.854 5.947 4.667 3.936 4.527 4.666 4.667 4.360 3.995 + 4.883 5.475 3.545 6.551 8.187 6.404 5.799 6.792 4.697 2.964 3.757 2.093 2.008 2.569 3.477 3.065 3.984 5.873 5.377 5.707 4.497 3.966 3.119 3.977 3.680 3.935 3.840 4.537 3.813 3.771 2.585 2.583 2.801 3.554 2.426 1.097 + 4.786 4.340 3.386 6.744 8.218 6.453 5.618 7.434 5.929 4.815 4.873 2.861 3.266 3.489 3.959 4.097 4.606 7.795 7.126 7.412 5.203 4.438 3.853 4.265 3.923 4.576 5.161 5.563 3.815 3.798 4.244 4.151 4.353 4.454 2.856 1.670 + 2.905 3.371 4.067 6.092 7.993 6.643 5.842 8.500 7.533 7.323 7.486 4.600 5.476 4.439 4.946 5.173 5.995 8.938 8.767 9.642 6.348 4.778 4.202 4.209 4.313 5.008 6.266 7.218 4.870 3.749 3.692 5.365 5.236 4.472 2.923 1.108 + 3.503 3.060 1.796 6.202 7.943 6.564 6.191 8.470 7.777 8.552 8.720 5.902 7.250 5.063 4.803 6.262 6.295 9.499 9.528 10.134 6.813 5.096 4.828 4.369 4.185 5.668 7.018 8.365 5.922 4.648 5.355 6.328 6.345 5.615 4.780 2.558 + 1.316 2.476 2.478 5.694 7.323 6.093 5.094 5.590 5.751 8.786 9.060 6.645 8.043 6.367 6.597 7.098 7.796 10.466 10.167 10.624 6.651 6.064 5.440 5.073 4.510 4.595 6.334 7.826 5.465 4.898 5.623 6.920 6.636 5.518 4.893 2.007 + 1.943 2.755 2.711 6.345 7.158 4.886 5.778 7.413 6.124 8.880 9.224 7.335 8.882 6.721 7.183 8.151 8.500 10.974 10.472 10.605 6.787 5.651 5.316 5.181 5.021 4.962 6.923 8.443 6.034 4.892 5.518 7.230 7.448 6.069 5.046 2.102 + 3.293 3.888 2.951 6.203 7.019 5.062 5.829 7.296 5.195 8.588 9.134 7.483 9.117 6.875 7.478 7.787 8.623 11.464 10.857 10.345 6.919 6.058 5.627 5.327 5.349 5.373 7.299 8.366 6.323 5.455 6.120 7.167 7.262 5.859 4.375 2.510 + 3.805 3.258 1.833 4.763 6.539 5.688 4.927 6.686 5.337 8.511 9.209 7.599 9.490 7.800 8.704 7.776 8.617 11.396 10.971 8.920 7.376 6.138 5.396 5.214 6.588 6.219 8.473 9.066 7.809 6.053 5.290 6.872 6.297 4.371 3.600 3.258 + 3.489 3.209 2.345 4.489 6.114 5.030 3.950 5.701 4.498 8.615 9.312 7.486 9.603 7.772 9.016 7.536 8.250 11.033 10.937 9.348 7.379 6.612 4.648 5.004 6.007 6.383 8.545 9.090 8.201 5.694 4.582 5.716 5.758 4.893 3.221 2.275 + 4.319 3.391 0.853 3.893 5.766 4.759 2.478 4.268 3.874 8.599 9.293 7.485 9.865 8.404 9.452 7.414 7.999 10.934 10.887 10.184 7.983 6.398 3.423 5.356 5.675 5.747 8.166 8.110 7.036 5.535 5.530 5.833 7.535 6.585 4.329 1.839 + 4.504 4.373 2.048 4.185 5.875 4.693 4.914 6.090 5.177 7.955 8.872 7.547 10.100 8.577 9.644 7.959 8.755 10.817 10.771 10.161 8.010 6.672 4.235 5.780 5.602 6.048 7.340 7.733 7.126 5.849 5.732 5.989 7.730 6.911 3.937 2.104 + 1.081 2.497 2.366 4.262 5.923 4.687 4.579 6.500 4.640 7.180 8.549 7.949 10.366 8.719 9.699 8.504 9.519 10.235 10.314 10.287 8.363 6.482 4.150 6.009 5.888 6.050 8.079 7.847 6.347 5.176 6.203 6.405 7.294 6.813 4.361 2.524 + 2.887 2.529 0.317 4.372 5.980 4.528 4.294 6.612 5.384 6.984 8.517 7.545 10.361 9.039 10.053 8.966 10.176 9.792 9.687 9.880 8.642 7.188 5.367 5.260 6.146 6.758 7.352 7.480 6.596 5.191 4.867 6.304 6.485 5.994 3.872 2.159 + 2.388 1.250 1.283 4.153 6.492 5.666 4.644 7.685 6.933 8.290 9.423 7.648 10.400 9.079 9.277 9.175 10.795 8.658 8.600 9.908 8.774 6.459 4.961 4.982 6.712 7.219 7.735 8.112 7.646 6.114 5.838 7.417 6.817 5.039 3.994 1.967 + -0.299 0.104 0.308 3.983 6.484 5.723 5.750 8.428 7.508 8.224 9.364 6.855 9.776 9.006 8.796 8.936 9.732 8.552 9.432 9.138 8.888 7.233 6.082 5.842 6.582 7.832 8.555 8.455 6.232 5.636 5.049 7.353 7.231 4.719 3.305 2.363 + 1.753 1.448 1.049 3.391 6.347 5.898 5.599 8.637 8.070 7.572 8.573 5.852 8.262 7.966 8.901 8.500 7.073 7.925 9.411 9.858 9.461 7.987 5.948 5.852 6.714 7.382 7.159 7.101 4.942 5.167 5.220 7.633 7.084 4.509 3.013 2.041 + 0.870 1.570 1.208 4.157 6.296 5.280 5.724 8.477 7.857 7.036 6.762 6.360 8.893 7.607 9.141 8.626 8.567 8.821 9.552 10.355 9.682 7.479 5.497 4.957 6.512 6.555 5.990 6.137 5.527 5.145 5.461 7.631 6.896 4.510 3.662 1.497 + 2.507 2.134 1.305 3.918 5.590 4.663 5.320 7.432 7.535 8.682 7.502 7.821 9.910 8.166 8.757 8.811 9.105 9.769 9.224 9.053 8.489 5.946 3.791 5.240 6.327 6.621 6.972 6.255 5.702 5.384 5.237 6.219 6.424 5.588 3.603 1.624 + 4.518 4.305 2.395 3.806 5.085 5.335 5.113 6.634 7.615 8.961 8.273 7.744 9.166 8.444 8.056 7.682 8.786 9.183 8.505 7.981 7.495 6.315 4.146 3.786 4.164 4.684 6.800 6.672 5.478 4.761 4.279 4.706 5.608 5.586 3.499 1.876 + 4.482 4.677 3.528 3.807 4.874 4.897 5.677 5.877 6.363 6.614 6.724 6.855 6.267 6.419 5.799 5.715 6.976 7.252 6.474 5.863 4.973 3.061 3.084 3.085 2.328 3.001 4.347 4.977 3.758 3.752 3.195 4.439 4.548 4.898 3.811 1.446 + 4.064 4.123 3.515 4.112 5.308 5.313 5.061 6.620 6.793 6.436 6.445 5.941 6.559 6.441 6.328 5.513 5.328 6.462 7.072 6.324 3.861 2.653 2.440 3.629 3.318 3.152 4.336 4.443 3.724 3.196 2.409 3.746 3.446 3.395 3.477 2.011 + 3.135 4.204 3.614 3.806 3.986 4.501 4.967 6.790 7.367 7.784 6.591 5.938 6.093 4.536 6.405 5.388 6.066 6.696 6.310 5.384 4.364 4.354 3.998 3.501 3.214 3.844 4.593 4.739 3.889 3.296 3.289 4.093 4.008 3.649 3.110 1.380 + 5.462 4.211 3.023 3.867 4.406 3.933 3.081 6.815 7.855 7.181 6.147 5.834 5.397 4.087 6.271 4.902 6.073 7.293 6.998 5.032 3.242 3.781 2.736 2.867 2.959 3.824 4.614 4.419 3.048 3.375 2.645 2.664 3.501 2.612 2.641 1.611 + 5.060 5.228 3.665 2.834 4.089 4.434 4.494 6.284 6.758 5.573 3.805 2.564 5.591 4.597 5.288 3.605 5.806 5.401 5.567 5.445 3.525 3.949 3.198 2.390 3.372 2.902 2.898 4.144 3.429 3.044 2.353 2.635 2.995 2.297 1.180 0.775 + 5.264 5.305 3.899 3.538 2.998 4.272 3.735 3.000 3.523 4.937 4.573 5.218 5.954 6.864 6.835 7.147 6.606 6.278 4.905 4.859 5.632 5.248 5.012 4.962 5.584 6.825 6.520 5.717 6.040 5.260 5.287 4.319 4.389 5.157 5.163 5.327 + 7.306 6.097 5.770 5.128 5.015 7.256 7.532 5.813 6.347 6.732 7.086 7.818 8.960 9.712 10.392 10.799 10.108 8.609 7.321 7.229 8.129 7.675 8.703 9.278 10.127 11.169 10.332 10.311 9.535 8.804 8.357 7.737 7.956 8.535 8.764 8.690 + 6.330 6.528 7.407 6.950 7.105 9.207 8.529 7.002 6.332 7.944 9.038 8.810 8.012 9.173 11.306 10.307 10.531 10.035 10.211 8.698 8.469 8.745 9.606 10.412 11.305 11.983 10.801 11.529 9.682 9.039 8.439 8.539 9.074 8.701 9.203 8.899 + 7.384 7.414 7.737 5.620 6.004 8.387 8.806 9.085 7.865 7.930 9.178 8.714 9.140 10.428 10.861 10.782 10.439 10.537 10.471 9.278 8.852 9.077 9.909 10.602 11.100 11.878 11.161 11.092 9.773 10.026 9.319 8.599 8.724 8.720 9.541 9.309 + 8.978 8.537 7.579 7.328 8.736 8.250 7.914 9.833 9.279 7.394 8.116 8.411 8.399 10.950 11.601 10.756 9.229 10.440 9.357 7.808 7.649 8.353 9.037 10.026 10.808 11.300 10.442 10.073 9.572 9.809 9.071 9.162 8.454 10.085 9.898 9.172 + 9.075 7.877 7.669 8.278 10.335 10.330 8.821 9.823 9.173 9.355 8.784 9.675 9.522 10.547 10.820 11.434 9.866 10.377 9.674 9.039 8.271 8.942 9.520 9.120 10.538 11.790 11.323 10.986 9.353 10.020 9.927 9.225 9.728 9.566 9.753 8.796 + 8.554 9.149 9.008 7.607 8.720 10.072 9.966 9.986 9.471 8.912 7.753 9.117 8.930 8.901 11.153 11.297 11.158 10.944 11.643 9.984 8.994 9.083 9.418 10.601 11.184 11.208 11.028 10.877 9.883 10.200 10.768 10.284 9.861 9.327 10.116 9.388 + 8.520 10.132 8.969 6.989 6.528 9.730 9.782 8.823 9.085 9.712 9.425 8.814 9.751 9.980 10.796 10.776 11.146 10.909 11.557 10.297 8.643 9.781 9.884 10.453 10.664 11.653 11.375 11.048 10.527 10.162 9.945 8.882 8.884 9.764 10.674 9.886 + 10.421 10.125 9.038 9.193 8.770 10.297 11.020 9.982 10.592 11.125 9.666 9.137 9.873 10.149 9.903 10.606 10.874 10.999 10.529 9.408 9.263 9.000 9.093 9.938 10.251 10.128 10.501 9.446 10.025 9.798 9.197 7.931 8.525 9.337 9.700 8.908 + 10.385 9.669 8.472 8.922 10.117 10.101 9.863 8.542 8.309 9.010 8.178 8.774 8.200 10.098 9.868 9.624 9.289 9.306 8.740 7.552 7.007 7.299 7.408 8.769 8.709 8.508 8.441 7.690 7.484 8.939 8.487 7.956 8.346 8.858 8.819 7.319 + 8.491 6.968 7.043 6.919 6.397 8.248 8.942 8.409 7.999 7.762 7.275 7.507 7.413 8.354 8.943 9.448 9.393 7.544 8.339 7.728 5.864 7.031 6.893 6.127 7.524 8.096 7.111 7.984 7.684 7.959 8.597 7.675 7.549 7.825 7.837 5.765 + 8.419 7.497 6.473 6.713 5.793 7.293 8.129 8.139 8.228 8.315 6.128 6.203 6.124 6.909 6.388 6.491 6.525 6.659 7.308 6.598 6.025 5.613 7.032 6.716 6.976 6.678 6.255 7.106 7.402 7.891 7.291 6.937 7.251 8.102 7.083 6.313 + 7.215 6.982 6.220 5.759 4.692 5.377 5.738 5.343 6.228 6.876 5.508 6.159 4.515 5.068 5.439 5.968 5.907 6.002 6.294 5.522 4.770 5.610 5.953 5.235 5.698 5.768 5.249 6.101 6.007 7.222 7.131 5.575 5.567 5.840 5.372 4.953 + 6.485 5.020 4.243 3.629 4.801 6.412 5.666 3.927 5.092 4.442 3.638 3.958 4.478 4.006 4.189 4.561 4.550 4.594 4.391 3.057 3.702 4.854 4.072 4.708 5.055 5.193 4.917 5.552 4.838 5.031 4.998 4.552 4.848 4.487 4.325 4.566 + 3.991 3.727 3.028 3.131 4.490 5.256 5.315 3.844 4.401 3.863 2.931 3.448 3.214 3.129 2.790 3.699 4.586 5.172 4.660 3.781 3.108 2.608 3.169 3.710 4.908 5.068 5.141 4.660 5.605 6.187 5.322 5.480 5.393 4.061 3.899 3.535 + 4.929 3.479 3.394 1.671 2.796 4.741 4.547 3.647 2.757 3.730 3.202 4.337 2.781 3.372 3.538 4.849 3.726 3.541 4.053 5.073 5.109 4.719 4.428 5.250 5.072 5.119 4.536 4.831 5.315 5.782 5.271 5.380 4.735 4.519 3.557 3.229 + 5.559 4.577 4.634 5.270 4.862 4.336 4.272 4.008 4.231 4.305 3.256 3.861 3.311 3.816 4.782 3.398 4.969 4.928 3.970 4.464 4.515 3.766 4.866 4.339 5.361 4.921 4.239 5.368 5.464 4.651 4.791 5.509 4.820 3.706 3.313 3.753 + 5.884 5.311 5.378 4.676 5.297 5.215 4.957 5.002 4.208 4.810 3.275 2.799 3.823 3.937 4.331 4.530 5.570 6.175 5.101 4.932 4.367 3.521 3.271 4.181 5.007 5.173 5.044 5.122 5.724 5.907 4.959 5.223 4.790 5.135 4.903 4.572 + 5.562 5.450 4.816 4.498 4.019 3.163 3.047 3.994 5.870 5.076 4.398 4.836 3.751 5.230 5.288 5.632 5.668 5.755 5.397 5.756 4.986 3.994 3.576 5.187 5.301 5.743 6.098 5.643 6.129 6.677 6.088 5.305 5.523 6.016 5.111 4.156 + 6.245 5.560 5.302 4.567 5.349 4.091 4.345 4.655 5.697 5.203 3.952 4.936 4.497 4.449 5.116 3.722 4.438 4.948 4.836 5.756 5.543 4.777 4.935 5.205 5.254 5.066 4.585 5.430 6.281 5.791 6.107 5.844 5.688 5.248 5.125 4.532 + 5.173 3.748 3.986 4.915 6.522 5.451 6.278 5.587 7.044 6.592 3.969 3.814 4.227 4.934 4.604 3.768 3.830 5.872 5.521 5.402 5.369 4.504 5.450 5.218 5.984 5.636 4.696 5.467 6.314 5.997 6.036 6.214 5.855 5.486 4.937 4.353 + 4.778 5.956 6.486 6.724 6.571 5.157 5.641 6.035 5.643 6.581 5.841 5.432 5.351 6.387 5.548 4.456 4.842 5.214 4.301 5.790 5.115 4.387 5.192 4.546 5.287 5.988 5.517 5.899 5.831 6.047 5.821 5.640 5.330 5.468 4.744 4.718 + 10.576 10.371 10.032 8.533 5.532 6.719 7.004 6.878 5.930 6.891 6.862 7.238 7.877 7.404 5.649 5.999 5.537 5.537 5.983 5.949 5.965 5.899 5.281 6.517 6.341 6.447 6.465 5.578 6.129 6.562 5.903 6.688 5.936 6.353 5.218 5.233 + 9.359 8.057 7.625 7.727 6.651 5.468 6.494 6.717 6.670 5.688 5.022 4.924 5.556 5.073 4.782 5.124 5.586 5.403 3.856 4.875 5.844 5.420 4.991 4.180 5.087 5.923 5.907 5.975 6.306 5.675 6.334 6.308 6.159 6.223 5.020 3.555 + 3.273 4.221 4.982 4.185 4.336 5.139 7.128 6.947 5.703 6.472 6.355 5.798 5.393 4.747 5.729 4.629 4.780 4.072 3.690 5.115 6.111 5.860 6.354 5.537 5.003 5.535 5.692 5.586 6.407 6.249 6.554 6.096 5.350 4.805 4.709 4.282 + 5.784 4.410 5.946 5.631 5.075 4.924 5.878 6.893 6.016 5.489 4.627 6.201 6.029 4.902 4.019 4.944 6.159 5.559 5.561 5.119 5.549 5.133 5.769 5.897 5.941 6.333 5.560 5.431 6.118 6.429 6.370 6.686 5.488 5.268 4.518 4.467 + 7.013 5.560 5.383 6.193 5.036 5.287 5.115 5.710 4.895 5.815 5.147 5.505 5.374 5.601 5.322 5.267 5.090 4.269 5.162 5.201 4.672 4.581 4.945 5.339 4.577 5.339 5.370 5.560 6.201 5.840 5.270 5.988 5.307 5.161 4.494 4.436 + 7.113 6.955 7.046 6.176 6.143 5.015 6.118 5.454 4.503 5.879 5.405 5.467 4.723 4.851 4.644 5.345 5.561 5.426 5.050 4.685 6.031 5.736 5.464 5.182 4.577 5.305 6.592 6.163 6.195 5.599 4.944 5.507 5.662 5.145 4.225 3.759 + 10.338 9.696 8.324 7.984 7.956 8.246 7.163 7.608 6.653 5.441 5.316 4.495 4.314 2.289 4.105 5.782 6.476 6.563 5.304 3.664 4.494 5.043 5.162 5.218 5.189 5.562 5.407 5.701 6.222 5.326 5.177 5.073 4.759 5.267 4.469 3.780 + 6.890 8.073 7.977 7.806 7.720 8.116 7.399 6.523 5.066 4.265 3.992 5.054 5.572 3.865 5.755 6.115 6.780 6.324 4.602 2.737 3.979 4.660 5.678 5.512 4.897 5.059 4.810 4.162 5.076 4.974 4.426 4.724 4.564 4.187 4.347 3.096 + 5.706 7.629 8.556 7.317 7.686 8.727 8.156 8.758 8.383 8.461 8.335 8.567 8.602 8.411 8.411 8.435 8.625 8.760 8.615 8.463 8.600 7.671 6.307 6.466 6.640 5.988 5.813 5.511 4.838 5.575 6.134 6.053 5.666 5.789 5.984 5.890 + 8.647 8.393 9.503 8.804 8.794 9.143 8.997 9.180 9.152 9.173 9.122 9.380 9.326 9.234 9.225 9.316 9.370 9.475 9.483 9.626 9.661 8.524 6.784 6.513 7.227 6.462 6.586 5.840 5.511 6.391 6.908 6.269 7.128 7.126 7.523 7.501 + 7.003 7.534 7.513 7.776 6.707 5.953 5.948 5.670 4.430 4.081 3.755 2.852 2.719 2.374 3.137 3.412 3.586 3.242 2.280 2.966 2.891 3.023 3.342 5.012 4.123 3.405 3.801 3.731 4.343 4.519 4.200 4.229 4.354 3.788 3.802 3.198 + 6.648 7.607 7.596 6.928 6.726 5.422 5.242 5.333 4.597 3.443 3.362 4.710 3.607 4.055 3.800 3.942 3.464 3.744 2.765 2.502 3.517 3.130 3.507 3.508 3.154 3.599 3.910 4.797 3.434 3.603 3.561 4.040 4.557 4.179 3.537 2.402 + 7.001 8.175 7.647 5.736 5.433 4.924 3.725 4.683 5.370 4.834 5.143 4.353 3.572 5.114 4.852 2.959 3.552 3.280 3.740 2.194 3.826 2.712 3.228 3.505 3.440 4.070 3.820 3.848 3.447 3.956 4.118 4.465 4.812 3.719 4.581 3.095 + 6.027 6.252 4.952 4.900 5.735 5.399 5.543 4.666 6.112 5.502 4.766 4.153 3.682 3.727 4.500 4.524 3.179 3.741 3.603 3.861 3.787 4.269 4.215 4.674 4.416 4.300 3.934 3.704 3.953 4.292 3.942 4.393 4.266 3.875 3.966 3.255 + 5.324 6.365 4.936 5.399 6.201 5.775 5.424 3.769 5.246 5.640 6.124 5.935 5.714 5.726 6.007 5.864 5.518 5.464 5.506 5.825 5.597 5.455 5.336 5.756 5.341 4.930 5.404 5.062 5.787 6.236 6.535 6.869 6.996 6.946 6.444 6.017 + 4.842 5.147 3.440 5.308 5.527 4.657 4.173 4.616 4.245 3.331 2.867 3.623 4.110 3.538 4.173 3.840 3.817 4.153 4.038 4.430 3.750 3.002 3.921 3.817 3.355 3.304 3.536 3.430 2.146 2.391 2.691 3.163 2.820 2.806 2.652 2.589 + 5.521 5.352 5.560 4.747 2.381 3.504 3.660 3.850 3.779 3.239 2.918 3.958 3.371 3.688 3.457 2.453 4.007 4.076 3.860 3.766 4.198 4.019 3.444 3.672 2.987 3.347 2.836 2.824 3.022 2.997 2.825 2.823 2.456 2.834 2.749 1.192 + 5.317 5.419 5.318 5.012 4.753 5.048 5.456 3.917 4.026 4.824 4.357 4.034 3.578 3.325 3.662 3.393 5.058 3.217 3.681 3.876 3.579 3.717 3.098 3.250 2.791 3.294 2.523 2.649 2.483 3.197 3.208 2.785 2.425 2.380 2.823 2.195 + 5.673 4.553 5.300 4.946 4.287 4.539 4.385 3.233 4.042 4.147 3.901 4.297 4.425 3.725 4.041 3.369 4.782 4.586 2.999 4.533 4.725 3.512 3.954 3.453 3.525 3.206 2.625 2.336 2.151 3.432 3.538 3.229 2.880 2.430 2.189 2.159 + 2.366 4.893 4.745 4.038 5.608 6.025 5.539 5.046 4.654 5.051 3.218 4.779 5.123 5.249 4.342 3.942 4.658 3.924 3.362 3.821 3.608 3.476 4.414 3.900 3.272 3.702 3.611 3.900 2.805 3.184 3.959 3.345 3.135 3.548 2.592 2.626 + 1.378 4.478 5.349 4.020 4.493 4.928 4.823 5.220 4.333 4.124 3.625 3.734 3.167 4.204 3.659 3.665 4.927 3.764 4.187 4.189 3.888 3.947 3.671 3.237 3.033 2.455 3.267 3.849 2.121 2.861 3.483 3.026 2.538 3.596 2.445 1.539 + 5.202 4.753 4.812 3.583 2.265 5.120 5.816 4.463 3.133 4.092 4.448 4.714 5.233 4.728 4.132 4.122 4.385 3.619 3.677 3.802 3.953 3.721 4.065 3.759 3.929 3.332 3.691 3.373 2.360 3.028 2.286 2.210 3.255 3.357 3.015 2.612 + 5.090 3.966 3.448 4.461 5.017 5.737 3.963 3.614 2.992 4.544 5.006 4.552 4.482 3.678 4.239 3.180 3.920 4.021 3.151 4.640 4.751 3.223 4.149 3.676 3.961 3.901 3.093 2.535 3.055 2.615 2.384 2.703 3.649 3.186 2.474 2.033 + 4.619 4.423 4.569 3.531 4.238 5.095 5.355 5.405 4.707 5.080 4.588 4.771 4.876 3.181 3.880 4.657 4.403 4.192 3.914 4.068 3.996 3.192 4.765 4.539 3.671 2.884 3.219 3.064 3.661 3.478 3.161 2.594 2.737 3.310 2.982 3.138 + 2.790 3.909 4.069 4.748 5.219 5.580 5.482 5.049 4.640 4.525 4.492 3.792 4.196 5.033 5.120 5.420 5.251 5.575 5.901 5.521 5.893 6.506 6.362 6.470 6.599 7.079 7.362 7.247 7.502 7.712 7.721 7.943 7.879 7.832 7.700 7.050 + 4.720 4.457 4.522 5.391 6.870 6.303 5.007 4.760 4.846 5.095 4.198 4.475 4.813 3.634 3.649 4.236 3.778 4.124 4.143 3.830 4.129 5.104 5.019 5.012 5.091 5.691 5.928 6.064 5.994 6.008 5.991 6.249 6.428 6.369 6.334 5.898 + 6.260 4.880 3.767 5.870 6.859 6.016 5.895 5.570 4.422 3.023 4.473 4.120 3.515 3.272 3.090 2.789 2.736 3.415 3.133 4.245 4.205 4.205 3.710 4.716 4.024 4.357 4.040 3.918 4.238 3.747 2.820 2.130 2.538 2.477 2.147 2.496 + 5.976 4.398 5.401 6.174 6.315 5.425 4.717 4.263 3.831 2.754 4.400 4.309 3.535 2.772 3.223 3.572 3.275 2.864 3.054 2.957 2.553 3.359 3.385 2.906 2.862 2.330 2.888 2.165 3.135 2.889 2.569 2.123 3.671 3.625 2.721 2.725 + 5.188 4.296 4.020 4.136 4.030 3.286 3.300 3.620 3.359 2.955 4.210 5.203 3.409 3.194 3.548 3.716 4.382 3.440 3.444 3.364 3.026 3.280 3.363 3.987 3.552 3.701 3.915 3.954 3.819 2.739 3.121 3.159 3.140 3.554 3.480 2.693 + 2.914 3.784 4.077 3.644 4.139 4.677 3.069 3.377 3.718 2.870 2.484 3.493 1.842 3.543 3.537 4.402 3.541 2.336 3.093 2.445 2.145 3.968 4.608 3.468 2.826 3.520 3.513 3.492 3.033 1.888 3.802 3.783 3.740 3.808 3.527 2.713 + 2.564 1.636 3.098 3.139 4.185 3.538 3.422 1.675 2.332 2.090 3.195 2.191 1.082 2.690 3.068 2.757 3.031 2.782 1.986 2.896 2.863 3.305 3.478 2.755 2.220 2.746 3.195 3.078 1.733 1.146 1.801 2.045 2.819 2.663 2.707 2.538 + 2.114 2.303 3.163 2.543 1.594 2.175 2.840 2.944 2.737 2.262 2.843 2.521 2.275 1.964 2.762 2.821 3.421 3.093 1.741 3.051 3.337 4.699 3.500 2.929 2.855 2.767 2.638 2.797 2.649 3.038 2.159 3.366 3.596 2.704 2.444 1.482 + 3.127 2.454 2.409 1.981 2.943 2.933 3.405 2.526 1.124 1.784 1.900 3.074 2.102 2.971 1.958 2.599 2.959 3.167 2.871 3.295 3.365 3.808 2.746 3.625 3.191 2.748 2.656 2.416 2.340 2.921 2.699 2.571 3.079 3.125 2.657 1.869 + 1.176 3.633 4.330 2.948 3.095 2.415 2.783 2.825 2.522 3.614 3.213 2.502 2.392 2.871 2.505 2.000 2.514 3.028 3.621 3.454 3.108 3.909 4.011 3.411 2.847 2.761 2.360 2.255 1.808 3.017 3.500 2.342 3.124 2.584 1.968 1.504 + 1.937 4.163 4.483 2.787 3.525 3.238 2.560 1.169 2.454 2.045 1.574 1.719 2.157 2.703 1.956 2.861 0.955 2.633 2.020 2.253 2.927 3.016 2.864 2.909 2.601 2.038 2.749 2.510 2.293 3.219 2.793 2.283 2.168 2.273 2.269 1.602 + 2.630 4.008 3.478 2.402 1.969 2.551 1.311 1.544 1.493 2.122 3.195 2.689 2.101 1.765 0.695 2.535 2.015 2.954 2.475 3.018 3.051 2.982 2.996 2.337 3.172 2.101 1.924 2.017 2.480 2.543 1.989 1.947 1.888 2.617 2.596 1.933 + 3.423 3.298 3.992 2.304 1.220 0.577 0.742 1.961 2.665 2.863 2.203 1.680 2.515 3.656 2.129 1.091 1.444 2.066 3.201 1.892 3.468 3.227 4.156 2.890 2.999 2.720 2.731 2.537 2.118 2.129 2.091 2.035 2.372 3.174 2.525 2.320 + 2.383 3.351 3.255 2.474 2.497 2.289 3.208 3.571 3.152 2.067 2.921 2.673 2.545 3.102 3.032 2.913 1.898 2.407 2.352 1.539 2.629 2.776 1.514 2.215 2.596 2.413 2.598 2.542 1.902 2.265 2.526 2.996 2.437 1.936 1.914 1.432 + 3.496 2.546 3.102 2.845 2.988 2.266 2.341 1.784 3.072 1.954 2.666 2.372 1.994 2.524 2.295 2.710 1.859 1.808 2.469 2.033 2.232 1.020 1.857 2.311 2.356 2.980 2.588 2.636 2.452 2.212 1.847 2.710 1.849 1.548 2.320 2.060 + 2.566 1.921 3.022 2.910 3.385 2.821 0.987 2.786 2.832 2.296 3.353 2.457 1.928 2.370 2.305 1.938 1.537 1.788 1.775 2.498 2.548 1.692 2.545 1.381 1.950 1.927 1.963 2.818 2.834 2.680 3.213 4.472 4.525 4.462 4.266 3.546 + 3.824 3.673 3.542 3.276 3.446 2.384 3.005 3.953 4.073 3.008 2.106 3.869 3.748 2.285 3.288 3.259 2.804 2.066 1.141 1.888 2.220 1.893 2.349 1.486 0.684 0.780 2.263 2.733 2.566 3.330 3.983 4.277 4.485 4.448 4.276 3.489 + 3.478 4.550 4.133 2.793 3.291 3.646 4.768 4.501 3.773 3.411 4.550 3.854 2.302 3.011 3.259 3.782 1.541 3.052 2.775 2.055 2.180 2.361 1.229 2.021 2.156 2.465 2.176 2.437 1.796 2.285 2.064 1.765 2.159 1.400 0.562 1.236 + 2.433 3.305 3.609 3.433 3.175 2.852 2.538 2.417 3.377 3.901 4.942 3.852 3.570 3.600 3.548 3.808 2.032 2.049 1.806 3.319 2.432 2.656 2.174 3.060 2.513 1.729 2.585 2.230 2.536 2.384 1.835 1.305 1.889 1.653 1.460 1.580 + 3.347 4.340 3.672 2.964 3.299 3.260 3.781 4.492 4.511 4.414 4.290 3.800 3.032 2.414 2.807 2.429 1.731 0.741 1.005 1.168 1.801 2.305 2.370 0.428 0.988 1.937 2.001 1.469 2.005 1.821 1.807 1.543 1.386 0.958 1.480 0.895 + 1.365 1.881 2.204 2.725 3.799 4.252 3.735 4.504 3.820 4.248 3.466 1.999 1.617 1.047 1.042 1.729 2.675 2.499 2.808 2.862 1.828 2.830 3.195 2.036 2.065 2.699 2.373 1.522 2.171 2.394 1.115 1.755 1.710 2.446 1.811 1.446 + 4.358 4.566 5.061 4.980 3.928 3.543 4.690 4.067 5.126 5.972 3.836 1.900 2.427 2.020 1.785 0.902 1.444 2.273 2.401 1.958 3.774 3.645 3.474 2.784 2.227 3.795 4.140 2.900 2.835 3.486 2.492 3.058 2.636 3.599 3.191 2.341 + 4.826 5.858 5.783 6.069 6.251 4.985 5.690 5.722 5.382 5.422 5.706 5.595 5.157 4.822 4.161 3.617 2.760 3.468 3.113 2.794 4.050 3.790 4.423 3.787 3.388 2.858 3.317 3.200 3.819 2.922 2.591 3.011 2.177 2.504 2.927 2.121 + 2.345 4.361 4.618 4.489 5.071 5.747 6.142 6.458 6.209 5.548 5.806 5.862 4.587 3.662 4.185 2.893 2.399 2.371 3.508 3.394 3.907 3.803 4.481 4.390 5.057 4.497 3.918 4.132 4.167 3.185 2.656 3.237 4.109 3.734 3.664 2.676 + 3.576 4.431 4.941 5.574 6.095 4.736 4.718 5.349 6.156 5.872 5.217 5.832 3.981 4.060 3.951 3.126 2.330 1.661 2.635 2.230 3.008 4.194 4.736 4.737 5.561 4.888 4.458 3.856 4.088 3.776 3.085 3.193 3.738 3.662 3.094 2.393 + 5.298 4.360 4.539 4.946 5.569 5.293 6.367 5.721 4.796 5.379 5.505 5.011 4.783 5.008 4.951 4.949 4.000 2.872 4.349 3.771 3.388 4.699 4.542 4.097 4.162 3.573 4.142 2.895 2.685 1.872 1.946 1.540 0.487 0.882 0.761 -0.847 + 4.999 4.284 5.561 5.964 5.901 4.501 5.083 4.640 4.615 4.714 4.889 3.190 3.982 2.598 2.461 2.817 3.032 2.673 3.315 2.978 1.288 2.821 2.233 3.737 3.720 3.478 2.559 2.893 2.365 1.763 0.935 1.115 0.646 1.344 1.053 -0.206 + 3.624 5.403 6.121 4.322 4.533 5.022 6.086 6.172 5.033 4.758 5.074 5.416 4.770 5.058 4.546 3.779 4.762 3.727 2.648 3.441 3.362 2.792 3.548 4.233 3.583 2.571 2.632 2.800 1.352 1.173 0.974 0.777 0.885 1.623 1.118 -0.236 + 4.226 5.823 5.915 5.739 4.840 4.117 4.952 5.092 5.070 5.193 5.165 6.479 5.889 4.641 3.945 1.961 3.599 3.708 3.254 2.544 3.400 2.717 2.779 2.924 3.004 3.386 3.628 1.982 1.457 2.054 1.247 1.141 1.476 0.405 0.479 0.311 + 4.862 3.363 4.324 5.217 5.063 5.764 5.077 5.090 5.456 5.546 6.062 5.014 4.259 3.947 3.904 3.928 2.561 3.368 3.112 1.751 2.727 2.956 3.351 3.206 3.285 3.047 3.539 1.994 1.749 2.514 1.500 1.423 1.293 0.886 -0.029 0.267 + 5.675 4.469 4.969 5.675 6.221 6.431 5.415 6.402 5.952 7.114 7.536 6.280 4.907 4.739 5.275 4.567 3.933 4.118 3.715 3.862 2.589 3.196 3.350 3.822 3.712 2.833 3.279 2.987 2.486 1.613 1.173 0.675 0.627 0.631 0.340 0.429 + 5.527 6.793 6.729 6.879 6.963 5.293 6.261 6.174 4.573 6.233 5.971 4.128 4.996 5.955 5.522 4.181 3.464 3.547 3.775 3.348 3.063 4.378 4.994 4.402 4.931 5.417 3.541 2.917 1.963 1.576 1.196 0.953 1.505 0.430 0.223 -0.215 + 6.110 6.329 4.860 5.773 6.972 6.717 4.776 4.661 6.055 5.071 4.233 4.202 3.361 3.636 3.538 1.881 2.118 2.423 3.265 3.191 2.716 3.789 4.649 4.592 4.547 4.355 3.337 3.194 1.936 2.406 2.385 2.163 2.578 1.924 1.746 -0.306 + 5.886 6.442 4.739 6.878 8.145 6.733 4.390 6.362 6.578 5.478 4.775 4.739 5.360 4.545 2.934 2.564 3.080 3.391 3.222 2.896 2.459 2.460 2.915 3.768 5.535 5.604 3.053 3.678 2.681 2.007 1.757 1.466 1.259 0.785 0.498 -0.451 + 5.940 5.989 2.967 4.137 7.233 6.418 4.856 4.266 4.239 4.030 4.640 4.682 4.533 3.270 1.282 2.358 2.659 3.738 3.322 4.909 4.714 5.095 5.291 4.609 4.944 5.115 3.237 3.940 2.754 2.681 1.123 0.702 0.374 0.678 0.118 -0.291 + 7.157 7.261 5.268 5.331 8.283 7.716 5.110 6.407 5.647 3.079 5.195 4.765 4.517 3.155 5.644 5.757 3.873 4.403 4.437 4.926 4.646 5.349 5.489 3.974 4.184 4.289 3.789 3.895 2.399 1.647 1.198 1.908 2.152 1.689 1.379 1.131 + 7.145 7.482 5.745 7.234 9.218 8.135 4.718 7.186 6.703 4.082 3.902 2.931 3.121 4.557 6.986 6.688 3.097 4.037 4.206 5.287 4.879 4.226 4.356 3.600 5.240 5.833 5.655 4.026 3.382 3.690 3.317 3.390 3.084 3.816 3.422 3.132 + 6.820 7.096 4.591 6.221 9.381 8.641 4.572 8.202 7.691 4.472 5.400 4.309 4.630 3.443 6.672 6.935 3.369 2.919 4.092 5.040 5.040 4.842 5.011 5.356 5.646 6.445 5.351 3.286 3.377 4.399 5.387 3.816 4.174 5.422 3.614 2.625 + 6.977 7.435 5.584 7.075 9.813 9.006 5.272 8.253 7.506 4.847 6.217 5.180 3.123 4.204 6.873 6.927 3.418 2.204 3.157 3.399 3.554 3.875 4.402 5.534 6.285 6.018 5.260 2.784 3.748 4.960 4.422 3.231 3.839 5.268 2.943 1.710 + 7.151 7.378 5.182 7.045 9.987 9.127 4.849 8.233 7.877 4.807 6.023 4.677 3.468 4.330 7.144 6.901 2.498 2.637 3.911 3.070 3.498 3.776 4.647 4.962 5.903 6.912 5.347 3.058 3.762 5.305 5.572 3.850 4.372 5.403 3.159 1.592 + 7.409 7.722 6.333 7.777 10.216 9.317 5.766 8.437 7.606 3.868 5.802 5.168 4.010 2.632 7.416 7.240 2.355 2.052 2.668 3.026 3.662 4.427 4.865 5.075 5.569 6.428 4.219 3.531 4.028 5.153 5.608 4.062 4.691 6.246 3.518 2.437 + 6.576 7.253 5.613 7.727 10.167 8.983 5.245 7.981 7.466 4.988 6.796 5.933 4.405 4.535 8.304 7.868 4.138 3.140 4.344 5.327 4.987 4.763 5.844 5.356 6.278 7.177 5.599 3.695 3.554 4.422 4.825 4.267 5.207 5.748 3.501 2.042 + 8.082 7.948 5.374 8.396 10.203 8.652 4.268 6.768 5.363 4.785 5.988 5.774 6.499 5.501 8.258 7.556 4.301 3.970 4.958 5.935 5.694 5.909 4.918 4.858 5.630 5.829 4.974 4.482 4.317 4.574 5.046 4.298 5.088 5.753 3.899 3.056 + 7.373 8.099 6.134 7.697 9.684 8.763 5.982 6.916 5.643 3.477 4.360 4.301 5.187 4.903 6.702 5.798 4.055 4.238 3.212 4.396 4.705 5.359 4.987 4.938 5.036 5.391 4.136 3.853 3.964 5.352 5.993 3.984 4.708 4.620 3.285 2.767 + 8.989 9.584 9.840 8.793 7.718 7.411 6.071 6.334 7.052 7.719 8.232 7.186 5.215 5.369 5.868 5.631 4.422 4.185 3.345 4.863 5.457 5.583 4.251 4.530 4.748 5.023 4.175 3.879 3.354 4.705 5.225 4.855 4.189 5.005 5.110 4.181 + 10.392 10.470 10.430 9.911 9.828 8.275 6.006 6.708 6.706 6.240 7.387 5.856 4.337 3.497 5.126 5.129 3.818 2.710 3.795 3.882 4.429 4.130 4.124 4.520 5.054 5.289 4.400 4.773 4.336 4.764 5.097 5.031 5.025 5.004 4.654 3.995 + 8.447 7.373 5.984 6.008 8.660 7.938 7.142 6.513 5.620 6.132 6.074 5.776 4.672 4.786 4.691 4.970 4.437 3.411 3.245 3.437 3.810 3.984 3.658 4.694 5.001 4.944 5.141 4.317 4.539 4.411 5.025 4.282 4.065 4.205 4.255 3.787 + 5.571 6.136 5.730 6.039 7.718 6.998 5.837 5.251 3.113 3.641 4.555 3.017 2.708 4.855 4.391 4.114 4.239 4.441 4.607 5.371 4.491 4.495 5.331 5.484 5.274 4.817 4.860 4.443 4.531 4.630 5.037 4.865 4.660 5.176 4.426 3.276 + 5.144 5.217 4.209 6.326 8.137 7.492 5.861 4.931 3.875 4.093 4.193 2.477 4.416 5.252 4.063 5.025 5.387 5.287 4.560 5.611 6.484 5.798 6.232 6.376 7.560 7.112 5.432 5.150 4.841 5.448 5.403 5.003 5.248 5.368 5.387 5.277 + 7.742 7.407 6.710 6.642 8.490 9.170 7.422 8.283 7.553 7.522 5.253 6.015 5.970 5.474 5.734 6.742 6.843 5.735 4.970 5.475 7.059 7.540 6.891 8.249 9.061 9.324 7.274 6.322 6.652 6.716 6.338 7.218 6.494 6.771 6.242 5.586 + 12.227 11.089 9.092 9.770 10.982 11.643 11.392 11.013 10.547 9.768 8.881 7.854 7.216 7.644 8.249 9.158 9.322 8.209 6.147 6.926 7.316 8.233 8.193 7.353 9.472 10.127 9.280 8.795 9.345 8.740 8.301 9.442 8.558 7.726 7.891 6.158 + 10.999 9.692 9.265 9.355 9.424 8.756 8.772 7.713 7.261 7.670 6.831 6.244 5.485 6.482 6.583 6.143 6.649 6.285 5.325 5.910 7.111 7.848 8.552 8.235 10.117 10.313 9.236 6.566 6.681 6.926 6.547 6.827 7.388 7.309 7.116 5.651 + 11.774 11.923 10.553 11.437 10.745 9.481 10.491 9.513 8.994 9.550 9.224 9.149 9.090 8.757 8.867 8.381 8.027 7.979 7.835 7.270 7.130 8.780 9.287 8.662 9.563 10.054 8.782 8.031 7.665 7.045 8.061 7.994 8.087 8.630 7.910 5.545 + 13.374 13.032 12.293 12.164 11.141 10.622 10.809 10.084 9.007 9.787 10.128 10.267 9.856 9.929 9.756 9.226 8.487 7.432 7.455 7.569 7.470 8.167 8.337 9.376 9.782 10.804 9.979 8.691 7.874 7.537 8.238 8.360 7.660 8.623 8.028 6.388 + 10.713 9.142 6.409 8.645 8.170 6.312 6.732 6.445 6.628 6.927 6.453 5.867 5.611 5.636 5.178 5.225 3.318 4.267 4.906 5.233 5.313 6.012 7.777 8.353 9.307 10.131 8.466 6.033 5.526 5.629 6.292 6.838 7.535 8.104 7.763 5.383 + 5.910 5.916 5.206 6.274 7.353 7.065 8.175 6.947 4.940 5.631 5.519 5.730 4.842 3.831 5.375 5.206 2.833 3.901 3.890 3.873 4.523 4.798 6.697 8.150 9.374 9.516 8.412 6.222 5.074 5.722 4.918 5.859 6.305 6.905 7.138 5.266 + 6.478 4.873 3.966 6.741 7.633 6.792 8.152 6.267 4.929 5.122 4.628 3.920 4.223 4.321 5.080 4.146 3.410 3.859 3.585 4.055 4.143 4.953 5.904 7.558 8.167 9.738 8.791 6.349 4.360 4.262 4.617 5.032 6.712 7.414 7.207 5.267 + 6.425 5.724 5.615 8.705 8.627 7.828 8.102 5.035 5.784 5.020 4.531 3.567 3.840 4.277 4.376 4.172 4.195 3.091 3.585 3.884 4.511 5.148 6.331 7.845 8.841 10.220 8.654 6.353 5.316 5.552 5.850 5.478 6.258 6.765 6.203 5.231 + 4.886 5.377 6.656 9.754 9.097 7.904 8.880 6.409 5.739 4.995 5.024 4.593 1.382 4.697 5.865 5.633 5.102 3.626 4.837 4.983 5.158 5.017 6.861 9.282 10.116 10.733 9.939 7.320 6.187 6.644 7.077 6.947 7.379 7.045 7.524 6.066 + 3.857 4.079 8.294 10.288 9.229 8.432 8.187 6.744 5.842 5.553 4.438 4.824 3.946 4.406 5.090 4.697 3.704 3.664 3.216 4.147 5.126 5.518 7.137 10.009 10.369 10.569 10.072 7.752 5.638 5.778 6.491 5.875 6.676 7.444 7.529 5.474 + 5.844 4.552 7.781 9.544 8.610 7.819 6.344 8.022 8.344 5.911 5.088 5.589 4.454 4.722 3.747 3.905 3.810 3.378 3.458 4.131 5.036 6.343 8.258 10.092 10.373 11.035 9.989 7.742 6.095 5.580 6.439 6.520 7.622 8.562 7.877 5.696 + 3.074 4.796 5.531 7.068 8.109 8.502 7.067 9.145 9.266 6.520 5.570 3.873 3.544 5.024 4.119 3.861 2.570 2.699 4.082 4.380 4.879 6.074 8.922 10.541 10.852 10.842 9.867 7.964 5.719 5.891 6.657 6.772 7.221 8.616 8.192 6.418 + 3.063 5.290 5.791 5.207 6.814 8.687 7.288 8.400 8.155 7.019 6.329 5.796 4.116 4.410 5.557 4.499 3.541 3.561 4.028 5.056 4.536 4.931 8.812 10.279 10.017 10.671 10.084 7.646 5.702 5.691 5.603 6.756 6.533 7.842 8.181 6.556 + 3.181 4.766 5.262 6.798 7.314 8.807 7.241 8.421 8.035 6.773 5.760 4.509 5.301 4.921 5.059 5.163 3.226 4.254 4.746 4.023 5.332 4.572 8.724 10.652 10.182 10.559 9.510 7.504 6.146 5.722 6.010 5.537 5.747 7.753 7.889 5.723 + 4.503 4.751 7.228 7.901 7.499 8.895 7.566 8.048 7.291 6.992 6.441 4.105 4.093 4.307 4.095 3.235 3.274 4.577 5.944 5.168 4.984 5.037 7.375 9.148 9.667 9.255 7.528 6.632 5.321 4.043 5.218 5.490 7.033 7.480 7.103 5.912 + 4.873 4.551 6.373 7.924 6.749 6.874 5.953 6.609 5.605 4.332 5.650 5.369 3.739 3.869 4.942 3.642 2.745 3.083 3.040 2.695 3.904 3.625 5.264 8.083 8.768 8.667 7.235 5.655 4.507 4.594 4.625 4.728 5.983 7.153 7.206 4.915 + 7.530 6.645 7.203 7.273 6.527 6.740 5.843 6.740 6.830 6.284 5.952 3.722 2.942 4.362 4.165 3.437 4.305 4.118 3.661 3.508 4.839 5.103 4.978 7.129 8.181 8.260 5.413 4.834 4.247 4.382 4.716 5.116 5.590 6.189 5.964 3.726 + 8.714 7.046 7.651 6.826 6.498 6.116 6.187 6.067 5.437 5.125 5.284 4.545 4.399 4.718 4.852 4.175 3.878 3.835 4.511 4.514 5.030 5.266 4.950 5.640 6.831 7.010 5.046 5.191 5.690 4.997 3.722 4.756 5.712 5.995 6.178 5.003 + 8.332 7.441 6.522 6.653 6.707 6.707 5.054 5.257 5.571 5.317 4.428 4.793 3.349 4.286 5.315 4.475 4.271 4.360 4.995 4.967 4.835 4.459 6.079 6.164 6.129 5.197 5.038 4.639 5.066 4.968 4.475 4.999 5.720 6.780 6.054 5.039 + 6.397 5.646 6.229 6.053 5.726 7.284 5.846 5.433 4.988 5.190 3.496 4.407 4.787 3.413 4.694 4.433 3.265 4.144 4.005 4.029 4.619 5.361 5.408 5.040 4.846 3.720 5.099 4.975 5.012 4.603 4.227 4.289 4.307 4.949 5.089 3.563 + 7.246 7.495 6.581 6.374 7.234 6.861 6.115 5.543 4.321 5.464 5.510 4.683 4.198 3.876 4.043 4.750 3.648 4.287 4.431 4.076 4.274 4.474 4.929 6.408 5.904 5.983 5.589 4.771 4.355 3.923 3.623 3.654 3.975 3.976 4.075 2.488 + 8.663 8.341 6.967 6.696 6.961 7.034 6.617 4.781 4.890 4.406 5.348 4.200 3.607 4.361 4.056 4.911 5.310 4.039 3.729 4.281 4.777 4.247 4.449 6.016 5.272 5.225 4.984 5.511 4.147 4.971 4.995 5.209 5.318 4.767 4.074 2.623 + 7.009 6.547 5.560 5.271 4.629 5.730 5.922 5.190 4.061 4.530 5.024 5.230 4.424 4.649 5.318 4.112 4.925 4.965 3.619 3.530 3.365 4.540 4.942 5.622 6.144 6.039 5.766 5.962 5.522 5.142 4.349 4.662 5.755 5.206 5.642 3.940 + 5.780 5.863 6.752 6.979 5.810 6.113 5.833 5.181 5.634 6.397 4.538 4.088 3.928 4.968 4.691 4.077 4.059 4.075 3.615 4.394 5.191 4.809 4.853 6.812 7.928 8.095 6.807 5.309 4.736 5.246 4.603 4.678 5.523 5.969 5.386 4.761 + 4.867 6.254 6.973 5.717 6.399 7.677 5.719 4.750 4.858 5.863 3.828 3.336 2.355 4.255 4.088 3.763 3.853 3.127 3.819 3.801 5.381 5.029 4.670 8.256 8.071 8.751 7.175 5.970 5.313 5.083 5.111 4.970 5.832 6.331 6.598 5.147 + 4.752 5.830 6.243 5.704 7.061 8.328 6.459 6.238 5.579 4.780 3.715 2.733 2.579 3.329 4.531 3.717 3.722 2.362 2.723 3.820 4.010 4.550 6.423 8.548 8.521 7.958 8.506 7.297 5.974 4.895 6.300 6.303 6.328 7.218 6.976 4.922 + 6.343 6.064 6.376 6.780 8.045 8.322 7.510 8.392 7.512 6.165 4.965 2.825 2.706 4.256 4.257 3.783 2.997 2.998 2.857 5.807 6.297 6.450 8.529 9.226 8.815 8.747 8.917 7.670 7.214 6.047 6.646 6.220 6.545 6.979 7.381 5.449 + 4.507 5.052 5.948 6.624 6.910 6.096 6.896 7.146 6.281 6.521 5.146 4.945 4.738 5.294 4.964 3.758 3.313 5.584 5.351 6.891 7.404 7.709 8.920 8.147 8.459 8.829 8.942 7.303 6.222 5.718 6.528 5.884 7.020 7.206 7.638 5.555 + 5.337 4.635 5.761 5.272 3.925 3.576 5.167 4.941 6.831 6.464 3.631 4.968 5.248 4.664 5.375 4.715 3.540 4.842 5.063 6.569 7.653 8.857 8.213 7.212 8.031 8.471 8.300 6.341 5.947 5.882 5.704 5.902 8.000 7.670 7.188 5.232 + 5.424 5.426 6.225 4.977 5.797 5.159 4.856 4.959 7.250 6.740 4.108 3.291 4.425 5.155 5.257 5.130 4.140 5.331 5.895 6.470 8.068 8.905 6.615 6.595 7.254 8.261 7.660 6.592 5.853 5.760 5.713 5.932 7.427 7.702 6.973 5.876 + 5.315 5.391 6.731 5.971 6.236 6.003 6.904 5.686 6.173 5.841 5.043 3.343 4.123 6.323 5.039 4.947 4.977 5.729 6.149 7.928 8.517 7.888 7.495 7.668 7.045 7.843 8.118 6.727 5.377 5.089 5.526 5.729 6.754 7.306 7.545 5.608 + 5.443 5.399 4.793 5.100 4.984 5.670 7.164 6.036 6.393 6.709 6.880 4.341 5.257 6.073 5.834 4.732 4.862 6.132 5.597 9.035 9.143 7.649 6.156 6.668 6.764 7.613 7.708 6.510 4.199 4.615 5.686 6.077 6.923 7.396 7.244 5.267 + 3.026 4.286 3.281 4.644 5.153 5.177 5.730 6.568 7.409 8.215 7.543 7.062 5.948 6.112 6.715 4.922 5.077 6.777 6.989 9.551 9.489 7.679 5.576 6.024 6.058 6.687 6.779 5.691 4.273 4.108 4.335 5.741 6.790 6.689 6.850 3.774 + 12.004 12.272 12.025 12.068 12.121 12.217 12.154 11.972 10.575 10.583 10.639 11.025 10.600 9.497 9.650 9.561 9.714 9.322 8.710 9.890 9.720 7.998 6.911 7.649 6.736 7.892 7.166 6.994 5.832 5.961 5.332 6.604 6.847 6.837 6.712 5.365 + 14.501 13.377 12.750 11.967 12.822 12.642 13.057 12.930 11.222 9.277 11.175 11.859 10.945 9.026 9.784 9.642 10.092 9.579 8.760 10.051 10.128 9.089 7.885 8.489 8.074 8.964 7.859 7.424 6.429 6.747 6.774 7.269 7.531 6.361 6.839 6.414 + 11.849 10.464 8.361 9.306 8.716 9.164 8.451 7.660 9.115 9.299 8.040 7.623 7.590 6.674 6.486 5.851 5.203 6.408 6.819 9.542 9.526 7.619 5.544 6.247 5.854 6.267 6.893 6.218 5.268 4.052 5.014 5.235 5.657 5.680 6.211 4.332 + 9.006 5.350 5.341 4.543 5.380 4.950 5.302 7.155 7.414 7.578 6.439 5.871 5.895 4.587 4.196 3.580 5.050 5.685 7.082 8.316 8.213 5.364 4.099 5.552 5.446 5.911 7.462 6.257 4.235 4.789 4.767 5.868 6.548 5.983 6.351 4.834 + 5.850 4.983 5.008 5.102 5.831 5.071 3.459 5.853 8.012 7.655 5.136 6.213 5.385 4.768 5.166 3.198 3.664 6.314 7.334 9.134 9.085 6.118 5.544 4.710 5.579 5.309 6.691 6.706 5.580 4.849 4.859 5.848 6.552 5.441 5.485 3.999 + 4.196 4.742 4.925 5.273 6.127 5.997 5.296 6.298 7.189 8.356 6.033 5.551 6.259 5.518 5.834 4.369 4.960 5.507 6.316 9.024 8.599 6.690 5.345 5.101 5.902 5.225 6.691 6.223 4.596 4.419 4.710 5.566 6.273 5.411 4.847 2.900 + 6.629 6.114 6.284 6.768 6.093 6.605 5.921 7.205 7.637 8.502 6.645 6.013 5.242 6.184 5.189 4.368 5.295 6.833 7.484 9.436 8.432 6.457 4.691 4.174 4.887 5.317 6.208 5.906 4.636 4.695 4.163 4.423 4.162 4.672 5.068 2.490 + 7.257 8.129 8.404 8.889 8.966 9.889 10.267 9.502 9.501 9.995 9.159 9.152 8.645 8.260 8.167 7.622 8.135 7.468 7.495 7.415 7.936 7.440 7.457 7.603 8.400 7.430 7.254 7.193 6.666 6.801 7.450 8.664 9.469 8.014 8.549 7.442 + 10.758 8.711 7.481 8.481 8.323 9.634 10.222 9.829 9.103 9.591 9.149 8.842 7.960 6.952 7.475 7.028 7.592 7.591 7.045 6.836 8.074 8.475 8.148 9.393 10.026 8.881 8.924 8.436 7.497 7.970 8.657 9.273 9.780 9.238 8.721 7.675 + 10.355 9.839 9.659 9.830 9.766 9.591 9.435 10.147 9.564 9.540 9.216 8.239 8.325 8.267 7.390 7.673 8.282 8.808 9.125 8.462 8.559 8.525 9.433 10.453 11.120 10.774 9.699 8.437 9.838 10.498 10.964 11.507 11.707 11.322 10.471 8.619 + 11.378 8.736 7.575 8.116 6.899 6.619 7.761 8.083 6.731 5.706 5.567 4.167 3.901 3.891 4.081 4.095 5.031 5.759 5.793 6.490 6.545 6.471 5.248 6.370 6.582 6.369 5.186 5.273 5.185 5.397 5.689 6.424 6.243 5.841 5.554 4.168 + 8.153 7.445 7.636 8.765 7.328 5.246 6.203 7.809 7.880 7.472 5.826 4.111 4.463 4.935 4.282 3.649 3.033 4.099 4.875 5.269 5.115 5.783 4.882 5.009 4.045 4.776 4.830 5.069 4.468 4.562 5.165 5.198 4.967 4.258 5.088 4.484 + 6.807 6.622 6.280 7.225 6.991 6.550 5.645 4.867 5.349 5.981 5.384 4.485 4.073 4.647 5.139 3.104 3.757 4.112 4.387 6.081 5.865 4.428 4.415 5.351 4.031 4.459 4.405 4.736 4.181 3.713 4.307 5.260 4.753 4.987 4.544 4.075 + 7.275 7.043 6.839 6.992 7.868 6.444 5.642 6.109 7.043 7.300 6.446 5.541 5.583 5.228 4.823 4.869 3.596 3.032 4.996 5.269 5.830 5.949 4.756 4.918 4.439 4.787 4.992 5.118 4.892 4.458 3.419 4.358 4.267 4.774 4.546 5.020 + 8.280 8.160 7.813 8.206 8.250 7.529 6.717 5.921 6.083 5.992 5.349 5.592 4.229 5.490 5.532 4.167 3.211 3.274 3.977 5.496 5.251 4.916 4.782 5.396 5.113 5.456 4.860 5.181 4.910 4.918 4.530 5.288 5.259 5.517 4.334 4.559 + 6.191 7.335 6.993 9.137 8.912 5.952 6.296 6.307 4.583 5.686 6.223 4.565 3.824 5.976 6.274 5.570 2.943 2.888 3.796 5.109 4.730 5.305 4.330 5.584 4.857 4.359 5.064 5.211 5.583 5.118 5.164 5.561 5.700 5.414 4.551 3.704 + 6.203 4.793 5.939 8.083 7.838 6.969 6.546 6.308 6.071 5.700 5.022 5.118 4.940 4.636 4.705 4.367 4.050 3.595 3.842 5.182 5.265 5.929 4.920 5.690 5.015 4.950 4.503 4.354 4.666 4.299 4.278 4.574 4.895 5.461 5.259 4.401 + 5.631 5.010 5.488 6.228 6.261 6.374 6.639 5.731 5.091 4.574 5.772 4.906 2.893 2.360 3.799 4.332 4.063 4.356 3.626 3.928 5.660 5.489 4.929 5.354 5.945 4.758 4.574 4.428 4.752 5.201 4.367 4.119 5.127 5.121 4.280 3.758 + 5.318 5.006 6.248 7.150 6.277 6.056 5.349 5.244 6.234 5.926 5.805 5.047 3.606 3.147 4.389 4.087 3.493 4.168 3.869 4.517 5.504 5.751 6.263 4.895 5.418 4.785 4.030 4.273 4.437 4.173 4.787 4.283 4.755 5.193 4.809 3.704 + 7.121 6.227 5.638 7.692 8.127 7.470 7.139 7.043 6.130 6.378 5.385 4.618 6.776 6.220 5.321 4.906 3.470 4.633 3.806 4.890 4.800 5.088 5.329 5.222 4.561 4.687 5.168 4.960 4.615 4.995 5.700 5.339 5.565 5.465 5.856 3.975 + 5.191 6.696 6.642 6.884 7.003 6.335 6.347 5.470 5.035 5.282 6.633 6.989 6.694 5.282 5.458 5.354 3.146 4.064 4.422 4.885 4.814 5.917 5.684 4.468 4.218 4.444 5.197 5.071 3.817 3.176 4.454 4.714 5.204 4.935 4.601 3.365 + 8.169 6.435 6.853 6.926 5.673 6.056 7.484 7.290 6.128 6.560 7.007 5.659 4.544 5.456 5.327 5.546 5.105 4.052 4.353 4.524 4.611 4.910 7.036 6.257 4.765 5.512 4.808 4.343 4.650 4.794 4.335 5.055 5.141 5.061 5.068 3.594 + 10.039 9.937 9.287 7.960 7.050 6.493 6.126 7.406 7.505 6.341 6.707 5.988 5.555 6.190 6.292 5.594 5.416 4.528 2.926 4.295 5.089 5.314 5.592 5.511 5.290 4.966 4.825 4.594 4.510 5.455 5.045 4.919 4.987 5.231 5.611 5.281 + 7.975 8.164 6.693 5.854 5.941 6.649 6.649 5.998 6.453 5.081 5.573 6.724 5.262 6.275 5.825 4.429 4.667 5.489 4.687 4.536 4.814 4.937 5.377 5.600 4.969 5.248 5.075 4.354 5.215 5.272 5.235 5.722 5.908 5.365 5.605 5.334 + 4.632 5.071 6.400 5.610 5.380 4.923 5.756 5.507 6.168 5.556 5.530 5.022 4.689 4.759 3.949 4.155 4.113 3.654 3.667 4.612 4.996 5.527 5.161 4.201 4.747 4.766 4.828 5.027 5.515 5.623 4.996 4.894 5.761 6.562 5.337 5.159 + 5.194 4.489 4.734 5.768 6.323 4.139 3.942 4.975 5.631 5.265 5.531 4.942 5.039 3.848 2.890 3.493 4.150 2.679 2.857 4.706 5.447 4.771 5.469 5.005 3.917 5.253 4.957 4.677 5.085 5.370 5.188 4.779 4.992 4.595 4.833 5.070 + 4.299 5.837 5.963 6.256 5.057 4.169 3.456 5.660 6.086 4.171 5.133 5.514 3.764 2.152 3.662 2.955 4.423 4.786 3.485 3.991 4.925 4.774 4.483 4.511 5.051 4.586 4.322 4.128 4.583 5.291 5.332 5.202 4.465 4.769 5.383 4.529 + 4.773 4.945 4.380 6.364 6.200 5.181 5.187 4.049 4.651 4.620 5.445 5.770 3.912 3.989 4.135 3.947 3.832 4.304 4.141 4.346 4.765 4.745 4.835 4.671 4.818 4.277 3.945 5.311 4.860 5.086 4.997 5.636 5.763 5.019 5.368 4.166 + 5.125 5.103 5.121 5.423 5.545 4.771 5.869 5.373 4.908 4.867 5.840 5.159 2.076 4.015 3.708 3.925 4.043 4.563 3.977 4.019 4.569 4.899 4.628 4.786 3.997 5.125 4.911 4.941 5.148 5.032 5.399 5.435 5.583 4.702 5.481 4.994 + 4.580 3.397 3.791 5.716 4.596 4.393 5.149 5.519 5.279 5.917 5.096 4.292 4.782 5.136 5.034 4.479 4.443 4.859 4.633 4.770 5.269 4.825 4.785 3.812 3.529 5.020 5.091 4.686 4.531 4.496 4.982 5.057 6.493 6.341 6.252 5.923 + 6.284 4.622 4.435 5.519 5.820 4.437 5.185 4.799 4.485 5.203 4.403 3.434 3.941 3.535 2.182 2.659 2.757 3.134 2.553 3.471 4.449 3.558 4.263 4.020 4.650 4.183 4.546 4.808 4.254 4.491 5.131 5.051 5.526 5.231 5.658 5.121 + 6.046 4.941 3.641 4.708 4.430 4.371 4.616 4.323 5.189 5.242 5.078 3.743 2.773 2.937 2.513 2.487 2.427 2.623 2.784 3.613 3.645 2.972 3.834 3.283 4.378 3.982 3.633 4.435 4.825 4.279 4.662 4.520 4.587 5.304 4.700 4.906 + 3.545 5.963 5.908 5.860 5.568 4.172 3.805 3.367 5.348 4.867 4.526 4.647 4.391 5.070 4.112 3.048 3.152 3.682 2.792 2.703 3.484 3.647 4.071 3.847 3.986 4.152 3.556 4.158 3.882 4.073 4.453 4.839 4.560 4.464 4.447 4.076 + 5.067 5.715 5.514 4.233 2.077 4.205 5.242 4.301 4.853 3.985 3.589 3.115 2.443 3.614 2.598 3.221 4.014 2.911 2.731 1.555 3.086 4.137 3.942 4.048 3.843 4.157 3.801 3.849 3.814 3.653 4.509 5.144 4.021 4.297 4.452 3.471 + 4.197 5.229 5.858 4.767 4.049 4.373 3.799 3.016 4.294 3.474 3.291 1.470 2.122 2.475 1.023 1.408 2.986 1.996 1.177 1.603 3.443 4.072 3.465 2.727 3.286 4.125 2.861 2.892 3.481 3.233 3.839 3.923 3.061 3.365 2.984 2.344 + 4.739 5.811 5.359 4.480 4.772 5.418 5.289 4.417 4.431 4.036 3.582 2.929 2.563 2.491 1.948 2.175 2.692 3.197 1.891 2.610 3.331 2.057 2.097 3.525 3.793 3.832 3.657 2.699 4.199 4.311 4.339 3.811 3.696 3.674 4.049 2.689 + 4.764 5.180 4.653 4.253 4.150 6.018 5.350 4.326 4.589 4.018 3.859 3.571 2.610 3.649 3.087 2.680 2.383 2.104 1.637 2.714 2.726 3.452 3.885 3.708 2.886 2.876 2.976 3.312 3.263 3.866 3.517 2.916 3.734 3.536 3.801 3.057 + 2.647 1.856 3.759 5.386 4.749 3.277 3.933 3.858 4.110 4.038 3.260 4.339 3.437 3.605 4.414 3.206 4.363 3.547 2.505 2.198 3.512 3.246 3.340 2.213 2.884 3.519 2.538 2.983 2.653 3.871 3.547 3.456 3.252 3.576 3.406 2.105 + 2.999 1.990 3.686 5.410 4.785 3.667 2.976 3.112 4.002 3.755 2.985 2.996 3.014 1.821 2.522 3.440 3.392 3.397 2.519 2.562 3.956 2.776 3.361 2.992 3.009 2.645 2.569 2.849 2.890 3.315 2.934 3.170 2.872 2.823 2.719 2.113 + 3.778 4.762 5.466 3.805 4.462 3.856 2.981 1.636 3.777 3.453 2.420 3.186 3.708 3.128 3.065 3.591 3.403 3.292 3.602 3.010 3.303 3.425 4.657 3.677 3.622 3.018 3.053 3.027 2.687 3.496 2.415 2.499 2.873 2.722 2.460 1.880 + 3.118 3.782 5.264 4.609 4.882 4.693 3.918 2.355 2.137 1.343 3.457 3.294 2.308 1.730 1.886 2.058 3.279 3.022 2.668 2.745 3.991 4.049 3.189 3.127 2.590 2.897 2.954 2.885 3.677 3.418 2.852 2.206 2.500 2.633 2.495 1.598 + 4.965 5.185 3.707 0.920 2.034 2.509 3.496 3.655 1.509 2.295 3.159 1.769 0.576 1.226 0.774 1.481 1.879 2.213 1.771 1.320 1.759 2.447 3.172 2.896 2.306 1.760 1.580 1.983 2.262 2.363 2.436 1.353 2.116 2.355 2.241 1.562 + 5.137 4.109 3.946 2.889 2.204 1.588 2.669 2.567 1.847 4.059 3.396 2.835 2.253 1.226 0.910 0.718 1.298 1.947 1.606 2.087 2.751 2.463 2.222 2.317 2.674 1.375 1.571 1.520 2.407 2.865 1.703 2.062 1.671 2.401 2.248 1.007 + 2.692 4.316 4.801 3.919 2.109 2.179 2.022 1.607 1.492 4.635 4.411 2.864 2.329 2.376 2.381 1.372 1.903 2.126 3.037 2.519 3.063 3.336 3.351 3.062 2.974 1.563 1.438 1.956 2.234 2.389 1.843 2.242 2.446 2.422 1.834 2.121 + 3.757 3.955 3.437 3.521 2.930 2.265 2.106 2.720 2.795 3.894 3.041 2.580 2.405 2.910 1.680 1.861 1.826 2.485 1.354 1.997 2.110 3.417 2.963 3.012 2.596 2.727 1.345 1.377 2.275 2.387 1.818 2.267 1.856 2.885 2.730 1.728 + 2.245 2.943 3.878 2.017 4.165 3.675 2.627 1.695 2.119 1.982 3.310 2.905 1.893 1.880 1.893 1.332 0.727 1.135 0.871 1.428 3.122 3.548 2.826 1.265 2.042 2.701 2.247 1.696 2.118 2.868 1.962 2.653 2.186 1.861 2.016 1.167 + 2.649 4.603 4.963 5.001 4.248 3.904 3.383 1.790 2.075 2.266 4.402 3.480 2.377 3.259 2.796 0.683 0.748 1.951 1.434 1.877 2.263 2.275 2.734 1.771 1.604 2.312 1.877 1.268 1.134 1.597 2.221 2.089 1.683 1.751 2.151 1.075 + 3.523 4.663 4.359 4.905 4.202 2.395 2.904 3.052 2.362 1.790 2.635 1.281 2.186 2.438 1.565 1.631 1.860 1.328 1.176 1.430 1.996 2.493 2.749 1.760 1.316 1.286 2.878 1.839 1.794 2.273 2.050 1.895 1.909 2.444 2.028 0.962 + 2.494 3.262 3.540 4.099 4.213 2.077 1.975 1.981 0.440 0.975 1.317 0.674 1.094 2.565 2.036 0.894 0.478 0.769 0.560 2.351 2.236 2.816 2.638 3.183 3.145 1.162 1.696 2.007 1.871 1.646 1.548 1.817 2.250 2.187 2.528 2.143 + 2.144 4.079 3.357 1.584 2.353 2.216 2.363 2.125 1.904 3.032 1.933 1.013 1.004 1.636 0.729 -0.172 0.952 1.921 2.112 1.445 1.846 3.564 3.294 3.466 3.773 2.623 2.570 2.864 2.850 2.722 2.428 2.509 3.189 2.876 2.598 2.052 + 4.162 3.730 4.031 4.516 2.915 2.661 4.427 4.674 3.322 4.514 4.328 3.014 1.037 2.210 2.039 1.920 2.380 3.024 2.544 2.341 2.255 2.551 3.150 3.070 2.776 2.625 3.085 2.314 2.890 2.892 2.543 3.124 4.104 3.634 2.590 1.607 + 5.963 5.658 4.882 5.025 5.516 4.183 4.557 5.747 4.558 4.920 4.313 2.992 3.396 3.934 3.723 1.874 1.339 2.051 1.737 1.976 2.741 2.058 3.232 3.413 3.282 3.533 3.316 3.324 3.792 3.939 2.799 2.535 3.053 2.665 2.223 1.303 + 7.140 8.512 7.840 6.677 6.545 7.475 7.563 5.473 5.690 6.474 5.128 4.499 4.290 4.310 3.106 2.544 2.520 2.147 2.672 3.307 3.589 4.751 5.604 6.213 5.733 5.646 6.397 5.761 5.447 5.003 5.402 5.368 5.945 4.531 4.242 4.006 + 7.106 7.305 7.379 5.523 6.374 6.561 7.269 6.630 5.202 3.886 5.102 4.222 2.582 3.180 3.427 3.035 3.544 3.329 3.145 4.652 4.458 5.196 6.910 7.076 6.860 6.491 6.977 6.813 5.496 5.211 5.095 4.200 5.228 5.048 4.465 3.240 + 7.083 7.853 7.141 5.196 5.944 7.637 7.968 5.614 4.013 3.827 5.120 4.427 2.933 3.674 3.486 4.317 3.844 3.907 3.428 5.415 5.228 6.190 7.784 7.710 7.572 7.492 7.905 8.086 6.658 5.784 5.222 5.757 5.788 4.982 4.308 3.808 + 6.376 6.720 7.268 7.732 7.788 6.628 8.489 7.763 5.926 6.492 4.837 4.616 4.437 4.363 4.833 4.980 4.078 4.232 4.995 5.404 5.119 6.666 8.517 7.326 6.895 6.919 6.913 7.495 6.972 5.093 6.138 6.267 6.285 5.461 4.698 4.194 + 9.920 9.919 9.498 7.776 6.783 7.811 8.214 6.890 8.211 8.333 6.065 5.677 5.132 4.171 4.684 4.443 4.648 4.346 5.854 5.329 5.187 7.397 8.532 7.906 7.503 7.284 7.852 8.514 6.706 4.936 6.002 6.540 6.219 6.012 5.738 5.744 + 11.704 11.285 10.830 10.055 10.398 10.551 10.184 9.129 7.273 7.532 8.251 7.947 7.571 7.072 6.497 5.446 4.549 4.764 5.142 4.952 5.444 5.715 6.977 6.442 7.078 7.243 7.190 7.615 6.728 5.455 5.600 5.298 5.899 5.742 6.442 5.422 + 10.510 11.263 10.532 9.690 9.945 10.428 10.649 8.254 8.201 8.586 7.980 8.096 7.807 7.673 7.062 6.381 6.120 6.569 6.741 5.828 5.718 7.423 7.500 6.405 8.014 8.538 7.741 8.230 7.015 6.077 7.053 7.318 7.702 5.852 6.219 5.186 + 10.867 10.376 10.274 9.869 10.977 11.394 10.183 8.696 7.453 8.790 8.711 7.605 8.370 8.076 7.417 7.754 7.817 8.452 8.534 7.574 6.679 7.682 7.313 7.524 8.297 8.755 7.651 6.851 6.229 6.584 6.448 7.095 7.257 6.987 6.819 5.625 + 11.818 12.110 11.865 11.948 11.900 11.985 11.047 8.631 7.943 8.498 9.165 7.684 8.645 8.489 8.500 8.453 8.509 8.702 8.241 7.017 7.353 7.812 7.075 7.856 8.900 8.326 7.389 6.291 6.101 6.893 7.297 7.772 7.644 7.157 6.359 6.138 + 6.801 7.308 7.479 8.698 8.083 9.422 9.033 6.767 6.901 6.981 7.183 5.708 5.296 5.703 5.778 6.405 5.799 6.506 8.096 8.267 7.293 6.419 6.294 7.127 7.579 7.249 6.500 7.467 6.849 7.525 6.981 7.033 7.404 7.446 7.276 6.531 + 7.490 6.593 5.676 7.038 7.580 7.930 7.531 7.475 7.202 7.528 7.652 6.733 6.808 7.085 7.336 7.633 8.005 7.472 7.440 8.396 8.821 8.191 8.280 9.463 10.074 9.343 7.876 8.128 7.860 7.788 8.893 8.822 9.563 9.624 9.378 8.472 + 6.919 6.654 7.343 6.553 6.174 8.422 7.461 6.701 7.019 6.606 5.772 5.675 5.599 5.961 5.404 5.900 6.953 6.856 6.853 7.103 7.638 6.838 6.642 8.203 8.694 8.221 7.165 7.122 7.233 7.962 8.274 7.426 8.308 8.802 8.473 7.373 + 6.936 7.051 7.227 6.469 6.613 8.409 7.295 2.824 2.971 3.422 4.087 4.613 4.516 3.979 4.415 5.045 5.747 5.622 6.846 7.225 6.091 6.246 5.895 6.750 6.704 6.832 7.215 7.192 7.952 7.561 8.103 8.475 8.378 8.411 7.683 6.530 + 8.374 8.845 7.672 5.961 7.198 7.300 7.657 5.644 5.971 5.753 4.626 5.328 6.196 5.029 4.944 5.881 6.097 6.291 6.776 6.722 6.726 7.226 8.024 7.610 7.936 7.487 6.990 7.748 8.383 9.075 9.056 9.073 8.911 9.369 8.813 8.361 + 6.714 9.000 9.013 6.942 6.724 7.347 6.308 6.342 6.622 7.131 5.791 5.057 5.681 5.074 4.632 5.259 5.922 5.714 5.436 5.847 6.680 5.745 5.620 6.037 6.211 6.908 6.438 6.030 7.424 9.024 8.383 8.338 8.727 8.176 7.820 7.694 + 5.940 6.318 7.533 6.992 7.868 7.600 5.630 6.252 6.317 5.692 5.478 4.872 4.983 4.488 4.932 5.195 4.672 3.942 5.980 6.356 5.687 6.407 6.015 6.314 6.234 6.137 6.235 6.953 7.246 8.302 7.949 8.230 8.707 8.022 7.033 6.521 + 6.062 6.488 6.957 7.432 6.395 5.031 5.695 4.712 3.330 4.207 3.913 4.932 4.832 3.988 3.454 3.770 4.004 3.415 4.668 4.304 4.660 4.776 5.819 5.682 5.376 6.256 6.534 5.896 6.167 6.600 7.180 7.156 7.675 7.243 6.888 5.752 + 4.863 6.005 4.884 5.852 4.848 5.626 5.947 4.380 2.808 4.155 4.558 3.201 2.659 2.792 4.330 4.067 2.503 4.290 4.559 4.241 4.421 4.013 4.374 3.574 4.954 3.780 4.810 5.171 5.352 5.076 5.669 5.083 4.964 5.633 5.212 4.257 + 8.661 8.391 7.455 6.095 6.490 4.460 4.131 3.391 3.464 4.122 4.186 4.633 4.557 4.431 5.073 4.742 3.768 4.073 5.006 4.905 4.137 3.173 3.301 3.579 4.536 3.784 4.748 5.173 5.068 5.525 4.736 5.018 5.017 5.688 5.404 4.553 + 6.854 6.300 7.149 5.513 5.872 4.796 3.765 3.568 4.261 4.312 4.634 2.819 3.559 4.404 3.521 3.683 4.167 3.499 4.410 4.352 3.242 4.299 3.915 4.460 4.028 4.179 4.583 4.401 4.427 4.773 5.156 4.495 5.229 5.708 5.353 3.437 + 3.633 5.471 6.711 6.101 4.984 2.714 2.783 4.396 3.420 4.715 4.420 3.313 2.978 2.774 3.511 3.769 4.549 3.437 4.448 3.850 3.273 4.344 4.882 4.555 4.397 4.482 4.727 4.694 4.619 4.763 5.059 4.253 4.774 5.192 5.196 3.954 + 5.773 5.420 7.721 8.140 8.471 7.572 5.335 7.163 7.203 6.541 4.637 4.503 5.688 4.889 5.317 5.937 5.063 5.182 5.509 5.401 4.468 4.346 4.972 3.942 3.795 4.384 4.909 5.021 4.534 4.813 5.058 4.761 4.927 4.464 5.386 3.848 + 9.124 8.711 8.697 9.524 9.518 9.196 9.044 8.802 8.447 7.128 4.152 5.944 6.027 5.360 4.721 5.749 5.062 4.442 4.794 4.615 3.603 3.753 3.390 3.847 3.856 3.794 4.324 4.609 3.932 3.787 4.384 4.651 4.093 4.320 5.509 3.554 + 6.505 5.992 4.230 5.111 4.149 5.064 5.111 4.599 2.946 3.046 1.316 3.401 2.553 3.467 3.220 2.761 3.949 3.380 2.285 3.216 3.428 2.938 2.638 3.042 4.107 3.934 3.659 4.064 4.726 4.418 4.346 5.585 4.420 5.220 6.345 5.004 + 3.284 3.529 1.814 2.876 4.139 5.036 4.259 4.186 4.555 3.640 1.901 3.931 2.915 4.257 4.606 3.140 2.678 3.572 2.641 3.210 3.364 4.623 3.308 2.647 4.340 4.402 3.659 4.438 5.032 3.859 3.739 4.290 4.531 4.453 5.003 3.755 + 4.836 3.324 3.511 3.745 3.871 4.203 4.109 5.224 4.726 3.611 2.567 4.114 3.512 2.935 3.692 3.106 2.977 2.336 3.869 3.144 3.735 3.489 3.061 3.472 4.249 4.542 4.247 4.313 4.985 4.261 3.910 3.838 4.047 4.002 5.372 3.966 + 4.488 3.484 2.788 2.402 2.401 3.932 4.410 3.745 2.603 3.396 1.584 1.496 2.353 3.397 3.330 2.707 3.239 2.281 3.151 3.311 3.445 3.559 3.809 3.209 3.166 3.562 3.395 3.359 3.093 3.937 3.625 3.231 4.244 3.766 4.357 3.544 + 4.886 4.081 3.634 3.762 3.645 3.893 3.905 3.528 3.456 3.679 3.214 2.001 2.325 2.995 3.180 2.082 2.145 2.461 2.915 3.579 3.453 3.462 3.278 4.023 4.159 4.373 3.195 3.220 3.734 4.248 3.582 3.882 3.950 4.114 4.951 4.215 + 4.525 4.019 3.378 4.411 5.047 4.005 3.939 2.364 3.049 3.155 2.376 1.972 2.064 3.199 3.374 2.374 2.544 2.775 3.332 3.045 3.948 3.310 3.079 4.430 3.965 4.059 3.360 3.641 3.695 4.440 4.064 3.626 4.479 3.357 4.807 4.477 + 5.397 5.143 4.987 5.085 5.102 5.121 5.709 3.819 1.733 3.388 3.179 3.097 3.034 2.863 3.234 1.799 2.277 1.925 2.963 3.192 3.206 2.952 2.962 2.971 3.277 3.664 3.135 2.516 2.236 2.961 2.826 3.017 2.914 3.712 2.925 2.046 + 2.566 5.148 5.636 4.349 3.060 4.661 4.528 3.535 3.571 3.058 1.954 3.464 3.067 2.817 3.405 3.139 2.499 1.331 1.900 3.038 3.518 3.145 2.892 2.995 2.655 3.038 4.394 4.176 2.974 3.435 3.181 3.254 2.914 3.346 3.109 2.485 + 4.862 5.175 3.882 2.312 2.362 3.515 3.297 3.440 3.630 3.154 3.015 3.647 4.308 3.495 2.870 1.268 1.523 2.653 2.482 1.898 3.243 2.280 3.388 3.226 3.221 3.811 4.027 4.431 3.390 4.019 3.637 3.192 3.270 3.192 2.722 2.198 + 3.967 3.934 3.838 3.625 3.572 4.585 5.240 4.791 3.945 3.066 2.915 2.324 2.947 3.717 2.484 2.296 2.856 2.637 3.284 2.978 3.693 3.356 3.708 3.465 3.110 4.131 3.942 3.605 3.335 3.556 3.891 3.583 3.537 2.732 3.485 3.212 + 5.338 6.219 5.484 4.442 5.060 5.090 4.892 3.786 4.312 2.942 2.957 2.245 2.563 2.849 3.175 2.684 2.316 1.865 2.393 3.198 2.157 1.671 2.468 3.102 3.162 3.762 3.683 3.252 3.496 3.496 3.249 3.323 3.453 3.456 3.301 2.809 + 4.454 4.105 3.374 4.182 3.194 4.785 3.996 3.444 2.759 3.276 2.748 3.214 2.715 2.598 1.505 1.469 0.499 0.893 1.151 2.867 2.875 1.167 1.645 2.330 2.210 2.331 2.522 2.614 3.213 2.772 2.085 2.164 2.824 3.211 3.139 2.370 + 4.100 4.941 4.264 3.855 3.348 3.960 4.701 4.179 3.065 3.070 2.564 3.042 3.436 3.050 2.161 0.946 0.800 0.491 1.974 2.413 2.612 2.476 2.175 2.085 2.320 1.529 2.069 2.758 2.675 2.810 2.730 2.671 3.419 3.076 3.463 2.753 + 5.324 3.857 3.335 1.885 2.917 4.215 3.754 3.122 2.481 3.255 3.347 3.153 1.257 1.539 1.634 1.198 1.689 1.197 2.025 3.714 3.395 2.714 2.065 1.023 2.189 2.725 2.929 2.962 2.985 3.256 3.905 3.510 3.504 3.494 3.867 3.004 + 5.053 4.443 4.651 5.262 4.997 4.061 3.024 2.826 3.124 4.113 3.998 2.325 2.418 3.044 2.814 1.250 1.895 2.236 1.589 1.693 1.200 2.053 2.850 3.201 3.142 3.369 1.120 1.845 2.926 2.638 2.979 3.629 2.944 3.399 3.352 2.791 + 3.882 4.909 4.178 4.762 4.925 4.671 4.571 3.121 2.599 3.155 4.435 3.576 3.737 3.884 4.269 2.242 1.860 1.310 1.554 0.618 0.899 1.795 2.119 2.416 2.763 3.050 1.596 2.583 3.057 2.856 2.976 3.199 3.349 3.340 2.867 2.878 + 5.153 5.432 4.144 4.809 5.075 3.892 4.058 3.759 3.278 3.876 4.009 3.002 2.605 2.151 1.522 1.705 2.498 1.793 1.642 2.180 2.187 2.170 0.909 2.027 2.986 2.768 2.029 3.675 4.445 4.080 3.986 4.652 5.302 4.998 4.341 4.707 + 4.684 3.569 4.384 5.102 4.300 3.774 4.094 3.588 1.801 2.820 2.928 2.200 1.359 0.931 2.431 2.085 1.724 1.865 3.387 3.551 2.452 2.379 2.029 2.044 2.876 2.423 3.122 3.947 4.224 4.306 5.154 5.013 5.036 5.326 5.457 5.010 + 4.466 3.722 3.520 3.472 3.038 4.064 3.607 1.953 0.891 2.047 2.176 2.687 1.587 2.359 2.656 2.536 3.304 2.978 3.526 3.168 2.247 2.621 2.484 1.462 2.881 3.287 2.774 3.370 4.528 5.425 5.410 5.800 5.277 5.714 5.769 4.638 + 3.098 4.614 4.743 4.143 4.056 4.562 3.954 1.067 0.994 2.116 2.652 2.928 1.699 2.214 2.542 2.132 2.559 3.558 3.731 3.079 2.719 2.339 3.587 4.048 4.448 4.101 3.459 3.982 4.349 5.550 6.475 5.785 5.573 5.581 5.274 4.620 + 5.175 4.025 3.413 2.527 2.251 3.877 4.295 3.305 3.308 1.303 1.808 1.404 2.366 2.997 3.236 2.226 2.538 3.521 2.903 2.849 3.685 4.207 3.380 4.478 4.685 4.509 3.920 4.312 5.745 4.758 5.995 6.005 6.319 5.433 4.989 4.271 + 5.713 5.182 4.303 3.553 2.693 2.836 4.044 3.674 2.884 2.840 3.434 2.684 2.074 3.032 3.539 3.184 3.223 4.298 3.539 3.229 4.364 4.686 4.660 5.331 5.443 4.947 6.504 5.675 5.894 5.556 5.924 6.486 6.791 6.604 6.868 6.011 + 3.441 2.767 2.814 3.552 4.263 3.247 4.194 3.172 2.519 2.655 2.456 3.398 4.072 4.310 3.798 4.116 4.816 4.788 4.533 3.653 4.969 5.502 6.094 5.327 5.043 5.225 5.796 6.416 6.600 6.207 5.799 6.269 6.952 7.458 7.146 6.430 + 3.274 4.026 3.759 3.699 3.939 4.040 3.392 2.766 3.013 3.886 4.271 3.657 2.560 3.451 3.473 4.031 4.652 3.350 2.705 3.466 4.969 4.696 4.924 4.929 5.416 4.754 5.101 5.425 6.196 6.057 5.089 5.095 5.248 5.662 5.248 4.335 + 1.082 2.926 3.194 3.391 2.847 1.965 2.090 1.455 2.611 2.684 3.921 2.377 2.018 3.037 2.571 3.162 3.167 2.574 3.220 3.652 3.493 3.957 3.898 5.147 4.773 4.672 5.169 5.101 5.222 4.414 4.984 4.335 4.586 4.495 4.136 2.986 + 3.352 1.621 2.211 2.984 4.184 3.916 5.604 5.352 4.860 4.525 4.130 3.321 2.726 2.063 2.410 2.279 3.214 2.069 2.930 4.742 4.811 4.205 3.738 4.710 5.064 4.805 5.259 5.075 5.111 4.048 4.854 4.389 4.230 4.533 3.381 2.171 + 4.721 3.876 5.050 4.440 5.033 5.083 5.799 5.037 3.359 4.644 5.203 5.243 2.806 1.284 1.367 0.825 1.053 2.039 2.405 2.623 3.484 1.749 2.719 3.571 2.601 1.463 2.677 2.052 1.930 2.333 2.806 2.453 2.980 2.610 2.374 1.741 + 3.994 4.449 4.047 3.762 2.686 3.108 3.524 2.464 2.087 2.273 3.801 3.096 2.588 2.737 1.578 0.923 1.684 2.301 2.831 1.321 2.702 2.100 3.000 2.676 2.678 2.350 3.559 3.236 4.069 4.474 3.612 4.025 4.177 2.680 2.624 2.968 + 6.837 6.616 5.929 5.987 5.267 5.629 6.366 6.030 5.417 5.155 3.461 4.193 4.392 3.505 3.301 2.353 2.088 1.804 2.186 1.703 2.519 1.202 1.974 2.605 3.197 3.609 4.638 4.036 5.112 4.675 3.934 4.093 3.955 2.703 2.734 2.192 + 8.274 8.527 6.739 5.827 6.013 5.834 6.935 6.526 6.419 6.065 5.450 5.980 5.418 4.734 3.886 2.826 3.070 1.951 2.319 2.040 1.837 2.032 1.832 3.334 3.162 3.246 4.112 4.498 4.797 4.421 2.942 3.772 4.417 3.203 3.371 2.864 + 8.753 8.905 7.034 6.724 6.766 6.568 6.823 7.442 6.618 5.427 6.306 6.245 5.594 4.988 3.126 2.881 3.115 3.396 2.763 2.556 2.965 3.719 3.414 3.707 4.458 4.597 4.223 3.964 4.516 3.816 4.214 4.070 4.260 4.560 2.954 2.126 + 8.176 8.112 8.011 7.092 6.770 6.495 6.616 7.869 7.284 7.123 7.058 6.639 6.030 6.554 5.855 5.011 3.837 3.781 3.864 3.689 3.872 4.507 4.900 3.779 5.472 5.288 5.118 6.158 5.975 5.569 5.473 4.939 5.215 4.861 4.288 3.867 + 8.892 9.393 7.956 8.472 8.369 8.517 8.287 7.549 6.725 7.358 7.068 6.765 5.520 6.415 6.524 6.168 4.749 5.224 5.124 4.335 5.753 5.491 5.880 5.690 7.568 6.981 7.399 6.619 6.504 6.028 5.999 6.203 5.742 5.632 6.637 5.034 + 9.206 8.182 8.636 7.341 8.779 8.918 8.751 7.188 7.729 7.285 7.220 7.598 6.344 6.710 7.095 7.579 6.584 6.492 6.686 5.904 6.671 6.889 6.665 7.624 7.543 7.025 7.803 7.725 6.704 6.835 6.607 6.346 6.350 6.491 7.399 5.892 + 8.544 8.675 7.681 7.446 8.154 6.768 7.444 8.174 6.826 7.204 7.657 7.533 6.882 6.960 6.029 6.292 6.071 6.132 5.932 6.128 6.551 5.055 6.049 6.407 6.138 6.895 7.308 6.838 7.382 7.110 7.004 7.043 7.251 7.197 6.777 6.036 + 8.916 8.331 7.004 6.505 7.556 6.673 6.937 7.979 7.303 7.149 7.425 7.696 7.112 7.349 6.159 6.031 5.811 6.048 6.983 6.151 6.105 4.109 4.918 5.127 6.479 7.720 7.415 5.982 6.638 7.268 6.555 6.581 6.853 6.455 6.226 5.032 + 8.582 8.568 7.878 6.702 7.301 8.334 7.497 7.406 7.773 7.135 7.090 7.326 7.348 7.542 6.653 5.896 6.049 6.532 6.319 6.523 6.856 5.811 5.404 5.706 6.903 7.393 6.837 6.450 6.647 6.429 6.386 6.304 6.539 5.750 5.257 3.974 + 9.553 8.461 8.045 9.193 8.868 7.669 7.533 7.038 7.732 6.438 7.580 7.102 6.874 7.586 6.903 6.676 5.708 6.734 5.297 5.075 6.756 6.434 5.607 7.155 7.505 7.683 7.102 6.365 6.443 6.387 5.995 6.901 6.907 6.752 6.631 4.979 + 7.776 8.302 6.721 7.784 7.871 6.440 7.373 8.132 7.335 4.865 4.836 3.174 3.725 5.330 5.176 4.367 4.894 5.910 6.306 6.388 6.351 6.191 5.148 6.938 7.490 6.601 7.110 6.482 6.832 6.990 6.615 6.701 6.095 6.641 6.651 4.461 + 5.801 5.564 3.789 4.041 5.214 8.144 9.295 8.541 7.774 6.260 5.458 4.617 6.132 6.559 5.156 4.160 6.116 7.158 7.685 7.135 6.568 7.032 6.311 8.373 8.927 8.012 8.560 7.825 7.555 8.723 8.392 9.381 8.575 8.595 8.875 7.823 + 8.787 8.804 7.880 6.874 5.873 8.693 9.064 7.704 7.821 8.380 6.758 7.184 6.655 6.726 6.918 6.738 6.493 7.381 7.659 5.799 7.413 7.688 7.698 7.944 8.294 8.033 8.139 8.122 9.112 9.836 8.858 8.997 9.318 8.456 8.887 8.087 + 7.767 8.895 7.989 7.234 9.615 9.942 8.190 8.050 7.573 7.950 6.460 6.608 6.993 6.578 6.923 7.324 5.853 7.151 6.492 7.540 7.601 7.939 7.809 7.878 8.622 8.740 8.076 8.400 8.944 9.060 9.026 8.000 8.813 8.682 8.552 7.834 + 8.585 7.733 7.016 6.911 9.009 9.058 8.005 8.389 6.668 6.519 6.366 5.979 6.752 7.898 6.971 7.883 7.667 7.199 6.317 7.342 8.175 8.044 8.132 8.445 9.262 9.315 9.366 9.998 9.449 8.997 8.328 8.423 9.114 9.021 9.204 8.219 + 7.773 7.711 6.894 6.200 5.646 8.540 8.848 7.768 7.496 7.108 5.638 6.825 7.948 6.556 7.378 8.068 6.269 7.556 7.729 7.348 7.527 7.726 8.230 9.098 9.335 9.262 9.431 9.811 9.197 9.367 8.558 8.755 8.366 8.781 9.133 7.390 + 4.430 5.857 6.542 5.939 6.087 8.814 8.812 7.325 7.660 6.984 6.956 6.687 6.933 7.339 6.920 7.506 6.752 6.504 6.615 6.179 5.761 6.563 9.360 8.521 8.589 8.837 9.320 8.783 8.130 9.202 9.289 8.539 8.070 8.459 8.278 8.290 + 6.970 6.198 6.557 7.231 8.387 8.266 8.313 7.706 7.431 6.864 6.775 6.795 6.951 7.467 6.984 7.955 7.625 7.155 7.343 7.085 6.854 8.122 8.887 8.369 8.848 10.265 10.498 9.235 8.556 8.598 8.561 9.204 8.589 8.215 8.565 7.768 + 5.714 6.172 5.908 6.508 8.446 9.890 9.094 7.696 8.136 7.148 7.599 7.380 7.605 6.443 5.875 6.716 7.552 6.502 6.717 7.837 7.762 8.382 9.175 8.476 8.979 10.268 10.533 9.484 9.693 7.888 8.372 8.343 8.822 9.050 8.310 8.553 + 4.778 3.878 4.908 5.158 6.645 7.551 7.679 8.719 7.365 5.990 6.209 7.093 7.191 6.016 6.196 6.652 6.937 6.161 6.273 5.971 7.677 8.262 9.026 8.138 9.271 10.017 10.283 8.719 9.351 7.947 7.519 7.704 8.209 7.833 8.043 7.640 + 5.277 5.825 6.623 6.225 5.653 5.596 7.434 7.128 5.832 5.617 5.329 6.666 6.729 5.795 6.788 6.671 6.891 6.717 5.904 4.440 6.341 8.046 7.857 9.024 8.611 8.526 9.371 8.065 8.293 7.795 7.246 6.626 7.702 8.519 8.665 8.226 + 5.963 4.360 4.969 5.028 5.045 6.835 6.356 6.091 5.415 5.984 6.007 6.140 6.323 6.444 6.135 6.667 6.499 5.801 6.196 6.920 7.150 8.867 8.417 8.845 8.682 8.642 9.061 8.378 7.667 6.907 6.560 7.153 7.304 7.642 8.359 7.675 + 3.843 3.099 3.760 4.184 5.562 6.470 5.876 5.907 4.368 5.625 6.328 5.913 5.980 6.554 6.501 6.867 5.092 6.637 6.492 7.202 7.075 8.211 9.533 9.855 9.398 10.134 9.764 9.428 8.715 7.829 6.982 7.469 7.829 8.179 8.575 8.395 + 1.951 2.047 2.277 3.668 4.201 5.016 5.906 4.859 3.824 3.319 2.752 4.444 5.038 6.240 6.398 6.856 6.852 6.573 8.042 7.502 7.531 8.116 7.932 9.475 7.885 8.022 9.350 9.499 8.425 7.095 6.593 7.950 8.520 8.432 7.970 8.375 + 3.165 3.183 4.344 5.162 4.329 5.928 5.818 5.718 4.668 3.226 3.115 4.571 5.378 5.967 6.409 6.297 7.124 6.105 7.553 7.330 6.637 6.985 8.282 7.605 7.468 7.687 8.666 8.321 8.039 6.775 6.845 7.663 7.935 7.675 7.108 6.630 + 3.583 3.973 3.988 4.586 5.896 6.224 4.363 3.773 4.041 2.084 1.931 4.869 5.021 6.385 6.907 6.359 6.820 6.103 4.911 6.359 6.469 5.620 6.862 6.660 7.633 7.794 7.344 6.976 7.144 6.250 6.931 6.841 6.924 6.589 6.060 5.748 + 4.594 4.539 4.461 4.197 4.978 5.145 6.665 6.701 5.806 6.111 6.036 5.728 5.983 4.732 4.647 4.183 5.534 5.371 4.745 4.960 5.530 4.944 5.466 5.270 5.679 5.920 5.914 6.086 4.813 5.147 4.379 4.884 5.319 4.048 4.305 4.365 + 4.533 4.881 4.065 5.304 4.682 5.621 6.013 5.872 5.721 5.624 5.535 5.335 5.446 3.954 4.349 4.020 2.933 2.135 3.239 2.496 2.257 2.853 4.073 3.983 5.263 4.572 4.281 5.130 4.955 4.592 4.214 4.345 4.711 4.178 3.951 3.729 + 5.166 6.016 5.411 7.605 7.985 7.871 7.961 6.437 5.601 5.488 5.525 4.233 3.364 5.202 4.418 4.451 3.813 3.214 4.601 3.890 3.505 2.755 3.165 3.361 3.209 3.417 3.204 3.952 3.798 3.704 2.952 3.743 3.428 3.607 2.736 1.913 + 7.754 7.526 7.049 8.110 10.306 9.648 9.754 9.075 8.378 7.452 7.695 7.883 7.411 7.598 7.314 7.396 8.280 7.962 6.606 5.495 5.252 4.660 4.982 4.930 5.309 6.729 6.153 4.953 6.090 5.520 3.621 3.658 3.652 3.400 3.456 1.668 + 7.723 8.295 7.421 8.275 10.894 10.629 10.716 9.669 9.171 7.883 8.393 8.444 8.391 8.192 7.979 8.616 9.839 9.460 7.250 5.939 5.630 5.323 5.399 5.839 6.756 7.858 6.959 5.812 6.842 6.572 3.950 3.783 3.664 2.998 2.698 1.512 + 8.105 8.661 7.576 8.379 10.951 10.591 10.750 9.873 9.497 7.754 8.353 8.679 8.581 8.270 8.040 9.208 10.132 9.536 7.546 5.572 5.339 5.771 5.389 6.415 7.481 8.617 7.604 6.709 7.445 6.908 4.836 5.415 5.187 3.256 3.655 3.039 + 8.278 8.849 7.642 8.445 10.997 10.508 10.622 9.732 9.323 7.588 7.981 8.573 8.486 8.034 7.785 9.404 9.887 8.950 7.169 5.793 5.531 5.037 5.322 6.509 7.575 8.636 7.382 6.814 7.344 5.944 4.156 4.537 4.214 3.009 3.020 2.678 + 8.406 8.948 7.546 8.450 11.117 10.787 10.533 9.414 8.964 6.960 7.459 8.390 8.323 7.616 7.195 9.370 9.721 8.335 6.449 5.327 5.333 4.932 5.303 6.250 7.265 8.009 6.723 6.705 7.166 4.465 3.165 4.026 4.162 2.856 2.933 2.643 + 8.761 8.840 7.819 8.597 10.999 10.459 9.577 8.852 8.262 6.590 6.729 8.253 7.937 7.116 6.612 9.146 9.344 7.459 5.736 4.892 5.242 5.282 5.162 6.011 6.568 6.984 6.196 6.197 6.624 4.215 3.501 4.245 4.641 3.332 3.685 2.628 + 8.634 8.635 7.545 8.914 10.653 9.556 7.635 8.154 7.212 5.640 6.458 7.668 7.052 7.110 6.697 8.480 8.750 6.494 6.250 5.831 4.750 4.123 4.784 5.891 6.610 6.821 5.824 5.263 6.145 3.965 3.112 4.446 4.783 3.280 3.417 2.565 + 8.426 8.417 7.744 8.402 9.380 7.866 7.081 5.077 5.832 6.242 6.429 6.158 4.963 6.032 4.859 5.892 6.270 5.649 5.359 4.030 3.279 4.272 4.436 5.022 6.425 6.018 4.231 4.143 4.203 3.553 3.076 3.123 3.142 3.018 3.811 2.916 + 8.207 7.599 7.120 7.401 7.240 5.529 6.868 5.859 3.596 3.864 4.373 4.909 4.200 4.189 4.619 4.209 4.861 5.171 4.178 4.436 3.605 3.309 3.104 3.815 5.154 5.654 3.809 4.424 4.135 3.591 3.114 3.322 3.923 2.901 3.760 3.177 + 7.434 6.347 5.129 5.707 7.095 7.599 7.863 6.401 3.817 4.329 4.948 4.256 3.411 4.318 4.238 4.222 4.748 4.471 4.779 3.731 2.310 3.555 3.450 1.869 2.797 3.573 3.630 3.663 3.851 3.412 3.254 3.917 4.135 2.684 3.904 3.921 + 7.080 6.142 4.729 5.635 6.715 6.500 7.604 5.449 4.103 2.904 3.694 3.927 2.384 2.104 2.724 3.909 4.691 4.352 3.607 3.960 3.186 3.278 2.964 2.323 3.951 3.495 3.364 3.820 3.631 3.046 2.781 3.141 3.706 2.555 3.517 3.425 + 6.390 5.673 5.342 4.725 5.387 7.279 7.835 5.663 3.624 2.304 2.909 4.230 3.070 3.045 3.357 4.256 4.391 3.223 3.191 3.528 3.486 3.935 3.600 1.955 3.465 3.066 3.472 3.311 2.419 3.487 3.077 3.350 4.046 3.028 3.343 2.897 + 5.776 4.996 4.639 4.402 4.968 4.553 6.280 5.214 4.116 2.584 3.464 4.367 4.164 3.879 4.650 4.695 4.398 4.565 3.391 3.620 3.056 2.849 2.808 3.396 3.333 2.958 3.679 3.603 3.481 3.509 3.030 3.523 3.635 2.098 2.931 2.637 + 6.109 5.495 4.947 4.234 5.597 6.428 6.720 5.686 4.891 3.925 3.986 3.289 4.153 4.402 4.049 3.550 4.251 4.183 3.240 3.298 2.713 2.613 2.472 2.385 3.190 3.680 3.349 4.324 3.700 4.064 3.302 3.390 3.354 2.401 2.636 2.824 + 7.013 6.750 5.552 5.336 6.211 4.859 5.796 5.867 4.492 4.196 4.666 4.556 4.542 4.934 4.958 4.495 4.717 4.803 3.939 2.478 3.386 3.187 2.717 2.732 3.433 4.267 3.506 3.303 3.434 3.593 3.478 3.214 2.860 2.371 3.281 3.040 + 8.301 7.704 5.527 4.704 6.309 6.337 7.042 6.686 5.839 5.513 5.264 5.831 5.585 6.379 5.270 5.184 5.591 5.194 3.705 2.213 3.709 4.049 4.205 3.295 4.060 3.257 3.574 3.236 3.559 3.724 3.805 3.881 4.093 3.201 3.291 3.529 + 8.873 8.644 7.082 5.503 5.814 6.081 7.113 7.611 7.208 6.723 6.844 7.053 6.998 6.893 5.984 5.864 6.756 6.577 4.551 3.122 3.644 4.573 4.400 3.271 4.799 4.206 3.222 3.146 3.058 3.527 3.414 3.373 3.537 2.989 3.600 2.388 + 8.658 8.486 7.347 6.427 5.329 6.093 7.025 8.374 8.083 7.783 7.450 7.336 7.639 7.873 7.141 7.101 7.764 7.271 4.507 2.781 4.204 5.466 5.283 4.326 5.206 4.704 3.025 2.269 2.677 3.746 2.684 3.153 3.491 2.649 2.776 1.670 + 8.426 8.164 7.685 7.146 5.348 6.971 7.714 8.137 7.907 7.871 7.757 7.791 7.837 8.036 7.949 7.827 8.720 8.161 6.065 5.016 4.890 4.840 4.995 4.273 5.599 5.411 2.342 2.728 3.252 3.782 2.372 3.305 3.240 2.035 2.234 1.250 + 8.342 7.660 7.384 6.518 6.127 7.177 7.957 8.346 8.181 8.141 7.597 7.490 7.885 8.014 7.483 7.055 7.780 7.492 5.899 3.884 3.429 4.759 5.443 4.087 5.471 5.453 2.319 2.683 3.583 4.180 3.422 2.893 3.374 2.346 2.269 1.489 + 8.015 6.999 6.656 5.442 5.943 6.228 8.172 8.311 7.230 7.148 6.160 7.191 6.687 6.682 6.495 6.436 7.259 6.536 5.528 5.006 4.750 4.660 4.971 3.903 5.815 5.082 2.438 2.030 3.805 4.111 2.929 3.126 3.630 2.783 2.126 1.695 + 7.556 6.410 5.273 5.588 5.637 6.600 7.845 7.495 6.740 5.695 4.583 5.998 5.343 5.194 5.495 5.077 5.432 5.753 4.918 5.184 4.772 4.816 4.569 4.592 5.624 5.199 3.778 2.494 4.073 4.296 2.759 2.970 2.270 1.542 2.045 1.857 + 7.724 7.817 6.500 3.745 5.311 6.149 6.707 6.783 6.427 4.518 2.688 4.335 4.170 4.542 4.450 3.796 4.643 4.049 4.374 2.412 3.786 4.828 4.282 4.076 6.031 5.592 2.720 2.747 3.985 4.138 2.921 2.599 1.938 1.730 1.719 1.603 + 4.005 5.794 5.350 3.214 4.264 4.984 4.538 5.095 5.304 3.561 3.628 3.496 2.343 3.634 3.373 2.921 3.602 2.469 2.032 1.375 2.526 2.785 3.051 2.642 3.476 2.956 2.684 1.904 1.581 2.089 2.287 1.874 1.883 1.412 0.530 0.774 + 6.221 6.153 5.116 1.938 4.248 5.114 4.440 5.203 3.380 3.096 4.619 3.295 3.305 4.629 4.217 2.945 3.123 2.866 2.636 2.872 2.232 3.074 2.944 3.565 3.841 3.138 2.523 2.240 2.092 1.811 1.960 1.966 1.991 1.972 1.096 1.159 + 6.868 7.165 5.874 3.738 3.160 4.028 4.579 4.783 3.485 1.585 3.399 3.161 1.421 2.519 2.849 1.853 0.912 3.965 3.603 2.342 1.485 1.788 1.937 2.622 1.633 2.218 1.303 2.056 1.496 1.311 1.200 1.321 1.258 1.686 1.905 0.295 + 5.409 5.603 4.747 3.043 3.160 3.295 3.810 3.485 3.503 1.889 2.685 2.912 1.978 3.558 3.597 3.590 2.893 4.087 3.532 2.911 2.642 0.627 1.494 2.380 1.673 1.336 2.034 2.617 1.428 1.817 1.039 1.567 1.445 1.270 0.763 0.055 + 1.484 3.819 4.862 3.867 3.693 4.278 3.561 4.823 3.878 1.699 3.354 3.408 2.289 4.040 4.041 2.416 2.755 3.158 2.862 2.610 2.198 1.687 1.954 2.323 1.619 1.677 1.623 1.957 2.533 2.158 0.978 1.205 1.149 1.023 0.649 0.797 + 3.804 3.960 4.208 3.909 4.186 3.978 3.872 4.742 2.643 2.031 2.911 0.988 1.758 2.658 2.477 1.972 2.492 2.414 2.545 2.598 2.611 1.973 1.536 1.903 2.315 1.826 1.979 2.220 1.819 2.053 1.260 1.430 0.056 0.646 0.875 0.713 + 5.138 6.068 5.933 4.059 3.760 5.373 5.175 3.513 2.744 1.578 2.213 2.209 2.835 3.236 2.800 3.012 2.944 3.001 0.586 1.264 2.489 2.502 2.486 2.613 1.709 1.455 1.184 1.768 1.658 1.235 1.171 0.668 0.820 1.521 1.113 0.292 + 4.642 5.104 5.126 2.258 2.862 5.506 5.395 3.797 3.247 3.365 3.469 2.645 2.780 2.666 4.100 3.749 3.950 3.670 2.467 2.437 1.998 2.534 1.158 2.243 2.319 1.371 0.575 0.842 0.871 1.462 0.829 0.849 0.676 0.831 0.525 0.297 + 8.042 7.581 7.091 6.738 6.797 6.334 4.820 3.589 4.502 4.611 3.114 3.459 3.599 4.215 4.598 4.678 3.722 3.257 3.495 3.694 2.240 3.242 3.589 4.902 5.449 5.246 5.184 5.372 5.631 5.131 5.783 4.820 3.214 4.189 5.077 5.352 + 8.873 9.279 8.105 7.637 8.142 7.581 6.349 5.900 5.481 6.054 4.530 5.536 5.488 5.627 8.111 9.092 8.225 8.356 8.177 6.586 5.396 6.472 7.974 7.734 7.753 7.918 7.761 8.023 8.885 8.868 8.295 7.632 6.288 6.166 7.691 7.751 + 7.101 4.800 4.440 3.480 2.775 3.109 4.215 5.151 4.482 4.055 2.992 3.615 3.825 4.026 6.792 7.541 7.112 6.553 5.857 3.786 3.853 5.504 6.337 5.180 6.215 5.414 6.381 6.525 6.945 7.070 5.625 4.663 4.505 4.982 5.118 5.134 + 4.720 3.945 3.325 1.462 1.503 2.326 3.087 2.448 2.086 2.016 0.864 2.437 2.280 2.645 2.551 2.434 2.563 2.885 1.795 1.841 2.543 1.846 2.433 2.589 2.434 2.419 2.217 2.407 2.853 3.047 2.913 1.970 2.055 1.602 2.089 1.400 + 3.539 3.776 3.620 4.178 3.924 2.916 3.247 4.287 2.326 1.054 1.835 3.487 3.881 3.752 3.884 3.159 3.094 2.885 2.810 2.165 2.296 2.759 2.979 3.303 3.758 2.939 2.889 2.769 4.006 3.926 3.954 4.092 4.493 4.212 4.501 4.131 + 4.022 3.801 3.107 3.979 3.893 3.658 3.082 2.731 1.786 1.328 3.407 3.524 2.518 3.456 3.743 3.504 3.473 3.995 4.425 3.623 4.209 4.060 3.655 3.620 4.085 3.987 3.546 3.314 4.147 3.910 3.818 3.806 4.489 4.114 4.437 3.966 + 5.141 4.497 1.682 3.133 3.651 3.995 3.970 3.264 3.497 3.021 3.919 2.815 2.572 3.731 4.552 4.900 5.049 4.203 4.198 4.612 4.701 5.513 6.457 6.872 7.508 7.536 7.395 7.181 6.598 6.141 5.660 5.789 6.346 6.809 7.061 6.675 + 5.043 4.211 4.372 4.902 4.243 4.350 5.375 5.145 4.000 4.320 5.015 4.199 3.874 4.803 6.103 5.423 4.506 4.498 4.101 3.557 4.822 5.877 7.459 7.091 8.335 8.368 8.191 7.897 7.456 6.770 6.757 6.428 6.780 6.714 6.672 5.684 + 4.304 4.400 3.845 1.695 3.215 3.016 3.585 3.762 4.032 3.243 2.516 3.178 4.641 5.440 5.608 4.981 6.631 5.756 4.570 5.204 6.787 6.155 7.276 7.259 8.584 8.948 8.638 8.809 8.484 7.909 8.556 7.544 7.858 7.124 7.660 5.820 + 5.434 5.745 4.968 3.768 4.345 3.783 3.758 4.036 3.437 2.640 3.097 3.683 4.365 4.138 4.220 5.549 5.969 4.687 4.151 4.507 5.285 6.202 6.949 7.281 6.703 6.503 6.248 6.472 6.709 6.498 6.879 6.343 6.157 5.763 6.093 5.511 + 6.224 5.838 6.268 5.872 6.792 6.449 6.914 5.562 4.511 4.190 3.987 2.377 4.369 5.236 4.908 6.355 7.132 5.778 5.144 4.297 4.911 5.340 6.462 6.470 6.181 5.492 5.351 5.217 4.935 4.243 5.991 6.369 6.613 5.377 6.430 6.050 + 7.392 6.887 5.484 4.498 5.645 6.649 7.311 5.624 4.432 5.556 4.977 3.217 3.845 3.150 3.540 3.603 4.424 4.730 3.280 4.084 4.357 4.981 4.952 4.301 5.077 5.728 5.608 5.899 6.175 4.772 5.210 6.308 6.085 5.179 6.073 6.489 + 8.077 6.249 5.872 6.855 7.117 6.721 6.178 6.149 4.180 3.957 4.335 4.259 3.043 2.656 3.421 3.917 4.354 4.818 3.202 3.745 4.550 4.606 4.266 4.738 3.873 4.370 4.517 4.421 4.368 4.511 4.516 4.856 4.304 4.960 4.905 5.254 + 3.650 5.253 5.090 4.844 5.038 4.837 4.113 3.860 3.899 3.080 2.838 3.031 4.777 3.667 3.287 3.596 5.014 4.671 5.095 3.767 3.972 4.528 3.952 4.507 3.961 5.276 4.398 4.488 4.300 3.783 3.412 3.948 3.566 2.745 3.428 4.194 + 3.858 4.548 5.304 5.238 4.765 4.196 3.874 3.771 4.157 3.938 3.337 2.799 3.874 3.797 4.479 3.273 3.469 4.689 4.523 3.332 3.018 4.558 4.963 4.851 4.004 5.468 4.124 4.314 4.197 4.722 4.305 5.119 3.962 3.740 4.519 4.335 + 4.573 4.127 5.466 5.892 5.086 4.067 3.992 4.393 4.833 5.258 4.341 2.690 4.251 4.654 3.901 3.272 3.618 3.486 2.765 2.693 3.580 3.642 3.710 4.133 3.987 4.597 3.502 4.296 3.916 3.255 3.113 2.952 3.353 3.508 3.890 3.202 + 4.774 2.836 4.121 5.287 4.706 4.103 4.827 4.589 3.940 4.102 3.484 4.552 4.149 4.410 3.923 3.231 1.716 3.588 3.678 2.106 3.056 3.934 4.080 4.373 4.030 4.588 4.543 4.438 3.304 3.657 3.921 3.263 3.900 4.238 3.791 2.918 + 5.304 4.147 3.412 3.335 3.983 3.431 3.097 3.892 2.909 2.614 1.871 3.030 2.840 3.626 3.494 2.844 3.287 3.112 3.253 2.721 2.229 2.778 3.335 3.429 2.790 3.781 3.025 2.507 3.341 3.536 3.039 2.727 2.473 2.440 2.636 2.148 + 2.982 2.678 4.334 5.098 3.886 3.836 3.831 4.134 3.682 3.143 2.712 2.224 3.061 3.976 3.898 1.870 1.689 0.914 3.023 2.379 2.201 2.702 2.062 1.717 3.149 3.334 2.564 3.031 3.382 2.189 2.950 3.030 2.103 2.409 1.884 1.587 + 3.124 1.220 1.407 2.881 4.005 4.193 2.968 1.771 2.617 2.937 2.191 2.275 2.713 3.187 3.287 1.527 3.196 3.080 3.101 3.223 3.585 2.781 2.507 3.001 4.539 4.781 4.331 4.805 4.753 4.313 3.841 3.385 3.631 2.954 2.885 2.235 + 4.202 3.430 2.389 2.855 2.734 3.143 3.034 3.370 2.869 3.789 2.649 3.431 3.132 4.619 4.038 3.515 3.438 3.408 3.308 2.682 2.813 3.500 3.852 4.222 4.804 4.466 4.820 5.165 4.117 4.499 3.894 3.434 4.203 3.745 4.334 3.578 + 4.366 4.472 4.050 2.677 3.495 3.918 3.650 4.291 4.518 2.964 4.108 5.409 4.862 4.868 4.184 3.171 3.423 4.118 3.235 2.262 1.177 2.425 4.062 3.810 3.175 4.562 4.725 4.285 4.664 4.386 3.966 4.102 4.921 4.581 4.499 3.798 + 2.340 4.132 4.052 2.937 2.912 2.535 3.926 3.280 1.775 1.227 1.821 2.949 2.675 4.204 4.554 5.310 4.832 4.982 4.719 4.448 5.204 4.949 4.538 6.490 5.871 5.900 6.083 6.961 6.596 7.482 6.775 7.406 7.233 6.523 7.043 6.608 + 3.889 3.022 2.612 2.852 2.403 3.129 4.430 3.916 2.951 1.973 2.711 2.792 2.244 2.822 3.368 3.903 4.178 3.767 3.482 3.331 4.525 3.937 4.335 5.064 5.116 5.613 5.835 5.661 5.502 6.087 5.715 5.955 6.390 5.515 5.935 5.389 + 4.756 6.219 6.882 7.575 7.997 8.342 8.202 7.519 6.496 4.961 5.527 5.519 4.541 3.839 3.494 2.771 3.109 3.424 3.189 4.200 3.530 3.224 4.964 4.452 4.298 4.631 3.886 4.819 5.925 5.937 5.356 5.168 5.879 5.858 4.968 3.775 + 5.458 4.925 5.155 6.226 5.838 7.145 6.689 5.213 4.325 4.186 3.645 1.773 3.251 4.490 3.600 3.057 4.053 4.140 3.619 4.250 3.727 5.262 5.433 5.627 5.656 4.940 5.270 5.541 4.068 4.340 4.760 5.797 5.678 5.366 5.221 4.159 + 5.552 6.375 5.092 5.818 8.297 8.470 7.679 8.650 7.025 5.762 6.500 5.871 5.396 5.668 4.976 5.740 5.197 5.623 6.189 5.531 6.014 7.250 8.789 8.552 8.467 6.892 7.184 7.296 6.696 7.647 7.841 7.545 7.003 6.860 6.732 6.734 + 5.919 5.595 5.440 6.410 8.876 8.045 6.858 9.203 8.787 5.512 6.428 6.032 5.099 4.573 5.508 5.495 5.435 5.334 5.762 5.073 5.320 6.013 8.642 8.833 8.797 8.108 8.500 8.378 7.513 8.038 7.729 6.647 7.345 7.427 6.423 6.651 + 4.953 5.368 3.968 6.839 9.017 8.110 6.281 9.030 8.431 4.586 3.599 3.664 4.155 4.318 3.451 3.609 4.128 3.068 4.640 4.797 5.221 6.759 9.005 8.453 7.937 8.401 8.824 9.209 8.039 7.156 5.645 7.223 6.777 5.244 4.813 3.917 + 4.887 4.468 3.980 6.010 8.100 7.322 6.791 9.022 7.963 5.201 6.043 4.975 4.594 3.437 3.353 3.022 3.140 2.864 4.843 4.953 5.837 7.135 8.892 7.917 7.713 7.554 8.165 8.452 7.703 6.980 6.186 7.668 6.642 4.662 3.963 2.935 + 4.214 3.796 3.173 5.663 6.286 4.008 3.993 5.601 5.492 2.936 3.207 2.456 2.623 3.110 2.774 2.468 3.581 3.855 3.743 3.886 4.644 5.942 5.990 5.257 5.292 5.721 5.599 5.192 4.967 4.778 5.295 5.568 5.617 3.614 3.277 2.587 + 3.109 3.337 2.260 4.742 5.262 5.805 4.906 4.005 4.097 4.061 3.181 2.107 1.967 1.782 1.615 1.372 2.030 2.675 2.606 2.744 2.736 3.927 4.869 4.598 4.503 4.344 3.945 4.101 4.055 2.978 4.377 4.729 5.177 3.522 3.364 2.628 + 5.882 5.336 2.659 5.662 7.634 6.637 4.956 4.705 4.618 3.098 2.366 1.956 2.399 2.364 2.180 1.568 1.031 2.126 2.234 2.097 2.385 3.667 4.594 4.160 3.682 3.879 4.245 4.113 4.517 3.927 4.009 4.308 4.140 4.179 4.168 3.860 + 5.810 6.276 4.930 5.804 7.417 6.459 3.954 4.412 4.015 3.348 4.049 3.411 2.413 2.858 2.424 1.302 1.461 1.744 2.251 2.802 2.490 3.733 3.889 3.755 3.648 3.442 3.735 4.037 4.754 3.681 3.521 3.256 3.496 2.601 1.890 1.924 + 3.240 4.528 3.760 5.408 5.337 4.806 3.061 3.459 2.795 2.662 4.661 3.693 1.866 1.451 1.910 1.289 2.235 2.419 3.102 2.844 2.187 2.413 3.960 4.342 3.805 3.372 3.931 3.871 3.424 2.176 3.103 3.847 3.507 3.638 3.161 2.213 + 4.494 3.290 3.776 5.394 6.657 5.612 5.109 5.866 4.527 3.370 4.729 4.616 4.022 3.223 3.389 1.651 2.653 4.049 2.797 2.079 3.829 3.850 3.327 4.514 5.144 4.512 4.796 4.758 3.792 3.232 3.880 4.459 4.225 3.657 4.259 3.343 + 2.974 3.070 2.061 2.949 5.471 6.089 5.128 4.071 3.478 2.687 2.281 2.777 3.192 3.041 3.024 1.108 1.837 2.710 2.282 3.472 4.635 3.751 4.159 3.892 4.067 4.064 6.697 6.320 4.217 3.885 4.941 4.309 4.292 4.274 4.769 5.026 + 3.459 3.729 3.371 4.156 7.479 9.306 8.376 5.348 4.841 3.298 3.273 3.370 2.542 3.479 3.556 3.495 3.563 4.898 6.390 7.522 6.667 5.559 5.361 5.800 6.304 6.586 7.106 6.426 5.184 4.643 4.637 3.909 4.292 3.869 4.664 4.568 + 1.904 1.862 2.520 3.852 9.443 10.731 8.886 6.234 6.291 5.238 4.730 5.287 3.886 6.173 5.238 5.431 5.112 7.673 8.084 9.822 7.758 7.591 5.599 7.491 7.735 8.417 9.270 9.131 6.591 6.589 6.118 5.348 6.294 5.679 4.993 4.554 + 3.119 4.338 4.668 4.633 9.720 10.938 8.665 6.952 8.267 7.252 5.905 6.220 4.631 7.208 6.183 6.153 5.751 8.590 9.132 10.633 7.807 7.331 5.322 7.352 8.152 9.007 9.909 10.420 7.425 6.885 7.006 7.719 8.323 6.856 4.896 4.984 + 3.283 3.564 4.926 4.190 9.609 10.656 8.272 8.417 10.388 8.793 5.370 6.829 4.749 7.036 6.088 6.884 6.281 9.152 9.129 10.591 7.884 7.664 4.658 7.438 8.105 9.124 10.138 10.679 7.736 7.065 7.475 8.403 8.973 6.777 4.880 4.543 + 4.006 4.581 4.053 3.855 8.955 9.514 5.637 8.776 11.061 9.425 6.175 7.102 4.880 6.699 5.732 7.006 6.523 9.861 9.016 9.577 7.561 7.405 4.513 7.745 8.042 9.124 10.280 10.878 7.263 6.770 7.386 9.062 9.557 6.525 4.264 5.285 + 5.792 5.572 4.699 5.390 9.486 9.902 6.979 9.843 11.643 9.705 6.613 7.140 4.702 6.522 5.360 6.703 7.019 10.396 9.212 8.932 6.956 6.561 5.346 7.507 8.437 8.830 9.702 10.256 7.367 6.816 6.248 9.431 9.630 5.448 4.658 5.104 + 3.845 3.312 4.849 5.565 9.453 9.413 6.939 10.796 11.983 9.593 7.336 7.584 6.562 7.233 5.592 6.846 7.203 9.596 8.977 8.956 5.914 5.192 5.599 6.437 7.415 8.382 9.725 9.257 7.116 5.910 6.507 8.229 8.484 5.754 4.694 4.793 + 6.572 6.976 5.572 6.968 9.881 9.565 7.575 11.298 11.480 8.691 6.434 6.073 6.455 7.807 6.071 5.567 5.627 6.922 7.681 6.853 6.285 4.626 4.955 4.719 4.863 6.861 8.568 8.195 7.360 7.366 7.060 8.054 8.527 6.904 6.802 5.927 + 5.375 6.100 5.954 7.379 8.445 9.039 8.641 10.688 9.424 6.685 6.028 5.519 6.536 7.198 5.423 5.128 7.653 8.186 8.026 6.685 6.186 5.651 4.011 4.705 5.129 5.928 8.081 7.878 5.843 5.495 5.916 7.860 8.182 5.746 4.652 4.209 + 6.701 5.596 5.291 5.966 8.171 7.976 7.660 8.777 8.242 7.101 6.462 6.522 5.507 6.075 6.375 6.619 7.138 6.995 6.527 5.958 4.825 4.727 4.392 5.067 4.145 4.490 6.186 6.405 4.052 4.170 4.080 4.641 4.777 3.539 3.325 2.927 + 5.876 6.145 4.622 5.739 6.481 5.683 6.084 7.904 7.049 5.979 7.286 6.362 4.456 4.532 4.469 5.612 5.955 6.851 5.497 6.153 4.213 4.060 3.540 3.822 3.610 4.330 5.642 5.381 3.134 3.004 4.014 4.770 4.280 2.421 3.130 2.386 + 6.427 6.713 5.217 6.473 7.859 7.233 7.189 8.013 8.198 6.554 5.489 4.794 4.663 5.204 4.568 5.003 4.822 5.313 4.351 4.710 3.931 3.586 4.180 4.714 4.630 5.007 5.263 4.518 3.268 2.376 3.999 5.004 4.830 2.628 2.425 2.661 + 4.590 5.369 5.117 7.054 8.111 6.361 5.598 5.465 6.811 5.052 4.281 4.961 5.794 5.506 4.698 5.640 5.934 3.292 4.523 5.201 4.238 4.163 4.441 4.923 3.859 4.320 3.924 4.781 3.539 2.877 3.301 4.506 4.204 2.779 2.466 2.896 + 1.960 3.059 4.191 5.998 7.555 6.155 5.300 7.273 7.340 4.621 4.492 4.492 6.002 4.704 4.571 6.168 6.303 4.864 4.975 4.817 4.279 3.746 5.249 4.777 4.003 4.044 3.566 3.772 2.916 3.213 2.839 3.623 3.362 3.415 2.892 2.570 + 4.139 2.835 4.049 5.164 6.341 5.545 6.683 7.480 5.940 4.815 5.610 5.166 5.507 4.556 5.014 5.627 5.651 4.833 4.698 3.996 3.889 3.266 4.387 5.508 4.319 4.038 4.925 4.545 4.029 3.516 4.015 4.457 3.488 2.851 2.914 3.204 + 2.527 3.007 3.573 6.212 7.157 5.694 6.942 8.094 5.914 4.915 5.323 5.070 6.021 5.387 6.470 5.614 4.688 6.365 5.306 4.299 3.262 3.911 5.467 5.499 5.071 4.722 4.802 4.699 3.910 3.906 3.866 4.129 3.792 3.144 2.984 2.310 + 4.247 3.927 4.296 6.404 7.648 5.556 6.722 8.143 6.114 5.164 5.181 4.964 5.449 4.751 5.026 5.146 5.432 6.062 5.017 5.048 4.365 3.804 4.276 5.663 4.514 4.484 4.947 5.038 4.311 3.384 3.505 4.472 4.693 4.087 3.856 3.475 + 6.525 5.645 5.451 7.213 7.804 5.512 6.452 7.247 5.261 5.511 5.420 6.175 6.691 3.505 3.983 6.368 5.722 5.300 5.027 5.019 4.919 4.386 5.074 5.440 4.221 4.401 5.391 5.320 3.769 4.094 4.593 5.094 4.889 4.376 3.818 2.882 + 6.359 5.319 5.146 7.022 8.367 6.713 5.877 6.393 4.821 5.527 3.637 7.115 7.521 5.134 4.115 6.732 6.213 5.518 5.635 4.689 4.993 4.321 5.465 5.661 4.333 4.745 6.217 5.551 4.311 4.283 3.106 5.181 4.676 3.820 3.331 3.389 + 6.423 5.081 5.696 7.709 8.655 6.492 7.428 8.525 6.549 6.028 4.992 7.682 7.658 4.901 4.936 6.819 5.732 5.780 4.843 4.453 3.748 3.913 5.081 4.610 4.305 4.111 4.468 4.444 4.536 4.211 4.479 4.488 5.021 5.091 5.437 3.954 + 5.654 6.024 5.548 8.191 8.907 6.673 8.594 8.784 6.352 6.536 5.081 7.731 7.119 3.708 4.857 6.424 4.663 5.063 4.706 3.899 2.474 3.523 3.783 4.488 4.413 3.583 4.085 4.774 4.543 3.471 4.398 4.286 3.855 3.460 3.806 2.916 + 7.330 5.667 4.067 8.141 8.929 6.983 8.951 9.194 6.443 7.007 6.898 7.424 7.762 6.118 6.460 6.799 6.460 6.948 6.660 6.803 6.968 6.905 7.163 7.530 7.391 7.591 7.493 7.307 7.158 6.972 7.546 7.970 8.231 8.252 7.972 7.281 + 4.050 2.384 3.071 6.810 7.931 7.005 8.923 8.182 7.082 7.527 7.720 8.341 6.818 5.647 5.768 5.921 4.950 5.652 5.497 5.191 5.716 5.489 6.043 6.029 6.214 6.392 6.076 6.029 6.200 5.692 6.272 6.780 6.917 6.790 6.455 5.904 + 5.484 5.169 5.306 7.684 8.065 6.868 7.131 5.641 7.403 8.050 7.541 8.206 7.291 6.340 6.253 5.997 4.830 5.481 4.791 3.236 3.506 4.101 3.193 2.352 2.876 3.320 4.170 5.534 5.924 4.889 5.122 4.382 4.278 3.172 3.162 2.017 + 5.730 5.580 5.056 6.918 7.819 7.081 6.522 8.009 7.694 7.840 7.672 7.215 6.979 5.493 6.018 6.920 4.877 4.346 4.310 4.883 2.840 3.028 3.679 3.209 3.015 3.228 3.779 4.747 5.061 4.088 4.109 3.933 4.023 3.821 2.924 1.485 + 5.884 4.883 4.433 6.791 7.298 7.041 8.031 8.544 8.011 7.927 7.535 7.877 7.315 7.026 7.417 8.762 6.463 5.429 4.966 4.327 4.106 3.399 3.664 3.019 2.942 2.872 3.586 3.864 3.837 3.403 4.623 4.221 3.679 3.137 2.362 1.622 + 5.508 6.131 5.263 6.944 6.813 7.205 8.393 8.405 7.889 8.095 8.522 8.180 8.464 7.110 7.254 10.309 9.537 7.058 5.571 5.005 4.605 3.947 3.471 3.636 2.887 3.303 5.175 5.369 5.069 3.359 5.659 4.906 4.591 2.906 2.803 1.281 + 3.684 5.311 5.483 6.320 6.339 5.589 6.806 5.939 8.384 8.655 7.698 8.494 6.236 7.916 7.805 8.972 8.961 7.900 7.093 6.164 5.702 5.169 4.494 4.282 4.554 4.783 6.256 6.505 5.683 5.668 5.353 5.177 5.319 4.085 2.930 1.596 + 4.329 3.531 2.346 5.293 4.722 6.083 8.182 7.008 8.966 9.664 8.937 10.011 8.178 6.707 7.533 7.360 7.687 8.893 9.303 7.672 6.702 6.173 6.114 6.210 6.106 6.653 8.226 8.344 6.820 7.037 6.733 6.445 5.733 5.251 3.708 2.213 + 4.185 3.410 4.050 5.633 5.268 6.737 8.956 7.890 9.377 9.872 8.764 9.528 6.764 7.585 6.863 7.342 8.044 8.596 9.661 10.021 8.997 6.788 6.735 6.949 7.087 7.696 8.960 9.043 7.635 7.291 6.546 6.968 6.345 5.617 3.417 2.402 + 4.758 4.911 3.837 4.383 5.194 6.722 8.780 7.762 9.707 10.404 8.443 9.395 7.558 7.760 6.417 7.018 7.760 8.064 9.006 10.618 10.247 7.451 8.158 7.761 7.946 8.983 8.638 9.069 8.018 7.657 8.061 8.070 7.557 6.993 3.858 3.346 + 2.638 2.564 3.027 5.131 5.503 5.603 8.102 7.006 9.972 10.411 7.384 7.953 5.908 6.726 6.439 7.273 6.159 6.713 7.469 8.885 8.846 9.011 9.291 8.097 8.820 9.809 8.747 8.594 6.517 7.870 8.379 6.967 7.306 6.616 4.635 4.003 + 4.129 4.344 4.253 5.805 5.426 6.062 8.138 6.908 8.964 9.392 6.379 7.340 5.492 6.137 4.931 6.109 6.692 5.926 6.393 8.193 8.066 8.188 9.751 8.805 9.444 9.855 8.829 7.456 5.916 7.144 8.679 6.905 7.279 6.922 4.672 3.756 + 4.752 2.285 2.638 6.068 6.438 6.658 8.275 6.793 7.618 8.115 5.400 6.620 5.634 5.690 4.814 5.223 4.129 4.469 5.855 8.390 8.189 7.560 8.430 9.952 9.595 9.129 8.958 7.817 6.955 6.697 8.820 7.044 6.845 6.150 4.425 4.611 + 3.850 3.521 3.474 5.297 4.554 4.692 6.465 6.012 5.972 5.887 4.803 5.054 4.574 5.699 3.856 3.724 3.476 4.382 4.969 7.431 7.274 7.499 7.841 9.462 8.857 9.368 8.432 6.856 6.609 6.360 7.154 5.877 6.316 6.340 5.386 4.725 + 4.431 3.174 2.323 4.724 4.127 5.055 4.855 3.237 3.974 4.754 4.333 5.204 4.270 5.564 4.883 4.618 5.203 4.863 3.183 5.582 6.293 6.206 6.085 7.611 7.865 7.282 6.148 6.429 4.666 4.237 4.257 4.758 3.893 3.859 3.987 2.617 + 3.717 4.840 5.354 4.892 5.612 5.637 5.657 4.400 4.828 4.433 4.922 5.322 2.950 4.373 3.918 4.213 5.600 5.106 4.909 5.917 5.455 5.139 4.972 5.950 6.501 6.587 6.266 5.711 6.429 5.973 6.401 6.429 5.298 5.062 5.644 5.744 + 5.325 5.398 5.147 6.647 5.834 5.603 5.910 5.377 4.634 4.117 4.924 5.270 4.376 4.304 4.609 4.796 5.723 5.773 5.116 5.782 5.255 4.652 3.755 4.812 5.504 6.058 5.860 5.124 5.960 6.639 5.988 6.821 6.304 6.647 6.727 6.120 + 5.258 6.448 7.184 8.214 8.143 8.304 8.143 6.132 6.084 5.158 5.610 5.810 4.946 4.575 5.440 7.271 7.616 6.280 6.522 7.358 6.739 6.666 7.041 7.780 6.741 7.922 8.162 9.094 8.588 8.739 8.571 8.212 8.395 8.208 7.758 7.625 + 7.102 7.291 7.248 7.877 7.745 6.984 8.016 6.422 4.718 5.679 5.884 4.657 7.038 6.724 6.816 7.848 8.102 7.343 7.547 8.469 8.524 8.543 7.892 8.977 8.312 9.429 9.701 9.884 10.090 9.710 9.280 8.634 9.592 9.646 8.752 8.211 + 7.584 6.883 6.570 7.053 6.770 6.955 7.780 6.737 7.000 6.060 6.490 5.593 5.214 7.641 7.178 7.852 7.898 7.731 7.389 7.731 7.784 7.926 6.967 8.142 7.683 7.597 7.890 7.806 9.016 9.006 8.369 7.458 7.957 8.264 8.625 7.708 + 6.004 6.840 6.844 7.568 6.817 7.853 8.004 6.683 6.653 8.215 8.365 6.038 6.437 8.558 7.915 7.981 8.624 7.552 7.320 6.860 5.694 7.571 7.490 8.080 8.596 7.822 6.760 8.243 8.105 8.166 7.413 7.233 7.409 8.159 7.980 7.700 + 5.145 4.990 6.083 5.608 5.408 6.334 6.822 6.252 6.488 7.596 7.299 6.994 6.957 6.748 6.013 6.625 7.379 5.363 5.690 5.879 5.755 5.920 7.288 7.943 8.079 7.212 6.448 7.661 7.779 7.008 6.099 5.909 5.675 5.747 4.392 3.773 + 3.132 4.141 4.749 6.395 7.044 7.377 8.261 7.743 5.843 5.700 5.331 5.362 6.745 6.561 6.571 6.046 5.375 6.345 5.667 6.543 6.922 7.167 8.075 7.008 7.649 8.379 8.381 7.961 7.237 6.050 5.788 7.040 6.385 4.407 5.072 5.009 + 6.906 7.637 7.395 6.329 6.575 9.046 9.537 8.456 7.517 7.960 7.229 6.378 6.757 7.502 7.771 8.465 8.636 8.438 7.290 9.441 9.065 8.637 8.835 8.394 9.756 10.078 9.756 9.440 8.791 8.873 8.373 8.415 8.280 7.906 6.948 6.842 + 6.398 6.326 3.875 4.552 6.646 6.228 5.661 6.648 5.820 4.377 5.698 5.919 5.994 5.842 6.000 7.047 6.543 5.349 4.716 7.850 7.412 7.168 7.904 7.316 7.422 7.835 7.323 7.131 7.799 7.440 7.708 7.431 7.465 6.544 5.555 4.771 + 5.383 5.712 4.104 5.844 6.202 5.123 6.091 6.827 4.335 2.917 4.354 4.841 4.582 4.558 4.765 5.870 5.049 3.008 4.203 4.601 5.361 5.692 6.006 6.227 6.191 5.483 5.643 4.994 4.754 4.764 4.886 4.897 4.657 3.992 4.001 3.328 + 4.700 5.020 3.670 5.792 4.546 4.631 7.257 7.442 5.605 4.697 4.237 5.260 3.852 5.238 4.544 4.444 3.614 4.146 4.990 5.464 5.975 6.742 7.883 8.725 7.734 7.828 8.103 7.921 7.603 7.903 6.470 6.790 6.099 4.771 4.657 4.054 + 4.999 5.090 4.567 5.789 5.681 6.640 8.172 6.837 4.209 4.573 5.195 4.990 5.177 4.445 5.982 5.463 4.838 3.712 5.897 6.605 5.998 6.673 7.365 7.116 7.013 8.065 7.603 7.491 7.911 7.329 6.859 6.793 6.626 5.394 4.414 3.804 + 2.798 3.815 5.827 5.713 5.165 5.899 7.569 7.371 6.140 5.503 5.466 4.968 5.171 5.570 6.170 6.961 6.334 6.001 5.207 6.302 6.280 7.151 7.790 8.143 8.421 8.629 8.122 6.929 6.908 7.274 6.828 6.558 6.500 6.516 5.587 3.567 + 3.837 4.272 6.525 8.525 7.858 5.889 6.922 5.403 4.101 4.683 5.434 4.918 5.055 5.257 6.154 6.268 5.980 4.871 5.473 6.177 5.397 6.172 7.071 9.164 9.477 7.732 7.847 7.344 6.376 6.797 6.447 6.726 6.203 6.862 6.243 3.596 + 5.296 5.062 6.808 8.777 7.628 6.641 6.662 4.507 5.133 5.350 3.996 5.352 5.839 6.319 7.596 5.633 7.041 6.400 6.608 7.334 7.531 7.386 7.000 8.450 9.122 7.983 8.825 8.146 6.878 7.348 8.385 8.165 6.682 7.261 6.850 5.672 + 5.620 4.998 7.621 8.573 6.667 6.535 4.774 4.184 5.576 5.377 4.724 4.139 4.848 4.570 6.623 6.456 5.098 4.915 6.522 7.454 7.549 7.890 7.585 7.763 8.243 8.142 8.429 7.909 7.710 7.197 7.809 7.657 7.161 7.345 7.137 6.683 + 5.678 4.981 7.639 8.692 6.858 5.957 7.115 5.219 4.819 4.464 4.734 4.411 4.829 4.763 5.864 5.548 4.066 4.779 5.066 4.288 5.072 5.241 5.516 7.525 7.747 7.381 8.059 6.768 6.265 7.270 7.318 7.620 6.779 7.299 7.079 5.570 + 6.468 5.506 7.212 7.815 5.683 6.650 6.843 4.800 4.167 4.262 4.827 2.554 2.850 3.471 4.615 4.749 3.046 3.694 3.990 2.744 4.134 5.056 4.928 7.373 8.815 7.833 7.576 6.732 6.034 6.711 7.355 6.829 6.385 7.486 6.422 4.374 + 5.077 3.606 7.254 8.067 6.253 5.301 3.880 3.800 3.813 3.722 5.400 3.513 3.108 4.552 4.212 3.375 3.106 3.610 3.250 3.639 3.542 4.120 4.817 7.405 9.159 8.109 7.010 5.037 5.406 5.598 7.279 7.151 5.514 7.305 7.073 4.530 + 6.661 5.957 7.827 8.826 6.996 5.591 4.650 3.755 4.946 4.950 5.455 3.343 3.463 3.165 3.359 2.857 2.046 2.643 3.494 3.536 2.840 4.933 5.650 6.919 9.245 7.715 6.762 5.859 4.688 5.850 6.796 6.616 6.070 7.087 6.455 4.433 + 7.003 7.634 8.409 7.950 8.532 8.597 8.225 6.888 7.612 7.739 5.811 5.550 6.293 7.101 5.643 4.579 4.620 5.362 4.991 5.902 4.697 5.151 7.056 7.600 9.495 9.114 8.044 6.614 6.684 7.327 7.898 7.133 6.824 7.054 6.619 4.771 + 6.216 6.724 7.769 8.845 9.468 10.474 9.114 8.280 7.196 8.356 7.818 7.611 7.966 7.752 7.328 5.519 6.200 5.437 4.631 4.317 5.451 5.108 6.019 6.002 7.892 7.929 7.559 7.109 7.950 7.427 7.990 7.292 6.950 7.876 7.200 6.335 + 6.479 6.315 7.877 7.751 8.627 9.870 9.432 7.503 7.235 7.507 7.262 7.980 7.491 6.897 6.627 6.901 6.533 5.502 4.536 4.663 5.436 5.102 4.911 7.160 7.174 7.622 8.066 7.353 7.385 6.619 7.082 6.878 6.968 7.339 5.637 4.846 + 4.018 3.817 6.412 6.815 5.598 6.639 7.144 6.266 5.773 5.286 4.209 5.180 5.519 4.883 4.423 4.725 4.324 2.420 2.729 3.497 3.177 3.398 4.609 4.869 5.422 5.607 5.704 6.379 5.916 5.836 5.227 5.143 4.870 4.238 4.021 3.802 + 3.967 4.063 5.613 6.096 7.276 8.181 7.819 6.155 4.656 4.006 3.281 4.108 4.086 4.623 3.933 4.192 2.734 3.532 3.610 4.082 3.049 3.814 4.914 4.604 6.133 6.001 6.218 6.654 6.023 6.671 4.890 4.870 5.730 6.298 4.920 4.247 + 4.657 3.304 3.876 3.809 5.279 6.242 6.229 6.569 6.477 4.095 3.888 4.424 4.745 4.351 4.911 4.548 2.974 4.530 4.061 4.546 4.007 3.647 4.646 4.761 7.179 7.143 6.221 6.491 6.091 5.614 5.331 5.077 5.291 4.702 3.419 3.212 + 4.101 2.305 3.250 4.998 3.892 3.663 4.083 5.791 4.932 4.895 3.581 3.795 5.744 6.353 5.847 5.624 4.842 4.525 4.939 3.830 3.902 5.023 5.546 6.038 7.425 7.721 6.612 6.108 6.465 6.777 5.981 5.298 5.735 4.976 4.109 3.287 + 2.400 1.472 2.855 5.059 5.033 5.403 5.656 5.388 4.767 3.714 4.117 3.473 3.231 4.336 4.930 5.045 4.620 5.051 5.657 4.735 3.752 5.223 5.510 6.798 6.901 7.117 7.296 6.709 7.299 7.722 7.186 6.116 5.798 5.806 4.543 3.752 + 2.932 3.097 5.099 5.922 6.837 7.973 7.698 6.935 5.277 4.119 4.922 3.596 2.180 3.423 3.299 4.046 4.238 4.780 4.934 3.763 4.038 4.318 5.144 5.637 5.717 5.206 5.853 5.143 5.272 5.647 4.068 3.503 3.702 4.807 3.942 2.448 + 1.821 2.486 4.424 3.888 3.280 5.036 4.624 3.186 3.298 2.184 3.379 3.197 1.787 2.234 2.570 2.159 2.351 2.628 2.524 2.434 2.416 2.253 2.820 3.760 4.798 3.510 4.127 3.840 3.513 3.197 2.260 2.366 2.455 2.471 1.789 0.488 + 4.810 3.487 3.185 3.874 3.457 4.211 3.627 2.699 2.375 2.323 2.104 2.430 1.480 1.838 1.502 1.213 1.841 1.959 2.194 2.276 1.767 1.684 2.651 3.133 3.306 3.329 3.026 2.285 2.067 1.917 2.183 2.567 1.571 2.004 0.641 0.552 + 4.170 4.164 3.306 3.468 3.039 3.579 3.718 3.074 3.356 3.230 2.716 2.143 2.999 2.735 2.667 0.993 1.363 1.826 2.018 1.824 2.217 2.193 2.068 2.232 1.931 3.069 3.388 2.514 1.472 1.605 2.059 1.685 1.791 1.764 0.837 0.603 + 3.042 2.895 4.442 4.604 3.035 2.849 1.961 2.647 2.624 3.052 2.999 0.962 2.479 2.228 2.778 2.643 2.711 2.713 2.605 1.092 1.974 2.476 2.179 1.624 1.106 2.196 2.654 2.749 2.798 1.902 1.939 1.600 1.353 2.477 1.717 1.462 + 2.505 3.099 4.860 4.435 1.668 2.297 1.835 2.999 1.932 2.305 3.372 2.238 1.355 3.914 3.513 2.802 3.474 3.420 1.158 1.628 2.613 2.213 1.798 1.538 2.729 2.696 2.479 2.760 2.824 1.264 1.893 2.368 2.025 2.362 1.551 0.536 + 3.825 4.033 4.143 3.045 3.751 4.918 4.897 5.193 4.360 3.879 2.958 2.766 2.614 4.275 4.318 3.995 3.955 3.305 3.117 2.691 2.566 2.779 2.672 2.436 2.683 2.820 2.730 2.954 2.818 3.544 3.752 3.032 3.023 2.829 1.872 1.132 + 3.616 3.435 4.492 5.959 5.171 7.288 9.221 8.924 7.826 6.978 6.265 6.538 5.521 6.227 7.657 7.494 8.132 8.834 7.163 6.126 5.162 4.677 3.582 4.664 4.973 5.557 5.715 4.968 4.815 7.076 7.040 6.054 4.963 4.388 2.498 1.168 + 2.124 3.332 4.791 7.152 6.407 7.754 9.924 9.073 8.482 9.010 7.976 8.437 6.714 6.577 7.883 8.209 8.897 9.795 8.371 7.899 6.779 4.554 3.941 4.889 5.770 6.558 7.257 6.247 6.346 8.436 8.312 7.449 5.834 5.717 4.148 1.705 + 2.081 3.074 5.417 7.893 7.059 7.600 9.433 7.624 9.553 9.464 7.663 7.392 7.059 7.104 9.096 7.940 8.670 10.404 9.557 8.277 7.147 5.686 3.984 5.634 6.497 8.265 8.864 7.021 7.187 9.573 9.440 8.199 6.655 5.700 4.249 2.505 + 2.226 1.808 5.705 7.930 6.995 7.869 9.092 6.886 9.056 8.696 6.865 7.269 7.322 7.370 9.837 8.779 8.873 10.337 9.709 8.995 7.272 5.950 4.441 5.763 7.587 8.348 8.777 7.734 7.739 9.429 9.188 8.331 7.014 5.638 3.711 2.483 + 3.458 3.672 5.506 8.046 7.155 7.756 9.276 7.322 9.248 9.824 8.780 8.510 7.474 7.686 9.444 8.847 8.401 8.862 9.804 9.932 6.664 5.845 5.652 5.789 7.148 8.033 8.270 8.165 8.053 8.971 9.881 8.203 7.187 5.549 3.600 1.698 + 4.161 3.898 6.311 8.291 7.285 8.113 9.651 7.667 9.417 9.536 8.425 8.588 7.624 7.902 9.701 8.783 8.363 8.892 10.345 10.922 6.905 5.785 5.011 5.727 6.312 8.269 9.677 8.054 6.619 8.992 9.733 7.865 7.199 5.621 3.620 1.836 + 1.892 1.630 5.441 8.191 7.232 8.346 9.847 8.142 8.948 9.192 8.999 8.649 7.255 7.078 9.549 8.527 8.350 7.615 11.061 11.659 8.286 6.272 5.537 5.967 6.204 7.313 9.261 9.069 6.957 8.629 9.728 8.426 7.858 6.233 4.282 2.944 + 2.723 4.338 6.416 8.106 6.893 7.582 9.028 7.823 10.966 10.559 8.324 7.020 6.959 7.358 9.532 8.209 8.167 9.484 9.994 10.853 10.588 7.296 6.550 6.918 7.769 8.625 9.451 9.163 8.193 8.164 10.342 9.384 8.981 7.713 5.387 2.950 + 2.708 3.676 5.612 7.407 6.362 6.510 8.018 9.197 11.679 10.804 9.442 8.495 7.527 7.354 8.694 7.257 6.983 8.548 8.458 10.907 11.087 7.425 6.569 6.798 7.552 9.128 9.773 9.225 7.400 7.244 8.878 8.123 7.565 6.933 4.451 3.273 + 2.252 2.100 4.984 5.554 4.196 6.898 8.772 8.692 10.684 9.293 8.892 8.783 6.322 5.378 6.826 6.515 6.078 7.461 8.697 10.047 10.381 6.364 5.630 6.246 7.071 7.947 9.302 8.473 6.885 6.705 8.542 7.644 6.636 6.007 4.228 2.411 + 2.463 2.786 4.828 4.378 4.634 6.596 8.193 8.389 8.865 8.713 6.545 6.005 5.829 4.940 6.674 5.069 4.923 6.812 8.436 8.898 9.185 7.334 4.855 4.989 6.530 7.244 7.566 6.667 5.737 5.948 7.629 6.879 5.770 4.477 3.495 2.465 + 2.303 2.742 4.399 4.872 5.688 7.241 6.188 7.639 9.835 9.126 4.996 4.364 3.358 4.377 5.973 5.060 3.915 4.803 6.301 7.028 8.741 7.654 5.059 4.315 5.566 6.455 6.751 6.059 5.001 4.694 5.442 4.791 5.736 4.378 1.337 0.748 + 3.439 4.273 4.268 3.851 4.467 7.904 9.348 8.560 9.450 8.341 5.647 4.914 4.463 4.158 5.164 4.948 4.950 6.216 6.410 7.193 8.859 7.192 5.420 5.503 5.411 6.237 5.884 6.078 6.279 5.374 5.808 4.227 4.756 3.809 2.384 0.728 + 2.851 3.488 4.780 5.674 4.854 7.912 9.422 8.055 8.845 7.690 6.329 5.962 4.097 3.527 4.467 4.184 5.304 7.030 6.604 7.001 7.705 6.475 5.037 4.958 4.764 5.186 7.256 6.916 5.351 5.723 5.774 4.224 4.130 3.536 1.533 0.217 + 3.163 2.399 1.809 5.341 5.957 7.808 8.175 6.981 7.617 6.384 4.876 5.314 4.530 3.939 5.364 4.367 4.849 6.806 6.645 6.595 7.663 6.313 5.716 5.383 5.014 5.932 8.504 8.042 5.930 6.217 5.863 5.229 4.074 3.197 2.066 0.986 + 3.729 3.205 3.289 5.158 7.045 8.079 7.484 5.814 7.408 6.361 5.087 4.295 4.072 4.693 5.542 4.702 4.143 6.592 6.639 6.370 6.937 6.355 4.643 4.986 4.874 5.921 6.416 5.811 5.245 5.422 4.696 3.554 3.281 3.168 1.566 0.468 + 4.935 4.544 3.763 3.071 6.567 7.430 7.009 6.329 7.110 5.197 4.157 4.349 4.088 4.326 4.805 3.583 4.850 5.997 5.764 6.249 5.923 4.887 3.996 3.015 3.676 5.249 6.083 5.445 4.465 4.098 4.458 3.007 3.934 3.685 2.349 1.338 + 3.898 3.254 4.822 4.749 5.703 7.308 7.504 5.661 5.666 4.923 3.261 3.146 3.615 4.538 4.515 4.463 4.666 4.744 4.373 5.824 5.949 4.612 3.386 2.976 2.437 3.839 5.317 4.837 5.003 4.504 3.729 3.590 3.735 3.087 2.214 1.971 + 4.058 3.664 3.182 4.344 4.791 4.506 5.001 4.038 5.748 5.379 4.701 3.475 3.194 3.599 3.683 4.109 3.287 5.291 4.652 5.034 5.110 3.772 3.110 3.466 3.131 3.896 4.678 4.488 3.934 4.214 3.994 4.016 3.281 2.663 1.937 1.487 + 4.954 3.962 2.884 4.813 4.859 4.699 5.828 5.413 5.532 4.342 3.779 4.235 3.851 3.612 3.945 2.934 3.965 4.666 3.866 4.949 4.906 3.877 4.225 3.096 3.151 3.403 3.591 3.305 3.207 3.700 3.733 2.874 3.416 2.885 1.685 1.127 + 1.839 1.480 2.421 2.889 3.842 4.950 5.895 4.506 4.714 4.692 3.666 3.444 2.086 4.539 4.953 3.708 3.385 4.898 4.595 4.597 4.780 3.713 4.010 3.263 2.171 2.976 3.001 3.004 3.235 3.862 4.938 3.464 3.348 2.330 2.241 0.682 + 5.138 4.893 4.716 3.753 3.288 3.468 4.289 3.000 4.535 4.739 3.345 3.057 2.564 4.614 5.116 3.840 4.091 4.567 4.950 5.034 5.598 3.682 4.164 3.645 2.816 3.531 4.594 3.462 3.203 2.980 3.181 3.059 3.657 3.340 2.493 0.972 + 3.710 4.314 5.028 4.623 3.376 3.715 5.425 4.356 5.061 4.691 2.952 2.533 2.682 4.803 4.747 3.345 3.931 4.147 4.398 4.380 4.646 3.119 3.153 3.440 3.211 3.190 3.782 3.774 3.828 4.341 3.377 3.110 2.695 1.730 1.706 -0.024 + 4.154 4.271 4.103 4.457 2.739 5.144 6.030 4.060 3.784 3.402 3.943 3.781 3.503 4.154 4.571 4.129 3.322 4.874 5.158 4.869 4.048 4.066 3.430 2.199 3.577 3.940 3.708 3.873 4.314 3.752 3.960 3.419 2.514 2.424 1.745 0.629 + 2.926 4.166 3.409 1.890 2.257 4.373 5.024 2.329 3.890 3.649 4.017 4.367 3.405 4.471 4.890 3.143 2.833 4.485 4.336 4.630 4.306 3.032 2.818 2.712 3.349 3.511 3.986 3.191 4.018 4.231 3.466 2.788 2.186 2.386 2.502 0.732 + 1.862 2.655 2.223 1.468 2.832 4.313 3.596 3.223 4.064 3.442 3.365 2.089 2.467 4.946 4.332 3.447 4.272 5.274 4.170 3.902 4.971 3.580 3.333 3.598 3.230 2.986 4.277 3.587 3.639 3.595 3.141 2.673 1.918 2.875 2.271 0.635 + 4.333 3.414 1.962 1.650 1.338 2.895 4.167 4.464 4.212 3.109 2.979 3.541 2.874 4.217 4.636 2.799 4.155 5.012 5.050 4.870 4.580 4.137 3.435 3.820 3.613 3.722 3.649 3.858 3.396 2.694 2.602 2.259 1.835 2.415 1.674 1.475 + 3.799 3.448 3.991 3.830 3.190 3.015 2.879 4.181 4.928 3.343 1.823 3.923 3.344 5.027 5.073 3.096 4.141 4.553 4.902 5.038 4.041 3.540 3.680 3.696 2.906 2.507 3.152 3.863 4.071 3.568 2.937 2.331 2.362 1.546 1.578 1.171 + 4.699 4.631 4.291 2.872 3.705 4.729 4.223 4.848 3.946 3.075 2.869 3.443 3.077 4.763 4.392 2.353 3.028 6.022 5.482 4.358 3.609 2.933 2.975 3.269 3.212 3.631 2.830 3.358 3.000 2.385 2.604 2.859 3.006 2.375 2.790 1.431 + 3.407 3.300 2.932 1.999 1.785 3.083 3.923 3.986 3.647 3.367 4.366 3.620 3.241 4.615 3.527 3.290 2.820 5.357 4.759 4.945 2.902 2.200 3.414 3.217 3.082 2.411 3.588 3.369 3.507 2.995 1.963 2.260 2.622 2.430 2.662 1.236 + 4.277 4.392 3.087 2.312 2.762 5.206 5.058 3.376 4.333 3.053 3.995 3.906 3.133 2.798 2.732 3.337 3.410 4.229 4.271 3.659 1.545 2.478 2.013 2.005 2.818 3.034 3.481 3.314 3.176 2.968 3.462 2.720 2.622 2.554 2.177 0.799 + 2.561 2.487 2.386 3.075 2.502 4.980 4.605 3.479 5.197 4.435 3.402 3.229 3.837 2.985 2.516 3.444 2.355 2.673 3.321 3.771 2.647 3.309 3.832 3.675 1.881 2.424 3.413 3.908 2.951 3.060 2.483 1.863 2.366 2.558 2.573 0.999 + 2.520 1.518 2.313 1.790 0.718 3.452 3.497 3.341 4.407 2.624 2.625 3.419 3.144 3.473 3.496 4.198 3.454 4.236 4.041 3.561 3.677 3.504 4.023 3.532 2.046 2.859 3.614 2.548 3.435 3.248 2.648 2.322 2.345 2.613 2.824 0.899 + 2.556 2.180 3.019 3.548 2.598 3.169 4.116 3.069 4.193 3.843 2.038 4.159 3.479 3.602 3.767 3.673 4.188 4.566 4.618 4.729 3.405 3.515 4.416 3.464 2.092 2.592 2.995 3.163 3.580 2.851 2.945 2.682 2.050 2.620 2.607 0.683 + 2.946 2.484 2.897 3.408 2.932 2.883 4.047 5.028 3.295 2.250 1.030 3.882 4.116 5.061 4.595 3.198 3.336 3.601 3.977 4.014 2.482 2.729 2.974 3.532 2.529 1.892 2.299 3.449 2.947 2.186 2.601 2.376 1.650 2.449 2.991 2.028 + 3.775 4.012 2.952 2.314 3.264 4.655 5.310 3.266 2.242 3.108 2.666 2.767 3.953 4.043 3.277 2.945 2.564 5.010 4.762 3.031 2.634 2.449 1.775 3.831 3.368 2.366 2.421 3.058 2.497 2.359 2.532 2.538 2.149 2.541 2.891 1.173 + 2.159 3.858 3.990 3.248 2.443 4.736 4.592 3.307 3.285 4.100 4.237 2.703 2.644 4.069 3.037 2.384 2.851 2.933 2.981 2.562 3.240 3.239 2.542 2.648 3.004 2.025 3.078 3.365 2.738 1.990 2.763 2.177 1.452 2.234 2.473 1.059 + 1.471 2.201 3.577 2.798 1.616 3.491 4.333 4.693 3.109 2.987 2.607 1.717 2.666 3.069 3.045 2.353 4.085 3.552 4.358 3.703 3.513 2.338 3.843 4.546 3.088 2.257 2.704 2.864 2.268 2.275 2.390 2.152 2.045 1.828 2.126 0.787 + 2.734 1.446 1.603 1.553 1.085 2.725 3.509 2.779 2.751 3.598 4.068 2.703 2.247 2.161 1.833 2.609 3.652 3.375 4.073 3.173 2.989 2.537 2.861 3.823 2.970 2.789 2.142 1.750 1.938 1.954 2.607 1.936 1.848 1.664 1.885 0.741 + 1.626 1.662 1.679 2.535 2.983 3.016 3.263 2.770 3.033 2.722 1.824 2.424 2.646 3.210 2.641 2.645 2.303 3.140 3.653 3.261 2.022 2.564 3.590 2.697 2.603 2.184 1.737 2.023 2.019 2.800 3.006 2.423 1.484 1.301 1.604 -0.432 + 3.481 1.693 1.666 2.084 2.330 3.627 3.951 3.168 3.295 1.619 1.576 2.903 2.282 3.171 2.672 2.383 3.216 3.028 3.075 2.534 3.299 2.697 3.604 3.352 3.328 2.808 2.204 2.437 2.105 1.910 2.142 0.948 2.181 2.281 1.510 -0.477 + 2.963 2.855 1.786 1.079 0.299 3.445 3.855 2.404 3.036 0.744 0.495 1.445 2.359 2.956 2.560 2.444 2.978 3.527 3.848 1.620 1.778 1.646 3.306 3.307 2.659 2.096 2.352 2.746 1.706 1.755 1.768 0.878 2.197 2.248 1.325 -0.364 + 2.871 3.464 2.103 2.093 2.837 3.539 4.054 2.903 2.931 2.198 -0.188 1.788 2.966 3.382 3.197 2.353 1.994 3.317 3.270 3.146 2.326 2.106 3.573 2.761 2.093 3.128 2.342 2.729 1.893 1.774 1.834 1.332 1.555 0.917 0.412 -0.086 + 2.136 3.184 1.597 1.373 2.489 3.649 3.865 3.943 2.235 2.028 3.007 1.975 2.633 2.980 2.636 2.216 1.781 2.564 2.091 3.289 2.889 2.269 2.744 1.907 2.689 2.769 2.512 3.077 2.499 1.638 1.322 1.409 1.057 1.288 0.829 0.479 + 2.576 1.409 1.687 -0.475 2.183 4.132 4.389 2.762 2.684 2.693 3.428 2.085 2.298 3.633 3.344 2.350 2.014 1.763 2.621 2.253 1.559 2.728 3.174 1.981 1.995 2.915 2.086 2.571 1.845 1.749 1.298 0.937 1.055 1.619 0.899 0.621 + 3.453 2.281 2.994 2.732 3.015 4.051 3.493 2.463 1.440 2.743 1.743 1.060 0.701 2.333 2.163 2.509 2.420 2.711 2.043 1.584 1.737 1.950 1.371 1.059 1.376 1.655 1.840 2.349 2.410 2.566 1.936 1.286 1.183 1.336 1.035 0.599 + 0.803 1.356 1.801 1.418 1.771 2.051 2.479 2.358 1.989 1.675 1.256 1.592 -0.232 1.271 1.847 2.181 1.912 1.609 2.014 2.292 1.769 1.417 1.850 2.221 1.817 1.561 2.147 1.724 2.057 1.905 1.455 0.813 1.396 0.740 0.943 -0.252 + 0.707 0.627 -0.131 0.298 0.258 2.065 2.071 1.688 1.195 1.888 2.160 1.181 1.953 1.754 1.885 2.408 2.003 3.700 3.602 2.965 2.518 2.042 1.473 1.117 0.509 1.585 0.981 0.848 1.264 0.994 0.527 0.720 0.689 0.449 0.619 -0.625 + 1.520 1.349 2.313 1.610 1.735 2.992 2.020 1.866 1.299 1.357 0.866 0.047 1.930 2.915 1.439 2.819 2.627 3.916 2.258 1.666 2.127 1.189 0.868 1.559 1.265 2.332 1.204 1.026 1.695 2.238 1.114 0.612 0.586 0.495 0.601 -1.000 + 2.441 2.384 1.805 1.755 2.139 2.578 2.869 2.892 2.225 1.759 1.522 0.081 1.222 3.066 1.954 1.398 2.227 2.876 1.831 0.860 0.864 0.611 -0.640 0.958 1.073 1.060 1.279 1.402 1.196 1.248 0.563 -0.063 0.081 0.285 0.956 -0.138 + 1.323 1.161 1.421 1.824 1.728 3.295 3.668 2.629 3.017 1.584 1.402 -0.000 1.044 2.331 2.412 2.134 2.976 3.523 2.383 1.495 1.763 1.844 1.112 1.024 -0.255 0.072 0.929 0.679 0.865 0.600 0.462 -0.357 0.036 -0.177 0.447 -0.411 + 0.962 1.098 -1.477 -1.476 0.635 1.632 2.131 2.328 1.170 1.255 2.080 1.119 1.344 3.233 2.945 0.007 1.206 0.722 0.372 0.953 0.724 1.398 1.787 1.424 0.746 0.952 1.692 1.954 2.138 1.509 1.375 1.101 1.048 0.495 0.206 -0.644 + 3.770 2.109 0.096 0.697 0.391 2.131 2.451 2.244 1.883 1.551 1.303 2.971 3.386 4.470 4.253 1.743 2.873 2.005 1.597 1.485 1.376 1.955 1.254 1.030 0.882 0.596 0.135 0.591 0.311 0.799 0.467 0.858 0.617 0.764 0.377 -0.004 + 1.715 1.131 0.506 2.358 3.070 3.601 3.578 2.486 3.463 2.277 2.761 2.828 2.795 3.490 3.315 0.720 2.158 2.274 2.222 1.735 0.561 0.567 0.367 0.856 1.541 1.807 1.411 1.299 1.183 1.683 0.885 0.744 0.732 0.981 0.273 -0.602 + 3.634 3.957 3.458 1.968 2.326 3.603 3.460 2.431 4.149 3.226 2.552 1.907 1.196 2.189 2.435 2.300 1.394 1.910 1.672 0.779 1.517 0.876 1.018 1.292 1.651 2.963 1.624 1.358 0.683 0.926 -0.006 0.900 1.349 0.790 1.232 0.281 + 0.589 2.377 1.559 1.507 1.589 3.254 3.129 3.135 2.668 1.147 0.939 1.089 2.280 1.368 1.618 1.539 1.884 3.009 2.075 0.494 0.706 0.749 1.521 -0.001 0.799 1.906 1.285 1.509 2.018 1.240 -0.202 -0.307 0.623 0.377 0.296 -0.402 + 4.808 4.168 3.351 1.906 2.784 3.432 3.464 1.718 1.204 0.214 -0.818 -0.072 0.464 2.452 2.875 2.654 2.589 2.981 3.140 2.066 1.704 1.230 2.299 2.150 1.877 2.368 1.995 2.171 1.332 0.524 0.995 0.376 0.523 0.788 -0.185 -0.668 + 2.394 1.787 1.314 0.907 0.978 1.320 1.018 0.108 0.071 0.496 -0.221 0.112 1.447 2.220 1.925 2.270 2.752 3.156 2.653 2.288 1.327 1.944 3.008 2.125 0.343 1.875 1.556 2.021 1.495 0.394 1.347 1.236 1.345 0.682 0.192 0.484 + 4.355 3.189 1.586 3.228 4.373 3.683 3.300 1.690 1.794 1.730 1.467 2.035 2.852 2.689 2.001 2.844 2.916 1.660 1.556 2.636 2.680 2.566 2.161 1.998 2.788 1.863 1.173 1.911 1.411 1.318 0.786 0.891 0.741 1.009 0.430 0.717 + 4.266 4.858 3.866 4.639 5.488 5.307 5.044 2.856 2.804 2.062 1.791 0.537 1.072 2.941 2.993 2.552 2.539 2.209 3.119 2.966 1.957 2.250 3.080 2.039 1.713 3.092 2.044 2.353 1.465 2.070 1.205 1.532 0.580 1.742 1.491 1.317 + 1.554 2.700 2.156 2.712 3.104 2.775 3.787 3.091 2.777 2.838 3.560 2.714 1.106 2.950 3.099 2.516 3.233 2.979 2.799 4.257 3.210 2.879 2.857 3.313 3.331 2.801 3.928 3.812 3.260 1.927 2.170 2.926 1.811 1.778 1.696 1.387 + 0.581 2.078 2.416 1.577 1.633 2.482 3.147 3.580 2.975 0.662 1.007 1.187 0.593 3.164 2.648 1.593 1.501 2.541 3.170 2.966 2.634 2.765 3.349 3.839 3.931 3.572 4.011 3.245 2.677 2.441 1.995 2.222 2.127 2.121 1.972 1.394 + 0.484 1.267 1.976 1.334 1.673 3.365 3.064 1.976 2.455 2.432 2.039 1.839 1.751 3.621 3.574 1.976 1.181 2.392 1.986 1.741 2.326 2.342 2.527 2.541 2.810 2.996 2.829 2.491 2.607 2.928 2.382 2.387 2.466 1.809 1.816 1.105 + 4.722 4.042 2.246 3.348 2.935 1.992 2.293 2.491 1.279 1.310 3.001 2.811 1.995 1.633 1.443 1.125 2.586 1.956 2.269 2.749 2.801 1.964 2.875 3.307 2.409 2.667 2.336 2.818 1.359 2.962 2.041 2.350 1.844 1.836 0.963 0.291 + 2.955 4.125 2.974 2.706 1.746 1.998 1.607 2.737 2.212 2.216 2.611 2.256 1.619 2.375 2.517 2.176 2.421 2.915 2.298 3.203 2.615 2.810 3.445 3.011 2.358 2.700 1.935 2.989 1.986 1.263 1.209 1.757 2.331 2.304 1.847 1.393 + 4.729 3.337 1.368 1.801 2.418 2.965 3.375 3.881 2.973 1.888 2.864 2.247 1.841 3.682 4.343 3.645 4.129 3.583 2.479 2.181 2.377 3.297 3.323 2.885 3.134 3.421 2.830 2.154 1.069 2.547 1.842 0.407 0.974 1.992 1.630 0.895 + 1.536 2.399 2.062 1.039 1.430 2.870 3.146 3.164 1.357 0.540 2.101 2.241 1.515 3.535 4.420 3.778 3.641 4.005 2.131 2.334 2.630 3.444 3.035 2.527 2.318 2.396 3.052 3.125 2.775 2.150 1.194 0.226 1.508 1.849 1.408 0.791 + 4.404 3.834 3.162 2.251 2.516 3.231 2.811 3.053 1.658 1.635 3.170 2.406 2.901 3.742 3.328 2.595 3.458 2.304 2.208 2.136 2.109 2.162 2.959 1.845 2.659 2.616 2.432 2.533 2.817 2.382 2.096 0.572 1.294 1.767 1.474 0.488 + 2.347 3.601 2.865 3.255 1.922 2.356 2.292 3.017 1.266 1.747 3.461 3.657 3.723 4.448 4.146 2.979 4.740 3.652 2.747 2.698 2.116 2.358 1.686 2.145 2.803 2.710 1.447 1.367 1.840 1.775 1.576 0.876 0.560 0.803 0.946 0.089 + 3.195 3.567 2.800 2.957 1.995 1.415 2.114 2.655 1.422 1.193 2.786 2.554 2.645 4.144 3.754 2.374 4.503 4.568 3.007 2.970 2.365 2.974 2.271 2.200 2.661 3.051 1.899 2.243 2.007 1.291 1.710 2.326 2.134 2.315 1.239 1.009 + 3.024 3.493 2.378 0.382 1.981 2.987 3.246 2.154 1.758 1.743 3.049 3.188 1.655 4.486 4.246 2.539 3.079 3.782 4.321 3.489 2.669 4.098 3.724 2.921 3.283 3.249 2.247 3.034 2.720 1.521 2.122 2.393 3.026 2.127 2.630 1.957 + 2.245 1.155 1.018 2.184 1.454 -0.261 0.584 1.496 1.561 1.648 3.600 3.251 2.409 3.869 3.924 3.503 3.394 3.359 3.364 3.704 2.588 3.146 4.248 3.697 3.431 4.190 3.564 2.579 3.161 2.579 2.600 3.579 3.591 3.163 3.613 3.240 + 1.708 1.850 0.700 0.966 0.692 0.808 0.990 3.275 2.516 0.659 1.475 2.607 3.741 4.052 3.182 4.030 4.479 3.872 3.432 2.822 3.083 3.768 4.860 4.652 4.307 4.215 4.564 3.707 4.012 4.162 3.920 5.039 4.528 3.475 4.622 4.034 + 2.484 1.578 0.615 -0.695 0.851 1.050 2.952 2.986 3.119 2.941 3.271 3.298 3.044 2.541 2.846 3.150 2.894 3.337 2.227 2.410 3.475 4.890 6.473 5.647 5.590 4.937 4.197 4.411 5.329 5.911 5.558 5.820 5.598 5.261 5.265 4.046 + 3.777 3.512 3.426 1.517 3.250 3.924 3.002 4.021 3.977 3.819 4.077 4.202 3.767 4.105 3.543 3.582 4.535 4.140 2.641 3.527 4.856 5.643 5.341 5.591 5.943 5.437 4.944 5.318 6.329 6.001 6.511 6.547 6.252 5.903 5.533 4.619 + 1.824 2.838 3.289 2.564 3.952 4.371 4.441 4.084 3.857 3.190 4.128 4.961 4.245 3.918 4.670 5.458 5.624 4.517 4.257 4.839 3.764 5.640 6.274 6.380 5.574 5.681 6.116 6.440 5.471 5.513 6.659 7.504 7.019 6.424 6.237 5.536 + 2.977 2.309 3.227 4.173 3.280 2.922 3.462 4.770 3.689 2.956 4.917 4.891 4.308 4.583 4.230 4.692 4.603 4.934 4.547 5.222 4.172 5.279 6.270 6.268 6.270 6.807 7.165 7.338 7.035 6.468 6.137 7.637 7.616 7.356 7.540 6.936 + 3.479 3.372 4.297 3.899 2.764 4.163 4.354 4.464 2.643 2.861 3.307 4.802 4.233 3.134 5.318 5.659 5.252 6.230 6.322 6.259 5.550 6.380 6.348 6.500 7.551 6.525 6.691 6.860 7.188 7.699 7.954 7.546 8.152 8.211 7.582 6.340 + 2.856 4.052 3.256 1.911 1.177 2.783 3.400 3.885 3.367 3.553 2.045 4.007 4.869 3.766 4.553 6.392 6.408 5.339 5.883 7.040 5.663 6.689 7.551 6.381 6.263 6.551 6.226 7.276 6.975 7.578 7.941 7.806 8.021 7.109 7.280 6.870 + 4.279 4.422 3.714 3.185 4.666 4.937 4.827 5.192 3.939 1.481 2.183 3.373 4.125 3.936 3.981 6.443 6.522 6.079 6.757 6.966 6.516 6.202 7.497 7.385 7.447 7.601 7.133 6.942 7.920 8.107 8.465 8.347 8.204 6.502 7.569 7.326 + 3.244 2.846 2.306 3.434 3.820 3.475 3.923 4.985 4.752 3.825 4.007 4.773 4.601 5.479 5.468 6.727 5.904 4.888 5.623 5.705 6.168 7.132 7.319 8.867 8.413 8.086 6.883 7.018 7.104 7.035 7.205 8.882 9.076 7.764 8.307 7.978 + 2.770 4.020 3.463 2.112 3.621 3.722 3.317 2.400 3.822 4.592 5.408 5.838 4.001 6.417 5.749 7.004 7.007 6.016 6.784 6.354 6.974 7.940 8.273 8.225 7.874 6.655 6.123 6.952 7.172 6.521 7.059 8.030 7.573 7.960 7.676 6.682 + 1.805 3.171 3.306 2.214 3.590 3.225 2.431 3.417 3.956 3.950 5.041 5.482 4.823 5.393 6.031 6.374 6.473 6.688 6.051 6.349 6.480 7.548 7.722 7.166 7.436 7.626 6.615 7.177 7.498 8.015 7.246 8.019 8.024 7.530 7.973 6.578 + 4.236 4.150 2.934 3.573 3.027 3.499 3.689 3.741 2.073 2.796 4.416 5.173 5.304 4.925 5.062 4.947 5.283 6.436 6.334 6.075 6.649 6.618 8.047 7.707 6.681 6.501 5.800 6.561 7.922 7.791 6.855 6.994 7.697 6.596 7.382 6.420 + 4.811 4.262 1.958 2.463 2.864 3.398 3.220 2.115 2.633 3.566 3.474 3.714 4.119 4.463 4.253 4.595 5.768 5.381 5.645 5.247 6.235 6.671 7.702 7.462 7.287 6.889 6.440 7.675 8.141 7.963 7.247 7.205 7.293 7.558 8.039 6.572 + 1.961 1.958 2.113 -0.595 1.381 3.166 2.818 2.545 2.858 4.320 3.636 3.163 2.660 3.655 3.374 3.590 5.291 4.611 6.453 5.902 5.103 6.257 7.101 6.347 6.727 6.252 6.216 6.226 6.867 5.266 6.663 7.135 7.587 7.023 7.526 6.822 + 2.168 3.139 3.062 2.302 2.578 4.554 4.108 2.669 3.013 4.238 4.699 3.518 4.103 4.992 4.859 4.780 6.555 5.181 5.263 5.717 5.443 6.369 6.735 6.321 6.920 6.557 6.550 6.609 6.930 7.100 7.181 7.637 7.764 6.840 6.719 6.195 + 2.772 3.429 3.777 2.458 2.807 4.426 4.377 3.143 4.000 3.982 4.309 4.759 4.316 5.893 6.067 5.957 5.282 3.901 5.234 5.460 5.762 6.845 7.871 7.594 7.836 7.356 6.301 6.561 5.926 6.493 6.798 8.437 7.631 6.854 6.863 6.516 + 3.005 3.500 3.590 3.312 2.409 3.870 4.840 3.248 3.426 3.656 3.032 4.374 4.379 4.905 5.058 5.650 3.952 4.572 5.321 4.219 5.069 6.046 7.391 7.513 6.512 5.741 5.962 5.766 6.483 5.386 5.712 6.881 6.579 4.786 6.778 5.693 + 5.757 5.262 4.091 2.954 3.545 5.699 5.182 2.150 3.053 4.053 4.316 4.821 4.397 5.244 5.004 4.973 4.164 3.923 4.041 4.902 4.684 4.120 5.602 5.327 4.120 3.954 5.021 4.850 4.739 4.957 5.658 6.259 6.106 5.718 5.670 4.745 + 4.490 4.348 5.037 4.688 2.608 4.924 4.792 3.107 2.483 2.179 3.724 3.417 3.381 5.131 5.904 5.856 5.828 6.573 6.634 6.242 5.199 5.603 6.149 6.047 5.625 5.878 6.099 6.455 5.876 5.395 4.750 4.926 4.606 3.458 4.325 3.623 + 3.718 3.358 3.813 2.692 3.007 4.279 4.579 3.940 2.735 2.996 3.338 2.359 2.517 5.162 5.131 4.808 5.962 6.943 6.546 6.350 4.670 5.319 5.675 6.027 5.296 5.630 6.059 6.611 5.695 5.297 4.986 5.020 5.483 3.686 3.657 3.007 + 4.095 4.202 5.030 3.638 1.156 3.753 4.702 3.732 2.999 3.561 2.490 1.197 2.382 4.499 4.574 3.284 3.672 4.844 3.915 2.618 2.868 3.618 2.536 2.900 2.698 3.047 2.730 3.147 2.232 2.436 2.524 2.749 3.068 2.276 2.725 1.757 + 4.116 5.443 5.194 3.563 2.319 2.810 2.872 2.576 2.408 2.967 2.304 1.792 1.945 3.377 3.122 1.730 2.373 3.223 2.548 1.302 1.833 2.910 2.516 1.826 2.303 1.956 2.211 2.222 2.246 2.439 2.794 1.998 2.591 1.753 1.523 1.433 + 5.110 5.357 5.827 4.938 4.620 5.402 5.958 4.521 1.832 2.690 3.593 3.037 2.171 4.870 3.834 3.237 3.602 4.147 4.087 4.397 5.067 5.273 6.447 7.127 6.540 5.515 4.480 3.829 4.809 6.114 6.118 6.509 6.981 6.146 7.289 8.860 + 5.966 4.245 4.527 4.837 3.986 4.147 4.357 4.079 2.070 1.488 3.069 1.715 1.339 4.114 4.082 2.832 3.782 4.070 4.015 3.996 4.207 4.521 6.321 7.256 6.356 5.605 5.513 3.760 5.818 6.646 5.652 6.006 6.582 5.423 6.909 8.825 + 4.780 2.582 2.739 2.084 2.738 2.350 2.894 1.030 1.609 0.640 1.509 2.726 2.819 3.859 4.368 3.605 1.731 2.132 2.983 2.357 1.110 0.939 1.533 2.167 2.675 3.535 3.110 1.909 1.929 1.077 1.863 2.292 2.365 2.327 2.104 2.068 + 2.761 1.780 1.725 3.626 3.404 3.516 3.792 1.792 1.593 1.764 1.701 2.601 1.459 4.572 4.964 3.019 2.220 3.684 2.982 3.178 2.193 1.483 2.276 3.425 3.589 2.961 2.560 3.661 3.567 3.415 3.323 4.173 4.432 4.555 4.608 3.565 + 4.621 4.124 2.980 3.426 3.021 2.866 4.033 2.765 0.584 2.050 1.110 0.817 1.688 4.715 3.664 3.187 3.576 4.098 2.907 2.618 2.473 1.532 2.165 2.259 3.810 3.121 3.678 4.355 4.622 5.197 5.290 5.494 4.691 4.626 4.357 3.287 + 3.991 4.837 5.406 4.864 3.214 4.684 4.959 4.188 2.972 2.093 2.615 2.139 2.451 3.364 3.288 2.340 2.512 3.028 2.734 2.766 2.982 3.144 1.918 1.635 3.218 3.369 2.529 1.974 2.604 2.649 2.695 3.248 3.241 3.497 3.352 1.996 + 4.563 3.747 4.018 4.654 3.031 5.151 4.900 3.822 2.971 2.131 1.778 2.405 1.795 2.919 2.321 1.462 2.254 2.774 2.578 2.615 2.857 3.062 2.490 1.914 3.262 3.646 3.588 2.860 2.503 2.649 2.969 2.420 2.118 2.322 2.369 1.239 + 5.466 6.521 5.631 5.208 5.505 5.698 5.748 5.892 5.193 4.346 3.000 3.999 4.170 4.108 3.629 3.288 3.896 3.533 3.666 3.440 4.475 3.888 4.738 3.850 4.149 5.989 5.794 5.961 5.220 4.042 4.943 5.871 5.209 3.604 2.603 3.785 + 12.092 12.191 11.524 11.722 10.723 10.520 10.718 10.750 9.164 9.228 6.970 8.322 9.268 8.213 7.364 8.141 8.582 9.111 8.029 10.000 10.136 10.182 9.489 9.115 8.288 10.813 11.997 11.593 10.010 9.473 11.079 12.226 10.870 10.171 11.063 11.911 + 13.149 14.201 14.777 14.484 14.856 13.698 12.325 12.295 10.989 10.352 10.708 9.580 9.985 10.404 10.299 10.808 11.193 11.518 11.029 12.922 14.705 13.628 12.362 11.978 11.884 12.849 14.555 13.587 12.294 12.841 14.125 15.083 13.507 11.730 12.519 13.789 + 12.900 15.086 16.334 14.912 16.171 15.724 14.415 13.913 11.842 11.538 12.382 11.698 12.114 11.790 12.118 12.220 12.379 12.793 13.189 14.856 17.136 16.179 14.540 14.254 14.132 15.057 16.487 15.641 14.555 14.911 16.661 17.679 15.822 12.415 12.134 11.929 + 13.507 15.291 16.865 15.506 17.148 17.022 14.786 14.797 13.184 13.167 12.228 12.343 13.289 12.342 12.436 12.668 13.052 13.093 14.121 15.327 18.067 17.488 15.486 15.215 15.096 15.658 17.459 16.792 15.813 16.119 18.024 18.769 17.226 13.420 11.889 12.982 + 13.480 15.270 16.931 15.730 17.540 17.507 14.651 14.786 13.414 13.560 12.087 12.183 13.295 12.532 12.495 12.632 13.169 13.154 14.089 15.569 18.315 18.295 15.332 15.238 15.000 15.998 17.741 17.381 16.143 16.449 18.260 19.065 17.700 14.351 11.787 12.450 + 13.330 15.383 16.930 15.695 17.706 17.542 14.543 14.594 13.275 13.411 11.671 11.875 13.078 12.333 12.313 12.415 13.019 13.032 14.094 15.397 18.332 18.276 15.762 15.450 15.161 16.146 17.843 17.570 16.183 16.337 18.155 18.961 17.743 15.176 12.342 12.407 + 13.136 15.478 16.890 15.632 17.584 17.208 14.392 14.393 13.257 13.234 11.435 11.563 12.840 12.264 12.203 12.286 12.882 12.796 13.936 14.993 17.877 17.555 15.627 15.250 14.890 15.778 17.450 17.246 15.743 15.856 17.579 18.606 17.611 15.367 11.956 11.798 + 13.110 15.392 16.346 15.189 16.758 15.958 14.030 13.280 12.699 12.284 10.951 11.697 11.723 11.882 11.688 11.880 12.337 12.652 13.525 14.602 17.012 16.340 14.715 14.219 14.032 15.220 16.766 16.389 14.670 14.751 16.369 17.993 16.838 14.373 11.700 11.063 + 11.791 13.336 13.266 13.882 13.959 12.634 13.219 12.880 12.005 11.908 12.398 12.378 10.913 10.744 10.829 10.426 9.802 11.227 11.588 12.482 14.083 13.296 12.506 12.116 11.780 12.495 13.787 12.383 11.197 11.666 13.219 15.258 13.982 11.636 10.752 10.386 + 10.048 12.389 12.489 9.950 8.841 8.570 7.695 8.220 7.518 7.961 6.632 6.460 6.474 6.508 5.875 5.314 5.776 6.176 7.301 8.135 7.575 7.348 7.483 7.784 7.407 7.645 7.695 7.767 6.403 6.840 8.770 10.099 9.291 7.815 6.693 6.199 + 9.501 12.189 11.798 7.998 8.188 7.468 6.831 6.290 5.683 6.174 5.485 4.722 4.615 4.216 4.336 4.000 4.452 4.628 6.784 7.323 7.999 7.164 5.871 5.083 4.744 6.302 7.201 6.480 5.110 5.304 7.330 8.673 8.258 6.423 3.949 3.251 + 10.084 12.597 12.296 8.944 7.418 7.514 7.681 7.510 5.820 5.883 3.939 3.972 3.804 4.336 3.899 3.527 4.202 3.789 5.721 7.425 7.661 7.317 5.137 4.549 5.330 6.412 7.167 6.244 5.326 4.742 7.054 7.719 7.524 4.685 3.694 3.526 + 10.074 12.405 11.593 8.383 8.177 7.542 7.020 7.875 5.876 4.807 5.628 4.657 4.082 4.262 3.909 3.619 3.417 4.799 5.984 6.861 7.634 7.297 5.069 4.397 4.927 6.398 6.193 5.810 4.985 4.947 6.547 7.128 7.026 5.827 3.123 2.077 + 9.906 12.493 12.020 8.921 9.697 9.127 7.509 6.643 5.208 5.057 6.290 4.667 6.155 6.904 7.058 7.243 7.219 6.455 6.797 7.790 8.576 7.394 6.321 6.405 7.236 8.325 8.349 7.003 5.494 5.688 6.947 8.245 8.459 7.663 7.564 7.442 + 10.290 12.645 13.464 12.514 12.218 10.733 10.834 10.107 9.459 9.866 9.762 9.276 8.686 9.984 10.364 10.020 10.137 10.086 10.063 11.520 13.384 12.554 9.114 10.584 11.483 12.820 12.591 11.313 11.628 11.004 11.700 13.345 12.583 12.457 12.957 12.529 + 10.357 13.284 13.697 11.592 12.762 11.048 12.311 11.040 9.923 9.609 9.806 9.872 9.338 9.583 9.719 9.496 10.149 10.963 10.972 12.068 14.592 14.329 11.732 11.518 12.239 13.049 13.422 12.674 13.125 12.995 13.765 14.502 13.813 14.202 14.425 13.992 + 10.785 14.125 14.887 13.419 14.662 13.257 13.034 11.683 10.990 11.319 10.791 11.329 10.586 10.669 11.162 10.533 10.866 11.770 11.598 12.812 15.405 15.156 12.953 12.317 12.228 13.576 14.790 13.502 12.734 12.410 13.689 15.624 14.010 13.674 12.877 11.864 + 12.388 14.596 15.879 14.500 16.042 15.193 13.608 13.187 12.346 11.770 10.733 11.084 11.775 11.929 11.865 12.023 12.250 12.274 12.839 13.546 16.139 17.220 15.139 13.827 13.175 14.092 15.486 14.709 12.983 12.772 14.290 15.907 14.591 12.743 13.183 12.277 + 12.898 14.889 16.284 14.897 16.505 16.029 13.689 13.750 12.743 12.635 11.103 10.991 11.861 11.889 11.717 11.837 12.403 12.395 12.772 13.651 15.725 17.180 15.699 14.030 13.237 14.072 15.689 15.027 13.133 12.935 14.227 15.605 13.881 12.108 12.279 10.987 + 12.881 14.756 16.377 15.157 16.346 16.243 13.799 14.082 12.971 13.305 11.581 11.573 11.993 12.047 12.166 11.882 12.498 12.761 12.869 13.784 16.079 16.470 15.462 14.567 13.760 14.449 16.150 15.754 13.868 13.340 13.852 15.142 13.799 11.399 12.168 9.468 + 12.686 14.532 16.180 15.004 15.748 15.782 13.286 13.533 12.531 12.953 11.464 11.445 11.199 11.709 12.118 11.946 12.081 12.619 12.820 13.409 16.143 16.526 14.352 14.001 13.175 14.120 15.332 15.061 13.208 12.733 13.257 14.524 13.490 10.356 11.240 8.662 + 12.106 14.193 15.209 13.756 14.521 14.205 11.970 11.550 11.189 11.446 11.157 10.426 10.587 10.856 11.202 11.062 11.048 11.574 11.948 12.692 15.559 15.307 12.991 12.422 11.616 12.381 13.988 13.381 11.326 10.631 11.377 13.285 12.419 10.477 9.913 8.767 + 10.342 12.194 11.216 11.051 11.091 9.561 8.855 8.656 7.907 6.913 7.068 7.203 7.623 6.680 6.600 6.529 7.532 8.194 8.291 9.390 11.779 10.966 9.187 8.167 8.153 9.082 10.568 9.372 7.748 7.615 8.545 11.142 10.409 8.325 8.246 6.711 + 9.685 11.706 11.385 9.290 7.075 6.171 6.602 6.496 5.986 6.243 4.576 3.852 4.823 4.579 3.379 2.502 3.550 4.776 5.130 6.315 8.102 8.190 4.946 5.281 5.304 6.277 6.167 5.457 5.082 4.861 5.537 6.420 6.334 5.787 5.673 5.553 + 9.530 10.970 10.117 8.700 6.063 5.320 4.851 5.363 6.917 6.632 7.064 6.130 5.807 4.805 4.748 4.113 4.579 4.051 5.328 5.714 6.817 7.286 5.787 6.544 5.643 5.556 5.756 5.800 5.853 5.998 6.104 6.558 6.653 5.985 5.537 5.131 + 9.152 10.361 10.739 8.903 7.641 6.767 6.383 6.335 7.096 6.313 6.194 6.009 4.716 4.677 3.802 3.602 4.252 4.127 4.981 5.516 6.128 6.472 5.315 4.518 4.528 4.727 6.417 5.755 4.933 6.005 6.734 6.964 6.967 6.325 6.327 6.425 + 8.048 7.936 9.380 8.747 7.208 6.596 6.376 6.048 6.895 5.416 3.783 5.667 4.847 5.039 4.508 3.761 4.575 5.490 4.553 4.220 4.325 5.798 5.339 4.075 4.398 4.919 6.465 4.693 4.771 5.789 5.463 6.219 7.052 5.526 7.255 8.197 + 8.573 9.110 10.228 8.580 8.025 7.625 4.804 4.800 5.675 3.795 4.138 5.127 3.801 4.168 4.459 4.144 4.082 4.073 3.564 4.310 5.206 6.313 5.800 5.023 4.675 5.405 6.527 5.906 5.649 5.945 6.263 6.864 6.569 6.427 8.782 9.037 + 8.575 9.662 9.631 7.400 7.918 7.204 4.161 3.203 6.023 5.871 5.452 5.300 3.394 4.331 3.713 5.515 4.485 2.313 3.452 4.903 6.187 6.389 5.409 4.804 4.795 4.974 6.688 6.809 6.294 7.187 8.051 8.233 7.530 6.117 8.075 8.297 + 9.742 10.699 10.321 8.532 8.529 7.798 8.254 8.296 8.301 8.608 8.497 7.930 7.775 7.577 7.743 8.226 8.017 7.823 7.204 6.833 7.462 8.171 8.390 7.928 8.110 8.015 9.685 10.586 10.117 10.025 9.401 11.168 11.295 10.781 10.894 9.307 + 11.459 11.129 12.032 11.094 11.089 10.884 9.730 10.078 9.748 9.630 9.233 9.263 8.631 8.487 9.062 9.186 8.998 9.042 8.858 8.922 9.956 10.774 10.150 9.309 10.012 10.479 11.836 12.158 11.356 12.066 10.953 13.414 12.992 12.370 12.769 11.739 + 9.921 12.301 13.188 11.600 12.372 11.793 11.700 10.450 9.551 9.762 10.176 9.080 8.363 9.310 8.825 8.183 8.709 8.726 9.742 11.141 13.739 13.524 11.526 11.167 10.108 10.954 13.964 13.070 11.884 12.709 12.330 14.003 13.741 13.114 14.297 13.593 + 11.513 13.624 14.913 13.805 14.339 13.281 12.936 12.647 10.839 10.417 10.862 10.412 10.758 10.274 10.698 11.055 11.520 11.796 12.231 13.103 15.345 15.800 12.854 12.553 12.381 13.103 14.263 13.995 13.142 12.216 12.997 14.312 13.339 13.818 14.404 13.161 + 12.706 14.493 15.848 14.188 15.889 15.542 14.078 13.626 12.567 11.773 12.038 12.093 12.658 12.063 11.981 12.109 12.047 12.200 13.032 13.476 16.007 16.683 15.066 14.093 13.545 14.305 15.813 15.550 14.259 14.086 15.221 16.420 14.526 13.172 13.378 11.426 + 12.994 14.919 16.295 14.994 16.876 16.469 14.289 14.175 12.726 12.372 12.041 12.073 12.878 12.098 12.216 12.378 12.609 12.978 13.864 14.440 16.578 16.800 15.698 14.781 14.410 15.501 16.929 16.027 14.724 14.518 15.847 17.126 15.069 13.234 12.794 9.861 + 13.026 15.074 16.383 15.120 17.338 16.820 14.639 14.254 13.209 12.723 12.677 12.524 13.284 12.437 12.525 12.777 12.902 13.326 14.218 14.957 17.295 17.377 16.049 15.210 14.677 16.029 17.329 16.004 14.836 14.649 15.912 17.289 15.364 12.977 12.937 10.163 + 12.909 15.061 16.402 15.309 17.533 17.027 14.772 14.393 13.249 12.983 12.919 12.676 13.436 12.470 12.688 12.865 12.928 13.398 14.146 15.034 17.504 16.987 15.905 15.109 14.850 16.091 17.662 16.021 14.638 14.328 15.432 17.066 15.447 12.789 12.848 11.458 + 13.063 14.995 16.197 15.293 17.331 16.631 13.998 14.119 12.707 12.149 12.728 12.248 12.898 12.180 12.232 12.645 12.803 13.526 14.043 15.811 17.808 16.488 14.906 14.234 14.135 15.845 16.991 14.848 13.730 13.642 14.670 16.501 15.338 12.453 12.652 10.430 + 12.856 14.785 15.625 14.705 16.399 15.083 14.150 13.667 11.118 11.040 12.903 11.615 12.007 10.918 11.352 11.610 12.039 13.084 13.656 15.939 17.068 14.895 13.339 13.000 12.985 15.339 15.603 13.735 12.909 13.092 14.323 16.055 15.084 12.631 12.496 11.650 + 12.172 13.905 14.480 13.177 14.652 13.120 13.251 12.338 11.100 12.068 13.001 11.576 10.172 9.260 10.175 9.947 10.267 11.363 12.722 14.236 13.951 12.582 12.088 11.232 11.235 13.178 12.587 11.663 12.456 13.025 13.095 14.330 14.016 12.281 11.680 10.032 + 11.952 13.695 15.141 14.375 15.076 14.197 13.048 12.862 11.302 9.807 11.836 10.540 9.997 9.730 10.345 10.792 10.880 11.111 12.875 14.696 13.392 12.661 12.003 11.420 12.243 13.890 13.451 12.166 13.135 13.805 14.224 14.000 13.998 13.800 12.396 9.506 + 12.484 14.132 15.611 14.071 15.027 14.419 13.687 13.418 9.529 8.186 11.659 11.030 11.196 10.725 10.753 11.037 11.348 11.911 13.023 15.340 14.981 13.514 12.471 12.546 13.222 14.873 14.069 12.268 12.575 13.336 14.024 14.315 13.942 13.001 12.780 10.654 + 12.832 14.291 15.898 14.594 15.089 14.922 13.960 14.129 11.160 9.938 11.613 11.263 11.686 10.735 10.831 11.475 11.574 12.364 13.369 15.452 15.391 13.753 13.312 13.232 13.558 15.386 15.059 12.136 12.476 12.338 13.464 14.308 12.824 11.105 10.193 9.613 + 13.002 14.288 16.219 15.153 15.275 15.563 14.043 14.732 11.998 10.996 12.396 12.636 12.604 11.847 11.806 12.525 12.104 12.721 13.563 15.714 16.631 14.206 13.650 13.464 13.552 15.291 15.225 13.798 13.415 13.051 13.786 14.689 13.046 10.338 9.567 9.049 + 13.238 14.068 16.391 15.857 15.417 16.177 14.081 14.984 13.153 12.065 11.887 12.898 12.511 12.690 12.318 12.645 12.641 12.976 13.654 15.404 17.400 15.742 14.040 13.313 14.123 16.223 16.334 14.422 13.388 13.583 14.927 15.478 13.484 10.032 9.855 8.860 + 13.163 13.898 16.398 15.944 14.972 16.012 13.967 14.831 13.503 12.988 11.810 12.178 12.115 12.752 12.098 12.588 12.832 13.209 13.722 15.600 17.329 16.222 14.008 13.825 13.857 16.104 16.327 14.272 13.578 13.556 14.245 15.007 13.709 10.612 9.191 7.562 + 13.071 14.016 16.306 15.796 13.956 15.069 13.405 14.348 13.032 13.270 11.799 10.985 11.166 11.945 11.520 12.120 12.582 13.196 13.718 15.823 15.826 15.127 13.510 13.682 14.197 15.724 15.694 13.439 12.822 13.311 14.130 14.080 12.763 10.699 9.125 5.943 + 11.916 13.693 15.138 14.598 13.177 12.448 12.170 12.228 11.512 12.366 11.523 10.787 10.356 10.898 10.286 11.047 11.524 11.814 13.403 15.027 13.675 12.713 12.036 12.258 13.465 13.546 12.954 11.721 11.917 11.027 10.590 11.004 10.184 8.240 6.954 4.774 + 8.275 11.087 11.944 10.695 9.912 7.531 6.351 7.537 8.165 8.401 8.156 7.377 7.426 7.232 7.213 8.165 9.133 7.941 8.436 8.560 7.716 8.575 8.487 7.989 7.192 6.594 6.793 6.629 5.522 5.275 6.290 7.046 6.094 4.209 4.415 3.324 + 8.540 9.578 11.414 10.476 7.189 7.148 5.187 5.775 5.132 5.790 4.796 3.650 3.308 4.351 5.017 6.091 6.471 5.832 6.381 7.891 6.919 6.294 5.256 5.103 5.075 4.671 5.348 4.262 3.602 4.398 4.794 5.577 4.784 3.522 3.675 3.015 + 10.274 10.127 10.796 10.508 8.355 7.730 5.477 5.375 5.723 6.225 5.869 4.542 4.221 5.584 5.755 6.511 6.500 6.001 6.242 7.192 7.389 5.801 5.117 3.961 4.742 5.912 5.731 3.585 3.269 2.909 4.439 5.397 4.621 4.284 3.586 2.898 + 9.404 10.287 10.832 8.625 7.689 7.831 4.852 4.992 4.890 5.920 5.255 3.549 3.096 4.101 4.982 5.859 5.790 4.787 5.046 6.183 6.368 6.264 5.405 4.530 4.458 4.662 4.758 3.527 3.094 3.398 4.292 5.488 5.119 3.888 3.619 3.557 + 8.677 8.991 9.655 8.012 8.319 8.162 5.592 4.222 4.225 5.691 5.281 3.565 4.691 4.675 5.056 5.185 5.605 6.132 6.637 6.220 7.221 6.832 5.892 4.732 4.954 5.458 5.670 5.716 4.181 4.634 4.553 4.907 5.240 5.338 4.686 3.126 + 8.596 9.191 8.511 7.499 5.611 6.092 5.905 5.442 6.088 6.864 6.586 6.165 5.246 5.272 5.674 6.006 5.939 6.078 6.100 6.299 6.377 6.390 6.463 6.457 6.656 6.168 5.590 5.429 5.245 5.239 4.174 5.247 5.925 5.779 4.726 3.753 + 8.204 9.007 10.221 9.896 8.067 7.675 8.051 8.119 9.201 9.980 10.328 9.664 8.128 6.953 8.472 9.031 9.388 9.626 9.282 9.255 9.008 9.262 9.706 10.106 10.228 9.566 8.603 8.075 8.427 8.380 6.765 7.224 8.284 8.038 7.352 6.165 + 7.789 8.865 9.470 7.836 7.066 6.441 5.752 6.837 6.568 7.627 8.284 7.396 4.803 5.106 6.274 5.959 6.239 7.146 6.051 6.141 6.257 6.263 6.500 7.167 7.286 6.517 5.818 5.272 5.841 5.629 4.822 5.530 5.632 5.491 5.061 4.154 + 7.936 8.785 7.298 5.904 5.746 6.826 6.019 6.605 4.741 4.372 2.930 3.192 3.833 5.022 4.771 3.854 3.526 3.624 5.037 4.663 5.566 4.786 4.846 5.246 4.104 4.728 4.985 4.185 4.432 4.549 3.913 5.250 4.582 5.229 4.264 3.473 + 6.749 6.828 5.366 5.357 6.196 6.599 5.316 5.820 3.996 5.583 6.027 4.417 3.090 4.167 4.554 4.430 4.420 4.429 4.994 5.443 5.971 5.432 5.362 5.510 3.993 4.040 4.085 4.496 5.025 4.460 4.850 5.308 4.219 3.475 3.672 2.740 + 4.752 4.794 5.815 5.830 6.109 6.530 4.755 4.631 3.748 5.027 4.699 3.525 4.106 4.811 5.007 4.955 4.511 4.716 5.120 5.076 6.188 5.599 5.680 4.873 4.299 4.406 5.007 4.541 4.198 4.692 4.229 4.413 4.290 4.292 4.656 3.453 + 4.292 4.598 6.827 6.650 4.848 5.520 5.878 4.560 4.200 5.049 4.728 3.719 3.396 4.487 4.182 3.427 4.175 4.312 4.473 5.710 6.472 4.501 5.506 6.029 5.139 4.243 4.193 4.235 4.087 4.428 4.413 4.909 4.749 4.195 4.819 3.528 + 5.088 5.463 6.752 6.312 4.595 5.102 5.071 4.490 4.939 4.452 3.087 4.206 4.052 6.346 5.930 3.878 5.303 5.123 5.145 5.506 6.939 6.327 6.111 5.535 6.401 4.882 4.228 5.253 4.289 4.379 4.496 5.180 5.004 4.336 4.350 3.450 + 6.446 6.029 5.924 5.803 5.139 6.478 6.139 5.576 4.223 4.242 5.469 4.601 4.908 5.673 5.894 3.604 5.050 6.043 5.926 6.300 6.805 6.534 5.666 5.476 6.576 5.425 4.721 4.902 4.491 4.967 4.733 5.384 4.923 4.906 4.119 3.434 + 6.232 5.724 5.743 6.785 6.152 5.790 6.311 6.225 4.781 4.644 5.025 4.511 3.780 5.998 5.549 2.783 4.080 5.590 5.760 4.953 5.846 5.642 4.801 4.746 5.620 4.479 5.904 6.135 4.920 5.079 5.110 3.873 4.249 4.628 4.272 3.344 + 7.231 6.654 5.675 5.755 4.519 5.160 6.104 6.356 5.841 4.350 3.883 4.944 4.605 6.901 5.981 3.268 4.065 5.640 4.988 5.952 5.752 5.944 6.353 4.987 4.537 4.272 5.229 6.102 5.079 4.795 5.193 5.349 4.778 4.532 3.915 3.459 + 7.653 6.917 5.378 5.627 4.877 5.871 5.750 5.974 5.908 4.890 4.277 5.259 4.642 5.412 5.071 4.294 5.610 5.473 5.839 5.873 5.755 5.333 5.985 6.207 5.510 4.861 4.203 5.927 5.576 5.055 4.694 5.778 5.124 5.345 4.788 3.419 + 5.232 6.149 6.316 5.864 6.885 6.787 5.693 4.223 4.913 4.337 5.565 6.650 5.953 6.632 6.601 5.361 5.600 5.633 5.918 6.428 6.506 6.328 5.922 5.979 5.853 5.139 5.588 5.928 5.408 5.565 5.219 5.451 5.030 5.462 5.143 4.623 + 6.112 6.784 5.425 5.813 7.187 6.980 6.934 5.541 4.993 5.784 5.101 5.375 5.540 6.207 5.839 5.835 5.114 5.864 6.244 6.136 7.182 6.652 6.192 5.874 5.771 6.064 5.922 4.883 4.957 5.251 5.207 5.580 5.000 4.857 4.620 4.458 + 5.540 6.956 6.323 5.747 5.821 6.856 6.826 6.272 5.937 5.269 5.195 6.003 6.630 5.742 6.552 6.794 6.945 7.008 6.379 6.396 6.162 6.243 7.047 5.574 6.566 5.657 5.840 5.622 5.046 5.045 4.553 5.310 5.519 5.192 4.655 3.931 + 7.581 7.919 8.143 6.879 6.618 6.863 6.614 5.296 5.059 5.344 6.071 5.964 5.663 6.533 6.370 6.263 5.633 5.822 6.799 6.743 5.740 7.532 7.308 6.481 6.786 5.905 5.531 6.168 6.088 5.793 4.764 5.242 6.044 5.832 5.385 5.223 + 7.988 6.720 6.266 5.710 5.941 7.584 6.994 6.605 6.107 5.684 5.418 4.742 4.415 6.286 5.981 5.846 5.508 6.437 6.568 6.035 5.616 6.808 7.106 6.075 6.028 5.988 5.185 5.623 5.555 5.612 6.040 6.207 6.209 5.870 4.870 4.708 + 8.739 7.884 5.787 6.864 6.600 7.150 7.452 6.239 5.744 4.698 5.063 4.504 5.593 6.554 6.586 6.782 6.590 6.054 6.384 5.819 6.289 6.931 6.233 5.491 5.598 5.361 5.646 6.475 5.871 4.889 6.191 5.886 6.475 6.299 5.522 4.685 + 8.870 9.056 7.541 6.329 6.065 7.264 7.574 6.405 4.836 3.882 5.184 5.811 5.121 7.140 7.667 6.698 6.010 6.373 6.060 6.270 7.669 7.152 6.821 7.299 6.524 5.904 7.201 6.310 5.333 5.563 6.765 5.849 6.399 6.514 6.018 5.151 + 7.344 8.773 9.272 10.554 11.381 12.212 12.056 10.172 8.702 8.361 8.157 8.278 7.590 6.975 9.379 11.475 11.952 10.308 10.577 10.158 9.891 10.142 10.050 9.995 10.273 9.684 10.051 9.975 9.561 9.293 10.456 8.936 8.310 7.807 8.810 7.564 + 7.350 8.117 8.488 9.729 11.588 13.116 13.670 11.743 9.090 7.293 7.300 7.303 6.543 6.130 9.174 11.937 13.269 11.387 10.004 9.294 8.875 9.255 8.970 9.191 9.401 8.681 10.010 9.406 8.612 8.687 10.791 8.778 7.167 6.878 8.858 8.029 + 6.491 5.953 5.962 6.369 6.622 8.841 11.200 11.653 10.624 8.116 4.233 4.330 3.829 3.616 3.929 7.228 10.409 10.082 6.588 6.280 8.908 9.421 9.410 10.158 8.807 8.779 8.822 8.018 7.845 9.060 9.238 8.353 5.983 9.077 10.385 9.175 + 7.355 5.631 6.798 7.478 6.276 6.653 9.266 8.392 9.090 8.465 6.637 7.229 5.952 6.247 6.790 9.156 10.515 9.676 9.820 8.834 8.679 9.324 9.322 8.888 7.863 7.655 8.058 8.006 7.816 7.713 8.327 7.943 6.669 7.376 8.491 6.766 + 7.068 8.800 8.523 8.128 7.835 10.585 11.749 11.893 11.507 10.757 11.922 11.055 11.467 11.728 12.227 13.216 13.712 11.915 11.493 11.455 10.590 10.257 10.520 11.846 10.823 9.700 8.158 8.679 9.138 9.721 10.079 9.164 7.886 7.067 6.269 6.448 + 10.797 11.421 11.279 11.200 12.004 12.902 13.457 13.606 14.844 16.134 16.435 16.196 15.553 14.957 15.147 15.871 16.601 15.504 13.919 12.594 12.235 12.137 12.038 12.230 11.187 8.962 9.689 9.847 10.067 10.155 12.483 12.958 11.672 8.550 7.385 7.220 + 10.867 12.547 12.175 12.062 11.794 13.252 14.008 13.970 14.916 16.982 17.084 17.491 16.462 15.033 15.027 16.117 17.540 16.979 15.004 13.831 13.235 12.892 13.173 13.645 12.643 11.154 10.833 10.421 10.011 10.228 12.362 12.846 11.684 9.697 7.569 6.038 + 10.783 12.870 12.773 11.823 12.069 13.496 13.756 14.630 15.612 17.023 16.867 17.121 15.616 14.585 14.918 15.806 16.681 17.421 16.406 15.247 14.363 13.771 13.915 15.014 15.317 14.285 12.989 11.515 10.285 11.985 13.474 13.188 11.544 9.882 8.639 6.854 + 11.138 13.328 13.284 12.496 12.994 13.652 14.397 15.509 15.921 17.381 16.620 16.947 15.581 14.956 15.282 15.779 16.013 16.894 16.559 15.522 14.850 14.011 14.310 15.225 15.338 13.828 12.645 11.702 11.507 11.152 12.838 12.837 11.312 9.449 9.288 8.010 + 11.626 13.630 13.871 12.637 13.683 13.951 15.017 16.093 16.728 17.782 17.074 16.442 15.638 15.061 14.882 15.207 15.811 16.703 17.713 17.305 16.162 15.609 15.675 16.226 16.317 14.995 13.905 13.302 12.169 12.190 13.580 13.629 12.403 11.704 11.411 8.663 + 12.003 13.631 14.404 12.651 14.434 14.500 16.241 16.323 17.192 16.712 16.276 15.254 15.025 14.517 14.279 14.103 14.470 15.365 16.654 17.205 16.822 15.559 15.263 15.298 15.410 14.591 13.113 12.714 11.732 11.424 12.061 13.193 12.691 12.345 10.899 7.684 + 12.848 13.466 14.821 13.800 15.512 15.564 17.064 16.460 16.090 15.737 14.763 14.307 14.413 13.476 13.256 13.194 13.970 14.613 15.691 16.967 17.220 16.139 15.533 15.458 15.708 14.378 13.764 13.243 11.673 11.821 12.774 13.624 13.626 13.054 9.918 6.053 + 13.064 12.769 14.764 14.048 15.897 15.635 15.782 15.844 13.318 14.057 12.532 12.664 12.150 12.362 11.854 11.592 12.896 13.452 14.479 16.366 17.066 15.061 14.773 14.779 15.405 14.242 14.118 12.772 10.816 10.456 11.646 12.916 13.150 12.227 8.531 5.257 + 13.967 12.376 14.903 14.880 14.950 16.024 14.040 12.777 12.369 12.950 11.978 11.421 11.412 12.053 10.950 11.148 11.907 12.768 13.793 15.550 15.840 14.544 13.872 13.945 15.077 15.423 14.596 12.267 10.072 9.847 10.976 12.271 12.752 11.082 7.654 5.956 + 14.376 12.286 14.772 16.133 14.746 16.173 15.861 12.973 13.674 12.171 12.076 10.825 11.806 11.350 11.569 11.133 11.998 12.491 13.484 14.773 15.667 15.032 13.245 13.434 14.291 15.696 14.629 11.283 9.468 9.640 10.648 12.126 12.013 11.019 7.970 6.229 + 14.837 13.443 14.047 16.829 16.223 14.902 16.326 14.630 13.576 13.517 11.444 12.060 11.609 12.328 11.750 11.645 12.594 12.692 13.580 14.875 16.258 16.246 15.302 14.609 15.126 16.099 15.605 12.561 11.834 11.337 11.764 13.207 13.467 12.188 8.553 7.554 + 14.885 14.115 12.647 17.160 17.261 14.205 16.229 15.820 13.259 14.547 12.438 12.567 11.702 12.558 11.878 12.053 12.241 13.000 13.464 14.835 16.374 17.562 16.262 15.227 15.987 16.616 15.595 13.382 12.786 11.966 12.357 13.499 14.068 12.967 8.630 8.012 + 14.632 14.194 12.289 16.931 17.484 14.658 15.197 15.847 12.956 14.188 13.057 11.874 12.041 11.768 12.154 11.531 11.675 13.196 12.988 13.653 15.455 17.460 16.685 15.648 15.516 16.074 15.509 13.928 13.666 12.675 12.614 13.597 14.048 12.869 8.766 8.222 + 14.928 14.736 12.202 15.388 17.059 15.626 13.532 15.502 14.097 11.951 12.802 10.831 11.642 10.609 11.425 10.791 11.977 12.223 12.858 13.245 14.897 16.538 17.220 15.716 15.443 15.878 15.592 14.482 14.277 13.156 13.107 14.150 14.675 13.936 9.427 8.437 + 14.823 14.853 11.936 14.160 16.141 14.822 11.886 14.668 13.647 12.352 13.794 11.693 11.124 10.121 11.174 10.389 11.397 10.788 11.752 12.174 13.791 14.864 16.499 15.157 14.487 15.077 14.926 13.739 13.662 12.447 12.444 13.423 13.904 12.863 9.145 8.159 + 14.891 14.832 11.755 13.290 14.931 13.441 11.099 13.936 13.488 11.468 13.577 12.239 10.460 10.204 10.370 10.095 10.705 9.797 10.488 10.767 12.462 13.980 14.933 14.034 13.710 13.285 13.192 12.495 11.820 10.864 11.022 12.298 12.977 10.181 9.211 8.557 + 15.206 15.514 13.540 11.764 13.558 12.332 9.643 11.557 11.270 9.592 12.601 11.343 8.620 9.299 10.035 10.117 10.142 9.720 9.346 9.558 10.432 12.302 11.098 11.211 11.432 9.888 8.903 8.871 8.251 7.474 8.204 10.461 11.649 9.284 8.387 7.925 + 15.425 15.736 13.405 10.646 13.670 12.986 8.867 11.706 11.233 9.878 12.709 11.377 8.144 8.107 9.819 10.044 10.583 10.018 9.591 9.092 9.591 11.287 9.770 11.206 11.569 10.250 8.401 6.924 5.542 5.685 7.212 10.306 11.305 9.315 8.755 8.066 + 15.480 15.558 12.993 11.704 14.091 13.097 9.554 12.015 11.094 10.956 12.987 11.126 9.169 8.440 10.136 9.684 10.999 10.107 10.299 9.845 10.417 11.447 9.966 11.877 11.830 11.070 7.692 6.753 6.817 7.216 7.787 11.176 13.019 9.744 9.089 9.238 + 15.416 15.225 12.332 12.653 14.429 12.854 9.952 12.099 10.563 11.986 12.870 9.868 9.772 8.193 10.089 9.539 10.778 10.325 10.529 10.361 10.763 10.961 10.837 12.235 12.496 11.317 8.590 7.634 7.304 8.156 8.648 11.995 12.864 9.546 9.381 10.151 + 15.078 14.637 11.460 13.262 14.520 12.437 11.276 12.449 9.876 12.667 12.417 8.982 9.828 9.052 9.560 10.167 10.120 10.606 9.869 9.965 10.443 11.125 12.029 12.655 13.657 12.268 11.253 10.753 10.217 10.411 10.956 12.694 13.365 10.817 10.256 10.444 + 14.719 14.050 11.715 13.206 14.138 11.897 12.793 13.241 12.376 13.437 11.500 10.163 9.675 10.447 9.914 10.600 10.280 10.963 9.582 9.024 9.329 10.894 13.587 14.410 13.623 13.643 12.938 13.343 12.044 11.739 12.328 13.924 14.056 11.263 10.570 10.403 + 13.980 12.672 11.251 13.999 13.324 11.360 13.399 12.424 12.733 13.100 10.987 11.767 9.651 10.162 10.394 10.423 11.125 10.340 9.186 8.529 9.296 11.353 13.810 14.831 13.468 13.182 13.540 14.370 13.568 12.723 13.252 14.948 14.168 10.419 9.179 9.040 + 13.705 12.077 12.067 14.155 12.935 12.125 13.088 10.873 12.764 12.057 11.597 11.659 9.309 9.277 10.589 10.113 10.288 10.269 9.020 8.397 9.116 10.936 13.254 14.313 13.501 12.482 13.240 14.687 14.078 13.178 13.694 15.026 13.855 10.903 10.453 9.495 + 13.786 11.891 12.908 14.327 12.584 12.710 12.798 10.699 12.509 10.900 11.864 10.824 9.147 9.185 10.150 10.049 9.724 10.109 8.953 8.462 9.089 11.377 12.847 13.939 13.114 12.225 12.891 14.224 14.011 13.079 13.992 15.252 13.525 10.767 10.482 9.609 + 13.772 11.539 13.564 14.415 12.171 13.148 12.523 11.281 12.146 10.469 11.435 9.334 9.227 9.825 9.859 10.142 9.762 9.587 8.663 8.657 9.817 11.272 12.569 14.307 13.128 12.171 13.195 13.956 13.700 13.111 14.185 15.645 13.315 10.965 11.070 10.200 + 13.399 11.162 13.766 14.281 11.959 13.480 12.312 11.801 12.052 10.944 11.371 9.573 9.582 9.911 9.695 9.716 9.882 9.210 9.168 9.638 10.736 12.076 14.038 15.095 13.418 13.109 13.568 13.612 12.835 12.530 14.237 15.058 13.352 10.583 11.030 10.301 + 13.282 11.851 14.282 14.297 12.410 13.973 12.443 12.231 11.869 11.493 11.188 10.378 9.993 9.928 9.976 10.062 10.203 10.356 10.637 11.292 12.193 13.877 15.417 15.228 13.540 11.674 11.663 11.099 10.187 10.550 12.442 13.064 11.541 9.525 10.673 9.871 + 12.843 12.167 14.523 14.054 12.828 14.173 12.063 12.178 11.183 11.516 10.347 10.471 9.510 9.442 10.484 10.283 10.538 11.270 11.431 12.073 12.761 13.432 13.660 14.003 12.098 8.637 8.542 8.152 8.355 8.979 11.949 12.143 10.318 8.557 10.798 9.348 + 12.560 12.667 14.651 13.749 13.297 14.030 11.837 11.790 10.558 11.212 9.167 9.593 9.079 9.507 10.730 10.403 10.714 11.394 11.990 12.072 11.826 11.807 12.268 12.945 10.926 7.980 7.403 6.572 6.862 7.368 10.351 10.061 8.371 7.597 9.821 8.030 + 12.113 13.440 14.728 13.142 13.705 13.365 12.118 11.705 11.362 11.097 10.817 10.006 10.137 9.461 9.611 9.657 10.330 11.500 12.334 12.416 11.135 10.963 11.581 12.603 10.808 8.032 7.142 7.089 7.397 7.904 9.061 8.326 7.791 7.263 7.776 5.918 + 11.671 14.012 14.755 12.870 13.956 12.918 12.809 11.422 11.533 11.074 11.390 10.346 10.087 8.963 8.651 9.756 10.336 10.992 11.633 12.179 11.562 11.100 12.048 12.424 10.875 8.848 8.115 7.246 8.777 9.931 11.367 10.434 9.107 8.617 10.571 8.843 + 11.685 14.440 14.593 13.121 13.925 13.317 13.581 11.616 11.491 11.824 10.851 10.003 9.460 9.113 9.215 9.913 10.059 10.068 10.574 11.949 12.664 12.556 12.590 13.174 12.621 9.518 8.348 7.915 8.673 9.717 11.444 10.604 9.241 8.172 9.538 7.803 + 12.330 14.742 14.379 13.416 13.426 14.357 13.897 11.532 11.649 12.044 10.692 9.910 9.125 8.793 9.538 9.491 10.215 10.064 11.054 12.436 14.436 14.802 14.001 14.293 13.870 12.317 10.145 10.191 9.919 9.965 12.079 10.799 10.441 9.386 9.403 8.282 + 13.150 14.815 13.871 12.951 12.878 14.021 13.128 11.602 11.291 11.194 10.975 10.021 8.446 8.628 8.903 8.522 9.397 9.454 9.945 11.080 13.318 13.937 12.957 13.084 13.385 13.362 11.039 10.257 10.285 10.509 12.465 12.362 12.018 8.513 9.238 8.768 + 13.920 15.186 13.965 12.780 12.245 12.527 9.997 9.906 9.556 9.575 9.530 8.228 7.642 6.531 7.594 7.538 9.128 8.999 8.564 9.070 9.794 9.797 8.185 9.054 10.500 10.787 8.878 7.468 7.351 7.312 8.705 10.751 11.293 8.239 7.470 7.882 + 14.268 15.153 13.554 12.281 12.494 12.244 10.081 9.235 8.967 9.815 8.316 7.891 8.338 6.034 6.823 7.080 8.481 8.978 8.641 9.044 10.556 9.869 6.892 7.987 9.401 11.104 9.982 7.241 8.468 8.199 6.138 9.835 10.646 8.363 8.808 9.193 + 14.394 14.887 13.349 12.561 12.832 11.912 10.320 9.036 9.008 9.788 8.979 9.574 9.109 6.625 7.071 7.524 8.427 8.593 8.384 8.733 9.748 9.489 6.857 8.129 9.532 10.262 9.864 6.967 8.099 8.465 6.762 9.771 10.386 8.461 9.446 9.564 + 14.182 14.350 13.055 12.504 12.509 11.092 10.271 8.929 9.364 9.685 9.074 9.201 7.656 6.103 7.473 7.817 7.597 7.493 7.038 7.513 9.364 9.379 7.440 8.613 10.009 10.201 9.737 7.276 7.820 8.230 7.802 10.451 10.949 9.791 9.199 8.977 + 13.271 12.934 12.307 11.761 11.058 9.155 9.769 9.490 9.984 9.624 8.915 9.020 7.412 5.202 6.792 6.964 6.848 7.836 7.522 7.738 9.015 8.956 8.311 8.883 9.416 9.462 8.919 6.998 6.648 7.681 7.615 7.631 9.471 9.561 8.713 8.240 + 11.288 10.542 11.012 9.366 8.337 7.955 7.653 7.362 8.614 8.441 8.851 7.605 6.939 6.157 7.521 7.569 7.599 7.657 7.084 7.089 7.848 8.086 7.865 8.438 8.600 8.392 8.036 7.254 6.743 6.573 6.000 6.089 6.865 7.846 7.611 6.122 + 9.718 9.983 8.713 8.510 7.203 6.494 5.932 7.293 7.441 7.980 7.711 5.908 4.829 4.746 4.676 5.399 5.916 7.244 5.861 5.037 6.725 6.708 5.999 6.579 7.335 7.048 6.770 5.835 5.288 5.005 5.258 5.404 5.901 6.057 5.749 5.457 + 6.169 7.964 8.145 6.215 4.007 5.219 5.293 5.373 7.335 8.687 8.370 6.182 5.027 4.510 3.987 4.878 5.439 6.458 6.728 5.776 5.447 5.735 5.902 6.993 7.270 6.733 6.258 5.866 4.387 4.429 4.899 5.287 5.827 6.011 5.277 4.790 + 5.266 5.508 6.676 5.936 5.346 5.751 4.193 4.647 6.135 7.998 7.957 5.864 4.151 5.426 4.083 3.944 4.664 5.065 5.387 4.850 4.448 5.178 4.788 5.903 6.033 6.242 5.876 5.108 4.257 4.781 4.888 5.714 5.267 5.430 4.599 3.841 + 7.177 7.750 7.767 8.226 8.391 8.504 8.319 8.402 8.424 8.478 8.263 8.279 7.959 8.306 8.267 8.367 8.689 9.038 9.040 9.450 9.416 9.689 9.781 9.919 9.988 9.961 11.023 12.453 12.653 11.905 10.999 10.780 9.709 9.285 8.795 7.993 + 8.187 9.416 8.936 10.350 9.875 10.652 10.008 10.165 9.928 9.912 10.146 10.036 10.076 10.466 10.909 11.150 11.659 11.745 11.725 11.250 10.451 11.690 11.816 12.048 12.111 12.932 14.932 15.506 15.677 14.308 14.447 14.661 15.484 15.447 13.734 13.702 + 9.575 8.608 9.385 9.976 9.163 9.874 9.888 8.983 9.032 9.501 8.776 9.260 8.709 9.533 10.043 10.291 11.271 11.061 11.297 11.573 11.254 13.199 12.729 13.026 13.016 15.009 17.074 16.090 17.536 17.930 17.272 17.452 17.022 17.179 17.525 16.851 + 8.997 9.787 8.415 7.464 9.169 9.528 8.407 7.515 9.858 9.769 7.388 8.458 9.269 9.752 10.118 9.690 10.480 10.336 10.055 10.203 11.604 12.987 12.776 14.402 14.725 17.889 18.296 17.647 18.942 18.874 17.737 18.073 18.047 17.779 18.607 18.157 + 9.187 10.004 9.868 9.376 9.233 10.478 8.997 6.586 9.391 8.989 9.663 9.626 9.282 10.201 10.402 9.019 9.956 11.459 10.905 9.678 13.184 14.910 13.787 14.696 16.490 18.066 17.978 18.153 19.090 18.180 18.254 18.161 17.660 17.243 18.254 18.275 + 10.007 9.552 10.456 10.003 10.062 9.940 8.639 7.889 9.949 9.688 8.263 8.201 9.543 11.023 10.469 10.502 10.442 10.304 10.322 11.901 13.130 14.407 14.571 15.041 16.206 18.156 17.889 17.301 18.617 18.602 16.949 16.840 17.155 17.677 17.344 16.889 + 11.542 9.885 10.192 9.386 9.498 8.077 8.061 8.723 9.358 9.228 7.986 8.509 9.802 10.021 9.893 9.434 10.349 11.239 10.748 12.999 14.619 15.955 13.939 14.959 15.831 16.946 17.237 16.669 17.751 17.274 16.662 16.428 17.039 16.481 17.000 16.731 + 13.170 11.763 9.999 9.680 10.146 10.058 10.303 9.115 9.312 9.149 9.178 9.930 9.943 9.292 9.601 9.552 9.565 10.645 11.110 12.715 14.337 16.092 14.040 14.734 16.472 17.825 17.415 15.946 17.998 17.701 16.838 16.517 16.438 16.936 16.921 16.607 + 11.555 9.718 8.968 10.504 10.040 9.709 9.224 9.627 8.656 9.205 9.361 9.121 9.149 9.687 8.937 8.585 8.313 9.949 11.954 12.410 14.728 14.667 12.560 14.348 16.638 18.739 17.007 15.662 16.615 16.588 15.695 15.795 14.005 15.324 14.578 14.006 + 12.064 10.366 10.201 9.953 9.421 7.347 8.786 9.531 7.842 7.171 7.769 8.441 6.909 7.421 7.365 7.868 7.347 8.949 9.207 10.667 12.153 12.727 12.428 12.921 14.478 16.191 14.464 13.713 13.495 12.638 12.289 12.520 11.580 11.218 11.055 10.406 + 13.390 13.482 13.527 13.531 14.859 15.080 15.323 15.456 14.373 13.473 13.306 13.418 12.903 11.820 11.836 12.143 12.734 12.869 13.288 14.039 14.747 14.878 13.537 13.183 13.828 13.939 12.816 12.147 11.763 10.598 9.445 10.057 10.931 11.038 10.755 9.004 + 13.282 14.341 15.143 13.426 15.908 16.491 17.726 18.255 16.730 15.476 15.593 14.974 14.923 14.645 14.254 14.331 14.708 15.024 15.731 17.014 18.157 17.600 15.990 15.852 16.240 16.127 15.094 14.061 12.923 10.888 12.240 13.352 12.964 11.833 11.702 10.217 + 12.231 14.033 14.810 13.925 15.040 15.802 18.615 18.525 18.432 17.165 16.106 15.423 14.734 14.736 14.584 14.747 14.844 15.195 16.172 17.676 19.046 18.099 16.595 16.405 16.776 16.915 15.605 14.868 14.003 12.601 15.126 15.590 14.529 13.646 12.384 11.240 + 11.273 13.943 13.982 14.193 15.142 16.231 17.382 18.665 19.510 17.295 15.544 15.954 15.736 14.948 14.805 15.143 15.454 15.399 16.678 18.180 19.553 18.615 16.555 16.514 16.072 16.613 15.554 15.012 14.097 14.089 16.005 16.096 15.259 14.516 12.250 10.016 + 11.168 13.930 13.278 14.316 14.288 14.994 15.909 18.890 19.129 18.644 16.501 15.984 15.629 15.143 14.722 15.258 15.363 15.351 16.666 18.178 19.225 18.217 16.684 16.598 16.414 15.679 14.669 14.449 13.370 14.575 16.408 17.097 16.530 15.905 13.013 10.996 + 11.468 13.507 12.820 13.771 13.367 14.620 16.095 17.561 18.528 18.748 15.665 15.044 14.675 14.829 14.778 14.717 14.718 15.552 16.263 18.017 18.852 17.563 16.855 16.271 16.159 15.186 14.466 13.944 12.758 15.119 16.128 16.994 16.484 15.746 13.130 11.591 + 10.888 12.998 12.080 13.415 13.293 14.388 15.993 16.735 18.725 18.151 15.044 15.223 14.697 14.484 14.403 14.279 14.545 15.282 15.646 17.488 18.505 17.605 16.757 16.103 16.050 14.651 13.904 13.517 12.715 14.655 15.693 16.151 16.197 15.619 12.852 11.540 + 11.382 12.984 12.412 13.535 13.455 14.808 16.548 17.001 18.262 17.042 14.340 13.891 13.957 13.876 13.453 13.375 14.103 14.056 14.922 16.046 17.650 17.272 15.847 15.461 15.371 13.925 12.839 12.458 12.019 12.953 14.088 14.780 14.928 14.784 12.840 11.260 + 11.589 13.050 12.536 13.029 13.589 14.745 16.390 16.538 16.357 14.651 13.895 11.500 11.718 11.060 10.580 10.005 11.196 10.952 12.000 13.256 14.454 15.761 14.617 14.343 14.353 13.758 12.539 11.902 11.255 9.523 12.352 13.420 13.414 13.691 12.496 10.473 + 9.039 10.432 10.452 10.366 11.916 13.809 14.400 13.218 11.843 12.004 10.712 8.278 8.681 8.871 8.644 7.380 8.828 8.465 9.026 10.518 11.432 12.362 13.156 12.893 12.872 12.597 11.081 10.820 9.891 9.443 10.707 11.019 12.143 12.376 11.485 10.178 + 7.916 8.373 7.716 5.247 7.151 8.153 9.524 10.491 11.435 10.535 8.539 7.204 6.587 7.371 7.908 6.446 6.724 6.979 8.057 8.516 9.587 9.918 10.641 10.146 8.949 8.879 8.107 7.953 6.735 7.355 9.016 8.302 8.672 8.216 7.361 7.475 + 4.548 6.485 6.067 6.335 7.046 7.860 9.817 10.919 10.927 10.134 7.641 5.092 6.320 5.538 5.944 4.443 4.321 4.207 6.871 8.790 9.594 9.164 7.913 6.894 7.466 7.639 7.659 7.144 6.976 7.616 7.929 8.336 7.392 7.514 6.222 5.433 + 5.047 6.619 5.641 4.940 6.207 7.491 8.495 9.491 9.845 8.789 5.865 5.334 5.692 5.501 4.870 4.099 5.013 4.250 6.597 8.767 9.386 9.100 7.995 7.489 7.699 6.662 6.476 5.990 6.377 6.932 7.653 7.975 7.486 7.198 6.860 5.897 + 4.473 5.780 5.762 6.193 6.087 7.204 8.469 7.559 8.058 7.851 5.099 4.818 5.151 4.516 5.303 5.426 6.458 6.954 7.366 7.939 10.045 9.661 8.194 7.736 9.343 9.803 10.790 11.226 11.326 11.359 11.405 10.692 9.541 8.536 8.318 8.059 + 5.661 4.482 6.384 6.459 5.148 6.217 8.303 8.172 9.737 8.721 5.732 5.559 5.208 5.488 6.737 7.634 7.735 8.115 8.383 8.209 9.575 8.976 8.644 7.844 9.923 10.161 11.304 11.738 11.864 11.854 11.844 11.042 9.746 8.818 9.109 8.967 + 3.973 5.144 5.087 5.057 5.873 6.956 7.607 9.010 9.894 8.549 6.362 4.324 5.405 4.623 4.594 4.971 6.103 6.899 6.753 7.232 8.097 7.308 6.551 6.340 6.995 6.883 5.691 6.217 6.639 6.298 6.598 7.761 7.608 5.535 6.148 6.093 + 4.364 4.413 5.313 3.612 4.044 5.448 7.919 8.116 9.619 9.619 7.515 5.755 5.026 4.368 5.236 4.990 6.139 6.311 6.224 7.160 7.729 7.665 5.114 6.440 6.637 6.684 5.978 4.824 6.407 6.643 8.088 8.317 6.850 6.452 6.538 5.887 + 4.518 4.949 4.432 5.351 6.307 6.820 7.560 8.428 9.551 9.240 6.016 5.897 4.844 4.618 5.130 4.591 5.777 6.196 7.147 8.477 9.272 8.508 6.038 6.216 6.244 6.028 4.977 5.616 6.140 6.272 7.923 8.075 8.127 7.067 6.408 5.024 + 7.827 7.798 7.764 8.877 9.092 9.406 9.832 8.784 9.233 9.278 10.018 9.928 9.861 9.488 9.500 9.995 10.497 11.397 11.951 12.093 11.923 11.148 10.513 10.578 11.247 12.235 13.060 13.410 12.718 13.485 14.567 14.549 13.523 12.884 13.394 12.694 + 8.810 6.895 6.662 9.110 10.047 10.460 11.155 10.492 9.788 10.861 10.795 10.721 10.815 10.887 10.465 11.185 11.307 12.120 12.650 12.661 12.474 12.145 11.605 11.441 12.016 12.687 13.460 13.804 13.288 14.203 14.761 14.735 13.803 13.252 13.494 12.467 + 5.572 6.135 5.329 4.889 7.150 8.105 7.144 6.715 8.065 8.135 8.261 7.913 7.653 7.731 7.921 7.713 7.917 8.300 8.792 8.908 8.686 8.934 8.262 7.869 8.502 9.379 10.142 10.115 10.453 11.978 12.283 11.748 12.196 11.554 10.731 10.752 + 6.582 8.436 9.271 9.064 8.386 9.860 9.691 9.518 9.159 9.386 9.679 8.862 8.510 8.802 8.332 8.603 8.897 8.540 8.613 8.455 8.639 8.655 8.044 7.938 8.647 9.425 10.211 10.529 11.377 12.919 13.735 13.694 12.897 12.342 12.151 11.583 + 9.358 10.652 11.044 12.306 12.736 12.892 11.945 10.724 10.178 10.993 10.644 9.475 9.737 9.447 9.261 9.972 9.524 8.786 9.482 9.595 10.331 11.372 10.528 10.187 9.922 10.628 11.958 12.244 12.352 12.611 12.671 13.086 12.946 12.099 12.751 12.251 + 12.363 12.513 12.988 13.954 15.119 15.658 14.187 13.000 12.349 12.192 11.256 10.426 9.935 10.188 10.014 10.153 10.225 10.394 10.792 11.890 13.840 14.923 13.371 11.717 11.506 11.928 10.959 12.345 12.591 12.224 14.552 15.694 14.807 13.679 10.818 9.151 + 12.655 12.800 13.364 14.013 15.427 16.218 16.239 14.454 12.968 12.923 12.359 12.020 11.391 10.847 10.962 10.794 11.116 11.546 11.671 13.066 15.077 15.294 13.285 11.964 12.152 12.772 11.496 11.904 12.788 12.399 13.678 14.705 13.525 13.051 11.243 9.796 + 12.781 12.881 13.581 13.537 14.286 16.823 16.719 14.856 13.715 13.848 13.274 12.130 11.152 11.127 10.439 10.816 11.190 11.179 12.026 13.086 14.623 14.472 12.982 12.054 12.660 12.337 12.577 13.248 12.804 12.365 14.174 15.068 13.730 12.205 11.248 10.191 + 12.676 12.666 13.453 13.152 13.916 16.113 16.728 16.972 14.226 13.484 13.344 12.781 12.147 12.145 11.792 11.923 12.420 12.274 13.704 14.810 16.150 14.684 13.178 12.531 12.693 11.797 13.112 13.730 12.617 12.004 13.922 15.259 14.362 13.556 10.550 7.822 + 12.492 12.467 13.307 12.867 13.469 14.562 17.047 17.031 15.130 14.811 14.244 13.079 11.877 12.511 12.325 12.367 13.236 13.045 14.650 16.112 16.893 14.575 13.137 12.785 11.797 11.989 13.405 13.698 12.113 11.607 14.004 15.396 14.484 14.007 11.422 8.236 + 12.389 12.294 13.083 12.496 13.524 14.451 16.856 16.942 15.895 14.883 14.148 12.779 12.288 12.580 12.220 12.725 13.093 13.752 15.622 16.534 15.655 14.082 13.157 12.114 11.321 12.546 13.647 13.069 11.733 11.131 14.362 15.635 14.438 13.542 10.830 9.409 + 12.488 12.555 12.933 12.519 13.599 15.065 16.575 16.916 16.325 14.948 13.744 12.461 12.574 12.643 12.299 12.926 12.962 14.499 15.523 15.127 13.282 11.923 11.230 10.939 11.067 13.501 14.305 12.666 11.464 9.744 13.464 15.391 14.400 13.204 10.806 9.513 + 12.260 12.402 11.833 11.493 12.984 13.329 14.545 16.056 14.094 13.677 13.654 12.966 11.541 11.059 11.938 11.770 13.722 14.464 13.972 13.081 12.035 10.616 10.172 11.158 11.720 13.939 13.189 11.500 10.435 10.013 11.858 14.251 13.634 11.848 11.849 10.854 + 9.775 9.720 10.231 11.181 11.462 9.794 13.045 14.242 13.749 14.267 13.092 11.935 12.014 10.820 11.273 11.569 12.981 13.887 14.323 12.527 11.167 10.160 9.725 9.569 10.873 13.151 11.353 9.949 9.471 10.331 12.375 12.684 11.835 10.323 10.734 10.287 + 8.740 9.607 8.559 6.881 9.028 8.733 8.720 9.929 9.261 10.730 9.994 9.032 7.723 7.340 8.299 8.988 9.237 9.889 11.099 10.419 8.889 9.078 8.554 9.142 10.237 10.936 10.434 11.304 12.903 13.744 15.016 14.787 14.124 16.390 16.503 14.476 + 9.314 8.760 7.533 8.333 8.413 7.751 8.008 7.645 7.576 9.063 8.346 8.631 8.119 8.595 8.258 9.201 8.895 8.590 9.535 9.291 9.576 8.530 8.162 9.489 10.528 10.996 11.442 11.882 14.255 14.564 16.306 15.735 15.083 18.373 19.025 17.276 + 8.797 7.824 7.555 6.980 7.879 8.233 7.271 8.049 8.044 8.178 7.771 9.134 8.119 7.323 6.814 8.026 7.329 6.680 8.968 8.831 8.392 6.445 7.882 8.715 9.288 11.717 11.000 11.920 13.207 14.449 15.263 15.646 16.320 18.148 18.042 17.250 + 6.563 7.387 8.228 6.946 9.044 9.414 8.639 8.504 7.504 7.415 8.080 8.280 7.665 8.212 7.068 7.646 7.125 8.336 9.536 8.547 7.951 8.352 8.815 8.499 9.001 11.161 10.843 11.526 12.405 13.995 15.259 16.292 17.015 18.378 17.792 16.407 + 7.071 7.483 8.181 7.968 8.747 8.010 7.364 8.944 8.913 8.900 7.936 6.516 6.790 7.304 7.379 7.173 6.776 7.412 8.776 8.962 9.652 8.876 9.030 8.914 9.526 10.671 10.461 10.671 12.028 13.425 14.241 15.200 16.431 17.280 16.684 16.553 + 6.397 5.738 6.469 6.491 6.566 6.944 8.371 8.820 6.453 6.145 5.993 6.787 7.582 6.974 6.285 7.442 7.326 8.023 6.965 8.068 8.397 8.312 8.281 8.782 8.514 7.929 9.384 9.929 10.818 11.304 12.818 12.568 14.044 14.911 14.923 13.628 + 2.985 4.878 5.874 7.518 9.305 8.668 9.183 8.730 6.397 6.846 7.818 6.738 6.832 6.621 7.596 6.416 5.436 6.625 7.293 7.361 7.509 7.279 5.673 7.068 6.916 8.249 7.689 8.372 8.744 9.287 10.513 10.240 11.298 11.547 12.185 10.662 + 4.881 5.000 5.681 9.043 10.146 8.473 6.665 6.488 6.050 9.189 9.149 5.631 5.087 8.456 8.851 6.258 6.342 8.759 7.675 7.059 7.490 7.296 7.196 7.476 7.707 8.205 8.296 9.581 9.227 10.235 11.296 11.587 11.502 10.047 9.993 8.897 + 3.609 6.233 8.085 9.620 9.855 8.449 7.602 7.963 7.175 9.231 8.651 6.716 7.776 7.816 7.691 8.108 8.164 8.413 7.442 8.505 8.662 8.265 8.579 8.205 9.837 9.689 10.404 11.219 13.096 13.329 12.912 14.033 12.914 11.739 11.973 11.025 + 5.953 8.489 9.305 8.336 8.985 7.746 8.593 8.746 7.685 8.667 7.452 8.063 8.107 6.824 6.383 8.071 8.416 8.127 7.895 9.527 9.470 9.937 9.972 11.628 12.730 13.536 14.093 13.621 15.750 16.444 16.030 15.421 15.287 14.547 13.824 13.092 + 7.918 9.333 10.244 10.189 11.389 10.781 10.535 11.098 11.818 11.542 11.082 10.835 10.733 10.307 10.574 10.756 10.434 10.230 10.323 11.338 11.737 12.164 12.229 13.075 14.482 14.741 16.018 15.739 17.400 17.038 17.012 16.911 16.224 15.806 15.913 14.876 + 9.126 7.676 10.529 11.445 11.619 12.137 12.546 11.664 12.130 12.086 12.456 12.165 12.014 11.397 11.788 11.911 11.147 11.430 11.445 11.962 13.121 12.862 12.819 13.030 14.461 16.397 16.275 15.976 16.885 16.383 16.848 15.635 15.985 15.130 14.834 14.226 + 12.652 13.212 12.228 13.330 14.278 14.517 12.757 12.455 12.148 11.881 10.857 9.647 10.401 10.076 10.174 9.834 10.722 11.268 12.248 12.932 11.811 11.495 11.769 11.280 14.521 14.772 14.054 13.041 12.514 12.365 13.625 12.717 11.836 12.068 11.495 11.550 + 13.199 13.328 13.776 14.441 15.434 15.980 13.979 12.841 12.757 12.676 11.242 10.978 10.943 10.585 10.965 11.192 11.764 12.185 13.987 14.548 13.469 12.355 12.446 12.249 12.596 11.686 9.408 8.507 9.697 9.694 12.065 11.717 11.574 10.160 9.247 6.493 + 13.942 13.200 13.072 13.896 15.060 15.982 13.882 12.099 12.622 12.301 10.852 10.984 10.506 10.460 10.946 10.728 11.396 12.772 14.602 15.122 13.922 12.939 13.058 11.637 9.886 10.601 8.920 9.497 10.161 11.632 13.071 13.361 12.570 10.113 7.017 5.681 + 13.313 13.191 12.698 13.351 14.699 15.051 12.269 12.066 11.216 9.483 9.964 10.156 8.977 10.010 9.919 10.709 11.204 12.295 14.257 14.489 12.765 12.084 11.738 11.694 11.875 12.178 11.007 9.349 10.341 11.628 11.858 12.120 11.224 8.566 7.587 6.811 + 11.292 11.413 11.738 11.645 12.598 12.720 10.993 8.999 8.565 7.287 6.504 7.253 6.589 6.562 7.288 7.980 8.574 9.781 12.636 12.897 10.406 10.050 10.696 10.464 10.154 9.787 8.904 7.286 8.252 9.162 9.739 9.794 8.544 7.394 6.855 6.223 + 10.124 9.616 9.203 8.296 7.837 7.778 6.298 6.909 6.083 4.530 6.603 6.287 3.920 4.459 4.058 4.226 6.222 6.932 8.551 8.167 7.029 6.019 7.120 7.473 8.788 8.300 7.107 5.531 7.459 7.108 9.288 7.766 6.393 6.492 6.746 6.344 + 10.093 10.003 10.160 9.606 7.888 5.701 4.611 4.998 4.653 5.058 5.220 4.839 3.590 3.367 4.129 5.392 4.887 6.051 6.894 7.572 7.699 6.531 7.622 8.113 9.031 8.481 6.972 7.222 6.977 8.064 8.505 7.263 6.971 7.168 8.031 7.667 + 9.935 9.307 9.362 9.786 7.502 8.270 7.243 6.826 7.571 6.923 6.633 6.219 5.806 6.119 6.368 6.471 6.642 7.817 9.361 8.349 7.590 7.630 7.726 9.401 9.511 9.672 9.537 9.097 8.922 8.667 8.641 8.083 7.810 7.602 7.422 6.306 + 12.354 11.662 11.936 12.013 13.414 14.206 13.642 11.220 11.134 11.805 11.427 9.721 10.027 11.253 11.151 10.440 12.039 12.536 14.224 15.135 14.507 13.184 12.898 13.223 13.338 13.668 13.386 13.002 12.296 13.204 13.550 13.721 13.046 12.336 9.994 8.006 + 12.909 12.274 12.642 12.539 13.914 16.177 15.234 14.688 14.674 13.342 11.421 12.385 11.640 11.611 12.045 11.938 12.840 13.135 15.075 16.414 16.164 13.868 13.302 13.762 14.268 13.263 12.169 11.163 10.442 12.805 13.013 14.151 13.517 12.990 11.911 10.338 + 12.924 12.160 12.741 12.368 14.146 15.868 16.622 15.983 14.557 13.788 11.673 12.150 11.920 11.638 12.193 12.276 12.935 13.415 14.852 16.967 16.642 14.096 13.601 13.827 14.316 13.476 12.201 10.638 9.612 11.261 12.204 14.056 13.938 13.418 11.472 10.425 + 12.942 12.268 12.900 12.806 14.326 15.902 17.218 16.633 14.885 14.231 12.698 12.487 12.357 11.942 12.363 12.591 13.180 13.584 14.594 16.420 17.100 15.131 14.251 14.185 14.716 14.079 12.662 11.366 10.376 11.539 12.512 14.229 14.034 13.240 10.835 10.637 + 13.002 12.878 12.996 12.603 14.545 16.034 17.128 15.879 14.828 14.274 12.689 12.185 12.291 11.764 12.219 12.098 12.858 12.919 14.087 15.796 17.149 15.675 14.677 14.479 15.137 14.536 12.847 11.572 11.512 13.289 13.647 13.589 13.971 13.571 11.565 11.192 + 12.996 12.976 13.107 12.308 14.690 15.690 16.745 15.247 14.082 13.706 12.395 11.652 11.842 11.264 11.415 11.124 12.238 12.723 13.275 14.626 16.495 16.318 14.999 14.419 14.352 13.397 11.477 11.675 12.164 12.649 14.491 14.431 13.079 12.196 10.370 10.297 + 12.988 12.898 13.039 11.880 14.982 15.675 16.039 14.608 13.657 13.071 11.712 11.392 11.393 10.674 11.368 11.005 12.010 12.355 13.340 14.053 15.673 15.742 14.555 14.562 14.696 13.307 12.302 11.415 11.435 12.414 13.956 14.016 13.309 12.982 10.947 9.914 + 12.894 12.596 12.965 11.438 15.169 15.869 15.205 13.753 13.206 12.670 11.282 10.893 11.191 10.477 10.994 10.643 11.609 11.859 12.683 13.411 15.126 15.756 15.060 14.904 14.141 12.574 11.675 10.602 11.072 11.774 13.642 14.313 13.095 12.963 10.444 8.367 + 12.741 12.379 12.810 11.862 15.097 15.611 14.098 13.113 12.581 12.211 10.961 10.409 10.683 10.406 10.651 10.467 11.376 11.611 12.657 13.388 15.422 15.975 15.514 15.103 13.168 11.369 10.539 9.370 10.743 11.475 13.338 14.195 12.966 13.240 10.751 8.396 + 12.763 12.723 13.117 13.634 15.401 15.328 12.785 12.309 11.976 11.556 10.311 10.207 10.248 10.126 10.732 10.938 11.627 11.721 13.661 14.677 14.362 14.715 14.907 13.479 11.703 10.882 8.909 8.881 9.259 10.279 12.783 14.421 13.617 13.895 11.765 8.781 + 12.886 13.130 13.597 14.413 15.469 15.056 12.100 11.901 12.101 11.721 10.797 11.006 10.795 10.822 11.862 12.871 12.664 11.956 11.681 11.375 10.992 12.011 12.745 12.107 10.691 10.332 8.014 7.349 8.297 9.106 11.068 12.879 11.948 11.879 9.873 8.389 + 12.762 12.937 13.017 13.995 14.577 14.445 11.603 11.553 11.925 11.236 10.813 11.725 12.273 12.789 11.602 10.366 10.091 9.547 9.773 9.779 8.033 9.485 10.845 10.069 8.910 9.552 6.813 6.813 6.665 8.141 9.533 11.831 11.156 11.386 9.032 7.826 + 12.527 12.125 12.238 13.905 13.958 13.825 11.254 11.830 11.830 10.946 11.550 11.992 11.843 11.560 10.416 9.138 7.517 8.264 8.395 8.652 6.463 8.413 10.006 9.945 8.715 9.076 6.346 6.582 7.246 7.764 9.012 11.642 11.204 11.221 9.201 7.665 + 12.515 11.856 12.652 14.038 13.972 13.947 11.369 12.040 11.960 11.490 11.567 12.200 11.997 10.461 9.604 8.711 7.943 8.294 8.094 7.917 7.510 8.810 10.533 10.296 8.312 8.389 6.325 6.663 7.855 8.269 9.558 11.763 11.298 11.345 9.077 7.259 + 12.279 11.947 12.664 14.286 14.710 14.686 12.220 12.525 12.368 12.279 12.023 13.313 12.752 10.805 9.843 8.605 8.623 8.697 8.551 8.008 8.487 9.607 11.437 10.832 8.462 8.378 7.427 7.352 8.730 9.487 10.610 12.268 11.585 11.666 8.949 7.407 + 12.213 12.382 12.939 13.979 15.107 15.798 13.812 13.183 13.189 13.054 12.410 13.479 14.077 13.079 11.231 10.151 9.354 9.062 8.870 8.701 9.002 10.417 12.072 11.223 9.212 7.964 7.263 7.503 9.013 8.752 11.596 12.219 12.091 11.672 9.117 6.901 + 12.885 13.008 13.436 13.535 14.848 16.529 15.282 13.733 14.058 13.637 12.233 13.143 14.225 13.723 13.302 11.369 10.628 10.544 10.688 10.138 9.956 11.299 13.185 12.314 9.900 8.807 8.803 9.265 10.195 9.490 12.129 12.496 12.768 12.090 9.930 7.925 + 13.045 12.823 12.862 12.206 14.926 16.597 15.540 15.785 15.146 14.292 12.524 13.552 13.906 14.780 15.108 13.377 12.001 11.173 11.220 10.570 10.652 11.490 13.166 12.730 10.999 10.259 8.583 9.763 10.138 9.450 11.998 12.126 11.626 11.579 10.277 8.343 + 12.529 12.285 12.442 12.624 14.360 15.524 16.657 16.131 15.528 14.929 13.405 13.699 13.969 14.663 16.203 14.742 14.214 12.744 12.169 11.573 11.442 11.634 13.216 13.359 11.187 10.515 9.968 10.414 10.107 10.374 12.203 11.563 10.987 11.075 10.125 9.195 + 12.434 12.209 12.962 11.960 13.808 14.834 16.909 17.536 16.763 15.054 13.386 13.929 13.816 13.972 15.403 16.438 15.689 13.271 12.585 11.700 11.614 12.448 14.104 14.231 12.285 11.055 10.803 11.083 10.237 10.422 12.384 10.971 10.787 10.748 9.839 9.827 + 12.504 12.045 12.796 12.316 13.563 14.492 15.875 17.295 17.260 14.926 13.381 13.851 13.713 13.688 14.408 16.301 17.176 14.763 13.100 12.063 12.115 13.010 14.669 15.419 13.706 11.965 11.759 12.169 10.564 11.291 12.409 10.774 11.310 10.895 9.517 9.735 + 12.030 11.912 11.847 11.988 13.440 14.233 15.084 17.335 17.084 15.662 14.965 14.665 13.972 13.957 14.216 15.200 16.490 15.403 14.123 13.249 12.915 13.053 13.915 15.390 15.044 13.232 12.522 12.373 10.750 11.704 12.473 11.459 12.081 11.310 8.935 9.276 + 12.123 12.047 12.156 12.268 13.462 14.134 15.078 17.186 16.381 15.713 14.685 14.286 13.331 13.659 13.771 14.843 15.747 16.058 14.481 13.412 12.718 12.658 12.915 14.582 15.537 14.577 13.334 13.129 12.281 13.676 13.959 13.058 13.434 11.727 8.486 8.608 + 12.152 11.891 12.183 11.800 13.233 14.190 15.073 17.068 15.910 14.641 14.151 13.979 12.923 13.266 13.273 14.358 15.592 15.661 13.616 12.859 12.287 12.226 12.412 13.632 15.101 14.315 12.576 12.156 11.984 13.027 13.496 12.689 13.202 11.688 9.026 8.439 + 11.934 11.331 11.769 11.325 13.166 14.050 15.888 17.008 15.428 14.120 13.006 13.021 12.291 12.565 12.625 14.003 15.956 15.651 12.968 11.955 11.436 11.410 11.743 12.995 15.019 14.089 11.749 11.101 11.954 13.174 13.315 12.875 13.409 11.637 8.256 7.029 + 11.673 11.104 11.246 11.855 13.413 14.637 14.679 14.835 13.472 11.496 10.724 11.087 10.517 11.263 11.821 13.764 14.847 14.164 11.503 10.936 10.493 10.794 11.371 12.894 14.776 13.454 10.964 10.182 12.094 13.684 13.692 12.973 13.843 11.741 7.943 6.194 + 11.341 10.992 10.926 11.946 12.950 13.041 12.383 11.313 10.421 10.229 10.067 9.547 9.556 9.723 10.737 12.168 12.596 10.893 9.961 9.229 9.409 9.722 9.918 11.272 12.267 10.901 9.677 8.820 10.634 12.028 12.096 11.390 12.528 10.342 7.150 7.135 + 11.547 11.401 11.647 12.073 13.317 13.257 12.997 12.221 10.249 10.368 10.846 10.130 10.000 9.965 11.215 12.333 13.146 11.888 11.249 10.463 10.016 9.385 9.581 11.233 12.744 11.386 10.280 9.921 11.478 12.632 12.609 11.899 13.241 10.848 7.959 5.921 + 11.863 11.831 11.906 11.986 13.554 14.084 14.189 13.791 12.440 10.640 11.377 11.048 10.284 10.879 11.173 12.588 13.865 14.222 11.698 10.999 10.651 10.459 10.933 12.006 14.469 13.703 11.695 10.898 12.720 13.925 13.436 12.587 13.933 11.661 8.402 6.588 + 12.168 11.595 12.112 11.930 13.791 14.772 15.573 14.397 13.457 12.382 10.808 11.372 10.830 11.302 11.573 12.529 14.607 15.397 12.771 12.007 11.213 11.230 11.508 12.132 14.748 14.546 11.672 11.029 13.182 14.279 13.761 13.507 14.690 12.392 8.729 7.157 + 12.261 11.605 11.922 12.216 13.607 14.901 16.082 15.395 13.807 12.848 11.117 11.431 10.958 11.304 11.751 12.707 14.642 15.903 14.093 12.267 11.643 11.686 12.023 12.912 14.714 14.291 12.048 11.603 13.210 14.402 13.473 14.116 14.575 12.264 9.146 8.311 + 12.214 11.838 12.165 12.598 13.834 15.205 16.077 15.121 14.043 13.136 11.543 11.497 10.801 11.112 11.581 12.796 14.646 15.951 14.780 13.019 12.441 12.428 13.189 14.944 14.418 13.105 12.654 12.830 12.240 13.838 12.605 13.368 13.357 11.337 9.317 8.317 + 12.534 12.247 12.512 12.904 14.236 15.069 15.770 14.408 13.951 12.947 11.452 11.490 11.310 11.523 12.050 13.330 15.190 16.021 15.118 13.746 14.010 14.555 14.185 12.893 11.944 10.960 11.119 10.836 10.857 12.723 11.575 12.562 12.434 10.782 9.274 8.021 + 12.425 12.411 12.581 12.773 14.394 14.836 15.524 14.008 13.699 12.996 11.625 11.884 12.011 12.057 13.259 14.506 15.569 15.414 15.531 15.020 14.357 12.471 11.510 9.437 8.661 8.590 8.867 9.373 8.326 10.011 8.577 10.205 10.568 9.477 8.068 5.776 + 12.236 12.095 12.358 12.673 14.481 14.881 15.226 13.280 12.529 12.332 11.481 11.107 11.761 11.849 13.454 14.341 15.324 14.470 14.646 14.262 12.693 10.158 9.219 8.075 7.701 7.217 8.203 8.307 6.997 8.452 7.056 9.480 9.728 8.932 7.287 4.994 + 11.911 11.701 11.847 12.403 14.635 14.986 14.746 12.803 12.339 12.064 11.333 11.122 11.453 12.001 13.859 14.472 13.944 13.660 14.582 12.816 10.166 8.358 8.634 7.475 7.675 6.658 7.259 7.166 6.125 7.164 5.434 8.648 8.915 7.691 6.709 5.255 + 11.857 11.736 11.845 12.732 14.479 14.843 14.368 12.824 12.424 12.117 11.368 11.573 11.972 13.282 14.523 13.449 12.279 12.828 13.622 11.937 8.013 7.573 7.772 6.534 6.657 6.552 6.805 7.147 5.972 6.559 5.074 7.008 7.595 6.497 5.572 4.388 + 11.668 12.208 12.277 13.086 14.634 14.936 14.545 13.446 12.944 12.785 12.436 12.532 13.378 14.280 14.552 13.401 12.144 12.304 13.279 12.692 8.967 8.524 7.897 7.318 6.288 6.757 6.937 6.886 5.584 5.891 5.580 6.358 6.959 6.819 5.744 4.736 + 11.451 12.216 12.375 12.910 13.656 15.347 14.606 13.047 12.352 12.345 12.261 12.590 13.534 14.244 13.715 12.766 11.679 11.345 12.142 12.434 10.293 8.567 7.749 7.889 6.159 6.662 6.775 6.596 6.428 6.597 5.982 7.091 7.665 7.967 6.854 4.810 + 9.981 11.168 10.637 11.259 14.049 14.827 13.869 12.225 11.434 11.533 11.610 11.490 12.628 14.143 13.138 11.807 11.090 10.199 11.288 12.500 11.060 8.409 8.295 6.812 6.331 6.320 7.111 7.855 6.576 6.439 5.944 7.704 7.602 7.945 7.629 5.988 + 10.944 11.351 11.837 12.580 14.498 15.171 14.453 13.311 12.536 12.462 12.422 12.521 13.542 14.804 14.321 12.868 12.002 10.956 11.428 12.917 13.148 9.827 9.086 8.460 7.738 6.320 7.003 7.270 6.123 6.047 6.193 8.927 8.760 9.542 9.394 7.282 + 10.967 12.003 12.400 12.488 13.749 14.327 14.810 13.556 12.093 12.067 12.600 12.367 12.537 14.076 14.425 12.869 12.120 10.938 10.844 11.520 12.733 12.119 8.938 8.721 7.491 6.834 7.379 7.617 6.764 8.431 7.957 8.553 9.170 10.187 9.978 8.422 + 9.809 11.216 10.965 11.417 13.548 15.085 13.886 12.570 11.784 11.909 11.428 11.459 12.008 13.133 14.496 13.655 11.550 10.942 10.115 10.687 12.419 12.383 9.818 8.336 7.085 6.846 7.410 8.255 6.912 7.564 7.285 7.559 8.109 9.859 9.967 7.601 + 10.543 11.513 11.432 12.200 14.165 15.761 15.325 13.519 12.863 12.466 11.843 11.856 12.227 12.861 14.568 15.120 13.295 11.786 11.084 11.375 12.772 13.799 12.056 9.328 8.058 7.715 8.727 9.135 7.246 7.187 7.181 6.831 8.604 10.386 9.822 7.169 + 11.661 12.295 12.439 12.608 13.891 15.762 15.699 13.763 13.222 12.668 11.726 11.686 11.747 12.127 13.244 14.086 14.126 12.463 11.730 11.428 12.252 13.462 13.752 11.716 9.240 8.589 10.127 10.288 8.439 8.347 8.869 7.906 8.541 9.766 9.993 7.582 + 11.966 12.128 12.455 12.652 14.343 14.890 15.607 13.625 12.967 12.162 11.240 11.644 11.319 11.764 12.334 13.649 14.536 13.298 12.788 11.549 11.219 12.106 12.721 12.621 11.442 10.504 11.104 11.244 9.451 9.045 10.000 9.323 10.036 10.365 9.956 7.351 + 12.149 11.692 12.000 12.161 14.464 15.101 15.418 13.748 12.872 11.522 11.056 11.096 10.544 11.678 11.769 13.338 14.269 14.468 12.909 12.233 11.548 11.569 12.220 13.255 13.074 11.789 11.113 11.322 10.325 11.643 12.562 11.467 11.479 11.388 9.900 7.071 + 12.411 11.574 12.138 12.290 14.264 15.450 15.437 13.481 12.801 12.383 11.853 10.765 10.821 11.335 11.992 12.904 14.104 14.678 13.563 12.083 11.399 11.417 11.917 13.289 13.963 12.514 11.496 11.925 11.593 12.979 14.049 12.503 12.790 13.109 10.783 7.397 + 12.658 12.349 11.223 12.813 13.582 13.108 14.221 12.955 10.995 12.524 11.391 10.525 10.477 10.747 11.573 11.762 13.781 14.096 13.337 10.701 10.531 10.801 11.280 12.411 14.249 13.203 11.041 10.908 11.991 12.300 13.689 12.681 12.568 12.861 10.383 8.468 + 11.204 10.788 12.028 12.284 12.483 12.463 11.804 10.897 10.716 10.268 10.670 9.461 9.111 9.215 9.367 10.078 11.134 12.016 10.762 11.298 10.363 8.836 8.205 9.337 11.593 11.449 11.636 10.537 12.080 13.767 14.933 14.429 13.633 13.216 12.416 11.572 + 9.079 8.896 10.225 10.040 10.310 10.644 9.254 7.969 8.537 6.921 7.653 7.831 7.595 7.625 7.269 8.014 9.852 10.677 10.276 10.625 9.127 8.589 8.628 8.505 10.241 10.459 10.462 10.999 13.330 12.855 14.748 16.771 16.690 15.507 14.919 13.953 + 9.491 7.847 8.714 10.105 10.547 10.389 7.623 8.226 7.426 6.893 6.315 7.565 6.442 6.262 7.051 7.268 7.660 8.355 9.800 9.334 7.452 7.783 7.373 8.747 10.422 11.014 10.612 11.953 12.817 14.141 15.412 16.891 16.714 16.965 15.551 14.724 + 8.221 8.538 8.014 8.973 10.400 9.798 8.638 8.341 7.411 7.268 7.339 6.401 6.799 7.000 8.058 7.234 7.223 8.621 9.234 8.716 7.834 7.629 8.055 8.914 9.437 10.374 10.980 12.059 13.877 15.211 14.979 16.116 17.847 17.414 16.346 14.883 + 9.890 9.289 9.339 9.332 9.538 9.806 8.527 9.028 9.529 9.624 9.355 8.197 7.829 7.632 8.411 8.465 8.909 10.060 10.800 9.193 8.227 8.119 8.679 8.155 9.524 11.762 11.147 12.829 14.315 15.335 15.704 17.007 17.339 16.047 15.425 14.405 + 10.106 9.610 6.769 8.933 10.456 10.479 9.213 9.228 8.669 7.359 7.972 8.797 8.317 7.622 7.311 8.297 9.121 10.519 10.785 9.478 8.561 8.689 7.303 9.028 10.056 11.175 11.877 14.393 15.149 15.002 16.682 16.385 15.584 14.732 13.773 12.142 + 10.929 10.008 7.196 8.607 10.012 10.486 10.244 8.112 9.312 7.806 7.639 8.069 6.884 6.969 6.050 7.276 8.380 10.196 9.960 9.746 8.543 7.518 8.219 8.348 10.190 10.732 11.989 13.773 12.793 11.631 12.151 10.855 10.238 10.070 10.022 9.099 + 11.184 10.289 9.759 10.048 9.329 11.117 10.489 9.760 10.036 9.879 9.657 9.574 8.121 6.596 7.228 7.380 8.653 10.018 8.848 8.116 6.852 7.333 8.010 7.847 7.374 9.002 8.502 7.460 6.855 8.034 7.526 7.523 8.606 8.530 8.020 7.017 + 12.274 12.624 11.855 11.084 9.860 10.618 10.122 7.685 7.145 9.028 10.089 9.344 6.397 7.051 7.382 8.320 9.136 9.848 9.792 9.099 8.430 8.769 8.706 7.401 6.744 7.362 7.800 7.571 6.599 6.766 7.288 6.990 7.459 8.988 8.708 8.300 + 13.234 13.226 11.688 11.829 11.796 10.352 9.649 9.514 8.656 10.287 9.891 9.152 8.079 7.619 8.702 10.018 9.784 9.343 9.614 8.981 8.775 8.870 9.809 8.866 7.293 7.298 7.939 8.118 6.192 6.279 7.104 7.562 7.291 9.669 9.031 7.744 + 13.825 13.445 12.086 11.495 10.993 10.907 10.582 9.267 9.751 9.864 9.841 9.212 7.586 7.180 10.404 10.126 10.617 10.297 9.622 9.408 9.189 9.166 10.823 9.644 8.194 6.595 8.580 9.933 7.355 7.819 8.279 8.687 9.124 9.940 9.825 8.453 + 14.000 13.555 13.009 11.752 11.485 12.137 10.493 9.671 10.254 9.484 9.708 9.814 8.026 8.739 9.978 10.854 10.244 11.450 10.880 11.227 10.883 11.393 12.385 11.141 9.750 7.995 7.868 9.861 8.158 6.676 7.834 8.454 9.770 9.101 9.104 8.927 + 13.716 13.093 13.341 11.298 11.505 11.630 9.210 9.051 9.432 8.990 8.327 7.884 8.339 9.350 9.464 10.228 9.741 10.600 10.092 10.041 10.392 11.383 12.367 12.145 10.193 8.409 7.420 9.094 9.139 6.905 9.736 11.056 12.103 11.025 10.057 8.710 + 13.516 12.647 13.266 11.146 11.434 12.130 9.858 9.026 9.285 8.901 8.207 9.040 9.235 9.473 9.097 9.433 9.187 10.026 9.524 9.332 9.583 10.827 12.108 11.648 9.600 8.052 6.394 8.445 8.814 6.649 9.787 10.836 11.960 11.260 9.928 9.434 + 13.407 12.612 13.010 11.406 11.914 13.258 12.311 10.643 11.379 11.179 9.144 9.712 10.272 10.482 10.825 10.509 10.899 9.987 9.750 9.616 9.638 10.417 11.999 10.782 9.845 7.628 7.396 7.574 9.195 8.925 9.536 10.371 11.560 10.449 9.930 10.532 + 13.034 12.557 13.162 11.090 13.643 14.986 14.466 13.154 12.596 12.344 10.880 11.097 11.001 11.399 11.671 12.675 12.000 10.955 10.647 10.182 10.107 11.068 12.566 12.004 9.822 7.248 7.467 7.787 9.239 9.305 10.872 11.572 11.521 10.951 10.951 8.684 + 13.376 13.283 13.462 11.857 14.234 14.944 14.371 13.814 13.144 12.397 10.780 11.376 11.338 11.796 11.774 13.490 13.139 11.728 11.123 10.364 10.082 10.733 12.281 11.762 10.032 8.007 7.286 7.778 9.107 9.858 12.606 13.025 12.360 11.802 11.584 9.355 + 13.444 13.405 13.469 12.277 14.646 14.886 13.955 13.737 13.363 12.338 10.478 11.335 10.832 11.713 11.662 13.748 13.673 12.584 11.799 10.766 10.708 11.703 13.216 12.399 10.841 8.841 7.613 6.578 9.088 10.452 12.939 13.740 11.189 10.665 11.504 9.815 + 13.459 13.289 13.477 12.429 14.846 15.253 13.225 13.558 13.492 12.416 10.968 11.704 10.713 12.075 11.963 13.860 14.057 12.989 12.383 11.575 11.380 12.237 13.749 13.051 11.097 8.951 8.266 8.394 9.733 11.167 12.660 13.600 12.031 11.486 11.626 9.685 + 13.318 12.841 13.259 12.494 14.772 15.429 13.033 13.245 13.120 11.893 11.022 11.379 10.358 11.750 11.735 13.568 13.496 13.075 11.689 11.146 10.964 11.754 13.513 13.095 10.517 9.004 8.202 7.908 8.981 10.204 12.167 13.143 12.057 11.784 11.043 9.426 + 13.205 12.504 13.023 13.029 14.912 15.465 12.811 13.049 12.696 11.967 10.915 11.347 10.418 11.530 11.698 13.508 13.762 13.368 11.731 11.362 11.202 11.893 13.531 13.020 10.474 8.518 7.516 7.807 8.517 9.282 11.529 12.523 11.902 12.000 10.440 9.096 + 13.093 12.558 13.045 13.823 14.969 15.343 12.968 12.757 12.319 11.053 10.840 11.190 10.483 11.470 11.970 13.542 14.190 13.557 12.056 11.641 11.581 12.426 13.781 13.366 10.685 8.334 8.258 8.559 8.337 9.198 11.243 12.332 11.293 11.101 10.384 9.112 + 12.684 12.543 12.876 13.878 15.102 15.317 12.923 12.830 12.077 11.376 11.425 11.575 11.175 11.714 12.460 13.913 14.477 13.847 12.108 11.431 11.068 12.155 13.876 13.530 10.841 8.666 8.504 9.197 9.391 9.572 12.383 12.703 10.241 9.919 10.570 9.671 + 13.354 13.531 13.183 13.514 14.404 14.530 12.345 12.660 11.343 11.320 11.645 10.907 11.343 11.204 12.250 13.232 13.921 12.843 12.507 11.116 11.109 11.987 13.145 12.195 10.547 9.389 8.917 7.722 8.434 10.194 12.263 12.464 11.652 10.432 9.701 8.327 + 13.921 12.588 12.917 13.634 13.265 12.998 12.672 11.465 10.925 11.811 10.733 10.588 10.682 11.026 11.442 13.154 13.143 12.730 11.593 10.429 10.852 10.810 12.731 12.118 10.343 8.630 9.048 9.073 9.045 10.165 11.535 11.958 11.362 10.194 10.559 9.663 + 13.307 11.983 10.224 11.968 12.155 12.565 12.269 10.384 11.099 11.023 10.262 10.223 9.954 10.739 11.025 12.522 12.603 11.578 10.115 9.617 10.034 10.240 11.947 11.031 9.236 7.664 8.777 7.945 8.477 9.739 11.492 11.429 11.327 10.106 9.551 8.645 + 9.261 9.597 10.502 10.830 11.545 12.172 11.785 11.067 10.987 9.893 9.334 9.370 9.044 9.671 10.421 11.743 11.837 11.349 10.336 9.822 8.805 10.702 12.058 11.254 8.900 8.280 8.223 7.516 8.719 10.601 12.496 12.076 11.661 9.832 9.504 8.544 + 10.307 9.785 9.979 10.593 10.884 11.503 11.114 11.081 11.413 10.506 10.254 9.321 8.613 9.242 10.015 10.647 11.799 12.486 11.796 10.918 10.417 11.028 12.460 11.346 9.604 7.984 7.774 7.963 8.292 10.061 12.054 11.538 10.715 8.846 9.345 8.484 + 10.757 10.295 10.560 11.827 12.001 12.113 12.561 12.271 12.555 12.167 10.974 11.482 10.474 11.195 11.167 12.031 12.642 12.991 12.686 11.747 11.228 12.190 13.080 12.316 10.952 8.790 8.898 8.211 9.906 11.613 13.028 12.355 11.605 10.033 9.288 8.174 + 10.281 9.100 10.232 11.222 12.285 12.965 13.236 13.753 12.768 12.271 12.575 11.615 10.788 11.348 11.412 12.415 13.290 14.097 14.018 12.863 12.396 13.243 14.264 13.283 11.169 8.591 8.597 8.974 9.875 11.909 13.560 12.526 12.136 10.483 9.328 8.356 + 11.104 11.242 11.309 10.124 12.588 13.943 14.875 14.895 13.999 13.444 11.904 11.784 11.553 11.286 11.761 12.353 13.508 15.121 15.529 13.493 13.263 13.843 15.277 14.489 11.926 10.530 9.230 9.216 10.769 12.540 14.060 12.708 12.530 10.648 9.462 8.787 + 10.882 11.110 11.729 10.203 12.476 14.015 15.461 16.054 15.482 14.347 11.767 11.846 12.003 11.344 11.989 11.813 12.922 14.118 15.817 15.879 14.647 14.365 15.467 15.420 13.636 11.529 9.895 9.336 11.147 12.493 13.235 12.167 10.648 9.423 10.317 10.040 + 12.574 12.781 13.092 11.953 13.042 14.174 15.513 15.701 16.304 15.400 13.176 11.840 12.365 11.578 12.429 12.057 13.013 13.832 15.818 17.005 15.773 15.140 15.710 15.843 15.038 11.756 10.259 9.846 12.921 13.933 14.045 12.941 11.786 10.404 11.299 11.540 + 12.826 12.874 13.086 11.275 12.552 13.629 14.693 15.927 16.304 14.473 12.141 12.801 12.204 12.000 12.559 12.185 13.017 13.329 14.794 16.216 16.655 15.217 15.089 15.764 15.048 13.211 11.136 10.923 12.059 13.695 14.394 12.561 10.736 9.789 8.967 9.513 + 12.818 12.488 12.979 10.866 11.038 12.710 14.040 15.944 15.849 13.740 12.467 12.977 11.885 11.540 11.997 11.513 12.218 11.996 12.987 15.209 16.368 15.706 15.205 15.791 15.936 13.799 11.874 11.140 12.014 13.329 14.008 12.955 11.144 8.613 7.055 7.556 + 12.782 12.212 12.860 10.666 11.452 12.212 13.772 15.917 15.482 13.337 12.879 13.010 10.860 11.237 11.086 11.046 11.092 10.967 11.476 13.371 15.283 15.389 14.956 15.663 15.943 13.878 11.310 10.494 11.742 13.021 13.916 13.256 11.592 9.541 7.600 7.886 + 12.908 12.353 12.796 11.014 11.344 12.602 13.821 15.589 14.943 13.155 13.071 12.992 10.809 10.772 11.005 10.961 10.730 10.588 10.861 11.953 14.192 15.543 15.079 15.415 15.723 13.886 10.795 10.134 9.367 11.839 12.862 12.615 11.663 9.590 6.971 6.009 + 13.092 12.761 12.403 11.187 10.949 12.147 13.211 14.242 13.485 11.800 13.096 12.464 10.940 10.167 10.675 10.880 10.580 10.607 9.713 9.234 11.649 14.003 14.604 14.495 14.677 12.891 9.791 9.307 9.177 10.361 11.207 11.483 11.604 9.858 8.078 7.150 + 13.113 12.413 11.404 11.119 10.751 11.401 12.590 11.891 11.316 12.100 12.324 11.312 10.795 8.998 9.959 9.841 9.965 9.944 9.693 9.878 9.188 9.639 11.978 11.987 12.115 10.661 8.385 7.680 7.961 9.035 10.359 11.289 11.784 10.709 9.082 7.640 + 12.214 10.506 9.935 10.505 9.601 10.854 11.237 12.250 12.073 10.210 11.646 11.094 10.325 9.061 9.162 9.647 9.412 9.932 10.121 9.952 10.153 10.262 10.870 10.353 9.468 8.249 6.568 6.169 6.881 6.512 8.582 10.132 10.342 10.022 9.409 7.183 + 10.741 11.345 10.524 9.622 9.178 9.424 9.928 10.565 10.167 7.869 9.687 10.129 9.847 7.378 7.469 8.411 8.333 9.365 9.892 9.147 9.919 10.394 10.492 9.451 8.813 8.113 6.716 5.679 5.921 6.255 7.128 9.762 9.961 8.874 9.108 8.666 + 7.018 9.348 10.038 9.962 8.202 8.241 8.666 8.626 7.844 8.076 7.490 7.714 6.940 5.492 5.264 6.188 6.734 8.305 8.025 7.067 8.589 9.744 9.488 9.178 9.239 7.803 6.823 5.707 6.459 7.139 6.771 10.280 10.713 9.364 10.214 10.357 + 7.952 7.502 7.870 9.398 8.175 8.137 7.820 8.938 8.353 6.797 5.871 7.033 5.968 3.882 3.753 4.768 5.063 6.999 6.798 6.781 8.088 9.415 8.602 7.503 8.327 8.009 6.807 6.762 6.476 8.140 7.866 7.391 6.777 5.427 5.164 4.641 + 5.225 7.026 7.769 9.077 8.238 7.534 7.280 7.068 6.402 5.625 7.292 6.966 6.216 5.511 4.402 3.857 3.762 5.385 6.628 6.967 8.934 9.702 8.151 7.068 8.487 8.732 7.481 6.385 6.847 8.633 8.045 6.819 5.812 4.769 4.942 3.791 + 5.416 7.858 7.946 7.855 7.020 8.233 7.355 5.661 6.275 5.878 6.628 6.323 5.256 5.054 5.898 5.110 4.764 5.756 5.632 7.258 9.022 9.573 7.174 7.087 9.431 9.239 7.346 6.512 6.817 8.810 7.868 6.820 5.795 4.451 4.579 3.750 + 6.515 8.489 8.542 9.033 8.174 8.075 7.246 6.561 6.646 5.884 5.142 5.962 5.637 5.509 5.418 5.062 5.074 6.006 6.639 7.913 8.521 9.238 7.896 7.264 8.408 8.134 7.572 6.171 6.858 9.277 9.217 7.042 5.263 4.254 4.329 3.230 + 6.308 7.539 6.980 9.929 9.457 8.702 8.102 6.770 6.204 5.678 5.442 5.038 4.535 5.940 5.210 4.194 5.503 6.608 7.173 9.336 9.452 8.297 7.215 6.584 8.769 9.122 6.879 5.920 6.337 8.809 8.287 6.840 4.737 3.998 4.365 3.958 + 6.487 7.639 7.992 10.287 9.702 7.625 7.024 5.407 5.083 6.526 6.769 5.461 4.860 4.233 5.854 6.087 5.367 4.964 6.947 8.398 9.374 8.024 6.977 6.456 9.212 8.928 5.766 5.100 5.674 8.506 8.116 6.303 5.066 4.124 3.927 3.663 + 6.537 7.791 7.259 9.691 9.852 7.402 5.743 6.088 5.853 5.582 5.582 5.466 4.278 4.486 4.999 5.477 5.678 6.267 7.127 7.747 7.952 7.801 6.561 6.334 7.253 7.488 6.640 5.254 5.142 7.179 7.402 5.429 4.554 3.978 3.819 3.931 + 5.630 6.488 7.364 9.647 8.997 8.624 6.550 6.276 6.615 5.753 5.019 4.984 5.299 5.132 5.205 5.351 5.263 6.431 7.532 7.516 7.979 7.697 6.814 6.722 7.906 7.092 5.989 5.431 6.662 7.778 7.373 5.303 4.607 3.748 3.962 4.251 + 6.486 7.982 7.964 8.719 8.178 8.549 6.899 7.111 7.202 6.019 6.393 6.473 6.296 5.374 5.293 6.116 6.441 7.031 9.228 8.730 8.707 8.253 6.250 6.535 8.544 7.875 6.140 5.556 6.159 8.201 6.949 4.830 5.199 4.171 4.602 3.436 + 6.543 8.645 7.771 6.538 7.260 7.481 6.995 7.971 6.363 6.393 7.873 7.337 5.855 6.367 7.093 5.971 6.058 9.147 9.737 8.300 7.934 8.258 7.636 7.457 8.111 8.939 9.318 8.077 8.197 8.169 7.020 6.443 6.264 5.659 5.191 4.875 + 7.131 8.582 7.806 7.736 7.795 8.618 8.540 8.923 6.692 7.140 6.967 7.699 5.436 6.496 6.262 6.887 7.220 7.974 9.572 8.846 7.684 8.058 7.552 7.482 7.818 8.816 9.382 8.086 7.866 8.085 6.997 6.324 5.747 6.188 5.278 5.165 + 7.114 8.236 8.254 9.698 9.682 9.975 8.989 8.312 6.769 7.887 8.157 7.975 6.252 6.539 5.513 7.153 6.771 8.233 8.439 8.280 8.078 7.717 6.528 6.477 7.477 7.514 7.076 6.271 8.247 8.202 6.994 5.299 4.964 6.128 5.425 4.920 + 7.458 8.074 8.709 10.624 10.710 11.062 9.167 8.277 7.724 8.785 8.507 8.089 5.547 7.226 6.429 7.647 7.839 9.965 9.311 8.983 8.602 7.349 6.354 7.607 7.593 8.479 7.480 6.714 7.623 7.180 6.379 4.658 4.312 5.908 5.101 4.867 + 6.448 7.415 9.005 10.762 11.199 11.556 8.592 7.743 8.209 8.125 8.205 8.137 5.751 6.336 6.198 6.896 9.716 10.963 10.111 8.414 8.093 7.622 7.131 6.255 6.290 7.239 7.301 7.036 7.136 6.858 6.435 4.211 4.418 4.801 3.767 3.714 + 6.268 7.124 8.729 10.166 11.818 12.079 8.432 7.227 7.765 7.239 7.546 7.172 7.034 6.707 6.791 8.575 9.728 10.319 9.354 9.774 8.287 9.493 8.445 6.160 7.293 7.943 6.840 6.237 6.502 7.144 7.587 4.836 5.190 6.279 4.649 3.504 + 6.060 6.316 7.262 8.305 12.149 12.259 8.923 8.234 8.127 8.757 8.248 6.417 7.647 7.982 7.357 9.715 9.823 9.696 8.919 8.589 8.635 8.400 7.419 7.225 7.614 7.895 6.855 5.816 6.758 6.846 7.566 6.352 5.890 5.974 4.713 4.059 + 6.238 5.614 7.007 8.471 11.944 11.872 8.528 8.066 8.062 8.956 9.315 8.720 8.723 8.096 6.922 8.324 8.153 8.646 8.232 8.262 8.178 8.322 7.870 7.148 6.816 6.800 6.321 5.954 7.350 7.502 7.192 7.080 6.139 6.365 4.504 4.657 + 6.599 7.020 8.673 9.675 10.651 10.859 7.818 7.576 7.318 7.446 9.133 8.520 8.216 7.141 6.814 7.467 7.748 7.985 7.707 7.481 8.554 8.886 8.468 7.952 7.880 7.604 6.743 7.006 6.690 7.509 8.048 8.464 8.097 6.009 5.143 4.304 + 7.348 7.733 8.994 9.671 10.269 10.726 8.577 7.489 8.348 9.510 9.513 8.615 7.013 5.333 6.305 7.175 6.862 7.229 8.280 7.439 9.440 10.320 8.955 7.976 7.914 6.716 6.861 7.207 7.236 7.949 7.278 7.566 7.831 6.803 5.195 3.829 + 7.051 7.448 8.952 9.537 10.573 9.848 9.251 7.597 8.550 9.064 9.449 10.123 8.321 6.099 6.344 6.712 7.192 8.111 7.847 7.545 9.585 9.902 8.681 7.803 7.942 7.312 6.300 6.668 7.242 7.183 6.951 7.171 7.325 6.734 5.830 4.132 + 6.751 6.952 9.265 9.875 9.541 9.345 9.400 7.775 8.660 8.542 9.445 10.262 6.987 6.385 7.467 7.585 7.207 7.756 7.337 7.396 8.360 9.570 8.214 8.718 8.444 7.890 7.212 7.758 7.298 6.885 7.173 8.025 8.037 6.838 6.169 4.338 + 6.302 6.710 9.082 9.984 10.349 9.727 8.891 6.493 7.855 8.108 9.384 10.801 9.120 6.911 6.339 7.247 7.129 6.950 6.719 7.445 9.451 10.576 8.768 8.711 8.749 8.229 7.542 7.411 6.915 7.161 6.871 7.495 7.684 6.208 5.894 4.661 + 6.017 6.445 8.412 9.585 10.674 10.070 10.017 8.204 8.487 8.241 8.265 10.410 9.865 8.200 7.196 6.458 7.091 7.169 7.746 7.001 9.647 10.296 9.074 8.690 9.045 8.288 7.265 7.693 7.374 7.637 7.287 7.097 7.351 5.701 5.473 4.627 + 6.577 6.352 7.819 8.504 8.058 9.371 10.043 8.633 9.040 9.224 7.977 8.211 9.845 9.553 8.807 7.868 7.274 7.519 7.429 8.046 9.834 9.382 8.086 8.090 8.587 7.131 7.426 7.040 7.481 6.636 6.706 7.348 7.048 5.815 5.565 4.730 + 6.590 6.579 7.440 7.735 8.614 8.191 7.755 9.059 9.885 8.531 7.418 7.308 7.993 8.447 9.776 8.713 8.118 7.706 7.994 8.544 9.316 9.347 8.987 8.472 8.556 8.218 7.444 8.093 7.359 6.605 6.522 6.866 7.160 5.387 4.743 4.488 + 6.762 6.869 6.527 7.459 8.770 8.379 8.585 7.953 9.063 8.523 7.109 8.289 7.761 8.353 10.329 9.612 8.455 6.771 8.046 8.318 9.348 9.638 9.101 7.637 8.509 7.497 6.329 7.463 7.406 6.853 7.688 5.567 6.954 6.200 5.365 4.728 + 6.018 5.668 6.323 5.711 5.977 6.808 8.520 9.786 9.745 7.959 5.488 6.680 6.531 8.068 9.771 9.658 8.335 7.237 7.723 8.730 9.671 10.178 8.344 7.395 9.032 8.458 7.653 7.622 7.415 6.423 7.565 7.025 6.600 5.285 4.308 4.058 + 3.577 5.326 6.960 6.456 6.832 6.923 6.855 8.739 8.880 6.670 4.813 6.630 6.228 5.474 6.873 9.010 7.639 7.302 7.006 8.737 9.615 9.518 7.443 7.827 8.759 7.899 6.935 6.391 6.684 6.900 7.355 7.165 7.148 5.278 4.565 4.417 + 4.990 5.107 6.291 5.160 5.870 5.409 5.954 7.560 6.820 6.996 5.461 6.625 5.750 6.093 7.679 7.832 7.569 6.883 6.777 8.688 9.943 9.856 8.257 7.858 7.673 6.930 7.120 6.420 6.726 6.857 8.308 7.434 7.224 6.549 5.241 4.863 + 5.173 5.081 6.605 6.118 4.480 4.845 5.027 7.455 7.749 5.914 4.835 4.797 4.650 5.466 5.962 7.288 6.668 7.394 6.426 7.701 8.422 8.699 8.341 7.360 7.096 6.702 6.863 7.238 6.472 7.037 8.110 7.048 8.025 7.185 6.241 6.029 + 6.026 5.559 5.293 5.767 5.624 7.350 7.332 7.599 7.895 6.638 5.576 6.685 6.255 4.563 6.340 7.979 6.351 5.449 6.810 7.744 9.559 10.480 8.006 6.711 8.732 7.366 7.271 8.975 7.759 7.182 8.702 8.148 8.021 6.784 6.072 5.384 + 5.793 5.213 5.300 4.622 5.573 6.971 6.963 7.743 9.529 7.700 6.253 6.688 6.378 5.088 6.433 8.714 8.178 7.032 7.037 7.465 9.875 10.951 8.790 6.248 8.123 8.432 7.235 7.846 7.246 8.211 8.471 8.244 8.544 6.781 6.955 5.557 + 5.387 5.421 5.461 4.972 5.253 5.207 7.834 9.182 10.064 8.394 7.067 7.234 7.085 6.033 6.409 8.930 8.802 7.607 7.093 7.317 8.103 8.946 8.683 7.159 8.098 7.944 7.667 8.173 7.590 8.801 8.740 8.513 8.088 7.197 6.402 6.147 + 4.738 4.223 4.274 4.390 4.086 5.370 7.656 9.668 10.918 9.369 7.538 8.284 7.992 6.422 6.292 8.172 7.533 7.543 7.465 6.813 8.275 8.804 7.819 6.634 7.733 7.947 7.968 8.933 7.969 7.814 8.700 8.246 7.726 7.473 6.250 5.789 + 3.711 4.695 5.543 4.487 5.229 6.872 7.625 9.438 11.129 9.615 7.108 8.579 8.515 7.214 6.916 8.302 7.713 7.194 7.777 7.231 9.325 9.110 7.670 6.355 6.745 8.622 7.230 7.943 8.445 8.368 7.106 8.296 9.230 7.415 6.421 5.690 + 3.810 5.008 6.327 5.697 5.559 6.295 7.163 9.121 10.799 9.291 8.097 8.260 8.473 7.403 6.613 6.509 7.299 8.391 9.126 8.347 8.376 8.746 6.907 7.059 7.823 7.730 7.612 7.750 8.373 8.583 8.588 8.630 9.116 7.807 6.729 6.085 + 5.154 5.646 6.460 5.637 4.575 7.069 6.985 8.519 9.995 8.827 7.976 7.554 5.653 6.468 5.208 6.280 7.883 8.593 8.803 8.856 8.662 7.535 5.904 6.798 7.721 7.809 8.105 8.699 7.720 8.086 8.613 8.321 8.525 7.418 6.831 5.766 + 6.631 6.547 6.877 6.408 4.751 6.920 7.289 7.928 8.494 7.519 7.823 6.189 6.342 5.287 5.762 5.164 8.034 8.783 7.999 8.730 10.418 9.469 6.662 5.773 7.891 7.968 7.260 7.918 8.157 8.610 8.713 8.249 8.866 7.549 6.608 5.813 + 6.993 6.917 6.942 5.913 4.339 5.194 6.302 6.814 7.908 7.128 6.397 5.181 5.775 5.795 4.986 5.308 6.858 7.409 8.793 9.595 8.658 8.337 8.402 7.111 7.247 7.655 7.236 8.135 8.200 8.259 9.629 8.687 8.827 7.694 6.628 5.942 + 6.551 6.909 6.549 6.345 5.735 5.518 7.988 9.515 9.274 7.654 6.814 6.629 6.387 6.024 3.380 4.977 6.287 7.845 8.734 8.871 8.944 7.395 6.518 6.758 7.158 7.883 7.704 7.402 7.044 8.029 9.056 8.932 8.707 7.686 6.772 6.424 + 4.835 6.164 5.651 4.569 5.531 5.702 6.819 8.800 8.615 6.606 4.775 5.938 6.073 4.566 3.598 5.358 5.829 6.922 7.364 8.854 9.481 8.432 6.570 7.520 6.340 7.375 7.848 7.236 6.870 7.753 9.028 8.733 8.370 7.196 7.530 6.469 + 3.974 3.754 3.661 2.876 4.077 4.569 4.574 5.030 6.337 5.439 5.190 4.470 5.214 2.830 3.571 4.853 5.495 6.575 6.245 8.006 8.845 8.857 7.477 7.089 7.247 7.478 6.874 7.798 7.670 7.817 8.864 7.435 8.786 7.535 6.875 6.098 + 2.452 3.571 3.613 4.119 3.794 4.014 5.711 7.024 6.095 4.721 3.970 4.190 3.784 4.194 4.304 5.496 6.057 6.843 6.758 8.686 8.433 9.030 7.666 7.592 7.598 6.581 6.375 6.801 6.458 7.340 8.578 7.559 7.717 6.974 6.116 5.846 + 3.811 3.466 3.858 3.833 3.790 3.427 5.528 7.252 5.904 2.599 3.214 2.895 3.359 4.857 5.077 5.355 6.151 6.182 7.150 8.216 9.172 9.055 6.658 7.006 6.602 6.413 6.446 6.777 7.004 7.282 8.317 8.678 7.874 7.352 6.910 7.118 + 2.599 3.411 4.006 2.802 2.765 4.506 5.446 6.360 4.688 4.125 3.918 4.799 3.502 3.933 5.319 5.533 5.571 6.336 6.583 6.468 8.017 7.466 7.321 6.789 6.357 5.828 6.445 7.914 8.119 7.995 8.455 7.835 7.630 7.754 7.733 6.764 + 1.555 2.633 2.008 2.094 2.997 4.145 6.022 7.464 6.675 4.465 3.559 4.086 3.275 4.137 4.155 4.558 5.223 5.559 6.606 6.550 8.073 6.911 6.075 5.345 6.970 6.378 5.823 7.680 8.371 7.951 8.109 8.325 8.184 7.710 7.181 6.680 + 3.880 4.275 3.327 3.452 3.819 3.607 3.604 6.657 6.419 3.659 3.680 4.560 3.688 5.089 4.874 3.846 4.595 4.023 5.490 7.190 8.325 7.344 5.707 6.553 7.279 5.835 5.798 7.276 8.111 8.517 8.075 8.415 8.199 7.938 7.474 7.866 + 2.864 3.928 3.073 2.256 1.281 3.850 4.965 5.016 5.039 3.298 2.588 3.589 3.440 4.572 4.997 3.533 2.728 4.371 5.029 5.349 6.528 6.577 6.497 6.415 6.098 6.017 6.437 7.370 7.655 7.590 8.426 8.058 8.306 7.184 7.303 6.878 + 3.502 3.801 2.052 1.776 2.494 4.299 4.806 4.054 5.591 4.254 3.150 4.117 3.587 3.772 4.067 4.385 4.317 4.756 5.275 7.841 9.260 8.337 6.797 6.713 7.517 7.056 6.485 7.298 7.369 7.561 8.690 8.148 7.855 7.626 7.468 6.780 + 3.287 4.381 3.868 2.990 0.262 4.514 5.840 5.009 5.641 4.996 4.568 4.216 2.468 3.578 4.446 4.258 4.010 5.661 6.418 8.337 9.448 8.452 6.753 6.471 7.124 5.664 6.744 7.118 7.851 8.242 8.735 7.850 8.017 7.259 7.985 7.718 + 0.521 2.868 3.944 3.401 2.696 3.609 4.237 5.121 5.580 3.510 5.096 4.972 4.030 4.631 4.470 4.060 5.118 5.163 5.679 7.334 9.283 8.163 5.887 6.880 5.712 6.073 6.112 6.748 7.300 7.797 8.639 7.552 7.720 7.218 6.772 5.886 + 2.192 2.855 2.142 1.545 2.855 4.259 4.861 5.265 4.130 4.410 4.618 3.992 4.987 4.820 3.696 4.102 4.876 5.749 5.546 7.584 8.900 7.512 5.052 6.327 6.941 6.593 5.842 6.635 7.398 8.613 7.118 7.980 8.207 6.544 6.383 5.561 + 2.469 2.462 0.979 1.804 3.879 4.835 5.440 3.279 4.392 4.302 3.972 3.952 3.687 2.986 3.534 4.788 5.161 5.019 5.575 7.861 8.868 6.640 6.408 7.072 7.550 5.895 5.824 6.969 7.907 7.325 7.426 7.277 7.078 6.866 6.259 5.847 + 3.302 3.793 3.922 4.023 5.178 6.135 5.920 4.386 6.607 6.550 4.645 2.807 3.893 4.012 4.976 4.124 5.265 4.678 6.148 7.507 9.369 7.148 6.390 6.789 5.620 5.021 6.155 6.393 6.626 6.844 8.140 6.653 6.316 6.195 6.079 4.775 + 6.620 6.848 5.388 6.431 8.316 8.981 8.781 6.674 6.575 5.636 6.417 5.356 5.653 6.024 5.842 5.058 7.801 7.891 7.595 6.979 9.038 7.777 6.548 6.753 5.474 5.946 6.261 6.840 7.385 6.710 8.031 7.570 6.365 5.954 6.261 5.786 + 6.300 7.401 6.999 5.872 9.258 9.608 10.040 9.191 8.232 7.341 7.656 7.942 7.481 6.935 7.959 7.634 10.007 9.456 7.114 6.462 8.024 6.971 6.584 6.201 5.663 6.632 6.424 7.416 6.972 6.702 8.654 8.086 6.830 6.490 7.287 6.312 + 5.350 6.420 6.162 6.247 9.344 9.619 9.435 10.412 10.695 9.433 8.936 7.968 6.940 8.125 8.780 7.833 10.054 10.072 8.693 8.845 9.161 7.957 5.702 6.601 5.718 5.316 6.108 6.601 7.528 6.446 8.363 7.360 6.504 6.594 6.530 5.436 + 5.606 6.542 5.871 6.817 9.675 10.917 10.231 10.919 11.297 9.145 8.555 6.906 5.969 7.959 8.500 8.921 9.818 9.286 8.268 8.091 8.138 8.238 7.157 6.482 7.048 6.078 6.617 6.430 8.248 7.181 7.516 6.738 5.715 5.486 6.022 5.477 + 6.806 7.809 7.692 6.842 9.182 10.591 10.750 11.294 10.491 9.905 8.276 7.453 7.863 8.484 9.187 9.082 9.819 9.034 8.221 7.948 7.837 6.718 7.394 6.122 6.686 7.049 6.168 6.822 7.819 6.780 6.796 6.465 6.234 5.055 6.122 5.599 + 7.189 7.913 7.354 6.317 8.903 10.177 10.445 10.721 10.525 9.262 8.292 7.582 8.240 8.148 9.038 9.333 10.126 9.455 8.310 8.612 9.182 8.595 8.554 7.322 7.383 7.650 7.432 7.400 7.835 7.823 7.416 7.416 7.251 6.510 6.068 5.295 + 5.807 6.979 8.097 7.075 10.433 11.762 11.433 11.124 9.586 9.018 9.217 8.179 7.422 9.403 9.009 8.569 10.647 10.271 8.049 8.277 9.070 8.042 7.366 6.903 8.478 8.596 7.537 7.375 7.663 7.104 7.171 6.481 7.078 6.729 6.052 5.292 + 4.466 7.261 8.502 8.098 11.204 12.128 11.088 11.369 10.263 8.717 9.207 7.785 6.710 8.647 9.590 9.752 9.534 10.478 9.342 9.250 9.483 7.642 6.280 6.384 8.011 7.751 7.450 7.794 7.835 7.653 7.942 7.486 6.606 5.925 6.075 5.665 + 7.013 7.732 8.383 7.765 10.680 10.969 10.841 10.736 10.261 9.103 7.211 7.455 7.203 7.367 8.274 9.617 9.586 9.781 9.240 8.926 9.633 7.951 7.194 7.808 8.000 8.403 7.418 7.902 8.271 7.426 7.987 6.744 6.548 5.596 5.781 4.705 + 7.637 7.820 8.591 8.810 10.680 11.141 10.413 9.547 9.139 8.354 7.955 7.062 6.480 7.424 8.077 9.589 10.564 9.899 8.936 8.786 8.658 9.323 8.203 7.781 8.427 8.205 7.940 7.474 7.650 7.645 7.603 6.800 6.424 5.532 5.043 4.378 + 8.472 8.699 8.647 9.489 10.599 10.557 9.991 10.418 9.269 7.378 6.560 6.375 4.886 4.894 7.203 8.280 7.943 9.360 9.548 9.400 9.100 9.665 8.704 9.063 9.454 9.584 8.968 8.576 8.164 8.697 7.956 7.022 6.271 5.387 5.090 4.545 + 8.478 8.381 7.530 7.162 9.722 9.820 9.111 10.330 8.803 6.920 6.427 5.864 5.368 7.134 7.168 7.633 7.772 8.562 8.662 8.351 8.704 8.261 7.562 7.511 8.445 9.350 9.006 9.516 8.480 8.744 8.007 6.839 5.881 5.426 4.886 3.990 + 8.352 8.154 8.134 9.183 9.769 10.307 9.772 9.735 8.514 6.678 5.814 5.147 4.183 5.209 5.400 6.681 7.675 8.403 7.225 8.311 8.419 7.820 8.002 7.140 7.373 8.094 7.108 6.735 6.417 6.159 6.003 5.661 5.196 5.202 5.191 3.818 + 7.660 7.333 5.270 5.637 6.006 7.714 6.919 6.528 6.239 5.634 5.242 4.013 3.990 3.506 5.701 7.198 7.576 7.293 6.516 6.894 7.109 6.774 6.298 5.555 6.368 6.556 6.059 6.322 5.623 5.724 6.359 5.316 4.719 4.052 4.114 3.405 + 6.697 6.556 6.089 6.228 6.828 8.129 7.922 8.527 8.345 6.616 4.576 4.911 5.467 3.375 5.677 6.678 7.275 7.493 6.389 7.485 7.076 6.423 5.997 4.857 6.042 5.487 4.836 5.216 5.100 5.137 5.624 5.211 5.118 4.440 3.901 3.404 + 3.987 5.145 6.106 6.062 6.817 7.338 6.855 6.930 6.870 4.489 4.493 5.627 4.550 4.578 3.614 6.947 8.173 7.357 6.572 5.703 6.494 5.275 4.844 6.027 6.489 5.797 4.668 4.406 5.393 5.184 6.062 5.056 4.780 4.045 3.321 2.621 + 4.879 4.103 5.660 6.292 5.792 6.056 5.990 7.657 6.830 4.790 5.277 5.391 4.376 4.833 5.450 6.693 7.100 8.377 8.031 8.024 8.342 6.865 5.734 7.030 6.895 6.021 5.028 5.738 6.107 6.405 5.305 5.197 5.517 6.883 6.316 4.425 + 3.999 4.464 6.018 6.971 8.196 8.267 6.847 7.430 6.527 4.932 5.846 5.236 4.463 5.391 5.190 4.821 6.314 8.403 8.378 9.271 8.736 7.634 6.094 5.607 6.293 5.754 5.941 5.406 6.244 7.011 6.033 5.577 5.914 7.678 8.234 6.431 + 4.211 4.316 5.349 7.834 7.765 7.758 7.450 6.625 6.498 5.128 6.410 6.472 5.673 4.851 4.564 6.452 6.947 7.534 7.528 8.110 7.419 6.173 6.420 6.279 8.555 8.261 7.623 7.925 6.684 6.438 5.888 5.935 5.938 6.959 7.486 6.266 + 6.011 5.816 3.453 8.058 9.003 7.785 6.627 5.125 6.295 4.316 4.146 4.623 4.472 3.349 5.041 5.957 6.193 7.698 7.516 8.071 7.899 8.138 6.731 6.838 7.902 8.681 9.187 9.457 7.936 6.811 6.843 6.678 6.722 6.590 5.863 4.951 + 6.713 6.950 5.081 8.762 10.482 9.910 7.032 8.227 7.893 5.390 5.053 5.681 4.994 4.034 5.450 6.257 6.947 8.063 8.194 7.773 8.566 9.298 7.456 6.418 8.456 8.883 10.432 10.861 9.377 8.288 7.601 6.736 7.104 7.517 6.007 4.223 + 7.371 7.406 5.265 6.510 8.983 8.528 7.347 8.529 7.157 5.589 4.643 4.222 4.652 4.750 4.650 5.072 5.384 7.654 8.497 8.696 9.405 9.838 6.583 7.267 8.884 9.217 10.769 10.702 9.307 8.732 7.439 7.363 7.583 7.711 5.948 4.748 + 7.840 7.439 5.518 8.069 9.109 9.071 8.374 9.217 7.254 4.472 4.395 3.396 3.388 5.007 4.243 5.374 5.524 6.423 7.117 7.751 9.749 9.446 7.002 6.351 8.723 9.140 10.226 9.878 8.794 8.405 8.178 7.793 6.947 7.282 5.183 4.242 + 6.733 6.625 4.712 8.327 8.804 8.732 9.073 9.160 6.050 4.496 4.210 4.270 3.781 4.573 5.358 5.321 5.543 6.117 8.070 8.050 9.254 9.021 8.163 7.486 8.145 8.534 10.346 10.656 9.205 9.021 8.303 7.518 7.477 7.441 6.165 3.397 + 5.110 4.826 5.851 8.683 9.433 8.450 8.912 8.928 6.950 5.810 4.343 4.049 3.728 5.025 5.753 5.750 5.898 7.556 8.253 7.807 8.825 8.766 8.366 7.855 7.775 8.472 10.407 10.647 9.602 9.307 8.620 8.256 6.742 6.434 5.878 3.899 + 2.383 4.895 5.940 9.055 9.671 7.753 9.665 10.377 7.795 6.988 6.160 4.282 4.629 5.300 4.779 5.270 5.699 6.193 7.832 8.198 10.113 9.128 8.090 7.379 8.475 8.921 9.532 9.477 8.936 9.115 8.683 7.691 7.511 7.206 6.040 3.418 + 4.487 3.711 5.629 7.121 8.011 6.986 9.175 9.564 6.094 6.504 4.956 3.738 3.805 4.386 3.748 3.985 5.934 6.736 7.019 8.178 8.983 7.315 7.400 6.454 7.664 6.945 9.194 8.302 6.632 6.782 8.160 7.282 6.517 5.235 4.872 3.868 + 5.023 5.069 7.054 8.826 8.159 6.923 7.598 8.337 6.646 5.360 5.954 5.055 4.470 5.014 4.451 5.151 5.202 7.051 7.260 7.770 7.432 6.530 5.733 4.879 5.368 5.625 7.151 7.243 5.522 5.812 7.379 7.516 6.392 5.339 4.304 3.890 + 4.508 5.301 7.759 9.064 8.247 7.870 8.154 8.040 5.651 5.334 4.350 4.017 4.710 4.357 5.069 5.684 4.977 7.353 7.135 8.129 7.983 6.449 5.139 4.708 5.912 5.466 6.319 6.129 6.091 6.234 6.143 6.871 6.213 5.433 3.362 3.057 + 4.489 6.596 7.350 9.070 9.013 7.581 6.255 6.648 5.089 4.900 3.528 3.787 4.249 5.263 4.303 4.485 5.474 6.490 7.340 8.230 7.636 6.013 5.099 5.262 6.464 5.295 6.719 6.679 6.078 6.019 6.359 6.205 4.843 4.577 4.098 2.725 + 4.178 4.235 6.580 7.071 8.258 8.227 6.392 5.730 5.290 3.818 4.312 3.362 3.470 4.848 3.454 4.792 4.994 4.784 5.520 7.751 6.928 5.405 4.979 3.347 5.371 4.907 7.229 6.369 5.237 5.078 5.386 5.377 4.641 3.247 2.816 1.996 + 5.402 5.560 5.574 6.656 8.186 7.861 7.693 4.584 5.246 5.106 4.670 3.975 2.839 4.345 4.316 4.404 5.447 6.126 6.758 6.274 6.167 4.706 4.267 3.438 5.528 5.412 5.416 5.486 4.534 5.012 4.691 4.319 4.280 4.352 3.016 1.678 + 3.088 5.177 6.784 6.456 7.564 8.485 7.277 5.731 5.074 4.688 4.721 2.128 2.577 4.714 4.395 3.937 4.820 6.144 7.095 7.104 7.120 5.685 4.870 4.943 4.957 5.210 6.164 6.320 5.152 5.582 5.967 5.075 4.933 4.461 3.615 2.137 + 3.732 5.017 5.986 7.188 8.097 7.628 6.659 5.250 4.532 4.850 3.496 3.835 2.794 3.396 3.495 3.506 3.586 4.924 5.845 6.413 5.951 4.911 4.789 5.195 5.123 5.700 6.095 5.218 5.275 5.055 4.832 4.665 5.256 5.016 2.941 1.574 + 3.800 3.804 4.429 6.559 6.237 6.365 5.695 5.601 4.951 4.237 3.766 2.848 3.249 2.617 2.843 3.143 4.609 4.898 5.448 6.292 5.024 5.102 5.649 5.060 4.183 4.265 3.990 4.120 5.018 4.750 4.165 4.672 4.644 3.596 2.897 1.565 + 3.969 3.227 3.894 6.817 6.591 4.941 5.253 4.895 4.671 4.276 2.671 3.228 2.790 2.827 3.360 2.926 2.250 4.355 5.863 6.635 6.086 4.225 4.747 4.613 3.858 4.272 4.796 4.707 4.387 4.256 3.699 4.166 4.621 4.778 2.581 1.330 + 3.330 5.393 5.442 5.569 6.095 5.126 5.008 5.175 4.377 4.199 2.237 1.061 2.010 3.090 4.069 4.586 4.791 6.676 6.591 6.526 5.334 3.868 4.222 3.791 3.789 5.380 5.183 5.178 5.834 5.722 4.650 4.771 4.865 3.964 2.485 1.996 + 3.059 3.852 4.617 5.427 5.199 5.020 5.836 5.025 3.346 2.186 2.451 3.631 3.127 4.458 4.579 3.924 4.906 7.192 7.271 7.950 6.459 4.343 3.988 3.742 5.598 6.283 4.970 4.934 5.570 5.680 4.924 4.812 4.462 4.093 2.949 1.773 + 1.159 3.774 5.794 6.690 5.463 3.222 4.714 6.024 5.347 3.858 3.812 3.623 3.558 2.551 3.809 3.714 5.133 6.061 5.540 5.880 4.575 4.585 4.136 4.044 4.439 4.828 4.313 4.899 4.912 5.092 5.092 4.802 3.198 2.561 2.660 1.333 + 3.380 4.206 5.277 5.985 5.288 4.289 5.155 5.562 5.903 5.964 4.362 3.311 4.190 3.831 4.064 4.204 6.918 6.945 4.728 5.387 5.512 4.043 3.223 4.299 4.439 5.714 4.876 5.396 5.050 5.761 4.634 4.053 4.057 2.322 1.859 1.482 + 4.260 3.089 4.650 5.862 5.120 4.071 5.938 7.737 7.699 6.499 6.191 5.465 4.569 3.381 3.701 4.808 7.609 7.521 5.604 6.064 6.274 4.772 4.515 5.658 5.176 5.118 4.439 4.429 5.034 5.431 4.398 3.480 3.584 2.170 1.932 1.076 + 4.712 3.418 2.542 6.134 6.316 3.584 5.778 6.488 7.895 7.487 5.477 5.227 3.878 5.804 6.335 6.287 9.035 8.381 5.689 6.416 5.306 4.736 3.662 3.386 5.191 5.389 4.409 4.672 5.243 6.245 5.134 3.591 3.416 2.265 1.980 1.166 + 5.279 3.843 3.158 5.666 5.407 4.644 6.301 5.284 7.497 8.404 6.131 4.520 4.269 5.767 5.713 6.006 9.654 9.355 7.742 6.969 5.678 4.713 4.836 3.820 6.640 7.738 6.199 5.461 7.013 7.990 7.132 4.460 3.962 4.725 2.640 0.928 + 5.979 5.163 3.501 4.394 5.608 5.041 7.141 7.173 6.942 7.992 5.462 5.668 5.408 4.732 6.099 6.643 10.166 10.282 8.039 6.990 5.542 5.355 4.982 4.769 6.640 8.071 6.702 5.586 7.367 8.781 8.171 5.075 4.425 5.477 3.158 0.742 + 6.282 5.845 5.300 6.042 6.202 5.367 8.614 9.179 8.143 8.543 5.827 5.022 4.752 6.780 7.036 7.373 7.947 9.486 8.141 7.483 6.596 5.278 4.929 5.775 7.370 7.030 6.286 5.893 6.245 7.671 7.306 5.778 5.599 5.748 3.034 1.094 + 6.120 5.374 4.916 7.191 6.491 5.435 8.042 8.143 7.852 7.854 4.631 3.275 4.310 4.929 4.710 4.234 7.602 8.347 7.335 6.593 5.671 4.498 4.506 5.454 6.337 5.407 5.134 4.341 4.992 5.669 5.689 5.060 4.299 3.483 1.512 0.547 + 5.726 5.561 6.502 8.525 7.869 5.841 6.947 7.244 6.810 6.494 3.815 3.502 3.124 4.489 3.847 5.173 5.426 7.344 6.614 6.577 5.327 4.393 2.876 4.587 4.383 4.600 4.397 3.122 3.791 5.491 5.398 5.049 3.386 2.047 1.627 0.530 + 2.854 2.309 6.396 7.724 6.901 6.454 7.236 6.779 6.506 7.070 3.801 3.941 3.628 3.526 3.027 4.198 4.654 6.137 4.869 4.389 3.519 4.247 2.715 3.563 3.439 4.201 3.525 2.934 2.304 4.206 4.344 3.818 3.318 2.023 1.560 0.146 + 0.867 2.024 3.627 4.259 3.769 4.742 5.053 5.079 5.385 6.149 3.873 3.239 2.892 2.720 2.601 4.093 5.323 7.044 4.874 3.598 4.245 3.888 3.355 3.825 3.722 4.118 2.409 2.584 2.071 2.829 4.224 3.525 2.733 2.494 1.325 0.889 + 3.861 3.179 4.136 4.648 3.493 3.550 5.569 4.883 3.791 5.203 3.821 2.761 3.307 3.876 3.487 3.144 5.097 6.448 4.405 3.206 3.147 2.910 3.326 4.100 4.894 3.586 2.517 2.612 2.617 2.893 3.409 3.245 3.077 3.041 2.650 1.825 + 4.263 3.467 3.997 5.477 5.244 3.240 5.092 4.027 3.865 4.692 2.092 2.058 2.572 4.081 3.691 3.396 4.817 5.102 4.826 4.497 3.232 3.197 4.302 4.262 4.296 4.620 5.098 5.572 6.018 5.829 5.909 5.250 4.232 4.793 4.884 3.575 + 2.836 3.705 3.338 5.802 5.665 2.094 4.645 4.389 3.796 4.223 2.533 1.341 2.800 4.079 3.807 2.698 3.250 3.145 4.015 3.514 3.110 3.192 3.303 3.287 4.102 3.610 3.979 3.907 4.381 3.908 4.140 4.062 3.026 3.673 4.227 3.064 + 2.658 1.919 2.365 5.437 5.465 2.908 4.192 3.147 2.050 3.024 2.245 2.292 2.502 3.634 3.247 3.126 2.953 3.251 4.357 2.362 2.798 3.538 4.138 2.627 4.501 3.937 3.289 3.597 3.448 3.302 3.647 3.609 2.388 3.207 3.485 2.608 + 3.739 2.769 3.110 4.253 4.832 3.296 4.800 4.423 2.263 2.476 2.409 2.189 1.745 3.810 3.625 2.969 3.598 4.159 4.379 3.744 3.413 4.215 3.509 3.313 4.284 4.429 4.833 4.187 3.286 3.980 4.374 3.950 3.179 2.970 3.196 2.397 + 4.837 3.957 4.511 6.507 5.878 5.289 5.365 3.018 2.881 2.704 3.176 2.860 2.516 2.441 1.355 3.961 3.600 3.692 4.782 3.803 3.774 4.726 4.215 4.165 4.558 5.025 5.661 4.262 4.130 4.797 6.063 4.439 2.568 3.249 3.784 2.795 + 3.901 2.797 3.480 6.470 6.080 4.138 3.925 2.851 2.509 2.225 3.115 2.400 2.760 2.852 2.748 3.888 5.217 5.219 4.517 4.658 5.903 5.486 4.388 4.351 4.895 5.158 4.590 3.614 3.600 4.853 5.862 4.576 2.339 3.086 3.491 2.644 + 0.752 1.925 2.398 5.998 6.008 3.855 4.657 3.978 3.393 3.842 4.986 4.332 2.879 4.241 3.844 3.255 3.254 4.874 4.913 5.008 5.992 6.388 4.641 4.868 5.089 5.979 4.814 3.518 2.968 4.127 4.572 3.049 2.885 2.841 3.408 3.095 + 1.829 2.844 3.118 5.162 5.680 3.975 3.655 2.777 4.122 4.332 4.935 4.834 4.595 4.581 3.444 3.928 5.059 5.142 5.020 4.979 6.143 6.556 5.050 5.143 5.833 6.410 5.470 5.409 3.708 3.935 4.978 3.575 1.586 2.324 3.248 3.313 + 3.392 3.194 2.216 5.400 4.965 3.089 3.382 2.730 5.540 6.120 5.329 5.306 4.725 5.879 4.404 3.987 4.236 5.374 5.660 6.200 7.533 7.416 6.069 5.632 6.477 6.542 6.033 5.818 4.657 5.382 5.429 4.704 3.159 2.791 3.092 3.339 + 3.029 2.997 5.595 7.001 5.529 1.913 3.293 4.325 5.489 5.919 5.149 4.974 4.061 5.482 4.921 5.150 4.651 5.270 5.804 6.235 7.567 8.079 7.494 6.327 6.437 6.684 7.016 6.559 4.925 5.643 5.479 5.113 2.946 2.638 2.773 3.164 + 4.279 3.936 6.322 7.331 5.621 5.021 5.254 7.166 7.605 7.304 7.225 5.250 3.898 3.322 3.656 5.434 4.899 4.434 5.762 6.551 7.920 8.411 7.504 7.242 6.839 7.336 7.128 6.509 5.577 5.451 6.080 6.105 3.625 3.023 2.954 3.207 + 4.018 3.119 6.182 6.476 4.510 6.251 6.763 8.358 8.212 7.982 6.551 5.684 5.346 6.648 5.623 6.309 5.892 6.515 6.365 6.467 8.278 8.892 7.351 7.682 6.686 7.187 7.653 7.038 6.226 6.330 6.436 6.339 4.116 3.141 2.790 2.520 + 3.083 3.798 5.588 4.732 5.478 5.425 5.680 7.545 6.599 6.153 6.718 6.243 5.168 5.723 4.513 4.966 5.490 5.833 5.500 5.613 6.718 7.558 7.405 7.170 7.214 6.147 6.622 6.119 5.624 5.528 6.306 5.032 3.633 1.704 1.836 1.771 + 1.715 4.007 6.083 6.097 4.600 4.874 5.598 7.901 7.656 7.431 7.192 6.019 5.322 5.622 4.447 4.132 4.540 5.682 5.601 6.160 6.963 7.453 7.600 7.856 7.624 7.539 7.904 7.006 6.490 6.626 6.693 5.339 4.529 3.276 2.813 1.865 + 3.781 3.105 5.483 5.605 3.910 4.752 5.593 7.887 7.418 7.934 7.648 6.449 5.229 6.084 4.881 4.039 3.654 5.348 5.827 5.188 7.149 7.575 7.878 8.565 8.100 7.816 7.269 6.955 5.970 5.337 6.485 5.916 5.321 3.412 2.873 3.121 + 4.848 3.597 6.147 6.954 5.309 6.209 5.693 8.402 8.494 8.169 7.107 7.339 6.664 4.946 3.666 2.836 4.425 4.883 3.535 5.822 6.384 7.294 8.083 7.650 7.409 7.752 7.938 7.580 6.160 5.917 7.148 6.603 5.371 3.887 2.810 2.285 + 5.059 3.651 6.336 7.115 5.091 5.901 4.862 7.515 7.507 7.695 7.799 7.298 6.573 4.921 4.385 2.693 2.065 3.673 3.549 3.996 5.132 5.497 5.355 6.370 6.240 6.744 7.866 7.036 6.064 5.681 6.763 6.591 5.362 4.299 2.723 1.941 + 4.828 4.576 5.397 6.009 4.517 6.006 5.448 7.145 7.019 5.712 6.021 4.442 4.284 3.908 3.892 2.599 3.332 3.187 3.705 3.449 4.248 5.503 5.232 7.217 6.574 7.002 6.747 6.087 5.668 5.224 6.164 6.031 4.724 4.067 3.217 2.310 + 2.046 1.634 3.362 5.181 4.004 4.906 4.262 6.056 6.978 6.287 4.685 4.461 4.032 4.260 3.792 2.075 3.182 4.048 3.866 3.901 3.131 4.862 4.915 7.281 7.130 6.665 5.700 5.790 4.898 4.373 4.931 5.055 4.333 4.193 3.670 3.102 + 3.042 2.861 4.055 4.605 3.175 4.461 4.375 4.488 5.742 5.066 4.585 4.560 4.335 4.519 3.604 3.460 3.667 3.399 3.608 3.212 3.760 5.150 4.340 4.914 5.299 4.469 3.812 4.624 3.597 3.114 4.355 4.331 2.986 2.783 2.489 2.099 + 2.983 1.889 4.131 4.693 3.287 3.161 3.706 4.524 3.917 4.382 4.915 3.606 2.635 2.700 2.054 3.480 3.614 3.970 5.172 5.323 6.144 5.157 5.046 6.298 6.068 4.386 4.391 4.787 3.512 2.261 3.130 3.843 2.733 2.166 1.843 1.935 + 5.427 4.168 3.960 4.364 2.669 2.878 3.612 2.183 2.985 4.264 4.646 4.901 4.896 4.419 4.898 4.850 5.718 4.898 7.484 7.124 6.575 6.846 6.172 6.844 6.615 5.436 5.462 5.337 4.534 4.795 4.845 5.106 4.960 4.866 4.690 4.243 + 3.810 2.600 3.219 3.344 3.198 3.454 3.385 3.950 4.168 4.428 5.121 5.894 4.114 4.793 5.542 5.115 5.053 5.834 8.123 7.760 7.303 6.091 6.366 6.849 6.977 7.276 7.837 7.533 7.787 6.777 7.793 8.267 7.402 7.135 8.025 7.439 + 1.732 2.879 2.671 4.229 4.797 5.077 3.634 3.393 3.719 4.412 4.596 5.647 4.902 5.225 5.393 6.484 7.336 6.572 7.763 7.416 7.786 7.335 7.587 7.882 9.480 9.364 9.537 9.038 8.510 7.486 9.724 9.915 8.575 7.717 9.052 8.779 + 1.501 3.322 4.382 4.910 4.440 4.711 4.143 4.664 4.988 4.158 5.749 4.737 4.096 5.853 5.989 5.005 6.226 7.263 7.693 7.982 9.535 9.575 8.611 8.768 9.951 9.587 10.248 9.788 9.784 8.673 9.695 10.495 9.575 9.003 8.984 8.841 + 2.910 4.072 4.567 3.965 4.175 5.052 5.571 5.965 6.025 5.602 6.801 5.822 6.424 5.614 5.338 5.232 8.426 8.323 8.354 7.967 9.095 8.853 8.585 7.659 8.630 9.134 10.475 11.004 10.245 9.244 10.360 10.606 9.363 9.409 9.736 9.884 + 5.699 6.005 5.797 4.930 4.661 5.882 6.071 5.745 5.953 5.265 5.508 5.464 5.749 6.008 6.260 7.314 7.608 8.107 9.236 9.770 8.236 10.334 10.211 9.006 9.739 9.660 11.007 10.660 10.048 9.678 9.424 10.819 10.104 10.335 10.126 9.994 + 4.785 5.030 5.562 5.872 6.465 6.449 5.449 6.128 5.523 5.378 6.970 7.583 6.864 5.524 5.830 7.257 7.401 8.263 10.642 10.563 9.062 9.442 9.350 9.894 9.701 10.297 11.303 9.880 8.730 9.238 10.277 10.657 10.469 9.441 9.705 9.458 + 6.504 6.842 6.438 4.908 6.953 7.100 6.407 5.903 6.310 6.534 7.296 7.819 7.847 8.026 7.879 6.927 8.653 9.816 10.880 10.553 8.932 9.380 8.495 8.687 8.803 9.092 10.086 9.271 8.492 8.373 10.392 10.559 9.975 8.153 7.349 7.568 + 8.855 8.289 7.390 6.973 6.477 7.826 6.468 7.077 7.360 7.188 6.733 7.682 7.835 7.633 7.496 7.494 7.853 9.760 9.470 8.790 7.516 8.412 7.436 7.335 6.853 7.826 8.432 6.749 5.819 6.092 7.584 8.225 8.159 5.818 6.630 6.786 + 12.393 12.384 11.392 11.335 12.601 12.560 12.547 13.127 11.801 10.075 10.238 8.280 8.426 7.256 8.061 7.912 8.755 10.376 10.745 9.547 7.693 7.928 8.139 8.185 7.893 9.073 9.177 7.864 6.185 7.275 9.222 9.869 9.804 8.565 7.201 7.362 + 13.262 12.950 12.709 12.372 13.401 14.719 15.359 15.691 13.952 12.271 11.619 11.363 9.835 10.619 10.423 11.196 11.774 13.351 12.783 11.057 9.902 9.448 10.055 10.178 8.989 11.098 11.244 9.716 8.890 9.340 11.982 12.324 11.910 10.860 8.522 8.049 + 12.579 12.665 12.754 12.647 13.647 14.919 16.044 16.854 15.559 13.531 12.474 12.077 11.362 11.678 11.985 12.441 13.553 15.208 14.194 12.417 11.315 10.784 10.840 10.068 9.212 11.126 11.218 10.400 10.293 10.553 13.627 13.794 13.392 12.231 8.497 6.824 + 12.578 12.314 11.960 12.428 12.941 13.718 15.239 16.383 14.637 13.961 12.378 9.948 8.639 8.198 9.883 10.913 12.493 14.700 13.433 11.999 11.002 10.533 10.121 8.494 7.847 9.395 9.296 9.482 9.756 9.548 10.919 11.107 9.382 8.472 6.782 5.486 + 12.665 12.060 12.189 12.423 12.611 13.292 15.092 15.106 15.146 12.847 11.900 10.673 9.213 8.842 10.181 10.712 12.445 14.396 12.768 11.585 11.211 11.112 10.816 9.321 9.659 10.293 9.454 8.364 9.456 10.505 11.341 11.636 10.065 8.382 6.633 5.567 + 12.579 11.672 11.880 11.892 12.164 12.848 14.069 15.410 14.913 13.778 12.113 9.900 9.435 10.294 10.916 11.692 13.453 14.187 12.180 11.288 10.898 10.895 10.753 8.831 8.687 9.859 9.458 8.759 9.426 9.870 10.718 11.040 10.217 9.718 7.382 5.855 + 12.675 11.621 11.821 11.729 11.854 12.617 14.294 15.517 15.334 14.053 12.227 10.798 10.185 10.835 11.418 12.117 14.043 14.582 12.363 11.460 10.914 10.920 11.141 9.524 8.457 9.433 9.669 8.987 9.602 10.112 11.253 11.459 10.714 10.409 7.204 6.551 + 12.728 11.926 11.985 11.921 11.937 12.994 14.221 15.930 16.041 14.710 13.388 11.461 11.562 11.382 12.043 12.986 14.712 14.805 12.765 11.900 11.125 11.289 11.713 10.339 9.517 10.002 10.172 9.286 10.135 10.810 12.157 12.179 11.088 10.567 7.551 6.834 + 12.816 12.334 12.233 12.126 12.342 13.241 14.465 16.228 16.238 15.287 14.085 12.038 12.275 12.012 12.771 13.912 15.286 14.952 13.119 12.301 11.670 11.851 12.036 11.763 11.524 10.513 10.117 9.886 10.078 10.499 12.651 12.746 12.820 12.009 8.041 6.994 + 12.880 12.394 12.220 11.997 12.449 13.256 14.202 16.151 16.167 15.226 14.451 12.198 12.331 12.108 13.149 14.532 15.904 14.810 13.168 12.230 11.687 11.584 12.113 12.801 12.271 10.862 10.690 11.160 10.958 10.698 12.539 12.873 12.829 12.113 8.598 8.493 + 12.881 12.328 12.235 11.867 12.573 13.233 14.003 16.136 16.286 15.078 14.619 12.436 12.351 12.432 13.570 14.717 15.590 14.687 12.967 12.180 11.611 11.689 12.777 13.702 12.800 10.482 10.936 11.285 10.359 9.508 12.143 12.656 12.373 11.703 8.765 8.096 + 12.786 11.891 11.940 11.564 12.396 12.968 13.253 16.192 16.204 14.931 14.355 11.889 12.301 12.324 13.350 14.436 15.470 13.935 12.096 11.617 11.173 11.651 12.525 13.139 12.067 10.028 10.591 10.833 9.815 8.136 12.208 12.524 12.081 11.517 8.511 8.455 + 12.715 11.627 11.912 11.443 12.097 12.943 13.278 16.004 16.096 14.716 14.137 11.706 12.201 12.291 13.387 14.529 14.824 13.338 11.746 11.408 11.005 11.404 12.341 12.931 11.891 9.781 10.289 11.368 9.465 8.060 12.170 12.496 12.067 11.723 8.325 9.114 + 12.716 11.922 11.979 11.660 12.051 13.065 13.758 16.062 16.155 14.788 14.164 11.956 12.342 12.407 13.612 15.129 14.665 12.919 11.726 11.306 10.822 11.162 12.267 13.223 12.286 9.782 10.379 11.706 9.886 8.427 11.427 11.802 11.943 11.514 8.336 9.212 + 12.752 12.251 12.123 11.792 12.268 13.176 14.021 16.030 15.930 14.733 14.166 11.974 12.439 12.511 14.103 15.245 14.243 12.763 11.989 11.386 10.895 11.341 12.379 13.011 11.979 9.647 10.139 11.742 10.279 8.551 11.208 11.742 11.461 11.044 7.550 7.112 + 12.987 12.486 12.262 11.862 12.311 13.221 14.191 15.909 15.751 14.553 14.062 11.876 12.534 12.720 14.205 14.417 13.815 12.327 11.579 10.821 11.010 11.431 12.192 13.101 12.614 9.660 10.761 11.826 10.079 8.560 11.048 11.927 11.608 11.173 7.738 7.201 + 12.987 12.426 12.180 11.520 12.101 12.916 14.284 15.592 15.542 14.338 13.913 12.145 12.999 13.398 14.208 13.750 12.217 11.445 10.869 10.624 10.733 11.207 12.163 13.124 12.553 10.227 10.168 11.100 10.211 6.956 9.866 11.161 11.084 10.629 8.206 6.479 + 13.022 11.961 11.727 11.171 11.918 12.640 14.292 15.146 15.128 14.255 13.591 12.331 12.933 13.577 14.203 12.493 11.160 10.619 9.893 9.947 10.091 10.503 11.193 12.478 12.806 11.186 9.138 10.684 10.126 7.058 9.156 10.770 10.688 10.264 9.221 7.703 + 12.764 11.713 10.800 11.469 10.953 12.756 14.246 14.701 14.272 14.038 13.062 13.795 13.156 13.985 12.397 11.127 10.189 9.776 9.703 10.184 10.218 10.508 10.834 11.834 12.775 11.360 8.416 10.315 9.830 6.776 8.166 10.637 10.253 9.804 9.710 9.215 + 12.172 11.718 11.673 10.153 10.613 12.032 12.606 13.515 13.952 13.461 13.598 13.657 13.634 12.774 9.086 6.351 7.937 9.268 9.106 9.725 9.750 9.895 9.983 10.065 11.187 10.796 7.663 10.168 9.765 5.729 5.994 8.458 8.444 8.391 9.895 10.463 + 11.399 11.409 11.432 10.260 9.665 10.490 10.747 11.281 11.477 11.689 11.824 11.311 10.793 8.787 7.242 6.108 5.897 7.696 8.073 7.482 7.244 7.495 7.442 8.498 9.195 9.904 9.066 7.711 7.892 5.803 6.910 8.303 8.680 8.953 10.482 10.767 + 8.893 7.925 8.018 7.904 7.297 7.478 7.235 8.487 9.205 9.000 6.802 7.120 8.178 6.916 6.181 7.342 6.641 7.267 8.009 7.748 7.945 7.807 8.410 8.788 9.422 9.898 9.278 6.480 7.130 7.021 6.959 8.539 9.526 8.702 9.401 9.003 + 8.270 7.787 7.843 6.783 5.166 6.252 6.322 7.229 7.276 7.859 8.013 7.965 7.678 7.041 5.699 7.146 6.998 6.917 7.606 7.658 6.559 6.207 7.401 7.750 7.689 8.437 8.358 7.081 8.013 7.036 6.257 8.412 9.259 8.545 7.607 8.222 + 9.884 8.522 8.253 6.220 4.435 5.966 6.860 7.834 7.046 7.473 8.229 7.411 7.510 6.718 5.878 7.129 6.715 7.846 7.586 7.229 5.673 6.172 7.446 7.215 7.021 7.015 8.639 7.497 7.719 7.453 8.006 8.696 9.011 8.960 7.458 6.773 + 9.950 9.133 8.215 5.624 6.811 7.998 8.466 7.352 6.491 5.246 6.469 6.134 6.005 6.530 5.997 5.709 6.581 7.397 7.546 7.432 5.651 6.754 7.835 7.932 6.869 8.099 7.155 7.152 7.587 8.087 7.984 8.388 9.992 9.404 8.114 7.374 + 10.441 8.278 7.446 7.513 6.531 7.551 8.020 7.544 7.663 5.975 6.593 5.427 5.995 6.789 6.637 5.467 6.054 6.059 7.107 7.310 6.856 7.793 8.768 8.101 8.260 8.414 8.708 8.118 7.911 8.234 8.238 9.570 10.437 10.639 9.533 8.933 + 10.388 7.588 8.483 8.033 6.764 7.322 5.160 6.314 7.544 5.930 6.503 6.796 6.546 6.583 6.376 6.615 6.710 6.434 6.949 6.573 6.917 8.782 9.308 8.488 8.460 8.111 8.209 7.509 8.111 7.741 8.031 10.009 10.747 10.545 10.338 10.230 + 9.278 8.286 7.885 7.370 7.140 5.943 7.298 7.571 6.748 7.239 6.657 6.727 6.795 6.232 5.674 6.749 7.316 6.725 7.156 7.292 6.101 7.665 9.636 8.993 8.073 8.151 7.556 7.501 7.619 7.256 8.100 9.924 10.636 9.484 9.176 9.357 + 9.994 8.468 5.949 6.600 7.227 6.827 6.444 7.218 6.815 5.536 5.365 6.314 6.270 5.835 6.295 5.494 6.061 6.508 7.147 6.610 6.522 7.691 7.298 9.221 8.990 8.887 8.393 8.080 7.396 7.918 8.593 9.576 9.933 9.331 9.243 7.997 + 9.687 9.077 8.338 8.438 7.344 7.695 7.579 7.606 8.020 7.190 7.777 7.941 5.780 6.030 6.066 6.754 6.409 7.184 7.052 6.378 6.256 7.888 8.422 8.521 8.552 8.166 7.610 7.220 8.175 8.296 8.505 9.545 10.209 9.417 9.141 8.549 + 8.779 9.738 9.006 7.477 6.794 6.759 8.662 9.703 9.650 9.126 9.322 9.019 8.546 7.298 5.926 8.739 8.679 6.702 7.113 6.990 5.787 7.155 8.278 7.882 8.285 7.956 8.327 6.791 7.660 7.699 8.250 8.454 9.368 8.737 8.943 8.495 + 8.731 8.946 7.839 7.548 7.055 6.759 9.655 10.577 9.448 9.302 10.011 8.786 8.449 8.461 8.370 9.097 8.534 7.528 6.853 6.911 6.029 7.212 8.088 8.456 7.997 6.550 7.299 7.007 7.087 6.595 7.394 7.874 8.450 8.283 8.707 8.548 + 7.971 7.048 7.205 6.688 7.300 7.467 9.787 10.843 11.355 10.589 10.463 10.612 9.523 9.789 9.842 10.783 10.107 8.280 7.816 7.561 5.808 6.087 7.341 8.297 7.854 6.752 7.167 6.340 7.133 6.900 6.867 7.280 7.426 7.117 6.694 6.215 + 9.118 8.374 6.003 7.737 7.757 8.519 10.371 11.663 12.434 11.042 10.112 10.512 8.544 8.867 9.075 11.373 11.024 9.300 8.202 7.696 6.158 7.581 7.193 7.869 7.199 7.295 7.360 6.595 6.756 6.324 5.843 7.547 7.717 6.433 6.009 5.994 + 7.020 7.264 6.857 7.411 7.568 8.540 10.672 11.076 12.137 10.862 10.942 10.497 9.335 8.450 8.927 10.819 10.926 9.969 7.767 6.942 6.788 6.995 6.139 6.660 7.698 8.009 6.806 6.238 5.952 6.372 5.782 7.140 6.767 6.543 6.780 5.687 + 8.228 8.217 6.863 7.064 6.680 7.431 10.924 11.023 11.274 10.755 10.837 9.943 9.448 8.726 9.192 8.682 9.275 9.739 8.167 7.051 6.283 5.563 5.595 6.653 8.176 7.726 7.198 6.339 5.566 5.978 5.978 7.069 7.292 6.186 5.598 5.246 + 6.948 8.101 7.251 7.034 6.358 6.955 11.146 11.280 10.489 9.948 10.143 9.653 9.149 8.360 9.017 8.930 9.136 9.232 7.147 7.368 6.562 5.365 6.652 6.398 8.619 8.626 6.567 5.894 5.425 5.899 6.228 6.315 6.240 5.595 5.784 4.905 + 7.813 8.191 6.969 7.296 7.025 8.305 11.174 11.220 10.841 9.611 9.156 8.897 8.732 8.405 8.620 8.771 10.280 9.359 7.290 6.136 5.791 7.084 6.583 5.769 8.495 8.566 6.943 6.487 4.649 6.628 6.797 6.616 6.611 5.349 5.474 4.873 + 6.201 7.444 6.965 7.570 7.939 8.488 10.548 11.340 11.901 10.345 9.343 7.672 7.097 8.027 7.931 9.600 9.757 8.843 8.083 6.379 5.610 7.034 6.735 6.436 8.132 7.739 6.448 5.290 4.777 6.829 6.958 7.243 5.886 4.668 4.930 4.900 + 6.556 6.975 6.338 6.284 7.440 8.178 8.880 10.433 11.614 9.890 9.140 7.969 6.578 7.250 8.266 9.266 8.349 8.167 7.484 6.079 5.365 5.739 5.603 6.218 7.887 8.161 6.448 6.079 4.796 5.980 6.467 7.116 5.520 4.517 5.678 4.971 + 5.164 4.651 6.017 6.017 6.611 7.001 8.991 8.676 10.185 9.430 8.097 7.674 5.744 6.255 7.309 9.468 9.329 8.277 7.061 5.844 4.553 4.819 6.502 6.065 6.989 6.381 6.643 5.964 5.336 5.901 6.169 6.052 5.406 5.066 5.362 5.326 + 6.022 6.380 5.255 4.951 5.461 6.666 6.814 7.091 9.212 8.978 8.490 8.117 7.446 6.405 6.510 9.330 8.025 7.452 5.600 5.208 4.328 5.147 5.752 6.279 6.454 6.104 5.853 5.557 4.776 4.892 5.390 5.444 5.655 5.681 5.472 4.639 + 6.250 6.894 5.131 3.580 6.621 7.761 8.083 7.827 9.894 8.677 7.531 7.877 7.464 7.102 6.025 9.569 9.429 8.036 5.549 4.737 4.272 5.334 5.567 6.222 6.661 6.264 5.396 4.839 5.169 5.296 4.815 5.591 5.759 5.346 5.391 4.670 + 7.262 7.384 5.999 5.127 5.847 8.087 9.031 7.940 8.879 9.253 8.900 7.898 6.953 7.577 8.061 9.233 7.927 7.426 6.316 4.310 4.745 6.328 5.861 5.802 5.602 5.263 5.975 5.217 5.026 5.858 4.627 5.872 5.778 5.168 5.921 4.776 + 7.683 5.821 3.135 4.755 5.459 7.744 7.984 7.501 7.675 8.299 8.085 7.630 6.042 6.370 8.389 9.161 7.574 6.144 5.820 6.346 5.952 5.621 5.502 5.421 5.990 5.739 5.719 5.398 4.098 5.025 4.956 5.822 6.060 6.288 6.079 4.448 + 5.816 6.620 6.242 6.151 6.419 7.497 6.928 7.286 7.838 8.004 6.187 7.584 7.179 6.305 8.211 8.825 7.534 6.314 5.603 6.045 5.641 5.417 5.431 5.067 5.790 6.343 5.124 5.817 4.384 4.504 4.926 5.893 6.344 5.614 5.528 4.684 + 6.683 6.479 6.450 7.074 6.553 7.589 8.300 8.852 8.024 7.778 6.330 7.167 7.339 6.352 6.832 8.454 7.929 6.216 4.998 5.307 5.687 5.925 6.466 6.110 5.821 5.630 5.635 5.693 4.946 5.200 5.142 6.268 6.062 5.657 4.842 4.633 + 7.316 7.234 5.195 7.104 8.469 9.563 8.394 8.113 8.061 7.252 6.945 6.481 6.665 6.066 6.290 8.402 7.898 6.950 5.668 4.754 5.662 6.495 6.185 7.039 7.536 6.493 5.882 6.582 6.484 5.840 6.969 8.381 8.331 7.312 6.043 5.084 + 6.762 6.771 5.381 5.850 9.664 10.545 8.221 7.592 5.881 5.022 6.201 5.261 5.184 4.422 5.837 8.120 7.312 6.118 6.312 6.124 5.634 6.559 8.408 10.281 10.344 9.115 8.913 9.408 8.894 7.228 8.980 10.906 10.506 9.145 7.315 5.185 + 6.032 6.768 4.577 3.849 10.578 12.460 11.163 8.253 8.637 6.835 5.935 6.225 5.766 5.298 5.973 7.543 6.708 5.960 6.583 5.313 5.769 6.106 8.983 10.455 11.086 10.000 9.559 9.921 9.891 7.300 9.407 10.798 10.580 9.702 7.499 5.004 + 6.943 7.671 6.326 4.869 11.236 13.462 12.316 7.580 7.521 6.586 6.541 6.519 7.376 6.885 5.987 7.093 6.855 5.591 6.496 5.433 5.199 7.750 9.180 10.240 11.298 10.484 9.905 10.291 10.105 7.944 10.072 11.301 11.413 10.474 7.786 5.728 + 6.695 8.535 7.432 6.137 11.413 13.732 12.354 9.140 8.471 8.212 7.637 6.325 6.242 7.310 7.044 7.552 6.745 5.851 6.845 6.301 6.335 8.690 9.713 10.986 11.943 11.066 10.659 10.725 10.398 8.643 9.986 11.522 11.264 9.707 7.820 5.517 + 8.195 9.257 7.688 6.009 11.991 14.106 12.701 9.340 9.319 7.212 7.026 6.537 7.129 6.826 6.184 8.319 7.863 6.447 7.486 6.438 6.670 9.661 10.858 11.771 12.820 11.463 11.478 11.478 10.911 10.016 11.140 11.878 11.912 10.962 8.099 5.191 + 6.553 8.950 7.771 4.539 12.068 14.002 12.176 10.200 9.940 7.448 7.464 6.309 6.599 6.514 6.691 7.098 7.544 7.274 7.459 6.941 6.833 9.525 10.948 11.692 12.631 10.768 10.788 11.082 10.910 10.044 11.273 12.353 12.427 11.528 8.871 5.997 + 6.888 8.789 8.365 6.845 12.649 14.189 12.144 10.574 10.256 8.319 7.852 7.059 6.585 6.621 6.502 7.295 7.279 7.018 7.277 6.259 6.872 9.183 10.761 11.291 12.209 10.279 10.547 10.777 10.237 9.606 10.634 12.528 12.470 11.320 9.364 6.018 diff --git a/test/regression/chan3-smoothspec.cepview b/test/regression/chan3-smoothspec.cepview new file mode 100644 index 0000000..f65433c --- /dev/null +++ b/test/regression/chan3-smoothspec.cepview @@ -0,0 +1,2178 @@ + 5.386 5.066 4.613 4.237 3.998 3.807 3.584 3.402 3.457 3.877 4.552 5.165 5.423 4.688 5.481 6.331 7.030 7.386 7.355 7.104 6.917 6.989 7.280 7.553 7.570 7.294 6.929 6.763 6.950 7.404 7.877 8.137 8.109 7.879 7.607 7.435 + 3.618 3.976 4.484 4.865 4.936 4.697 4.299 3.933 3.754 3.835 4.165 4.642 5.090 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.725 4.219 4.860 5.243 5.235 5.035 4.941 5.073 5.292 5.385 5.293 5.156 5.135 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.987 4.147 4.449 4.822 5.127 5.222 5.075 4.812 4.639 4.700 4.970 5.296 5.541 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 4.177 4.150 4.197 4.399 4.697 4.927 4.971 4.872 4.789 4.827 4.929 4.945 4.823 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.756 3.524 4.577 5.298 5.367 4.944 4.495 4.398 4.665 4.983 5.016 4.709 4.342 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.305 3.696 4.257 4.680 4.760 4.518 4.177 4.014 4.186 4.626 5.103 5.374 5.344 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.319 4.004 4.885 5.360 5.157 4.490 3.835 3.534 3.572 3.688 3.670 3.568 3.630 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.593 3.995 4.553 4.963 5.083 4.993 4.870 4.793 4.678 4.396 3.959 3.585 3.580 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.834 3.711 3.621 3.728 4.044 4.404 4.586 4.481 4.164 3.827 3.653 3.734 4.087 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 1.740 2.557 3.737 4.662 4.936 4.586 3.981 3.547 3.503 3.797 4.228 4.636 4.987 5.325 5.662 5.933 6.046 5.993 5.885 5.896 6.130 6.537 6.940 7.155 7.113 6.904 6.711 6.685 6.864 7.169 7.468 7.662 7.723 7.688 7.620 7.573 + 5.196 4.786 4.244 3.930 4.044 4.501 5.011 5.276 5.166 4.767 4.296 3.971 3.920 4.154 4.581 5.058 5.449 5.684 5.796 5.886 6.050 6.286 6.493 6.547 6.417 6.215 6.126 6.273 6.617 6.994 7.237 7.292 7.237 7.183 7.185 7.211 + 8.865 8.412 7.659 6.834 6.124 5.600 5.208 4.848 4.486 4.189 4.073 4.187 4.438 4.631 4.610 4.378 4.109 4.018 4.201 4.586 5.012 5.375 5.703 6.079 6.519 6.906 7.072 6.956 6.684 6.494 6.551 6.826 7.127 7.275 7.246 7.166 + 7.880 7.485 6.730 5.776 4.939 4.547 4.697 5.134 5.406 5.210 4.631 4.064 3.875 4.088 4.388 4.424 4.125 3.755 3.661 3.960 4.452 4.828 4.947 4.937 5.022 5.292 5.611 5.772 5.706 5.542 5.467 5.538 5.638 5.618 5.462 5.310 + 6.485 6.189 5.638 4.981 4.481 4.383 4.711 5.191 5.418 5.162 4.563 4.021 3.881 4.157 4.551 4.721 4.561 4.240 4.008 3.969 4.046 4.137 4.264 4.546 5.024 5.537 5.819 5.744 5.477 5.358 5.589 6.034 6.314 6.155 5.657 5.225 + 4.243 4.135 4.092 4.253 4.532 4.657 4.425 3.929 3.520 3.510 3.899 4.364 4.539 4.326 3.960 3.762 3.847 4.038 4.076 3.906 3.751 3.911 4.461 5.151 5.588 5.557 5.183 4.818 4.750 5.010 5.396 5.664 5.706 5.577 5.407 5.298 + 5.627 5.470 5.155 4.735 4.353 4.166 4.215 4.356 4.347 4.057 3.610 3.329 3.491 4.089 4.792 5.169 4.990 4.396 3.790 3.560 3.822 4.372 4.853 4.987 4.720 4.214 3.728 3.482 3.567 3.926 4.380 4.712 4.765 4.529 4.160 3.890 + 3.693 4.038 4.526 4.906 5.038 4.950 4.748 4.476 4.081 3.508 2.832 2.294 2.167 2.552 3.267 3.945 4.265 4.168 3.871 3.688 3.788 4.083 4.314 4.260 3.914 3.486 3.243 3.327 3.666 4.039 4.224 4.128 3.809 3.414 3.083 2.900 + 3.801 3.408 2.988 2.963 3.450 4.157 4.602 4.483 3.882 3.180 2.773 2.832 3.258 3.807 4.253 4.466 4.412 4.136 3.761 3.458 3.366 3.488 3.664 3.677 3.435 3.058 2.799 2.835 3.110 3.377 3.393 3.108 2.682 2.333 2.161 2.118 + 2.453 2.567 2.915 3.550 4.278 4.708 4.521 3.749 2.812 2.251 2.364 3.026 3.811 4.309 4.374 4.144 3.861 3.684 3.620 3.594 3.553 3.488 3.418 3.351 3.295 3.282 3.348 3.479 3.580 3.519 3.236 2.808 2.410 2.188 2.152 2.190 + 3.216 3.742 4.457 4.948 5.029 4.827 4.611 4.535 4.532 4.437 4.195 3.938 3.862 4.022 4.257 4.305 4.033 3.544 3.099 2.919 3.033 3.303 3.562 3.732 3.831 3.898 3.931 3.899 3.794 3.650 3.499 3.330 3.088 2.753 2.396 2.158 + 4.372 5.078 5.847 5.969 5.288 4.316 3.762 3.912 4.435 4.742 4.543 4.063 3.760 3.861 4.155 4.241 3.941 3.467 3.198 3.305 3.604 3.767 3.660 3.459 3.437 3.665 3.921 3.919 3.604 3.219 3.076 3.263 3.581 3.759 3.712 3.595 + 4.514 4.949 5.590 6.092 6.174 5.763 5.015 4.212 3.580 3.178 2.938 2.793 2.784 3.011 3.486 4.012 4.270 4.047 3.448 2.861 2.685 3.015 3.566 3.915 3.851 3.536 3.337 3.478 3.823 4.004 3.754 3.164 2.601 2.393 2.544 2.762 + 5.189 5.077 5.108 5.488 6.071 6.383 5.982 4.855 3.483 2.514 2.315 2.762 3.409 3.854 3.969 3.856 3.655 3.410 3.127 2.886 2.844 3.099 3.553 3.944 4.046 3.858 3.591 3.467 3.521 3.595 3.537 3.382 3.332 3.553 3.970 4.306 + 7.692 7.615 7.493 7.377 7.313 7.299 7.267 7.127 6.838 6.466 6.149 5.992 5.964 5.917 5.700 5.293 4.827 4.474 4.317 4.312 4.408 4.661 5.241 6.251 7.551 8.745 9.411 9.393 8.929 8.466 8.320 8.459 8.584 8.439 8.058 7.731 + 11.102 11.186 11.271 11.264 11.134 10.905 10.584 10.142 9.568 8.943 8.428 8.127 7.975 7.776 7.410 7.006 6.894 7.312 8.130 8.872 9.090 8.771 8.413 8.634 9.629 10.949 11.828 11.796 11.047 10.257 9.989 10.246 10.546 10.422 9.882 9.385 + 12.162 12.684 13.368 13.768 13.669 13.171 12.515 11.850 11.158 10.382 9.567 8.863 8.392 8.144 8.045 8.114 8.515 9.393 10.619 11.737 12.227 11.900 11.088 10.410 10.301 10.691 11.132 11.229 10.980 10.713 10.702 10.848 10.761 10.163 9.234 8.526 + 12.239 12.855 13.789 14.617 15.000 14.811 14.126 13.137 12.075 11.146 10.483 10.087 9.836 9.586 9.339 9.312 9.802 10.916 12.367 13.574 14.034 13.691 12.986 12.518 12.586 12.995 13.299 13.233 12.954 12.849 13.103 13.451 13.370 12.575 11.363 10.455 + 12.807 13.411 14.355 15.251 15.769 15.743 15.198 14.297 13.295 12.459 11.955 11.748 11.614 11.321 10.868 10.580 10.906 12.033 13.627 14.977 15.476 15.076 14.315 13.867 13.997 14.391 14.515 14.178 13.742 13.775 14.437 15.202 15.221 14.081 12.268 10.901 + 13.239 13.774 14.685 15.692 16.454 16.683 16.257 15.298 14.143 13.187 12.656 12.479 12.363 12.060 11.624 11.432 11.910 13.136 14.683 15.842 16.120 15.587 14.800 14.333 14.324 14.432 14.239 13.724 13.347 13.609 14.489 15.284 15.087 13.561 11.353 9.742 + 13.551 13.910 14.654 15.707 16.779 17.421 17.272 16.317 14.949 13.740 13.073 12.905 12.868 12.631 12.226 12.061 12.573 13.809 15.302 16.365 16.588 16.124 15.517 15.219 15.208 15.079 14.505 13.658 13.160 13.539 14.655 15.628 15.433 13.736 11.290 9.514 + 13.729 13.904 14.440 15.449 16.706 17.663 17.776 16.911 15.471 14.130 13.365 13.151 13.089 12.820 12.393 12.249 12.826 14.135 15.667 16.741 16.992 16.608 16.098 15.813 15.651 15.221 14.319 13.274 12.790 13.356 14.707 15.842 15.688 13.939 11.414 9.585 + 13.930 13.919 14.235 15.153 16.482 17.572 17.772 16.941 15.558 14.337 13.680 13.454 13.242 12.828 12.428 12.494 13.278 14.571 15.842 16.633 16.843 16.668 16.311 15.768 14.905 13.735 12.592 11.996 12.274 13.246 14.243 14.476 13.523 11.603 9.493 8.127 + 14.060 13.957 14.154 15.009 16.371 17.578 17.932 17.246 15.964 14.766 14.043 13.696 13.411 13.084 12.965 13.395 14.413 15.640 16.550 16.875 16.744 16.456 16.126 15.586 14.625 13.331 12.168 11.666 11.997 12.787 13.351 13.147 12.096 10.575 9.152 8.313 + 14.066 14.064 14.370 15.252 16.559 17.722 18.133 17.590 16.412 15.162 14.243 13.731 13.518 13.565 13.958 14.730 15.671 16.387 16.581 16.306 15.908 15.684 15.579 15.228 14.334 13.045 11.956 11.696 12.413 13.607 14.426 14.204 12.853 10.851 8.950 7.814 + 13.849 14.094 14.667 15.588 16.666 17.519 17.773 17.291 16.254 15.055 14.104 13.671 13.833 14.473 15.303 15.928 16.012 15.485 14.649 14.037 14.042 14.581 15.085 14.892 13.773 12.182 10.997 10.912 11.943 13.397 14.336 14.149 12.865 11.027 9.342 8.362 + 13.570 13.972 14.756 15.801 16.831 17.466 17.401 16.611 15.411 14.333 13.858 14.153 14.980 15.808 16.087 15.529 14.276 12.844 11.875 11.792 12.556 13.647 14.335 14.095 12.927 11.379 10.238 10.071 10.891 12.158 13.089 13.085 12.020 10.276 8.530 7.453 + 13.459 13.766 14.468 15.533 16.634 17.239 16.958 15.873 14.557 13.722 13.756 14.487 15.322 15.646 15.156 13.975 12.519 11.290 10.691 10.900 11.782 12.877 13.547 13.295 12.085 10.440 9.173 8.908 9.682 10.941 11.894 11.990 11.184 9.869 8.603 7.849 + 13.157 13.631 14.500 15.559 16.464 16.835 16.456 15.451 14.289 13.558 13.627 14.400 15.339 15.767 15.261 13.903 12.233 10.940 10.503 10.960 11.934 12.844 13.176 12.691 11.497 10.011 8.806 8.386 8.939 10.189 11.449 11.929 11.158 9.302 7.144 5.710 + 13.013 13.710 14.808 15.878 16.566 16.700 16.278 15.430 14.406 13.575 13.308 13.766 14.696 15.483 15.480 14.448 12.773 11.263 10.642 11.100 12.207 13.226 13.552 12.996 11.781 10.360 9.227 8.794 9.261 10.472 11.854 12.583 12.030 10.211 7.922 6.345 + 13.284 13.995 15.051 15.974 16.452 16.439 16.036 15.340 14.438 13.526 12.960 13.091 13.951 15.088 15.760 15.421 14.131 12.568 11.590 11.662 12.572 13.607 14.029 13.504 12.225 10.735 9.634 9.338 9.940 11.167 12.432 13.043 12.542 11.013 9.135 7.855 + 13.269 13.997 15.087 16.039 16.507 16.433 15.964 15.270 14.451 13.594 12.887 12.614 12.984 13.909 14.955 15.553 15.367 14.543 13.639 13.243 13.559 14.243 14.623 14.157 12.810 11.111 9.842 9.576 10.354 11.679 12.793 13.082 12.357 10.920 9.390 8.421 + 13.572 14.067 14.898 15.778 16.367 16.417 15.887 14.967 13.961 13.121 12.551 12.250 12.222 12.525 13.192 14.107 14.985 15.530 15.639 15.489 15.369 15.399 15.370 14.885 13.711 12.073 10.615 10.023 10.573 11.917 13.272 13.870 13.373 12.026 10.487 9.486 + 13.596 13.947 14.630 15.506 16.259 16.506 16.041 15.002 13.809 12.886 12.396 12.207 12.098 12.002 12.085 12.567 13.501 14.682 15.788 16.588 17.025 17.120 16.825 16.013 14.649 12.987 11.576 10.996 11.483 12.727 13.993 14.523 13.950 12.492 10.825 9.735 + 13.543 13.843 14.469 15.339 16.168 16.551 16.213 15.227 13.996 12.992 12.448 12.252 12.123 11.897 11.686 11.785 12.428 13.593 15.023 16.383 17.417 17.974 17.953 17.274 15.975 14.334 12.874 12.163 12.491 13.635 14.918 15.549 15.062 13.596 11.838 10.661 + 13.448 13.648 14.161 15.010 15.943 16.490 16.266 15.277 13.952 12.854 12.291 12.142 12.041 11.737 11.334 11.208 11.702 12.844 14.335 15.757 16.813 17.408 17.542 17.187 16.309 15.011 13.654 12.770 12.766 13.606 14.737 15.359 14.901 13.404 11.547 10.281 + 13.381 13.556 14.038 14.882 15.872 16.549 16.492 15.634 14.343 13.178 12.503 12.263 12.111 11.756 11.253 10.980 11.335 12.402 13.863 15.216 16.105 16.492 16.557 16.442 16.115 15.459 14.512 13.596 13.168 13.475 14.280 14.941 14.820 13.763 12.266 11.190 + 13.524 13.545 13.844 14.628 15.745 16.672 16.854 16.126 14.856 13.675 13.011 12.811 12.675 12.266 11.652 11.280 11.607 12.710 14.189 15.449 16.100 16.164 15.948 15.713 15.470 15.044 14.351 13.583 13.128 13.246 13.796 14.255 14.072 13.098 11.758 10.801 + 13.197 13.242 13.531 14.246 15.311 16.327 16.789 16.423 15.399 14.226 13.399 13.054 12.926 12.636 12.092 11.631 11.774 12.768 14.297 15.647 16.199 15.867 15.112 14.523 14.342 14.338 14.127 13.620 13.158 13.174 13.701 14.193 13.901 12.536 10.627 9.245 + 12.909 12.923 13.162 13.836 14.903 15.999 16.623 16.465 15.634 14.582 13.775 13.368 13.143 12.781 12.231 11.842 12.096 13.160 14.635 15.770 16.002 15.375 14.483 13.959 13.959 14.098 13.889 13.278 12.753 12.889 13.709 14.492 14.272 12.668 10.345 8.648 + 12.878 12.847 13.042 13.719 14.833 15.977 16.624 16.492 15.732 14.790 14.067 13.653 13.353 12.968 12.559 12.453 12.957 14.030 15.212 15.896 15.760 14.992 14.135 13.666 13.662 13.814 13.765 13.453 13.154 13.178 13.490 13.637 13.075 11.662 9.900 8.676 + 12.706 12.673 12.895 13.648 14.863 16.080 16.737 16.567 15.771 14.831 14.134 13.735 13.438 13.101 12.848 12.988 13.700 14.778 15.682 15.900 15.323 14.331 13.505 13.191 13.283 13.376 13.159 12.693 12.345 12.418 12.805 12.990 12.423 10.995 9.232 8.018 + 12.488 12.456 12.716 13.561 14.876 16.118 16.686 16.366 15.462 14.510 13.857 13.476 13.156 12.843 12.772 13.233 14.215 15.263 15.749 15.340 14.273 13.184 12.620 12.644 12.845 12.728 12.160 11.487 11.235 11.661 12.487 13.066 12.829 11.710 10.231 9.198 + 11.965 11.991 12.351 13.292 14.627 15.768 16.146 15.651 14.688 13.802 13.252 12.921 12.619 12.413 12.619 13.425 14.531 15.224 14.896 13.590 12.059 11.239 11.538 12.526 13.288 13.132 12.095 10.866 10.233 10.528 11.459 12.395 12.823 12.638 12.124 11.716 + 11.583 11.803 12.319 13.156 14.163 15.012 15.365 15.072 14.264 13.276 12.469 12.081 12.186 12.712 13.477 14.195 14.522 14.180 13.145 11.747 10.574 10.177 10.741 11.947 13.157 13.792 13.675 13.095 12.566 12.462 12.771 13.153 13.213 12.807 12.148 11.656 + 12.640 12.912 13.400 14.044 14.799 15.555 16.059 15.987 15.190 13.925 12.810 12.447 12.986 13.993 14.763 14.827 14.217 13.300 12.372 11.458 10.485 9.621 9.342 10.071 11.686 13.433 14.418 14.319 13.652 13.299 13.667 14.257 14.072 12.571 10.299 8.601 + 13.113 13.200 13.472 14.066 15.020 16.132 16.941 16.959 16.048 14.645 13.563 13.444 14.256 15.288 15.680 15.069 13.806 12.562 11.727 11.164 10.542 9.870 9.637 10.352 11.925 13.538 14.260 13.887 13.187 13.227 14.300 15.476 15.285 13.039 9.647 7.128 + 13.012 12.984 13.152 13.791 14.965 16.344 17.298 17.271 16.233 14.817 13.941 14.129 15.067 15.803 15.500 14.113 12.413 11.301 11.042 11.105 10.787 9.991 9.410 9.857 11.399 13.137 13.953 13.568 12.872 13.126 14.670 16.374 16.446 14.026 10.170 7.264 + 12.694 12.730 13.027 13.822 15.092 16.424 17.199 17.006 16.005 14.905 14.486 14.970 15.774 15.913 14.790 12.745 10.834 9.994 10.286 10.880 10.839 9.990 9.087 9.097 10.259 11.810 12.685 12.537 12.109 12.510 14.039 15.652 15.715 13.454 9.862 7.161 + 12.557 12.626 13.000 13.886 15.163 16.340 16.853 16.492 15.608 14.886 14.819 15.287 15.607 15.059 13.492 11.502 10.008 9.555 9.905 10.293 10.107 9.429 8.930 9.226 10.275 11.391 11.885 11.761 11.764 12.670 14.417 15.895 15.717 13.404 10.001 7.513 + 12.301 12.550 13.119 14.028 15.118 16.046 16.457 16.235 15.629 15.110 15.007 15.194 15.134 14.288 12.615 10.706 9.396 9.115 9.540 9.881 9.591 8.891 8.592 9.337 10.925 12.367 12.710 11.912 10.965 11.045 12.404 13.983 14.194 12.292 9.157 6.778 + 11.908 12.336 13.106 14.043 14.915 15.494 15.655 15.458 15.123 14.879 14.763 14.534 13.819 12.447 10.696 9.206 8.547 8.754 9.247 9.280 8.598 7.733 7.617 8.758 10.690 12.227 12.394 11.284 10.050 9.966 11.285 12.905 13.201 11.401 8.363 6.046 + 11.502 12.146 13.139 14.075 14.656 14.822 14.718 14.554 14.470 14.450 14.317 13.809 12.733 11.156 9.477 8.271 7.928 8.325 8.841 8.801 8.055 7.192 7.127 8.320 10.268 11.788 11.939 10.848 9.680 9.692 11.105 12.781 13.075 11.220 8.109 5.740 + 11.105 12.053 13.390 14.410 14.746 14.542 14.232 14.148 14.292 14.402 14.176 13.441 12.207 10.654 9.118 8.023 7.680 8.038 8.610 8.762 8.231 7.434 7.218 8.145 9.902 11.420 11.712 10.749 9.584 9.489 10.802 12.494 12.939 11.302 8.381 6.119 + 10.845 11.987 13.516 14.534 14.676 14.284 13.974 14.053 14.304 14.270 13.686 12.646 11.421 10.204 9.077 8.164 7.696 7.815 8.310 8.650 8.416 7.774 7.458 8.147 9.756 11.333 11.805 10.964 9.768 9.556 10.811 12.575 13.157 11.609 8.683 6.379 + 10.473 11.679 13.268 14.287 14.407 14.070 13.958 14.305 14.711 14.563 13.624 12.217 10.891 9.952 9.327 8.819 8.406 8.230 8.320 8.439 8.290 7.918 7.817 8.516 9.984 11.461 12.029 11.444 10.463 10.231 11.213 12.643 13.092 11.732 9.194 7.197 + 10.655 11.615 12.964 14.011 14.444 14.470 14.512 14.769 15.039 14.921 14.179 12.921 11.505 10.287 9.470 9.102 9.127 9.380 9.582 9.451 8.949 8.429 8.472 9.413 10.956 12.259 12.558 11.821 10.849 10.634 11.476 12.626 12.857 11.528 9.243 7.485 + 11.203 11.596 12.341 13.319 14.323 15.125 15.587 15.732 15.685 15.538 15.238 14.634 13.638 12.387 11.223 10.486 10.266 10.331 10.312 10.020 9.635 9.581 10.170 11.299 12.454 13.072 12.971 12.522 12.375 12.928 13.952 14.681 14.360 12.845 10.811 9.374 + 11.476 11.422 11.675 12.573 14.024 15.489 16.381 16.533 16.299 16.188 16.368 16.485 15.992 14.686 12.974 11.610 11.121 11.406 11.848 11.860 11.366 10.845 10.885 11.666 12.793 13.629 13.824 13.597 13.525 14.013 14.890 15.477 15.087 13.600 11.654 10.292 + 11.370 11.130 11.137 11.898 13.429 15.163 16.368 16.707 16.457 16.195 16.250 16.412 16.153 15.152 13.649 12.297 11.644 11.692 11.930 11.797 11.195 10.577 10.559 11.376 12.658 13.720 14.119 14.003 13.945 14.403 15.252 15.797 15.296 13.604 11.413 9.881 + 11.414 11.145 11.036 11.577 12.892 14.589 16.026 16.758 16.814 16.586 16.439 16.391 16.131 15.352 14.095 12.787 11.934 11.710 11.832 11.814 11.412 10.854 10.659 11.179 12.270 13.392 14.061 14.254 14.393 14.901 15.704 16.156 15.518 13.630 11.219 9.536 + 11.494 11.248 11.100 11.484 12.597 14.213 15.793 16.811 17.084 16.851 16.529 16.354 16.193 15.703 14.700 13.397 12.296 11.787 11.817 11.940 11.730 11.182 10.744 10.915 11.779 12.911 13.762 14.160 14.445 15.067 15.996 16.545 15.854 13.694 10.886 8.908 + 11.649 11.422 11.250 11.520 12.465 13.968 15.578 16.756 17.210 17.074 16.760 16.598 16.554 16.275 15.445 14.134 12.810 11.978 11.770 11.850 11.752 11.336 10.929 11.013 11.745 12.783 13.595 13.968 14.193 14.720 15.575 16.129 15.541 13.543 10.893 9.011 + 11.664 11.519 11.384 11.531 12.226 13.525 15.134 16.506 17.175 17.085 16.634 16.328 16.347 16.380 15.922 14.770 13.265 12.044 11.524 11.577 11.705 11.541 11.191 11.104 11.610 12.583 13.564 14.205 14.576 14.997 15.567 15.884 15.319 13.646 11.458 9.905 + 11.791 11.629 11.456 11.555 12.210 13.494 15.103 16.447 17.021 16.782 16.206 15.906 16.105 16.425 16.212 15.124 13.478 12.021 11.325 11.350 11.553 11.431 10.985 10.683 10.980 11.879 12.932 13.660 13.952 14.048 14.153 14.110 13.509 12.162 10.472 9.281 + 11.918 11.752 11.553 11.587 12.141 13.315 14.830 16.101 16.606 16.291 15.652 15.352 15.658 16.185 16.202 15.265 13.632 12.082 11.289 11.308 11.598 11.564 11.086 10.587 10.598 11.262 12.220 12.957 13.225 13.149 12.954 12.654 12.032 10.962 9.704 8.833 + 11.765 11.560 11.297 11.264 11.776 12.929 14.396 15.528 15.781 15.172 14.332 14.027 14.502 15.236 15.351 14.377 12.688 11.211 10.655 10.944 11.353 11.210 10.503 9.855 9.905 10.715 11.740 12.354 12.389 12.175 12.077 12.037 11.619 10.520 9.032 7.948 + 11.556 11.495 11.356 11.259 11.505 12.337 13.590 14.642 14.842 14.107 13.102 12.746 13.409 14.531 15.060 14.364 12.785 11.329 10.767 10.996 11.246 10.919 10.213 9.926 10.618 11.969 13.003 12.963 12.019 11.088 10.936 11.428 11.666 10.909 9.368 8.108 + 11.423 11.483 11.482 11.421 11.577 12.272 13.448 14.500 14.684 13.790 12.454 11.727 12.203 13.488 14.514 14.443 13.339 12.020 11.267 11.164 11.194 10.925 10.548 10.680 11.634 12.922 13.573 13.025 11.707 10.701 10.730 11.435 11.676 10.622 8.627 7.031 + 11.384 11.381 11.341 11.337 11.596 12.313 13.347 14.162 14.166 13.218 11.840 10.873 10.846 11.591 12.458 12.912 12.940 12.912 13.075 13.248 13.041 12.378 11.723 11.714 12.493 13.427 13.585 12.584 11.018 9.985 10.097 10.865 11.099 9.998 7.961 6.348 + 11.253 11.274 11.239 11.169 11.278 11.790 12.620 13.276 13.189 12.212 10.826 9.798 9.585 10.023 10.606 11.047 11.535 12.407 13.581 14.400 14.162 12.865 11.403 10.892 11.665 12.885 13.233 12.102 10.200 8.946 9.160 10.244 10.670 9.394 6.898 4.897 + 11.395 11.416 11.346 11.164 11.079 11.353 11.970 12.501 12.403 11.503 10.195 9.120 8.622 8.523 8.462 8.432 8.897 10.280 12.295 13.877 13.948 12.415 10.430 9.544 10.408 12.172 13.199 12.489 10.553 8.916 8.702 9.606 10.213 9.376 7.360 5.662 + 11.080 11.297 11.447 11.278 10.880 10.625 10.791 11.239 11.483 11.110 10.152 9.058 8.305 8.039 8.080 8.252 8.641 9.469 10.708 11.861 12.228 11.480 10.029 8.788 8.488 9.119 9.996 10.378 10.074 9.516 9.265 9.469 9.782 9.771 9.382 8.989 + 10.992 11.300 11.578 11.486 11.024 10.534 10.361 10.500 10.582 10.230 9.427 8.554 8.044 7.993 8.106 8.035 7.773 7.712 8.265 9.392 10.484 10.756 9.851 8.165 6.612 6.014 6.588 7.878 9.138 9.818 9.818 9.407 8.943 8.645 8.537 8.525 + 10.548 10.968 11.376 11.303 10.686 9.921 9.500 9.565 9.783 9.667 9.019 8.105 7.410 7.219 7.408 7.624 7.654 7.618 7.807 8.327 8.905 9.041 8.404 7.129 5.771 4.965 5.053 5.932 7.182 8.310 8.951 8.949 8.353 7.391 6.420 5.813 + 9.919 10.248 10.622 10.697 10.340 9.720 9.160 8.876 8.809 8.687 8.242 7.420 6.426 5.598 5.204 5.304 5.746 6.259 6.593 6.618 6.364 5.980 5.643 5.455 5.400 5.396 5.395 5.464 5.737 6.282 6.967 7.482 7.521 7.022 6.260 5.702 + 9.315 9.556 9.807 9.786 9.386 8.774 8.289 8.186 8.431 8.690 8.554 7.838 6.747 5.761 5.314 5.501 6.007 6.343 6.190 5.617 5.008 4.764 5.010 5.516 5.881 5.828 5.390 4.878 4.668 4.969 5.734 6.723 7.657 8.358 8.779 8.965 + 8.983 9.084 9.129 8.955 8.558 8.121 7.888 7.981 8.321 8.695 8.894 8.814 8.475 7.975 7.464 7.104 7.024 7.234 7.575 7.786 7.681 7.308 6.947 6.906 7.274 7.827 8.208 8.215 7.989 7.903 8.266 9.083 10.061 10.853 11.300 11.462 + 9.202 9.169 9.120 9.088 9.107 9.193 9.328 9.476 9.614 9.742 9.852 9.890 9.763 9.427 8.981 8.663 8.703 9.121 9.648 9.892 9.646 9.090 8.690 8.835 9.503 10.252 10.573 10.314 9.820 9.640 10.047 10.791 11.305 11.198 10.602 10.062 + 9.135 9.266 9.525 9.865 10.177 10.334 10.274 10.056 9.805 9.599 9.393 9.072 8.602 8.146 8.013 8.435 9.337 10.299 10.790 10.525 9.696 8.865 8.597 9.066 9.944 10.644 10.742 10.273 9.678 9.465 9.840 10.586 11.265 11.558 11.481 11.312 + 10.214 10.468 10.969 11.639 12.282 12.650 12.589 12.148 11.539 10.976 10.528 10.133 9.745 9.471 9.537 10.073 10.910 11.591 11.651 10.973 9.932 9.183 9.210 9.981 10.961 11.496 11.285 10.586 10.009 10.059 10.763 11.668 12.187 12.036 11.434 10.915 + 10.079 10.557 11.456 12.571 13.518 13.886 13.508 12.604 11.639 10.986 10.686 10.522 10.326 10.223 10.539 11.435 12.609 13.389 13.202 12.047 10.564 9.608 9.645 10.452 11.330 11.655 11.314 10.713 10.413 10.702 11.420 12.136 12.467 12.322 11.916 11.590 + 10.139 10.650 11.545 12.561 13.356 13.648 13.371 12.719 12.011 11.476 11.130 10.867 10.654 10.635 11.002 11.737 12.481 12.697 12.055 10.739 9.390 8.698 8.948 9.838 10.733 11.118 10.930 10.517 10.331 10.587 11.149 11.681 11.900 11.754 11.418 11.157 + 10.069 10.489 11.253 12.157 12.875 13.102 12.745 12.005 11.228 10.655 10.284 9.978 9.711 9.664 10.064 10.873 11.670 11.882 11.224 9.972 8.805 8.329 8.667 9.442 10.144 10.526 10.699 10.903 11.204 11.452 11.488 11.377 11.386 11.725 12.300 12.750 + 10.734 10.439 10.045 9.764 9.667 9.672 9.697 9.772 9.979 10.292 10.501 10.367 9.881 9.367 9.262 9.736 10.489 10.940 10.691 9.869 9.046 8.786 9.221 9.999 10.627 10.889 10.963 11.185 11.706 12.380 12.937 13.266 13.483 13.766 14.135 14.413 + 8.839 9.167 9.539 9.634 9.380 9.029 8.959 9.356 10.030 10.542 10.521 9.958 9.217 8.779 8.898 9.431 9.965 10.119 9.814 9.304 8.979 9.091 9.605 10.255 10.750 10.967 11.004 11.088 11.414 12.027 12.817 13.597 14.211 14.597 14.784 14.849 + 10.660 10.523 10.188 9.648 9.041 8.615 8.567 8.890 9.377 9.772 9.941 9.933 9.891 9.916 10.016 10.137 10.233 10.278 10.236 10.067 9.791 9.544 9.536 9.895 10.517 11.102 11.373 11.341 11.340 11.783 12.802 14.089 15.099 15.463 15.274 14.978 + 9.865 9.873 9.919 10.014 10.103 10.087 9.910 9.628 9.390 9.331 9.470 9.697 9.873 9.958 10.054 10.305 10.750 11.234 11.484 11.295 10.698 9.960 9.432 9.338 9.655 10.180 10.695 11.125 11.557 12.133 12.912 13.808 14.640 15.253 15.603 15.746 + 9.916 9.983 10.091 10.192 10.236 10.201 10.131 10.112 10.216 10.427 10.629 10.686 10.551 10.327 10.212 10.358 10.748 11.196 11.461 11.407 11.084 10.675 10.373 10.269 10.343 10.528 10.797 11.181 11.736 12.471 13.328 14.199 14.973 15.574 15.972 16.167 + 12.502 11.945 11.240 10.847 10.890 11.093 11.085 10.774 10.431 10.408 10.770 11.190 11.234 10.774 10.149 9.905 10.339 11.230 11.999 12.161 11.688 10.998 10.608 10.747 11.236 11.693 11.866 11.808 11.800 12.121 12.848 13.837 14.837 15.640 16.159 16.402 + 8.762 9.057 9.524 9.952 10.120 9.929 9.503 9.154 9.196 9.717 10.470 11.015 11.023 10.527 9.917 9.673 10.032 10.821 11.598 11.965 11.830 11.426 11.112 11.121 11.433 11.859 12.209 12.434 12.637 12.968 13.522 14.276 15.116 15.893 16.481 16.794 + 10.212 9.839 9.442 9.385 9.697 10.049 10.074 9.723 9.322 9.266 9.653 10.203 10.525 10.486 10.317 10.377 10.808 11.402 11.807 11.859 11.716 11.692 11.947 12.348 12.619 12.614 12.473 12.498 12.897 13.624 14.445 15.136 15.621 15.953 16.188 16.323 + 9.166 8.813 8.492 8.607 9.195 9.870 10.155 9.899 9.401 9.137 9.339 9.798 10.069 9.875 9.369 9.020 9.258 10.163 11.434 12.608 13.341 13.526 13.259 12.728 12.139 11.683 11.499 11.609 11.906 12.236 12.534 12.888 13.458 14.284 15.167 15.750 + 6.857 6.720 6.554 6.493 6.589 6.756 6.821 6.662 6.329 6.040 6.023 6.317 6.705 6.874 6.702 6.424 6.512 7.301 8.659 9.977 10.544 10.028 8.711 7.279 6.346 6.079 6.198 6.302 6.231 6.152 6.360 6.982 7.876 8.748 9.370 9.672 + 4.184 4.285 4.412 4.499 4.572 4.722 5.000 5.335 5.581 5.648 5.597 5.589 5.725 5.932 6.004 5.783 5.313 4.819 4.529 4.491 4.545 4.471 4.171 3.729 3.315 3.044 2.917 2.900 3.013 3.340 3.933 4.714 5.487 6.061 6.369 6.478 + 2.108 2.638 3.650 4.950 6.155 6.840 6.814 6.289 5.755 5.630 5.947 6.355 6.423 6.000 5.320 4.783 4.622 4.740 4.846 4.726 4.400 4.054 3.829 3.695 3.516 3.219 2.893 2.726 2.854 3.272 3.871 4.551 5.266 5.984 6.608 6.982 + 6.583 6.951 7.648 8.575 9.560 10.407 10.969 11.196 11.116 10.772 10.199 9.454 8.680 8.084 7.837 7.946 8.225 8.427 8.435 8.362 8.459 8.894 9.580 10.206 10.452 10.211 9.653 9.081 8.721 8.595 8.568 8.490 8.310 8.078 7.878 7.767 + 8.140 8.257 8.668 9.511 10.658 11.731 12.348 12.404 12.125 11.851 11.750 11.715 11.518 11.071 10.537 10.202 10.237 10.577 11.025 11.459 11.941 12.610 13.474 14.301 14.735 14.549 13.828 12.931 12.257 12.006 12.094 12.266 12.291 12.106 11.817 11.606 + 10.874 11.130 11.658 12.415 13.223 13.794 13.854 13.321 12.380 11.398 10.708 10.421 10.392 10.383 10.290 10.244 10.517 11.277 12.415 13.574 14.379 14.678 14.604 14.425 14.306 14.202 13.947 13.459 12.856 12.382 12.207 12.285 12.405 12.378 12.198 12.027 + 11.935 12.149 12.640 13.457 14.521 15.560 16.167 16.015 15.099 13.806 12.702 12.165 12.156 12.325 12.393 12.457 12.900 13.972 15.413 16.527 16.700 15.941 14.922 14.437 14.719 15.246 15.231 14.377 13.193 12.557 12.882 13.671 13.902 12.941 11.183 9.799 + 12.003 12.015 12.240 12.916 14.093 15.494 16.590 16.885 16.241 14.993 13.749 12.988 12.795 12.918 13.105 13.377 13.973 15.001 16.162 16.856 16.661 15.750 14.821 14.537 14.939 15.395 15.181 14.196 13.138 12.915 13.765 14.908 15.105 13.721 11.379 9.585 + 11.894 11.829 11.915 12.433 13.518 14.999 16.422 17.257 17.178 16.256 14.913 13.691 12.979 12.883 13.283 13.984 14.804 15.574 16.098 16.209 15.890 15.347 14.908 14.783 14.880 14.876 14.520 13.913 13.480 13.611 14.244 14.801 14.575 13.323 11.566 10.296 + 11.849 11.901 12.083 12.538 13.393 14.629 15.982 16.990 17.212 16.511 15.184 13.824 12.998 12.964 13.596 14.540 15.434 16.041 16.259 16.095 15.651 15.131 14.763 14.662 14.724 14.700 14.431 14.047 13.916 14.315 15.085 15.608 15.212 13.733 11.772 10.386 + 11.999 12.214 12.571 13.036 13.682 14.620 15.802 16.907 17.451 17.100 15.948 14.530 13.532 13.387 14.050 15.086 15.969 16.377 16.297 15.932 15.526 15.236 15.078 14.961 14.761 14.422 14.042 13.864 14.128 14.840 15.633 15.888 15.116 13.354 11.278 9.880 + 11.793 12.064 12.496 13.020 13.706 14.673 15.859 16.897 17.278 16.721 15.447 14.095 13.328 13.426 14.179 15.110 15.815 16.135 16.100 15.801 15.338 14.861 14.564 14.557 14.733 14.812 14.602 14.261 14.245 14.890 15.961 16.606 15.917 13.696 10.821 8.805 + 11.801 11.990 12.344 12.877 13.674 14.776 16.022 17.006 17.269 16.622 15.326 13.982 13.177 13.165 13.796 14.703 15.537 16.076 16.204 15.884 15.207 14.446 13.965 13.971 14.320 14.593 14.467 14.058 13.890 14.410 15.452 16.157 15.548 13.370 10.490 8.452 + 11.509 11.477 11.613 12.180 13.301 14.808 16.256 17.119 17.061 16.127 14.719 13.385 12.563 12.433 12.934 13.854 14.905 15.750 16.061 15.662 14.692 13.606 12.943 12.958 13.427 13.815 13.734 13.302 13.074 13.527 14.528 15.274 14.846 12.987 10.467 8.672 + 11.850 11.460 11.208 11.694 13.050 14.767 16.018 16.224 15.402 14.073 12.828 11.959 11.417 11.082 11.008 11.413 12.389 13.641 14.536 14.502 13.461 11.946 10.763 10.436 10.870 11.476 11.666 11.303 10.750 10.513 10.774 11.223 11.325 10.793 9.867 9.152 + 10.302 9.838 9.355 9.329 9.842 10.531 10.945 10.942 10.734 10.567 10.386 9.873 8.842 7.597 6.849 7.184 8.536 10.149 11.112 11.033 10.294 9.696 9.805 10.554 11.392 11.786 11.629 11.230 10.982 11.029 11.218 11.291 11.123 10.781 10.435 10.226 + 12.960 12.274 11.321 10.606 10.334 10.303 10.140 9.642 8.916 8.230 7.754 7.444 7.180 6.985 7.073 7.656 8.690 9.810 10.560 10.746 10.605 10.637 11.235 12.390 13.708 14.687 15.045 14.835 14.336 13.826 13.429 13.120 12.826 12.520 12.245 12.080 + 13.802 13.319 12.488 11.511 10.562 9.757 9.154 8.786 8.639 8.625 8.586 8.380 7.997 7.615 7.507 7.857 8.604 9.458 10.108 10.464 10.749 11.336 12.454 13.961 15.378 16.185 16.154 15.497 14.715 14.258 14.243 14.428 14.447 14.108 13.550 13.125 + 13.186 12.746 11.983 11.094 10.283 9.691 9.352 9.197 9.105 8.973 8.763 8.510 8.286 8.169 8.211 8.422 8.779 9.237 9.759 10.357 11.095 12.057 13.251 14.542 15.665 16.344 16.467 16.174 15.781 15.581 15.646 15.789 15.737 15.361 14.806 14.397 + 9.688 9.521 9.159 8.645 8.175 8.027 8.363 9.061 9.740 9.993 9.663 8.944 8.257 7.972 8.208 8.818 9.536 10.164 10.666 11.154 11.800 12.729 13.942 15.274 16.427 17.097 17.143 16.706 16.144 15.820 15.860 16.078 16.143 15.862 15.350 14.949 + 9.917 9.547 9.020 8.618 8.505 8.647 8.869 8.993 8.934 8.708 8.372 7.988 7.639 7.461 7.629 8.262 9.316 10.569 11.731 12.613 13.243 13.823 14.560 15.499 16.473 17.219 17.549 17.474 17.169 16.840 16.589 16.377 16.105 15.731 15.334 15.073 + 9.888 9.134 8.098 7.402 7.416 8.068 8.961 9.664 9.932 9.753 9.256 8.625 8.074 7.822 8.030 8.689 9.602 10.494 11.211 11.820 12.521 13.442 14.491 15.424 16.048 16.376 16.583 16.806 16.988 16.930 16.512 15.852 15.256 14.981 15.025 15.160 + 13.552 12.774 11.672 10.776 10.293 10.034 9.707 9.246 8.850 8.723 8.814 8.859 8.686 8.467 8.609 9.366 10.546 11.625 12.199 12.351 12.585 13.353 14.623 15.884 16.579 16.568 16.202 15.951 15.984 16.074 15.901 15.419 14.915 14.719 14.871 15.094 + 14.017 13.115 11.868 10.931 10.564 10.535 10.451 10.168 9.854 9.703 9.636 9.350 8.684 7.918 7.647 8.289 9.674 11.128 12.012 12.240 12.300 12.767 13.748 14.777 15.229 14.878 14.074 13.415 13.249 13.457 13.666 13.640 13.461 13.359 13.429 13.549 + 14.276 13.182 11.635 10.421 9.897 9.838 9.766 9.431 8.981 8.722 8.746 8.823 8.667 8.289 8.065 8.424 9.434 10.686 11.590 11.836 11.603 11.357 11.443 11.834 12.222 12.338 12.171 11.916 11.759 11.712 11.663 11.531 11.361 11.259 11.266 11.313 + 14.017 13.090 11.916 11.324 11.672 12.632 13.513 13.796 13.443 12.773 12.111 11.574 11.133 10.821 10.796 11.183 11.859 12.454 12.613 12.290 11.798 11.547 11.693 12.019 12.133 11.814 11.186 10.580 10.241 10.147 10.072 9.807 9.326 8.772 8.320 8.079 + 13.498 13.243 12.916 12.779 13.012 13.568 14.173 14.466 14.223 13.510 12.624 11.892 11.478 11.361 11.467 11.783 12.314 12.930 13.291 13.040 12.132 11.010 10.365 10.605 11.454 12.083 11.762 10.496 9.098 8.544 9.140 10.197 10.564 9.598 7.762 6.316 + 13.077 12.702 12.246 12.098 12.477 13.261 14.047 14.385 14.054 13.180 12.138 11.319 10.935 10.992 11.376 11.954 12.572 13.002 12.979 12.375 11.390 10.552 10.412 11.116 12.197 12.835 12.454 11.194 9.856 9.292 9.717 10.509 10.694 9.765 8.142 6.890 + 12.623 12.406 12.101 11.918 12.042 12.491 13.045 13.321 13.004 12.077 10.882 9.937 9.630 10.009 10.802 11.609 12.106 12.139 11.712 10.977 10.242 9.910 10.286 11.308 12.441 12.927 12.291 10.749 9.140 8.357 8.674 9.529 9.970 9.427 8.192 7.181 + 12.374 12.182 11.900 11.669 11.581 11.613 11.635 11.473 11.020 10.297 9.455 8.706 8.245 8.177 8.491 9.053 9.631 9.971 9.928 9.592 9.302 9.478 10.320 11.588 12.646 12.843 11.976 10.513 9.332 9.137 9.942 11.042 11.527 10.963 9.733 8.748 + 12.210 12.189 12.048 11.736 11.375 11.175 11.222 11.324 11.132 10.437 9.394 8.449 8.021 8.218 8.809 9.441 9.881 10.088 10.118 10.048 9.999 10.186 10.811 11.821 12.747 12.915 11.973 10.327 9.027 9.049 10.485 12.343 13.225 12.415 10.491 8.921 + 11.640 11.203 10.650 10.400 10.664 11.281 11.790 11.736 10.978 9.817 8.831 8.528 9.064 10.189 11.434 12.379 12.813 12.733 12.248 11.534 10.831 10.418 10.483 10.955 11.465 11.555 11.032 10.193 9.670 9.951 10.930 11.881 11.956 10.849 9.110 7.817 + 11.804 11.642 11.459 11.477 11.864 12.589 13.351 13.701 13.313 12.245 10.974 10.141 10.157 10.969 12.128 13.103 13.585 13.570 13.236 12.767 12.289 11.900 11.700 11.714 11.815 11.766 11.422 10.924 10.664 10.971 11.754 12.446 12.367 11.285 9.687 8.517 + 11.338 11.252 11.145 11.189 11.615 12.515 13.631 14.374 14.179 12.957 11.277 10.049 9.922 10.869 12.266 13.383 13.855 13.772 13.412 12.954 12.432 11.918 11.616 11.711 12.102 12.367 12.103 11.366 10.748 10.907 11.898 12.948 12.968 11.478 9.139 7.388 + 11.357 11.171 10.991 11.126 11.837 13.115 14.554 15.487 15.369 14.174 12.490 11.190 10.894 11.607 12.798 13.815 14.281 14.206 13.799 13.250 12.675 12.214 12.061 12.323 12.836 13.182 12.993 12.312 11.637 11.526 12.055 12.637 12.433 11.083 9.118 7.676 + 11.434 11.398 11.480 11.890 12.734 13.874 14.918 15.390 15.016 13.938 12.677 11.849 11.801 12.436 13.321 13.991 14.194 13.943 13.407 12.788 12.280 12.074 12.285 12.816 13.300 13.269 12.502 11.291 10.331 10.234 11.013 11.986 12.246 11.376 9.830 8.638 + 9.797 10.400 11.275 12.045 12.575 12.970 13.318 13.465 13.112 12.163 10.990 10.283 10.547 11.660 12.891 13.401 12.835 11.540 10.260 9.592 9.651 10.130 10.624 10.883 10.844 10.521 9.961 9.308 8.834 8.812 9.285 9.938 10.289 10.052 9.402 8.856 + 9.234 9.830 10.694 11.441 11.898 12.116 12.153 11.891 11.147 9.981 8.873 8.493 9.188 10.608 11.852 12.074 11.098 9.531 8.309 8.037 8.640 9.541 10.147 10.204 9.821 9.237 8.632 8.117 7.811 7.832 8.164 8.573 8.706 8.374 7.742 7.243 + 7.543 7.680 7.669 7.283 6.667 6.265 6.389 6.849 7.054 6.528 5.402 4.382 4.196 4.972 6.106 6.735 6.414 5.433 4.531 4.289 4.739 5.451 5.950 6.063 5.930 5.770 5.685 5.655 5.672 5.787 6.016 6.229 6.194 5.788 5.165 4.698 + 7.255 7.312 7.181 6.697 6.069 5.765 6.068 6.716 7.035 6.509 5.284 4.130 3.842 4.578 5.720 6.368 6.046 5.035 4.076 3.760 4.135 4.805 5.350 5.654 5.860 6.108 6.340 6.377 6.133 5.731 5.386 5.197 5.077 4.884 4.603 4.384 + 6.917 7.035 7.222 7.420 7.604 7.753 7.786 7.549 6.894 5.823 4.581 3.577 3.167 3.428 4.091 4.701 4.897 4.616 4.105 3.734 3.759 4.196 4.850 5.463 5.857 5.990 5.927 5.767 5.587 5.421 5.271 5.124 4.972 4.820 4.692 4.617 + 6.603 6.764 6.959 7.066 7.079 7.093 7.147 7.109 6.728 5.850 4.618 3.457 2.830 2.928 3.542 4.208 4.520 4.378 4.009 3.779 3.954 4.554 5.373 6.105 6.492 6.434 6.041 5.591 5.392 5.605 6.117 6.588 6.667 6.241 5.547 5.029 + 5.894 6.961 8.392 9.327 9.382 8.852 8.346 8.232 8.367 8.312 7.793 6.956 6.236 5.985 6.215 6.660 7.033 7.236 7.336 7.434 7.558 7.706 7.910 8.221 8.607 8.917 8.994 8.875 8.837 9.197 9.990 10.838 11.186 10.756 9.830 9.087 + 9.889 9.234 8.317 7.668 7.630 8.166 8.926 9.473 9.526 9.070 8.326 7.631 7.288 7.441 8.006 8.695 9.161 9.198 8.886 8.544 8.513 8.907 9.523 9.996 10.072 9.792 9.436 9.287 9.418 9.670 9.824 9.794 9.665 9.581 9.599 9.651 + 9.746 9.531 9.394 9.668 10.438 11.454 12.301 12.667 12.499 11.962 11.294 10.714 10.401 10.499 11.048 11.891 12.683 13.065 12.915 12.462 12.135 12.236 12.705 13.171 13.261 12.898 12.343 11.961 11.921 12.084 12.150 11.914 11.403 10.815 10.350 10.108 + 10.544 10.282 10.188 10.754 12.098 13.827 15.281 15.941 15.685 14.756 13.550 12.438 11.719 11.607 12.164 13.184 14.202 14.715 14.514 13.862 13.318 13.315 13.819 14.353 14.388 13.768 12.834 12.149 12.059 12.460 12.905 12.956 12.462 11.609 10.757 10.239 + 11.066 10.835 10.755 11.257 12.435 13.943 15.231 15.891 15.839 15.235 14.306 13.266 12.370 11.945 12.255 13.256 14.498 15.339 15.373 14.742 14.034 13.830 14.255 14.888 15.121 14.647 13.681 12.762 12.318 12.370 12.576 12.532 12.057 11.278 10.500 10.026 + 10.970 10.871 10.917 11.396 12.410 13.760 15.051 15.889 16.058 15.569 14.617 13.510 12.614 12.263 12.630 13.602 14.769 15.608 15.774 15.323 14.684 14.358 14.574 15.121 15.515 15.356 14.626 13.702 13.072 12.973 13.220 13.336 12.903 11.874 10.641 9.806 + 10.536 10.494 10.611 11.129 12.137 13.471 14.779 15.689 15.968 15.589 14.716 13.638 12.714 12.286 12.554 13.453 14.611 15.493 15.691 15.190 14.406 13.926 14.091 14.729 15.260 15.128 14.258 13.165 12.600 12.956 13.892 14.492 13.893 11.959 9.491 7.776 + 10.015 10.256 10.692 11.298 12.109 13.176 14.434 15.619 16.327 16.234 15.315 13.937 12.711 12.198 12.629 13.780 15.088 15.936 15.974 15.311 14.453 14.000 14.252 14.974 15.529 15.330 14.326 13.134 12.644 13.325 14.746 15.741 15.186 12.870 9.800 7.639 + 10.712 10.943 11.340 11.849 12.498 13.371 14.478 15.628 16.440 16.528 15.765 14.447 13.204 12.681 13.157 14.367 15.640 16.302 16.081 15.266 14.492 14.304 14.770 15.428 15.613 14.950 13.680 12.545 12.294 13.125 14.452 15.221 14.587 12.523 9.930 8.149 + 10.574 10.876 11.362 11.905 12.494 13.232 14.210 15.325 16.242 16.546 16.036 14.930 13.822 13.351 13.793 14.869 15.901 16.261 15.791 14.899 14.254 14.298 14.907 15.479 15.373 14.405 13.025 12.053 12.119 13.198 14.563 15.195 14.413 12.336 9.864 8.207 + 9.370 9.859 10.575 11.232 11.774 12.418 13.431 14.802 16.115 16.761 16.369 15.144 13.812 13.194 13.652 14.845 15.949 16.227 15.527 14.374 13.573 13.622 14.347 15.030 14.933 13.852 12.304 11.203 11.248 12.422 13.946 14.732 14.047 11.996 9.506 7.825 + 9.599 9.983 10.543 11.073 11.591 12.339 13.523 15.024 16.326 16.808 16.191 14.818 13.510 13.055 13.693 14.943 15.935 15.998 15.115 13.916 13.217 13.439 14.314 15.067 14.976 13.892 12.387 11.400 11.611 12.955 14.584 15.346 14.487 12.150 9.360 7.489 + 10.154 10.547 11.113 11.625 12.088 12.742 13.818 15.228 16.488 16.983 16.427 15.146 13.939 13.571 14.245 15.447 16.296 16.160 15.108 13.848 13.216 13.572 14.538 15.281 15.112 13.996 12.596 11.834 12.259 13.648 15.103 15.568 14.463 12.053 9.344 7.573 + 9.850 10.286 10.911 11.468 11.937 12.562 13.600 14.994 16.283 16.858 16.416 15.254 14.133 13.780 14.372 15.399 16.033 15.734 14.656 13.531 13.126 13.662 14.650 15.244 14.869 13.649 12.343 11.826 12.489 13.968 15.349 15.708 14.640 12.483 10.140 8.638 + 9.183 9.711 10.436 11.021 11.461 12.103 13.291 14.937 16.423 16.980 16.286 14.793 13.486 13.206 14.036 15.231 15.767 15.098 13.572 12.172 11.795 12.599 13.891 14.646 14.242 12.906 11.549 11.136 12.030 13.752 15.262 15.575 14.308 11.882 9.297 7.652 + 9.939 10.394 11.048 11.640 12.168 12.889 14.027 15.451 16.624 16.947 16.234 14.945 13.930 13.840 14.642 15.618 15.884 15.047 13.512 12.214 11.947 12.800 14.092 14.857 14.522 13.304 12.058 11.697 12.581 14.272 15.774 16.117 14.892 12.488 9.896 8.237 + 10.216 10.675 11.358 12.030 12.686 13.527 14.670 15.896 16.692 16.624 15.739 14.628 14.043 14.348 15.229 15.907 15.710 14.566 13.056 12.008 11.929 12.688 13.644 14.084 13.684 12.703 11.808 11.672 12.563 14.147 15.614 16.082 15.084 12.878 10.382 8.743 + 9.743 10.223 10.947 11.682 12.426 13.362 14.572 15.784 16.452 16.164 15.046 13.787 13.189 13.581 14.547 15.208 14.853 13.451 11.663 10.371 10.091 10.683 11.519 11.952 11.729 11.108 10.653 10.864 11.871 13.331 14.585 14.975 14.195 12.485 10.568 9.315 + 9.287 9.726 10.434 11.259 12.212 13.403 14.781 15.977 16.458 15.936 14.689 13.474 13.031 13.540 14.468 14.943 14.375 12.866 11.115 9.929 9.720 10.313 11.143 11.647 11.573 11.074 10.585 10.579 11.313 12.637 13.999 14.672 14.160 12.549 10.564 9.212 + 9.766 10.011 10.579 11.560 12.937 14.491 15.814 16.462 16.213 15.243 14.088 13.355 13.369 13.970 14.620 14.734 14.025 12.636 11.039 9.780 9.241 9.506 10.337 11.262 11.757 11.511 10.649 9.736 9.470 10.197 11.582 12.729 12.752 11.428 9.445 7.997 + 9.537 9.908 10.680 11.843 13.252 14.584 15.427 15.478 14.748 13.620 12.678 12.380 12.792 13.562 14.154 14.161 13.487 12.321 10.982 9.810 9.121 9.158 9.958 11.193 12.206 12.351 11.476 10.169 9.465 10.104 11.891 13.697 14.210 12.930 10.630 8.866 + 8.214 8.231 8.634 9.793 11.646 13.570 14.707 14.514 13.146 11.384 10.159 10.005 10.802 11.947 12.755 12.815 12.081 10.765 9.202 7.797 6.994 7.148 8.275 9.872 11.064 11.096 9.897 8.261 7.406 8.128 10.167 12.289 13.114 12.115 10.040 8.404 + 8.488 9.259 10.563 12.018 13.235 13.913 13.887 13.178 12.032 10.892 10.243 10.363 11.142 12.115 12.723 12.621 11.835 10.659 9.448 8.476 7.941 8.002 8.709 9.833 10.816 11.020 10.198 8.805 7.824 8.093 9.632 11.520 12.521 12.016 10.501 9.228 + 5.046 5.910 7.273 8.648 9.698 10.312 10.479 10.162 9.339 8.169 7.071 6.540 6.822 7.696 8.587 8.921 8.450 7.318 5.900 4.605 3.807 3.805 4.708 6.217 7.580 7.925 6.886 5.041 3.678 3.920 5.796 8.075 9.108 8.094 5.763 3.876 + 6.661 6.450 6.150 5.992 6.236 6.998 8.089 9.018 9.240 8.514 7.112 5.697 4.921 5.021 5.703 6.381 6.573 6.179 5.465 4.826 4.536 4.632 4.960 5.293 5.433 5.282 4.888 4.446 4.212 4.339 4.734 5.069 4.990 4.390 3.533 2.913 + 7.402 6.901 6.294 6.095 6.580 7.597 8.657 9.221 8.993 8.047 6.759 5.611 4.988 5.020 5.542 6.162 6.452 6.179 5.455 4.679 4.296 4.494 5.074 5.583 5.634 5.182 4.545 4.169 4.303 4.829 5.343 5.427 4.904 3.931 2.906 2.257 + 4.392 4.230 4.121 4.379 5.227 6.605 8.111 9.144 9.225 8.298 6.818 5.516 4.979 5.304 6.068 6.627 6.539 5.817 4.870 4.204 4.106 4.502 5.054 5.390 5.306 4.857 4.294 3.924 3.941 4.314 4.783 4.981 4.653 3.828 2.846 2.184 + 3.237 3.779 4.500 5.035 5.372 5.828 6.663 7.695 8.333 8.044 6.855 5.429 4.602 4.758 5.564 6.274 6.326 5.738 5.005 4.628 4.724 4.997 5.059 4.769 4.308 3.989 3.999 4.289 4.658 4.905 4.909 4.622 4.060 3.322 2.604 2.157 + 5.377 4.738 3.906 3.509 3.980 5.280 6.888 8.082 8.339 7.630 6.410 5.334 4.860 5.007 5.410 5.607 5.355 4.763 4.181 3.944 4.159 4.668 5.171 5.412 5.308 4.962 4.581 4.359 4.379 4.576 4.761 4.714 4.311 3.612 2.863 2.379 + 4.177 4.436 4.965 5.724 6.574 7.309 7.772 7.946 7.952 7.924 7.879 7.696 7.240 6.537 5.834 5.479 5.690 6.388 7.236 7.872 8.149 8.194 8.254 8.446 8.636 8.545 8.004 7.136 6.309 5.874 5.903 6.130 6.164 5.801 5.191 4.725 + 3.118 3.628 4.512 5.539 6.466 7.120 7.460 7.573 7.608 7.670 7.746 7.710 7.432 6.895 6.258 5.782 5.667 5.916 6.335 6.687 6.873 6.994 7.232 7.642 8.042 8.108 7.634 6.731 5.799 5.256 5.236 5.495 5.611 5.332 4.776 4.332 + 4.282 3.910 3.578 3.793 4.752 6.149 7.329 7.715 7.185 6.149 5.258 4.958 5.221 5.629 5.733 5.391 4.835 4.442 4.427 4.707 5.039 5.253 5.372 5.511 5.687 5.750 5.523 5.017 4.486 4.242 4.364 4.582 4.477 3.843 2.913 2.227 + 4.893 4.207 3.411 3.219 3.942 5.268 6.501 7.045 6.766 5.998 5.246 4.869 4.937 5.308 5.774 6.151 6.305 6.169 5.792 5.364 5.141 5.282 5.709 6.125 6.203 5.813 5.114 4.434 4.042 3.976 4.055 4.035 3.779 3.329 2.859 2.562 + 4.398 3.975 3.601 3.843 4.890 6.349 7.473 7.670 6.927 5.819 5.103 5.189 5.881 6.578 6.754 6.336 5.701 5.314 5.347 5.583 5.675 5.494 5.237 5.213 5.507 5.854 5.854 5.338 4.552 3.963 3.870 4.148 4.372 4.208 3.716 3.287 + 3.916 3.462 3.048 3.241 4.179 5.437 6.337 6.465 5.954 5.348 5.164 5.539 6.187 6.670 6.710 6.330 5.762 5.271 5.026 5.074 5.368 5.777 6.116 6.205 5.973 5.521 5.071 4.816 4.793 4.866 4.852 4.664 4.363 4.079 3.898 3.823 + 4.988 4.467 3.876 3.769 4.375 5.419 6.329 6.653 6.367 5.855 5.587 5.772 6.239 6.624 6.670 6.416 6.116 6.002 6.093 6.211 6.161 5.906 5.587 5.377 5.317 5.294 5.159 4.888 4.617 4.515 4.604 4.707 4.575 4.106 3.472 3.016 + 5.607 4.967 4.264 4.195 5.005 6.268 7.174 7.111 6.097 4.765 3.913 3.983 4.820 5.861 6.548 6.671 6.402 6.086 5.963 6.049 6.208 6.297 6.266 6.136 5.936 5.671 5.355 5.051 4.857 4.829 4.899 4.886 4.618 4.075 3.441 3.013 + 3.534 3.576 3.814 4.406 5.324 6.292 6.900 6.862 6.218 5.350 4.769 4.807 5.426 6.255 6.842 6.927 6.572 6.067 5.715 5.651 5.817 6.049 6.204 6.214 6.063 5.769 5.384 5.012 4.786 4.783 4.936 5.042 4.882 4.402 3.784 3.350 + 3.929 3.990 4.303 5.004 5.931 6.656 6.804 6.376 5.783 5.537 5.840 6.439 6.851 6.773 6.313 5.869 5.776 6.033 6.349 6.428 6.233 5.995 5.983 6.245 6.552 6.593 6.231 5.615 5.058 4.793 4.805 4.866 4.724 4.300 3.755 3.373 + 4.819 5.074 5.444 5.786 6.070 6.338 6.560 6.577 6.242 5.640 5.143 5.175 5.848 6.819 7.515 7.576 7.117 6.580 6.317 6.305 6.248 5.949 5.559 5.444 5.784 6.330 6.579 6.240 5.526 4.978 4.954 5.270 5.353 4.790 3.762 2.948 + 5.571 5.496 5.484 5.713 6.242 6.924 7.443 7.498 7.027 6.291 5.741 5.712 6.185 6.796 7.110 6.945 6.489 6.122 6.100 6.365 6.632 6.655 6.429 6.140 5.955 5.861 5.708 5.410 5.071 4.905 5.002 5.192 5.153 4.704 4.007 3.481 + 4.894 5.210 5.716 6.248 6.701 7.040 7.232 7.197 6.849 6.217 5.522 5.103 5.209 5.807 6.570 7.078 7.091 6.698 6.230 6.015 6.155 6.490 6.746 6.737 6.472 6.107 5.805 5.629 5.528 5.408 5.212 4.955 4.695 4.490 4.363 4.307 + 7.630 7.138 6.619 6.579 7.103 7.763 7.990 7.566 6.798 6.247 6.247 6.654 7.010 6.962 6.534 6.064 5.868 5.989 6.208 6.293 6.212 6.131 6.218 6.460 6.673 6.667 6.408 6.036 5.729 5.565 5.484 5.376 5.184 4.935 4.707 4.575 + 6.578 6.640 6.789 7.053 7.408 7.741 7.868 7.645 7.122 6.588 6.425 6.829 7.604 8.243 8.267 7.586 6.579 5.811 5.605 5.823 6.039 5.935 5.570 5.298 5.409 5.851 6.275 6.346 6.035 5.608 5.355 5.313 5.268 5.006 4.558 4.202 + 5.354 6.105 7.214 8.138 8.506 8.319 7.903 7.645 7.721 7.994 8.162 8.022 7.642 7.296 7.224 7.411 7.587 7.454 6.946 6.319 5.961 6.101 6.624 7.166 7.377 7.158 6.683 6.221 5.941 5.843 5.861 5.976 6.235 6.657 7.134 7.457 + 7.532 8.632 10.127 11.089 11.006 10.109 9.178 8.940 9.520 10.352 10.626 9.940 8.641 7.576 7.429 8.176 9.098 9.348 8.634 7.444 6.657 6.843 7.831 8.872 9.231 8.718 7.740 6.916 6.605 6.757 7.115 7.527 8.041 8.728 9.475 9.981 + 7.510 8.297 9.164 9.336 8.662 7.727 7.312 7.696 8.453 8.874 8.596 7.859 7.204 6.957 7.010 7.053 6.965 6.945 7.247 7.850 8.402 8.540 8.226 7.777 7.540 7.553 7.556 7.320 6.953 6.830 7.201 7.864 8.280 8.049 7.313 6.674 + 6.143 7.135 8.350 8.924 8.618 7.946 7.624 7.904 8.408 8.576 8.227 7.694 7.424 7.508 7.624 7.444 7.036 6.831 7.162 7.861 8.366 8.257 7.678 7.224 7.346 7.890 8.228 7.889 7.064 6.468 6.667 7.515 8.256 8.231 7.499 6.785 + 2.439 3.628 5.295 6.586 7.143 7.265 7.512 8.133 8.863 9.223 9.002 8.453 8.035 7.981 8.111 8.043 7.581 6.900 6.380 6.273 6.537 6.944 7.303 7.563 7.709 7.651 7.272 6.622 6.018 5.871 6.343 7.141 7.700 7.634 7.072 6.551 + 4.102 5.095 6.530 7.683 8.129 7.986 7.752 7.904 8.546 9.355 9.841 9.699 9.004 8.137 7.513 7.327 7.470 7.654 7.641 7.402 7.124 7.051 7.281 7.661 7.866 7.619 6.918 6.079 5.563 5.659 6.265 6.928 7.153 6.750 5.983 5.389 + 3.042 4.370 6.262 7.715 8.161 7.801 7.371 7.556 8.479 9.646 10.334 10.126 9.178 8.067 7.364 7.272 7.572 7.868 7.900 7.699 7.482 7.430 7.538 7.639 7.562 7.278 6.912 6.634 6.536 6.578 6.646 6.642 6.545 6.401 6.272 6.199 + 2.610 4.051 6.208 8.052 8.840 8.530 7.762 7.390 7.878 8.982 9.934 10.035 9.193 8.009 7.322 7.578 8.495 9.306 9.364 8.622 7.622 7.027 7.104 7.570 7.885 7.707 7.137 6.574 6.365 6.544 6.869 7.046 6.946 6.645 6.318 6.116 + 2.868 3.695 5.059 6.476 7.464 7.768 7.511 7.117 7.035 7.419 8.023 8.403 8.282 7.790 7.369 7.411 7.927 8.522 8.709 8.298 7.544 6.947 6.865 7.270 7.800 8.065 7.920 7.528 7.179 7.064 7.152 7.266 7.238 7.030 6.744 6.544 + 4.274 4.643 5.424 6.506 7.492 7.869 7.396 6.374 5.491 5.327 5.916 6.760 7.273 7.266 7.047 7.070 7.481 7.990 8.164 7.855 7.358 7.149 7.466 8.122 8.687 8.870 8.720 8.513 8.467 8.561 8.620 8.528 8.336 8.189 8.158 8.187 + 1.162 2.804 5.281 7.432 8.385 8.024 6.991 6.231 6.356 7.267 8.272 8.631 8.111 7.155 6.531 6.742 7.653 8.615 8.970 8.541 7.721 7.134 7.154 7.659 8.196 8.358 8.078 7.620 7.321 7.333 7.540 7.696 7.618 7.307 6.919 6.657 + 3.457 4.832 6.690 7.941 8.115 7.655 7.470 8.135 9.398 10.381 10.276 8.975 7.151 5.763 5.410 5.990 6.881 7.417 7.295 6.665 5.915 5.386 5.202 5.280 5.453 5.586 5.631 5.621 5.625 5.684 5.772 5.800 5.677 5.389 5.041 4.802 + 2.794 4.170 5.960 7.043 7.052 6.600 6.667 7.698 9.210 10.207 10.003 8.729 7.168 6.115 5.850 6.090 6.352 6.320 5.957 5.387 4.774 4.301 4.180 4.542 5.271 5.962 6.168 5.768 5.126 4.842 5.235 6.047 6.631 6.515 5.831 5.204 + 3.130 4.245 5.579 6.148 5.757 5.136 5.229 6.323 7.795 8.683 8.495 7.543 6.551 5.990 5.790 5.608 5.293 5.029 5.041 5.247 5.282 4.902 4.316 4.052 4.439 5.217 5.724 5.522 4.855 4.469 4.905 5.951 6.795 6.761 5.954 5.174 + 3.719 4.718 5.967 6.623 6.458 5.956 5.769 6.079 6.475 6.434 5.889 5.298 5.183 5.604 6.118 6.239 5.929 5.595 5.622 5.926 6.015 5.511 4.604 3.946 4.050 4.792 5.514 5.645 5.252 4.964 5.331 6.254 7.053 7.110 6.475 5.829 + 3.956 4.498 5.360 6.229 6.865 7.163 7.122 6.799 6.316 5.873 5.684 5.833 6.163 6.345 6.126 5.563 5.015 4.853 5.133 5.530 5.624 5.294 4.853 4.780 5.266 6.010 6.461 6.313 5.791 5.464 5.732 6.464 7.114 7.218 6.812 6.379 + 3.479 4.414 5.776 6.897 7.379 7.257 6.850 6.458 6.192 6.023 5.924 5.921 6.017 6.117 6.079 5.856 5.576 5.437 5.501 5.603 5.494 5.103 4.668 4.567 4.979 5.686 6.227 6.282 5.948 5.656 5.785 6.339 6.968 7.301 7.268 7.115 + 4.484 4.976 5.682 6.255 6.520 6.536 6.466 6.406 6.340 6.232 6.119 6.082 6.128 6.137 5.959 5.591 5.237 5.151 5.391 5.726 5.819 5.529 5.063 4.803 4.958 5.365 5.643 5.559 5.267 5.176 5.559 6.268 6.841 6.909 6.531 6.141 + 2.586 3.292 4.392 5.489 6.346 6.940 7.317 7.449 7.251 6.745 6.152 5.776 5.756 5.938 6.010 5.804 5.459 5.290 5.454 5.771 5.868 5.546 4.997 4.652 4.788 5.260 5.639 5.619 5.322 5.180 5.505 6.159 6.655 6.601 6.078 5.585 + 4.193 4.527 5.115 5.825 6.510 7.026 7.250 7.130 6.737 6.275 5.985 5.987 6.185 6.323 6.192 5.801 5.378 5.167 5.204 5.281 5.143 4.746 4.334 4.239 4.575 5.117 5.472 5.427 5.133 4.970 5.198 5.719 6.159 6.212 5.916 5.607 + 3.732 4.296 5.078 5.708 6.106 6.477 6.986 7.482 7.574 7.016 6.021 5.171 4.957 5.372 5.930 6.104 5.773 5.277 5.046 5.188 5.420 5.382 5.012 4.592 4.451 4.642 4.916 5.024 5.000 5.126 5.596 6.231 6.574 6.307 5.588 4.980 + 3.273 3.392 3.758 4.495 5.556 6.676 7.485 7.722 7.395 6.775 6.218 5.946 5.939 6.003 5.952 5.750 5.513 5.385 5.402 5.463 5.428 5.241 4.976 4.757 4.648 4.604 4.541 4.441 4.392 4.513 4.818 5.169 5.358 5.274 5.003 4.772 + 5.053 5.187 5.394 5.632 5.934 6.362 6.903 7.402 7.651 7.548 7.179 6.743 6.373 6.046 5.665 5.226 4.896 4.877 5.188 5.578 5.694 5.383 4.847 4.496 4.603 5.067 5.499 5.553 5.214 4.781 4.577 4.672 4.855 4.874 4.690 4.494 + 4.408 5.055 5.858 6.261 6.117 5.793 5.825 6.454 7.421 8.193 8.376 7.954 7.206 6.436 5.792 5.292 4.949 4.806 4.854 4.943 4.863 4.533 4.126 3.951 4.181 4.678 5.087 5.145 4.903 4.654 4.614 4.693 4.564 4.010 3.192 2.579 + 4.254 4.391 4.559 4.679 4.821 5.190 5.957 7.049 8.106 8.652 8.400 7.460 6.294 5.440 5.189 5.441 5.817 5.943 5.685 5.194 4.748 4.546 4.596 4.754 4.870 4.893 4.876 4.897 4.965 5.012 4.940 4.704 4.342 3.951 3.632 3.457 + 3.397 3.508 3.621 3.662 3.735 4.093 4.938 6.178 7.378 7.980 7.655 6.552 5.244 4.389 4.339 4.950 5.708 6.078 5.829 5.141 4.432 4.079 4.186 4.568 4.911 4.992 4.808 4.546 4.426 4.535 4.767 4.893 4.726 4.258 3.684 3.292 + 2.756 3.232 3.949 4.569 4.841 4.750 4.512 4.434 4.703 5.249 5.784 5.995 5.752 5.202 4.654 4.367 4.384 4.525 4.551 4.345 3.978 3.642 3.493 3.560 3.756 3.968 4.137 4.267 4.367 4.417 4.363 4.166 3.844 3.471 3.149 2.963 + 3.905 3.988 4.273 4.842 5.571 6.145 6.257 5.839 5.135 4.535 4.325 4.519 4.920 5.301 5.559 5.722 5.831 5.849 5.681 5.286 4.762 4.314 4.111 4.167 4.337 4.427 4.339 4.127 3.934 3.875 3.952 4.070 4.117 4.049 3.912 3.805 + 2.970 2.717 2.562 2.893 3.775 4.857 5.605 5.695 5.223 4.594 4.201 4.161 4.319 4.456 4.504 4.565 4.748 5.009 5.150 5.001 4.606 4.227 4.154 4.460 4.925 5.203 5.093 4.708 4.377 4.372 4.667 4.941 4.820 4.186 3.308 2.679 + 3.901 3.192 2.387 2.179 2.756 3.654 4.178 3.988 3.339 2.817 2.825 3.292 3.811 2.320 2.217 2.215 2.295 2.517 2.932 3.480 4.009 4.397 4.666 4.941 5.287 5.602 5.677 5.412 4.963 4.672 4.812 5.372 6.076 6.608 6.847 6.895 + 4.378 3.639 2.714 2.277 2.612 3.408 4.022 3.976 3.302 2.484 2.066 2.259 2.825 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.120 3.165 3.260 3.414 3.630 3.858 3.973 3.813 3.288 2.492 1.712 1.285 1.385 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.814 3.740 3.687 3.772 4.029 4.334 4.446 4.152 3.444 2.594 2.025 2.047 2.624 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.106 2.023 2.029 2.355 3.103 4.096 4.879 4.959 4.154 2.819 1.699 1.464 2.235 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.433 2.230 2.049 2.149 2.600 3.196 3.575 3.474 2.921 2.237 1.828 1.927 2.453 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.262 2.364 2.540 2.749 2.943 3.086 3.155 3.139 3.044 2.900 2.767 2.718 2.807 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.856 1.046 1.491 2.197 3.003 3.617 3.804 3.566 3.155 2.899 2.960 3.242 3.494 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.142 1.711 1.262 1.276 1.907 2.859 3.612 3.803 3.448 2.858 2.365 2.109 2.031 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 4.512 3.674 2.616 2.061 2.266 2.856 3.205 2.981 2.396 1.962 2.020 2.463 2.883 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 5.717 5.015 4.327 4.397 5.252 6.113 6.039 4.764 2.963 1.727 1.697 2.601 3.552 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 9.339 9.520 9.786 10.001 10.060 9.918 9.569 9.022 8.315 7.540 6.843 6.366 6.152 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 11.058 11.268 11.552 11.743 11.744 11.541 11.137 10.505 9.633 8.627 7.730 7.206 7.139 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 9.880 10.171 10.585 10.913 11.039 10.958 10.685 10.175 9.357 8.269 7.142 6.319 6.026 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 9.508 9.483 9.487 9.572 9.716 9.780 9.551 8.862 7.728 6.397 5.259 4.633 4.580 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 6.781 6.860 6.985 7.097 7.121 6.951 6.464 5.585 4.386 3.146 2.257 2.008 2.377 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.866 2.979 3.333 3.987 4.750 5.227 5.088 4.334 3.320 2.507 2.151 2.183 2.342 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.769 4.171 4.794 5.381 5.740 5.828 5.731 5.572 5.414 5.227 4.947 4.550 4.096 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 7.178 7.395 7.570 7.481 7.223 7.190 7.734 8.795 9.865 10.331 9.934 8.955 7.985 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 5.579 5.805 5.878 5.458 4.681 4.142 4.426 5.562 6.912 7.617 7.230 6.027 4.746 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.143 2.714 3.432 3.793 3.612 3.131 2.775 2.789 3.069 3.300 3.252 2.945 2.575 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.460 3.515 3.626 3.793 4.007 4.245 4.462 4.587 4.539 4.258 3.753 3.145 2.650 2.494 2.803 3.508 4.363 5.061 5.401 5.389 5.222 5.145 5.302 5.651 6.023 6.245 6.264 6.166 6.107 6.201 6.451 6.760 7.005 7.122 7.130 7.103 + 2.823 2.692 2.586 2.719 3.222 4.050 4.983 5.719 6.013 5.771 5.088 4.209 3.452 3.120 3.400 4.277 5.503 6.652 7.300 7.240 6.619 5.873 5.478 5.655 6.237 6.797 6.958 6.666 6.209 5.987 6.205 6.730 7.222 7.414 7.313 7.152 + 3.826 4.096 4.379 4.426 4.270 4.243 4.696 5.645 6.660 7.119 6.642 5.383 3.962 3.102 3.217 4.222 5.634 6.865 7.505 7.467 6.971 6.394 6.070 6.125 6.426 6.681 6.655 6.346 5.996 5.912 6.221 6.764 7.215 7.340 7.177 6.979 + 2.592 3.311 4.176 4.576 4.423 4.204 4.476 5.287 6.075 6.152 5.317 4.059 3.164 3.110 3.763 4.601 5.182 5.427 5.518 5.612 5.689 5.672 5.603 5.635 5.834 6.011 5.850 5.232 4.450 4.043 4.343 5.161 5.911 6.103 5.759 5.356 + 5.085 4.760 4.320 4.037 4.074 4.398 4.829 5.180 5.362 5.385 5.283 5.039 4.602 3.963 3.228 2.609 2.311 2.414 2.816 3.298 3.656 3.800 3.774 3.687 3.620 3.589 3.569 3.546 3.538 3.576 3.662 3.749 3.776 3.713 3.596 3.505 + 5.698 6.062 6.464 6.529 6.142 5.525 5.019 4.790 4.709 4.514 4.075 3.521 3.116 3.012 3.108 3.155 2.987 2.678 2.476 2.580 2.964 3.389 3.590 3.468 3.141 2.832 2.702 2.771 2.939 3.083 3.122 3.031 2.827 2.561 2.309 2.154 + 5.620 5.759 5.862 5.750 5.411 5.004 4.703 4.528 4.350 4.048 3.659 3.359 3.288 3.391 3.452 3.298 2.982 2.752 2.831 3.195 3.568 3.642 3.326 2.812 2.406 2.284 2.390 2.540 2.603 2.585 2.555 2.523 2.412 2.158 1.822 1.578 + 4.957 4.960 4.901 4.739 4.528 4.385 4.368 4.408 4.358 4.144 3.839 3.595 3.485 3.416 3.219 2.844 2.448 2.283 2.468 2.851 3.117 3.049 2.706 2.357 2.231 2.325 2.440 2.414 2.290 2.263 2.447 2.701 2.724 2.333 1.679 1.176 + 4.545 4.952 5.477 5.764 5.639 5.201 4.693 4.288 3.986 3.690 3.367 3.108 3.052 3.217 3.442 3.493 3.251 2.834 2.522 2.552 2.944 3.485 3.885 3.957 3.714 3.315 2.936 2.674 2.521 2.419 2.313 2.179 2.021 1.861 1.728 1.652 + 4.875 5.058 5.337 5.563 5.588 5.341 4.890 4.419 4.125 4.089 4.213 4.285 4.117 3.675 3.094 2.585 2.312 2.326 2.571 2.945 3.338 3.645 3.779 3.703 3.466 3.189 2.997 2.928 2.900 2.784 2.515 2.161 1.874 1.767 1.820 1.905 + 6.099 5.674 5.089 4.679 4.605 4.769 4.928 4.891 4.644 4.301 3.965 3.635 3.245 2.771 2.309 2.023 2.026 2.288 2.662 2.993 3.221 3.386 3.558 3.755 3.925 3.999 3.955 3.832 3.700 3.602 3.540 3.488 3.425 3.354 3.292 3.256 + 6.256 6.345 6.389 6.271 6.033 5.857 5.884 6.048 6.104 5.831 5.226 4.520 3.992 3.759 3.735 3.761 3.782 3.874 4.125 4.510 4.897 5.198 5.488 5.953 6.679 7.485 7.981 7.834 7.041 5.981 5.192 5.048 5.566 6.457 7.320 7.833 + 4.912 5.042 5.232 5.389 5.450 5.390 5.204 4.902 4.524 4.162 3.916 3.813 3.750 3.552 3.122 2.568 2.159 2.136 2.506 3.023 3.395 3.545 3.691 4.148 5.013 6.005 6.618 6.501 5.732 4.783 4.199 4.247 4.807 5.538 6.128 6.434 + 5.919 6.197 6.497 6.530 6.233 5.829 5.629 5.763 6.056 6.153 5.799 5.025 4.126 3.442 3.151 3.200 3.400 3.578 3.670 3.707 3.756 3.879 4.120 4.495 4.967 5.421 5.685 5.614 5.176 4.494 3.783 3.242 2.964 2.916 2.988 3.060 + 5.296 5.337 5.326 5.151 4.781 4.322 3.966 3.872 4.033 4.257 4.277 3.940 3.326 2.709 2.373 2.420 2.724 3.044 3.208 3.211 3.162 3.158 3.211 3.280 3.361 3.506 3.736 3.945 3.921 3.509 2.800 2.155 1.982 2.425 3.215 3.819 + 3.163 3.960 4.996 5.577 5.373 4.624 3.900 3.643 3.862 4.197 4.250 3.893 3.319 2.835 2.620 2.636 2.730 2.800 2.855 2.958 3.125 3.305 3.443 3.556 3.719 3.970 4.230 4.318 4.077 3.514 2.832 2.333 2.234 2.535 3.016 3.366 + 6.149 6.265 6.329 6.160 5.758 5.352 5.263 5.653 6.358 6.944 6.966 6.269 5.103 3.976 3.341 3.330 3.707 4.076 4.144 3.890 3.509 3.237 3.191 3.341 3.590 3.861 4.118 4.315 4.369 4.199 3.815 3.349 2.992 2.866 2.932 3.034 + 5.690 6.176 6.618 6.436 5.537 4.429 3.820 4.046 4.809 5.441 5.426 4.762 3.890 3.302 3.199 3.434 3.721 3.870 3.864 3.772 3.647 3.525 3.465 3.555 3.823 4.171 4.407 4.395 4.177 3.936 3.829 3.840 3.803 3.578 3.215 2.934 + 5.794 5.360 4.677 4.064 3.851 4.194 4.946 5.705 6.047 5.811 5.197 4.601 4.310 4.301 4.328 4.181 3.894 3.706 3.825 4.221 4.650 4.864 4.811 4.639 4.518 4.482 4.453 4.396 4.421 4.689 5.196 5.665 5.711 5.166 4.287 3.625 + 3.984 4.185 4.422 4.501 4.363 4.145 4.082 4.334 4.855 5.409 5.718 5.631 5.210 4.669 4.234 4.019 4.002 4.082 4.178 4.284 4.443 4.689 4.985 5.232 5.323 5.231 5.041 4.918 5.012 5.356 5.836 6.248 6.418 6.309 6.047 5.838 + 4.894 4.744 4.540 4.378 4.271 4.173 4.089 4.130 4.424 4.955 5.492 5.728 5.526 5.072 4.754 4.851 5.293 5.710 5.736 5.330 4.817 4.624 4.936 5.550 6.050 6.142 5.861 5.506 5.388 5.605 6.015 6.379 6.542 6.503 6.370 6.266 + 4.035 4.187 4.330 4.296 4.098 3.947 4.095 4.625 5.365 6.004 6.306 6.260 6.043 5.855 5.765 5.699 5.550 5.310 5.099 5.075 5.307 5.712 6.112 6.344 6.346 6.174 5.948 5.779 5.731 5.811 5.988 6.213 6.432 6.609 6.725 6.780 + 2.146 1.691 1.213 1.244 2.028 3.370 4.798 5.886 6.456 6.566 6.361 5.977 5.546 5.228 5.160 5.347 5.614 5.721 5.570 5.323 5.280 5.615 6.191 6.635 6.632 6.186 5.617 5.303 5.396 5.752 6.105 6.309 6.417 6.558 6.765 6.929 + 1.417 1.507 1.705 2.017 2.408 2.813 3.177 3.476 3.705 3.849 3.886 3.826 3.752 3.789 4.006 4.339 4.606 4.651 4.493 4.346 4.474 4.970 5.657 6.190 6.306 6.007 5.544 5.218 5.175 5.348 5.569 5.730 5.842 5.970 6.125 6.240 + 1.485 1.724 2.222 2.894 3.486 3.709 3.496 3.111 2.966 3.266 3.810 4.165 4.067 3.686 3.478 3.748 4.339 4.754 4.619 4.060 3.626 3.815 4.626 5.543 5.968 5.707 5.085 4.618 4.579 4.833 5.066 5.126 5.131 5.282 5.598 5.867 + 2.919 2.585 2.269 2.333 2.793 3.315 3.558 3.511 3.490 3.780 4.298 4.614 4.344 3.543 2.708 2.376 2.676 3.242 3.563 3.424 3.050 2.832 2.941 3.194 3.276 3.082 2.812 2.763 3.024 3.389 3.573 3.490 3.316 3.289 3.457 3.641 + 1.634 2.403 3.387 3.941 3.854 3.471 3.331 3.667 4.214 4.484 4.229 3.661 3.254 3.309 3.697 3.987 3.826 3.228 2.531 2.099 2.055 2.247 2.427 2.463 2.378 2.266 2.182 2.126 2.106 2.154 2.287 2.441 2.494 2.365 2.114 1.914 + 3.388 2.796 2.010 1.515 1.528 1.863 2.124 2.034 1.634 1.214 1.064 1.272 1.710 2.176 2.533 2.746 2.822 2.764 2.589 2.378 2.264 2.344 2.573 2.769 2.734 2.412 1.945 1.581 1.495 1.671 1.927 2.050 1.933 1.623 1.272 1.046 + 2.406 2.343 2.276 2.285 2.408 2.592 2.708 2.622 2.294 1.831 1.434 1.278 1.388 1.622 1.780 1.755 1.619 1.559 1.724 2.098 2.495 2.691 2.582 2.245 1.880 1.673 1.697 1.895 2.147 2.338 2.394 2.285 2.024 1.668 1.322 1.108 + 2.682 2.805 2.887 2.772 2.479 2.194 2.103 2.219 2.376 2.405 2.299 2.216 2.306 2.539 2.707 2.612 2.250 1.837 1.627 1.717 1.999 2.285 2.472 2.583 2.664 2.683 2.546 2.229 1.868 1.692 1.822 2.146 2.389 2.343 2.056 1.792 + 2.176 2.494 2.868 2.990 2.748 2.297 1.902 1.739 1.796 1.964 2.173 2.428 2.736 3.017 3.125 2.982 2.682 2.435 2.400 2.537 2.652 2.584 2.377 2.260 2.451 2.965 3.592 4.074 4.306 4.384 4.481 4.668 4.870 4.966 4.933 4.864 + 2.940 2.388 1.734 1.520 1.950 2.742 3.363 3.433 2.985 2.378 1.995 1.972 2.170 2.351 2.386 2.325 2.299 2.395 2.592 2.806 2.962 3.025 3.000 2.918 2.845 2.876 3.092 3.489 3.953 4.319 4.489 4.505 4.509 4.617 4.813 4.972 + 0.310 0.681 1.210 1.631 1.813 1.810 1.761 1.750 1.766 1.784 1.852 2.074 2.489 2.973 3.285 3.244 2.894 2.496 2.337 2.509 2.845 3.046 2.913 2.477 1.950 1.564 1.435 1.536 1.768 2.018 2.181 2.153 1.870 1.367 0.812 0.447 + 2.023 1.999 1.963 1.935 1.921 1.913 1.898 1.871 1.862 1.927 2.131 2.500 2.979 3.429 3.675 3.596 3.204 2.661 2.203 2.010 2.097 2.310 2.432 2.333 2.060 1.796 1.720 1.869 2.113 2.256 2.173 1.900 1.585 1.368 1.288 1.284 + 3.430 2.887 2.210 1.880 2.049 2.424 2.524 2.093 1.337 0.779 0.865 1.626 2.655 3.399 3.530 3.117 2.508 2.052 1.893 1.949 2.056 2.120 2.157 2.223 2.326 2.404 2.380 2.233 2.018 1.819 1.681 1.584 1.472 1.316 1.145 1.030 + 1.647 1.616 1.646 1.829 2.148 2.474 2.671 2.694 2.619 2.551 2.525 2.489 2.376 2.193 2.029 1.975 2.028 2.085 2.033 1.856 1.660 1.589 1.711 1.971 2.247 2.435 2.507 2.483 2.376 2.181 1.907 1.617 1.410 1.349 1.406 1.480 + 4.190 3.639 2.947 2.605 2.788 3.228 3.439 3.113 2.360 1.615 1.306 1.556 2.125 2.610 2.716 2.408 1.871 1.350 1.018 0.931 1.051 1.293 1.563 1.786 1.936 2.043 2.164 2.326 2.481 2.536 2.419 2.145 1.810 1.528 1.357 1.287 + 4.832 4.242 3.453 2.941 2.902 3.128 3.196 2.830 2.123 1.466 1.240 1.532 2.085 2.507 2.546 2.236 1.821 1.551 1.524 1.665 1.829 1.918 1.919 1.867 1.794 1.716 1.654 1.651 1.752 1.948 2.148 2.213 2.043 1.656 1.207 0.908 + 4.101 3.753 3.337 3.175 3.348 3.611 3.581 3.064 2.252 1.619 1.593 2.234 3.164 3.817 3.812 3.191 2.349 1.742 1.587 1.776 2.023 2.102 1.982 1.788 1.646 1.588 1.566 1.554 1.594 1.748 1.990 2.173 2.114 1.757 1.252 0.888 + 2.682 2.310 1.956 2.072 2.783 3.755 4.430 4.438 3.865 3.167 2.819 2.971 3.371 3.596 3.376 2.780 2.119 1.698 1.612 1.732 1.859 1.889 1.856 1.843 1.877 1.892 1.809 1.631 1.459 1.412 1.514 1.659 1.687 1.521 1.239 1.024 + 1.259 1.038 0.834 0.939 1.458 2.209 2.819 2.969 2.605 1.967 1.432 1.285 1.561 2.072 2.548 2.789 2.733 2.424 1.951 1.417 0.952 0.700 0.756 1.087 1.502 1.747 1.668 1.330 0.991 0.916 1.189 1.644 1.997 2.066 1.897 1.715 + 2.149 2.332 2.648 3.028 3.401 3.682 3.762 3.539 3.002 2.303 1.719 1.497 1.678 2.049 2.286 2.185 1.798 1.370 1.124 1.087 1.109 1.031 0.856 0.755 0.903 1.307 1.779 2.076 2.083 1.874 1.626 1.467 1.401 1.360 1.304 1.255 + 1.377 1.862 2.640 3.436 4.015 4.237 4.039 3.413 2.458 1.426 0.695 0.578 1.112 1.968 2.626 2.703 2.215 1.545 1.159 1.275 1.731 2.151 2.239 1.970 1.558 1.253 1.168 1.245 1.356 1.422 1.438 1.432 1.417 1.382 1.330 1.289 + 1.082 1.569 2.256 2.804 3.062 3.100 3.036 2.868 2.506 1.958 1.463 1.361 1.812 2.609 3.306 3.554 3.354 2.990 2.729 2.582 2.363 1.967 1.564 1.468 1.809 2.327 2.547 2.186 1.435 0.810 0.700 1.021 1.302 1.137 0.575 0.075 + 2.360 2.304 2.047 1.518 0.909 0.583 0.749 1.233 1.585 1.478 1.027 0.722 1.007 1.876 2.865 3.420 3.329 2.828 2.324 2.034 1.879 1.686 1.456 1.388 1.644 2.118 2.463 2.386 1.924 1.411 1.168 1.204 1.230 0.969 0.459 0.041 + 5.089 4.804 4.395 4.086 4.002 4.071 4.042 3.652 2.837 1.830 1.050 0.837 1.207 1.834 2.284 2.321 2.059 1.833 1.903 2.243 2.576 2.620 2.328 1.910 1.645 1.649 1.803 1.879 1.744 1.451 1.170 1.032 1.043 1.116 1.173 1.195 + 3.600 3.967 4.493 4.919 5.111 5.059 4.762 4.144 3.153 1.941 0.925 0.578 1.081 2.128 3.093 3.458 3.153 2.540 2.056 1.865 1.792 1.576 1.171 0.791 0.689 0.891 1.158 1.218 1.019 0.772 0.730 0.942 1.217 1.324 1.220 1.075 + 4.220 4.401 4.646 4.805 4.794 4.638 4.436 4.280 4.197 4.162 4.133 4.107 4.119 4.232 4.499 4.944 5.535 6.172 6.682 6.875 6.630 5.986 5.161 4.473 4.186 4.385 4.943 5.604 6.117 6.344 6.276 5.992 5.601 5.202 4.880 4.700 + 5.606 5.634 5.765 6.044 6.393 6.654 6.724 6.662 6.630 6.714 6.806 6.676 6.214 5.616 5.330 5.758 6.936 8.447 9.646 10.038 9.540 8.478 7.352 6.585 6.376 6.705 7.398 8.195 8.813 9.033 8.801 8.258 7.665 7.240 7.047 7.001 + 1.706 1.731 1.871 2.181 2.568 2.814 2.744 2.403 2.056 2.015 2.397 3.036 3.613 3.923 4.042 4.265 4.857 5.808 6.782 7.307 7.079 6.155 4.945 3.984 3.662 4.043 4.873 5.720 6.190 6.084 5.452 4.526 3.591 2.856 2.399 2.194 + 0.103 0.322 0.697 1.131 1.515 1.735 1.691 1.363 0.896 0.596 0.772 1.485 2.429 3.085 3.099 2.588 2.093 2.167 2.905 3.832 4.256 3.822 2.803 1.872 1.559 1.860 2.320 2.475 2.249 1.951 1.912 2.140 2.322 2.159 1.690 1.280 + 1.837 1.862 1.873 1.835 1.756 1.685 1.669 1.721 1.831 2.009 2.296 2.718 3.218 3.641 3.815 3.672 3.321 2.988 2.866 2.985 3.204 3.327 3.247 2.999 2.715 2.519 2.465 2.543 2.720 2.952 3.164 3.247 3.109 2.753 2.317 2.017 + 2.896 2.647 2.366 2.352 2.786 3.587 4.432 4.962 5.058 4.944 5.023 5.523 6.256 6.721 6.515 5.725 4.938 4.824 5.595 6.811 7.702 7.761 7.111 6.357 6.064 6.321 6.750 6.903 6.659 6.275 6.067 6.089 6.097 5.841 5.354 4.956 + 1.295 1.682 2.264 2.857 3.470 4.248 5.246 6.281 7.046 7.393 7.474 7.575 7.807 7.982 7.857 7.505 7.402 8.053 9.452 10.913 11.510 10.821 9.311 7.994 7.623 8.122 8.737 8.759 8.130 7.407 7.142 7.318 7.387 6.855 5.837 5.011 + 5.004 5.047 5.132 5.327 5.763 6.509 7.418 8.146 8.419 8.306 8.230 8.619 9.485 10.355 10.665 10.307 9.797 9.854 10.738 11.946 12.593 12.160 10.949 9.822 9.448 9.760 10.094 9.872 9.155 8.554 8.594 9.164 9.605 9.348 8.487 7.725 + 7.858 7.920 7.935 7.833 7.711 7.798 8.266 9.070 9.965 10.697 11.166 11.434 11.591 11.645 11.571 11.438 11.454 11.819 12.502 13.177 13.435 13.103 12.393 11.720 11.341 11.147 10.815 10.171 9.427 9.028 9.254 9.927 10.538 10.666 10.338 9.974 + 10.413 10.695 11.125 11.546 11.894 12.216 12.585 13.017 13.448 13.803 14.046 14.171 14.160 13.991 13.697 13.415 13.330 13.513 13.822 13.976 13.783 13.322 12.885 12.681 12.584 12.192 11.203 9.804 8.669 8.493 9.410 10.795 11.682 11.505 10.540 9.675 + 12.176 12.311 12.535 12.808 13.145 13.609 14.247 15.008 15.732 16.209 16.297 16.012 15.533 15.120 14.990 15.203 15.635 16.033 16.152 15.881 15.307 14.642 14.073 13.620 13.132 12.430 11.505 10.603 10.086 10.158 10.650 11.070 10.921 10.071 8.893 8.050 + 12.544 12.533 12.509 12.498 12.592 12.945 13.699 14.858 16.183 17.243 17.625 17.220 16.356 15.637 15.568 16.208 17.140 17.781 17.805 17.344 16.818 16.542 16.452 16.187 15.440 14.264 13.072 12.330 12.197 12.416 12.514 12.144 11.284 10.203 9.257 8.718 + 11.894 11.916 11.974 12.092 12.318 12.746 13.501 14.639 16.001 17.186 17.728 17.420 16.541 15.745 15.630 16.303 17.300 17.940 17.853 17.232 16.603 16.322 16.267 15.974 15.113 13.836 12.682 12.131 12.188 12.393 12.219 11.499 10.506 9.667 9.207 9.056 + 12.493 12.418 12.342 12.363 12.557 12.997 13.763 14.881 16.204 17.351 17.866 17.540 16.649 15.860 15.784 16.512 17.533 18.119 17.910 17.174 16.534 16.389 16.562 16.475 15.715 14.448 13.312 12.877 13.147 13.553 13.426 12.516 11.130 9.819 8.953 8.572 + 12.482 12.587 12.721 12.828 12.970 13.344 14.146 15.381 16.747 17.752 18.001 17.502 16.707 16.240 16.459 17.189 17.848 17.902 17.280 16.424 15.922 16.009 16.375 16.423 15.781 14.633 13.588 13.200 13.530 14.092 14.217 13.504 12.054 10.335 8.884 8.075 + 13.039 13.239 13.424 13.433 13.407 13.736 14.711 16.177 17.554 18.229 18.033 17.374 16.916 17.051 17.607 18.014 17.782 16.897 15.822 15.139 15.128 15.591 16.030 15.992 15.342 14.318 13.367 12.895 13.043 13.590 14.023 13.770 12.523 10.478 8.327 6.948 + 13.587 13.656 13.765 13.941 14.310 15.010 16.010 17.030 17.673 17.719 17.312 16.872 16.763 16.982 17.148 16.808 15.826 14.538 13.541 13.281 13.754 14.526 15.021 14.865 14.057 12.913 11.874 11.289 11.270 11.635 11.960 11.762 10.760 9.087 7.307 6.159 + 14.344 13.694 12.938 12.722 13.280 14.270 15.083 15.328 15.098 14.806 14.773 14.955 15.006 14.615 13.780 12.802 12.036 11.648 11.583 11.729 12.068 12.640 13.366 13.917 13.834 12.857 11.193 9.494 8.481 8.469 9.133 9.709 9.500 8.358 6.808 5.712 + 14.046 13.869 13.518 12.974 12.213 11.289 10.427 9.991 10.270 11.225 12.406 13.168 13.087 12.258 11.227 10.587 10.558 10.875 11.091 11.027 10.960 11.359 12.379 13.547 13.970 12.980 10.719 8.203 6.729 7.002 8.626 10.334 10.838 9.711 7.687 6.144 + 14.084 13.702 13.133 12.566 12.004 11.334 10.585 10.065 10.187 11.064 12.269 13.046 12.862 11.845 10.702 10.166 10.416 10.993 11.277 11.081 10.841 11.189 12.295 13.566 14.002 12.957 10.701 8.313 6.981 7.218 8.552 9.889 10.254 9.406 7.935 6.834 + 13.870 13.590 13.185 12.747 12.154 11.228 10.082 9.256 9.384 10.615 12.309 13.399 13.186 11.901 10.533 10.016 10.495 11.287 11.578 11.199 10.774 11.096 12.306 13.638 13.971 12.753 10.491 8.424 7.640 8.338 9.773 10.834 10.789 9.670 8.155 7.111 + 13.781 13.544 13.220 12.865 12.288 11.245 9.857 8.772 8.776 10.105 12.066 13.424 13.312 11.913 10.308 9.590 10.007 10.874 11.303 11.057 10.742 11.154 12.416 13.708 13.869 12.379 9.863 7.693 7.012 7.957 9.634 10.797 10.660 9.311 7.542 6.335 + 13.718 13.547 13.264 12.858 12.198 11.200 10.089 9.425 9.737 11.023 12.575 13.394 12.929 11.514 10.113 9.556 9.918 10.577 10.875 10.745 10.725 11.344 12.476 13.289 12.891 11.124 8.805 7.178 7.031 8.161 9.569 10.178 9.504 7.851 6.022 4.856 + 14.137 13.375 12.650 12.786 13.825 14.948 15.208 14.384 13.176 12.563 12.945 13.835 14.349 13.987 12.990 12.015 11.512 11.428 11.444 11.421 11.525 11.926 12.420 12.456 11.612 10.086 8.676 8.205 8.867 10.068 10.894 10.785 9.850 8.639 7.674 7.183 + 13.480 13.082 12.738 12.980 13.985 15.396 16.548 16.920 16.474 15.651 15.055 15.063 15.616 16.300 16.615 16.256 15.269 14.012 12.975 12.540 12.779 13.392 13.852 13.691 12.792 11.487 10.383 9.999 10.448 11.350 12.048 11.975 10.963 9.314 7.647 6.612 + 12.014 12.299 12.738 13.248 13.922 14.920 16.190 17.319 17.730 17.148 15.927 14.909 14.842 15.804 17.101 17.756 17.214 15.739 14.189 13.390 13.585 14.344 14.936 14.842 14.036 12.912 11.990 11.619 11.824 12.319 12.639 12.332 11.192 9.416 7.586 6.423 + 12.734 12.675 12.685 12.969 13.700 14.878 16.244 17.314 17.606 16.932 15.600 14.327 13.866 14.537 15.982 17.337 17.766 16.995 15.493 14.156 13.691 14.157 14.960 15.311 14.787 13.591 12.357 11.657 11.627 11.933 12.079 11.762 11.026 10.153 9.438 9.052 + 13.570 13.016 12.483 12.646 13.724 15.294 16.597 17.056 16.586 15.522 14.332 13.386 12.926 13.113 13.973 15.257 16.399 16.761 16.064 14.668 13.408 13.021 13.593 14.464 14.691 13.749 11.921 10.099 9.171 9.446 10.513 11.581 12.006 11.654 10.892 10.304 + 12.822 12.564 12.354 12.521 13.110 13.827 14.251 14.140 13.538 12.646 11.635 10.590 9.636 9.051 9.172 10.127 11.625 13.037 13.769 13.660 13.060 12.539 12.450 12.693 12.857 12.590 11.881 11.044 10.457 10.289 10.427 10.612 10.640 10.476 10.231 10.058 + 10.231 9.402 8.356 7.868 8.314 9.422 10.501 10.923 10.501 9.515 8.443 7.660 7.317 7.400 7.843 8.544 9.308 9.848 9.914 9.480 8.819 8.363 8.416 8.948 9.612 9.999 9.922 9.523 9.128 8.976 9.033 9.035 8.706 7.998 7.157 6.587 + 7.060 7.165 7.249 7.238 7.268 7.625 8.476 9.615 10.485 10.524 9.595 8.167 7.051 6.868 7.630 8.737 9.407 9.213 8.347 7.439 7.091 7.475 8.257 8.874 8.912 8.329 7.403 6.494 5.829 5.439 5.244 5.170 5.196 5.314 5.478 5.597 + 6.336 6.430 6.358 5.985 5.628 5.925 7.260 9.267 10.918 11.231 10.027 8.125 6.769 6.736 7.835 9.146 9.760 9.405 8.518 7.797 7.683 8.143 8.839 9.419 9.696 9.623 9.224 8.582 7.863 7.298 7.054 7.114 7.292 7.387 7.340 7.255 + 6.417 6.151 5.773 5.553 5.771 6.576 7.852 9.200 10.078 10.076 9.180 7.826 6.699 6.347 6.850 7.771 8.434 8.361 7.574 6.572 5.990 6.179 6.991 7.902 8.360 8.123 7.357 6.482 5.886 5.724 5.900 6.191 6.410 6.488 6.465 6.424 + 6.395 6.825 7.440 7.957 8.280 8.545 8.950 9.547 10.162 10.537 10.542 10.275 9.969 9.809 9.819 9.902 9.968 10.012 10.094 10.251 10.478 10.774 11.205 11.881 12.838 13.931 14.845 15.258 15.030 14.281 13.302 12.388 11.700 11.257 11.004 10.889 + 5.585 6.210 7.158 8.040 8.632 8.968 9.234 9.565 9.929 10.190 10.247 10.126 9.942 9.788 9.669 9.543 9.414 9.377 9.563 10.033 10.731 11.536 12.357 13.181 14.026 14.850 15.504 15.802 15.639 15.078 14.328 13.633 13.156 12.926 12.869 12.876 + 6.954 6.945 6.959 7.027 7.152 7.320 7.526 7.772 8.027 8.201 8.189 7.975 7.716 7.680 8.070 8.848 9.740 10.438 10.854 11.197 11.793 12.791 13.998 15.004 15.493 15.471 15.239 15.127 15.240 15.429 15.480 15.329 15.107 14.992 15.031 15.115 + 7.756 7.744 7.998 8.739 9.825 10.770 11.134 10.899 10.481 10.363 10.679 11.138 11.349 11.225 11.078 11.328 12.094 13.077 13.818 14.094 14.073 14.112 14.404 14.823 15.080 15.028 14.804 14.680 14.805 15.078 15.269 15.250 15.090 14.956 14.934 14.969 + 10.622 10.716 10.898 11.092 11.130 10.851 10.257 9.574 9.126 9.093 9.383 9.736 9.975 10.179 10.599 11.400 12.460 13.428 13.995 14.121 14.030 13.972 14.004 13.990 13.803 13.519 13.380 13.567 13.994 14.346 14.332 13.930 13.389 13.007 12.887 12.907 + 14.182 14.580 14.877 14.487 13.225 11.486 9.970 9.213 9.272 9.796 10.361 10.774 11.124 11.603 12.275 13.010 13.580 13.808 13.648 13.166 12.481 11.738 11.096 10.688 10.561 10.631 10.731 10.724 10.608 10.504 10.549 10.778 11.098 11.374 11.532 11.590 + 14.343 14.274 14.039 13.614 13.164 12.936 12.986 13.051 12.745 11.951 11.033 10.615 11.075 12.189 13.272 13.702 13.385 12.751 12.312 12.202 12.120 11.694 10.891 10.070 9.643 9.691 9.908 9.925 9.673 9.424 9.492 9.892 10.311 10.419 10.191 9.924 + 16.963 16.549 15.792 14.862 14.007 13.439 13.189 13.065 12.792 12.251 11.618 11.257 11.438 12.085 12.794 13.105 12.822 12.135 11.442 11.048 10.965 10.961 10.788 10.379 9.864 9.436 9.199 9.124 9.109 9.082 9.036 8.991 8.959 8.930 8.898 8.875 + 16.951 16.489 15.726 14.904 14.226 13.747 13.356 12.880 12.241 11.557 11.090 11.052 11.433 11.980 12.366 12.403 12.131 11.729 11.330 10.937 10.500 10.053 9.750 9.737 9.970 10.187 10.093 9.617 9.002 8.614 8.622 8.836 8.859 8.444 7.737 7.191 + 17.467 16.711 15.616 14.696 14.197 13.985 13.745 13.297 12.727 12.252 11.993 11.867 11.715 11.497 11.347 11.421 11.684 11.870 11.672 11.010 10.133 9.456 9.259 9.497 9.868 10.058 9.957 9.677 9.401 9.212 9.052 8.802 8.406 7.921 7.482 7.222 + 15.467 15.499 15.378 14.917 14.115 13.176 12.354 11.780 11.420 11.191 11.074 11.111 11.282 11.430 11.346 10.947 10.379 9.911 9.706 9.681 9.597 9.301 8.886 8.610 8.639 8.877 9.045 8.946 8.648 8.406 8.382 8.449 8.287 7.703 6.873 6.262 + 13.524 13.136 12.574 12.058 11.597 11.011 10.180 9.288 8.797 9.116 10.223 11.566 12.382 12.205 11.190 9.997 9.320 9.419 9.992 10.456 10.391 9.806 9.069 8.597 8.560 8.818 9.078 9.124 8.938 8.644 8.370 8.154 7.949 7.711 7.467 7.306 + 12.822 12.170 11.340 10.841 10.759 10.705 10.234 9.362 8.662 8.845 10.129 11.959 13.336 13.506 12.484 11.001 9.954 9.798 10.321 10.911 11.050 10.634 9.947 9.365 9.091 9.075 9.130 9.101 8.944 8.701 8.433 8.179 7.954 7.767 7.630 7.557 + 9.644 9.403 9.238 9.411 9.770 9.815 9.164 8.017 7.147 7.372 8.907 11.149 13.056 13.824 13.336 12.089 10.757 9.775 9.228 9.011 9.006 9.124 9.250 9.242 9.036 8.734 8.548 8.601 8.777 8.791 8.441 7.809 7.214 6.944 7.013 7.172 + 9.376 9.430 9.711 10.317 11.024 11.339 10.850 9.610 8.208 7.425 7.705 8.846 10.146 10.882 10.765 10.038 9.211 8.662 8.433 8.325 8.157 7.943 7.845 7.981 8.282 8.513 8.454 8.070 7.527 7.061 6.808 6.725 6.665 6.516 6.297 6.131 + 6.280 6.541 7.056 7.753 8.448 8.855 8.712 7.952 6.821 5.824 5.482 6.030 7.242 8.522 9.239 9.084 8.226 7.168 6.410 6.162 6.284 6.467 6.480 6.304 6.079 5.947 5.942 5.993 6.014 5.980 5.926 5.895 5.898 5.910 5.913 5.909 + 5.505 5.821 6.313 6.773 7.019 6.975 6.684 6.269 5.876 5.635 5.644 5.948 6.511 7.173 7.679 7.784 7.413 6.753 6.187 6.057 6.423 6.986 7.277 6.987 6.201 5.347 4.889 4.997 5.443 5.814 5.847 5.622 5.446 5.563 5.923 6.237 + 4.247 4.508 5.044 5.758 6.375 6.568 6.216 5.552 5.026 4.971 5.361 5.878 6.233 6.412 6.641 7.095 7.670 8.046 7.992 7.612 7.273 7.280 7.597 7.902 7.902 7.607 7.292 7.185 7.206 7.035 6.447 5.586 4.889 4.709 4.994 5.330 + 5.500 5.032 4.738 5.254 6.546 7.858 8.344 7.783 6.732 6.001 5.969 6.372 6.699 6.755 6.821 7.292 8.201 9.129 9.587 9.464 9.089 8.864 8.869 8.851 8.592 8.220 8.102 8.398 8.756 8.548 7.477 5.974 4.939 4.996 5.919 6.789 + 5.820 5.132 4.510 4.786 6.125 7.859 9.028 9.138 8.472 7.750 7.498 7.705 7.999 8.100 8.074 8.196 8.611 9.176 9.620 9.813 9.852 9.898 9.975 9.969 9.828 9.701 9.812 10.160 10.379 9.990 8.859 7.450 6.544 6.625 7.445 8.203 + 6.518 6.052 5.626 5.794 6.665 7.830 8.745 9.195 9.401 9.698 10.137 10.417 10.222 9.610 9.065 9.127 9.928 11.067 11.915 12.082 11.638 10.955 10.374 10.027 9.895 9.969 10.249 10.619 10.770 10.373 9.398 8.263 7.601 7.771 8.533 9.204 + 9.279 8.972 8.689 8.804 9.416 10.267 10.960 11.258 11.218 11.048 10.882 10.686 10.383 10.045 9.933 10.306 11.170 12.190 12.875 12.906 12.331 11.501 10.801 10.418 10.296 10.285 10.302 10.370 10.534 10.747 10.858 10.708 10.247 9.585 8.943 8.551 + 7.801 7.864 7.987 8.160 8.370 8.627 8.986 9.528 10.287 11.168 11.926 12.272 12.061 11.438 10.816 10.661 11.192 12.210 13.194 13.614 13.264 12.377 11.452 10.904 10.827 10.999 11.125 11.090 11.017 11.093 11.338 11.530 11.368 10.750 9.914 9.317 + 9.044 8.747 8.353 8.136 8.271 8.766 9.507 10.376 11.318 12.285 13.134 13.593 13.412 12.611 11.614 11.099 11.579 12.996 14.656 15.620 15.319 13.942 12.299 11.241 11.083 11.454 11.686 11.385 10.723 10.224 10.260 10.722 11.134 11.099 10.658 10.237 + 9.521 9.118 8.713 8.770 9.423 10.362 11.089 11.341 11.308 11.448 12.054 12.947 13.577 13.485 12.754 12.035 12.090 13.179 14.794 15.986 16.044 15.006 13.596 12.636 12.430 12.597 12.482 11.761 10.727 10.024 10.083 10.753 11.454 11.683 11.418 11.078 + 9.329 9.705 10.156 10.338 10.156 9.847 9.797 10.252 11.152 12.197 13.055 13.531 13.619 13.450 13.228 13.174 13.461 14.108 14.913 15.521 15.629 15.196 14.471 13.796 13.337 12.973 12.470 11.760 11.074 10.773 11.014 11.559 11.937 11.825 11.326 10.879 + 10.457 10.540 10.623 10.587 10.364 10.013 9.743 9.830 10.465 11.596 12.895 13.893 14.252 13.989 13.501 13.317 13.736 14.600 15.386 15.570 15.008 14.046 13.255 12.992 13.138 13.223 12.842 12.025 11.235 10.998 11.445 12.176 12.559 12.240 11.436 10.771 + 11.696 11.894 12.193 12.461 12.618 12.700 12.842 13.191 13.782 14.475 14.997 15.106 14.762 14.205 13.838 13.983 14.642 15.462 15.941 15.757 14.987 14.050 13.396 13.172 13.137 12.889 12.239 11.423 10.954 11.199 12.032 12.840 12.940 12.100 10.762 9.765 + 12.208 12.408 12.685 12.928 13.160 13.542 14.218 15.162 16.153 16.898 17.211 17.095 16.706 16.258 15.950 15.927 16.233 16.754 17.209 17.267 16.749 15.779 14.718 13.902 13.393 12.967 12.374 11.643 11.122 11.185 11.825 12.534 12.637 11.833 10.507 9.504 + 12.047 12.360 12.723 12.891 12.921 13.172 13.991 15.357 16.820 17.785 17.936 17.436 16.777 16.426 16.556 17.036 17.611 18.075 18.315 18.266 17.882 17.176 16.261 15.313 14.469 13.764 13.191 12.798 12.709 12.979 13.417 13.578 13.024 11.696 10.077 8.965 + 11.716 12.070 12.564 12.958 13.211 13.544 14.267 15.489 16.939 18.065 18.380 17.812 16.802 16.038 16.017 16.722 17.671 18.282 18.267 17.768 17.159 16.691 16.302 15.729 14.809 13.699 12.805 12.485 12.766 13.296 13.571 13.253 12.349 11.159 10.088 9.467 + 12.332 12.725 13.232 13.567 13.719 13.998 14.759 16.038 17.423 18.279 18.202 17.326 16.265 15.707 15.966 16.815 17.693 18.116 17.973 17.519 17.096 16.840 16.587 16.042 15.066 13.854 12.864 12.543 13.023 13.992 14.822 14.896 13.944 12.213 10.369 9.190 + 12.272 12.854 13.552 13.912 13.969 14.244 15.219 16.791 18.226 18.709 18.025 16.775 15.925 16.067 17.008 17.995 18.345 17.937 17.195 16.653 16.518 16.561 16.371 15.690 14.581 13.362 12.423 12.081 12.458 13.396 14.426 14.911 14.367 12.824 10.926 9.627 + 12.297 13.054 13.957 14.421 14.509 14.868 16.019 17.694 18.912 18.809 17.458 15.909 15.367 16.202 17.675 18.586 18.261 17.014 15.768 15.246 15.453 15.841 15.841 15.264 14.268 13.095 11.951 11.095 10.896 11.601 12.957 14.102 14.044 12.436 10.019 8.238 + 12.792 13.369 14.163 14.818 15.329 15.995 17.020 18.163 18.845 18.647 17.745 16.841 16.598 17.076 17.665 17.601 16.601 15.094 13.864 13.448 13.797 14.403 14.702 14.393 13.483 12.184 10.852 9.968 10.021 11.189 13.027 14.523 14.659 13.160 10.825 9.100 + 13.201 13.494 14.127 15.112 16.318 17.437 18.097 18.072 17.477 16.755 16.421 16.703 17.341 17.733 17.342 16.088 14.404 12.944 12.154 12.060 12.371 12.763 13.051 13.141 12.906 12.210 11.121 10.088 9.792 10.666 12.423 14.068 14.502 13.341 11.291 9.727 + 12.905 13.415 14.402 15.712 17.008 17.839 17.874 17.140 16.087 15.353 15.350 15.957 16.564 16.498 15.506 13.939 12.483 11.641 11.405 11.382 11.231 11.002 11.039 11.532 12.183 12.362 11.694 10.554 9.934 10.678 12.660 14.677 15.246 13.767 11.105 9.057 + 12.476 13.359 14.827 16.358 17.378 17.498 16.727 15.516 14.546 14.340 14.920 15.768 16.136 15.542 14.092 12.391 11.107 10.518 10.396 10.311 10.065 9.877 10.121 10.869 11.670 11.847 11.105 9.933 9.361 10.185 12.234 14.342 15.122 14.020 11.803 10.062 + 12.298 13.330 14.910 16.327 17.013 16.801 15.963 15.013 14.426 14.397 14.766 15.127 15.061 14.380 13.234 12.001 11.040 10.459 10.098 9.749 9.405 9.312 9.724 10.546 11.250 11.195 10.201 8.863 8.260 9.170 11.379 13.671 14.629 13.678 11.571 9.888 + 12.244 13.304 14.818 15.967 16.226 15.624 14.633 13.815 13.494 13.651 14.026 14.303 14.247 13.770 12.937 11.926 10.949 10.143 9.535 9.094 8.847 8.904 9.328 9.931 10.247 9.799 8.542 7.104 6.500 7.431 9.652 11.981 13.050 12.288 10.389 8.845 + 11.843 13.137 14.856 15.909 15.746 14.645 13.362 12.521 12.277 12.431 12.758 13.186 13.665 13.984 13.795 12.891 11.458 10.022 9.106 8.890 9.167 9.573 9.843 9.832 9.396 8.371 6.789 5.138 4.279 4.909 6.931 9.311 10.697 10.391 8.910 7.606 + 11.589 12.967 14.760 15.768 15.416 14.074 12.630 11.762 11.512 11.477 11.345 11.229 11.501 12.323 13.345 13.890 13.479 12.249 10.892 10.171 10.383 11.173 11.800 11.618 10.439 8.588 6.695 5.388 5.042 5.660 6.885 8.168 9.017 9.240 9.017 8.747 + 11.586 12.781 14.337 15.214 14.913 13.764 12.568 11.914 11.760 11.593 10.993 10.085 9.486 9.788 11.030 12.595 13.644 13.724 13.080 12.425 12.362 12.911 13.489 13.347 12.117 10.090 8.042 6.760 6.604 7.360 8.435 9.216 9.379 8.984 8.366 7.928 + 11.248 12.227 13.508 14.243 14.015 13.065 12.003 11.298 10.981 10.763 10.400 9.949 9.685 9.812 10.256 10.745 11.077 11.325 11.771 12.626 13.781 14.806 15.188 14.634 13.235 11.406 9.688 8.536 8.171 8.526 9.277 9.973 10.249 10.008 9.478 9.060 + 10.767 12.075 13.644 14.232 13.383 11.704 10.261 9.691 9.792 9.891 9.556 8.971 8.674 8.971 9.633 10.132 10.165 9.939 9.978 10.645 11.850 13.154 14.117 14.535 14.410 13.804 12.797 11.607 10.647 10.336 10.759 11.491 11.854 11.442 10.487 9.702 + 10.961 12.022 13.290 13.757 13.053 11.680 10.515 10.070 10.146 10.136 9.647 8.850 8.277 8.298 8.786 9.262 9.362 9.166 9.119 9.620 10.682 11.914 12.815 13.096 12.793 12.161 11.504 11.074 11.038 11.428 12.068 12.598 12.650 12.112 11.264 10.633 + 12.062 13.073 14.174 14.323 13.224 11.542 10.271 9.894 10.055 10.014 9.392 8.512 8.047 8.351 9.117 9.677 9.633 9.217 9.067 9.645 10.824 12.002 12.586 12.410 11.772 11.135 10.824 10.931 11.408 12.155 12.989 13.615 13.724 13.229 12.410 11.793 + 12.694 13.483 14.349 14.477 13.621 12.278 11.218 10.837 10.890 10.812 10.281 9.505 8.984 9.024 9.460 9.841 9.874 9.695 9.738 10.327 11.384 12.477 13.151 13.233 12.891 12.475 12.311 12.596 13.368 14.474 15.548 16.092 15.719 14.462 12.872 11.774 + 13.249 13.730 14.235 14.255 13.656 12.758 12.011 11.579 11.236 10.655 9.788 8.977 8.677 9.055 9.836 10.538 10.870 10.952 11.158 11.767 12.719 13.670 14.259 14.345 14.055 13.663 13.464 13.689 14.447 15.625 16.830 17.478 17.110 15.742 13.987 12.770 + 13.291 13.879 14.518 14.590 13.905 12.821 11.894 11.400 11.166 10.828 10.240 9.636 9.389 9.633 10.107 10.391 10.307 10.112 10.303 11.188 12.609 14.017 14.850 14.877 14.311 13.632 13.332 13.704 14.756 16.196 17.495 18.062 17.534 16.036 14.229 13.006 + 13.746 14.237 14.771 14.815 14.172 13.107 12.101 11.468 11.167 10.941 10.613 10.258 10.093 10.222 10.500 10.654 10.562 10.409 10.585 11.371 12.681 14.064 14.967 15.072 14.489 13.693 13.273 13.636 14.808 16.396 17.731 18.163 17.383 15.631 13.651 12.352 + 13.811 14.246 14.734 14.811 14.288 13.378 12.503 11.956 11.717 11.537 11.203 10.730 10.328 10.198 10.347 10.602 10.789 10.913 11.172 11.781 12.755 13.828 14.589 14.737 14.297 13.636 13.285 13.651 14.776 16.272 17.475 17.756 16.852 15.042 13.066 11.789 + 13.607 14.111 14.709 14.910 14.510 13.716 12.927 12.394 12.052 11.655 11.067 10.431 10.053 10.131 10.555 10.998 11.194 11.178 11.273 11.811 12.833 13.999 14.786 14.847 14.250 13.461 13.064 13.424 14.473 15.743 16.596 16.535 15.449 13.678 11.879 10.756 + 13.280 13.867 14.641 15.090 14.928 14.242 13.349 12.529 11.870 11.319 10.850 10.558 10.576 10.905 11.341 11.599 11.546 11.338 11.341 11.864 12.906 14.113 14.973 15.127 14.593 13.769 13.224 13.390 14.325 15.647 16.684 16.795 15.708 13.708 11.566 10.191 + 12.702 13.506 14.596 15.298 15.226 14.463 13.389 12.370 11.568 10.990 10.642 10.585 10.833 11.243 11.549 11.566 11.361 11.240 11.520 12.280 13.299 14.213 14.742 14.803 14.477 13.931 13.391 13.140 13.433 14.293 15.342 15.883 15.308 13.579 11.407 9.907 + 12.493 13.390 14.640 15.513 15.546 14.754 13.514 12.264 11.278 10.641 10.351 10.389 10.684 11.073 11.351 11.407 11.339 11.402 11.821 12.614 13.576 14.421 14.952 15.122 14.971 14.562 14.000 13.485 13.286 13.559 14.158 14.630 14.482 13.576 12.305 11.390 + 12.047 13.190 14.724 15.691 15.575 14.543 13.170 11.978 11.208 10.895 11.047 11.635 12.429 12.958 12.782 11.899 10.890 10.560 11.320 12.828 14.245 14.900 14.781 14.428 14.362 14.606 14.757 14.495 13.985 13.748 14.093 14.712 14.877 14.113 12.722 11.625 + 11.953 13.155 14.700 15.558 15.303 14.313 13.305 12.689 12.355 11.996 11.562 11.337 11.586 12.167 12.587 12.467 11.963 11.695 12.186 13.361 14.565 15.119 14.876 14.278 13.880 13.838 13.859 13.619 13.193 13.025 13.451 14.283 14.896 14.787 14.071 13.406 + 10.513 11.668 13.238 14.321 14.490 13.980 13.314 12.814 12.441 12.034 11.618 11.398 11.487 11.704 11.737 11.528 11.444 11.976 13.197 14.541 15.188 14.780 13.789 13.138 13.378 14.174 14.605 14.031 12.728 11.678 11.704 12.738 13.912 14.362 13.991 13.459 + 9.963 11.404 13.344 14.625 14.714 13.945 13.059 12.533 12.318 12.113 11.809 11.589 11.648 11.886 11.975 11.755 11.513 11.778 12.777 14.084 14.881 14.642 13.627 12.674 12.468 12.945 13.403 13.210 12.438 11.806 12.001 13.025 14.196 14.783 14.659 14.322 + 9.704 11.141 13.167 14.660 14.943 14.123 12.868 11.880 11.492 11.610 11.933 12.188 12.220 11.988 11.578 11.220 11.232 11.818 12.848 13.851 14.294 13.975 13.195 12.534 12.394 12.706 13.058 13.124 12.980 13.023 13.565 14.500 15.361 15.730 15.599 15.345 + 10.503 11.808 13.572 14.740 14.787 13.980 13.020 12.443 12.304 12.329 12.278 12.127 11.966 11.808 11.578 11.310 11.266 11.766 12.838 14.038 14.697 14.447 13.557 12.739 12.564 13.003 13.497 13.511 13.035 12.589 12.739 13.583 14.686 15.493 15.794 15.799 + 10.756 12.138 13.965 15.086 14.966 13.952 12.832 12.161 11.943 11.865 11.733 11.634 11.726 11.946 12.033 11.845 11.618 11.822 12.695 13.908 14.748 14.691 13.867 12.954 12.593 12.865 13.307 13.434 13.239 13.172 13.641 14.537 15.281 15.364 14.841 14.299 + 12.111 13.126 14.397 15.017 14.620 13.564 12.525 11.916 11.667 11.484 11.247 11.110 11.238 11.529 11.655 11.431 11.104 11.218 12.120 13.568 14.845 15.317 14.944 14.266 13.899 14.014 14.278 14.276 13.970 13.734 13.944 14.558 15.120 15.190 14.784 14.356 + 12.180 13.363 14.846 15.564 15.066 13.769 12.514 11.860 11.750 11.753 11.564 11.264 11.130 11.266 11.472 11.491 11.352 11.428 12.102 13.347 14.643 15.334 15.134 14.342 13.577 13.308 13.559 14.022 14.377 14.526 14.545 14.493 14.316 13.952 13.485 13.146 + 12.991 13.963 15.132 15.569 14.918 13.606 12.422 11.857 11.791 11.732 11.342 10.729 10.279 10.239 10.481 10.677 10.674 10.708 11.210 12.389 13.974 15.344 15.953 15.690 14.905 14.139 13.776 13.898 14.341 14.850 15.185 15.166 14.713 13.916 13.053 12.489 + 13.454 14.239 15.138 15.357 14.598 13.250 12.022 11.378 11.249 11.228 10.999 10.589 10.256 10.181 10.303 10.432 10.512 10.726 11.347 12.458 13.836 15.075 15.840 16.029 15.752 15.212 14.638 14.282 14.364 14.919 15.627 15.874 15.105 13.290 11.106 9.616 + 13.604 14.221 14.907 15.008 14.266 12.992 11.778 11.035 10.751 10.623 10.397 10.084 9.886 9.951 10.221 10.511 10.722 10.968 11.484 12.414 13.654 14.889 15.766 16.061 15.759 15.040 14.238 13.750 13.880 14.632 15.588 16.050 15.447 13.766 11.695 10.275 + 13.681 14.057 14.434 14.368 13.698 12.663 11.691 11.071 10.785 10.607 10.353 10.041 9.837 9.870 10.113 10.427 10.722 11.064 11.624 12.516 13.665 14.801 15.570 15.703 15.138 14.075 12.946 12.276 12.441 13.421 14.711 15.517 15.214 13.775 11.880 10.556 + 13.856 14.053 14.191 13.975 13.317 12.409 11.570 11.006 10.701 10.489 10.237 9.953 9.758 9.757 9.961 10.313 10.773 11.367 12.143 13.084 14.063 14.860 15.245 15.053 14.261 13.048 11.809 11.064 11.222 12.293 13.761 14.774 14.631 13.266 11.370 10.024 + 13.853 13.878 13.828 13.573 13.043 12.294 11.488 10.812 10.365 10.110 9.927 9.730 9.553 9.540 9.832 10.438 11.214 11.963 12.574 13.080 13.576 14.045 14.278 13.976 12.994 11.559 10.253 9.738 10.358 11.884 13.577 14.570 14.342 13.016 11.307 10.136 + 13.592 13.478 13.315 13.119 12.778 12.138 11.201 10.214 9.528 9.321 9.451 9.601 9.590 9.557 9.818 10.519 11.424 12.080 12.215 12.002 11.905 12.213 12.688 12.700 11.770 10.073 8.459 7.905 8.835 10.799 12.763 13.750 13.380 11.996 10.380 9.332 + 13.383 13.202 12.999 12.859 12.623 12.002 10.922 9.712 8.914 8.827 9.243 9.643 9.702 9.592 9.786 10.506 11.402 11.802 11.359 10.467 9.994 10.505 11.667 12.422 11.851 9.991 7.921 6.996 7.855 9.987 12.143 13.204 12.823 11.454 9.928 8.971 + 12.923 12.888 12.833 12.703 12.347 11.636 10.637 9.658 9.049 8.931 9.109 9.285 9.383 9.635 10.307 11.305 12.089 12.053 11.102 9.866 9.283 9.830 11.050 11.836 11.298 9.514 7.550 6.705 7.584 9.700 11.851 12.937 12.580 11.192 9.604 8.591 + 12.793 12.858 12.894 12.756 12.320 11.579 10.683 9.870 9.320 9.047 8.937 8.917 9.071 9.577 10.466 11.440 11.963 11.645 10.609 9.512 9.112 9.676 10.715 11.295 10.741 9.190 7.562 6.943 7.848 9.880 11.994 13.159 12.924 11.586 9.946 8.859 + 12.696 12.877 13.063 13.006 12.539 11.702 10.730 9.917 9.433 9.231 9.145 9.087 9.170 9.614 10.488 11.514 12.165 12.027 11.179 10.220 9.876 10.430 11.440 12.001 11.409 9.740 7.895 7.045 7.860 10.043 12.490 13.939 13.687 11.958 9.737 8.227 + 12.783 12.993 13.220 13.194 12.742 11.906 10.934 10.127 9.645 9.426 9.281 9.104 9.017 9.291 10.086 11.217 12.177 12.464 11.973 11.133 10.627 10.868 11.639 12.192 11.794 10.329 8.491 7.402 7.879 9.855 12.346 14.007 13.927 12.175 9.764 8.077 + 12.903 13.097 13.318 13.314 12.894 12.061 11.042 10.168 9.658 9.477 9.388 9.192 8.952 8.991 9.613 10.782 12.032 12.756 12.663 12.035 11.532 11.666 12.347 12.905 12.591 11.206 9.359 8.128 8.341 9.985 12.151 13.569 13.373 11.628 9.293 7.673 + 12.737 13.107 13.523 13.563 13.002 11.964 10.835 10.003 9.607 9.487 9.350 9.035 8.664 8.573 9.057 10.119 11.420 12.469 12.938 12.863 12.593 12.495 12.648 12.754 12.361 11.255 9.732 8.505 8.279 9.244 10.867 12.152 12.257 11.047 9.225 7.903 + 12.783 13.062 13.351 13.301 12.722 11.718 10.624 9.783 9.332 9.138 8.943 8.602 8.230 8.146 8.629 9.690 11.013 12.142 12.777 12.957 12.975 13.106 13.331 13.312 12.653 11.274 9.604 8.416 8.364 9.532 11.301 12.667 12.837 11.726 10.028 8.797 + 12.781 12.957 13.124 13.023 12.483 11.548 10.487 9.635 9.185 9.057 8.977 8.716 8.306 8.045 8.267 9.056 10.157 11.164 11.837 12.266 12.727 13.338 13.842 13.723 12.632 10.773 8.920 8.005 8.537 10.242 12.197 13.350 13.106 11.639 9.764 8.489 + 12.376 12.661 12.888 12.664 11.886 10.817 9.872 9.295 9.017 8.792 8.447 8.033 7.753 7.771 8.099 8.631 9.258 9.948 10.715 11.549 12.371 13.044 13.381 13.164 12.217 10.578 8.678 7.314 7.295 8.868 11.367 13.425 13.772 12.118 9.454 7.478 + 11.875 12.168 12.431 12.261 11.485 10.302 9.152 8.430 8.234 8.340 8.400 8.209 7.841 7.569 7.657 8.172 8.973 9.837 10.630 11.357 12.074 12.724 13.070 12.802 11.770 10.189 8.641 7.825 8.166 9.532 11.239 12.398 12.396 11.264 9.670 8.544 + 11.873 12.136 12.400 12.288 11.550 10.280 8.937 8.090 8.015 8.454 8.779 8.491 7.662 6.928 6.980 7.973 9.366 10.362 10.588 10.389 10.480 11.224 12.231 12.637 11.871 10.223 8.701 8.282 9.180 10.735 11.960 12.260 11.735 10.909 10.254 9.938 + 12.047 12.706 13.396 13.354 12.301 10.680 9.343 8.900 9.257 9.710 9.541 8.643 7.649 7.439 8.401 10.054 11.374 11.581 10.762 9.791 9.611 10.443 11.596 12.023 11.191 9.538 8.149 7.937 8.987 10.562 11.702 11.895 11.302 10.458 9.809 9.500 + 13.290 13.211 12.971 12.469 11.689 10.770 9.979 9.538 9.436 9.404 9.136 8.620 8.255 8.574 9.728 11.199 12.061 11.694 10.359 9.104 8.969 10.111 11.595 12.091 10.955 8.782 6.980 6.694 7.974 9.837 11.109 11.292 10.754 10.201 10.014 10.061 + 14.187 13.523 12.631 12.017 11.862 11.925 11.814 11.335 10.620 9.969 9.605 9.583 9.861 10.374 10.980 11.376 11.182 10.247 8.924 7.980 8.069 9.159 10.421 10.794 9.822 8.076 6.770 6.850 8.292 10.179 11.443 11.638 11.107 10.516 10.248 10.228 + 12.850 13.141 13.601 14.003 14.081 13.686 12.910 12.057 11.457 11.242 11.306 11.460 11.618 11.810 12.000 11.936 11.284 9.984 8.509 7.670 8.009 9.260 10.407 10.397 9.007 7.095 5.996 6.501 8.259 10.099 10.976 10.737 10.075 9.793 10.088 10.501 + 13.841 13.490 13.159 13.211 13.614 13.947 13.787 13.114 12.353 12.005 12.238 12.790 13.227 13.273 12.901 12.184 11.160 9.907 8.726 8.125 8.479 9.602 10.706 10.900 9.894 8.297 7.180 7.233 8.223 9.240 9.500 9.001 8.430 8.463 9.115 9.757 + 13.620 13.277 13.037 13.319 14.055 14.701 14.728 14.117 13.369 13.038 13.232 13.558 13.529 12.996 12.199 11.431 10.735 9.965 9.125 8.571 8.749 9.701 10.837 11.313 10.723 9.486 8.490 8.311 8.705 8.903 8.421 7.624 7.449 8.504 10.375 11.838 + 13.619 13.076 12.659 13.026 14.131 15.225 15.538 14.991 14.229 13.975 14.330 14.711 14.451 13.443 12.193 11.274 10.773 10.304 9.559 8.764 8.531 9.202 10.378 11.166 10.962 10.024 9.226 9.215 9.771 10.038 9.417 8.257 7.613 8.260 9.883 11.247 + 13.456 12.908 12.455 12.753 13.816 14.985 15.531 15.314 14.852 14.752 15.071 15.250 14.655 13.224 11.556 10.389 9.967 9.912 9.689 9.180 8.790 9.004 9.856 10.843 11.379 11.302 10.947 10.730 10.688 10.473 9.794 8.835 8.189 8.315 9.064 9.751 + 13.024 12.508 12.024 12.171 13.070 14.271 15.166 15.489 15.439 15.353 15.283 14.928 13.967 12.460 10.900 9.843 9.474 9.507 9.504 9.287 9.060 9.148 9.654 10.365 10.969 11.323 11.484 11.501 11.248 10.541 9.453 8.472 8.244 9.040 10.430 11.496 + 12.486 12.220 11.956 12.037 12.641 13.653 14.745 15.566 15.916 15.780 15.251 14.425 13.373 12.178 10.989 10.006 9.393 9.177 9.218 9.288 9.214 8.999 8.838 8.991 9.599 10.528 11.369 11.623 10.984 9.575 7.957 6.871 6.835 7.820 9.233 10.237 + 12.518 12.221 11.924 12.009 12.660 13.739 14.876 15.709 16.088 16.090 15.866 15.472 14.828 13.834 12.536 11.189 10.125 9.544 9.378 9.354 9.223 8.958 8.783 8.988 9.677 10.642 11.456 11.731 11.339 10.466 9.476 8.697 8.276 8.169 8.227 8.299 + 12.542 12.208 11.821 11.777 12.341 13.457 14.752 15.750 16.170 16.096 15.867 15.765 15.747 15.472 14.598 13.130 11.485 10.218 9.622 9.547 9.604 9.545 9.486 9.755 10.513 11.511 12.220 12.227 11.558 10.629 9.892 9.489 9.229 8.862 8.374 8.004 + 12.157 12.007 11.781 11.685 12.020 12.971 14.370 15.690 16.382 16.297 15.815 15.507 15.600 15.747 15.334 14.077 12.339 10.862 10.144 10.050 10.014 9.654 9.170 9.133 9.862 11.000 11.741 11.524 10.537 9.552 9.212 9.452 9.607 9.095 8.025 7.141 + 11.930 11.871 11.679 11.446 11.547 12.388 13.932 15.531 16.339 16.022 15.099 14.529 14.856 15.689 16.035 15.191 13.382 11.552 10.518 10.318 10.353 10.142 9.877 10.189 11.348 12.754 13.304 12.379 10.498 8.957 8.717 9.558 10.309 9.958 8.617 7.409 + 11.671 11.739 11.693 11.503 11.513 12.200 13.623 15.157 15.887 15.402 14.242 13.497 13.868 15.025 15.881 15.544 14.075 12.361 11.273 10.936 10.812 10.437 10.009 10.173 11.221 12.546 13.017 11.983 9.962 8.281 7.922 8.653 9.265 8.727 7.185 5.845 + 11.505 11.580 11.586 11.521 11.701 12.518 13.945 15.328 15.805 15.055 13.688 12.822 13.162 14.393 15.449 15.438 14.349 12.940 11.952 11.461 10.993 10.225 9.485 9.482 10.493 11.873 12.471 11.641 9.902 8.529 8.411 9.213 9.682 8.839 6.959 5.399 + 11.550 11.333 10.940 10.512 10.277 10.404 10.820 11.190 11.154 10.642 9.984 9.669 9.950 10.632 11.250 11.443 11.191 10.705 10.134 9.435 8.560 7.736 7.469 8.151 9.588 10.955 11.338 10.469 8.990 7.958 7.961 8.617 8.927 8.191 6.684 5.463 + 11.883 11.774 11.569 11.333 11.181 11.197 11.325 11.368 11.121 10.552 9.865 9.357 9.201 9.332 9.541 9.655 9.633 9.490 9.187 8.660 7.990 7.522 7.707 8.713 10.134 11.129 11.004 9.789 8.297 7.524 7.849 8.705 9.039 8.220 6.619 5.344 + 11.802 11.637 11.402 11.234 11.222 11.342 11.454 11.387 11.058 10.536 10.008 9.655 9.547 9.627 9.780 9.918 9.988 9.939 9.709 9.300 8.881 8.770 9.234 10.221 11.258 11.686 11.122 9.796 8.451 7.832 8.119 8.782 8.995 8.312 7.051 6.064 + 12.061 11.885 11.632 11.526 11.847 12.723 13.904 14.798 14.828 13.894 12.537 11.610 11.689 12.686 13.980 14.925 15.289 15.279 15.198 15.139 14.975 14.614 14.157 13.776 13.438 12.864 11.837 10.608 9.898 10.347 11.827 13.276 13.370 11.584 8.768 6.665 + 11.870 11.876 11.864 11.908 12.233 13.041 14.218 15.252 15.515 14.763 13.408 12.293 12.104 12.898 14.120 15.069 15.391 15.198 14.808 14.415 14.019 13.597 13.244 13.079 13.020 12.749 12.006 10.972 10.283 10.540 11.664 12.726 12.548 10.676 7.915 5.888 + 11.865 11.758 11.647 11.734 12.254 13.297 14.643 15.772 16.139 15.535 14.274 13.021 12.380 12.547 13.265 14.070 14.593 14.694 14.402 13.820 13.101 12.484 12.227 12.417 12.822 12.983 12.565 11.696 10.941 10.845 11.397 11.902 11.465 9.762 7.442 5.778 + 12.103 11.852 11.589 11.663 12.322 13.520 14.883 15.863 16.037 15.355 14.168 13.018 12.338 12.275 12.712 13.418 14.156 14.693 14.800 14.335 13.399 12.391 11.829 11.980 12.613 13.117 12.961 12.138 11.189 10.731 10.876 11.044 10.418 8.678 6.415 4.811 + 12.417 12.049 11.692 11.832 12.692 14.043 15.307 15.894 15.539 14.431 13.070 11.986 11.491 11.606 12.147 12.850 13.450 13.719 13.513 12.850 11.969 11.265 11.080 11.468 12.123 12.559 12.444 11.833 11.104 10.632 10.448 10.193 9.413 7.994 6.357 5.252 + 12.300 12.291 12.365 12.651 13.220 13.985 14.669 14.910 14.460 13.376 12.048 11.019 10.698 11.132 12.003 12.825 13.207 13.024 12.419 11.684 11.107 10.862 10.943 11.171 11.271 11.017 10.400 9.670 9.193 9.178 9.462 9.561 8.997 7.691 6.113 5.034 + 12.157 12.459 12.617 12.210 11.315 10.487 10.243 10.543 10.777 10.321 9.154 7.954 7.565 8.280 9.567 10.489 10.435 9.546 8.519 8.000 8.107 8.438 8.492 8.070 7.357 6.699 6.336 6.305 6.532 6.921 7.345 7.616 7.532 7.043 6.357 5.861 + 12.119 12.373 12.534 12.210 11.326 10.237 9.488 9.386 9.736 9.977 9.637 8.762 7.928 7.809 8.601 9.807 10.577 10.368 9.380 8.394 8.120 8.596 9.158 9.020 7.969 6.593 5.815 6.137 7.227 8.204 8.348 7.644 6.693 6.141 6.144 6.348 + 12.179 12.197 12.121 11.813 11.242 10.561 10.052 9.914 10.064 10.124 9.704 8.781 7.836 7.552 8.243 9.505 10.450 10.397 9.473 8.541 8.477 9.352 10.293 10.177 8.620 6.402 4.913 5.073 6.614 8.341 9.098 8.626 7.589 6.857 6.750 6.927 + 12.022 12.028 11.931 11.605 11.034 10.386 9.935 9.861 10.052 10.127 9.711 8.803 7.888 7.628 8.323 9.577 10.526 10.507 9.629 8.724 8.651 9.524 10.535 10.587 9.231 7.115 5.529 5.420 6.681 8.291 9.153 8.892 7.973 7.145 6.790 6.760 + 12.004 11.895 11.703 11.421 10.998 10.445 9.926 9.690 9.810 10.007 9.804 8.980 7.913 7.404 8.013 9.461 10.709 10.770 9.595 8.218 7.912 9.053 10.684 11.260 9.966 7.471 5.433 5.158 6.575 8.392 9.244 8.780 7.765 7.202 7.394 7.813 + 12.213 12.062 11.803 11.466 11.031 10.504 10.001 9.710 9.712 9.836 9.753 9.295 8.709 8.537 9.134 10.240 11.061 10.889 9.769 8.579 8.357 9.383 10.837 11.393 10.296 8.030 5.987 5.396 6.417 8.119 9.295 9.382 8.703 7.975 7.627 7.579 + 13.150 12.536 11.823 11.593 12.001 12.683 13.106 13.013 12.557 12.051 11.651 11.292 10.922 10.720 11.007 11.902 13.066 13.865 13.855 13.159 12.372 12.047 12.212 12.373 12.004 11.064 10.086 9.732 10.234 11.196 11.910 11.886 11.145 10.099 9.199 8.710 + 12.538 11.971 11.458 11.687 12.800 14.233 15.141 15.025 14.048 12.810 11.858 11.352 11.129 11.005 10.986 11.203 11.701 12.341 12.907 13.309 13.618 13.914 14.110 13.967 13.340 12.408 11.645 11.504 12.062 12.932 13.513 13.387 12.557 11.378 10.308 9.691 + 12.547 12.134 11.762 11.967 12.913 14.228 15.233 15.394 14.646 13.379 12.137 11.292 10.910 10.847 10.934 11.087 11.298 11.580 11.949 12.435 13.086 13.886 14.675 15.157 15.060 14.361 13.390 12.694 12.701 13.402 14.281 14.595 13.837 12.096 10.077 8.733 + 12.391 12.143 11.966 12.259 13.178 14.462 15.535 15.833 15.152 13.770 12.279 11.227 10.825 10.902 11.115 11.234 11.280 11.451 11.929 12.731 13.702 14.620 15.281 15.536 15.298 14.607 13.706 13.027 12.992 13.696 14.714 15.249 14.623 12.797 10.523 8.959 + 12.349 12.210 12.178 12.566 13.495 14.730 15.743 15.995 15.274 13.853 12.337 11.288 10.905 10.981 11.156 11.233 11.294 11.549 12.091 12.801 13.479 14.037 14.524 14.963 15.197 14.977 14.275 13.518 13.404 14.339 15.924 17.000 16.402 13.888 10.533 8.162 + 12.372 12.209 12.190 12.666 13.705 14.954 15.808 15.785 14.831 13.359 11.979 11.126 10.846 10.868 10.875 10.751 10.614 10.667 11.021 11.633 12.396 13.225 14.047 14.720 15.014 14.764 14.096 13.494 13.549 14.484 15.839 16.622 15.945 13.721 10.890 8.926 + 12.398 12.274 12.306 12.807 13.811 14.954 15.648 15.447 14.347 12.796 11.412 10.607 10.387 10.442 10.444 10.294 10.148 10.237 10.667 11.364 12.179 13.012 13.817 14.508 14.899 14.826 14.360 13.907 13.997 14.854 16.077 16.760 16.079 13.949 11.254 9.387 + 12.403 12.409 12.602 13.156 14.022 14.862 15.220 14.799 13.669 12.228 10.970 10.204 9.924 9.902 9.897 9.813 9.722 9.757 10.012 10.519 11.277 12.266 13.391 14.421 15.049 15.073 14.610 14.119 14.135 14.867 15.941 16.553 15.995 14.210 11.952 10.391 + 12.342 12.448 12.759 13.324 13.993 14.423 14.273 13.440 12.150 10.836 9.875 9.401 9.292 9.333 9.371 9.380 9.401 9.468 9.603 9.875 10.418 11.337 12.558 13.762 14.513 14.550 14.022 13.464 13.456 14.193 15.264 15.865 15.327 13.623 11.488 10.020 + 11.335 11.808 12.528 13.170 13.472 13.331 12.796 11.993 11.054 10.102 9.264 8.656 8.344 8.297 8.383 8.443 8.390 8.282 8.310 8.710 9.629 11.003 12.531 13.763 14.308 14.057 13.307 12.644 12.614 13.353 14.428 15.053 14.585 12.995 10.983 9.594 + 9.524 9.356 9.241 9.380 9.703 9.893 9.655 8.986 8.172 7.530 7.143 6.853 6.493 6.118 5.971 6.221 6.744 7.194 7.340 7.323 7.578 8.434 9.750 10.935 11.379 10.945 10.100 9.572 9.810 10.672 11.556 11.847 11.304 10.164 8.951 8.190 + 8.242 8.487 8.571 8.114 7.196 6.355 6.136 6.586 7.177 7.247 6.558 5.492 4.713 4.622 5.074 5.572 5.724 5.534 5.322 5.386 5.771 6.308 6.821 7.266 7.669 7.980 8.051 7.782 7.289 6.886 6.861 7.253 7.826 8.278 8.478 8.511 + 6.922 7.334 7.819 8.003 7.777 7.312 6.802 6.233 5.447 4.431 3.499 3.122 3.515 4.378 5.082 5.174 4.737 4.280 4.247 4.623 5.000 5.034 4.829 4.851 5.449 6.444 7.218 7.235 6.537 5.731 5.493 6.029 6.977 7.781 8.167 8.248 + 4.501 5.114 6.062 6.968 7.560 7.757 7.594 7.100 6.281 5.215 4.140 3.417 3.331 3.877 4.718 5.365 5.471 5.029 4.347 3.826 3.722 4.014 4.461 4.765 4.742 4.418 4.013 3.832 4.091 4.763 5.535 5.942 5.641 4.657 3.427 2.585 + 4.828 5.237 5.906 6.634 7.256 7.637 7.634 7.110 6.075 4.811 3.815 3.518 3.969 4.758 5.301 5.269 4.812 4.388 4.354 4.679 5.018 5.065 4.817 4.531 4.427 4.477 4.487 4.384 4.361 4.696 5.387 5.982 5.861 4.776 3.184 2.016 + 4.474 4.873 5.555 6.334 7.006 7.403 7.419 7.056 6.456 5.875 5.566 5.625 5.916 6.164 6.170 5.969 5.796 5.866 6.165 6.446 6.462 6.222 6.024 6.203 6.815 7.531 7.889 7.667 7.071 6.546 6.370 6.409 6.261 5.657 4.763 4.094 + 7.257 7.368 7.422 7.319 7.237 7.522 8.334 9.397 10.131 10.114 9.465 8.778 8.653 9.221 10.081 10.673 10.749 10.512 10.349 10.467 10.768 11.059 11.325 11.749 12.468 13.316 13.881 13.826 13.204 12.429 11.928 11.798 11.778 11.565 11.137 10.777 + 5.625 6.682 8.173 9.334 9.808 9.827 9.900 10.322 10.934 11.327 11.249 10.849 10.542 10.652 11.150 11.719 12.043 12.048 11.920 11.906 12.132 12.568 13.131 13.774 14.471 15.133 15.592 15.686 15.386 14.831 14.229 13.716 13.305 12.947 12.637 12.445 + 9.830 10.463 11.426 12.272 12.643 12.438 11.825 11.109 10.543 10.214 10.057 9.960 9.865 9.776 9.694 9.561 9.293 8.886 8.492 8.374 8.741 9.577 10.626 11.546 12.142 12.490 12.850 13.440 14.249 15.024 15.441 15.315 14.710 13.881 13.134 12.702 + 12.180 12.550 13.235 14.061 14.705 14.809 14.192 12.998 11.640 10.549 9.911 9.587 9.274 8.779 8.172 7.720 7.671 8.068 8.736 9.413 9.909 10.172 10.243 10.197 10.125 10.156 10.455 11.143 12.181 13.322 14.174 14.394 13.872 12.818 11.680 10.953 + 12.516 12.819 13.398 14.163 14.912 15.342 15.153 14.232 12.791 11.320 10.325 9.989 10.039 9.969 9.474 8.763 8.441 9.023 10.451 12.041 12.940 12.742 11.757 10.736 10.274 10.436 10.861 11.203 11.453 11.831 12.394 12.797 12.502 11.296 9.636 8.438 + 11.907 12.290 12.934 13.672 14.353 14.818 14.857 14.284 13.123 11.730 10.657 10.275 10.467 10.710 10.550 10.058 9.826 10.436 11.842 13.266 13.768 13.031 11.648 10.638 10.584 11.185 11.620 11.380 10.757 10.522 11.080 11.941 12.068 10.840 8.749 7.133 + 11.006 11.469 12.317 13.386 14.406 15.033 14.959 14.094 12.698 11.317 10.488 10.387 10.701 10.893 10.671 10.284 10.328 11.189 12.599 13.730 13.826 12.842 11.525 10.824 11.117 11.939 12.449 12.214 11.591 11.324 11.742 12.327 12.105 10.563 8.265 6.559 + 11.021 11.414 12.058 12.736 13.234 13.384 13.086 12.359 11.389 10.506 10.024 10.037 10.329 10.557 10.562 10.556 10.949 11.930 13.159 13.923 13.687 12.586 11.396 10.938 11.403 12.207 12.522 12.032 11.217 10.882 11.324 11.946 11.706 10.077 7.665 5.879 + 7.854 7.481 7.201 7.486 8.312 9.077 9.049 7.965 6.274 4.805 4.150 4.263 4.613 4.720 4.603 4.737 5.564 7.002 8.391 8.951 8.392 7.167 6.158 6.045 6.847 7.986 8.780 8.952 8.745 8.599 8.702 8.804 8.463 7.494 6.223 5.321 + 9.483 8.547 7.353 6.702 6.883 7.476 7.733 7.198 6.032 4.819 4.072 3.881 3.979 4.092 4.222 4.595 5.366 6.379 7.221 7.524 7.246 6.690 6.272 6.240 6.573 7.088 7.614 8.081 8.457 8.663 8.554 8.012 7.057 5.891 4.839 4.217 + 6.997 6.529 5.956 5.723 6.007 6.571 6.936 6.740 6.009 5.145 4.627 4.685 5.171 5.720 6.058 6.183 6.299 6.566 6.924 7.128 6.981 6.531 6.059 5.843 5.924 6.076 6.022 5.699 5.320 5.173 5.320 5.489 5.276 4.513 3.473 2.725 + 3.467 4.456 5.992 7.434 8.286 8.435 8.152 7.875 7.933 8.380 9.028 9.630 10.054 10.341 10.605 10.901 11.159 11.241 11.056 10.635 10.107 9.602 9.172 8.798 8.451 8.138 7.900 7.745 7.612 7.402 7.050 6.588 6.130 5.787 5.598 5.528 + 4.318 5.091 6.222 7.150 7.517 7.358 7.014 6.847 6.984 7.274 7.477 7.499 7.489 7.696 8.234 8.947 9.518 9.710 9.554 9.296 9.164 9.168 9.119 8.857 8.465 8.265 8.545 9.272 10.046 10.369 10.037 9.312 8.718 8.623 8.962 9.320 + 5.859 6.113 6.558 7.078 7.540 7.850 7.993 8.024 7.996 7.909 7.703 7.350 6.924 6.606 6.563 6.819 7.220 7.543 7.670 7.675 7.741 7.983 8.336 8.607 8.658 8.546 8.499 8.732 9.261 9.875 10.274 10.270 9.893 9.336 8.830 8.540 + 8.074 7.816 7.493 7.342 7.469 7.785 8.101 8.282 8.327 8.314 8.292 8.220 8.036 7.770 7.598 7.741 8.291 9.099 9.839 10.220 10.188 9.953 9.830 10.001 10.395 10.767 10.909 10.808 10.643 10.605 10.725 10.828 10.686 10.220 9.604 9.168 + 9.047 9.271 9.490 9.465 9.190 8.935 9.037 9.614 10.444 11.108 11.288 10.983 10.498 10.224 10.397 10.982 11.740 12.387 12.731 12.734 12.490 12.168 11.929 11.852 11.899 11.948 11.887 11.710 11.523 11.449 11.503 11.551 11.402 10.986 10.444 10.060 + 12.058 11.799 11.318 10.722 10.198 9.954 10.105 10.573 11.104 11.411 11.357 11.065 10.840 10.966 11.502 12.230 12.799 12.953 12.698 12.270 11.958 11.901 12.015 12.091 11.972 11.671 11.347 11.172 11.204 11.356 11.476 11.452 11.278 11.031 10.810 10.684 + 13.742 13.879 13.982 13.840 13.368 12.690 12.066 11.716 11.650 11.670 11.536 11.189 10.846 10.861 11.442 12.443 13.408 13.861 13.627 12.941 12.256 11.917 11.945 12.089 12.085 11.860 11.557 11.356 11.305 11.298 11.215 11.059 10.959 11.029 11.238 11.419 + 14.758 15.635 16.588 16.712 15.772 14.354 13.303 12.971 12.975 12.655 11.766 10.762 10.408 11.093 12.474 13.751 14.291 14.059 13.508 13.119 13.033 13.068 13.025 12.915 12.907 13.082 13.298 13.307 12.998 12.507 12.085 11.868 11.783 11.673 11.487 11.328 + 14.727 14.946 15.031 14.599 13.603 12.403 11.501 11.147 11.179 11.210 10.996 10.661 10.588 11.080 12.078 13.171 13.879 13.965 13.551 12.983 12.573 12.434 12.489 12.600 12.685 12.746 12.815 12.901 12.967 12.947 12.778 12.426 11.909 11.310 10.771 10.449 + 13.218 13.723 14.313 14.451 13.864 12.719 11.474 10.550 10.079 9.916 9.868 9.922 10.254 11.020 12.128 13.196 13.788 13.724 13.206 12.651 12.348 12.246 12.043 11.514 10.773 10.226 10.241 10.799 11.449 11.631 11.113 10.173 9.381 9.143 9.402 9.728 + 11.517 11.929 12.642 13.469 14.202 14.663 14.749 14.463 13.929 13.370 13.035 13.099 13.569 14.267 14.907 15.234 15.134 14.656 13.942 13.119 12.239 11.306 10.353 9.495 8.898 8.679 8.817 9.130 9.363 9.318 8.952 8.377 7.779 7.312 7.030 6.910 + 13.647 13.610 13.721 14.136 14.765 15.258 15.239 14.602 13.625 12.805 12.537 12.893 13.624 14.372 14.878 15.043 14.849 14.271 13.274 11.912 10.403 9.074 8.208 7.885 7.950 8.126 8.180 8.026 7.715 7.336 6.935 6.498 6.001 5.474 5.011 4.736 + 14.366 14.340 14.292 14.213 14.075 13.836 13.467 12.987 12.482 12.088 11.936 12.083 12.475 12.941 13.262 13.249 12.814 11.990 10.892 9.662 8.427 7.293 6.371 5.778 5.603 5.834 6.310 6.752 6.884 6.578 5.938 5.243 4.780 4.674 4.824 4.994 + 13.882 12.994 11.687 10.585 10.065 10.056 10.154 9.958 9.358 8.579 7.969 7.731 7.790 7.893 7.824 7.548 7.187 6.866 6.579 6.209 5.655 4.965 4.336 3.978 3.957 4.152 4.352 4.418 4.362 4.298 4.307 4.353 4.319 4.133 3.855 3.646 + 9.599 8.813 7.729 6.944 6.717 6.806 6.707 6.096 5.104 4.225 3.944 4.386 5.248 6.028 6.355 6.170 5.664 5.079 4.552 4.101 3.711 3.412 3.268 3.309 3.479 3.661 3.752 3.726 3.633 3.536 3.456 3.362 3.207 2.986 2.756 2.608 + 7.429 6.910 6.220 5.791 5.815 6.108 6.258 5.959 5.250 4.506 4.160 4.399 5.031 5.635 5.852 5.605 5.094 4.600 4.278 4.086 3.896 3.653 3.438 3.386 3.537 3.778 3.914 3.823 3.547 3.248 3.074 3.046 3.067 3.031 2.923 2.827 + 5.858 5.140 4.406 4.434 5.383 6.626 7.244 6.752 5.448 4.128 3.474 3.630 4.254 4.892 5.299 5.459 5.417 5.161 4.692 4.152 3.804 3.823 4.118 4.369 4.302 3.940 3.586 3.537 3.805 4.097 4.092 3.730 3.254 2.964 2.946 3.037 + 5.310 5.131 4.983 5.086 5.450 5.828 5.884 5.454 4.676 3.904 3.478 3.534 3.961 4.522 4.994 5.256 5.281 5.105 4.793 4.432 4.109 3.872 3.717 3.609 3.534 3.531 3.646 3.869 4.098 4.199 4.109 3.896 3.717 3.688 3.793 3.905 + 5.459 5.540 5.702 5.919 6.111 6.158 5.956 5.490 4.876 4.326 4.055 4.171 4.619 5.205 5.686 5.873 5.702 5.243 4.661 4.162 3.918 4.000 4.330 4.698 4.854 4.648 4.145 3.616 3.383 3.605 4.147 4.641 4.728 4.307 3.622 3.112 + 7.091 6.787 6.509 6.570 6.924 7.173 6.931 6.200 5.386 4.957 5.051 5.421 5.719 5.840 5.980 6.381 7.045 7.714 8.125 8.252 8.288 8.387 8.473 8.345 7.968 7.644 7.796 8.554 9.524 10.038 9.708 8.784 7.970 7.832 8.318 8.840 + 14.326 14.421 14.603 14.794 14.818 14.511 13.884 13.184 12.738 12.700 12.896 12.945 12.561 11.782 10.935 10.376 10.239 10.407 10.682 10.970 11.289 11.627 11.858 11.822 11.520 11.199 11.177 11.558 12.085 12.315 12.001 11.320 10.744 10.644 10.973 11.326 + 18.691 18.381 17.958 17.618 17.354 16.975 16.334 15.529 14.876 14.637 14.759 14.868 14.550 13.679 12.524 11.549 11.087 11.174 11.625 12.242 12.931 13.651 14.284 14.613 14.457 13.822 12.930 12.067 11.401 10.916 10.524 10.202 10.026 10.064 10.261 10.438 + 16.487 16.061 15.502 15.126 15.003 14.917 14.602 13.998 13.291 12.696 12.232 11.698 10.905 9.912 9.037 8.615 8.728 9.158 9.616 10.005 10.469 11.183 12.087 12.838 13.032 12.528 11.558 10.563 9.885 9.582 9.488 9.418 9.308 9.206 9.160 9.157 + 11.306 11.573 11.907 12.004 11.621 10.713 9.489 8.323 7.571 7.386 7.640 8.015 8.196 8.043 7.652 7.259 7.102 7.304 7.868 8.721 9.761 10.853 11.806 12.388 12.416 11.872 10.959 10.040 9.470 9.422 9.811 10.366 10.801 10.971 10.926 10.835 + 10.182 10.880 11.884 12.641 12.746 12.153 11.158 10.198 9.592 9.398 9.447 9.505 9.431 9.236 9.030 8.918 8.936 9.070 9.305 9.659 10.161 10.790 11.451 11.999 12.322 12.394 12.278 12.079 11.872 11.673 11.460 11.213 10.945 10.693 10.502 10.401 + 12.161 12.532 13.089 13.520 13.517 12.930 11.876 10.700 9.793 9.363 9.337 9.452 9.467 9.330 9.174 9.177 9.431 9.924 10.613 11.481 12.487 13.468 14.123 14.165 13.550 12.584 11.785 11.567 11.972 12.651 13.106 13.005 12.351 11.420 10.571 10.080 + 12.202 12.721 13.437 13.884 13.707 12.848 11.575 10.327 9.487 9.198 9.338 9.639 9.859 9.900 9.813 9.722 9.736 9.928 10.357 11.075 12.087 13.265 14.319 14.886 14.730 13.923 12.881 12.174 12.203 12.933 13.877 14.357 13.910 12.594 10.997 9.917 + 12.180 12.699 13.397 13.781 13.487 12.491 11.124 9.885 9.162 9.035 9.283 9.570 9.668 9.548 9.323 9.121 9.031 9.149 9.635 10.662 12.226 13.998 15.365 15.739 14.938 13.369 11.842 11.111 11.440 12.483 13.535 13.961 13.531 12.479 11.319 10.580 + 11.214 11.915 12.869 13.431 13.120 11.908 10.248 8.824 8.162 8.335 8.972 9.534 9.674 9.421 9.093 9.035 9.410 10.173 11.191 12.352 13.526 14.467 14.797 14.185 12.637 10.640 9.011 8.470 9.218 10.800 12.353 13.076 12.642 11.319 9.785 8.784 + 13.249 13.135 12.862 12.373 11.652 10.759 9.838 9.057 8.537 8.291 8.236 8.258 8.284 8.321 8.427 8.663 9.070 9.672 10.471 11.401 12.266 12.721 12.392 11.104 9.081 6.955 5.529 5.376 6.517 8.381 10.070 10.805 10.291 8.832 7.155 6.061 + 12.209 11.360 10.093 8.964 8.298 8.039 7.904 7.667 7.320 7.022 6.911 6.992 7.158 7.296 7.351 7.305 7.134 6.833 6.477 6.225 6.213 6.394 6.515 6.273 5.587 4.730 4.189 4.332 5.128 6.164 6.928 7.136 6.852 6.360 5.935 5.710 + 10.578 10.224 9.653 9.016 8.361 7.676 7.023 6.609 6.644 7.100 7.613 7.699 7.157 6.327 5.927 6.526 8.066 9.824 10.882 10.777 9.807 8.776 8.389 8.756 9.397 9.676 9.322 8.624 8.188 8.477 9.492 10.802 11.867 12.382 12.423 12.309 + 9.587 9.347 8.965 8.522 8.008 7.374 6.689 6.211 6.240 6.837 7.670 8.182 8.004 7.304 6.737 6.983 8.212 9.893 11.138 11.337 10.589 9.621 9.229 9.705 10.653 11.330 11.224 10.422 9.521 9.174 9.637 10.639 11.634 12.206 12.322 12.248 + 8.401 8.199 7.908 7.612 7.259 6.747 6.128 5.710 5.865 6.682 7.775 8.488 8.389 7.653 6.976 7.045 7.989 9.256 10.035 9.882 9.037 8.211 8.021 8.559 9.382 9.902 9.817 9.264 8.641 8.300 8.353 8.686 9.107 9.470 9.714 9.832 + 13.839 13.134 12.191 11.552 11.397 11.452 11.301 10.801 10.214 9.954 10.185 10.670 10.984 10.885 10.517 10.248 10.337 10.720 11.107 11.268 11.230 11.220 11.423 11.812 12.184 12.356 12.329 12.257 12.294 12.455 12.625 12.673 12.564 12.368 12.183 12.078 + 16.897 15.935 14.827 14.457 14.981 15.740 15.918 15.319 14.508 14.211 14.567 14.975 14.668 13.465 11.976 11.067 11.107 11.681 12.028 11.732 11.037 10.522 10.518 10.830 11.009 10.843 10.551 10.515 10.849 11.268 11.374 11.061 10.608 10.390 10.500 10.697 + 16.459 16.244 16.063 16.121 16.307 16.253 15.696 14.778 13.975 13.680 13.832 13.958 13.595 12.720 11.764 11.224 11.219 11.415 11.370 10.947 10.420 10.180 10.359 10.736 10.985 11.011 11.000 11.176 11.506 11.685 11.425 10.754 10.020 9.594 9.554 9.666 + 17.363 16.832 16.114 15.586 15.341 15.167 14.827 14.341 13.979 13.960 14.171 14.194 13.660 12.587 11.394 10.558 10.231 10.156 9.954 9.481 8.947 8.693 8.887 9.413 10.024 10.577 11.078 11.526 11.768 11.561 10.826 9.820 9.021 8.771 9.003 9.306 + 14.685 14.627 14.707 15.050 15.483 15.625 15.258 14.588 14.115 14.179 14.590 14.732 14.050 12.528 10.702 9.231 8.415 8.070 7.844 7.604 7.529 7.859 8.600 9.493 10.270 10.889 11.475 12.045 12.328 11.963 10.913 9.684 9.046 9.427 10.508 11.416 + 14.541 13.903 13.297 13.399 14.218 15.064 15.199 14.535 13.710 13.457 13.876 14.306 13.917 12.464 10.508 8.920 8.151 7.945 7.715 7.154 6.514 6.304 6.779 7.716 8.669 9.373 9.886 10.352 10.704 10.682 10.176 9.502 9.253 9.799 10.882 11.749 + 11.363 11.507 11.826 12.305 12.814 13.143 13.132 12.821 12.461 12.341 12.541 12.799 12.646 11.748 10.205 8.559 7.452 7.181 7.495 7.815 7.716 7.274 6.997 7.371 8.418 9.640 10.416 10.506 10.241 10.210 10.735 11.579 12.156 12.059 11.432 10.859 + 11.226 10.731 10.026 9.446 9.111 8.889 8.602 8.253 8.049 8.170 8.515 8.679 8.248 7.155 5.810 4.841 4.644 5.105 5.720 6.013 5.908 5.744 5.943 6.620 7.455 7.955 7.866 7.394 7.052 7.245 7.929 8.620 8.757 8.143 7.120 6.350 + 9.389 9.012 8.452 7.953 7.640 7.448 7.208 6.795 6.221 5.601 5.048 4.591 4.200 3.870 3.673 3.705 3.983 4.386 4.715 4.852 4.870 4.996 5.421 6.112 6.779 7.055 6.766 6.078 5.411 5.147 5.374 5.838 6.148 6.077 5.722 5.406 + 8.584 8.075 7.415 7.005 6.947 6.960 6.649 5.880 4.931 4.289 4.243 4.643 5.017 4.962 4.478 3.955 3.841 4.256 4.894 5.288 5.211 4.873 4.746 5.150 5.965 6.683 6.797 6.180 5.192 4.411 4.228 4.607 5.189 5.603 5.731 5.708 + 8.528 8.228 7.730 7.229 6.962 7.088 7.573 8.151 8.450 8.217 7.500 6.646 6.105 6.167 6.799 7.702 8.507 8.995 9.171 9.199 9.261 9.453 9.774 10.171 10.592 10.994 11.336 11.561 11.610 11.443 11.057 10.494 9.832 9.178 8.650 8.355 + 9.964 9.742 9.325 8.845 8.566 8.746 9.412 10.243 10.722 10.491 9.640 8.679 8.204 8.484 9.304 10.161 10.631 10.630 10.386 10.208 10.264 10.537 10.934 11.408 11.970 12.620 13.287 13.852 14.219 14.359 14.290 14.023 13.563 12.963 12.374 12.003 + 8.875 9.766 10.999 11.882 12.051 11.617 10.933 10.254 9.617 8.985 8.448 8.204 8.338 8.649 8.753 8.413 7.768 7.244 7.190 7.589 8.113 8.471 8.690 9.061 9.800 10.788 11.649 12.111 12.273 12.490 12.970 13.498 13.580 12.928 11.817 10.960 + 13.400 13.223 13.017 12.932 12.937 12.790 12.204 11.128 9.911 9.173 9.404 10.566 12.009 12.829 12.453 11.029 9.316 8.156 7.912 8.325 8.839 9.113 9.253 9.608 10.341 11.209 11.759 11.749 11.384 11.132 11.276 11.631 11.703 11.170 10.229 9.494 + 13.078 12.522 11.820 11.443 11.517 11.682 11.376 10.314 8.821 7.683 7.621 8.731 10.338 11.402 11.199 9.784 7.898 6.414 5.749 5.690 5.719 5.519 5.235 5.283 5.913 6.940 7.860 8.251 8.087 7.706 7.479 7.508 7.598 7.512 7.235 6.983 + 9.754 9.901 9.936 9.564 8.713 7.612 6.633 6.044 5.873 5.974 6.191 6.457 6.734 6.903 6.746 6.089 5.006 3.877 3.204 3.298 4.050 4.990 5.590 5.604 5.184 4.719 4.523 4.621 4.781 4.736 4.419 4.010 3.785 3.887 4.211 4.484 + 10.903 10.563 9.983 9.270 8.461 7.551 6.620 5.898 5.672 6.068 6.870 7.573 7.664 6.942 5.648 4.306 3.385 3.052 3.148 3.386 3.574 3.696 3.834 4.028 4.220 4.306 4.245 4.107 4.027 4.101 4.325 4.600 4.815 4.912 4.913 4.886 + 10.638 10.318 9.803 9.231 8.644 8.004 7.318 6.722 6.417 6.502 6.842 7.130 7.092 6.669 6.019 5.360 4.805 4.345 3.965 3.737 3.779 4.105 4.533 4.779 4.677 4.324 4.003 3.943 4.130 4.339 4.357 4.184 4.020 4.061 4.294 4.513 + 11.233 10.573 9.657 8.949 8.603 8.386 7.966 7.275 6.624 6.430 6.815 7.429 7.669 7.131 5.918 4.574 3.700 3.566 4.006 4.626 5.107 5.368 5.504 5.607 5.662 5.580 5.317 4.944 4.600 4.394 4.326 4.307 4.238 4.085 3.898 3.770 + 10.500 9.944 8.979 7.886 6.998 6.546 6.510 6.628 6.592 6.279 5.834 5.504 5.375 5.277 4.951 4.342 3.724 3.508 3.886 4.642 5.300 5.513 5.315 5.040 4.966 5.057 5.025 4.664 4.101 3.718 3.806 4.277 4.728 4.800 4.504 4.185 + 10.048 9.410 8.412 7.442 6.782 6.488 6.423 6.398 6.298 6.108 5.865 5.588 5.276 4.953 4.691 4.575 4.622 4.737 4.761 4.593 4.289 4.037 4.019 4.250 4.539 4.624 4.372 3.906 3.531 3.519 3.896 4.418 4.747 4.702 4.390 4.109 + 10.213 9.660 8.637 7.332 6.042 5.070 4.587 4.543 4.718 4.889 4.969 5.028 5.165 5.367 5.486 5.363 4.981 4.525 4.263 4.356 4.736 5.144 5.304 5.086 4.564 3.950 3.467 3.248 3.310 3.572 3.894 4.132 4.187 4.054 3.833 3.668 + 13.512 13.473 13.428 13.374 13.218 12.818 12.106 11.183 10.302 9.724 9.548 9.662 9.829 9.848 9.668 9.383 9.141 9.048 9.123 9.299 9.461 9.491 9.327 9.017 8.732 8.686 8.997 9.575 10.143 10.407 10.257 9.848 9.480 9.371 9.502 9.665 + 17.231 17.277 17.309 17.203 16.812 16.066 15.060 14.041 13.270 12.836 12.594 12.286 11.762 11.102 10.550 10.305 10.366 10.555 10.672 10.631 10.454 10.177 9.791 9.317 8.904 8.818 9.247 10.086 10.908 11.232 10.886 10.169 9.631 9.644 10.106 10.548 + 17.009 16.445 15.611 14.875 14.425 14.155 13.796 13.137 12.189 11.166 10.329 9.831 9.662 9.693 9.765 9.758 9.610 9.334 8.996 8.684 8.445 8.256 8.059 7.850 7.743 7.922 8.484 9.303 10.040 10.344 10.101 9.524 9.005 8.825 8.963 9.156 + 12.867 12.555 12.030 11.456 10.988 10.702 10.539 10.332 9.895 9.156 8.229 7.377 6.861 6.771 6.959 7.130 7.053 6.720 6.358 6.253 6.527 7.034 7.462 7.573 7.387 7.170 7.234 7.694 8.378 8.956 9.168 8.993 8.619 8.280 8.092 8.031 + 8.295 9.328 10.795 11.943 12.382 12.269 12.032 11.946 11.903 11.574 10.740 9.502 8.194 7.127 6.406 5.948 5.623 5.359 5.138 4.950 4.807 4.789 5.032 5.595 6.332 6.923 7.117 6.996 6.985 7.518 8.611 9.737 10.168 9.568 8.332 7.352 + 9.264 10.268 11.673 12.734 13.089 12.930 12.715 12.705 12.738 12.413 11.467 10.021 8.497 7.325 6.692 6.506 6.526 6.515 6.320 5.920 5.454 5.214 5.507 6.425 7.684 8.745 9.184 9.059 8.904 9.299 10.329 11.412 11.714 10.850 9.291 8.085 + 8.755 9.968 11.635 12.812 13.049 12.637 12.258 12.374 12.871 13.206 12.868 11.748 10.152 8.525 7.169 6.182 5.556 5.282 5.344 5.645 6.022 6.361 6.708 7.231 8.045 9.055 9.985 10.581 10.807 10.846 10.913 11.053 11.130 11.006 10.716 10.471 + 9.004 10.299 12.077 13.302 13.436 12.746 12.010 11.883 12.431 13.154 13.411 12.881 11.736 10.451 9.469 8.971 8.857 8.879 8.809 8.551 8.189 7.966 8.179 9.006 10.346 11.801 12.851 13.139 12.668 11.776 10.899 10.319 10.062 9.991 9.972 9.958 + 11.629 12.175 12.993 13.674 13.874 13.499 12.742 11.978 11.555 11.612 12.028 12.533 12.887 13.005 12.944 12.774 12.459 11.875 10.946 9.815 8.872 8.587 9.223 10.627 12.250 13.409 13.637 12.908 11.606 10.279 9.345 8.927 8.892 9.013 9.127 9.181 + 12.584 13.063 13.791 14.413 14.618 14.277 13.495 12.536 11.687 11.123 10.879 10.911 11.179 11.680 12.383 13.156 13.757 13.947 13.649 13.039 12.470 12.275 12.569 13.180 13.756 13.967 13.659 12.884 11.826 10.687 9.611 8.681 7.934 7.384 7.031 6.860 + 12.487 13.041 13.886 14.602 14.797 14.300 13.252 12.028 11.018 10.407 10.109 9.915 9.717 9.632 9.905 10.673 11.793 12.902 13.657 13.977 14.066 14.211 14.524 14.841 14.866 14.425 13.624 12.773 12.157 11.819 11.540 11.010 10.059 8.798 7.583 6.835 + 12.296 13.075 14.058 14.543 14.197 13.226 12.101 11.152 10.389 9.656 8.908 8.313 8.086 8.272 8.701 9.163 9.613 10.180 11.002 12.049 13.138 14.078 14.778 15.173 15.103 14.351 12.905 11.209 10.061 10.093 11.207 12.479 12.752 11.526 9.429 7.829 + 12.468 12.939 13.461 13.529 12.939 11.893 10.783 9.866 9.128 8.431 7.753 7.267 7.193 7.572 8.200 8.786 9.179 9.466 9.861 10.509 11.384 12.317 13.109 13.579 13.590 13.089 12.221 11.386 11.095 11.633 12.752 13.711 13.723 12.556 10.791 9.494 + 12.218 12.580 12.936 12.857 12.193 11.158 10.119 9.296 8.660 8.079 7.542 7.203 7.218 7.546 7.929 8.111 8.073 8.086 8.492 9.432 10.724 11.996 12.927 13.388 13.425 13.153 12.700 12.230 11.934 11.921 12.078 12.053 11.479 10.289 8.879 7.918 + 12.114 12.225 12.341 12.286 11.890 11.082 9.963 8.785 7.850 7.355 7.306 7.533 7.809 7.969 7.974 7.881 7.801 7.866 8.217 8.971 10.139 11.537 12.787 13.463 13.325 12.495 11.438 10.723 10.702 11.300 12.060 12.414 12.023 10.970 9.729 8.903 + 12.010 12.083 12.127 11.994 11.578 10.880 10.025 9.198 8.552 8.133 7.887 7.720 7.588 7.518 7.572 7.782 8.126 8.576 9.162 9.972 11.062 12.324 13.443 14.009 13.769 12.843 11.733 11.082 11.303 12.299 13.481 14.085 13.626 12.199 10.465 9.296 + 11.546 11.670 11.733 11.533 11.022 10.336 9.650 9.031 8.429 7.802 7.254 6.994 7.163 7.675 8.245 8.613 8.772 9.008 9.692 10.982 12.660 14.212 15.080 14.933 13.807 12.096 10.429 9.449 9.545 10.616 12.025 12.856 12.420 10.717 8.530 7.016 + 10.367 10.786 11.080 10.659 9.435 7.942 6.930 6.783 7.266 7.769 7.814 7.376 6.793 6.411 6.330 6.443 6.668 7.106 7.943 9.205 10.607 11.645 11.864 11.105 9.574 7.749 6.218 5.498 5.851 7.105 8.609 9.456 8.962 7.142 4.817 3.210 + 10.681 10.173 9.293 8.235 7.185 6.289 5.685 5.486 5.718 6.231 6.715 6.845 6.473 5.722 4.894 4.259 3.909 3.782 3.807 4.009 4.457 5.102 5.687 5.855 5.409 4.504 3.588 3.122 3.275 3.819 4.312 4.385 3.954 3.212 2.479 2.037 + 9.730 9.300 8.540 7.645 6.864 6.402 6.308 6.433 6.518 6.357 5.943 5.457 5.113 4.974 4.894 4.650 4.161 3.630 3.451 3.937 5.051 6.356 7.230 7.231 6.354 5.017 3.805 3.128 3.041 3.286 3.516 3.508 3.249 2.870 2.531 2.340 + 9.330 8.705 7.789 6.990 6.496 6.191 5.827 5.292 4.718 4.360 4.360 4.624 4.899 4.971 4.799 4.496 4.215 4.061 4.097 4.375 4.915 5.611 6.183 6.267 5.650 4.463 3.179 2.359 2.322 2.947 3.762 4.231 4.062 3.342 2.457 1.865 + 6.370 6.408 6.471 6.506 6.408 6.070 5.475 4.761 4.175 3.945 4.129 4.576 5.010 5.199 5.082 4.774 4.473 4.331 4.401 4.645 4.989 5.337 5.573 5.557 5.186 4.480 3.633 2.960 2.732 2.999 3.528 3.920 3.852 3.283 2.500 1.947 + 5.737 5.360 4.885 4.642 4.750 5.009 5.052 4.656 3.952 3.380 3.381 4.053 5.046 5.772 5.808 5.180 4.326 3.774 3.792 4.250 4.789 5.098 5.085 4.827 4.406 3.833 3.118 2.408 1.984 2.072 2.608 3.194 3.341 2.843 1.967 1.296 + 8.057 7.799 7.395 6.994 6.691 6.485 6.319 6.160 6.053 6.091 6.329 6.708 7.069 7.249 7.209 7.064 7.008 7.165 7.493 7.808 7.927 7.807 7.574 7.427 7.482 7.698 7.924 8.026 7.979 7.864 7.773 7.728 7.679 7.573 7.425 7.314 + 16.067 16.123 16.034 15.658 15.134 14.819 14.950 15.367 15.580 15.164 14.127 12.918 12.073 11.816 11.966 12.180 12.278 12.315 12.393 12.446 12.263 11.736 11.058 10.623 10.686 11.109 11.455 11.366 10.891 10.429 10.355 10.671 11.022 11.049 10.738 10.415 + 18.044 17.808 17.359 16.788 16.265 15.957 15.892 15.899 15.709 15.149 14.277 13.349 12.637 12.272 12.218 12.368 12.629 12.924 13.121 13.040 12.582 11.865 11.227 11.007 11.278 11.753 11.985 11.716 11.079 10.477 10.235 10.348 10.516 10.454 10.152 9.871 + 17.697 17.205 16.327 15.283 14.359 13.781 13.574 13.530 13.346 12.833 12.029 11.127 10.303 9.620 9.073 8.715 8.674 9.020 9.601 10.066 10.111 9.751 9.360 9.379 9.932 10.687 11.118 10.955 10.426 10.050 10.171 10.642 10.961 10.747 10.103 9.546 + 15.735 14.621 12.863 11.130 9.921 9.333 9.098 8.852 8.412 7.880 7.488 7.349 7.340 7.216 6.876 6.507 6.474 7.004 7.947 8.846 9.273 9.178 8.920 8.965 9.473 10.156 10.525 10.316 9.726 9.241 9.228 9.633 10.063 10.160 9.911 9.630 + 10.733 10.197 9.292 8.288 7.450 6.935 6.742 6.752 6.824 6.879 6.905 6.894 6.797 6.554 6.193 5.888 5.877 6.288 7.001 7.695 8.070 8.077 7.954 8.024 8.418 8.965 9.346 9.378 9.173 9.029 9.148 9.449 9.645 9.516 9.131 8.799 + 8.865 8.480 7.923 7.449 7.168 6.999 6.793 6.483 6.126 5.812 5.546 5.258 4.927 4.696 4.826 5.494 6.595 7.739 8.487 8.640 8.372 8.085 8.114 8.493 8.975 9.250 9.177 8.875 8.604 8.575 8.828 9.241 9.640 9.913 10.045 10.087 + 10.252 9.846 9.251 8.718 8.343 8.045 7.726 7.421 7.282 7.399 7.636 7.697 7.373 6.782 6.341 6.472 7.259 8.356 9.221 9.511 9.299 8.975 8.914 9.199 9.606 9.823 9.708 9.377 9.080 9.007 9.165 9.417 9.603 9.651 9.599 9.537 + 11.922 11.554 10.992 10.441 9.993 9.619 9.287 9.066 9.091 9.384 9.732 9.765 9.239 8.299 7.471 7.344 8.137 9.501 10.720 11.182 10.788 9.987 9.437 9.538 10.186 10.902 11.203 10.936 10.336 9.818 9.672 9.905 10.302 10.628 10.783 10.820 + 9.796 9.768 9.679 9.518 9.340 9.223 9.182 9.123 8.916 8.506 7.974 7.480 7.144 7.003 7.060 7.354 7.922 8.677 9.340 9.571 9.249 8.664 8.367 8.750 9.672 10.498 10.585 9.837 8.848 8.446 9.010 10.134 10.952 10.865 10.049 9.289 + 9.394 9.592 9.987 10.549 11.192 11.755 12.038 11.880 11.252 10.295 9.267 8.436 7.968 7.901 8.181 8.711 9.367 9.987 10.398 10.507 10.402 10.338 10.564 11.097 11.631 11.715 11.100 9.996 8.978 8.580 8.867 9.355 9.369 8.593 7.359 6.432 + 11.962 11.692 11.439 11.566 12.240 13.278 14.230 14.649 14.356 13.522 12.515 11.654 11.075 10.785 10.817 11.277 12.198 13.339 14.179 14.210 13.345 12.085 11.212 11.201 11.827 12.336 12.094 11.176 10.349 10.411 11.404 12.431 12.297 10.523 7.874 5.923 + 12.830 12.268 11.598 11.443 12.185 13.665 15.218 16.048 15.724 14.450 12.890 11.706 11.148 11.044 11.138 11.420 12.099 13.233 14.409 14.874 14.111 12.366 10.609 9.855 10.382 11.545 12.355 12.350 11.948 11.947 12.628 13.314 12.879 10.808 7.871 5.727 + 13.143 12.694 12.070 11.723 12.053 13.115 14.467 15.353 15.191 14.013 12.465 11.329 10.943 11.023 11.054 10.863 10.797 11.328 12.443 13.471 13.600 12.637 11.295 10.666 11.300 12.727 13.876 14.025 13.387 12.792 12.764 12.909 12.242 10.206 7.420 5.394 + 13.217 12.980 12.589 12.287 12.429 13.227 14.442 15.393 15.400 14.335 12.789 11.633 11.319 11.561 11.701 11.408 11.033 11.243 12.269 13.525 14.027 13.265 11.722 10.507 10.427 11.350 12.436 12.998 13.113 13.386 14.102 14.675 14.033 11.682 8.446 6.102 + 13.316 13.071 12.672 12.350 12.427 13.086 14.119 14.933 14.911 13.902 12.404 11.218 10.841 11.108 11.406 11.272 10.836 10.677 11.258 12.440 13.557 13.963 13.555 12.812 12.343 12.401 12.805 13.258 13.681 14.174 14.682 14.775 13.894 11.911 9.492 7.821 + 13.190 12.908 12.473 12.137 12.187 12.750 13.620 14.285 14.229 13.316 11.939 10.766 10.268 10.389 10.650 10.586 10.152 9.750 9.857 10.618 11.720 12.656 13.112 13.151 13.071 13.131 13.384 13.740 14.098 14.390 14.499 14.204 13.299 11.836 10.254 9.216 + 13.083 12.466 11.654 11.194 11.379 12.068 12.807 13.131 12.829 12.011 10.984 10.071 9.477 9.246 9.272 9.362 9.330 9.120 8.884 8.927 9.517 10.666 12.056 13.193 13.718 13.623 13.238 12.975 13.034 13.288 13.402 13.090 12.306 11.264 10.302 9.734 + 12.769 12.192 11.421 10.924 10.915 11.238 11.557 11.620 11.390 10.957 10.393 9.720 9.004 8.432 8.227 8.458 8.937 9.340 9.473 9.445 9.546 9.956 10.535 10.924 10.868 10.472 10.139 10.229 10.755 11.385 11.740 11.708 11.492 11.377 11.456 11.586 + 13.027 12.441 11.668 11.171 11.119 11.313 11.436 11.337 11.085 10.780 10.382 9.770 8.972 8.276 8.056 8.427 9.092 9.567 9.609 9.428 9.442 9.804 10.151 9.899 8.818 7.385 6.501 6.806 8.151 9.727 10.720 10.915 10.742 10.762 11.125 11.500 + 12.835 12.355 11.717 11.298 11.237 11.385 11.501 11.462 11.299 11.044 10.628 9.965 9.145 8.487 8.325 8.696 9.258 9.566 9.479 9.306 9.479 10.059 10.530 10.180 8.764 6.866 5.592 5.775 7.354 9.436 10.970 11.462 11.163 10.675 10.397 10.335 + 12.586 12.164 11.622 11.288 11.235 11.273 11.194 10.991 10.814 10.732 10.580 10.106 9.289 8.472 8.124 8.416 9.031 9.435 9.386 9.170 9.304 9.944 10.580 10.387 8.973 6.870 5.272 5.193 6.714 8.959 10.768 11.500 11.314 10.807 10.445 10.315 + 12.020 11.644 11.164 10.870 10.814 10.828 10.756 10.640 10.622 10.692 10.576 9.960 8.853 7.703 7.074 7.160 7.603 7.847 7.714 7.627 8.196 9.515 10.858 11.148 9.861 7.579 5.648 5.188 6.284 8.028 9.329 9.753 9.678 9.736 10.142 10.557 + 11.404 11.106 10.770 10.638 10.673 10.619 10.303 9.848 9.534 9.445 9.284 8.626 7.391 6.061 5.369 5.691 6.716 7.733 8.279 8.531 9.034 10.021 11.008 11.110 9.851 7.718 5.900 5.397 6.267 7.677 8.667 8.930 8.908 9.197 9.890 10.500 + 11.610 11.038 10.316 9.920 10.007 10.341 10.567 10.504 10.191 9.689 8.946 7.906 6.763 6.009 6.125 7.137 8.492 9.452 9.704 9.604 9.806 10.566 11.395 11.443 10.293 8.442 6.987 6.748 7.600 8.619 8.898 8.287 7.414 7.014 7.246 7.630 + 10.458 10.392 10.409 10.626 10.957 11.147 10.983 10.468 9.780 9.094 8.456 7.879 7.515 7.676 8.581 10.044 11.440 12.088 11.766 10.917 10.297 10.344 10.804 10.972 10.335 9.055 7.858 7.427 7.847 8.589 9.004 8.866 8.474 8.268 8.390 8.601 + 9.730 9.698 9.758 10.012 10.397 10.710 10.773 10.568 10.196 9.732 9.142 8.389 7.634 7.275 7.706 8.962 10.564 11.758 12.021 11.417 10.516 9.932 9.874 10.068 10.072 9.699 9.148 8.795 8.848 9.211 9.632 9.955 10.224 10.553 10.936 11.210 + 8.520 8.452 8.460 8.651 8.942 9.111 9.013 8.730 8.480 8.360 8.205 7.742 6.926 6.115 5.877 6.534 7.852 9.169 9.876 9.850 9.475 9.253 9.381 9.657 9.763 9.615 9.437 9.510 9.885 10.342 10.643 10.792 11.034 11.571 12.299 12.836 + 7.951 7.665 7.470 7.695 8.228 8.554 8.230 7.328 6.405 6.009 6.196 6.517 6.499 6.139 5.926 6.362 7.439 8.589 9.157 8.967 8.450 8.234 8.588 9.244 9.710 9.762 9.618 9.677 10.113 10.730 11.204 11.425 11.579 11.912 12.418 12.815 + 7.312 7.358 7.458 7.595 7.719 7.767 7.725 7.652 7.642 7.736 7.874 7.930 7.828 7.630 7.522 7.685 8.144 8.727 9.168 9.284 9.093 8.792 8.601 8.624 8.800 8.999 9.149 9.310 9.622 10.185 10.967 11.802 12.491 12.917 13.097 13.140 + 6.467 6.749 7.095 7.263 7.203 7.091 7.156 7.455 7.811 7.962 7.791 7.433 7.171 7.218 7.572 8.050 8.446 8.678 8.795 8.888 8.996 9.095 9.153 9.178 9.214 9.309 9.490 9.783 10.229 10.863 11.651 12.464 13.127 13.523 13.669 13.686 + 7.695 7.373 6.980 6.814 6.994 7.397 7.804 8.077 8.230 8.331 8.382 8.321 8.131 7.938 7.954 8.300 8.877 9.412 9.671 9.638 9.508 9.492 9.628 9.772 9.768 9.633 9.571 9.800 10.370 11.129 11.873 12.513 13.105 13.721 14.309 14.685 + 9.921 9.732 9.491 9.354 9.372 9.449 9.435 9.237 8.880 8.460 8.062 7.731 7.513 7.501 7.817 8.502 9.418 10.268 10.737 10.694 10.280 9.824 9.631 9.808 10.234 10.679 10.984 11.154 11.323 11.635 12.135 12.750 13.342 13.801 14.083 14.209 + 10.285 10.655 11.230 11.785 12.162 12.299 12.184 11.788 11.094 10.174 9.252 8.628 8.523 8.936 9.641 10.325 10.755 10.872 10.763 10.576 10.456 10.508 10.767 11.154 11.476 11.519 11.213 10.755 10.535 10.888 11.821 12.954 13.762 13.942 13.634 13.288 + 11.724 11.586 11.684 12.382 13.618 14.857 15.454 15.138 14.185 13.150 12.421 11.984 11.588 11.108 10.734 10.792 11.359 12.072 12.338 11.828 10.808 10.003 10.056 10.999 12.180 12.709 12.114 10.687 9.274 8.666 9.063 9.986 10.685 10.708 10.195 9.699 + 12.588 12.115 11.738 12.093 13.322 14.902 16.024 16.169 15.437 14.366 13.480 12.949 12.642 12.425 12.378 12.693 13.366 14.024 14.118 13.367 12.073 10.983 10.759 11.446 12.390 12.690 11.865 10.221 8.634 7.917 8.247 9.079 9.597 9.341 8.529 7.836 + 12.864 12.384 11.920 12.051 12.965 14.312 15.470 15.993 15.846 15.300 14.638 13.985 13.371 12.909 12.838 13.328 14.249 15.133 15.450 14.986 14.020 13.123 12.743 12.894 13.189 13.171 12.664 11.872 11.181 10.845 10.815 10.804 10.536 9.952 9.259 8.791 + 12.651 12.181 11.719 11.838 12.757 14.170 15.470 16.167 16.151 15.641 14.921 14.139 13.342 12.651 12.354 12.749 13.852 15.238 16.221 16.288 15.466 14.310 13.507 13.379 13.679 13.835 13.442 12.601 11.831 11.619 11.989 12.447 12.360 11.474 10.166 9.208 + 12.218 11.931 11.633 11.708 12.394 13.613 14.980 16.000 16.328 15.917 14.986 13.857 12.805 12.031 11.712 11.996 12.882 14.077 15.034 15.241 14.594 13.533 12.764 12.715 13.182 13.490 13.096 12.121 11.322 11.457 12.546 13.706 13.770 12.253 9.862 8.074 + 12.098 11.980 11.895 12.074 12.711 13.816 15.148 16.288 16.826 16.578 15.676 14.489 13.441 12.863 12.914 13.574 14.624 15.650 16.141 15.735 14.483 12.922 11.798 11.598 12.205 12.992 13.321 13.041 12.578 12.500 12.933 13.357 13.006 11.565 9.573 8.135 + 12.038 11.893 11.788 11.983 12.644 13.737 15.012 16.110 16.708 16.646 15.980 14.958 13.941 13.285 13.226 13.780 14.717 15.632 16.111 15.922 15.126 14.031 13.018 12.336 12.011 11.912 11.909 11.989 12.220 12.603 12.957 12.957 12.349 11.182 9.870 9.002 + 11.919 11.721 11.528 11.619 12.181 13.200 14.466 15.658 16.453 16.622 16.111 15.089 13.943 13.151 13.078 13.765 14.872 15.843 16.221 15.912 15.215 14.589 14.324 14.359 14.373 14.075 13.466 12.861 12.643 12.945 13.486 13.727 13.232 11.998 10.520 9.520 + 11.558 11.467 11.416 11.606 12.205 13.241 14.552 15.801 16.594 16.650 15.946 14.776 13.649 13.070 13.287 14.150 15.177 15.806 15.703 14.948 13.956 13.204 12.919 12.947 12.916 12.552 11.938 11.493 11.654 12.484 13.510 13.940 13.176 11.269 8.997 7.465 + 11.437 11.417 11.438 11.621 12.127 13.063 14.372 15.764 16.794 17.055 16.417 15.151 13.834 13.078 13.210 14.105 15.263 16.102 16.273 15.833 15.153 14.645 14.485 14.516 14.397 13.892 13.089 12.370 12.154 12.556 13.245 13.606 13.137 11.823 10.209 9.108 + 11.390 11.418 11.496 11.699 12.172 13.050 14.315 15.699 16.734 16.984 16.316 15.039 13.778 13.139 13.370 14.228 15.153 15.624 15.471 14.926 14.410 14.212 14.287 14.320 13.991 13.249 12.390 11.876 12.009 12.688 13.420 13.582 12.807 11.236 9.485 8.340 + 11.729 11.738 11.807 12.032 12.528 13.376 14.536 15.789 16.758 17.063 16.540 15.411 14.239 13.638 13.905 14.813 15.754 16.144 15.819 15.125 14.614 14.596 14.888 14.966 14.411 13.287 12.147 11.665 12.142 13.274 14.312 14.515 13.580 11.804 9.915 8.715 + 11.586 11.484 11.449 11.687 12.310 13.273 14.421 15.542 16.393 16.720 16.360 15.400 14.262 13.545 13.670 14.556 15.626 16.182 15.912 15.102 14.373 14.163 14.365 14.461 14.010 13.079 12.232 12.080 12.772 13.837 14.506 14.215 12.944 11.160 9.516 8.553 + 11.404 11.335 11.324 11.539 12.087 12.973 14.100 15.287 16.268 16.736 16.477 15.553 14.389 13.606 13.660 14.509 15.595 16.210 15.986 15.136 14.251 13.804 13.781 13.740 13.236 12.259 11.297 10.971 11.535 12.644 13.554 13.588 12.544 10.776 8.987 7.880 + 10.962 11.059 11.225 11.460 11.849 12.551 13.671 15.093 16.414 17.086 16.755 15.570 14.200 13.463 13.777 14.847 15.843 16.007 15.208 14.017 13.233 13.219 13.613 13.649 12.829 11.378 10.109 9.809 10.641 12.032 13.100 13.238 12.433 11.145 9.952 9.264 + 11.040 11.178 11.400 11.671 12.056 12.721 13.801 15.211 16.543 17.220 16.860 15.629 14.264 13.660 14.246 15.630 16.828 16.968 15.936 14.450 13.475 13.439 13.904 13.961 13.025 11.374 9.967 9.702 10.722 12.310 13.419 13.375 12.226 10.568 9.090 8.256 + 11.250 11.405 11.641 11.908 12.273 12.912 13.956 15.289 16.491 17.030 16.631 15.561 14.564 14.400 15.288 16.674 17.563 17.218 15.711 13.890 12.744 12.664 13.168 13.331 12.554 11.070 9.775 9.532 10.517 12.086 13.240 13.279 12.176 10.464 8.860 7.921 + 11.080 11.308 11.610 11.874 12.212 12.902 14.104 15.596 16.800 17.144 16.512 15.400 14.619 14.742 15.688 16.781 17.225 16.665 15.404 14.157 13.528 13.603 13.940 13.920 13.194 11.910 10.589 9.774 9.698 10.168 10.713 10.868 10.423 9.512 8.520 7.882 + 10.742 10.952 11.250 11.551 11.958 12.710 13.935 15.411 16.589 16.920 16.284 15.158 14.345 14.419 15.284 16.206 16.328 15.298 13.548 11.988 11.348 11.662 12.268 12.336 11.492 10.089 8.926 8.663 9.370 10.514 11.356 11.416 10.699 9.585 8.550 7.949 + 10.535 10.754 11.048 11.332 11.750 12.585 13.945 15.505 16.602 16.687 15.787 14.583 13.966 14.383 15.474 16.299 16.011 14.478 12.377 10.717 10.142 10.527 11.132 11.173 10.372 9.121 8.175 8.134 9.063 10.476 11.632 11.947 11.272 9.921 8.492 7.591 + 10.990 11.181 11.461 11.796 12.343 13.327 14.733 16.131 16.873 16.574 15.490 14.422 14.150 14.830 15.840 16.222 15.396 13.586 11.657 10.488 10.394 10.985 11.521 11.445 10.714 9.758 9.155 9.285 10.136 11.325 12.277 12.474 11.704 10.190 8.536 7.465 + 11.354 11.423 11.572 11.887 12.530 13.604 14.947 16.094 16.528 16.065 15.078 14.294 14.279 14.992 15.782 15.858 14.881 13.210 11.630 10.772 10.689 10.890 10.765 10.045 8.974 8.105 7.919 8.540 9.701 10.909 11.675 11.706 10.988 9.788 8.566 7.801 + 10.952 11.049 11.233 11.571 12.230 13.311 14.624 15.658 15.889 15.219 14.160 13.530 13.819 14.764 15.492 15.183 13.703 11.720 10.195 9.687 10.006 10.463 10.438 9.802 8.898 8.202 7.991 8.260 8.842 9.543 10.162 10.469 10.275 9.583 8.687 8.060 + 10.438 10.550 10.795 11.269 12.131 13.415 14.830 15.788 15.768 14.779 13.494 12.841 13.308 14.505 15.398 15.076 13.448 11.324 9.805 9.489 10.111 10.850 10.985 10.370 9.401 8.616 8.326 8.516 9.004 9.587 10.080 10.269 9.972 9.194 8.230 7.564 + 10.697 10.802 11.092 11.695 12.683 13.940 15.092 15.641 15.283 14.198 13.043 12.570 13.095 14.219 15.059 14.858 13.526 11.709 10.335 9.983 10.531 11.327 11.681 11.310 10.441 9.569 9.117 9.228 9.760 10.405 10.822 10.744 10.076 8.972 7.815 7.075 + 9.518 9.923 10.704 11.800 13.092 14.352 15.248 15.454 14.863 13.746 12.691 12.295 12.776 13.792 14.631 14.668 13.764 12.337 11.048 10.368 10.321 10.564 10.684 10.472 9.986 9.433 9.002 8.779 8.770 8.933 9.198 9.462 9.612 9.595 9.462 9.342 + 8.024 8.045 8.383 9.358 10.972 12.759 13.972 14.014 12.842 11.057 9.602 9.217 10.011 11.409 12.516 12.653 11.731 10.230 8.854 8.094 7.997 8.243 8.430 8.332 7.985 7.576 7.270 7.112 7.050 7.035 7.083 7.266 7.635 8.145 8.651 8.967 + 7.790 8.252 9.147 10.370 11.693 12.768 13.228 12.862 11.783 10.447 9.478 9.343 10.088 11.297 12.319 12.634 12.110 11.008 9.760 8.705 7.955 7.454 7.111 6.894 6.801 6.801 6.802 6.727 6.591 6.525 6.697 7.195 7.956 8.797 9.501 9.896 + 4.367 4.253 4.369 5.136 6.692 8.659 10.242 10.634 9.531 7.403 5.309 4.325 4.918 6.670 8.549 9.537 9.207 7.895 6.386 5.396 5.189 5.544 6.007 6.204 5.996 5.463 4.792 4.180 3.792 3.734 4.022 4.561 5.180 5.710 6.058 6.220 + 4.380 4.426 4.570 4.937 5.682 6.825 8.085 8.915 8.802 7.679 6.090 4.923 4.852 5.875 7.326 8.343 8.437 7.748 6.832 6.209 6.034 6.105 6.115 5.888 5.437 4.873 4.304 3.833 3.573 3.617 3.931 4.308 4.469 4.267 3.827 3.472 + 5.338 4.889 4.389 4.382 5.191 6.673 8.242 9.178 9.049 7.976 6.580 5.611 5.513 6.185 7.091 7.624 7.482 6.800 5.996 5.463 5.336 5.462 5.556 5.397 4.942 4.312 3.701 3.276 3.115 3.181 3.347 3.442 3.339 3.032 2.650 2.387 + 3.677 3.419 3.228 3.536 4.575 6.169 7.772 8.737 8.677 7.693 6.332 5.277 4.978 5.425 6.216 6.837 6.965 6.610 6.029 5.505 5.176 4.992 4.818 4.561 4.234 3.923 3.711 3.621 3.608 3.601 3.540 3.400 3.194 2.962 2.760 2.642 + 4.269 3.922 3.509 3.463 4.129 5.516 7.184 8.413 8.602 7.667 6.133 4.832 4.383 4.839 5.730 6.450 6.656 6.390 5.906 5.396 4.886 4.338 3.794 3.394 3.240 3.271 3.312 3.243 3.131 3.153 3.380 3.641 3.627 3.174 2.459 1.920 + 2.173 2.630 3.386 4.289 5.318 6.494 7.657 8.372 8.164 6.935 5.184 3.776 3.377 3.996 5.023 5.718 5.752 5.353 4.992 4.938 5.073 5.092 4.834 4.409 4.041 3.822 3.653 3.419 3.173 3.100 3.287 3.537 3.478 2.900 2.013 1.345 + 5.205 4.624 3.893 3.597 4.098 5.293 6.666 7.593 7.704 7.072 6.128 5.380 5.127 5.353 5.823 6.267 6.518 6.525 6.295 5.852 5.263 4.656 4.191 3.958 3.897 3.832 3.611 3.253 2.945 2.891 3.106 3.362 3.349 2.929 2.283 1.802 + 5.144 5.096 5.035 5.102 5.528 6.423 7.540 8.280 8.081 6.920 5.458 4.634 4.966 6.142 7.269 7.578 6.989 6.060 5.430 5.277 5.280 5.055 4.582 4.190 4.155 4.350 4.343 3.864 3.149 2.763 3.048 3.721 4.060 3.555 2.429 1.502 + 4.297 4.255 4.123 3.976 4.089 4.730 5.812 6.791 7.027 6.352 5.317 4.812 5.336 6.555 7.570 7.668 6.898 5.950 5.484 5.568 5.727 5.521 5.021 4.709 4.899 5.314 5.290 4.451 3.174 2.341 2.552 3.536 4.356 4.242 3.301 2.416 + 5.484 5.912 6.607 7.386 8.174 8.973 9.721 10.219 10.247 9.799 9.189 8.875 9.121 9.782 10.417 10.655 10.484 10.207 10.124 10.232 10.244 9.884 9.190 8.517 8.238 8.426 8.807 9.015 8.912 8.667 8.557 8.694 8.944 9.093 9.067 8.981 + 7.118 7.364 7.758 8.223 8.787 9.504 10.273 10.785 10.716 10.038 9.150 8.644 8.872 9.669 10.489 10.855 10.717 10.414 10.294 10.367 10.314 9.840 9.021 8.292 8.081 8.439 9.000 9.311 9.222 8.969 8.918 9.216 9.688 10.045 10.160 10.139 + 4.934 5.284 5.831 6.384 6.844 7.223 7.548 7.773 7.794 7.573 7.252 7.118 7.412 8.121 8.947 9.494 9.548 9.226 8.879 8.805 9.027 9.286 9.271 8.881 8.325 7.963 8.044 8.527 9.131 9.567 9.752 9.845 10.095 10.607 11.234 11.669 + 6.010 5.908 5.849 5.971 6.265 6.582 6.795 6.948 7.234 7.806 8.609 9.382 9.861 9.993 9.968 10.052 10.359 10.770 11.054 11.066 10.839 10.518 10.220 9.971 9.755 9.605 9.609 9.830 10.227 10.674 11.080 11.478 11.986 12.652 13.347 13.802 + 7.903 7.152 6.287 6.061 6.739 7.932 8.959 9.403 9.365 9.261 9.401 9.758 10.100 10.291 10.436 10.733 11.210 11.647 11.759 11.471 11.002 10.667 10.608 10.699 10.718 10.595 10.486 10.615 11.037 11.589 12.048 12.339 12.582 12.921 13.339 13.642 + 6.743 6.865 7.267 8.046 9.022 9.794 10.025 9.732 9.291 9.144 9.452 10.004 10.443 10.589 10.573 10.669 11.003 11.417 11.608 11.403 10.917 10.455 10.272 10.401 10.684 10.946 11.130 11.293 11.498 11.751 12.023 12.320 12.691 13.156 13.630 13.938 + 7.619 7.914 8.351 8.722 8.890 8.883 8.863 9.016 9.417 9.970 10.463 10.711 10.687 10.536 10.474 10.633 10.967 11.288 11.404 11.257 10.954 10.693 10.621 10.746 10.951 11.098 11.125 11.091 11.124 11.341 11.775 12.368 13.007 13.575 13.989 14.204 + 8.097 8.143 8.303 8.645 9.155 9.722 10.202 10.512 10.675 10.777 10.868 10.913 10.824 10.577 10.281 10.148 10.329 10.777 11.234 11.388 11.100 10.513 9.958 9.720 9.847 10.155 10.424 10.599 10.842 11.362 12.188 13.086 13.706 13.849 13.627 13.375 + 8.363 7.844 7.331 7.408 8.217 9.359 10.260 10.635 10.629 10.557 10.538 10.426 10.071 9.621 9.489 9.991 10.974 11.841 11.996 11.332 10.334 9.693 9.765 10.343 10.904 11.086 10.952 10.866 11.125 11.716 12.381 12.877 13.147 13.293 13.409 13.491 + 6.758 6.818 7.037 7.512 8.241 9.090 9.870 10.439 10.748 10.813 10.662 10.331 9.920 9.628 9.683 10.179 10.946 11.579 11.679 11.145 10.291 9.677 9.726 10.409 11.249 11.662 11.401 10.759 10.375 10.753 11.871 13.176 13.969 13.916 13.275 12.693 + 8.844 9.252 10.038 11.073 12.084 12.748 12.864 12.465 11.759 10.965 10.186 9.455 8.879 8.690 9.087 9.988 10.933 11.301 10.743 9.490 8.257 7.775 8.296 9.429 10.443 10.793 10.461 9.903 9.671 10.028 10.827 11.672 12.215 12.348 12.214 12.058 + 11.268 11.179 11.375 12.193 13.496 14.647 14.944 14.151 12.675 11.249 10.412 10.224 10.396 10.645 10.900 11.195 11.418 11.246 10.376 8.890 7.361 6.561 6.950 8.340 10.001 11.133 11.339 10.784 9.973 9.381 9.199 9.328 9.550 9.702 9.750 9.747 + 11.521 11.485 11.717 12.509 13.783 15.017 15.552 15.038 13.683 12.119 11.001 10.651 10.978 11.662 12.385 12.907 13.002 12.423 11.032 9.044 7.120 6.129 6.639 8.477 10.736 12.288 12.497 11.610 10.529 10.121 10.583 11.327 11.493 10.668 9.247 8.158 + 11.901 11.887 12.109 12.814 13.955 15.129 15.791 15.600 14.626 13.282 12.068 11.326 11.161 11.511 12.215 13.013 13.525 13.333 12.233 10.479 8.801 8.059 8.711 10.445 12.302 13.266 12.930 11.768 10.781 10.765 11.722 12.869 13.237 12.419 10.904 9.732 + 11.530 11.554 11.793 12.444 13.503 14.677 15.508 15.631 14.974 13.793 12.532 11.611 11.283 11.584 12.363 13.311 14.017 14.076 13.286 11.831 10.301 9.441 9.722 11.004 12.562 13.507 13.364 12.386 11.360 11.034 11.568 12.442 12.878 12.462 11.475 10.669 + 11.245 11.049 11.037 11.625 12.879 14.387 15.514 15.802 15.217 14.095 12.881 11.913 11.381 11.387 11.955 12.941 13.944 14.416 13.979 12.732 11.302 10.499 10.794 11.986 13.323 13.995 13.673 12.686 11.750 11.450 11.853 12.526 12.898 12.684 12.080 11.578 + 11.357 11.113 11.021 11.527 12.725 14.233 15.419 15.802 15.304 14.216 12.963 11.907 11.290 11.263 11.861 12.896 13.910 14.331 13.816 12.541 11.185 10.536 10.972 12.190 13.408 13.889 13.433 12.468 11.707 11.624 12.147 12.750 12.865 12.301 11.375 10.684 + 11.522 11.399 11.424 11.901 12.886 14.112 15.143 15.631 15.451 14.695 13.583 12.422 11.588 11.437 12.093 13.265 14.289 14.487 13.634 12.173 10.968 10.733 11.548 12.833 13.788 13.952 13.451 12.797 12.452 12.504 12.693 12.678 12.307 11.685 11.064 10.687 + 11.277 11.160 11.179 11.618 12.542 13.716 14.749 15.315 15.284 14.718 13.803 12.824 12.144 12.115 12.857 14.081 15.132 15.340 14.475 12.961 11.646 11.249 11.891 13.051 13.967 14.162 13.696 13.004 12.510 12.333 12.299 12.162 11.814 11.337 10.900 10.648 + 10.979 10.702 10.522 10.880 11.922 13.361 14.655 15.333 15.217 14.443 13.337 12.287 11.667 11.746 12.541 13.697 14.562 14.507 13.340 11.500 9.847 9.133 9.543 10.626 11.649 12.109 11.996 11.666 11.480 11.513 11.551 11.306 10.666 9.769 8.914 8.398 + 11.096 10.914 10.849 11.252 12.236 13.572 14.823 15.591 15.680 15.123 14.135 13.070 12.356 12.361 13.161 14.387 15.337 15.373 14.363 12.825 11.608 11.322 11.938 12.871 13.449 13.393 12.929 12.494 12.337 12.351 12.248 11.855 11.259 10.692 10.324 10.168 + 11.455 11.341 11.359 11.780 12.667 13.812 14.872 15.556 15.715 15.321 14.457 13.373 12.516 12.367 13.116 14.393 15.373 15.282 13.980 12.136 10.802 10.676 11.617 12.808 13.410 13.164 12.467 11.924 11.811 11.916 11.833 11.383 10.753 10.272 10.087 10.083 + 11.324 11.337 11.466 11.850 12.563 13.540 14.570 15.346 15.584 15.159 14.210 13.141 12.472 12.562 13.373 14.421 15.020 14.685 13.453 11.874 10.667 10.280 10.633 11.248 11.617 11.541 11.191 10.891 10.822 10.893 10.849 10.486 9.805 8.993 8.294 7.899 + 11.095 10.971 10.963 11.356 12.240 13.429 14.561 15.283 15.387 14.863 13.896 12.858 12.231 12.400 13.375 14.654 15.408 14.970 13.319 11.160 9.502 8.998 9.545 10.436 10.931 10.769 10.251 9.868 9.848 10.011 9.997 9.616 8.992 8.408 8.051 7.914 + 11.298 11.159 11.132 11.523 12.439 13.693 14.892 15.639 15.703 15.092 14.049 13.006 12.455 12.733 13.785 15.084 15.852 15.517 14.116 12.323 11.031 10.770 11.385 12.214 12.607 12.360 11.753 11.199 10.877 10.645 10.268 9.706 9.163 8.878 8.886 8.993 + 11.578 11.474 11.487 11.874 12.716 13.835 14.886 15.538 15.610 15.123 14.278 13.415 12.928 13.097 13.890 14.892 15.474 15.171 14.022 12.577 11.555 11.351 11.803 12.377 12.602 12.406 12.063 11.860 11.802 11.628 11.103 10.283 9.498 9.069 9.031 9.140 + 11.529 11.468 11.494 11.796 12.467 13.420 14.412 15.141 15.376 15.055 14.331 13.538 13.063 13.155 13.763 14.511 14.882 14.530 13.519 12.323 11.539 11.517 12.148 12.956 13.425 13.306 12.709 11.940 11.256 10.728 10.281 9.830 9.375 8.985 8.721 8.596 + 11.278 11.034 10.798 10.899 11.516 12.564 13.736 14.661 15.066 14.880 14.253 13.516 13.056 13.137 13.728 14.463 14.823 14.457 13.443 12.277 11.566 11.626 12.299 13.090 13.529 13.443 12.959 12.286 11.516 10.623 9.636 8.758 8.285 8.359 8.799 9.190 + 10.833 10.778 10.679 10.634 10.862 11.577 12.756 14.031 14.850 14.841 14.110 13.209 12.771 13.077 13.873 14.582 14.713 14.177 13.280 12.473 12.073 12.141 12.555 13.125 13.658 13.955 13.825 13.158 12.031 10.725 9.614 8.990 8.923 9.257 9.711 10.017 + 11.304 10.922 10.341 9.911 10.029 10.901 12.318 13.675 14.299 13.912 12.852 11.870 11.608 12.172 13.117 13.822 13.939 13.548 12.969 12.454 12.063 11.775 11.657 11.847 12.367 12.960 13.174 12.678 11.544 10.232 9.283 8.960 9.141 9.495 9.764 9.881 + 10.370 10.598 10.746 10.588 10.326 10.454 11.242 12.351 13.021 12.737 11.750 10.934 11.064 12.144 13.407 13.967 13.543 12.590 11.792 11.440 11.286 10.973 10.530 10.406 10.974 12.015 12.743 12.399 10.910 8.994 7.629 7.350 7.969 8.876 9.564 9.883 + 9.378 9.957 10.498 10.423 9.825 9.424 9.844 10.939 11.852 11.802 10.847 9.891 9.891 10.983 12.352 12.940 12.340 11.055 9.944 9.438 9.268 8.927 8.321 7.925 8.284 9.362 10.415 10.557 9.507 7.838 6.525 6.208 6.817 7.795 8.603 9.011 + 9.465 9.707 9.769 9.323 8.607 8.296 8.852 9.991 10.845 10.726 9.796 8.956 9.050 10.078 11.180 11.399 10.511 9.164 8.231 8.016 8.077 7.789 7.066 6.495 6.758 7.892 9.127 9.474 8.549 6.884 5.499 5.130 5.793 6.940 7.962 8.517 + 7.976 8.225 8.348 8.013 7.333 6.827 6.948 7.641 8.366 8.580 8.221 7.739 7.642 8.019 8.490 8.601 8.262 7.787 7.517 7.446 7.248 6.692 5.997 5.726 6.272 7.404 8.357 8.417 7.505 6.240 5.435 5.481 6.145 6.890 7.352 7.517 + 7.192 7.101 6.673 5.779 4.734 4.202 4.691 6.084 7.656 8.602 8.637 8.155 7.827 8.017 8.518 8.812 8.559 7.872 7.147 6.684 6.463 6.269 5.995 5.790 5.899 6.384 7.008 7.412 7.410 7.124 6.843 6.763 6.855 6.964 6.987 6.959 + 6.252 6.188 5.870 5.230 4.569 4.427 5.122 6.378 7.446 7.666 7.001 6.063 5.617 5.975 6.808 7.483 7.590 7.185 6.595 6.056 5.564 5.045 4.600 4.519 5.008 5.916 6.772 7.138 6.962 6.601 6.479 6.720 7.082 7.242 7.123 6.940 + 3.617 3.685 3.844 4.133 4.585 5.185 5.834 6.370 6.643 6.609 6.380 6.161 6.119 6.274 6.481 6.543 6.353 5.973 5.589 5.372 5.364 5.456 5.484 5.360 5.128 4.940 4.941 5.180 5.584 6.013 6.337 6.501 6.525 6.473 6.406 6.364 + 3.818 4.037 4.409 4.845 5.277 5.686 6.072 6.402 6.583 6.498 6.101 5.504 4.949 4.685 4.788 5.094 5.296 5.176 4.772 4.372 4.300 4.663 5.259 5.719 5.781 5.475 5.089 4.942 5.161 5.618 6.053 6.272 6.245 6.080 5.907 5.807 + 3.956 4.216 4.637 5.111 5.590 6.054 6.412 6.483 6.113 5.370 4.591 4.203 4.432 5.124 5.865 6.283 6.299 6.105 5.938 5.864 5.780 5.595 5.374 5.283 5.391 5.556 5.529 5.218 4.821 4.680 4.957 5.437 5.680 5.397 4.739 4.195 + 5.568 5.327 5.072 5.088 5.507 6.192 6.797 6.973 6.570 5.727 4.796 4.170 4.102 4.608 5.481 6.398 7.052 7.271 7.074 6.641 6.215 5.968 5.913 5.918 5.806 5.505 5.126 4.911 5.083 5.672 6.466 7.110 7.315 7.037 6.513 6.116 + 4.804 4.634 4.431 4.378 4.579 4.990 5.442 5.724 5.682 5.290 4.682 4.131 3.967 4.436 5.540 6.963 8.171 8.657 8.234 7.157 5.996 5.298 5.278 5.712 6.137 6.185 5.830 5.385 5.249 5.616 6.329 6.990 7.231 6.955 6.401 5.974 + 5.267 4.900 4.448 4.251 4.440 4.864 5.234 5.353 5.227 5.005 4.827 4.758 4.832 5.116 5.688 6.515 7.363 7.877 7.808 7.207 6.412 5.817 5.595 5.602 5.543 5.245 4.821 4.586 4.797 5.442 6.228 6.767 6.821 6.428 5.860 5.462 + 4.909 4.576 4.133 3.878 3.992 4.428 4.946 5.265 5.228 4.884 4.451 4.196 4.288 4.712 5.277 5.714 5.829 5.617 5.268 5.045 5.107 5.392 5.654 5.634 5.252 4.665 4.159 3.952 4.052 4.283 4.428 4.384 4.198 3.990 3.849 3.789 + 5.853 5.677 5.527 5.608 5.929 6.287 6.458 6.391 6.224 6.117 6.095 6.056 5.940 5.863 6.050 6.608 7.354 7.904 7.958 7.539 6.978 6.633 6.621 6.772 6.846 6.777 6.710 6.820 7.096 7.322 7.270 6.915 6.458 6.145 6.058 6.086 + 7.661 7.914 8.370 8.908 9.363 9.598 9.597 9.482 9.416 9.463 9.545 9.537 9.430 9.394 9.655 10.279 11.048 11.570 11.545 10.982 10.188 9.545 9.263 9.303 9.498 9.729 9.991 10.308 10.625 10.799 10.719 10.419 10.073 9.855 9.810 9.844 + 5.834 6.289 6.951 7.478 7.647 7.477 7.192 7.040 7.111 7.275 7.309 7.100 6.780 6.666 7.030 7.877 8.893 9.616 9.713 9.178 8.306 7.495 7.022 6.945 7.152 7.491 7.851 8.162 8.360 8.387 8.229 7.952 7.679 7.511 7.464 7.474 + 5.327 6.355 7.767 8.674 8.510 7.392 6.050 5.341 5.669 6.722 7.712 7.962 7.416 6.667 6.487 7.220 8.511 9.573 9.787 9.136 8.165 7.520 7.479 7.822 8.112 8.085 7.823 7.602 7.603 7.753 7.831 7.681 7.337 6.963 6.695 6.572 + 5.952 6.298 6.804 7.240 7.491 7.601 7.689 7.825 7.981 8.084 8.102 8.073 8.070 8.150 8.346 8.678 9.131 9.604 9.880 9.727 9.074 8.145 7.387 7.192 7.608 8.284 8.721 8.644 8.188 7.746 7.617 7.755 7.848 7.633 7.167 6.780 + 4.898 5.450 6.370 7.352 8.086 8.382 8.245 7.875 7.560 7.528 7.825 8.301 8.723 8.934 8.964 8.990 9.187 9.566 9.943 10.057 9.770 9.181 8.571 8.205 8.160 8.296 8.398 8.359 8.255 8.247 8.413 8.657 8.783 8.670 8.388 8.155 + 5.728 6.474 7.451 8.028 7.937 7.449 7.115 7.304 7.921 8.514 8.671 8.361 7.963 7.958 8.563 9.568 10.494 10.929 10.773 10.253 9.718 9.402 9.307 9.262 9.087 8.738 8.342 8.116 8.225 8.666 9.251 9.698 9.791 9.511 9.052 8.715 + 6.545 6.270 6.105 6.428 7.210 8.006 8.349 8.188 7.946 8.117 8.790 9.540 9.796 9.382 8.708 8.453 8.988 10.055 10.968 11.153 10.578 9.724 9.158 9.106 9.352 9.515 9.409 9.185 9.156 9.487 10.033 10.431 10.375 9.838 9.102 8.585 + 4.568 5.232 6.409 7.775 8.883 9.351 9.097 8.447 7.958 8.045 8.681 9.407 9.694 9.372 8.792 8.570 9.107 10.249 11.370 11.823 11.391 10.423 9.544 9.191 9.342 9.624 9.681 9.477 9.295 9.442 9.932 10.424 10.474 9.913 9.018 8.349 + 5.128 5.557 6.384 7.467 8.504 9.140 9.194 8.807 8.382 8.291 8.598 9.006 9.118 8.792 8.307 8.175 8.737 9.855 10.968 11.480 11.175 10.360 9.605 9.315 9.467 9.698 9.665 9.350 9.069 9.178 9.739 10.429 10.776 10.544 9.927 9.417 + 4.635 5.523 6.874 8.089 8.727 8.716 8.328 7.953 7.852 8.023 8.248 8.274 8.012 7.629 7.482 7.904 8.962 10.345 11.485 11.881 11.421 10.481 9.683 9.477 9.837 10.316 10.423 10.021 9.430 9.140 9.384 9.932 10.285 10.110 9.531 9.030 + 5.886 6.164 6.752 7.603 8.506 9.158 9.365 9.206 8.995 9.023 9.308 9.558 9.420 8.821 8.110 7.854 8.420 9.667 10.988 11.700 11.498 10.628 9.693 9.221 9.350 9.811 10.202 10.301 10.180 10.080 10.163 10.380 10.538 10.489 10.272 10.078 + 6.100 5.931 5.980 6.581 7.592 8.442 8.645 8.279 7.954 8.243 9.112 9.898 9.894 9.027 8.008 7.785 8.764 10.455 11.858 12.222 11.569 10.566 9.945 9.979 10.406 10.783 10.872 10.750 10.626 10.609 10.644 10.636 10.563 10.484 10.452 10.455 + 6.209 5.713 5.408 5.977 7.379 8.810 9.397 8.979 8.233 8.038 8.659 9.524 9.791 9.177 8.266 8.012 8.889 10.456 11.717 11.932 11.176 10.190 9.723 9.960 10.504 10.819 10.702 10.374 10.196 10.327 10.637 10.879 10.914 10.779 10.603 10.493 + 5.784 5.568 5.534 6.108 7.321 8.704 9.585 9.578 8.859 8.012 7.590 7.736 8.167 8.493 8.585 8.662 9.045 9.808 10.649 11.106 10.937 10.335 9.775 9.634 9.891 10.183 10.150 9.783 9.445 9.552 10.176 10.924 11.227 10.802 9.917 9.211 + 5.424 5.283 5.234 5.555 6.336 7.380 8.309 8.810 8.830 8.573 8.323 8.228 8.233 8.214 8.157 8.226 8.616 9.329 10.091 10.519 10.428 10.005 9.674 9.739 10.108 10.368 10.162 9.557 9.049 9.160 9.952 10.888 11.214 10.566 9.319 8.340 + 4.674 4.631 4.860 5.677 7.049 8.521 9.492 9.631 9.086 8.337 7.823 7.672 7.722 7.783 7.877 8.213 8.948 9.944 10.783 11.052 10.667 9.959 9.447 9.450 9.878 10.341 10.498 10.333 10.143 10.243 10.651 11.027 10.936 10.223 9.196 8.449 + 5.329 6.027 7.135 8.235 8.993 9.304 9.279 9.111 8.921 8.686 8.306 7.741 7.122 6.741 6.903 7.724 9.004 10.290 11.098 11.187 10.702 10.077 9.758 9.910 10.337 10.654 10.595 10.224 9.881 9.904 10.343 10.904 11.168 10.926 10.356 9.892 + 4.714 5.433 6.543 7.605 8.333 8.720 8.939 9.124 9.225 9.043 8.423 7.448 6.481 6.006 6.373 7.581 9.254 10.801 11.712 11.803 11.298 10.681 10.402 10.605 11.066 11.368 11.226 10.696 10.136 9.920 10.144 10.541 10.698 10.392 9.784 9.302 + 3.815 4.095 4.847 6.156 7.726 8.979 9.469 9.234 8.737 8.427 8.349 8.178 7.648 6.955 6.695 7.365 8.870 10.503 11.459 11.438 10.827 10.316 10.323 10.719 11.055 11.036 10.769 10.612 10.794 11.196 11.479 11.391 10.965 10.436 10.030 9.832 + 4.941 5.223 5.749 6.430 7.145 7.776 8.271 8.640 8.908 9.040 8.946 8.570 8.007 7.532 7.466 7.973 8.924 9.948 10.657 10.867 10.675 10.343 10.098 10.011 10.028 10.087 10.204 10.450 10.849 11.311 11.655 11.711 11.434 10.930 10.408 10.082 + 5.673 5.582 5.550 5.771 6.349 7.222 8.188 8.992 9.420 9.361 8.847 8.076 7.374 7.096 7.452 8.368 9.483 10.324 10.569 10.226 9.612 9.127 9.005 9.206 9.511 9.733 9.858 10.029 10.388 10.924 11.441 11.677 11.477 10.907 10.232 9.783 + 4.561 4.994 5.759 6.684 7.572 8.266 8.685 8.837 8.775 8.552 8.197 7.741 7.287 7.043 7.263 8.092 9.415 10.823 11.772 11.886 11.192 10.135 9.326 9.171 9.646 10.358 10.855 10.939 10.759 10.632 10.753 11.039 11.229 11.132 10.812 10.534 + 4.795 5.329 6.157 6.988 7.680 8.259 8.778 9.174 9.295 9.065 8.609 8.189 8.026 8.160 8.514 9.038 9.766 10.686 11.569 11.994 11.637 10.607 9.475 8.912 9.178 9.926 10.500 10.504 10.130 9.942 10.323 11.082 11.614 11.456 10.739 10.093 + 8.898 8.422 7.838 7.609 7.967 8.777 9.669 10.302 10.541 10.433 10.088 9.599 9.076 8.718 8.773 9.378 10.391 11.395 11.927 11.780 11.145 10.469 10.137 10.216 10.467 10.591 10.506 10.420 10.638 11.272 12.079 12.581 12.385 11.482 10.303 9.484 + 8.075 7.877 7.611 7.479 7.657 8.198 8.986 9.766 10.247 10.240 9.747 8.978 8.269 7.945 8.191 8.981 10.082 11.156 11.892 12.137 11.945 11.530 11.126 10.865 10.734 10.649 10.580 10.617 10.898 11.458 12.112 12.510 12.353 11.625 10.665 9.993 + 3.816 4.866 6.462 7.954 8.955 9.466 9.683 9.714 9.496 8.957 8.202 7.523 7.198 7.319 7.807 8.576 9.625 10.925 12.225 13.046 12.974 12.030 10.759 9.885 9.774 10.192 10.577 10.595 10.456 10.674 11.485 12.502 12.965 12.414 11.171 10.157 + 5.326 5.234 5.367 6.049 7.263 8.579 9.428 9.502 8.940 8.171 7.560 7.190 6.934 6.731 6.771 7.378 8.680 10.361 11.762 12.290 11.840 10.886 10.132 10.022 10.454 10.944 11.077 10.863 10.710 11.036 11.854 12.693 12.942 12.350 11.270 10.437 + 5.405 5.221 5.263 5.961 7.330 8.852 9.800 9.740 8.812 7.594 6.668 6.271 6.277 6.474 6.837 7.548 8.733 10.204 11.463 12.006 11.701 10.901 10.200 10.001 10.253 10.561 10.567 10.272 10.028 10.209 10.844 11.536 11.752 11.256 10.340 9.629 + 6.412 6.304 6.464 7.256 8.598 9.893 10.425 9.889 8.637 7.417 6.825 6.917 7.284 7.490 7.489 7.654 8.399 9.736 11.163 11.995 11.864 10.987 9.980 9.390 9.321 9.466 9.468 9.281 9.205 9.571 10.357 11.102 11.228 10.513 9.335 8.447 + 5.725 5.219 4.972 5.782 7.659 9.668 10.590 9.865 8.030 6.296 5.624 6.084 6.971 7.533 7.629 7.770 8.560 10.047 11.589 12.334 11.898 10.662 9.458 8.917 9.047 9.334 9.273 8.817 8.403 8.523 9.259 10.157 10.570 10.181 9.277 8.545 + 4.182 4.363 5.038 6.418 8.203 9.619 9.926 8.995 7.424 6.102 5.560 5.684 5.979 6.132 6.321 7.013 8.430 10.199 11.529 11.786 10.986 9.788 8.991 8.948 9.372 9.659 9.431 8.861 8.508 8.836 9.816 10.921 11.509 11.301 10.580 9.971 + 6.046 5.985 6.280 7.295 8.851 10.197 10.526 9.584 7.874 6.266 5.371 5.195 5.340 5.496 5.762 6.501 7.895 9.642 11.078 11.642 11.272 10.406 9.616 9.193 9.033 8.860 8.566 8.340 8.499 9.183 10.179 11.027 11.324 10.992 10.331 9.825 + 6.453 6.287 6.467 7.433 8.984 10.288 10.530 9.590 8.148 7.092 6.799 6.927 6.879 6.478 6.177 6.623 7.981 9.688 10.855 10.978 10.301 9.545 9.266 9.433 9.577 9.311 8.732 8.341 8.597 9.515 10.643 11.404 11.476 10.959 10.240 9.750 + 5.893 6.075 6.707 7.926 9.371 10.289 10.082 8.828 7.265 6.222 5.984 6.151 6.114 5.693 5.347 5.767 7.210 9.186 10.772 11.284 10.726 9.691 8.829 8.401 8.235 8.067 7.884 7.945 8.513 9.552 10.680 11.407 11.451 10.901 10.136 9.609 + 6.051 6.246 6.784 7.700 8.695 9.239 8.961 7.977 6.847 6.151 6.053 6.252 6.340 6.237 6.285 6.909 8.161 9.578 10.489 10.525 9.868 9.060 8.548 8.378 8.276 8.010 7.666 7.596 8.099 9.109 10.174 10.735 10.480 9.534 8.389 7.626 + 8.877 7.988 7.000 6.818 7.679 8.935 9.567 9.001 7.545 6.115 5.520 5.909 6.797 7.581 8.031 8.371 8.915 9.658 10.210 10.124 9.316 8.186 7.338 7.137 7.481 7.951 8.197 8.219 8.308 8.733 9.444 10.057 10.136 9.552 8.628 7.943 + 9.635 9.051 8.380 8.159 8.474 8.871 8.756 7.928 6.763 5.909 5.758 6.178 6.710 7.025 7.206 7.603 8.414 9.391 9.972 9.729 8.748 7.608 6.966 7.087 7.698 8.262 8.423 8.262 8.174 8.497 9.206 9.913 10.166 9.804 9.090 8.535 + 6.697 6.475 6.513 7.235 8.454 9.387 9.253 7.955 6.205 4.983 4.782 5.309 5.861 6.010 5.968 6.318 7.399 8.909 10.089 10.302 9.508 8.243 7.184 6.687 6.675 6.872 7.116 7.458 8.015 8.765 9.509 9.996 10.105 9.911 9.608 9.399 + 6.164 6.111 6.279 6.894 7.809 8.501 8.443 7.525 6.163 4.995 4.422 4.387 4.552 4.694 4.921 5.532 6.646 7.963 8.908 9.040 8.398 7.476 6.846 6.748 6.965 7.078 6.870 6.527 6.492 7.081 8.194 9.343 9.987 9.905 9.355 8.870 + 7.515 7.292 7.166 7.409 7.900 8.153 7.747 6.747 5.710 5.226 5.414 5.832 5.908 5.510 5.134 5.496 6.886 8.817 10.318 10.620 9.704 8.262 7.156 6.808 7.003 7.209 7.078 6.730 6.601 7.041 8.000 9.050 9.696 9.725 9.338 8.971 + 8.121 7.446 6.668 6.412 6.804 7.363 7.449 6.841 5.927 5.338 5.372 5.754 5.947 5.721 5.441 5.779 7.076 8.926 10.368 10.575 9.487 7.862 6.711 6.563 7.148 7.705 7.651 7.039 6.469 6.545 7.350 8.358 8.842 8.454 7.506 6.734 + 9.304 8.636 7.681 6.940 6.692 6.828 6.970 6.770 6.170 5.421 4.864 4.675 4.772 4.968 5.204 5.620 6.394 7.469 8.453 8.832 8.360 7.306 6.315 5.954 6.301 6.924 7.265 7.124 6.804 6.808 7.340 8.073 8.398 7.964 7.019 6.254 + 6.670 6.353 6.121 6.335 6.879 7.195 6.785 5.712 4.609 4.163 4.529 5.233 5.640 5.549 5.371 5.714 6.769 8.072 8.851 8.659 7.720 6.715 6.220 6.303 6.588 6.668 6.465 6.237 6.282 6.652 7.121 7.389 7.315 6.981 6.596 6.353 + 6.520 6.545 6.686 6.952 7.139 6.930 6.182 5.130 4.287 4.055 4.390 4.828 4.880 4.485 4.109 4.379 5.547 7.217 8.573 8.939 8.231 6.973 5.891 5.430 5.537 5.827 5.938 5.783 5.535 5.426 5.544 5.789 5.981 6.010 5.909 5.805 + 6.277 5.524 4.753 4.712 5.414 6.096 5.931 4.831 3.568 3.088 3.650 4.598 4.981 4.452 3.625 3.547 4.770 6.826 8.568 9.036 8.130 6.563 5.229 4.576 4.468 4.527 4.548 4.617 4.906 5.424 5.977 6.345 6.451 6.385 6.284 6.224 + 11.541 11.625 11.828 12.152 12.505 12.717 12.652 12.292 11.742 11.133 10.519 9.870 9.151 8.417 7.815 7.486 7.451 7.586 7.714 7.736 7.672 7.598 7.526 7.361 6.972 6.335 5.601 5.040 4.875 5.142 5.657 6.136 6.355 6.272 6.023 5.823 + 13.484 13.552 13.727 14.028 14.391 14.664 14.673 14.321 13.646 12.790 11.916 11.121 10.421 9.792 9.241 8.820 8.590 8.564 8.683 8.851 8.998 9.101 9.158 9.126 8.905 8.397 7.612 6.714 5.974 5.619 5.694 6.038 6.390 6.567 6.559 6.493 + 8.726 8.865 9.432 10.614 12.130 13.293 13.510 12.751 11.553 10.543 9.903 9.288 8.255 6.781 5.375 4.662 4.829 5.443 5.816 5.574 4.930 4.432 4.448 4.863 5.224 5.169 4.731 4.259 4.094 4.302 4.687 5.011 5.182 5.254 5.304 5.344 + 9.914 9.476 8.937 8.734 9.111 9.936 10.779 11.169 10.858 9.923 8.657 7.356 6.177 5.153 4.310 3.752 3.617 3.928 4.498 4.983 5.095 4.799 4.340 4.072 4.205 4.671 5.204 5.551 5.640 5.584 5.533 5.536 5.527 5.424 5.243 5.098 + 9.414 9.126 8.775 8.623 8.747 8.968 8.982 8.606 7.913 7.172 6.610 6.226 5.792 5.078 4.100 3.180 2.745 3.010 3.781 4.569 4.918 4.714 4.237 3.926 4.046 4.521 5.043 5.338 5.364 5.288 5.296 5.420 5.535 5.510 5.350 5.200 + 7.631 7.179 6.593 6.288 6.480 7.022 7.491 7.459 6.769 5.625 4.446 3.595 3.188 3.104 3.151 3.238 3.410 3.723 4.116 4.399 4.397 4.112 3.760 3.619 3.822 4.251 4.645 4.806 4.751 4.667 4.730 4.954 5.198 5.309 5.266 5.184 + 6.913 6.889 6.784 6.557 6.244 5.941 5.714 5.540 5.334 5.050 4.741 4.511 4.409 4.361 4.243 4.009 3.763 3.678 3.827 4.077 4.181 3.970 3.515 3.079 2.921 3.106 3.490 3.872 4.152 4.362 4.556 4.694 4.656 4.378 3.964 3.657 + 6.503 6.817 6.925 6.352 5.240 4.304 4.201 4.901 5.675 5.735 4.931 3.863 3.314 3.563 4.198 4.577 4.449 4.119 4.061 4.382 4.713 4.608 4.033 3.435 3.315 3.747 4.311 4.524 4.306 4.018 4.051 4.376 4.557 4.206 3.422 2.767 + 7.600 7.582 7.411 6.999 6.454 6.019 5.833 5.771 5.545 5.004 4.329 3.903 3.967 4.376 4.707 4.637 4.243 3.923 4.022 4.503 4.980 5.066 4.710 4.206 3.891 3.844 3.891 3.871 3.863 4.107 4.683 5.299 5.455 4.878 3.845 3.041 + 6.330 6.272 6.111 5.842 5.565 5.418 5.440 5.513 5.464 5.246 4.996 4.885 4.916 4.880 4.567 4.034 3.644 3.783 4.478 5.289 5.620 5.211 4.375 3.733 3.696 4.133 4.547 4.574 4.329 4.264 4.671 5.333 5.671 5.282 4.361 3.598 + 6.428 6.086 5.692 5.576 5.823 6.190 6.307 5.974 5.330 4.732 4.460 4.500 4.575 4.406 3.973 3.551 3.492 3.933 4.665 5.276 5.443 5.147 4.652 4.277 4.172 4.257 4.363 4.411 4.476 4.675 4.996 5.251 5.201 4.765 4.139 3.683 + 5.665 5.643 5.678 5.831 6.055 6.196 6.119 5.834 5.505 5.326 5.352 5.441 5.366 5.017 4.520 4.177 4.239 4.704 5.294 5.625 5.470 4.899 4.227 3.791 3.749 4.010 4.345 4.553 4.581 4.507 4.440 4.430 4.449 4.448 4.412 4.376 + 8.152 7.664 7.153 7.117 7.617 8.223 8.389 7.926 7.119 6.416 6.018 5.753 5.340 4.754 4.295 4.314 4.840 5.509 5.846 5.653 5.135 4.672 4.470 4.433 4.339 4.122 3.949 4.031 4.377 4.750 4.887 4.746 4.540 4.515 4.704 4.905 + 6.725 7.134 7.738 8.265 8.557 8.623 8.540 8.321 7.881 7.141 6.158 5.160 4.431 4.147 4.282 4.653 5.046 5.315 5.412 5.347 5.164 4.937 4.754 4.682 4.703 4.724 4.643 4.459 4.293 4.297 4.511 4.794 4.917 4.756 4.405 4.121 + 7.984 7.836 7.722 7.828 8.148 8.450 8.447 8.017 7.306 6.601 6.109 5.817 5.560 5.221 4.877 4.747 4.987 5.503 5.970 6.056 5.668 5.030 4.511 4.338 4.447 4.567 4.484 4.243 4.111 4.334 4.886 5.435 5.574 5.148 4.402 3.834 + 11.146 10.780 10.394 10.344 10.655 10.973 10.878 10.257 9.406 8.777 8.612 8.790 9.007 9.073 9.041 9.058 9.122 9.008 8.456 7.455 6.325 5.503 5.208 5.285 5.362 5.182 4.825 4.626 4.880 5.577 6.385 6.874 6.792 6.215 5.477 4.978 + 11.281 11.047 10.625 10.110 9.623 9.253 8.993 8.740 8.364 7.829 7.253 6.857 6.820 7.137 7.596 7.892 7.794 7.277 6.514 5.781 5.313 5.205 5.387 5.665 5.823 5.725 5.393 5.011 4.816 4.938 5.298 5.630 5.657 5.295 4.733 4.318 + 3.911 4.800 6.032 6.940 7.228 7.089 6.908 6.847 6.715 6.224 5.357 4.478 4.064 4.299 4.914 5.399 5.416 5.029 4.597 4.438 4.603 4.902 5.128 5.228 5.290 5.397 5.534 5.628 5.657 5.674 5.726 5.753 5.618 5.246 4.751 4.394 + 4.260 5.180 6.530 7.660 8.164 8.066 7.682 7.311 7.027 6.715 6.282 5.805 5.506 5.559 5.937 6.409 6.715 6.739 6.569 6.398 6.376 6.521 6.750 6.962 7.109 7.201 7.270 7.340 7.415 7.479 7.504 7.450 7.295 7.055 6.804 6.641 + 6.567 6.969 7.576 8.105 8.347 8.258 7.945 7.560 7.200 6.871 6.548 6.247 6.054 6.071 6.325 6.719 7.080 7.269 7.273 7.204 7.202 7.334 7.558 7.780 7.948 8.093 8.285 8.547 8.803 8.926 8.832 8.549 8.203 7.924 7.768 7.711 + 6.899 6.628 6.417 6.631 7.331 8.172 8.631 8.380 7.517 6.481 5.755 5.583 5.887 6.406 6.888 7.204 7.334 7.310 7.186 7.050 7.017 7.168 7.469 7.759 7.847 7.654 7.296 7.018 7.036 7.373 7.840 8.150 8.101 7.704 7.174 6.807 + 5.912 6.180 6.831 7.874 9.004 9.665 9.405 8.246 6.742 5.649 5.417 5.913 6.573 6.856 6.643 6.260 6.148 6.473 6.995 7.295 7.147 6.715 6.417 6.579 7.167 7.823 8.146 8.001 7.598 7.299 7.326 7.614 7.903 7.975 7.835 7.673 + 9.036 9.270 9.736 10.338 10.826 10.873 10.285 9.162 7.877 6.860 6.344 6.269 6.396 6.521 6.602 6.722 6.944 7.227 7.458 7.570 7.608 7.689 7.893 8.194 8.491 8.705 8.840 8.954 9.085 9.202 9.232 9.125 8.904 8.647 8.438 8.326 + 8.146 8.550 9.067 9.339 9.200 8.753 8.232 7.802 7.475 7.191 6.950 6.843 6.957 7.264 7.621 7.882 8.004 8.037 8.022 7.926 7.701 7.417 7.302 7.612 8.395 9.390 10.167 10.423 10.195 9.794 9.529 9.468 9.437 9.244 8.899 8.621 + 10.254 10.259 10.226 10.092 9.819 9.422 8.972 8.544 8.156 7.768 7.337 6.927 6.729 6.959 7.669 8.625 9.381 9.538 9.019 8.142 7.417 7.221 7.575 8.190 8.718 8.992 9.079 9.141 9.252 9.351 9.337 9.200 9.043 8.983 9.039 9.117 + 9.861 9.973 10.178 10.373 10.343 9.895 9.047 8.096 7.450 7.322 7.571 7.832 7.862 7.767 7.901 8.496 9.363 9.952 9.764 8.761 7.439 6.485 6.303 6.787 7.474 7.930 8.022 7.893 7.753 7.687 7.647 7.575 7.489 7.452 7.485 7.536 + 8.208 8.626 9.165 9.418 9.122 8.324 7.345 6.573 6.229 6.262 6.451 6.610 6.740 6.995 7.486 8.103 8.514 8.373 7.599 6.486 5.546 5.185 5.429 5.926 6.195 5.961 5.320 4.642 4.295 4.402 4.783 5.107 5.117 4.782 4.299 3.957 + 9.392 9.885 10.247 9.787 8.371 6.590 5.327 5.093 5.688 6.430 6.732 6.524 6.190 6.152 6.472 6.824 6.799 6.263 5.455 4.769 4.456 4.476 4.594 4.591 4.409 4.132 3.888 3.754 3.746 3.837 3.980 4.110 4.162 4.107 3.986 3.889 + 6.208 6.042 5.647 4.993 4.176 3.410 2.909 2.754 2.838 2.962 2.982 2.901 2.845 2.942 3.217 3.574 3.870 4.007 3.983 3.874 3.775 3.751 3.816 3.931 4.026 4.033 3.923 3.737 3.571 3.522 3.627 3.830 4.023 4.124 4.130 4.102 + 3.654 4.120 4.619 4.643 4.017 3.038 2.227 1.931 2.098 2.401 2.556 2.550 2.594 2.871 3.330 3.722 3.832 3.684 3.518 3.571 3.847 4.104 4.068 3.693 3.248 3.124 3.529 4.309 5.033 5.290 4.964 4.292 3.669 3.369 3.384 3.495 + 4.333 4.431 4.515 4.434 4.115 3.630 3.180 2.975 3.088 3.398 3.663 3.703 3.524 3.312 3.266 3.440 3.705 3.879 3.898 3.864 3.931 4.134 4.340 4.365 4.175 3.946 3.931 4.226 4.656 4.895 4.732 4.247 3.741 3.486 3.513 3.627 + 3.787 3.895 3.997 3.947 3.679 3.261 2.866 2.661 2.705 2.916 3.137 3.248 3.243 3.214 3.265 3.422 3.625 3.786 3.866 3.897 3.932 3.967 3.928 3.729 3.375 2.997 2.795 2.908 3.313 3.830 4.228 4.353 4.201 3.886 3.568 3.376 + 6.442 6.147 5.714 5.329 5.070 4.873 4.631 4.311 3.997 3.800 3.744 3.741 3.671 3.507 3.352 3.352 3.562 3.884 4.138 4.208 4.126 4.034 4.050 4.169 4.275 4.243 4.058 3.824 3.675 3.661 3.695 3.617 3.312 2.805 2.264 1.916 + 4.693 4.822 4.957 4.921 4.599 4.028 3.403 2.981 2.911 3.135 3.403 3.448 3.184 2.777 2.536 2.676 3.142 3.641 3.856 3.691 3.357 3.210 3.480 4.080 4.657 4.849 4.545 3.965 3.489 3.377 3.578 3.774 3.628 3.046 2.267 1.716 + 5.907 5.413 4.770 4.347 4.202 4.061 3.626 2.923 2.343 2.314 2.896 3.673 4.070 3.828 3.216 2.800 2.961 3.569 4.105 4.113 3.588 2.977 2.807 3.245 3.977 4.469 4.399 3.895 3.403 3.318 3.667 4.103 4.191 3.755 3.026 2.475 + 6.789 5.698 4.207 3.173 3.001 3.423 3.814 3.725 3.200 2.631 2.365 2.431 2.609 2.714 2.787 3.009 3.443 3.896 4.042 3.728 3.150 2.741 2.836 3.407 4.085 4.445 4.321 3.898 3.536 3.486 3.730 4.029 4.131 3.951 3.615 3.358 + 5.489 5.361 5.090 4.690 4.246 3.890 3.726 3.751 3.845 3.849 3.681 3.398 3.157 3.110 3.289 3.589 3.830 3.880 3.733 3.505 3.359 3.391 3.572 3.767 3.826 3.692 3.460 3.324 3.454 3.862 4.355 4.629 4.456 3.848 3.081 2.555 + 5.285 4.907 4.421 4.157 4.253 4.567 4.815 4.799 4.548 4.259 4.124 4.189 4.361 4.520 4.622 4.690 4.730 4.672 4.417 3.949 3.411 3.047 3.040 3.375 3.834 4.146 4.171 3.980 3.777 3.726 3.817 3.882 3.733 3.325 2.812 2.456 + 4.811 4.661 4.467 4.359 4.395 4.499 4.511 4.314 3.954 3.641 3.619 3.967 4.509 4.911 4.918 4.547 4.080 3.838 3.939 4.217 4.381 4.273 3.993 3.804 3.886 4.187 4.483 4.586 4.499 4.378 4.341 4.329 4.156 3.716 3.134 2.714 + 4.749 4.854 4.991 5.082 5.111 5.115 5.121 5.098 4.985 4.773 4.534 4.374 4.335 4.367 4.400 4.448 4.609 4.955 5.389 5.641 5.454 4.812 4.002 3.430 3.329 3.593 3.900 4.000 3.909 3.849 3.984 4.227 4.308 4.037 3.521 3.110 + 6.439 6.075 5.650 5.488 5.651 5.901 5.939 5.687 5.326 5.083 4.984 4.838 4.466 3.953 3.650 3.888 4.663 5.578 6.118 6.022 5.449 4.802 4.399 4.272 4.244 4.162 4.064 4.108 4.385 4.791 5.089 5.086 4.767 4.286 3.846 3.593 + 6.050 5.598 5.057 4.855 5.138 5.647 5.916 5.627 4.845 3.949 3.357 3.245 3.503 3.898 4.295 4.729 5.294 5.966 6.537 6.734 6.419 5.707 4.902 4.307 4.051 4.061 4.186 4.326 4.483 4.688 4.898 4.970 4.761 4.263 3.663 3.253 + 5.868 5.167 4.423 4.352 5.075 5.991 6.300 5.682 4.543 3.637 3.423 3.742 4.074 4.084 3.935 4.099 4.854 5.963 6.825 6.956 6.358 5.479 4.830 4.606 4.631 4.610 4.420 4.188 4.127 4.313 4.618 4.823 4.788 4.539 4.225 4.017 + 6.145 5.807 5.382 5.187 5.383 5.863 6.330 6.505 6.290 5.795 5.212 4.682 4.253 3.955 3.891 4.222 5.028 6.153 7.193 7.690 7.414 6.523 5.477 4.741 4.507 4.631 4.812 4.859 4.815 4.848 5.034 5.240 5.224 4.861 4.299 3.878 + 6.701 6.405 6.024 5.804 5.825 5.948 5.951 5.723 5.351 5.024 4.857 4.806 4.750 4.660 4.691 5.084 5.947 7.093 8.091 8.504 8.162 7.252 6.186 5.342 4.869 4.685 4.618 4.572 4.568 4.666 4.849 4.991 4.943 4.660 4.266 3.982 + 6.397 5.945 5.382 5.117 5.301 5.726 6.009 5.908 5.491 5.045 4.802 4.764 4.759 4.685 4.689 5.095 6.104 7.524 8.783 9.257 8.700 7.424 6.095 5.284 5.115 5.267 5.300 5.025 4.620 4.417 4.568 4.884 4.995 4.679 4.079 3.605 + 5.240 4.943 4.618 4.579 4.918 5.438 5.821 5.883 5.689 5.458 5.353 5.363 5.374 5.338 5.381 5.714 6.443 7.419 8.280 8.649 8.346 7.480 6.362 5.348 4.688 4.476 4.651 5.052 5.469 5.715 5.688 5.408 4.991 4.583 4.285 4.135 + 4.298 4.400 4.677 5.141 5.625 5.859 5.686 5.220 4.779 4.610 4.671 4.672 4.377 3.902 3.712 4.290 5.713 7.501 8.873 9.239 8.551 7.273 6.032 5.232 4.895 4.803 4.753 4.704 4.745 4.948 5.262 5.535 5.629 5.515 5.295 5.128 + 4.491 4.015 3.535 3.586 4.295 5.228 5.704 5.324 4.294 3.277 2.908 3.341 4.202 4.947 5.338 5.613 6.235 7.422 8.858 9.851 9.804 8.661 6.958 5.469 4.709 4.679 4.993 5.240 5.278 5.240 5.315 5.534 5.750 5.802 5.684 5.547 + 4.348 3.737 3.052 2.919 3.521 4.434 4.958 4.664 3.720 2.743 2.329 2.642 3.385 4.117 4.633 5.080 5.748 6.744 7.831 8.568 8.615 7.970 6.965 6.043 5.506 5.385 5.504 5.640 5.664 5.583 5.488 5.474 5.580 5.772 5.973 6.099 + 4.512 4.269 3.982 3.872 3.984 4.134 4.047 3.600 2.955 2.470 2.459 2.967 3.757 4.496 5.020 5.433 5.991 6.835 7.813 8.525 8.586 7.906 6.776 5.709 5.129 5.152 5.567 6.028 6.282 6.288 6.172 6.097 6.141 6.284 6.444 6.545 + 5.388 4.618 3.667 3.236 3.579 4.326 4.810 4.631 3.966 3.392 3.378 3.904 4.522 4.806 4.781 4.943 5.823 7.465 9.242 10.225 9.817 8.200 6.225 4.857 4.574 5.148 5.928 6.352 6.294 6.019 5.869 5.965 6.167 6.269 6.212 6.113 + 4.821 4.209 3.490 3.251 3.671 4.387 4.820 4.669 4.153 3.794 3.958 4.546 5.109 5.276 5.114 5.104 5.747 7.112 8.699 9.744 9.713 8.653 7.141 5.906 5.404 5.616 6.156 6.572 6.607 6.292 5.848 5.522 5.445 5.592 5.828 5.997 + 5.044 4.662 4.139 3.779 3.726 3.876 3.983 3.877 3.611 3.418 3.509 3.887 4.347 4.669 4.848 5.146 5.886 7.138 8.552 9.510 9.517 8.549 7.083 5.788 5.111 5.048 5.273 5.452 5.503 5.573 5.827 6.245 6.629 6.788 6.718 6.595 + 5.066 4.599 3.817 3.017 2.558 2.704 3.437 4.423 5.179 5.372 5.031 4.513 4.257 4.509 5.229 6.199 7.203 8.114 8.832 9.202 9.041 8.287 7.147 6.057 5.464 5.557 6.160 6.858 7.269 7.243 6.887 6.430 6.056 5.833 5.733 5.702 + 5.460 4.854 4.018 3.473 3.579 4.323 5.341 6.153 6.438 6.193 5.673 5.196 4.961 5.005 5.294 5.826 6.630 7.652 8.659 9.273 9.179 8.346 7.107 5.997 5.447 5.557 6.085 6.649 6.966 6.978 6.792 6.549 6.319 6.115 5.944 5.841 + 4.213 3.946 3.608 3.424 3.468 3.630 3.748 3.777 3.821 4.016 4.375 4.767 5.060 5.279 5.631 6.329 7.364 8.422 9.049 8.945 8.179 7.147 6.329 6.009 6.150 6.493 6.751 6.775 6.588 6.309 6.058 5.899 5.837 5.842 5.875 5.901 + 6.956 6.517 5.793 5.020 4.418 4.096 4.033 4.125 4.279 4.466 4.710 5.016 5.330 5.578 5.765 6.026 6.560 7.445 8.496 9.293 9.410 8.703 7.446 6.195 5.470 5.463 5.975 6.594 6.968 6.979 6.726 6.386 6.088 5.873 5.734 5.664 + 4.991 4.900 4.784 4.727 4.760 4.841 4.885 4.834 4.707 4.588 4.570 4.692 4.934 5.272 5.734 6.393 7.280 8.277 9.091 9.377 8.940 7.892 6.639 5.672 5.311 5.543 6.078 6.551 6.735 6.634 6.403 6.215 6.151 6.191 6.267 6.319 + 5.280 4.966 4.646 4.645 5.001 5.433 5.596 5.390 5.016 4.744 4.642 4.535 4.243 3.857 3.770 4.386 5.753 7.442 8.779 9.264 8.842 7.861 6.802 6.017 5.638 5.632 5.881 6.209 6.412 6.337 6.008 5.661 5.602 5.968 6.581 7.048 + 5.982 5.939 5.889 5.853 5.794 5.621 5.271 4.779 4.291 3.966 3.848 3.821 3.708 3.475 3.351 3.731 4.877 6.626 8.359 9.318 9.085 7.882 6.444 5.536 5.461 5.920 6.314 6.223 5.698 5.140 4.923 5.088 5.362 5.451 5.301 5.116 + 5.718 5.734 5.797 5.897 5.931 5.744 5.271 4.633 4.095 3.888 4.019 4.257 4.335 4.205 4.150 4.609 5.819 7.550 9.144 9.890 9.469 8.167 6.694 5.735 5.564 5.947 6.399 6.544 6.334 5.982 5.721 5.614 5.549 5.396 5.159 4.974 + 5.379 5.358 5.254 5.061 4.918 5.025 5.435 5.926 6.106 5.704 4.803 3.813 3.214 3.271 3.958 5.082 6.430 7.798 8.913 9.429 9.092 7.988 6.604 5.583 5.314 5.685 6.210 6.436 6.276 5.991 5.878 5.963 6.001 5.755 5.274 4.882 + 5.596 5.445 5.376 5.620 6.155 6.679 6.844 6.527 5.908 5.293 4.867 4.604 4.395 4.255 4.381 4.989 6.078 7.343 8.325 8.676 8.350 7.574 6.691 5.986 5.620 5.631 5.948 6.387 6.691 6.650 6.252 5.720 5.378 5.412 5.726 6.014 + 10.692 9.960 8.956 8.257 8.129 8.325 8.276 7.514 6.030 4.305 2.997 2.532 2.883 3.682 4.546 5.335 6.150 7.105 8.082 8.707 8.583 7.610 6.132 4.775 4.098 4.278 5.046 5.899 6.407 6.424 6.082 5.638 5.295 5.126 5.086 5.095 + 10.844 9.706 8.151 7.073 6.878 7.232 7.388 6.790 5.478 4.004 2.993 2.736 3.105 3.787 4.565 5.398 6.292 7.139 7.704 7.783 7.373 6.693 6.043 5.628 5.483 5.527 5.672 5.875 6.104 6.298 6.357 6.205 5.842 5.369 4.934 4.676 + 6.441 6.307 6.101 5.923 5.854 5.889 5.926 5.810 5.453 4.899 4.301 3.810 3.483 3.319 3.370 3.816 4.855 6.464 8.235 9.489 9.663 8.709 7.179 5.891 5.406 5.691 6.236 6.481 6.227 5.697 5.268 5.143 5.235 5.330 5.316 5.255 + 5.224 5.032 4.856 4.905 5.191 5.514 5.663 5.620 5.567 5.673 5.874 5.873 5.402 4.528 3.732 3.628 4.539 6.225 7.989 9.082 9.115 8.229 6.934 5.795 5.159 5.068 5.335 5.688 5.905 5.890 5.697 5.485 5.416 5.550 5.802 5.997 + 3.400 3.871 4.565 5.139 5.361 5.240 5.000 4.913 5.103 5.456 5.691 5.561 5.040 4.374 3.963 4.128 4.930 6.119 7.266 7.967 8.028 7.524 6.728 5.969 5.493 5.383 5.563 5.854 6.073 6.111 5.970 5.741 5.541 5.437 5.426 5.446 + 2.931 3.284 3.852 4.417 4.773 4.818 4.601 4.288 4.075 4.077 4.261 4.476 4.561 4.474 4.349 4.446 5.001 6.053 7.363 8.470 8.896 8.388 7.075 5.447 4.133 3.597 3.918 4.765 5.611 6.027 5.907 5.471 5.069 4.930 5.035 5.180 + 3.421 3.447 3.637 4.102 4.748 5.285 5.432 5.150 4.684 4.378 4.396 4.608 4.736 4.646 4.526 4.774 5.666 7.069 8.436 9.116 8.764 7.554 6.052 4.861 4.290 4.263 4.490 4.723 4.889 5.050 5.247 5.413 5.417 5.198 4.856 4.599 + 3.893 3.912 4.110 4.599 5.242 5.685 5.620 5.065 4.385 4.022 4.146 4.538 4.808 4.772 4.646 4.879 5.745 7.041 8.150 8.445 7.734 6.395 5.120 4.461 4.508 4.921 5.237 5.200 4.889 4.572 4.465 4.578 4.755 4.837 4.795 4.723 + 3.705 3.897 4.227 4.623 5.018 5.349 5.538 5.503 5.204 4.704 4.162 3.759 3.601 3.689 3.974 4.435 5.088 5.893 6.669 7.112 6.969 6.240 5.236 4.413 4.090 4.263 4.652 4.929 4.948 4.790 4.620 4.520 4.439 4.293 4.086 3.927 + 4.657 4.348 4.046 4.103 4.591 5.223 5.590 5.469 4.972 4.394 3.947 3.619 3.281 2.916 2.733 3.028 3.912 5.132 6.171 6.564 6.185 5.317 4.448 3.977 4.018 4.410 4.876 5.183 5.222 5.000 4.587 4.078 3.568 3.135 2.830 2.676 + 3.489 3.718 4.200 4.853 5.417 5.584 5.256 4.692 4.343 4.476 4.918 5.176 4.861 4.060 3.309 3.176 3.795 4.751 5.415 5.430 4.949 4.445 4.300 4.533 4.863 5.011 4.932 4.793 4.767 4.851 4.876 4.675 4.223 3.653 3.154 2.871 + 5.798 5.363 4.799 4.518 4.772 5.480 6.277 6.730 6.603 5.979 5.176 4.532 4.222 4.227 4.442 4.799 5.282 5.840 6.310 6.456 6.144 5.480 4.801 4.461 4.594 5.030 5.443 5.605 5.530 5.398 5.340 5.293 5.069 4.565 3.924 3.468 + 5.498 5.506 5.419 5.161 4.805 4.555 4.584 4.873 5.196 5.277 4.989 4.438 3.883 3.571 3.627 4.036 4.687 5.405 5.965 6.148 5.853 5.201 4.521 4.166 4.293 4.753 5.216 5.417 5.333 5.138 5.003 4.921 4.738 4.343 3.826 3.453 + 4.605 4.613 4.661 4.810 5.121 5.567 5.977 6.077 5.661 4.756 3.663 2.784 2.397 2.525 3.018 3.725 4.583 5.527 6.353 6.726 6.392 5.439 4.341 3.678 3.741 4.323 4.909 5.089 4.850 4.510 4.363 4.393 4.315 3.896 3.237 2.730 + 5.057 4.918 4.735 4.562 4.307 3.798 2.986 2.087 1.484 1.437 1.857 2.350 2.546 2.425 2.357 2.804 3.908 5.322 6.416 6.699 6.138 5.138 4.248 3.823 3.891 4.242 4.630 4.896 4.982 4.883 4.616 4.226 3.796 3.419 3.160 3.034 + 5.492 5.083 4.564 4.257 4.217 4.196 3.900 3.298 2.686 2.441 2.681 3.148 3.427 3.315 3.018 2.985 3.518 4.483 5.381 5.703 5.302 4.483 3.757 3.473 3.619 3.910 4.057 3.978 3.808 3.716 3.730 3.698 3.435 2.895 2.256 1.822 + 5.918 5.780 5.374 4.649 3.819 3.277 3.291 3.749 4.216 4.270 3.827 3.170 2.683 2.558 2.728 3.040 3.438 3.943 4.488 4.829 4.694 4.063 3.277 2.809 2.871 3.215 3.365 3.065 2.539 2.283 2.556 3.074 3.209 2.567 1.408 0.497 + 4.113 4.110 4.050 3.903 3.730 3.657 3.774 4.027 4.222 4.141 3.699 3.017 2.367 2.026 2.138 2.656 3.371 4.004 4.307 4.165 3.653 3.015 2.555 2.470 2.734 3.122 3.364 3.327 3.080 2.792 2.559 2.312 1.897 1.257 0.546 0.070 + 5.189 5.087 4.980 4.995 5.189 5.495 5.744 5.733 5.325 4.513 3.437 2.355 1.570 1.333 1.737 2.655 3.762 4.663 5.064 4.911 4.401 3.847 3.494 3.383 3.368 3.257 2.971 2.609 2.362 2.356 2.528 2.662 2.538 2.105 1.539 1.142 + 3.949 3.484 3.095 3.322 4.146 4.960 5.096 4.413 3.393 2.672 2.473 2.491 2.307 1.893 1.698 2.202 3.391 4.665 5.297 5.020 4.211 3.519 3.300 3.387 3.362 3.025 2.598 2.479 2.831 3.405 3.763 3.658 3.208 2.731 2.445 2.348 + 5.364 5.564 5.841 6.005 5.900 5.499 4.934 4.412 4.076 3.901 3.733 3.447 3.095 2.884 3.003 3.425 3.882 4.057 3.850 3.473 3.283 3.481 3.946 4.336 4.392 4.160 3.947 4.050 4.501 5.044 5.351 5.276 4.934 4.562 4.321 4.225 + 3.329 3.276 3.400 3.910 4.742 5.534 5.877 5.626 4.993 4.357 3.961 3.767 3.577 3.290 3.035 3.068 3.508 4.190 4.747 4.884 4.600 4.181 3.987 4.198 4.727 5.322 5.765 5.994 6.086 6.155 6.256 6.370 6.450 6.471 6.449 6.423 + 5.012 4.734 4.504 4.669 5.264 5.922 6.138 5.646 4.638 3.625 3.080 3.131 3.531 3.882 3.937 3.725 3.470 3.392 3.558 3.882 4.224 4.490 4.676 4.841 5.059 5.376 5.791 6.243 6.626 6.827 6.784 6.518 6.134 5.755 5.475 5.333 + 7.116 6.559 5.827 5.401 5.505 5.939 6.238 6.038 5.375 4.671 4.411 4.753 5.396 5.823 5.727 5.275 4.961 5.184 5.885 6.578 6.752 6.312 5.665 5.380 5.714 6.420 6.995 7.143 7.016 7.027 7.413 7.959 8.169 7.732 6.858 6.158 + 8.684 8.502 8.151 7.711 7.346 7.222 7.367 7.620 7.736 7.579 7.242 6.967 6.933 7.107 7.286 7.294 7.132 6.956 6.897 6.929 6.905 6.730 6.485 6.368 6.506 6.822 7.119 7.277 7.384 7.640 8.112 8.602 8.762 8.410 7.736 7.205 + 6.937 6.809 6.760 6.975 7.391 7.689 7.547 6.928 6.147 5.633 5.602 5.899 6.159 6.127 5.868 5.667 5.749 6.047 6.262 6.139 5.725 5.361 5.399 5.892 6.519 6.834 6.637 6.163 5.915 6.271 7.154 8.057 8.400 7.966 7.076 6.378 + 5.960 5.973 6.073 6.310 6.607 6.749 6.503 5.795 4.798 3.855 3.270 3.123 3.242 3.358 3.330 3.247 3.338 3.749 4.393 4.992 5.293 5.268 5.140 5.195 5.560 6.111 6.606 6.893 7.019 7.144 7.339 7.487 7.372 6.904 6.256 5.788 + 5.472 5.584 5.720 5.761 5.619 5.283 4.817 4.321 3.889 3.576 3.379 3.241 3.081 2.863 2.642 2.557 2.753 3.259 3.931 4.511 4.787 4.731 4.523 4.417 4.571 4.953 5.411 5.812 6.135 6.444 6.763 7.009 7.043 6.810 6.429 6.141 + 4.391 4.540 4.899 5.476 6.116 6.546 6.544 6.108 5.466 4.898 4.539 4.310 4.054 3.730 3.484 3.529 3.934 4.521 4.971 5.068 4.866 4.648 4.696 5.065 5.553 5.874 5.903 5.780 5.788 6.119 6.697 7.215 7.355 7.027 6.450 6.013 + 4.396 4.575 4.903 5.338 5.830 6.294 6.599 6.595 6.213 5.548 4.838 4.335 4.147 4.188 4.281 4.314 4.326 4.425 4.650 4.899 5.027 4.992 4.925 5.017 5.330 5.720 5.957 5.941 5.816 5.845 6.161 6.615 6.885 6.758 6.337 5.973 + 6.591 6.874 7.152 7.127 6.758 6.284 5.975 5.881 5.834 5.660 5.380 5.154 5.063 4.964 4.634 4.044 3.490 3.366 3.786 4.414 4.722 4.467 3.945 3.746 4.221 5.160 5.990 6.322 6.318 6.509 7.227 8.210 8.776 8.456 7.477 6.637 + 6.288 6.409 6.509 6.424 6.107 5.671 5.308 5.159 5.241 5.467 5.719 5.903 5.963 5.868 5.637 5.348 5.129 5.089 5.248 5.522 5.799 6.027 6.234 6.459 6.663 6.731 6.595 6.353 6.265 6.565 7.247 8.004 8.425 8.302 7.810 7.384 + 6.922 6.843 6.808 6.938 7.226 7.533 7.705 7.693 7.577 7.468 7.403 7.348 7.273 7.217 7.248 7.358 7.423 7.285 6.922 6.515 6.344 6.562 7.063 7.550 7.766 7.674 7.447 7.280 7.222 7.181 7.082 6.999 7.114 7.527 8.100 8.519 + 4.701 4.726 4.983 5.672 6.766 7.969 8.903 9.346 9.323 9.012 8.575 8.091 7.612 7.237 7.074 7.111 7.150 6.910 6.261 5.388 4.709 4.581 5.030 5.726 6.226 6.293 6.030 5.735 5.646 5.766 5.918 5.916 5.717 5.413 5.139 4.986 + 4.969 5.478 6.327 7.265 8.081 8.704 9.185 9.589 9.859 9.797 9.219 8.188 7.114 6.576 6.934 8.003 9.081 9.366 8.496 6.817 5.165 4.307 4.462 5.231 5.956 6.201 5.986 5.656 5.536 5.687 5.908 5.947 5.698 5.249 4.795 4.519 + 4.216 4.780 5.869 7.329 8.858 10.102 10.822 10.993 10.721 10.098 9.152 7.987 6.936 6.517 7.092 8.490 9.942 10.516 9.757 8.068 6.469 5.886 6.515 7.732 8.600 8.556 7.736 6.750 6.157 6.085 6.253 6.284 6.003 5.502 5.006 4.710 + 4.521 4.767 5.455 6.760 8.568 10.416 11.672 11.881 11.011 9.477 7.937 6.985 6.917 7.642 8.752 9.715 10.109 9.819 9.087 8.372 8.080 8.318 8.848 9.268 9.288 8.911 8.377 7.948 7.707 7.546 7.308 6.949 6.574 6.319 6.228 6.228 + 4.395 5.092 6.374 7.974 9.486 10.490 10.740 10.290 9.435 8.525 7.799 7.360 7.258 7.547 8.219 9.080 9.741 9.815 9.209 8.267 7.587 7.616 8.310 9.148 9.495 9.053 8.056 7.075 6.602 6.730 7.145 7.385 7.157 6.501 5.724 5.211 + 5.890 6.132 6.836 8.086 9.524 10.467 10.411 9.444 8.177 7.228 6.750 6.459 6.094 5.825 6.151 7.333 8.945 10.027 9.814 8.421 6.841 6.203 6.883 8.216 9.046 8.652 7.275 5.874 5.354 5.922 7.034 7.875 7.934 7.260 6.321 5.676 + 6.148 6.210 6.546 7.305 8.315 9.125 9.344 8.936 8.208 7.493 6.870 6.196 5.421 4.816 4.841 5.706 7.060 8.139 8.328 7.655 6.785 6.472 6.935 7.686 7.948 7.311 6.066 4.964 4.641 5.168 6.068 6.710 6.728 6.193 5.475 4.989 + 6.404 6.398 6.437 6.557 6.722 6.852 6.905 6.908 6.893 6.795 6.460 5.801 4.971 4.366 4.376 5.070 6.071 6.784 6.820 6.274 5.634 5.376 5.587 5.932 5.965 5.521 4.849 4.395 4.445 4.924 5.486 5.795 5.735 5.424 5.074 4.859 + 6.614 5.810 4.726 4.038 4.111 4.807 5.647 6.159 6.122 5.593 4.784 3.964 3.418 3.407 4.030 5.085 6.077 6.483 6.107 5.257 4.545 4.434 4.896 5.443 5.537 5.012 4.191 3.604 3.573 4.010 4.540 4.817 4.745 4.460 4.165 3.994 + 5.825 5.784 5.660 5.453 5.275 5.308 5.649 6.166 6.513 6.337 5.552 4.460 3.609 3.449 4.021 4.923 5.570 5.595 5.079 4.471 4.241 4.544 5.125 5.520 5.402 4.796 4.042 3.538 3.483 3.782 4.159 4.358 4.282 4.008 3.698 3.501 + 5.187 5.285 5.429 5.581 5.763 6.038 6.408 6.736 6.781 6.355 5.495 4.506 3.812 3.697 4.115 4.719 5.093 5.027 4.646 4.301 4.301 4.702 5.271 5.663 5.658 5.287 4.780 4.390 4.240 4.279 4.360 4.365 4.266 4.114 3.975 3.898 + 5.385 5.107 4.892 5.074 5.625 6.149 6.220 5.769 5.131 4.729 4.697 4.801 4.719 4.403 4.137 4.249 4.750 5.268 5.363 4.949 4.407 4.285 4.816 5.695 6.299 6.171 5.367 4.390 3.803 3.842 4.314 4.800 4.971 4.771 4.393 4.110 + 1.618 2.687 4.299 5.730 6.492 6.556 6.254 5.965 5.837 5.739 5.435 4.827 4.076 3.521 3.456 3.940 4.732 5.421 5.668 5.425 4.989 4.836 5.299 6.310 7.372 7.851 7.391 6.190 4.886 4.138 4.173 4.663 5.009 4.825 4.228 3.713 + 4.926 4.789 4.548 4.286 4.133 4.213 4.550 5.009 5.343 5.333 4.933 4.330 3.846 3.745 4.065 4.594 4.999 5.040 4.719 4.288 4.102 4.411 5.209 6.227 7.069 7.414 7.170 6.505 5.737 5.158 4.894 4.881 4.954 4.977 4.923 4.861 + 4.384 3.975 3.710 4.174 5.408 6.785 7.470 7.057 5.867 4.666 4.070 4.136 4.444 4.527 4.262 3.898 3.767 3.988 4.419 4.855 5.241 5.684 6.278 6.926 7.353 7.305 6.760 5.965 5.281 4.955 5.007 5.277 5.565 5.752 5.825 5.838 + 5.607 5.320 5.237 5.857 7.153 8.485 9.040 8.448 7.048 5.605 4.734 4.515 4.580 4.531 4.290 4.091 4.189 4.589 5.060 5.395 5.641 6.064 6.877 7.968 8.901 9.201 8.688 7.619 6.511 5.810 5.641 5.804 5.978 5.962 5.779 5.609 + 4.217 4.644 5.589 7.009 8.537 9.575 9.658 8.808 7.539 6.499 6.006 5.878 5.677 5.141 4.436 3.998 4.145 4.793 5.545 6.046 6.304 6.655 7.427 8.574 9.624 10.001 9.461 8.303 7.184 6.665 6.840 7.322 7.568 7.294 6.671 6.166 + 2.595 2.909 3.831 5.538 7.690 9.450 9.992 9.108 7.396 5.852 5.176 5.343 5.751 5.787 5.328 4.785 4.699 5.275 6.252 7.172 7.782 8.209 8.759 9.562 10.383 10.779 10.463 9.564 8.557 7.928 7.827 7.994 8.004 7.620 6.985 6.499 + 3.968 4.365 5.374 7.055 8.981 10.309 10.304 8.915 6.885 5.288 4.798 5.278 5.987 6.201 5.752 5.080 4.810 5.254 6.237 7.329 8.233 8.965 9.711 10.530 11.204 11.377 10.863 9.846 8.787 8.119 7.961 8.069 8.065 7.739 7.207 6.802 + 5.405 5.640 6.410 7.863 9.565 10.587 10.135 8.216 5.751 3.984 3.631 4.438 5.485 5.937 5.640 5.105 4.987 5.549 6.545 7.545 8.345 9.081 9.972 10.990 11.774 11.885 11.172 9.941 8.765 8.105 8.026 8.215 8.255 7.943 7.414 7.011 + 4.487 5.184 6.519 8.240 9.815 10.576 10.078 8.420 6.272 4.523 3.779 4.059 4.883 5.668 6.113 6.298 6.481 6.818 7.259 7.680 8.090 8.677 9.607 10.773 11.729 11.942 11.198 9.829 8.550 7.987 8.247 8.857 9.137 8.727 7.859 7.163 + 4.100 5.056 6.739 8.682 10.243 10.805 10.078 8.304 6.200 4.600 4.009 4.343 5.053 5.540 5.563 5.345 5.315 5.719 6.438 7.139 7.621 8.014 8.642 9.647 10.740 11.339 11.019 9.913 8.690 8.080 8.303 8.896 9.087 8.446 7.260 6.331 + 4.840 5.482 6.687 8.217 9.632 10.391 10.108 8.804 6.979 5.372 4.551 4.584 5.036 5.304 5.051 4.434 3.955 4.065 4.843 5.985 7.091 7.965 8.688 9.406 10.068 10.380 10.047 9.092 7.935 7.136 6.984 7.290 7.563 7.435 6.957 6.533 + 9.175 9.517 10.051 10.526 10.675 10.301 9.362 8.009 6.563 5.398 4.762 4.638 4.752 4.753 4.460 3.998 3.709 3.883 4.550 5.469 6.344 7.053 7.678 8.322 8.888 9.076 8.626 7.615 6.506 5.866 5.943 6.478 6.912 6.847 6.360 5.907 + 11.456 11.409 11.284 11.045 10.668 10.118 9.335 8.275 6.997 5.711 4.707 4.172 4.052 4.092 4.056 3.929 3.920 4.232 4.832 5.434 5.754 5.786 5.821 6.158 6.755 7.185 6.990 6.135 5.139 4.709 5.142 6.044 6.628 6.373 5.476 4.695 + 10.000 9.894 9.669 9.298 8.747 7.976 6.971 5.797 4.624 3.700 3.226 3.216 3.452 3.605 3.465 3.103 2.830 2.970 3.612 4.551 5.453 6.093 6.468 6.690 6.804 6.714 6.325 5.731 5.252 5.220 5.679 6.282 6.523 6.137 5.347 4.717 + 6.366 7.126 8.138 8.723 8.462 7.415 6.022 4.808 4.119 4.014 4.314 4.698 4.829 4.493 3.736 2.904 2.485 2.806 3.789 4.972 5.834 6.157 6.141 6.160 6.383 6.611 6.495 5.927 5.227 4.907 5.214 5.869 6.267 6.000 5.233 4.577 + 7.857 8.004 8.068 7.790 7.108 6.219 5.445 5.011 4.935 5.069 5.230 5.290 5.181 4.879 4.413 3.909 3.568 3.568 3.930 4.487 5.011 5.381 5.655 5.956 6.288 6.467 6.274 5.682 4.961 4.508 4.538 4.902 5.210 5.162 4.804 4.469 + 7.067 7.455 7.968 8.273 8.202 7.830 7.363 6.954 6.621 6.301 5.972 5.697 5.554 5.533 5.521 5.393 5.138 4.879 4.780 4.919 5.237 5.609 5.942 6.222 6.465 6.643 6.690 6.568 6.333 6.118 6.033 6.072 6.129 6.100 5.983 5.875 + 12.684 13.006 13.394 13.519 13.209 12.547 11.789 11.167 10.747 10.434 10.091 9.657 9.175 8.722 8.325 7.942 7.513 7.046 6.629 6.383 6.373 6.552 6.780 6.899 6.820 6.569 6.280 6.118 6.195 6.491 6.857 7.082 7.013 6.656 6.188 5.863 + 11.448 11.793 12.074 11.843 11.010 9.916 9.034 8.588 8.433 8.274 7.960 7.576 7.267 7.016 6.647 6.038 5.330 4.869 4.916 5.388 5.907 6.116 5.979 5.775 5.806 6.097 6.381 6.384 6.105 5.819 5.803 6.054 6.295 6.250 5.930 5.627 + 6.938 7.461 8.136 8.540 8.543 8.365 8.332 8.549 8.817 8.827 8.439 7.774 7.062 6.433 5.868 5.319 4.851 4.607 4.652 4.855 4.992 4.972 4.956 5.213 5.823 6.532 6.920 6.771 6.301 5.988 6.164 6.708 7.155 7.124 6.670 6.236 + 6.862 6.860 6.790 6.598 6.324 6.104 6.080 6.289 6.622 6.887 6.931 6.726 6.378 6.049 5.873 5.894 6.059 6.248 6.341 6.276 6.095 5.935 5.945 6.185 6.560 6.876 6.977 6.867 6.715 6.721 6.949 7.262 7.427 7.312 7.003 6.745 + 8.331 8.153 7.994 8.058 8.337 8.565 8.398 7.698 6.687 5.817 5.452 5.596 5.913 6.025 5.856 5.701 5.948 6.674 7.486 7.789 7.290 6.304 5.573 5.686 6.578 7.548 7.811 7.131 6.020 5.304 5.428 6.098 6.557 6.266 5.382 4.619 + 7.996 8.381 9.100 9.957 10.582 10.571 9.772 8.459 7.209 6.525 6.479 6.684 6.637 6.171 5.620 5.550 6.236 7.356 8.171 8.082 7.137 6.047 5.669 6.352 7.648 8.633 8.596 7.565 6.252 5.492 5.609 6.207 6.549 6.176 5.286 4.551 + 9.498 9.346 9.388 9.906 10.707 11.176 10.768 9.510 8.035 7.085 6.927 7.213 7.385 7.232 7.078 7.410 8.312 9.258 9.486 8.644 7.143 5.884 5.586 6.260 7.250 7.777 7.525 6.805 6.233 6.208 6.627 7.006 6.881 6.156 5.172 4.480 + 8.343 8.780 9.572 10.465 11.031 10.879 9.966 8.718 7.779 7.534 7.823 8.098 7.937 7.437 7.134 7.489 8.400 9.193 9.139 8.068 6.547 5.472 5.398 6.164 7.083 7.508 7.286 6.775 6.474 6.609 7.006 7.283 7.164 6.661 6.033 5.611 + 9.437 9.870 10.518 11.039 11.124 10.650 9.753 8.761 8.021 7.706 7.733 7.857 7.875 7.783 7.764 7.994 8.432 8.764 8.591 7.745 6.471 5.343 4.900 5.287 6.143 6.848 6.950 6.461 5.811 5.490 5.673 6.103 6.331 6.090 5.520 5.053 + 7.831 8.067 8.470 8.893 9.137 9.036 8.569 7.895 7.274 6.894 6.744 6.645 6.431 6.126 5.963 6.202 6.872 7.657 8.061 7.744 6.794 5.703 5.048 5.100 5.642 6.143 6.151 5.603 4.843 4.321 4.251 4.467 4.603 4.411 3.970 3.605 + 7.633 7.686 7.784 7.892 7.946 7.861 7.574 7.089 6.494 5.926 5.509 5.294 5.251 5.325 5.481 5.712 5.994 6.231 6.279 6.051 5.620 5.218 5.094 5.318 5.697 5.893 5.683 5.154 4.657 4.533 4.823 5.207 5.244 4.733 3.906 3.283 + 7.023 7.618 8.350 8.663 8.320 7.549 6.815 6.438 6.389 6.393 6.223 5.901 5.646 5.643 5.860 6.067 6.029 5.688 5.184 4.745 4.526 4.548 4.721 4.916 5.014 4.935 4.668 4.306 4.016 3.940 4.081 4.268 4.272 3.983 3.525 3.180 + 9.077 8.957 8.698 8.273 7.687 7.016 6.422 6.092 6.133 6.472 6.877 7.084 6.970 6.629 6.289 6.122 6.113 6.083 5.858 5.431 4.985 4.753 4.825 5.070 5.229 5.106 4.702 4.199 3.818 3.668 3.694 3.742 3.680 3.482 3.232 3.061 + 8.658 9.464 10.390 10.612 9.813 8.407 7.179 6.675 6.826 7.088 6.915 6.167 5.154 4.357 4.084 4.326 4.840 5.331 5.583 5.509 5.161 4.717 4.419 4.431 4.707 4.976 4.926 4.454 3.776 3.280 3.220 3.517 3.837 3.887 3.663 3.424 + 10.871 10.948 10.882 10.429 9.556 8.505 7.632 7.161 7.037 6.989 6.739 6.184 5.444 4.745 4.279 4.107 4.168 4.340 4.510 4.609 4.637 4.643 4.693 4.799 4.882 4.807 4.474 3.925 3.348 2.970 2.905 3.071 3.262 3.311 3.213 3.098 + 7.767 7.588 7.428 7.502 7.839 8.205 8.246 7.750 6.824 5.856 5.250 5.150 5.358 5.524 5.444 5.226 5.172 5.475 6.009 6.399 6.334 5.854 5.337 5.195 5.510 5.944 6.018 5.507 4.638 3.896 3.615 3.719 3.826 3.616 3.128 2.716 + 8.454 8.107 7.898 8.328 9.380 10.416 10.622 9.658 7.986 6.564 6.142 6.701 7.507 7.723 7.098 6.156 5.734 6.266 7.401 8.288 8.291 7.515 6.709 6.619 7.351 8.276 8.562 7.875 6.642 5.662 5.420 5.698 5.815 5.276 4.244 3.417 + 7.568 6.928 6.381 6.758 8.247 10.155 11.382 11.235 9.938 8.411 7.526 7.445 7.589 7.259 6.336 5.460 5.489 6.703 8.461 9.651 9.580 8.570 7.701 7.904 9.155 10.474 10.745 9.667 8.014 6.969 7.097 7.858 8.094 7.078 5.208 3.735 + 6.610 6.568 6.882 7.936 9.635 11.285 11.985 11.267 9.493 7.652 6.675 6.772 7.339 7.519 6.971 6.204 6.144 7.295 9.205 10.748 11.019 10.096 8.988 8.773 9.664 10.816 11.065 9.965 8.208 7.029 7.130 8.057 8.620 7.967 6.380 5.054 + 6.992 6.551 6.436 7.430 9.506 11.649 12.545 11.586 9.368 7.248 6.323 6.640 7.293 7.289 6.445 5.570 5.762 7.433 9.881 11.775 12.163 11.165 9.815 9.184 9.548 10.268 10.432 9.687 8.524 7.806 7.966 8.607 8.855 8.150 6.783 5.693 + 5.909 6.040 6.641 8.011 9.973 11.769 12.461 11.577 9.524 7.397 6.255 6.382 7.137 7.523 7.062 6.231 6.065 7.224 9.326 11.149 11.587 10.578 9.177 8.688 9.564 11.039 11.804 11.135 9.507 8.133 7.886 8.552 9.096 8.662 7.389 6.282 + 6.829 6.490 6.386 7.148 8.844 10.787 11.952 11.705 10.274 8.577 7.532 7.390 7.633 7.513 6.779 5.955 5.909 7.066 8.940 10.435 10.695 9.805 8.727 8.509 9.409 10.695 11.277 10.638 9.255 8.157 8.021 8.614 9.053 8.646 7.542 6.596 + 6.531 6.570 6.773 7.328 8.344 9.657 10.782 11.136 10.450 9.060 7.740 7.149 7.316 7.643 7.488 6.812 6.285 6.684 8.113 9.770 10.558 10.020 8.761 7.928 8.204 9.205 9.867 9.442 8.207 7.199 7.242 8.177 9.026 8.922 7.935 6.995 + 7.432 6.918 6.484 6.813 8.077 9.711 10.772 10.604 9.309 7.654 6.481 6.114 6.200 6.135 5.660 5.135 5.231 6.289 7.929 9.259 9.544 8.788 7.729 7.227 7.580 8.317 8.662 8.232 7.371 6.823 7.056 7.842 8.463 8.367 7.660 7.001 + 8.195 8.032 7.946 8.235 8.998 9.979 10.666 10.604 9.750 8.563 7.713 7.587 7.995 8.325 8.080 7.324 6.656 6.677 7.427 8.297 8.530 7.889 6.885 6.348 6.691 7.548 8.107 7.840 6.977 6.275 6.314 6.959 7.505 7.354 6.581 5.870 + 7.476 7.622 8.043 8.815 9.772 10.487 10.516 9.719 8.428 7.267 6.736 6.853 7.156 7.094 6.510 5.801 5.599 6.207 7.270 7.997 7.783 6.726 5.583 5.173 5.712 6.651 7.154 6.809 5.963 5.385 5.573 6.317 6.902 6.771 6.032 5.353 + 8.391 8.704 9.105 9.294 9.090 8.525 7.804 7.179 6.825 6.778 6.925 7.045 6.909 6.410 5.679 5.061 4.917 5.360 6.126 6.719 6.771 6.320 5.782 5.601 5.871 6.264 6.338 5.959 5.459 5.354 5.863 6.672 7.160 6.928 6.166 5.508 + 8.136 8.286 8.576 8.947 9.259 9.322 8.990 8.259 7.300 6.373 5.681 5.251 4.949 4.620 4.242 3.969 4.022 4.494 5.241 5.951 6.347 6.370 6.196 6.075 6.128 6.267 6.307 6.149 5.874 5.672 5.666 5.796 5.874 5.764 5.506 5.291 + 7.325 7.037 6.866 7.220 8.076 8.897 9.012 8.158 6.715 5.442 4.888 4.986 5.161 4.866 4.097 3.439 3.581 4.692 6.199 7.170 7.018 5.957 4.842 4.504 5.128 6.158 6.788 6.622 5.947 5.429 5.518 6.081 6.570 6.535 6.033 5.552 + 9.768 9.204 8.450 7.957 7.903 8.073 8.059 7.619 6.873 6.188 5.849 5.797 5.690 5.218 4.439 3.795 3.791 4.567 5.727 6.591 6.682 6.079 5.341 5.072 5.464 6.197 6.737 6.784 6.483 6.253 6.385 6.799 7.135 7.101 6.745 6.409 + 11.066 10.967 10.731 10.325 9.758 9.099 8.443 7.895 7.552 7.482 7.686 8.047 8.353 8.405 8.171 7.839 7.699 7.904 8.322 8.611 8.495 8.011 7.495 7.299 7.467 7.679 7.521 6.877 6.071 5.632 5.853 6.535 7.152 7.289 6.977 6.626 + 11.768 11.729 11.523 11.022 10.238 9.358 8.649 8.321 8.432 8.884 9.468 9.924 10.021 9.673 9.028 8.443 8.279 8.637 9.225 9.535 9.226 8.427 7.666 7.453 7.839 8.337 8.319 7.560 6.459 5.745 5.881 6.695 7.548 7.881 7.659 7.326 + 9.858 9.475 9.079 9.048 9.394 9.729 9.615 8.969 8.139 7.593 7.496 7.573 7.374 6.683 5.712 4.911 4.595 4.734 5.056 5.333 5.557 5.852 6.254 6.595 6.632 6.292 5.790 5.496 5.663 6.248 6.962 7.488 7.679 7.596 7.409 7.274 + 9.931 10.039 10.052 9.756 9.133 8.397 7.836 7.606 7.645 7.757 7.760 7.564 7.145 6.505 5.689 4.849 4.240 4.095 4.447 5.075 5.644 5.939 6.002 6.038 6.189 6.390 6.457 6.313 6.129 6.205 6.705 7.467 8.110 8.336 8.178 7.950 + 8.175 7.963 7.719 7.632 7.717 7.778 7.579 7.054 6.385 5.863 5.651 5.651 5.600 5.316 4.883 4.600 4.728 5.249 5.852 6.166 6.070 5.792 5.716 6.048 6.618 7.008 6.910 6.410 5.959 6.024 6.702 7.617 8.195 8.115 7.557 7.052 + 7.625 7.622 7.565 7.406 7.152 6.867 6.625 6.452 6.316 6.163 5.977 5.782 5.611 5.472 5.341 5.210 5.113 5.111 5.233 5.424 5.567 5.559 5.403 5.212 5.148 5.311 5.684 6.159 6.616 6.992 7.297 7.572 7.842 8.094 8.293 8.402 + 6.728 7.184 7.834 8.299 8.284 7.741 6.889 6.075 5.565 5.400 5.415 5.411 5.318 5.241 5.335 5.639 6.011 6.229 6.176 5.939 5.737 5.734 5.912 6.102 6.144 6.031 5.900 5.911 6.116 6.444 6.809 7.200 7.679 8.268 8.857 9.236 + 6.108 6.543 7.060 7.249 6.977 6.477 6.122 6.094 6.246 6.245 5.866 5.164 4.426 3.952 3.894 4.228 4.844 5.611 6.379 6.967 7.209 7.069 6.689 6.320 6.144 6.159 6.221 6.218 6.197 6.324 6.703 7.240 7.690 7.853 7.752 7.599 + 10.550 10.774 10.953 10.820 10.380 9.925 9.768 9.952 10.197 10.144 9.645 8.859 8.091 7.567 7.349 7.438 7.883 8.739 9.891 10.974 11.537 11.366 10.696 10.064 9.901 10.183 10.451 10.196 9.291 8.108 7.254 7.148 7.777 8.778 9.704 10.237 + 12.595 12.750 12.762 12.332 11.490 10.629 10.219 10.435 11.024 11.498 11.494 10.991 10.254 9.613 9.275 9.304 9.677 10.317 11.051 11.604 11.712 11.316 10.653 10.129 10.013 10.210 10.314 9.919 8.961 7.794 6.968 6.872 7.515 8.567 9.577 10.176 + 13.067 13.373 13.567 13.203 12.239 11.130 10.491 10.632 11.327 12.007 12.180 11.732 10.921 10.127 9.620 9.490 9.721 10.252 10.950 11.565 11.786 11.407 10.472 9.262 8.110 7.209 6.560 6.091 5.803 5.790 6.108 6.654 7.190 7.502 7.561 7.514 + 13.475 13.842 14.088 13.695 12.618 11.388 10.718 10.944 11.781 12.554 12.700 12.115 11.124 10.181 9.598 9.481 9.826 10.578 11.572 12.457 12.778 12.216 10.825 9.047 7.464 6.476 6.145 6.283 6.666 7.152 7.648 8.026 8.126 7.886 7.451 7.114 + 14.291 14.146 13.901 13.634 13.440 13.381 13.454 13.583 13.654 13.574 13.303 12.860 12.299 11.705 11.209 10.974 11.137 11.696 12.446 13.022 13.075 12.464 11.351 10.114 9.134 8.607 8.497 8.625 8.811 8.957 9.029 9.009 8.873 8.628 8.351 8.165 + 15.061 14.973 14.924 15.062 15.420 15.872 16.202 16.249 16.001 15.575 15.111 14.664 14.201 13.688 13.193 12.893 12.950 13.355 13.856 14.067 13.688 12.696 11.369 10.122 9.276 8.909 8.886 9.000 9.113 9.197 9.268 9.317 9.298 9.182 9.010 8.882 + 15.237 14.649 14.232 14.743 16.171 17.672 18.311 17.887 17.069 16.721 17.054 17.423 16.952 15.419 13.547 12.441 12.655 13.730 14.579 14.348 13.008 11.225 9.726 8.772 8.155 7.600 7.113 6.935 7.220 7.790 8.226 8.189 7.659 6.899 6.231 5.860 + 16.164 15.693 15.416 15.972 17.273 18.514 18.896 18.367 17.660 17.556 18.093 18.479 17.836 16.083 14.129 13.161 13.648 14.942 15.796 15.331 13.614 11.437 9.596 8.363 7.550 6.969 6.745 7.164 8.259 9.584 10.429 10.294 9.210 7.665 6.270 5.472 + 16.545 15.946 15.504 15.959 17.267 18.590 19.079 18.657 18.047 18.000 18.501 18.755 17.980 16.257 14.567 13.964 14.620 15.636 15.794 14.550 12.390 10.286 8.846 7.955 7.169 6.373 5.988 6.517 7.918 9.448 10.172 9.665 8.273 6.749 5.667 5.169 + 16.731 16.043 15.490 15.889 17.219 18.601 19.115 18.643 17.924 17.764 18.217 18.550 18.022 16.689 15.426 15.095 15.686 16.257 15.754 13.941 11.568 9.663 8.652 8.155 7.583 6.878 6.612 7.355 8.952 10.472 10.922 10.045 8.474 7.130 6.475 6.328 + 16.761 16.147 15.660 16.051 17.324 18.681 19.229 18.766 17.924 17.530 17.835 18.327 18.284 17.512 16.524 16.022 16.178 16.429 15.979 14.519 12.497 10.700 9.586 9.003 8.504 7.908 7.523 7.811 8.856 10.155 10.946 10.767 9.746 8.419 7.326 6.746 + 16.673 16.121 15.702 16.117 17.385 18.762 19.359 18.900 17.918 17.249 17.307 17.804 18.122 17.932 17.453 17.141 17.145 17.101 16.449 14.972 13.015 11.193 9.876 8.953 8.083 7.150 6.477 6.552 7.536 9.000 10.130 10.242 9.195 7.431 5.683 4.621 + 16.467 16.048 15.751 16.145 17.270 18.527 19.133 18.740 17.701 16.757 16.458 16.790 17.308 17.577 17.510 17.319 17.175 16.952 16.295 14.966 13.107 11.200 9.723 8.831 8.323 7.908 7.519 7.381 7.780 8.722 9.793 10.352 9.942 8.625 7.002 5.901 + 16.108 15.911 15.859 16.302 17.229 18.192 18.603 18.176 17.142 16.092 15.563 15.724 16.349 17.060 17.591 17.867 17.883 17.561 16.752 15.377 13.576 11.697 10.117 9.049 8.463 8.200 8.142 8.292 8.700 9.304 9.857 10.015 9.554 8.554 7.413 6.659 + 15.693 15.687 15.813 16.188 16.729 17.136 17.063 16.372 15.257 14.161 13.532 13.598 14.304 15.397 16.570 17.552 18.107 18.022 17.154 15.526 13.396 11.211 9.438 8.372 8.035 8.223 8.655 9.110 9.466 9.648 9.564 9.113 8.266 7.158 6.094 5.438 + 14.507 14.630 14.900 15.277 15.587 15.579 15.085 14.166 13.110 12.278 11.916 12.076 12.681 13.638 14.859 16.190 17.320 17.818 17.322 15.763 13.458 10.996 8.979 7.786 7.474 7.839 8.552 9.279 9.757 9.843 9.533 8.958 8.320 7.794 7.462 7.315 + 12.902 13.119 13.389 13.506 13.365 13.022 12.621 12.264 11.932 11.527 11.017 10.543 10.415 10.942 12.219 13.985 15.664 16.596 16.330 14.842 12.554 10.155 8.298 7.345 7.272 7.759 8.399 8.898 9.145 9.165 9.006 8.678 8.175 7.548 6.948 6.574 + 11.928 12.018 12.092 11.987 11.569 10.839 9.974 9.257 8.906 8.915 9.044 9.010 8.756 8.589 9.024 10.391 12.480 14.503 15.479 14.814 12.697 10.024 7.884 6.947 7.148 7.861 8.398 8.443 8.154 7.891 7.844 7.877 7.682 7.098 6.309 5.740 + 12.103 11.986 11.885 11.899 11.926 11.709 11.065 10.092 9.139 8.545 8.355 8.311 8.132 7.866 7.960 8.935 10.888 13.229 14.916 15.069 13.539 11.014 8.593 7.132 6.820 7.230 7.752 8.028 8.088 8.143 8.274 8.302 7.955 7.151 6.160 5.474 + 12.535 12.615 12.819 13.106 13.263 12.989 12.145 10.944 9.895 9.480 9.800 10.491 10.995 11.006 10.738 10.787 11.669 13.375 15.281 16.488 16.362 14.903 12.727 10.692 9.458 9.222 9.755 10.628 11.443 11.947 12.028 11.667 10.933 9.996 9.120 8.588 + 13.937 14.235 14.765 15.374 15.816 15.820 15.229 14.133 12.875 11.897 11.487 11.597 11.904 12.091 12.144 12.420 13.368 15.090 17.093 18.459 18.392 16.747 14.168 11.721 10.284 10.125 10.917 12.092 13.198 14.009 14.389 14.171 13.222 11.661 9.982 8.885 + 14.745 14.440 14.186 14.398 15.176 16.163 16.744 16.467 15.374 13.976 12.895 12.449 12.498 12.679 12.816 13.127 14.018 15.625 17.491 18.719 18.536 16.857 14.397 12.226 11.113 11.132 11.809 12.588 13.200 13.652 13.927 13.786 12.909 11.274 9.397 8.131 + 15.029 14.677 14.327 14.406 15.054 15.971 16.587 16.452 15.546 14.286 13.223 12.665 12.550 12.636 12.839 13.366 14.499 16.183 17.822 18.523 17.694 15.516 12.902 10.928 10.157 10.381 10.940 11.315 11.464 11.647 11.957 12.060 11.427 9.881 7.936 6.575 + 13.655 12.877 12.033 11.928 12.768 13.992 14.746 14.562 13.640 12.551 11.702 11.085 10.506 10.009 10.001 10.907 12.659 14.531 15.539 15.137 13.613 11.871 10.763 10.514 10.681 10.623 10.056 9.246 8.720 8.782 9.241 9.546 9.205 8.160 6.852 5.954 + 13.334 12.839 12.305 12.200 12.551 12.931 12.885 12.359 11.707 11.286 11.081 10.770 10.187 9.682 9.922 11.236 13.099 14.321 13.909 11.918 9.545 8.306 8.908 10.721 12.252 12.255 10.598 8.274 6.613 6.351 7.230 8.318 8.730 8.196 7.145 6.338 + 13.153 12.847 12.488 12.348 12.474 12.664 12.672 12.420 12.021 11.605 11.184 10.713 10.292 10.251 10.931 12.285 13.681 14.188 13.229 11.115 8.973 8.041 8.798 10.595 12.076 12.107 10.535 8.245 6.517 6.159 7.033 8.254 8.861 8.466 7.450 6.625 + 13.240 12.902 12.435 12.119 12.125 12.406 12.727 12.823 12.567 12.040 11.472 11.109 11.092 11.428 12.008 12.640 13.060 12.984 12.250 10.990 9.699 9.033 9.403 10.601 11.801 12.018 10.785 8.551 6.447 5.540 6.097 7.419 8.385 8.305 7.402 6.564 + 13.389 12.898 12.267 11.939 12.128 12.661 13.106 13.096 12.598 11.933 11.522 11.570 11.932 12.270 12.329 12.117 11.812 11.531 11.205 10.707 10.103 9.749 10.047 11.015 12.072 12.328 11.234 9.103 7.010 6.061 6.567 7.805 8.570 8.136 6.820 5.697 + 13.577 13.130 12.555 12.264 12.464 13.007 13.501 13.596 13.251 12.754 12.488 12.622 12.988 13.239 13.152 12.797 12.430 12.202 11.997 11.575 10.900 10.315 10.316 11.068 12.094 12.498 11.648 9.767 7.902 7.190 7.980 9.526 10.558 10.286 9.024 7.902 + 14.220 13.504 12.652 12.343 12.809 13.663 14.255 14.211 13.710 13.273 13.283 13.664 14.000 13.950 13.570 13.235 13.246 13.489 13.498 12.877 11.721 10.632 10.259 10.742 11.520 11.722 10.851 9.218 7.752 7.312 8.024 9.176 9.767 9.272 8.049 7.046 + 14.253 13.685 13.000 12.726 13.056 13.720 14.243 14.344 14.115 13.865 13.788 13.785 13.594 13.097 12.490 12.150 12.306 12.807 13.207 13.115 12.506 11.741 11.270 11.265 11.487 11.473 10.905 9.850 8.708 7.925 7.690 7.854 8.087 8.139 7.998 7.842 + 13.620 12.922 12.083 11.750 12.139 12.914 13.523 13.674 13.488 13.264 13.124 12.910 12.428 11.747 11.232 11.232 11.738 12.351 12.624 12.464 12.215 12.319 12.881 13.511 13.624 12.916 11.618 10.315 9.516 9.320 9.442 9.491 9.262 8.809 8.340 8.052 + 13.470 12.694 11.772 11.442 11.972 12.986 13.825 14.071 13.783 13.294 12.845 12.417 11.900 11.355 11.061 11.268 11.911 12.600 12.929 12.816 12.554 12.514 12.768 13.003 12.798 12.005 10.887 9.904 9.348 9.166 9.093 8.925 8.673 8.475 8.408 8.421 + 13.163 12.532 11.739 11.392 11.827 12.909 14.151 15.034 15.261 14.838 13.972 12.947 12.040 11.474 11.356 11.621 12.040 12.347 12.412 12.317 12.258 12.346 12.475 12.381 11.853 10.902 9.746 8.638 7.697 6.904 6.236 5.776 5.677 5.986 6.517 6.921 + 12.825 12.371 11.816 11.639 12.138 13.249 14.588 15.666 16.134 15.907 15.140 14.107 13.091 12.311 11.893 11.854 12.093 12.423 12.652 12.688 12.571 12.414 12.265 12.011 11.407 10.256 8.593 6.754 5.233 4.414 4.349 4.753 5.199 5.394 5.326 5.195 + 12.567 12.074 11.447 11.193 11.673 12.886 14.469 15.877 16.647 16.582 15.790 14.582 13.328 12.333 11.776 11.689 11.957 12.361 12.665 12.729 12.586 12.380 12.221 12.020 11.493 10.355 8.588 6.577 4.955 4.229 4.444 5.150 5.710 5.734 5.322 4.920 + 12.625 12.046 11.325 11.024 11.449 12.493 13.758 14.841 15.511 15.707 15.430 14.709 13.664 12.578 11.824 11.659 12.033 12.604 12.984 13.005 12.809 12.656 12.643 12.556 12.017 10.788 8.997 7.112 5.665 4.955 4.919 5.237 5.558 5.691 5.651 5.573 + 12.671 12.146 11.505 11.262 11.680 12.633 13.765 14.758 15.461 15.825 15.770 15.194 14.120 12.844 11.854 11.551 11.959 12.697 13.253 13.352 13.107 12.848 12.772 12.730 12.330 11.263 9.581 7.708 6.173 5.295 5.031 5.067 5.069 4.879 4.570 4.338 + 12.471 12.021 11.470 11.260 11.625 12.466 13.473 14.354 14.965 15.267 15.217 14.752 13.884 12.820 11.935 11.576 11.840 12.500 13.160 13.508 13.467 13.147 12.666 12.021 11.114 9.898 8.495 7.167 6.176 5.627 5.436 5.410 5.379 5.276 5.134 5.035 + 12.596 11.777 10.830 10.585 11.369 12.816 14.220 15.097 15.450 15.585 15.711 15.728 15.371 14.520 13.357 12.251 11.528 11.336 11.674 12.445 13.418 14.163 14.148 13.069 11.180 9.293 8.308 8.590 9.680 10.637 10.754 10.064 9.211 8.841 9.050 9.391 + 12.193 11.638 10.961 10.745 11.346 12.664 14.218 15.438 15.996 15.941 15.592 15.278 15.105 14.916 14.448 13.586 12.521 11.688 11.513 12.102 13.102 13.856 13.776 12.722 11.120 9.719 9.135 9.489 10.360 11.106 11.281 10.877 10.229 9.712 9.475 9.427 + 9.554 9.571 9.911 10.856 12.318 13.817 14.803 15.054 14.798 14.475 14.377 14.469 14.517 14.329 13.896 13.316 12.667 11.975 11.307 10.828 10.696 10.864 11.012 10.745 9.943 8.946 8.354 8.587 9.529 10.593 11.135 10.896 10.106 9.230 8.609 8.325 + 10.222 9.597 8.939 8.904 9.622 10.574 11.034 10.669 9.785 9.032 8.872 9.272 9.837 10.193 10.247 10.134 9.991 9.829 9.602 9.354 9.207 9.190 9.104 8.622 7.597 6.290 5.278 5.059 5.676 6.686 7.486 7.736 7.511 7.128 6.844 6.724 + 8.895 8.784 8.621 8.501 8.511 8.676 8.916 9.083 9.041 8.773 8.417 8.197 8.287 8.708 9.319 9.909 10.321 10.515 10.539 10.456 10.286 10.004 9.585 9.030 8.387 7.730 7.157 6.778 6.696 6.964 7.534 8.258 8.947 9.455 9.743 9.858 + 7.223 7.142 7.273 7.884 8.895 9.862 10.314 10.128 9.621 9.281 9.378 9.810 10.274 10.581 10.796 11.106 11.576 12.042 12.259 12.121 11.746 11.334 10.955 10.499 9.830 9.001 8.296 8.049 8.390 9.145 9.976 10.614 10.995 11.209 11.349 11.433 + 6.220 6.184 6.264 6.604 7.172 7.757 8.123 8.175 7.989 7.706 7.424 7.200 7.120 7.327 7.902 8.718 9.428 9.680 9.395 8.865 8.546 8.697 9.178 9.590 9.644 9.412 9.251 9.462 10.023 10.638 11.042 11.270 11.601 12.245 13.077 13.677 + 5.768 6.231 6.884 7.378 7.523 7.380 7.149 6.981 6.874 6.732 6.519 6.348 6.422 6.876 7.664 8.567 9.336 9.829 10.047 10.082 10.022 9.914 9.793 9.723 9.797 10.088 10.600 11.262 11.969 12.642 13.254 13.814 14.329 14.782 15.126 15.313 + 8.293 7.740 7.012 6.597 6.753 7.342 7.950 8.191 7.964 7.490 7.127 7.121 7.480 8.028 8.574 9.031 9.418 9.765 10.035 10.155 10.090 9.915 9.775 9.781 9.933 10.142 10.347 10.611 11.095 11.930 13.069 14.263 15.198 15.694 15.809 15.769 + 6.893 6.522 6.031 5.720 5.726 5.985 6.363 6.809 7.347 7.939 8.393 8.462 8.091 7.553 7.325 7.738 8.694 9.714 10.284 10.241 9.867 9.625 9.780 10.212 10.575 10.628 10.449 10.366 10.689 11.482 12.541 13.566 14.345 14.830 15.083 15.185 + 3.269 3.899 4.757 5.393 5.691 5.915 6.399 7.172 7.887 8.107 7.679 6.872 6.159 5.886 6.092 6.616 7.288 8.014 8.685 9.098 9.031 8.453 7.635 7.016 6.889 7.204 7.670 8.079 8.527 9.303 10.544 11.987 13.106 13.524 13.333 13.018 + 6.338 6.348 6.252 5.994 5.723 5.716 6.124 6.755 7.158 6.949 6.146 5.186 4.612 4.673 5.170 5.664 5.851 5.784 5.771 6.070 6.654 7.232 7.485 7.293 6.789 6.233 5.849 5.748 5.951 6.424 7.091 7.813 8.427 8.815 8.977 9.011 + 7.201 6.644 5.893 5.439 5.580 6.236 7.005 7.423 7.247 6.585 5.806 5.297 5.250 5.579 6.028 6.348 6.442 6.385 6.332 6.387 6.528 6.635 6.575 6.302 5.880 5.441 5.104 4.916 4.859 4.896 5.020 5.259 5.637 6.112 6.567 6.848 + 6.774 6.449 6.102 6.068 6.405 6.835 6.974 6.653 6.047 5.527 5.361 5.557 5.929 6.306 6.665 7.078 7.543 7.915 7.996 7.723 7.253 6.854 6.683 6.651 6.507 6.062 5.390 4.805 4.659 5.090 5.927 6.798 7.366 7.511 7.369 7.199 + 5.954 6.694 7.706 8.426 8.610 8.452 8.333 8.480 8.826 9.163 9.368 9.477 9.567 9.628 9.596 9.503 9.548 9.940 10.646 11.313 11.503 11.056 10.252 9.578 9.301 9.268 9.126 8.770 8.549 8.981 10.207 11.701 12.595 12.371 11.340 10.427 + 6.956 7.463 8.360 9.415 10.326 10.833 10.855 10.553 10.234 10.158 10.362 10.647 10.751 10.568 10.248 10.087 10.300 10.839 11.416 11.710 11.589 11.184 10.767 10.546 10.541 10.639 10.760 10.970 11.432 12.233 13.235 14.096 14.475 14.279 13.749 13.319 + 9.435 8.631 7.839 7.941 9.094 10.596 11.519 11.482 10.860 10.303 10.090 9.963 9.561 8.950 8.662 9.182 10.384 11.521 11.810 11.103 9.997 9.313 9.427 10.058 10.670 11.015 11.290 11.796 12.505 13.018 12.978 12.485 12.067 12.197 12.821 13.396 + 13.349 13.027 12.794 13.044 13.724 14.334 14.373 13.778 12.959 12.386 12.182 12.098 11.885 11.636 11.721 12.358 13.275 13.836 13.574 12.623 11.629 11.194 11.373 11.687 11.624 11.136 10.650 10.594 10.932 11.168 10.827 9.927 8.982 8.526 8.634 8.903 + 13.341 13.077 12.912 13.204 13.914 14.578 14.671 14.042 13.024 12.151 11.738 11.721 11.842 11.975 12.228 12.749 13.447 13.947 13.869 13.177 12.272 11.702 11.727 12.095 12.244 11.729 10.543 9.089 7.861 7.124 6.814 6.684 6.522 6.273 6.009 5.841 + 12.635 12.422 12.211 12.249 12.587 13.009 13.164 12.819 12.031 11.125 10.491 10.364 10.715 11.314 11.890 12.262 12.379 12.283 12.054 11.783 11.559 11.439 11.411 11.357 11.095 10.473 9.484 8.300 7.207 6.454 6.128 6.128 6.256 6.346 6.350 6.319 + 12.258 12.339 12.278 11.880 11.200 10.511 10.036 9.722 9.322 8.697 8.037 7.749 8.080 8.849 9.549 9.769 9.536 9.259 9.342 9.814 10.336 10.542 10.363 10.024 9.738 9.437 8.849 7.845 6.698 5.946 5.941 6.516 7.097 7.190 6.798 6.377 + 12.418 12.360 12.133 11.686 11.160 10.764 10.528 10.192 9.439 8.277 7.191 6.827 7.459 8.696 9.758 10.096 9.805 9.475 9.611 10.181 10.702 10.746 10.345 9.900 9.699 9.565 9.038 7.910 6.581 5.809 6.037 6.936 7.631 7.449 6.526 5.685 + 12.100 12.167 12.139 11.877 11.435 10.991 10.625 10.186 9.443 8.398 7.440 7.121 7.704 8.883 9.970 10.418 10.229 9.895 9.924 10.391 10.904 10.998 10.555 9.863 9.294 8.928 8.522 7.815 6.868 6.062 5.770 6.005 6.409 6.584 6.440 6.227 + 11.940 12.153 12.283 12.046 11.463 10.834 10.410 10.126 9.675 8.894 8.042 7.664 8.114 9.176 10.176 10.519 10.185 9.725 9.755 10.392 11.151 11.364 10.752 9.626 8.579 7.974 7.709 7.419 6.881 6.219 5.754 5.679 5.901 6.167 6.305 6.331 + 12.741 12.471 12.207 12.238 12.597 13.013 13.123 12.747 11.993 11.143 10.464 10.136 10.269 10.921 12.020 13.266 14.192 14.420 13.942 13.139 12.482 12.133 11.810 11.075 9.804 8.392 7.481 7.429 7.985 8.495 8.457 7.938 7.467 7.514 8.041 8.546 + 13.382 12.738 12.151 12.352 13.393 14.557 14.975 14.349 13.139 12.075 11.523 11.298 11.062 10.837 11.067 12.151 13.912 15.565 16.277 15.811 14.668 13.614 13.026 12.670 12.063 11.028 9.895 9.175 9.057 9.231 9.185 8.668 7.867 7.175 6.814 6.715 + 13.438 12.696 12.005 12.223 13.474 14.993 15.740 15.231 13.863 12.494 11.708 11.440 11.248 10.898 10.674 11.109 12.418 14.187 15.610 16.082 15.594 14.642 13.754 13.096 12.475 11.667 10.716 9.928 9.592 9.711 9.986 10.046 9.706 9.061 8.384 7.962 + 13.342 12.796 12.314 12.573 13.696 15.088 15.862 15.503 14.225 12.749 11.734 11.329 11.215 11.028 10.757 10.770 11.454 12.819 14.404 15.562 15.891 15.440 14.582 13.687 12.885 12.109 11.306 10.599 10.238 10.366 10.833 11.229 11.150 10.493 9.567 8.902 + 13.228 12.939 12.760 13.130 14.105 15.229 15.818 15.445 14.247 12.824 11.802 11.411 11.409 11.381 11.144 10.927 11.159 12.074 13.449 14.720 15.360 15.219 14.555 13.762 13.047 12.348 11.532 10.659 10.030 9.954 10.422 11.022 11.197 10.686 9.756 9.036 + 13.076 13.005 13.073 13.481 14.169 14.767 14.812 14.088 12.820 11.540 10.720 10.449 10.411 10.199 9.701 9.251 9.372 10.336 11.884 13.362 14.169 14.162 13.687 13.227 12.993 12.811 12.387 11.690 11.061 10.932 11.391 12.012 12.149 11.473 10.301 9.399 + 11.469 11.496 11.726 12.309 13.131 13.777 13.755 12.842 11.287 9.694 8.634 8.270 8.289 8.197 7.761 7.231 7.156 7.928 9.427 11.055 12.143 12.412 12.103 11.713 11.567 11.604 11.544 11.225 10.805 10.607 10.778 11.091 11.109 10.579 9.707 9.040 + 10.456 10.616 11.041 11.733 12.413 12.614 12.025 10.777 9.403 8.477 8.217 8.387 8.571 8.534 8.379 8.378 8.683 9.197 9.705 10.099 10.455 10.900 11.406 11.758 11.725 11.276 10.628 10.066 9.729 9.537 9.335 9.081 8.885 8.877 9.039 9.203 + 6.942 6.984 7.160 7.522 7.965 8.254 8.197 7.806 7.294 6.909 6.752 6.743 6.745 6.723 6.770 6.994 7.383 7.798 8.099 8.280 8.465 8.764 9.121 9.318 9.138 8.552 7.764 7.073 6.676 6.578 6.658 6.805 6.989 7.221 7.467 7.633 + 4.516 4.991 5.673 6.254 6.617 6.838 6.981 6.924 6.423 5.387 4.086 3.054 2.739 3.182 4.020 4.793 5.284 5.590 5.899 6.232 6.396 6.205 5.702 5.171 4.897 4.935 5.102 5.205 5.254 5.437 5.886 6.465 6.840 6.768 6.348 5.966 + 5.920 5.605 5.358 5.588 6.339 7.206 7.632 7.339 6.515 5.635 5.095 4.972 5.087 5.253 5.460 5.822 6.390 7.029 7.511 7.708 7.713 7.741 7.911 8.111 8.081 7.654 6.945 6.313 6.132 6.526 7.295 8.045 8.442 8.403 8.106 7.848 + 7.589 7.612 7.821 8.335 9.039 9.591 9.668 9.227 8.566 8.105 8.088 8.453 8.944 9.367 9.726 10.154 10.723 11.337 11.813 12.060 12.184 12.387 12.767 13.182 13.338 13.011 12.252 11.379 10.778 10.662 10.950 11.357 11.596 11.554 11.329 11.136 + 8.334 8.548 9.111 10.058 11.104 11.727 11.525 10.560 9.371 8.607 8.582 9.107 9.723 10.113 10.319 10.602 11.112 11.696 12.028 11.938 11.612 11.471 11.812 12.531 13.164 13.240 12.645 11.722 11.023 10.919 11.358 11.937 12.211 12.001 11.496 11.089 + 11.622 12.038 12.746 13.514 14.055 14.107 13.544 12.442 11.067 9.766 8.805 8.257 8.013 7.904 7.855 7.951 8.355 9.156 10.252 11.373 12.225 12.642 12.635 12.323 11.828 11.235 10.644 10.214 10.120 10.406 10.870 11.115 10.786 9.846 8.672 7.862 + 13.201 13.320 13.735 14.555 15.580 16.306 16.241 15.268 13.770 12.379 11.546 11.266 11.172 10.910 10.466 10.173 10.408 11.235 12.302 13.074 13.205 12.740 12.006 11.321 10.790 10.368 10.077 10.141 10.839 12.156 13.568 14.204 13.380 11.153 8.449 6.611 + 13.174 12.964 13.015 13.773 15.142 16.425 16.819 16.044 14.554 13.165 12.428 12.271 12.217 11.916 11.509 11.500 12.257 13.618 14.932 15.515 15.106 13.982 12.653 11.467 10.452 9.502 8.678 8.297 8.696 9.863 11.261 12.053 11.614 9.984 7.923 6.508 + 12.555 12.300 12.295 13.042 14.483 15.921 16.501 15.859 14.390 12.905 12.004 11.689 11.534 11.201 10.825 10.900 11.784 13.269 14.629 15.110 14.469 13.112 11.736 10.791 10.217 9.648 8.866 8.089 7.818 8.370 9.504 10.469 10.508 9.422 7.781 6.581 + 10.947 10.880 11.243 12.429 14.153 15.502 15.629 14.468 12.780 11.508 11.011 10.900 10.586 9.972 9.604 10.110 11.485 12.926 13.419 12.582 10.985 9.661 9.252 9.514 9.632 8.997 7.780 6.800 6.841 8.003 9.604 10.664 10.556 9.370 7.805 6.733 + 10.685 10.628 10.608 10.677 10.729 10.552 10.009 9.190 8.367 7.780 7.462 7.257 7.014 6.764 6.693 6.936 7.401 7.804 7.899 7.689 7.409 7.296 7.358 7.365 7.074 6.481 5.856 5.542 5.683 6.123 6.555 6.760 6.728 6.599 6.498 6.458 + 9.491 9.219 8.920 8.847 9.007 9.138 8.933 8.315 7.509 6.852 6.521 6.419 6.314 6.067 5.765 5.632 5.839 6.377 7.087 7.772 8.278 8.496 8.350 7.842 7.136 6.554 6.433 6.890 7.709 8.446 8.722 8.454 7.868 7.291 6.924 6.774 + 7.866 7.750 7.792 8.268 9.159 10.106 10.663 10.641 10.251 9.916 9.912 10.152 10.285 10.028 9.459 9.012 9.186 10.175 11.701 13.158 13.955 13.815 12.873 11.549 10.315 9.504 9.232 9.421 9.868 10.321 10.560 10.455 10.010 9.363 8.737 8.354 + 10.402 10.475 10.661 10.983 11.374 11.692 11.801 11.675 11.418 11.184 11.044 10.931 10.717 10.369 10.064 10.126 10.808 12.063 13.496 14.547 14.804 14.230 13.146 11.996 11.096 10.528 10.234 10.175 10.384 10.867 11.459 11.820 11.629 10.843 9.806 9.077 + 13.699 12.910 11.778 10.859 10.435 10.405 10.508 10.613 10.800 11.183 11.689 12.059 12.093 11.893 11.836 12.270 13.176 14.123 14.560 14.211 13.240 12.069 11.048 10.267 9.645 9.147 8.903 9.078 9.665 10.387 10.842 10.752 10.133 9.250 8.445 7.980 + 12.263 11.507 10.390 9.423 8.918 8.880 9.152 9.635 10.352 11.319 12.389 13.266 13.699 13.690 13.497 13.422 13.566 13.764 13.759 13.436 12.910 12.403 12.058 11.857 11.715 11.615 11.638 11.845 12.167 12.410 12.411 12.187 11.921 11.802 11.861 11.962 + 11.455 10.686 9.718 9.184 9.249 9.556 9.666 9.551 9.632 10.345 11.654 13.007 13.770 13.717 13.148 12.552 12.192 12.008 11.863 11.795 11.951 12.301 12.476 12.032 10.926 9.727 9.263 9.927 11.278 12.344 12.413 11.615 10.764 10.604 11.159 11.766 + 14.673 14.464 14.085 13.542 12.787 11.827 10.870 10.318 10.527 11.485 12.715 13.542 13.553 12.880 12.057 11.581 11.555 11.709 11.730 11.575 11.448 11.507 11.616 11.430 10.747 9.781 9.065 9.030 9.637 10.393 10.751 10.523 9.960 9.469 9.255 9.231 + 14.773 14.116 13.068 11.978 11.090 10.487 10.180 10.192 10.529 11.097 11.698 12.161 12.482 12.797 13.176 13.459 13.346 12.729 11.940 11.590 12.052 13.015 13.604 13.064 11.489 9.894 9.492 10.694 12.699 14.067 13.832 12.223 10.395 9.431 9.501 9.908 + 10.770 10.189 9.442 9.027 9.151 9.648 10.211 10.674 11.099 11.609 12.210 12.782 13.214 13.493 13.624 13.525 13.067 12.316 11.685 11.739 12.689 14.020 14.717 14.046 12.280 10.672 10.544 12.182 14.477 15.717 14.917 12.588 10.281 9.298 9.693 10.412 + 10.860 10.978 10.942 10.503 9.751 9.127 9.099 9.772 10.792 11.627 11.996 12.058 12.199 12.608 13.040 13.014 12.282 11.167 10.411 10.626 11.754 13.025 13.486 12.718 11.197 9.978 9.943 11.162 12.845 13.907 13.708 12.419 10.786 9.541 8.945 8.791 + 11.652 12.304 12.931 12.787 11.744 10.449 9.823 10.340 11.682 13.047 13.782 13.799 13.466 13.151 12.875 12.390 11.546 10.567 9.936 9.995 10.606 11.206 11.208 10.432 9.235 8.265 8.042 8.671 9.827 10.964 11.582 11.407 10.469 9.077 7.716 6.880 + 13.849 13.732 13.478 13.124 12.829 12.800 13.124 13.655 14.085 14.163 13.882 13.474 13.186 13.048 12.834 12.262 11.282 10.185 9.434 9.334 9.794 10.361 10.517 10.004 8.977 7.889 7.219 7.214 7.787 8.583 9.159 9.175 8.541 7.457 6.335 5.627 + 13.309 12.985 12.707 12.897 13.674 14.753 15.681 16.192 16.362 16.465 16.668 16.857 16.719 16.016 14.787 13.335 12.028 11.091 10.530 10.202 9.922 9.536 8.953 8.174 7.333 6.680 6.475 6.812 7.516 8.199 8.471 8.153 7.356 6.384 5.557 5.095 + 12.890 12.802 12.786 13.071 13.810 14.929 16.103 16.915 17.134 16.891 16.587 16.554 16.739 16.713 16.041 14.726 13.328 12.591 12.836 13.611 13.932 12.965 10.639 7.738 5.397 4.418 4.870 6.196 7.638 8.622 8.880 8.379 7.232 5.706 4.237 3.329 + 12.706 12.462 12.285 12.575 13.518 14.904 16.210 16.922 16.883 16.413 16.070 16.218 16.714 16.996 16.527 15.272 13.796 12.879 12.909 13.534 13.854 13.046 10.956 8.230 5.915 4.833 5.157 6.420 7.872 8.867 9.073 8.469 7.253 5.762 4.413 3.611 + 12.558 12.207 11.940 12.286 13.433 15.042 16.439 17.071 16.877 16.306 15.965 16.160 16.677 16.964 16.577 15.540 14.344 13.571 13.440 13.613 13.413 12.311 10.310 7.989 6.162 5.429 5.873 7.090 8.442 9.366 9.552 8.983 7.858 6.510 5.321 4.626 + 12.711 12.325 12.068 12.514 13.788 15.413 16.657 17.059 16.729 16.192 15.958 16.170 16.587 16.843 16.726 16.279 15.699 15.159 14.696 14.199 13.457 12.256 10.526 8.479 6.641 5.659 5.929 7.277 8.960 10.057 10.010 8.929 7.441 6.209 5.529 5.293 + 12.955 12.412 12.009 12.475 13.901 15.622 16.759 16.917 16.420 15.941 15.902 16.215 16.523 16.619 16.609 16.676 16.762 16.536 15.694 14.270 12.621 11.089 9.703 8.263 6.720 5.453 5.081 5.921 7.571 9.076 9.554 8.804 7.360 6.000 5.177 4.864 + 12.367 11.898 11.572 12.058 13.467 15.199 16.397 16.586 15.988 15.270 15.004 15.298 15.858 16.327 16.549 16.554 16.358 15.845 14.868 13.428 11.742 10.094 8.639 7.365 6.250 5.441 5.233 5.817 7.015 8.277 8.954 8.684 7.576 6.093 4.777 4.026 + 11.739 11.327 11.073 11.613 13.063 14.864 16.171 16.460 15.856 14.972 14.429 14.484 14.995 15.654 16.220 16.556 16.541 16.020 14.900 13.273 11.429 9.701 8.278 7.170 6.345 5.883 5.962 6.672 7.820 8.939 9.528 9.345 8.522 7.445 6.518 6.002 + 11.910 11.474 11.259 11.955 13.606 15.491 16.670 16.696 15.884 14.965 14.501 14.576 14.965 15.484 16.113 16.802 17.241 16.931 15.570 13.380 11.036 9.195 8.057 7.353 6.751 6.271 6.281 7.074 8.442 9.690 10.100 9.459 8.161 6.859 5.989 5.608 + 11.914 11.547 11.404 12.101 13.669 15.443 16.559 16.598 15.834 14.938 14.453 14.514 14.963 15.633 16.438 17.223 17.618 17.165 15.675 13.476 11.251 9.574 8.540 7.841 7.193 6.699 6.755 7.591 8.890 9.903 9.982 9.081 7.756 6.686 6.175 6.057 + 11.633 11.242 11.065 11.739 13.307 15.105 16.255 16.312 15.530 14.566 13.970 13.906 14.263 14.916 15.798 16.734 17.301 16.994 15.604 13.474 11.321 9.725 8.745 8.007 7.186 6.411 6.171 6.818 8.112 9.289 9.597 8.854 7.523 6.291 5.554 5.278 + 11.286 10.870 10.687 11.414 13.088 14.987 16.164 16.147 15.218 14.095 13.377 13.251 13.620 14.376 15.461 16.673 17.519 17.390 16.016 13.750 11.390 9.616 8.541 7.788 6.991 6.234 5.980 6.555 7.703 8.662 8.741 7.862 6.584 5.598 5.189 5.144 + 11.323 11.090 11.139 11.981 13.570 15.234 16.159 15.987 15.025 13.940 13.258 13.131 13.478 14.245 15.428 16.854 18.007 18.202 17.056 14.837 12.351 10.403 9.278 8.693 8.199 7.658 7.323 7.493 8.110 8.709 8.785 8.216 7.336 6.620 6.291 6.229 + 11.319 11.134 11.262 12.174 13.773 15.360 16.153 15.878 14.909 13.892 13.242 13.002 13.086 13.572 14.642 16.215 17.699 18.227 17.263 15.062 12.523 10.549 9.435 8.835 8.276 7.689 7.451 7.910 8.900 9.753 9.817 8.996 7.801 6.887 6.520 6.493 + 10.928 10.793 10.949 11.808 13.297 14.812 15.628 15.425 14.473 13.362 12.565 12.228 12.300 12.775 13.736 15.140 16.600 17.454 17.137 15.573 13.236 10.838 8.923 7.674 7.047 6.991 7.492 8.420 9.393 9.888 9.575 8.571 7.371 6.484 6.088 6.008 + 10.622 10.535 10.794 11.794 13.399 14.913 15.568 15.096 13.895 12.674 11.932 11.731 11.901 12.384 13.314 14.758 16.392 17.509 17.421 15.945 13.542 11.016 9.017 7.773 7.191 7.131 7.538 8.327 9.218 9.760 9.602 8.761 7.617 6.639 6.067 5.850 + 11.135 11.079 11.410 12.496 14.112 15.474 15.832 15.073 13.787 12.744 12.307 12.293 12.385 12.592 13.270 14.665 16.449 17.763 17.784 16.327 13.951 11.505 9.559 8.215 7.382 7.102 7.546 8.663 9.920 10.515 9.956 8.495 6.963 6.117 6.070 6.315 + 11.262 11.320 11.744 12.757 14.110 15.147 15.291 14.517 13.366 12.491 12.159 12.172 12.235 12.372 12.941 14.219 15.967 17.417 17.748 16.643 14.471 11.985 9.845 8.380 7.687 7.813 8.737 10.166 11.441 11.804 10.903 9.093 7.230 6.054 5.706 5.762 + 11.055 11.107 11.506 12.455 13.698 14.585 14.561 13.637 12.398 11.525 11.275 11.379 11.447 11.455 11.819 12.983 14.874 16.760 17.666 17.022 15.021 12.452 10.187 8.763 8.286 8.595 9.412 10.369 11.012 10.934 10.025 8.607 7.270 6.483 6.288 6.358 + 10.388 10.710 11.456 12.600 13.798 14.496 14.300 13.303 12.046 11.133 10.810 10.876 10.995 11.092 11.474 12.528 14.277 16.176 17.360 17.156 15.493 12.931 10.347 8.509 7.806 8.179 9.219 10.326 10.914 10.644 9.591 8.217 7.111 6.625 6.678 6.879 + 10.639 11.198 12.121 13.075 13.698 13.741 13.195 12.299 11.417 10.837 10.618 10.607 10.618 10.649 10.942 11.813 13.340 15.155 16.512 16.675 15.356 12.949 10.354 8.505 7.899 8.403 9.434 10.343 10.743 10.584 10.018 9.216 8.288 7.332 6.505 6.015 + 8.895 9.007 9.190 9.367 9.440 9.309 8.926 8.353 7.769 7.407 7.404 7.692 8.043 8.271 8.458 8.961 10.136 11.935 13.732 14.593 13.869 11.687 8.939 6.737 5.733 5.803 6.321 6.729 6.916 7.111 7.455 7.708 7.410 6.350 4.902 3.855 + 8.330 8.481 8.599 8.472 8.053 7.508 7.104 7.020 7.238 7.585 7.871 8.010 8.053 8.133 8.391 8.927 9.752 10.766 11.747 12.415 12.551 12.125 11.325 10.454 9.760 9.328 9.103 9.003 9.004 9.122 9.308 9.412 9.255 8.788 8.184 7.759 + 9.480 9.007 8.400 8.015 7.906 7.810 7.455 6.879 6.436 6.476 6.986 7.565 7.767 7.512 7.189 7.348 8.236 9.580 10.773 11.291 10.996 10.119 9.018 7.965 7.105 6.539 6.363 6.595 7.097 7.611 7.928 8.041 8.125 8.348 8.691 8.959 + 9.336 8.723 7.996 7.699 7.930 8.270 8.188 7.533 6.677 6.170 6.260 6.706 7.049 7.056 6.930 7.097 7.785 8.787 9.597 9.775 9.219 8.157 6.939 5.864 5.142 4.942 5.357 6.295 7.419 8.280 8.591 8.425 8.137 8.059 8.238 8.449 + 8.460 8.537 8.676 8.845 8.995 9.082 9.088 9.039 8.993 9.009 9.103 9.246 9.387 9.507 9.643 9.871 10.242 10.724 11.197 11.512 11.578 11.414 11.126 10.834 10.601 10.421 10.265 10.133 10.063 10.083 10.156 10.177 10.038 9.721 9.339 9.078 + 7.809 8.458 9.461 10.409 11.024 11.293 11.420 11.648 12.075 12.590 12.953 12.960 12.580 11.987 11.482 11.331 11.632 12.255 12.914 13.324 13.360 13.109 12.793 12.599 12.556 12.537 12.388 12.086 11.768 11.639 11.794 12.144 12.476 12.623 12.584 12.497 + 8.783 9.170 9.828 10.560 11.158 11.496 11.588 11.561 11.540 11.530 11.400 11.003 10.344 9.656 9.298 9.533 10.341 11.417 12.341 12.817 12.802 12.472 12.085 11.837 11.800 11.924 12.069 12.066 11.789 11.259 10.685 10.395 10.650 11.439 12.422 13.097 + 10.514 10.562 10.531 10.280 9.788 9.233 8.925 9.134 9.897 10.951 11.836 12.146 11.773 11.002 10.374 10.392 11.229 12.618 13.981 14.735 14.595 13.705 12.543 11.650 11.343 11.570 11.969 12.099 11.706 10.878 10.008 9.573 9.856 10.771 11.881 12.629 + 10.006 9.699 9.326 9.158 9.286 9.586 9.887 10.158 10.512 11.032 11.592 11.891 11.705 11.142 10.655 10.766 11.689 13.159 14.582 15.399 15.384 14.696 13.695 12.713 11.918 11.321 10.848 10.401 9.902 9.336 8.796 8.466 8.515 8.949 9.554 9.985 + 11.056 10.324 9.413 8.973 9.241 9.915 10.487 10.703 10.725 10.887 11.310 11.766 11.919 11.690 11.389 11.473 12.150 13.193 14.116 14.541 14.429 14.008 13.515 13.015 12.442 11.768 11.090 10.554 10.200 9.917 9.564 9.124 8.728 8.525 8.528 8.600 + 11.987 11.051 9.721 8.761 8.702 9.538 10.761 11.715 12.030 11.818 11.506 11.447 11.641 11.811 11.751 11.617 11.855 12.783 14.187 15.336 15.464 14.363 12.590 11.083 10.486 10.725 11.165 11.184 10.661 9.968 9.559 9.534 9.608 9.446 9.026 8.657 + 9.216 9.000 8.775 8.800 9.186 9.797 10.345 10.606 10.602 10.571 10.744 11.108 11.391 11.326 10.976 10.794 11.295 12.550 13.969 14.627 13.968 12.308 10.687 10.120 10.811 12.002 12.594 12.039 10.750 9.702 9.577 10.197 10.749 10.556 9.698 8.918 + 9.574 9.753 9.889 9.731 9.241 8.655 8.334 8.504 9.094 9.771 10.160 10.071 9.626 9.193 9.199 9.900 11.208 12.686 13.727 13.868 13.066 11.764 10.643 10.208 10.476 11.000 11.220 10.884 10.206 9.652 9.535 9.771 9.985 9.870 9.464 9.103 + 11.972 12.289 12.323 11.469 9.770 8.017 7.179 7.655 8.964 10.128 10.412 9.807 8.935 8.527 8.927 9.977 11.240 12.287 12.839 12.760 12.052 10.908 9.720 8.936 8.790 9.143 9.582 9.744 9.580 9.336 9.264 9.366 9.394 9.129 8.634 8.235 + 8.840 8.762 8.638 8.513 8.426 8.397 8.435 8.550 8.764 9.091 9.495 9.878 10.126 10.202 10.221 10.408 10.943 11.784 12.616 13.011 12.702 11.777 10.643 9.759 9.356 9.339 9.448 9.511 9.558 9.719 10.001 10.191 9.995 9.314 8.406 7.758 + 9.368 9.338 9.140 8.675 8.059 7.602 7.597 8.089 8.835 9.487 9.835 9.912 9.916 10.053 10.428 11.048 11.848 12.674 13.257 13.286 12.601 11.375 10.102 9.323 9.275 9.730 10.187 10.266 9.973 9.627 9.531 9.685 9.817 9.673 9.282 8.943 + 10.211 9.487 8.575 8.086 8.196 8.559 8.682 8.408 8.041 8.016 8.446 8.994 9.204 8.983 8.758 9.131 10.325 11.894 12.997 12.998 11.922 10.399 9.176 8.610 8.528 8.513 8.318 8.055 8.043 8.484 9.251 9.962 10.250 10.020 9.504 9.099 + 10.079 9.090 7.892 7.387 7.847 8.746 9.267 9.035 8.399 8.055 8.370 9.050 9.437 9.157 8.506 8.222 8.839 10.194 11.504 11.949 11.272 9.912 8.620 7.911 7.789 7.904 7.943 7.885 7.949 8.317 8.920 9.450 9.592 9.265 8.693 8.262 + 10.407 9.938 9.189 8.396 7.703 7.168 6.879 7.002 7.661 8.712 9.682 10.009 9.477 8.475 7.827 8.227 9.710 11.553 12.735 12.617 11.337 9.650 8.366 7.825 7.794 7.787 7.517 7.101 6.911 7.212 7.925 8.667 9.029 8.866 8.386 7.992 + 9.474 9.597 9.793 9.956 9.956 9.734 9.388 9.142 9.174 9.430 9.601 9.356 8.667 7.953 7.858 8.779 10.493 12.203 13.018 12.536 11.102 9.547 8.603 8.441 8.643 8.614 8.071 7.259 6.728 6.898 7.728 8.749 9.401 9.421 8.999 8.600 + 10.083 10.154 10.299 10.514 10.764 10.979 11.059 10.925 10.558 10.007 9.351 8.658 8.001 7.528 7.478 8.070 9.276 10.669 11.539 11.317 10.017 8.341 7.262 7.340 8.283 9.154 9.105 8.074 6.860 6.480 7.307 8.740 9.670 9.398 8.223 7.183 + 6.213 6.533 7.001 7.422 7.722 7.933 8.063 7.999 7.592 6.831 5.934 5.235 4.950 5.065 5.420 5.898 6.472 7.072 7.440 7.212 6.255 4.941 4.020 4.085 5.035 6.061 6.246 5.340 4.012 3.325 3.832 5.084 6.002 5.810 4.714 3.714 + 8.347 8.228 8.071 7.956 7.890 7.810 7.670 7.507 7.411 7.419 7.437 7.290 6.876 6.296 5.820 5.709 6.005 6.478 6.772 6.651 6.138 5.472 4.914 4.573 4.383 4.219 4.035 3.906 3.944 4.166 4.447 4.576 4.406 3.955 3.418 3.058 + 7.725 7.009 6.205 6.009 6.578 7.429 7.905 7.756 7.292 7.003 7.062 7.188 7.002 6.467 5.977 5.966 6.443 6.919 6.812 5.977 4.849 4.078 3.990 4.358 4.674 4.627 4.341 4.193 4.415 4.884 5.259 5.304 5.066 4.770 4.590 4.532 + 5.923 5.784 5.523 5.187 4.867 4.686 4.748 5.068 5.537 5.956 6.160 6.131 6.024 6.051 6.293 6.613 6.734 6.465 5.870 5.246 4.896 4.892 5.016 4.956 4.583 4.076 3.783 3.933 4.438 4.961 5.180 5.019 4.662 4.361 4.235 4.223 + 5.450 5.255 5.044 5.026 5.282 5.700 6.069 6.221 6.134 5.909 5.690 5.588 5.658 5.909 6.302 6.732 7.043 7.097 6.858 6.424 5.960 5.583 5.288 4.993 4.645 4.306 4.108 4.133 4.328 4.525 4.573 4.454 4.275 4.165 4.163 4.201 + 5.176 5.039 4.934 5.044 5.393 5.795 5.981 5.801 5.350 4.914 4.782 5.063 5.641 6.276 6.760 7.017 7.080 7.003 6.796 6.431 5.906 5.296 4.738 4.363 4.227 4.288 4.449 4.618 4.747 4.818 4.819 4.729 4.532 4.257 3.982 3.808 + 6.493 6.711 7.184 7.904 8.742 9.490 9.978 10.180 10.197 10.140 10.052 9.925 9.800 9.817 10.124 10.718 11.373 11.758 11.666 11.172 10.567 10.126 9.909 9.749 9.439 8.912 8.274 7.672 7.153 6.661 6.168 5.780 5.678 5.947 6.432 6.807 + 10.799 10.277 9.752 9.826 10.695 12.006 13.145 13.689 13.625 13.213 12.703 12.193 11.727 11.457 11.628 12.349 13.388 14.230 14.411 13.868 12.996 12.348 12.237 12.555 12.914 12.966 12.597 11.895 11.000 10.032 9.141 8.562 8.528 9.073 9.901 10.510 + 12.147 11.534 10.752 10.346 10.561 11.214 11.907 12.365 12.595 12.760 12.936 13.018 12.880 12.593 12.480 12.870 13.773 14.763 15.217 14.774 13.623 12.408 11.785 11.975 12.640 13.152 13.044 12.307 11.348 10.680 10.598 11.042 11.717 12.316 12.689 12.846 + 12.923 13.035 13.192 13.267 13.127 12.728 12.201 11.828 11.873 12.371 13.058 13.512 13.452 12.956 12.434 12.339 12.844 13.724 14.512 14.828 14.603 14.077 13.575 13.287 13.188 13.134 13.027 12.898 12.857 12.991 13.278 13.612 13.870 13.996 14.014 13.995 + 14.757 14.943 15.054 14.831 14.289 13.737 13.513 13.695 14.041 14.210 14.038 13.643 13.267 13.075 13.077 13.236 13.579 14.164 14.930 15.601 15.818 15.407 14.544 13.648 13.066 12.837 12.750 12.619 12.507 12.660 13.222 14.012 14.616 14.723 14.408 14.069 + 15.428 14.685 13.597 12.680 12.222 12.132 12.088 11.850 11.469 11.237 11.420 12.015 12.726 13.200 13.303 13.206 13.219 13.502 13.928 14.197 14.116 13.768 13.425 13.280 13.243 13.022 12.431 11.652 11.181 11.466 12.499 13.741 14.474 14.330 13.577 12.912 + 12.567 11.960 11.065 10.309 9.948 9.919 9.939 9.765 9.431 9.260 9.634 10.679 12.124 13.444 14.209 14.345 14.134 13.952 13.974 14.094 14.097 13.900 13.624 13.443 13.364 13.188 12.710 11.983 11.368 11.284 11.839 12.678 13.225 13.127 12.546 12.021 + 11.078 10.267 9.133 8.334 8.280 8.898 9.724 10.257 10.301 10.081 10.055 10.580 11.674 13.026 14.216 14.968 15.259 15.250 15.116 14.942 14.728 14.453 14.116 13.718 13.225 12.597 11.876 11.240 10.943 11.143 11.739 12.383 12.679 12.465 11.933 11.500 + 8.187 7.451 6.543 6.236 7.022 8.771 10.772 12.137 12.338 11.520 10.400 9.805 10.176 11.366 12.828 14.022 14.712 14.988 15.045 14.979 14.755 14.343 13.825 13.369 13.070 12.855 12.552 12.081 11.570 11.279 11.367 11.746 12.130 12.272 12.162 12.005 + 8.911 8.069 6.971 6.436 7.010 8.609 10.544 11.917 12.164 11.383 10.241 9.524 9.664 10.562 11.792 12.967 13.953 14.787 15.442 15.710 15.360 14.408 13.237 12.391 12.192 12.496 12.819 12.729 12.179 11.519 11.184 11.357 11.873 12.410 12.756 12.893 + 8.898 7.539 5.875 5.230 6.233 8.389 10.481 11.444 11.051 9.931 9.013 8.877 9.504 10.507 11.556 12.577 13.633 14.649 15.321 15.310 14.562 13.434 12.510 12.204 12.483 12.922 13.038 12.641 11.946 11.380 11.261 11.598 12.143 12.608 12.861 12.944 + 8.498 8.026 7.436 7.224 7.714 8.819 10.052 10.787 10.646 9.758 8.700 8.152 8.505 9.669 11.205 12.625 13.625 14.117 14.115 13.655 12.836 11.915 11.270 11.188 11.633 12.214 12.439 12.089 11.394 10.857 10.859 11.371 12.019 12.415 12.466 12.374 + 9.775 9.230 8.487 8.047 8.272 9.144 10.235 10.931 10.796 9.867 8.668 7.920 8.119 9.265 10.894 12.384 13.299 13.556 13.346 12.934 12.506 12.141 11.868 11.708 11.657 11.647 11.568 11.357 11.069 10.865 10.906 11.235 11.756 12.292 12.698 12.908 + 9.200 8.527 7.628 7.131 7.464 8.587 9.993 10.982 11.066 10.262 9.101 8.340 8.536 9.730 11.432 12.913 13.629 13.501 12.898 12.336 12.132 12.234 12.336 12.167 11.720 11.245 11.028 11.159 11.463 11.670 11.647 11.513 11.519 11.815 12.294 12.659 + 7.815 7.239 6.500 6.204 6.793 8.241 9.992 11.230 11.366 10.424 9.060 8.160 8.286 9.362 10.813 12.010 12.674 12.936 13.083 13.245 13.324 13.158 12.743 12.266 11.931 11.770 11.630 11.362 11.008 10.801 10.965 11.507 12.196 12.750 13.039 13.128 + 9.655 8.587 7.183 6.406 6.805 8.165 9.691 10.546 10.375 9.471 8.525 8.170 8.638 9.694 10.859 11.715 12.119 12.219 12.295 12.536 12.910 13.184 13.101 12.588 11.836 11.191 10.913 10.994 11.179 11.192 10.983 10.792 10.953 11.595 12.471 13.100 + 7.644 6.623 5.396 4.985 5.865 7.654 9.423 10.358 10.261 9.556 8.899 8.745 9.168 9.968 10.887 11.740 12.421 12.879 13.112 13.174 13.133 12.998 12.688 12.118 11.336 10.576 10.136 10.163 10.535 10.964 11.246 11.429 11.738 12.321 13.047 13.562 + 8.384 7.497 6.384 5.905 6.532 8.031 9.633 10.542 10.424 9.567 8.640 8.258 8.656 9.634 10.771 11.696 12.262 12.540 12.689 12.810 12.884 12.804 12.470 11.879 11.154 10.493 10.076 9.981 10.162 10.505 10.904 11.316 11.744 12.180 12.563 12.793 + 8.096 7.147 5.949 5.414 6.054 7.644 9.394 10.465 10.483 9.713 8.834 8.503 8.992 10.087 11.274 12.054 12.220 11.941 11.623 11.629 12.027 12.535 12.709 12.266 11.316 10.314 9.768 9.894 10.495 11.141 11.505 11.582 11.615 11.831 12.210 12.515 + 6.291 6.326 6.534 7.106 8.117 9.384 10.449 10.794 10.179 8.906 7.728 7.422 8.279 9.891 11.428 12.218 12.187 11.838 11.795 12.289 13.002 13.355 12.990 12.040 11.003 10.360 10.260 10.504 10.781 10.930 11.017 11.216 11.629 12.201 12.752 13.088 + 6.353 6.632 7.039 7.475 8.029 8.841 9.796 10.434 10.273 9.307 8.189 7.814 8.612 10.163 11.544 12.120 12.078 12.194 13.043 14.374 15.266 14.925 13.403 11.585 10.459 10.339 10.736 10.932 10.672 10.327 10.430 11.093 11.888 12.286 12.173 11.911 + 6.076 6.318 6.761 7.376 8.158 9.054 9.864 10.271 10.033 9.224 8.281 7.775 8.049 9.015 10.271 11.436 12.393 13.242 14.035 14.594 14.604 13.914 12.743 11.576 10.820 10.524 10.428 10.270 10.063 10.064 10.484 11.224 11.912 12.215 12.123 11.929 + 7.320 7.365 7.482 7.726 8.147 8.728 9.341 9.775 9.853 9.563 9.100 8.771 8.826 9.338 10.209 11.266 12.337 13.261 13.856 13.950 13.480 12.599 11.646 10.962 10.670 10.610 10.496 10.178 9.780 9.598 9.837 10.420 11.047 11.431 11.516 11.467 + 7.798 7.900 8.075 8.287 8.526 8.822 9.218 9.711 10.197 10.487 10.414 9.985 9.446 9.204 9.595 10.670 12.126 13.464 14.263 14.383 13.978 13.332 12.662 12.033 11.414 10.792 10.227 9.813 9.607 9.596 9.740 10.014 10.414 10.906 11.379 11.675 + 6.464 6.483 6.663 7.155 7.971 8.923 9.718 10.130 10.127 9.867 9.585 9.456 9.530 9.768 10.111 10.534 11.036 11.586 12.100 12.459 12.572 12.426 12.100 11.718 11.382 11.129 10.920 10.690 10.403 10.101 9.895 9.912 10.208 10.715 11.251 11.593 + 7.011 7.399 7.879 8.149 8.190 8.276 8.683 9.377 9.981 10.082 9.608 8.937 8.641 9.070 10.115 11.320 12.209 12.563 12.457 12.113 11.729 11.428 11.266 11.239 11.260 11.155 10.781 10.170 9.581 9.355 9.660 10.340 11.017 11.373 11.378 11.264 + 6.380 7.120 8.188 9.053 9.424 9.390 9.269 9.319 9.552 9.780 9.823 9.664 9.462 9.412 9.624 10.077 10.676 11.297 11.818 12.115 12.106 11.806 11.351 10.930 10.666 10.536 10.422 10.239 10.025 9.919 10.019 10.281 10.542 10.651 10.602 10.515 + 6.564 7.275 8.376 9.410 10.027 10.137 9.890 9.533 9.259 9.131 9.105 9.114 9.130 9.200 9.421 9.888 10.620 11.506 12.314 12.784 12.769 12.324 11.682 11.110 10.739 10.515 10.279 9.937 9.557 9.325 9.397 9.768 10.281 10.740 11.031 11.156 + 6.974 7.522 8.447 9.452 10.212 10.504 10.309 9.818 9.318 9.023 8.964 9.020 9.064 9.109 9.326 9.896 10.830 11.879 12.648 12.830 12.399 11.624 10.888 10.447 10.300 10.252 10.098 9.794 9.468 9.307 9.397 9.658 9.916 10.035 10.012 9.950 + 6.533 7.240 8.360 9.451 10.132 10.253 9.943 9.498 9.190 9.119 9.202 9.284 9.306 9.372 9.673 10.318 11.201 12.025 12.464 12.365 11.843 11.198 10.719 10.514 10.472 10.382 10.098 9.637 9.164 8.864 8.835 9.034 9.333 9.601 9.773 9.849 + 7.810 8.098 8.573 9.090 9.519 9.771 9.794 9.582 9.210 8.844 8.687 8.851 9.270 9.731 10.051 10.222 10.423 10.835 11.444 11.999 12.196 11.928 11.377 10.850 10.514 10.260 9.846 9.187 8.501 8.174 8.436 9.141 9.867 10.246 10.236 10.097 + 7.754 8.176 8.830 9.450 9.844 9.965 9.885 9.707 9.509 9.327 9.183 9.094 9.075 9.145 9.342 9.716 10.289 10.983 11.600 11.903 11.770 11.303 10.771 10.419 10.271 10.122 9.728 9.052 8.352 8.012 8.244 8.915 9.649 10.109 10.225 10.183 + 7.508 7.791 8.335 9.038 9.690 10.051 10.001 9.645 9.257 9.091 9.201 9.425 9.540 9.474 9.376 9.505 10.005 10.780 11.526 11.932 11.850 11.361 10.686 10.044 9.557 9.233 9.006 8.799 8.575 8.367 8.286 8.470 8.996 9.784 10.591 11.103 + 6.762 7.220 8.012 8.919 9.692 10.137 10.184 9.917 9.525 9.202 9.062 9.105 9.264 9.474 9.725 10.049 10.463 10.924 11.327 11.551 11.530 11.279 10.884 10.440 10.006 9.580 9.134 8.657 8.197 7.871 7.817 8.130 8.794 9.656 10.462 10.948 + 7.878 7.834 7.931 8.363 9.137 10.002 10.586 10.632 10.154 9.428 8.804 8.519 8.604 8.945 9.404 9.904 10.423 10.933 11.354 11.575 11.517 11.187 10.672 10.092 9.539 9.051 8.635 8.300 8.081 8.025 8.164 8.487 8.931 9.399 9.784 10.001 + 6.356 6.378 6.622 7.266 8.243 9.212 9.782 9.798 9.441 9.062 8.893 8.895 8.860 8.685 8.527 8.711 9.430 10.508 11.443 11.737 11.245 10.288 9.421 9.038 9.119 9.307 9.227 8.795 8.267 8.011 8.197 8.671 9.088 9.196 9.024 8.822 + 7.702 7.640 7.684 8.004 8.590 9.221 9.621 9.658 9.420 9.102 8.827 8.563 8.227 7.864 7.716 8.081 9.059 10.378 11.487 11.875 11.389 10.333 9.270 8.660 8.600 8.830 8.961 8.764 8.307 7.874 7.756 8.070 8.717 9.469 10.095 10.441 + 9.855 9.741 9.622 9.625 9.781 9.986 10.084 9.987 9.749 9.522 9.416 9.401 9.334 9.117 8.836 8.745 9.074 9.794 10.561 10.910 10.596 9.796 8.998 8.645 8.801 9.120 9.145 8.700 8.045 7.663 7.870 8.568 9.341 9.804 9.883 9.800 + 12.414 12.052 11.583 11.277 11.185 11.113 10.855 10.430 10.090 10.074 10.331 10.509 10.247 9.540 8.831 8.712 9.442 10.684 11.691 11.822 10.994 9.717 8.710 8.388 8.619 8.910 8.827 8.332 7.770 7.568 7.895 8.554 9.154 9.418 9.359 9.218 + 7.531 7.318 7.094 7.114 7.508 8.189 8.924 9.491 9.800 9.895 9.855 9.703 9.421 9.048 8.757 8.804 9.342 10.242 11.088 11.400 10.943 9.915 8.834 8.206 8.196 8.547 8.802 8.646 8.125 7.576 7.359 7.610 8.190 8.825 9.301 9.538 + 4.222 4.509 5.095 5.966 7.039 8.140 9.041 9.547 9.582 9.232 8.697 8.201 7.900 7.859 8.080 8.530 9.144 9.786 10.252 10.351 10.022 9.417 8.833 8.537 8.587 8.797 8.878 8.661 8.217 7.798 7.644 7.818 8.189 8.557 8.798 8.900 + 5.397 5.404 5.506 5.838 6.497 7.446 8.467 9.239 9.508 9.246 8.660 8.055 7.649 7.498 7.578 7.890 8.467 9.254 9.990 10.292 9.911 8.981 7.988 7.446 7.506 7.837 7.912 7.468 6.744 6.287 6.489 7.256 8.101 8.561 8.561 8.400 + 5.548 5.104 4.588 4.496 5.125 6.379 7.816 8.907 9.317 9.053 8.406 7.765 7.430 7.513 7.954 8.597 9.247 9.729 9.915 9.765 9.350 8.826 8.362 8.052 7.873 7.725 7.530 7.308 7.170 7.240 7.550 8.005 8.442 8.735 8.861 8.888 + 5.792 5.275 4.672 4.568 5.329 6.872 8.696 10.159 10.801 10.542 9.663 8.624 7.840 7.535 7.703 8.169 8.687 9.046 9.131 8.958 8.642 8.337 8.163 8.150 8.243 8.339 8.348 8.242 8.055 7.868 7.761 7.785 7.939 8.170 8.397 8.537 + 6.119 5.602 5.041 5.074 6.071 7.874 9.847 11.232 11.559 10.871 9.634 8.427 7.642 7.368 7.492 7.868 8.392 8.961 9.397 9.486 9.124 8.451 7.818 7.566 7.773 8.185 8.406 8.197 7.664 7.162 7.024 7.322 7.853 8.336 8.615 8.714 + 5.349 4.963 4.615 4.868 6.026 7.872 9.724 10.797 10.665 9.513 8.009 6.887 6.528 6.833 7.424 7.994 8.485 8.989 9.509 9.841 9.712 9.057 8.153 7.463 7.295 7.566 7.878 7.851 7.426 6.893 6.640 6.847 7.391 7.987 8.415 8.615 + 6.107 5.576 4.985 4.968 5.898 7.617 9.493 10.776 11.014 10.277 9.062 7.962 7.349 7.269 7.567 8.076 8.706 9.374 9.899 10.019 9.568 8.648 7.636 6.967 6.838 7.086 7.333 7.297 6.998 6.709 6.706 7.036 7.506 7.867 8.019 8.039 + 9.817 9.006 7.863 7.085 7.191 8.207 9.626 10.694 10.861 10.104 8.908 7.909 7.494 7.636 8.060 8.538 9.032 9.574 10.045 10.134 9.572 8.441 7.243 6.592 6.754 7.427 7.973 7.930 7.357 6.744 6.563 6.879 7.348 7.576 7.473 7.283 + 10.166 8.995 7.479 6.682 7.156 8.584 10.049 10.684 10.220 9.064 7.907 7.241 7.127 7.345 7.692 8.151 8.788 9.531 10.073 10.048 9.333 8.212 7.240 6.873 7.158 7.718 8.045 7.869 7.323 6.786 6.577 6.727 7.016 7.197 7.197 7.128 + 5.915 5.655 5.360 5.337 5.791 6.706 7.854 8.921 9.637 9.871 9.655 9.153 8.606 8.263 8.288 8.684 9.275 9.767 9.892 9.536 8.802 7.951 7.274 6.951 6.997 7.274 7.578 7.731 7.651 7.375 7.038 6.803 6.784 6.978 7.264 7.469 + 6.031 5.703 5.230 4.921 5.090 5.898 7.233 8.711 9.830 10.211 9.797 8.883 7.962 7.475 7.610 8.239 9.020 9.565 9.613 9.132 8.322 7.522 7.055 7.074 7.480 7.977 8.240 8.101 7.629 7.066 6.658 6.517 6.590 6.741 6.865 6.924 + 5.785 5.984 6.252 6.473 6.677 7.036 7.697 8.579 9.340 9.563 9.046 7.992 6.928 6.407 6.686 7.594 8.663 9.413 9.601 9.283 8.707 8.134 7.727 7.531 7.519 7.636 7.809 7.940 7.933 7.743 7.414 7.074 6.858 6.826 6.921 7.019 + 3.964 4.670 5.580 6.116 6.122 5.980 6.258 7.185 8.389 9.156 8.981 7.983 6.847 6.345 6.803 7.924 9.042 9.606 9.496 8.999 8.517 8.265 8.189 8.100 7.880 7.577 7.344 7.295 7.416 7.586 7.678 7.637 7.502 7.348 7.236 7.181 + 6.418 7.097 7.751 7.650 6.763 5.842 5.781 6.810 8.265 9.127 8.851 7.776 6.798 6.630 7.303 8.273 8.941 9.094 8.914 8.668 8.438 8.139 7.725 7.318 7.101 7.117 7.211 7.192 7.043 6.948 7.082 7.402 7.651 7.598 7.280 6.983 + 12.654 12.267 11.678 11.112 10.664 10.263 9.780 9.175 8.534 7.995 7.627 7.408 7.290 7.286 7.461 7.839 8.318 8.701 8.826 8.695 8.465 8.311 8.290 8.313 8.256 8.088 7.906 7.836 7.912 8.045 8.107 8.048 7.924 7.833 7.817 7.836 + 11.713 11.229 10.467 9.723 9.234 9.067 9.111 9.157 9.019 8.621 8.031 7.433 7.047 7.026 7.377 7.947 8.489 8.782 8.746 8.467 8.127 7.886 7.795 7.804 7.828 7.831 7.842 7.910 8.048 8.215 8.354 8.437 8.482 8.522 8.569 8.604 + 7.629 7.618 7.656 7.826 8.157 8.574 8.905 8.971 8.723 8.305 7.990 8.002 8.364 8.897 9.368 9.667 9.851 10.021 10.164 10.122 9.750 9.098 8.457 8.164 8.345 8.802 9.174 9.235 9.061 8.928 9.025 9.264 9.355 9.093 8.580 8.168 + 6.862 6.880 7.074 7.583 8.345 9.084 9.496 9.473 9.172 8.872 8.759 8.819 8.917 8.962 8.997 9.125 9.367 9.600 9.644 9.427 9.074 8.822 8.840 9.096 9.391 9.512 9.388 9.122 8.896 8.833 8.933 9.101 9.234 9.283 9.268 9.241 + 8.805 8.821 8.908 9.100 9.352 9.538 9.542 9.356 9.104 8.955 9.005 9.207 9.413 9.494 9.431 9.318 9.268 9.319 9.409 9.441 9.378 9.282 9.263 9.385 9.614 9.838 9.962 9.977 9.966 10.028 10.197 10.412 10.568 10.599 10.532 10.459 + 8.145 8.968 10.118 10.964 11.164 10.830 10.332 9.972 9.794 9.677 9.546 9.477 9.605 9.950 10.353 10.596 10.575 10.367 10.124 9.928 9.754 9.566 9.430 9.497 9.858 10.415 10.913 11.128 11.037 10.823 10.696 10.713 10.754 10.676 10.475 10.300 + 7.970 8.446 9.179 9.859 10.258 10.336 10.218 10.082 10.035 10.065 10.086 10.042 9.965 9.963 10.135 10.478 10.865 11.105 11.055 10.714 10.238 9.860 9.761 9.973 10.368 10.733 10.902 10.835 10.627 10.430 10.356 10.419 10.558 10.690 10.770 10.802 + 8.898 8.936 8.974 8.988 9.029 9.201 9.574 10.076 10.489 10.564 10.198 9.556 9.013 8.931 9.420 10.234 10.894 10.984 10.411 9.470 8.666 8.413 8.802 9.584 10.349 10.777 10.794 10.554 10.296 10.185 10.238 10.356 10.428 10.401 10.310 10.234 + 7.668 8.090 8.592 8.808 8.686 8.521 8.672 9.209 9.839 10.159 10.018 9.643 9.444 9.672 10.237 10.807 11.072 10.923 10.445 9.794 9.126 8.604 8.412 8.672 9.303 9.990 10.352 10.218 9.777 9.444 9.528 9.985 10.477 10.684 10.573 10.389 + 7.215 7.569 8.146 8.750 9.220 9.483 9.572 9.575 9.582 9.635 9.715 9.759 9.722 9.637 9.633 9.868 10.395 11.063 11.541 11.506 10.879 9.920 9.099 8.783 9.001 9.441 9.717 9.675 9.499 9.526 9.925 10.539 11.002 11.057 10.773 10.481 + 8.567 8.610 8.716 8.867 8.970 8.929 8.754 8.611 8.713 9.139 9.730 10.205 10.386 10.364 10.415 10.748 11.287 11.698 11.649 11.092 10.324 9.782 9.736 10.132 10.677 11.070 11.178 11.043 10.779 10.473 10.187 9.993 9.974 10.153 10.437 10.651 + 5.432 6.534 8.127 9.407 9.890 9.685 9.331 9.363 9.930 10.740 11.322 11.391 11.032 10.602 10.450 10.678 11.098 11.391 11.328 10.905 10.329 9.875 9.738 9.945 10.366 10.800 11.076 11.123 10.983 10.774 10.623 10.601 10.709 10.889 11.064 11.170 + 5.282 5.560 5.995 6.461 6.945 7.539 8.317 9.210 10.009 10.492 10.583 10.393 10.135 9.989 10.032 10.249 10.569 10.881 11.032 10.883 10.417 9.818 9.419 9.485 10.006 10.660 11.037 10.943 10.552 10.256 10.340 10.760 11.207 11.390 11.282 11.112 + 6.559 6.903 7.477 8.108 8.643 9.017 9.265 9.474 9.692 9.870 9.893 9.684 9.310 8.999 9.024 9.513 10.312 11.033 11.267 10.848 9.978 9.120 8.718 8.929 9.539 10.125 10.339 10.115 9.681 9.362 9.360 9.640 10.004 10.260 10.351 10.352 + 7.671 7.361 7.084 7.238 7.942 8.937 9.771 10.111 9.928 9.433 8.889 8.468 8.259 8.339 8.768 9.495 10.271 10.721 10.573 9.874 9.010 8.470 8.529 9.080 9.742 10.138 10.136 9.878 9.629 9.584 9.769 10.093 10.436 10.723 10.922 11.022 + 8.002 8.024 8.134 8.409 8.880 9.500 10.165 10.733 11.032 10.902 10.270 9.256 8.191 7.495 7.432 7.924 8.580 8.953 8.859 8.496 8.278 8.497 9.095 9.722 10.020 9.890 9.529 9.240 9.195 9.361 9.612 9.888 10.233 10.689 11.176 11.503 + 9.948 9.912 9.770 9.522 9.346 9.490 10.019 10.652 10.905 10.462 9.469 8.482 8.074 8.424 9.207 9.868 10.030 9.695 9.143 8.645 8.308 8.111 8.058 8.223 8.641 9.184 9.582 9.616 9.316 8.962 8.875 9.178 9.730 10.272 10.627 10.779 + 5.870 5.994 6.247 6.673 7.364 8.361 9.514 10.457 10.768 10.246 9.089 7.824 7.014 6.953 7.551 8.444 9.222 9.597 9.456 8.858 8.025 7.306 7.061 7.459 8.320 9.172 9.539 9.283 8.715 8.372 8.606 9.330 10.121 10.578 10.633 10.528 + 4.557 5.036 5.792 6.609 7.429 8.330 9.323 10.187 10.537 10.105 9.008 7.744 6.911 6.857 7.519 8.530 9.466 10.025 10.068 9.602 8.786 7.947 7.486 7.658 8.359 9.125 9.430 9.078 8.377 7.911 8.093 8.847 9.703 10.205 10.262 10.141 + 5.524 5.961 6.604 7.212 7.741 8.335 9.094 9.863 10.272 10.024 9.177 8.158 7.496 7.480 8.023 8.793 9.457 9.821 9.819 9.450 8.797 8.091 7.686 7.858 8.558 9.364 9.735 9.422 8.680 8.090 8.108 8.730 9.535 10.067 10.195 10.130 + 6.446 6.311 6.159 6.187 6.589 7.435 8.582 9.692 10.373 10.378 9.738 8.760 7.870 7.428 7.593 8.288 9.243 10.088 10.482 10.264 9.559 8.756 8.322 8.520 9.229 10.007 10.392 10.219 9.722 9.328 9.318 9.619 9.912 9.924 9.671 9.416 + 9.031 8.381 7.305 6.226 5.659 5.983 7.194 8.830 10.182 10.679 10.207 9.145 8.098 7.544 7.622 8.153 8.810 9.284 9.375 9.042 8.436 7.888 7.777 8.299 9.282 10.230 10.620 10.271 9.479 8.793 8.610 8.895 9.271 9.379 9.180 8.941 + 8.153 7.828 7.293 6.777 6.580 6.945 7.892 9.139 10.188 10.570 10.107 9.022 7.829 7.073 7.056 7.710 8.661 9.430 9.678 9.365 8.764 8.306 8.332 8.879 9.639 10.138 10.039 9.362 8.475 7.841 7.704 7.954 8.256 8.333 8.174 7.989 + 7.136 6.797 6.361 6.177 6.506 7.377 8.561 9.674 10.340 10.334 9.657 8.527 7.301 6.366 6.013 6.337 7.200 8.283 9.221 9.776 9.929 9.857 9.797 9.879 10.046 10.117 9.934 9.493 8.951 8.520 8.322 8.318 8.365 8.342 8.239 8.143 + 7.429 6.919 6.164 5.611 5.699 6.608 8.080 9.485 10.148 9.758 8.566 7.207 6.292 6.053 6.306 6.706 7.028 7.259 7.470 7.659 7.740 7.683 7.622 7.773 8.224 8.798 9.158 9.079 8.645 8.179 7.957 7.975 7.983 7.752 7.321 6.971 + 13.209 13.333 13.387 13.193 12.805 12.489 12.493 12.802 13.135 13.164 12.788 12.190 11.674 11.435 11.479 11.711 12.062 12.497 12.928 13.164 13.023 12.498 11.819 11.283 11.009 10.839 10.524 10.022 9.604 9.623 10.129 10.700 10.721 9.901 8.597 7.615 + 15.601 15.107 14.411 13.922 13.907 14.330 14.879 15.175 15.025 14.525 13.948 13.512 13.235 12.994 12.737 12.606 12.840 13.512 14.347 14.851 14.671 13.891 12.986 12.432 12.312 12.281 11.943 11.295 10.804 10.998 11.896 12.839 12.931 11.785 9.940 8.551 + 14.649 13.602 12.345 11.889 12.634 14.070 15.197 15.287 14.387 13.176 12.364 12.164 12.249 12.183 11.893 11.748 12.177 13.203 14.318 14.839 14.446 13.436 12.469 12.018 12.014 11.972 11.503 10.727 10.226 10.522 11.549 12.571 12.697 11.591 9.815 8.487 + 10.781 10.290 9.669 9.386 9.696 10.468 11.269 11.635 11.337 10.467 9.340 8.297 7.584 7.318 7.533 8.184 9.106 10.001 10.511 10.393 9.677 8.674 7.788 7.270 7.092 7.040 6.962 6.937 7.213 7.941 8.941 9.716 9.771 8.991 7.803 6.932 + 6.986 6.821 6.641 6.685 7.151 8.057 9.171 10.074 10.352 9.828 8.668 7.313 6.262 5.857 6.166 7.009 8.053 8.931 9.351 9.205 8.632 7.979 7.611 7.681 8.006 8.190 7.933 7.298 6.703 6.602 7.111 7.877 8.336 8.160 7.526 6.977 + 4.986 5.110 5.445 6.089 7.039 8.146 9.148 9.775 9.866 9.423 8.599 7.649 6.866 6.520 6.778 7.614 8.759 9.753 10.148 9.753 8.786 7.773 7.235 7.348 7.828 8.144 7.925 7.252 6.604 6.491 7.049 7.928 8.555 8.581 8.139 7.709 + 7.355 6.746 6.131 6.190 7.089 8.360 9.317 9.605 9.399 9.102 8.909 8.657 8.114 7.365 6.885 7.161 8.221 9.503 10.234 10.001 9.046 8.042 7.554 7.668 8.030 8.217 8.074 7.754 7.513 7.482 7.621 7.836 8.083 8.363 8.643 8.827 + 6.770 6.245 5.796 6.056 7.087 8.331 9.127 9.299 9.234 9.390 9.744 9.758 8.929 7.420 6.120 6.011 7.349 9.383 10.872 10.987 9.870 8.422 7.561 7.579 8.074 8.414 8.264 7.766 7.314 7.211 7.499 8.036 8.655 9.244 9.719 9.990 + 6.459 6.155 5.961 6.307 7.216 8.272 8.984 9.209 9.218 9.350 9.613 9.632 9.029 7.874 6.778 6.479 7.265 8.718 9.995 10.425 9.930 8.976 8.156 7.770 7.738 7.804 7.817 7.819 7.938 8.223 8.606 8.973 9.266 9.489 9.655 9.752 + 5.239 5.469 5.958 6.661 7.396 7.945 8.246 8.471 8.863 9.440 9.877 9.716 8.801 7.543 6.730 6.981 8.249 9.803 10.712 10.492 9.389 8.136 7.400 7.364 7.729 8.059 8.136 8.058 8.067 8.314 8.765 9.274 9.711 10.026 10.227 10.326 + 3.705 4.142 4.923 5.837 6.607 7.062 7.306 7.665 8.389 9.309 9.825 9.333 7.803 6.007 5.099 5.802 7.825 9.997 11.071 10.575 9.077 7.688 7.226 7.701 8.469 8.821 8.518 7.865 7.376 7.377 7.846 8.542 9.220 9.756 10.119 10.304 + 5.219 5.548 6.016 6.351 6.373 6.159 6.053 6.457 7.496 8.806 9.677 9.527 8.371 6.920 6.148 6.631 8.129 9.756 10.597 10.304 9.246 8.143 7.541 7.519 7.811 8.116 8.321 8.463 8.574 8.610 8.533 8.427 8.479 8.803 9.293 9.661 + 5.384 5.872 6.500 6.823 6.654 6.245 6.152 6.816 8.161 9.517 10.017 9.225 7.536 6.000 5.639 6.748 8.692 10.369 10.978 10.503 9.576 8.895 8.708 8.758 8.657 8.280 7.842 7.618 7.653 7.754 7.752 7.743 8.025 8.772 9.770 10.490 + 6.295 6.290 6.270 6.211 6.110 6.059 6.265 6.934 8.038 9.178 9.739 9.306 8.061 6.778 6.357 7.179 8.821 10.340 10.948 10.520 9.575 8.782 8.455 8.432 8.379 8.167 7.956 7.963 8.183 8.393 8.412 8.340 8.502 9.111 9.991 10.646 + 6.134 6.708 7.354 7.509 7.060 6.484 6.487 7.410 8.892 10.062 10.146 9.028 7.357 6.123 6.020 7.034 8.529 9.706 10.090 9.738 9.071 8.527 8.297 8.300 8.335 8.266 8.103 7.944 7.886 7.966 8.171 8.473 8.848 9.254 9.612 9.826 + 3.804 5.158 6.832 7.607 7.065 5.903 5.339 6.105 7.849 9.430 9.803 8.796 7.185 6.083 6.153 7.253 8.668 9.668 9.929 9.577 8.946 8.318 7.830 7.518 7.394 7.440 7.576 7.676 7.646 7.514 7.434 7.590 8.062 8.761 9.457 9.889 + 3.823 4.690 5.733 6.178 5.854 5.353 5.512 6.664 8.288 9.375 9.200 7.895 6.357 5.605 6.088 7.450 8.879 9.686 9.684 9.152 8.506 8.008 7.695 7.499 7.382 7.353 7.391 7.402 7.279 7.031 6.832 6.952 7.562 8.579 9.659 10.353 + 4.948 5.470 6.041 6.192 5.945 5.845 6.461 7.795 9.150 9.611 8.765 7.072 5.580 5.211 6.167 7.870 9.418 10.159 9.981 9.207 8.288 7.558 7.169 7.136 7.370 7.696 7.888 7.785 7.412 7.000 6.856 7.175 7.924 8.867 9.701 10.182 + 4.659 5.508 6.456 6.702 6.143 5.518 5.769 7.184 9.048 10.134 9.634 7.788 5.731 4.696 5.216 6.880 8.729 9.918 10.137 9.600 8.748 7.958 7.429 7.211 7.253 7.421 7.529 7.429 7.125 6.800 6.719 7.063 7.808 8.740 9.569 10.049 + 5.973 6.262 6.645 6.921 7.091 7.388 8.062 9.093 10.062 10.353 9.584 7.963 6.281 5.484 6.081 7.799 9.728 10.875 10.751 9.599 8.147 7.099 6.730 6.848 7.058 7.084 6.906 6.674 6.541 6.579 6.821 7.317 8.111 9.133 10.134 10.764 + 6.624 6.489 6.315 6.239 6.386 6.850 7.666 8.734 9.726 10.130 9.515 7.916 6.022 4.896 5.315 7.179 9.466 10.871 10.672 9.199 7.521 6.626 6.749 7.343 7.653 7.351 6.716 6.283 6.340 6.761 7.234 7.622 8.053 8.689 9.447 9.985 + 7.094 6.802 6.384 6.107 6.230 6.873 7.929 9.058 9.788 9.740 8.852 7.493 6.333 6.015 6.775 8.281 9.793 10.588 10.362 9.351 8.112 7.146 6.633 6.445 6.368 6.312 6.337 6.522 6.833 7.134 7.326 7.452 7.664 8.060 8.549 8.895 + 4.498 4.608 4.660 4.581 4.599 5.123 6.335 7.875 8.972 8.977 7.897 6.454 5.602 5.873 7.070 8.496 9.478 9.759 9.477 8.881 8.106 7.190 6.258 5.587 5.460 5.913 6.646 7.212 7.332 7.086 6.821 6.874 7.349 8.084 8.790 9.211 + 4.972 5.469 6.117 6.554 6.728 6.910 7.361 7.994 8.371 8.069 7.092 5.960 5.354 5.643 6.654 7.859 8.772 9.203 9.219 8.925 8.340 7.478 6.505 5.749 5.500 5.773 6.268 6.595 6.573 6.358 6.294 6.632 7.355 8.225 8.958 9.362 + 6.673 6.921 7.097 6.895 6.369 5.939 6.029 6.664 7.406 7.694 7.290 6.466 5.780 5.655 6.134 6.948 7.783 8.453 8.866 8.908 8.438 7.449 6.223 5.267 5.011 5.494 6.314 6.907 6.951 6.574 6.231 6.355 7.080 8.183 9.251 9.896 + 8.421 7.976 7.452 7.289 7.657 8.329 8.854 8.875 8.348 7.510 6.686 6.108 5.865 5.965 6.387 7.060 7.809 8.373 8.513 8.158 7.458 6.695 6.127 5.869 5.880 6.037 6.208 6.298 6.268 6.166 6.143 6.408 7.100 8.152 9.246 9.949 + 8.608 8.499 8.502 8.774 9.156 9.238 8.731 7.783 6.925 6.645 6.976 7.474 7.611 7.241 6.714 6.543 6.940 7.633 8.113 8.067 7.602 7.100 6.866 6.908 7.016 7.011 6.894 6.790 6.782 6.840 6.916 7.067 7.437 8.089 8.852 9.376 + 7.775 7.650 7.734 8.293 9.136 9.652 9.300 8.112 6.739 5.968 6.114 6.822 7.413 7.475 7.162 6.969 7.231 7.808 8.215 8.063 7.391 6.624 6.227 6.378 6.904 7.484 7.877 8.011 7.924 7.684 7.386 7.178 7.219 7.559 8.050 8.410 + 7.386 7.513 7.809 8.233 8.563 8.495 7.894 6.967 6.184 5.959 6.366 7.110 7.780 8.152 8.292 8.394 8.535 8.595 8.390 7.883 7.255 6.777 6.613 6.733 6.991 7.259 7.471 7.573 7.471 7.093 6.521 6.039 5.981 6.466 7.246 7.830 + 7.461 7.380 7.440 7.800 8.288 8.466 8.006 7.046 6.160 5.938 6.513 7.441 8.060 8.001 7.440 6.898 6.792 7.122 7.531 7.623 7.253 6.568 5.843 5.289 5.004 5.017 5.311 5.794 6.272 6.521 6.455 6.211 6.069 6.220 6.592 6.903 + 8.462 7.689 6.883 6.828 7.605 8.502 8.645 7.782 6.490 5.638 5.621 6.055 6.211 5.735 4.988 4.707 5.314 6.512 7.514 7.670 6.925 5.772 4.788 4.238 4.026 3.962 3.992 4.200 4.624 5.141 5.556 5.783 5.915 6.097 6.356 6.559 + 8.672 8.266 7.660 7.113 6.782 6.661 6.665 6.729 6.816 6.850 6.683 6.187 5.419 4.692 4.429 4.867 5.830 6.783 7.155 6.716 5.710 4.660 4.008 3.848 3.959 4.050 4.011 3.973 4.155 4.657 5.362 6.014 6.390 6.434 6.274 6.118 + 8.001 6.972 5.779 5.381 5.994 6.955 7.370 6.914 6.047 5.493 5.537 5.826 5.831 5.456 5.162 5.470 6.354 7.158 7.143 6.177 4.894 4.167 4.382 5.161 5.758 5.725 5.239 4.830 4.845 5.174 5.444 5.433 5.260 5.192 5.327 5.500 + 7.231 7.282 7.417 7.629 7.817 7.821 7.531 6.989 6.371 5.875 5.599 5.516 5.556 5.698 5.975 6.391 6.833 7.092 6.988 6.505 5.821 5.201 4.836 4.754 4.859 5.033 5.208 5.369 5.492 5.527 5.424 5.186 4.887 4.619 4.444 4.365 + 9.213 8.523 7.671 7.256 7.457 7.906 8.042 7.595 6.780 6.063 5.745 5.756 5.807 5.725 5.608 5.685 6.031 6.442 6.592 6.326 5.796 5.332 5.165 5.275 5.466 5.580 5.609 5.642 5.716 5.757 5.677 5.495 5.352 5.379 5.558 5.727 + 8.596 8.143 7.587 7.313 7.404 7.590 7.516 7.067 6.454 5.997 5.836 5.853 5.855 5.813 5.893 6.241 6.753 7.071 6.864 6.128 5.238 4.673 4.649 4.977 5.261 5.232 4.951 4.703 4.720 4.983 5.266 5.335 5.122 4.741 4.373 4.158 + 8.541 7.924 7.170 6.828 7.068 7.565 7.814 7.558 6.960 6.397 6.099 5.993 5.860 5.621 5.441 5.554 5.974 6.403 6.444 5.931 5.085 4.357 4.090 4.298 4.722 5.069 5.218 5.226 5.190 5.127 4.983 4.733 4.437 4.197 4.069 4.028 + 9.994 9.823 9.569 9.293 8.942 8.371 7.504 6.459 5.525 4.991 4.955 5.287 5.745 6.144 6.424 6.592 6.625 6.459 6.072 5.564 5.128 4.918 4.937 5.051 5.125 5.153 5.251 5.524 5.933 6.283 6.364 6.112 5.642 5.160 4.816 4.652 + 8.106 8.000 7.966 8.141 8.412 8.443 7.948 6.978 5.958 5.412 5.597 6.328 7.125 7.550 7.459 7.008 6.460 5.991 5.640 5.375 5.175 5.037 4.932 4.803 4.624 4.463 4.462 4.716 5.165 5.596 5.769 5.578 5.106 4.553 4.107 3.870 + 5.954 5.951 6.206 6.883 7.725 8.147 7.711 6.560 5.385 4.896 5.273 6.056 6.571 6.497 6.064 5.748 5.790 5.989 5.951 5.505 4.879 4.473 4.476 4.705 4.817 4.667 4.459 4.544 5.063 5.784 6.263 6.191 5.593 4.766 4.050 3.654 + 5.301 4.938 4.460 4.191 4.313 4.747 5.208 5.382 5.112 4.479 3.759 3.283 3.277 3.750 4.475 5.094 5.304 5.034 4.489 4.017 3.871 4.030 4.219 4.136 3.694 3.109 2.735 2.794 3.206 3.661 3.855 3.701 3.352 3.034 2.865 2.818 + 3.486 3.585 3.854 4.318 4.849 5.186 5.103 4.590 3.902 3.400 3.316 3.601 3.994 4.229 4.236 4.163 4.228 4.521 4.923 5.199 5.182 4.884 4.471 4.114 3.871 3.677 3.441 3.158 2.920 2.830 2.888 2.968 2.906 2.637 2.261 1.990 + 2.887 2.984 3.454 4.452 5.669 6.446 6.298 5.360 4.301 3.761 3.841 4.115 4.129 3.886 3.820 4.301 5.185 5.882 5.899 5.319 4.726 4.639 4.986 5.165 4.625 3.429 2.236 1.722 1.986 2.497 2.622 2.201 1.637 1.434 1.689 2.024 + 4.276 3.781 3.205 3.035 3.447 4.175 4.737 4.796 4.378 3.796 3.408 3.403 3.746 4.253 4.681 4.809 4.525 3.938 3.393 3.329 3.961 5.049 5.955 6.040 5.131 3.672 2.419 1.890 2.031 2.343 2.359 2.030 1.697 1.710 2.067 2.419 + 4.847 4.340 3.761 3.631 4.132 4.950 5.504 5.381 4.653 3.812 3.408 3.653 4.304 4.883 5.049 4.814 4.472 4.325 4.452 4.711 4.922 5.063 5.269 5.662 6.170 6.512 6.401 5.778 4.889 4.123 3.737 3.695 3.748 3.669 3.441 3.238 + 5.174 4.508 3.757 3.619 4.355 5.572 6.509 6.591 5.821 4.716 3.881 3.589 3.674 3.792 3.770 3.740 3.955 4.491 5.120 5.490 5.458 5.253 5.317 5.929 6.933 7.814 8.077 7.626 6.824 6.192 5.990 6.038 5.911 5.349 4.517 3.896 + 4.849 4.631 4.335 4.190 4.391 4.949 5.617 5.984 5.728 4.860 3.751 2.898 2.597 2.777 3.134 3.419 3.633 3.946 4.458 5.050 5.482 5.646 5.711 5.990 6.632 7.440 7.992 7.989 7.507 6.916 6.554 6.442 6.318 5.941 5.365 4.922 + 6.532 5.672 4.521 3.812 3.926 4.649 5.360 5.479 4.852 3.806 2.885 2.498 2.708 3.276 3.866 4.236 4.320 4.197 4.023 3.978 4.208 4.782 5.635 6.568 7.321 7.687 7.614 7.216 6.702 6.263 6.000 5.909 5.925 5.978 6.024 6.047 + 4.940 4.299 3.591 3.471 4.125 5.115 5.753 5.641 4.938 4.156 3.713 3.658 3.747 3.759 3.699 3.733 3.969 4.326 4.637 4.858 5.145 5.707 6.569 7.477 8.058 8.088 7.649 7.038 6.538 6.257 6.140 6.101 6.116 6.203 6.343 6.454 + 4.919 4.773 4.594 4.524 4.628 4.847 5.060 5.190 5.267 5.397 5.635 5.890 5.945 5.621 4.954 4.249 3.929 4.269 5.210 6.391 7.383 7.952 8.153 8.199 8.244 8.252 8.078 7.644 7.064 6.577 6.366 6.417 6.548 6.577 6.473 6.357 + 4.517 4.713 4.960 5.081 5.004 4.832 4.784 5.051 5.658 6.422 7.026 7.177 6.758 5.904 4.958 4.321 4.274 4.844 5.797 6.770 7.467 7.793 7.862 7.865 7.918 7.981 7.919 7.638 7.176 6.694 6.365 6.263 6.339 6.479 6.593 6.649 + 6.161 5.592 4.869 4.469 4.554 4.906 5.217 5.410 5.672 6.173 6.777 7.061 6.689 5.784 4.938 4.790 5.534 6.747 7.728 8.026 7.746 7.382 7.368 7.744 8.178 8.289 7.952 7.347 6.757 6.341 6.071 5.829 5.546 5.248 5.006 4.876 + 4.854 4.903 4.952 4.999 5.153 5.567 6.278 7.107 7.737 7.925 7.670 7.188 6.746 6.504 6.503 6.753 7.283 8.067 8.906 9.450 9.415 8.834 8.102 7.709 7.851 8.267 8.444 8.052 7.212 6.377 5.921 5.825 5.736 5.343 4.700 4.196 + 5.340 4.994 4.530 4.272 4.449 5.067 5.923 6.745 7.356 7.746 7.999 8.160 8.192 8.052 7.839 7.823 8.265 9.157 10.106 10.533 10.085 8.950 7.782 7.261 7.587 8.335 8.784 8.458 7.451 6.283 5.448 5.038 4.774 4.349 3.763 3.318 + 4.741 4.099 3.466 3.573 4.589 5.974 6.938 7.103 6.786 6.671 7.190 8.162 8.999 9.267 9.082 8.993 9.451 10.360 11.102 11.029 10.007 8.553 7.464 7.235 7.738 8.377 8.563 8.115 7.302 6.546 6.063 5.730 5.265 4.526 3.678 3.101 + 5.276 4.870 4.455 4.507 5.197 6.258 7.187 7.623 7.588 7.416 7.450 7.791 8.288 8.762 9.215 9.816 10.656 11.517 11.907 11.403 10.047 8.445 7.438 7.533 8.535 9.665 10.092 9.491 8.200 6.888 6.024 5.571 5.141 4.429 3.531 2.886 + 5.054 4.748 4.560 4.928 5.872 6.925 7.520 7.473 7.126 7.039 7.506 8.329 9.057 9.437 9.650 10.111 10.997 11.957 12.296 11.525 9.821 8.012 7.052 7.389 8.675 10.035 10.646 10.223 9.071 7.755 6.677 5.870 5.134 4.313 3.497 2.969 + 5.647 5.186 4.733 4.827 5.609 6.707 7.545 7.817 7.706 7.685 8.091 8.864 9.649 10.166 10.467 10.846 11.482 12.152 12.315 11.531 9.892 8.086 7.006 7.170 8.371 9.818 10.648 10.431 9.347 7.945 6.734 5.895 5.312 4.802 4.328 4.020 + 4.104 4.413 4.995 5.757 6.543 7.183 7.581 7.782 7.955 8.280 8.823 9.488 10.101 10.553 10.886 11.226 11.616 11.885 11.707 10.843 9.400 7.886 6.972 7.087 8.125 9.486 10.437 10.537 9.845 8.785 7.809 7.118 6.644 6.232 5.843 5.585 + 5.250 4.804 4.362 4.452 5.247 6.439 7.515 8.159 8.451 8.708 9.161 9.769 10.319 10.680 10.935 11.261 11.676 11.925 11.627 10.604 9.096 7.684 6.956 7.170 8.134 9.351 10.298 10.649 10.354 9.575 8.592 7.694 7.087 6.829 6.824 6.890 + 5.360 5.024 4.711 4.839 5.540 6.553 7.437 7.918 8.073 8.220 8.641 9.359 10.160 10.790 11.147 11.290 11.305 11.163 10.723 9.876 8.710 7.543 6.798 6.787 7.552 8.826 10.141 11.007 11.106 10.413 9.209 7.949 7.048 6.677 6.710 6.847 + 5.429 5.127 4.790 4.776 5.288 6.215 7.188 7.824 8.001 7.963 8.135 8.793 9.814 10.741 11.119 10.827 10.144 9.485 9.043 8.658 8.041 7.150 6.358 6.242 7.125 8.752 10.396 11.301 11.143 10.164 8.913 7.858 7.165 6.753 6.500 6.364 + 5.628 5.336 4.986 4.897 5.264 6.029 6.903 7.566 7.880 7.983 8.165 8.631 9.321 9.946 10.209 10.036 9.599 9.138 8.733 8.253 7.548 6.698 6.080 6.148 7.071 8.536 9.896 10.562 10.348 9.519 8.539 7.749 7.223 6.866 6.596 6.432 + 6.718 6.390 6.004 5.897 6.227 6.860 7.478 7.815 7.837 7.732 7.741 7.965 8.303 8.566 8.638 8.550 8.394 8.192 7.842 7.231 6.418 5.708 5.510 6.056 7.194 8.430 9.224 9.318 8.858 8.232 7.758 7.484 7.238 6.859 6.388 6.050 + 6.115 5.893 5.657 5.663 6.025 6.642 7.294 7.796 8.091 8.225 8.247 8.157 7.944 7.656 7.426 7.388 7.577 7.889 8.149 8.241 8.181 8.082 8.045 8.076 8.090 7.996 7.775 7.493 7.234 7.030 6.836 6.576 6.211 5.778 5.384 5.148 + 6.682 6.676 6.749 6.985 7.377 7.820 8.188 8.407 8.463 8.355 8.070 7.636 7.184 6.942 7.100 7.643 8.312 8.749 8.747 8.397 8.000 7.822 7.893 8.009 7.939 7.618 7.185 6.826 6.604 6.422 6.143 5.749 5.358 5.114 5.050 5.071 + 6.746 6.856 7.073 7.386 7.761 8.143 8.465 8.655 8.650 8.414 7.974 7.447 7.027 6.901 7.145 7.653 8.168 8.426 8.313 7.924 7.491 7.216 7.136 7.125 7.011 6.718 6.317 5.965 5.770 5.711 5.649 5.434 5.005 4.435 3.893 3.565 + 7.191 7.207 7.095 6.752 6.296 6.034 6.228 6.855 7.591 8.039 8.007 7.614 7.149 6.841 6.732 6.738 6.785 6.872 7.008 7.133 7.135 6.957 6.682 6.474 6.419 6.415 6.248 5.787 5.130 4.538 4.218 4.147 4.104 3.891 3.530 3.243 + 11.848 11.422 10.815 10.353 10.227 10.380 10.558 10.488 10.054 9.356 8.627 8.085 7.820 7.775 7.822 7.845 7.797 7.687 7.541 7.367 7.156 6.899 6.609 6.324 6.090 5.930 5.833 5.750 5.620 5.389 5.038 4.588 4.097 3.639 3.288 3.097 + 12.445 11.616 10.485 9.716 9.636 10.044 10.415 10.313 9.666 8.734 7.871 7.289 7.018 6.993 7.153 7.439 7.744 7.910 7.825 7.505 7.097 6.751 6.499 6.251 5.915 5.529 5.257 5.250 5.490 5.772 5.836 5.554 5.004 4.390 3.906 3.652 + 7.958 8.039 7.977 7.530 6.676 5.680 4.934 4.687 4.884 5.234 5.434 5.391 5.271 5.354 5.828 6.663 7.631 8.449 8.919 9.003 8.799 8.454 8.079 7.699 7.281 6.790 6.258 5.794 5.517 5.458 5.489 5.375 4.923 4.139 3.277 2.709 + 6.625 6.682 6.809 6.985 7.122 7.077 6.747 6.164 5.525 5.092 5.030 5.294 5.660 5.913 6.028 6.205 6.700 7.575 8.581 9.295 9.418 8.998 8.386 7.952 7.791 7.671 7.268 6.482 5.552 4.858 4.593 4.582 4.443 3.930 3.181 2.621 + 7.617 7.072 6.524 6.567 7.310 8.231 8.586 7.999 6.757 5.568 5.001 5.093 5.427 5.581 5.532 5.660 6.369 7.663 9.064 9.936 9.949 9.296 8.499 7.990 7.807 7.653 7.223 6.500 5.771 5.356 5.301 5.310 4.981 4.160 3.115 2.382 + 8.897 7.844 6.746 6.704 7.907 9.433 10.029 9.172 7.474 6.100 5.771 6.219 6.567 6.220 5.450 5.157 6.047 7.971 9.990 11.077 10.841 9.707 8.474 7.701 7.409 7.259 6.947 6.441 5.912 5.507 5.204 4.860 4.363 3.745 3.165 2.813 + 5.522 5.056 4.850 5.624 7.312 8.975 9.516 8.566 6.770 5.239 4.664 4.879 5.198 5.171 5.037 5.483 6.961 9.191 11.280 12.332 12.024 10.718 9.103 7.736 6.833 6.350 6.168 6.169 6.201 6.069 5.636 4.940 4.197 3.646 3.375 3.299 + 6.558 6.114 5.846 6.380 7.690 9.033 9.544 8.932 7.675 6.547 5.970 5.773 5.558 5.241 5.225 6.024 7.697 9.667 11.077 11.397 10.732 9.606 8.499 7.556 6.699 5.923 5.418 5.383 5.747 6.118 6.058 5.422 4.456 3.569 3.017 2.793 + 6.080 5.564 5.323 6.143 7.969 9.830 10.607 9.946 8.481 7.215 6.662 6.543 6.272 5.694 5.323 5.857 7.434 9.367 10.610 10.540 9.368 7.852 6.659 5.956 5.529 5.203 5.065 5.293 5.829 6.289 6.247 5.606 4.687 3.942 3.586 3.507 + 2.469 3.438 5.153 7.163 8.868 9.750 9.642 8.835 7.891 7.267 7.031 6.900 6.561 6.007 5.592 5.754 6.637 7.934 9.052 9.488 9.100 8.123 6.961 5.962 5.308 5.037 5.090 5.327 5.534 5.497 5.111 4.460 3.772 3.261 3.002 2.920 + 5.584 5.297 5.359 6.332 8.009 9.435 9.684 8.671 7.231 6.386 6.477 6.953 6.994 6.334 5.526 5.414 6.341 7.828 8.993 9.268 8.748 7.932 7.189 6.519 5.777 5.045 4.675 4.940 5.644 6.166 5.938 4.937 3.697 2.841 2.573 2.616 + 6.209 6.470 7.071 7.980 8.893 9.322 8.924 7.785 6.417 5.414 5.056 5.173 5.369 5.409 5.421 5.752 6.630 7.916 9.154 9.868 9.851 9.240 8.370 7.551 6.947 6.585 6.424 6.397 6.414 6.371 6.201 5.918 5.615 5.394 5.290 5.264 + 7.181 7.453 8.009 8.732 9.290 9.263 8.451 7.096 5.786 5.073 5.096 5.515 5.829 5.810 5.694 5.973 6.960 8.487 9.973 10.796 10.679 9.814 8.688 7.774 7.310 7.264 7.448 7.645 7.696 7.539 7.218 6.859 6.608 6.538 6.611 6.700 + 7.231 7.354 7.806 8.673 9.628 10.056 9.521 8.186 6.738 5.869 5.744 5.947 5.942 5.617 5.407 5.881 7.175 8.800 9.985 10.261 9.767 9.049 8.587 8.462 8.425 8.221 7.826 7.407 7.106 6.900 6.675 6.403 6.196 6.184 6.351 6.521 + 6.973 6.903 7.017 7.539 8.361 9.036 9.089 8.390 7.269 6.273 5.767 5.733 5.883 5.980 6.048 6.308 6.929 7.831 8.715 9.285 9.454 9.357 9.205 9.104 9.006 8.798 8.423 7.920 7.383 6.893 6.491 6.199 6.035 6.000 6.051 6.107 + 5.624 5.582 5.855 6.756 8.121 9.295 9.566 8.700 7.123 5.610 4.752 4.642 4.980 5.422 5.839 6.304 6.890 7.541 8.133 8.608 9.016 9.400 9.665 9.608 9.109 8.289 7.475 6.957 6.763 6.666 6.415 5.971 5.531 5.317 5.359 5.476 + 6.840 6.407 6.007 6.163 6.988 8.055 8.708 8.548 7.678 6.557 5.629 5.055 4.736 4.548 4.507 4.736 5.286 6.031 6.740 7.266 7.642 8.015 8.463 8.892 9.103 8.954 8.474 7.829 7.192 6.650 6.211 5.875 5.675 5.633 5.707 5.790 + 6.112 6.171 6.386 6.866 7.602 8.369 8.781 8.502 7.514 6.213 5.200 4.883 5.174 5.577 5.613 5.250 4.949 5.260 6.303 7.604 8.455 8.500 8.034 7.736 8.054 8.799 9.299 8.980 7.862 6.541 5.695 5.572 5.892 6.189 6.239 6.160 + 5.188 5.341 5.635 6.090 6.742 7.534 8.217 8.432 7.962 6.978 5.979 5.428 5.368 5.397 5.083 4.450 4.072 4.595 6.106 7.922 9.071 9.070 8.324 7.761 8.011 8.867 9.503 9.254 8.223 7.170 6.798 7.129 7.539 7.403 6.714 6.069 + 5.249 5.522 6.110 7.018 8.112 9.083 9.540 9.224 8.192 6.839 5.678 5.027 4.839 4.826 4.778 4.790 5.177 6.120 7.384 8.384 8.621 8.098 7.354 7.036 7.355 7.921 8.116 7.676 6.957 6.631 7.058 7.928 8.501 8.259 7.381 6.611 + 5.442 5.593 6.019 6.807 7.821 8.674 8.916 8.329 7.105 5.755 4.792 4.408 4.406 4.434 4.333 4.294 4.676 5.628 6.852 7.735 7.795 7.071 6.117 5.599 5.796 6.428 6.942 6.997 6.728 6.567 6.810 7.318 7.646 7.461 6.875 6.367 + 6.098 6.571 7.277 7.882 8.136 7.965 7.441 6.720 5.990 5.431 5.148 5.084 5.023 4.746 4.267 3.928 4.191 5.232 6.658 7.668 7.602 6.476 5.045 4.277 4.632 5.746 6.754 7.008 6.547 5.962 5.801 6.080 6.329 6.106 5.455 4.885 + 5.796 5.973 6.337 6.852 7.374 7.665 7.496 6.818 5.840 4.952 4.494 4.519 4.759 4.834 4.569 4.156 4.005 4.379 5.118 5.711 5.689 5.024 4.188 3.808 4.171 5.011 5.733 5.895 5.528 5.040 4.819 4.902 4.999 4.822 4.391 4.022 + 4.768 5.057 5.581 6.196 6.657 6.713 6.269 5.492 4.741 4.339 4.355 4.552 4.586 4.293 3.853 3.660 4.002 4.797 5.593 5.881 5.461 4.603 3.857 3.657 4.023 4.584 4.878 4.710 4.255 3.874 3.798 3.954 4.062 3.911 3.551 3.250 + 4.441 5.195 6.375 7.465 7.979 7.678 6.678 5.379 4.259 3.626 3.487 3.598 3.675 3.598 3.487 3.577 4.014 4.703 5.347 5.642 5.479 5.021 4.586 4.421 4.549 4.772 4.831 4.588 4.118 3.636 3.349 3.333 3.519 3.769 3.970 4.075 + 4.544 5.286 6.313 7.039 7.126 6.622 5.802 4.915 4.082 3.376 2.922 2.855 3.167 3.632 3.956 4.037 4.069 4.360 4.992 5.665 5.904 5.485 4.679 4.068 4.065 4.567 5.053 5.049 4.532 3.922 3.677 3.895 4.268 4.417 4.259 4.040 + 4.649 5.394 6.515 7.465 7.801 7.381 6.397 5.243 4.307 3.808 3.734 3.901 4.084 4.158 4.159 4.237 4.519 4.979 5.418 5.579 5.344 4.842 4.378 4.224 4.412 4.716 4.833 4.620 4.205 3.866 3.805 3.985 4.190 4.222 4.077 3.920 + 4.255 5.015 6.107 7.002 7.427 7.459 7.307 7.040 6.533 5.669 4.573 3.623 3.191 3.370 3.922 4.493 4.879 5.101 5.257 5.339 5.236 4.907 4.529 4.407 4.716 5.303 5.769 5.788 5.377 4.871 4.623 4.706 4.896 4.918 4.725 4.518 + 4.955 5.146 5.441 5.770 6.149 6.616 7.081 7.275 6.903 5.919 4.659 3.683 3.400 3.790 4.448 4.919 5.036 4.982 5.057 5.378 5.798 6.089 6.182 6.224 6.408 6.742 7.012 6.963 6.534 5.919 5.406 5.151 5.092 5.068 4.993 4.915 + 5.095 5.414 5.935 6.510 7.024 7.379 7.432 7.019 6.092 4.873 3.821 3.381 3.667 4.366 4.968 5.157 5.033 4.966 5.229 5.744 6.178 6.291 6.186 6.225 6.668 7.386 7.928 7.898 7.294 6.507 5.990 5.905 6.054 6.133 6.030 5.886 + 4.823 5.191 5.763 6.323 6.729 6.936 6.933 6.683 6.165 5.471 4.856 4.630 4.949 5.680 6.456 6.895 6.833 6.369 5.753 5.195 4.798 4.596 4.633 4.955 5.528 6.175 6.650 6.800 6.680 6.512 6.502 6.680 6.905 7.013 6.971 6.889 + 3.869 4.439 5.418 6.530 7.463 7.970 7.950 7.464 6.686 5.823 5.059 4.546 4.404 4.697 5.365 6.181 6.802 6.917 6.443 5.596 4.795 4.434 4.663 5.332 6.115 6.722 7.044 7.156 7.203 7.277 7.372 7.421 7.373 7.238 7.080 6.975 + 4.834 5.070 5.668 6.628 7.621 8.102 7.705 6.584 5.354 4.663 4.744 5.320 5.918 6.273 6.459 6.672 6.921 6.967 6.582 5.849 5.194 5.077 5.618 6.501 7.230 7.517 7.450 7.326 7.344 7.451 7.452 7.250 6.938 6.700 6.621 6.634 + 5.022 5.438 6.243 7.283 8.221 8.646 8.312 7.344 6.206 5.435 5.323 5.777 6.439 6.952 7.157 7.092 6.866 6.536 6.114 5.656 5.311 5.256 5.568 6.145 6.753 7.172 7.313 7.234 7.062 6.892 6.755 6.640 6.541 6.463 6.415 6.396 + 4.288 4.935 5.910 6.743 7.048 6.709 5.913 5.028 4.399 4.189 4.348 4.694 5.050 5.326 5.512 5.607 5.573 5.353 4.939 4.441 4.062 3.993 4.296 4.848 5.397 5.704 5.669 5.367 4.984 4.690 4.553 4.523 4.501 4.424 4.307 4.218 + 4.591 4.878 5.425 6.124 6.750 7.018 6.726 5.888 4.747 3.645 2.846 2.430 2.335 2.486 2.876 3.531 4.384 5.197 5.639 5.485 4.800 3.946 3.372 3.330 3.720 4.181 4.354 4.126 3.673 3.279 3.101 3.057 2.933 2.595 2.129 1.790 + 4.010 4.467 5.229 6.055 6.706 7.018 6.937 6.504 5.832 5.056 4.300 3.665 3.246 3.157 3.522 4.385 5.591 6.741 7.325 7.009 5.895 4.539 3.646 3.619 4.282 5.020 5.242 4.823 4.168 3.838 4.050 4.478 4.531 3.882 2.796 1.965 + 2.478 3.475 4.912 6.105 6.729 6.948 7.126 7.427 7.664 7.506 6.816 5.796 4.861 4.393 4.587 5.443 6.770 8.156 9.001 8.754 7.311 5.270 3.691 3.425 4.465 5.899 6.591 6.067 4.871 4.052 4.212 4.957 5.251 4.393 2.715 1.369 + 2.420 3.149 4.292 5.430 6.297 6.887 7.350 7.798 8.178 8.307 8.005 7.248 6.234 5.357 5.076 5.695 7.124 8.783 9.796 9.467 7.776 5.520 3.888 3.705 4.860 6.399 7.233 6.940 6.013 5.363 5.501 6.098 6.314 5.589 4.207 3.108 + 0.729 2.160 4.180 5.714 6.189 5.855 5.486 5.734 6.659 7.745 8.338 8.123 7.327 6.551 6.390 7.098 8.436 9.769 10.365 9.775 8.126 6.115 4.648 4.300 4.948 5.888 6.370 6.161 5.672 5.537 5.988 6.589 6.583 5.581 3.993 2.796 + 1.407 2.638 4.358 5.644 6.065 5.914 5.869 6.394 7.396 8.346 8.732 8.429 7.750 7.216 7.248 7.967 9.139 10.236 10.625 9.877 8.088 5.960 4.476 4.292 5.262 6.514 7.100 6.719 5.926 5.598 6.117 6.966 7.153 6.108 4.277 2.858 + 2.843 3.583 4.669 5.576 5.983 5.962 5.890 6.161 6.893 7.833 8.517 8.597 8.095 7.449 7.260 7.902 9.213 10.508 10.948 10.070 8.134 6.029 4.742 4.742 5.701 6.766 7.196 6.875 6.315 6.150 6.549 7.034 6.878 5.761 4.126 2.925 + 2.911 3.234 3.822 4.532 5.167 5.582 5.810 6.078 6.637 7.517 8.429 8.938 8.816 8.288 7.937 8.271 9.282 10.354 10.646 9.694 7.796 5.865 4.853 5.146 6.355 7.634 8.263 8.061 7.380 6.728 6.350 6.096 5.632 4.800 3.812 3.132 + 2.656 3.211 3.998 4.602 4.806 4.730 4.733 5.162 6.109 7.343 8.434 8.991 8.895 8.392 7.986 8.145 8.968 10.026 10.554 9.928 8.154 5.992 4.546 4.557 5.886 7.594 8.596 8.390 7.324 6.211 5.630 5.498 5.267 4.510 3.384 2.534 + 3.035 3.291 3.645 3.893 3.926 3.828 3.853 4.299 5.321 6.793 8.299 9.305 9.465 8.891 8.163 8.003 8.753 10.028 10.866 10.375 8.432 5.912 4.170 4.107 5.516 7.240 8.046 7.545 6.407 5.711 5.977 6.718 6.889 5.856 4.031 2.610 + 3.982 3.925 3.925 4.099 4.464 4.916 5.344 5.755 6.290 7.081 8.066 8.939 9.340 9.165 8.734 8.605 9.135 10.094 10.723 10.256 8.552 6.333 4.751 4.585 5.669 7.029 7.642 7.212 6.336 5.908 6.297 6.989 7.033 5.907 4.068 2.668 + 1.115 1.953 3.216 4.350 4.991 5.147 5.120 5.279 5.849 6.816 7.953 8.924 9.441 9.433 9.139 9.000 9.340 10.046 10.523 10.082 8.517 6.424 4.891 4.734 5.853 7.265 7.861 7.281 6.170 5.580 6.006 6.918 7.211 6.209 4.340 2.867 + 1.946 2.323 2.953 3.664 4.324 4.880 5.334 5.736 6.181 6.795 7.640 8.611 9.427 9.811 9.725 9.463 9.434 9.771 10.123 9.875 8.693 6.928 5.481 5.150 5.970 7.147 7.667 7.126 6.037 5.341 5.540 6.219 6.413 5.497 3.827 2.512 + 1.151 1.862 2.956 4.024 4.860 5.518 6.157 6.842 7.506 8.067 8.533 8.965 9.352 9.578 9.556 9.380 9.292 9.428 9.581 9.282 8.221 6.653 5.365 5.126 6.042 7.400 8.203 7.963 7.072 6.396 6.435 6.836 6.707 5.489 3.586 2.143 + -1.014 0.144 1.935 3.694 5.049 6.031 6.834 7.531 8.021 8.234 8.292 8.430 8.748 9.089 9.205 9.063 8.924 9.057 9.372 9.379 8.633 7.259 6.031 5.795 6.708 8.000 8.562 7.890 6.539 5.622 5.777 6.541 6.743 5.602 3.534 1.905 + 1.104 1.557 2.368 3.429 4.670 5.992 7.173 7.911 8.035 7.707 7.369 7.410 7.833 8.259 8.311 8.025 7.861 8.249 9.074 9.651 9.292 7.985 6.519 5.864 6.315 7.205 7.493 6.734 5.526 4.962 5.562 6.673 6.966 5.633 3.230 1.348 + 0.696 1.327 2.402 3.674 4.953 6.107 6.994 7.453 7.438 7.145 6.953 7.165 7.746 8.350 8.641 8.633 8.680 9.091 9.714 9.951 9.254 7.704 6.076 5.269 5.553 6.331 6.675 6.186 5.360 5.106 5.806 6.820 6.956 5.547 3.179 1.361 + 1.937 2.208 2.718 3.428 4.293 5.249 6.182 6.968 7.535 7.915 8.209 8.475 8.679 8.754 8.733 8.791 9.086 9.528 9.703 9.136 7.728 5.993 4.810 4.788 5.763 6.861 7.175 6.492 5.462 5.017 5.514 6.364 6.507 5.354 3.390 1.880 + 4.006 3.975 3.915 3.909 4.139 4.774 5.790 6.919 7.803 8.252 8.363 8.375 8.431 8.472 8.389 8.235 8.232 8.509 8.827 8.643 7.558 5.782 4.149 3.552 4.235 5.543 6.429 6.285 5.408 4.662 4.656 5.181 5.426 4.778 3.458 2.383 + 4.412 4.283 4.134 4.121 4.364 4.867 5.508 6.101 6.503 6.673 6.665 6.556 6.396 6.226 6.121 6.187 6.453 6.759 6.768 6.166 4.943 3.506 2.489 2.330 2.950 3.798 4.266 4.145 3.750 3.606 3.949 4.492 4.667 4.142 3.159 2.385 + 4.074 3.949 3.894 4.125 4.681 5.379 5.955 6.263 6.361 6.409 6.495 6.547 6.434 6.138 5.838 5.786 6.063 6.431 6.445 5.782 4.533 3.214 2.449 2.548 3.288 4.079 4.380 4.070 3.476 3.073 3.100 3.396 3.575 3.376 2.894 2.493 + 3.455 3.646 3.836 3.889 3.948 4.350 5.283 6.507 7.446 7.606 6.972 6.025 5.368 5.293 5.645 6.051 6.247 6.205 5.993 5.611 4.995 4.201 3.513 3.278 3.603 4.185 4.522 4.333 3.813 3.453 3.562 3.950 4.077 3.568 2.608 1.844 + 4.820 4.542 4.058 3.565 3.378 3.782 4.805 6.105 7.108 7.348 6.770 5.769 4.935 4.697 5.101 5.852 6.513 6.728 6.337 5.403 4.194 3.113 2.550 2.685 3.345 4.066 4.375 4.104 3.491 2.976 2.839 2.989 3.072 2.817 2.298 1.874 + 5.434 4.709 3.742 3.188 3.444 4.397 5.497 6.119 5.962 5.217 4.394 3.964 4.063 4.481 4.896 5.129 5.221 5.281 5.294 5.094 4.534 3.700 2.929 2.586 2.779 3.256 3.600 3.562 3.231 2.912 2.807 2.821 2.654 2.116 1.358 0.800 + 5.330 4.900 4.250 3.674 3.377 3.380 3.553 3.744 3.913 4.152 4.599 5.295 6.106 6.780 7.086 6.951 6.496 5.943 5.481 5.188 5.048 5.027 5.131 5.387 5.773 6.168 6.392 6.305 5.903 5.339 4.838 4.583 4.624 4.877 5.181 5.380 + 6.991 6.393 5.658 5.336 5.648 6.328 6.863 6.922 6.616 6.406 6.741 7.719 9.023 10.127 10.622 10.403 9.659 8.719 7.898 7.421 7.403 7.845 8.630 9.535 10.292 10.689 10.641 10.204 9.533 8.824 8.256 7.963 7.992 8.276 8.649 8.906 + 6.287 6.548 7.002 7.513 7.903 8.033 7.894 7.633 7.472 7.580 7.972 8.534 9.127 9.672 10.146 10.500 10.613 10.359 9.743 9.002 8.528 8.651 9.410 10.498 11.424 11.788 11.481 10.705 9.810 9.097 8.705 8.607 8.696 8.856 9.004 9.090 + 7.949 7.262 6.472 6.257 6.842 7.843 8.613 8.775 8.477 8.201 8.336 8.903 9.630 10.229 10.596 10.774 10.786 10.563 10.061 9.427 8.997 9.085 9.729 10.628 11.342 11.579 11.341 10.832 10.257 9.703 9.198 8.815 8.679 8.850 9.211 9.500 + 8.993 8.449 7.782 7.508 7.837 8.523 9.064 9.088 8.625 8.073 7.904 8.347 9.264 10.260 10.922 11.015 10.539 9.690 8.768 8.091 7.903 8.282 9.092 10.025 10.731 10.978 10.755 10.242 9.690 9.294 9.122 9.139 9.261 9.410 9.534 9.603 + 8.319 8.296 8.387 8.721 9.253 9.749 9.937 9.720 9.269 8.917 8.939 9.369 10.003 10.554 10.830 10.800 10.542 10.132 9.618 9.071 8.654 8.585 9.007 9.833 10.737 11.309 11.303 10.793 10.116 9.639 9.523 9.645 9.737 9.615 9.326 9.084 + 9.131 8.704 8.269 8.297 8.889 9.686 10.152 9.997 9.371 8.705 8.377 8.505 8.981 9.647 10.393 11.098 11.553 11.512 10.897 9.960 9.200 9.056 9.593 10.454 11.124 11.288 11.010 10.604 10.347 10.294 10.303 10.222 10.021 9.784 9.604 9.519 + 9.665 8.972 8.086 7.624 7.859 8.562 9.240 9.533 9.439 9.224 9.155 9.318 9.640 10.033 10.470 10.922 11.258 11.275 10.863 10.163 9.539 9.352 9.709 10.399 11.055 11.400 11.376 11.081 10.635 10.112 9.591 9.224 9.181 9.512 10.040 10.435 + 10.470 9.936 9.270 8.965 9.241 9.910 10.551 10.826 10.678 10.290 9.900 9.661 9.629 9.809 10.178 10.624 10.932 10.878 10.397 9.688 9.115 8.970 9.273 9.779 10.177 10.306 10.208 10.010 9.769 9.454 9.058 8.699 8.573 8.782 9.203 9.537 + 10.006 9.623 9.214 9.157 9.481 9.834 9.800 9.277 8.573 8.143 8.218 8.667 9.168 9.496 9.644 9.686 9.597 9.232 8.524 7.672 7.092 7.115 7.702 8.433 8.817 8.664 8.198 7.840 7.854 8.170 8.505 8.626 8.511 8.303 8.142 8.071 + 8.114 7.555 6.877 6.624 7.034 7.865 8.579 8.735 8.292 7.604 7.151 7.220 7.757 8.460 8.998 9.177 8.984 8.512 7.892 7.258 6.753 6.505 6.570 6.883 7.279 7.583 7.720 7.750 7.798 7.937 8.111 8.160 7.948 7.477 6.926 6.556 + 8.367 7.615 6.634 6.090 6.331 7.163 8.036 8.435 8.196 7.532 6.823 6.352 6.198 6.279 6.473 6.674 6.805 6.809 6.673 6.465 6.307 6.299 6.442 6.636 6.766 6.803 6.823 6.933 7.161 7.422 7.582 7.560 7.381 7.146 6.951 6.847 + 7.284 6.888 6.243 5.587 5.156 5.092 5.385 5.866 6.271 6.364 6.070 5.538 5.076 4.968 5.280 5.805 6.193 6.200 5.863 5.457 5.271 5.383 5.615 5.719 5.610 5.455 5.522 5.918 6.466 6.819 6.735 6.263 5.696 5.325 5.225 5.256 + 5.950 5.293 4.517 4.235 4.622 5.289 5.636 5.355 4.649 4.007 3.781 3.948 4.226 4.376 4.384 4.374 4.410 4.400 4.227 3.934 3.745 3.879 4.338 4.873 5.192 5.201 5.054 4.980 5.051 5.134 5.050 4.780 4.494 4.383 4.471 4.599 + 3.925 3.559 3.265 3.485 4.206 4.944 5.158 4.726 4.008 3.485 3.328 3.325 3.211 3.017 3.070 3.618 4.467 5.040 4.845 3.940 2.947 2.571 3.046 3.991 4.777 5.066 5.020 5.044 5.353 5.768 5.913 5.586 4.922 4.250 3.808 3.623 + 4.607 3.846 2.927 2.551 2.953 3.744 4.274 4.180 3.638 3.146 3.072 3.373 3.718 3.828 3.720 3.637 3.780 4.124 4.472 4.666 4.724 4.780 4.909 5.040 5.048 4.920 4.802 4.877 5.177 5.521 5.639 5.379 4.810 4.154 3.628 3.349 + 5.093 5.065 4.992 4.861 4.684 4.495 4.332 4.201 4.075 3.923 3.748 3.610 3.597 3.760 4.065 4.393 4.601 4.611 4.460 4.275 4.197 4.288 4.502 4.730 4.873 4.915 4.911 4.941 5.032 5.133 5.141 4.966 4.594 4.106 3.648 3.371 + 5.798 5.512 5.152 4.963 5.018 5.174 5.197 4.952 4.492 3.989 3.603 3.411 3.441 3.717 4.245 4.935 5.550 5.798 5.517 4.821 4.062 3.619 3.669 4.104 4.653 5.083 5.321 5.427 5.473 5.467 5.375 5.195 4.990 4.840 4.778 4.770 + 5.582 5.418 5.006 4.348 3.663 3.316 3.537 4.204 4.891 5.176 4.964 4.544 4.342 4.585 5.152 5.705 5.965 5.871 5.543 5.132 4.739 4.437 4.333 4.539 5.049 5.679 6.147 6.279 6.137 5.954 5.904 5.938 5.839 5.455 4.893 4.473 + 6.107 5.778 5.271 4.804 4.544 4.531 4.681 4.857 4.953 4.934 4.832 4.696 4.561 4.449 4.383 4.401 4.534 4.776 5.062 5.292 5.381 5.307 5.131 4.961 4.894 4.976 5.190 5.477 5.765 5.980 6.059 5.959 5.681 5.290 4.907 4.670 + 4.506 4.436 4.468 4.782 5.382 6.050 6.483 6.491 6.106 5.522 4.948 4.504 4.213 4.081 4.131 4.375 4.753 5.122 5.337 5.350 5.247 5.172 5.213 5.340 5.451 5.482 5.471 5.527 5.724 6.015 6.242 6.233 5.917 5.379 4.823 4.472 + 5.170 5.681 6.308 6.591 6.377 5.905 5.575 5.602 5.871 6.096 6.086 5.877 5.637 5.471 5.342 5.167 4.951 4.813 4.848 5.007 5.116 5.050 4.878 4.824 5.055 5.509 5.929 6.082 5.955 5.746 5.653 5.673 5.623 5.344 4.899 4.555 + 11.161 10.337 9.080 7.900 7.109 6.703 6.506 6.402 6.432 6.687 7.117 7.474 7.474 7.025 6.330 5.748 5.528 5.648 5.869 5.961 5.886 5.794 5.854 6.085 6.338 6.431 6.310 6.101 5.995 6.091 6.307 6.442 6.325 5.946 5.471 5.145 + 8.923 8.582 7.938 7.142 6.469 6.175 6.280 6.503 6.463 5.997 5.323 4.859 4.857 5.179 5.432 5.336 4.983 4.724 4.813 5.148 5.372 5.244 4.894 4.716 4.984 5.575 6.075 6.181 5.990 5.884 6.108 6.470 6.479 5.823 4.740 3.908 + 3.815 3.933 4.151 4.466 4.914 5.504 6.142 6.620 6.736 6.457 5.973 5.570 5.406 5.387 5.262 4.879 4.366 4.065 4.262 4.932 5.719 6.184 6.124 5.697 5.282 5.192 5.477 5.941 6.320 6.448 6.307 5.965 5.500 4.994 4.549 4.283 + 5.567 5.351 5.130 5.130 5.387 5.728 5.936 5.944 5.849 5.775 5.721 5.579 5.290 4.966 4.835 5.024 5.412 5.705 5.683 5.410 5.183 5.264 5.638 6.026 6.135 5.933 5.669 5.651 5.962 6.383 6.573 6.345 5.781 5.135 4.638 4.385 + 6.450 6.191 5.800 5.452 5.267 5.252 5.321 5.373 5.370 5.345 5.359 5.431 5.508 5.507 5.378 5.158 4.946 4.831 4.831 4.886 4.913 4.882 4.837 4.858 4.995 5.226 5.479 5.679 5.796 5.833 5.790 5.646 5.378 5.010 4.641 4.407 + 6.980 7.034 6.946 6.555 5.941 5.409 5.225 5.380 5.595 5.581 5.297 4.968 4.849 4.979 5.173 5.227 5.135 5.084 5.233 5.514 5.680 5.549 5.218 5.003 5.154 5.616 6.062 6.185 5.964 5.645 5.479 5.462 5.353 4.950 4.342 3.879 + 10.021 9.590 8.910 8.243 7.790 7.592 7.522 7.359 6.899 6.070 5.004 4.016 3.484 3.643 4.416 5.404 6.079 6.097 5.515 4.750 4.296 4.389 4.883 5.401 5.644 5.593 5.462 5.463 5.607 5.711 5.586 5.214 4.770 4.457 4.344 4.343 + 7.305 7.501 7.815 8.096 8.150 7.837 7.150 6.243 5.353 4.682 4.331 4.314 4.613 5.170 5.827 6.300 6.286 5.677 4.719 3.923 3.750 4.275 5.105 5.660 5.597 5.047 4.482 4.315 4.583 4.964 5.078 4.803 4.329 3.945 3.785 3.771 + 6.640 6.965 7.467 7.944 8.249 8.365 8.371 8.371 8.420 8.499 8.553 8.543 8.476 8.404 8.390 8.470 8.620 8.756 8.764 8.555 8.120 7.547 6.977 6.520 6.202 5.967 5.745 5.534 5.405 5.441 5.642 5.900 6.059 6.034 5.877 5.736 + 8.672 8.737 8.842 8.950 9.030 9.070 9.077 9.076 9.096 9.157 9.248 9.327 9.343 9.281 9.196 9.191 9.334 9.579 9.751 9.636 9.127 8.322 7.479 6.855 6.545 6.444 6.364 6.206 6.038 6.027 6.271 6.703 7.128 7.376 7.426 7.391 + 7.185 7.375 7.540 7.429 6.972 6.318 5.700 5.224 4.799 4.258 3.562 2.892 2.530 2.627 3.048 3.443 3.499 3.175 2.726 2.517 2.745 3.304 3.877 4.171 4.113 3.875 3.719 3.802 4.082 4.377 4.503 4.395 4.119 3.805 3.561 3.434 + 7.024 7.224 7.366 7.168 6.588 5.843 5.205 4.776 4.456 4.123 3.804 3.661 3.788 4.057 4.182 3.965 3.493 3.065 2.933 3.078 3.265 3.294 3.204 3.218 3.481 3.875 4.107 4.003 3.708 3.566 3.784 4.193 4.370 4.025 3.308 2.728 + 7.667 7.538 7.129 6.351 5.377 4.591 4.312 4.533 4.923 5.099 4.926 4.575 4.310 4.230 4.195 4.006 3.623 3.215 2.993 3.011 3.139 3.222 3.243 3.320 3.537 3.815 3.961 3.879 3.705 3.709 4.024 4.475 4.689 4.428 3.833 3.344 + 6.008 5.831 5.543 5.261 5.124 5.204 5.443 5.652 5.621 5.270 4.715 4.206 3.945 3.953 4.067 4.083 3.919 3.673 3.531 3.617 3.902 4.239 4.467 4.510 4.392 4.195 4.005 3.890 3.894 4.018 4.200 4.320 4.265 4.011 3.668 3.425 + 5.432 5.582 5.767 5.835 5.695 5.389 5.072 4.926 5.048 5.384 5.767 6.017 6.051 5.916 5.739 5.627 5.609 5.632 5.634 5.597 5.550 5.528 5.519 5.475 5.360 5.209 5.134 5.259 5.629 6.161 6.673 6.978 6.983 6.735 6.399 6.167 + 4.767 4.697 4.658 4.740 4.903 4.976 4.793 4.338 3.791 3.406 3.330 3.511 3.758 3.902 3.917 3.901 3.956 4.077 4.150 4.066 3.833 3.584 3.471 3.529 3.637 3.611 3.355 2.949 2.599 2.483 2.622 2.861 2.993 2.910 2.681 2.491 + 5.884 5.475 4.815 4.143 3.660 3.447 3.446 3.526 3.575 3.553 3.491 3.437 3.409 3.395 3.384 3.404 3.505 3.704 3.943 4.108 4.099 3.909 3.629 3.378 3.221 3.132 3.044 2.933 2.841 2.831 2.898 2.939 2.821 2.501 2.091 1.803 + 5.347 5.320 5.262 5.168 5.031 4.864 4.698 4.566 4.474 4.378 4.217 3.972 3.706 3.539 3.558 3.736 3.937 4.008 3.896 3.681 3.500 3.422 3.390 3.288 3.061 2.784 2.614 2.648 2.833 3.003 3.010 2.840 2.610 2.454 2.415 2.434 + 5.306 5.193 5.017 4.823 4.609 4.350 4.064 3.843 3.794 3.937 4.156 4.272 4.193 3.993 3.852 3.894 4.083 4.252 4.267 4.137 3.991 3.932 3.916 3.785 3.430 2.928 2.520 2.430 2.683 3.077 3.331 3.281 2.964 2.552 2.214 2.036 + 3.356 3.697 4.290 4.969 5.519 5.754 5.604 5.165 4.661 4.334 4.309 4.530 4.802 4.916 4.777 4.440 4.059 3.780 3.663 3.673 3.736 3.793 3.824 3.822 3.779 3.680 3.534 3.391 3.321 3.359 3.460 3.513 3.413 3.145 2.813 2.584 + 2.669 3.327 4.221 4.849 5.003 4.852 4.698 4.661 4.599 4.321 3.844 3.426 3.344 3.626 4.025 4.243 4.197 4.054 4.025 4.129 4.172 3.963 3.525 3.103 2.931 3.015 3.141 3.106 2.930 2.821 2.938 3.179 3.240 2.909 2.306 1.829 + 5.483 4.792 3.944 3.558 3.838 4.438 4.800 4.643 4.179 3.890 4.078 4.607 5.040 5.024 4.576 4.027 3.723 3.746 3.911 3.978 3.879 3.742 3.724 3.838 3.928 3.820 3.475 3.028 2.679 2.547 2.611 2.759 2.885 2.946 2.956 2.950 + 4.274 4.301 4.401 4.579 4.723 4.673 4.374 3.979 3.769 3.928 4.358 4.725 4.711 4.274 3.694 3.357 3.456 3.852 4.213 4.288 4.094 3.857 3.787 3.882 3.941 3.753 3.297 2.777 2.468 2.514 2.817 3.115 3.170 2.923 2.527 2.236 + 4.708 4.419 4.103 4.054 4.358 4.833 5.199 5.297 5.169 4.954 4.739 4.516 4.274 4.076 4.027 4.147 4.309 4.324 4.131 3.875 3.787 3.954 4.198 4.224 3.889 3.365 3.006 3.031 3.321 3.521 3.373 2.959 2.633 2.685 3.065 3.420 + 3.039 3.488 4.184 4.848 5.285 5.446 5.381 5.154 4.816 4.442 4.159 4.106 4.335 4.751 5.160 5.405 5.474 5.489 5.586 5.798 6.049 6.244 6.372 6.506 6.719 6.996 7.249 7.408 7.495 7.598 7.770 7.943 7.977 7.794 7.475 7.228 + 4.177 4.598 5.234 5.783 6.018 5.887 5.513 5.096 4.789 4.630 4.553 4.463 4.309 4.108 3.929 3.835 3.847 3.943 4.077 4.223 4.385 4.585 4.842 5.139 5.431 5.666 5.818 5.905 5.974 6.065 6.178 6.276 6.312 6.271 6.185 6.118 + 5.437 5.226 5.116 5.390 5.958 6.368 6.180 5.371 4.377 3.744 3.674 3.891 3.928 3.553 2.965 2.591 2.700 3.196 3.734 4.037 4.088 4.065 4.121 4.243 4.315 4.270 4.152 4.032 3.888 3.604 3.121 2.556 2.162 2.117 2.353 2.595 + 5.037 5.349 5.776 6.039 5.936 5.454 4.774 4.153 3.781 3.681 3.729 3.756 3.664 3.473 3.272 3.140 3.084 3.059 3.026 2.989 2.982 3.021 3.065 3.044 2.916 2.717 2.545 2.491 2.577 2.743 2.900 2.988 3.008 2.994 2.980 2.976 + 4.737 4.618 4.391 4.081 3.738 3.437 3.266 3.286 3.486 3.769 3.988 4.036 3.911 3.721 3.605 3.624 3.718 3.749 3.625 3.377 3.155 3.116 3.308 3.633 3.913 4.005 3.885 3.643 3.404 3.252 3.197 3.196 3.201 3.191 3.169 3.151 + 3.014 3.477 4.035 4.282 4.116 3.779 3.570 3.540 3.471 3.160 2.696 2.437 2.675 3.320 3.913 3.993 3.489 2.786 2.398 2.561 3.083 3.569 3.760 3.691 3.549 3.441 3.316 3.108 2.898 2.891 3.201 3.670 3.947 3.791 3.305 2.886 + 1.739 2.383 3.222 3.723 3.666 3.249 2.835 2.618 2.515 2.352 2.111 1.976 2.125 2.514 2.870 2.942 2.736 2.509 2.524 2.796 3.086 3.153 2.986 2.799 2.787 2.902 2.887 2.550 1.998 1.586 1.616 2.056 2.567 2.806 2.719 2.545 + 2.224 2.433 2.612 2.545 2.286 2.127 2.302 2.725 3.037 2.939 2.491 2.078 2.068 2.466 2.922 3.059 2.829 2.551 2.602 3.054 3.607 3.863 3.669 3.223 2.850 2.709 2.712 2.692 2.631 2.669 2.905 3.204 3.261 2.879 2.211 1.690 + 2.924 2.622 2.330 2.362 2.713 3.038 2.969 2.463 1.863 1.608 1.857 2.368 2.731 2.729 2.503 2.386 2.581 2.992 3.342 3.441 3.338 3.236 3.259 3.331 3.267 2.976 2.580 2.320 2.354 2.624 2.917 3.033 2.922 2.678 2.440 2.304 + 2.242 2.750 3.360 3.596 3.304 2.757 2.410 2.513 2.929 3.280 3.271 2.916 2.484 2.254 2.309 2.530 2.756 2.935 3.125 3.385 3.669 3.837 3.767 3.453 3.008 2.587 2.310 2.234 2.361 2.638 2.942 3.098 2.954 2.506 1.938 1.543 + 2.856 3.236 3.687 3.837 3.531 2.922 2.322 1.958 1.843 1.855 1.893 1.955 2.086 2.255 2.348 2.266 2.055 1.905 2.009 2.383 2.834 3.096 3.035 2.742 2.447 2.337 2.432 2.613 2.737 2.744 2.658 2.522 2.354 2.157 1.962 1.836 + 3.201 3.250 3.215 2.943 2.415 1.805 1.401 1.420 1.842 2.396 2.724 2.618 2.163 1.677 1.490 1.717 2.209 2.682 2.939 2.976 2.927 2.907 2.904 2.820 2.596 2.306 2.102 2.084 2.206 2.313 2.287 2.152 2.049 2.095 2.270 2.426 + 3.738 3.543 3.061 2.286 1.449 0.937 1.012 1.582 2.260 2.654 2.661 2.473 2.341 2.321 2.267 2.049 1.766 1.706 2.077 2.777 3.431 3.686 3.492 3.113 2.860 2.810 2.782 2.574 2.202 1.914 1.945 2.276 2.634 2.748 2.592 2.395 + 2.997 2.891 2.734 2.618 2.631 2.788 3.000 3.115 3.032 2.797 2.583 2.562 2.747 2.969 3.006 2.772 2.393 2.104 2.051 2.180 2.307 2.304 2.212 2.180 2.294 2.476 2.557 2.453 2.272 2.220 2.389 2.631 2.664 2.325 1.753 1.314 + 3.130 3.095 3.008 2.857 2.659 2.461 2.322 2.275 2.309 2.377 2.424 2.419 2.369 2.307 2.267 2.259 2.261 2.226 2.119 1.950 1.784 1.718 1.824 2.098 2.443 2.714 2.797 2.676 2.438 2.210 2.081 2.055 2.072 2.070 2.033 1.996 + 2.052 2.511 3.036 3.192 2.873 2.374 2.108 2.247 2.605 2.847 2.797 2.551 2.317 2.195 2.107 1.947 1.755 1.700 1.896 2.235 2.442 2.325 1.967 1.671 1.686 1.990 2.338 2.530 2.624 2.877 3.442 4.154 4.617 4.554 4.084 3.650 + 3.780 3.735 3.577 3.292 3.013 2.944 3.160 3.493 3.649 3.470 3.099 2.866 2.978 3.299 3.451 3.146 2.472 1.832 1.609 1.833 2.166 2.205 1.839 1.325 1.059 1.243 1.774 2.392 2.932 3.406 3.882 4.312 4.523 4.395 4.030 3.720 + 4.145 3.891 3.558 3.377 3.477 3.802 4.158 4.342 4.268 3.998 3.671 3.406 3.233 3.114 3.002 2.883 2.771 2.667 2.542 2.357 2.121 1.907 1.816 1.898 2.099 2.290 2.354 2.275 2.135 2.040 2.016 1.982 1.819 1.489 1.092 0.819 + 2.593 3.059 3.568 3.656 3.226 2.634 2.388 2.719 3.416 4.037 4.273 4.144 3.878 3.650 3.433 3.100 2.640 2.234 2.112 2.326 2.675 2.864 2.747 2.446 2.217 2.218 2.382 2.499 2.413 2.151 1.864 1.682 1.620 1.603 1.575 1.544 + 3.748 3.741 3.632 3.391 3.174 3.237 3.691 4.331 4.749 4.651 4.104 3.466 3.062 2.902 2.709 2.233 1.539 0.991 0.930 1.347 1.867 2.059 1.801 1.360 1.138 1.314 1.721 2.025 2.031 1.812 1.586 1.478 1.435 1.328 1.133 0.969 + 1.277 1.737 2.433 3.083 3.538 3.836 4.084 4.296 4.325 3.983 3.225 2.255 1.437 1.080 1.254 1.771 2.321 2.668 2.753 2.672 2.564 2.509 2.504 2.501 2.453 2.345 2.195 2.035 1.902 1.822 1.798 1.811 1.827 1.820 1.792 1.767 + 4.389 4.689 4.912 4.719 4.196 3.825 4.020 4.683 5.229 5.067 4.111 2.850 1.915 1.575 1.615 1.660 1.596 1.652 2.085 2.822 3.454 3.595 3.264 2.876 2.853 3.228 3.620 3.621 3.203 2.737 2.627 2.914 3.250 3.261 2.922 2.576 + 5.126 5.455 5.870 6.080 5.967 5.660 5.406 5.369 5.514 5.671 5.679 5.491 5.153 4.720 4.215 3.664 3.168 2.890 2.956 3.332 3.803 4.096 4.058 3.750 3.391 3.187 3.192 3.293 3.323 3.186 2.917 2.637 2.458 2.415 2.461 2.515 + 3.125 3.539 4.191 4.852 5.375 5.743 6.003 6.171 6.209 6.069 5.753 5.309 4.782 4.189 3.556 2.976 2.618 2.619 2.969 3.483 3.925 4.172 4.287 4.411 4.589 4.689 4.523 4.053 3.485 3.136 3.179 3.488 3.734 3.672 3.346 3.049 + 3.596 4.295 5.177 5.647 5.518 5.120 4.958 5.247 5.744 5.996 5.748 5.132 4.481 4.006 3.632 3.160 2.548 2.025 1.922 2.384 3.233 4.108 4.723 5.013 5.062 4.943 4.656 4.207 3.721 3.405 3.380 3.538 3.611 3.400 2.974 2.629 + 4.828 4.782 4.784 4.936 5.253 5.615 5.838 5.796 5.518 5.177 4.974 4.991 5.126 5.166 4.951 4.493 3.979 3.639 3.593 3.789 4.060 4.257 4.323 4.284 4.167 3.952 3.598 3.110 2.573 2.102 1.742 1.434 1.061 0.577 0.075 -0.253 + 4.569 4.964 5.474 5.745 5.605 5.176 4.758 4.591 4.667 4.744 4.549 4.001 3.285 2.726 2.554 2.739 3.020 3.107 2.885 2.496 2.227 2.298 2.710 3.242 3.595 3.575 3.185 2.596 2.024 1.602 1.342 1.164 0.982 0.766 0.555 0.422 + 4.649 4.715 4.829 4.974 5.142 5.325 5.483 5.549 5.474 5.278 5.056 4.912 4.877 4.868 4.749 4.442 3.991 3.541 3.237 3.139 3.204 3.347 3.493 3.583 3.541 3.287 2.785 2.120 1.492 1.102 1.017 1.105 1.138 0.970 0.658 0.410 + 5.048 5.210 5.407 5.466 5.283 4.917 4.582 4.528 4.867 5.463 5.974 6.043 5.531 4.616 3.696 3.132 3.029 3.201 3.336 3.237 2.953 2.713 2.719 2.974 3.265 3.322 3.018 2.451 1.867 1.482 1.333 1.284 1.146 0.835 0.444 0.170 + 4.016 4.261 4.628 4.955 5.144 5.217 5.270 5.383 5.535 5.610 5.481 5.110 4.592 4.088 3.716 3.478 3.277 3.023 2.726 2.509 2.511 2.765 3.147 3.440 3.469 3.210 2.789 2.385 2.108 1.942 1.781 1.525 1.147 0.709 0.325 0.102 + 4.864 5.123 5.483 5.747 5.837 5.846 5.949 6.241 6.633 6.889 6.791 6.303 5.604 4.970 4.589 4.440 4.347 4.129 3.752 3.352 3.116 3.137 3.341 3.549 3.600 3.446 3.137 2.747 2.306 1.811 1.283 0.805 0.486 0.383 0.439 0.522 + 5.959 6.311 6.727 6.871 6.634 6.191 5.816 5.646 5.605 5.536 5.386 5.243 5.198 5.204 5.076 4.664 4.027 3.427 3.145 3.280 3.708 4.209 4.624 4.889 4.949 4.694 4.032 3.040 2.016 1.323 1.116 1.204 1.189 0.808 0.169 -0.327 + 5.869 5.908 5.978 6.048 6.067 5.977 5.757 5.440 5.101 4.799 4.531 4.233 3.836 3.339 2.837 2.472 2.348 2.462 2.727 3.048 3.395 3.788 4.223 4.587 4.679 4.345 3.623 2.788 2.208 2.101 2.366 2.627 2.496 1.855 0.976 0.349 + 5.750 5.914 6.223 6.581 6.804 6.720 6.319 5.808 5.467 5.418 5.488 5.346 4.788 3.948 3.216 2.923 3.057 3.276 3.212 2.812 2.412 2.461 3.132 4.137 4.907 4.990 4.345 3.338 2.446 1.941 1.760 1.632 1.314 0.770 0.173 -0.217 + 5.530 5.152 4.826 4.953 5.461 5.835 5.606 4.837 4.097 3.933 4.331 4.697 4.399 3.369 2.217 1.733 2.234 3.342 4.344 4.791 4.782 4.730 4.892 5.134 5.118 4.672 3.960 3.287 2.794 2.343 1.729 0.956 0.279 -0.033 0.027 0.193 + 6.789 6.654 6.512 6.502 6.639 6.762 6.627 6.094 5.266 4.467 4.044 4.131 4.548 4.931 4.995 4.740 4.424 4.334 4.553 4.900 5.100 5.022 4.765 4.533 4.414 4.285 3.926 3.259 2.460 1.846 1.623 1.711 1.828 1.735 1.442 1.184 + 6.788 7.027 7.322 7.491 7.500 7.415 7.212 6.707 5.738 4.463 3.412 3.161 3.847 4.973 5.739 5.658 4.928 4.212 4.045 4.392 4.763 4.749 4.434 4.281 4.612 5.214 5.478 4.979 3.917 2.992 2.790 3.272 3.833 3.883 3.394 2.886 + 6.343 6.426 6.590 6.847 7.189 7.535 7.685 7.403 6.608 5.523 4.610 4.287 4.608 4.061 4.150 4.225 4.370 4.562 4.709 4.766 4.788 4.878 5.069 5.264 5.306 5.109 4.758 4.461 4.406 4.620 4.941 5.124 5.002 4.595 4.094 3.756 + 6.491 6.857 7.363 7.748 7.914 7.922 7.826 7.544 6.925 5.980 5.011 4.468 4.592 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 6.566 6.834 7.228 7.588 7.835 7.959 7.915 7.577 6.848 5.838 4.909 4.471 4.674 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 6.887 7.320 7.914 8.354 8.499 8.403 8.132 7.623 6.767 5.641 4.622 4.184 4.501 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 5.993 6.695 7.621 8.216 8.272 7.986 7.655 7.347 6.898 6.210 5.506 5.211 5.543 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 7.139 7.545 8.077 8.373 8.222 7.651 6.841 6.004 5.331 5.005 5.169 5.806 6.629 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 7.237 7.351 7.614 7.997 8.315 8.271 7.636 6.456 5.103 4.104 3.843 4.324 5.162 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 9.092 9.450 9.644 9.145 7.969 6.737 6.177 6.516 7.305 7.812 7.615 6.876 6.090 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 10.085 10.506 10.804 10.393 9.196 7.746 6.750 6.516 6.745 6.839 6.424 5.621 4.860 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 7.736 7.387 7.006 6.928 7.189 7.488 7.449 6.958 6.248 5.689 5.466 5.462 5.405 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 5.513 5.759 6.196 6.674 6.949 6.777 6.082 5.044 4.038 3.413 3.291 3.527 3.849 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 4.655 4.977 5.609 6.413 7.055 7.141 6.484 5.299 4.111 3.426 3.408 3.826 4.293 4.570 4.688 4.813 5.031 5.267 5.408 5.468 5.612 5.986 6.531 6.970 7.008 6.573 5.888 5.300 5.036 5.071 5.216 5.306 5.308 5.291 5.305 5.334 + 7.449 7.303 7.194 7.328 7.744 8.246 8.511 8.307 7.642 6.765 6.016 5.635 5.655 5.921 6.201 6.311 6.193 5.930 5.711 5.747 6.173 6.956 7.875 8.592 8.814 8.453 7.690 6.891 6.403 6.365 6.641 6.919 6.923 6.584 6.082 5.718 + 11.527 11.035 10.390 10.044 10.259 10.913 11.542 11.625 10.918 9.633 8.321 7.539 7.517 8.041 8.628 8.847 8.562 7.953 7.350 7.020 7.063 7.435 8.017 8.663 9.204 9.485 9.443 9.171 8.885 8.781 8.863 8.915 8.661 8.011 7.188 6.611 + 10.360 10.151 9.786 9.364 8.989 8.713 8.487 8.194 7.735 7.135 6.553 6.184 6.119 6.267 6.428 6.432 6.258 6.036 5.952 6.147 6.668 7.477 8.444 9.336 9.839 9.689 8.858 7.661 6.642 6.257 6.563 7.163 7.495 7.246 6.591 6.046 + 11.718 11.606 11.360 10.981 10.530 10.112 9.804 9.607 9.464 9.322 9.183 9.083 9.026 8.955 8.782 8.475 8.093 7.756 7.567 7.572 7.775 8.172 8.732 9.329 9.717 9.633 9.008 8.094 7.377 7.257 7.733 8.359 8.554 8.044 7.107 6.379 + 13.311 13.016 12.508 11.909 11.323 10.799 10.343 9.966 9.713 9.650 9.792 10.046 10.218 10.116 9.674 9.000 8.310 7.790 7.506 7.429 7.540 7.891 8.534 9.375 10.109 10.347 9.894 8.941 8.003 7.578 7.788 8.284 8.519 8.183 7.457 6.871 + 9.857 9.294 8.431 7.627 7.120 6.917 6.858 6.773 6.610 6.432 6.300 6.181 5.957 5.542 4.996 4.507 4.267 4.330 4.602 4.979 5.484 6.264 7.394 8.657 9.533 9.490 8.404 6.767 5.460 5.196 6.018 7.255 8.004 7.786 6.886 6.103 + 5.773 5.706 5.803 6.257 6.961 7.510 7.506 6.888 6.000 5.322 5.102 5.196 5.251 5.025 4.576 4.148 3.918 3.856 3.835 3.866 4.192 5.103 6.609 8.269 9.368 9.358 8.248 6.626 5.313 4.863 5.266 6.040 6.601 6.648 6.311 5.980 + 5.436 5.399 5.533 6.027 6.793 7.432 7.488 6.790 5.619 4.547 4.041 4.155 4.534 4.720 4.505 4.052 3.695 3.634 3.799 4.009 4.251 4.771 5.847 7.401 8.842 9.355 8.492 6.598 4.695 3.825 4.341 5.679 6.821 7.068 6.530 5.931 + 5.580 6.142 7.019 7.834 8.248 8.090 7.409 6.418 5.404 4.609 4.160 4.036 4.104 4.198 4.199 4.082 3.893 3.709 3.616 3.730 4.199 5.145 6.531 8.043 9.151 9.355 8.522 7.045 5.664 5.031 5.295 6.028 6.564 6.492 5.946 5.446 + 4.496 5.686 7.394 8.736 9.172 8.741 7.853 6.894 5.996 5.120 4.300 3.747 3.696 4.169 4.870 5.361 5.359 4.925 4.408 4.232 4.678 5.784 7.345 8.957 10.101 10.338 9.552 8.109 6.736 6.104 6.395 7.171 7.706 7.543 6.841 6.219 + 3.451 5.202 7.661 9.477 9.877 9.033 7.710 6.599 5.889 5.383 4.884 4.452 4.285 4.426 4.642 4.603 4.196 3.654 3.389 3.711 4.666 6.091 7.737 9.306 10.409 10.622 9.739 8.043 6.304 5.361 5.558 6.477 7.263 7.294 6.663 6.038 + 4.953 6.091 7.611 8.596 8.650 8.084 7.505 7.238 7.110 6.731 5.953 5.039 4.399 4.194 4.207 4.088 3.722 3.353 3.366 3.982 5.139 6.621 8.213 9.696 10.730 10.871 9.871 8.030 6.214 5.375 5.863 7.123 8.100 8.064 7.185 6.347 + 3.468 4.351 5.686 6.932 7.801 8.316 8.592 8.579 8.081 7.016 5.642 4.467 3.888 3.878 4.028 3.912 3.466 3.038 3.096 3.877 5.266 6.954 8.638 10.060 10.923 10.890 9.815 8.019 6.300 5.503 5.934 7.103 8.075 8.186 7.550 6.897 + 3.880 4.379 5.208 6.138 6.992 7.677 8.126 8.240 7.928 7.207 6.266 5.399 4.839 4.616 4.564 4.464 4.216 3.910 3.770 4.038 4.865 6.247 7.982 9.655 10.723 10.735 9.617 7.813 6.131 5.303 5.552 6.471 7.340 7.646 7.414 7.088 + 3.593 4.265 5.381 6.595 7.594 8.193 8.343 8.082 7.497 6.715 5.907 5.256 4.882 4.777 4.801 4.759 4.533 4.173 3.908 4.048 4.833 6.277 8.099 9.771 10.720 10.586 9.430 7.744 6.227 5.429 5.478 6.059 6.663 6.935 6.864 6.705 + 4.491 5.287 6.505 7.625 8.273 8.380 8.125 7.733 7.300 6.771 6.049 5.150 4.248 3.606 3.416 3.677 4.184 4.652 4.903 5.002 5.238 5.927 7.143 8.547 9.502 9.427 8.216 6.386 4.836 4.303 4.901 6.076 7.007 7.194 6.765 6.296 + 4.527 5.253 6.292 7.091 7.304 6.958 6.354 5.818 5.489 5.302 5.112 4.838 4.507 4.193 3.931 3.688 3.406 3.075 2.794 2.765 3.217 4.278 5.830 7.454 8.546 8.610 7.577 5.931 4.492 3.949 4.441 5.492 6.362 6.580 6.236 5.838 + 7.141 7.218 7.211 6.991 6.633 6.383 6.422 6.648 6.711 6.288 5.375 4.329 3.617 3.478 3.774 4.129 4.229 4.033 3.764 3.726 4.122 4.962 6.062 7.086 7.638 7.422 6.446 5.115 4.085 3.883 4.536 5.516 6.095 5.875 5.093 4.418 + 8.229 7.874 7.320 6.788 6.432 6.263 6.154 5.955 5.610 5.198 4.870 4.719 4.697 4.660 4.499 4.240 4.033 4.029 4.249 4.580 4.889 5.146 5.434 5.821 6.223 6.409 6.176 5.550 4.836 4.430 4.538 5.023 5.529 5.758 5.689 5.543 + 7.843 7.611 7.205 6.728 6.296 5.981 5.778 5.601 5.353 4.999 4.608 4.310 4.210 4.305 4.490 4.632 4.661 4.608 4.576 4.666 4.914 5.275 5.641 5.884 5.898 5.651 5.216 4.769 4.521 4.602 4.979 5.459 5.810 5.903 5.795 5.665 + 6.045 6.061 6.099 6.165 6.237 6.252 6.111 5.745 5.183 4.581 4.157 4.049 4.205 4.400 4.399 4.140 3.793 3.640 3.857 4.371 4.908 5.197 5.152 4.913 4.700 4.647 4.718 4.787 4.759 4.646 4.529 4.466 4.451 4.438 4.403 4.369 + 7.171 7.121 7.043 6.939 6.769 6.479 6.066 5.614 5.246 5.025 4.899 4.748 4.499 4.204 4.006 4.006 4.159 4.301 4.302 4.200 4.198 4.502 5.126 5.830 6.252 6.147 5.551 4.756 4.115 3.827 3.846 3.954 3.936 3.719 3.403 3.176 + 8.408 8.089 7.594 7.111 6.742 6.450 6.124 5.679 5.141 4.632 4.282 4.150 4.199 4.338 4.476 4.556 4.552 4.462 4.315 4.191 4.204 4.437 4.863 5.319 5.580 5.502 5.142 4.742 4.584 4.780 5.175 5.423 5.226 4.549 3.684 3.085 + 6.952 6.428 5.721 5.240 5.157 5.315 5.400 5.229 4.881 4.596 4.546 4.703 4.895 4.965 4.890 4.738 4.559 4.335 4.045 3.772 3.714 4.048 4.764 5.607 6.218 6.355 6.045 5.540 5.137 4.985 5.039 5.141 5.157 5.053 4.894 4.781 + 5.790 6.120 6.493 6.592 6.342 5.954 5.696 5.645 5.629 5.425 4.994 4.526 4.261 4.269 4.394 4.416 4.255 4.029 3.934 4.088 4.485 5.078 5.829 6.662 7.361 7.590 7.114 6.052 4.912 4.300 4.479 5.164 5.739 5.756 5.286 4.823 + 5.323 5.767 6.355 6.720 6.693 6.372 5.963 5.574 5.152 4.613 4.004 3.517 3.340 3.481 3.747 3.900 3.845 3.691 3.645 3.867 4.404 5.218 6.223 7.253 8.027 8.209 7.625 6.463 5.265 4.620 4.777 5.462 6.095 6.245 5.942 5.596 + 4.988 5.399 6.024 6.616 7.015 7.172 7.047 6.560 5.662 4.494 3.420 2.851 2.949 3.473 3.932 3.939 3.489 2.942 2.741 3.122 4.027 5.236 6.529 7.711 8.545 8.752 8.188 7.061 5.931 5.402 5.689 6.433 6.965 6.838 6.189 5.603 + 6.032 6.268 6.633 7.033 7.471 7.955 8.334 8.271 7.476 6.024 4.442 3.405 3.235 3.653 4.009 3.847 3.299 2.970 3.414 4.670 6.246 7.547 8.309 8.678 8.897 8.982 8.720 7.980 6.990 6.249 6.123 6.512 6.924 6.918 6.496 6.078 + 4.613 5.110 5.822 6.410 6.716 6.807 6.809 6.739 6.508 6.073 5.545 5.125 4.903 4.772 4.559 4.264 4.153 4.548 5.513 6.721 7.680 8.129 8.223 8.333 8.623 8.842 8.556 7.618 6.426 5.672 5.778 6.517 7.196 7.249 6.719 6.180 + 5.202 5.294 5.214 4.799 4.277 4.137 4.646 5.510 6.072 5.902 5.201 4.609 4.585 4.966 5.163 4.810 4.218 4.140 5.049 6.629 8.000 8.479 8.160 7.744 7.786 8.129 8.089 7.231 5.933 5.148 5.526 6.751 7.759 7.680 6.641 5.649 + 5.335 5.647 5.868 5.657 5.157 4.898 5.240 5.937 6.308 5.879 4.879 4.065 4.026 4.637 5.216 5.233 4.864 4.819 5.603 6.949 8.005 8.121 7.469 6.863 6.945 7.548 7.858 7.266 6.037 5.138 5.342 6.471 7.534 7.634 6.805 5.950 + 5.357 5.682 6.072 6.268 6.258 6.232 6.312 6.355 6.084 5.423 4.670 4.292 4.494 5.011 5.349 5.290 5.135 5.428 6.387 7.612 8.379 8.293 7.656 7.186 7.320 7.778 7.826 7.021 5.718 4.825 5.005 6.064 7.107 7.338 6.757 6.103 + 5.426 5.273 5.056 4.949 5.142 5.685 6.377 6.840 6.794 6.303 5.748 5.496 5.575 5.659 5.441 5.025 4.926 5.602 6.938 8.197 8.578 7.917 6.869 6.353 6.723 7.426 7.511 6.547 5.101 4.299 4.828 6.285 7.497 7.540 6.552 5.572 + 3.182 3.606 4.153 4.533 4.764 5.133 5.856 6.797 7.543 7.767 7.492 7.016 6.581 6.180 5.720 5.332 5.428 6.323 7.779 8.968 9.052 7.921 6.383 5.535 5.824 6.637 6.863 5.946 4.460 3.641 4.253 5.844 7.090 6.972 5.686 4.471 + 12.078 12.077 12.097 12.152 12.211 12.189 11.997 11.616 11.140 10.739 10.539 10.506 10.459 10.215 9.766 9.321 9.152 9.336 9.634 9.641 9.111 8.198 7.370 7.045 7.238 7.535 7.439 6.807 5.994 5.563 5.796 6.444 6.926 6.829 6.258 5.736 + 14.303 13.570 12.676 12.266 12.499 12.936 12.957 12.319 11.358 10.662 10.541 10.775 10.852 10.457 9.757 9.232 9.228 9.640 10.014 9.947 9.420 8.782 8.418 8.417 8.527 8.406 7.924 7.269 6.777 6.662 6.864 7.123 7.186 6.977 6.627 6.368 + 11.160 10.591 9.704 8.880 8.429 8.424 8.671 8.856 8.782 8.489 8.163 7.905 7.597 7.025 6.188 5.463 5.411 6.299 7.750 8.884 8.940 7.875 6.438 5.591 5.741 6.438 6.799 6.301 5.230 4.415 4.464 5.230 5.960 6.001 5.382 4.757 + 7.800 6.844 5.494 4.516 4.400 5.100 6.136 6.953 7.265 7.127 6.744 6.230 5.554 4.727 4.003 3.841 4.573 6.027 7.475 8.056 7.407 5.986 4.793 4.627 5.476 6.534 6.861 6.159 5.001 4.342 4.705 5.749 6.581 6.541 5.758 5.011 + 5.362 5.445 5.423 5.165 4.819 4.736 5.156 5.950 6.688 6.968 6.697 6.076 5.356 4.672 4.116 3.918 4.420 5.750 7.479 8.703 8.632 7.256 5.479 4.484 4.816 5.958 6.795 6.592 5.603 4.789 4.888 5.725 6.389 6.114 5.026 4.050 + 4.123 4.622 5.231 5.556 5.573 5.611 5.978 6.608 7.109 7.140 6.730 6.207 5.835 5.576 5.244 4.875 4.854 5.572 6.912 8.122 8.332 7.314 5.778 4.836 5.059 5.987 6.557 6.098 4.964 4.199 4.521 5.600 6.320 5.821 4.341 3.064 + 6.362 6.456 6.493 6.368 6.190 6.219 6.603 7.195 7.625 7.597 7.108 6.402 5.740 5.235 4.921 4.925 5.465 6.598 7.938 8.726 8.336 6.831 5.056 4.074 4.360 5.427 6.237 6.070 5.092 4.138 3.924 4.406 4.886 4.713 3.921 3.194 + 7.487 7.820 8.356 8.917 9.368 9.665 9.823 9.863 9.788 9.601 9.326 9.006 8.683 8.374 8.089 7.852 7.694 7.626 7.613 7.593 7.545 7.518 7.590 7.759 7.892 7.796 7.402 6.890 6.626 6.903 7.679 8.544 8.984 8.759 8.101 7.551 + 9.923 9.235 8.389 8.024 8.399 9.227 9.941 10.138 9.823 9.294 8.825 8.465 8.097 7.659 7.254 7.062 7.142 7.351 7.485 7.494 7.558 7.923 8.627 9.385 9.761 9.494 8.733 7.963 7.674 8.033 8.781 9.424 9.568 9.155 8.479 7.984 + 10.258 10.020 9.729 9.585 9.640 9.772 9.824 9.741 9.585 9.412 9.177 8.779 8.226 7.721 7.549 7.836 8.393 8.826 8.857 8.577 8.400 8.720 9.548 10.458 10.886 10.579 9.811 9.202 9.273 10.079 11.167 11.893 11.826 11.011 9.918 9.162 + 10.625 9.598 8.159 7.103 6.858 7.243 7.678 7.637 6.988 5.996 5.047 4.379 4.009 3.864 3.934 4.276 4.892 5.621 6.194 6.415 6.315 6.122 6.065 6.180 6.282 6.142 5.717 5.230 5.020 5.273 5.852 6.357 6.397 5.876 5.079 4.497 + 7.860 8.012 8.013 7.614 6.953 6.494 6.593 7.117 7.496 7.206 6.221 5.038 4.239 4.010 4.075 4.055 3.882 3.851 4.257 5.015 5.657 5.729 5.214 4.555 4.266 4.480 4.886 5.063 4.895 4.643 4.634 4.905 5.159 5.082 4.687 4.318 + 6.441 6.703 6.989 7.026 6.723 6.225 5.773 5.503 5.382 5.289 5.141 4.936 4.695 4.412 4.091 3.827 3.800 4.141 4.764 5.351 5.556 5.275 4.745 4.358 4.329 4.530 4.638 4.457 4.128 3.999 4.279 4.803 5.148 5.010 4.492 4.035 + 6.859 7.165 7.435 7.328 6.846 6.345 6.199 6.452 6.789 6.835 6.489 5.966 5.527 5.210 4.846 4.331 3.853 3.786 4.326 5.217 5.879 5.870 5.261 4.584 4.370 4.697 5.155 5.241 4.814 4.197 3.855 3.985 4.394 4.732 4.831 4.795 + 8.054 8.179 8.282 8.197 7.869 7.384 6.865 6.385 5.956 5.599 5.371 5.305 5.313 5.194 4.792 4.174 3.652 3.569 4.015 4.722 5.261 5.372 5.158 4.952 4.997 5.225 5.354 5.188 4.840 4.631 4.782 5.169 5.420 5.250 4.748 4.315 + 6.060 7.005 8.139 8.590 8.063 7.000 6.096 5.694 5.602 5.449 5.142 4.941 5.098 5.469 5.568 5.037 4.068 3.322 3.373 4.184 5.124 5.515 5.213 4.671 4.467 4.765 5.223 5.405 5.242 5.067 5.218 5.612 5.785 5.358 4.476 3.755 + 5.202 5.814 6.675 7.318 7.483 7.224 6.774 6.328 5.934 5.564 5.231 5.002 4.901 4.835 4.644 4.278 3.898 3.787 4.114 4.762 5.389 5.679 5.570 5.257 4.988 4.850 4.743 4.554 4.317 4.211 4.376 4.743 5.066 5.133 4.958 4.763 + 5.070 5.401 5.864 6.209 6.307 6.209 6.047 5.893 5.684 5.304 4.718 4.057 3.546 3.355 3.481 3.761 4.008 4.147 4.249 4.444 4.787 5.197 5.503 5.566 5.365 5.017 4.693 4.526 4.544 4.676 4.806 4.833 4.722 4.510 4.285 4.142 + 4.786 5.567 6.494 6.849 6.443 5.730 5.360 5.583 6.044 6.150 5.610 4.685 3.920 3.659 3.796 3.964 3.938 3.850 4.018 4.587 5.345 5.879 5.918 5.526 5.003 4.609 4.398 4.286 4.222 4.264 4.468 4.755 4.914 4.786 4.441 4.147 + 6.489 6.550 6.736 7.079 7.480 7.715 7.568 7.005 6.244 5.645 5.472 5.698 6.009 6.021 5.555 4.783 4.103 3.864 4.128 4.650 5.082 5.219 5.108 4.942 4.870 4.889 4.900 4.860 4.852 5.002 5.326 5.655 5.742 5.472 4.988 4.614 + 5.511 6.072 6.796 7.186 7.007 6.415 5.786 5.439 5.467 5.770 6.173 6.498 6.566 6.224 5.458 4.506 3.802 3.716 4.263 5.046 5.535 5.466 5.030 4.662 4.635 4.818 4.842 4.500 3.995 3.779 4.108 4.759 5.176 4.965 4.266 3.657 + 7.564 7.282 6.825 6.383 6.172 6.306 6.699 7.075 7.131 6.746 6.086 5.492 5.233 5.303 5.439 5.345 4.938 4.424 4.143 4.317 4.885 5.556 6.002 6.046 5.725 5.218 4.736 4.436 4.391 4.576 4.871 5.099 5.103 4.853 4.480 4.208 + 10.231 9.841 9.064 8.028 7.052 6.508 6.547 6.935 7.204 7.015 6.441 5.897 5.756 6.002 6.220 5.959 5.151 4.207 3.709 3.953 4.725 5.490 5.800 5.591 5.146 4.808 4.727 4.816 4.915 4.949 4.962 5.026 5.150 5.279 5.362 5.394 + 8.363 7.624 6.660 6.073 6.086 6.415 6.580 6.344 5.889 5.596 5.670 5.959 6.113 5.915 5.456 5.018 4.808 4.805 4.843 4.823 4.809 4.928 5.187 5.419 5.423 5.164 4.832 4.694 4.870 5.242 5.573 5.700 5.642 5.528 5.459 5.443 + 4.805 5.226 5.696 5.826 5.572 5.262 5.259 5.598 5.951 5.947 5.519 4.951 4.583 4.489 4.441 4.199 3.809 3.599 3.860 4.521 5.163 5.360 5.055 4.595 4.412 4.646 5.060 5.311 5.278 5.152 5.199 5.468 5.746 5.785 5.570 5.340 + 4.532 4.976 5.476 5.597 5.235 4.704 4.457 4.696 5.221 5.607 5.558 5.098 4.483 3.957 3.588 3.324 3.159 3.205 3.583 4.246 4.931 5.316 5.262 4.919 4.603 4.557 4.782 5.081 5.242 5.197 5.035 4.890 4.834 4.851 4.890 4.914 + 4.856 5.347 5.860 5.874 5.285 4.519 4.176 4.519 5.242 5.705 5.446 4.539 3.519 2.962 3.070 3.590 4.078 4.261 4.203 4.163 4.325 4.637 4.879 4.873 4.639 4.377 4.296 4.464 4.772 5.037 5.136 5.075 4.948 4.850 4.816 4.818 + 4.343 4.854 5.535 5.945 5.843 5.340 4.788 4.521 4.629 4.930 5.130 5.036 4.669 4.218 3.893 3.799 3.908 4.116 4.330 4.505 4.638 4.728 4.760 4.720 4.618 4.507 4.467 4.565 4.813 5.148 5.447 5.580 5.481 5.188 4.839 4.605 + 4.934 5.143 5.381 5.454 5.332 5.177 5.174 5.347 5.507 5.405 4.943 4.281 3.722 3.497 3.614 3.892 4.122 4.221 4.248 4.308 4.439 4.588 4.676 4.683 4.661 4.688 4.800 4.970 5.140 5.268 5.337 5.349 5.311 5.232 5.140 5.078 + 3.866 4.144 4.482 4.665 4.694 4.766 5.033 5.407 5.618 5.475 5.077 4.736 4.683 4.854 4.968 4.830 4.548 4.430 4.654 5.046 5.214 4.923 4.352 3.957 4.061 4.542 4.953 4.944 4.611 4.411 4.723 5.476 6.201 6.458 6.232 5.920 + 5.434 5.346 5.217 5.108 5.051 5.034 5.012 4.942 4.808 4.612 4.357 4.031 3.628 3.181 2.781 2.544 2.553 2.799 3.178 3.548 3.816 3.976 4.091 4.222 4.368 4.479 4.510 4.484 4.493 4.624 4.888 5.193 5.405 5.449 5.365 5.272 + 5.454 5.148 4.681 4.271 4.099 4.227 4.569 4.941 5.141 5.037 4.614 3.972 3.280 2.713 2.388 2.334 2.494 2.765 3.040 3.253 3.391 3.482 3.566 3.676 3.819 3.986 4.156 4.308 4.430 4.522 4.594 4.664 4.741 4.826 4.902 4.948 + 4.332 5.034 5.835 6.038 5.434 4.450 3.778 3.806 4.360 4.921 5.084 4.839 4.466 4.208 4.051 3.816 3.411 2.977 2.778 2.952 3.379 3.787 3.978 3.964 3.896 3.889 3.936 3.973 4.002 4.106 4.342 4.628 4.772 4.642 4.314 4.040 + 5.755 5.336 4.659 4.009 3.677 3.810 4.284 4.744 4.807 4.332 3.536 2.857 2.650 2.926 3.364 3.561 3.335 2.853 2.478 2.497 2.925 3.529 4.015 4.213 4.141 3.938 3.758 3.705 3.819 4.074 4.378 4.591 4.587 4.344 3.989 3.731 + 4.602 4.952 5.266 5.146 4.561 3.888 3.554 3.642 3.818 3.649 3.015 2.217 1.702 1.665 1.903 2.046 1.923 1.713 1.756 2.214 2.908 3.472 3.658 3.510 3.274 3.157 3.186 3.265 3.329 3.409 3.545 3.665 3.608 3.278 2.788 2.423 + 5.328 5.166 4.986 4.936 5.029 5.125 5.060 4.781 4.368 3.933 3.517 3.084 2.628 2.249 2.101 2.248 2.564 2.797 2.772 2.537 2.340 2.416 2.789 3.259 3.572 3.633 3.565 3.577 3.767 4.042 4.214 4.157 3.902 3.588 3.342 3.217 + 4.963 4.795 4.603 4.563 4.739 5.017 5.177 5.038 4.591 4.009 3.533 3.310 3.300 3.311 3.146 2.750 2.265 1.944 1.986 2.402 2.998 3.488 3.664 3.511 3.198 2.958 2.941 3.136 3.401 3.577 3.592 3.495 3.396 3.377 3.434 3.496 + 1.962 2.823 3.950 4.634 4.586 4.095 3.694 3.685 3.931 4.077 3.934 3.655 3.546 3.736 4.028 4.087 3.758 3.219 2.815 2.758 2.960 3.153 3.143 2.965 2.800 2.782 2.891 3.024 3.133 3.265 3.460 3.642 3.638 3.348 2.883 2.529 + 2.094 3.007 4.168 4.782 4.543 3.812 3.246 3.220 3.553 3.750 3.481 2.876 2.383 2.348 2.730 3.168 3.327 3.168 2.935 2.887 3.064 3.276 3.308 3.110 2.827 2.651 2.665 2.809 2.972 3.085 3.131 3.106 2.983 2.758 2.492 2.309 + 4.130 4.470 4.817 4.781 4.247 3.467 2.857 2.679 2.869 3.144 3.261 3.199 3.121 3.179 3.361 3.511 3.490 3.321 3.172 3.213 3.465 3.779 3.953 3.876 3.597 3.263 3.012 2.895 2.880 2.895 2.880 2.803 2.659 2.473 2.294 2.183 + 3.156 3.815 4.712 5.275 5.140 4.362 3.344 2.561 2.265 2.378 2.606 2.675 2.510 2.245 2.087 2.163 2.450 2.830 3.178 3.424 3.545 3.534 3.388 3.143 2.898 2.779 2.861 3.092 3.304 3.322 3.084 2.690 2.330 2.145 2.133 2.182 + 5.495 4.499 3.117 2.123 1.926 2.363 2.922 3.161 2.968 2.509 2.003 1.567 1.236 1.059 1.106 1.370 1.701 1.891 1.864 1.774 1.875 2.260 2.722 2.901 2.608 2.030 1.599 1.629 2.042 2.443 2.479 2.149 1.781 1.705 1.943 2.208 + 4.924 4.477 3.728 2.910 2.258 1.938 2.010 2.407 2.942 3.345 3.372 2.931 2.160 1.370 0.881 0.843 1.168 1.624 2.004 2.240 2.379 2.471 2.489 2.364 2.090 1.789 1.645 1.757 2.049 2.312 2.366 2.194 1.935 1.753 1.703 1.722 + 3.308 3.801 4.238 4.017 3.047 1.879 1.289 1.667 2.716 3.696 3.985 3.502 2.667 2.012 1.792 1.901 2.092 2.240 2.417 2.730 3.141 3.441 3.415 3.022 2.445 1.958 1.743 1.801 1.998 2.188 2.292 2.307 2.262 2.186 2.110 2.062 + 3.777 3.812 3.721 3.366 2.815 2.346 2.243 2.561 3.057 3.371 3.289 2.887 2.436 2.166 2.099 2.083 1.975 1.800 1.735 1.945 2.414 2.925 3.198 3.086 2.663 2.162 1.815 1.724 1.842 2.039 2.203 2.287 2.307 2.298 2.286 2.281 + 2.319 2.749 3.309 3.620 3.496 3.046 2.551 2.252 2.214 2.345 2.505 2.582 2.499 2.202 1.698 1.122 0.726 0.760 1.276 2.051 2.700 2.925 2.713 2.311 2.020 1.976 2.102 2.234 2.290 2.309 2.353 2.391 2.310 2.034 1.647 1.362 + 3.260 3.906 4.733 5.133 4.772 3.803 2.744 2.131 2.189 2.741 3.357 3.633 3.399 2.758 1.991 1.391 1.140 1.253 1.604 1.997 2.267 2.347 2.274 2.132 1.979 1.825 1.659 1.510 1.454 1.558 1.795 2.029 2.090 1.909 1.589 1.343 + 3.815 4.230 4.643 4.601 4.014 3.217 2.648 2.470 2.483 2.384 2.095 1.820 1.793 1.993 2.135 1.951 1.489 1.107 1.159 1.653 2.227 2.462 2.241 1.829 1.604 1.718 1.996 2.155 2.093 1.959 1.959 2.108 2.205 2.051 1.681 1.366 + 2.612 3.105 3.718 3.983 3.667 2.897 2.013 1.316 0.926 0.814 0.921 1.200 1.558 1.806 1.743 1.328 0.792 0.527 0.815 1.598 2.495 3.067 3.110 2.756 2.313 2.010 1.871 1.788 1.692 1.628 1.689 1.891 2.134 2.287 2.313 2.282 + 3.085 2.992 2.803 2.540 2.274 2.108 2.106 2.235 2.360 2.323 2.042 1.575 1.086 0.752 0.662 0.785 1.027 1.308 1.618 1.994 2.452 2.938 3.328 3.498 3.406 3.122 2.798 2.581 2.544 2.650 2.795 2.868 2.816 2.658 2.472 2.350 + 3.988 4.068 4.056 3.819 3.464 3.297 3.545 4.104 4.553 4.464 3.747 2.735 1.938 1.678 1.898 2.282 2.533 2.570 2.502 2.471 2.527 2.637 2.760 2.883 2.979 2.979 2.826 2.580 2.441 2.609 3.078 3.567 3.689 3.266 2.520 1.945 + 5.879 5.639 5.263 4.918 4.754 4.813 4.988 5.080 4.932 4.546 4.086 3.740 3.557 3.401 3.080 2.534 1.927 1.544 1.575 1.969 2.477 2.854 3.028 3.109 3.238 3.442 3.616 3.642 3.512 3.325 3.177 3.045 2.820 2.431 1.967 1.644 + 7.800 7.680 7.482 7.269 7.082 6.918 6.727 6.452 6.075 5.636 5.198 4.792 4.382 3.899 3.319 2.728 2.304 2.225 2.553 3.201 3.990 4.747 5.375 5.835 6.098 6.131 5.942 5.631 5.372 5.303 5.409 5.505 5.366 4.915 4.318 3.894 + 7.410 7.087 6.656 6.388 6.406 6.594 6.673 6.398 5.728 4.854 4.066 3.567 3.368 3.327 3.287 3.199 3.147 3.258 3.607 4.167 4.849 5.563 6.238 6.799 7.140 7.153 6.810 6.225 5.622 5.209 5.042 4.995 4.867 4.551 4.134 3.835 + 7.559 7.125 6.597 6.361 6.522 6.799 6.762 6.177 5.202 4.265 3.743 3.699 3.890 3.994 3.870 3.640 3.547 3.760 4.266 4.929 5.623 6.308 6.988 7.609 8.035 8.111 7.793 7.206 6.584 6.119 5.843 5.630 5.320 4.855 4.351 4.017 + 6.413 6.756 7.217 7.548 7.664 7.649 7.579 7.377 6.874 6.030 5.082 4.420 4.290 4.566 4.845 4.800 4.464 4.212 4.430 5.180 6.152 6.928 7.300 7.357 7.311 7.256 7.117 6.810 6.412 6.129 6.084 6.147 6.019 5.509 4.770 4.220 + 10.141 9.753 9.029 8.149 7.435 7.195 7.479 7.970 8.154 7.690 6.664 5.530 4.759 4.508 4.571 4.636 4.589 4.593 4.893 5.552 6.382 7.104 7.569 7.823 7.969 8.002 7.805 7.310 6.649 6.108 5.909 6.016 6.172 6.131 5.886 5.653 + 11.641 11.247 10.752 10.464 10.413 10.319 9.865 9.019 8.110 7.570 7.563 7.827 7.867 7.348 6.355 5.318 4.682 4.608 4.918 5.308 5.604 5.851 6.195 6.686 7.195 7.495 7.428 7.020 6.450 5.938 5.626 5.536 5.607 5.749 5.883 5.962 + 10.881 10.669 10.400 10.237 10.187 10.089 9.758 9.176 8.532 8.088 7.959 8.013 7.972 7.641 7.070 6.509 6.206 6.209 6.358 6.453 6.450 6.503 6.811 7.394 8.013 8.318 8.115 7.540 6.974 6.761 6.938 7.202 7.155 6.627 5.839 5.259 + 10.571 10.449 10.389 10.528 10.734 10.669 10.102 9.168 8.317 7.950 8.084 8.349 8.338 7.977 7.584 7.543 7.914 8.341 8.369 7.868 7.186 6.871 7.202 7.939 8.502 8.428 7.723 6.832 6.285 6.315 6.744 7.159 7.228 6.900 6.395 6.031 + 11.813 11.892 12.043 12.173 12.071 11.524 10.522 9.351 8.448 8.101 8.244 8.530 8.636 8.512 8.365 8.398 8.563 8.581 8.226 7.590 7.074 7.071 7.614 8.295 8.567 8.160 7.294 6.514 6.280 6.657 7.306 7.747 7.685 7.161 6.482 6.022 + 6.816 7.152 7.733 8.369 8.805 8.834 8.421 7.743 7.083 6.640 6.401 6.199 5.903 5.574 5.449 5.739 6.419 7.195 7.683 7.681 7.298 6.863 6.675 6.803 7.081 7.270 7.252 7.099 6.981 7.019 7.190 7.357 7.384 7.237 7.004 6.833 + 6.891 6.769 6.685 6.809 7.158 7.564 7.800 7.755 7.503 7.227 7.069 7.049 7.097 7.160 7.253 7.421 7.654 7.872 7.995 8.042 8.145 8.441 8.919 9.377 9.529 9.218 8.563 7.918 7.656 7.933 8.586 9.245 9.568 9.454 9.081 8.772 + 7.038 6.832 6.647 6.721 7.065 7.437 7.541 7.269 6.769 6.292 5.980 5.802 5.666 5.579 5.665 6.019 6.556 7.023 7.195 7.078 6.923 7.018 7.433 7.944 8.216 8.075 7.650 7.271 7.213 7.509 7.959 8.303 8.396 8.266 8.051 7.900 + 6.931 6.876 6.942 7.204 7.413 7.117 6.078 4.592 3.368 3.006 3.521 4.341 4.797 4.686 4.398 4.516 5.261 6.280 6.952 6.932 6.422 5.966 5.976 6.420 6.928 7.170 7.141 7.121 7.369 7.881 8.391 8.597 8.391 7.902 7.383 7.064 + 8.841 8.188 7.360 6.894 6.935 7.152 7.077 6.538 5.796 5.273 5.172 5.340 5.476 5.445 5.389 5.535 5.934 6.399 6.700 6.809 6.915 7.200 7.615 7.898 7.835 7.516 7.305 7.531 8.192 8.934 9.351 9.305 9.000 8.751 8.701 8.753 + 7.851 7.969 8.009 7.776 7.273 6.733 6.433 6.453 6.606 6.586 6.221 5.616 5.071 4.848 4.992 5.332 5.634 5.780 5.807 5.829 5.910 6.023 6.097 6.105 6.104 6.201 6.477 6.940 7.519 8.092 8.523 8.702 8.591 8.256 7.859 7.593 + 5.884 6.455 7.198 7.624 7.514 7.024 6.496 6.154 5.966 5.760 5.440 5.080 4.830 4.750 4.766 4.775 4.787 4.926 5.288 5.801 6.238 6.397 6.272 6.061 6.001 6.183 6.531 6.922 7.322 7.770 8.238 8.548 8.462 7.905 7.116 6.544 + 6.187 6.495 6.871 6.987 6.639 5.873 4.964 4.251 3.948 4.046 4.335 4.546 4.504 4.218 3.851 3.610 3.623 3.871 4.221 4.538 4.773 4.984 5.259 5.616 5.960 6.161 6.173 6.110 6.182 6.523 7.057 7.505 7.573 7.178 6.544 6.073 + 5.178 5.274 5.419 5.532 5.534 5.370 5.040 4.597 4.132 3.740 3.481 3.357 3.326 3.344 3.398 3.510 3.710 3.980 4.242 4.394 4.376 4.226 4.066 4.028 4.172 4.453 4.768 5.024 5.196 5.305 5.373 5.381 5.293 5.102 4.874 4.717 + 8.643 8.255 7.549 6.643 5.671 4.765 4.048 3.624 3.546 3.785 4.204 4.601 4.798 4.743 4.533 4.356 4.347 4.485 4.604 4.513 4.157 3.688 3.373 3.422 3.836 4.410 4.877 5.087 5.085 5.033 5.064 5.175 5.260 5.227 5.092 4.971 + 6.617 6.721 6.675 6.229 5.409 4.539 3.994 3.908 4.085 4.197 4.067 3.786 3.585 3.602 3.777 3.938 3.978 3.938 3.925 3.980 4.046 4.052 4.016 4.037 4.178 4.379 4.501 4.483 4.429 4.530 4.858 5.250 5.407 5.156 4.634 4.215 + 4.211 5.148 6.120 6.137 5.012 3.531 2.763 3.142 4.135 4.758 4.444 3.489 2.714 2.715 3.389 4.110 4.335 4.048 3.677 3.636 3.966 4.372 4.564 4.524 4.455 4.523 4.686 4.778 4.720 4.619 4.641 4.808 4.957 4.907 4.666 4.442 + 5.311 6.248 7.456 8.146 8.007 7.367 6.795 6.571 6.503 6.221 5.613 4.971 4.710 4.961 5.441 5.721 5.608 5.276 5.035 5.000 4.997 4.786 4.358 3.986 3.970 4.334 4.790 5.003 4.899 4.703 4.685 4.874 5.034 4.922 4.558 4.234 + 8.974 8.925 8.928 9.076 9.340 9.529 9.390 8.776 7.772 6.672 5.815 5.387 5.334 5.426 5.439 5.286 5.030 4.776 4.557 4.322 4.021 3.698 3.496 3.538 3.809 4.138 4.316 4.267 4.099 4.017 4.138 4.392 4.586 4.576 4.395 4.222 + 6.493 5.769 4.864 4.405 4.577 4.993 5.045 4.425 3.378 2.482 2.180 2.471 2.981 3.318 3.352 3.231 3.156 3.178 3.194 3.101 2.939 2.861 2.987 3.291 3.628 3.872 4.013 4.134 4.309 4.531 4.740 4.906 5.062 5.251 5.458 5.601 + 3.218 2.984 2.798 2.987 3.624 4.420 4.897 4.733 4.012 3.195 2.800 3.031 3.640 4.122 4.099 3.597 3.003 2.743 2.954 3.406 3.726 3.722 3.523 3.434 3.649 4.077 4.431 4.489 4.286 4.066 4.053 4.255 4.479 4.529 4.392 4.236 + 4.397 3.996 3.527 3.386 3.724 4.321 4.762 4.750 4.313 3.751 3.390 3.340 3.451 3.485 3.323 3.061 2.899 2.968 3.210 3.444 3.523 3.457 3.405 3.534 3.881 4.315 4.628 4.681 4.490 4.202 3.990 3.952 4.073 4.270 4.450 4.552 + 4.355 3.643 2.758 2.361 2.731 3.552 4.167 4.073 3.289 2.315 1.751 1.867 2.458 3.050 3.271 3.097 2.800 2.697 2.902 3.274 3.570 3.644 3.528 3.375 3.307 3.337 3.393 3.415 3.413 3.454 3.579 3.758 3.904 3.951 3.910 3.854 + 4.664 4.307 3.838 3.555 3.585 3.804 3.957 3.862 3.535 3.145 2.864 2.736 2.685 2.615 2.506 2.423 2.449 2.610 2.862 3.137 3.391 3.610 3.786 3.895 3.907 3.830 3.713 3.627 3.617 3.684 3.797 3.934 4.088 4.257 4.415 4.513 + 4.119 4.125 4.173 4.266 4.319 4.197 3.826 3.277 2.744 2.418 2.361 2.480 2.623 2.698 2.717 2.748 2.826 2.936 3.049 3.175 3.353 3.587 3.812 3.927 3.889 3.763 3.684 3.739 3.891 4.017 4.029 3.965 3.956 4.099 4.349 4.546 + 5.333 5.158 5.015 5.084 5.284 5.291 4.824 3.938 3.040 2.592 2.738 3.182 3.427 3.181 2.580 2.058 1.978 2.351 2.861 3.156 3.130 2.967 2.930 3.110 3.348 3.391 3.132 2.717 2.436 2.491 2.837 3.215 3.345 3.128 2.716 2.398 + 3.806 4.136 4.515 4.645 4.465 4.159 3.922 3.754 3.500 3.090 2.700 2.617 2.927 3.346 3.421 2.945 2.203 1.767 2.001 2.726 3.362 3.444 3.035 2.647 2.750 3.339 3.942 4.073 3.675 3.145 2.932 3.113 3.361 3.304 2.919 2.548 + 5.456 4.592 3.440 2.702 2.680 3.117 3.494 3.504 3.275 3.171 3.396 3.769 3.882 3.471 2.675 1.936 1.653 1.883 2.348 2.698 2.789 2.755 2.833 3.133 3.557 3.903 4.038 3.980 3.848 3.733 3.636 3.490 3.244 2.921 2.611 2.421 + 4.241 3.856 3.462 3.483 4.007 4.692 5.024 4.721 3.943 3.147 2.728 2.746 2.948 3.024 2.869 2.630 2.541 2.712 3.046 3.347 3.488 3.487 3.460 3.502 3.609 3.712 3.747 3.712 3.650 3.601 3.568 3.522 3.440 3.325 3.212 3.143 + 5.856 5.595 5.239 4.991 4.926 4.932 4.798 4.385 3.748 3.103 2.686 2.584 2.693 2.813 2.796 2.644 2.466 2.364 2.346 2.346 2.316 2.306 2.431 2.760 3.219 3.611 3.752 3.617 3.367 3.219 3.277 3.451 3.540 3.417 3.140 2.913 + 4.347 4.069 3.761 3.688 3.881 4.101 4.048 3.644 3.114 2.796 2.838 3.045 3.029 2.540 1.697 0.929 0.664 1.011 1.684 2.227 2.347 2.099 1.800 1.760 2.052 2.493 2.809 2.850 2.681 2.494 2.447 2.557 2.721 2.826 2.839 2.814 + 4.765 4.368 3.894 3.708 3.906 4.231 4.301 3.938 3.333 2.879 2.839 3.102 3.261 2.940 2.122 1.190 0.666 0.834 1.544 2.333 2.755 2.666 2.267 1.910 1.829 2.018 2.300 2.510 2.611 2.685 2.816 2.998 3.144 3.177 3.109 3.032 + 4.872 4.176 3.260 2.706 2.775 3.246 3.647 3.653 3.303 2.893 2.659 2.563 2.362 1.891 1.281 0.907 1.089 1.813 2.691 3.224 3.150 2.607 2.012 1.752 1.941 2.400 2.848 3.114 3.222 3.307 3.454 3.625 3.702 3.614 3.414 3.252 + 4.586 4.835 5.094 5.070 4.635 3.944 3.333 3.082 3.219 3.495 3.579 3.305 2.791 2.320 2.107 2.120 2.129 1.936 1.583 1.348 1.516 2.114 2.837 3.257 3.135 2.609 2.085 1.936 2.244 2.782 3.224 3.388 3.315 3.171 3.079 3.051 + 4.127 4.300 4.586 4.849 4.910 4.639 4.075 3.448 3.067 3.115 3.519 3.984 4.189 3.978 3.415 2.694 1.995 1.422 1.035 0.903 1.085 1.552 2.129 2.571 2.711 2.583 2.399 2.383 2.608 2.954 3.227 3.308 3.224 3.086 2.986 2.945 + 5.058 5.047 4.975 4.792 4.496 4.158 3.887 3.757 3.746 3.734 3.576 3.197 2.656 2.121 1.777 1.708 1.853 2.047 2.135 2.060 1.891 1.763 1.787 1.986 2.306 2.669 3.031 3.392 3.772 4.165 4.522 4.771 4.866 4.820 4.705 4.614 + 4.146 4.295 4.488 4.581 4.466 4.133 3.672 3.209 2.836 2.566 2.343 2.100 1.829 1.602 1.536 1.715 2.115 2.589 2.939 3.014 2.805 2.449 2.157 2.099 2.326 2.764 3.280 3.766 4.182 4.538 4.846 5.089 5.234 5.267 5.224 5.174 + 4.198 3.916 3.599 3.480 3.530 3.476 3.074 2.385 1.762 1.556 1.806 2.223 2.461 2.434 2.364 2.530 2.965 3.392 3.473 3.116 2.563 2.178 2.146 2.367 2.620 2.815 3.075 3.584 4.351 5.147 5.673 5.791 5.614 5.373 5.226 5.181 + 3.694 3.923 4.313 4.664 4.662 4.079 3.021 1.960 1.445 1.670 2.297 2.726 2.605 2.135 1.873 2.201 2.955 3.560 3.561 3.050 2.590 2.701 3.378 4.110 4.358 4.059 3.679 3.782 4.517 5.496 6.143 6.169 5.746 5.271 5.004 4.931 + 5.187 4.232 3.036 2.448 2.781 3.594 4.087 3.758 2.776 1.793 1.404 1.717 2.356 2.836 2.936 2.795 2.695 2.798 3.051 3.316 3.530 3.740 4.002 4.277 4.449 4.456 4.390 4.454 4.797 5.375 5.944 6.215 6.035 5.489 4.847 4.424 + 5.751 5.155 4.245 3.428 3.016 3.063 3.357 3.575 3.496 3.140 2.729 2.520 2.623 2.940 3.268 3.456 3.504 3.528 3.642 3.871 4.161 4.459 4.763 5.097 5.444 5.717 5.825 5.774 5.700 5.772 6.055 6.433 6.692 6.695 6.499 6.310 + 2.978 3.069 3.256 3.511 3.742 3.818 3.645 3.255 2.819 2.575 2.685 3.136 3.738 4.237 4.465 4.431 4.294 4.248 4.395 4.696 5.025 5.260 5.368 5.405 5.462 5.593 5.789 5.998 6.175 6.307 6.418 6.538 6.679 6.825 6.948 7.017 + 3.218 3.650 4.129 4.232 3.870 3.352 3.097 3.259 3.612 3.790 3.633 3.327 3.202 3.409 3.775 3.971 3.831 3.515 3.374 3.639 4.223 4.806 5.107 5.095 4.982 5.005 5.237 5.551 5.760 5.768 5.613 5.401 5.209 5.061 4.955 4.895 + 1.533 2.310 3.213 3.501 2.967 2.088 1.587 1.816 2.509 3.074 3.127 2.778 2.452 2.463 2.763 3.054 3.119 3.025 3.018 3.259 3.677 4.071 4.326 4.502 4.725 5.000 5.186 5.144 4.911 4.688 4.639 4.707 4.658 4.312 3.763 3.342 + 2.530 2.482 2.537 2.880 3.570 4.447 5.187 5.478 5.210 4.538 3.772 3.170 2.795 2.549 2.340 2.214 2.335 2.804 3.507 4.146 4.454 4.415 4.281 4.356 4.720 5.152 5.327 5.115 4.708 4.445 4.490 4.657 4.567 4.004 3.161 2.532 + 4.412 4.419 4.536 4.813 5.124 5.243 5.065 4.745 4.567 4.645 4.735 4.404 3.419 2.040 0.902 0.560 1.076 1.983 2.673 2.852 2.687 2.550 2.639 2.815 2.794 2.466 2.028 1.813 1.990 2.421 2.792 2.877 2.687 2.400 2.179 2.077 + 4.347 4.129 3.830 3.584 3.392 3.150 2.812 2.502 2.433 2.686 3.073 3.239 2.942 2.281 1.637 1.379 1.584 2.005 2.314 2.374 2.306 2.319 2.487 2.702 2.828 2.876 3.011 3.371 3.884 4.287 4.323 3.970 3.446 3.030 2.843 2.809 + 7.037 6.533 5.882 5.516 5.611 5.962 6.170 5.958 5.375 4.718 4.274 4.091 3.974 3.684 3.154 2.541 2.084 1.908 1.932 1.973 1.923 1.855 1.959 2.376 3.065 3.814 4.381 4.644 4.646 4.508 4.313 4.043 3.637 3.099 2.554 2.205 + 8.683 7.907 6.825 6.035 5.857 6.159 6.532 6.632 6.411 6.067 5.801 5.616 5.334 4.785 3.987 3.154 2.533 2.223 2.129 2.083 2.009 1.982 2.151 2.588 3.207 3.811 4.215 4.355 4.293 4.142 3.982 3.824 3.641 3.425 3.215 3.083 + 9.042 8.336 7.376 6.712 6.587 6.808 6.982 6.867 6.540 6.243 6.091 5.939 5.524 4.743 3.794 3.045 2.743 2.831 3.031 3.106 3.062 3.104 3.412 3.939 4.422 4.594 4.404 4.066 3.885 4.008 4.315 4.501 4.311 3.726 3.000 2.504 + 8.347 8.111 7.677 7.162 6.766 6.671 6.897 7.247 7.439 7.316 6.961 6.599 6.364 6.165 5.776 5.083 4.251 3.629 3.482 3.770 4.191 4.450 4.496 4.531 4.775 5.242 5.709 5.926 5.834 5.588 5.384 5.259 5.086 4.740 4.280 3.943 + 8.968 8.840 8.645 8.460 8.329 8.224 8.067 7.787 7.389 6.966 6.643 6.485 6.441 6.373 6.159 5.787 5.363 5.040 4.909 4.969 5.166 5.465 5.872 6.374 6.875 7.202 7.206 6.889 6.427 6.063 5.935 5.989 6.041 5.947 5.729 5.545 + 8.766 8.595 8.385 8.284 8.332 8.421 8.382 8.123 7.700 7.274 7.001 6.927 6.986 7.059 7.059 6.963 6.801 6.617 6.462 6.387 6.442 6.648 6.967 7.304 7.547 7.619 7.518 7.297 7.033 6.787 6.595 6.476 6.439 6.472 6.539 6.590 + 8.638 8.367 7.970 7.634 7.463 7.435 7.451 7.439 7.404 7.385 7.386 7.334 7.140 6.785 6.373 6.071 5.986 6.080 6.191 6.165 5.985 5.793 5.784 6.047 6.493 6.915 7.137 7.142 7.059 7.046 7.146 7.256 7.215 6.958 6.587 6.316 + 8.932 8.198 7.243 6.676 6.733 7.147 7.459 7.443 7.257 7.220 7.433 7.654 7.522 6.940 6.216 5.823 5.981 6.434 6.651 6.283 5.475 4.780 4.726 5.407 6.414 7.158 7.304 6.967 6.566 6.457 6.675 6.936 6.902 6.453 5.796 5.318 + 8.827 8.289 7.602 7.226 7.331 7.686 7.892 7.739 7.364 7.103 7.158 7.408 7.513 7.230 6.647 6.127 5.997 6.269 6.624 6.686 6.349 5.871 5.666 5.949 6.555 7.066 7.147 6.810 6.384 6.219 6.385 6.596 6.456 5.804 4.892 4.232 + 8.910 8.918 8.867 8.685 8.367 7.977 7.607 7.320 7.136 7.054 7.072 7.167 7.259 7.232 7.004 6.603 6.164 5.847 5.730 5.779 5.920 6.137 6.469 6.916 7.343 7.512 7.267 6.707 6.180 6.042 6.369 6.860 7.057 6.713 6.016 5.462 + 8.124 7.784 7.345 7.119 7.249 7.589 7.780 7.488 6.639 5.491 4.480 3.951 3.970 4.334 4.764 5.104 5.376 5.668 5.989 6.237 6.307 6.228 6.178 6.334 6.696 7.058 7.174 6.977 6.656 6.491 6.600 6.806 6.785 6.359 5.688 5.182 + 6.268 5.027 3.778 3.885 5.626 7.929 9.273 8.921 7.416 5.976 5.424 5.625 5.855 5.637 5.201 5.169 5.846 6.858 7.488 7.364 6.814 6.546 6.985 7.893 8.617 8.694 8.240 7.794 7.805 8.269 8.808 9.050 8.917 8.602 8.329 8.195 + 9.200 8.435 7.450 6.909 7.105 7.783 8.394 8.527 8.171 7.616 7.167 6.928 6.826 6.764 6.737 6.788 6.905 7.001 7.009 6.982 7.069 7.361 7.773 8.095 8.180 8.101 8.103 8.379 8.881 9.337 9.477 9.252 8.862 8.565 8.464 8.476 + 8.071 8.081 8.190 8.460 8.813 9.036 8.919 8.418 7.714 7.096 6.772 6.749 6.860 6.913 6.830 6.682 6.606 6.695 6.940 7.259 7.567 7.818 8.011 8.163 8.287 8.395 8.503 8.619 8.736 8.820 8.833 8.755 8.603 8.425 8.275 8.190 + 8.090 7.823 7.564 7.622 8.048 8.549 8.680 8.187 7.228 6.292 5.882 6.169 6.890 7.555 7.791 7.574 7.188 6.975 7.084 7.413 7.755 8.003 8.222 8.549 9.017 9.484 9.727 9.628 9.273 8.897 8.701 8.716 8.816 8.855 8.794 8.716 + 8.193 7.388 6.447 6.154 6.760 7.795 8.469 8.306 7.490 6.651 6.339 6.624 7.141 7.459 7.432 7.239 7.143 7.242 7.428 7.559 7.637 7.807 8.198 8.767 9.310 9.618 9.627 9.442 9.224 9.064 8.946 8.811 8.633 8.440 8.284 8.200 + 5.164 5.288 5.659 6.354 7.235 7.976 8.267 8.043 7.518 7.025 6.785 6.808 6.966 7.127 7.220 7.197 7.005 6.635 6.213 6.011 6.287 7.068 8.069 8.850 9.128 8.966 8.701 8.639 8.817 9.009 8.970 8.677 8.338 8.184 8.254 8.381 + 6.449 6.594 6.906 7.372 7.884 8.252 8.300 7.976 7.419 6.888 6.624 6.705 7.022 7.363 7.554 7.553 7.433 7.303 7.227 7.235 7.358 7.662 8.192 8.889 9.553 9.926 9.858 9.428 8.910 8.597 8.589 8.742 8.789 8.576 8.185 7.879 + 5.543 5.809 6.389 7.255 8.201 8.884 9.029 8.627 7.961 7.410 7.185 7.208 7.216 7.012 6.646 6.368 6.418 6.816 7.355 7.774 7.977 8.105 8.393 8.947 9.621 10.102 10.134 9.707 9.072 8.558 8.363 8.446 8.614 8.688 8.637 8.559 + 4.372 4.423 4.709 5.402 6.439 7.477 8.083 8.024 7.436 6.731 6.319 6.343 6.621 6.830 6.758 6.458 6.170 6.128 6.396 6.864 7.380 7.878 8.391 8.955 9.498 9.836 9.797 9.365 8.720 8.139 7.819 7.770 7.852 7.909 7.885 7.836 + 5.675 5.764 5.911 6.080 6.247 6.399 6.500 6.488 6.326 6.057 5.828 5.815 6.094 6.554 6.932 6.975 6.621 6.068 5.669 5.722 6.296 7.197 8.100 8.735 9.000 8.955 8.722 8.395 8.023 7.650 7.365 7.286 7.488 7.927 8.428 8.760 + 5.281 5.112 4.966 5.063 5.458 5.974 6.323 6.321 6.036 5.735 5.689 5.966 6.386 6.658 6.608 6.307 6.016 6.002 6.356 6.962 7.606 8.131 8.506 8.776 8.951 8.962 8.717 8.212 7.588 7.072 6.852 6.962 7.287 7.653 7.928 8.065 + 3.325 3.498 3.914 4.582 5.340 5.898 6.032 5.769 5.397 5.266 5.530 6.044 6.491 6.626 6.443 6.156 6.015 6.146 6.516 7.026 7.611 8.265 8.965 9.614 10.048 10.121 9.800 9.187 8.476 7.864 7.492 7.422 7.631 8.018 8.424 8.681 + 1.874 2.048 2.516 3.351 4.389 5.231 5.458 4.940 3.992 3.220 3.156 3.909 5.111 6.182 6.732 6.791 6.717 6.863 7.296 7.790 8.066 8.065 8.001 8.148 8.568 9.016 9.133 8.757 8.078 7.505 7.359 7.636 8.059 8.328 8.358 8.290 + 3.248 3.459 3.909 4.575 5.303 5.815 5.839 5.302 4.438 3.709 3.551 4.098 5.090 6.046 6.587 6.674 6.576 6.612 6.884 7.226 7.402 7.356 7.279 7.422 7.835 8.277 8.411 8.103 7.566 7.190 7.215 7.518 7.732 7.580 7.132 6.745 + 3.560 3.779 4.249 4.909 5.507 5.674 5.165 4.097 2.967 2.396 2.753 3.912 5.341 6.432 6.857 6.693 6.280 5.949 5.832 5.882 6.012 6.214 6.539 6.986 7.423 7.642 7.521 7.143 6.757 6.602 6.718 6.912 6.912 6.594 6.093 5.717 + 4.696 4.469 4.267 4.380 4.888 5.592 6.169 6.414 6.349 6.146 5.943 5.743 5.469 5.107 4.776 4.645 4.782 5.069 5.289 5.296 5.142 5.027 5.130 5.458 5.830 6.018 5.911 5.578 5.201 4.938 4.825 4.784 4.709 4.553 4.361 4.228 + 4.631 4.567 4.563 4.743 5.115 5.540 5.837 5.914 5.815 5.655 5.503 5.333 5.062 4.646 4.127 3.595 3.128 2.761 2.514 2.439 2.606 3.044 3.665 4.286 4.718 4.877 4.827 4.709 4.635 4.620 4.600 4.509 4.335 4.127 3.949 3.850 + 5.073 5.588 6.417 7.252 7.806 7.915 7.565 6.869 6.026 5.253 4.717 4.471 4.434 4.447 4.379 4.211 4.025 3.909 3.860 3.780 3.576 3.272 3.020 2.985 3.196 3.504 3.698 3.680 3.542 3.468 3.541 3.647 3.564 3.177 2.621 2.212 + 7.360 7.463 7.811 8.479 9.285 9.837 9.808 9.201 8.365 7.725 7.483 7.524 7.605 7.601 7.579 7.644 7.731 7.589 6.997 6.016 5.023 4.479 4.596 5.191 5.839 6.174 6.100 5.760 5.344 4.933 4.496 3.992 3.461 3.000 2.690 2.544 + 7.675 7.751 8.119 8.919 9.936 10.661 10.669 9.973 9.017 8.324 8.101 8.178 8.281 8.335 8.483 8.809 9.098 8.911 7.982 6.548 5.279 4.816 5.294 6.263 7.057 7.283 7.015 6.577 6.174 5.735 5.075 4.171 3.241 2.570 2.261 2.189 + 8.101 8.072 8.293 8.979 9.958 10.713 10.770 10.101 9.139 8.418 8.170 8.244 8.378 8.503 8.743 9.143 9.430 9.133 8.019 6.419 5.115 4.803 5.568 6.831 7.802 8.046 7.696 7.188 6.813 6.506 6.023 5.261 4.397 3.718 3.366 3.260 + 8.276 8.230 8.412 9.039 9.952 10.650 10.667 9.962 8.957 8.193 7.927 8.030 8.228 8.403 8.636 8.969 9.177 8.854 7.786 6.268 5.017 4.698 5.435 6.716 7.777 8.124 7.787 7.128 6.465 5.852 5.177 4.395 3.647 3.132 2.913 2.876 + 8.287 8.286 8.520 9.163 10.041 10.664 10.582 9.757 8.613 7.723 7.402 7.564 7.909 8.220 8.471 8.676 8.695 8.262 7.245 5.900 4.820 4.563 5.245 6.434 7.442 7.775 7.390 6.598 5.749 5.012 4.371 3.787 3.303 3.000 2.890 2.883 + 8.375 8.490 8.803 9.329 9.887 10.148 9.856 9.041 8.033 7.252 6.947 7.091 7.468 7.865 8.155 8.264 8.087 7.518 6.579 5.528 4.782 4.678 5.233 6.103 6.798 6.978 6.627 5.990 5.352 4.857 4.487 4.154 3.817 3.504 3.268 3.146 + 8.198 8.388 8.754 9.188 9.463 9.324 8.683 7.731 6.858 6.402 6.441 6.784 7.162 7.431 7.614 7.750 7.748 7.400 6.591 5.498 4.579 4.299 4.796 5.749 6.573 6.792 6.328 5.493 4.732 4.321 4.226 4.207 4.028 3.630 3.153 2.831 + 8.025 8.280 8.619 8.769 8.495 7.764 6.817 6.051 5.758 5.899 6.135 6.108 5.753 5.363 5.305 5.650 6.038 5.960 5.220 4.172 3.495 3.667 4.570 5.574 6.018 5.682 4.879 4.121 3.703 3.552 3.426 3.211 3.020 3.024 3.224 3.426 + 8.093 7.743 7.306 7.040 6.933 6.712 6.126 5.237 4.409 4.017 4.121 4.428 4.578 4.465 4.303 4.369 4.685 4.950 4.805 4.193 3.461 3.111 3.397 4.126 4.816 5.056 4.782 4.247 3.773 3.523 3.454 3.443 3.416 3.380 3.364 3.365 + 6.914 6.388 5.886 5.975 6.671 7.379 7.387 6.490 5.154 4.122 3.809 4.042 4.329 4.345 4.184 4.153 4.383 4.647 4.569 4.006 3.211 2.632 2.539 2.831 3.189 3.380 3.426 3.488 3.640 3.779 3.756 3.573 3.412 3.457 3.698 3.923 + 6.588 6.116 5.648 5.675 6.218 6.768 6.715 5.866 4.595 3.510 2.969 2.879 2.919 2.917 2.994 3.352 3.954 4.455 4.468 3.924 3.169 2.693 2.743 3.156 3.553 3.672 3.552 3.400 3.351 3.348 3.263 3.084 2.962 3.049 3.317 3.553 + 6.315 5.693 5.077 5.134 5.932 6.818 6.937 5.945 4.302 2.913 2.435 2.840 3.545 3.945 3.867 3.580 3.448 3.575 3.766 3.767 3.524 3.219 3.068 3.119 3.232 3.238 3.110 2.975 2.981 3.153 3.380 3.513 3.482 3.330 3.156 3.047 + 5.719 5.153 4.516 4.358 4.790 5.388 5.558 5.043 4.131 3.400 3.253 3.643 4.191 4.537 4.590 4.488 4.371 4.226 3.940 3.492 3.035 2.796 2.873 3.145 3.385 3.457 3.408 3.383 3.454 3.545 3.516 3.314 3.024 2.789 2.681 2.660 + 6.090 5.466 4.798 4.730 5.384 6.242 6.571 6.032 4.930 3.935 3.537 3.717 4.075 4.230 4.120 3.942 3.873 3.863 3.710 3.297 2.755 2.375 2.364 2.691 3.140 3.506 3.728 3.857 3.927 3.886 3.670 3.307 2.943 2.727 2.689 2.726 + 7.051 6.531 5.857 5.453 5.462 5.658 5.680 5.357 4.836 4.431 4.340 4.514 4.742 4.858 4.848 4.779 4.659 4.403 3.942 3.355 2.871 2.706 2.890 3.243 3.521 3.611 3.577 3.548 3.559 3.528 3.361 3.088 2.861 2.817 2.943 3.082 + 8.279 7.273 5.993 5.311 5.567 6.355 6.926 6.809 6.141 5.463 5.225 5.458 5.840 6.020 5.877 5.505 5.030 4.501 3.944 3.474 3.277 3.443 3.817 4.071 3.961 3.551 3.173 3.143 3.482 3.902 4.072 3.900 3.581 3.386 3.403 3.496 + 9.231 8.230 6.848 5.879 5.742 6.270 6.941 7.316 7.303 7.094 6.910 6.817 6.754 6.664 6.555 6.427 6.185 5.691 4.929 4.119 3.616 3.636 4.048 4.445 4.446 3.997 3.396 3.035 3.079 3.369 3.598 3.573 3.345 3.095 2.951 2.909 + 8.993 8.245 7.125 6.182 5.843 6.202 7.002 7.794 8.199 8.098 7.675 7.278 7.196 7.459 7.806 7.830 7.252 6.134 4.887 4.050 3.945 4.469 5.142 5.415 5.020 4.123 3.184 2.643 2.642 2.986 3.325 3.393 3.144 2.719 2.316 2.080 + 8.755 8.123 7.237 6.593 6.483 6.854 7.415 7.866 8.063 8.029 7.874 7.722 7.682 7.828 8.127 8.383 8.296 7.652 6.535 5.353 4.604 4.529 4.919 5.256 5.095 4.390 3.503 2.903 2.815 3.081 3.328 3.266 2.863 2.302 1.812 1.541 + 8.492 7.794 6.896 6.404 6.581 7.215 7.857 8.188 8.190 8.036 7.871 7.726 7.601 7.557 7.648 7.769 7.619 6.916 5.711 4.483 3.850 4.082 4.839 5.395 5.202 4.323 3.352 2.911 3.142 3.642 3.852 3.523 2.862 2.263 1.952 1.871 + 8.132 7.210 6.065 5.531 5.938 6.908 7.727 7.922 7.552 7.032 6.714 6.650 6.678 6.675 6.670 6.720 6.735 6.497 5.888 5.091 4.516 4.461 4.823 5.137 4.951 4.217 3.340 2.840 2.933 3.377 3.710 3.621 3.148 2.561 2.113 1.894 + 7.515 6.534 5.403 5.069 5.796 6.981 7.693 7.449 6.532 5.642 5.264 5.340 5.478 5.415 5.241 5.210 5.390 5.552 5.418 4.988 4.587 4.552 4.885 5.213 5.132 4.588 3.926 3.553 3.553 3.628 3.410 2.828 2.174 1.803 1.800 1.931 + 8.536 7.208 5.531 4.676 5.088 6.204 6.987 6.768 5.700 4.500 3.815 3.777 4.073 4.333 4.421 4.398 4.313 4.110 3.766 3.451 3.469 3.972 4.733 5.254 5.151 4.495 3.753 3.384 3.442 3.564 3.341 2.709 1.998 1.596 1.590 1.730 + 4.982 4.797 4.522 4.310 4.301 4.526 4.848 5.016 4.821 4.251 3.539 3.023 2.916 3.154 3.437 3.447 3.076 2.491 2.011 1.882 2.137 2.602 3.029 3.235 3.161 2.865 2.467 2.109 1.908 1.901 2.006 2.047 1.858 1.409 0.863 0.487 + 6.690 5.643 4.296 3.546 3.738 4.457 4.944 4.747 4.047 3.422 3.318 3.688 4.108 4.181 3.849 3.365 3.004 2.833 2.740 2.637 2.593 2.753 3.135 3.531 3.638 3.311 2.696 2.125 1.856 1.903 2.063 2.105 1.937 1.632 1.333 1.157 + 7.682 6.565 5.045 3.994 3.793 4.134 4.380 4.126 3.485 2.873 2.586 2.554 2.502 2.280 2.035 2.045 2.394 2.840 3.003 2.708 2.150 1.724 1.689 1.962 2.215 2.181 1.861 1.487 1.293 1.325 1.451 1.504 1.428 1.280 1.150 1.083 + 5.910 5.203 4.209 3.461 3.240 3.418 3.613 3.514 3.103 2.629 2.381 2.469 2.784 3.131 3.387 3.545 3.638 3.629 3.414 2.927 2.259 1.650 1.351 1.442 1.776 2.075 2.134 1.945 1.677 1.517 1.511 1.536 1.411 1.066 0.616 0.299 + 2.653 3.053 3.649 4.162 4.398 4.330 4.057 3.708 3.375 3.115 2.974 2.986 3.136 3.327 3.424 3.334 3.081 2.787 2.570 2.454 2.362 2.199 1.955 1.728 1.644 1.750 1.958 2.110 2.081 1.860 1.536 1.224 0.998 0.867 0.804 0.779 + 4.027 3.931 3.858 3.930 4.136 4.304 4.218 3.782 3.097 2.411 1.955 1.818 1.924 2.118 2.282 2.383 2.448 2.501 2.526 2.482 2.346 2.145 1.947 1.830 1.838 1.955 2.107 2.182 2.084 1.787 1.360 0.942 0.672 0.602 0.675 0.761 + 5.823 5.479 5.027 4.740 4.699 4.715 4.484 3.843 2.928 2.114 1.773 2.022 2.648 3.242 3.447 3.156 2.545 1.940 1.628 1.701 2.035 2.381 2.513 2.352 1.989 1.615 1.391 1.353 1.405 1.405 1.277 1.061 0.872 0.798 0.832 0.890 + 5.279 4.645 3.860 3.494 3.752 4.333 4.704 4.529 3.894 3.181 2.748 2.708 2.943 3.274 3.583 3.793 3.809 3.535 2.985 2.354 1.928 1.862 2.038 2.140 1.920 1.415 0.916 0.715 0.854 1.102 1.178 0.989 0.685 0.484 0.464 0.521 + 7.856 7.657 7.325 6.922 6.448 5.864 5.177 4.494 3.969 3.698 3.656 3.736 3.860 4.017 4.206 4.341 4.257 3.853 3.243 2.756 2.729 3.245 4.052 4.752 5.109 5.198 5.275 5.478 5.672 5.576 5.078 4.420 4.047 4.234 4.825 5.332 + 9.001 8.794 8.460 8.085 7.683 7.217 6.675 6.119 5.644 5.310 5.134 5.165 5.526 6.328 7.476 8.565 9.044 8.610 7.500 6.411 6.023 6.502 7.384 7.993 8.009 7.714 7.670 8.143 8.801 8.994 8.373 7.267 6.453 6.493 7.233 7.936 + 6.529 5.638 4.315 3.220 2.856 3.291 4.136 4.783 4.785 4.143 3.322 2.980 3.541 4.904 6.457 7.432 7.375 6.422 5.203 4.422 4.417 4.990 5.635 5.947 5.915 5.856 6.076 6.549 6.907 6.741 5.981 5.010 4.397 4.459 5.011 5.515 + 4.948 3.964 2.651 1.807 1.787 2.296 2.717 2.641 2.151 1.675 1.578 1.882 2.322 2.617 2.679 2.600 2.493 2.381 2.234 2.081 2.026 2.145 2.372 2.531 2.501 2.351 2.289 2.460 2.776 2.968 2.819 2.367 1.880 1.627 1.650 1.762 + 3.835 3.669 3.538 3.624 3.856 3.936 3.600 2.889 2.177 1.903 2.234 2.949 3.620 3.921 3.811 3.468 3.090 2.769 2.519 2.375 2.417 2.679 3.056 3.336 3.359 3.171 3.002 3.078 3.435 3.891 4.212 4.303 4.254 4.224 4.277 4.350 + 3.799 3.740 3.711 3.760 3.787 3.605 3.121 2.488 2.041 2.046 2.487 3.067 3.446 3.503 3.399 3.402 3.635 3.977 4.194 4.160 3.960 3.792 3.778 3.871 3.921 3.841 3.691 3.609 3.681 3.862 4.034 4.119 4.133 4.143 4.186 4.230 + 4.616 4.093 3.395 2.971 3.048 3.491 3.924 4.011 3.684 3.171 2.815 2.849 3.269 3.874 4.407 4.693 4.706 4.551 4.405 4.446 4.789 5.432 6.247 7.020 7.534 7.668 7.438 6.983 6.485 6.103 5.928 5.977 6.208 6.535 6.847 7.037 + 4.656 4.633 4.572 4.496 4.480 4.592 4.799 4.938 4.840 4.501 4.145 4.082 4.450 5.065 5.515 5.462 4.907 4.205 3.824 4.045 4.817 5.861 6.875 7.675 8.191 8.389 8.253 7.834 7.301 6.877 6.696 6.706 6.717 6.572 6.297 6.074 + 4.696 4.079 3.228 2.652 2.653 3.134 3.686 3.893 3.635 3.176 2.971 3.329 4.191 5.168 5.818 5.940 5.674 5.360 5.286 5.527 5.980 6.515 7.085 7.694 8.300 8.761 8.922 8.756 8.417 8.135 8.026 7.991 7.813 7.373 6.792 6.375 + 5.714 5.350 4.804 4.313 4.020 3.902 3.824 3.668 3.421 3.191 3.129 3.345 3.835 4.467 5.025 5.295 5.192 4.838 4.538 4.611 5.185 6.071 6.863 7.198 7.003 6.545 6.221 6.259 6.567 6.831 6.796 6.457 6.041 5.787 5.755 5.814 + 6.045 6.043 6.104 6.274 6.501 6.616 6.423 5.828 4.928 3.995 3.369 3.303 3.845 4.798 5.785 6.406 6.425 5.900 5.173 4.696 4.767 5.348 6.084 6.525 6.411 5.831 5.144 4.737 4.789 5.200 5.710 6.080 6.224 6.193 6.100 6.032 + 7.267 6.590 5.729 5.279 5.484 6.072 6.496 6.361 5.680 4.801 4.103 3.742 3.631 3.613 3.622 3.699 3.880 4.110 4.277 4.321 4.307 4.371 4.600 4.954 5.304 5.539 5.639 5.657 5.647 5.627 5.597 5.590 5.669 5.862 6.111 6.289 + 7.124 6.935 6.718 6.630 6.663 6.631 6.328 5.716 4.951 4.265 3.792 3.522 3.383 3.348 3.452 3.702 4.003 4.202 4.214 4.112 4.071 4.199 4.430 4.576 4.514 4.310 4.170 4.244 4.483 4.685 4.693 4.558 4.492 4.665 5.022 5.315 + 4.343 4.523 4.813 5.072 5.127 4.869 4.341 3.746 3.329 3.219 3.347 3.527 3.622 3.657 3.772 4.058 4.440 4.708 4.694 4.423 4.102 3.965 4.091 4.369 4.604 4.673 4.586 4.421 4.224 3.981 3.690 3.421 3.297 3.386 3.617 3.809 + 4.162 4.495 4.911 5.099 4.911 4.458 4.000 3.744 3.703 3.729 3.672 3.528 3.430 3.519 3.795 4.092 4.204 4.058 3.789 3.642 3.786 4.185 4.619 4.852 4.801 4.574 4.374 4.335 4.435 4.543 4.543 4.427 4.286 4.215 4.231 4.272 + 4.242 4.770 5.352 5.470 5.030 4.422 4.142 4.335 4.691 4.768 4.422 3.926 3.678 3.809 4.055 4.029 3.601 3.034 2.740 2.911 3.373 3.779 3.935 3.930 3.974 4.137 4.261 4.130 3.722 3.263 3.036 3.130 3.378 3.541 3.529 3.450 + 3.956 4.038 4.214 4.463 4.696 4.784 4.648 4.337 4.022 3.887 3.995 4.226 4.351 4.192 3.751 3.216 2.825 2.715 2.854 3.102 3.346 3.575 3.848 4.187 4.500 4.628 4.468 4.086 3.697 3.517 3.607 3.824 3.940 3.821 3.537 3.303 + 5.006 4.423 3.684 3.282 3.371 3.670 3.746 3.403 2.832 2.419 2.409 2.728 3.102 3.308 3.329 3.276 3.225 3.136 2.951 2.720 2.605 2.735 3.054 3.339 3.393 3.217 3.012 2.979 3.127 3.265 3.187 2.877 2.519 2.325 2.339 2.424 + 2.931 3.315 3.855 4.268 4.406 4.297 4.048 3.729 3.366 3.024 2.838 2.912 3.171 3.346 3.162 2.595 1.944 1.619 1.803 2.285 2.641 2.607 2.312 2.141 2.367 2.883 3.300 3.303 2.945 2.577 2.499 2.670 2.752 2.461 1.875 1.397 + 2.013 2.081 2.322 2.782 3.306 3.586 3.402 2.840 2.264 2.050 2.292 2.738 3.008 2.921 2.631 2.472 2.650 3.061 3.387 3.378 3.074 2.780 2.822 3.293 3.998 4.603 4.873 4.791 4.510 4.202 3.939 3.685 3.376 3.007 2.654 2.436 + 3.930 3.503 2.934 2.584 2.627 2.953 3.274 3.367 3.226 3.047 3.046 3.294 3.672 3.969 4.034 3.855 3.536 3.216 3.000 2.939 3.054 3.340 3.758 4.224 4.624 4.856 4.876 4.717 4.458 4.192 3.984 3.864 3.829 3.854 3.904 3.941 + 4.715 4.194 3.553 3.245 3.408 3.791 4.025 3.978 3.847 3.931 4.312 4.759 4.936 4.705 4.227 3.786 3.515 3.308 2.984 2.538 2.210 2.292 2.855 3.653 4.295 4.542 4.454 4.285 4.248 4.358 4.481 4.498 4.411 4.311 4.264 4.261 + 3.373 3.289 3.208 3.217 3.300 3.325 3.136 2.696 2.147 1.761 1.784 2.288 3.132 4.038 4.732 5.068 5.069 4.883 4.693 4.639 4.764 5.030 5.350 5.645 5.887 6.098 6.326 6.593 6.873 7.101 7.215 7.193 7.069 6.905 6.764 6.685 + 3.719 3.247 2.679 2.464 2.779 3.388 3.835 3.787 3.266 2.605 2.195 2.224 2.605 3.101 3.501 3.726 3.805 3.802 3.767 3.753 3.829 4.063 4.459 4.932 5.343 5.587 5.662 5.660 5.693 5.808 5.958 6.050 6.013 5.857 5.660 5.526 + 5.229 5.748 6.639 7.615 8.320 8.475 8.030 7.203 6.350 5.735 5.374 5.071 4.620 3.999 3.388 3.022 2.999 3.218 3.487 3.680 3.811 3.960 4.160 4.354 4.461 4.491 4.556 4.787 5.196 5.645 5.922 5.890 5.568 5.106 4.685 4.443 + 5.118 5.208 5.446 5.858 6.332 6.615 6.449 5.745 4.686 3.650 3.007 2.904 3.204 3.599 3.829 3.826 3.716 3.680 3.817 4.108 4.469 4.842 5.207 5.522 5.687 5.585 5.202 4.709 4.403 4.505 4.976 5.506 5.717 5.446 4.879 4.429 + 5.726 5.629 5.754 6.382 7.395 8.284 8.531 8.021 7.113 6.324 5.921 5.797 5.693 5.494 5.316 5.315 5.476 5.638 5.713 5.855 6.337 7.229 8.202 8.708 8.434 7.604 6.842 6.677 7.122 7.699 7.881 7.540 7.000 6.682 6.712 6.865 + 5.516 5.696 6.102 6.741 7.496 8.140 8.441 8.294 7.753 6.986 6.187 5.521 5.115 5.028 5.209 5.479 5.608 5.479 5.218 5.156 5.602 6.584 7.777 8.688 8.992 8.734 8.257 7.914 7.819 7.818 7.694 7.384 7.022 6.788 6.739 6.775 + 4.587 4.975 5.671 6.548 7.449 8.171 8.454 8.070 6.999 5.540 4.230 3.536 3.552 3.931 4.163 3.981 3.570 3.408 3.859 4.887 6.108 7.115 7.768 8.201 8.578 8.870 8.882 8.488 7.820 7.193 6.823 6.621 6.275 5.578 4.685 4.046 + 4.304 4.582 5.131 5.911 6.805 7.608 8.072 8.014 7.424 6.501 5.548 4.797 4.282 3.872 3.441 3.032 2.873 3.209 4.091 5.295 6.454 7.293 7.761 7.988 8.108 8.141 8.031 7.773 7.482 7.288 7.172 6.911 6.236 5.103 3.840 2.996 + 3.637 4.010 4.520 4.890 5.019 4.999 4.946 4.838 4.528 3.930 3.181 2.593 2.414 2.628 2.978 3.203 3.266 3.363 3.709 4.320 4.984 5.451 5.633 5.631 5.588 5.535 5.407 5.187 5.001 5.024 5.259 5.433 5.170 4.326 3.202 2.400 + 2.673 3.051 3.694 4.404 4.961 5.206 5.092 4.693 4.141 3.556 2.992 2.464 1.998 1.664 1.547 1.671 1.970 2.316 2.618 2.891 3.231 3.709 4.267 4.710 4.826 4.548 4.038 3.612 3.543 3.876 4.385 4.706 4.571 3.980 3.218 2.694 + 5.070 4.996 5.056 5.422 5.980 6.337 6.096 5.187 3.947 2.892 2.354 2.287 2.371 2.301 2.010 1.665 1.490 1.595 1.942 2.424 2.955 3.474 3.906 4.164 4.206 4.097 3.986 3.999 4.137 4.281 4.306 4.196 4.054 3.996 4.045 4.115 + 5.535 5.776 6.115 6.335 6.249 5.800 5.099 4.371 3.833 3.569 3.487 3.390 3.108 2.616 2.048 1.615 1.480 1.680 2.123 2.654 3.130 3.466 3.645 3.702 3.705 3.728 3.818 3.958 4.074 4.061 3.853 3.458 2.963 2.486 2.126 1.936 + 3.224 3.896 4.792 5.318 5.135 4.370 3.507 3.034 3.109 3.466 3.640 3.314 2.555 1.758 1.360 1.531 2.076 2.605 2.827 2.750 2.640 2.784 3.255 3.848 4.229 4.181 3.757 3.239 2.940 2.997 3.299 3.579 3.606 3.331 2.914 2.611 + 3.709 3.953 4.460 5.154 5.784 6.032 5.746 5.094 4.471 4.196 4.263 4.352 4.126 3.531 2.853 2.475 2.554 2.906 3.196 3.245 3.181 3.299 3.765 4.442 4.972 5.065 4.711 4.179 3.801 3.743 3.924 4.127 4.169 4.018 3.779 3.606 + 2.750 2.685 2.868 3.564 4.628 5.485 5.539 4.662 3.351 2.383 2.239 2.756 3.290 3.253 2.587 1.787 1.495 1.984 2.966 3.842 4.172 3.988 3.715 3.798 4.353 5.099 5.597 5.580 5.122 4.547 4.178 4.142 4.345 4.602 4.784 4.864 + 3.339 3.328 3.793 5.108 6.945 8.314 8.283 6.758 4.616 3.051 2.676 3.152 3.620 3.529 3.093 3.026 3.824 5.264 6.567 7.032 6.591 5.813 5.403 5.661 6.318 6.832 6.821 6.281 5.494 4.771 4.289 4.074 4.081 4.238 4.448 4.594 + 1.223 1.836 3.255 5.458 7.853 9.434 9.431 7.933 5.907 4.529 4.352 4.988 5.554 5.490 5.031 4.942 5.780 7.326 8.702 9.061 8.279 7.054 6.370 6.742 7.870 8.916 9.149 8.447 7.294 6.342 5.932 5.919 5.897 5.583 5.048 4.631 + 3.099 3.712 4.930 6.597 8.287 9.412 9.539 8.699 7.417 6.381 5.988 6.104 6.261 6.123 5.831 5.909 6.762 8.202 9.441 9.637 8.593 7.014 6.061 6.487 8.041 9.636 10.172 9.375 7.962 7.007 7.046 7.655 7.874 7.086 5.597 4.416 + 2.984 3.594 4.741 6.257 7.869 9.207 9.910 9.783 8.935 7.764 6.745 6.156 5.968 5.981 6.110 6.504 7.359 8.565 9.565 9.662 8.619 7.018 5.972 6.325 7.937 9.716 10.435 9.700 8.244 7.279 7.437 8.217 8.453 7.393 5.442 3.905 + 3.697 4.120 4.841 5.718 6.686 7.712 8.675 9.311 9.345 8.704 7.626 6.535 5.807 5.609 5.927 6.680 7.737 8.817 9.451 9.201 8.049 6.615 5.876 6.478 8.160 9.837 10.386 9.527 8.062 7.199 7.509 8.415 8.696 7.591 5.551 3.944 + 5.240 5.410 5.805 6.493 7.474 8.612 9.627 10.184 10.049 9.215 7.930 6.591 5.601 5.251 5.653 6.704 8.061 9.179 9.513 8.825 7.438 6.160 5.833 6.751 8.389 9.709 9.892 8.945 7.688 7.087 7.461 8.206 8.305 7.217 5.399 4.008 + 3.237 3.904 5.043 6.378 7.684 8.830 9.719 10.227 10.225 9.666 8.672 7.520 6.551 6.056 6.189 6.915 7.961 8.845 9.041 8.284 6.841 5.483 5.070 5.957 7.662 9.129 9.457 8.565 7.240 6.504 6.775 7.528 7.762 6.879 5.257 3.983 + 6.509 6.507 6.666 7.192 8.149 9.328 10.275 10.524 9.903 8.685 7.433 6.629 6.368 6.378 6.339 6.200 6.189 6.497 6.956 7.076 6.473 5.312 4.328 4.298 5.400 7.004 8.141 8.267 7.665 7.134 7.245 7.827 8.165 7.708 6.633 5.736 + 5.615 5.781 6.231 7.061 8.180 9.253 9.828 9.607 8.662 7.417 6.402 5.921 5.909 6.082 6.241 6.439 6.847 7.443 7.859 7.596 6.493 5.018 4.047 4.234 5.457 6.860 7.500 7.096 6.237 5.847 6.339 7.226 7.525 6.649 4.994 3.687 + 5.997 5.954 6.016 6.358 7.021 7.826 8.444 8.573 8.132 7.315 6.486 5.966 5.872 6.101 6.447 6.738 6.888 6.852 6.576 6.023 5.269 4.552 4.178 4.321 4.855 5.406 5.596 5.314 4.788 4.382 4.291 4.384 4.339 3.949 3.334 2.867 + 5.772 5.711 5.630 5.605 5.730 6.058 6.541 7.010 7.243 7.076 6.511 5.728 5.014 4.641 4.744 5.257 5.925 6.388 6.339 5.691 4.671 3.734 3.320 3.577 4.250 4.839 4.940 4.526 3.949 3.641 3.754 4.040 4.062 3.580 2.788 2.184 + 6.356 6.273 6.235 6.407 6.854 7.454 7.930 7.993 7.520 6.646 5.695 4.989 4.679 4.699 4.861 4.995 5.024 4.933 4.718 4.388 4.029 3.827 3.966 4.449 5.012 5.245 4.903 4.132 3.426 3.257 3.693 4.294 4.437 3.821 2.749 1.924 + 4.382 5.123 6.150 6.890 7.044 6.716 6.226 5.817 5.520 5.264 5.046 4.975 5.126 5.399 5.548 5.386 4.964 4.541 4.356 4.429 4.564 4.564 4.415 4.275 4.273 4.347 4.297 4.010 3.618 3.403 3.518 3.803 3.885 3.522 2.854 2.326 + 1.950 2.996 4.546 5.894 6.615 6.740 6.569 6.340 6.067 5.650 5.107 4.664 4.591 4.953 5.511 5.878 5.809 5.364 4.829 4.482 4.408 4.494 4.569 4.530 4.360 4.086 3.737 3.372 3.101 3.034 3.182 3.401 3.474 3.279 2.909 2.617 + 3.515 3.691 4.129 4.864 5.747 6.474 6.772 6.583 6.094 5.584 5.240 5.084 5.052 5.099 5.216 5.356 5.382 5.142 4.624 4.031 3.683 3.778 4.226 4.702 4.890 4.716 4.372 4.122 4.077 4.128 4.079 3.840 3.493 3.195 3.035 2.987 + 2.463 3.059 4.124 5.400 6.527 7.175 7.194 6.707 6.031 5.497 5.269 5.316 5.500 5.699 5.852 5.909 5.792 5.433 4.873 4.313 4.031 4.187 4.685 5.207 5.419 5.197 4.698 4.222 3.990 4.004 4.081 4.010 3.702 3.230 2.766 2.484 + 3.836 4.260 4.993 5.839 6.575 7.018 7.081 6.792 6.280 5.715 5.249 4.966 4.880 4.956 5.136 5.350 5.508 5.513 5.301 4.904 4.470 4.208 4.262 4.597 4.987 5.153 4.945 4.462 3.989 3.797 3.944 4.234 4.378 4.214 3.842 3.539 + 5.817 6.071 6.442 6.738 6.820 6.674 6.400 6.136 5.963 5.862 5.749 5.554 5.293 5.066 4.991 5.107 5.325 5.475 5.416 5.142 4.798 4.587 4.627 4.854 5.066 5.066 4.814 4.468 4.275 4.378 4.689 4.930 4.826 4.315 3.626 3.137 + 5.492 5.775 6.283 6.850 7.207 7.108 6.519 5.704 5.093 4.998 5.387 5.916 6.199 6.096 5.782 5.558 5.569 5.688 5.654 5.335 4.869 4.564 4.639 5.035 5.457 5.595 5.353 4.892 4.485 4.307 4.330 4.372 4.261 3.958 3.582 3.325 + 5.622 5.886 6.400 7.060 7.644 7.897 7.706 7.201 6.677 6.384 6.354 6.414 6.369 6.175 5.946 5.797 5.701 5.504 5.089 4.538 4.103 4.006 4.244 4.576 4.720 4.576 4.291 4.116 4.193 4.454 4.714 4.837 4.824 4.769 4.745 4.749 + 5.506 5.863 6.541 7.390 8.120 8.423 8.181 7.574 6.955 6.583 6.437 6.294 5.974 5.535 5.204 5.125 5.174 5.043 4.537 3.795 3.224 3.163 3.597 4.166 4.469 4.382 4.122 4.002 4.137 4.357 4.398 4.158 3.773 3.469 3.351 3.348 + 6.232 6.124 6.214 6.778 7.712 8.531 8.739 8.246 7.448 6.896 6.853 7.118 7.266 7.050 6.612 6.314 6.386 6.724 7.010 7.028 6.860 6.786 7.001 7.417 7.741 7.731 7.415 7.065 6.973 7.228 7.672 8.042 8.159 8.023 7.778 7.599 + 2.784 3.367 4.457 5.841 7.159 8.035 8.292 8.074 7.733 7.563 7.572 7.513 7.134 6.433 5.691 5.246 5.222 5.448 5.624 5.596 5.467 5.473 5.740 6.151 6.437 6.414 6.137 5.854 5.812 6.066 6.461 6.759 6.807 6.619 6.340 6.144 + 4.669 5.479 6.581 7.327 7.404 7.014 6.650 6.694 7.141 7.669 7.923 7.763 7.302 6.744 6.219 5.743 5.289 4.861 4.483 4.142 3.777 3.349 2.934 2.724 2.905 3.505 4.336 5.090 5.508 5.501 5.140 4.565 3.904 3.260 2.734 2.434 + 5.150 5.622 6.268 6.746 6.947 7.034 7.235 7.590 7.899 7.912 7.568 7.050 6.612 6.354 6.158 5.836 5.326 4.749 4.275 3.952 3.687 3.381 3.076 2.948 3.138 3.594 4.087 4.393 4.461 4.408 4.350 4.243 3.925 3.316 2.578 2.063 + 5.097 5.291 5.647 6.137 6.741 7.412 8.023 8.381 8.348 7.974 7.512 7.270 7.380 7.682 7.824 7.522 6.760 5.790 4.924 4.324 3.942 3.635 3.337 3.103 3.031 3.143 3.364 3.599 3.815 4.026 4.193 4.177 3.818 3.103 2.268 1.702 + 5.351 5.720 6.228 6.635 6.913 7.233 7.733 8.309 8.657 8.548 8.080 7.657 7.668 8.154 8.755 8.968 8.515 7.504 6.286 5.182 4.326 3.714 3.347 3.282 3.540 4.010 4.470 4.750 4.852 4.896 4.932 4.821 4.331 3.399 2.303 1.553 + 3.846 4.786 5.918 6.430 6.177 5.772 5.967 6.922 8.051 8.566 8.207 7.456 7.087 7.465 8.268 8.821 8.691 7.980 7.101 6.350 5.708 5.050 4.447 4.200 4.532 5.287 5.981 6.195 5.933 5.572 5.430 5.405 5.057 4.091 2.764 1.792 + 3.691 3.659 3.765 4.207 5.032 6.105 7.203 8.156 8.886 9.341 9.432 9.079 8.348 7.539 7.078 7.248 7.941 8.668 8.854 8.242 7.087 6.002 5.550 5.883 6.680 7.414 7.717 7.586 7.281 7.046 6.885 6.563 5.833 4.696 3.482 2.692 + 3.719 3.928 4.341 4.965 5.807 6.833 7.916 8.846 9.413 9.506 9.166 8.542 7.828 7.226 6.948 7.170 7.916 8.929 9.696 9.709 8.837 7.507 6.495 6.401 7.209 8.286 8.856 8.591 7.809 7.138 6.913 6.874 6.418 5.215 3.611 2.456 + 4.825 4.527 4.252 4.419 5.240 6.568 7.983 9.049 9.553 9.552 9.235 8.743 8.117 7.415 6.845 6.741 7.327 8.453 9.572 10.050 9.616 8.601 7.724 7.561 8.109 8.819 9.068 8.682 8.057 7.759 7.953 8.186 7.754 6.355 4.475 3.127 + 2.203 2.839 3.748 4.559 5.239 6.062 7.228 8.523 9.387 9.361 8.502 7.368 6.579 6.365 6.500 6.644 6.720 6.942 7.514 8.322 8.977 9.173 8.981 8.769 8.811 8.996 8.949 8.451 7.732 7.290 7.375 7.668 7.494 6.458 4.904 3.741 + 4.041 4.315 4.732 5.178 5.679 6.355 7.234 8.104 8.591 8.423 7.656 6.663 5.886 5.557 5.617 5.858 6.135 6.453 6.883 7.442 8.055 8.633 9.123 9.478 9.587 9.291 8.552 7.607 6.918 6.853 7.342 7.826 7.620 6.473 4.851 3.674 + 3.455 3.523 3.891 4.757 6.012 7.218 7.891 7.853 7.339 6.785 6.472 6.331 6.079 5.537 4.843 4.382 4.490 5.194 6.209 7.169 7.887 8.417 8.891 9.317 9.522 9.306 8.669 7.883 7.333 7.227 7.424 7.507 7.086 6.103 4.921 4.117 + 3.786 3.737 3.808 4.177 4.836 5.553 6.021 6.075 5.807 5.472 5.269 5.187 5.038 4.665 4.128 3.716 3.756 4.371 5.386 6.458 7.317 7.919 8.384 8.798 9.065 8.970 8.391 7.483 6.639 6.225 6.302 6.562 6.565 6.091 5.331 4.758 + 3.544 3.574 3.693 3.939 4.252 4.483 4.506 4.333 4.128 4.101 4.346 4.763 5.123 5.232 5.060 4.755 4.525 4.507 4.719 5.101 5.599 6.188 6.820 7.359 7.596 7.359 6.655 5.715 4.883 4.415 4.319 4.367 4.273 3.906 3.393 3.021 + 4.110 4.437 4.953 5.433 5.661 5.552 5.210 4.862 4.695 4.710 4.725 4.551 4.189 3.871 3.891 4.341 5.004 5.502 5.589 5.344 5.096 5.144 5.521 5.997 6.292 6.317 6.207 6.156 6.220 6.280 6.185 5.921 5.631 5.482 5.503 5.578 + 5.249 5.379 5.626 5.914 6.090 6.002 5.625 5.118 4.729 4.609 4.694 4.776 4.704 4.539 4.511 4.800 5.333 5.798 5.870 5.475 4.862 4.430 4.436 4.831 5.340 5.690 5.803 5.801 5.865 6.075 6.362 6.586 6.654 6.571 6.425 6.320 + 5.327 6.162 7.354 8.267 8.506 8.100 7.378 6.677 6.133 5.697 5.309 5.028 5.004 5.327 5.908 6.513 6.911 7.024 6.941 6.825 6.788 6.852 6.989 7.190 7.473 7.843 8.248 8.591 8.779 8.783 8.640 8.422 8.191 7.985 7.829 7.743 + 7.039 7.226 7.499 7.711 7.741 7.526 7.067 6.431 5.763 5.280 5.188 5.559 6.251 6.961 7.416 7.551 7.538 7.623 7.908 8.266 8.475 8.439 8.306 8.350 8.726 9.318 9.820 9.983 9.812 9.528 9.359 9.335 9.302 9.105 8.774 8.512 + 7.314 7.114 6.857 6.731 6.833 7.094 7.306 7.255 6.871 6.297 5.824 5.726 6.089 6.758 7.429 7.836 7.898 7.740 7.578 7.555 7.660 7.763 7.750 7.631 7.539 7.626 7.931 8.333 8.621 8.643 8.410 8.093 7.898 7.925 8.108 8.271 + 6.136 6.519 7.042 7.406 7.479 7.366 7.284 7.348 7.483 7.506 7.336 7.108 7.083 7.421 7.996 8.441 8.403 7.828 7.028 6.487 6.518 7.054 7.720 8.119 8.109 7.863 7.675 7.704 7.865 7.942 7.808 7.555 7.413 7.535 7.851 8.116 + 5.076 5.278 5.565 5.800 5.934 6.040 6.239 6.580 6.973 7.244 7.265 7.060 6.790 6.626 6.608 6.612 6.464 6.110 5.705 5.525 5.771 6.399 7.135 7.646 7.760 7.560 7.283 7.124 7.090 7.025 6.752 6.221 5.544 4.903 4.441 4.210 + 3.365 3.886 4.846 6.052 7.190 7.901 7.931 7.302 6.343 5.551 5.314 5.669 6.282 6.685 6.600 6.134 5.682 5.614 6.003 6.598 7.064 7.260 7.328 7.509 7.878 8.234 8.268 7.840 7.130 6.497 6.183 6.112 5.993 5.604 5.026 4.588 + 7.415 7.118 6.815 6.866 7.414 8.240 8.884 8.945 8.358 7.453 6.736 6.564 6.933 7.534 8.012 8.218 8.256 8.323 8.502 8.705 8.796 8.766 8.771 8.986 9.405 9.797 9.876 9.548 9.004 8.568 8.419 8.431 8.302 7.840 7.174 6.680 + 6.172 5.710 5.170 5.008 5.383 6.026 6.449 6.329 5.763 5.185 5.034 5.422 6.069 6.531 6.539 6.184 5.813 5.761 6.119 6.706 7.241 7.547 7.624 7.589 7.536 7.487 7.427 7.380 7.417 7.566 7.728 7.686 7.252 6.437 5.517 4.906 + 5.402 5.239 5.122 5.267 5.675 6.078 6.119 5.631 4.794 4.038 3.762 4.064 4.689 5.208 5.304 4.960 4.435 4.073 4.098 4.511 5.132 5.729 6.123 6.236 6.085 5.749 5.350 5.015 4.835 4.816 4.865 4.834 4.611 4.202 3.747 3.447 + 5.017 4.644 4.279 4.366 5.033 5.958 6.598 6.574 5.937 5.101 4.527 4.407 4.587 4.742 4.647 4.341 4.070 4.102 4.556 5.350 6.276 7.115 7.723 8.054 8.146 8.084 7.961 7.834 7.698 7.486 7.118 6.556 5.839 5.091 4.470 4.118 + 5.045 4.887 4.883 5.332 6.183 6.978 7.174 6.573 5.505 4.605 4.351 4.735 5.316 5.591 5.380 4.925 4.654 4.840 5.414 6.076 6.551 6.787 6.927 7.134 7.429 7.687 7.774 7.672 7.490 7.336 7.190 6.896 6.294 5.398 4.459 3.852 + 3.296 3.877 4.742 5.535 6.093 6.465 6.734 6.834 6.596 5.979 5.237 4.816 5.013 5.708 6.424 6.690 6.402 5.883 5.606 5.826 6.451 7.188 7.798 8.207 8.414 8.381 8.048 7.476 6.918 6.669 6.795 7.004 6.836 6.070 4.974 4.171 + 3.553 4.811 6.560 7.794 7.926 7.096 5.939 5.081 4.752 4.791 4.924 5.036 5.196 5.488 5.843 6.058 5.975 5.638 5.301 5.269 5.709 6.565 7.584 8.436 8.832 8.640 7.954 7.094 6.465 6.328 6.612 6.934 6.850 6.199 5.255 4.567 + 4.886 5.755 6.971 7.833 7.896 7.194 6.134 5.197 4.674 4.608 4.886 5.355 5.878 6.329 6.608 6.690 6.655 6.639 6.743 6.966 7.239 7.511 7.801 8.135 8.455 8.604 8.448 8.029 7.594 7.421 7.573 7.806 7.745 7.208 6.400 5.800 + 4.989 6.090 7.408 7.917 7.277 6.031 5.047 4.773 4.964 5.076 4.860 4.574 4.642 5.154 5.753 5.999 5.837 5.675 5.975 6.787 7.675 8.126 8.030 7.751 7.738 8.067 8.391 8.313 7.820 7.307 7.184 7.455 7.714 7.558 7.010 6.518 + 5.338 6.055 7.032 7.670 7.620 6.959 6.059 5.292 4.826 4.619 4.567 4.624 4.793 5.038 5.242 5.267 5.064 4.737 4.481 4.474 4.793 5.403 6.184 6.964 7.543 7.753 7.557 7.125 6.769 6.752 7.084 7.480 7.561 7.155 6.463 5.935 + 6.052 6.389 6.821 7.043 6.902 6.458 5.887 5.314 4.752 4.174 3.634 3.284 3.267 3.570 3.985 4.224 4.116 3.727 3.331 3.256 3.715 4.704 5.997 7.225 8.009 8.125 7.632 6.880 6.342 6.332 6.780 7.263 7.295 6.695 5.755 5.056 + 4.294 5.283 6.557 7.213 6.780 5.518 4.184 3.472 3.563 4.082 4.464 4.391 3.975 3.585 3.499 3.674 3.816 3.668 3.269 2.982 3.260 4.302 5.869 7.366 8.168 7.987 7.045 5.950 5.344 5.522 6.272 7.028 7.248 6.772 5.920 5.274 + 6.104 6.902 7.819 8.036 7.232 5.820 4.604 4.161 4.446 4.902 4.942 4.388 3.540 2.874 2.657 2.791 2.967 2.965 2.852 2.926 3.494 4.634 6.098 7.406 8.077 7.883 6.994 5.925 5.272 5.373 6.084 6.859 7.110 6.617 5.696 4.984 + 7.392 7.520 7.803 8.201 8.543 8.599 8.252 7.624 7.007 6.648 6.556 6.520 6.313 5.897 5.449 5.178 5.126 5.144 5.073 4.958 5.072 5.693 6.815 8.051 8.846 8.850 8.170 7.298 6.777 6.840 7.276 7.618 7.471 6.787 5.890 5.267 + 6.098 6.755 7.841 8.965 9.703 9.791 9.263 8.449 7.791 7.568 7.741 8.003 8.016 7.637 6.975 6.264 5.678 5.248 4.934 4.749 4.800 5.194 5.902 6.721 7.377 7.696 7.706 7.584 7.512 7.550 7.627 7.620 7.466 7.201 6.928 6.757 + 6.206 6.669 7.459 8.322 8.964 9.158 8.859 8.243 7.619 7.260 7.244 7.424 7.545 7.413 7.014 6.481 5.968 5.542 5.187 4.897 4.769 4.967 5.586 6.509 7.405 7.912 7.868 7.437 6.993 6.850 7.026 7.234 7.116 6.538 5.731 5.151 + 3.995 4.562 5.433 6.245 6.732 6.824 6.601 6.190 5.704 5.249 4.940 4.856 4.962 5.075 4.958 4.488 3.774 3.106 2.773 2.882 3.317 3.865 4.375 4.827 5.263 5.682 5.997 6.108 5.990 5.720 5.404 5.090 4.755 4.376 4.007 3.770 + 3.892 4.320 5.186 6.361 7.467 7.989 7.580 6.348 4.851 3.768 3.473 3.824 4.316 4.478 4.190 3.694 3.342 3.306 3.488 3.679 3.785 3.918 4.275 4.928 5.720 6.347 6.578 6.407 6.044 5.741 5.618 5.600 5.524 5.294 4.974 4.740 + 4.336 3.911 3.581 3.911 4.968 6.205 6.863 6.559 5.568 4.573 4.130 4.279 4.624 4.730 4.491 4.143 3.982 4.069 4.204 4.175 4.010 4.000 4.443 5.344 6.352 6.984 6.973 6.450 5.822 5.451 5.395 5.400 5.137 4.491 3.679 3.114 + 3.461 3.432 3.454 3.626 3.980 4.425 4.781 4.887 4.720 4.447 4.331 4.561 5.103 5.696 6.013 5.859 5.298 4.603 4.093 3.968 4.260 4.870 5.641 6.399 6.968 7.207 7.077 6.698 6.298 6.070 6.016 5.932 5.567 4.847 3.996 3.414 + 1.782 2.281 3.171 4.230 5.163 5.693 5.697 5.259 4.621 4.042 3.686 3.592 3.733 4.066 4.527 4.988 5.265 5.225 4.910 4.566 4.511 4.917 5.677 6.474 7.003 7.177 7.141 7.118 7.200 7.280 7.153 6.692 5.953 5.134 4.459 4.086 + 2.727 3.469 4.726 6.108 7.192 7.674 7.474 6.741 5.749 4.758 3.929 3.335 3.028 3.055 3.406 3.946 4.432 4.639 4.517 4.250 4.132 4.354 4.868 5.423 5.757 5.772 5.568 5.314 5.103 4.896 4.615 4.242 3.863 3.586 3.452 3.415 + 2.114 2.612 3.383 4.093 4.467 4.413 4.040 3.565 3.177 2.942 2.803 2.662 2.476 2.296 2.214 2.278 2.432 2.550 2.533 2.408 2.328 2.479 2.934 3.574 4.136 4.366 4.180 3.711 3.214 2.890 2.759 2.666 2.420 1.960 1.421 1.055 + 4.281 3.956 3.596 3.495 3.663 3.807 3.620 3.073 2.454 2.095 2.071 2.149 2.037 1.687 1.351 1.330 1.670 2.098 2.269 2.094 1.838 1.885 2.378 3.069 3.510 3.414 2.877 2.280 1.980 2.048 2.260 2.305 2.019 1.474 0.898 0.537 + 4.266 3.954 3.531 3.252 3.247 3.431 3.580 3.509 3.218 2.885 2.706 2.721 2.766 2.620 2.208 1.700 1.394 1.471 1.835 2.183 2.264 2.093 1.939 2.072 2.495 2.913 2.968 2.560 1.953 1.559 1.588 1.859 1.963 1.632 0.994 0.485 + 2.775 3.458 4.182 4.250 3.544 2.610 2.144 2.363 2.850 2.993 2.580 1.979 1.755 2.125 2.753 3.087 2.867 2.334 1.952 1.951 2.143 2.172 1.907 1.592 1.594 2.013 2.565 2.825 2.613 2.131 1.750 1.667 1.779 1.847 1.767 1.650 + 2.772 3.386 3.980 3.894 3.070 2.109 1.712 2.047 2.641 2.876 2.591 2.203 2.257 2.856 3.542 3.726 3.236 2.454 1.934 1.895 2.095 2.161 2.009 1.908 2.139 2.627 2.961 2.797 2.235 1.757 1.765 2.164 2.436 2.140 1.370 0.712 + 4.129 3.866 3.572 3.543 3.918 4.549 5.064 5.100 4.555 3.682 2.946 2.734 3.102 3.753 4.248 4.294 3.911 3.360 2.924 2.725 2.693 2.690 2.645 2.592 2.599 2.685 2.813 2.947 3.097 3.282 3.450 3.456 3.149 2.522 1.788 1.292 + 3.701 3.767 4.128 4.999 6.311 7.663 8.543 8.657 8.082 7.188 6.388 5.948 5.956 6.373 7.080 7.855 8.369 8.294 7.510 6.242 4.989 4.243 4.184 4.598 5.065 5.291 5.299 5.353 5.680 6.223 6.624 6.449 5.489 3.940 2.347 1.342 + 2.426 3.259 4.649 6.179 7.478 8.358 8.834 9.022 9.009 8.791 8.337 7.710 7.140 6.945 7.335 8.208 9.126 9.516 9.008 7.685 6.070 4.840 4.436 4.839 5.641 6.359 6.751 6.918 7.126 7.498 7.837 7.718 6.811 5.196 3.427 2.269 + 2.209 3.385 5.172 6.819 7.855 8.294 8.460 8.636 8.820 8.794 8.394 7.728 7.164 7.096 7.667 8.659 9.588 9.950 9.473 8.251 6.727 5.502 5.053 5.490 6.494 7.521 8.143 8.306 8.287 8.382 8.564 8.433 7.533 5.810 3.824 2.486 + 1.786 3.077 5.041 6.845 7.938 8.291 8.239 8.132 8.083 7.993 7.765 7.476 7.361 7.636 8.322 9.206 9.925 10.132 9.636 8.506 7.087 5.906 5.442 5.858 6.881 7.947 8.567 8.645 8.487 8.464 8.603 8.487 7.584 5.785 3.666 2.224 + 3.178 4.182 5.683 7.019 7.807 8.110 8.264 8.535 8.902 9.128 9.011 8.583 8.109 7.902 8.122 8.682 9.297 9.619 9.386 8.553 7.355 6.247 5.700 5.931 6.758 7.704 8.332 8.537 8.562 8.692 8.884 8.693 7.615 5.599 3.291 1.740 + 3.870 4.718 6.025 7.268 8.108 8.518 8.687 8.798 8.899 8.924 8.807 8.565 8.299 8.147 8.237 8.636 9.264 9.838 9.932 9.220 7.776 6.173 5.214 5.408 6.579 7.961 8.751 8.702 8.255 8.059 8.310 8.484 7.770 5.858 3.391 1.649 + 1.354 2.825 5.042 7.054 8.274 8.721 8.795 8.852 8.956 8.967 8.771 8.421 8.072 7.863 7.875 8.172 8.781 9.566 10.138 9.988 8.879 7.165 5.709 5.328 6.179 7.616 8.685 8.882 8.494 8.230 8.450 8.742 8.266 6.591 4.275 2.592 + 3.029 4.361 6.132 7.342 7.715 7.793 8.262 9.194 9.960 9.867 8.870 7.660 7.055 7.320 8.060 8.720 9.123 9.483 9.941 10.204 9.766 8.524 7.116 6.514 7.171 8.545 9.530 9.455 8.703 8.303 8.838 9.737 9.692 7.913 5.048 2.865 + 2.814 3.964 5.461 6.451 6.793 7.091 7.989 9.436 10.658 10.861 9.958 8.627 7.685 7.415 7.514 7.613 7.749 8.255 9.193 10.015 9.939 8.747 7.186 6.457 7.168 8.722 9.793 9.515 8.259 7.254 7.363 8.195 8.427 7.102 4.664 2.729 + 2.284 2.902 3.851 4.825 5.758 6.802 8.037 9.242 9.973 9.898 9.076 7.912 6.859 6.161 5.869 6.016 6.685 7.821 9.013 9.578 9.040 7.617 6.220 5.822 6.679 8.083 8.929 8.646 7.660 6.950 7.084 7.638 7.556 6.173 3.960 2.273 + 2.876 3.095 3.562 4.327 5.407 6.696 7.902 8.645 8.673 8.048 7.122 6.292 5.745 5.425 5.245 5.297 5.822 6.892 8.139 8.866 8.541 7.290 5.909 5.299 5.761 6.765 7.416 7.229 6.518 6.034 6.201 6.643 6.503 5.268 3.363 1.928 + 2.072 3.050 4.309 5.158 5.578 6.138 7.238 8.495 8.962 8.022 6.087 4.346 3.764 4.282 4.997 5.128 4.803 4.851 5.833 7.307 8.121 7.521 5.946 4.708 4.794 5.937 6.890 6.647 5.417 4.388 4.491 5.386 5.722 4.464 2.024 0.059 + 3.969 3.790 3.723 4.171 5.361 7.103 8.777 9.634 9.244 7.812 6.069 4.802 4.359 4.517 4.805 4.977 5.197 5.779 6.745 7.653 7.904 7.270 6.156 5.313 5.236 5.780 6.337 6.393 5.953 5.439 5.195 5.093 4.651 3.558 2.101 1.046 + 3.053 3.514 4.304 5.271 6.325 7.405 8.358 8.900 8.750 7.859 6.514 5.197 4.309 3.977 4.102 4.553 5.276 6.207 7.108 7.569 7.270 6.299 5.208 4.668 4.974 5.811 6.516 6.613 6.149 5.556 5.168 4.871 4.239 3.018 1.509 0.446 + 2.347 2.644 3.341 4.494 5.947 7.303 8.085 8.018 7.214 6.112 5.210 4.757 4.662 4.665 4.629 4.687 5.098 5.933 6.890 7.432 7.194 6.317 5.408 5.117 5.655 6.643 7.412 7.506 6.975 6.222 5.585 5.043 4.305 3.192 1.933 1.074 + 3.025 3.449 4.251 5.311 6.419 7.291 7.663 7.416 6.669 5.745 5.001 4.630 4.577 4.644 4.698 4.806 5.150 5.796 6.528 6.934 6.713 5.955 5.136 4.783 5.080 5.727 6.188 6.112 5.571 4.924 4.448 4.081 3.523 2.592 1.491 0.727 + 4.718 4.330 4.029 4.349 5.398 6.702 7.513 7.348 6.338 5.109 4.303 4.135 4.326 4.446 4.339 4.258 4.581 5.382 6.243 6.527 5.899 4.660 3.585 3.358 4.056 5.098 5.712 5.517 4.768 4.068 3.815 3.888 3.806 3.226 2.304 1.597 + 3.553 3.824 4.356 5.114 5.984 6.735 7.047 6.668 5.633 4.347 3.405 3.215 3.702 4.369 4.698 4.573 4.350 4.489 5.074 5.657 5.621 4.752 3.501 2.685 2.841 3.801 4.840 5.273 4.963 4.322 3.853 3.685 3.539 3.097 2.401 1.857 + 3.620 3.779 3.991 4.160 4.293 4.488 4.794 5.115 5.245 5.031 4.513 3.913 3.482 3.346 3.478 3.786 4.193 4.630 4.974 5.036 4.691 4.029 3.376 3.100 3.344 3.908 4.396 4.527 4.330 4.057 3.900 3.792 3.479 2.809 1.957 1.351 + 4.457 4.180 3.917 4.003 4.523 5.220 5.679 5.630 5.132 4.504 4.059 3.892 3.865 3.790 3.628 3.528 3.676 4.093 4.579 4.837 4.694 4.227 3.699 3.360 3.284 3.356 3.416 3.401 3.379 3.436 3.541 3.524 3.197 2.539 1.771 1.251 + 1.624 1.811 2.252 2.988 3.928 4.822 5.359 5.345 4.830 4.098 3.514 3.308 3.470 3.796 4.059 4.174 4.216 4.313 4.497 4.651 4.597 4.242 3.667 3.083 2.702 2.621 2.806 3.157 3.566 3.929 4.116 3.977 3.425 2.542 1.613 1.015 + 5.147 4.947 4.515 3.924 3.429 3.318 3.650 4.134 4.331 4.040 3.495 3.175 3.374 3.938 4.426 4.537 4.391 4.372 4.693 5.126 5.191 4.642 3.763 3.159 3.213 3.721 4.081 3.869 3.245 2.791 2.927 3.455 3.717 3.219 2.147 1.267 + 4.250 4.268 4.246 4.172 4.148 4.301 4.612 4.846 4.716 4.151 3.429 2.999 3.125 3.665 4.198 4.378 4.217 4.016 4.038 4.232 4.291 3.976 3.388 2.916 2.902 3.331 3.855 4.100 3.978 3.691 3.457 3.246 2.816 2.010 1.017 0.317 + 4.474 4.133 3.789 3.807 4.249 4.793 4.997 4.668 4.023 3.502 3.414 3.710 4.064 4.188 4.071 3.963 4.116 4.526 4.908 4.924 4.459 3.731 3.132 2.953 3.200 3.634 3.975 4.092 4.032 3.904 3.737 3.444 2.919 2.176 1.413 0.924 + 3.763 3.276 2.732 2.609 3.024 3.644 3.998 3.893 3.566 3.436 3.709 4.190 4.468 4.299 3.833 3.483 3.563 4.016 4.458 4.499 4.052 3.379 2.876 2.785 3.064 3.477 3.794 3.916 3.869 3.707 3.449 3.080 2.609 2.101 1.667 1.417 + 2.178 2.107 2.091 2.286 2.751 3.367 3.872 4.017 3.738 3.225 2.818 2.790 3.167 3.727 4.179 4.374 4.381 4.369 4.424 4.461 4.316 3.937 3.473 3.181 3.218 3.506 3.792 3.852 3.655 3.344 3.071 2.853 2.577 2.156 1.667 1.329 + 4.459 3.353 1.956 1.267 1.734 2.959 4.075 4.428 4.012 3.356 3.024 3.179 3.565 3.830 3.872 3.885 4.110 4.562 4.980 5.048 4.675 4.077 3.603 3.475 3.640 3.853 3.876 3.640 3.244 2.847 2.541 2.319 2.125 1.922 1.733 1.614 + 3.950 3.777 3.523 3.327 3.299 3.446 3.654 3.759 3.670 3.451 3.296 3.380 3.716 4.133 4.408 4.444 4.344 4.304 4.421 4.585 4.558 4.188 3.565 2.992 2.766 2.964 3.398 3.752 3.801 3.523 3.053 2.548 2.095 1.714 1.419 1.251 + 5.161 4.423 3.571 3.300 3.779 4.525 4.844 4.444 3.654 3.087 3.094 3.493 3.811 3.769 3.543 3.554 4.025 4.711 5.083 4.781 3.940 3.087 2.719 2.924 3.367 3.599 3.420 2.990 2.639 2.579 2.755 2.925 2.875 2.568 2.159 1.874 + 3.780 3.147 2.370 2.031 2.349 3.051 3.651 3.862 3.774 3.684 3.765 3.915 3.909 3.680 3.432 3.470 3.888 4.438 4.694 4.399 3.678 2.943 2.586 2.702 3.074 3.380 3.430 3.254 3.003 2.798 2.654 2.519 2.357 2.180 2.030 1.947 + 4.552 3.845 3.038 2.810 3.334 4.156 4.629 4.471 3.946 3.536 3.470 3.553 3.450 3.095 2.800 2.944 3.546 4.158 4.217 3.532 2.485 1.733 1.696 2.261 2.943 3.307 3.285 3.122 3.083 3.198 3.277 3.116 2.686 2.138 1.670 1.412 + 2.447 2.473 2.585 2.861 3.327 3.906 4.422 4.677 4.575 4.192 3.733 3.398 3.244 3.174 3.051 2.846 2.679 2.716 3.000 3.378 3.598 3.508 3.181 2.861 2.769 2.933 3.183 3.300 3.184 2.908 2.618 2.403 2.247 2.088 1.918 1.799 + 2.415 2.056 1.633 1.522 1.913 2.670 3.415 3.786 3.669 3.254 2.891 2.840 3.118 3.530 3.833 3.917 3.850 3.787 3.817 3.896 3.894 3.723 3.417 3.108 2.930 2.920 3.009 3.089 3.090 3.008 2.870 2.692 2.467 2.202 1.947 1.787 + 2.451 2.578 2.782 3.002 3.205 3.385 3.536 3.631 3.631 3.533 3.396 3.320 3.375 3.561 3.807 4.036 4.210 4.334 4.411 4.401 4.243 3.911 3.470 3.059 2.814 2.782 2.903 3.061 3.152 3.133 3.003 2.776 2.462 2.099 1.762 1.556 + 3.196 2.784 2.407 2.541 3.235 4.021 4.297 3.827 2.959 2.350 2.456 3.199 4.068 4.536 4.429 3.980 3.570 3.416 3.461 3.498 3.379 3.116 2.829 2.630 2.557 2.583 2.660 2.737 2.754 2.660 2.460 2.240 2.129 2.197 2.387 2.547 + 4.222 3.465 2.701 2.707 3.542 4.467 4.631 3.851 2.768 2.252 2.622 3.410 3.862 3.660 3.177 3.046 3.500 4.130 4.282 3.698 2.773 2.191 2.312 2.879 3.299 3.198 2.718 2.312 2.287 2.547 2.749 2.665 2.372 2.114 2.031 2.055 + 2.930 3.099 3.346 3.564 3.708 3.805 3.886 3.932 3.884 3.718 3.492 3.305 3.213 3.172 3.086 2.917 2.739 2.685 2.811 3.021 3.133 3.032 2.780 2.571 2.564 2.745 2.942 2.968 2.780 2.493 2.261 2.141 2.067 1.947 1.773 1.639 + 2.211 2.163 2.211 2.501 3.031 3.610 3.972 3.947 3.568 3.027 2.554 2.302 2.312 2.545 2.920 3.334 3.668 3.826 3.785 3.625 3.479 3.440 3.487 3.496 3.349 3.032 2.657 2.383 2.293 2.341 2.391 2.320 2.095 1.780 1.486 1.313 + 2.364 1.953 1.483 1.359 1.711 2.331 2.892 3.221 3.358 3.401 3.325 3.025 2.511 2.041 1.981 2.485 3.291 3.871 3.854 3.332 2.785 2.661 2.988 3.366 3.339 2.808 2.111 1.709 1.791 2.144 2.376 2.262 1.892 1.521 1.316 1.258 + 1.630 1.661 1.849 2.280 2.844 3.268 3.319 3.011 2.595 2.358 2.395 2.574 2.691 2.677 2.635 2.704 2.895 3.069 3.084 2.946 2.806 2.797 2.883 2.877 2.629 2.202 1.861 1.860 2.209 2.646 2.822 2.552 1.923 1.194 0.613 0.307 + 2.898 2.364 1.811 1.813 2.493 3.400 3.875 3.584 2.773 2.034 1.828 2.161 2.663 2.948 2.919 2.766 2.727 2.858 3.025 3.081 3.031 3.014 3.129 3.306 3.340 3.077 2.571 2.062 1.798 1.846 2.045 2.128 1.914 1.427 0.870 0.503 + 3.463 2.476 1.312 0.910 1.570 2.726 3.441 3.177 2.174 1.193 0.874 1.293 2.034 2.623 2.889 2.970 3.035 3.067 2.919 2.550 2.154 2.033 2.313 2.796 3.096 2.951 2.436 1.886 1.619 1.697 1.914 1.988 1.771 1.329 0.859 0.565 + 3.396 2.797 2.164 2.123 2.795 3.664 3.993 3.436 2.320 1.384 1.198 1.761 2.570 3.069 3.063 2.785 2.607 2.699 2.927 3.036 2.913 2.677 2.544 2.614 2.779 2.835 2.661 2.321 1.994 1.809 1.740 1.636 1.351 0.875 0.355 0.016 + 2.698 2.234 1.766 1.811 2.482 3.370 3.862 3.634 2.900 2.222 2.048 2.379 2.815 2.926 2.609 2.148 1.942 2.162 2.622 2.952 2.916 2.588 2.268 2.223 2.476 2.804 2.928 2.723 2.284 1.822 1.496 1.315 1.182 1.005 0.794 0.643 + 2.321 1.678 1.009 1.019 1.894 3.134 3.949 3.887 3.154 2.406 2.197 2.573 3.109 3.315 3.025 2.474 2.046 1.953 2.120 2.319 2.396 2.368 2.350 2.408 2.498 2.515 2.399 2.174 1.911 1.662 1.439 1.241 1.080 0.977 0.933 0.925 + 2.891 2.884 2.915 3.024 3.188 3.310 3.254 2.939 2.402 1.804 1.358 1.223 1.419 1.823 2.239 2.497 2.530 2.382 2.151 1.922 1.724 1.549 1.396 1.307 1.352 1.573 1.925 2.275 2.456 2.365 2.026 1.576 1.186 0.962 0.894 0.899 + 1.020 1.203 1.465 1.699 1.880 2.053 2.234 2.333 2.203 1.787 1.228 0.808 0.763 1.102 1.603 1.980 2.088 1.992 1.866 1.828 1.863 1.883 1.843 1.789 1.799 1.887 1.979 1.978 1.858 1.675 1.498 1.327 1.101 0.780 0.425 0.185 + 0.709 0.413 0.134 0.217 0.737 1.424 1.897 1.964 1.755 1.560 1.566 1.722 1.846 1.855 1.869 2.096 2.604 3.190 3.506 3.308 2.653 1.858 1.269 1.036 1.065 1.145 1.132 1.026 0.920 0.876 0.870 0.812 0.637 0.359 0.070 -0.113 + 1.610 1.578 1.629 1.855 2.190 2.416 2.326 1.899 1.335 0.918 0.830 1.062 1.473 1.929 2.365 2.743 2.990 2.986 2.668 2.120 1.563 1.226 1.193 1.362 1.543 1.613 1.579 1.531 1.522 1.507 1.383 1.088 0.661 0.216 -0.134 -0.320 + 2.609 2.223 1.793 1.710 2.090 2.668 3.008 2.834 2.228 1.539 1.124 1.115 1.401 1.772 2.077 2.263 2.313 2.186 1.833 1.282 0.688 0.271 0.187 0.432 0.852 1.238 1.444 1.425 1.219 0.901 0.562 0.291 0.160 0.183 0.298 0.398 + 1.279 1.259 1.343 1.667 2.250 2.915 3.350 3.283 2.665 1.742 0.946 0.655 0.980 1.714 2.465 2.907 2.941 2.699 2.387 2.120 1.866 1.527 1.075 0.614 0.316 0.290 0.489 0.732 0.822 0.672 0.351 0.022 -0.167 -0.172 -0.062 0.039 + 1.092 0.267 -0.671 -0.881 -0.072 1.271 2.286 2.414 1.804 1.128 1.010 1.544 2.267 2.578 2.210 1.397 0.646 0.343 0.523 0.925 1.243 1.337 1.269 1.187 1.200 1.326 1.515 1.699 1.813 1.797 1.611 1.258 0.796 0.324 -0.054 -0.261 + 3.430 2.241 0.775 0.110 0.634 1.785 2.589 2.496 1.793 1.296 1.619 2.669 3.763 4.203 3.802 2.932 2.151 1.768 1.712 1.727 1.641 1.464 1.281 1.112 0.900 0.621 0.359 0.255 0.373 0.621 0.816 0.829 0.673 0.461 0.298 0.220 + 1.335 1.237 1.339 1.895 2.786 3.539 3.703 3.253 2.628 2.359 2.621 3.102 3.306 3.005 2.419 1.984 1.937 2.104 2.084 1.640 0.939 0.413 0.395 0.849 1.420 1.730 1.662 1.388 1.167 1.119 1.158 1.105 0.855 0.453 0.048 -0.202 + 3.932 3.597 3.087 2.656 2.534 2.790 3.258 3.613 3.573 3.098 2.429 1.915 1.768 1.927 2.139 2.174 1.984 1.687 1.419 1.224 1.077 0.996 1.077 1.396 1.860 2.184 2.081 1.517 0.791 0.344 0.411 0.835 1.194 1.169 0.806 0.460 + 1.466 1.348 1.330 1.632 2.248 2.892 3.192 2.959 2.321 1.629 1.206 1.156 1.362 1.629 1.835 1.966 2.038 2.017 1.830 1.447 0.964 0.574 0.460 0.669 1.083 1.491 1.703 1.643 1.350 0.938 0.530 0.220 0.053 0.018 0.059 0.105 + 4.898 4.078 3.041 2.495 2.671 3.145 3.200 2.426 1.061 -0.182 -0.640 -0.143 0.933 2.004 2.680 2.924 2.915 2.809 2.620 2.307 1.922 1.643 1.644 1.929 2.287 2.436 2.221 1.727 1.203 0.867 0.756 0.727 0.587 0.259 -0.153 -0.441 + 2.209 1.876 1.417 1.082 0.971 0.974 0.882 0.589 0.189 -0.077 0.003 0.463 1.148 1.826 2.325 2.597 2.687 2.657 2.544 2.369 2.165 1.983 1.863 1.798 1.744 1.654 1.522 1.388 1.298 1.262 1.238 1.161 0.989 0.742 0.494 0.338 + 3.550 3.304 3.076 3.118 3.393 3.563 3.287 2.546 1.712 1.276 1.466 2.082 2.670 2.878 2.683 2.338 2.119 2.121 2.245 2.352 2.389 2.396 2.401 2.365 2.220 1.962 1.675 1.464 1.353 1.268 1.118 0.897 0.700 0.624 0.673 0.747 + 4.305 4.361 4.524 4.808 5.093 5.140 4.730 3.833 2.682 1.674 1.154 1.225 1.708 2.276 2.658 2.769 2.705 2.618 2.591 2.599 2.570 2.471 2.345 2.272 2.288 2.345 2.344 2.205 1.932 1.612 1.354 1.229 1.233 1.314 1.405 1.461 + 1.830 2.106 2.495 2.806 2.971 3.058 3.156 3.254 3.246 3.052 2.727 2.443 2.353 2.472 2.683 2.863 2.989 3.124 3.297 3.431 3.403 3.191 2.950 2.903 3.143 3.512 3.709 3.532 3.048 2.539 2.249 2.190 2.159 1.961 1.613 1.333 + 1.600 1.463 1.397 1.633 2.205 2.868 3.231 3.029 2.326 1.497 0.987 1.021 1.473 1.993 2.279 2.281 2.189 2.237 2.494 2.830 3.068 3.162 3.237 3.441 3.762 3.990 3.879 3.376 2.701 2.196 2.059 2.190 2.294 2.143 1.782 1.479 + 0.895 1.025 1.309 1.747 2.261 2.689 2.862 2.708 2.334 1.982 1.893 2.140 2.566 2.880 2.859 2.503 2.032 1.726 1.730 1.975 2.268 2.457 2.534 2.592 2.701 2.829 2.878 2.794 2.635 2.522 2.508 2.509 2.369 2.013 1.548 1.216 + 4.390 3.935 3.303 2.813 2.568 2.428 2.217 1.941 1.791 1.923 2.253 2.476 2.336 1.873 1.427 1.356 1.732 2.285 2.646 2.657 2.485 2.422 2.601 2.875 2.971 2.758 2.374 2.102 2.115 2.331 2.492 2.376 1.954 1.383 0.875 0.587 + 3.470 3.383 3.119 2.642 2.103 1.772 1.826 2.174 2.510 2.568 2.335 2.049 1.968 2.145 2.402 2.531 2.497 2.454 2.569 2.834 3.068 3.099 2.934 2.744 2.676 2.685 2.584 2.249 1.786 1.474 1.514 1.827 2.111 2.109 1.838 1.572 + 4.263 3.389 2.263 1.664 1.951 2.831 3.617 3.755 3.203 2.404 1.922 2.059 2.705 3.196 3.428 3.947 4.656 5.328 5.755 5.906 5.938 6.059 6.337 6.644 6.770 6.611 6.273 6.000 5.991 6.272 6.694 7.060 7.247 7.257 7.178 7.108 + 2.025 1.823 1.607 1.615 1.946 2.450 2.796 2.693 2.127 1.431 1.101 1.468 2.441 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 4.368 3.804 3.062 2.599 2.590 2.824 2.924 2.691 2.271 2.011 2.160 2.662 3.210 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.022 2.914 2.794 2.739 2.702 2.556 2.258 1.954 1.903 2.266 2.942 3.622 4.025 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.505 3.257 2.874 2.501 2.227 2.048 1.915 1.807 1.772 1.888 2.187 2.615 3.053 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.499 2.803 1.948 1.561 1.846 2.455 2.820 2.656 2.182 1.896 2.127 2.769 3.400 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 1.665 1.718 1.681 1.424 0.991 0.616 0.568 0.952 1.631 2.335 2.847 3.131 3.289 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.066 1.514 0.818 0.475 0.699 1.288 1.822 2.008 1.883 1.743 1.883 2.381 3.079 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.385 1.567 0.517 -0.027 0.307 1.314 2.430 3.161 3.365 3.229 3.028 2.926 2.932 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.774 3.442 2.995 2.719 2.783 3.141 3.595 3.933 4.060 4.019 3.927 3.883 3.914 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.115 2.418 2.914 3.443 3.861 4.099 4.160 4.101 3.991 3.902 3.899 4.030 4.299 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.653 2.893 3.225 3.468 3.542 3.513 3.519 3.650 3.890 4.147 4.339 4.446 4.500 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.685 3.584 3.524 3.634 3.878 4.060 3.998 3.700 3.372 3.253 3.426 3.776 4.134 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.770 3.256 2.546 2.070 2.093 2.562 3.165 3.554 3.573 3.347 3.176 3.322 3.848 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 4.634 4.055 3.490 3.560 4.315 5.150 5.320 4.578 3.375 2.472 2.337 2.871 3.641 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.004 2.933 2.896 3.027 3.381 3.876 4.323 4.540 4.477 4.265 4.142 4.311 4.799 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 3.057 3.257 3.454 3.435 3.188 2.936 2.957 3.358 3.987 4.568 4.928 5.126 5.359 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.199 2.576 3.035 3.240 3.105 2.859 2.843 3.224 3.864 4.464 4.823 4.987 5.168 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 4.303 3.857 3.351 3.180 3.372 3.582 3.475 3.092 2.851 3.150 3.969 4.860 5.331 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 4.476 3.884 3.095 2.581 2.535 2.778 2.988 3.001 2.930 3.003 3.322 3.774 4.163 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.175 1.748 1.223 1.011 1.310 1.991 2.733 3.259 3.486 3.497 3.409 3.291 3.191 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 2.504 2.598 2.775 3.002 3.231 3.414 3.529 3.595 3.652 3.741 3.884 4.086 4.346 4.659 4.999 5.305 5.505 5.567 5.543 5.554 5.720 6.058 6.459 6.748 6.808 6.675 6.516 6.520 6.764 7.158 7.502 7.612 7.424 7.021 6.587 6.311 + 3.175 3.116 3.074 3.143 3.360 3.661 3.915 4.008 3.950 3.890 4.031 4.475 5.122 5.698 5.922 5.697 5.194 4.760 4.718 5.186 6.026 6.940 7.623 7.887 7.706 7.202 6.605 6.183 6.144 6.526 7.144 7.657 7.762 7.391 6.779 6.322 + 3.426 3.256 3.094 3.136 3.411 3.749 3.915 3.805 3.539 3.366 3.487 3.918 4.490 4.969 5.180 5.085 4.787 4.484 4.403 4.706 5.388 6.239 6.917 7.133 6.837 6.260 5.765 5.612 5.795 6.091 6.257 6.211 6.054 5.941 5.935 5.974 + 5.617 4.994 4.213 3.804 3.921 4.248 4.323 3.974 3.485 3.333 3.764 4.563 5.228 5.372 5.000 4.456 4.114 4.116 4.334 4.563 4.700 4.776 4.844 4.877 4.798 4.602 4.418 4.441 4.771 5.317 5.837 6.100 6.024 5.704 5.333 5.095 + 4.689 4.521 4.331 4.259 4.293 4.257 3.972 3.439 2.880 2.600 2.781 3.372 4.156 4.907 5.511 5.958 6.260 6.393 6.328 6.099 5.827 5.657 5.667 5.816 5.996 6.107 6.115 6.026 5.841 5.544 5.135 4.671 4.260 3.987 3.867 3.838 + 3.818 3.493 3.137 3.091 3.443 3.946 4.208 3.997 3.414 2.815 2.555 2.775 3.373 4.140 4.905 5.586 6.123 6.429 6.414 6.090 5.620 5.262 5.209 5.463 5.836 6.090 6.098 5.908 5.669 5.493 5.359 5.139 4.721 4.120 3.504 3.111 + 4.709 4.294 3.683 3.202 3.099 3.383 3.790 3.942 3.612 2.915 2.268 2.110 2.583 3.424 4.157 4.427 4.221 3.808 3.474 3.307 3.201 3.033 2.826 2.717 2.789 2.949 2.992 2.807 2.509 2.348 2.473 2.765 2.922 2.731 2.281 1.908 + 4.985 4.787 4.369 3.767 3.130 2.667 2.502 2.570 2.661 2.598 2.384 2.198 2.222 2.470 2.759 2.857 2.677 2.345 2.090 2.054 2.193 2.340 2.359 2.244 2.104 2.048 2.106 2.232 2.360 2.452 2.485 2.427 2.239 1.926 1.580 1.350 + 5.604 5.245 4.923 5.003 5.403 5.616 5.177 4.128 3.024 2.477 2.658 3.208 3.618 3.678 3.576 3.604 3.824 4.052 4.147 4.263 4.726 5.637 6.618 7.023 6.496 5.345 4.364 4.209 4.883 5.796 6.338 6.410 6.437 6.864 7.658 8.306 + 5.586 5.022 4.368 4.120 4.328 4.558 4.310 3.493 2.506 1.882 1.850 2.222 2.658 2.997 3.310 3.679 3.996 4.053 3.843 3.707 4.096 5.111 6.288 6.898 6.562 5.613 4.845 4.839 5.486 6.136 6.248 5.914 5.753 6.279 7.343 8.212 + 4.156 3.456 2.594 2.167 2.315 2.621 2.522 1.855 1.043 0.754 1.329 2.491 3.556 3.969 3.685 3.106 2.669 2.489 2.345 1.997 1.493 1.171 1.365 2.069 2.882 3.286 3.030 2.310 1.616 1.368 1.639 2.146 2.493 2.471 2.175 1.904 + 2.197 2.234 2.442 2.893 3.421 3.665 3.344 2.526 1.645 1.229 1.524 2.337 3.199 3.708 3.769 3.559 3.313 3.119 2.912 2.628 2.335 2.207 2.373 2.772 3.183 3.385 3.329 3.171 3.143 3.372 3.794 4.206 4.418 4.374 4.179 4.014 + 4.643 4.038 3.294 2.939 3.108 3.432 3.374 2.697 1.688 0.932 0.875 1.516 2.468 3.281 3.725 3.837 3.749 3.523 3.144 2.637 2.159 1.930 2.077 2.526 3.068 3.526 3.874 4.213 4.628 5.072 5.376 5.378 5.041 4.490 3.943 3.609 + 4.685 4.586 4.487 4.488 4.586 4.636 4.442 3.911 3.164 2.495 2.188 2.319 2.696 3.002 3.030 2.826 2.626 2.630 2.820 2.982 2.912 2.619 2.335 2.306 2.555 2.845 2.889 2.627 2.310 2.293 2.703 3.295 3.622 3.416 2.832 2.340 + 4.457 4.137 3.823 3.861 4.271 4.687 4.649 3.987 2.983 2.154 1.861 2.052 2.362 2.442 2.244 2.016 2.040 2.368 2.775 2.965 2.835 2.559 2.437 2.631 3.039 3.377 3.412 3.142 2.770 2.533 2.509 2.573 2.521 2.251 1.859 1.572 + 6.045 5.819 5.534 5.402 5.520 5.771 5.890 5.646 5.028 4.283 3.755 3.638 3.832 4.030 3.975 3.676 3.387 3.371 3.658 4.015 4.172 4.085 3.999 4.217 4.800 5.467 5.813 5.657 5.208 4.869 4.867 5.031 4.948 4.367 3.477 2.806 + 12.291 12.020 11.610 11.238 11.013 10.887 10.678 10.209 9.473 8.688 8.160 8.050 8.234 8.402 8.326 8.087 8.018 8.404 9.176 9.909 10.146 9.796 9.247 9.069 9.538 10.410 11.117 11.247 10.873 10.454 10.418 10.800 11.263 11.444 11.288 11.067 + 13.355 13.937 14.643 14.918 14.525 13.655 12.687 11.869 11.205 10.614 10.126 9.894 10.001 10.316 10.587 10.693 10.806 11.238 12.094 13.071 13.644 13.499 12.836 12.236 12.189 12.704 13.351 13.670 13.573 13.360 13.366 13.602 13.752 13.520 12.969 12.503 + 13.643 14.391 15.417 16.110 16.108 15.452 14.442 13.394 12.506 11.893 11.636 11.742 12.049 12.268 12.198 11.962 11.987 12.668 13.966 15.329 16.059 15.864 15.096 14.463 14.443 14.939 15.455 15.624 15.550 15.621 15.997 16.292 15.838 14.339 12.313 10.855 + 14.020 14.847 15.993 16.806 16.906 16.340 15.416 14.428 13.539 12.844 12.451 12.427 12.656 12.848 12.761 12.485 12.462 13.146 14.550 16.108 17.039 16.954 16.162 15.413 15.283 15.756 16.361 16.689 16.774 16.946 17.334 17.540 16.910 15.184 12.943 11.354 + 13.839 14.864 16.243 17.152 17.177 16.484 15.518 14.586 13.744 12.988 12.450 12.327 12.601 12.934 12.934 12.595 12.428 13.062 14.612 16.423 17.500 17.317 16.266 15.334 15.268 16.000 16.829 17.168 17.092 17.148 17.622 18.050 17.523 15.595 12.924 10.983 + 13.742 14.838 16.304 17.247 17.235 16.468 15.435 14.460 13.578 12.761 12.156 12.001 12.308 12.719 12.788 12.464 12.268 12.884 14.475 16.381 17.564 17.449 16.428 15.518 15.487 16.239 17.027 17.247 17.028 17.010 17.543 18.134 17.779 15.943 13.273 11.301 + 13.659 14.791 16.278 17.185 17.088 16.249 15.210 14.291 13.461 12.633 11.956 11.732 12.042 12.536 12.704 12.417 12.164 12.664 14.144 15.983 17.141 17.032 16.043 15.195 15.235 16.015 16.740 16.820 16.475 16.448 17.121 17.913 17.677 15.788 12.941 10.816 + 13.666 14.633 15.869 16.540 16.287 15.379 14.333 13.453 12.708 12.003 11.448 11.286 11.571 11.991 12.126 11.907 11.801 12.412 13.847 15.458 16.303 15.959 14.931 14.231 14.478 15.373 16.046 15.953 15.430 15.332 16.069 17.013 16.931 15.140 12.327 10.204 + 12.161 12.745 13.488 13.888 13.745 13.254 12.775 12.514 12.414 12.301 12.079 11.778 11.442 11.044 10.569 10.167 10.154 10.771 11.888 12.980 13.476 13.208 12.567 12.155 12.259 12.616 12.720 12.381 11.982 12.125 12.981 13.962 14.116 12.959 11.016 9.530 + 11.396 11.395 11.169 10.518 9.516 8.508 7.852 7.639 7.649 7.564 7.236 6.751 6.294 5.974 5.788 5.735 5.895 6.349 7.018 7.628 7.888 7.748 7.463 7.370 7.553 7.760 7.665 7.262 6.974 7.303 8.295 9.341 9.574 8.592 6.894 5.591 + 10.878 10.840 10.484 9.592 8.320 7.144 6.468 6.283 6.219 5.921 5.369 4.830 4.522 4.385 4.226 4.056 4.212 5.036 6.405 7.623 7.907 7.075 5.790 5.042 5.306 6.138 6.640 6.355 5.746 5.747 6.760 8.089 8.421 7.006 4.478 2.509 + 11.732 11.386 10.644 9.574 8.456 7.634 7.210 6.929 6.396 5.482 4.484 3.865 3.799 3.997 4.018 3.779 3.712 4.355 5.726 7.126 7.641 6.952 5.673 4.870 5.133 6.081 6.750 6.540 5.795 5.445 6.033 7.071 7.394 6.248 4.107 2.412 + 11.467 11.121 10.415 9.433 8.409 7.612 7.128 6.787 6.326 5.660 4.972 4.516 4.334 4.201 3.903 3.564 3.643 4.510 5.971 7.251 7.543 6.704 5.433 4.716 4.993 5.804 6.263 5.933 5.260 5.135 5.949 7.067 7.277 5.892 3.504 1.659 + 11.116 11.153 11.027 10.529 9.642 8.551 7.481 6.548 5.779 5.243 5.097 5.451 6.171 6.872 7.179 7.041 6.791 6.840 7.276 7.751 7.809 7.354 6.800 6.706 7.220 7.871 7.962 7.239 6.211 5.765 6.382 7.666 8.644 8.595 7.687 6.822 + 11.121 11.913 12.799 12.998 12.296 11.169 10.292 9.954 9.916 9.782 9.456 9.212 9.331 9.745 10.087 10.099 9.954 10.107 10.791 11.688 12.158 11.844 11.078 10.626 10.984 11.895 12.560 12.400 11.619 11.038 11.324 12.347 13.289 13.411 12.745 12.045 + 11.630 12.072 12.600 12.797 12.510 11.913 11.293 10.798 10.385 9.974 9.614 9.447 9.522 9.693 9.757 9.703 9.816 10.443 11.615 12.891 13.625 13.480 12.725 12.038 11.961 12.482 13.114 13.382 13.249 13.105 13.336 13.926 14.465 14.557 14.211 13.836 + 11.842 12.875 14.163 14.785 14.389 13.361 12.370 11.789 11.504 11.229 10.893 10.695 10.789 11.018 11.048 10.781 10.587 11.025 12.259 13.753 14.627 14.394 13.418 12.614 12.637 13.324 13.906 13.803 13.206 12.883 13.367 14.344 14.867 14.245 12.764 11.530 + 12.974 13.942 15.177 15.849 15.624 14.792 13.869 13.110 12.422 11.685 11.060 10.901 11.345 12.042 12.401 12.160 11.721 11.853 12.969 14.658 15.948 16.106 15.254 14.223 13.804 14.077 14.461 14.385 13.887 13.549 13.836 14.529 14.852 14.223 12.883 11.785 + 13.331 14.351 15.645 16.337 16.084 15.219 14.308 13.616 12.992 12.234 11.460 11.068 11.295 11.892 12.288 12.152 11.787 11.903 12.939 14.566 15.881 16.147 15.416 14.446 14.004 14.221 14.583 14.540 14.085 13.712 13.833 14.246 14.255 13.364 11.860 10.689 + 13.254 14.338 15.709 16.437 16.173 15.296 14.435 13.870 13.407 12.762 11.999 11.516 11.610 12.097 12.449 12.332 12.011 12.146 13.139 14.656 15.830 16.004 15.308 14.527 14.373 14.850 15.326 15.203 14.527 13.899 13.809 14.056 13.893 12.784 11.049 9.726 + 13.031 14.152 15.531 16.176 15.752 14.735 13.845 13.374 13.047 12.482 11.705 11.166 11.241 11.781 12.221 12.171 11.872 12.006 13.004 14.522 15.649 15.696 14.824 13.900 13.695 14.204 14.725 14.602 13.883 13.231 13.175 13.483 13.324 12.106 10.189 8.725 + 12.529 13.548 14.729 15.105 14.401 13.169 12.189 11.773 11.621 11.299 10.774 10.431 10.586 11.065 11.340 11.126 10.780 11.029 12.220 13.846 14.869 14.618 13.414 12.298 12.096 12.692 13.206 12.910 11.957 11.219 11.366 12.121 12.455 11.583 9.807 8.363 + 10.864 11.232 11.563 11.418 10.708 9.739 8.895 8.320 7.887 7.454 7.073 6.919 7.021 7.152 7.049 6.775 6.783 7.539 8.989 10.430 11.002 10.416 9.244 8.457 8.582 9.259 9.630 9.202 8.361 8.016 8.680 9.868 10.445 9.650 7.872 6.413 + 10.965 10.817 10.296 9.256 7.908 6.742 6.143 6.064 6.087 5.816 5.211 4.555 4.114 3.872 3.632 3.362 3.371 4.055 5.425 6.899 7.655 7.295 6.210 5.280 5.138 5.655 6.128 5.985 5.339 4.861 5.103 5.929 6.612 6.528 5.756 5.025 + 10.298 10.257 9.774 8.532 6.771 5.262 4.745 5.338 6.424 7.147 7.043 6.300 5.455 4.895 4.618 4.431 4.292 4.406 4.978 5.897 6.714 6.980 6.624 6.007 5.596 5.581 5.781 5.906 5.882 5.896 6.125 6.473 6.597 6.243 5.550 4.992 + 9.808 9.970 9.903 9.238 8.042 6.843 6.208 6.278 6.666 6.806 6.413 5.643 4.871 4.342 4.044 3.878 3.878 4.206 4.910 5.731 6.210 6.047 5.391 4.753 4.596 4.965 5.507 5.832 5.876 5.911 6.206 6.707 7.053 6.939 6.441 5.992 + 8.206 8.399 8.536 8.344 7.764 7.008 6.373 6.008 5.822 5.617 5.289 4.913 4.650 4.578 4.622 4.644 4.585 4.520 4.563 4.733 4.917 4.977 4.883 4.754 4.750 4.927 5.185 5.370 5.418 5.417 5.532 5.865 6.375 6.917 7.344 7.571 + 8.734 9.160 9.517 9.246 8.202 6.772 5.554 4.893 4.693 4.618 4.447 4.235 4.165 4.281 4.395 4.286 3.964 3.721 3.888 4.516 5.289 5.761 5.725 5.371 5.116 5.242 5.682 6.116 6.263 6.128 5.978 6.124 6.687 7.526 8.341 8.836 + 8.649 9.186 9.536 8.947 7.387 5.630 4.619 4.680 5.312 5.692 5.406 4.727 4.239 4.219 4.405 4.342 3.920 3.539 3.730 4.597 5.644 6.174 5.892 5.165 4.706 4.975 5.850 6.797 7.356 7.464 7.388 7.400 7.548 7.705 7.765 7.755 + 10.152 10.168 9.949 9.311 8.435 7.798 7.770 8.260 8.761 8.789 8.304 7.723 7.519 7.783 8.161 8.218 7.850 7.366 7.171 7.381 7.743 7.932 7.890 7.880 8.196 8.845 9.523 9.915 10.000 10.051 10.329 10.776 11.051 10.868 10.324 9.852 + 11.165 11.487 11.761 11.610 11.019 10.349 9.983 9.968 9.997 9.748 9.224 8.753 8.651 8.897 9.156 9.123 8.847 8.687 8.943 9.534 10.052 10.153 9.909 9.749 10.051 10.774 11.495 11.818 11.752 11.679 11.952 12.517 12.951 12.880 12.369 11.889 + 10.688 11.464 12.400 12.792 12.419 11.636 10.959 10.586 10.318 9.898 9.358 8.984 8.951 9.065 8.940 8.479 8.129 8.564 10.014 11.893 13.143 13.074 11.962 10.840 10.646 11.471 12.578 13.122 12.904 12.465 12.482 13.104 13.848 14.128 13.849 13.464 + 12.171 13.039 14.123 14.657 14.343 13.484 12.606 11.977 11.492 10.963 10.437 10.181 10.362 10.790 11.071 11.031 10.973 11.432 12.611 14.048 14.907 14.672 13.631 12.664 12.502 13.120 13.819 13.914 13.365 12.771 12.758 13.374 14.059 14.220 13.806 13.333 + 13.223 13.974 14.981 15.630 15.610 15.038 14.239 13.452 12.749 12.166 11.831 11.875 12.222 12.532 12.451 11.983 11.599 11.900 13.069 14.619 15.713 15.812 15.106 14.323 14.099 14.477 14.977 15.131 14.930 14.768 14.938 15.230 15.069 14.094 12.625 11.522 + 13.448 14.369 15.617 16.445 16.460 15.782 14.809 13.861 13.050 12.406 12.021 12.008 12.302 12.601 12.596 12.311 12.176 12.699 13.953 15.404 16.280 16.206 15.526 14.988 15.080 15.617 15.990 15.812 15.326 15.139 15.527 16.012 15.697 14.113 11.821 10.131 + 13.470 14.451 15.791 16.704 16.766 16.095 15.112 14.171 13.402 12.825 12.503 12.509 12.764 12.985 12.903 12.583 12.478 13.077 14.420 15.935 16.831 16.737 16.013 15.426 15.467 15.949 16.258 16.011 15.462 15.231 15.602 16.095 15.800 14.239 11.963 10.281 + 13.365 14.411 15.851 16.857 16.968 16.290 15.267 14.292 13.525 12.987 12.708 12.723 12.937 13.089 12.953 12.623 12.544 13.169 14.496 15.943 16.748 16.594 15.878 15.371 15.527 16.100 16.423 16.087 15.364 14.935 15.175 15.688 15.598 14.379 12.460 11.005 + 13.421 14.428 15.794 16.698 16.691 15.900 14.781 13.740 12.951 12.440 12.229 12.321 12.575 12.712 12.551 12.272 12.384 13.300 14.865 16.320 16.841 16.230 15.128 14.489 14.761 15.507 15.847 15.327 14.383 13.928 14.422 15.319 15.463 14.157 11.916 10.180 + 13.412 14.116 15.111 15.830 15.878 15.213 14.100 12.929 12.041 11.615 11.621 11.832 11.929 11.707 11.284 11.111 11.677 13.074 14.784 15.939 15.932 14.912 13.716 13.224 13.666 14.471 14.803 14.339 13.564 13.313 13.946 14.921 15.209 14.212 12.380 10.943 + 12.684 13.258 13.987 14.349 14.092 13.387 12.645 12.205 12.107 12.128 11.977 11.492 10.733 9.943 9.456 9.570 10.393 11.721 13.049 13.801 13.671 12.857 11.944 11.506 11.699 12.191 12.507 12.474 12.375 12.639 13.346 14.024 13.977 12.904 11.269 10.054 + 12.514 13.297 14.368 15.075 15.027 14.276 13.193 12.170 11.422 10.956 10.683 10.502 10.337 10.166 10.070 10.239 10.862 11.916 13.047 13.723 13.598 12.830 12.020 11.780 12.249 13.000 13.429 13.318 13.028 13.138 13.825 14.577 14.568 13.398 11.561 10.183 + 13.360 13.667 14.241 14.896 15.243 14.861 13.614 11.867 10.354 9.722 10.079 10.906 11.450 11.304 10.733 10.447 11.018 12.388 13.869 14.658 14.440 13.604 12.903 12.856 13.362 13.856 13.836 13.318 12.816 12.878 13.558 14.305 14.378 13.464 12.000 10.903 + 13.633 13.979 14.567 15.168 15.459 15.152 14.185 12.828 11.585 10.906 10.896 11.246 11.472 11.303 10.921 10.833 11.457 12.734 14.099 14.868 14.751 14.070 13.499 13.513 14.012 14.426 14.237 13.460 12.654 12.438 12.906 13.472 13.314 12.079 10.267 8.937 + 13.627 14.158 14.956 15.626 15.829 15.427 14.519 13.395 12.425 11.907 11.918 12.253 12.528 12.445 12.041 11.724 11.990 13.003 14.379 15.395 15.512 14.804 13.915 13.547 13.898 14.532 14.796 14.416 13.728 13.328 13.447 13.652 13.190 11.705 9.690 8.238 + 13.583 14.289 15.277 16.002 16.137 15.695 14.902 13.992 13.137 12.488 12.197 12.303 12.620 12.801 12.633 12.295 12.297 13.048 14.412 15.693 16.138 15.574 14.587 14.044 14.350 15.117 15.548 15.198 14.386 13.851 13.963 14.258 13.799 12.082 9.666 7.897 + 13.387 14.241 15.342 15.984 15.888 15.311 14.672 14.144 13.601 12.923 12.263 11.943 12.095 12.459 12.621 12.486 12.459 13.082 14.422 15.837 16.438 15.884 14.740 14.022 14.291 15.149 15.639 15.186 14.160 13.502 13.718 14.252 13.895 11.952 9.071 6.925 + 13.483 14.249 15.169 15.554 15.204 14.486 13.910 13.635 13.392 12.858 12.057 11.362 11.133 11.371 11.779 12.128 12.524 13.240 14.295 15.254 15.544 15.015 14.183 13.818 14.235 14.960 15.165 14.483 13.423 12.902 13.292 13.902 13.475 11.362 8.303 6.048 + 12.645 13.390 14.246 14.477 13.853 12.791 11.961 11.720 11.887 11.988 11.705 11.113 10.540 10.277 10.406 10.873 11.609 12.526 13.410 13.918 13.797 13.154 12.481 12.306 12.724 13.268 13.286 12.537 11.447 10.728 10.683 10.845 10.340 8.711 6.474 4.850 + 9.188 10.247 11.315 11.235 9.776 7.840 6.690 6.894 7.913 8.666 8.483 7.614 6.893 6.936 7.644 8.395 8.660 8.441 8.149 8.134 8.360 8.506 8.319 7.845 7.321 6.901 6.550 6.186 5.878 5.814 6.048 6.306 6.124 5.265 4.032 3.123 + 8.974 9.740 10.410 10.058 8.548 6.666 5.427 5.209 5.509 5.502 4.835 3.922 3.510 3.968 4.992 5.938 6.411 6.522 6.620 6.830 6.913 6.564 5.808 5.040 4.668 4.718 4.837 4.686 4.319 4.132 4.407 4.931 5.118 4.552 3.454 2.573 + 9.987 10.502 10.838 10.275 8.761 7.003 5.853 5.607 5.835 5.874 5.463 4.922 4.761 5.149 5.783 6.236 6.384 6.447 6.642 6.856 6.726 6.071 5.183 4.635 4.720 5.123 5.179 4.537 3.578 3.119 3.630 4.713 5.373 4.902 3.562 2.418 + 9.619 10.053 10.264 9.591 8.045 6.358 5.357 5.246 5.491 5.371 4.670 3.850 3.574 4.064 4.911 5.493 5.550 5.362 5.387 5.759 6.153 6.136 5.617 4.927 4.470 4.325 4.226 3.929 3.551 3.497 4.007 4.797 5.214 4.805 3.790 2.942 + 8.513 8.977 9.392 9.182 8.199 6.836 5.680 5.058 4.867 4.788 4.634 4.478 4.493 4.717 5.018 5.271 5.523 5.924 6.494 6.979 7.016 6.481 5.672 5.107 5.085 5.418 5.606 5.323 4.734 4.353 4.526 5.070 5.405 5.088 4.263 3.563 + 8.932 8.797 8.348 7.485 6.411 5.587 5.395 5.816 6.425 6.713 6.475 5.927 5.483 5.397 5.610 5.877 6.020 6.058 6.116 6.254 6.406 6.474 6.452 6.417 6.399 6.297 5.969 5.418 4.889 4.707 4.985 5.464 5.682 5.357 4.656 4.087 + 8.372 9.068 9.765 9.712 8.807 7.734 7.391 8.127 9.427 10.331 10.200 9.196 8.098 7.664 8.077 8.903 9.524 9.623 9.342 9.067 9.081 9.384 9.769 10.000 9.947 9.597 9.026 8.379 7.852 7.606 7.656 7.823 7.838 7.554 7.080 6.715 + 8.200 8.574 8.815 8.400 7.328 6.198 5.752 6.257 7.263 7.946 7.750 6.795 5.740 5.249 5.508 6.158 6.652 6.684 6.365 6.058 6.052 6.368 6.785 7.034 6.963 6.592 6.070 5.587 5.304 5.281 5.443 5.601 5.560 5.253 4.814 4.494 + 8.717 7.963 6.927 6.208 6.101 6.394 6.540 6.090 5.053 3.909 3.257 3.365 3.979 4.532 4.591 4.191 3.766 3.770 4.292 4.990 5.391 5.286 4.872 4.547 4.537 4.724 4.798 4.590 4.259 4.143 4.414 4.876 5.103 4.820 4.176 3.646 + 6.551 6.392 6.146 5.914 5.769 5.713 5.687 5.607 5.419 5.126 4.783 4.467 4.239 4.125 4.123 4.222 4.418 4.707 5.065 5.423 5.669 5.693 5.441 4.977 4.466 4.114 4.059 4.298 4.682 4.994 5.053 4.800 4.310 3.738 3.252 2.978 + 4.450 5.034 5.795 6.237 6.137 5.650 5.107 4.729 4.504 4.321 4.160 4.127 4.313 4.638 4.879 4.880 4.720 4.670 4.936 5.439 5.849 5.856 5.438 4.878 4.519 4.482 4.610 4.656 4.530 4.354 4.300 4.389 4.462 4.354 4.082 3.848 + 4.479 5.058 5.808 6.229 6.092 5.568 5.032 4.743 4.681 4.640 4.457 4.156 3.893 3.791 3.843 3.969 4.129 4.372 4.759 5.244 5.658 5.819 5.669 5.310 4.909 4.581 4.341 4.178 4.124 4.239 4.507 4.778 4.841 4.594 4.160 3.825 + 5.463 5.669 5.871 5.849 5.569 5.187 4.872 4.647 4.414 4.137 3.957 4.088 4.580 5.184 5.514 5.377 4.977 4.767 5.069 5.782 6.457 6.670 6.351 5.794 5.351 5.131 4.979 4.726 4.428 4.322 4.549 4.936 5.087 4.736 4.036 3.474 + 6.506 6.114 5.683 5.580 5.839 6.117 6.009 5.431 4.720 4.358 4.555 5.073 5.446 5.379 4.999 4.724 4.899 5.505 6.191 6.579 6.544 6.264 6.005 5.882 5.790 5.555 5.141 4.717 4.527 4.675 5.023 5.267 5.156 4.665 4.026 3.582 + 6.059 6.002 5.981 6.080 6.262 6.360 6.198 5.736 5.142 4.688 4.557 4.703 4.886 4.870 4.619 4.346 4.338 4.717 5.312 5.765 5.798 5.429 4.962 4.756 4.953 5.383 5.713 5.704 5.376 4.948 4.637 4.490 4.389 4.207 3.948 3.750 + 7.447 6.658 5.607 4.961 5.044 5.621 6.103 6.017 5.371 4.631 4.338 4.675 5.316 5.701 5.490 4.848 4.317 4.379 5.068 5.938 6.407 6.203 5.535 4.896 4.668 4.861 5.190 5.358 5.301 5.171 5.116 5.100 4.935 4.498 3.905 3.474 + 7.593 6.830 5.810 5.159 5.167 5.617 6.011 5.982 5.546 5.023 4.736 4.760 4.931 5.041 5.036 5.028 5.152 5.421 5.712 5.882 5.890 5.804 5.709 5.624 5.499 5.302 5.086 4.972 5.046 5.269 5.486 5.516 5.276 4.829 4.354 4.053 + 5.447 5.740 6.198 6.592 6.678 6.324 5.618 4.876 4.484 4.673 5.355 6.157 6.651 6.619 6.178 5.677 5.453 5.619 6.021 6.381 6.494 6.338 6.049 5.790 5.647 5.606 5.598 5.573 5.526 5.474 5.426 5.364 5.264 5.125 4.982 4.889 + 6.238 6.119 6.065 6.244 6.599 6.848 6.702 6.127 5.416 4.982 5.052 5.492 5.930 6.048 5.823 5.517 5.446 5.727 6.205 6.598 6.710 6.556 6.296 6.078 5.931 5.779 5.559 5.302 5.118 5.094 5.201 5.299 5.236 4.971 4.613 4.359 + 6.221 6.126 6.048 6.105 6.307 6.520 6.560 6.332 5.922 5.550 5.429 5.625 6.027 6.435 6.693 6.772 6.742 6.681 6.614 6.519 6.388 6.265 6.214 6.239 6.251 6.117 5.780 5.333 4.985 4.904 5.080 5.304 5.320 5.019 4.542 4.185 + 7.820 7.759 7.616 7.364 6.996 6.540 6.062 5.655 5.410 5.384 5.572 5.887 6.187 6.340 6.295 6.117 5.960 5.971 6.195 6.549 6.871 7.021 6.956 6.736 6.462 6.208 5.998 5.820 5.672 5.568 5.521 5.521 5.530 5.516 5.477 5.442 + 7.657 7.037 6.262 5.896 6.157 6.764 7.173 7.001 6.294 5.458 4.932 4.897 5.216 5.606 5.867 5.973 6.011 6.062 6.144 6.240 6.339 6.439 6.503 6.451 6.219 5.837 5.461 5.289 5.423 5.788 6.159 6.295 6.086 5.605 5.070 4.725 + 8.344 7.733 6.926 6.443 6.519 6.926 7.146 6.775 5.851 4.858 4.389 4.723 5.624 6.521 6.919 6.736 6.296 6.031 6.126 6.411 6.559 6.384 5.997 5.677 5.607 5.728 5.825 5.767 5.638 5.646 5.889 6.209 6.303 5.994 5.426 4.980 + 9.320 8.468 7.335 6.618 6.597 6.943 7.021 6.431 5.360 4.458 4.336 5.099 6.266 7.129 7.259 6.772 6.177 5.959 6.241 6.763 7.151 7.213 7.037 6.833 6.718 6.626 6.426 6.105 5.823 5.782 6.027 6.365 6.496 6.262 5.792 5.419 + 7.477 8.271 9.548 10.824 11.658 11.824 11.357 10.476 9.448 8.491 7.768 7.428 7.604 8.333 9.446 10.564 11.253 11.276 10.755 10.102 9.736 9.805 10.112 10.315 10.218 9.917 9.681 9.690 9.858 9.913 9.641 9.077 8.478 8.101 8.002 8.034 + 7.369 7.763 8.682 10.130 11.742 12.861 12.912 11.785 9.909 7.985 6.618 6.119 6.536 7.745 9.444 11.110 12.102 11.986 10.873 9.440 8.515 8.498 9.101 9.637 9.625 9.179 8.832 8.984 9.485 9.766 9.393 8.499 7.692 7.506 7.915 8.382 + 6.565 6.097 5.681 5.968 7.233 9.123 10.801 11.396 10.471 8.257 5.568 3.452 2.731 3.618 5.595 7.663 8.874 8.884 8.136 7.524 7.730 8.718 9.789 10.156 9.592 8.598 7.962 8.083 8.651 8.979 8.661 7.976 7.645 8.156 9.274 10.189 + 6.732 6.691 6.631 6.634 6.841 7.359 8.118 8.807 9.012 8.491 7.405 6.308 5.839 6.327 7.568 8.951 9.850 10.006 9.626 9.162 8.948 8.989 9.030 8.823 8.358 7.872 7.637 7.738 7.998 8.136 7.995 7.657 7.358 7.283 7.411 7.562 + 8.133 7.884 7.749 8.129 9.093 10.301 11.266 11.701 11.664 11.425 11.237 11.220 11.409 11.826 12.424 12.991 13.174 12.720 11.746 10.760 10.327 10.603 11.161 11.312 10.680 9.547 8.637 8.517 9.120 9.805 9.885 9.164 8.019 7.015 6.459 6.276 + 10.869 11.073 11.384 11.700 12.009 12.427 13.108 14.085 15.166 15.993 16.269 15.990 15.495 15.237 15.433 15.863 16.008 15.454 14.252 12.922 12.068 11.903 12.079 11.974 11.217 10.032 9.103 9.065 10.011 11.389 12.358 12.302 11.163 9.405 7.719 6.709 + 11.432 11.704 12.082 12.371 12.526 12.724 13.254 14.271 15.600 16.761 17.258 16.935 16.142 15.523 15.550 16.152 16.741 16.648 15.658 14.200 13.041 12.696 13.025 13.353 13.006 11.864 10.479 9.680 9.957 11.089 12.264 12.590 11.635 9.674 7.531 6.153 + 11.761 11.885 12.104 12.371 12.664 13.044 13.656 14.607 15.794 16.829 17.219 16.738 15.693 14.818 14.783 15.660 16.807 17.309 16.682 15.270 14.002 13.665 14.284 15.109 15.216 14.243 12.663 11.411 11.171 11.880 12.792 13.010 12.072 10.211 8.195 6.905 + 12.167 12.341 12.629 12.956 13.294 13.707 14.319 15.193 16.197 16.983 17.175 16.655 15.729 15.001 14.968 15.645 16.514 16.889 16.436 15.430 14.541 14.297 14.668 15.092 14.937 14.005 12.690 11.672 11.408 11.806 12.320 12.337 11.574 10.225 8.821 7.938 + 12.600 12.774 13.046 13.344 13.683 14.171 14.916 15.888 16.850 17.441 17.376 16.657 15.628 14.820 14.664 15.231 16.188 17.001 17.263 16.939 16.351 15.923 15.860 15.989 15.900 15.269 14.153 12.997 12.347 12.451 13.034 13.446 13.100 11.895 10.340 9.258 + 12.862 13.016 13.290 13.673 14.207 14.933 15.777 16.526 16.917 16.812 16.286 15.566 14.880 14.368 14.112 14.200 14.702 15.542 16.414 16.897 16.745 16.101 15.409 15.038 14.934 14.656 13.813 12.528 11.468 11.322 12.143 13.156 13.286 12.037 9.986 8.432 + 13.138 13.434 13.951 14.596 15.295 15.962 16.452 16.588 16.280 15.633 14.910 14.346 13.982 13.694 13.412 13.297 13.656 14.622 15.899 16.867 17.034 16.446 15.655 15.218 15.168 14.988 14.150 12.760 11.632 11.631 12.796 14.087 14.085 12.171 9.193 6.970 + 12.847 13.295 14.030 14.819 15.461 15.810 15.755 15.250 14.385 13.431 12.716 12.400 12.345 12.256 12.009 11.859 12.275 13.468 15.058 16.245 16.419 15.693 14.828 14.555 14.871 15.009 14.176 12.417 10.770 10.435 11.637 13.220 13.460 11.510 8.254 5.772 + 13.075 13.646 14.465 15.102 15.273 14.943 14.263 13.442 12.671 12.107 11.834 11.792 11.771 11.569 11.219 11.080 11.589 12.841 14.363 15.367 15.372 14.648 14.030 14.181 14.922 15.304 14.436 12.403 10.375 9.711 10.746 12.353 12.766 11.055 8.016 5.660 + 13.327 13.834 14.608 15.316 15.705 15.657 15.162 14.284 13.192 12.180 11.550 11.409 11.551 11.617 11.435 11.246 11.536 12.555 13.970 15.018 15.129 14.457 13.794 13.849 14.528 14.917 14.094 12.073 9.993 9.249 10.252 11.932 12.518 11.024 8.174 5.925 + 13.854 14.355 15.073 15.662 15.932 15.880 15.545 14.903 13.952 12.865 11.998 11.655 11.805 12.079 12.107 11.906 11.922 12.612 13.938 15.292 15.971 15.797 15.278 15.101 15.418 15.641 15.009 13.424 11.736 11.092 11.867 13.170 13.478 11.941 9.231 7.128 + 13.808 14.364 15.132 15.708 15.926 15.872 15.667 15.278 14.585 13.622 12.690 12.157 12.122 12.297 12.293 12.047 11.956 12.529 13.852 15.400 16.426 16.596 16.245 15.995 16.089 16.110 15.430 13.955 12.427 11.861 12.573 13.724 13.894 12.309 9.634 7.580 + 13.520 14.193 15.110 15.762 15.924 15.719 15.378 14.966 14.374 13.549 12.676 12.080 11.921 12.026 12.053 11.867 11.736 12.112 13.184 14.628 15.824 16.360 16.326 16.135 16.040 15.871 15.265 14.178 13.108 12.724 13.188 13.839 13.636 12.067 9.724 7.986 + 14.022 14.352 14.809 15.160 15.314 15.308 15.156 14.751 13.973 12.886 11.818 11.158 11.046 11.255 11.405 11.344 11.314 11.734 12.782 14.171 15.361 15.991 16.136 16.126 16.139 15.998 15.411 14.412 13.511 13.312 13.890 14.549 14.286 12.652 10.281 8.541 + 13.980 14.244 14.507 14.502 14.227 13.931 13.837 13.891 13.797 13.307 12.483 11.658 11.139 10.949 10.868 10.720 10.608 10.846 11.636 12.833 14.020 14.838 15.231 15.379 15.404 15.204 14.606 13.690 12.900 12.725 13.199 13.711 13.405 11.917 9.810 8.276 + 14.245 14.197 14.000 13.606 13.140 12.848 12.876 13.111 13.237 12.984 12.355 11.604 11.012 10.661 10.420 10.154 9.914 9.943 10.458 11.436 12.596 13.586 14.186 14.364 14.174 13.660 12.883 12.038 11.450 11.378 11.747 12.094 11.858 10.832 9.415 8.394 + 15.056 14.829 14.257 13.301 12.173 11.273 10.908 11.040 11.304 11.302 10.905 10.328 9.900 9.778 9.844 9.869 9.755 9.622 9.683 10.040 10.599 11.147 11.488 11.501 11.116 10.317 9.225 8.187 7.682 8.029 9.071 10.161 10.546 9.913 8.674 7.704 + 15.309 14.866 14.030 12.954 11.899 11.163 10.919 11.090 11.370 11.398 10.985 10.239 9.496 9.105 9.208 9.655 10.103 10.241 9.998 9.609 9.469 9.856 10.677 11.428 11.449 10.361 8.411 6.453 5.492 6.058 7.807 9.693 10.619 10.166 8.860 7.781 + 15.202 14.813 14.114 13.247 12.391 11.730 11.392 11.389 11.573 11.676 11.445 10.816 9.998 9.376 9.270 9.690 10.307 10.676 10.575 10.195 10.005 10.369 11.185 11.870 11.719 10.441 8.455 6.723 6.178 7.128 9.031 10.813 11.528 10.936 9.623 8.591 + 14.907 14.619 14.091 13.403 12.664 12.008 11.579 11.457 11.566 11.656 11.426 10.751 9.833 9.129 9.041 9.598 10.398 10.888 10.799 10.375 10.184 10.638 11.589 12.362 12.224 10.947 9.049 7.505 7.130 8.071 9.730 11.161 11.646 11.088 10.011 9.194 + 14.337 14.145 13.785 13.309 12.797 12.343 12.026 11.853 11.735 11.508 11.044 10.369 9.694 9.309 9.382 9.811 10.271 10.442 10.271 10.046 10.193 10.937 12.069 13.025 13.248 12.575 11.380 10.352 10.064 10.618 11.599 12.350 12.388 11.686 10.667 9.942 + 14.111 13.865 13.438 12.969 12.649 12.621 12.861 13.132 13.097 12.540 11.548 10.502 9.854 9.825 10.248 10.675 10.685 10.195 9.538 9.266 9.787 11.090 12.715 13.999 14.450 14.007 13.066 12.233 11.976 12.360 13.020 13.397 13.086 12.097 10.873 10.040 + 12.997 13.070 13.070 12.881 12.581 12.410 12.540 12.861 13.008 12.636 11.739 10.711 10.082 10.105 10.556 10.890 10.668 9.918 9.142 8.983 9.780 11.328 13.006 14.154 14.444 14.027 13.392 13.051 13.237 13.783 14.223 14.053 13.039 11.379 9.654 8.557 + 12.573 12.914 13.268 13.274 12.866 12.333 12.058 12.163 12.378 12.269 11.628 10.678 9.924 9.745 10.069 10.429 10.340 9.715 8.980 8.780 9.504 10.988 12.610 13.702 13.972 13.643 13.247 13.235 13.685 14.284 14.557 14.167 13.099 11.660 10.319 9.519 + 12.682 13.054 13.458 13.507 13.090 12.458 11.992 11.868 11.904 11.737 11.159 10.334 9.679 9.518 9.796 10.105 10.026 9.493 8.901 8.829 9.606 11.038 12.517 13.427 13.548 13.168 12.844 12.992 13.615 14.326 14.617 14.179 13.061 11.615 10.311 9.549 + 12.738 13.069 13.435 13.501 13.171 12.642 12.196 11.929 11.676 11.201 10.472 9.753 9.402 9.556 9.970 10.184 9.894 9.231 8.706 8.851 9.834 11.320 12.692 13.446 13.486 13.133 12.871 13.027 13.587 14.235 14.550 14.247 13.312 12.010 10.773 10.024 + 12.446 12.814 13.254 13.423 13.200 12.748 12.332 12.063 11.812 11.375 10.710 10.024 9.617 9.611 9.823 9.911 9.674 9.262 9.107 9.611 10.831 12.400 13.733 14.371 14.234 13.628 13.034 12.833 13.112 13.650 14.047 13.938 13.189 11.978 10.734 9.950 + 12.722 13.077 13.535 13.775 13.626 13.168 12.635 12.208 11.893 11.548 11.061 10.483 10.014 9.835 9.945 10.155 10.268 10.297 10.510 11.228 12.512 13.988 14.997 14.996 13.936 12.334 10.970 10.416 10.723 11.461 12.042 12.089 11.593 10.825 10.117 9.709 + 12.638 13.021 13.555 13.909 13.838 13.323 12.578 11.888 11.411 11.086 10.729 10.251 9.784 9.592 9.835 10.390 10.938 11.251 11.428 11.812 12.625 13.623 14.136 13.529 11.762 9.551 7.963 7.711 8.690 10.107 11.080 11.206 10.701 10.060 9.636 9.470 + 12.728 13.074 13.582 13.956 13.922 13.380 12.476 11.513 10.756 10.270 9.932 9.615 9.367 9.397 9.858 10.628 11.341 11.665 11.609 11.529 11.795 12.371 12.734 12.239 10.692 8.615 6.959 6.455 7.121 8.305 9.207 9.427 9.119 8.702 8.460 8.394 + 12.817 13.117 13.566 13.894 13.829 13.264 12.377 11.548 11.091 11.001 10.949 10.583 9.886 9.253 9.188 9.852 10.887 11.688 11.899 11.683 11.510 11.654 11.874 11.602 10.489 8.811 7.340 6.778 7.223 8.119 8.718 8.628 8.004 7.289 6.808 6.610 + 12.793 13.103 13.573 13.926 13.867 13.281 12.374 11.578 11.232 11.276 11.270 10.779 9.815 8.910 8.709 9.411 10.565 11.439 11.649 11.448 11.412 11.806 12.242 12.006 10.766 9.009 7.749 7.726 8.806 10.096 10.690 10.367 9.640 9.190 9.241 9.471 + 12.882 13.237 13.736 14.069 14.002 13.512 12.797 12.132 11.668 11.326 10.898 10.262 9.551 9.080 9.095 9.551 10.149 10.598 10.892 11.295 12.032 12.951 13.495 13.092 11.655 9.775 8.379 8.105 8.867 9.963 10.607 10.458 9.741 8.942 8.404 8.175 + 13.271 13.566 13.949 14.158 14.043 13.643 13.106 12.552 11.990 11.357 10.635 9.915 9.362 9.105 9.158 9.443 9.887 10.502 11.357 12.464 13.660 14.607 14.941 14.471 13.319 11.884 10.671 10.044 10.072 10.517 10.970 11.062 10.636 9.814 8.928 8.361 + 13.861 13.799 13.698 13.571 13.401 13.142 12.756 12.247 11.655 11.034 10.411 9.797 9.221 8.755 8.508 8.569 8.961 9.632 10.493 11.452 12.419 13.260 13.788 13.810 13.251 12.262 11.217 10.552 10.529 11.059 11.718 11.972 11.486 10.340 9.012 8.131 + 14.381 14.331 14.065 13.422 12.437 11.364 10.515 10.031 9.798 9.540 9.046 8.324 7.599 7.164 7.208 7.707 8.436 9.079 9.384 9.304 9.039 8.923 9.183 9.727 10.140 9.958 9.068 7.901 7.219 7.571 8.814 10.124 10.539 9.680 8.081 6.845 + 14.543 14.340 13.883 13.148 12.209 11.231 10.388 9.765 9.328 8.968 8.572 8.084 7.530 7.033 6.798 7.024 7.754 8.763 9.598 9.838 9.402 8.675 8.263 8.540 9.315 9.935 9.799 8.872 7.768 7.289 7.789 8.872 9.720 9.758 9.118 8.488 + 14.474 14.271 13.858 13.220 12.360 11.344 10.344 9.588 9.238 9.246 9.341 9.178 8.595 7.770 7.142 7.110 7.731 8.639 9.279 9.302 8.810 8.279 8.187 8.642 9.296 9.610 9.275 8.467 7.725 7.564 8.099 8.972 9.636 9.759 9.446 9.110 + 13.994 13.989 13.741 13.028 11.914 10.761 9.964 9.651 9.605 9.472 9.049 8.410 7.787 7.365 7.181 7.174 7.295 7.527 7.828 8.103 8.282 8.418 8.671 9.124 9.610 9.754 9.287 8.373 7.614 7.642 8.585 9.881 10.657 10.410 9.427 8.569 + 13.120 12.990 12.561 11.722 10.644 9.738 9.370 9.550 9.891 9.885 9.270 8.206 7.134 6.458 6.320 6.596 7.056 7.520 7.903 8.186 8.392 8.582 8.826 9.120 9.315 9.174 8.569 7.675 6.950 6.856 7.492 8.476 9.193 9.255 8.793 8.333 + 11.022 10.976 10.611 9.726 8.523 7.563 7.339 7.844 8.546 8.797 8.351 7.523 6.890 6.802 7.147 7.523 7.621 7.461 7.293 7.333 7.584 7.902 8.168 8.362 8.484 8.443 8.093 7.416 6.639 6.138 6.154 6.584 7.049 7.213 7.052 6.835 + 9.745 9.658 9.242 8.335 7.167 6.309 6.243 6.934 7.778 8.029 7.356 6.085 4.936 4.493 4.826 5.537 6.120 6.316 6.203 6.030 6.002 6.178 6.498 6.846 7.078 7.041 6.648 5.984 5.323 4.987 5.115 5.543 5.919 5.975 5.741 5.494 + 7.107 7.255 7.157 6.467 5.359 4.526 4.669 5.884 7.487 8.450 8.128 6.707 5.038 4.035 4.084 4.900 5.832 6.343 6.295 5.930 5.631 5.675 6.098 6.694 7.115 7.050 6.415 5.451 4.633 4.381 4.769 5.452 5.903 5.807 5.300 4.846 + 5.127 5.732 6.356 6.356 5.629 4.740 4.470 5.159 6.407 7.371 7.394 6.463 5.164 4.213 3.976 4.320 4.819 5.104 5.071 4.863 4.717 4.811 5.179 5.695 6.112 6.176 5.790 5.130 4.584 4.502 4.918 5.479 5.687 5.289 4.508 3.891 + 7.234 7.536 7.956 8.270 8.381 8.364 8.355 8.416 8.485 8.458 8.312 8.141 8.074 8.162 8.343 8.520 8.662 8.827 9.080 9.399 9.658 9.742 9.675 9.643 9.876 10.466 11.273 11.986 12.306 12.103 11.462 10.599 9.741 9.041 8.567 8.332 + 8.312 8.853 9.589 10.107 10.242 10.141 10.061 10.108 10.174 10.111 9.936 9.849 10.048 10.523 11.055 11.401 11.496 11.462 11.443 11.451 11.396 11.272 11.272 11.671 12.568 13.720 14.672 15.098 15.042 14.846 14.823 14.976 15.034 14.760 14.228 13.797 + 9.046 9.236 9.481 9.629 9.627 9.546 9.476 9.429 9.335 9.145 8.926 8.845 9.042 9.505 10.068 10.541 10.847 11.062 11.310 11.639 11.994 12.306 12.613 13.067 13.820 14.868 16.011 16.958 17.503 17.634 17.507 17.317 17.188 17.142 17.145 17.156 + 9.217 9.038 8.759 8.514 8.436 8.571 8.822 8.995 8.945 8.704 8.490 8.556 8.982 9.592 10.080 10.242 10.136 10.033 10.197 10.709 11.461 12.308 13.221 14.288 15.557 16.897 18.015 18.638 18.708 18.423 18.093 17.936 17.979 18.118 18.238 18.296 + 9.328 9.582 9.880 9.954 9.678 9.155 8.651 8.419 8.546 8.932 9.372 9.699 9.854 9.880 9.867 9.896 10.032 10.332 10.839 11.565 12.469 13.471 14.489 15.477 16.424 17.310 18.067 18.579 18.743 18.562 18.173 17.802 17.646 17.757 18.020 18.228 + 9.669 10.002 10.328 10.291 9.854 9.318 9.012 8.994 9.042 8.952 8.800 8.890 9.418 10.197 10.760 10.776 10.391 10.157 10.582 11.706 13.083 14.190 14.871 15.403 16.153 17.165 18.089 18.490 18.259 17.703 17.270 17.178 17.291 17.342 17.224 17.075 + 10.992 10.690 10.120 9.407 8.783 8.468 8.509 8.727 8.863 8.813 8.725 8.846 9.253 9.749 10.036 10.038 10.046 10.506 11.615 13.093 14.361 15.001 15.092 15.118 15.535 16.371 17.220 17.615 17.432 16.964 16.633 16.628 16.805 16.900 16.814 16.684 + 12.745 11.850 10.638 9.809 9.659 9.922 10.068 9.801 9.290 8.973 9.128 9.612 9.989 9.928 9.512 9.192 9.440 10.392 11.766 13.096 14.060 14.648 15.078 15.570 16.183 16.803 17.263 17.463 17.413 17.203 16.946 16.741 16.644 16.661 16.743 16.813 + 10.817 10.384 9.857 9.607 9.708 9.884 9.790 9.355 8.875 8.744 9.077 9.565 9.717 9.306 8.616 8.278 8.795 10.144 11.781 13.052 13.664 13.861 14.172 14.948 16.078 17.080 17.483 17.179 16.473 15.823 15.493 15.407 15.281 14.920 14.400 14.013 + 11.636 11.084 10.233 9.429 8.912 8.696 8.611 8.462 8.182 7.861 7.642 7.571 7.566 7.504 7.386 7.386 7.745 8.567 9.699 10.821 11.685 12.293 12.862 13.585 14.394 14.962 14.949 14.303 13.348 12.554 12.186 12.119 11.983 11.522 10.839 10.325 + 13.331 13.388 13.577 13.966 14.520 15.062 15.340 15.181 14.615 13.874 13.240 12.857 12.649 12.442 12.168 11.983 12.150 12.788 13.689 14.413 14.602 14.268 13.778 13.531 13.606 13.673 13.295 12.336 11.139 10.276 10.089 10.413 10.736 10.642 10.168 9.731 + 13.933 13.904 14.050 14.604 15.598 16.754 17.585 17.695 17.053 16.040 15.192 14.822 14.821 14.819 14.572 14.240 14.270 14.978 16.185 17.275 17.658 17.245 16.509 16.039 15.991 15.946 15.326 14.007 12.539 11.736 11.953 12.729 13.131 12.553 11.261 10.203 + 13.202 13.379 13.749 14.372 15.320 16.545 17.758 18.489 18.376 17.458 16.207 15.213 14.766 14.710 14.701 14.618 14.712 15.335 16.495 17.705 18.316 18.064 17.293 16.632 16.408 16.355 15.940 14.978 13.931 13.540 14.085 14.992 15.223 14.181 12.316 10.860 + 12.376 12.827 13.553 14.389 15.334 16.452 17.627 18.467 18.537 17.751 16.531 15.524 15.107 15.135 15.187 15.074 15.074 15.650 16.889 18.249 18.924 18.517 17.401 16.383 15.979 15.998 15.830 15.167 14.406 14.286 15.060 16.043 16.058 14.483 11.959 10.047 + 12.206 12.718 13.404 13.967 14.479 15.294 16.587 18.005 18.833 18.570 17.385 16.005 15.131 14.931 15.063 15.160 15.260 15.719 16.724 17.934 18.662 18.457 17.511 16.464 15.807 15.472 15.050 14.394 13.944 14.351 15.695 17.111 17.311 15.679 12.973 10.914 + 12.303 12.568 12.929 13.293 13.816 14.773 16.180 17.586 18.296 17.908 16.668 15.310 14.504 14.393 14.635 14.859 15.059 15.536 16.468 17.580 18.282 18.155 17.320 16.303 15.542 15.050 14.560 14.005 13.762 14.325 15.671 16.986 17.143 15.648 13.210 11.366 + 11.659 11.978 12.443 12.940 13.576 14.574 15.934 17.248 17.900 17.537 16.391 15.135 14.371 14.223 14.383 14.522 14.659 15.098 16.022 17.177 17.981 17.987 17.241 16.202 15.311 14.659 14.085 13.560 13.399 13.993 15.272 16.480 16.617 15.258 13.058 11.399 + 12.037 12.225 12.560 13.065 13.862 15.030 16.374 17.389 17.546 16.707 15.299 14.051 13.464 13.496 13.714 13.776 13.773 14.098 14.993 16.205 17.119 17.238 16.568 15.547 14.616 13.883 13.203 12.544 12.216 12.627 13.772 14.999 15.376 14.450 12.725 11.377 + 12.166 12.293 12.563 13.043 13.830 14.907 15.993 16.591 16.284 15.068 13.429 12.027 11.239 10.954 10.798 10.574 10.487 10.939 12.068 13.516 14.659 15.089 14.906 14.515 14.169 13.723 12.878 11.674 10.687 10.635 11.699 13.198 14.018 13.503 12.046 10.817 + 9.519 9.725 10.220 11.067 12.176 13.244 13.854 13.686 12.731 11.330 9.993 9.104 8.712 8.578 8.428 8.205 8.120 8.450 9.288 10.437 11.551 12.376 12.855 13.042 12.935 12.441 11.537 10.463 9.705 9.697 10.459 11.500 12.129 11.963 11.231 10.587 + 8.540 7.846 6.904 6.367 6.729 8.004 9.661 10.888 11.073 10.173 8.732 7.499 6.931 6.958 7.150 7.153 6.992 7.015 7.542 8.542 9.624 10.317 10.395 9.966 9.312 8.653 8.074 7.625 7.418 7.577 8.062 8.585 8.751 8.372 7.657 7.096 + 5.468 5.587 5.823 6.264 7.089 8.371 9.825 10.818 10.755 9.559 7.812 6.349 5.633 5.459 5.275 4.828 4.493 4.929 6.374 8.246 9.501 9.459 8.375 7.204 6.784 7.172 7.726 7.813 7.429 7.135 7.398 8.022 8.270 7.590 6.231 5.132 + 5.997 5.636 5.259 5.334 6.134 7.502 8.875 9.589 9.288 8.159 6.794 5.771 5.280 5.084 4.848 4.531 4.479 5.115 6.489 8.107 9.219 9.350 8.621 7.608 6.873 6.587 6.549 6.517 6.502 6.711 7.234 7.815 7.988 7.489 6.561 5.832 + 4.990 5.234 5.623 6.073 6.594 7.219 7.851 8.205 7.972 7.095 5.902 4.927 4.554 4.769 5.254 5.719 6.150 6.751 7.635 8.598 9.217 9.222 8.786 8.443 8.684 9.567 10.683 11.486 11.693 11.409 10.920 10.394 9.796 9.054 8.276 7.756 + 5.389 5.504 5.620 5.705 5.951 6.622 7.710 8.752 9.071 8.310 6.798 5.400 4.912 5.498 6.637 7.602 8.030 8.099 8.217 8.563 8.938 9.037 8.836 8.695 9.051 10.007 11.200 12.067 12.271 11.891 11.260 10.646 10.092 9.528 8.975 8.610 + 4.553 4.626 4.802 5.175 5.871 6.924 8.127 9.029 9.152 8.323 6.842 5.341 4.414 4.283 4.751 5.435 6.060 6.567 7.006 7.362 7.519 7.387 7.029 6.645 6.417 6.365 6.372 6.343 6.331 6.476 6.814 7.155 7.197 6.786 6.107 5.590 + 4.789 4.511 4.143 4.014 4.459 5.611 7.233 8.743 9.481 9.094 7.770 6.137 4.897 4.442 4.707 5.335 5.966 6.434 6.749 6.965 7.071 7.014 6.784 6.455 6.142 5.933 5.866 5.969 6.281 6.795 7.372 7.743 7.647 7.046 6.218 5.628 + 4.554 4.685 4.915 5.271 5.871 6.806 7.938 8.852 9.070 8.393 7.093 5.748 4.860 4.569 4.694 5.027 5.550 6.363 7.418 8.362 8.715 8.251 7.218 6.183 5.603 5.520 5.658 5.786 5.980 6.489 7.350 8.154 8.287 7.460 6.074 5.017 + 7.661 7.813 8.148 8.636 9.131 9.431 9.438 9.270 9.177 9.340 9.694 9.974 9.955 9.682 9.485 9.723 10.483 11.457 12.142 12.192 11.667 10.980 10.607 10.780 11.388 12.125 12.734 13.147 13.452 13.740 13.991 14.083 13.907 13.482 12.982 12.647 + 7.722 7.667 7.844 8.507 9.554 10.531 10.981 10.824 10.417 10.235 10.462 10.868 11.068 10.917 10.665 10.732 11.310 12.160 12.792 12.852 12.396 11.821 11.544 11.714 12.183 12.700 13.131 13.505 13.894 14.273 14.506 14.451 14.085 13.531 13.000 12.680 + 5.608 5.584 5.662 5.969 6.495 7.075 7.509 7.716 7.776 7.831 7.944 8.044 8.014 7.833 7.636 7.629 7.917 8.400 8.827 8.975 8.803 8.477 8.248 8.290 8.621 9.141 9.738 10.356 10.980 11.569 12.015 12.181 11.992 11.516 10.964 10.599 + 7.347 7.841 8.558 9.151 9.426 9.440 9.387 9.411 9.491 9.494 9.320 9.004 8.690 8.516 8.514 8.607 8.689 8.703 8.654 8.569 8.466 8.354 8.274 8.313 8.570 9.105 9.900 10.863 11.860 12.736 13.331 13.515 13.247 12.638 11.949 11.497 + 9.306 10.259 11.583 12.540 12.738 12.310 11.683 11.185 10.846 10.522 10.137 9.791 9.629 9.644 9.658 9.505 9.234 9.106 9.351 9.925 10.502 10.738 10.572 10.286 10.273 10.717 11.461 12.168 12.596 12.744 12.764 12.772 12.756 12.645 12.451 12.293 + 11.826 12.573 13.633 14.470 14.798 14.669 14.263 13.660 12.826 11.804 10.847 10.275 10.191 10.341 10.332 10.034 9.772 10.070 11.150 12.633 13.763 13.978 13.323 12.360 11.671 11.449 11.526 11.745 12.218 13.154 14.418 15.334 15.071 13.366 10.951 9.201 + 12.382 12.807 13.570 14.497 15.332 15.793 15.664 14.921 13.788 12.663 11.907 11.619 11.582 11.453 11.065 10.617 10.555 11.204 12.453 13.760 14.496 14.374 13.619 12.745 12.162 11.944 11.934 12.022 12.299 12.900 13.708 14.254 13.995 12.786 11.135 9.955 + 12.697 12.878 13.318 14.059 14.975 15.751 16.027 15.612 14.635 13.477 12.534 11.964 11.629 11.276 10.815 10.455 10.557 11.310 12.503 13.601 14.100 13.869 13.217 12.625 12.386 12.448 12.586 12.684 12.864 13.298 13.911 14.288 13.936 12.730 11.145 10.025 + 12.753 12.733 12.896 13.483 14.523 15.702 16.464 16.342 15.310 13.861 12.700 12.250 12.356 12.477 12.219 11.744 11.666 12.467 13.956 15.290 15.600 14.713 13.307 12.352 12.306 12.801 13.094 12.852 12.504 12.773 13.839 14.931 14.854 13.055 10.292 8.231 + 12.592 12.603 12.706 13.064 13.830 14.963 16.094 16.652 16.246 15.014 13.588 12.646 12.404 12.523 12.536 12.384 12.517 13.404 14.910 16.194 16.317 15.074 13.258 12.044 12.020 12.733 13.199 12.902 12.310 12.391 13.539 14.976 15.284 13.677 10.876 8.708 + 12.574 12.433 12.379 12.727 13.648 14.978 16.209 16.749 16.301 15.095 13.743 12.813 12.458 12.427 12.434 12.518 13.009 14.104 15.459 16.273 15.889 14.404 12.703 11.796 12.007 12.741 13.078 12.667 12.079 12.242 13.448 14.884 15.198 13.684 11.053 9.024 + 12.757 12.520 12.371 12.725 13.755 15.196 16.434 16.863 16.275 14.999 13.667 12.780 12.431 12.395 12.475 12.743 13.398 14.383 15.176 15.072 13.807 11.958 10.656 10.741 12.025 13.378 13.642 12.644 11.393 11.216 12.535 14.369 15.068 13.727 11.060 8.942 + 12.511 12.102 11.706 11.820 12.605 13.750 14.703 15.056 14.767 14.084 13.286 12.520 11.851 11.424 11.488 12.192 13.326 14.278 14.367 13.351 11.707 10.390 10.196 11.170 12.544 13.282 12.849 11.619 10.590 10.616 11.739 13.135 13.744 13.079 11.617 10.448 + 9.919 9.954 10.095 10.428 10.991 11.749 12.598 13.386 13.921 14.002 13.511 12.536 11.441 10.759 10.908 11.892 13.202 14.062 13.889 12.690 11.082 9.914 9.713 10.365 11.228 11.620 11.300 10.610 10.187 10.453 11.289 12.107 12.282 11.616 10.505 9.671 + 9.187 8.854 8.402 8.112 8.158 8.528 9.082 9.644 10.044 10.126 9.778 9.038 8.172 7.617 7.740 8.563 9.684 10.502 10.606 10.048 9.279 8.811 8.876 9.340 9.913 10.429 10.956 11.667 12.617 13.653 14.525 15.072 15.321 15.413 15.465 15.503 + 8.999 8.733 8.361 8.071 7.940 7.914 7.909 7.920 8.014 8.228 8.483 8.625 8.574 8.420 8.372 8.575 8.969 9.315 9.395 9.189 8.891 8.761 8.937 9.387 10.006 10.743 11.624 12.657 13.745 14.717 15.463 16.033 16.593 17.249 17.916 18.353 + 8.533 8.090 7.554 7.318 7.484 7.816 7.999 7.950 7.867 7.988 8.301 8.507 8.303 7.699 7.081 6.912 7.335 8.034 8.484 8.379 7.884 7.501 7.679 8.495 9.654 10.761 11.618 12.313 13.063 14.004 15.076 16.096 16.891 17.398 17.660 17.762 + 6.927 7.087 7.480 8.097 8.733 9.059 8.873 8.303 7.744 7.559 7.786 8.113 8.157 7.815 7.366 7.236 7.625 8.317 8.848 8.887 8.509 8.128 8.172 8.758 9.642 10.466 11.071 11.618 12.430 13.686 15.227 16.629 17.475 17.633 17.341 17.031 + 7.131 7.529 8.009 8.240 8.179 8.080 8.205 8.532 8.752 8.559 7.952 7.257 6.841 6.819 7.019 7.214 7.378 7.673 8.220 8.884 9.345 9.392 9.156 9.024 9.311 9.990 10.765 11.402 11.983 12.820 14.084 15.537 16.653 17.043 16.809 16.459 + 6.375 6.135 5.967 6.207 6.883 7.648 8.027 7.786 7.113 6.465 6.228 6.456 6.883 7.185 7.225 7.128 7.124 7.342 7.721 8.086 8.298 8.348 8.328 8.348 8.471 8.723 9.130 9.735 10.553 11.531 12.531 13.384 13.972 14.278 14.379 14.388 + 3.332 4.347 6.000 7.702 8.898 9.285 8.909 8.108 7.325 6.890 6.873 7.080 7.203 7.041 6.642 6.272 6.216 6.552 7.068 7.412 7.354 6.975 6.609 6.592 7.007 7.642 8.189 8.515 8.763 9.198 9.935 10.795 11.430 11.609 11.413 11.170 + 3.828 5.349 7.417 8.811 8.929 8.111 7.224 6.923 7.210 7.598 7.636 7.302 6.937 6.876 7.148 7.500 7.671 7.610 7.462 7.375 7.366 7.363 7.345 7.403 7.644 8.077 8.599 9.123 9.669 10.314 11.008 11.483 11.406 10.682 9.637 8.876 + 3.985 5.757 8.132 9.670 9.699 8.689 7.707 7.493 7.956 8.435 8.392 7.876 7.391 7.368 7.775 8.214 8.335 8.153 7.971 8.045 8.340 8.610 8.696 8.715 8.962 9.637 10.658 11.741 12.616 13.175 13.433 13.395 13.022 12.341 11.564 11.039 + 7.009 7.605 8.409 8.935 8.937 8.556 8.162 8.043 8.191 8.349 8.250 7.847 7.352 7.066 7.155 7.547 8.022 8.390 8.625 8.856 9.247 9.874 10.688 11.569 12.419 13.210 13.966 14.705 15.381 15.880 16.065 15.848 15.255 14.447 13.680 13.214 + 8.242 8.984 10.001 10.728 10.939 10.847 10.838 11.092 11.443 11.570 11.329 10.881 10.531 10.446 10.534 10.580 10.493 10.405 10.534 10.968 11.584 12.179 12.679 13.199 13.910 14.836 15.797 16.540 16.933 17.029 16.961 16.791 16.478 15.994 15.450 15.080 + 8.272 9.014 10.147 11.200 11.863 12.113 12.131 12.109 12.125 12.156 12.158 12.117 12.031 11.883 11.665 11.431 11.307 11.415 11.752 12.175 12.514 12.739 13.016 13.571 14.473 15.515 16.346 16.719 16.668 16.442 16.257 16.118 15.850 15.333 14.686 14.225 + 12.701 12.748 12.953 13.363 13.811 13.973 13.611 12.790 11.855 11.164 10.812 10.605 10.303 9.901 9.681 9.965 10.778 11.746 12.341 12.294 11.822 11.475 11.715 12.562 13.578 14.199 14.136 13.549 12.881 12.516 12.518 12.645 12.574 12.174 11.603 11.188 + 13.028 13.363 13.980 14.705 15.220 15.205 14.556 13.503 12.481 11.823 11.539 11.361 11.046 10.647 10.503 10.937 11.928 13.051 13.763 13.804 13.363 12.874 12.614 12.469 12.065 11.163 9.972 9.085 9.073 10.013 11.346 12.172 11.823 10.309 8.361 7.019 + 13.359 13.438 13.706 14.199 14.707 14.849 14.359 13.334 12.206 11.426 11.124 11.060 10.895 10.556 10.341 10.677 11.711 13.117 14.279 14.697 14.298 13.400 12.403 11.507 10.679 9.886 9.310 9.321 10.171 11.658 13.066 13.495 12.403 10.018 7.311 5.529 + 13.155 13.071 13.168 13.617 14.175 14.278 13.520 12.067 10.595 9.763 9.693 9.938 9.965 9.697 9.598 10.210 11.574 13.091 13.959 13.809 12.974 12.164 11.854 11.941 11.937 11.495 10.763 10.265 10.424 11.158 11.895 11.955 11.021 9.337 7.568 6.451 + 11.403 11.360 11.511 11.978 12.458 12.359 11.312 9.576 7.915 7.003 6.902 7.088 7.018 6.691 6.663 7.494 9.141 10.886 11.882 11.821 11.130 10.528 10.387 10.468 10.250 9.509 8.570 8.035 8.242 8.961 9.576 9.562 8.833 7.721 6.693 6.099 + 10.324 9.662 8.809 8.241 7.993 7.694 7.039 6.184 5.622 5.641 5.947 5.879 5.090 4.002 3.550 4.361 6.123 7.760 8.303 7.688 6.761 6.488 7.115 8.012 8.330 7.805 6.962 6.585 6.975 7.715 8.111 7.830 7.141 6.564 6.364 6.393 + 10.131 10.200 10.020 9.244 7.832 6.181 4.901 4.417 4.661 5.125 5.229 4.750 3.977 3.490 3.715 4.613 5.730 6.550 6.871 6.898 7.012 7.416 7.973 8.345 8.307 7.936 7.539 7.388 7.503 7.681 7.709 7.562 7.404 7.406 7.573 7.739 + 9.835 9.662 9.343 8.912 8.410 7.890 7.433 7.119 6.971 6.907 6.773 6.467 6.054 5.775 5.896 6.499 7.374 8.125 8.426 8.255 7.905 7.783 8.111 8.784 9.454 9.783 9.661 9.247 8.817 8.555 8.443 8.317 8.016 7.519 6.979 6.626 + 11.902 11.929 12.122 12.571 13.138 13.474 13.270 12.514 11.545 10.817 10.565 10.658 10.765 10.694 10.601 10.872 11.752 13.059 14.230 14.708 14.360 13.585 13.004 12.977 13.348 13.629 13.462 12.957 12.603 12.811 13.469 13.922 13.443 11.851 9.776 8.318 + 12.843 12.492 12.312 12.835 14.051 15.322 15.848 15.295 14.036 12.816 12.157 12.020 11.993 11.789 11.562 11.763 12.672 14.052 15.260 15.720 15.354 14.593 13.979 13.717 13.560 13.115 12.286 11.450 11.190 11.810 13.006 14.007 14.083 13.073 11.540 10.423 + 12.906 12.458 12.174 12.714 14.138 15.758 16.607 16.162 14.721 13.138 12.158 11.925 12.030 12.019 11.862 11.964 12.732 14.098 15.458 16.109 15.797 14.910 14.121 13.806 13.732 13.324 12.267 10.923 10.147 10.608 12.159 13.810 14.397 13.453 11.606 10.165 + 12.889 12.565 12.426 13.020 14.404 15.986 16.905 16.639 15.374 13.837 12.750 12.355 12.371 12.376 12.250 12.277 12.840 13.986 15.283 16.102 16.108 15.502 14.815 14.421 14.217 13.763 12.781 11.552 10.811 11.158 12.481 13.887 14.303 13.292 11.454 10.037 + 13.136 12.793 12.617 13.154 14.450 15.916 16.719 16.388 15.142 13.687 12.681 12.304 12.264 12.182 11.977 11.932 12.397 13.430 14.687 15.656 16.024 15.848 15.422 14.976 14.501 13.854 13.014 12.247 11.969 12.407 13.328 14.110 14.139 13.255 11.923 10.950 + 13.142 12.824 12.669 13.178 14.359 15.630 16.225 15.766 14.523 13.164 12.247 11.865 11.732 11.547 11.301 11.267 11.722 12.686 13.892 14.972 15.669 15.894 15.653 14.973 13.940 12.791 11.910 11.666 12.163 13.114 13.955 14.148 13.479 12.174 10.778 9.889 + 13.023 12.753 12.650 13.158 14.257 15.384 15.820 15.234 13.922 12.557 11.681 11.371 11.324 11.225 11.057 11.083 11.568 12.503 13.599 14.506 15.045 15.249 15.206 14.904 14.253 13.267 12.211 11.543 11.630 12.447 13.508 14.116 13.784 12.554 11.011 9.958 + 12.706 12.569 12.621 13.173 14.155 15.069 15.315 14.645 13.351 12.049 11.234 10.983 11.009 10.985 10.840 10.785 11.094 11.854 12.900 13.947 14.771 15.268 15.376 15.004 14.089 12.758 11.427 10.674 10.910 12.049 13.453 14.241 13.801 12.199 10.191 8.820 + 12.369 12.460 12.765 13.358 14.094 14.617 14.569 13.849 12.707 11.589 10.861 10.596 10.607 10.644 10.612 10.630 10.917 11.622 12.707 13.960 15.073 15.736 15.705 14.879 13.382 11.616 10.182 9.653 10.269 11.741 13.324 14.165 13.755 12.234 10.352 9.077 + 12.292 12.822 13.623 14.322 14.613 14.377 13.692 12.759 11.802 11.011 10.496 10.267 10.254 10.357 10.540 10.863 11.437 12.306 13.348 14.296 14.869 14.902 14.391 13.421 12.105 10.616 9.285 8.607 9.026 10.579 12.674 14.276 14.483 13.149 11.071 9.547 + 12.400 13.193 14.256 14.917 14.805 14.045 13.077 12.292 11.787 11.421 11.061 10.774 10.776 11.197 11.894 12.489 12.622 12.232 11.615 11.227 11.350 11.877 12.348 12.234 11.286 9.732 8.212 7.461 7.905 9.392 11.219 12.473 12.525 11.397 9.774 8.620 + 12.537 12.927 13.531 14.049 14.168 13.720 12.803 11.773 11.068 10.959 11.379 11.970 12.306 12.155 11.576 10.825 10.149 9.657 9.340 9.186 9.240 9.530 9.929 10.117 9.744 8.724 7.417 6.521 6.673 7.989 9.901 11.428 11.757 10.770 9.143 7.940 + 12.058 12.405 12.967 13.490 13.669 13.312 12.503 11.613 11.097 11.182 11.681 12.107 12.003 11.258 10.149 9.107 8.408 8.049 7.881 7.836 8.005 8.491 9.170 9.642 9.460 8.508 7.201 6.317 6.516 7.873 9.774 11.247 11.548 10.617 9.113 8.010 + 11.872 12.405 13.178 13.762 13.819 13.300 12.470 11.759 11.488 11.665 11.984 12.035 11.579 10.686 9.655 8.787 8.215 7.903 7.790 7.904 8.320 8.993 9.642 9.836 9.283 8.110 6.890 6.360 6.962 8.538 10.367 11.560 11.560 10.452 8.917 7.843 + 11.660 12.322 13.325 14.173 14.443 14.014 13.153 12.360 12.054 12.288 12.711 12.811 12.275 11.192 9.956 8.974 8.420 8.227 8.269 8.522 9.035 9.741 10.333 10.385 9.674 8.444 7.361 7.129 8.033 9.716 11.368 12.190 11.827 10.528 8.985 7.968 + 11.917 12.425 13.302 14.258 14.918 14.980 14.417 13.543 12.848 12.689 13.037 13.491 13.548 12.933 11.748 10.381 9.251 8.623 8.561 8.991 9.745 10.550 11.032 10.847 9.896 8.497 7.320 7.052 7.983 9.776 11.599 12.560 12.188 10.695 8.860 7.627 + 12.801 12.951 13.368 14.101 14.952 15.513 15.431 14.690 13.683 12.966 12.875 13.299 13.764 13.765 13.100 11.970 10.827 10.094 9.964 10.361 11.030 11.645 11.902 11.610 10.774 9.662 8.753 8.538 9.243 10.644 12.110 12.908 12.599 11.310 9.695 8.597 + 13.001 12.747 12.663 13.203 14.389 15.697 16.393 16.061 14.926 13.703 13.103 13.364 14.127 14.721 14.611 13.710 12.373 11.157 10.511 10.587 11.207 11.972 12.432 12.275 11.472 10.318 9.323 8.967 9.440 10.517 11.648 12.244 11.986 11.000 9.790 8.976 + 12.468 12.322 12.361 12.951 14.134 15.507 16.439 16.479 15.662 14.493 13.641 13.534 14.128 14.965 15.453 15.203 14.226 12.916 11.830 11.388 11.649 12.279 12.744 12.622 11.857 10.795 9.968 9.768 10.219 10.990 11.609 11.744 11.349 10.638 9.928 9.498 + 12.608 12.341 12.165 12.534 13.644 15.231 16.656 17.253 16.730 15.373 13.922 13.160 13.465 14.567 15.707 16.084 15.346 13.816 12.295 11.558 11.869 12.828 13.649 13.685 12.837 11.569 10.566 10.265 10.613 11.177 11.492 11.358 10.898 10.383 10.014 9.842 + 12.487 12.337 12.264 12.573 13.442 14.752 16.077 16.858 16.700 15.631 14.166 13.080 12.984 13.937 15.360 16.341 16.199 14.937 13.268 12.162 12.204 13.208 14.357 14.780 14.136 12.807 11.565 11.008 11.179 11.636 11.844 11.568 10.957 10.336 9.929 9.757 + 12.072 11.889 11.797 12.140 13.066 14.401 15.731 16.611 16.775 16.234 15.259 14.286 13.751 13.897 14.621 15.469 15.861 15.445 14.372 13.250 12.758 13.172 14.142 14.921 14.876 13.927 12.581 11.554 11.277 11.642 12.140 12.237 11.706 10.714 9.680 9.033 + 12.242 12.054 11.963 12.309 13.209 14.449 15.618 16.333 16.413 15.899 15.002 14.041 13.388 13.349 13.987 14.987 15.747 15.714 14.785 13.448 12.501 12.515 13.416 14.531 15.067 14.680 13.696 12.834 12.662 13.179 13.826 13.886 12.962 11.237 9.380 8.188 + 12.293 11.966 11.724 12.042 13.054 14.426 15.591 16.115 15.916 15.207 14.307 13.497 13.015 13.051 13.645 14.555 15.255 15.214 14.293 12.937 11.946 11.928 12.836 13.983 14.534 14.115 13.068 12.163 12.007 12.605 13.377 13.576 12.794 11.210 9.475 8.357 + 12.006 11.544 11.197 11.610 12.924 14.623 15.903 16.228 15.614 14.489 13.343 12.502 12.146 12.390 13.230 14.373 15.207 15.104 13.905 12.183 10.955 10.976 12.163 13.615 14.276 13.717 12.439 11.453 11.500 12.501 13.635 13.931 12.907 10.848 8.620 7.196 + 11.466 11.277 11.315 11.986 13.234 14.480 15.028 14.561 13.334 11.934 10.886 10.431 10.591 11.307 12.433 13.607 14.256 13.885 12.523 10.881 9.981 10.436 11.944 13.448 13.907 13.074 11.683 10.875 11.332 12.773 14.166 14.435 13.147 10.729 8.190 6.593 + 10.880 11.109 11.550 12.106 12.567 12.691 12.354 11.643 10.803 10.083 9.623 9.466 9.640 10.165 10.953 11.702 11.971 11.471 10.358 9.247 8.843 9.427 10.601 11.546 11.615 10.824 9.842 9.488 10.121 11.379 12.439 12.567 11.554 9.788 7.999 6.896 + 11.287 11.464 11.860 12.437 12.978 13.170 12.821 12.026 11.115 10.419 10.075 10.021 10.172 10.544 11.187 11.983 12.559 12.480 11.615 10.354 9.427 9.400 10.238 11.308 11.850 11.555 10.803 10.356 10.762 11.909 13.064 13.348 12.307 10.208 7.912 6.432 + 11.868 11.749 11.829 12.389 13.311 14.086 14.199 13.538 12.457 11.463 10.846 10.589 10.585 10.869 11.563 12.585 13.473 13.603 12.703 11.213 10.082 10.097 11.265 12.773 13.605 13.319 12.356 11.657 11.894 12.952 14.019 14.168 12.985 10.808 8.516 7.070 + 12.078 11.806 11.747 12.371 13.613 14.828 15.275 14.688 13.437 12.169 11.318 10.925 10.860 11.126 11.857 13.017 14.142 14.527 13.775 12.241 10.905 10.676 11.679 13.142 13.991 13.696 12.666 11.888 12.123 13.301 14.568 14.895 13.769 11.506 9.055 7.488 + 12.214 11.822 11.635 12.258 13.667 15.141 15.805 15.305 14.006 12.614 11.620 11.093 10.917 11.124 11.892 13.195 14.523 15.085 14.417 12.872 11.478 11.186 12.126 13.497 14.228 13.838 12.796 12.086 12.385 13.525 14.640 14.817 13.710 11.706 9.646 8.367 + 12.141 11.959 12.015 12.708 13.961 15.189 15.723 15.300 14.200 12.943 11.899 11.174 10.801 10.937 11.769 13.185 14.608 15.270 14.789 13.550 12.487 12.376 13.214 14.238 14.560 13.900 12.791 12.100 12.306 13.137 13.818 13.679 12.592 10.976 9.467 8.583 + 12.296 12.346 12.610 13.226 14.111 14.930 15.281 14.946 14.016 12.822 11.755 11.113 11.046 11.567 12.548 13.722 14.724 15.244 15.195 14.759 14.254 13.884 13.593 13.140 12.366 11.406 10.662 10.531 11.093 12.007 12.694 12.680 11.860 10.526 9.200 8.387 + 12.193 12.384 12.770 13.341 14.026 14.655 14.964 14.720 13.892 12.757 11.794 11.429 11.779 12.614 13.562 14.371 14.999 15.470 15.675 15.347 14.284 12.617 10.844 9.534 8.942 8.866 8.893 8.803 8.753 9.051 9.724 10.327 10.228 9.167 7.592 6.431 + 11.871 12.139 12.649 13.329 14.038 14.551 14.618 14.090 13.066 11.919 11.134 11.040 11.619 12.550 13.461 14.160 14.653 14.946 14.863 14.112 12.581 10.590 8.808 7.824 7.714 7.996 8.062 7.720 7.353 7.527 8.375 9.335 9.542 8.568 6.887 5.595 + 11.496 11.742 12.281 13.090 13.962 14.536 14.486 13.744 12.594 11.533 10.995 11.122 11.748 12.567 13.338 13.953 14.345 14.362 13.785 12.506 10.730 8.969 7.774 7.367 7.485 7.578 7.255 6.607 6.140 6.335 7.188 8.132 8.429 7.760 6.519 5.556 + 11.572 11.765 12.251 13.054 13.956 14.533 14.412 13.562 12.384 11.482 11.283 11.777 12.577 13.228 13.509 13.496 13.353 13.079 12.454 11.264 9.587 7.877 6.714 6.399 6.721 7.108 7.065 6.555 5.996 5.879 6.318 6.916 7.070 6.484 5.448 4.648 + 11.697 11.961 12.531 13.370 14.242 14.767 14.642 13.889 12.912 12.272 12.322 12.962 13.716 14.084 13.896 13.385 12.933 12.693 12.433 11.740 10.422 8.759 7.354 6.692 6.754 7.046 7.005 6.471 5.800 5.535 5.895 6.552 6.887 6.523 5.667 4.963 + 11.667 11.856 12.339 13.147 14.057 14.627 14.481 13.625 12.531 11.872 12.052 12.902 13.786 14.061 13.544 12.626 11.922 11.753 11.872 11.683 10.756 9.220 7.691 6.789 6.659 6.897 6.942 6.583 6.124 6.072 6.618 7.398 7.758 7.318 6.335 5.536 + 10.119 10.431 11.131 12.199 13.356 14.099 13.994 13.024 11.714 10.864 11.019 12.051 13.212 13.649 13.037 11.828 10.886 10.785 11.326 11.691 11.113 9.527 7.654 6.435 6.298 6.867 7.344 7.214 6.652 6.283 6.556 7.300 7.877 7.778 7.103 6.477 + 10.784 11.246 12.084 13.117 14.079 14.649 14.573 13.832 12.769 11.985 11.999 12.853 13.989 14.582 14.139 12.911 11.728 11.347 11.822 12.436 12.291 11.060 9.257 7.788 7.188 7.223 7.207 6.729 6.077 5.967 6.814 8.244 9.342 9.423 8.645 7.864 + 11.191 11.599 12.282 13.052 13.736 14.177 14.214 13.748 12.892 12.049 11.742 12.244 13.278 14.114 14.074 13.078 11.755 10.975 11.143 11.854 12.214 11.569 10.026 8.336 7.270 7.042 7.277 7.471 7.480 7.575 8.057 8.858 9.545 9.715 9.396 9.024 + 9.816 10.483 11.506 12.509 13.269 13.729 13.827 13.430 12.518 11.423 10.797 11.177 12.457 13.804 14.210 13.294 11.668 10.478 10.470 11.364 12.095 11.715 10.178 8.332 7.168 7.023 7.431 7.673 7.474 7.172 7.279 7.910 8.670 9.055 8.954 8.708 + 10.240 11.019 12.165 13.209 13.957 14.472 14.757 14.581 13.705 12.321 11.179 11.115 12.315 13.996 14.929 14.410 12.871 11.527 11.339 12.204 13.068 12.878 11.480 9.687 8.501 8.247 8.416 8.285 7.670 7.067 7.094 7.831 8.721 9.119 8.905 8.542 + 11.510 11.960 12.676 13.437 14.118 14.661 14.941 14.731 13.881 12.578 11.401 11.001 11.622 12.846 13.841 13.961 13.225 12.276 11.839 12.147 12.785 13.065 12.585 11.510 10.363 9.590 9.263 9.145 8.989 8.755 8.575 8.568 8.702 8.849 8.918 8.925 + 11.769 12.040 12.577 13.319 14.105 14.683 14.796 14.311 13.328 12.167 11.255 10.926 11.270 12.090 13.001 13.614 13.711 13.320 12.672 12.075 11.763 11.790 12.018 12.191 12.069 11.563 10.796 10.046 9.596 9.560 9.809 10.044 9.989 9.574 8.992 8.576 + 11.862 11.817 12.047 12.820 13.976 14.932 15.088 14.286 12.920 11.629 10.858 10.677 10.927 11.478 12.286 13.229 13.970 14.087 13.424 12.334 11.513 11.491 12.191 12.963 13.087 12.360 11.253 10.536 10.671 11.473 12.277 12.426 11.698 10.379 9.036 8.211 + 11.953 11.917 12.152 12.908 14.015 14.911 15.049 14.321 13.124 12.018 11.328 11.035 11.015 11.285 11.974 13.032 14.029 14.350 13.689 12.403 11.345 11.233 12.074 13.144 13.567 13.020 11.984 11.328 11.612 12.658 13.700 13.952 13.118 11.521 9.859 8.824 + 12.381 12.201 12.148 12.493 13.136 13.637 13.591 12.984 12.175 11.542 11.170 10.896 10.642 10.633 11.208 12.368 13.544 13.911 13.073 11.504 10.288 10.301 11.503 12.958 13.582 13.000 11.802 11.018 11.275 12.352 13.413 13.673 12.909 11.504 10.105 9.263 + 10.984 11.261 11.745 12.257 12.541 12.394 11.832 11.116 10.569 10.312 10.177 9.893 9.407 9.019 9.165 10.000 11.155 11.920 11.764 10.754 9.538 8.869 9.073 9.873 10.691 11.145 11.317 11.602 12.303 13.333 14.256 14.605 14.199 13.244 12.200 11.536 + 8.939 9.256 9.783 10.299 10.506 10.190 9.392 8.434 7.730 7.498 7.605 7.713 7.605 7.418 7.543 8.264 9.430 10.482 10.828 10.301 9.299 8.507 8.410 8.986 9.805 10.443 10.827 11.270 12.159 13.578 15.160 16.294 16.520 15.847 14.770 13.986 + 8.545 8.803 9.274 9.797 10.072 9.815 8.989 7.906 7.052 6.731 6.842 6.993 6.876 6.570 6.490 6.993 8.000 8.973 9.314 8.850 8.003 7.485 7.772 8.771 9.960 10.839 11.325 11.772 12.628 14.022 15.608 16.783 17.090 16.528 15.563 14.851 + 8.028 8.285 8.740 9.255 9.611 9.598 9.140 8.369 7.574 7.031 6.841 6.900 7.019 7.099 7.204 7.468 7.932 8.440 8.727 8.627 8.235 7.881 7.920 8.490 9.443 10.480 11.404 12.259 13.249 14.496 15.843 16.893 17.260 16.875 16.087 15.477 + 9.526 9.561 9.569 9.489 9.327 9.171 9.132 9.241 9.397 9.409 9.125 8.568 7.966 7.652 7.862 8.568 9.449 10.056 10.065 9.481 8.644 8.046 8.046 8.695 9.750 10.885 11.910 12.870 13.922 15.118 16.265 16.987 16.980 16.265 15.249 14.526 + 9.639 9.110 8.621 8.741 9.449 10.115 10.080 9.270 8.264 7.758 7.927 8.319 8.355 7.946 7.610 7.966 9.075 10.285 10.730 10.066 8.775 7.790 7.785 8.741 10.119 11.399 12.462 13.514 14.709 15.864 16.557 16.464 15.626 14.420 13.325 12.695 + 10.397 9.641 8.810 8.633 9.222 9.979 10.161 9.537 8.549 7.838 7.636 7.622 7.348 6.799 6.494 7.002 8.325 9.758 10.394 9.856 8.609 7.605 7.578 8.574 10.056 11.390 12.253 12.659 12.722 12.465 11.868 11.037 10.244 9.751 9.607 9.634 + 10.821 10.484 10.073 9.877 9.972 10.193 10.322 10.283 10.147 9.962 9.628 8.991 8.090 7.277 7.031 7.559 8.540 9.285 9.238 8.410 7.388 6.880 7.175 7.954 8.577 8.600 8.082 7.469 7.206 7.409 7.851 8.195 8.246 8.041 7.753 7.560 + 12.244 12.234 12.053 11.525 10.639 9.623 8.829 8.510 8.632 8.885 8.886 8.460 7.785 7.281 7.327 7.982 8.935 9.696 9.906 9.539 8.865 8.235 7.852 7.696 7.615 7.480 7.276 7.077 6.963 6.968 7.091 7.330 7.689 8.134 8.562 8.830 + 12.811 12.915 12.803 12.175 11.103 10.046 9.490 9.541 9.837 9.870 9.420 8.727 8.266 8.338 8.838 9.387 9.655 9.591 9.380 9.215 9.133 9.037 8.837 8.542 8.221 7.892 7.515 7.085 6.721 6.628 6.927 7.521 8.132 8.505 8.594 8.553 + 13.415 13.268 12.807 11.948 10.910 10.130 9.917 10.148 10.330 10.007 9.174 8.319 8.035 8.534 9.476 10.248 10.441 10.122 9.690 9.500 9.583 9.691 9.565 9.166 8.670 8.287 8.097 8.054 8.093 8.219 8.466 8.805 9.120 9.295 9.313 9.271 + 13.716 13.547 13.130 12.439 11.613 10.912 10.518 10.376 10.237 9.877 9.323 8.850 8.772 9.173 9.840 10.433 10.752 10.857 10.963 11.208 11.513 11.647 11.410 10.789 9.948 9.109 8.430 7.984 7.793 7.860 8.148 8.550 8.912 9.119 9.166 9.144 + 13.444 13.343 12.991 12.281 11.327 10.430 9.830 9.512 9.238 8.811 8.307 8.047 8.302 9.017 9.802 10.229 10.174 9.907 9.857 10.260 10.979 11.614 11.790 11.363 10.446 9.309 8.280 7.690 7.800 8.652 9.942 11.074 11.467 10.945 9.907 9.098 + 13.265 13.033 12.625 12.114 11.543 10.917 10.248 9.586 9.033 8.694 8.622 8.781 9.067 9.347 9.514 9.520 9.404 9.284 9.328 9.664 10.276 10.942 11.300 11.027 10.056 8.682 7.459 6.936 7.361 8.542 9.946 10.976 11.275 10.883 10.180 9.661 + 13.249 12.902 12.444 12.158 12.144 12.249 12.196 11.796 11.098 10.347 9.833 9.727 10.004 10.469 10.847 10.906 10.575 10.014 9.563 9.553 10.060 10.784 11.181 10.820 9.706 8.344 7.434 7.424 8.233 9.354 10.230 10.602 10.585 10.456 10.398 10.407 + 12.912 12.658 12.462 12.661 13.291 14.007 14.318 13.929 12.954 11.818 10.993 10.745 11.040 11.616 12.118 12.240 11.859 11.119 10.413 10.180 10.596 11.371 11.853 11.453 10.102 8.391 7.229 7.255 8.417 10.036 11.284 11.691 11.337 10.644 10.024 9.691 + 13.430 13.170 12.961 13.131 13.709 14.349 14.580 14.147 13.176 12.068 11.247 10.953 11.203 11.833 12.545 12.974 12.821 12.052 11.016 10.303 10.340 11.019 11.676 11.532 10.312 8.540 7.246 7.268 8.669 10.714 12.382 13.012 12.600 11.635 10.691 10.145 + 13.512 13.280 13.125 13.349 13.921 14.458 14.526 13.972 13.004 11.996 11.234 10.854 10.920 11.463 12.364 13.232 13.516 12.912 11.718 10.757 10.771 11.745 12.777 12.718 11.128 8.746 7.024 7.065 8.806 11.110 12.654 12.846 12.054 11.085 10.483 10.275 + 13.266 13.274 13.381 13.653 14.019 14.278 14.231 13.805 13.086 12.252 11.509 11.063 11.102 11.694 12.654 13.522 13.784 13.245 12.259 11.543 11.645 12.446 13.162 12.908 11.429 9.400 8.001 8.085 9.571 11.535 12.897 13.124 12.441 11.473 10.731 10.377 + 12.905 13.021 13.278 13.658 14.036 14.223 14.068 13.548 12.774 11.925 11.195 10.777 10.841 11.437 12.373 13.198 13.424 12.870 11.877 11.144 11.213 12.008 12.793 12.688 11.362 9.362 7.795 7.573 8.791 10.710 12.288 12.855 12.412 11.447 10.522 9.995 + 12.528 12.857 13.386 13.907 14.218 14.203 13.864 13.289 12.581 11.830 11.148 10.720 10.760 11.367 12.352 13.242 13.528 13.030 12.092 11.392 11.440 12.143 12.794 12.567 11.159 9.095 7.430 7.061 8.139 10.012 11.687 12.440 12.157 11.236 10.249 9.646 + 12.422 12.889 13.608 14.250 14.532 14.338 13.745 12.942 12.110 11.365 10.798 10.539 10.748 11.480 12.532 13.443 13.737 13.269 12.396 11.771 11.860 12.537 13.107 12.799 11.371 9.369 7.798 7.456 8.415 10.022 11.373 11.887 11.555 10.778 10.025 9.594 + 12.171 12.674 13.484 14.258 14.641 14.436 13.728 12.827 12.058 11.562 11.288 11.173 11.306 11.858 12.816 13.788 14.168 13.612 12.424 11.440 11.392 12.257 13.172 13.080 11.618 9.498 8.014 8.056 9.442 11.110 11.975 11.716 10.854 10.152 9.948 10.021 + 13.127 13.348 13.690 13.978 14.018 13.707 13.099 12.386 11.774 11.360 11.124 11.038 11.165 11.613 12.361 13.127 13.476 13.135 12.282 11.489 11.313 11.815 12.437 12.389 11.287 9.521 8.049 7.739 8.760 10.485 11.933 12.393 11.780 10.544 9.313 8.577 + 13.149 13.264 13.397 13.407 13.205 12.807 12.323 11.875 11.502 11.160 10.811 10.547 10.581 11.082 11.956 12.787 13.067 12.574 11.602 10.802 10.704 11.276 11.908 11.867 10.893 9.445 8.391 8.373 9.349 10.666 11.560 11.674 11.191 10.562 10.118 9.927 + 12.378 12.140 11.842 11.691 11.753 11.902 11.926 11.677 11.172 10.571 10.094 9.937 10.202 10.840 11.613 12.147 12.114 11.465 10.540 9.893 9.910 10.486 11.042 10.933 9.955 8.562 7.581 7.640 8.729 10.221 11.320 11.565 11.028 10.139 9.344 8.906 + 9.226 9.645 10.341 11.082 11.637 11.863 11.741 11.342 10.761 10.088 9.443 9.028 9.078 9.702 10.702 11.584 11.827 11.264 10.281 9.590 9.702 10.494 11.237 11.136 9.975 8.356 7.311 7.569 9.035 10.877 12.113 12.232 11.404 10.210 9.201 8.662 + 10.004 10.047 10.197 10.490 10.866 11.192 11.353 11.317 11.095 10.680 10.067 9.370 8.892 8.992 9.799 10.996 11.954 12.163 11.652 10.988 10.800 11.205 11.654 11.379 10.099 8.368 7.228 7.428 8.837 10.546 11.552 11.441 10.545 9.532 8.859 8.583 + 10.458 10.591 10.900 11.384 11.927 12.346 12.520 12.460 12.257 11.964 11.571 11.107 10.750 10.772 11.310 12.152 12.806 12.863 12.360 11.793 11.706 12.166 12.623 12.340 11.056 9.329 8.200 8.430 9.907 11.716 12.794 12.633 11.499 10.082 8.975 8.416 + 9.683 9.837 10.284 11.101 12.124 12.998 13.427 13.373 13.027 12.588 12.111 11.585 11.128 11.028 11.526 12.506 13.467 13.870 13.603 13.101 12.947 13.283 13.581 13.067 11.470 9.426 8.119 8.400 10.107 12.154 13.322 13.076 11.786 10.276 9.177 8.664 + 11.517 10.973 10.561 10.996 12.344 13.932 14.894 14.843 14.061 13.119 12.366 11.797 11.346 11.177 11.605 12.686 13.965 14.744 14.673 14.099 13.749 14.005 14.449 14.191 12.735 10.594 9.028 9.072 10.673 12.704 13.825 13.451 12.023 10.466 9.431 8.999 + 11.666 10.937 10.337 10.790 12.431 14.452 15.760 15.816 14.921 13.784 12.877 12.201 11.602 11.178 11.294 12.166 13.502 14.642 15.113 15.041 14.967 15.217 15.471 15.010 13.479 11.406 9.925 9.873 11.066 12.420 12.846 12.099 10.855 10.001 9.852 10.027 + 13.259 12.637 12.027 12.140 13.152 14.570 15.648 15.945 15.531 14.743 13.833 12.872 11.950 11.358 11.458 12.339 13.633 14.747 15.336 15.560 15.817 16.217 16.339 15.579 13.827 11.797 10.607 10.906 12.300 13.632 13.900 13.018 11.769 11.037 11.055 11.345 + 13.584 12.746 11.806 11.633 12.533 14.035 15.286 15.683 15.216 14.307 13.397 12.679 12.155 11.853 11.900 12.391 13.216 14.097 14.803 15.320 15.769 16.147 16.183 15.536 14.178 12.607 11.588 11.601 12.435 13.313 13.462 12.659 11.306 10.041 9.250 8.929 + 13.534 12.595 11.437 10.962 11.603 13.045 14.493 15.235 15.055 14.240 13.266 12.470 11.943 11.642 11.534 11.650 12.024 12.645 13.465 14.417 15.392 16.173 16.449 15.973 14.786 13.311 12.178 11.852 12.315 13.052 13.360 12.769 11.289 9.366 7.626 6.608 + 13.270 12.464 11.452 11.004 11.526 12.800 14.170 14.982 14.947 14.216 13.180 12.206 11.493 11.076 10.901 10.902 11.048 11.374 11.981 12.958 14.240 15.507 16.249 16.038 14.846 13.162 11.770 11.289 11.794 12.762 13.403 13.121 11.833 9.958 8.170 7.095 + 13.229 12.564 11.708 11.292 11.686 12.769 14.010 14.803 14.807 14.094 13.032 12.040 11.366 11.019 10.856 10.737 10.648 10.725 11.177 12.139 13.532 15.000 16.007 16.064 15.007 13.168 11.282 10.147 10.198 11.215 12.404 12.805 11.844 9.698 7.249 5.633 + 13.339 12.703 11.849 11.328 11.458 12.152 13.008 13.583 13.630 13.171 12.419 11.649 11.081 10.804 10.745 10.703 10.489 10.110 9.865 10.200 11.369 13.127 14.724 15.294 14.413 12.432 10.317 9.077 9.157 10.214 11.382 11.826 11.198 9.766 8.195 7.192 + 13.042 12.390 11.535 11.010 11.042 11.442 11.852 12.055 12.069 11.988 11.786 11.338 10.627 9.892 9.496 9.601 9.970 10.144 9.876 9.421 9.365 10.088 11.325 12.244 12.051 10.641 8.759 7.517 7.634 8.965 10.641 11.668 11.523 10.386 8.943 7.975 + 11.715 11.074 10.249 9.811 10.031 10.726 11.447 11.824 11.780 11.469 11.070 10.644 10.171 9.682 9.322 9.245 9.464 9.814 10.082 10.188 10.230 10.337 10.459 10.322 9.628 8.354 6.907 5.960 6.039 7.164 8.782 10.075 10.434 9.805 8.703 7.883 + 11.352 10.818 10.105 9.636 9.575 9.752 9.876 9.808 9.647 9.555 9.538 9.416 9.019 8.413 7.921 7.878 8.353 9.083 9.682 9.951 9.979 9.980 10.004 9.836 9.181 7.984 6.603 5.647 5.597 6.481 7.850 9.055 9.626 9.499 8.996 8.582 + 8.017 8.595 9.312 9.632 9.329 8.644 8.066 7.931 8.162 8.342 8.068 7.280 6.323 5.692 5.686 6.222 6.944 7.515 7.847 8.106 8.504 9.065 9.548 9.599 9.009 7.903 6.716 5.978 6.031 6.863 8.124 9.329 10.102 10.342 10.227 10.058 + 7.754 7.888 8.121 8.373 8.537 8.529 8.349 8.075 7.776 7.427 6.913 6.153 5.243 4.473 4.174 4.491 5.281 6.215 7.009 7.585 8.030 8.412 8.649 8.566 8.091 7.408 6.877 6.791 7.141 7.609 7.790 7.457 6.689 5.772 5.009 4.591 + 5.805 6.555 7.650 8.507 8.684 8.129 7.196 6.421 6.184 6.472 6.900 6.966 6.401 5.352 4.307 3.803 4.116 5.139 6.479 7.693 8.490 8.795 8.698 8.356 7.933 7.575 7.392 7.415 7.566 7.669 7.525 7.020 6.189 5.217 4.364 3.867 + 6.350 6.846 7.538 8.018 8.018 7.558 6.895 6.344 6.085 6.086 6.164 6.125 5.879 5.479 5.091 4.907 5.069 5.606 6.420 7.318 8.080 8.542 8.655 8.488 8.181 7.877 7.675 7.604 7.618 7.604 7.418 6.933 6.121 5.109 4.163 3.587 + 7.356 7.733 8.284 8.695 8.697 8.208 7.388 6.553 5.994 5.803 5.843 5.862 5.694 5.369 5.088 5.069 5.410 6.053 6.850 7.640 8.285 8.659 8.662 8.290 7.705 7.209 7.086 7.410 7.954 8.303 8.104 7.271 6.024 4.733 3.726 3.191 + 6.554 7.041 7.900 8.841 9.420 9.248 8.275 6.906 5.770 5.292 5.392 5.593 5.452 4.952 4.526 4.681 5.567 6.845 7.953 8.518 8.557 8.346 8.125 7.935 7.698 7.407 7.200 7.222 7.435 7.583 7.366 6.677 5.681 4.692 3.965 3.601 + 6.405 7.447 8.836 9.657 9.372 8.151 6.694 5.728 5.535 5.847 6.121 5.979 5.452 4.906 4.733 5.072 5.764 6.518 7.134 7.587 7.944 8.215 8.301 8.085 7.573 6.961 6.535 6.480 6.742 7.050 7.075 6.626 5.749 4.686 3.753 3.213 + 6.463 7.346 8.516 9.187 8.911 7.842 6.579 5.721 5.478 5.600 5.647 5.357 4.839 4.457 4.535 5.122 5.977 6.759 7.251 7.447 7.474 7.438 7.345 7.140 6.817 6.472 6.248 6.222 6.326 6.381 6.207 5.743 5.073 4.373 3.815 3.512 + 5.642 6.504 7.786 8.834 9.124 8.540 7.415 6.311 5.657 5.508 5.573 5.502 5.185 4.837 4.795 5.223 5.968 6.701 7.178 7.399 7.520 7.631 7.641 7.391 6.881 6.367 6.191 6.467 6.931 7.106 6.678 5.749 4.756 4.116 3.925 3.957 + 7.095 7.393 7.895 8.390 8.596 8.316 7.618 6.846 6.398 6.406 6.616 6.599 6.140 5.482 5.166 5.601 6.703 7.931 8.681 8.714 8.260 7.756 7.474 7.365 7.225 6.959 6.686 6.585 6.670 6.729 6.503 5.907 5.113 4.397 3.937 3.738 + 7.595 7.444 7.285 7.253 7.335 7.381 7.273 7.058 6.915 6.964 7.110 7.102 6.780 6.285 6.017 6.338 7.250 8.331 9.014 8.981 8.387 7.723 7.457 7.724 8.292 8.775 8.908 8.669 8.209 7.692 7.185 6.673 6.137 5.608 5.172 4.924 + 7.833 7.722 7.675 7.856 8.222 8.524 8.507 8.131 7.597 7.162 6.917 6.752 6.520 6.255 6.197 6.595 7.437 8.380 8.947 8.871 8.290 7.646 7.373 7.613 8.164 8.662 8.830 8.610 8.129 7.557 7.003 6.503 6.057 5.677 5.394 5.242 + 7.235 7.801 8.705 9.550 9.936 9.667 8.905 8.085 7.630 7.629 7.774 7.630 7.034 6.280 5.913 6.277 7.219 8.180 8.621 8.399 7.808 7.275 7.021 6.982 6.994 7.017 7.145 7.419 7.663 7.572 6.985 6.093 5.336 5.058 5.227 5.481 + 7.162 8.047 9.364 10.455 10.806 10.335 9.408 8.580 8.208 8.215 8.194 7.783 7.023 6.379 6.398 7.250 8.534 9.529 9.692 9.026 8.028 7.296 7.114 7.348 7.655 7.790 7.724 7.536 7.240 6.764 6.087 5.364 4.873 4.795 5.039 5.298 + 6.062 7.474 9.485 10.986 11.264 10.396 9.108 8.207 8.017 8.211 8.162 7.515 6.527 5.904 6.252 7.578 9.225 10.305 10.293 9.328 8.038 7.063 6.663 6.686 6.837 6.952 7.047 7.147 7.141 6.817 6.087 5.128 4.308 3.909 3.914 4.048 + 5.754 7.185 9.266 10.915 11.378 10.621 9.241 8.006 7.363 7.249 7.287 7.173 6.936 6.889 7.330 8.252 9.306 10.020 10.114 9.653 8.953 8.333 7.917 7.630 7.346 7.038 6.795 6.710 6.763 6.800 6.641 6.212 5.589 4.946 4.445 4.180 + 5.303 6.381 8.083 9.717 10.684 10.744 10.076 9.123 8.305 7.810 7.583 7.489 7.493 7.698 8.202 8.924 9.569 9.800 9.484 8.810 8.156 7.814 7.784 7.813 7.636 7.206 6.732 6.492 6.592 6.874 7.029 6.816 6.215 5.414 4.686 4.262 + 5.091 6.178 7.911 9.585 10.541 10.490 9.674 8.718 8.222 8.369 8.832 9.069 8.774 8.122 7.597 7.576 8.017 8.523 8.703 8.485 8.109 7.846 7.723 7.530 7.094 6.526 6.174 6.319 6.890 7.467 7.596 7.127 6.294 5.486 4.958 4.732 + 6.102 7.269 8.945 10.216 10.466 9.709 8.524 7.634 7.450 7.853 8.362 8.510 8.166 7.578 7.142 7.103 7.406 7.798 8.056 8.148 8.198 8.314 8.446 8.405 8.038 7.407 6.806 6.589 6.918 7.618 8.244 8.332 7.669 6.430 5.103 4.254 + 6.712 7.916 9.483 10.386 10.189 9.296 8.532 8.436 8.870 9.228 8.994 8.151 7.131 6.424 6.232 6.438 6.832 7.323 7.930 8.619 9.199 9.404 9.106 8.424 7.657 7.085 6.836 6.898 7.190 7.599 7.939 7.946 7.399 6.327 5.098 4.274 + 6.594 7.665 9.141 10.156 10.221 9.515 8.687 8.349 8.653 9.231 9.511 9.140 8.212 7.166 6.481 6.399 6.847 7.556 8.247 8.752 9.018 9.043 8.829 8.388 7.784 7.154 6.687 6.536 6.731 7.138 7.490 7.514 7.072 6.261 5.384 4.818 + 6.311 7.493 9.056 10.013 9.925 9.149 8.454 8.369 8.807 9.241 9.196 8.626 7.870 7.320 7.124 7.167 7.276 7.401 7.609 7.949 8.344 8.646 8.749 8.650 8.404 8.044 7.603 7.187 6.991 7.164 7.613 7.960 7.765 6.887 5.681 4.815 + 5.765 7.168 9.093 10.389 10.398 9.340 8.069 7.436 7.739 8.620 9.402 9.559 8.997 8.014 7.050 6.456 6.379 6.780 7.492 8.290 8.956 9.338 9.387 9.145 8.698 8.140 7.577 7.140 6.961 7.078 7.349 7.483 7.205 6.473 5.566 4.939 + 5.791 6.756 8.282 9.728 10.505 10.365 9.535 8.595 8.132 8.372 9.045 9.573 9.469 8.668 7.552 6.684 6.449 6.863 7.647 8.454 9.058 9.386 9.437 9.217 8.756 8.162 7.633 7.352 7.367 7.532 7.595 7.347 6.756 5.973 5.247 4.816 + 6.485 6.811 7.390 8.101 8.791 9.298 9.484 9.308 8.897 8.527 8.470 8.788 9.231 9.380 8.961 8.106 7.311 7.097 7.612 8.505 9.186 9.260 8.784 8.150 7.725 7.571 7.486 7.280 6.993 6.836 6.918 7.061 6.912 6.277 5.367 4.696 + 6.390 6.859 7.462 7.859 8.023 8.204 8.584 9.001 9.068 8.590 7.858 7.463 7.777 8.570 9.176 9.077 8.380 7.736 7.751 8.445 9.252 9.542 9.166 8.522 8.117 8.078 8.095 7.812 7.234 6.730 6.615 6.764 6.689 6.021 4.941 4.107 + 6.434 6.782 7.271 7.685 7.987 8.281 8.603 8.798 8.643 8.134 7.620 7.575 8.178 9.074 9.602 9.328 8.447 7.649 7.571 8.270 9.186 9.610 9.241 8.371 7.568 7.200 7.208 7.288 7.221 7.038 6.878 6.752 6.503 5.999 5.345 4.872 + 6.190 5.959 5.653 5.586 6.093 7.254 8.657 9.527 9.252 7.940 6.474 5.928 6.724 8.274 9.438 9.453 8.539 7.658 7.647 8.507 9.468 9.722 9.134 8.281 7.838 7.947 8.163 7.979 7.376 6.816 6.702 6.892 6.781 5.914 4.533 3.470 + 4.320 5.021 5.971 6.674 7.004 7.211 7.551 7.923 7.926 7.292 6.262 5.490 5.528 6.344 7.345 7.894 7.839 7.592 7.683 8.248 8.916 9.176 8.848 8.204 7.663 7.401 7.265 7.047 6.773 6.683 6.900 7.168 6.990 6.091 4.779 3.807 + 5.079 5.336 5.594 5.644 5.575 5.703 6.206 6.855 7.166 6.852 6.155 5.688 5.907 6.688 7.436 7.632 7.322 7.074 7.435 8.397 9.364 9.659 9.083 8.047 7.180 6.814 6.826 6.909 6.945 7.063 7.364 7.648 7.491 6.658 5.441 4.538 + 5.313 5.590 5.778 5.580 5.166 5.064 5.615 6.536 7.069 6.654 5.488 4.435 4.316 5.215 6.437 7.144 7.085 6.747 6.822 7.526 8.403 8.772 8.360 7.518 6.859 6.704 6.887 7.040 7.025 7.034 7.285 7.677 7.798 7.338 6.464 5.763 + 5.730 5.681 5.620 5.664 5.979 6.629 7.412 7.903 7.735 6.941 6.003 5.521 5.727 6.301 6.663 6.514 6.136 6.145 6.912 8.172 9.195 9.378 8.739 7.865 7.397 7.517 7.900 8.114 8.044 7.924 7.990 8.130 7.949 7.180 6.057 5.218 + 5.448 5.424 5.326 5.224 5.388 6.098 7.288 8.419 8.789 8.107 6.802 5.756 5.631 6.359 7.258 7.658 7.483 7.252 7.539 8.394 9.278 9.551 9.034 8.145 7.496 7.379 7.610 7.827 7.884 7.935 8.145 8.381 8.259 7.535 6.448 5.631 + 5.589 5.414 5.127 4.926 5.144 6.034 7.476 8.892 9.549 9.080 7.805 6.561 6.112 6.613 7.554 8.211 8.214 7.781 7.440 7.546 8.007 8.425 8.478 8.172 7.788 7.607 7.708 7.977 8.264 8.486 8.595 8.501 8.088 7.355 6.523 5.961 + 4.760 4.461 4.058 3.915 4.428 5.767 7.649 9.377 10.215 9.870 8.711 7.512 6.907 6.984 7.344 7.527 7.417 7.267 7.375 7.748 8.085 8.087 7.762 7.435 7.434 7.788 8.215 8.409 8.329 8.189 8.181 8.220 7.999 7.323 6.385 5.698 + 4.239 4.431 4.692 4.991 5.523 6.546 8.023 9.450 10.147 9.790 8.731 7.744 7.409 7.663 7.955 7.831 7.388 7.155 7.525 8.301 8.827 8.599 7.754 6.973 6.862 7.416 8.073 8.282 8.027 7.781 7.951 8.389 8.489 7.797 6.548 5.559 + 4.565 4.835 5.228 5.615 6.038 6.673 7.613 8.693 9.520 9.736 9.274 8.404 7.544 7.004 6.869 7.069 7.494 8.038 8.548 8.810 8.656 8.127 7.508 7.160 7.246 7.618 7.963 8.096 8.120 8.278 8.647 8.962 8.801 7.980 6.812 5.959 + 5.630 5.607 5.552 5.530 5.727 6.337 7.365 8.507 9.264 9.241 8.416 7.171 6.070 5.554 5.760 6.538 7.574 8.512 9.033 8.940 8.274 7.361 6.693 6.639 7.186 7.937 8.403 8.387 8.114 7.998 8.225 8.543 8.462 7.725 6.607 5.771 + 6.853 6.647 6.312 6.019 5.994 6.388 7.133 7.912 8.321 8.123 7.404 6.506 5.804 5.511 5.655 6.182 7.026 8.065 9.036 9.564 9.380 8.556 7.538 6.880 6.867 7.341 7.874 8.151 8.199 8.275 8.521 8.740 8.540 7.729 6.592 5.763 + 7.431 6.954 6.196 5.489 5.167 5.404 6.090 6.870 7.328 7.228 6.643 5.884 5.293 5.078 5.274 5.823 6.644 7.620 8.539 9.120 9.152 8.657 7.926 7.349 7.168 7.346 7.669 7.964 8.233 8.567 8.936 9.099 8.750 7.821 6.650 5.833 + 7.263 6.676 5.946 5.634 6.019 6.930 7.905 8.520 8.610 8.254 7.602 6.756 5.808 4.972 4.600 4.997 6.159 7.646 8.787 9.074 8.500 7.545 6.840 6.734 7.102 7.529 7.683 7.586 7.552 7.867 8.474 8.962 8.865 8.051 6.894 6.060 + 5.810 5.405 4.936 4.848 5.375 6.368 7.372 7.907 7.758 7.067 6.191 5.447 4.959 4.698 4.648 4.907 5.615 6.742 7.969 8.810 8.913 8.324 7.476 6.882 6.792 7.065 7.368 7.503 7.561 7.772 8.205 8.614 8.603 7.997 7.057 6.356 + 3.853 3.752 3.607 3.536 3.682 4.127 4.798 5.460 5.828 5.737 5.246 4.599 4.074 3.846 3.966 4.417 5.170 6.159 7.217 8.075 8.479 8.356 7.883 7.381 7.110 7.125 7.308 7.524 7.738 7.991 8.262 8.394 8.181 7.571 6.790 6.241 + 3.099 3.146 3.286 3.601 4.152 4.899 5.641 6.071 5.951 5.297 4.421 3.765 3.633 4.027 4.704 5.401 6.022 6.647 7.360 8.088 8.602 8.684 8.306 7.663 7.040 6.640 6.519 6.635 6.936 7.362 7.784 7.982 7.751 7.077 6.229 5.641 + 4.109 3.718 3.271 3.218 3.792 4.809 5.716 5.936 5.264 4.056 3.026 2.774 3.382 4.408 5.261 5.677 5.882 6.323 7.202 8.233 8.847 8.658 7.789 6.788 6.202 6.203 6.562 6.943 7.215 7.479 7.842 8.193 8.249 7.838 7.134 6.589 + 3.249 3.098 2.972 3.106 3.623 4.418 5.173 5.529 5.315 4.672 3.992 3.673 3.878 4.450 5.066 5.492 5.739 6.010 6.476 7.087 7.573 7.654 7.269 6.655 6.204 6.209 6.686 7.396 8.014 8.322 8.293 8.046 7.738 7.478 7.309 7.229 + 2.303 1.961 1.690 2.008 3.123 4.728 6.145 6.731 6.284 5.159 4.020 3.409 3.453 3.888 4.355 4.707 5.067 5.631 6.396 7.087 7.350 7.051 6.417 5.893 5.826 6.247 6.898 7.478 7.854 8.082 8.249 8.319 8.163 7.717 7.131 6.712 + 4.328 3.909 3.368 3.113 3.400 4.148 4.973 5.421 5.281 4.724 4.177 3.998 4.210 4.517 4.591 4.396 4.257 4.595 5.537 6.742 7.605 7.696 7.082 6.268 5.828 6.016 6.660 7.380 7.889 8.148 8.266 8.316 8.265 8.059 7.755 7.525 + 3.901 3.172 2.287 1.966 2.539 3.701 4.732 5.020 4.488 3.620 3.075 3.195 3.784 4.310 4.362 3.978 3.611 3.754 4.543 5.650 6.528 6.813 6.557 6.138 5.958 6.171 6.653 7.174 7.589 7.889 8.103 8.189 8.050 7.658 7.153 6.797 + 3.811 3.148 2.339 2.041 2.570 3.676 4.723 5.145 4.827 4.138 3.616 3.555 3.831 4.083 4.078 3.956 4.121 4.892 6.188 7.523 8.323 8.325 7.735 7.045 6.674 6.722 7.005 7.294 7.515 7.737 8.009 8.226 8.187 7.798 7.217 6.786 + 4.320 3.709 2.889 2.422 2.687 3.638 4.821 5.644 5.735 5.154 4.314 3.673 3.451 3.558 3.792 4.087 4.597 5.517 6.803 8.066 8.767 8.586 7.680 6.605 5.967 6.045 6.676 7.445 7.991 8.200 8.174 8.065 7.950 7.829 7.705 7.618 + 1.620 2.149 2.871 3.410 3.658 3.806 4.097 4.546 4.924 4.997 4.769 4.477 4.354 4.410 4.481 4.486 4.603 5.146 6.214 7.462 8.261 8.162 7.268 6.187 5.583 5.718 6.347 7.019 7.464 7.714 7.907 8.023 7.867 7.308 6.523 5.944 + 2.707 2.258 1.849 2.026 2.910 4.076 4.889 5.010 4.626 4.245 4.230 4.520 4.740 4.602 4.211 4.013 4.424 5.463 6.705 7.570 7.723 7.267 6.612 6.161 6.078 6.275 6.583 6.911 7.268 7.660 7.983 8.045 7.694 6.975 6.159 5.619 + 2.212 2.003 1.930 2.351 3.268 4.275 4.863 4.813 4.339 3.870 3.689 3.747 3.810 3.744 3.686 3.921 4.614 5.638 6.648 7.321 7.548 7.431 7.149 6.831 6.554 6.396 6.452 6.759 7.214 7.593 7.682 7.431 6.975 6.525 6.221 6.085 + 3.244 3.601 4.113 4.569 4.936 5.323 5.774 6.115 6.058 5.480 4.611 3.906 3.699 3.954 4.345 4.614 4.833 5.317 6.249 7.385 8.147 8.066 7.182 6.050 5.339 5.356 5.903 6.531 6.925 7.067 7.089 7.029 6.772 6.227 5.535 5.040 + 6.444 6.304 6.353 6.882 7.765 8.469 8.465 7.678 6.563 5.739 5.511 5.696 5.889 5.873 5.805 6.014 6.642 7.474 8.103 8.250 7.946 7.426 6.908 6.464 6.104 5.910 6.032 6.524 7.196 7.677 7.672 7.197 6.561 6.107 5.954 5.966 + 6.664 6.620 6.797 7.434 8.438 9.367 9.740 9.390 8.579 7.775 7.315 7.243 7.406 7.667 7.992 8.366 8.667 8.685 8.295 7.611 6.939 6.546 6.458 6.481 6.421 6.296 6.319 6.668 7.265 7.795 7.947 7.667 7.186 6.804 6.651 6.642 + 5.513 5.827 6.428 7.269 8.270 9.293 10.124 10.526 10.345 9.636 8.683 7.882 7.544 7.742 8.300 8.928 9.388 9.570 9.468 9.100 8.480 7.653 6.754 5.998 5.593 5.628 6.024 6.587 7.107 7.440 7.524 7.360 6.991 6.507 6.046 5.763 + 5.614 5.922 6.568 7.562 8.823 10.118 11.083 11.351 10.751 9.459 7.984 6.947 6.762 7.401 8.426 9.253 9.502 9.189 8.631 8.178 7.950 7.800 7.501 6.984 6.444 6.200 6.434 7.017 7.565 7.699 7.301 6.587 5.935 5.610 5.607 5.707 + 7.296 7.205 7.280 7.815 8.869 10.139 11.100 11.306 10.664 9.493 8.351 7.723 7.789 8.367 9.061 9.489 9.467 9.054 8.461 7.902 7.481 7.179 6.922 6.681 6.514 6.512 6.706 7.002 7.211 7.166 6.835 6.353 5.927 5.702 5.670 5.710 + 7.513 7.302 7.170 7.481 8.378 9.619 10.671 11.010 10.458 9.313 8.186 7.631 7.829 8.517 9.216 9.553 9.476 9.193 8.957 8.855 8.782 8.584 8.218 7.795 7.483 7.374 7.436 7.563 7.669 7.716 7.674 7.484 7.084 6.500 5.889 5.494 + 6.141 6.549 7.397 8.632 10.003 11.093 11.515 11.142 10.196 9.128 8.367 8.113 8.299 8.712 9.142 9.468 9.629 9.576 9.273 8.752 8.161 7.715 7.573 7.727 7.989 8.115 7.974 7.629 7.276 7.085 7.064 7.055 6.868 6.444 5.924 5.565 + 5.328 6.267 7.816 9.480 10.814 11.558 11.648 11.163 10.270 9.214 8.292 7.777 7.803 8.298 9.019 9.683 10.082 10.137 9.854 9.282 8.512 7.709 7.095 6.859 7.034 7.452 7.846 8.013 7.931 7.719 7.493 7.252 6.906 6.407 5.862 5.497 + 7.210 7.462 8.014 8.869 9.889 10.779 11.198 10.934 10.038 8.824 7.730 7.116 7.123 7.647 8.424 9.161 9.646 9.784 9.593 9.167 8.642 8.164 7.844 7.726 7.774 7.896 7.998 8.017 7.939 7.763 7.479 7.060 6.500 5.864 5.290 4.945 + 7.341 7.869 8.717 9.584 10.224 10.520 10.452 10.040 9.317 8.385 7.463 6.862 6.843 7.452 8.448 9.408 9.949 9.929 9.499 8.968 8.599 8.467 8.464 8.422 8.252 7.997 7.777 7.678 7.678 7.654 7.456 7.000 6.319 5.553 4.892 4.511 + 8.382 8.596 9.011 9.568 10.139 10.531 10.545 10.060 9.092 7.823 6.555 5.627 5.299 5.654 6.556 7.692 8.695 9.309 9.482 9.366 9.192 9.129 9.196 9.294 9.307 9.193 8.998 8.786 8.564 8.266 7.803 7.140 6.341 5.545 4.912 4.564 + 8.482 8.105 7.758 7.910 8.668 9.637 10.169 9.818 8.655 7.213 6.132 5.765 6.038 6.613 7.178 7.622 8.002 8.365 8.638 8.679 8.431 8.033 7.764 7.852 8.305 8.898 9.316 9.354 9.007 8.413 7.718 6.977 6.178 5.346 4.608 4.163 + 8.085 8.240 8.569 9.065 9.634 10.071 10.118 9.582 8.465 7.017 5.650 4.762 4.559 4.983 5.781 6.656 7.393 7.898 8.161 8.207 8.086 7.884 7.701 7.606 7.574 7.500 7.273 6.882 6.436 6.081 5.875 5.731 5.493 5.086 4.607 4.278 + 7.412 6.904 6.234 5.851 5.999 6.548 7.078 7.154 6.596 5.580 4.534 3.903 3.933 4.584 5.579 6.556 7.217 7.440 7.286 6.944 6.613 6.409 6.332 6.306 6.258 6.175 6.097 6.065 6.058 5.995 5.782 5.378 4.833 4.260 3.793 3.533 + 6.708 6.452 6.201 6.288 6.853 7.710 8.418 8.533 7.879 6.667 5.377 4.507 4.325 4.776 5.575 6.390 6.993 7.301 7.331 7.138 6.788 6.362 5.954 5.636 5.428 5.292 5.188 5.119 5.128 5.235 5.369 5.367 5.080 4.509 3.849 3.407 + 4.438 4.841 5.551 6.369 7.023 7.288 7.108 6.625 6.056 5.535 5.061 4.618 4.328 4.446 5.142 6.256 7.274 7.637 7.153 6.177 5.371 5.202 5.604 6.067 6.090 5.596 4.966 4.688 4.935 5.437 5.716 5.468 4.752 3.881 3.176 2.802 + 4.612 4.861 5.267 5.707 6.095 6.394 6.580 6.601 6.387 5.921 5.306 4.767 4.557 4.829 5.548 6.509 7.426 8.053 8.271 8.099 7.666 7.149 6.701 6.397 6.221 6.095 5.950 5.783 5.657 5.644 5.747 5.877 5.914 5.799 5.590 5.429 + 3.931 4.657 5.855 7.100 7.951 8.137 7.681 6.877 6.110 5.627 5.414 5.276 5.056 4.819 4.840 5.394 6.497 7.818 8.829 9.108 8.583 7.558 6.509 5.822 5.614 5.750 5.987 6.135 6.145 6.089 6.086 6.222 6.510 6.885 7.235 7.445 + 3.815 4.621 5.909 7.164 7.906 7.917 7.348 6.615 6.125 6.013 6.082 6.007 5.650 5.220 5.138 5.682 6.716 7.723 8.151 7.811 7.020 6.376 6.341 6.935 7.756 8.277 8.196 7.588 6.795 6.186 5.949 6.050 6.326 6.609 6.806 6.900 + 4.959 5.528 6.412 7.237 7.682 7.602 7.047 6.207 5.325 4.614 4.204 4.102 4.225 4.483 4.866 5.448 6.283 7.256 8.054 8.336 7.997 7.332 6.889 7.093 7.911 8.837 9.255 8.893 8.013 7.172 6.767 6.744 6.714 6.352 5.721 5.220 + 5.837 6.548 7.610 8.551 9.060 9.086 8.725 8.062 7.156 6.130 5.231 4.727 4.721 5.078 5.564 6.069 6.672 7.472 8.336 8.876 8.749 8.033 7.300 7.240 8.095 9.409 10.343 10.316 9.433 8.335 7.620 7.360 7.142 6.559 5.673 4.989 + 7.082 6.855 6.681 6.881 7.518 8.274 8.614 8.163 6.991 5.610 4.623 4.315 4.499 4.754 4.854 5.007 5.644 6.942 8.504 9.545 9.497 8.527 7.499 7.339 8.306 9.768 10.707 10.516 9.443 8.301 7.738 7.715 7.641 7.010 5.940 5.096 + 7.341 7.213 7.186 7.522 8.255 9.052 9.341 8.672 7.082 5.167 3.749 3.337 3.801 4.531 4.965 5.065 5.289 6.103 7.446 8.674 9.074 8.511 7.608 7.271 7.926 9.155 10.058 10.013 9.171 8.247 7.820 7.804 7.585 6.687 5.319 4.279 + 6.246 6.313 6.620 7.317 8.302 9.144 9.285 8.404 6.712 4.902 3.753 3.623 4.237 4.942 5.251 5.232 5.403 6.217 7.575 8.821 9.260 8.760 7.906 7.543 8.090 9.205 10.092 10.176 9.539 8.752 8.293 8.101 7.689 6.700 5.358 4.376 + 4.493 5.339 6.660 7.954 8.857 9.232 9.068 8.367 7.182 5.743 4.489 3.869 4.039 4.743 5.514 6.052 6.433 6.950 7.736 8.545 8.930 8.673 8.058 7.697 8.037 8.973 9.931 10.328 10.016 9.302 8.585 7.977 7.277 6.296 5.190 4.429 + 2.846 4.308 6.443 8.263 9.242 9.488 9.372 9.053 8.386 7.248 5.876 4.804 4.439 4.701 5.144 5.426 5.665 6.274 7.438 8.760 9.507 9.264 8.371 7.692 7.874 8.788 9.665 9.816 9.236 8.529 8.237 8.265 7.975 6.882 5.261 4.039 + 4.067 4.557 5.445 6.557 7.656 8.467 8.737 8.335 7.343 6.060 4.879 4.092 3.770 3.799 4.059 4.551 5.359 6.461 7.586 8.305 8.327 7.763 7.101 6.862 7.206 7.819 8.191 8.054 7.583 7.194 7.111 7.130 6.794 5.857 4.601 3.695 + 4.821 5.691 6.934 7.910 8.262 8.059 7.611 7.155 6.717 6.206 5.606 5.038 4.662 4.552 4.689 5.059 5.686 6.534 7.368 7.787 7.486 6.560 5.538 5.041 5.313 6.040 6.623 6.703 6.444 6.314 6.571 6.939 6.823 5.885 4.463 3.398 + 4.684 5.679 7.139 8.355 8.870 8.652 7.957 7.063 6.134 5.264 4.581 4.231 4.258 4.550 4.936 5.356 5.908 6.672 7.486 7.935 7.649 6.667 5.522 4.888 5.066 5.754 6.327 6.396 6.118 5.979 6.243 6.610 6.443 5.387 3.817 2.648 + 5.017 6.049 7.519 8.625 8.834 8.144 6.963 5.792 4.943 4.467 4.261 4.200 4.208 4.279 4.470 4.884 5.596 6.523 7.371 7.744 7.408 6.516 5.580 5.142 5.397 6.058 6.598 6.674 6.368 6.034 5.913 5.879 5.557 4.731 3.632 2.839 + 3.794 4.798 6.275 7.505 8.007 7.725 6.915 5.902 4.928 4.160 3.723 3.666 3.882 4.134 4.247 4.294 4.562 5.262 6.224 6.898 6.765 5.814 4.658 4.113 4.549 5.591 6.425 6.479 5.862 5.180 4.919 4.978 4.799 3.961 2.680 1.707 + 5.002 5.486 6.278 7.082 7.580 7.558 7.006 6.124 5.219 4.543 4.170 4.005 3.912 3.874 4.023 4.522 5.359 6.252 6.757 6.562 5.736 4.736 4.128 4.211 4.817 5.447 5.651 5.350 4.854 4.563 4.608 4.735 4.527 3.794 2.789 2.064 + 3.695 4.635 6.045 7.280 7.888 7.785 7.157 6.261 5.288 4.378 3.671 3.297 3.294 3.573 4.000 4.522 5.184 5.998 6.783 7.179 6.904 6.042 5.077 4.589 4.822 5.495 6.045 6.099 5.751 5.411 5.357 5.438 5.209 4.393 3.232 2.376 + 3.772 4.763 6.219 7.418 7.857 7.479 6.589 5.591 4.764 4.189 3.816 3.562 3.362 3.213 3.189 3.425 4.020 4.895 5.741 6.164 5.964 5.337 4.784 4.744 5.235 5.830 6.006 5.608 4.987 4.685 4.913 5.312 5.232 4.328 2.938 1.897 + 3.441 4.063 5.016 5.886 6.355 6.340 5.964 5.425 4.861 4.304 3.739 3.197 2.787 2.656 2.898 3.485 4.258 4.999 5.519 5.730 5.657 5.405 5.090 4.787 4.526 4.316 4.189 4.196 4.368 4.648 4.863 4.793 4.304 3.467 2.571 1.991 + 3.215 3.911 4.912 5.712 6.012 5.831 5.383 4.859 4.336 3.835 3.401 3.097 2.927 2.822 2.750 2.831 3.293 4.230 5.380 6.189 6.185 5.388 4.360 3.805 4.006 4.613 4.974 4.732 4.141 3.801 4.053 4.595 4.720 3.979 2.659 1.627 + 4.047 4.596 5.318 5.774 5.795 5.535 5.224 4.903 4.396 3.569 2.578 1.855 1.812 2.529 3.698 4.867 5.729 6.212 6.348 6.124 5.509 4.627 3.843 3.581 4.003 4.833 5.537 5.738 5.489 5.159 5.030 5.001 4.688 3.847 2.708 1.880 + 3.594 3.711 4.104 4.835 5.634 5.988 5.531 4.395 3.184 2.546 2.697 3.294 3.788 3.928 3.973 4.415 5.464 6.761 7.578 7.379 6.256 4.891 4.076 4.160 4.867 5.577 5.818 5.571 5.185 5.011 5.085 5.106 4.713 3.816 2.726 1.979 + 2.172 3.363 4.933 5.894 5.829 5.116 4.513 4.472 4.803 4.925 4.445 3.528 2.771 2.706 3.398 4.444 5.312 5.700 5.640 5.340 4.974 4.616 4.306 4.125 4.160 4.408 4.743 4.997 5.080 5.003 4.797 4.422 3.799 2.939 2.050 1.474 + 3.591 4.249 5.074 5.506 5.389 5.057 4.983 5.308 5.698 5.651 4.969 3.982 3.315 3.421 4.251 5.326 6.094 6.267 5.911 5.287 4.655 4.182 3.968 4.068 4.455 4.974 5.391 5.533 5.390 5.088 4.735 4.301 3.663 2.790 1.876 1.276 + 3.761 4.094 4.544 4.881 5.082 5.354 5.911 6.711 7.369 7.388 6.549 5.152 3.907 3.497 4.136 5.423 6.613 7.100 6.775 6.014 5.346 5.076 5.134 5.230 5.145 4.903 4.704 4.709 4.862 4.925 4.658 4.004 3.122 2.269 1.644 1.329 + 3.676 4.026 4.467 4.746 4.886 5.163 5.800 6.663 7.258 7.112 6.198 5.059 4.470 4.892 6.133 7.485 8.200 7.959 6.993 5.830 4.923 4.427 4.252 4.248 4.352 4.577 4.919 5.276 5.482 5.389 4.943 4.202 3.299 2.403 1.685 1.285 + 4.359 4.442 4.553 4.658 4.819 5.173 5.797 6.570 7.154 7.171 6.484 5.392 4.542 4.560 5.632 7.315 8.755 9.185 8.398 6.849 5.352 4.565 4.649 5.282 5.980 6.436 6.647 6.770 6.888 6.894 6.574 5.796 4.632 3.347 2.267 1.658 + 5.669 5.081 4.399 4.212 4.756 5.775 6.765 7.336 7.383 6.998 6.322 5.534 4.949 4.994 5.949 7.601 9.182 9.779 8.966 7.171 5.416 4.612 4.947 5.868 6.615 6.841 6.777 6.874 7.286 7.692 7.574 6.673 5.203 3.664 2.500 1.906 + 6.374 5.944 5.433 5.306 5.841 6.921 8.076 8.742 8.573 7.643 6.401 5.432 5.164 5.689 6.754 7.905 8.690 8.822 8.276 7.285 6.253 5.585 5.495 5.897 6.453 6.792 6.760 6.517 6.392 6.579 6.911 6.912 6.147 4.601 2.814 1.616 + 5.911 5.729 5.579 5.723 6.257 7.026 7.704 7.971 7.659 6.800 5.611 4.442 3.697 3.706 4.542 5.906 7.204 7.828 7.514 6.509 5.421 4.823 4.891 5.337 5.674 5.599 5.202 4.850 4.860 5.221 5.568 5.428 4.548 3.087 1.563 0.595 + 5.570 6.062 6.765 7.316 7.503 7.361 7.070 6.757 6.377 5.779 4.905 3.936 3.260 3.246 3.988 5.202 6.353 6.943 6.775 6.027 5.109 4.410 4.098 4.084 4.153 4.149 4.087 4.112 4.343 4.723 4.988 4.799 3.969 2.632 1.238 0.348 + 2.416 3.677 5.483 6.912 7.458 7.267 6.860 6.616 6.476 6.090 5.226 4.069 3.135 2.897 3.429 4.362 5.141 5.382 5.054 4.418 3.814 3.467 3.411 3.526 3.629 3.587 3.397 3.205 3.209 3.491 3.882 4.009 3.529 2.425 1.104 0.205 + 1.189 1.976 3.111 4.043 4.505 4.644 4.806 5.163 5.510 5.427 4.669 3.462 2.442 2.242 3.039 4.400 5.553 5.892 5.351 4.394 3.648 3.467 3.733 4.014 3.923 3.406 2.756 2.381 2.500 2.997 3.498 3.617 3.180 2.319 1.391 0.798 + 3.803 3.729 3.704 3.844 4.137 4.446 4.633 4.659 4.564 4.366 4.029 3.550 3.095 2.977 3.421 4.304 5.129 5.331 4.717 3.668 2.885 2.860 3.497 4.198 4.349 3.801 2.952 2.392 2.431 2.905 3.372 3.483 3.205 2.752 2.363 2.160 + 3.832 4.066 4.397 4.650 4.724 4.636 4.460 4.235 3.930 3.507 3.016 2.631 2.568 2.936 3.634 4.373 4.842 4.880 4.558 4.108 3.773 3.676 3.799 4.055 4.378 4.753 5.173 5.583 5.869 5.918 5.695 5.278 4.818 4.449 4.228 4.136 + 2.945 3.495 4.219 4.670 4.672 4.394 4.119 3.962 3.796 3.451 2.959 2.578 2.568 2.939 3.414 3.662 3.571 3.320 3.183 3.269 3.447 3.512 3.414 3.315 3.418 3.751 4.123 4.294 4.189 3.953 3.792 3.780 3.811 3.737 3.545 3.375 + 1.899 2.539 3.502 4.328 4.651 4.379 3.707 2.979 2.485 2.328 2.427 2.625 2.815 2.978 3.142 3.301 3.396 3.368 3.233 3.094 3.084 3.254 3.533 3.770 3.849 3.765 3.614 3.505 3.471 3.463 3.408 3.284 3.133 3.018 2.968 2.959 + 3.307 3.305 3.426 3.763 4.223 4.529 4.409 3.812 2.981 2.301 2.048 2.229 2.635 3.026 3.302 3.513 3.737 3.962 4.081 4.005 3.776 3.569 3.562 3.800 4.149 4.398 4.412 4.226 3.996 3.863 3.840 3.805 3.616 3.234 2.785 2.480 + 4.156 4.552 5.189 5.773 5.965 5.559 4.656 3.637 2.936 2.726 2.818 2.849 2.631 2.331 2.316 2.796 3.594 4.259 4.445 4.196 3.894 3.907 4.276 4.713 4.902 4.797 4.637 4.677 4.911 5.066 4.860 4.286 3.623 3.193 3.086 3.133 + 2.912 3.624 4.652 5.427 5.517 4.869 3.825 2.891 2.422 2.427 2.631 2.746 2.717 2.752 3.106 3.816 4.627 5.178 5.288 5.093 4.904 4.919 5.062 5.080 4.815 4.384 4.091 4.157 4.501 4.791 4.719 4.244 3.605 3.105 2.870 2.818 + 0.560 1.782 3.560 4.989 5.479 5.059 4.261 3.697 3.659 4.002 4.339 4.358 4.029 3.581 3.316 3.411 3.843 4.443 5.009 5.404 5.590 5.600 5.500 5.340 5.140 4.889 4.578 4.227 3.890 3.631 3.473 3.389 3.314 3.208 3.082 2.993 + 1.670 2.630 3.971 4.920 5.016 4.382 3.596 3.262 3.599 4.334 4.945 5.048 4.657 4.126 3.865 4.051 4.553 5.079 5.411 5.534 5.573 5.647 5.759 5.826 5.778 5.624 5.419 5.176 4.831 4.314 3.657 3.036 2.674 2.673 2.916 3.144 + 2.744 3.296 3.980 4.305 4.103 3.655 3.450 3.792 4.576 5.393 5.832 5.750 5.296 4.757 4.379 4.290 4.527 5.065 5.795 6.510 6.965 7.011 6.706 6.288 6.007 5.947 5.991 5.934 5.656 5.192 4.673 4.200 3.786 3.405 3.074 2.871 + 2.636 3.964 5.493 5.963 5.078 3.715 3.102 3.740 5.034 5.911 5.793 5.022 4.421 4.478 4.969 5.315 5.250 5.106 5.431 6.373 7.453 7.971 7.643 6.850 6.269 6.256 6.572 6.674 6.244 5.443 4.680 4.187 3.847 3.420 2.873 2.463 + 3.837 4.874 6.079 6.517 6.039 5.387 5.464 6.450 7.598 7.883 6.904 5.225 3.875 3.504 3.959 4.598 4.964 5.162 5.611 6.506 7.539 8.155 8.062 7.487 6.935 6.728 6.766 6.708 6.355 5.813 5.318 4.940 4.511 3.856 3.067 2.507 + 3.773 4.334 5.067 5.580 5.853 6.207 6.899 7.754 8.232 7.910 6.913 5.875 5.423 5.672 6.178 6.399 6.214 6.008 6.266 7.063 7.955 8.367 8.093 7.454 6.976 6.926 7.129 7.206 6.948 6.457 5.941 5.439 4.778 3.830 2.770 2.047 + 3.463 3.896 4.545 5.135 5.527 5.781 6.050 6.405 6.737 6.839 6.577 6.026 5.437 5.068 5.011 5.161 5.341 5.475 5.646 5.999 6.566 7.177 7.547 7.478 7.019 6.445 6.067 6.004 6.105 6.054 5.601 4.718 3.607 2.555 1.783 1.389 + 2.737 3.662 4.860 5.594 5.663 5.510 5.758 6.588 7.550 7.950 7.446 6.323 5.227 4.643 4.591 4.766 4.920 5.091 5.486 6.186 6.992 7.579 7.777 7.695 7.576 7.549 7.527 7.345 6.958 6.477 6.006 5.488 4.737 3.677 2.539 1.782 + 3.714 4.053 4.482 4.756 4.889 5.156 5.810 6.791 7.692 8.038 7.640 6.722 5.734 5.024 4.665 4.531 4.525 4.693 5.155 5.930 6.851 7.654 8.147 8.287 8.144 7.792 7.287 6.715 6.219 5.929 5.817 5.655 5.160 4.249 3.188 2.465 + 4.328 4.864 5.562 6.009 6.118 6.176 6.552 7.314 8.123 8.475 8.087 7.081 5.861 4.810 4.103 3.735 3.683 3.980 4.647 5.573 6.515 7.235 7.643 7.814 7.851 7.773 7.533 7.145 6.752 6.523 6.444 6.242 5.570 4.338 2.912 1.944 + 4.443 5.038 5.768 6.121 5.977 5.697 5.784 6.434 7.364 8.035 8.048 7.370 6.259 5.031 3.919 3.087 2.697 2.860 3.510 4.355 5.041 5.409 5.612 5.940 6.501 7.068 7.276 6.982 6.448 6.113 6.150 6.231 5.775 4.512 2.842 1.647 + 4.834 4.946 5.101 5.248 5.418 5.695 6.097 6.491 6.640 6.367 5.699 4.866 4.148 3.694 3.469 3.341 3.230 3.181 3.311 3.705 4.346 5.131 5.915 6.555 6.922 6.931 6.607 6.123 5.737 5.621 5.705 5.679 5.208 4.224 3.054 2.255 + 1.790 2.378 3.257 4.055 4.578 4.903 5.229 5.649 6.026 6.088 5.661 4.841 3.956 3.357 3.192 3.341 3.536 3.586 3.512 3.525 3.865 4.612 5.603 6.502 6.965 6.831 6.210 5.423 4.830 4.623 4.723 4.844 4.699 4.205 3.555 3.097 + 3.002 3.289 3.679 3.968 4.098 4.188 4.395 4.743 5.078 5.192 5.002 4.615 4.237 4.001 3.882 3.759 3.561 3.357 3.306 3.522 3.972 4.488 4.871 5.001 4.875 4.579 4.231 3.945 3.798 3.795 3.848 3.799 3.512 2.982 2.384 1.984 + 2.484 2.996 3.640 3.975 3.868 3.578 3.511 3.852 4.388 4.687 4.439 3.707 2.879 2.386 2.445 2.972 3.712 4.419 4.966 5.330 5.544 5.649 5.679 5.643 5.503 5.188 4.665 4.013 3.423 3.083 3.024 3.071 2.962 2.564 2.005 1.596 + 5.000 4.689 4.192 3.673 3.238 2.928 2.779 2.863 3.242 3.866 4.525 4.946 4.985 4.756 4.578 4.750 5.329 6.091 6.701 6.952 6.885 6.702 6.570 6.487 6.322 5.965 5.459 4.984 4.726 4.740 4.914 5.057 5.031 4.826 4.553 4.364 + 3.386 3.263 3.129 3.107 3.226 3.420 3.616 3.827 4.134 4.567 5.014 5.266 5.188 4.882 4.670 4.884 5.607 6.576 7.334 7.545 7.218 6.690 6.378 6.500 6.956 7.443 7.700 7.671 7.509 7.417 7.488 7.653 7.763 7.724 7.573 7.442 + 1.751 2.397 3.383 4.254 4.648 4.490 4.026 3.661 3.700 4.152 4.756 5.190 5.333 5.346 5.533 6.065 6.818 7.455 7.690 7.526 7.262 7.274 7.727 8.458 9.108 9.383 9.249 8.919 8.671 8.652 8.813 8.981 9.006 8.860 8.635 8.472 + 2.026 2.891 4.054 4.830 4.926 4.590 4.312 4.379 4.693 4.954 4.989 4.897 4.902 5.118 5.473 5.851 6.267 6.849 7.653 8.506 9.101 9.261 9.133 9.072 9.323 9.779 10.086 9.990 9.603 9.306 9.382 9.724 9.917 9.639 8.993 8.455 + 3.438 3.642 3.970 4.320 4.641 4.953 5.304 5.702 6.080 6.317 6.321 6.100 5.790 5.603 5.734 6.261 7.092 7.990 8.668 8.928 8.770 8.405 8.147 8.242 8.734 9.443 10.083 10.432 10.441 10.232 9.982 9.813 9.744 9.728 9.722 9.714 + 6.003 5.751 5.400 5.168 5.200 5.472 5.805 5.975 5.876 5.592 5.347 5.341 5.624 6.090 6.593 7.078 7.603 8.230 8.902 9.438 9.670 9.607 9.461 9.494 9.800 10.221 10.477 10.409 10.118 9.873 9.879 10.106 10.329 10.346 10.162 9.974 + 4.766 5.038 5.517 6.037 6.355 6.296 5.920 5.548 5.551 6.037 6.711 7.077 6.852 6.255 5.898 6.329 7.574 9.079 10.100 10.242 9.731 9.193 9.154 9.664 10.311 10.601 10.351 9.806 9.412 9.457 9.874 10.317 10.437 10.133 9.605 9.209 + 6.790 6.431 6.066 6.045 6.366 6.679 6.648 6.317 6.103 6.401 7.176 7.938 8.171 7.824 7.404 7.560 8.505 9.789 10.632 10.540 9.688 8.754 8.368 8.651 9.198 9.489 9.330 8.978 8.867 9.207 9.784 10.118 9.818 8.885 7.733 6.950 + 8.872 8.253 7.428 6.889 6.828 7.043 7.190 7.115 6.966 6.996 7.271 7.594 7.700 7.556 7.430 7.658 8.306 9.049 9.391 9.068 8.274 7.517 7.223 7.417 7.739 7.768 7.368 6.792 6.457 6.610 7.129 7.621 7.710 7.300 6.641 6.155 + 12.526 12.074 11.596 11.562 12.067 12.735 13.022 12.635 11.706 10.606 9.622 8.801 8.096 7.591 7.541 8.129 9.176 10.112 10.328 9.638 8.474 7.592 7.520 8.157 8.870 9.003 8.401 7.530 7.110 7.553 8.627 9.607 9.789 8.994 7.706 6.751 + 13.400 12.891 12.412 12.571 13.501 14.710 15.439 15.212 14.133 12.729 11.526 10.756 10.375 10.309 10.589 11.249 12.105 12.701 12.568 11.613 10.286 9.318 9.212 9.857 10.617 10.828 10.330 9.597 9.360 10.009 11.234 12.194 12.102 10.815 8.985 7.675 + 12.820 12.556 12.391 12.755 13.773 15.106 16.124 16.292 15.495 14.087 12.646 11.655 11.302 11.520 12.127 12.936 13.726 14.199 14.051 13.165 11.799 10.518 9.872 10.006 10.538 10.864 10.677 10.272 10.332 11.306 12.879 14.022 13.685 11.640 8.819 6.808 + 12.484 12.316 12.164 12.299 12.916 13.965 15.092 15.747 15.449 14.069 11.972 9.888 8.589 8.514 9.581 11.254 12.808 13.655 13.557 12.655 11.353 10.111 9.252 8.862 8.819 8.928 9.078 9.302 9.694 10.237 10.684 10.643 9.829 8.332 6.677 5.591 + 12.606 12.314 12.028 12.123 12.765 13.773 14.711 15.114 14.713 13.539 11.901 10.286 9.212 9.050 9.847 11.247 12.613 13.328 13.130 12.247 11.219 10.529 10.293 10.249 10.043 9.564 9.065 8.970 9.506 10.467 11.276 11.315 10.312 8.525 6.640 5.443 + 12.256 12.102 11.877 11.781 12.092 12.957 14.160 15.098 15.096 13.897 11.931 10.127 9.343 9.832 11.140 12.464 13.185 13.152 12.601 11.857 11.120 10.460 9.916 9.540 9.343 9.249 9.169 9.139 9.338 9.895 10.638 11.056 10.607 9.186 7.354 6.070 + 12.372 12.100 11.722 11.543 11.885 12.868 14.209 15.260 15.353 14.253 12.400 10.700 9.975 10.467 11.735 12.994 13.628 13.485 12.816 11.991 11.249 10.651 10.168 9.773 9.459 9.219 9.082 9.149 9.557 10.317 11.153 11.542 11.015 9.555 7.746 6.501 + 12.538 12.268 11.894 11.718 12.059 13.042 14.419 15.588 15.895 15.052 13.396 11.744 10.919 11.254 12.412 13.641 14.259 14.025 13.182 12.203 11.464 11.064 10.864 10.649 10.295 9.852 9.524 9.564 10.113 11.044 11.927 12.196 11.473 9.861 7.999 6.758 + 12.697 12.502 12.215 12.064 12.355 13.270 14.631 15.866 16.285 15.550 13.970 12.376 11.613 12.003 13.174 14.339 14.825 14.440 13.489 12.493 11.851 11.663 11.751 11.803 11.545 10.902 10.093 9.583 9.826 10.916 12.366 13.272 12.854 11.040 8.654 6.982 + 12.710 12.539 12.268 12.096 12.321 13.159 14.485 15.756 16.267 15.625 14.093 12.506 11.759 12.231 13.537 14.809 15.269 14.694 13.476 12.293 11.666 11.690 12.070 12.354 12.215 11.625 10.870 10.400 10.578 11.417 12.487 13.097 12.700 11.288 9.491 8.249 + 12.659 12.516 12.272 12.098 12.291 13.098 14.420 15.719 16.268 15.658 14.161 12.636 11.981 12.526 13.822 14.964 15.216 14.460 13.191 12.128 11.740 12.026 12.591 12.934 12.714 11.920 10.874 10.092 10.021 10.750 11.870 12.634 12.398 11.078 9.294 8.034 + 12.377 12.274 12.049 11.824 11.930 12.702 14.100 15.536 16.169 15.512 13.888 12.286 11.695 12.392 13.767 14.796 14.778 13.774 12.451 11.545 11.385 11.787 12.296 12.490 12.165 11.367 10.361 9.575 9.441 10.128 11.320 12.277 12.262 11.082 9.325 8.042 + 12.268 12.143 11.891 11.658 11.791 12.611 14.044 15.464 16.025 15.286 13.637 12.105 11.641 12.427 13.764 14.623 14.396 13.272 11.986 11.233 11.222 11.672 12.120 12.229 11.892 11.183 10.308 9.604 9.456 10.067 11.198 12.173 12.259 11.220 9.587 8.373 + 12.401 12.262 11.997 11.770 11.932 12.790 14.242 15.643 16.150 15.354 13.686 12.199 11.826 12.695 14.048 14.822 14.433 13.137 11.745 10.989 11.059 11.620 12.157 12.323 12.039 11.402 10.607 9.929 9.688 10.075 10.928 11.705 11.785 10.940 9.593 8.585 + 12.523 12.420 12.196 11.982 12.121 12.935 14.333 15.668 16.096 15.238 13.580 12.201 11.990 12.969 14.284 14.884 14.308 12.960 11.698 11.150 11.333 11.810 12.121 12.085 11.752 11.226 10.587 10.002 9.768 10.131 10.964 11.663 11.496 10.203 8.333 6.968 + 12.808 12.622 12.297 12.037 12.197 13.041 14.403 15.618 15.911 15.006 13.436 12.226 12.132 13.064 14.163 14.491 13.735 12.384 11.264 10.898 11.217 11.771 12.159 12.243 12.054 11.610 10.919 10.158 9.725 9.991 10.879 11.730 11.693 10.421 8.479 7.036 + 12.903 12.557 12.046 11.719 11.967 12.941 14.330 15.427 15.579 14.696 13.396 12.575 12.715 13.502 14.086 13.782 12.615 11.261 10.475 10.527 11.108 11.714 12.062 12.168 12.088 11.713 10.890 9.763 8.886 8.864 9.768 10.889 11.184 10.126 8.234 6.766 + 12.852 12.288 11.557 11.229 11.694 12.885 14.270 15.144 15.089 14.260 13.283 12.800 12.995 13.471 13.571 12.905 11.647 10.382 9.672 9.694 10.225 10.910 11.507 11.912 12.019 11.663 10.769 9.584 8.674 8.568 9.314 10.326 10.766 10.198 8.969 7.980 + 12.692 11.893 10.962 10.716 11.486 12.885 14.123 14.607 14.330 13.780 13.472 13.529 13.633 13.343 12.492 11.324 10.293 9.731 9.667 9.911 10.277 10.708 11.206 11.668 11.827 11.417 10.421 9.196 8.311 8.185 8.792 9.665 10.217 10.150 9.643 9.186 + 12.596 11.736 10.725 10.381 10.964 12.030 12.900 13.264 13.366 13.615 14.042 14.152 13.348 11.544 9.386 7.846 7.532 8.271 9.317 9.959 10.019 9.836 9.854 10.188 10.551 10.531 9.942 8.950 7.933 7.237 7.037 7.342 8.051 8.978 9.856 10.394 + 11.829 11.335 10.681 10.263 10.239 10.476 10.761 11.027 11.355 11.755 11.981 11.618 10.440 8.703 7.093 6.284 6.458 7.186 7.774 7.805 7.436 7.209 7.563 8.446 9.337 9.647 9.140 8.093 7.082 6.616 6.871 7.680 8.702 9.629 10.283 10.610 + 8.721 8.392 7.895 7.472 7.327 7.521 7.940 8.351 8.538 8.410 8.028 7.547 7.120 6.843 6.749 6.840 7.080 7.387 7.646 7.783 7.843 7.991 8.382 8.973 9.469 9.475 8.808 7.714 6.787 6.588 7.248 8.353 9.243 9.489 9.186 8.818 + 8.414 7.976 7.265 6.541 6.057 5.967 6.279 6.863 7.505 7.980 8.124 7.894 7.398 6.865 6.543 6.575 6.902 7.285 7.449 7.277 6.911 6.678 6.854 7.438 8.119 8.467 8.251 7.627 7.046 6.939 7.400 8.116 8.614 8.613 8.232 7.871 + 9.970 8.920 7.367 6.063 5.520 5.778 6.492 7.230 7.713 7.881 7.788 7.507 7.113 6.737 6.556 6.685 7.056 7.408 7.455 7.112 6.592 6.272 6.416 6.969 7.587 7.901 7.797 7.497 7.383 7.691 8.307 8.840 8.900 8.388 7.595 7.012 + 10.206 8.980 7.432 6.612 6.874 7.658 8.053 7.598 6.617 5.837 5.708 6.058 6.365 6.307 6.056 6.043 6.474 7.092 7.420 7.234 6.792 6.599 6.925 7.553 7.978 7.867 7.367 6.974 7.114 7.805 8.662 9.212 9.213 8.769 8.195 7.813 + 9.862 8.960 7.728 6.900 6.859 7.398 7.920 7.906 7.288 6.453 5.906 5.877 6.183 6.432 6.370 6.089 5.912 6.102 6.635 7.240 7.652 7.830 7.952 8.193 8.518 8.692 8.518 8.084 7.773 7.975 8.746 9.706 10.296 10.208 9.634 9.118 + 9.282 9.020 8.483 7.730 6.948 6.392 6.217 6.361 6.588 6.680 6.592 6.462 6.450 6.575 6.701 6.681 6.517 6.389 6.513 6.967 7.628 8.264 8.683 8.815 8.685 8.360 7.943 7.597 7.543 7.943 8.755 9.694 10.385 10.608 10.455 10.241 + 9.050 8.603 7.905 7.239 6.827 6.738 6.888 7.106 7.231 7.169 6.926 6.594 6.321 6.235 6.373 6.645 6.885 6.969 6.923 6.927 7.189 7.760 8.452 8.914 8.868 8.308 7.548 7.043 7.122 7.795 8.757 9.579 9.950 9.838 9.466 9.165 + 9.526 8.475 7.104 6.286 6.357 6.919 7.266 6.998 6.318 5.761 5.684 5.973 6.224 6.166 5.909 5.793 6.028 6.478 6.821 6.890 6.865 7.108 7.789 8.663 9.228 9.122 8.444 7.706 7.462 7.917 8.796 9.569 9.808 9.454 8.810 8.329 + 9.483 9.172 8.657 8.105 7.673 7.462 7.486 7.668 7.855 7.866 7.584 7.047 6.462 6.098 6.113 6.428 6.778 6.911 6.794 6.659 6.814 7.375 8.136 8.685 8.708 8.231 7.619 7.329 7.600 8.318 9.118 9.636 9.711 9.431 9.036 8.767 + 9.570 9.104 8.349 7.609 7.216 7.388 8.094 9.037 9.771 9.934 9.453 8.595 7.805 7.431 7.514 7.787 7.878 7.586 7.028 6.554 6.500 6.949 7.668 8.264 8.435 8.159 7.678 7.335 7.357 7.738 8.284 8.745 8.961 8.928 8.764 8.630 + 9.116 8.575 7.793 7.216 7.202 7.828 8.834 9.758 10.185 9.978 9.347 8.706 8.404 8.510 8.776 8.824 8.421 7.653 6.875 6.482 6.652 7.230 7.840 8.122 7.946 7.458 6.958 6.702 6.774 7.089 7.491 7.861 8.162 8.400 8.581 8.684 + 7.851 7.423 6.883 6.675 7.100 8.143 9.472 10.612 11.189 11.109 10.584 10.006 9.723 9.844 10.173 10.318 9.939 8.977 7.730 6.699 6.291 6.566 7.208 7.733 7.805 7.427 6.894 6.561 6.600 6.915 7.251 7.384 7.248 6.938 6.615 6.418 + 8.711 8.162 7.425 7.045 7.449 8.686 10.339 11.710 12.191 11.622 10.404 9.261 8.805 9.173 9.976 10.575 10.489 9.669 8.473 7.413 6.858 6.867 7.226 7.604 7.730 7.509 7.044 6.572 6.334 6.438 6.779 7.091 7.113 6.768 6.237 5.846 + 7.101 7.054 7.044 7.229 7.783 8.780 10.066 11.256 11.892 11.710 10.838 9.764 9.068 9.068 9.630 10.253 10.388 9.771 8.571 7.274 6.395 6.201 6.592 7.194 7.580 7.502 7.006 6.383 5.979 5.987 6.335 6.741 6.903 6.709 6.304 5.985 + 8.640 7.851 6.874 6.477 7.057 8.405 9.907 10.975 11.358 11.154 10.612 9.952 9.337 8.922 8.839 9.068 9.341 9.239 8.486 7.223 6.004 5.461 5.849 6.837 7.718 7.890 7.267 6.310 5.667 5.712 6.303 6.916 7.039 6.526 5.686 5.063 + 7.978 7.357 6.633 6.453 7.126 8.424 9.777 10.662 10.881 10.568 9.999 9.412 8.959 8.741 8.794 9.019 9.146 8.857 8.029 6.908 6.020 5.836 6.420 7.349 7.979 7.883 7.125 6.180 5.584 5.575 5.973 6.362 6.386 5.982 5.385 4.956 + 8.342 7.676 6.919 6.785 7.582 9.003 10.354 11.032 10.864 10.117 9.243 8.607 8.373 8.527 8.930 9.333 9.417 8.931 7.893 6.676 5.844 5.805 6.510 7.452 7.999 7.814 7.062 6.253 5.861 6.009 6.430 6.699 6.531 5.947 5.232 4.753 + 6.822 6.821 6.922 7.282 8.025 9.125 10.339 11.246 11.424 10.702 9.331 7.924 7.161 7.387 8.374 9.424 9.790 9.143 7.789 6.468 5.863 6.163 6.973 7.623 7.634 7.020 6.215 5.728 5.787 6.222 6.632 6.672 6.252 5.543 4.842 4.418 + 6.817 6.617 6.408 6.480 7.055 8.137 9.445 10.499 10.840 10.293 9.097 7.824 7.085 7.182 7.929 8.752 9.027 8.454 7.240 5.967 5.242 5.345 6.088 6.959 7.443 7.316 6.734 6.084 5.721 5.758 6.028 6.226 6.112 5.668 5.100 4.709 + 4.882 5.192 5.652 6.112 6.605 7.303 8.284 9.311 9.879 9.559 8.381 6.949 6.108 6.382 7.577 8.874 9.358 8.633 7.067 5.521 4.766 5.011 5.850 6.624 6.882 6.619 6.165 5.866 5.834 5.931 5.950 5.800 5.556 5.352 5.258 5.240 + 6.038 5.910 5.674 5.433 5.409 5.835 6.764 7.937 8.860 9.102 8.592 7.706 7.036 6.987 7.491 8.051 8.093 7.372 6.149 5.021 4.529 4.826 5.612 6.355 6.626 6.335 5.722 5.161 4.922 5.041 5.348 5.601 5.642 5.463 5.192 4.998 + 6.520 5.978 5.335 5.156 5.731 6.890 8.147 8.999 9.188 8.765 8.008 7.292 6.960 7.186 7.852 8.525 8.647 7.888 6.437 4.969 4.240 4.568 5.599 6.556 6.797 6.247 5.383 4.812 4.810 5.187 5.538 5.600 5.418 5.205 5.104 5.095 + 7.327 6.849 6.208 5.862 6.139 7.041 8.216 9.145 9.427 9.012 8.229 7.585 7.450 7.830 8.365 8.569 8.141 7.162 6.036 5.237 5.025 5.312 5.761 6.026 5.952 5.636 5.310 5.163 5.229 5.403 5.541 5.567 5.494 5.392 5.313 5.277 + 6.619 5.904 5.007 4.629 5.168 6.446 7.824 8.622 8.552 7.860 7.120 6.826 7.081 7.600 7.959 7.905 7.472 6.884 6.352 5.954 5.680 5.529 5.537 5.702 5.895 5.899 5.577 5.037 4.618 4.648 5.168 5.854 6.235 6.059 5.496 5.018 + 5.987 6.179 6.396 6.498 6.544 6.733 7.157 7.636 7.829 7.558 7.027 6.696 6.890 7.502 8.052 8.081 7.511 6.672 5.988 5.644 5.528 5.453 5.386 5.444 5.668 5.872 5.768 5.275 4.694 4.507 4.945 5.721 6.225 6.037 5.315 4.678 + 6.564 6.573 6.601 6.710 7.001 7.517 8.127 8.523 8.413 7.774 6.948 6.440 6.558 7.159 7.741 7.808 7.233 6.329 5.588 5.332 5.528 5.897 6.161 6.204 6.063 5.816 5.521 5.250 5.118 5.235 5.574 5.918 5.978 5.623 5.026 4.570 + 6.768 6.763 6.883 7.258 7.867 8.499 8.852 8.721 8.127 7.306 6.587 6.229 6.312 6.725 7.219 7.509 7.396 6.860 6.107 5.488 5.331 5.735 6.485 7.151 7.339 6.952 6.270 5.783 5.880 6.584 7.516 8.117 7.993 7.163 6.063 5.300 + 6.182 6.253 6.602 7.368 8.349 9.029 8.928 7.975 6.591 5.400 4.822 4.871 5.280 5.780 6.255 6.670 6.930 6.872 6.458 5.955 5.873 6.612 8.085 9.660 10.533 10.287 9.213 8.137 7.846 8.549 9.729 10.498 10.190 8.806 7.021 5.792 + 5.889 5.537 5.547 6.616 8.636 10.606 11.345 10.403 8.392 6.484 5.530 5.564 6.015 6.324 6.372 6.370 6.462 6.500 6.261 5.834 5.723 6.477 8.144 10.064 11.261 11.155 10.012 8.761 8.313 8.922 10.034 10.721 10.327 8.894 7.112 5.905 + 6.911 6.582 6.667 7.833 9.843 11.534 11.701 10.108 7.731 5.999 5.703 6.495 7.346 7.475 6.912 6.260 6.008 6.108 6.172 6.042 6.075 6.831 8.450 10.342 11.538 11.433 10.294 9.080 8.726 9.460 10.677 11.406 10.996 9.522 7.708 6.488 + 7.064 7.137 7.624 8.798 10.433 11.784 12.062 11.016 9.155 7.408 6.501 6.525 7.006 7.353 7.285 6.921 6.552 6.363 6.367 6.561 7.060 8.031 9.449 10.935 11.886 11.871 10.992 9.889 9.337 9.700 10.633 11.296 10.935 9.438 7.474 6.103 + 8.336 8.012 7.997 8.901 10.607 12.190 12.574 11.368 9.188 7.188 6.227 6.354 6.966 7.400 7.422 7.223 7.075 7.043 7.047 7.122 7.547 8.617 10.269 11.939 12.860 12.622 11.527 10.421 10.104 10.754 11.797 12.301 11.618 9.820 7.686 6.259 + 7.355 7.148 7.314 8.401 10.274 12.038 12.648 11.686 9.678 7.679 6.520 6.327 6.641 6.932 7.002 6.987 7.051 7.182 7.274 7.380 7.787 8.783 10.288 11.750 12.459 12.086 10.991 10.020 9.922 10.803 12.040 12.694 12.136 10.454 8.422 7.057 + 7.224 7.554 8.359 9.688 11.246 12.429 12.656 11.761 10.121 8.427 7.252 6.768 6.764 6.909 6.994 6.991 6.951 6.905 6.887 7.027 7.546 8.595 10.033 11.374 12.023 11.685 10.641 9.641 9.439 10.261 11.601 12.509 12.213 10.654 8.588 7.145 diff --git a/test/regression/chan3.2chan.wav b/test/regression/chan3.2chan.wav new file mode 100644 index 0000000..fcc8b69 Binary files /dev/null and b/test/regression/chan3.2chan.wav differ diff --git a/test/regression/chan3.cepview b/test/regression/chan3.cepview new file mode 100644 index 0000000..2f2d8b2 --- /dev/null +++ b/test/regression/chan3.cepview @@ -0,0 +1,2178 @@ + 6.472 -1.575 0.213 0.164 -0.131 0.156 0.063 0.061 -0.166 -0.093 -0.089 -0.043 0.029 + 6.523 -1.616 0.270 0.095 -0.232 0.101 -0.184 -0.055 -0.242 -0.200 -0.063 -0.000 -0.116 + 6.689 -1.370 0.276 0.002 -0.338 -0.004 -0.214 0.057 -0.195 -0.101 -0.098 -0.035 -0.192 + 6.772 -1.395 0.086 0.099 -0.389 0.172 -0.169 -0.191 -0.144 -0.006 -0.138 -0.059 0.012 + 6.514 -1.346 0.047 0.165 -0.311 -0.040 -0.125 -0.113 -0.092 0.103 -0.214 -0.066 0.054 + 6.645 -1.439 0.056 0.244 -0.226 -0.194 -0.082 -0.106 -0.206 0.071 -0.251 -0.200 -0.028 + 6.387 -1.356 0.012 0.138 -0.193 -0.161 0.076 0.000 -0.291 0.022 -0.264 -0.010 -0.034 + 6.046 -1.273 0.068 0.283 0.082 -0.118 -0.124 -0.173 -0.171 -0.012 -0.173 -0.162 -0.097 + 6.124 -1.127 0.003 0.211 -0.058 -0.114 -0.331 -0.111 -0.123 0.089 -0.094 -0.158 -0.073 + 5.946 -1.121 -0.256 0.079 0.170 -0.138 -0.258 -0.119 -0.069 0.145 -0.082 -0.036 0.014 + 5.680 -1.063 -0.168 -0.075 0.012 -0.091 -0.110 -0.219 -0.281 -0.086 -0.143 -0.123 -0.038 + 5.562 -0.793 0.043 0.018 -0.013 -0.203 -0.161 0.012 -0.002 0.099 0.012 -0.078 -0.031 + 5.726 -0.382 0.607 0.323 0.015 0.058 0.108 -0.150 -0.100 -0.073 -0.068 -0.020 -0.144 + 5.002 -0.083 0.390 0.161 -0.086 0.045 0.044 0.015 0.015 0.029 -0.003 -0.119 -0.215 + 4.924 -0.224 0.320 -0.017 -0.110 0.060 -0.041 -0.046 0.059 0.118 -0.081 -0.025 -0.197 + 4.471 -0.399 0.147 -0.031 -0.123 -0.037 0.007 -0.158 -0.165 -0.022 -0.164 0.028 0.059 + 4.258 0.023 0.026 0.054 0.107 -0.015 -0.017 -0.101 -0.153 0.219 -0.040 -0.134 -0.110 + 3.754 0.077 0.065 0.202 0.002 -0.174 -0.334 -0.107 -0.146 0.105 -0.045 -0.156 -0.053 + 3.356 0.169 -0.253 -0.008 -0.050 -0.030 -0.236 -0.119 -0.098 0.149 0.099 -0.023 0.035 + 3.292 0.105 -0.260 0.029 -0.095 0.021 -0.259 -0.252 -0.222 -0.101 0.080 0.040 0.037 + 3.738 0.283 -0.064 -0.009 -0.289 0.014 -0.156 -0.182 -0.146 -0.015 -0.089 -0.122 -0.115 + 3.919 0.280 0.103 -0.010 -0.044 -0.027 0.006 -0.130 -0.079 -0.137 -0.144 -0.189 -0.256 + 3.689 0.359 0.161 0.248 -0.056 0.003 -0.296 -0.301 -0.173 -0.040 -0.088 -0.227 0.021 + 3.851 0.261 0.304 0.134 0.010 -0.108 -0.166 -0.416 -0.211 -0.031 0.051 -0.003 0.073 + 6.780 -0.459 0.712 0.008 -0.552 0.154 -0.062 -0.291 -0.025 -0.066 -0.138 0.023 -0.162 + 9.415 -0.219 0.607 0.300 -0.432 -0.151 -0.260 -0.207 -0.061 -0.301 -0.196 0.074 -0.285 + 10.578 0.201 0.329 0.572 -0.236 -0.480 -0.532 -0.002 -0.256 -0.318 -0.225 -0.048 -0.306 + 12.180 -0.191 0.302 0.567 -0.309 -0.556 -0.614 -0.056 -0.362 -0.315 -0.271 0.042 -0.256 + 13.369 -0.265 0.158 0.461 -0.378 -0.571 -0.597 0.003 -0.469 -0.268 -0.342 0.133 -0.288 + 13.751 0.016 -0.073 0.453 -0.387 -0.609 -0.711 0.037 -0.530 -0.191 -0.385 0.157 -0.249 + 14.173 0.092 -0.207 0.450 -0.436 -0.700 -0.730 0.009 -0.565 -0.070 -0.394 0.210 -0.213 + 14.364 0.115 -0.292 0.421 -0.432 -0.819 -0.712 0.045 -0.584 0.018 -0.387 0.235 -0.179 + 13.981 0.488 -0.567 0.447 -0.426 -0.780 -0.780 0.166 -0.605 0.025 -0.275 0.065 -0.039 + 13.954 0.714 -0.790 0.374 -0.348 -0.772 -0.795 0.075 -0.448 0.017 -0.217 -0.032 0.017 + 14.155 0.742 -0.761 0.195 -0.357 -0.554 -0.971 0.042 -0.496 0.179 -0.246 -0.111 -0.006 + 13.919 0.844 -0.590 -0.083 -0.340 -0.367 -0.827 -0.150 -0.673 0.299 -0.157 -0.268 -0.066 + 13.253 1.122 -0.445 -0.220 -0.492 -0.209 -0.518 -0.266 -0.966 0.212 -0.057 -0.198 -0.137 + 12.590 1.256 -0.278 -0.309 -0.473 -0.296 -0.292 -0.244 -1.016 0.060 -0.052 -0.138 -0.061 + 12.257 1.408 -0.397 -0.268 -0.477 -0.212 -0.335 -0.137 -1.121 0.086 -0.129 -0.055 -0.170 + 12.486 1.238 -0.335 -0.236 -0.387 -0.232 -0.377 -0.184 -1.111 0.156 -0.140 -0.099 -0.267 + 12.851 1.003 -0.348 -0.210 -0.192 -0.238 -0.457 -0.270 -0.985 0.217 -0.125 -0.221 -0.279 + 13.122 0.870 -0.512 -0.031 -0.016 -0.363 -0.649 -0.236 -0.788 0.216 -0.216 -0.326 -0.186 + 13.416 0.512 -0.512 0.221 0.160 -0.646 -0.729 -0.080 -0.644 0.117 -0.368 -0.199 -0.098 + 13.669 0.215 -0.481 0.508 0.027 -0.849 -0.679 0.112 -0.701 -0.006 -0.315 -0.091 -0.085 + 14.023 -0.128 -0.311 0.636 -0.188 -0.945 -0.533 0.142 -0.768 -0.000 -0.275 -0.043 -0.107 + 13.859 -0.172 -0.235 0.699 -0.380 -0.895 -0.479 0.083 -0.726 0.000 -0.280 0.032 -0.110 + 13.834 -0.192 -0.080 0.585 -0.502 -0.866 -0.421 -0.047 -0.556 -0.066 -0.266 0.089 -0.148 + 13.802 0.010 -0.197 0.466 -0.542 -0.817 -0.461 -0.033 -0.458 -0.114 -0.217 0.126 -0.135 + 13.638 0.166 -0.325 0.338 -0.616 -0.688 -0.598 0.094 -0.418 -0.110 -0.198 0.187 -0.232 + 13.562 0.201 -0.393 0.190 -0.605 -0.637 -0.648 0.159 -0.380 -0.046 -0.278 0.239 -0.245 + 13.549 0.324 -0.548 0.148 -0.601 -0.533 -0.715 0.105 -0.250 -0.101 -0.230 0.143 -0.167 + 13.358 0.536 -0.689 0.061 -0.526 -0.501 -0.777 0.040 -0.205 -0.051 -0.284 0.138 -0.127 + 13.148 0.543 -0.556 -0.173 -0.309 -0.554 -0.776 -0.085 -0.177 0.038 -0.368 0.110 -0.055 + 12.791 0.398 -0.317 -0.383 -0.165 -0.575 -0.547 -0.476 -0.049 0.129 -0.458 0.037 0.029 + 12.749 0.083 -0.087 -0.369 -0.421 -0.109 -0.598 -0.629 -0.041 0.151 -0.310 -0.039 -0.105 + 12.917 0.379 0.033 -0.432 -0.682 0.292 -0.856 -0.488 -0.169 0.139 -0.280 0.142 -0.371 + 13.190 0.534 0.040 -0.565 -0.862 0.327 -0.811 -0.354 -0.414 0.291 -0.296 0.296 -0.418 + 13.189 0.493 0.217 -0.744 -0.940 0.241 -0.738 -0.193 -0.554 0.241 -0.286 0.469 -0.442 + 12.779 0.695 0.295 -0.858 -0.975 0.125 -0.623 -0.026 -0.656 0.043 -0.252 0.494 -0.395 + 12.528 0.664 0.473 -0.873 -1.006 0.055 -0.570 0.077 -0.694 0.015 -0.361 0.405 -0.260 + 12.122 0.854 0.386 -0.668 -1.151 -0.031 -0.380 -0.069 -0.512 -0.036 -0.485 0.419 -0.306 + 11.403 0.943 0.484 -0.517 -1.178 -0.110 -0.367 -0.073 -0.360 -0.063 -0.671 0.365 -0.282 + 10.916 0.877 0.612 -0.432 -1.132 -0.124 -0.387 -0.017 -0.332 -0.075 -0.769 0.295 -0.300 + 10.773 0.846 0.663 -0.402 -1.066 -0.193 -0.371 -0.010 -0.327 -0.143 -0.770 0.220 -0.373 + 10.732 0.749 0.723 -0.341 -1.016 -0.227 -0.399 -0.029 -0.321 -0.115 -0.718 0.174 -0.471 + 10.872 0.612 0.705 -0.364 -1.034 -0.227 -0.446 -0.092 -0.237 -0.048 -0.631 0.048 -0.480 + 11.283 0.587 0.496 -0.321 -1.069 -0.279 -0.462 -0.093 -0.158 -0.055 -0.652 0.064 -0.347 + 12.395 0.282 0.386 -0.563 -1.149 -0.211 -0.398 -0.030 -0.318 0.042 -0.496 0.055 -0.131 + 13.272 0.160 0.081 -0.799 -1.168 -0.149 -0.385 0.068 -0.319 -0.078 -0.370 0.227 -0.064 + 13.305 0.093 -0.007 -0.884 -1.211 -0.006 -0.452 0.061 -0.284 0.002 -0.314 0.272 -0.082 + 13.355 0.047 -0.061 -0.941 -1.228 0.084 -0.490 0.166 -0.274 0.048 -0.245 0.234 -0.159 + 13.396 0.069 -0.130 -1.003 -1.190 0.160 -0.543 0.262 -0.321 0.105 -0.202 0.222 -0.250 + 13.444 0.152 -0.237 -1.066 -1.135 0.199 -0.459 0.222 -0.324 0.124 -0.166 0.179 -0.289 + 13.488 0.079 -0.239 -1.099 -1.060 0.245 -0.408 0.167 -0.287 0.118 -0.068 0.064 -0.335 + 13.099 0.368 -0.396 -1.032 -0.994 0.252 -0.390 0.066 -0.238 0.077 0.044 0.012 -0.346 + 12.729 0.568 -0.537 -0.917 -0.871 0.218 -0.359 0.003 -0.215 0.052 0.117 -0.050 -0.340 + 12.065 0.587 -0.459 -0.774 -0.791 0.170 -0.392 -0.009 -0.233 0.060 0.131 0.031 -0.396 + 11.842 0.407 -0.469 -0.555 -0.672 0.174 -0.316 -0.244 -0.110 0.078 0.024 0.119 -0.508 + 11.775 0.363 -0.557 -0.285 -0.663 0.137 -0.404 -0.327 -0.065 0.234 -0.114 0.102 -0.530 + 11.652 0.298 -0.764 0.169 -0.513 -0.223 -0.504 -0.177 0.033 0.177 -0.250 0.151 -0.446 + 11.027 0.305 -0.784 0.469 -0.380 -0.384 -0.604 0.019 0.074 0.038 -0.337 0.295 -0.507 + 10.388 0.199 -0.367 0.594 -0.440 -0.477 -0.535 0.143 0.168 -0.244 -0.280 0.347 -0.542 + 9.855 0.138 0.033 0.173 -0.115 -0.499 -0.399 0.184 0.055 -0.324 -0.112 -0.063 -0.384 + 9.039 0.382 0.301 -0.003 -0.016 -0.397 -0.394 0.299 -0.334 -0.251 0.100 -0.327 -0.278 + 8.129 0.677 0.259 -0.020 0.042 -0.269 -0.462 0.344 -0.409 -0.088 -0.121 -0.323 -0.250 + 7.044 0.752 0.604 -0.027 -0.092 -0.301 -0.335 0.110 -0.172 -0.136 -0.345 -0.131 -0.162 + 6.880 0.542 0.696 -0.372 0.072 -0.399 0.049 -0.149 0.025 -0.107 -0.407 -0.164 -0.086 + 8.257 -0.259 0.479 -0.437 0.069 -0.211 0.103 -0.075 0.008 -0.261 -0.204 -0.037 -0.173 + 9.530 -0.399 0.064 -0.259 -0.192 -0.128 -0.103 -0.031 -0.039 -0.155 -0.252 0.097 -0.178 + 9.697 -0.407 0.176 -0.152 -0.064 -0.369 -0.289 -0.216 0.105 -0.164 -0.357 0.042 -0.098 + 10.737 -0.079 0.169 -0.212 -0.173 -0.375 -0.458 -0.343 -0.025 -0.031 -0.432 0.038 -0.095 + 11.354 -0.032 0.034 -0.264 -0.017 -0.375 -0.651 -0.475 -0.078 -0.061 -0.467 -0.016 -0.012 + 11.119 0.149 0.098 -0.415 -0.147 -0.228 -0.580 -0.503 -0.083 -0.027 -0.416 -0.087 -0.047 + 10.765 -0.097 0.340 -0.382 -0.122 -0.218 -0.571 -0.527 -0.008 -0.147 -0.271 -0.211 0.009 + 10.620 -0.875 0.442 -0.494 -0.005 -0.075 -0.164 -0.116 0.051 -0.079 -0.300 -0.177 0.010 + 10.449 -1.088 0.511 -0.545 -0.050 -0.211 -0.070 -0.108 0.001 -0.034 -0.338 -0.227 -0.115 + 10.686 -1.132 0.498 -0.536 0.207 -0.041 0.016 -0.082 -0.043 -0.046 -0.294 -0.050 -0.211 + 10.825 -1.058 0.429 -0.612 0.338 -0.224 -0.297 -0.164 -0.065 -0.218 -0.202 -0.040 -0.114 + 11.215 -1.050 0.402 -0.657 0.231 -0.309 -0.171 -0.060 -0.096 -0.192 -0.209 -0.100 -0.098 + 11.643 -0.874 0.481 -0.438 0.234 -0.335 -0.038 -0.099 -0.017 -0.260 -0.221 0.070 -0.054 + 11.354 -1.394 0.316 -0.499 0.128 -0.316 -0.038 -0.102 -0.130 -0.382 -0.238 -0.025 -0.066 + 11.594 -1.505 0.277 -0.329 0.133 -0.258 -0.103 -0.134 -0.174 -0.101 -0.171 -0.014 0.010 + 11.021 -1.342 -0.011 -0.131 0.083 -0.675 0.008 -0.011 -0.202 -0.275 0.046 -0.004 -0.015 + 7.126 -0.422 -0.235 -0.075 0.447 -0.614 -0.050 0.077 -0.127 -0.322 0.081 0.064 -0.161 + 4.674 0.103 -0.048 -0.659 0.189 -0.236 0.056 -0.079 -0.114 -0.008 -0.013 -0.057 -0.125 + 4.756 0.199 0.013 -0.768 -0.009 -0.495 -0.086 -0.228 -0.202 -0.178 -0.083 0.048 0.071 + 8.862 0.027 -0.222 -0.087 -0.734 -0.512 -0.187 -0.189 -0.074 0.031 -0.184 -0.104 -0.028 + 11.560 -0.764 -0.385 -0.013 -0.785 -0.533 -0.023 -0.250 -0.208 -0.021 -0.183 0.011 -0.030 + 12.263 -0.484 -0.157 0.472 -0.416 -0.731 -0.299 -0.230 -0.248 -0.202 -0.085 0.004 -0.164 + 13.613 -0.086 -0.574 0.358 -0.481 -0.715 -0.650 -0.094 -0.197 -0.087 -0.237 0.247 -0.317 + 14.008 -0.107 -0.674 0.101 -0.523 -0.681 -0.728 0.008 -0.163 0.107 -0.317 0.274 -0.308 + 14.086 -0.073 -0.729 -0.109 -0.606 -0.645 -0.698 0.072 -0.044 0.198 -0.271 0.045 -0.221 + 14.227 -0.163 -0.701 -0.202 -0.567 -0.515 -0.759 0.126 -0.051 0.249 -0.313 -0.036 -0.239 + 14.402 -0.052 -0.764 -0.242 -0.599 -0.406 -0.762 0.205 -0.127 0.267 -0.345 -0.161 -0.222 + 14.351 -0.115 -0.712 -0.208 -0.662 -0.301 -0.864 0.187 -0.185 0.331 -0.405 -0.038 -0.302 + 14.139 -0.021 -0.707 -0.213 -0.664 -0.330 -0.906 0.182 -0.124 0.299 -0.425 0.023 -0.291 + 13.600 0.055 -0.635 -0.284 -0.611 -0.454 -0.954 0.142 -0.017 0.272 -0.391 0.096 -0.227 + 11.972 0.527 -0.409 -0.216 -0.381 -0.661 -0.786 -0.033 0.150 -0.035 -0.196 0.202 -0.125 + 10.061 -0.477 0.126 0.122 -0.450 -0.413 -0.304 0.063 0.149 -0.122 -0.357 0.038 0.052 + 10.824 -1.212 0.572 0.811 -0.355 -0.053 -0.273 -0.206 0.124 -0.114 -0.238 -0.007 -0.070 + 11.417 -1.457 0.703 0.878 -0.354 0.030 0.063 -0.180 -0.007 -0.087 -0.394 -0.063 -0.146 + 11.840 -1.776 0.767 0.720 -0.425 0.016 0.053 -0.143 -0.097 -0.035 -0.269 -0.103 -0.178 + 11.839 -2.278 0.306 0.475 -0.595 -0.141 0.070 -0.056 0.089 0.055 -0.295 -0.125 -0.177 + 11.988 -2.469 0.285 0.764 -0.488 -0.204 -0.157 -0.013 0.073 -0.077 -0.180 -0.035 -0.098 + 11.816 -2.356 0.161 0.506 -0.620 -0.199 -0.088 0.070 0.149 0.039 -0.040 -0.149 -0.026 + 12.318 -1.801 0.355 0.841 -0.181 -0.074 -0.039 -0.134 -0.020 -0.052 -0.226 -0.172 0.049 + 11.674 -1.127 0.318 0.730 -0.141 -0.367 0.013 0.004 0.023 -0.022 -0.302 -0.113 0.064 + 10.561 -0.632 0.157 0.566 0.050 -0.151 -0.114 0.019 0.047 -0.148 -0.206 -0.031 -0.019 + 11.259 0.555 -0.479 0.173 -0.371 -0.326 -0.300 -0.050 0.042 0.082 -0.171 -0.056 -0.035 + 11.445 0.890 -0.473 0.061 -0.321 -0.318 -0.456 -0.113 0.024 0.095 -0.442 0.178 -0.290 + 11.437 0.634 -0.432 0.094 -0.424 -0.249 -0.465 -0.230 0.091 0.196 -0.403 0.132 -0.231 + 10.804 0.537 -0.334 0.235 -0.365 -0.265 -0.317 -0.432 0.089 0.257 -0.401 0.038 -0.266 + 10.273 -0.029 0.254 0.389 -0.313 -0.329 -0.165 -0.321 -0.080 0.220 -0.463 0.019 -0.191 + 10.497 -0.217 0.285 0.333 -0.172 -0.384 -0.164 -0.225 -0.170 0.329 -0.530 0.061 -0.327 + 10.645 -0.078 -0.352 0.089 0.049 -0.078 -0.563 -0.276 -0.150 0.366 -0.261 0.076 -0.200 + 11.650 0.099 -0.436 -0.036 -0.120 -0.269 -0.647 -0.142 -0.119 0.301 -0.223 -0.023 -0.245 + 11.759 0.084 -0.521 -0.040 -0.270 -0.273 -0.741 -0.107 -0.071 0.430 -0.286 0.049 -0.348 + 12.238 0.166 -0.662 -0.092 -0.515 -0.286 -0.712 -0.138 0.032 0.393 -0.230 0.029 -0.292 + 12.283 0.352 -0.627 -0.186 -0.407 -0.405 -0.480 -0.332 -0.109 0.357 -0.287 0.043 -0.239 + 10.766 0.547 -0.317 -0.342 -0.249 -0.296 -0.347 -0.542 -0.277 0.260 -0.131 -0.179 -0.284 + 9.513 0.596 -0.240 -0.100 -0.210 -0.239 -0.297 -0.568 -0.455 0.235 -0.009 -0.187 -0.281 + 5.825 0.196 0.221 0.110 -0.106 -0.003 -0.163 -0.151 -0.107 0.254 -0.049 -0.239 -0.268 + 5.505 0.196 0.189 0.177 -0.272 0.079 -0.129 -0.218 0.063 0.206 0.001 -0.244 -0.270 + 5.324 0.311 0.468 0.280 -0.339 -0.218 -0.326 -0.336 -0.007 0.123 -0.079 -0.154 -0.111 + 5.420 -0.001 0.580 0.269 -0.302 -0.296 -0.253 -0.202 -0.076 0.242 -0.195 -0.125 -0.139 + 8.194 -0.580 0.499 -0.068 -0.249 -0.316 -0.323 -0.097 -0.197 -0.023 -0.356 -0.117 -0.213 + 8.852 -0.470 -0.007 0.013 -0.174 -0.212 -0.144 -0.084 0.065 0.188 -0.070 -0.173 -0.063 + 11.472 -0.423 -0.607 0.012 -0.411 -0.348 -0.420 -0.148 -0.021 0.152 -0.160 -0.132 -0.026 + 12.762 -0.073 -0.719 -0.157 -0.593 -0.618 -0.574 -0.110 0.007 0.318 -0.207 -0.095 -0.007 + 13.091 0.011 -0.876 -0.030 -0.625 -0.604 -0.496 -0.097 0.083 0.219 -0.295 -0.081 -0.003 + 13.442 -0.135 -0.928 0.000 -0.678 -0.534 -0.528 -0.043 0.081 0.210 -0.340 -0.043 -0.093 + 13.264 -0.125 -0.955 -0.052 -0.747 -0.421 -0.643 0.121 -0.058 0.342 -0.484 0.049 -0.126 + 13.499 -0.254 -0.941 -0.148 -0.748 -0.406 -0.687 0.216 -0.100 0.443 -0.624 0.009 -0.182 + 13.649 -0.076 -1.001 -0.177 -0.642 -0.418 -0.587 0.191 -0.137 0.430 -0.592 -0.111 -0.140 + 13.632 -0.017 -1.056 -0.295 -0.604 -0.344 -0.526 0.201 -0.242 0.425 -0.559 -0.182 -0.116 + 13.201 0.011 -1.166 -0.468 -0.606 -0.342 -0.468 0.221 -0.214 0.467 -0.632 -0.225 -0.112 + 13.215 -0.050 -1.082 -0.461 -0.678 -0.274 -0.523 0.250 -0.241 0.567 -0.603 -0.237 -0.130 + 13.500 0.004 -1.058 -0.445 -0.709 -0.171 -0.542 0.230 -0.284 0.545 -0.560 -0.290 -0.120 + 13.495 -0.112 -0.976 -0.553 -0.682 -0.183 -0.474 0.229 -0.323 0.492 -0.485 -0.331 -0.109 + 12.973 -0.031 -0.900 -0.643 -0.793 -0.116 -0.517 0.246 -0.337 0.624 -0.486 -0.405 -0.120 + 13.377 -0.030 -0.777 -0.639 -0.798 -0.078 -0.525 0.174 -0.399 0.611 -0.435 -0.361 -0.130 + 13.395 0.059 -0.631 -0.738 -0.726 -0.077 -0.576 0.089 -0.460 0.563 -0.316 -0.297 -0.193 + 12.558 0.213 -0.324 -0.972 -0.696 -0.054 -0.616 -0.030 -0.343 0.515 -0.233 -0.316 -0.197 + 12.310 0.234 -0.284 -1.020 -0.733 -0.113 -0.576 -0.094 -0.346 0.557 -0.206 -0.226 -0.213 + 11.932 0.687 -0.394 -0.916 -0.726 -0.208 -0.483 -0.372 -0.338 0.548 -0.266 -0.004 -0.186 + 11.892 0.344 -0.152 -0.811 -0.572 -0.198 -0.486 -0.524 -0.420 0.511 -0.387 0.147 -0.209 + 10.343 0.273 -0.010 -0.847 -0.475 -0.287 -0.463 -0.706 -0.398 0.677 -0.303 0.251 -0.126 + 10.542 0.371 0.064 -0.638 -0.275 -0.253 -0.363 -0.761 -0.479 0.306 -0.372 0.135 -0.218 + 6.899 0.580 0.101 -0.509 -0.375 -0.221 -0.406 -0.684 -0.357 0.533 -0.511 0.177 -0.258 + 5.616 0.688 -0.092 -0.167 -0.379 -0.241 -0.283 -0.031 0.115 0.379 -0.109 -0.088 -0.140 + 5.622 0.755 -0.046 -0.072 -0.412 -0.194 -0.367 -0.007 0.011 0.425 -0.092 -0.075 -0.025 + 5.199 0.547 -0.336 -0.359 -0.563 -0.291 -0.351 -0.066 0.001 0.477 -0.014 -0.088 -0.097 + 4.990 0.471 -0.363 -0.272 -0.461 -0.203 -0.406 0.066 0.002 0.227 -0.022 -0.244 -0.168 + 4.901 0.361 -0.266 -0.207 -0.566 -0.180 -0.141 0.080 0.062 0.408 0.078 -0.052 -0.081 + 6.729 -0.083 -0.537 0.106 -0.591 -0.485 -0.030 0.005 -0.094 -0.071 -0.183 0.108 -0.042 + 6.292 0.009 -0.546 -0.075 -0.658 -0.374 -0.005 -0.150 -0.136 -0.075 -0.200 0.087 -0.064 + 4.935 0.236 -0.349 -0.064 -0.551 -0.231 -0.188 -0.110 -0.100 0.231 0.084 0.160 -0.101 + 4.924 0.206 -0.614 -0.015 -0.311 -0.197 -0.157 -0.116 0.059 0.324 0.023 0.041 0.014 + 5.197 0.237 -0.479 -0.158 -0.356 -0.199 -0.175 -0.242 -0.032 0.132 0.139 0.233 -0.105 + 5.083 -0.020 -0.564 -0.204 -0.334 -0.133 -0.069 -0.157 -0.191 0.139 0.145 0.048 0.024 + 5.235 0.164 -0.604 -0.172 -0.210 -0.093 -0.169 -0.020 -0.077 0.095 0.054 0.127 -0.066 + 5.295 0.112 -0.480 0.131 -0.123 -0.156 -0.319 -0.183 -0.137 0.241 0.169 0.117 -0.051 + 5.342 0.061 -0.532 -0.070 -0.228 -0.173 -0.268 -0.239 -0.201 0.194 0.070 0.051 -0.060 + 5.553 0.107 -0.557 -0.033 -0.343 -0.151 -0.148 -0.187 -0.195 -0.081 -0.117 0.146 0.017 + 5.729 0.161 -0.483 -0.005 -0.161 0.060 -0.311 -0.262 -0.130 0.060 -0.048 0.091 -0.241 + 5.858 0.297 -0.428 -0.025 -0.204 -0.172 -0.220 -0.132 -0.186 0.087 0.044 0.066 -0.143 + 5.884 0.214 -0.366 0.098 -0.173 -0.201 -0.271 -0.250 -0.107 0.103 0.017 -0.131 -0.080 + 6.230 0.360 -0.151 0.080 -0.250 -0.096 -0.089 -0.148 -0.133 -0.043 -0.019 0.102 0.022 + 6.257 0.478 -0.215 -0.182 -0.253 0.093 -0.171 -0.241 -0.226 -0.094 0.075 0.068 -0.178 + 6.970 0.241 -0.126 -0.290 -0.194 -0.251 -0.036 -0.352 -0.095 -0.115 -0.249 -0.185 -0.016 + 8.528 0.364 0.134 -0.303 -0.111 -0.409 0.040 -0.370 -0.020 -0.128 -0.542 -0.369 0.007 + 7.639 0.089 0.006 0.019 -0.131 -0.279 -0.046 0.065 -0.191 -0.131 -0.278 -0.164 -0.337 + 7.564 0.016 -0.087 -0.103 -0.208 -0.282 -0.098 -0.118 -0.176 -0.191 -0.242 -0.050 -0.403 + 7.042 -0.075 -0.402 -0.566 -0.486 -0.333 -0.014 -0.228 -0.191 0.056 -0.243 -0.107 -0.218 + 7.222 0.257 -0.470 -0.401 -0.416 -0.302 -0.023 -0.066 -0.224 -0.087 -0.434 -0.067 -0.083 + 7.283 0.145 -0.549 -0.455 -0.470 -0.309 -0.069 -0.031 -0.183 -0.272 -0.384 -0.215 -0.051 + 7.437 0.106 -0.634 -0.439 -0.334 -0.304 -0.265 -0.151 -0.179 -0.290 -0.552 -0.144 0.046 + 7.152 -0.268 -0.550 -0.333 -0.318 -0.199 -0.288 -0.226 -0.119 -0.221 -0.319 0.017 0.027 + 7.311 -0.734 -0.193 -0.047 -0.172 -0.093 -0.292 -0.351 -0.218 -0.182 -0.186 0.041 0.106 + 7.190 -0.390 -0.500 -0.242 -0.325 -0.265 -0.321 -0.215 -0.211 -0.350 -0.507 -0.058 0.052 + 6.444 0.536 -0.217 -0.483 -0.497 -0.340 -0.314 0.092 0.090 -0.188 -0.467 -0.277 -0.116 + 6.119 0.347 -0.083 -0.709 -0.549 -0.240 -0.122 -0.020 0.118 -0.086 -0.492 -0.154 -0.256 + 5.586 0.110 -0.050 -0.618 -0.350 -0.182 -0.003 0.078 0.019 -0.128 -0.340 -0.075 -0.378 + 5.605 -0.047 0.048 -0.376 0.016 -0.184 -0.283 -0.113 -0.089 -0.130 -0.164 -0.033 -0.375 + 5.834 -0.123 0.152 -0.325 -0.229 -0.211 -0.186 -0.252 -0.173 -0.155 -0.087 0.143 -0.184 + 5.898 -0.114 0.180 -0.382 -0.133 -0.205 -0.239 -0.303 -0.136 -0.234 -0.144 0.015 -0.179 + 5.735 -0.033 0.075 -0.339 -0.115 -0.220 -0.137 -0.114 -0.160 -0.139 -0.127 0.047 -0.190 + 5.655 -0.034 -0.058 -0.438 -0.289 -0.349 -0.312 -0.144 -0.116 -0.050 -0.051 0.084 -0.190 + 5.555 0.129 0.043 -0.426 -0.220 -0.190 -0.230 -0.206 -0.109 -0.089 -0.056 0.097 -0.134 + 5.509 0.085 0.017 -0.385 -0.216 -0.293 -0.334 -0.067 -0.108 0.102 -0.038 -0.041 -0.252 + 5.281 0.179 -0.248 -0.476 -0.310 -0.382 -0.265 -0.101 -0.096 0.046 0.015 0.060 -0.065 + 5.499 0.361 -0.117 -0.284 -0.385 -0.212 -0.098 0.028 0.036 -0.127 -0.021 0.032 -0.161 + 5.277 0.577 -0.204 -0.373 -0.502 0.039 -0.060 0.152 -0.055 -0.168 -0.232 -0.058 -0.192 + 5.269 0.365 -0.354 -0.415 -0.508 -0.122 -0.125 0.175 0.165 0.033 -0.188 -0.158 -0.053 + 4.828 0.114 -0.381 -0.391 -0.421 -0.149 -0.143 0.193 0.244 0.128 -0.288 -0.124 -0.054 + 4.242 0.172 -0.229 -0.285 -0.286 0.055 -0.138 0.008 -0.109 -0.189 -0.180 -0.043 -0.007 + 4.668 0.239 -0.271 -0.156 -0.012 -0.126 -0.309 -0.260 -0.068 -0.003 -0.044 0.061 -0.002 + 4.341 -0.136 -0.320 -0.103 -0.307 -0.129 -0.305 -0.069 -0.014 0.137 -0.070 0.172 -0.007 + 2.578 0.358 -0.078 -0.240 -0.128 0.081 -0.108 -0.006 -0.211 0.157 0.119 0.036 0.118 + 2.517 0.281 -0.068 0.066 -0.173 0.015 -0.091 -0.015 -0.163 0.143 0.177 0.074 -0.013 + 2.388 0.256 0.137 0.099 -0.132 -0.037 -0.312 -0.159 -0.067 0.086 0.056 -0.072 -0.079 + 2.619 0.487 -0.008 0.057 -0.095 -0.002 -0.192 -0.194 -0.200 0.068 0.131 -0.005 -0.102 + 2.389 0.412 -0.173 -0.203 -0.103 -0.140 -0.323 -0.227 -0.147 0.182 0.283 0.044 -0.148 + 2.093 0.306 -0.135 -0.091 -0.176 0.091 -0.176 -0.243 -0.026 0.053 0.139 0.015 -0.031 + 2.097 0.448 -0.147 -0.205 -0.060 -0.003 -0.092 -0.118 -0.125 0.090 -0.028 -0.082 -0.015 + 2.136 0.435 -0.321 -0.300 -0.125 -0.134 -0.192 -0.032 -0.224 0.033 -0.013 0.063 0.039 + 1.861 0.278 -0.153 -0.116 -0.250 -0.126 -0.219 0.005 0.043 0.086 0.092 0.015 0.050 + 1.893 0.471 -0.049 -0.056 -0.001 0.087 -0.055 -0.008 -0.040 0.010 0.090 0.079 0.073 + 2.559 0.875 0.180 0.065 0.029 -0.064 -0.237 -0.226 -0.252 -0.055 0.086 0.247 0.106 + 5.835 1.371 0.385 -0.079 -0.098 -0.230 -0.321 -0.158 -0.265 -0.049 -0.113 -0.106 -0.149 + 7.370 1.287 0.384 0.081 -0.104 -0.282 -0.363 -0.198 -0.330 -0.053 -0.095 -0.108 -0.217 + 6.706 1.447 -0.077 0.520 -0.196 -0.632 -0.153 -0.209 -0.412 0.113 -0.098 -0.171 -0.180 + 5.493 1.294 0.233 0.536 -0.226 -0.437 -0.200 -0.232 -0.333 0.051 0.033 -0.128 -0.136 + 4.036 0.354 0.678 0.475 -0.333 0.057 -0.335 -0.299 -0.317 0.030 0.028 -0.064 -0.152 + 2.634 0.294 0.320 0.073 -0.379 -0.020 -0.268 -0.309 -0.138 -0.004 0.017 -0.017 0.071 + 4.510 0.033 0.093 0.147 -0.479 -0.291 -0.048 -0.148 -0.153 -0.044 -0.130 -0.098 -0.050 + 7.999 -0.033 -0.400 0.015 -0.549 -0.278 0.107 0.056 -0.007 0.089 -0.223 -0.206 -0.187 + 5.242 -0.081 0.115 -0.022 -0.393 -0.238 0.320 0.048 0.149 0.051 -0.232 -0.243 -0.193 + 3.959 -0.861 0.365 0.061 -0.125 -0.286 0.138 -0.124 -0.032 -0.136 -0.155 -0.057 -0.139 + 4.925 -0.884 0.216 0.077 -0.067 -0.312 -0.208 -0.048 0.122 0.027 -0.142 -0.036 -0.030 + 5.384 -0.907 -0.182 -0.125 -0.118 -0.445 -0.284 0.050 0.355 0.042 -0.173 0.074 -0.056 + 5.736 -0.646 -0.133 -0.075 -0.101 -0.475 -0.176 0.195 0.316 -0.034 -0.339 -0.099 -0.119 + 4.902 -0.356 -0.155 -0.013 -0.119 -0.446 -0.091 -0.058 0.149 0.081 -0.247 -0.101 -0.249 + 3.862 0.247 0.159 -0.129 -0.325 -0.186 0.104 0.154 -0.042 -0.057 -0.016 0.013 -0.050 + 3.627 0.652 0.326 0.197 -0.118 -0.109 -0.101 -0.041 -0.189 -0.031 -0.087 -0.186 -0.124 + 3.381 0.668 0.134 0.154 -0.026 -0.086 -0.133 0.009 -0.175 -0.081 -0.015 -0.088 -0.162 + 3.107 0.574 0.113 0.013 -0.138 -0.069 -0.088 0.063 -0.147 -0.042 -0.059 0.008 -0.165 + 3.342 0.573 0.050 0.262 -0.137 -0.124 -0.061 -0.205 -0.223 -0.015 -0.072 -0.156 -0.099 + 3.433 0.602 0.074 0.188 -0.258 -0.142 0.013 -0.055 -0.216 -0.188 -0.055 -0.084 -0.028 + 3.663 0.241 0.352 0.192 -0.268 -0.168 0.011 0.028 -0.008 -0.044 -0.044 -0.002 -0.037 + 5.583 -0.339 0.458 0.228 -0.367 -0.248 0.099 -0.284 0.211 -0.196 -0.044 -0.097 -0.172 + 4.418 -0.241 0.573 0.111 -0.372 -0.141 0.099 -0.316 0.061 -0.251 -0.021 0.045 -0.135 + 4.546 0.450 0.196 0.279 -0.500 -0.080 -0.049 -0.075 0.109 -0.169 -0.161 -0.152 -0.112 + 3.509 0.325 0.204 0.177 -0.145 -0.077 0.029 -0.046 0.118 -0.247 -0.064 -0.172 -0.013 + 3.505 0.232 0.134 0.173 -0.279 -0.103 -0.021 -0.165 -0.014 -0.285 -0.136 -0.194 -0.088 + 4.401 0.634 0.134 -0.093 -0.384 -0.035 -0.062 0.125 0.126 -0.204 -0.228 -0.187 -0.060 + 4.154 0.341 0.194 0.121 -0.150 0.042 -0.042 0.054 0.022 -0.162 -0.299 -0.194 -0.190 + 4.600 -0.033 0.074 -0.104 -0.230 -0.122 -0.041 0.197 -0.066 0.164 -0.030 0.001 -0.176 + 4.854 -0.401 0.110 -0.254 -0.196 -0.118 0.086 0.062 -0.136 -0.057 -0.206 -0.089 -0.068 + 5.235 -0.469 -0.029 -0.172 -0.017 0.020 0.057 -0.020 0.009 -0.029 -0.252 -0.011 0.034 + 5.494 -0.502 -0.180 -0.293 -0.153 -0.065 0.182 -0.024 -0.064 -0.018 -0.122 -0.137 -0.081 + 5.213 -0.770 -0.443 -0.526 -0.354 -0.335 0.076 0.059 0.122 0.221 -0.005 -0.035 0.076 + 4.383 -0.923 -0.219 -0.118 -0.151 -0.176 0.064 -0.102 -0.010 0.116 -0.060 -0.064 0.044 + 4.124 -0.697 -0.139 -0.124 -0.137 -0.149 -0.002 -0.228 -0.067 -0.026 -0.215 -0.061 0.153 + 3.185 -0.071 -0.085 -0.271 -0.177 -0.130 0.010 0.087 -0.025 -0.099 -0.103 0.021 0.140 + 2.875 0.362 -0.117 -0.277 -0.152 -0.041 -0.093 -0.111 -0.076 0.044 -0.140 -0.186 -0.135 + 1.998 -0.007 -0.211 0.152 0.112 0.028 -0.052 -0.066 -0.065 0.172 0.001 0.036 0.015 + 1.977 0.041 0.024 0.139 -0.071 -0.107 -0.165 0.045 -0.140 0.028 0.071 -0.019 -0.057 + 2.261 0.066 -0.004 0.031 -0.050 0.013 0.096 -0.093 -0.089 0.045 -0.060 -0.028 -0.126 + 3.021 -0.569 0.285 -0.192 0.074 0.146 -0.073 -0.074 -0.105 -0.141 -0.027 -0.034 -0.115 + 2.988 -0.545 0.245 -0.160 -0.039 -0.144 -0.132 0.020 -0.001 0.049 0.143 0.041 0.028 + 1.980 -0.011 -0.419 -0.053 0.004 0.031 -0.117 0.023 -0.238 0.045 0.043 -0.032 -0.058 + 2.139 0.071 -0.309 -0.113 0.007 0.165 -0.031 -0.080 -0.156 0.019 0.051 -0.081 -0.022 + 2.044 0.108 -0.174 0.108 0.036 0.191 -0.004 -0.194 -0.146 0.037 0.132 0.120 -0.008 + 2.016 0.067 -0.109 -0.060 -0.259 -0.018 -0.082 -0.086 0.035 -0.046 -0.032 -0.012 0.016 + 2.098 0.230 0.214 0.067 -0.137 0.160 -0.102 -0.150 -0.114 0.083 0.133 0.039 0.001 + 2.096 0.300 0.163 0.137 0.031 0.078 -0.090 -0.047 -0.176 0.069 0.068 0.066 -0.038 + 2.297 0.399 0.026 -0.037 0.034 0.118 -0.077 -0.133 -0.293 0.032 0.099 0.104 -0.062 + 2.290 0.444 -0.093 -0.229 -0.266 -0.102 -0.062 -0.102 -0.107 0.089 0.117 0.137 -0.016 + 1.662 0.068 -0.083 -0.272 -0.022 -0.060 -0.151 -0.223 0.082 0.192 0.004 0.094 -0.027 + 1.883 0.368 0.204 -0.080 -0.181 -0.018 -0.252 -0.191 -0.042 -0.027 0.084 0.004 -0.086 + 1.915 0.346 0.104 0.085 -0.009 -0.190 -0.263 -0.300 -0.252 0.070 0.142 -0.039 -0.069 + 2.017 0.313 -0.318 0.039 -0.020 -0.007 -0.267 -0.296 -0.032 0.021 -0.052 0.075 -0.183 + 1.619 0.019 -0.318 0.128 0.095 0.262 -0.118 -0.101 0.112 0.115 -0.017 -0.041 -0.208 + 2.236 0.545 0.183 0.342 0.097 -0.114 -0.171 -0.146 -0.059 -0.002 0.146 0.004 -0.112 + 2.179 0.768 0.216 0.095 0.201 -0.103 -0.381 -0.360 -0.094 0.045 0.081 -0.009 -0.163 + 5.017 -0.358 -0.177 0.070 0.153 -0.025 -0.424 0.140 -0.035 -0.174 -0.042 -0.047 -0.062 + 7.109 -0.565 -0.283 0.047 -0.030 -0.226 -0.544 0.289 0.067 -0.327 -0.105 -0.019 0.004 + 3.918 -0.622 -0.728 0.268 0.069 0.124 -0.518 0.195 -0.046 -0.287 0.084 0.075 0.009 + 1.975 -0.287 -0.428 0.018 0.120 -0.054 -0.159 0.002 -0.207 -0.174 0.124 0.195 -0.129 + 2.620 -0.229 -0.306 -0.090 0.073 0.135 -0.007 0.035 -0.183 0.029 0.021 -0.005 -0.052 + 5.420 -0.720 -0.619 -0.101 -0.263 -0.075 0.024 0.134 -0.142 -0.082 0.205 0.172 -0.152 + 6.973 -0.896 -1.298 -0.140 -0.321 -0.292 -0.203 0.307 -0.033 -0.205 0.037 0.196 -0.262 + 8.823 -0.810 -1.129 -0.186 -0.077 -0.249 -0.142 0.059 -0.152 -0.095 0.073 0.184 -0.309 + 10.338 -0.546 -1.082 -0.244 0.042 -0.312 0.120 0.086 -0.089 -0.145 -0.167 0.012 -0.230 + 12.020 0.358 -0.982 -0.447 -0.103 -0.498 0.013 -0.106 -0.251 -0.027 -0.386 0.071 -0.240 + 13.170 0.835 -1.361 -0.356 -0.237 -0.376 -0.254 0.110 -0.161 0.005 -0.366 -0.075 -0.166 + 14.175 0.462 -1.720 -0.168 -0.352 -0.285 -0.186 0.266 -0.087 0.028 -0.376 -0.255 -0.064 + 14.008 0.482 -1.812 -0.252 -0.344 -0.274 -0.172 0.240 -0.040 -0.028 -0.322 -0.307 0.005 + 14.333 0.399 -1.758 -0.166 -0.465 -0.145 -0.255 0.282 -0.091 0.034 -0.344 -0.327 0.020 + 14.537 0.408 -1.633 -0.245 -0.577 -0.023 -0.329 0.244 -0.189 0.159 -0.360 -0.342 -0.064 + 14.519 0.661 -1.503 -0.355 -0.683 0.080 -0.305 0.177 -0.349 0.317 -0.307 -0.316 -0.244 + 13.706 1.232 -1.229 -0.366 -0.791 -0.084 -0.194 0.021 -0.487 0.274 -0.147 -0.233 -0.239 + 12.034 1.248 -0.828 -0.015 -0.704 -0.318 0.144 -0.082 -0.438 0.220 -0.255 0.085 -0.102 + 10.844 0.641 -0.504 0.310 -0.115 -0.135 0.446 -0.063 -0.561 0.112 -0.749 0.070 -0.126 + 10.760 0.593 -0.490 0.330 -0.128 -0.191 0.436 -0.087 -0.459 0.065 -0.698 0.046 -0.027 + 10.857 0.422 -0.436 0.306 -0.083 -0.067 0.370 -0.005 -0.556 -0.009 -0.759 -0.016 0.067 + 10.624 0.492 -0.450 0.360 -0.050 -0.072 0.400 0.047 -0.699 -0.020 -0.797 0.005 0.099 + 10.372 0.779 -0.529 0.367 -0.182 -0.083 0.273 0.224 -0.694 0.013 -0.684 -0.132 0.066 + 11.586 1.078 -0.440 -0.170 -0.351 -0.265 -0.199 -0.003 -0.667 0.065 -0.087 0.003 0.140 + 13.029 1.136 -0.983 -0.458 -0.570 -0.132 -0.398 -0.090 -0.581 0.364 -0.007 -0.114 -0.111 + 13.624 0.932 -1.285 -0.346 -0.703 -0.126 -0.545 -0.132 -0.385 0.469 -0.092 -0.316 -0.259 + 13.749 0.743 -1.210 -0.284 -0.471 -0.363 -0.497 -0.276 -0.074 0.455 -0.155 -0.360 -0.127 + 13.253 0.706 -0.887 -0.270 -0.138 -0.719 -0.412 -0.374 0.042 0.466 -0.392 -0.031 -0.032 + 11.665 0.271 -0.240 0.364 -0.230 -0.759 -0.473 -0.121 0.101 -0.018 -0.317 -0.057 -0.053 + 8.780 -0.002 -0.191 0.160 -0.362 -0.181 -0.449 -0.066 0.184 0.207 -0.133 0.056 -0.069 + 7.427 0.485 -0.658 -0.084 -0.386 -0.394 -0.048 -0.201 0.221 0.240 -0.230 -0.305 -0.113 + 7.945 -0.212 -0.616 -0.183 -0.482 -0.283 0.005 -0.062 0.393 0.315 -0.199 -0.322 -0.240 + 7.024 0.129 -0.406 -0.319 -0.428 -0.331 -0.012 -0.116 0.312 0.329 -0.226 -0.171 -0.059 + 10.636 -1.339 -0.305 0.005 -0.888 0.130 -0.219 -0.144 0.066 -0.197 -0.109 -0.137 -0.147 + 11.020 -1.741 -0.102 0.012 -0.931 -0.039 -0.115 -0.223 -0.077 -0.190 -0.081 -0.137 -0.117 + 11.050 -2.473 0.022 0.354 -0.365 -0.231 -0.040 -0.094 -0.037 0.030 -0.164 -0.175 -0.008 + 12.460 -1.736 -0.437 -0.080 -0.304 -0.398 -0.292 -0.147 -0.162 -0.139 -0.154 -0.004 0.052 + 12.013 -1.182 -0.318 0.406 0.125 -0.165 -0.407 -0.095 -0.213 -0.202 -0.194 -0.171 -0.013 + 11.486 0.144 -0.210 0.116 0.661 0.095 -0.249 -0.286 -0.188 -0.370 -0.377 -0.281 -0.255 + 11.432 0.731 -0.253 -0.133 0.275 -0.168 -0.380 -0.285 -0.141 -0.044 -0.047 -0.157 -0.373 + 11.298 1.214 -0.078 0.063 0.206 -0.046 -0.210 -0.246 -0.189 -0.031 -0.098 -0.277 -0.269 + 11.040 1.294 -0.045 0.214 0.071 0.083 -0.269 -0.309 -0.181 -0.059 -0.214 -0.071 -0.273 + 11.035 1.365 0.020 0.170 -0.089 0.060 -0.321 -0.181 -0.061 -0.131 -0.272 -0.105 -0.128 + 10.255 1.337 0.111 0.141 -0.068 0.124 -0.236 -0.187 -0.329 -0.220 -0.243 -0.129 -0.304 + 9.699 0.725 -0.231 0.033 0.037 0.219 0.002 -0.072 -0.362 -0.466 -0.131 0.043 -0.123 + 9.861 0.572 -0.557 -0.091 0.044 0.215 0.076 -0.114 -0.451 -0.415 0.002 0.106 -0.077 + 9.124 0.323 -0.760 -0.298 -0.020 0.452 0.032 -0.410 -0.585 -0.288 0.048 -0.011 0.027 + 8.448 0.650 -0.326 -0.030 -0.147 0.046 -0.241 -0.553 -0.398 -0.206 -0.037 0.090 -0.084 + 6.704 0.345 -0.234 -0.213 0.011 -0.026 -0.316 -0.516 -0.358 -0.007 0.115 -0.043 -0.115 + 6.168 0.098 -0.312 -0.129 0.100 -0.142 -0.117 -0.262 -0.338 -0.025 0.053 -0.216 -0.040 + 6.301 -0.312 -0.663 0.231 -0.139 -0.055 -0.277 -0.288 -0.128 -0.157 -0.087 -0.126 0.097 + 7.215 -0.365 -0.748 0.282 -0.227 -0.273 -0.425 -0.186 0.056 -0.176 0.158 -0.054 0.235 + 8.203 -0.637 -0.763 0.095 -0.489 -0.265 -0.291 -0.118 0.111 -0.101 0.256 -0.014 0.159 + 9.219 -0.551 -0.978 -0.156 -0.329 -0.231 -0.208 0.119 0.210 -0.298 0.054 -0.018 0.125 + 10.372 -0.183 -0.646 -0.115 -0.189 -0.288 -0.475 0.165 0.011 -0.085 -0.150 0.016 -0.029 + 10.631 -0.597 -0.899 -0.309 -0.168 -0.149 -0.200 0.292 -0.080 -0.250 -0.263 0.047 -0.102 + 11.224 -0.444 -1.176 -0.363 -0.058 -0.341 -0.026 0.372 0.069 -0.390 -0.214 0.175 -0.165 + 11.752 -0.455 -1.199 -0.194 0.008 -0.488 -0.011 0.071 -0.088 -0.323 -0.082 0.282 -0.155 + 12.117 -0.480 -1.240 -0.137 0.061 -0.309 0.046 0.083 -0.205 -0.259 -0.305 -0.047 -0.215 + 12.199 -0.475 -1.131 -0.209 0.143 -0.070 -0.007 0.032 -0.192 -0.295 -0.428 0.069 -0.161 + 13.021 0.188 -0.987 -0.336 -0.081 -0.274 -0.262 0.122 -0.191 -0.099 -0.485 0.008 -0.152 + 13.968 0.565 -1.407 -0.534 -0.162 -0.365 -0.238 0.221 -0.170 -0.089 -0.376 -0.014 -0.236 + 14.615 0.365 -1.682 -0.399 -0.260 -0.267 -0.365 0.370 -0.160 -0.007 -0.361 -0.169 -0.248 + 14.580 0.420 -1.646 -0.420 -0.344 -0.314 -0.354 0.334 -0.126 -0.009 -0.383 -0.292 -0.089 + 14.866 0.337 -1.417 -0.385 -0.362 -0.319 -0.477 0.399 -0.251 0.152 -0.432 -0.297 -0.161 + 14.901 0.459 -1.318 -0.568 -0.291 -0.345 -0.480 0.254 -0.284 0.311 -0.349 -0.342 -0.304 + 14.539 0.839 -1.242 -0.587 -0.341 -0.395 -0.450 0.047 -0.382 0.524 -0.325 -0.285 -0.465 + 14.336 1.040 -0.785 -0.911 -0.440 -0.407 -0.286 -0.002 -0.608 0.485 -0.301 -0.175 -0.362 + 13.910 1.125 -0.341 -0.947 -0.542 -0.339 -0.191 -0.266 -0.764 0.278 -0.225 0.113 -0.248 + 13.371 1.023 0.122 -0.823 -0.621 -0.231 -0.324 -0.295 -0.788 0.115 -0.428 0.305 -0.241 + 12.808 0.948 0.459 -0.817 -0.522 -0.233 -0.178 -0.345 -0.839 -0.067 -0.572 0.240 -0.189 + 12.318 1.035 0.503 -0.805 -0.411 -0.317 -0.140 -0.331 -0.759 0.010 -0.659 0.131 -0.217 + 11.437 1.267 0.359 -0.760 -0.188 -0.314 -0.035 -0.327 -0.765 0.047 -0.651 0.034 -0.252 + 10.608 1.613 -0.042 -0.628 0.166 -0.360 0.129 -0.462 -0.876 0.053 -0.528 -0.066 -0.364 + 10.680 1.362 -0.392 -0.195 0.485 -0.503 -0.036 -0.591 -0.693 0.088 -0.401 -0.404 -0.262 + 11.022 0.933 -0.564 0.367 0.389 -0.721 -0.346 -0.316 -0.486 0.144 -0.511 -0.454 -0.177 + 11.155 0.355 -0.421 0.632 0.149 -0.835 -0.066 -0.159 -0.613 -0.038 -0.309 -0.294 -0.222 + 11.107 -0.316 0.036 0.808 -0.167 -0.393 0.036 -0.348 -0.506 -0.040 -0.442 -0.296 -0.366 + 10.846 -0.390 0.450 0.505 -0.194 -0.364 -0.117 -0.175 -0.488 -0.019 -0.366 -0.348 -0.291 + 11.028 -0.468 0.696 0.380 0.045 -0.291 -0.191 -0.089 -0.532 -0.032 -0.304 -0.417 -0.364 + 11.952 -0.720 0.806 0.386 -0.192 -0.150 -0.327 0.071 -0.583 0.029 -0.345 -0.325 -0.305 + 12.689 -1.045 0.758 0.511 -0.102 -0.226 -0.475 0.057 -0.535 0.131 -0.296 -0.246 -0.284 + 12.838 -1.087 0.855 0.472 -0.196 -0.187 -0.348 0.123 -0.711 0.102 -0.267 -0.295 -0.278 + 12.984 -0.972 0.767 0.478 -0.229 -0.103 -0.357 0.156 -0.776 0.093 -0.294 -0.287 -0.229 + 13.012 -0.808 0.673 0.451 -0.297 -0.114 -0.431 0.193 -0.676 0.064 -0.334 -0.273 -0.196 + 12.853 -0.561 0.477 0.561 -0.347 -0.152 -0.493 0.115 -0.646 0.082 -0.268 -0.322 -0.199 + 12.989 -0.524 0.386 0.554 -0.358 -0.104 -0.522 0.027 -0.781 0.120 -0.276 -0.252 -0.195 + 12.839 -0.398 0.269 0.565 -0.292 -0.191 -0.456 -0.086 -0.789 0.031 -0.323 -0.130 -0.260 + 12.864 -0.420 0.237 0.648 -0.218 -0.349 -0.336 -0.299 -0.664 -0.105 -0.303 -0.128 -0.239 + 13.113 -0.447 0.174 0.445 -0.301 -0.187 -0.194 -0.281 -0.767 -0.332 -0.223 -0.011 -0.394 + 13.206 -0.413 0.148 0.242 -0.071 -0.468 -0.226 -0.287 -0.548 -0.248 -0.220 -0.158 -0.434 + 12.834 -0.422 -0.070 0.190 -0.117 -0.644 -0.243 -0.328 -0.235 -0.423 -0.257 0.062 -0.434 + 12.754 -0.406 0.041 -0.028 0.009 -0.658 -0.245 -0.291 -0.338 -0.455 -0.224 -0.048 -0.433 + 12.867 -0.642 0.261 -0.186 0.041 -0.561 -0.291 -0.223 -0.451 -0.518 -0.314 -0.058 -0.271 + 12.978 -0.537 0.228 -0.108 0.018 -0.656 -0.187 -0.242 -0.289 -0.528 -0.237 -0.093 -0.349 + 13.012 -0.545 0.212 0.009 0.043 -0.492 -0.314 -0.173 -0.470 -0.411 -0.248 -0.106 -0.398 + 13.119 -0.707 0.271 0.333 -0.057 -0.459 -0.163 -0.178 -0.468 -0.359 -0.187 -0.145 -0.396 + 13.055 -0.529 0.226 0.423 -0.129 -0.358 -0.297 -0.067 -0.539 -0.367 -0.178 -0.309 -0.338 + 12.993 -0.627 0.387 0.676 -0.289 -0.396 -0.209 -0.012 -0.616 -0.167 -0.246 -0.378 -0.296 + 12.879 -0.636 0.260 0.935 -0.444 -0.174 -0.272 0.075 -0.703 -0.037 -0.416 -0.236 -0.312 + 12.766 -0.743 0.297 0.902 -0.278 -0.207 -0.257 0.032 -0.703 0.029 -0.423 -0.227 -0.274 + 12.460 -0.629 0.233 0.749 -0.096 -0.358 -0.191 0.079 -0.685 0.093 -0.408 -0.199 -0.242 + 12.134 -0.437 0.096 0.691 0.085 -0.453 -0.211 0.165 -0.653 0.092 -0.405 -0.150 -0.234 + 11.775 -0.318 0.100 0.497 0.306 -0.445 -0.335 0.202 -0.625 0.119 -0.401 -0.171 -0.142 + 11.033 -0.051 0.092 0.287 0.446 -0.323 -0.378 0.126 -0.662 0.183 -0.450 -0.182 -0.009 + 10.556 0.071 0.151 0.179 0.410 -0.202 -0.275 -0.043 -0.689 0.284 -0.543 -0.203 0.095 + 10.344 0.142 0.105 0.059 0.442 -0.103 -0.332 -0.117 -0.653 0.373 -0.534 -0.266 0.037 + 10.313 0.109 0.226 -0.015 0.433 -0.083 -0.376 -0.127 -0.644 0.381 -0.472 -0.271 -0.050 + 10.589 0.043 0.137 0.080 0.427 -0.126 -0.412 -0.044 -0.725 0.429 -0.565 -0.236 -0.078 + 10.769 0.023 0.086 0.188 0.435 -0.222 -0.453 -0.014 -0.654 0.397 -0.645 -0.166 -0.102 + 10.934 0.005 -0.056 0.434 0.355 -0.291 -0.451 0.011 -0.586 0.313 -0.668 -0.141 -0.082 + 10.813 0.081 -0.152 0.602 0.383 -0.452 -0.381 0.012 -0.468 0.107 -0.621 -0.123 -0.158 + 10.848 -0.132 -0.061 0.656 0.454 -0.563 -0.331 0.067 -0.512 0.129 -0.576 -0.138 -0.144 + 10.723 -0.204 0.048 0.661 0.349 -0.557 -0.291 0.225 -0.680 0.171 -0.512 -0.191 -0.087 + 10.243 -0.206 0.125 0.631 0.357 -0.598 -0.192 0.248 -0.762 0.285 -0.570 -0.070 -0.265 + 9.988 -0.306 0.102 0.625 0.339 -0.517 -0.147 0.219 -0.645 0.064 -0.471 -0.188 -0.152 + 9.943 -0.397 0.277 0.538 0.254 -0.376 -0.183 0.115 -0.475 0.008 -0.513 -0.393 0.041 + 10.163 -0.010 0.228 0.350 0.327 -0.210 -0.309 -0.008 -0.393 0.161 -0.516 -0.579 -0.052 + 10.059 0.164 0.135 0.133 0.461 -0.201 -0.202 -0.135 -0.447 0.331 -0.325 -0.566 0.032 + 10.179 0.401 0.374 -0.251 0.210 -0.094 -0.195 -0.158 -0.535 0.337 -0.084 -0.363 0.043 + 10.481 0.878 0.359 -0.506 0.072 -0.149 -0.189 -0.252 -0.718 0.065 -0.070 -0.510 0.039 + 10.673 1.165 0.015 -0.458 -0.186 -0.139 0.045 -0.324 -0.571 0.012 0.045 -0.333 0.084 + 10.986 1.193 0.044 -0.448 -0.366 -0.403 0.201 -0.483 -0.276 -0.176 0.064 -0.321 0.151 + 11.303 1.217 0.018 -0.546 -0.657 -0.295 0.086 -0.396 -0.205 -0.198 0.026 -0.264 0.247 + 11.423 1.135 0.016 -0.445 -0.989 -0.204 0.040 -0.258 -0.084 -0.237 -0.106 -0.096 0.157 + 11.384 0.924 0.132 -0.528 -1.012 -0.348 0.104 -0.236 0.158 -0.324 -0.024 -0.125 0.065 + 10.912 1.171 -0.019 -0.526 -1.048 -0.321 0.042 -0.229 0.315 -0.403 0.056 -0.134 -0.126 + 11.284 1.188 -0.155 -0.690 -1.152 -0.019 -0.065 -0.093 0.070 -0.267 -0.016 -0.033 -0.157 + 11.754 1.077 -0.391 -0.774 -1.111 0.162 -0.002 -0.192 -0.046 -0.112 0.015 0.026 -0.252 + 11.654 1.179 -0.572 -0.892 -0.931 0.162 -0.063 -0.174 -0.045 -0.016 -0.047 0.073 -0.402 + 11.896 0.927 -0.726 -0.737 -0.863 0.151 0.021 -0.395 0.041 0.161 -0.104 0.119 -0.549 + 11.590 1.057 -0.976 -0.503 -0.736 0.148 -0.131 -0.429 0.073 0.202 -0.127 0.091 -0.580 + 11.501 1.053 -0.926 -0.506 -0.622 0.127 -0.389 -0.366 0.081 0.234 -0.154 0.124 -0.560 + 9.569 0.568 -0.340 -0.043 -0.337 0.259 -0.311 -0.366 0.090 0.107 -0.310 0.130 -0.351 + 9.356 0.652 -0.019 0.154 -0.451 0.034 -0.245 -0.342 -0.011 0.120 -0.423 0.113 -0.292 + 9.698 0.529 -0.187 0.249 -0.421 -0.097 -0.155 -0.343 -0.083 0.124 -0.381 0.057 -0.213 + 12.596 0.244 -1.069 0.007 -0.092 -0.417 -0.593 0.067 -0.271 0.502 -0.317 0.077 -0.366 + 12.534 0.486 -1.053 -0.088 -0.313 -0.278 -0.643 0.029 -0.193 0.460 -0.346 0.014 -0.367 + 12.380 0.625 -0.952 -0.121 -0.619 -0.234 -0.631 0.030 0.002 0.340 -0.353 0.012 -0.283 + 12.215 0.757 -1.037 0.036 -0.710 -0.216 -0.705 0.053 0.101 0.220 -0.346 0.088 -0.249 + 11.739 0.859 -0.763 0.098 -0.738 -0.199 -0.721 -0.131 0.099 0.215 -0.225 0.032 -0.171 + 11.106 1.074 -0.628 0.098 -0.448 -0.267 -0.650 -0.215 -0.129 0.276 -0.253 -0.091 -0.200 + 8.648 1.023 0.010 0.036 0.139 -0.137 -0.346 -0.137 -0.216 0.173 -0.179 -0.383 -0.337 + 8.678 0.899 -0.087 0.152 0.161 -0.083 -0.339 -0.010 -0.231 0.032 -0.258 -0.583 -0.062 + 8.847 0.794 -0.051 0.118 0.209 -0.319 -0.318 0.104 -0.368 0.192 -0.246 -0.601 0.047 + 8.952 0.692 -0.111 0.163 0.167 -0.316 -0.282 0.087 -0.362 0.234 -0.295 -0.550 0.025 + 8.961 0.616 -0.066 0.139 0.166 -0.352 -0.187 -0.009 -0.329 0.274 -0.331 -0.630 0.171 + 9.244 0.577 -0.145 0.081 0.219 -0.272 -0.130 -0.053 -0.429 0.316 -0.352 -0.489 0.091 + 11.550 0.271 -0.471 0.068 -0.032 -0.313 -0.524 0.062 -0.156 0.168 -0.272 -0.131 0.054 + 12.326 -0.026 -0.265 0.179 -0.460 -0.596 -0.554 0.095 -0.324 0.162 -0.049 -0.033 0.004 + 12.629 -0.197 -0.139 0.354 -0.790 -0.525 -0.463 0.058 -0.388 0.352 -0.174 0.010 -0.107 + 12.915 -0.279 -0.101 0.364 -0.817 -0.611 -0.488 0.094 -0.442 0.377 -0.157 0.016 -0.192 + 13.128 -0.391 0.063 0.292 -0.878 -0.476 -0.659 0.161 -0.510 0.449 -0.308 0.139 -0.256 + 12.885 -0.391 0.274 0.261 -0.942 -0.437 -0.586 0.044 -0.537 0.394 -0.246 0.094 -0.190 + 12.791 -0.512 0.433 0.330 -0.937 -0.410 -0.608 0.006 -0.534 0.336 -0.226 0.093 -0.193 + 12.614 -0.614 0.650 0.371 -0.920 -0.378 -0.524 -0.129 -0.503 0.281 -0.265 0.034 -0.169 + 12.017 -0.584 0.725 0.466 -0.756 -0.266 -0.508 -0.224 -0.537 0.229 -0.327 0.015 -0.137 + 11.267 -0.640 0.776 0.575 -0.742 -0.294 -0.353 -0.226 -0.608 0.212 -0.376 -0.100 -0.175 + 8.754 -0.637 0.556 0.445 -0.459 -0.237 -0.258 -0.095 -0.360 0.182 -0.309 -0.070 0.027 + 6.755 -0.299 0.524 0.180 -0.133 -0.184 0.101 -0.162 0.092 -0.010 -0.204 -0.235 -0.259 + 5.801 -0.198 0.745 0.179 0.075 -0.162 -0.154 -0.488 -0.012 -0.142 0.015 -0.002 -0.292 + 4.897 0.393 0.245 0.045 -0.192 -0.201 -0.557 -0.238 -0.306 0.264 -0.159 -0.092 -0.099 + 4.974 0.349 0.132 0.097 -0.199 -0.187 -0.530 -0.149 -0.394 0.151 -0.043 0.091 -0.207 + 6.163 -0.111 -0.178 0.127 -0.448 -0.072 -0.347 -0.224 -0.147 -0.093 -0.103 0.120 -0.141 + 10.286 -1.278 -0.415 0.032 -0.511 0.003 -0.161 -0.168 0.150 0.053 -0.078 -0.112 -0.279 + 11.803 -1.488 -0.488 -0.021 -0.721 -0.076 -0.300 -0.278 -0.049 -0.145 -0.217 -0.218 -0.180 + 11.321 -0.915 0.844 -0.106 -0.617 0.039 -0.397 -0.264 -0.446 -0.075 -0.218 -0.208 -0.091 + 11.056 -0.096 1.112 0.072 -0.449 -0.382 -0.636 -0.007 -0.561 -0.168 -0.180 -0.060 -0.100 + 11.393 0.333 0.443 0.311 -0.426 -0.577 -0.696 0.087 -0.560 -0.226 -0.073 0.120 -0.278 + 11.469 0.447 -0.034 0.291 -0.366 -0.541 -0.706 0.007 -0.422 -0.177 -0.173 0.236 -0.393 + 11.601 0.306 -0.176 0.350 -0.463 -0.416 -0.849 -0.046 -0.411 -0.202 -0.224 0.288 -0.307 + 11.256 0.163 -0.398 0.470 -0.283 -0.228 -0.757 -0.023 -0.331 -0.165 -0.345 0.248 -0.301 + 6.980 -0.371 0.293 0.512 -0.152 -0.184 -0.790 -0.041 -0.057 -0.175 -0.115 0.316 -0.060 + 6.410 -0.229 0.285 0.640 -0.156 0.024 -0.618 0.138 -0.005 -0.002 -0.002 0.117 -0.005 + 5.695 0.199 -0.356 0.278 -0.044 -0.076 -0.355 -0.044 -0.103 0.074 -0.033 0.144 -0.111 + 8.185 0.086 -1.310 -0.273 -0.113 -0.099 -0.373 -0.243 -0.230 -0.224 -0.166 -0.115 -0.030 + 8.203 -0.812 -0.416 -0.149 -0.041 -0.082 -0.406 -0.114 -0.130 -0.199 -0.064 -0.275 -0.011 + 7.943 -0.687 0.128 -0.111 -0.333 -0.204 -0.293 0.037 -0.152 0.013 -0.146 -0.105 -0.010 + 9.038 -0.888 -0.162 0.129 -0.260 -0.156 -0.207 0.074 -0.018 -0.089 -0.178 0.032 -0.087 + 10.835 -0.623 -0.631 -0.010 -0.131 -0.136 -0.189 0.094 0.003 -0.115 -0.297 -0.146 -0.156 + 11.252 -0.274 -0.477 -0.028 0.036 -0.063 -0.161 -0.040 -0.030 0.003 -0.233 -0.240 -0.144 + 11.901 0.185 -0.203 0.167 0.175 -0.177 -0.332 -0.255 -0.038 -0.159 -0.327 -0.295 -0.118 + 12.889 0.323 0.006 0.456 0.068 -0.121 -0.487 -0.408 -0.115 -0.164 -0.308 -0.420 -0.379 + 12.295 -0.016 -0.146 0.426 0.136 0.142 -0.435 -0.216 -0.144 -0.120 -0.328 -0.336 -0.236 + 11.379 0.360 -0.351 0.367 0.358 0.046 -0.542 -0.303 -0.279 -0.254 -0.142 -0.428 -0.134 + 11.491 1.387 -0.993 -0.470 -0.048 -0.094 -0.717 -0.317 -0.229 -0.167 -0.065 -0.179 -0.157 + 10.826 2.063 -0.888 -0.392 -0.015 0.125 -0.684 -0.484 -0.152 -0.120 -0.138 -0.050 -0.125 + 9.634 2.231 -0.412 -0.447 0.100 0.255 -0.505 -0.360 -0.096 -0.245 -0.076 -0.197 -0.162 + 6.751 1.689 0.261 -0.084 0.084 0.053 -0.242 -0.085 -0.041 -0.056 -0.053 -0.030 -0.172 + 4.712 0.916 0.113 0.087 0.166 0.257 -0.186 -0.265 -0.121 0.032 0.051 0.038 -0.073 + 4.437 0.707 -0.021 -0.007 0.020 0.099 -0.133 -0.233 -0.065 0.007 0.066 0.053 -0.093 + 4.397 0.436 -0.127 -0.018 -0.104 -0.103 -0.358 -0.273 -0.103 0.181 0.140 0.034 0.103 + 4.320 0.273 -0.022 -0.054 0.072 -0.044 -0.338 -0.228 -0.073 -0.004 0.051 -0.041 -0.021 + 4.669 0.354 -0.053 -0.015 0.034 -0.012 -0.192 -0.286 -0.233 0.154 -0.138 -0.003 -0.072 + 7.301 -0.821 0.030 0.268 0.042 -0.103 -0.371 -0.046 -0.147 -0.183 0.064 -0.149 0.115 + 11.949 0.506 0.314 0.046 -0.393 -0.228 -0.159 -0.103 -0.334 -0.364 -0.140 -0.250 -0.047 + 13.324 1.251 0.109 0.475 -0.511 -0.401 0.183 -0.258 -0.392 -0.313 -0.230 -0.174 -0.121 + 11.355 0.944 0.417 0.581 -0.565 -0.515 0.069 -0.215 -0.226 -0.125 -0.282 -0.141 -0.081 + 9.620 -0.447 0.458 0.626 -0.093 -0.393 0.206 -0.335 -0.494 -0.190 -0.273 -0.117 -0.132 + 10.564 -0.336 0.276 0.406 -0.429 -0.204 -0.184 -0.346 -0.363 -0.262 -0.248 -0.176 -0.121 + 11.376 -0.395 0.202 0.721 -0.212 -0.388 -0.263 -0.071 -0.635 -0.136 -0.230 -0.198 -0.082 + 11.711 -0.592 0.273 0.736 -0.261 -0.237 -0.179 -0.156 -0.756 -0.015 -0.379 -0.135 -0.142 + 11.497 -0.610 0.296 0.783 -0.190 -0.421 0.016 -0.087 -0.873 -0.010 -0.321 -0.246 -0.101 + 10.798 -0.298 -0.085 0.652 0.258 -0.532 -0.186 0.181 -0.975 -0.118 -0.392 -0.204 -0.085 + 9.375 0.454 -0.086 0.514 0.541 -0.466 -0.313 0.425 -0.790 0.061 -0.242 -0.201 -0.133 + 6.856 0.679 0.266 -0.054 0.279 0.026 -0.098 0.089 -0.304 0.095 -0.074 -0.161 -0.056 + 8.812 -0.817 0.372 0.065 0.538 -0.350 -0.029 0.032 0.108 -0.213 -0.510 0.049 -0.037 + 9.128 -1.081 0.092 0.190 0.337 -0.236 0.064 -0.074 0.108 -0.332 -0.463 0.118 -0.060 + 8.169 -0.686 -0.169 0.068 0.156 -0.028 0.070 -0.085 0.081 -0.338 -0.389 0.045 0.016 + 11.383 -0.451 0.220 0.125 -0.100 -0.029 -0.107 -0.124 -0.192 -0.152 -0.156 -0.019 -0.059 + 12.338 1.087 0.193 -0.326 -0.398 -0.210 -0.181 -0.044 -0.188 -0.263 -0.196 -0.016 0.095 + 12.217 1.199 0.340 -0.037 -0.444 -0.054 -0.317 -0.193 -0.255 -0.309 -0.239 -0.160 0.003 + 11.685 1.316 0.505 -0.122 -0.615 0.183 -0.164 -0.151 -0.090 -0.369 -0.189 -0.184 -0.039 + 11.456 1.061 0.806 -0.379 -1.006 0.011 0.024 -0.323 -0.145 -0.504 -0.105 -0.210 0.045 + 10.755 1.080 0.864 -0.761 -0.810 -0.030 -0.022 -0.324 -0.084 -0.411 -0.087 -0.049 0.116 + 10.392 0.409 0.813 -0.771 -0.663 -0.085 -0.085 -0.157 -0.266 -0.311 -0.239 0.157 -0.196 + 7.433 0.308 0.668 0.004 -0.393 -0.014 0.065 0.078 -0.207 -0.140 -0.356 0.112 -0.092 + 5.759 0.213 0.596 0.441 -0.180 -0.221 -0.029 -0.168 -0.023 0.001 -0.228 0.020 -0.106 + 5.406 0.176 0.379 0.341 -0.041 -0.114 0.052 -0.287 -0.003 -0.195 -0.096 0.185 -0.083 + 8.733 -0.955 -0.070 0.415 -0.383 -0.022 -0.329 0.046 0.139 0.054 -0.114 -0.164 -0.129 + 10.833 -1.265 0.198 0.016 -0.410 0.057 -0.377 0.000 0.104 0.106 -0.109 -0.207 -0.200 + 10.010 -0.655 0.933 -0.084 -0.469 -0.012 -0.430 -0.292 -0.410 -0.133 -0.196 -0.051 -0.295 + 10.716 0.175 0.467 -0.075 -0.333 0.338 -0.099 -0.455 -0.556 -0.180 -0.040 0.123 -0.259 + 8.316 0.966 0.539 -0.314 -0.152 0.440 -0.179 -0.524 -0.380 -0.185 0.137 0.129 -0.217 + 5.649 0.920 0.348 0.149 -0.080 0.166 0.207 -0.245 -0.385 -0.162 -0.014 -0.278 -0.146 + 5.456 0.974 0.666 -0.080 -0.058 0.168 0.314 -0.054 -0.314 -0.286 -0.177 -0.024 -0.081 + 5.630 1.083 0.441 -0.005 -0.053 0.100 0.148 -0.127 -0.249 -0.144 -0.114 -0.157 -0.024 + 5.907 1.020 0.356 0.232 -0.248 0.007 0.237 -0.047 -0.303 -0.208 -0.056 0.064 -0.057 + 5.389 0.718 0.391 0.262 -0.048 -0.127 0.196 0.035 -0.099 -0.061 -0.046 0.001 -0.251 + 5.171 0.750 0.359 0.073 0.059 -0.047 0.046 -0.012 0.007 0.012 -0.195 -0.003 -0.111 + 4.904 0.637 0.149 0.235 0.306 0.118 0.208 0.049 -0.212 0.024 -0.088 -0.168 -0.155 + 10.083 0.530 0.477 0.096 -0.048 -0.088 -0.323 -0.180 -0.320 -0.280 -0.050 -0.179 -0.114 + 11.638 1.295 0.704 0.036 -0.097 -0.191 -0.429 -0.129 -0.274 -0.452 -0.160 -0.320 -0.122 + 10.327 1.142 0.803 0.053 -0.074 -0.008 -0.470 -0.177 -0.156 -0.182 -0.035 -0.243 -0.155 + 8.350 0.519 0.829 0.119 -0.182 -0.123 -0.268 -0.057 -0.178 0.029 -0.071 -0.259 -0.137 + 8.132 0.755 1.058 -0.600 -0.729 -0.398 -0.367 -0.124 -0.275 -0.044 -0.447 -0.081 -0.250 + 9.134 0.535 1.161 -0.490 -0.836 -0.288 -0.476 -0.117 -0.156 -0.023 -0.539 -0.055 -0.260 + 9.578 0.330 1.198 -0.589 -1.068 -0.262 -0.150 -0.056 -0.179 -0.350 -0.322 -0.200 -0.227 + 10.687 0.241 0.387 -0.290 -1.002 0.031 -0.222 -0.300 -0.013 -0.512 -0.413 -0.210 -0.200 + 11.299 0.567 -0.254 -0.057 -0.560 0.287 -0.146 -0.802 -0.054 -0.285 -0.358 -0.093 -0.139 + 11.792 0.647 -0.783 0.738 -0.343 -0.022 -0.483 -0.603 -0.126 -0.193 -0.289 -0.169 -0.131 + 11.913 0.158 -0.501 1.148 -0.342 -0.362 -0.551 -0.238 -0.367 -0.165 -0.397 -0.136 -0.102 + 11.352 -0.182 0.060 1.122 -0.198 -0.643 -0.216 -0.210 -0.618 0.097 -0.522 -0.058 -0.335 + 10.868 -0.603 0.502 0.883 -0.059 -0.341 -0.292 -0.164 -0.560 0.113 -0.416 -0.136 -0.278 + 10.294 -0.502 0.380 1.092 -0.384 -0.133 -0.188 -0.161 -0.519 -0.010 -0.251 -0.183 -0.264 + 10.089 -0.558 0.452 0.878 -0.206 -0.197 -0.047 -0.170 -0.662 0.047 -0.274 -0.133 -0.118 + 10.541 -0.826 0.464 0.843 -0.207 -0.298 -0.163 0.040 -0.631 0.133 -0.351 -0.133 -0.130 + 10.212 -0.585 -0.078 1.051 -0.015 -0.481 -0.153 0.132 -0.795 0.271 -0.267 -0.146 -0.225 + 7.920 0.205 -0.198 0.776 0.089 -0.378 -0.025 0.498 -0.752 0.101 -0.414 -0.235 -0.264 + 5.151 0.967 0.195 0.299 -0.099 0.070 0.276 0.202 -0.360 -0.012 -0.235 -0.156 -0.054 + 5.110 0.885 0.027 0.482 -0.169 -0.244 0.286 0.053 -0.326 0.154 -0.053 -0.234 -0.122 + 4.715 0.717 0.032 0.442 0.117 -0.126 0.128 0.033 -0.432 0.168 -0.129 -0.037 -0.038 + 4.512 0.527 -0.157 0.287 0.050 -0.110 -0.008 -0.107 -0.421 0.016 -0.150 -0.005 -0.067 + 3.970 0.500 -0.361 0.129 0.072 -0.059 0.058 -0.114 -0.399 0.122 0.029 0.131 -0.109 + 7.173 -0.372 -0.103 0.096 0.022 0.046 -0.069 -0.040 -0.119 -0.162 -0.062 -0.025 -0.113 + 12.427 1.041 0.148 -0.088 -0.209 -0.353 -0.319 -0.092 0.032 -0.163 -0.243 -0.178 -0.369 + 12.816 1.317 0.143 0.118 -0.198 -0.289 -0.343 -0.152 0.035 -0.214 -0.281 -0.132 -0.308 + 11.136 0.884 0.817 0.234 -0.297 -0.220 -0.170 -0.009 -0.042 -0.215 -0.302 -0.064 -0.343 + 9.090 -0.086 0.740 0.590 0.042 -0.067 0.070 0.003 -0.015 -0.189 -0.130 0.040 -0.262 + 7.857 -0.546 0.455 0.270 -0.069 0.009 0.049 0.085 -0.064 -0.168 -0.149 -0.003 -0.193 + 7.605 -0.881 0.350 0.362 0.149 -0.319 -0.164 -0.086 0.092 -0.107 -0.238 -0.026 -0.059 + 8.491 -0.520 0.172 0.299 0.021 -0.208 -0.047 0.012 0.000 -0.206 -0.272 -0.009 -0.050 + 9.777 -0.309 0.177 0.212 -0.048 -0.240 -0.038 0.028 0.111 -0.395 -0.313 0.034 -0.108 + 8.922 -0.383 0.291 0.170 -0.063 -0.302 -0.199 -0.134 0.050 -0.047 -0.348 0.121 -0.235 + 9.686 0.176 -0.235 0.449 -0.480 -0.504 -0.404 -0.216 -0.086 0.117 -0.305 0.057 -0.157 + 11.714 0.399 -0.550 0.075 -0.437 -0.390 -0.724 0.170 -0.047 0.172 -0.438 0.245 -0.235 + 12.048 0.423 -0.422 -0.051 -0.557 -0.306 -1.009 0.378 0.053 0.109 -0.247 0.309 -0.343 + 11.953 0.269 -0.282 0.264 -0.867 -0.116 -0.784 0.304 -0.013 0.030 -0.123 0.242 -0.440 + 12.238 0.213 -0.112 0.007 -0.658 -0.148 -0.841 0.495 -0.259 0.094 -0.105 0.175 -0.500 + 12.414 -0.077 -0.005 0.222 -0.724 -0.237 -0.590 0.361 -0.355 0.180 -0.021 -0.038 -0.386 + 12.095 -0.254 0.256 0.273 -0.863 -0.170 -0.397 0.137 -0.268 0.178 -0.014 -0.148 -0.287 + 11.288 -0.342 0.408 0.341 -0.877 -0.150 -0.183 -0.083 -0.155 0.250 -0.124 -0.149 -0.091 + 10.396 -0.195 0.497 0.014 -0.260 -0.356 -0.164 0.015 -0.078 0.019 -0.140 -0.194 -0.020 + 9.806 0.246 0.479 -0.245 0.174 -0.550 -0.188 0.177 -0.233 0.046 -0.126 -0.303 0.066 + 9.770 0.367 0.409 -0.291 0.189 -0.574 -0.217 0.284 -0.406 0.176 -0.178 -0.320 0.052 + 9.640 0.351 0.406 -0.303 0.238 -0.609 -0.139 0.279 -0.479 0.183 -0.258 -0.305 0.087 + 9.101 0.377 0.452 -0.143 -0.026 -0.735 0.178 0.137 -0.415 0.150 -0.228 -0.385 0.128 + 8.672 0.209 0.429 0.191 0.064 -0.921 0.083 0.139 -0.320 -0.003 -0.245 -0.341 0.153 + 8.800 0.316 -0.080 0.503 -0.097 -0.680 -0.242 0.159 -0.134 0.131 -0.139 -0.368 0.130 + 9.461 0.230 -0.336 0.264 0.241 -0.500 -0.477 -0.211 -0.121 0.130 -0.223 -0.285 0.070 + 9.739 -0.200 -0.032 0.010 0.192 -0.597 -0.423 -0.141 0.127 -0.022 -0.285 -0.144 0.028 + 9.075 -0.836 0.411 0.004 0.045 -0.537 -0.215 -0.018 0.089 -0.168 -0.212 -0.125 0.079 + 8.575 -1.213 0.504 0.020 0.111 -0.321 -0.271 -0.189 -0.060 -0.151 -0.195 -0.019 0.138 + 8.875 -1.127 0.339 -0.418 0.164 -0.312 -0.143 -0.044 -0.079 -0.140 -0.194 -0.034 -0.074 + 8.976 -1.376 0.383 -0.404 0.143 -0.286 -0.117 -0.019 -0.049 -0.020 -0.146 -0.124 -0.120 + 9.366 -1.387 0.267 -0.497 0.159 -0.358 -0.061 -0.008 -0.001 -0.041 -0.113 -0.100 -0.004 + 10.069 -1.109 0.494 -0.106 0.199 -0.342 -0.316 -0.133 0.068 -0.113 -0.192 -0.053 -0.090 + 10.990 -0.533 0.454 -0.121 0.047 -0.517 -0.369 -0.376 -0.168 0.080 -0.255 -0.072 -0.184 + 11.445 0.634 -0.146 -0.168 -0.489 -0.606 -0.341 -0.454 0.055 0.006 -0.379 0.192 -0.075 + 11.822 1.042 -0.737 -0.189 -0.429 -0.569 -0.399 -0.379 0.137 0.130 -0.351 0.209 -0.094 + 12.763 0.637 -0.912 -0.122 -0.471 -0.474 -0.470 -0.065 0.126 0.031 -0.265 0.029 -0.065 + 13.210 0.304 -0.873 -0.086 -0.479 -0.606 -0.527 0.143 0.108 0.019 -0.331 0.141 -0.127 + 12.880 0.236 -0.628 -0.185 -0.593 -0.567 -0.547 0.295 0.003 0.163 -0.461 0.190 -0.247 + 13.180 0.385 -0.789 -0.373 -0.571 -0.294 -0.775 0.233 0.175 0.052 -0.409 0.083 -0.242 + 13.209 0.434 -0.914 -0.440 -0.441 -0.426 -0.670 0.331 0.043 0.002 -0.267 -0.069 -0.155 + 13.574 0.067 -0.988 -0.252 -0.559 -0.449 -0.462 0.262 0.040 0.127 -0.396 -0.072 -0.123 + 13.058 0.359 -0.955 -0.441 -0.550 -0.299 -0.676 0.317 -0.060 0.284 -0.451 -0.086 -0.146 + 13.524 0.139 -1.084 -0.299 -0.558 -0.495 -0.467 0.271 0.028 0.200 -0.437 -0.130 -0.151 + 13.290 0.254 -1.039 -0.330 -0.614 -0.401 -0.490 0.287 -0.074 0.260 -0.396 -0.201 -0.141 + 13.655 0.205 -1.037 -0.379 -0.541 -0.379 -0.505 0.314 -0.192 0.323 -0.415 -0.243 -0.092 + 13.496 0.181 -1.052 -0.366 -0.596 -0.270 -0.584 0.323 -0.129 0.233 -0.367 -0.246 -0.022 + 13.144 0.378 -1.141 -0.473 -0.484 -0.301 -0.556 0.363 -0.132 0.236 -0.424 -0.210 -0.044 + 12.916 0.407 -1.040 -0.720 -0.373 -0.384 -0.417 0.291 -0.133 0.312 -0.411 -0.377 -0.035 + 13.068 0.506 -1.219 -0.660 -0.345 -0.303 -0.540 0.312 -0.160 0.384 -0.440 -0.425 -0.011 + 13.037 0.651 -1.218 -0.785 -0.285 -0.128 -0.582 0.181 -0.191 0.446 -0.419 -0.415 -0.043 + 12.900 0.859 -1.484 -0.600 -0.336 -0.332 -0.318 -0.024 -0.089 0.358 -0.313 -0.349 -0.167 + 12.268 0.918 -1.090 -0.921 -0.390 -0.187 -0.377 0.026 -0.190 0.428 -0.260 -0.422 -0.114 + 11.905 0.947 -0.866 -1.118 -0.400 -0.076 -0.458 0.014 -0.265 0.536 -0.217 -0.403 -0.175 + 12.206 0.903 -0.716 -0.995 -0.576 -0.023 -0.479 -0.022 -0.360 0.506 -0.098 -0.327 -0.237 + 11.894 1.098 -0.646 -1.107 -0.396 -0.061 -0.550 0.031 -0.372 0.333 0.035 -0.286 -0.228 + 11.337 1.112 -0.548 -1.051 -0.421 -0.141 -0.342 -0.147 -0.386 0.304 0.102 -0.214 -0.290 + 11.228 1.039 -0.606 -0.897 -0.519 -0.192 -0.363 -0.211 -0.437 0.354 0.175 -0.199 -0.298 + 11.475 0.933 -0.626 -0.618 -0.570 -0.157 -0.449 -0.230 -0.493 0.344 0.131 -0.189 -0.222 + 11.276 0.929 -0.582 -0.791 -0.335 -0.391 -0.418 -0.509 -0.299 0.186 0.060 -0.146 -0.181 + 9.294 0.824 -0.371 -0.760 -0.232 -0.448 -0.425 -0.664 -0.161 0.251 0.241 -0.073 -0.112 + 9.192 0.856 -0.257 -0.896 0.099 -0.383 -0.500 -0.718 -0.113 0.040 0.064 -0.070 -0.132 + 6.106 0.458 -0.415 -0.514 -0.084 -0.570 -0.447 -0.677 0.033 0.523 0.227 -0.051 -0.108 + 5.629 0.521 -0.665 -0.292 -0.104 -0.428 -0.412 -0.235 0.038 0.405 0.043 -0.107 -0.169 + 5.260 0.801 -0.665 -0.329 -0.271 -0.358 -0.292 -0.127 0.049 0.395 0.109 -0.060 -0.096 + 4.905 0.591 -0.646 -0.404 -0.335 -0.373 -0.409 -0.078 0.153 0.295 0.120 -0.048 -0.062 + 4.594 0.645 -0.516 -0.436 -0.236 -0.296 -0.463 0.047 0.222 0.337 0.051 0.007 -0.154 + 4.446 0.565 -0.449 -0.146 -0.395 -0.501 -0.525 -0.094 0.004 0.312 0.056 -0.024 -0.187 + 4.660 0.647 -0.621 -0.303 -0.158 -0.224 -0.302 0.052 0.173 0.251 -0.013 0.057 -0.092 + 5.013 0.753 -0.504 -0.231 -0.174 -0.179 -0.356 -0.198 -0.021 0.323 0.051 0.075 -0.308 + 4.935 0.374 -0.693 -0.235 -0.091 -0.117 -0.066 -0.218 0.045 0.273 0.028 0.139 -0.356 + 8.945 -0.232 -0.631 -0.491 -0.153 -0.326 -0.379 -0.181 -0.042 -0.056 0.052 -0.046 -0.203 + 9.304 -0.204 -0.379 -0.498 -0.029 -0.342 -0.412 -0.210 0.019 -0.049 0.064 -0.056 -0.253 + 8.363 -0.937 -0.213 -0.451 0.139 -0.287 -0.224 -0.185 -0.105 -0.002 0.083 -0.194 -0.078 + 9.424 -1.376 -0.420 -0.595 0.305 -0.173 0.004 -0.043 -0.066 -0.175 -0.055 -0.043 0.015 + 10.188 -1.235 -0.385 -0.588 0.088 -0.228 -0.155 -0.042 0.048 0.034 -0.005 0.006 0.056 + 10.468 -1.092 -0.200 -0.558 0.000 -0.266 -0.280 -0.266 -0.082 -0.177 -0.087 0.016 0.021 + 10.581 -1.053 -0.156 -0.551 0.071 -0.234 -0.043 -0.149 -0.058 -0.185 -0.223 -0.096 -0.080 + 10.604 -0.849 -0.004 -0.721 -0.034 -0.337 -0.229 0.026 -0.096 -0.129 -0.178 0.034 -0.119 + 10.499 -1.006 -0.100 -0.615 -0.105 -0.318 -0.286 -0.049 0.137 0.028 -0.220 0.012 0.076 + 10.414 -1.059 -0.165 -0.658 -0.161 -0.373 -0.241 -0.104 0.070 0.112 -0.371 0.082 -0.076 + 10.356 -0.153 0.386 -0.455 -0.209 -0.449 -0.524 -0.487 0.032 0.094 -0.394 -0.061 -0.016 + 10.454 0.668 0.258 -0.355 -0.474 -0.116 -0.575 -0.788 0.106 0.002 -0.229 0.079 -0.018 + 11.092 0.648 0.183 -0.468 -0.598 0.141 -0.769 -0.807 0.048 0.265 -0.393 0.176 -0.130 + 11.967 0.382 0.152 -0.425 -0.516 -0.144 -0.680 -0.631 0.031 0.352 -0.479 0.119 -0.128 + 12.271 0.245 -0.091 -0.392 -0.456 -0.272 -0.649 -0.560 0.159 0.243 -0.402 0.070 -0.155 + 12.497 0.031 -0.235 -0.349 -0.486 -0.446 -0.588 -0.462 0.233 0.219 -0.352 0.065 -0.076 + 12.430 0.070 -0.268 -0.300 -0.543 -0.404 -0.612 -0.380 0.183 0.292 -0.364 0.039 -0.067 + 12.602 0.099 -0.313 -0.254 -0.636 -0.296 -0.570 -0.349 0.164 0.274 -0.335 -0.139 -0.023 + 12.733 0.094 -0.602 -0.270 -0.559 -0.247 -0.538 -0.375 0.210 0.223 -0.323 -0.143 -0.030 + 11.723 0.468 -0.523 -0.474 -0.621 -0.053 -0.718 -0.311 0.232 0.296 -0.278 -0.101 -0.028 + 12.619 0.220 -0.712 -0.366 -0.586 -0.238 -0.566 -0.297 0.194 0.256 -0.242 -0.199 -0.011 + 12.507 0.418 -0.647 -0.398 -0.591 -0.212 -0.499 -0.357 0.180 0.269 -0.298 -0.272 0.027 + 11.900 0.785 -0.740 -0.454 -0.544 -0.113 -0.595 -0.253 0.101 0.236 -0.257 -0.231 -0.087 + 11.446 0.945 -0.755 -0.613 -0.454 -0.088 -0.615 -0.373 0.181 0.304 -0.259 -0.250 -0.009 + 12.129 0.725 -0.923 -0.389 -0.492 -0.217 -0.519 -0.431 0.214 0.260 -0.191 -0.258 -0.024 + 12.381 0.645 -0.864 -0.347 -0.551 -0.154 -0.525 -0.334 0.133 0.153 -0.142 -0.266 -0.032 + 12.259 0.639 -0.928 -0.225 -0.637 -0.183 -0.318 -0.375 0.109 0.168 -0.219 -0.201 -0.092 + 12.049 0.540 -1.082 -0.207 -0.659 -0.172 -0.189 -0.414 0.240 0.096 -0.120 -0.246 -0.062 + 12.116 0.256 -1.080 -0.202 -0.621 -0.156 -0.088 -0.414 0.303 0.049 -0.108 -0.242 -0.211 + 11.589 0.191 -0.912 -0.177 -0.438 -0.169 -0.166 -0.318 0.374 0.077 -0.026 -0.127 -0.269 + 10.907 0.335 -0.829 -0.177 -0.270 -0.045 -0.091 -0.535 0.350 -0.092 0.026 -0.163 -0.416 + 9.577 0.560 -0.563 -0.354 -0.138 0.078 -0.124 -0.491 0.320 -0.142 0.037 -0.264 -0.453 + 8.491 0.609 -0.369 -0.376 -0.119 0.108 -0.014 -0.411 0.333 -0.175 0.144 -0.223 -0.446 + 7.301 0.233 -0.197 -0.228 -0.067 0.072 -0.011 -0.252 0.250 -0.230 -0.067 -0.102 -0.345 + 6.841 -0.141 -0.379 -0.507 -0.045 0.305 0.068 0.073 0.185 -0.032 -0.095 -0.243 -0.267 + 6.163 -0.259 -0.069 -0.453 -0.042 0.136 -0.177 -0.020 0.307 0.044 -0.100 -0.147 -0.286 + 5.608 -0.264 -0.210 -0.551 -0.158 -0.141 -0.145 -0.021 -0.075 0.077 0.007 -0.091 -0.058 + 5.305 -0.174 0.068 -0.297 -0.303 -0.246 -0.125 -0.070 -0.056 0.137 -0.134 -0.131 -0.008 + 5.293 -0.022 -0.250 -0.056 -0.071 -0.210 -0.335 -0.203 -0.065 0.127 -0.051 0.040 -0.161 + 5.846 -0.242 -0.060 -0.133 0.158 -0.326 -0.406 -0.071 -0.001 0.260 -0.088 -0.018 -0.057 + 5.722 -0.461 -0.303 -0.148 0.258 -0.144 -0.435 -0.139 0.170 0.255 -0.256 -0.028 -0.035 + 5.552 -0.327 -0.346 -0.172 0.299 -0.129 -0.327 0.028 0.005 0.167 -0.169 0.007 0.009 + 4.639 0.010 -0.377 0.002 -0.004 -0.136 -0.104 -0.050 -0.053 0.181 0.019 -0.101 -0.032 + 6.442 -0.299 -0.303 -0.005 -0.063 -0.078 -0.325 -0.036 0.018 -0.036 -0.116 -0.081 0.045 + 9.697 -0.419 -0.363 -0.242 -0.073 -0.081 -0.467 -0.123 -0.001 -0.154 -0.184 -0.118 -0.014 + 7.534 -0.307 -0.298 -0.083 0.043 -0.073 -0.476 -0.079 0.073 -0.190 -0.226 -0.129 -0.037 + 7.416 -0.231 -0.376 0.119 0.077 -0.016 -0.287 -0.083 -0.113 -0.320 -0.509 -0.189 0.031 + 7.879 -0.187 -0.539 -0.168 -0.084 -0.066 -0.356 -0.096 0.057 -0.173 -0.201 0.030 -0.150 + 8.240 -0.392 -0.538 -0.255 0.002 -0.213 -0.331 -0.150 -0.187 -0.197 -0.124 0.046 -0.067 + 8.608 -0.521 -0.506 -0.191 0.174 -0.195 -0.284 -0.028 -0.088 -0.016 -0.347 -0.198 -0.098 + 8.859 -0.686 -0.544 -0.268 -0.095 -0.174 -0.255 0.108 -0.131 -0.148 -0.206 0.190 0.044 + 9.050 -0.642 -0.598 -0.212 -0.133 -0.342 -0.452 -0.025 -0.285 -0.307 -0.277 0.175 -0.036 + 9.031 -0.707 -0.427 -0.223 -0.102 -0.463 -0.352 -0.020 -0.181 -0.225 -0.230 0.176 -0.044 + 8.925 -0.784 -0.472 0.051 -0.062 -0.447 -0.409 -0.064 -0.060 -0.297 -0.354 0.087 -0.107 + 9.281 -0.728 -0.360 -0.225 -0.230 -0.448 -0.343 0.063 -0.075 -0.355 -0.162 0.122 -0.056 + 9.357 -1.005 -0.525 -0.150 -0.192 -0.324 -0.256 0.065 -0.011 -0.357 -0.217 0.174 0.115 + 9.324 -1.003 -0.495 -0.232 -0.197 -0.371 -0.295 -0.010 -0.022 -0.210 -0.164 0.270 0.158 + 8.996 -0.906 -0.433 -0.172 -0.165 -0.440 -0.427 -0.061 -0.103 0.037 -0.074 0.244 -0.074 + 8.713 -0.941 -0.492 -0.188 -0.273 -0.358 -0.247 0.084 -0.064 0.103 -0.190 0.206 -0.115 + 8.861 -0.983 -0.474 -0.134 -0.358 -0.400 -0.568 0.005 -0.010 0.035 -0.110 0.209 -0.034 + 9.167 -0.871 -0.181 0.037 -0.175 -0.553 -0.500 -0.090 0.001 -0.118 -0.349 0.010 -0.084 + 9.165 -0.966 -0.388 0.222 -0.252 -0.620 -0.508 -0.024 0.149 -0.057 -0.361 -0.008 -0.081 + 9.123 -1.212 -0.440 -0.040 -0.423 -0.570 -0.573 -0.008 -0.016 -0.091 -0.248 0.047 0.141 + 9.133 -1.156 -0.321 -0.195 -0.292 -0.366 -0.411 0.163 -0.024 -0.079 -0.188 -0.046 -0.020 + 8.889 -1.079 -0.261 -0.322 -0.253 -0.273 -0.466 0.152 0.145 0.114 -0.204 -0.048 -0.035 + 9.134 -1.137 -0.340 -0.129 -0.127 -0.444 -0.568 -0.000 0.171 -0.164 -0.215 0.074 -0.063 + 9.275 -0.969 -0.439 -0.284 -0.063 -0.432 -0.509 0.018 0.060 -0.131 -0.185 0.115 -0.215 + 10.042 -0.736 -0.289 -0.206 -0.168 -0.239 -0.432 0.247 0.044 0.115 -0.260 0.044 -0.057 + 9.973 -0.963 -0.340 -0.068 -0.135 -0.388 -0.408 0.297 0.031 0.063 -0.227 -0.051 -0.116 + 9.686 -1.139 -0.345 -0.095 -0.037 -0.706 -0.741 0.087 -0.120 -0.120 -0.243 0.114 -0.234 + 9.338 -1.395 -0.219 -0.040 -0.168 -0.611 -0.622 0.117 0.032 -0.002 -0.213 0.236 -0.050 + 8.999 -1.189 -0.304 0.101 -0.120 -0.661 -0.653 0.013 0.026 0.064 -0.101 0.242 -0.044 + 8.963 -0.737 -0.277 0.089 -0.038 -0.607 -0.660 0.048 -0.203 -0.044 -0.086 0.285 -0.059 + 8.543 -0.797 -0.470 0.040 0.082 -0.683 -0.694 -0.097 -0.113 -0.005 0.011 0.451 0.009 + 8.472 -1.065 -0.178 0.023 0.138 -0.748 -0.719 -0.174 -0.062 -0.024 -0.201 0.337 0.059 + 8.529 -0.872 0.037 0.200 0.189 -0.843 -0.763 -0.038 -0.139 0.004 -0.101 0.240 0.051 + 8.750 -0.772 0.047 0.015 0.011 -0.680 -0.613 -0.018 -0.175 0.004 -0.228 0.216 0.156 + 8.384 -0.788 0.190 0.079 0.174 -0.720 -0.761 0.081 -0.250 -0.157 -0.213 0.211 0.114 + 8.063 -0.617 -0.085 0.102 0.155 -0.417 -0.705 0.045 -0.279 -0.037 -0.268 0.115 0.068 + 8.130 -0.447 -0.074 -0.067 0.226 -0.165 -0.659 -0.107 -0.073 0.075 -0.025 0.270 -0.034 + 8.093 -0.409 0.165 0.051 0.308 -0.107 -0.516 -0.143 -0.062 -0.061 -0.218 0.188 -0.036 + 7.655 -0.656 0.173 -0.043 0.347 -0.465 -0.755 -0.078 -0.172 -0.197 -0.087 0.212 0.082 + 7.020 -0.641 0.274 0.022 0.314 -0.601 -0.583 -0.140 -0.118 -0.023 -0.218 0.191 -0.013 + 7.369 -0.540 0.090 0.078 0.483 -0.513 -0.451 0.031 -0.065 -0.243 -0.311 0.227 0.021 + 7.110 -0.393 -0.156 0.197 0.345 -0.316 -0.435 0.082 0.059 -0.114 -0.296 0.341 -0.010 + 6.737 -0.270 0.158 0.302 0.279 -0.169 -0.402 0.108 0.059 -0.035 -0.161 0.187 -0.160 + 6.364 -0.350 -0.137 0.158 0.273 -0.177 -0.440 -0.095 -0.118 -0.163 -0.230 0.139 0.097 + 5.834 -0.119 -0.097 0.339 0.345 -0.324 -0.387 -0.006 -0.037 -0.372 -0.243 0.127 0.003 + 5.323 -0.346 -0.095 0.088 0.466 -0.369 -0.420 0.182 -0.058 -0.318 -0.122 0.288 0.161 + 8.295 1.523 0.206 -0.141 -0.242 -0.592 -0.185 -0.102 -0.245 -0.071 -0.224 -0.091 -0.101 + 9.605 1.779 0.113 0.039 -0.407 -0.682 -0.112 -0.272 -0.203 -0.105 -0.203 -0.097 -0.169 + 6.943 1.593 0.562 -0.422 -0.656 -0.742 -0.355 -0.218 -0.131 -0.169 -0.241 0.066 0.076 + 6.327 1.065 0.733 -0.200 -0.629 -0.477 -0.283 0.140 0.085 -0.102 -0.018 0.001 -0.146 + 5.730 0.761 0.789 -0.008 -0.372 -0.306 -0.161 0.038 -0.130 -0.245 -0.025 0.057 -0.138 + 4.844 0.322 0.608 0.067 -0.157 -0.357 -0.310 -0.053 0.086 -0.012 0.013 0.029 -0.128 + 4.485 0.457 0.361 -0.052 -0.017 -0.039 -0.210 0.045 -0.154 -0.117 -0.060 -0.055 -0.160 + 4.414 0.332 0.144 0.114 -0.013 0.004 -0.164 0.112 0.011 -0.022 -0.137 -0.169 -0.386 + 4.795 0.428 0.298 0.155 0.066 -0.096 -0.188 0.046 -0.254 0.054 -0.078 -0.030 -0.267 + 4.800 0.205 0.159 -0.026 -0.046 -0.121 -0.126 0.144 -0.159 -0.120 -0.085 0.111 -0.246 + 4.759 0.189 0.175 0.083 -0.110 -0.221 -0.230 0.087 -0.180 -0.093 -0.037 0.107 -0.080 + 4.869 0.305 0.028 -0.096 -0.072 -0.179 -0.204 0.022 -0.068 -0.241 -0.060 0.038 -0.061 + 5.460 0.682 0.269 -0.049 -0.083 -0.341 -0.313 -0.017 -0.019 -0.091 -0.074 -0.017 0.076 + 5.547 0.739 0.300 0.056 -0.204 -0.440 -0.386 -0.125 -0.048 -0.028 -0.182 -0.085 -0.136 + 5.675 0.732 0.247 -0.021 -0.072 -0.304 -0.347 -0.005 -0.125 -0.053 -0.182 0.094 -0.086 + 7.641 1.243 0.038 -0.413 0.127 -0.023 -0.441 -0.181 -0.225 0.042 -0.233 0.004 -0.027 + 6.811 1.083 0.190 0.012 0.045 0.029 -0.221 -0.246 -0.137 0.098 -0.213 -0.135 -0.170 + 5.370 0.126 0.171 -0.003 -0.330 -0.207 -0.381 -0.216 -0.139 0.034 -0.123 -0.175 -0.175 + 6.707 -0.229 0.069 -0.008 -0.286 -0.248 -0.394 -0.254 -0.164 -0.080 -0.175 -0.158 -0.097 + 7.454 -0.382 0.175 0.118 -0.233 -0.137 -0.356 -0.171 -0.129 -0.103 -0.127 -0.149 -0.067 + 7.103 -0.240 -0.003 0.015 -0.139 -0.260 -0.338 -0.211 -0.159 0.179 -0.031 0.025 -0.037 + 7.110 -0.200 0.207 -0.008 -0.209 -0.296 -0.407 -0.424 -0.222 -0.221 -0.059 0.176 -0.054 + 8.203 -0.086 0.532 0.303 -0.197 -0.235 -0.443 -0.315 -0.247 -0.139 -0.109 -0.046 -0.052 + 8.305 -0.439 0.293 0.123 -0.175 0.106 -0.353 -0.279 -0.049 -0.189 -0.173 -0.060 -0.190 + 8.560 -0.137 0.291 0.124 0.048 0.008 -0.390 -0.319 0.020 -0.033 -0.242 -0.215 -0.077 + 8.091 0.324 0.029 0.013 0.155 0.046 -0.434 -0.352 -0.020 -0.237 -0.352 -0.092 -0.016 + 6.359 0.785 -0.223 0.037 0.208 0.062 -0.262 -0.381 -0.209 -0.025 -0.392 -0.159 -0.083 + 5.565 0.976 0.112 0.031 0.283 0.208 0.025 -0.139 -0.179 -0.135 -0.336 -0.341 -0.207 + 3.744 -0.041 0.164 0.242 0.241 0.038 0.022 -0.066 -0.013 -0.051 -0.159 -0.110 -0.105 + 3.514 -0.282 0.065 0.223 0.112 0.190 -0.201 0.016 -0.172 -0.166 -0.022 -0.263 -0.086 + 3.838 -0.153 0.014 0.167 -0.039 0.062 -0.078 0.039 -0.109 -0.115 -0.086 -0.171 0.005 + 3.466 -0.142 -0.011 0.022 0.153 -0.028 -0.101 0.075 -0.188 -0.042 -0.117 -0.099 -0.033 + 3.942 0.333 0.027 0.335 -0.075 -0.001 -0.117 0.010 -0.100 -0.040 -0.136 -0.009 -0.046 + 3.548 0.081 0.049 0.365 -0.115 0.062 -0.061 -0.044 -0.080 -0.048 -0.315 0.011 -0.032 + 3.609 0.044 0.117 0.213 0.063 0.164 -0.024 -0.034 -0.093 -0.104 -0.216 0.215 0.014 + 3.509 -0.093 0.184 0.215 0.090 0.070 -0.070 -0.048 0.144 0.129 -0.082 0.141 0.019 + 3.748 0.089 0.137 0.103 0.010 0.043 -0.129 0.060 -0.105 0.093 -0.189 -0.079 -0.081 + 4.011 0.256 -0.104 -0.064 -0.099 0.130 -0.174 -0.098 0.014 0.068 -0.091 0.054 -0.031 + 4.135 0.058 -0.089 0.044 -0.097 0.126 -0.136 -0.050 -0.162 -0.048 0.027 0.072 -0.107 + 4.372 0.222 -0.158 -0.057 0.026 -0.154 -0.300 0.042 -0.064 -0.132 -0.102 0.024 -0.155 + 4.821 0.238 0.011 0.075 0.013 -0.177 -0.326 0.143 -0.015 -0.071 -0.163 0.017 0.037 + 4.736 0.091 -0.162 0.222 0.198 -0.187 -0.471 0.071 -0.028 0.012 0.013 0.096 -0.048 + 4.740 0.012 -0.179 0.167 0.163 -0.304 -0.383 -0.001 -0.017 -0.044 -0.040 0.204 0.079 + 5.252 0.114 -0.193 0.140 0.036 -0.386 -0.394 0.238 0.081 -0.087 -0.085 0.086 -0.094 + 5.462 0.160 -0.379 0.251 0.293 -0.317 -0.352 0.178 -0.016 -0.144 -0.101 0.058 -0.057 + 5.495 0.085 -0.538 0.278 0.263 -0.342 -0.387 0.184 0.090 -0.134 -0.119 0.181 -0.072 + 5.551 -0.044 -0.596 0.028 0.151 -0.250 -0.428 0.245 -0.011 -0.145 0.008 0.022 -0.019 + 5.370 -0.211 -0.402 0.144 0.315 -0.504 -0.471 0.173 0.021 -0.256 -0.203 0.092 0.021 + 5.412 -0.487 -0.635 0.174 0.486 -0.455 -0.493 0.107 -0.039 -0.171 0.170 0.229 -0.064 + 5.127 -0.729 -0.489 0.291 0.381 -0.382 -0.352 0.024 0.032 -0.074 0.187 0.157 -0.000 + 5.287 -0.809 -0.379 0.263 0.507 -0.181 -0.338 0.049 -0.049 -0.198 0.124 0.073 -0.053 + 5.497 -0.687 -0.534 0.162 0.459 -0.282 -0.437 0.236 0.142 -0.305 0.097 0.276 -0.059 + 5.588 -0.669 -0.670 0.200 0.261 -0.292 -0.307 0.194 0.059 -0.325 0.139 0.171 -0.021 + 5.475 -0.727 -0.471 0.173 0.578 -0.334 -0.239 0.239 -0.004 -0.206 0.029 0.137 -0.087 + 5.744 -0.774 -0.683 0.127 0.261 -0.075 -0.325 0.386 0.264 -0.067 0.060 -0.091 -0.120 + 6.038 -0.531 -0.556 0.016 0.102 -0.275 -0.362 0.368 0.209 -0.073 0.096 0.029 -0.091 + 5.636 -0.749 -0.723 0.100 0.296 -0.013 -0.277 0.027 0.171 -0.165 -0.101 0.052 -0.004 + 6.003 -0.499 -0.497 0.281 0.398 -0.019 -0.229 0.308 -0.019 -0.259 0.039 -0.027 -0.122 + 5.960 -0.539 -0.538 0.084 0.372 -0.159 -0.424 0.096 0.087 -0.232 -0.012 0.003 -0.079 + 5.753 -0.511 -0.323 0.226 0.248 -0.471 -0.369 0.151 0.177 -0.295 -0.022 0.012 0.048 + 5.460 -0.282 -0.246 0.551 0.295 -0.414 -0.350 0.129 0.094 -0.360 -0.136 0.142 -0.114 + 5.751 -0.342 -0.408 0.499 0.330 -0.287 -0.459 0.136 0.035 -0.384 -0.134 0.111 -0.069 + 5.759 -0.350 -0.393 0.336 0.206 -0.399 -0.535 0.254 0.254 -0.104 -0.097 0.004 -0.190 + 5.970 -0.213 -0.243 0.259 0.092 -0.397 -0.492 0.076 0.103 -0.216 0.025 -0.008 0.030 + 6.081 0.355 0.250 0.647 0.489 -0.292 -0.750 0.049 0.031 -0.160 0.178 0.011 -0.138 + 5.941 0.129 0.186 0.639 0.383 -0.127 -0.557 0.005 0.042 0.056 0.040 0.053 -0.052 + 5.704 -0.222 -0.232 0.578 0.199 -0.525 -0.394 0.232 0.127 -0.325 -0.002 0.068 -0.158 + 5.687 -0.258 -0.326 0.141 0.076 -0.509 -0.218 0.366 0.046 -0.385 -0.029 0.063 0.007 + 5.490 -0.375 -0.340 0.112 -0.038 -0.380 -0.253 0.218 -0.052 -0.323 -0.128 -0.057 -0.034 + 5.068 -0.417 -0.491 0.102 0.248 -0.410 -0.389 0.305 -0.209 -0.350 0.090 -0.060 -0.030 + 5.181 -0.265 -0.562 0.031 0.278 -0.416 -0.469 0.224 -0.034 -0.235 -0.032 0.153 -0.015 + 5.087 -0.139 -0.476 0.071 0.231 -0.298 -0.419 -0.019 0.058 -0.283 -0.087 0.182 -0.003 + 4.749 -0.062 -0.304 0.131 0.050 -0.338 -0.447 0.078 0.047 -0.146 -0.004 0.025 -0.095 + 4.331 0.017 -0.201 0.301 -0.163 -0.246 -0.470 0.160 0.134 -0.171 -0.017 0.088 0.003 + 4.455 0.029 -0.137 0.108 -0.277 -0.119 -0.251 0.042 -0.096 -0.197 -0.227 0.066 0.090 + 5.134 0.053 -0.173 0.046 -0.184 -0.172 -0.405 0.131 0.145 0.026 -0.023 0.064 -0.112 + 4.753 -0.009 -0.089 0.168 -0.058 -0.070 -0.284 0.174 0.116 -0.132 -0.159 -0.036 -0.139 + 4.484 0.082 -0.113 0.296 -0.035 -0.327 -0.585 0.094 0.171 -0.053 -0.043 0.087 -0.153 + 3.843 -0.328 -0.151 0.566 0.321 0.020 -0.391 0.085 -0.014 -0.326 -0.157 0.048 0.012 + 3.689 0.058 -0.172 0.368 0.126 0.001 -0.270 0.088 -0.065 -0.179 -0.123 0.144 -0.016 + 3.375 0.407 -0.125 0.291 0.070 -0.050 -0.163 0.236 0.060 -0.006 -0.223 0.030 -0.252 + 3.012 0.420 -0.189 0.262 -0.174 -0.024 -0.321 0.131 0.156 -0.031 -0.170 -0.016 -0.085 + 3.506 0.581 -0.014 0.378 -0.020 -0.407 -0.437 0.054 0.143 0.100 -0.162 -0.005 -0.045 + 3.276 0.074 -0.072 0.185 0.053 -0.324 -0.464 0.044 -0.014 -0.004 -0.124 0.082 0.183 + 4.262 0.018 0.406 0.145 -0.043 -0.061 -0.240 -0.085 -0.153 -0.006 -0.188 -0.165 0.009 + 4.740 -0.576 0.334 -0.131 -0.259 -0.279 -0.341 -0.079 0.049 -0.100 -0.049 0.098 0.016 + 4.815 -0.440 0.431 0.115 -0.299 -0.055 -0.315 -0.135 -0.167 -0.001 0.114 0.044 -0.019 + 6.046 -0.496 0.213 0.022 -0.024 -0.009 -0.236 0.022 -0.141 -0.057 0.009 0.212 -0.166 + 7.282 -0.101 0.208 -0.201 -0.036 0.001 -0.188 0.014 -0.107 0.005 -0.131 -0.049 -0.208 + 6.409 -0.143 0.308 -0.115 -0.056 -0.121 -0.227 -0.161 -0.208 0.021 -0.240 0.157 -0.046 + 5.369 -0.468 0.641 0.322 -0.194 -0.155 -0.376 -0.075 -0.173 -0.086 -0.039 0.082 -0.095 + 4.766 -0.523 0.663 0.180 -0.038 -0.134 -0.226 0.052 -0.152 -0.161 -0.103 -0.001 -0.096 + 5.264 -0.407 0.407 -0.053 -0.241 -0.308 -0.331 -0.091 -0.121 -0.034 -0.194 0.072 -0.030 + 5.330 -0.288 0.314 -0.101 -0.262 -0.289 -0.263 -0.105 -0.056 0.017 -0.064 0.042 -0.123 + 5.652 -0.244 0.824 -0.232 -0.121 -0.014 -0.159 0.049 -0.197 -0.133 -0.164 0.080 -0.283 + 6.157 -0.491 0.295 -0.103 -0.016 -0.065 0.066 -0.044 -0.237 -0.052 -0.205 -0.019 -0.134 + 7.177 -0.159 -0.030 -0.228 -0.183 -0.171 -0.029 -0.273 -0.021 -0.044 -0.083 -0.135 -0.009 + 6.355 0.402 -0.267 -0.603 -0.617 -0.203 -0.266 -0.201 0.024 0.125 -0.144 -0.041 0.020 + 6.743 0.662 -0.355 -0.547 -0.386 -0.183 -0.560 -0.210 0.207 0.114 -0.386 -0.143 0.012 + 7.488 0.469 -0.630 -0.276 -0.589 -0.487 -0.654 -0.414 0.187 0.217 -0.420 -0.105 0.069 + 8.087 0.137 -0.674 -0.154 -0.575 -0.559 -0.616 -0.471 0.010 0.285 0.050 -0.093 -0.009 + 7.878 0.219 -0.581 -0.054 -0.417 -0.445 -0.547 -0.471 -0.180 0.222 -0.269 -0.040 0.027 + 7.427 0.174 -0.215 0.036 -0.110 -0.519 -0.611 -0.419 -0.087 0.240 -0.507 0.080 0.165 + 6.659 0.287 -0.149 0.103 -0.182 -0.629 -0.418 -0.144 -0.055 0.188 -0.384 0.015 0.101 + 5.715 0.264 -0.019 -0.005 -0.050 -0.345 -0.249 0.016 0.011 0.074 -0.299 -0.106 0.025 + 4.747 0.110 -0.166 0.036 0.038 -0.243 -0.202 -0.004 0.179 0.339 -0.155 -0.078 0.040 + 4.729 0.335 -0.079 0.059 -0.115 -0.275 -0.133 -0.029 0.053 0.241 -0.205 -0.213 -0.063 + 4.893 0.284 -0.003 0.081 -0.289 -0.311 -0.151 -0.116 0.031 0.170 -0.115 -0.162 -0.058 + 4.873 0.095 -0.040 0.103 -0.156 -0.233 -0.072 -0.209 -0.049 0.093 -0.241 0.103 0.080 + 5.092 -0.108 -0.182 0.244 -0.516 -0.401 -0.191 -0.334 0.047 -0.032 -0.409 0.054 -0.056 + 4.940 -0.346 -0.061 0.206 -0.359 -0.038 0.053 -0.208 0.196 0.118 -0.182 -0.079 -0.067 + 5.250 -0.309 0.057 0.172 -0.433 -0.479 -0.030 -0.312 -0.084 0.095 0.063 0.189 0.055 + 6.094 -0.188 0.168 0.442 -0.659 -0.492 -0.127 -0.427 -0.028 0.093 -0.037 0.205 0.031 + 6.778 -0.313 0.235 0.326 -0.806 -0.584 -0.175 -0.393 -0.186 -0.025 -0.216 0.223 0.018 + 7.099 -0.766 -0.091 0.362 -0.891 -0.634 -0.319 -0.428 -0.245 -0.014 -0.005 0.307 0.029 + 7.486 -0.689 -0.005 0.604 -0.792 -0.612 -0.248 -0.538 -0.403 -0.078 -0.010 0.267 0.016 + 7.570 -0.732 0.106 0.874 -0.575 -0.542 -0.241 -0.646 -0.460 -0.080 -0.052 0.287 0.042 + 7.754 -0.774 0.072 0.734 -0.461 -0.536 -0.403 -0.740 -0.395 0.064 -0.183 0.211 -0.046 + 7.470 -0.661 0.250 0.681 -0.612 -0.473 -0.461 -0.661 -0.459 -0.073 -0.223 0.251 -0.096 + 7.000 -0.390 0.333 0.628 -0.749 -0.622 -0.209 -0.580 -0.399 -0.097 -0.046 0.175 -0.116 + 6.781 0.217 0.697 0.809 -0.371 -0.449 -0.054 -0.455 -0.367 -0.136 -0.202 0.062 -0.184 + 6.345 0.687 0.871 0.708 -0.100 -0.363 -0.210 -0.300 -0.230 -0.064 -0.269 0.082 -0.268 + 5.580 0.169 0.803 0.811 -0.026 -0.235 -0.035 -0.187 -0.412 -0.068 -0.166 0.021 -0.194 + 5.389 0.043 0.504 0.537 -0.170 -0.238 0.037 -0.157 -0.465 -0.319 -0.265 0.068 -0.201 + 5.312 0.229 0.321 0.389 -0.168 -0.065 0.187 -0.131 -0.211 -0.173 -0.224 -0.034 -0.184 + 6.167 0.187 0.357 0.143 -0.267 -0.128 -0.097 -0.244 -0.177 -0.106 -0.124 -0.110 -0.143 + 8.402 1.443 0.551 -0.067 -0.238 -0.156 -0.179 -0.191 -0.349 -0.119 -0.269 -0.200 -0.172 + 7.107 0.993 0.654 0.146 -0.184 -0.079 -0.023 -0.143 -0.276 -0.252 -0.186 -0.152 -0.305 + 6.602 0.409 0.492 -0.302 -0.520 -0.187 -0.046 -0.100 -0.068 -0.134 -0.223 -0.027 -0.229 + 6.446 -0.212 0.097 -0.135 -0.146 -0.049 -0.056 -0.013 -0.020 -0.082 -0.219 -0.063 -0.123 + 6.554 0.286 0.052 0.303 -0.073 -0.175 -0.332 -0.225 -0.028 -0.150 -0.218 0.267 -0.169 + 7.090 0.513 0.118 0.382 -0.244 -0.259 -0.415 -0.383 -0.083 -0.262 -0.440 0.240 -0.078 + 7.571 0.718 -0.019 0.152 -0.058 -0.124 -0.623 -0.337 -0.090 -0.074 -0.379 0.185 0.036 + 7.622 0.625 0.063 -0.055 -0.067 -0.074 -0.532 -0.353 -0.137 -0.192 -0.482 0.023 0.041 + 7.424 0.957 0.076 -0.039 0.047 0.005 -0.438 -0.385 -0.084 -0.207 -0.402 0.029 -0.114 + 6.312 0.846 -0.176 0.158 -0.033 -0.204 -0.392 -0.216 0.011 -0.215 -0.310 0.069 -0.090 + 5.763 0.571 0.032 0.215 -0.063 -0.117 -0.305 -0.176 -0.109 0.005 -0.234 0.036 -0.115 + 5.458 0.837 0.064 0.075 -0.058 -0.016 -0.147 -0.217 -0.176 -0.042 -0.254 -0.155 -0.145 + 5.588 0.961 -0.115 0.077 0.013 0.101 0.045 -0.110 -0.120 -0.120 -0.262 -0.090 -0.070 + 5.552 1.137 0.353 0.325 -0.024 -0.222 -0.124 -0.119 -0.034 -0.288 -0.422 -0.164 -0.208 + 5.442 1.340 0.454 0.397 -0.080 -0.192 0.050 -0.100 -0.101 -0.191 -0.288 -0.146 -0.170 + 5.576 0.734 -0.116 0.340 -0.207 -0.246 -0.273 -0.216 -0.065 -0.120 -0.068 0.135 -0.155 + 7.092 0.574 -0.180 0.362 -0.436 -0.261 -0.368 -0.279 -0.198 -0.204 -0.036 0.397 -0.145 + 7.871 0.081 -0.242 0.342 -0.814 -0.471 -0.410 -0.023 0.010 -0.027 -0.118 0.590 -0.151 + 8.333 -0.052 -0.289 0.462 -0.597 -0.675 -0.501 -0.217 -0.146 -0.134 -0.072 0.573 -0.211 + 8.476 -0.184 -0.293 0.514 -0.510 -0.842 -0.602 -0.048 -0.204 -0.181 0.051 0.607 -0.086 + 8.612 -0.291 -0.190 0.459 -0.632 -0.712 -0.626 -0.278 -0.130 -0.248 0.048 0.588 -0.232 + 8.515 -0.246 -0.145 0.240 -0.724 -0.656 -0.456 -0.107 0.006 -0.155 0.017 0.515 -0.173 + 8.228 -0.140 -0.152 0.031 -0.498 -0.669 -0.323 -0.051 -0.040 -0.097 0.074 0.351 -0.362 + 7.552 -0.100 0.114 0.158 -0.349 -0.712 -0.383 -0.005 0.017 -0.070 0.061 0.406 -0.144 + 7.686 0.441 -0.045 -0.121 -0.347 -0.352 -0.309 -0.153 -0.102 -0.112 0.034 0.271 -0.268 + 6.989 0.571 0.154 -0.034 -0.231 -0.421 -0.431 -0.206 -0.146 -0.255 -0.107 0.317 -0.180 + 6.572 0.425 0.340 0.058 -0.068 -0.218 -0.102 -0.036 -0.261 -0.262 -0.293 0.086 -0.196 + 6.194 0.438 0.489 0.362 -0.281 -0.449 -0.265 -0.132 -0.187 -0.180 -0.096 0.015 -0.124 + 5.979 0.190 0.425 0.191 -0.185 -0.435 -0.393 -0.081 -0.033 -0.272 -0.048 0.362 -0.099 + 6.348 0.181 0.606 0.184 -0.116 -0.242 -0.164 0.063 -0.041 -0.240 -0.077 0.178 -0.136 + 7.835 0.572 -0.021 0.165 0.211 -0.109 0.014 -0.173 -0.171 -0.215 -0.233 0.048 -0.207 + 8.508 0.676 -0.125 0.003 0.172 -0.079 0.137 -0.130 -0.102 -0.348 -0.334 0.064 -0.249 + 6.954 0.470 0.678 -0.120 -0.247 -0.345 -0.001 -0.070 -0.309 -0.058 -0.135 0.026 0.010 + 6.906 0.318 0.811 -0.105 -0.161 -0.205 0.175 -0.029 -0.246 -0.207 -0.208 -0.063 -0.217 + 6.433 -0.088 0.529 0.077 -0.050 -0.258 -0.103 -0.103 -0.125 -0.062 -0.220 0.142 -0.097 + 6.263 -0.170 0.594 -0.210 0.048 -0.137 -0.116 -0.026 -0.114 -0.145 -0.062 -0.108 -0.114 + 6.425 -0.206 0.504 -0.093 0.218 -0.278 -0.152 -0.295 -0.160 -0.183 -0.195 -0.158 -0.038 + 6.187 -0.338 0.330 0.117 0.044 -0.462 -0.163 0.081 -0.052 -0.173 -0.214 -0.103 -0.166 + 9.371 0.075 -0.070 0.401 -0.124 -0.621 0.033 -0.081 0.148 -0.419 -0.101 -0.137 -0.261 + 10.106 0.554 -0.249 0.217 0.012 -0.419 0.144 -0.108 0.149 -0.456 -0.207 -0.196 -0.255 + 9.610 1.266 -0.376 -0.009 0.280 -0.547 0.076 0.180 -0.213 -0.333 -0.312 -0.236 -0.266 + 9.976 1.239 -0.326 -0.034 0.301 -0.515 -0.130 0.450 -0.303 -0.378 -0.300 -0.274 -0.292 + 11.175 1.168 -0.355 -0.089 -0.024 -0.464 -0.281 0.214 -0.187 -0.277 -0.140 -0.138 -0.201 + 12.305 1.602 -0.443 -0.402 -0.089 -0.540 -0.441 0.068 -0.163 -0.281 -0.128 -0.093 -0.192 + 12.056 2.452 -0.735 -0.755 -0.339 -0.531 -0.541 0.211 -0.251 -0.329 -0.237 0.148 0.088 + 12.772 2.519 -0.637 -0.893 -0.269 -0.355 -0.828 0.446 -0.366 -0.351 -0.334 0.102 0.107 + 12.632 2.773 -0.687 -1.037 -0.268 -0.226 -0.869 0.367 -0.287 -0.255 -0.336 -0.021 0.192 + 12.895 2.610 -0.629 -1.114 -0.260 -0.032 -0.896 0.179 -0.227 -0.192 -0.269 -0.107 0.241 + 13.334 2.437 -0.708 -1.079 -0.165 -0.079 -0.813 0.077 -0.331 -0.111 -0.268 0.006 0.108 + 13.130 2.735 -1.022 -1.025 -0.003 -0.076 -0.930 0.080 -0.463 0.037 -0.256 0.032 0.037 + 13.193 2.490 -0.889 -0.987 0.091 -0.122 -0.897 -0.096 -0.367 0.040 -0.244 0.093 -0.095 + 13.250 2.286 -0.949 -0.818 0.212 -0.085 -0.986 -0.217 -0.275 -0.022 -0.168 -0.012 -0.144 + 12.588 2.104 -1.025 -0.406 0.349 0.139 -1.210 -0.306 -0.137 -0.112 -0.185 -0.088 -0.173 + 11.961 1.560 -0.887 -0.305 0.626 0.089 -1.207 -0.307 -0.006 -0.292 -0.203 -0.133 -0.131 + 10.819 1.151 -0.802 -0.139 0.568 0.030 -1.114 -0.127 0.168 -0.220 -0.346 -0.168 -0.172 + 9.487 0.719 -0.703 0.285 0.651 -0.072 -0.895 0.063 0.180 -0.412 -0.480 0.021 -0.135 + 9.379 0.714 -0.517 0.437 0.582 -0.339 -0.996 0.228 0.030 -0.428 -0.333 0.117 -0.108 + 11.485 0.123 -0.551 0.401 0.437 -0.336 -0.819 0.311 -0.418 -0.549 -0.100 0.031 -0.127 + 13.238 0.289 -0.467 0.371 0.317 -0.475 -1.196 0.406 -0.499 -0.471 -0.103 0.036 -0.233 + 13.655 0.519 -0.687 0.273 0.007 -0.570 -1.165 0.430 -0.267 -0.247 -0.034 0.135 -0.251 + 13.110 1.002 -0.858 0.180 0.093 -0.520 -1.160 0.369 -0.118 -0.215 -0.158 0.171 -0.263 + 11.163 0.947 -0.726 0.247 -0.048 -0.567 -0.805 0.091 0.112 0.018 -0.359 0.167 -0.019 + 10.379 0.969 -0.549 0.200 0.012 -0.282 -0.352 -0.476 0.176 0.231 -0.762 0.094 0.055 + 10.406 1.003 -0.542 0.055 0.023 -0.195 -0.287 -0.585 0.149 0.311 -0.715 0.019 -0.050 + 10.437 1.111 -0.655 0.005 -0.069 -0.229 -0.077 -0.578 0.089 0.243 -0.514 0.088 -0.214 + 10.516 1.092 -0.634 0.081 -0.309 -0.186 0.014 -0.480 -0.106 0.196 -0.392 0.203 -0.242 + 11.326 0.855 -0.505 -0.211 -0.210 -0.209 0.006 -0.411 -0.113 0.141 -0.400 0.227 -0.263 + 11.542 1.164 -0.759 -0.280 -0.141 -0.193 -0.147 -0.272 -0.089 0.072 -0.389 0.249 -0.140 + 11.529 1.214 -0.747 -0.063 -0.280 -0.372 -0.076 -0.174 0.019 -0.161 -0.232 0.062 -0.116 + 11.562 0.640 -0.658 0.217 -0.453 -0.431 -0.006 -0.090 -0.082 0.066 -0.283 -0.028 0.003 + 11.413 0.708 -0.692 0.171 -0.354 -0.544 -0.114 -0.066 -0.000 0.048 -0.167 -0.061 0.012 + 10.868 1.390 -1.026 0.094 -0.480 -0.701 0.014 -0.108 0.161 0.038 -0.076 -0.172 -0.073 + 10.675 1.905 -1.297 -0.092 -0.451 -0.885 0.128 -0.053 0.076 0.092 -0.223 -0.058 -0.151 + 10.695 1.878 -1.331 -0.196 -0.525 -0.924 0.170 0.052 0.099 0.156 -0.288 -0.022 -0.174 + 10.776 1.665 -1.387 -0.093 -0.456 -0.805 0.242 0.033 0.075 0.053 -0.270 -0.046 -0.076 + 10.858 1.748 -1.516 0.043 -0.597 -0.700 0.211 0.081 0.059 -0.018 -0.309 -0.022 -0.066 + 10.719 1.674 -1.426 -0.070 -0.395 -0.716 0.121 0.164 -0.031 -0.090 -0.202 -0.062 -0.087 + 11.886 0.841 -0.855 -0.584 -0.528 -0.563 0.090 0.395 -0.395 -0.041 0.186 -0.208 0.049 + 12.149 0.725 -0.817 -0.697 -0.550 -0.407 -0.013 0.283 -0.362 0.080 0.196 -0.215 -0.116 + 11.383 0.828 -0.654 -0.916 -0.576 -0.274 -0.386 -0.022 -0.434 0.091 -0.004 -0.124 0.036 + 8.525 0.738 -0.459 -0.326 0.174 -0.336 -0.259 -0.054 -0.379 0.132 0.023 -0.038 0.051 + 8.744 -0.011 -0.393 -0.236 0.420 -0.462 -0.132 -0.109 -0.061 0.024 -0.092 -0.101 -0.123 + 9.911 -0.463 -0.635 -0.516 0.284 -0.525 -0.292 -0.116 -0.219 -0.002 -0.072 0.000 0.036 + 8.869 -1.254 0.129 -0.417 0.090 -0.355 -0.227 -0.245 0.025 0.034 -0.068 -0.178 0.042 + 9.461 -1.898 0.415 -0.269 0.311 -0.264 -0.363 -0.129 -0.050 -0.096 -0.105 -0.136 -0.090 + 9.767 -1.761 0.445 -0.485 0.368 -0.298 -0.178 -0.047 -0.016 0.093 -0.039 0.034 -0.095 + 9.378 -1.864 0.202 -0.487 0.196 -0.314 0.039 0.109 0.069 -0.033 -0.267 -0.021 0.018 + 7.904 -1.451 0.285 -0.774 0.174 -0.588 -0.288 0.191 0.032 -0.062 -0.203 -0.028 -0.200 + 6.418 -0.506 0.278 -0.148 0.073 -0.483 0.019 0.035 -0.040 0.137 -0.058 -0.189 -0.164 + 5.943 0.084 -0.128 -0.122 0.079 -0.396 -0.061 -0.090 0.051 0.103 0.075 -0.077 -0.086 + 6.409 -0.116 -0.198 -0.149 0.368 -0.333 -0.180 -0.160 -0.110 0.090 -0.136 0.054 -0.015 + 9.486 -0.737 -0.313 -0.433 0.158 -0.417 -0.171 0.075 -0.315 -0.106 -0.285 0.068 -0.254 + 10.902 -0.998 0.045 -0.588 -0.076 -0.399 -0.378 -0.033 -0.310 -0.159 -0.206 0.043 -0.072 + 10.524 -0.887 0.107 -0.408 -0.295 -0.286 -0.498 -0.089 0.205 -0.093 -0.086 -0.031 0.192 + 11.670 0.729 -0.456 0.065 -0.215 -0.203 -0.547 -0.241 -0.078 -0.094 -0.184 -0.195 0.101 + 11.097 1.376 -1.007 0.366 -0.157 -0.421 -0.347 -0.466 -0.070 -0.013 -0.273 -0.007 -0.029 + 10.264 1.192 -0.872 0.300 -0.040 -0.424 -0.203 -0.459 -0.128 0.008 -0.121 -0.075 -0.148 + 8.932 0.719 -0.305 0.537 0.157 -0.321 -0.033 -0.330 -0.228 -0.043 -0.162 -0.094 -0.348 + 8.949 0.690 -0.322 0.613 0.209 -0.342 -0.183 -0.358 -0.246 0.073 -0.129 0.014 -0.411 + 8.952 0.805 -0.440 0.583 0.246 -0.361 -0.211 -0.390 -0.211 -0.053 -0.029 -0.115 -0.342 + 8.917 0.918 -0.489 0.479 0.260 -0.371 -0.190 -0.283 -0.253 -0.140 0.038 -0.222 -0.354 + 10.711 0.948 -0.817 0.034 0.418 -0.462 -0.557 -0.228 -0.132 0.026 -0.030 -0.311 0.004 + 11.579 0.954 -1.090 0.446 0.058 -0.646 -0.722 -0.060 -0.032 -0.030 -0.211 -0.026 0.121 + 11.978 0.680 -0.816 0.412 -0.082 -0.876 -0.634 0.054 -0.114 -0.055 -0.144 0.140 0.030 + 12.274 0.444 -0.557 0.410 -0.196 -0.958 -0.524 0.095 -0.261 -0.043 -0.074 0.151 -0.100 + 12.254 0.507 -0.459 0.388 -0.257 -0.934 -0.396 -0.019 -0.336 -0.045 -0.081 0.134 -0.180 + 11.880 0.143 0.031 0.553 -0.374 -0.770 -0.377 -0.037 -0.400 -0.148 -0.161 0.149 -0.214 + 10.478 -0.052 0.372 0.619 -0.494 -0.751 -0.423 -0.117 -0.403 -0.185 -0.050 0.121 -0.208 + 9.841 0.046 0.037 0.550 -0.258 -0.492 -0.242 -0.396 -0.323 -0.182 -0.125 -0.069 -0.000 + 7.444 -0.152 -0.277 0.217 -0.074 -0.469 -0.055 -0.233 -0.148 -0.044 -0.119 -0.064 -0.009 + 5.424 -0.202 0.223 0.059 0.043 -0.542 -0.519 -0.100 -0.068 0.036 -0.068 -0.064 -0.214 + 6.716 -0.569 -0.025 0.077 0.034 -0.534 -0.216 -0.126 -0.121 0.134 -0.096 0.089 0.008 + 10.339 -1.068 -0.542 0.266 -0.061 -0.425 -0.163 -0.306 -0.194 0.004 -0.166 0.034 -0.030 + 10.834 -0.759 -0.302 0.157 -0.142 -0.370 -0.346 -0.472 -0.257 -0.038 -0.260 0.109 -0.021 + 10.564 0.186 0.241 0.762 -0.319 -0.715 -0.523 -0.089 -0.505 -0.097 -0.199 -0.040 -0.168 + 11.980 0.613 0.174 0.174 -0.381 -0.500 -0.930 0.226 -0.678 0.013 -0.271 0.129 -0.150 + 12.078 1.051 -0.517 0.010 -0.033 -0.801 -0.899 0.248 -0.510 0.002 -0.239 0.189 -0.063 + 11.513 1.110 -0.555 0.017 -0.049 -0.895 -0.804 0.102 -0.305 -0.017 -0.257 0.256 -0.081 + 10.529 0.993 -0.222 -0.217 -0.041 -0.704 -0.865 -0.120 -0.305 0.109 -0.474 0.192 0.127 + 7.572 0.758 0.234 0.165 0.099 -0.359 -0.277 -0.157 -0.231 -0.076 -0.214 -0.122 -0.025 + 7.424 0.040 0.311 0.279 -0.087 -0.323 -0.336 0.135 -0.333 -0.124 -0.011 -0.097 -0.025 + 9.985 -0.364 -0.762 0.052 -0.198 -0.631 -0.333 0.313 -0.375 -0.212 0.046 0.045 -0.067 + 11.187 -0.141 -0.561 0.146 0.002 -0.598 -0.448 0.295 -0.309 -0.194 -0.182 0.020 -0.143 + 10.975 0.361 -0.791 -0.113 0.363 0.026 -0.403 0.310 -0.112 -0.124 -0.245 -0.080 -0.041 + 11.761 -0.513 -0.771 -0.396 0.174 0.260 0.037 0.114 -0.045 -0.167 -0.125 -0.104 -0.035 + 11.098 -0.354 -0.658 -0.472 0.103 0.125 0.065 0.117 -0.404 -0.185 0.078 -0.224 0.136 + 11.221 0.634 -0.281 -0.074 0.116 0.080 0.056 0.091 -0.455 -0.280 -0.308 -0.258 -0.016 + 11.692 0.009 -0.463 0.064 0.093 0.356 -0.169 0.213 -0.458 -0.044 0.073 -0.548 0.033 + 11.744 -0.566 -0.873 -0.160 -0.384 0.272 -0.182 0.272 -0.435 -0.054 0.327 -0.512 0.131 + 11.159 -0.297 -0.606 -0.118 -0.273 0.323 -0.126 0.286 -0.519 -0.012 0.084 -0.518 -0.150 + 10.777 0.635 -0.397 -0.438 -0.208 0.259 -0.065 0.337 -0.622 -0.109 -0.261 -0.423 -0.261 + 10.596 1.494 -0.335 -0.410 -0.372 -0.072 -0.107 0.132 -0.483 0.107 -0.121 -0.272 -0.218 + 11.031 2.177 -0.661 -1.086 -0.638 -0.057 -0.235 0.158 -0.417 -0.097 -0.036 -0.089 -0.086 + 11.408 2.365 -1.206 -1.039 -0.293 -0.230 -0.664 0.572 -0.569 -0.203 0.211 -0.084 -0.277 + 11.475 2.240 -1.286 -1.023 -0.283 -0.194 -0.666 0.470 -0.583 -0.130 0.278 -0.072 -0.231 + 11.666 2.062 -1.211 -1.123 -0.275 -0.135 -0.740 0.356 -0.455 -0.112 0.235 -0.029 -0.175 + 11.950 2.039 -1.320 -1.078 -0.161 -0.093 -0.861 0.268 -0.361 -0.107 0.212 -0.141 -0.034 + 11.783 2.211 -1.401 -1.168 0.029 -0.081 -0.932 0.185 -0.314 0.035 0.017 -0.129 0.103 + 11.299 2.182 -1.322 -1.194 0.007 -0.001 -0.956 0.079 -0.315 0.115 -0.016 -0.022 0.001 + 11.386 1.796 -1.131 -1.279 0.060 -0.033 -1.007 -0.037 -0.172 0.125 0.003 -0.040 -0.018 + 11.557 1.855 -1.152 -1.195 -0.000 0.071 -1.159 -0.095 -0.117 0.142 -0.049 -0.087 0.103 + 11.702 1.809 -1.229 -1.123 -0.003 0.085 -1.117 -0.179 -0.086 0.107 -0.003 -0.150 0.091 + 11.354 1.814 -1.289 -1.022 0.039 -0.015 -1.131 -0.124 -0.122 0.176 -0.035 -0.150 0.096 + 11.065 1.863 -1.405 -0.940 0.125 -0.079 -1.182 -0.201 -0.020 0.160 -0.013 -0.150 0.123 + 11.556 1.650 -1.434 -0.781 0.222 -0.175 -1.147 -0.309 0.046 0.110 -0.117 -0.107 0.088 + 11.669 1.496 -1.303 -0.700 0.186 -0.185 -1.254 -0.206 0.044 0.066 -0.144 -0.153 0.138 + 11.261 1.413 -1.262 -0.591 0.185 -0.201 -1.371 -0.069 0.117 -0.114 -0.057 -0.088 0.043 + 11.171 1.319 -1.260 -0.489 0.252 -0.257 -1.428 -0.080 0.073 -0.129 -0.099 -0.031 0.059 + 11.434 1.393 -1.266 -0.393 0.245 -0.243 -1.428 -0.058 0.054 -0.274 -0.056 -0.123 0.152 + 11.589 1.188 -1.226 -0.172 0.110 -0.086 -1.483 0.036 0.047 -0.389 -0.057 -0.121 0.094 + 11.320 0.957 -1.184 0.056 0.187 -0.257 -1.330 -0.006 0.096 -0.475 -0.112 -0.021 0.057 + 11.135 0.892 -1.138 0.091 0.253 -0.377 -1.319 -0.015 0.068 -0.589 -0.056 -0.029 -0.012 + 10.986 0.766 -0.946 0.214 0.255 -0.283 -1.225 0.122 -0.065 -0.556 -0.195 0.001 -0.144 + 8.340 0.463 -0.946 0.281 0.619 -0.311 -0.867 0.397 -0.176 -0.372 -0.169 0.170 -0.199 + 8.969 -0.528 -0.698 0.374 0.294 -0.248 -0.246 0.192 -0.180 -0.199 -0.198 -0.083 -0.148 + 7.974 -0.183 -0.297 0.081 0.578 -0.356 -0.222 0.195 -0.128 -0.314 -0.083 -0.008 0.025 + 7.470 -0.057 0.057 -0.144 0.490 -0.181 -0.507 0.188 -0.110 -0.243 0.045 0.011 0.055 + 9.727 -0.468 -0.518 0.090 -0.037 -0.214 -0.225 -0.018 -0.161 -0.120 -0.132 -0.054 -0.102 + 11.803 -0.559 -0.556 -0.366 -0.310 -0.478 -0.111 -0.046 -0.136 -0.266 -0.248 -0.055 -0.114 + 11.106 -0.476 -0.256 -0.032 -0.257 -0.645 -0.199 -0.138 0.089 -0.388 -0.130 -0.126 -0.059 + 11.157 -0.476 -0.725 0.059 0.162 -0.318 0.055 0.114 0.153 -0.615 -0.163 -0.122 -0.115 + 10.850 -0.158 -1.251 0.183 0.104 -0.564 -0.013 0.155 0.039 -0.383 -0.110 -0.045 -0.043 + 10.948 -0.060 -1.224 0.236 -0.028 -0.323 -0.069 0.118 -0.035 -0.157 -0.071 0.002 0.015 + 11.049 -0.010 -1.093 0.047 0.034 -0.328 -0.220 0.322 0.124 -0.207 0.076 0.136 -0.255 + 10.715 -0.353 -0.894 -0.055 -0.089 -0.234 -0.313 0.018 0.126 -0.311 -0.229 0.311 -0.237 + 10.117 -0.381 -0.707 0.188 0.187 -0.192 -0.282 0.099 0.143 -0.337 -0.397 -0.022 -0.182 + 9.755 0.046 -0.415 0.230 0.420 0.039 -0.261 0.256 0.130 -0.339 -0.460 -0.272 -0.316 + 9.667 -0.328 -0.820 -0.035 0.177 -0.101 -0.348 0.208 -0.155 -0.198 -0.188 0.023 -0.151 + 9.803 -0.394 -0.836 -0.082 0.307 -0.001 -0.286 0.123 0.104 -0.257 -0.244 -0.057 -0.227 + 9.200 -0.289 -0.496 -0.100 0.508 -0.258 -0.358 0.178 0.000 -0.161 -0.258 0.164 0.000 + 8.767 -0.154 -0.396 -0.174 0.244 -0.272 -0.328 0.224 -0.063 -0.183 -0.108 0.252 0.001 + 8.622 -0.020 -0.574 -0.122 0.523 -0.178 -0.141 0.356 0.095 -0.294 -0.479 0.044 -0.045 + 9.122 0.183 -0.406 -0.078 0.420 -0.486 -0.371 0.029 0.098 -0.172 -0.525 0.032 -0.052 + 9.001 0.452 -0.044 -0.014 0.067 -0.483 -0.490 -0.082 0.157 -0.072 -0.500 0.225 -0.206 + 5.841 0.574 -0.038 -0.011 0.006 -0.309 -0.423 -0.208 0.157 0.019 -0.326 0.233 -0.243 + 5.808 0.972 -0.127 -0.086 -0.028 -0.157 -0.234 0.104 -0.107 -0.131 -0.217 -0.029 -0.063 + 5.747 0.622 -0.076 -0.376 -0.092 -0.071 -0.262 -0.020 0.035 0.019 -0.158 0.054 0.124 + 5.143 0.231 -0.325 -0.274 0.082 0.108 -0.082 0.046 -0.084 0.049 -0.106 -0.200 -0.020 + 5.292 0.304 -0.471 -0.195 0.098 -0.116 -0.254 -0.044 -0.002 0.035 -0.022 -0.077 -0.014 + 5.212 0.227 -0.444 -0.170 0.149 0.047 -0.359 -0.119 -0.063 -0.008 0.019 0.021 -0.044 + 8.768 0.424 -1.183 -0.151 -0.127 -0.418 -0.233 -0.243 0.066 -0.082 -0.104 -0.112 0.009 + 11.577 0.178 -1.003 -0.043 -0.360 -0.495 -0.244 -0.284 0.353 -0.089 -0.107 -0.065 0.009 + 12.215 -0.226 -0.727 -0.313 0.052 -0.292 -0.110 -0.167 0.287 -0.169 -0.270 0.068 -0.078 + 13.066 -0.405 -0.243 -0.113 0.107 -0.281 -0.128 -0.022 -0.202 -0.364 -0.304 -0.080 -0.106 + 13.753 -0.071 -0.167 -0.109 0.189 -0.503 -0.191 0.075 -0.205 -0.252 -0.279 -0.152 -0.317 + 12.759 -0.299 -0.219 -0.030 0.377 -0.197 -0.039 -0.103 -0.290 -0.016 -0.255 0.070 -0.215 + 12.041 -0.708 -0.755 0.048 0.478 0.053 -0.011 -0.243 -0.261 0.044 -0.098 0.077 -0.198 + 11.872 -0.792 -1.190 -0.100 0.486 -0.093 -0.133 -0.085 -0.098 0.227 -0.028 0.018 -0.135 + 11.577 -1.030 -1.288 -0.252 0.062 -0.490 -0.347 -0.091 0.246 0.293 0.099 0.027 -0.161 + 11.508 -1.073 -1.117 -0.170 0.150 -0.533 -0.392 0.005 0.433 0.080 0.134 0.060 -0.188 + 11.167 -1.292 -1.087 -0.181 0.166 -0.459 -0.405 -0.120 0.422 0.148 0.124 0.219 -0.067 + 10.781 -1.044 -0.754 -0.169 0.213 -0.337 -0.487 -0.295 0.332 0.137 -0.050 0.037 -0.192 + 10.799 -0.881 -0.533 -0.065 0.297 -0.397 -0.380 -0.255 0.264 0.195 0.023 -0.097 -0.157 + 10.772 -0.945 -0.663 -0.191 0.177 -0.302 -0.354 -0.161 0.206 0.301 0.138 -0.202 -0.083 + 10.693 -1.191 -0.760 -0.229 0.115 -0.621 -0.300 -0.119 0.246 0.241 0.114 -0.035 -0.197 + 10.495 -1.052 -0.686 -0.058 0.177 -0.462 -0.153 -0.095 0.140 0.172 0.269 -0.117 -0.068 + 10.368 -1.248 -0.859 -0.400 0.258 -0.557 -0.211 0.010 0.148 0.202 0.214 -0.024 0.025 + 10.306 -1.057 -0.724 -0.280 0.279 -0.542 -0.238 -0.019 0.113 0.247 0.174 -0.027 -0.066 + 10.199 -1.111 -0.739 -0.380 0.113 -0.422 -0.176 -0.016 -0.004 0.334 0.251 -0.133 -0.040 + 10.366 -1.089 -0.655 -0.235 0.196 -0.627 -0.398 -0.282 -0.132 0.130 0.295 -0.103 -0.166 + 10.551 -1.027 -0.902 -0.108 0.327 -0.670 -0.418 -0.042 -0.096 -0.038 0.232 0.037 -0.368 + 10.386 -1.048 -0.884 -0.110 0.365 -0.765 -0.540 -0.067 0.011 0.005 -0.003 0.009 -0.209 + 10.231 -0.787 -0.842 -0.147 0.327 -0.543 -0.382 -0.076 0.127 -0.053 -0.121 -0.007 -0.152 + 10.445 -0.664 -0.933 -0.065 0.266 -0.680 -0.230 0.055 0.121 -0.146 -0.216 -0.142 -0.064 + 10.081 -0.834 -0.806 -0.180 -0.104 -0.568 -0.195 -0.148 0.026 -0.106 0.001 -0.056 -0.079 + 10.036 -0.759 -0.695 -0.186 0.141 -0.427 -0.214 -0.197 0.114 0.054 -0.253 -0.152 -0.203 + 9.956 -0.615 -0.593 -0.123 -0.041 -0.458 -0.274 -0.101 -0.125 -0.219 -0.220 -0.119 -0.153 + 9.998 -0.559 -0.579 -0.004 0.125 -0.631 -0.295 -0.193 -0.126 -0.270 -0.173 -0.052 -0.115 + 9.858 -0.390 -0.605 0.009 0.090 -0.539 -0.460 -0.191 -0.101 -0.249 -0.215 -0.008 -0.081 + 9.739 -0.320 -0.703 -0.040 0.068 -0.479 -0.375 -0.291 -0.083 -0.242 -0.253 -0.065 -0.075 + 9.685 -0.336 -0.602 0.001 0.160 -0.541 -0.153 -0.228 -0.177 -0.135 -0.114 0.029 -0.178 + 9.613 -0.232 -0.507 -0.028 0.128 -0.578 -0.185 -0.211 -0.075 -0.174 -0.211 -0.008 -0.148 + 9.501 -0.234 -0.515 -0.159 0.160 -0.607 -0.182 -0.186 -0.086 -0.308 -0.073 -0.042 -0.049 + 9.464 -0.205 -0.597 -0.159 0.125 -0.651 -0.160 -0.314 -0.079 -0.195 -0.067 -0.061 -0.069 + 9.339 -0.136 -0.564 -0.134 0.109 -0.659 -0.300 -0.174 -0.035 -0.046 -0.010 -0.034 -0.085 + 8.890 -0.318 -0.635 -0.201 -0.074 -0.553 -0.356 -0.069 0.024 -0.165 -0.154 0.137 -0.066 + 8.897 -0.259 -0.388 -0.126 0.112 -0.649 -0.285 -0.053 0.176 -0.288 -0.116 0.053 -0.074 + 9.255 0.077 -0.157 -0.138 0.090 -0.424 -0.133 -0.105 0.011 -0.225 -0.182 0.083 -0.155 + 9.674 0.506 -0.090 -0.058 0.212 -0.362 -0.180 -0.007 0.014 -0.322 -0.321 0.098 -0.093 + 8.761 -0.134 -0.615 -0.354 -0.005 -0.444 -0.134 0.031 0.210 -0.253 -0.084 0.059 -0.109 + 8.248 -0.428 -0.653 -0.328 -0.229 -0.555 -0.323 -0.120 0.157 -0.082 -0.051 0.030 -0.074 + 7.798 -0.221 -0.571 -0.386 -0.054 -0.601 -0.220 0.006 0.212 -0.068 -0.109 0.111 -0.162 + 7.772 -0.493 -0.646 -0.484 -0.021 -0.475 -0.207 0.056 0.226 0.129 -0.022 0.003 -0.067 + 7.950 -0.343 -0.546 -0.509 -0.432 -0.456 -0.171 0.080 0.338 0.135 0.012 -0.033 -0.058 + 8.031 -0.147 -0.462 -0.512 -0.417 -0.643 -0.256 0.030 0.405 0.080 0.036 0.072 -0.116 + 7.713 -0.227 -0.532 -0.355 -0.217 -0.721 -0.388 -0.044 0.345 0.074 0.170 0.081 -0.135 + 7.767 -0.038 -0.567 -0.499 -0.187 -0.625 -0.352 0.115 0.372 0.081 0.070 0.086 -0.112 + 8.123 0.322 -0.352 -0.212 -0.033 -0.349 -0.333 0.080 0.387 0.021 0.014 0.088 -0.223 + 7.957 0.266 -0.339 -0.073 -0.034 -0.364 -0.387 -0.013 0.360 0.050 0.052 0.155 -0.111 + 7.704 -0.054 -0.732 -0.524 -0.203 -0.217 -0.227 0.092 0.302 -0.074 -0.052 -0.049 -0.049 + 7.492 -0.119 -0.741 -0.427 -0.333 -0.201 -0.158 0.099 0.440 -0.006 -0.144 -0.070 -0.105 + 7.576 -0.127 -0.516 -0.176 -0.252 -0.334 -0.346 0.095 0.265 -0.078 -0.176 -0.183 -0.085 + 7.391 -0.390 -0.641 -0.265 -0.146 -0.315 -0.258 0.105 0.133 -0.020 -0.298 -0.282 -0.092 + 7.450 -0.101 -0.394 -0.161 0.080 -0.137 -0.129 0.129 0.126 -0.045 -0.299 -0.284 -0.272 + 8.509 0.420 0.289 0.339 0.140 -0.154 -0.252 -0.135 -0.107 -0.104 -0.165 -0.140 -0.087 + 8.362 0.177 0.262 0.076 0.105 -0.161 -0.238 -0.055 0.048 -0.023 -0.147 -0.160 -0.123 + 8.717 -0.298 -0.370 -0.165 0.002 -0.087 -0.393 -0.118 -0.031 -0.051 -0.074 0.044 -0.155 + 8.806 -0.349 -0.328 -0.272 -0.218 -0.261 -0.234 -0.224 -0.046 -0.047 -0.116 0.006 -0.032 + 9.443 -0.419 0.003 -0.213 -0.125 -0.127 -0.165 -0.177 -0.146 -0.124 -0.115 -0.034 -0.095 + 10.074 -0.288 -0.022 -0.168 -0.179 -0.048 -0.375 -0.333 -0.167 -0.203 -0.183 -0.136 -0.195 + 10.115 -0.377 -0.248 -0.249 -0.164 -0.183 -0.297 -0.277 -0.042 -0.182 -0.218 -0.102 -0.102 + 9.716 -0.364 -0.129 -0.274 -0.247 -0.062 -0.247 -0.229 0.164 0.051 -0.282 -0.163 -0.100 + 9.498 -0.395 -0.273 -0.462 -0.068 -0.020 -0.209 -0.245 0.107 -0.065 -0.262 -0.121 -0.220 + 9.644 -0.446 -0.331 -0.421 0.043 -0.295 -0.365 -0.082 -0.036 -0.202 -0.238 0.034 -0.133 + 9.931 -0.544 -0.491 -0.180 -0.034 0.041 -0.167 -0.254 0.027 -0.225 -0.232 -0.088 -0.030 + 10.164 -0.558 -0.462 -0.510 -0.283 -0.148 -0.239 -0.229 -0.056 -0.316 -0.317 -0.162 -0.088 + 9.638 -0.907 -0.566 -0.609 -0.257 -0.178 -0.145 -0.045 0.153 -0.090 -0.175 0.011 -0.133 + 9.371 -0.478 -0.394 -0.371 -0.148 -0.275 -0.304 -0.179 0.144 -0.179 -0.273 -0.019 -0.078 + 9.234 -0.601 -0.173 -0.367 -0.131 -0.293 -0.325 -0.246 0.207 0.066 -0.149 -0.006 -0.021 + 9.191 -0.386 0.175 -0.351 -0.393 -0.543 -0.105 -0.136 0.123 0.031 -0.209 -0.185 -0.035 + 9.267 -0.053 0.163 -0.321 -0.091 -0.201 -0.219 -0.273 0.198 0.027 -0.097 -0.171 -0.239 + 8.498 -0.495 -0.012 -0.544 -0.268 -0.448 -0.367 -0.199 0.379 0.105 -0.182 0.003 -0.156 + 8.402 -0.520 -0.251 -0.514 -0.238 -0.573 -0.430 -0.224 0.343 0.030 -0.225 -0.012 -0.185 + 8.575 -0.437 -0.218 -0.438 -0.219 -0.432 -0.310 -0.231 0.300 -0.023 -0.203 -0.024 -0.198 + 8.779 -0.671 -0.368 -0.336 -0.368 -0.343 -0.317 0.037 0.349 -0.015 -0.225 -0.001 -0.145 + 8.543 -0.495 -0.240 -0.242 -0.365 -0.049 0.032 0.116 0.482 0.047 -0.247 -0.048 -0.205 + 8.372 -0.253 -0.384 -0.083 -0.389 -0.277 -0.023 0.057 0.393 0.028 -0.307 -0.064 -0.138 + 8.352 -0.470 -0.358 0.093 -0.558 -0.583 -0.063 0.207 0.259 -0.016 -0.144 -0.029 -0.089 + 7.548 -0.321 -0.119 -0.070 -0.572 -0.271 -0.168 0.123 0.312 0.144 -0.038 -0.031 -0.198 + 11.486 0.663 -0.453 0.070 -0.093 -0.297 -0.307 0.121 -0.179 -0.062 -0.344 -0.077 -0.288 + 12.931 0.653 -0.381 0.021 -0.167 -0.377 -0.388 0.204 -0.217 0.018 -0.311 0.115 -0.280 + 12.308 0.430 -0.435 0.007 -0.159 -0.530 -0.511 0.155 -0.168 0.109 -0.200 0.287 -0.162 + 8.791 0.430 0.041 -0.203 0.019 -0.477 -0.631 0.223 0.013 0.122 -0.225 0.034 -0.145 + 7.720 -0.027 -0.235 -0.141 -0.237 -0.590 -0.347 0.068 0.258 0.160 -0.244 0.034 -0.141 + 7.740 -0.179 -0.420 -0.370 -0.157 -0.603 -0.418 -0.051 0.254 0.092 -0.268 0.100 -0.075 + 8.040 -0.168 -0.329 -0.319 -0.146 -0.486 -0.265 0.022 0.245 -0.089 -0.154 0.106 0.079 + 8.174 -0.295 -0.306 -0.426 -0.123 -0.661 -0.144 0.144 0.285 -0.286 -0.266 0.215 0.131 + 8.268 -0.381 -0.237 -0.471 -0.165 -0.569 -0.191 0.226 0.067 -0.253 -0.153 0.123 0.062 + 8.311 -0.504 -0.239 -0.584 -0.067 -0.475 -0.262 0.130 0.175 -0.272 -0.339 0.047 0.060 + 7.851 -0.685 -0.341 -0.470 -0.117 -0.644 -0.186 0.105 0.359 -0.264 -0.531 0.040 0.119 + 7.863 -0.655 -0.412 -0.372 -0.050 -0.264 -0.150 0.204 0.237 -0.399 -0.396 -0.128 0.046 + 7.981 -0.556 -0.464 -0.252 0.073 -0.549 -0.040 0.171 0.319 -0.285 -0.437 -0.292 0.058 + 8.104 -0.642 -0.442 -0.343 0.099 -0.390 -0.056 0.208 0.302 -0.253 -0.326 -0.205 0.077 + 8.104 -0.451 -0.242 -0.276 -0.019 -0.439 -0.078 0.191 0.271 -0.182 -0.434 -0.277 -0.090 + 7.637 -0.508 -0.389 -0.382 0.071 -0.410 -0.115 0.088 0.219 -0.365 -0.462 -0.381 -0.155 + 7.343 -0.584 -0.454 -0.442 0.065 -0.508 -0.104 0.007 0.376 -0.201 -0.326 -0.375 -0.139 + 7.511 -0.494 -0.330 -0.384 0.086 -0.491 -0.240 -0.053 0.538 -0.030 -0.282 -0.287 -0.174 + 7.427 -0.468 -0.338 -0.356 0.067 -0.602 -0.172 0.114 0.511 -0.180 -0.428 -0.369 -0.193 + 7.801 -0.166 -0.215 -0.573 0.162 -0.661 -0.325 -0.052 0.535 -0.019 -0.354 -0.254 -0.040 + 7.590 -0.220 -0.211 -0.468 0.101 -0.597 -0.284 0.051 0.548 0.110 -0.426 -0.261 0.083 + 7.557 -0.076 -0.327 -0.505 0.151 -0.410 -0.423 0.087 0.444 0.091 -0.174 -0.207 -0.040 + 6.962 -0.459 -0.477 -0.623 0.129 -0.338 -0.403 0.028 0.500 0.014 -0.019 -0.217 -0.203 + 7.017 -0.221 -0.227 -0.412 0.268 -0.510 -0.434 -0.122 0.288 -0.102 -0.070 -0.173 -0.198 + 6.895 -0.244 -0.068 -0.322 0.374 -0.343 -0.220 0.035 0.331 -0.310 -0.079 -0.193 -0.210 + 7.164 0.084 0.166 -0.270 0.282 -0.478 -0.285 -0.206 0.267 -0.074 0.012 -0.040 -0.029 + 7.484 0.077 0.207 -0.101 0.157 -0.317 -0.136 -0.244 -0.102 -0.303 -0.136 -0.001 0.052 + 7.450 -0.013 0.135 -0.042 -0.004 -0.137 -0.374 -0.370 -0.073 -0.305 -0.043 0.106 0.059 + 7.274 0.084 -0.235 -0.062 0.116 0.033 -0.242 -0.446 -0.082 -0.297 -0.060 -0.077 0.011 + 6.689 0.303 -0.067 -0.260 0.148 -0.077 -0.275 -0.122 -0.246 -0.356 -0.003 0.021 0.035 + 5.962 0.432 0.200 -0.180 0.250 -0.409 -0.384 0.045 -0.059 -0.226 -0.024 0.172 0.116 + 5.728 0.418 0.284 -0.252 0.275 -0.245 -0.251 0.152 0.124 -0.084 -0.297 -0.029 -0.044 + 5.647 0.229 -0.027 -0.108 0.019 -0.097 -0.246 -0.152 0.115 0.049 -0.161 0.085 0.200 + 5.869 0.489 -0.051 0.028 0.036 -0.047 -0.453 -0.179 -0.055 -0.116 -0.128 -0.070 -0.047 + 6.111 0.411 0.171 0.053 -0.000 -0.125 -0.265 -0.132 0.017 -0.080 -0.044 0.004 0.017 + 5.833 0.579 -0.001 0.005 0.064 -0.015 -0.315 -0.138 -0.037 0.021 -0.194 -0.016 0.017 + 5.652 0.632 0.040 -0.026 -0.124 -0.028 -0.332 -0.095 0.082 -0.068 -0.107 0.023 0.010 + 6.148 0.566 0.340 0.208 0.174 0.209 -0.360 -0.229 -0.255 -0.098 -0.125 -0.116 -0.053 + 5.936 0.697 0.041 -0.105 0.012 0.149 -0.307 -0.212 -0.392 -0.097 -0.020 -0.021 -0.022 + 5.562 0.389 0.022 -0.147 -0.102 0.035 -0.430 -0.151 -0.367 -0.081 -0.142 0.066 0.113 + 3.965 0.312 -0.164 -0.027 0.039 -0.120 -0.273 -0.060 -0.052 0.204 0.029 -0.145 -0.026 + 3.800 0.270 -0.387 0.129 -0.001 -0.231 -0.245 -0.109 -0.190 -0.083 -0.036 0.073 -0.040 + 3.836 0.540 -0.568 0.119 -0.001 -0.440 -0.329 -0.200 -0.193 0.007 -0.098 -0.063 0.255 + 3.550 0.321 -0.503 0.145 -0.071 -0.284 0.120 -0.154 -0.211 0.260 0.163 -0.150 0.078 + 4.528 -0.099 -0.309 0.277 -0.299 -0.068 -0.031 -0.286 -0.013 0.064 0.074 0.157 -0.066 + 5.192 -0.476 0.014 0.358 -0.543 -0.144 -0.265 -0.105 0.129 0.107 -0.005 0.253 -0.057 + 5.168 -0.671 0.238 0.426 -0.488 -0.169 -0.250 -0.034 0.144 0.068 0.025 0.066 -0.162 + 5.035 -0.667 0.273 0.400 -0.287 -0.059 -0.036 -0.282 0.135 0.219 0.067 0.025 -0.045 + 5.258 -0.777 0.073 0.315 -0.400 -0.285 0.018 -0.227 0.027 0.109 0.007 0.075 0.058 + 5.983 -0.703 -0.182 0.287 -0.390 -0.251 0.253 0.042 -0.137 -0.142 -0.005 0.072 -0.083 + 6.168 -0.581 -0.236 0.137 -0.402 -0.224 0.278 0.126 -0.067 -0.272 -0.116 -0.014 -0.063 + 6.170 -0.367 -0.538 0.292 -0.295 -0.114 0.088 0.162 0.110 -0.148 -0.201 0.097 0.070 + 6.792 -0.202 -0.878 0.180 -0.338 -0.237 -0.165 0.155 0.174 -0.098 -0.121 0.064 -0.169 + 6.893 -0.081 -1.285 0.119 -0.271 0.012 -0.147 0.174 0.256 -0.195 -0.067 0.176 -0.125 + 7.064 -0.129 -1.468 -0.037 -0.166 0.111 -0.343 0.019 0.132 -0.094 -0.028 0.341 0.044 + 7.473 -0.092 -1.505 0.145 -0.236 0.180 -0.465 -0.128 0.340 -0.056 -0.131 0.256 -0.063 + 7.705 -0.112 -1.502 0.123 -0.291 0.348 -0.553 -0.219 0.301 -0.167 -0.156 0.281 0.028 + 7.966 -0.097 -1.494 -0.060 -0.240 0.396 -0.473 -0.213 0.373 -0.171 -0.069 0.251 -0.009 + 8.289 -0.240 -1.255 -0.342 -0.263 0.386 -0.481 -0.255 0.233 -0.222 -0.118 0.127 -0.046 + 8.406 -0.433 -1.187 -0.523 -0.277 0.417 -0.402 -0.146 0.357 -0.124 -0.001 0.108 0.036 + 8.317 -0.458 -1.024 -0.499 -0.314 0.556 -0.461 -0.156 0.249 -0.177 0.112 0.048 0.003 + 7.979 -0.471 -0.830 -0.484 -0.456 0.622 -0.375 -0.187 0.180 -0.167 0.187 0.096 -0.141 + 7.723 -0.423 -0.691 -0.462 -0.411 0.534 -0.304 -0.146 0.204 -0.129 0.090 0.079 -0.119 + 7.335 -0.175 -0.324 -0.309 -0.403 0.346 -0.257 -0.203 0.157 -0.047 -0.076 0.097 -0.092 + 7.167 -0.025 -0.630 -0.019 -0.356 -0.116 -0.067 0.087 0.021 0.004 -0.063 0.011 -0.014 + 7.183 0.295 -0.591 0.086 -0.237 -0.249 -0.226 -0.061 0.063 0.005 -0.129 -0.106 0.007 + 6.862 0.603 -0.556 0.054 -0.234 -0.205 -0.318 -0.032 -0.004 0.058 -0.151 -0.079 -0.040 + 6.170 0.583 -0.572 0.091 -0.207 -0.071 0.058 0.073 0.053 -0.074 -0.158 -0.078 -0.169 + 7.319 1.448 -0.136 0.182 -0.213 -0.117 -0.297 -0.069 -0.060 -0.037 -0.054 -0.109 -0.132 + 7.219 1.238 0.006 0.176 -0.053 -0.159 -0.389 0.025 -0.050 0.075 -0.054 -0.088 -0.064 + 6.224 0.171 -0.650 0.696 0.302 -0.018 -0.207 0.123 -0.116 -0.078 -0.284 -0.125 -0.114 + 6.280 0.208 -0.744 0.731 0.028 -0.268 -0.225 -0.066 -0.144 -0.144 -0.128 0.119 -0.110 + 6.537 0.264 -0.652 0.743 -0.091 -0.458 -0.434 0.039 -0.112 -0.044 -0.045 0.251 -0.041 + 6.861 0.520 -0.676 0.688 -0.112 -0.582 -0.479 0.139 -0.053 -0.208 0.043 0.358 0.094 + 6.616 0.155 -0.966 0.680 0.087 -0.769 -0.794 0.167 -0.031 -0.231 0.138 0.268 0.151 + 6.722 0.417 -0.861 0.493 0.039 -0.650 -0.794 0.222 -0.031 -0.089 -0.028 0.102 0.159 + 6.640 0.543 -0.638 0.074 -0.120 -0.614 -0.903 0.150 0.042 -0.134 -0.024 0.166 0.223 + 6.251 0.610 -0.732 0.056 -0.303 -0.647 -0.750 0.008 -0.172 -0.346 -0.066 0.041 0.066 + 6.241 0.601 -0.670 0.187 -0.243 -0.470 -0.658 0.137 -0.221 -0.229 0.025 0.101 0.258 + 6.800 0.120 -0.355 0.501 0.086 -0.594 -0.578 -0.088 -0.213 -0.275 -0.039 0.048 0.004 + 7.370 -0.124 -0.245 0.575 0.240 -0.461 -0.553 -0.065 -0.189 -0.431 -0.070 0.053 -0.007 + 7.456 0.052 -0.260 0.567 0.041 -0.578 -0.499 -0.207 -0.094 -0.287 -0.169 0.067 0.101 + 7.337 -0.080 -0.374 0.559 -0.184 -0.529 -0.324 -0.222 -0.094 -0.137 -0.028 0.049 -0.010 + 6.937 -0.095 -0.446 0.605 -0.221 -0.661 -0.423 -0.288 -0.211 0.039 0.089 0.016 0.078 + 6.635 -0.185 -0.122 0.564 -0.510 -0.568 -0.185 -0.182 0.038 0.024 -0.001 0.031 0.004 + 6.758 -0.181 -0.070 0.506 -0.473 -0.489 -0.204 -0.291 -0.006 -0.198 0.136 0.160 -0.220 + 6.858 -0.481 -0.017 0.376 -0.607 -0.553 -0.179 0.000 -0.051 -0.174 0.075 0.230 -0.296 + 6.966 -0.292 0.157 0.188 -0.311 -0.720 -0.489 -0.095 -0.077 -0.061 -0.100 0.243 -0.185 + 6.315 -0.220 0.269 0.131 -0.189 -0.587 -0.579 -0.085 -0.093 -0.168 -0.041 0.204 -0.143 + 5.916 0.096 0.237 0.238 -0.107 -0.286 -0.477 0.002 -0.082 -0.430 -0.147 0.180 -0.221 + 5.183 0.296 0.219 0.118 -0.213 -0.196 -0.404 -0.157 -0.109 -0.256 -0.027 0.152 -0.153 + 4.590 0.325 -0.011 0.136 -0.084 -0.218 -0.337 -0.122 -0.082 -0.282 -0.172 0.133 -0.065 + 4.596 0.351 0.095 0.353 0.001 -0.391 -0.360 -0.350 -0.173 -0.345 -0.165 0.004 -0.063 + 4.551 0.147 0.109 0.351 0.092 -0.287 -0.361 -0.272 -0.175 -0.296 -0.077 0.019 -0.233 + 4.738 0.325 0.085 0.239 0.044 -0.257 -0.363 -0.317 -0.206 -0.287 -0.196 0.012 -0.104 + 5.109 0.184 0.185 0.136 -0.248 -0.389 -0.505 -0.283 0.015 -0.122 -0.129 -0.074 -0.212 + 5.517 -0.116 0.039 0.307 -0.404 -0.329 -0.303 -0.217 0.069 0.037 0.047 -0.072 -0.175 + 5.867 -0.298 0.193 0.366 -0.305 -0.258 -0.350 -0.369 -0.032 -0.073 0.062 0.037 -0.194 + 5.961 -0.223 0.179 -0.231 -0.079 -0.005 -0.375 -0.406 -0.013 0.015 -0.050 -0.046 -0.130 + 6.163 -0.322 0.263 -0.177 -0.236 -0.169 -0.600 -0.410 0.027 0.027 -0.162 -0.052 -0.020 + 6.382 -0.327 0.056 -0.023 -0.192 0.016 -0.404 -0.485 -0.184 -0.050 -0.127 0.017 0.098 + 6.481 -0.051 0.051 -0.110 -0.255 -0.023 -0.362 -0.522 -0.215 -0.092 -0.066 0.016 -0.010 + 4.971 0.154 -0.020 0.045 -0.129 0.039 -0.228 -0.451 -0.195 -0.140 -0.200 -0.060 -0.056 + 4.026 0.482 -0.011 0.398 -0.046 -0.295 -0.616 -0.243 0.025 -0.103 -0.152 0.075 -0.057 + 4.754 0.330 -0.208 0.198 -0.075 -0.320 -0.717 -0.126 0.099 -0.070 -0.325 0.134 -0.113 + 5.501 0.375 -0.588 -0.068 -0.278 -0.314 -0.777 0.020 0.261 -0.157 -0.484 0.203 -0.256 + 6.102 0.100 -0.619 -0.342 -0.356 -0.295 -0.742 0.106 0.324 -0.235 -0.477 0.230 -0.165 + 6.146 -0.026 -0.957 -0.466 -0.110 -0.080 -0.655 0.150 0.068 -0.282 -0.597 0.075 -0.148 + 6.491 -0.009 -0.985 -0.555 -0.145 0.005 -0.646 0.100 0.144 -0.187 -0.600 0.136 -0.209 + 6.617 -0.016 -0.989 -0.432 -0.100 0.111 -0.609 0.126 0.138 -0.199 -0.566 0.143 -0.090 + 6.610 -0.113 -1.180 -0.397 -0.305 0.282 -0.490 -0.011 0.231 -0.263 -0.404 0.156 -0.006 + 6.389 -0.104 -1.270 -0.345 -0.266 0.380 -0.408 0.032 0.268 -0.387 -0.439 0.187 -0.131 + 6.307 -0.289 -1.257 -0.532 -0.044 0.425 -0.327 0.187 0.164 -0.336 -0.556 0.348 -0.153 + 6.599 -0.126 -1.190 -0.519 -0.047 0.330 -0.410 0.153 0.101 -0.173 -0.399 0.358 -0.125 + 6.536 -0.248 -1.295 -0.611 -0.084 0.267 -0.424 -0.016 -0.018 -0.234 -0.458 0.342 -0.170 + 6.448 -0.172 -1.444 -0.564 -0.119 0.252 -0.357 -0.033 -0.023 -0.150 -0.283 0.330 -0.191 + 6.676 -0.151 -1.325 -0.633 -0.453 0.248 -0.495 -0.006 -0.007 -0.121 -0.284 0.252 -0.232 + 6.592 -0.218 -1.429 -0.579 -0.601 -0.045 -0.519 -0.107 -0.041 -0.055 -0.282 0.318 -0.275 + 6.345 -0.115 -1.275 -0.382 -0.436 -0.226 -0.504 0.097 -0.103 0.063 -0.186 0.416 -0.288 + 6.274 -0.080 -1.315 -0.463 -0.226 -0.144 -0.660 0.078 -0.143 0.044 -0.197 0.374 -0.243 + 6.260 0.001 -1.279 -0.645 -0.300 0.116 -0.451 0.039 0.087 0.033 -0.345 0.317 -0.166 + 5.977 0.276 -1.051 -0.641 -0.201 0.163 -0.329 0.152 0.219 -0.104 -0.193 0.240 -0.260 + 4.767 0.444 -0.484 -0.572 -0.080 0.094 -0.337 0.081 0.160 -0.019 -0.226 0.155 -0.124 + 4.582 0.557 -0.507 -0.502 -0.173 0.015 -0.270 -0.066 0.183 -0.076 -0.196 0.163 -0.044 + 4.648 0.425 -0.566 -0.421 -0.286 -0.057 -0.270 0.113 0.217 0.104 -0.174 0.010 -0.224 + 4.324 0.530 -0.563 -0.382 -0.196 0.038 -0.247 0.065 0.427 0.103 -0.226 -0.028 -0.157 + 3.851 0.554 -0.443 -0.095 -0.114 0.008 -0.351 0.060 0.185 0.140 0.049 0.134 -0.121 + 5.098 -0.345 -0.459 -0.112 0.025 0.337 0.134 -0.236 0.033 -0.052 0.042 -0.016 -0.075 + 8.097 -0.767 -0.589 -0.147 -0.227 0.313 0.143 -0.526 -0.042 0.062 0.089 0.018 -0.041 + 8.909 -0.657 -0.616 -0.007 -0.233 0.098 -0.036 -0.561 -0.033 -0.036 -0.202 -0.053 -0.036 + 9.168 -0.647 -0.676 -0.099 -0.264 0.099 -0.014 -0.402 0.087 0.073 0.009 0.016 0.040 + 9.092 -0.446 -0.319 -0.161 -0.198 0.145 -0.012 -0.520 -0.050 0.153 0.005 -0.021 -0.068 + 9.522 -0.322 -0.334 -0.188 -0.330 0.074 -0.176 -0.480 -0.102 -0.010 -0.151 0.024 -0.101 + 9.730 -0.447 -0.369 -0.049 -0.131 0.013 -0.336 -0.400 0.019 0.151 -0.115 -0.025 0.011 + 9.713 -0.476 -0.477 -0.095 -0.138 0.053 -0.077 -0.318 0.202 0.022 -0.034 -0.046 0.002 + 9.654 0.038 -0.322 -0.153 -0.218 -0.089 -0.183 -0.287 0.135 0.021 -0.064 -0.119 -0.033 + 8.552 0.194 -0.045 -0.212 -0.068 0.053 -0.178 -0.365 -0.201 0.063 -0.153 -0.058 0.013 + 7.567 -0.033 -0.211 -0.302 -0.155 0.123 -0.333 -0.214 -0.047 0.156 -0.010 0.017 -0.079 + 6.855 -0.073 0.099 -0.144 -0.215 -0.132 -0.222 -0.013 0.050 0.137 0.012 -0.035 -0.044 + 5.702 -0.069 0.004 -0.008 -0.106 0.078 -0.166 0.103 0.056 0.057 -0.065 -0.217 -0.041 + 4.544 -0.080 0.096 0.050 -0.181 -0.011 -0.128 -0.185 -0.032 0.059 0.023 0.007 0.062 + 4.120 -0.307 0.117 0.021 -0.249 0.069 -0.434 -0.130 0.054 0.096 -0.157 0.029 0.165 + 4.126 -0.441 -0.141 0.157 -0.171 -0.001 -0.180 0.084 -0.101 0.079 0.051 0.081 0.064 + 4.373 -0.116 0.004 0.187 -0.098 0.068 -0.200 -0.065 -0.087 0.018 -0.109 -0.093 -0.064 + 4.699 -0.135 0.116 0.074 0.031 0.074 -0.353 -0.193 0.114 0.023 -0.102 -0.044 -0.007 + 4.999 -0.356 -0.107 -0.038 -0.045 0.261 -0.143 0.027 0.150 0.050 -0.151 -0.091 -0.176 + 4.999 -0.221 0.055 0.053 -0.080 0.003 -0.135 0.140 -0.049 -0.045 -0.049 -0.049 -0.077 + 5.171 -0.188 0.036 -0.005 -0.308 -0.244 -0.361 0.001 -0.060 0.053 -0.076 -0.004 -0.023 + 5.441 0.077 0.083 -0.060 -0.254 0.030 -0.126 -0.041 -0.109 -0.159 -0.150 -0.079 -0.174 + 6.492 0.401 0.216 0.108 -0.047 0.184 0.141 0.099 -0.122 -0.093 -0.172 0.003 -0.073 + 5.691 0.216 0.331 0.153 -0.124 0.101 -0.200 0.046 -0.088 0.028 -0.089 0.005 -0.287 + 5.311 -0.147 -0.110 -0.121 -0.501 -0.170 -0.159 0.129 -0.163 -0.003 0.121 -0.060 -0.111 + 5.479 -0.128 -0.075 0.013 -0.277 -0.049 -0.208 0.037 -0.088 0.049 -0.137 -0.072 0.040 + 5.209 0.002 0.030 -0.040 -0.175 0.108 -0.103 0.005 -0.095 -0.065 -0.053 -0.041 -0.093 + 5.391 0.094 0.040 0.198 -0.114 0.080 -0.149 0.018 -0.048 -0.099 -0.110 -0.069 -0.229 + 5.678 0.549 0.422 0.386 -0.055 -0.042 -0.359 -0.185 0.085 0.132 -0.136 -0.230 -0.073 + 5.315 0.570 0.180 0.220 -0.001 0.041 -0.272 -0.396 -0.288 0.103 -0.105 -0.210 0.002 + 7.241 0.565 -0.516 -0.326 0.046 -0.240 -0.216 -0.070 -0.106 -0.114 -0.153 -0.049 -0.087 + 8.083 0.565 -0.418 -0.386 0.194 -0.263 -0.187 -0.066 -0.073 -0.185 -0.155 -0.034 -0.129 + 4.200 0.447 0.626 0.332 -0.081 -0.062 -0.201 -0.161 -0.177 0.047 -0.118 -0.226 -0.106 + 4.183 0.514 0.452 0.179 -0.023 0.092 -0.111 -0.146 -0.204 -0.056 -0.141 -0.025 -0.225 + 4.262 0.428 0.414 0.010 -0.022 0.148 0.075 0.037 -0.078 0.003 -0.167 -0.081 -0.215 + 4.363 0.286 0.149 0.043 -0.185 -0.139 -0.063 -0.012 -0.088 0.088 -0.043 -0.086 -0.111 + 5.661 -0.246 0.053 -0.229 0.047 -0.002 -0.074 0.027 -0.215 -0.079 -0.157 -0.076 -0.053 + 3.634 0.370 -0.096 0.090 0.044 -0.111 -0.126 -0.168 -0.105 -0.034 -0.098 0.046 -0.040 + 3.406 0.308 -0.111 0.195 0.082 0.017 -0.037 0.112 -0.034 -0.016 -0.066 -0.011 -0.085 + 3.639 0.530 -0.000 0.035 -0.004 -0.084 -0.143 -0.014 -0.063 -0.042 -0.088 -0.120 -0.029 + 3.674 0.410 -0.157 0.058 0.068 -0.028 -0.090 0.064 -0.172 -0.037 -0.133 -0.092 -0.004 + 4.008 0.388 -0.103 -0.104 -0.194 -0.093 -0.150 -0.169 -0.232 -0.040 -0.033 0.021 -0.028 + 3.626 0.366 -0.159 -0.011 -0.054 -0.150 -0.281 -0.065 -0.112 -0.017 -0.077 -0.029 -0.163 + 3.762 0.344 -0.207 -0.070 -0.055 -0.061 0.094 -0.083 -0.069 -0.009 0.016 0.125 0.028 + 3.682 0.337 -0.193 0.012 -0.069 -0.139 -0.011 -0.028 -0.178 -0.115 -0.205 0.048 -0.004 + 3.934 0.357 -0.166 -0.088 -0.139 -0.183 -0.077 -0.033 -0.010 0.022 0.025 -0.123 0.061 + 5.827 -0.927 0.093 -0.002 -0.151 -0.134 -0.268 -0.170 -0.147 -0.021 -0.046 -0.022 -0.091 + 5.050 -0.359 0.369 -0.013 -0.240 -0.152 -0.151 -0.157 -0.159 -0.129 -0.129 -0.064 -0.061 + 3.889 0.448 0.059 0.328 -0.294 -0.231 -0.161 -0.158 -0.117 -0.202 -0.004 0.027 0.065 + 3.504 0.509 0.246 0.031 0.007 -0.124 -0.105 -0.139 -0.217 -0.145 -0.144 -0.105 -0.057 + 3.555 0.098 -0.050 0.020 -0.057 0.067 0.054 -0.073 0.001 -0.058 -0.150 -0.067 -0.044 + 3.316 0.009 0.067 0.028 -0.021 -0.074 -0.055 -0.180 -0.218 0.092 -0.038 -0.077 -0.198 + 2.588 0.046 -0.066 0.070 0.037 -0.190 -0.049 -0.228 -0.124 -0.084 -0.087 -0.034 -0.184 + 2.696 -0.127 -0.164 0.072 -0.031 -0.094 -0.072 0.088 -0.118 0.086 -0.003 -0.049 -0.190 + 2.662 -0.129 -0.135 0.112 0.061 -0.102 -0.083 -0.027 -0.155 -0.015 -0.047 0.083 0.075 + 2.816 0.056 -0.132 0.132 -0.009 -0.137 -0.066 0.154 -0.152 -0.015 -0.148 -0.114 -0.088 + 2.465 0.054 0.089 0.233 0.025 0.018 -0.053 -0.020 -0.197 -0.108 -0.015 -0.085 -0.092 + 2.339 -0.013 -0.040 0.159 0.112 -0.052 0.068 0.128 0.010 -0.116 -0.138 -0.129 0.004 + 2.408 -0.129 -0.079 0.153 0.056 -0.046 0.270 0.165 -0.009 -0.033 -0.021 -0.034 -0.184 + 2.476 0.149 -0.015 -0.045 -0.121 0.041 -0.052 -0.012 -0.082 0.059 -0.007 0.059 -0.099 + 2.288 0.079 0.051 0.033 -0.085 0.073 -0.002 -0.097 0.017 -0.052 -0.093 -0.028 -0.050 + 2.584 -0.246 0.345 -0.250 0.032 -0.082 -0.055 0.080 -0.122 -0.083 -0.138 -0.023 -0.180 + 2.889 0.007 0.399 -0.410 0.042 0.048 -0.099 0.093 -0.137 0.028 0.065 -0.043 -0.178 + 2.697 0.560 -0.018 -0.075 -0.216 0.014 -0.117 0.002 0.028 0.046 -0.037 0.026 -0.047 + 2.677 0.364 -0.177 -0.118 -0.179 0.054 0.116 0.041 -0.090 -0.149 -0.059 -0.140 -0.141 + 2.362 0.630 0.131 -0.170 -0.336 -0.053 0.020 0.115 -0.009 -0.022 0.080 -0.066 -0.180 + 2.416 0.263 -0.019 0.009 -0.253 -0.412 -0.246 -0.038 0.083 0.022 -0.102 -0.090 -0.044 + 3.207 0.260 0.342 0.171 -0.290 -0.307 -0.036 0.125 0.083 -0.053 -0.076 -0.087 -0.283 + 4.046 0.718 0.033 -0.033 -0.293 -0.127 0.039 0.005 -0.179 -0.179 -0.034 -0.130 -0.102 + 4.169 0.348 0.036 -0.090 -0.545 -0.364 0.038 -0.047 -0.097 -0.060 -0.099 0.043 -0.101 + 4.087 0.333 0.121 0.055 -0.587 -0.206 0.172 -0.071 -0.201 -0.029 -0.153 -0.137 -0.184 + 3.768 0.903 -0.485 0.159 -0.410 -0.085 -0.045 -0.115 -0.170 -0.009 -0.009 0.009 -0.084 + 3.096 0.862 -0.023 0.237 -0.336 -0.113 -0.057 -0.167 -0.008 -0.059 -0.263 -0.131 -0.060 + 3.491 1.007 -0.344 -0.007 -0.257 -0.115 0.049 -0.151 -0.103 0.050 -0.064 -0.005 -0.083 + 3.401 1.012 -0.216 0.008 -0.330 0.017 0.124 0.021 -0.063 -0.166 -0.255 -0.005 -0.033 + 3.304 0.906 -0.223 -0.025 -0.486 -0.105 -0.032 -0.072 -0.116 -0.007 -0.150 -0.108 -0.047 + 3.838 1.188 -0.385 -0.097 -0.476 -0.113 -0.004 -0.109 0.015 -0.090 -0.155 -0.158 -0.058 + 4.023 1.151 -0.312 0.332 -0.361 -0.067 0.137 -0.230 -0.231 0.003 -0.165 -0.053 -0.176 + 3.670 0.775 0.075 0.378 -0.390 -0.239 0.011 -0.041 -0.234 0.031 -0.210 0.010 -0.079 + 3.769 1.067 -0.032 0.310 -0.569 -0.073 -0.015 -0.223 -0.091 -0.055 -0.328 0.005 0.013 + 3.544 0.729 -0.369 0.616 -0.401 -0.297 0.001 0.002 -0.099 -0.240 -0.116 0.059 0.157 + 4.263 0.939 -0.272 0.365 -0.059 -0.219 -0.102 -0.243 -0.168 -0.060 -0.019 0.064 -0.134 + 4.832 0.642 0.113 0.307 -0.062 -0.134 -0.229 -0.468 -0.150 -0.005 0.014 0.075 -0.323 + 5.135 0.512 0.107 0.165 -0.281 -0.263 -0.165 -0.262 -0.302 0.159 -0.045 0.056 -0.210 + 5.023 0.743 0.252 0.170 -0.449 -0.145 -0.112 -0.376 -0.356 0.224 -0.097 -0.080 -0.218 + 5.107 0.647 0.297 0.151 -0.472 -0.090 -0.181 -0.335 -0.376 0.240 -0.122 -0.016 -0.212 + 5.184 0.662 0.490 0.162 -0.388 -0.160 -0.161 -0.341 -0.492 0.188 -0.039 -0.074 -0.252 + 5.577 0.641 0.032 0.117 -0.307 -0.164 -0.119 -0.340 -0.429 0.145 -0.204 0.028 -0.330 + 5.635 0.574 0.006 0.088 -0.019 0.025 -0.088 -0.252 -0.474 -0.156 -0.133 0.066 -0.248 + 5.175 0.589 0.249 0.248 -0.100 -0.029 -0.257 -0.278 -0.535 -0.004 0.017 -0.012 -0.081 + 5.656 0.856 0.369 -0.027 -0.079 -0.086 0.126 0.102 -0.177 -0.122 -0.219 -0.253 -0.286 + 5.554 0.876 0.753 0.260 -0.119 -0.034 -0.014 -0.060 -0.204 -0.120 -0.298 -0.244 -0.281 + 5.034 0.594 0.357 0.021 -0.335 -0.075 -0.087 -0.209 -0.153 -0.023 -0.077 -0.041 0.010 + 4.759 0.114 0.177 0.320 0.006 -0.154 -0.268 -0.229 -0.305 -0.050 -0.144 -0.001 -0.025 + 5.308 -0.174 -0.007 0.360 -0.037 -0.308 -0.177 -0.392 -0.310 -0.061 -0.115 -0.015 0.040 + 6.806 0.002 0.066 0.277 -0.384 -0.309 -0.084 -0.293 -0.202 0.197 -0.098 -0.038 -0.078 + 8.776 0.391 0.285 0.122 -0.493 -0.088 -0.351 -0.299 -0.091 0.228 -0.063 -0.061 -0.190 + 7.438 0.157 0.252 0.537 -0.290 -0.228 0.106 -0.320 -0.206 0.129 -0.243 -0.046 -0.190 + 8.733 0.513 0.114 0.183 -0.264 -0.067 0.059 -0.198 -0.278 0.044 -0.301 -0.048 -0.203 + 9.196 0.669 0.206 0.171 -0.320 0.100 0.171 -0.305 -0.266 -0.042 -0.297 -0.016 -0.201 + 6.581 -0.102 0.418 0.403 -0.334 -0.234 0.390 -0.181 -0.189 0.157 -0.356 0.092 -0.155 + 5.843 -0.223 0.291 0.299 -0.576 -0.353 0.223 -0.502 -0.194 0.146 -0.245 0.126 0.005 + 5.539 -0.268 0.321 0.298 -0.467 -0.416 0.162 -0.634 -0.150 0.138 -0.257 0.269 -0.113 + 5.770 -0.188 0.449 0.548 -0.513 -0.322 0.052 -0.620 -0.280 0.064 -0.309 0.041 -0.116 + 6.453 -0.394 0.431 0.576 -0.511 -0.341 -0.118 -0.751 -0.286 0.139 -0.364 -0.067 -0.184 + 6.338 -0.284 0.456 0.615 -0.676 -0.450 0.088 -0.791 -0.419 -0.009 -0.420 -0.072 -0.241 + 6.539 -0.367 0.493 0.548 -0.751 -0.554 0.250 -0.523 -0.289 0.116 -0.423 -0.043 -0.298 + 6.464 -0.525 0.429 0.445 -0.920 -0.794 0.184 -0.536 -0.214 0.268 -0.214 0.035 -0.224 + 6.414 -0.446 0.237 0.271 -0.859 -0.635 0.271 -0.531 -0.069 0.250 -0.225 0.041 -0.112 + 6.376 -0.356 0.160 0.346 -0.844 -0.597 0.190 -0.625 -0.148 0.194 -0.207 -0.009 -0.067 + 6.136 -0.117 0.318 0.360 -0.553 -0.745 0.068 -0.448 -0.097 0.106 -0.441 0.024 -0.097 + 5.308 -0.144 0.451 0.248 -0.527 -0.354 0.286 -0.548 -0.228 0.082 -0.385 -0.009 -0.118 + 5.352 0.146 0.356 0.354 -0.339 -0.360 0.124 -0.226 -0.081 0.269 -0.321 -0.080 -0.198 + 5.362 0.133 0.347 0.253 -0.112 -0.182 0.123 -0.192 -0.066 -0.033 -0.122 0.016 -0.148 + 5.285 0.075 0.317 0.201 0.056 -0.201 0.030 -0.138 -0.121 0.045 -0.134 -0.088 -0.123 + 4.760 0.195 0.201 0.179 -0.137 -0.197 -0.118 -0.126 -0.191 -0.095 0.038 -0.045 -0.119 + 4.875 0.429 0.128 0.397 -0.236 -0.126 0.026 -0.211 -0.113 -0.010 -0.233 -0.048 -0.049 + 5.040 0.343 0.309 0.350 -0.085 0.032 -0.141 -0.113 -0.203 0.096 -0.180 -0.035 -0.098 + 4.982 -0.040 0.166 0.118 -0.212 0.073 0.080 -0.225 -0.055 0.077 -0.100 0.005 -0.021 + 5.294 -0.052 0.206 0.314 -0.324 -0.205 0.139 -0.309 -0.089 0.064 -0.253 -0.025 -0.198 + 5.293 -0.268 0.369 0.485 -0.329 -0.309 0.107 -0.430 -0.115 0.081 -0.230 -0.017 -0.165 + 5.460 -0.409 0.545 0.506 -0.531 -0.346 0.008 -0.522 -0.230 0.213 -0.130 0.033 -0.186 + 6.192 -0.342 0.457 0.637 -0.661 -0.616 -0.030 -0.319 -0.186 0.124 0.052 0.009 -0.268 + 6.311 -0.465 0.002 0.412 -0.412 -0.560 0.054 -0.153 -0.151 -0.083 -0.149 0.101 -0.226 + 5.902 -0.681 -0.151 0.306 -0.217 -0.384 0.227 0.075 -0.101 0.056 -0.072 0.124 -0.425 + 5.958 -0.527 -0.061 0.287 -0.084 -0.395 0.020 -0.021 -0.021 0.002 -0.063 0.088 -0.459 + 6.151 -0.374 -0.127 0.352 -0.025 -0.497 -0.047 -0.155 -0.081 -0.076 -0.083 0.155 -0.341 + 6.093 -0.313 -0.271 0.061 -0.086 -0.506 -0.012 0.048 0.019 -0.048 -0.131 0.332 -0.313 + 5.978 -0.144 -0.630 -0.248 -0.164 -0.542 -0.057 0.223 0.074 -0.135 -0.264 0.313 -0.356 + 8.921 1.368 -0.150 -0.147 -0.060 -0.265 -0.224 -0.179 -0.143 -0.204 -0.261 0.078 -0.215 + 9.458 1.318 -0.071 0.031 -0.102 -0.270 -0.187 -0.155 -0.172 -0.140 -0.193 0.082 -0.059 + 7.009 0.820 -0.028 0.157 -0.048 -0.368 -0.041 0.175 0.042 -0.294 -0.166 0.211 -0.301 + 5.719 -0.039 -0.118 -0.046 -0.123 -0.353 -0.081 0.268 0.346 -0.100 -0.257 0.312 -0.188 + 5.627 -0.128 -0.295 0.054 -0.124 -0.339 -0.193 0.380 0.191 -0.293 -0.243 0.222 -0.338 + 5.671 0.067 -0.416 -0.027 -0.227 -0.363 -0.215 0.227 -0.006 -0.185 -0.221 0.241 -0.380 + 5.764 0.449 -0.386 0.054 -0.109 -0.323 -0.317 0.229 0.231 -0.290 -0.204 0.168 -0.307 + 8.124 0.257 0.052 -0.380 -0.273 -0.362 -0.137 -0.114 -0.217 0.018 -0.243 -0.004 -0.136 + 8.400 -0.072 0.179 -0.064 -0.420 -0.352 -0.024 -0.053 -0.129 0.180 -0.200 0.032 -0.041 + 9.396 -0.409 0.331 0.033 -0.276 -0.235 -0.172 -0.009 -0.215 0.169 -0.377 -0.064 -0.037 + 5.923 0.285 0.339 0.426 -0.001 -0.323 -0.234 0.092 -0.001 0.149 -0.146 0.055 -0.095 + 5.336 0.504 0.377 0.133 -0.192 -0.309 -0.118 0.136 -0.017 -0.090 -0.070 -0.131 -0.321 + 4.933 0.330 0.209 0.122 -0.018 -0.232 -0.108 0.023 -0.160 -0.187 -0.184 0.011 -0.195 + 5.301 0.495 0.158 0.028 -0.200 -0.264 0.049 0.024 -0.057 -0.274 -0.043 -0.082 -0.281 + 5.428 0.476 0.424 0.207 -0.151 -0.152 -0.038 -0.079 -0.261 -0.174 -0.114 0.009 -0.212 + 5.325 0.368 0.373 0.128 -0.165 -0.023 -0.130 -0.117 -0.420 -0.182 -0.102 -0.100 -0.357 + 5.146 0.315 0.204 0.059 -0.178 -0.386 -0.099 -0.159 -0.294 -0.164 -0.094 -0.063 -0.180 + 4.781 0.128 0.171 0.215 -0.224 -0.345 -0.179 -0.073 -0.144 -0.002 -0.122 -0.145 -0.088 + 4.870 0.211 0.132 0.141 -0.180 -0.382 -0.055 0.040 -0.194 -0.067 -0.164 -0.225 -0.236 + 5.465 0.366 0.276 -0.086 -0.236 -0.193 -0.138 -0.124 -0.344 -0.106 -0.027 0.057 -0.112 + 5.147 0.439 0.045 -0.063 -0.160 -0.128 0.080 -0.010 -0.336 -0.248 -0.189 0.062 -0.208 + 5.417 0.407 0.090 0.019 -0.238 -0.213 0.031 -0.025 -0.163 0.151 -0.034 -0.131 -0.150 + 5.801 0.623 0.381 0.027 -0.050 -0.013 0.173 -0.034 -0.146 0.047 0.037 -0.229 -0.236 + 5.527 0.244 0.216 -0.072 -0.061 -0.049 0.034 -0.022 -0.146 0.010 -0.036 0.012 0.026 + 4.998 -0.045 0.238 -0.098 -0.201 -0.204 -0.047 0.047 -0.102 -0.118 -0.036 -0.090 -0.235 + 4.650 -0.077 0.176 0.022 -0.272 -0.197 0.032 0.111 -0.125 -0.206 -0.080 -0.179 -0.156 + 4.583 -0.024 0.232 0.064 -0.110 -0.173 -0.061 0.112 -0.010 -0.053 -0.204 -0.278 -0.107 + 4.724 -0.056 0.175 -0.034 -0.128 -0.127 -0.115 0.029 -0.217 -0.152 -0.201 -0.115 -0.073 + 4.736 -0.085 0.245 -0.000 -0.171 -0.189 -0.158 0.002 -0.020 -0.033 -0.103 -0.144 -0.105 + 4.852 -0.206 0.065 -0.338 -0.039 -0.233 -0.096 -0.054 -0.024 -0.075 -0.066 0.031 -0.235 + 4.296 -0.116 0.472 0.004 -0.191 -0.238 -0.023 0.007 -0.080 -0.079 -0.107 -0.030 -0.081 + 3.984 -0.077 0.426 -0.057 -0.240 -0.201 -0.019 0.099 0.075 -0.038 -0.068 -0.072 -0.070 + 4.179 0.132 0.277 -0.086 -0.126 0.018 0.086 -0.009 -0.213 -0.110 -0.185 -0.171 -0.176 + 3.796 -0.014 0.313 0.063 -0.133 -0.064 -0.005 0.008 -0.034 0.232 0.021 -0.098 -0.118 + 3.156 0.136 0.420 0.301 -0.149 -0.135 -0.062 0.053 -0.141 0.016 -0.082 -0.161 -0.194 + 3.562 0.196 0.483 0.120 -0.216 -0.094 -0.190 -0.042 -0.026 0.031 -0.118 -0.051 0.019 + 3.520 0.267 0.337 0.014 -0.212 -0.190 -0.043 -0.040 -0.170 -0.005 0.100 -0.054 -0.056 + 3.368 0.156 -0.020 -0.195 -0.131 -0.032 -0.169 -0.107 -0.220 -0.045 -0.122 -0.149 -0.169 + 3.070 0.144 0.020 0.032 -0.085 -0.133 -0.203 -0.057 -0.146 -0.076 -0.166 -0.230 -0.150 + 3.259 0.204 -0.073 0.219 0.048 0.018 0.015 -0.042 -0.166 -0.060 -0.119 -0.161 -0.095 + 3.001 0.179 0.103 0.321 -0.001 -0.083 -0.195 -0.050 -0.201 -0.265 -0.128 -0.132 -0.030 + 2.182 0.144 0.213 0.218 -0.019 -0.115 0.022 0.125 0.079 0.169 0.078 -0.090 0.083 + 2.222 0.219 0.172 0.132 -0.072 -0.076 0.101 0.301 0.041 -0.052 -0.096 -0.119 -0.017 + 2.556 0.189 -0.003 0.100 0.044 -0.083 0.167 0.251 -0.086 -0.132 -0.189 -0.244 -0.120 + 2.476 0.187 0.085 0.051 -0.040 -0.117 0.155 0.103 -0.093 0.014 -0.069 -0.166 -0.086 + 2.219 0.139 0.158 0.131 -0.164 -0.102 0.004 0.089 -0.255 -0.184 -0.046 -0.018 -0.105 + 2.399 0.494 0.223 0.080 -0.046 -0.049 0.093 0.032 -0.296 -0.249 -0.215 -0.054 -0.067 + 2.267 0.343 0.302 0.192 0.001 -0.003 -0.040 -0.018 -0.183 -0.098 -0.036 -0.088 -0.211 + 1.984 0.037 0.249 0.305 0.101 -0.137 0.103 -0.121 -0.333 -0.158 0.002 -0.060 -0.123 + 2.274 -0.200 0.221 0.314 -0.134 -0.186 0.075 0.104 -0.029 0.053 -0.068 -0.065 -0.029 + 2.970 0.177 0.219 0.028 -0.178 -0.177 -0.105 0.107 0.026 0.147 -0.185 -0.086 -0.159 + 3.405 0.500 0.320 0.128 -0.415 -0.003 -0.005 0.003 -0.113 -0.006 0.010 -0.019 -0.132 + 5.111 0.267 0.630 0.390 -0.505 -0.163 0.062 -0.028 -0.221 -0.015 -0.105 -0.025 -0.114 + 5.130 0.045 0.342 0.644 -0.437 -0.253 -0.020 -0.156 -0.099 0.067 -0.049 0.003 -0.097 + 5.543 -0.160 0.232 0.768 -0.433 -0.160 -0.041 -0.191 -0.163 0.026 -0.020 0.066 -0.053 + 5.992 0.051 0.209 0.483 -0.445 -0.306 -0.175 -0.156 -0.252 0.040 -0.037 -0.064 -0.215 + 6.578 0.202 0.385 0.534 -0.389 -0.303 0.113 -0.008 0.038 0.055 -0.091 -0.126 -0.242 + 7.099 0.859 0.563 0.251 -0.406 -0.116 0.098 -0.276 -0.208 -0.244 -0.102 0.025 -0.078 + 7.640 0.634 0.335 0.224 -0.379 -0.045 -0.080 -0.188 -0.224 -0.075 -0.233 0.048 -0.116 + 7.988 0.658 0.072 0.150 -0.101 -0.166 -0.181 -0.301 -0.207 -0.074 -0.359 0.021 -0.005 + 8.378 0.862 0.216 0.187 0.018 -0.077 -0.200 -0.335 -0.376 -0.032 -0.381 -0.086 -0.037 + 6.994 -0.013 0.164 0.132 -0.103 -0.331 -0.381 -0.156 -0.096 -0.170 -0.230 -0.013 -0.038 + 7.873 -0.618 -0.091 -0.038 -0.113 -0.328 -0.059 -0.153 -0.169 0.093 -0.181 -0.007 -0.055 + 7.023 -0.459 0.153 0.090 -0.096 -0.286 -0.183 -0.138 -0.078 0.058 -0.165 -0.017 0.003 + 6.218 -0.657 0.413 0.350 0.179 -0.005 -0.361 -0.146 -0.267 -0.199 -0.256 0.086 0.080 + 7.080 -0.648 0.449 0.198 0.045 -0.121 -0.176 -0.003 -0.174 0.008 -0.039 -0.057 0.063 + 6.624 -0.305 0.588 0.005 -0.027 -0.056 -0.221 0.093 -0.094 -0.031 -0.162 -0.171 -0.124 + 6.279 -0.391 0.495 0.078 -0.149 -0.155 -0.310 0.034 -0.282 -0.113 -0.158 -0.091 -0.177 + 5.395 -0.418 0.582 0.197 -0.063 -0.005 -0.065 -0.052 -0.292 -0.140 -0.251 -0.029 -0.090 + 4.458 -0.142 0.344 0.140 -0.029 -0.075 -0.261 -0.061 -0.091 -0.106 -0.074 -0.026 -0.069 + 4.754 0.114 0.404 0.102 0.234 0.296 -0.018 -0.026 -0.046 -0.211 -0.166 -0.030 -0.115 + 4.436 0.026 0.355 0.144 0.089 0.054 -0.065 -0.004 -0.109 -0.051 -0.201 -0.104 -0.187 + 4.259 -0.155 0.224 0.170 0.019 0.000 -0.025 -0.016 -0.030 -0.053 -0.245 -0.321 -0.265 + 5.339 0.502 0.179 -0.067 -0.079 -0.141 -0.366 -0.204 -0.141 -0.146 -0.156 -0.156 -0.261 + 5.553 1.092 0.540 -0.068 -0.136 -0.202 -0.344 -0.293 -0.111 -0.054 -0.077 -0.004 -0.133 + 3.915 -0.157 0.555 0.023 0.106 -0.020 -0.140 -0.200 -0.056 0.008 0.054 0.072 0.022 + 3.721 -0.231 0.092 -0.123 -0.197 -0.115 -0.127 -0.169 -0.100 -0.013 0.138 0.151 -0.081 + 3.791 -0.155 0.182 -0.035 -0.222 -0.121 -0.078 -0.115 0.045 -0.054 0.062 0.068 -0.043 + 3.210 -0.221 0.103 0.038 0.015 -0.144 -0.109 -0.086 -0.056 0.093 0.174 0.115 -0.040 + 3.466 -0.181 0.268 0.092 -0.057 -0.197 0.007 -0.043 -0.037 -0.005 0.004 -0.007 -0.024 + 3.484 -0.205 0.264 0.156 0.024 -0.125 -0.081 -0.149 -0.135 -0.086 -0.024 -0.065 -0.003 + 3.269 0.348 0.292 0.200 -0.037 -0.135 -0.066 -0.107 -0.225 -0.113 -0.130 0.130 -0.001 + 3.249 0.146 0.236 0.141 -0.142 0.000 -0.062 -0.105 -0.136 -0.122 0.055 0.052 -0.232 + 3.156 -0.006 0.156 0.094 -0.290 0.121 0.108 0.109 -0.011 -0.048 0.012 0.139 0.026 + 3.427 0.034 0.143 0.111 -0.188 -0.179 -0.159 -0.083 -0.063 -0.002 0.069 0.095 0.003 + 3.361 0.276 0.458 0.168 -0.109 0.004 -0.111 -0.167 -0.055 0.001 -0.050 0.046 -0.076 + 2.624 0.229 0.407 0.011 -0.195 -0.127 -0.005 -0.001 -0.062 -0.201 -0.013 0.128 -0.025 + 2.776 0.250 0.440 -0.035 -0.123 -0.153 0.009 0.082 -0.151 -0.156 0.081 0.137 -0.034 + 2.771 -0.062 0.376 0.002 -0.075 -0.151 -0.132 0.195 0.065 -0.114 0.003 0.142 -0.028 + 2.937 0.268 0.437 0.019 -0.078 -0.072 0.076 -0.038 -0.210 0.005 -0.206 -0.209 -0.020 + 3.002 0.352 0.423 -0.177 -0.196 0.101 0.085 -0.171 -0.313 -0.071 -0.082 -0.052 0.012 + 3.313 -0.011 0.742 -0.142 -0.079 -0.032 -0.116 0.048 -0.022 -0.091 -0.151 -0.069 -0.056 + 3.306 -0.303 0.679 -0.021 0.091 -0.108 -0.280 -0.008 -0.040 -0.155 -0.122 -0.038 -0.060 + 3.311 -0.518 0.510 -0.111 0.218 0.113 -0.284 -0.013 -0.109 -0.065 -0.099 0.004 0.081 + 3.633 -0.547 0.508 0.142 0.109 0.064 -0.190 -0.052 -0.246 -0.066 -0.280 -0.103 0.164 + 3.706 -0.654 0.361 0.150 -0.022 -0.004 -0.175 0.002 -0.158 0.185 0.091 0.150 0.030 + 4.412 -0.807 0.386 0.159 0.016 -0.008 0.024 -0.022 0.027 0.108 -0.016 0.004 -0.104 + 4.669 -0.964 0.100 -0.018 0.047 -0.049 -0.093 -0.173 -0.172 -0.080 0.032 -0.005 -0.043 + 4.248 -0.558 0.099 0.116 -0.159 0.019 -0.044 -0.036 -0.119 -0.046 -0.031 -0.188 -0.139 + 3.466 -0.630 -0.018 0.209 -0.188 0.070 -0.002 -0.006 -0.082 -0.056 -0.185 -0.139 -0.176 + 3.811 -0.280 -0.004 0.140 -0.550 -0.330 -0.251 0.057 0.003 0.038 -0.041 0.133 -0.103 + 3.030 0.551 0.335 0.019 -0.311 -0.376 -0.074 0.172 -0.099 -0.140 -0.235 -0.015 0.085 + 2.894 -0.090 0.350 0.096 -0.156 0.105 -0.055 0.147 -0.093 -0.133 -0.103 -0.050 0.066 + 3.833 0.521 0.601 0.049 -0.494 0.145 -0.180 -0.048 -0.038 -0.042 -0.011 0.069 -0.063 + 4.293 0.774 0.599 -0.133 -0.459 0.144 0.033 -0.003 0.019 -0.046 -0.020 0.037 -0.062 + 4.701 0.792 0.495 0.055 -0.426 -0.011 0.029 0.067 -0.109 0.009 -0.159 0.068 -0.034 + 5.585 0.558 0.338 -0.091 -0.463 0.112 0.016 0.012 -0.093 -0.061 -0.018 -0.060 -0.203 + 6.504 0.396 0.348 0.140 -0.349 -0.037 -0.014 -0.243 -0.123 -0.058 -0.113 -0.038 -0.136 + 7.117 0.233 0.087 0.083 -0.231 -0.103 -0.087 -0.254 -0.102 -0.063 -0.077 -0.081 -0.089 + 6.814 0.124 0.238 -0.094 -0.239 0.027 -0.088 -0.024 -0.056 -0.100 -0.158 -0.012 -0.097 + 6.559 0.198 0.121 -0.154 -0.291 0.124 -0.101 -0.018 0.058 -0.057 -0.240 0.145 -0.017 + 6.634 0.355 -0.020 0.018 -0.297 0.057 -0.141 -0.009 -0.088 -0.060 -0.166 0.148 -0.078 + 6.858 0.305 0.175 0.066 -0.218 0.003 0.022 -0.194 -0.245 -0.039 -0.233 -0.020 -0.176 + 6.170 -0.045 0.307 0.410 -0.149 -0.207 -0.357 -0.137 -0.034 0.072 -0.057 0.055 -0.140 + 6.978 -0.768 0.109 -0.075 -0.388 -0.425 -0.344 -0.120 0.042 0.200 0.019 0.296 0.237 + 7.741 -0.393 0.274 -0.028 -0.257 -0.095 -0.174 0.011 -0.045 0.080 0.019 -0.067 0.007 + 7.812 -0.265 0.292 0.120 -0.258 -0.194 -0.230 -0.170 -0.203 -0.098 -0.040 -0.039 -0.068 + 7.930 -0.529 0.147 0.156 -0.234 -0.093 -0.178 -0.361 -0.155 -0.054 0.046 0.055 -0.116 + 7.816 -0.595 -0.001 0.110 -0.331 -0.066 -0.135 -0.200 -0.043 0.055 0.055 0.108 0.007 + 7.462 -0.599 0.047 -0.102 -0.497 -0.145 -0.136 -0.306 -0.185 0.076 0.003 -0.090 0.047 + 7.825 -0.548 -0.017 0.096 -0.383 -0.113 -0.170 -0.356 -0.153 0.001 -0.121 0.015 -0.098 + 7.894 -0.568 0.024 0.084 -0.536 -0.363 -0.159 -0.303 -0.094 -0.146 -0.106 0.083 -0.048 + 7.239 -0.737 -0.171 0.061 -0.611 -0.311 -0.082 -0.324 -0.088 -0.014 0.031 0.080 -0.058 + 6.928 -0.673 0.004 0.069 -0.271 -0.127 0.120 -0.377 -0.092 0.027 0.018 -0.125 -0.077 + 6.764 -0.750 -0.255 0.118 -0.265 -0.269 0.129 -0.241 -0.102 -0.058 0.028 0.032 -0.079 + 6.881 -1.118 -0.340 0.154 -0.409 -0.269 0.132 -0.349 -0.127 -0.111 -0.019 0.035 -0.001 + 6.332 -1.373 -0.466 0.109 -0.047 -0.212 -0.191 -0.417 -0.122 -0.056 0.082 0.188 -0.057 + 6.226 -0.954 -0.309 0.155 -0.065 -0.105 -0.263 -0.341 -0.175 -0.022 0.004 0.148 -0.098 + 5.673 -0.772 -0.257 0.185 0.008 0.128 -0.178 -0.455 -0.359 -0.026 -0.025 0.123 -0.033 + 5.136 0.023 -0.205 -0.066 -0.400 -0.186 -0.081 -0.048 0.051 -0.007 -0.079 0.048 -0.011 + 4.349 0.190 0.256 -0.182 -0.556 -0.042 0.026 -0.114 -0.095 0.015 -0.057 -0.026 -0.016 + 4.392 0.823 0.243 -0.027 -0.260 -0.172 -0.409 -0.236 -0.201 -0.101 -0.115 0.014 -0.107 + 6.357 1.130 -0.314 -0.080 -0.417 0.027 -0.432 -0.411 -0.053 -0.063 -0.167 -0.014 0.010 + 6.970 1.208 -0.516 0.001 -0.530 0.115 -0.509 -0.507 -0.029 -0.002 -0.185 -0.057 0.088 + 7.363 0.988 -0.384 -0.036 -0.533 0.157 -0.477 -0.548 -0.029 0.072 -0.209 -0.063 0.098 + 7.156 1.100 -0.423 0.055 -0.538 0.151 -0.417 -0.609 0.004 0.040 -0.197 -0.043 0.075 + 6.862 1.182 -0.363 0.082 -0.469 0.087 -0.355 -0.673 -0.032 0.023 -0.175 -0.018 0.039 + 6.614 1.105 -0.205 0.065 -0.332 0.072 -0.310 -0.588 -0.139 0.011 -0.168 -0.053 -0.029 + 6.245 1.006 -0.188 0.109 -0.184 0.135 -0.256 -0.548 -0.167 -0.017 -0.292 -0.025 -0.034 + 5.293 0.931 0.048 0.211 -0.105 0.008 -0.020 -0.399 -0.110 -0.069 -0.349 -0.221 0.029 + 4.587 0.605 0.210 0.263 0.018 0.063 -0.117 -0.315 -0.036 -0.088 -0.217 0.013 0.025 + 4.307 0.630 0.295 -0.071 -0.018 -0.104 -0.371 -0.279 -0.033 -0.071 -0.018 0.063 0.095 + 3.913 0.511 0.297 0.177 0.008 -0.196 -0.370 -0.286 0.043 -0.030 -0.063 0.028 0.085 + 3.838 0.487 0.257 0.094 0.018 -0.181 -0.324 -0.248 -0.177 0.014 0.073 0.169 0.049 + 3.788 0.395 -0.003 -0.033 -0.044 0.082 -0.225 -0.210 -0.080 0.035 0.030 0.058 0.051 + 3.883 0.511 0.181 -0.036 -0.205 0.033 -0.319 -0.218 -0.007 -0.004 0.055 0.089 0.060 + 4.124 0.615 0.089 -0.051 -0.051 0.128 -0.112 -0.202 -0.018 -0.006 -0.026 -0.036 0.015 + 4.680 0.725 0.071 -0.217 -0.105 0.046 -0.051 -0.113 -0.123 0.141 0.086 -0.014 0.057 + 5.111 1.014 -0.146 -0.273 -0.108 0.084 0.045 -0.042 -0.002 0.196 -0.052 -0.068 0.018 + 5.374 1.188 -0.407 -0.303 -0.145 0.073 0.119 -0.051 -0.095 0.345 -0.036 -0.180 -0.076 + 5.635 1.288 -0.626 -0.275 -0.069 0.118 -0.062 -0.094 -0.046 0.257 -0.137 -0.131 -0.010 + 5.540 1.237 -0.459 -0.311 -0.235 0.088 -0.065 -0.105 -0.093 0.274 -0.090 -0.165 0.073 + 5.221 1.022 -0.428 -0.190 -0.156 -0.059 -0.136 -0.042 -0.071 0.253 -0.047 -0.022 0.075 + 4.769 0.828 -0.343 0.125 -0.258 -0.152 -0.191 -0.118 -0.027 0.118 0.052 0.024 0.140 + 4.222 0.722 -0.057 0.352 -0.247 -0.064 -0.080 -0.137 -0.044 0.254 0.153 0.002 0.126 + 2.984 0.700 0.022 0.121 -0.250 -0.060 -0.053 -0.088 -0.099 0.206 -0.003 -0.054 -0.091 + 3.164 0.624 -0.066 0.113 -0.129 0.009 0.084 -0.078 -0.101 0.149 0.035 0.115 0.057 + 2.594 0.752 0.208 0.238 0.096 -0.017 -0.055 0.012 0.097 0.071 -0.056 0.090 0.055 + 2.532 0.637 -0.102 0.091 0.124 0.194 -0.177 -0.069 0.076 0.075 -0.042 0.080 -0.041 + 2.547 0.630 -0.113 -0.018 -0.101 0.017 -0.202 -0.152 -0.099 -0.101 0.011 -0.040 -0.054 + 2.318 0.579 0.023 0.234 -0.069 -0.067 -0.245 -0.153 -0.007 -0.068 0.043 -0.011 -0.025 + 2.488 0.794 0.136 0.230 0.068 0.017 -0.057 -0.205 -0.227 0.027 0.129 -0.029 -0.039 + 2.508 0.860 -0.157 -0.015 0.061 -0.024 -0.163 -0.128 -0.031 0.174 0.051 -0.027 0.063 + 4.676 0.138 0.522 0.283 -0.076 0.201 -0.028 -0.332 -0.078 -0.094 -0.043 -0.217 -0.001 + 7.203 -0.275 0.041 0.293 0.147 0.272 -0.280 -0.395 -0.036 0.016 -0.006 -0.370 0.042 + 5.045 -0.473 -0.294 0.107 0.017 0.310 -0.153 -0.255 0.178 0.263 0.245 -0.252 -0.062 + 2.324 0.045 0.001 0.126 -0.004 0.167 -0.040 0.002 -0.010 0.096 0.132 0.015 0.072 + 3.307 -0.182 0.240 -0.110 0.073 0.084 -0.025 -0.190 -0.260 -0.015 0.013 0.006 0.059 + 3.561 -0.280 -0.012 0.080 0.178 -0.008 -0.074 -0.106 -0.142 -0.121 -0.097 0.007 0.034 + 4.947 -1.007 0.008 0.251 -0.134 -0.071 0.100 -0.298 0.049 0.132 0.040 -0.009 -0.037 + 5.578 -0.799 0.039 0.245 -0.422 0.038 0.111 -0.304 -0.132 0.131 -0.000 -0.059 -0.141 + 5.691 -1.347 -0.168 0.295 -0.201 0.229 -0.016 -0.161 -0.043 0.178 0.080 0.081 -0.090 + 5.143 -0.731 -0.009 0.338 -0.002 0.099 0.021 -0.118 -0.188 0.112 0.055 -0.147 -0.017 + 5.459 -0.137 0.127 0.124 0.164 -0.172 -0.207 -0.406 -0.241 0.219 -0.042 -0.117 -0.044 + 5.051 -0.133 0.480 0.110 -0.155 -0.207 -0.142 -0.131 0.069 0.027 0.026 0.009 -0.016 + 4.669 0.228 0.446 0.190 0.017 -0.235 -0.208 -0.187 -0.090 -0.067 -0.053 -0.123 -0.010 + 4.057 0.043 -0.063 0.224 0.023 -0.023 -0.136 -0.225 -0.031 -0.129 -0.113 -0.061 0.017 + 4.153 -0.115 0.087 0.141 -0.042 -0.040 -0.067 -0.144 -0.132 -0.025 -0.106 -0.167 -0.048 + 3.881 0.244 0.094 0.039 -0.193 -0.069 0.049 -0.169 -0.076 -0.070 -0.084 -0.158 -0.223 + 3.827 0.060 0.082 0.011 -0.293 -0.093 0.039 -0.157 -0.186 -0.075 -0.100 0.042 -0.061 + 3.049 0.127 0.005 0.121 -0.033 0.081 -0.070 -0.114 -0.084 0.038 0.030 -0.013 0.055 + 2.838 0.290 0.140 0.035 -0.256 -0.003 -0.123 -0.123 -0.191 -0.123 -0.024 0.074 -0.170 + 3.102 -0.352 -0.064 0.147 -0.294 0.066 -0.218 -0.169 -0.060 -0.143 -0.104 0.103 0.026 + 3.594 -0.337 -0.058 0.011 -0.191 0.112 0.076 -0.165 -0.006 0.041 0.034 0.015 -0.028 + 3.861 -0.110 0.140 -0.247 -0.245 0.188 0.100 -0.117 -0.030 0.028 -0.074 0.043 0.068 + 4.725 -1.152 0.097 0.129 0.135 0.176 -0.176 -0.205 -0.137 0.050 0.049 -0.006 -0.015 + 4.122 -0.846 0.166 0.081 -0.111 -0.015 -0.147 -0.142 -0.011 0.134 0.042 0.049 -0.009 + 5.079 0.374 0.648 -0.004 -0.437 -0.294 -0.348 -0.095 -0.286 -0.135 -0.131 -0.037 0.001 + 4.699 -0.083 0.319 0.268 -0.135 -0.305 -0.210 -0.270 -0.264 0.084 -0.073 0.057 -0.084 + 6.671 -0.294 0.112 0.157 -0.436 -0.426 -0.183 -0.155 -0.277 0.085 0.009 -0.096 0.126 + 6.744 -0.340 0.201 0.220 -0.646 -0.353 -0.174 -0.298 -0.125 0.122 -0.065 -0.144 0.000 + 6.004 -0.337 0.228 0.667 -0.852 -0.407 -0.300 -0.291 -0.249 0.070 0.049 0.049 -0.178 + 5.859 -0.261 0.114 0.546 -0.976 -0.452 -0.280 0.045 -0.269 0.030 -0.033 0.050 -0.117 + 4.280 -0.261 0.065 0.442 -0.329 -0.236 -0.274 -0.010 -0.225 0.081 -0.100 -0.027 -0.171 + 3.499 -0.133 0.306 0.265 -0.378 -0.387 -0.220 -0.066 -0.219 0.085 -0.173 -0.011 -0.020 + 3.678 0.054 0.627 0.303 -0.284 -0.312 -0.180 -0.210 -0.245 -0.067 0.034 0.003 0.009 + 3.558 0.398 0.452 0.416 -0.341 -0.087 -0.131 -0.019 -0.253 -0.200 -0.096 -0.072 -0.054 + 3.218 0.080 0.293 0.256 -0.200 -0.180 -0.036 -0.066 -0.127 -0.110 -0.365 -0.098 -0.028 + 4.018 0.109 0.238 0.065 -0.400 -0.253 -0.075 -0.205 -0.169 -0.100 -0.204 0.051 0.032 + 3.764 -0.393 0.289 0.158 -0.352 -0.280 -0.165 -0.245 -0.103 -0.253 0.099 0.249 0.005 + 4.980 -0.141 -0.114 0.484 -0.273 -0.579 -0.512 -0.409 -0.025 -0.258 -0.012 0.313 0.143 + 6.295 -0.396 -0.512 0.291 -0.515 -0.537 -0.723 -0.476 -0.068 -0.306 -0.151 0.417 0.089 + 7.133 -0.316 -0.370 0.176 -0.517 -0.349 -0.742 -0.307 0.032 -0.199 -0.330 0.442 -0.089 + 7.336 -0.299 -0.411 0.054 -0.653 -0.367 -0.850 -0.221 0.143 -0.039 -0.331 0.416 -0.200 + 7.280 -0.361 -0.429 -0.023 -0.648 -0.268 -0.690 -0.083 0.292 0.099 -0.427 0.300 -0.243 + 7.417 -0.088 -0.293 0.024 -0.643 -0.325 -0.720 -0.125 0.328 0.191 -0.456 0.215 -0.162 + 7.198 0.049 -0.390 -0.278 -0.764 -0.329 -0.690 -0.212 0.283 0.084 -0.469 0.217 -0.161 + 7.052 0.190 0.290 -0.344 -0.539 -0.236 -0.627 -0.121 0.150 -0.040 -0.094 0.255 -0.240 + 6.580 0.320 -0.003 -0.188 -0.354 -0.206 -0.751 -0.195 0.065 0.034 -0.250 0.332 -0.184 + 5.668 0.702 -0.286 -0.186 -0.312 -0.134 -0.456 -0.229 0.083 0.057 -0.110 0.059 -0.123 + 4.932 0.622 -0.234 -0.138 -0.239 -0.098 -0.346 -0.012 0.214 0.046 -0.279 0.033 -0.114 + 4.961 0.754 0.036 0.007 -0.371 -0.229 -0.284 -0.181 -0.035 0.196 -0.197 0.083 -0.135 + 4.674 0.591 -0.116 -0.002 -0.168 -0.102 -0.208 -0.228 -0.273 -0.079 -0.146 -0.038 -0.187 + 4.504 0.520 -0.346 -0.172 -0.203 -0.305 -0.328 -0.320 -0.203 0.037 -0.128 -0.109 -0.117 + 4.581 0.378 -0.243 -0.176 -0.380 -0.151 -0.271 -0.269 -0.099 0.073 -0.069 -0.057 0.036 + 4.800 0.415 -0.366 -0.149 -0.412 -0.167 -0.309 -0.366 -0.231 0.072 -0.115 -0.019 0.024 + 4.918 0.375 -0.143 -0.121 -0.251 -0.253 -0.309 -0.300 -0.070 0.016 -0.167 0.017 -0.064 + 5.145 0.431 -0.040 0.007 -0.166 -0.105 -0.230 -0.098 -0.147 -0.030 -0.253 -0.046 -0.082 + 5.224 0.430 -0.180 0.029 -0.153 -0.006 -0.179 -0.284 -0.216 -0.158 -0.227 0.024 -0.015 + 5.419 0.585 0.074 -0.330 -0.193 -0.161 -0.212 -0.268 -0.192 -0.059 -0.157 -0.069 0.006 + 5.098 0.842 0.146 -0.219 -0.391 -0.124 -0.299 -0.273 -0.162 -0.054 -0.180 -0.095 0.056 + 7.142 -0.230 0.052 -0.195 -0.280 -0.323 -0.208 -0.201 -0.199 -0.046 -0.131 0.082 0.025 + 6.151 -0.045 -0.045 -0.475 -0.586 -0.429 -0.217 -0.162 -0.211 -0.091 -0.186 0.027 0.028 + 5.167 0.806 -0.022 -0.482 -0.507 0.222 -0.326 0.003 -0.156 -0.284 -0.168 -0.162 -0.137 + 5.030 0.908 -0.043 -0.460 -0.492 0.058 -0.296 -0.031 -0.098 -0.069 -0.127 -0.089 -0.179 + 5.204 1.054 -0.338 -0.661 -0.384 0.072 -0.372 -0.110 -0.176 0.085 -0.020 -0.045 -0.142 + 5.774 0.992 -0.496 -0.646 -0.330 0.294 -0.485 -0.136 -0.051 0.117 -0.119 -0.096 -0.190 + 5.985 0.511 -0.687 -0.434 -0.322 0.297 -0.434 -0.026 0.033 0.025 -0.240 -0.152 -0.319 + 6.631 0.057 -0.906 -0.422 -0.706 0.045 -0.420 0.183 0.203 -0.016 -0.275 0.086 -0.011 + 7.081 0.003 -0.948 -0.167 -0.703 -0.132 -0.542 0.199 0.215 -0.071 -0.273 0.185 -0.151 + 7.443 -0.241 -0.861 -0.108 -0.699 -0.216 -0.401 0.380 0.122 0.031 -0.216 0.260 -0.121 + 7.029 -0.468 -0.795 -0.007 -0.828 -0.438 -0.249 0.187 -0.033 0.124 -0.147 0.026 -0.268 + 6.851 -0.399 -0.523 0.238 -0.722 -0.444 -0.133 0.136 -0.123 0.252 -0.233 0.013 -0.167 + 6.518 -0.542 -0.391 0.325 -0.849 -0.515 -0.165 0.025 -0.263 0.041 -0.123 0.151 -0.010 + 5.837 -0.691 -0.276 0.445 -0.606 -0.439 0.068 -0.001 -0.161 0.018 -0.099 0.143 -0.056 + 4.787 -0.302 -0.531 0.339 -0.373 -0.118 0.133 -0.195 -0.217 0.018 -0.111 0.048 -0.045 + 5.231 -0.386 0.046 0.162 -0.183 -0.127 -0.205 -0.125 -0.029 -0.089 -0.181 -0.112 0.035 + 5.395 -0.297 0.238 -0.073 0.017 -0.052 -0.266 -0.154 -0.041 -0.103 -0.216 -0.014 -0.000 + 7.059 -0.524 0.269 0.189 -0.136 -0.107 -0.463 -0.300 -0.158 -0.148 -0.147 -0.160 -0.109 + 7.809 -0.833 0.062 0.285 -0.021 0.036 -0.293 -0.263 -0.182 -0.160 -0.052 0.005 -0.155 + 7.348 -0.494 -0.047 0.027 -0.006 -0.055 -0.283 -0.179 -0.052 -0.022 0.070 -0.119 -0.096 + 7.404 -0.249 -0.131 -0.169 -0.165 -0.044 -0.106 -0.296 -0.107 0.020 -0.079 -0.259 -0.069 + 6.272 -0.079 -0.373 0.033 -0.560 0.048 -0.040 -0.068 -0.135 0.041 -0.112 -0.168 -0.048 + 6.330 -0.222 -0.337 0.202 -0.533 -0.231 -0.251 -0.344 -0.268 -0.103 0.001 0.143 -0.089 + 8.061 -0.382 -0.307 0.215 -0.327 -0.145 -0.306 -0.199 -0.030 0.086 -0.003 0.088 -0.130 + 6.348 -0.491 -0.230 0.190 -0.269 -0.014 -0.170 0.005 -0.268 0.062 0.054 0.093 -0.072 + 4.904 0.035 -0.099 0.268 -0.221 -0.120 -0.078 -0.199 -0.311 0.062 0.058 0.031 -0.054 + 5.724 -0.532 -0.106 0.480 -0.667 -0.167 -0.127 -0.038 -0.173 0.086 0.120 0.047 -0.024 + 5.912 -0.377 -0.104 0.376 -0.503 -0.080 -0.301 -0.119 -0.274 -0.027 0.037 0.154 -0.028 + 6.215 -0.425 -0.332 0.235 -0.492 -0.172 -0.220 -0.253 -0.235 0.204 -0.073 -0.022 -0.177 + 6.143 -0.353 -0.086 0.414 -0.327 -0.084 -0.107 -0.422 -0.444 -0.007 -0.341 -0.128 -0.134 + 6.750 -0.517 -0.114 0.366 -0.109 -0.008 -0.209 -0.323 -0.386 -0.139 -0.247 -0.039 -0.144 + 6.519 -0.634 0.045 0.442 -0.062 -0.114 -0.119 -0.185 -0.265 -0.201 -0.179 -0.159 -0.343 + 5.984 -0.391 0.384 0.257 -0.245 -0.010 -0.114 -0.356 -0.333 -0.027 -0.257 -0.080 -0.140 + 5.465 -0.429 0.563 0.486 -0.370 -0.044 -0.070 -0.365 -0.273 0.173 -0.258 -0.074 -0.138 + 5.140 -0.508 0.462 0.353 -0.305 -0.044 0.149 -0.333 -0.369 0.039 -0.518 -0.168 -0.091 + 5.225 -0.289 0.676 0.522 -0.363 -0.145 0.204 -0.187 -0.311 0.039 -0.514 -0.194 -0.158 + 6.751 0.021 0.352 0.273 -0.551 -0.124 -0.042 -0.262 -0.277 0.071 -0.301 0.012 -0.017 + 7.111 0.190 0.410 -0.229 -0.611 -0.059 -0.145 -0.375 -0.340 -0.159 -0.189 -0.043 -0.026 + 6.815 0.239 0.224 -0.125 -0.603 0.018 -0.190 -0.369 -0.282 -0.045 -0.230 0.035 -0.078 + 4.886 0.124 0.272 0.008 -0.602 0.021 -0.173 -0.296 -0.241 -0.075 -0.024 -0.057 -0.106 + 4.974 -0.088 0.438 0.161 -0.480 -0.152 -0.325 -0.454 -0.265 -0.133 -0.048 0.133 -0.010 + 4.834 -0.168 -0.012 0.120 -0.623 -0.052 -0.241 -0.257 -0.054 0.105 -0.039 0.223 0.014 + 4.998 -0.477 -0.296 0.058 -0.491 0.189 -0.059 -0.245 -0.182 0.163 -0.036 0.019 -0.086 + 5.091 -0.680 -0.123 0.183 -0.520 -0.018 -0.433 -0.287 -0.169 0.085 -0.093 -0.054 0.026 + 4.668 0.147 0.071 0.279 -0.469 -0.378 -0.476 -0.389 -0.104 -0.007 -0.109 -0.080 0.013 + 2.907 0.136 0.014 0.282 -0.391 -0.063 -0.161 -0.217 -0.103 -0.025 -0.184 0.003 -0.021 + 2.366 0.268 0.124 0.348 -0.204 -0.057 -0.087 -0.086 -0.101 0.048 -0.184 0.057 0.062 + 2.381 0.399 0.081 0.154 -0.241 -0.019 0.002 -0.015 -0.043 -0.022 -0.068 0.147 -0.098 + 2.362 0.271 0.069 0.066 -0.007 0.088 -0.109 -0.117 0.007 -0.103 -0.068 -0.188 -0.257 + 2.422 0.229 -0.063 0.050 -0.006 0.220 -0.022 -0.117 -0.067 0.025 -0.137 -0.090 -0.307 + 3.271 0.348 -0.019 -0.085 -0.163 0.048 -0.318 -0.095 -0.109 0.184 0.080 0.032 -0.085 + 5.788 0.402 -0.547 -0.361 -0.431 0.068 -0.836 -0.117 -0.043 0.298 -0.145 0.047 0.024 + 6.714 0.260 -0.588 -0.502 -0.559 0.056 -0.935 -0.051 0.022 0.100 -0.353 0.019 -0.018 + 7.165 0.037 -0.619 -0.359 -0.591 0.148 -0.958 -0.090 0.015 0.040 -0.418 -0.005 -0.103 + 7.220 -0.069 -0.755 -0.282 -0.547 0.221 -0.969 -0.192 -0.092 0.013 -0.404 0.029 -0.126 + 7.388 0.100 -0.704 -0.300 -0.660 0.236 -0.851 0.057 -0.090 -0.005 -0.407 0.016 -0.137 + 7.473 0.196 -0.696 -0.277 -0.578 0.217 -0.874 0.009 -0.033 -0.057 -0.444 0.169 -0.178 + 7.490 -0.044 -0.742 -0.380 -0.593 -0.044 -0.972 0.040 -0.090 -0.205 -0.401 0.183 -0.232 + 7.957 -0.207 -0.648 -0.177 -0.512 -0.101 -0.827 0.171 -0.024 0.036 -0.387 0.132 -0.467 + 7.658 -0.080 -0.771 -0.214 -0.757 -0.246 -0.539 0.268 0.114 -0.080 -0.333 0.187 -0.501 + 6.882 -0.142 -0.734 -0.203 -0.820 -0.333 -0.629 0.319 0.205 -0.049 -0.312 0.270 -0.288 + 6.098 -0.041 -0.627 -0.055 -0.604 -0.383 -0.635 0.272 0.111 -0.012 -0.148 0.305 -0.213 + 5.327 0.198 -0.514 0.152 -0.663 -0.481 -0.600 0.204 0.001 0.081 -0.072 0.202 -0.587 + 5.561 0.291 -0.540 0.156 -0.674 -0.502 -0.664 0.218 0.119 0.126 0.120 0.212 -0.212 + 5.429 0.391 -0.492 0.187 -0.725 -0.399 -0.778 0.171 0.149 -0.033 -0.104 0.128 -0.187 + 5.374 0.032 -0.562 0.249 -0.746 -0.271 -0.750 -0.027 0.035 -0.117 -0.013 0.223 -0.105 + 5.033 0.340 -0.535 0.266 -0.534 -0.269 -0.647 -0.076 -0.041 -0.122 -0.062 0.152 -0.119 + 4.646 0.352 -0.296 0.111 -0.340 -0.218 -0.564 -0.071 0.128 -0.068 -0.014 0.323 -0.091 + 4.330 0.347 -0.157 0.080 -0.241 -0.168 -0.642 -0.149 -0.051 -0.166 0.120 0.182 -0.203 + 3.913 0.205 -0.235 0.058 -0.265 -0.067 -0.401 0.098 0.081 -0.055 -0.124 0.021 -0.144 + 3.800 0.382 -0.208 0.053 -0.209 -0.185 -0.344 0.087 -0.072 -0.005 -0.022 0.104 -0.048 + 3.533 0.149 -0.378 -0.133 -0.224 -0.179 -0.535 0.068 -0.166 0.057 0.057 0.058 -0.045 + 3.745 0.203 -0.311 0.143 0.075 0.022 -0.173 0.091 0.018 0.039 -0.056 0.102 -0.288 + 3.596 0.358 -0.241 0.172 -0.184 0.084 -0.378 0.037 -0.031 0.040 0.031 0.021 -0.196 + 3.721 0.285 -0.281 0.119 -0.141 0.088 -0.381 0.016 -0.041 -0.068 -0.017 0.148 -0.009 + 3.395 0.137 -0.342 -0.017 -0.180 0.126 -0.194 0.083 0.020 -0.105 0.005 0.156 0.048 + 3.259 -0.001 -0.499 0.029 -0.125 0.000 -0.309 -0.058 0.018 0.034 0.070 0.075 -0.076 + 3.296 0.062 -0.570 0.085 -0.081 -0.052 -0.146 0.043 0.186 0.079 0.121 0.193 0.026 + 3.405 0.229 -0.434 0.093 -0.030 0.112 -0.238 0.037 -0.014 -0.082 0.085 -0.006 -0.096 + 3.464 0.307 -0.223 0.061 0.052 -0.042 -0.230 -0.058 0.055 0.010 -0.088 0.208 0.077 + 3.170 0.137 -0.386 -0.091 -0.086 0.016 -0.130 0.046 0.173 -0.015 -0.050 0.120 0.055 + 3.121 0.282 -0.071 -0.049 -0.184 0.071 -0.293 -0.010 0.129 0.056 -0.123 0.130 0.124 + 3.053 0.213 -0.181 -0.049 -0.329 -0.196 -0.166 0.019 0.000 -0.050 0.065 0.025 -0.078 + 2.964 -0.038 -0.451 -0.078 -0.102 -0.053 -0.179 0.021 0.023 0.078 0.111 0.045 -0.041 + 3.208 0.129 -0.428 -0.022 -0.036 -0.043 -0.260 0.030 -0.038 -0.040 -0.014 -0.030 -0.057 + 3.017 0.188 -0.272 -0.136 0.004 0.002 -0.131 -0.177 -0.114 -0.064 0.158 0.125 0.052 + 3.017 0.249 -0.169 -0.017 0.002 -0.014 -0.183 -0.139 -0.037 0.010 -0.073 0.179 0.229 + 2.919 0.324 -0.097 0.007 -0.197 -0.079 -0.103 -0.027 -0.029 -0.075 -0.002 0.000 -0.085 + 2.826 0.146 -0.340 0.110 -0.084 -0.200 -0.233 -0.070 -0.019 0.124 -0.004 0.006 0.019 + 2.465 0.062 -0.394 -0.017 -0.128 -0.176 -0.106 0.099 0.091 0.148 -0.135 -0.040 0.126 + 2.385 0.142 -0.306 0.045 -0.145 -0.049 -0.259 0.026 -0.187 0.048 -0.038 -0.002 0.078 + 2.454 0.148 -0.331 0.143 -0.138 -0.126 -0.141 -0.092 -0.132 0.131 0.025 0.150 0.049 + 2.128 0.073 -0.282 0.141 -0.019 0.022 -0.148 -0.156 -0.016 0.259 0.074 0.195 0.108 + 2.319 0.276 -0.280 0.239 -0.087 0.003 -0.198 -0.143 -0.114 0.065 0.092 0.211 0.046 + 2.277 0.240 -0.239 0.115 -0.235 -0.075 -0.119 -0.076 0.002 -0.042 0.101 0.205 0.017 + 2.155 0.218 -0.302 -0.061 -0.290 -0.106 -0.053 -0.107 -0.038 0.051 0.166 0.174 0.056 + 1.997 0.282 0.042 0.106 -0.054 0.059 -0.322 -0.146 -0.021 -0.028 0.049 -0.051 -0.040 + 1.572 0.073 -0.157 0.151 -0.138 -0.053 -0.224 -0.067 0.012 0.073 0.012 -0.030 -0.073 + 1.379 0.114 -0.536 -0.074 0.048 -0.066 -0.247 0.065 0.101 0.002 -0.019 0.126 0.057 + 1.547 0.223 -0.286 0.110 0.029 0.136 -0.303 -0.168 -0.036 0.048 -0.029 0.020 0.039 + 1.372 0.426 -0.059 -0.026 -0.055 0.079 -0.220 -0.219 0.129 0.048 0.057 0.060 0.023 + 1.370 0.488 -0.298 -0.050 0.048 -0.121 -0.384 -0.169 0.044 0.065 0.161 -0.010 -0.035 + 1.102 -0.027 -0.239 -0.118 -0.358 0.091 -0.047 0.050 -0.084 0.093 0.268 0.209 0.060 + 1.487 0.382 -0.383 -0.292 0.043 0.144 0.070 0.002 -0.148 0.100 0.211 0.213 0.095 + 1.720 0.474 -0.178 -0.224 -0.306 0.036 -0.191 -0.144 -0.062 -0.042 -0.094 0.161 0.104 + 1.866 0.545 0.063 0.021 -0.151 -0.051 0.013 -0.125 0.114 0.152 -0.058 0.061 -0.128 + 1.363 0.390 -0.118 0.018 -0.161 0.003 -0.248 -0.216 0.108 0.019 0.055 0.084 0.031 + 1.735 0.375 -0.146 0.472 0.203 0.144 -0.234 -0.318 -0.043 0.151 0.074 0.168 0.002 + 1.366 -0.062 -0.336 0.210 0.247 0.155 -0.112 -0.096 -0.059 0.052 0.022 0.036 -0.006 + 2.051 0.416 -0.148 0.193 0.021 -0.033 -0.057 -0.170 -0.197 -0.090 0.031 0.045 0.039 + 2.547 0.547 0.127 0.325 0.072 -0.130 -0.264 -0.328 -0.120 -0.063 0.039 0.017 -0.050 + 2.750 0.033 -0.253 0.146 -0.195 -0.081 -0.168 -0.078 0.043 -0.042 -0.057 0.023 -0.107 + 2.375 -0.211 -0.184 0.305 -0.184 -0.152 -0.107 -0.195 -0.019 0.093 0.064 0.161 -0.042 + 2.229 -0.100 -0.147 -0.014 -0.258 0.000 -0.090 -0.107 -0.161 0.025 0.051 0.084 -0.039 + 2.241 0.132 -0.024 0.307 -0.055 0.049 -0.010 0.122 -0.085 -0.023 -0.155 0.014 0.056 + 2.337 0.087 -0.140 0.173 0.073 -0.053 0.084 0.032 0.025 0.030 -0.057 -0.018 -0.154 + 2.559 0.245 -0.374 0.073 -0.039 0.006 0.003 -0.221 0.016 0.227 0.160 0.027 0.012 + 2.303 0.049 -0.444 0.081 0.004 0.101 -0.104 -0.278 -0.027 0.038 0.219 0.059 -0.076 + 2.411 0.281 -0.156 0.103 -0.068 0.191 0.011 -0.110 -0.058 -0.028 0.081 0.029 0.015 + 2.357 0.422 -0.452 -0.052 0.047 0.258 0.026 -0.120 -0.098 -0.030 -0.088 -0.032 0.074 + 2.464 0.137 -0.334 0.026 0.195 0.188 -0.016 -0.078 -0.050 0.061 -0.134 0.056 -0.040 + 2.755 -0.063 -0.365 0.030 0.105 -0.013 0.026 -0.039 -0.044 0.041 0.037 0.154 0.054 + 2.759 -0.509 -0.392 -0.105 0.083 0.097 0.212 -0.024 -0.044 0.025 -0.135 -0.054 -0.074 + 3.165 -0.795 -0.324 -0.071 0.019 0.109 0.078 -0.095 -0.075 0.200 0.088 0.021 0.053 + 3.557 -1.035 -0.127 -0.045 -0.329 -0.100 0.135 0.188 -0.112 0.316 0.142 -0.070 0.098 + 4.478 -0.747 0.027 -0.007 -0.248 -0.016 0.003 0.115 -0.163 0.137 0.024 -0.063 -0.013 + 4.898 -0.819 -0.081 -0.119 -0.160 -0.061 -0.103 -0.131 -0.226 0.132 -0.088 -0.031 -0.026 + 5.153 -1.067 0.032 -0.099 -0.195 -0.027 0.032 -0.127 -0.052 -0.031 -0.137 -0.010 -0.078 + 5.504 -1.146 -0.050 0.075 0.063 -0.006 -0.205 -0.064 -0.127 0.058 -0.119 0.011 0.033 + 5.314 -1.286 -0.238 0.023 0.117 0.044 -0.132 0.080 -0.036 0.155 0.106 -0.011 -0.031 + 5.779 -1.179 -0.060 0.284 0.097 -0.066 -0.368 -0.180 -0.132 0.121 0.052 0.034 0.162 + 5.872 -1.278 -0.181 -0.061 -0.111 -0.176 0.076 -0.158 -0.220 0.233 -0.022 -0.014 -0.052 + 5.853 -1.125 -0.477 -0.045 0.102 -0.054 0.102 0.038 -0.201 0.088 -0.078 -0.153 -0.068 + 5.764 -1.247 -0.411 -0.080 -0.012 0.035 0.002 0.015 -0.144 0.032 -0.091 -0.131 -0.076 + 5.494 -1.086 -0.273 0.108 0.076 0.017 0.002 0.073 -0.201 -0.084 0.002 -0.055 0.161 + 5.331 -1.324 -0.136 0.191 0.009 0.040 0.031 0.022 -0.073 0.015 0.055 -0.082 0.074 + 4.694 -1.375 -0.244 -0.013 -0.011 -0.247 -0.009 0.089 0.097 0.140 -0.053 0.035 0.039 + 5.230 -1.106 -0.201 -0.021 -0.078 -0.002 -0.112 -0.029 -0.143 0.081 -0.068 -0.041 -0.007 + 5.461 -1.035 -0.236 0.003 -0.118 -0.079 0.134 -0.070 -0.328 0.177 0.003 0.015 -0.062 + 4.920 -0.812 -0.202 0.087 -0.089 -0.080 0.084 -0.111 -0.247 0.095 0.077 -0.051 0.019 + 4.616 -0.359 0.050 -0.111 0.058 0.062 0.009 0.027 -0.257 -0.003 0.005 0.088 0.027 + 4.809 -0.387 -0.468 0.362 0.125 0.179 -0.222 -0.232 -0.065 -0.050 -0.016 -0.010 -0.004 + 4.569 -0.507 -0.494 0.301 0.014 0.099 -0.372 -0.161 0.021 0.103 -0.032 0.072 -0.007 + 3.100 0.224 -0.130 0.041 0.120 0.048 -0.161 -0.129 0.011 0.169 0.050 0.049 -0.136 + 2.513 0.303 0.128 0.152 0.069 0.153 -0.031 0.035 -0.067 0.045 -0.019 -0.093 -0.107 + 4.938 -0.633 0.428 0.183 0.217 -0.354 0.066 -0.204 -0.326 0.023 0.031 -0.108 0.192 + 4.587 -0.821 0.382 0.286 0.180 -0.217 0.049 -0.278 -0.184 0.065 0.091 -0.178 0.181 + 2.282 0.059 -0.065 -0.041 0.094 0.251 0.112 -0.303 -0.113 0.016 -0.080 0.236 0.032 + 3.015 -0.345 0.107 -0.174 0.090 0.068 -0.145 -0.310 -0.223 -0.015 -0.055 0.108 0.028 + 3.264 -0.443 0.312 0.009 0.127 0.353 -0.325 -0.192 -0.127 0.102 0.027 0.095 0.032 + 3.069 0.279 0.266 0.081 0.073 -0.071 -0.167 -0.133 -0.142 0.001 -0.065 0.134 -0.100 + 2.830 0.249 0.165 0.274 -0.134 -0.096 -0.208 -0.153 -0.078 -0.046 -0.030 0.153 -0.011 + 4.537 0.092 0.261 0.256 -0.319 0.018 -0.206 -0.097 -0.087 0.006 -0.045 0.132 -0.142 + 9.861 -0.296 0.565 0.216 -0.051 -0.204 -0.238 -0.166 -0.076 -0.246 -0.079 0.058 -0.246 + 12.345 -0.380 0.411 0.442 0.001 -0.284 -0.445 -0.161 -0.318 -0.352 -0.183 -0.104 -0.339 + 13.929 -0.458 0.120 0.624 -0.285 -0.205 -0.645 0.010 -0.585 -0.313 -0.282 0.037 -0.346 + 14.748 -0.547 0.135 0.641 -0.405 -0.247 -0.724 0.066 -0.641 -0.314 -0.266 0.020 -0.371 + 14.912 -0.589 0.153 0.673 -0.436 -0.240 -0.789 0.091 -0.679 -0.325 -0.288 0.064 -0.470 + 14.912 -0.665 0.206 0.721 -0.408 -0.286 -0.759 0.053 -0.690 -0.318 -0.297 0.075 -0.497 + 14.667 -0.597 0.224 0.709 -0.386 -0.269 -0.744 0.036 -0.694 -0.267 -0.328 0.088 -0.528 + 13.997 -0.511 0.215 0.682 -0.287 -0.208 -0.691 0.032 -0.610 -0.254 -0.381 0.122 -0.511 + 12.120 -0.109 0.124 0.196 -0.327 -0.337 -0.351 0.133 -0.427 -0.190 -0.392 0.059 -0.348 + 7.670 0.197 0.556 0.403 0.022 -0.096 -0.151 0.193 -0.263 -0.017 -0.374 0.016 -0.286 + 6.308 0.326 0.528 0.625 0.131 -0.033 -0.320 0.380 -0.227 -0.089 -0.370 0.197 -0.433 + 6.095 0.472 0.627 0.790 0.082 -0.078 -0.333 0.264 -0.164 -0.075 -0.198 0.227 -0.439 + 5.981 0.573 0.533 0.716 0.057 -0.071 -0.334 0.342 -0.210 -0.084 -0.288 0.252 -0.384 + 7.370 0.174 0.419 0.421 0.417 -0.009 -0.082 -0.279 -0.248 -0.131 -0.263 0.138 -0.326 + 11.081 -0.511 0.330 0.191 0.103 -0.220 -0.199 -0.201 -0.206 -0.296 -0.272 -0.017 -0.444 + 11.855 -0.867 0.423 0.278 0.064 -0.392 -0.280 -0.047 -0.243 -0.329 -0.133 -0.020 -0.310 + 12.547 -0.465 0.225 0.380 -0.092 -0.342 -0.367 -0.040 -0.438 -0.337 -0.298 0.032 -0.466 + 13.393 -0.339 0.073 0.544 -0.092 -0.432 -0.418 -0.139 -0.560 -0.297 -0.165 -0.021 -0.480 + 13.453 -0.145 0.032 0.660 -0.235 -0.412 -0.478 -0.113 -0.557 -0.277 -0.181 -0.073 -0.484 + 13.565 -0.063 -0.081 0.715 -0.407 -0.321 -0.506 -0.118 -0.500 -0.284 -0.232 -0.064 -0.501 + 13.136 0.040 -0.157 0.730 -0.349 -0.282 -0.526 -0.070 -0.490 -0.278 -0.250 -0.062 -0.537 + 12.013 0.099 -0.144 0.626 -0.109 -0.290 -0.373 -0.025 -0.442 -0.326 -0.279 0.009 -0.563 + 8.715 -0.021 0.263 0.590 0.097 -0.264 -0.294 0.096 -0.327 -0.238 -0.308 0.165 -0.422 + 5.951 0.349 0.606 0.623 0.198 -0.274 -0.011 0.239 -0.073 -0.242 -0.164 0.050 -0.387 + 6.085 0.245 0.392 0.330 0.025 -0.013 0.184 0.378 -0.111 -0.152 -0.213 -0.201 -0.333 + 6.042 0.314 0.733 0.204 0.054 -0.157 -0.063 0.226 -0.095 -0.232 -0.202 -0.120 -0.307 + 5.704 0.168 0.678 0.012 0.137 -0.184 -0.046 -0.156 -0.083 -0.184 -0.111 -0.154 -0.171 + 5.811 -0.074 0.894 0.245 0.253 -0.146 0.075 -0.200 -0.188 -0.320 -0.050 -0.245 -0.231 + 5.946 -0.218 0.871 0.194 0.103 0.031 0.009 0.122 -0.192 -0.282 -0.068 -0.327 -0.352 + 8.699 -0.469 0.521 -0.130 -0.111 0.097 -0.095 -0.010 -0.070 -0.027 -0.128 -0.147 -0.320 + 10.366 -0.583 0.598 0.003 -0.119 -0.114 -0.211 -0.112 -0.180 -0.168 -0.166 -0.112 -0.352 + 11.213 -0.781 0.611 0.238 -0.062 -0.470 -0.243 -0.008 -0.273 -0.459 -0.061 -0.016 -0.433 + 12.582 -0.500 0.220 0.381 0.057 -0.469 -0.346 -0.179 -0.297 -0.414 -0.156 -0.039 -0.428 + 13.656 -0.382 0.088 0.486 -0.309 -0.296 -0.459 -0.050 -0.560 -0.329 -0.173 -0.003 -0.382 + 14.086 -0.343 -0.002 0.683 -0.398 -0.251 -0.604 -0.052 -0.611 -0.273 -0.325 0.058 -0.413 + 14.383 -0.318 -0.088 0.684 -0.413 -0.298 -0.590 -0.044 -0.620 -0.299 -0.340 0.060 -0.412 + 14.441 -0.288 -0.073 0.632 -0.401 -0.349 -0.536 -0.126 -0.561 -0.349 -0.347 0.057 -0.405 + 14.048 -0.197 -0.117 0.642 -0.237 -0.352 -0.583 -0.078 -0.537 -0.364 -0.430 0.146 -0.437 + 13.398 -0.258 0.057 0.517 -0.066 -0.378 -0.579 -0.039 -0.407 -0.405 -0.470 0.184 -0.322 + 12.120 -0.122 0.234 0.272 -0.168 -0.346 -0.535 0.208 -0.265 -0.303 -0.480 0.003 -0.267 + 12.344 -0.252 0.326 0.423 -0.123 -0.253 -0.671 -0.039 -0.375 -0.286 -0.460 0.060 -0.296 + 12.636 -0.308 0.157 0.546 0.026 -0.277 -0.527 -0.163 -0.477 -0.361 -0.412 0.214 -0.136 + 12.747 0.007 -0.098 0.716 -0.192 -0.310 -0.547 -0.133 -0.421 -0.266 -0.437 0.174 -0.192 + 13.207 0.118 -0.266 0.668 -0.347 -0.180 -0.606 -0.054 -0.456 -0.350 -0.370 0.143 -0.274 + 13.601 0.075 -0.308 0.717 -0.452 -0.179 -0.655 -0.041 -0.503 -0.309 -0.345 0.143 -0.388 + 13.539 0.113 -0.391 0.775 -0.477 -0.203 -0.696 0.020 -0.478 -0.227 -0.375 0.135 -0.509 + 13.074 0.157 -0.391 0.840 -0.449 -0.167 -0.695 0.056 -0.375 -0.090 -0.483 0.074 -0.487 + 11.584 0.481 -0.545 0.819 -0.361 -0.093 -0.502 0.052 -0.213 -0.201 -0.532 -0.029 -0.370 + 7.432 0.775 -0.325 0.411 0.097 0.007 -0.154 0.067 -0.252 -0.063 -0.417 -0.348 -0.369 + 5.612 0.681 0.096 0.599 0.414 -0.053 -0.334 0.014 -0.153 -0.096 -0.329 -0.222 -0.406 + 5.764 0.888 0.079 0.449 0.403 -0.008 -0.192 -0.057 -0.156 -0.112 -0.409 -0.063 -0.448 + 5.325 0.715 0.256 0.502 0.403 -0.091 -0.151 0.017 -0.210 -0.018 -0.266 -0.190 -0.407 + 5.650 0.445 0.104 0.513 0.307 -0.071 -0.227 -0.058 -0.185 -0.234 -0.284 -0.040 -0.306 + 5.958 0.330 -0.067 0.276 0.045 -0.045 0.074 0.077 -0.039 0.030 -0.251 -0.118 -0.240 + 8.601 0.113 -0.440 0.164 -0.187 -0.179 0.018 0.000 -0.008 -0.013 -0.416 -0.337 -0.238 + 6.305 0.415 -0.060 0.217 -0.092 -0.091 0.047 0.050 -0.015 0.018 -0.360 -0.306 -0.191 + 4.857 0.320 0.306 0.341 0.077 -0.120 -0.139 -0.057 -0.168 0.029 0.071 0.169 -0.156 + 4.807 0.283 -0.020 0.232 -0.071 -0.151 -0.243 0.149 -0.155 -0.047 -0.036 -0.096 -0.077 + 4.749 0.111 -0.110 0.167 0.034 -0.168 -0.188 -0.105 -0.230 -0.169 -0.059 -0.075 -0.183 + 4.676 0.078 0.008 0.222 -0.009 -0.292 -0.140 0.004 -0.230 -0.102 -0.154 -0.098 -0.137 + 4.985 0.022 -0.216 0.275 0.096 -0.117 -0.069 -0.042 -0.294 -0.032 -0.027 0.000 -0.213 + 5.258 0.098 -0.217 0.240 0.024 -0.165 -0.140 0.015 -0.221 -0.068 -0.106 0.128 0.001 + 5.054 0.183 -0.019 0.234 -0.157 -0.105 -0.216 -0.090 -0.084 -0.204 -0.042 0.073 -0.095 + 5.126 0.131 -0.094 0.167 -0.077 -0.037 -0.139 0.099 -0.154 -0.059 0.150 0.160 -0.125 + 5.287 0.075 -0.076 0.163 -0.021 -0.089 -0.148 0.064 -0.083 0.063 -0.009 0.038 -0.032 + 5.646 0.044 -0.211 0.054 0.015 -0.009 -0.066 -0.102 -0.298 -0.276 -0.098 0.006 -0.042 + 5.673 0.149 -0.208 0.153 -0.033 -0.178 -0.157 -0.092 -0.231 -0.110 -0.046 0.075 -0.039 + 5.844 0.195 -0.351 0.064 0.001 -0.078 -0.152 -0.164 -0.144 0.038 -0.083 0.030 -0.074 + 6.117 0.137 -0.102 0.234 0.087 -0.068 0.014 -0.092 -0.215 -0.145 -0.070 -0.073 -0.104 + 5.898 0.068 -0.066 0.133 -0.025 -0.175 -0.233 -0.044 -0.170 0.132 0.009 0.017 -0.041 + 6.015 0.116 -0.023 0.097 0.121 -0.021 -0.238 -0.155 -0.201 0.042 0.072 0.104 -0.150 + 6.339 0.036 -0.060 0.260 0.166 0.001 -0.046 -0.160 -0.276 0.025 0.092 0.150 -0.102 + 9.467 0.007 -0.319 0.248 -0.129 -0.270 -0.689 -0.486 -0.209 -0.023 -0.124 -0.229 -0.040 + 9.179 0.143 -0.256 0.134 -0.089 -0.345 -0.967 -0.724 -0.091 0.158 0.022 -0.234 0.108 + 7.793 -0.564 0.061 0.220 -0.265 -0.875 -0.600 -0.363 0.280 0.481 0.263 -0.338 0.050 + 7.819 -0.273 -0.515 0.013 -0.026 -0.356 -0.427 -0.078 0.133 0.162 -0.025 -0.265 -0.098 + 9.996 0.318 -1.148 -0.331 -0.337 -0.057 -0.384 -0.085 -0.201 0.270 -0.014 -0.198 0.089 + 12.329 0.825 -1.190 -0.851 -0.341 0.080 -0.435 0.216 -0.355 0.243 -0.355 -0.305 -0.058 + 12.948 0.855 -1.400 -0.657 -0.378 0.037 -0.345 0.224 -0.300 0.275 -0.581 -0.242 -0.060 + 13.531 0.541 -1.439 -0.304 -0.514 -0.088 -0.315 0.161 -0.147 0.277 -0.650 -0.190 -0.004 + 13.694 0.644 -1.359 -0.277 -0.490 -0.216 -0.277 0.096 -0.133 0.159 -0.503 -0.211 -0.047 + 14.416 0.358 -1.271 -0.136 -0.494 -0.438 -0.277 0.170 -0.089 0.091 -0.508 -0.102 -0.143 + 14.057 0.525 -1.064 -0.035 -0.477 -0.623 -0.352 0.172 -0.188 0.063 -0.432 0.101 -0.281 + 13.988 0.491 -0.848 0.289 -0.534 -0.655 -0.541 0.166 -0.426 0.077 -0.469 0.220 -0.338 + 13.117 0.462 -0.685 0.638 -0.444 -0.660 -0.580 0.016 -0.492 0.015 -0.546 0.331 -0.380 + 12.539 0.403 -0.572 0.814 -0.360 -0.507 -0.423 -0.116 -0.469 -0.090 -0.677 0.304 -0.386 + 12.496 0.564 -0.481 0.759 -0.354 -0.603 -0.463 -0.219 -0.470 -0.055 -0.586 0.325 -0.410 + 13.256 0.316 -0.416 0.811 -0.454 -0.590 -0.457 -0.160 -0.520 -0.037 -0.448 0.219 -0.450 + 13.631 0.205 -0.435 0.816 -0.575 -0.636 -0.398 -0.087 -0.549 -0.020 -0.413 0.149 -0.465 + 13.548 0.119 -0.326 0.819 -0.658 -0.566 -0.396 -0.083 -0.580 -0.046 -0.358 0.015 -0.418 + 13.414 -0.129 -0.120 0.881 -0.634 -0.535 -0.422 -0.064 -0.541 0.044 -0.316 0.035 -0.383 + 12.802 -0.033 -0.072 0.732 -0.707 -0.419 -0.213 0.037 -0.454 0.040 -0.349 -0.067 -0.375 + 11.928 0.184 -0.032 0.564 -0.609 -0.391 -0.004 0.052 -0.387 0.046 -0.279 -0.140 -0.303 + 10.359 0.647 0.097 0.317 0.034 -0.293 0.099 0.041 -0.363 0.119 -0.376 -0.161 -0.310 + 10.014 0.809 0.114 0.199 0.187 -0.448 0.204 -0.061 -0.259 0.323 -0.598 -0.114 -0.226 + 10.465 0.675 0.165 0.129 0.184 -0.492 0.123 0.013 -0.333 0.281 -0.613 -0.135 -0.159 + 10.695 0.515 0.199 0.204 0.110 -0.503 0.061 -0.017 -0.315 0.232 -0.599 -0.191 -0.116 + 11.223 0.068 0.339 0.340 -0.236 -0.321 -0.059 -0.131 -0.296 0.175 -0.452 -0.201 -0.146 + 11.790 -0.140 0.379 0.334 -0.632 -0.197 -0.096 -0.203 -0.268 0.333 -0.325 -0.243 -0.196 + 11.805 -0.240 0.269 0.381 -0.876 0.001 -0.234 -0.102 -0.401 0.309 -0.291 -0.318 -0.217 + 11.714 -0.353 0.430 0.344 -0.820 0.033 -0.251 -0.111 -0.400 0.166 -0.313 -0.393 -0.192 + 11.586 -0.349 0.506 0.390 -0.736 0.025 -0.296 -0.090 -0.454 0.112 -0.292 -0.391 -0.182 + 11.590 -0.418 0.565 0.419 -0.660 -0.023 -0.302 -0.154 -0.497 0.117 -0.214 -0.346 -0.212 + 11.716 -0.419 0.399 0.526 -0.665 -0.216 -0.201 -0.118 -0.534 0.100 -0.233 -0.302 -0.211 + 11.613 0.037 -0.005 0.573 -0.300 -0.588 -0.103 -0.037 -0.593 0.051 -0.220 -0.339 -0.140 + 11.075 0.421 -0.101 0.353 0.153 -0.706 -0.273 0.064 -0.638 0.027 -0.217 -0.399 -0.050 + 10.414 0.802 -0.208 0.347 0.349 -0.652 -0.324 -0.098 -0.555 0.028 -0.252 -0.353 -0.025 + 10.216 1.056 -0.323 0.409 0.120 -0.536 -0.338 0.025 -0.414 -0.068 -0.367 -0.304 0.020 + 10.705 0.609 0.049 0.270 0.107 -0.570 -0.325 0.093 -0.392 -0.116 -0.313 -0.406 0.088 + 10.820 0.630 -0.028 0.510 -0.058 -0.632 -0.275 0.091 -0.541 -0.001 -0.228 -0.358 -0.035 + 11.424 0.328 -0.094 0.831 -0.190 -0.727 -0.226 0.069 -0.507 -0.021 -0.206 -0.224 -0.165 + 11.200 0.155 0.180 0.788 -0.340 -0.543 -0.208 0.112 -0.470 0.034 -0.272 -0.128 -0.145 + 9.416 0.567 0.512 0.527 0.091 -0.271 -0.174 -0.030 -0.240 0.086 -0.582 -0.058 -0.243 + 9.257 0.491 0.595 0.514 0.166 -0.305 -0.129 -0.138 -0.006 -0.197 -0.472 0.044 -0.263 + 9.325 0.539 0.620 0.325 0.127 -0.247 -0.019 -0.132 -0.086 -0.247 -0.486 -0.023 -0.161 + 9.196 0.385 0.755 0.336 0.004 -0.258 0.034 -0.098 -0.218 -0.034 -0.469 -0.074 -0.311 + 8.680 0.418 0.527 0.338 -0.031 -0.427 0.096 0.000 -0.042 -0.018 -0.408 -0.150 -0.269 + 7.705 0.352 0.049 0.273 -0.031 -0.145 0.158 -0.096 0.024 -0.008 -0.270 -0.220 -0.293 + 6.357 0.373 0.182 0.295 -0.068 -0.211 0.086 0.011 0.157 0.060 -0.326 -0.230 -0.239 + 5.828 0.139 -0.082 0.102 -0.184 -0.230 0.199 0.172 0.258 0.111 -0.476 -0.210 -0.193 + 5.238 0.108 -0.009 -0.010 -0.317 -0.133 0.087 0.109 0.024 -0.007 -0.463 -0.178 -0.183 + 9.107 -0.778 -0.148 0.181 -0.483 0.096 -0.394 -0.015 -0.092 -0.193 -0.043 -0.139 -0.134 + 11.707 -1.464 0.132 -0.173 -0.312 0.078 -0.392 -0.255 -0.073 -0.144 -0.182 -0.070 -0.234 + 12.255 -2.321 0.533 -0.006 -0.265 0.045 -0.368 -0.188 -0.064 -0.177 -0.068 -0.149 -0.170 + 12.408 -2.807 0.653 0.120 -0.482 0.158 -0.088 -0.290 0.001 -0.086 0.002 -0.077 -0.174 + 12.780 -2.699 0.550 0.309 -0.461 0.084 0.019 -0.219 -0.147 -0.274 -0.131 -0.173 -0.119 + 12.748 -2.500 0.418 0.414 -0.418 0.050 -0.024 -0.289 -0.200 -0.194 -0.027 -0.136 -0.312 + 12.519 -2.437 0.248 0.494 -0.202 -0.075 0.006 -0.025 -0.093 -0.230 0.001 -0.054 -0.285 + 12.791 -2.229 0.415 0.563 -0.326 -0.146 0.022 -0.023 -0.111 -0.238 -0.014 0.037 -0.085 + 12.107 -2.009 0.166 0.703 -0.544 -0.156 -0.059 -0.065 -0.091 -0.303 -0.205 0.141 -0.098 + 10.358 -1.293 0.125 0.981 -0.448 -0.130 0.044 -0.078 -0.070 -0.109 -0.182 0.034 -0.189 + 12.689 0.575 -0.516 0.274 -0.408 -0.646 -0.246 -0.218 -0.131 -0.192 -0.205 0.057 -0.236 + 14.627 0.471 -0.894 0.232 -0.518 -0.797 -0.324 -0.129 -0.224 -0.064 -0.201 0.203 -0.292 + 15.281 0.122 -0.813 0.084 -0.663 -0.832 -0.452 0.085 -0.224 0.059 -0.211 0.140 -0.367 + 15.462 0.049 -0.904 -0.006 -0.681 -0.750 -0.606 0.231 -0.327 0.061 -0.230 0.152 -0.426 + 15.489 -0.125 -0.828 -0.250 -0.580 -0.775 -0.488 0.415 -0.328 0.179 -0.325 0.046 -0.463 + 15.174 -0.242 -0.773 -0.249 -0.492 -0.784 -0.483 0.412 -0.298 0.218 -0.268 0.023 -0.413 + 14.856 -0.245 -0.790 -0.269 -0.497 -0.823 -0.440 0.388 -0.328 0.193 -0.233 0.003 -0.377 + 14.229 0.003 -0.624 -0.191 -0.434 -0.954 -0.403 0.231 -0.321 0.189 -0.147 0.024 -0.361 + 12.811 0.125 -0.062 0.115 -0.598 -1.103 -0.212 0.048 -0.276 0.167 -0.197 0.105 -0.355 + 10.745 -0.220 0.221 0.246 -0.579 -0.993 -0.168 -0.204 -0.321 0.127 -0.117 0.077 -0.184 + 8.173 -0.130 -0.212 0.044 -0.444 -0.666 -0.042 0.229 -0.045 0.302 0.094 -0.002 -0.201 + 7.164 -0.065 0.009 0.045 -0.688 -0.776 -0.383 0.336 -0.064 0.037 0.110 0.182 -0.350 + 6.756 -0.214 -0.028 0.079 -0.407 -0.790 -0.265 0.352 -0.110 0.100 0.132 0.152 -0.187 + 7.785 -1.177 0.136 0.364 -0.574 -0.246 -0.596 0.104 0.047 -0.074 0.071 -0.009 -0.199 + 8.241 -1.235 -0.024 0.138 -0.565 -0.115 -0.582 0.025 0.219 0.075 0.089 -0.137 -0.259 + 6.366 -0.176 -0.124 -0.079 -0.373 -0.616 -0.440 0.155 0.117 0.180 -0.036 -0.023 -0.153 + 6.257 -0.284 -0.152 -0.304 -0.425 -0.522 -0.324 0.374 0.174 0.271 -0.054 -0.062 -0.128 + 6.431 -0.199 -0.136 -0.161 -0.262 -0.681 -0.509 0.415 -0.039 0.112 -0.078 0.072 -0.228 + 10.851 -1.365 -0.068 -0.217 -0.184 -0.076 -0.441 0.002 -0.060 -0.231 -0.239 0.024 -0.042 + 11.475 -1.293 -0.279 -0.320 -0.341 -0.164 -0.507 -0.040 -0.124 -0.170 -0.152 0.061 0.005 + 8.587 -1.261 0.083 -0.410 -0.245 -0.053 -0.343 0.111 -0.085 -0.087 -0.101 0.023 -0.039 + 9.615 -0.888 0.537 -0.498 -0.281 -0.006 -0.469 0.048 -0.199 -0.095 -0.162 -0.125 -0.118 + 10.889 -0.473 0.531 -0.116 -0.328 -0.254 -0.401 -0.190 -0.328 -0.301 -0.118 -0.186 -0.242 + 12.153 -0.140 0.377 0.259 -0.331 -0.531 -0.692 0.179 -0.723 -0.061 -0.224 0.002 -0.372 + 12.656 0.113 0.134 0.177 -0.376 -0.641 -0.656 0.084 -0.581 -0.167 -0.162 0.061 -0.240 + 12.772 0.110 0.169 0.132 -0.556 -0.613 -0.666 0.106 -0.411 -0.125 -0.164 0.075 -0.215 + 13.121 0.177 -0.203 0.065 -0.489 -0.561 -0.815 0.203 -0.422 -0.007 -0.191 0.320 -0.350 + 13.331 0.148 -0.359 -0.106 -0.394 -0.630 -0.810 0.300 -0.234 0.030 -0.236 0.312 -0.455 + 13.306 0.162 -0.387 -0.205 -0.353 -0.621 -0.846 0.258 -0.130 0.065 -0.293 0.321 -0.372 + 13.037 0.314 -0.241 -0.356 -0.405 -0.459 -0.826 -0.024 0.045 0.161 -0.464 0.412 -0.338 + 12.327 0.164 -0.185 -0.385 -0.299 -0.393 -0.527 -0.183 0.169 0.202 -0.535 0.194 -0.122 + 11.416 0.079 -0.451 -0.557 -0.303 -0.312 -0.514 -0.017 0.202 0.135 -0.520 -0.015 -0.090 + 10.399 -1.473 0.689 -0.596 -0.005 -0.198 -0.365 0.124 0.181 0.013 -0.243 -0.134 -0.018 + 10.456 -2.030 0.997 -0.687 0.155 -0.020 -0.158 -0.058 0.005 -0.166 -0.128 -0.124 -0.034 + 9.919 -2.049 1.212 -0.748 -0.020 -0.080 -0.125 -0.018 0.036 -0.151 -0.221 0.053 -0.001 + 10.015 -1.980 1.152 -0.726 0.051 -0.237 -0.320 -0.081 -0.201 -0.121 -0.265 0.104 -0.013 + 9.798 -1.854 1.064 -0.552 0.058 -0.424 -0.227 0.045 -0.106 -0.062 -0.164 -0.049 -0.260 + 8.644 -1.627 0.692 -0.531 0.088 -0.306 -0.253 -0.078 -0.190 -0.016 0.026 0.055 -0.032 + 7.802 -0.853 0.537 -0.561 -0.185 -0.412 -0.409 -0.243 -0.285 -0.249 -0.158 0.096 -0.074 + 8.013 -0.834 0.311 -0.331 -0.231 -0.058 -0.486 -0.097 -0.352 -0.162 -0.357 -0.196 -0.215 + 9.200 -1.256 0.485 -0.262 -0.369 0.034 -0.530 -0.082 -0.317 -0.237 -0.272 -0.294 -0.231 + 10.383 -1.978 0.729 0.151 -0.566 0.077 -0.350 -0.014 -0.162 -0.094 -0.236 -0.173 -0.096 + 12.469 -1.735 0.441 -0.150 -0.707 -0.023 -0.312 -0.106 -0.171 -0.160 -0.157 -0.178 -0.215 + 12.916 -1.440 0.097 -0.179 -0.794 -0.081 -0.356 -0.215 -0.208 -0.245 -0.203 -0.063 -0.192 + 12.006 -0.243 0.227 0.403 -0.408 -0.305 -0.419 -0.320 -0.083 -0.173 -0.364 0.024 -0.082 + 11.766 0.694 -0.265 0.342 -0.023 -0.562 -0.649 0.014 -0.529 0.003 -0.506 -0.002 -0.085 + 11.709 0.587 -0.286 0.360 -0.000 -0.391 -0.976 0.357 -0.626 -0.044 -0.406 0.039 -0.094 + 11.264 0.365 -0.268 0.635 -0.013 -0.283 -0.805 -0.018 -0.410 -0.085 -0.435 0.046 0.028 + 9.205 0.261 -0.069 0.824 0.191 -0.439 -0.697 -0.071 -0.354 -0.122 -0.383 -0.004 0.103 + 6.833 -0.118 0.303 0.577 0.073 -0.158 -0.248 0.078 -0.013 -0.060 -0.405 -0.122 0.213 + 6.722 -0.399 0.479 0.761 0.246 -0.092 0.009 0.009 -0.058 -0.165 -0.348 -0.331 -0.083 + 7.810 -0.258 0.098 0.566 -0.152 -0.012 -0.205 -0.100 0.018 -0.077 -0.320 -0.090 -0.085 + 12.181 -0.321 -0.336 0.482 -0.252 -0.287 -0.698 0.023 -0.330 -0.092 -0.382 0.161 -0.146 + 12.988 0.023 -0.368 0.106 -0.128 -0.765 -0.637 0.022 -0.313 0.043 -0.294 0.205 -0.066 + 13.053 0.151 -0.439 0.066 -0.096 -0.947 -0.610 -0.025 -0.314 0.143 -0.306 0.339 -0.133 + 13.354 0.173 -0.490 0.108 -0.249 -0.942 -0.584 -0.008 -0.337 0.137 -0.259 0.281 -0.171 + 13.472 0.012 -0.353 0.201 -0.331 -0.897 -0.535 0.020 -0.364 0.065 -0.145 0.160 -0.118 + 13.067 0.049 -0.289 0.332 -0.371 -0.821 -0.604 0.177 -0.509 0.058 -0.075 0.027 -0.056 + 12.857 -0.027 -0.210 0.367 -0.320 -0.801 -0.538 0.056 -0.501 0.107 -0.173 0.078 -0.077 + 12.496 0.009 -0.208 0.430 -0.302 -0.790 -0.519 0.119 -0.675 0.174 -0.206 0.058 -0.100 + 12.231 -0.004 -0.195 0.415 -0.095 -0.863 -0.502 0.205 -0.788 0.136 -0.185 -0.038 -0.124 + 12.003 0.074 -0.066 0.262 0.311 -0.831 -0.563 0.161 -0.781 0.066 -0.390 -0.026 -0.216 + 11.373 0.619 -0.042 -0.038 0.244 -0.418 -0.410 -0.170 -0.745 0.204 -0.449 -0.265 -0.201 + 10.459 0.900 0.215 -0.366 0.032 -0.240 -0.119 -0.159 -0.808 0.057 -0.442 -0.028 -0.135 + 9.944 0.855 0.471 -0.428 -0.211 -0.295 -0.000 -0.083 -0.772 0.026 -0.474 -0.034 -0.091 + 9.990 0.839 0.514 -0.373 -0.270 -0.353 -0.078 0.051 -0.795 0.013 -0.453 -0.146 -0.110 + 10.492 0.808 0.466 -0.370 -0.406 -0.361 -0.164 0.118 -0.848 -0.063 -0.423 -0.175 -0.072 + 10.999 0.968 0.283 -0.500 -0.422 -0.354 -0.191 0.074 -1.005 0.018 -0.296 -0.080 -0.087 + 11.807 0.835 0.098 -0.441 -0.366 -0.342 -0.298 -0.047 -0.866 0.075 -0.147 -0.020 -0.118 + 12.169 0.900 -0.200 -0.542 -0.426 -0.360 -0.292 -0.221 -0.718 0.247 0.025 -0.017 -0.112 + 12.541 0.868 -0.503 -0.592 -0.407 -0.321 -0.392 -0.320 -0.504 0.270 0.060 -0.139 -0.112 + 12.813 0.825 -0.676 -0.504 -0.466 -0.399 -0.385 -0.380 -0.321 0.437 0.126 -0.262 -0.129 + 13.071 0.645 -0.834 -0.309 -0.487 -0.382 -0.396 -0.391 -0.204 0.490 -0.010 -0.355 -0.112 + 13.257 0.520 -0.963 -0.306 -0.626 -0.385 -0.368 -0.224 -0.112 0.429 -0.257 -0.203 -0.069 + 13.429 0.282 -0.788 -0.193 -0.747 -0.161 -0.599 -0.136 -0.092 0.433 -0.395 -0.129 -0.056 + 13.056 0.310 -0.674 -0.228 -0.665 -0.191 -0.587 -0.183 -0.111 0.446 -0.366 -0.085 -0.026 + 12.647 0.332 -0.597 -0.207 -0.685 -0.152 -0.761 -0.222 -0.175 0.619 -0.388 -0.051 0.033 + 11.953 0.119 -0.316 0.045 -0.538 -0.037 -0.865 -0.324 -0.460 0.640 -0.374 -0.091 0.048 + 10.546 0.155 -0.041 0.074 -0.291 0.044 -0.611 -0.274 -0.534 0.333 -0.340 -0.208 -0.026 + 10.991 0.147 -0.093 0.082 -0.312 0.137 -0.758 -0.236 -0.464 0.298 -0.455 -0.088 -0.027 + 11.849 0.032 -0.178 0.155 -0.497 0.055 -0.809 -0.286 -0.350 0.409 -0.458 -0.054 0.045 + 12.363 0.012 -0.238 0.087 -0.497 -0.075 -0.931 -0.255 -0.307 0.468 -0.464 0.009 0.064 + 12.642 -0.012 -0.290 0.064 -0.477 -0.196 -0.954 -0.256 -0.221 0.455 -0.411 -0.010 0.102 + 12.729 0.093 -0.466 0.233 -0.443 -0.357 -0.873 -0.252 -0.184 0.349 -0.359 -0.111 0.076 + 12.508 0.404 -0.654 0.123 -0.040 -0.487 -0.902 -0.063 -0.317 0.177 -0.193 -0.147 -0.078 + 11.683 1.104 -0.893 -0.225 0.277 -0.376 -0.996 -0.063 -0.211 -0.009 -0.206 0.055 -0.266 + 10.921 1.356 -0.785 -0.376 0.354 -0.244 -0.993 -0.227 -0.205 -0.011 -0.297 0.134 -0.270 + 10.335 1.564 -0.725 -0.509 0.317 -0.205 -0.846 -0.417 -0.210 0.030 -0.333 0.101 -0.169 + 9.885 1.842 -0.680 -0.583 0.118 -0.031 -0.719 -0.462 -0.232 -0.090 -0.270 0.135 -0.153 + 10.137 1.980 -0.760 -0.651 0.074 -0.134 -0.553 -0.373 -0.282 -0.209 -0.235 0.161 -0.181 + 10.149 1.773 -0.595 -0.654 0.067 -0.176 -0.502 -0.259 -0.396 -0.255 -0.179 0.217 -0.183 + 9.831 1.417 -0.544 -0.647 0.048 -0.259 -0.498 -0.294 -0.390 -0.383 -0.052 0.297 -0.216 + 10.627 1.429 -0.570 -0.767 0.206 -0.481 -0.350 -0.275 -0.524 -0.286 -0.085 0.254 -0.310 + 10.794 1.187 -0.400 -0.699 0.181 -0.418 -0.354 -0.213 -0.512 -0.251 0.093 0.064 -0.318 + 10.393 1.107 -0.524 -0.616 0.136 -0.441 -0.360 -0.354 -0.508 -0.244 0.212 0.032 -0.394 + 11.015 1.193 -0.717 -0.448 0.096 -0.574 -0.394 -0.461 -0.465 -0.130 0.201 -0.007 -0.477 + 11.428 1.008 -0.626 -0.126 -0.048 -0.553 -0.420 -0.420 -0.372 -0.021 0.138 -0.185 -0.289 + 11.651 0.715 -0.522 0.015 -0.157 -0.388 -0.507 -0.504 -0.280 0.128 -0.168 -0.114 -0.152 + 11.948 0.338 -0.408 0.099 -0.240 -0.285 -0.748 -0.388 -0.359 0.288 -0.292 -0.076 0.027 + 12.312 0.088 -0.241 0.042 -0.319 -0.218 -0.806 -0.316 -0.335 0.314 -0.401 -0.078 0.047 + 11.885 -0.029 -0.119 0.058 -0.251 -0.101 -0.612 -0.297 -0.253 0.320 -0.487 -0.144 0.087 + 11.124 -0.517 0.549 -0.189 -0.108 -0.023 -0.716 -0.129 -0.161 -0.043 -0.472 -0.116 -0.013 + 10.293 -1.459 0.921 -0.293 0.245 -0.085 -0.665 -0.059 -0.238 -0.078 -0.463 0.007 -0.030 + 9.921 -1.769 1.273 -0.287 0.087 -0.064 -0.590 -0.136 -0.247 -0.084 -0.465 0.026 -0.014 + 10.002 -1.860 1.285 -0.425 0.031 -0.051 -0.580 -0.119 -0.240 -0.081 -0.266 0.033 -0.089 + 10.606 -1.609 1.030 -0.502 -0.094 0.108 -0.598 0.090 -0.009 -0.013 -0.369 -0.088 -0.123 + 10.403 -1.570 0.826 -0.227 -0.263 0.257 -0.816 0.025 -0.066 -0.113 -0.282 0.101 0.118 + 9.294 -0.731 0.351 0.294 -0.428 0.078 -0.621 -0.153 0.251 -0.218 -0.201 0.077 0.104 + 8.472 0.468 0.152 -0.076 -0.191 -0.279 -0.250 -0.107 0.090 0.018 -0.391 -0.079 -0.001 + 8.514 0.537 0.165 0.125 0.369 -0.247 -0.142 -0.074 0.044 -0.249 -0.343 -0.225 -0.122 + 8.962 0.702 0.092 0.082 0.310 -0.274 -0.046 -0.149 -0.075 -0.090 -0.280 -0.263 -0.283 + 9.478 0.455 0.133 0.097 0.303 -0.204 -0.171 -0.123 -0.072 0.022 -0.150 -0.306 -0.292 + 9.974 0.509 -0.163 0.330 0.391 -0.409 -0.103 -0.108 -0.192 -0.048 -0.156 -0.240 -0.243 + 9.961 0.086 0.124 0.323 0.444 -0.315 -0.094 -0.034 -0.504 0.160 -0.230 -0.193 -0.285 + 9.787 0.171 0.249 0.144 0.395 -0.360 -0.026 -0.028 -0.585 0.089 -0.220 -0.166 -0.142 + 10.316 0.439 0.174 -0.149 0.194 -0.379 -0.167 -0.130 -0.473 0.117 -0.016 -0.244 -0.090 + 11.061 0.667 0.025 -0.337 0.038 -0.470 -0.401 -0.111 -0.605 0.272 -0.001 -0.232 -0.050 + 11.466 0.605 0.129 -0.447 0.133 -0.382 -0.504 -0.113 -0.627 0.378 -0.098 -0.257 -0.024 + 11.630 0.583 -0.018 -0.279 0.197 -0.447 -0.524 -0.110 -0.643 0.407 -0.104 -0.401 0.078 + 11.948 0.457 -0.105 -0.217 0.180 -0.415 -0.539 -0.091 -0.608 0.318 -0.134 -0.389 -0.019 + 11.659 0.502 -0.071 -0.215 0.194 -0.455 -0.501 -0.148 -0.642 0.344 -0.203 -0.347 -0.041 + 11.526 0.592 -0.156 -0.205 0.278 -0.513 -0.501 -0.162 -0.670 0.318 -0.257 -0.352 -0.075 + 11.564 0.600 -0.256 -0.067 0.319 -0.488 -0.507 -0.241 -0.674 0.226 -0.233 -0.367 -0.078 + 11.713 0.577 -0.306 -0.103 0.200 -0.347 -0.512 -0.282 -0.644 0.155 -0.183 -0.493 0.039 + 11.471 0.590 -0.220 -0.060 0.238 -0.246 -0.484 -0.109 -0.654 0.239 -0.317 -0.322 -0.048 + 11.190 0.419 -0.100 -0.095 0.226 -0.202 -0.384 -0.181 -0.474 0.155 -0.219 -0.399 -0.076 + 10.461 0.351 -0.104 -0.229 0.138 -0.165 -0.397 -0.095 -0.501 0.259 -0.123 -0.290 -0.067 + 10.142 0.045 -0.107 -0.223 0.024 -0.284 -0.600 -0.089 -0.587 0.305 -0.137 -0.348 -0.015 + 10.139 0.087 -0.332 -0.105 0.094 -0.422 -0.575 0.102 -0.362 0.246 -0.176 -0.367 0.039 + 11.133 0.164 -0.454 -0.190 -0.082 -0.343 -0.596 0.143 -0.494 0.230 -0.194 -0.337 0.031 + 11.558 0.113 -0.674 -0.247 -0.100 -0.543 -0.732 0.214 -0.510 0.238 -0.171 -0.328 0.096 + 12.209 0.148 -0.705 -0.083 -0.152 -0.636 -0.761 0.231 -0.391 0.351 -0.109 -0.231 0.203 + 12.488 0.199 -0.843 0.059 -0.281 -0.903 -0.631 0.194 -0.220 0.207 0.030 -0.192 0.232 + 13.211 0.131 -0.650 0.125 -0.243 -0.875 -0.557 0.318 -0.205 0.105 0.024 -0.316 0.139 + 12.979 0.195 -0.826 0.325 -0.435 -0.656 -0.514 0.324 -0.242 0.158 0.035 -0.163 0.047 + 12.593 0.154 -0.876 0.526 -0.714 -0.540 -0.377 0.448 -0.340 0.279 0.002 -0.088 -0.052 + 12.300 0.080 -0.597 0.460 -0.787 -0.597 -0.238 0.429 -0.425 0.359 -0.041 -0.140 -0.071 + 11.930 0.296 -0.593 0.491 -0.797 -0.627 -0.128 0.381 -0.553 0.493 -0.174 -0.084 -0.140 + 11.317 0.333 -0.342 0.308 -0.612 -0.520 0.093 0.140 -0.523 0.492 -0.198 -0.201 -0.075 + 10.382 0.365 0.004 -0.071 -0.280 -0.390 0.012 0.105 -0.380 0.382 -0.432 -0.111 0.007 + 9.577 0.511 -0.195 -0.298 -0.013 -0.611 -0.063 0.196 -0.317 0.250 -0.275 -0.009 -0.079 + 8.858 0.331 -0.060 -0.072 0.228 -0.610 0.057 0.149 -0.267 0.083 -0.286 -0.009 -0.032 + 8.044 -0.234 0.365 0.038 0.188 -0.718 0.045 0.017 -0.258 0.032 -0.370 -0.220 -0.102 + 6.924 0.089 0.081 0.550 -0.381 -0.462 -0.327 0.192 -0.226 -0.050 -0.197 -0.152 -0.024 + 6.673 -0.019 -0.057 0.610 -0.485 -0.316 -0.191 0.214 -0.415 -0.361 -0.222 -0.069 -0.038 + 6.632 -0.067 -0.140 0.655 -0.407 -0.165 -0.197 0.103 -0.353 -0.183 -0.152 -0.082 -0.083 + 6.748 0.059 -0.073 0.739 -0.309 -0.105 -0.381 0.162 -0.416 -0.197 -0.113 -0.132 -0.033 + 6.696 0.107 -0.124 0.748 -0.234 -0.298 -0.535 -0.003 -0.337 -0.296 -0.200 -0.026 0.054 + 6.519 0.189 -0.112 0.699 -0.161 -0.192 -0.342 0.061 -0.431 -0.260 -0.342 -0.234 -0.077 + 6.176 0.255 -0.106 0.635 -0.059 -0.194 -0.385 -0.024 -0.259 -0.256 -0.305 -0.220 -0.082 + 6.283 0.209 -0.145 0.571 -0.177 -0.242 -0.466 -0.078 -0.312 -0.293 -0.171 -0.226 0.021 + 6.685 0.312 -0.329 0.501 -0.114 -0.211 -0.416 0.049 -0.130 -0.247 -0.266 -0.084 0.049 + 7.222 -0.069 -0.379 0.416 -0.256 -0.024 -0.280 0.004 0.102 -0.194 -0.226 0.028 -0.004 + 7.369 0.086 -0.276 0.402 -0.272 -0.138 -0.389 -0.122 0.097 -0.169 -0.169 0.031 -0.017 + 7.277 0.440 -0.126 0.246 -0.234 -0.209 -0.465 -0.100 -0.071 -0.364 -0.229 -0.170 0.048 + 7.572 0.644 -0.309 0.301 -0.186 -0.273 -0.512 -0.290 0.033 -0.343 -0.361 -0.207 0.005 + 7.357 0.784 -0.435 0.315 -0.126 -0.213 -0.748 -0.258 0.019 -0.382 -0.442 -0.312 -0.014 + 7.586 0.595 -0.503 0.321 0.022 -0.271 -0.706 -0.279 -0.295 -0.297 -0.365 -0.216 -0.057 + 7.660 0.546 -0.533 0.043 -0.159 -0.275 -0.686 -0.336 -0.330 -0.078 -0.278 -0.145 -0.021 + 7.590 0.523 -0.405 -0.135 -0.326 -0.282 -0.522 -0.095 -0.432 -0.286 -0.282 -0.163 0.051 + 7.664 0.312 -0.210 0.138 -0.263 -0.188 -0.368 0.006 -0.561 -0.185 -0.413 -0.158 -0.062 + 7.717 0.378 -0.154 0.264 -0.334 -0.406 -0.369 0.221 -0.394 -0.194 -0.335 -0.253 -0.226 + 7.746 0.452 -0.235 0.121 -0.320 -0.415 -0.254 0.170 -0.386 -0.270 -0.374 -0.193 -0.112 + 7.819 0.304 -0.192 0.108 -0.396 -0.305 -0.208 0.021 -0.376 -0.117 -0.388 -0.187 -0.220 + 7.798 0.300 -0.283 0.184 -0.414 -0.328 -0.042 0.042 -0.550 -0.361 -0.402 -0.160 -0.144 + 7.919 0.364 -0.358 0.150 -0.534 -0.355 -0.163 -0.030 -0.572 -0.336 -0.224 -0.048 -0.018 + 7.771 0.366 -0.514 -0.075 -0.404 -0.265 -0.182 -0.038 -0.406 -0.133 -0.004 0.082 -0.177 + 7.685 0.250 -0.663 0.106 -0.346 -0.195 -0.228 -0.101 -0.263 0.037 0.007 -0.037 -0.335 + 7.634 0.242 -0.648 -0.018 -0.236 -0.175 -0.221 -0.101 -0.356 -0.009 0.123 -0.082 -0.260 + 7.354 0.013 -0.818 0.112 -0.356 -0.188 -0.353 -0.066 -0.159 0.272 0.243 0.104 -0.365 + 6.918 -0.108 -0.593 0.221 -0.227 -0.323 -0.419 -0.022 -0.233 0.148 -0.037 -0.062 -0.282 + 6.786 -0.365 -0.599 0.129 -0.088 -0.233 -0.257 0.182 -0.262 0.100 0.048 -0.053 -0.299 + 6.498 -0.536 -0.291 0.147 -0.005 -0.259 -0.258 0.115 -0.085 0.166 0.033 -0.143 -0.354 + 6.971 -0.466 -0.293 0.193 -0.329 -0.301 -0.320 0.156 -0.195 0.035 0.119 0.064 -0.274 + 7.202 -0.485 -0.452 0.008 -0.277 -0.341 -0.343 0.194 -0.080 0.198 0.107 -0.052 -0.312 + 7.342 -0.425 -0.430 -0.180 -0.425 -0.203 -0.315 0.156 0.046 0.307 0.075 -0.151 -0.209 + 7.235 -0.429 -0.511 -0.368 -0.656 -0.244 -0.266 0.243 0.164 0.220 0.068 0.001 -0.222 + 7.417 -0.299 -0.490 -0.416 -0.553 -0.284 -0.317 0.220 0.020 0.106 0.047 0.076 -0.326 + 7.544 -0.350 -0.401 -0.363 -0.467 -0.260 -0.350 0.308 0.060 0.019 -0.184 0.014 -0.166 + 7.280 -0.372 -0.292 -0.156 -0.377 -0.241 -0.458 0.260 0.294 0.065 -0.255 0.029 -0.172 + 7.280 -0.407 -0.233 0.067 -0.165 -0.260 -0.466 0.367 0.127 -0.027 -0.145 0.041 -0.194 + 7.047 -0.618 -0.172 0.198 -0.076 -0.174 -0.361 0.437 0.072 0.040 -0.119 0.005 -0.162 + 7.142 -0.359 -0.018 -0.001 -0.263 -0.382 -0.428 0.377 0.182 0.043 -0.229 0.152 -0.053 + 6.747 -0.598 -0.070 0.075 -0.199 -0.466 -0.418 0.325 0.074 0.032 -0.032 0.151 -0.111 + 6.042 -1.075 -0.234 0.182 -0.183 -0.354 -0.282 0.346 0.021 0.005 -0.062 0.006 -0.113 + 5.968 -0.912 -0.385 0.201 -0.076 -0.454 -0.415 0.205 -0.090 0.147 0.035 0.002 -0.101 + 5.908 -1.053 -0.243 0.165 0.135 -0.377 -0.462 0.130 -0.092 0.111 0.210 0.135 -0.157 + 5.828 -1.106 -0.161 0.009 -0.073 -0.229 -0.371 0.115 -0.026 0.038 0.187 -0.022 -0.069 + 5.632 -1.139 -0.108 -0.119 -0.281 -0.377 -0.523 0.160 0.088 0.125 0.195 0.153 -0.068 + 5.736 -1.115 0.074 -0.009 -0.114 -0.250 -0.203 0.253 -0.070 -0.035 0.210 0.071 -0.126 + 5.213 -1.224 0.110 0.032 -0.203 -0.152 -0.166 0.174 -0.110 0.087 0.266 0.172 -0.060 + 5.586 -1.288 -0.162 0.163 -0.119 -0.360 -0.199 0.293 -0.055 0.032 0.175 0.178 -0.075 + 5.793 -1.202 -0.104 0.112 -0.039 -0.418 -0.282 0.411 0.128 -0.017 0.224 0.052 -0.101 + 5.542 -1.068 -0.247 -0.006 -0.134 -0.271 -0.297 0.341 -0.152 -0.133 0.043 0.016 -0.177 + 5.416 -1.099 -0.295 -0.010 -0.201 -0.229 -0.329 0.296 -0.076 -0.044 0.053 0.220 0.033 + 5.288 -1.137 -0.302 0.142 -0.175 -0.351 -0.355 0.164 -0.070 -0.044 0.057 0.075 0.070 + 5.576 -0.589 -0.179 0.152 -0.164 -0.409 -0.456 0.238 -0.120 -0.075 0.090 -0.025 -0.202 + 6.674 -0.058 -0.101 0.100 -0.029 -0.281 -0.576 -0.013 -0.172 -0.159 0.009 0.008 0.076 + 7.416 0.212 -0.147 -0.338 -0.138 -0.152 -0.558 -0.192 -0.109 0.033 -0.016 -0.056 0.051 + 7.628 0.393 -0.468 -0.491 -0.187 -0.341 -0.724 0.013 0.016 0.011 -0.009 -0.074 -0.099 + 7.641 0.472 -0.441 -0.274 -0.357 -0.399 -0.747 -0.209 -0.003 0.106 0.148 -0.180 -0.074 + 7.750 0.653 -0.381 -0.329 -0.319 -0.239 -0.568 -0.248 0.020 0.099 0.115 -0.079 -0.066 + 8.097 0.364 -0.497 -0.174 -0.294 -0.263 -0.532 -0.112 -0.070 0.154 0.101 -0.014 -0.124 + 8.177 0.512 -0.469 -0.196 -0.371 -0.321 -0.586 -0.388 -0.115 0.039 -0.090 0.036 -0.053 + 8.254 0.549 -0.414 -0.203 -0.303 -0.290 -0.841 -0.370 -0.083 -0.073 -0.100 -0.029 -0.106 + 8.111 0.488 -0.429 0.078 -0.308 -0.278 -0.728 -0.272 -0.042 0.041 -0.044 -0.045 -0.085 + 8.060 0.496 -0.475 0.239 -0.213 -0.227 -0.675 -0.301 -0.159 0.055 -0.124 -0.168 -0.104 + 8.055 0.263 -0.279 0.712 -0.318 -0.369 -0.694 -0.233 -0.040 0.039 -0.116 -0.127 -0.086 + 7.655 0.171 -0.280 0.504 -0.438 -0.098 -0.646 -0.221 0.023 0.008 0.038 0.071 -0.089 + 7.022 0.503 -0.117 0.566 -0.166 -0.488 -0.601 -0.273 -0.046 0.033 -0.092 -0.048 -0.129 + 5.816 0.135 -0.304 0.371 -0.037 -0.111 -0.482 -0.101 0.075 0.167 0.003 -0.073 -0.073 + 5.883 0.427 -0.249 0.136 -0.084 -0.346 -0.580 -0.054 0.032 0.169 -0.014 -0.013 -0.097 + 5.463 0.262 -0.329 0.164 -0.109 -0.161 -0.571 -0.186 -0.110 0.151 -0.239 -0.139 0.070 + 6.027 -0.156 -0.431 0.080 0.100 -0.369 -0.441 -0.090 0.046 0.003 -0.128 -0.063 -0.081 + 6.376 -0.186 -0.147 0.018 0.184 -0.599 -0.550 -0.126 -0.024 -0.347 -0.149 0.013 -0.019 + 6.545 -0.267 -0.187 0.129 -0.188 -0.364 -0.324 -0.381 0.057 -0.259 -0.337 0.005 0.002 + 6.494 -0.481 -0.149 0.597 -0.183 -0.214 -0.529 -0.312 -0.015 -0.228 -0.233 0.093 -0.145 + 7.299 -0.287 -0.061 0.636 -0.407 -0.212 -0.693 -0.289 0.008 -0.260 -0.165 0.090 -0.250 + 7.187 -0.517 -0.050 0.735 -0.390 -0.281 -0.605 -0.102 0.113 -0.198 -0.061 0.312 -0.207 + 7.011 -0.360 0.114 0.829 -0.414 -0.304 -0.711 -0.162 -0.067 -0.103 0.037 0.284 -0.262 + 7.077 -0.482 0.018 0.780 -0.453 -0.283 -0.744 -0.174 -0.159 -0.154 0.052 0.278 -0.209 + 7.178 -0.456 -0.085 0.689 -0.527 -0.265 -0.858 -0.235 -0.147 -0.169 -0.002 0.043 -0.232 + 7.261 -0.347 -0.084 0.536 -0.679 -0.519 -0.793 -0.072 -0.207 -0.179 -0.104 0.086 -0.341 + 6.365 -0.262 -0.126 0.502 -0.479 -0.514 -0.745 -0.053 -0.056 -0.069 -0.123 0.149 -0.144 + 6.110 0.104 0.007 0.221 -0.185 -0.266 -0.679 0.021 -0.137 -0.189 -0.279 0.072 -0.226 + 5.971 0.215 -0.032 0.353 -0.074 -0.253 -0.803 -0.081 -0.236 -0.187 -0.240 0.111 -0.230 + 5.777 0.171 -0.031 0.544 -0.022 -0.137 -0.670 -0.123 -0.210 -0.319 -0.273 0.044 -0.166 + 5.091 0.216 -0.078 0.460 -0.212 -0.155 -0.682 -0.165 -0.202 -0.320 -0.188 0.153 -0.236 + 5.017 0.365 -0.085 0.340 -0.103 -0.157 -0.622 -0.185 -0.064 -0.148 -0.291 0.101 -0.082 + 5.239 0.133 -0.068 0.447 -0.111 -0.266 -0.750 -0.135 -0.146 -0.192 -0.182 0.095 -0.173 + 4.888 0.159 0.073 0.495 -0.220 -0.269 -0.556 -0.134 -0.225 -0.190 -0.330 0.113 -0.161 + 4.394 0.138 -0.085 0.357 -0.141 -0.346 -0.552 0.021 -0.188 -0.057 -0.181 -0.054 -0.060 + 4.183 0.063 -0.066 0.368 -0.124 -0.328 -0.485 0.034 -0.157 -0.200 -0.235 0.157 -0.216 + 4.464 -0.028 -0.087 0.431 0.052 0.006 -0.749 -0.121 0.066 -0.006 -0.161 0.005 -0.206 + 4.614 -0.144 -0.369 0.370 0.061 -0.005 -0.657 -0.129 -0.055 -0.160 -0.233 0.253 0.048 + 4.295 0.111 -0.232 0.271 -0.185 -0.048 -0.556 0.006 -0.017 -0.080 -0.262 -0.199 -0.145 + 4.555 0.219 -0.318 0.190 -0.272 0.082 -0.535 -0.043 0.122 0.022 -0.231 -0.163 -0.161 + 4.866 0.386 -0.584 0.086 -0.395 -0.197 -0.497 0.113 0.193 0.129 -0.219 -0.251 -0.044 + 5.009 0.387 -0.709 -0.150 -0.294 0.123 -0.631 -0.052 0.197 0.163 -0.125 -0.248 -0.132 + 5.636 0.031 -0.695 0.016 -0.366 0.219 -0.710 -0.000 0.308 0.200 -0.298 -0.194 -0.029 + 6.008 -0.017 -0.670 0.026 -0.360 0.258 -0.771 0.021 0.296 0.327 -0.235 -0.110 0.121 + 6.329 0.246 -0.533 0.016 -0.345 0.052 -0.716 0.001 0.134 0.397 -0.171 0.035 -0.099 + 5.359 0.499 -0.385 0.232 -0.303 -0.147 -0.738 0.025 0.107 0.321 -0.267 -0.048 -0.016 + 4.877 0.702 -0.152 0.299 -0.113 -0.102 -0.789 0.003 -0.052 0.086 -0.309 -0.124 -0.082 + 4.190 0.738 -0.098 0.051 -0.349 -0.281 -0.683 -0.106 -0.144 0.062 -0.362 -0.152 -0.123 + 3.584 0.310 -0.424 -0.043 -0.187 -0.291 -0.502 -0.004 0.025 0.241 -0.312 -0.192 -0.017 + 3.605 0.268 -0.220 -0.022 -0.055 -0.135 -0.235 -0.118 0.017 0.237 -0.234 -0.116 0.081 + 4.262 -0.331 0.131 0.140 -0.104 0.074 -0.426 -0.169 0.013 -0.004 -0.072 -0.132 -0.057 + 3.590 -0.042 0.132 0.081 -0.110 -0.064 -0.235 -0.176 -0.073 -0.061 -0.039 -0.085 -0.159 + 3.220 -0.082 -0.027 0.126 -0.083 -0.080 -0.193 -0.270 -0.212 -0.107 -0.118 -0.085 -0.013 + 3.507 -0.128 -0.070 0.239 -0.082 -0.044 -0.313 -0.213 -0.097 -0.006 -0.058 0.073 -0.017 + 3.970 -0.070 0.156 0.462 -0.119 -0.076 -0.344 -0.167 -0.152 -0.164 -0.204 -0.131 0.076 + 3.962 -0.168 -0.191 0.424 0.077 -0.093 -0.379 -0.134 -0.240 -0.154 -0.203 -0.186 0.028 + 4.063 -0.076 -0.411 0.202 -0.205 -0.368 -0.159 -0.116 -0.217 -0.268 -0.224 -0.082 -0.037 + 4.327 -0.098 -0.552 0.275 -0.244 -0.145 -0.038 -0.113 -0.090 -0.308 -0.212 -0.168 -0.006 + 4.820 -0.249 -0.659 0.249 -0.322 -0.124 0.003 0.178 -0.082 -0.259 -0.145 -0.109 -0.118 + 5.114 -0.185 -0.640 0.466 -0.299 -0.086 -0.033 0.111 -0.134 -0.236 -0.139 -0.301 -0.361 + 5.640 0.027 -0.396 0.499 -0.566 -0.413 -0.182 0.211 -0.024 -0.053 -0.162 -0.298 -0.329 + 6.109 0.072 -0.680 0.267 -0.644 -0.260 -0.323 0.118 -0.102 0.041 0.032 -0.120 -0.272 + 5.408 0.134 -0.649 0.338 -0.656 -0.178 -0.205 0.134 -0.172 0.013 -0.062 -0.171 -0.037 + 5.761 -0.061 -0.525 0.370 -0.834 -0.228 -0.152 0.200 -0.076 -0.022 -0.169 -0.163 -0.201 + 5.769 -0.125 -0.518 0.269 -0.827 -0.327 0.057 0.226 -0.103 0.078 -0.157 -0.098 -0.153 + 5.914 0.027 -0.230 0.316 -0.997 -0.296 -0.041 0.279 -0.175 -0.012 -0.232 -0.089 -0.182 + 5.412 0.104 0.041 0.114 -1.012 -0.054 0.020 0.273 -0.182 -0.117 -0.318 -0.004 -0.230 + 4.974 -0.019 0.098 0.328 -0.782 -0.176 -0.066 0.044 -0.130 0.150 -0.158 -0.043 -0.121 + 4.501 -0.223 -0.135 0.109 -0.748 -0.324 -0.003 -0.101 -0.060 0.130 -0.239 -0.084 -0.055 + 3.928 0.112 -0.236 0.040 -0.429 -0.139 -0.005 0.032 -0.151 0.057 -0.095 -0.087 -0.087 + 3.788 -0.030 -0.484 0.410 -0.247 -0.363 -0.073 0.095 0.000 -0.031 -0.248 -0.100 -0.111 + 4.860 -0.476 -0.561 0.239 0.174 -0.059 0.098 0.142 -0.056 -0.090 -0.189 -0.012 -0.015 + 5.774 -1.185 -0.286 -0.044 -0.038 -0.078 -0.099 0.087 0.096 -0.153 -0.166 0.066 -0.014 + 6.522 -1.523 -0.297 0.080 -0.103 -0.053 -0.145 -0.211 -0.088 -0.104 -0.271 -0.024 0.022 + 7.005 -1.635 -0.247 0.272 -0.172 -0.210 -0.167 -0.023 -0.119 -0.138 -0.168 -0.004 -0.188 + 7.418 -1.514 -0.204 -0.027 -0.222 -0.140 -0.259 0.047 0.165 -0.158 -0.105 -0.015 -0.052 + 7.877 -1.470 -0.173 0.251 0.015 -0.170 -0.159 -0.050 0.046 -0.033 -0.039 0.042 -0.120 + 8.001 -1.323 -0.298 0.187 -0.052 -0.238 -0.187 -0.000 -0.039 -0.188 -0.392 0.076 0.029 + 8.054 -0.812 -0.498 0.057 0.009 0.036 -0.305 0.125 -0.097 -0.098 -0.323 0.175 0.052 + 7.386 -0.030 -0.373 -0.007 0.143 -0.050 -0.159 0.017 -0.015 -0.004 -0.264 0.088 -0.021 + 9.307 0.772 0.317 0.030 -0.153 -0.439 -0.562 -0.113 -0.020 0.159 -0.432 0.100 -0.061 + 11.294 0.702 0.080 -0.181 -0.277 -0.345 -0.781 -0.152 -0.086 0.285 -0.392 0.132 -0.082 + 12.124 0.658 -0.174 -0.365 -0.307 -0.272 -1.055 0.035 -0.163 0.370 -0.404 0.159 -0.190 + 10.835 0.999 -0.255 -0.042 -0.308 -0.453 -1.159 0.144 0.175 0.248 -0.274 -0.130 -0.185 + 10.934 0.858 -0.303 0.034 -0.337 -0.409 -0.983 0.156 -0.038 0.332 -0.312 -0.137 -0.094 + 10.909 0.826 -0.353 -0.201 -0.253 -0.334 -0.890 0.068 0.016 0.373 -0.217 -0.138 -0.292 + 11.154 0.776 -0.407 -0.330 -0.244 -0.295 -0.863 0.110 -0.008 0.404 -0.191 -0.153 -0.265 + 11.661 0.742 -0.496 -0.394 -0.334 -0.243 -0.806 0.143 -0.044 0.438 -0.222 -0.202 -0.226 + 12.190 0.658 -0.545 -0.432 -0.326 -0.285 -0.694 0.122 -0.156 0.567 -0.339 -0.156 -0.264 + 12.435 0.518 -0.544 -0.430 -0.354 -0.240 -0.601 -0.011 -0.076 0.536 -0.298 -0.235 -0.244 + 12.406 0.583 -0.642 -0.388 -0.369 -0.294 -0.467 -0.060 -0.131 0.571 -0.298 -0.232 -0.264 + 12.077 0.609 -0.591 -0.459 -0.342 -0.327 -0.405 -0.068 -0.152 0.591 -0.257 -0.232 -0.323 + 11.958 0.571 -0.522 -0.496 -0.346 -0.330 -0.372 -0.091 -0.163 0.566 -0.202 -0.212 -0.342 + 12.006 0.626 -0.529 -0.479 -0.401 -0.304 -0.323 -0.171 -0.136 0.538 -0.146 -0.227 -0.340 + 11.933 0.767 -0.619 -0.382 -0.465 -0.205 -0.409 -0.102 -0.220 0.527 -0.134 -0.179 -0.384 + 11.926 0.740 -0.534 -0.334 -0.514 -0.210 -0.324 -0.127 -0.260 0.515 -0.139 -0.116 -0.388 + 11.634 0.846 -0.546 -0.327 -0.574 -0.267 -0.106 -0.152 -0.315 0.453 -0.119 0.012 -0.393 + 11.349 0.793 -0.386 -0.425 -0.623 -0.303 0.061 -0.238 -0.280 0.368 -0.082 0.043 -0.287 + 11.093 0.742 -0.312 -0.480 -0.612 -0.441 0.224 -0.187 -0.244 0.148 -0.090 0.126 -0.121 + 10.211 0.823 -0.093 -0.400 -0.649 -0.628 0.460 -0.006 0.068 -0.317 -0.154 0.124 0.020 + 8.992 0.527 0.456 -0.345 -0.434 -0.499 0.390 -0.092 0.153 -0.220 -0.365 0.034 -0.033 + 7.875 -0.295 0.071 -0.014 -0.136 -0.408 0.153 -0.120 0.020 0.101 -0.271 0.029 -0.155 + 7.283 -0.328 0.018 -0.156 -0.121 -0.063 0.140 0.034 0.105 0.012 -0.303 0.006 -0.115 + 7.238 -0.290 0.100 -0.149 -0.108 0.095 -0.002 0.178 0.119 0.148 -0.232 0.028 -0.081 + 7.236 -0.359 0.334 0.072 0.051 -0.111 -0.164 -0.026 -0.108 0.145 -0.127 0.143 0.081 + 7.603 -0.615 0.445 0.083 -0.037 -0.260 -0.012 -0.049 -0.131 0.109 -0.056 0.139 -0.147 + 7.665 -0.714 0.397 0.010 0.154 -0.216 0.194 -0.035 -0.218 0.030 -0.167 -0.124 -0.201 + 7.574 -0.554 0.294 -0.003 0.048 -0.252 0.084 0.005 -0.156 0.176 -0.207 -0.112 -0.085 + 7.307 -0.680 0.322 0.166 -0.069 -0.148 0.027 -0.072 -0.143 0.168 -0.176 0.126 0.014 + 7.721 -0.366 0.419 0.015 -0.092 -0.209 0.002 0.033 -0.141 0.131 -0.244 -0.176 -0.070 + 7.992 -0.028 0.180 -0.321 -0.243 -0.152 0.106 0.027 0.060 0.214 -0.185 -0.184 -0.103 + 7.946 0.163 -0.021 -0.496 -0.212 -0.215 0.108 -0.091 -0.007 0.236 -0.008 -0.169 -0.108 + 8.009 0.479 -0.488 -0.734 -0.437 -0.044 -0.062 -0.124 0.014 0.319 -0.069 -0.150 -0.067 + 8.140 0.658 -0.515 -0.608 -0.389 -0.178 -0.227 -0.135 0.147 0.413 -0.070 -0.126 -0.151 + 7.967 0.676 -0.534 -0.721 -0.425 -0.203 -0.216 -0.202 0.168 0.314 -0.203 -0.131 -0.112 + 7.718 0.686 -0.445 -0.625 -0.477 -0.097 -0.132 -0.081 0.216 0.340 -0.272 0.069 -0.022 + 7.535 0.667 -0.497 -0.494 -0.480 -0.138 -0.093 -0.153 0.144 0.337 -0.192 0.023 -0.002 + 7.581 0.670 -0.413 -0.409 -0.464 -0.121 -0.238 -0.231 0.078 0.409 -0.136 -0.001 -0.004 + 7.444 0.709 -0.421 -0.380 -0.479 -0.272 -0.414 -0.187 0.052 0.469 -0.142 -0.216 -0.052 + 7.067 0.572 -0.358 -0.418 -0.517 -0.190 -0.270 -0.216 0.174 0.412 -0.169 -0.135 -0.079 + 6.604 0.363 -0.415 -0.460 -0.418 -0.171 -0.349 -0.297 0.191 0.360 -0.159 -0.306 -0.074 + 6.217 0.352 -0.384 -0.507 -0.340 -0.040 0.016 -0.122 0.121 0.313 -0.192 -0.204 -0.089 + 6.320 0.452 -0.386 -0.523 -0.328 -0.088 -0.121 -0.242 0.107 0.437 -0.084 -0.157 0.042 + 6.489 0.558 -0.299 -0.540 -0.294 -0.060 -0.088 -0.149 0.038 0.288 0.034 -0.144 -0.090 + 6.164 0.283 -0.389 -0.525 -0.209 -0.164 -0.111 -0.137 0.015 0.288 0.002 0.087 -0.130 + 6.172 0.395 -0.263 -0.392 -0.121 -0.046 -0.106 -0.224 -0.094 0.156 -0.118 -0.007 -0.246 + 6.308 0.453 -0.175 -0.272 -0.253 -0.143 -0.175 -0.194 -0.167 0.221 -0.011 -0.082 -0.178 + 6.819 0.135 0.081 -0.197 -0.275 -0.161 -0.328 -0.237 -0.285 0.317 -0.171 -0.045 -0.065 + 7.389 -0.654 0.247 0.342 -0.437 -0.153 -0.403 -0.407 -0.436 0.387 -0.313 0.087 0.019 + 7.764 -0.573 0.277 0.216 -0.837 -0.339 -0.468 -0.470 -0.383 0.479 -0.193 0.261 0.129 + 8.194 -0.540 0.435 0.241 -0.790 -0.247 -0.375 -0.484 -0.592 0.313 -0.216 0.329 0.171 + 8.656 -0.416 0.361 0.376 -0.886 -0.328 -0.409 -0.434 -0.529 0.336 -0.183 0.221 -0.011 + 9.119 -0.550 0.373 0.533 -0.865 -0.294 -0.485 -0.409 -0.563 0.425 -0.168 0.227 0.061 + 9.109 -0.659 0.405 0.376 -0.827 -0.456 -0.536 -0.315 -0.509 0.457 -0.155 0.209 0.074 + 9.150 -0.450 0.529 0.295 -0.817 -0.509 -0.500 -0.333 -0.554 0.390 -0.259 0.121 -0.031 diff --git a/test/regression/chan3.ctl b/test/regression/chan3.ctl new file mode 100644 index 0000000..3154d5d --- /dev/null +++ b/test/regression/chan3.ctl @@ -0,0 +1,3 @@ +chan3.raw +chan3.wav +chan3.sph diff --git a/test/regression/chan3.f0 b/test/regression/chan3.f0 new file mode 100644 index 0000000..f0bc841 --- /dev/null +++ b/test/regression/chan3.f0 @@ -0,0 +1,2090 @@ +0.000 0.52 3675.00 +0.010 0.52 3675.00 +0.020 0.52 3675.00 +0.030 0.52 3675.00 +0.040 0.47 3675.00 +0.050 0.20 3675.00 +0.060 0.45 424.04 +0.070 0.38 424.04 +0.080 0.00 424.04 +0.090 0.18 2205.00 +0.100 0.00 183.75 +0.110 0.00 183.75 +0.120 0.53 193.42 +0.130 0.16 190.09 +0.140 0.17 196.88 +0.150 0.09 86.13 +0.160 0.14 108.09 +0.170 0.54 100.23 +0.180 0.30 121.15 +0.190 0.00 84.81 +0.200 0.44 103.04 +0.210 0.08 102.08 +0.220 0.53 121.15 +0.229 0.00 102.08 +0.239 0.00 136.11 +0.249 0.52 104.01 +0.259 0.61 112.50 +0.269 0.78 110.25 +0.279 0.85 109.16 +0.289 0.87 108.09 +0.299 0.84 106.01 +0.309 0.90 106.01 +0.319 0.91 104.01 +0.329 0.92 103.04 +0.339 0.93 99.32 +0.349 0.94 98.44 +0.359 0.93 99.32 +0.369 0.94 98.44 +0.379 0.92 99.32 +0.389 0.87 99.32 +0.399 0.92 99.32 +0.409 0.92 100.23 +0.419 0.91 101.15 +0.429 0.93 100.23 +0.439 0.93 100.23 +0.449 0.94 101.15 +0.459 0.89 101.15 +0.469 0.94 101.15 +0.479 0.96 103.04 +0.489 0.91 104.01 +0.499 0.91 102.08 +0.509 0.85 99.32 +0.519 0.91 97.57 +0.529 0.81 98.44 +0.539 0.91 97.57 +0.549 0.92 94.23 +0.559 0.91 93.43 +0.569 0.90 93.43 +0.579 0.91 90.37 +0.589 0.92 89.63 +0.599 0.92 89.63 +0.609 0.95 90.37 +0.619 0.95 90.37 +0.629 0.95 90.37 +0.639 0.60 91.12 +0.649 0.64 92.65 +0.659 0.82 91.88 +0.668 0.89 91.88 +0.678 0.91 94.23 +0.688 0.94 93.43 +0.698 0.90 95.04 +0.708 0.92 95.04 +0.718 0.92 95.04 +0.728 0.80 95.87 +0.738 0.80 97.57 +0.748 0.84 97.57 +0.758 0.82 96.71 +0.768 0.82 95.87 +0.778 0.85 95.04 +0.788 0.90 94.23 +0.798 0.91 91.88 +0.808 0.91 89.63 +0.818 0.91 86.81 +0.828 0.83 82.89 +0.838 0.67 86.13 +0.848 0.47 88.91 +0.858 0.67 88.20 +0.868 0.76 88.20 +0.878 0.87 87.50 +0.888 0.18 84.81 +0.898 0.56 80.47 +0.908 0.62 5512.50 +0.918 0.62 5512.50 +0.928 0.64 5512.50 +0.938 0.67 5512.50 +0.948 0.67 5512.50 +0.958 0.67 5512.50 +0.968 0.67 5512.50 +0.978 0.31 5512.50 +0.988 0.01 11025.00 +0.998 0.26 80.47 +1.008 0.00 80.47 +1.018 0.13 580.26 +1.028 0.00 82.89 +1.038 0.48 501.14 +1.048 0.32 282.69 +1.058 0.54 88.91 +1.068 0.55 87.50 +1.078 0.79 86.13 +1.088 0.95 85.47 +1.098 0.95 85.47 +1.107 0.68 81.67 +1.117 0.24 95.87 +1.127 0.06 96.71 +1.137 0.00 689.06 +1.147 0.03 3675.00 +1.157 0.50 3675.00 +1.167 0.39 3675.00 +1.177 0.51 3675.00 +1.187 0.51 3675.00 +1.197 0.13 99.32 +1.207 0.00 92.65 +1.217 0.68 80.47 +1.227 0.73 90.37 +1.237 0.65 94.23 +1.247 0.67 88.91 +1.257 0.83 86.81 +1.267 0.79 84.16 +1.277 0.61 85.47 +1.287 0.47 82.89 +1.297 0.95 80.47 +1.307 0.95 80.47 +1.317 0.38 88.20 +1.327 0.63 84.81 +1.337 0.29 94.23 +1.347 0.35 80.47 +1.357 0.00 282.69 +1.367 0.45 103.04 +1.377 0.13 126.72 +1.387 0.00 128.20 +1.397 0.00 93.43 +1.407 0.44 80.47 +1.417 0.57 81.07 +1.427 0.83 82.28 +1.437 0.79 80.47 +1.447 0.54 80.47 +1.457 0.48 91.12 +1.467 0.77 735.00 +1.477 0.77 735.00 +1.487 0.77 735.00 +1.497 0.73 735.00 +1.507 0.73 735.00 +1.517 0.71 689.06 +1.527 0.68 689.06 +1.537 0.68 648.53 +1.546 0.70 648.53 +1.556 0.75 648.53 +1.566 0.78 612.50 +1.576 0.68 580.26 +1.586 0.81 551.25 +1.596 0.56 501.14 +1.606 0.24 525.00 +1.616 0.43 212.02 +1.626 0.34 177.82 +1.636 0.66 175.00 +1.646 0.52 177.82 +1.656 0.00 183.75 +1.666 0.12 155.28 +1.676 0.00 85.47 +1.686 0.04 82.89 +1.696 0.12 122.50 +1.706 0.27 157.50 +1.716 0.51 145.07 +1.726 0.51 82.28 +1.736 0.43 80.47 +1.746 0.62 94.23 +1.756 0.49 99.32 +1.766 0.00 117.29 +1.776 0.00 123.88 +1.786 0.39 245.00 +1.796 0.00 83.52 +1.806 0.00 93.43 +1.816 0.47 80.47 +1.826 0.40 100.23 +1.836 0.03 177.82 +1.846 0.00 367.50 +1.856 0.52 408.33 +1.866 0.83 424.04 +1.876 0.46 441.00 +1.886 0.33 479.35 +1.896 0.60 479.35 +1.906 0.45 424.04 +1.916 0.00 424.04 +1.926 0.28 137.81 +1.936 0.00 157.50 +1.946 0.60 126.72 +1.956 0.23 121.15 +1.966 0.27 155.28 +1.976 0.00 80.47 +1.985 0.00 208.02 +1.995 0.00 216.18 +2.005 0.00 229.69 +2.015 0.58 250.57 +2.025 0.73 268.90 +2.035 0.62 256.40 +2.045 0.49 245.00 +2.055 0.01 250.57 +2.065 0.21 256.40 +2.075 0.01 136.11 +2.085 0.00 128.20 +2.095 0.27 80.47 +2.105 0.29 84.81 +2.115 0.00 80.47 +2.125 0.39 82.89 +2.135 0.39 82.89 +2.145 0.24 91.88 +2.155 0.08 80.47 +2.165 0.55 86.81 +2.175 0.61 87.50 +2.185 0.19 93.43 +2.195 0.36 99.32 +2.205 0.50 169.62 +2.215 0.45 186.86 +2.225 0.00 169.62 +2.235 0.00 126.72 +2.245 0.59 137.81 +2.255 0.22 151.03 +2.265 0.00 169.62 +2.275 0.00 177.82 +2.285 0.10 80.47 +2.295 0.35 86.81 +2.305 0.52 86.13 +2.315 0.05 83.52 +2.325 0.00 82.28 +2.335 0.02 256.40 +2.345 0.47 250.57 +2.355 0.00 216.18 +2.365 0.02 268.90 +2.375 0.17 114.84 +2.385 0.32 114.84 +2.395 0.22 97.57 +2.405 0.31 83.52 +2.415 0.54 84.16 +2.424 0.42 80.47 +2.434 0.16 92.65 +2.444 0.00 172.27 +2.454 0.00 159.78 +2.464 0.00 190.09 +2.474 0.17 87.50 +2.484 0.00 85.47 +2.494 0.54 97.57 +2.504 0.17 151.03 +2.514 0.70 143.18 +2.524 0.70 143.18 +2.534 0.56 132.83 +2.544 0.00 169.62 +2.554 0.00 113.66 +2.564 0.00 80.47 +2.574 0.00 80.47 +2.584 0.00 100.23 +2.594 0.00 100.23 +2.604 0.43 118.55 +2.614 0.07 112.50 +2.624 0.00 147.00 +2.634 0.29 80.47 +2.644 0.00 80.47 +2.654 0.00 100.23 +2.664 0.00 225.00 +2.674 0.00 183.75 +2.684 0.35 183.75 +2.694 0.49 216.18 +2.704 0.00 183.75 +2.714 0.41 190.09 +2.724 0.41 84.16 +2.734 0.42 82.89 +2.744 0.22 108.09 +2.754 0.12 119.84 +2.764 0.69 122.50 +2.774 0.12 119.84 +2.784 0.05 151.03 +2.794 0.39 113.66 +2.804 0.64 122.50 +2.814 0.00 137.81 +2.824 0.34 107.04 +2.834 0.49 1837.50 +2.844 0.15 1837.50 +2.854 0.00 1102.50 +2.863 0.19 1002.27 +2.873 0.54 918.75 +2.883 0.00 167.05 +2.893 0.00 125.28 +2.903 0.56 134.45 +2.913 0.91 118.55 +2.923 0.91 118.55 +2.933 0.88 117.29 +2.943 0.87 117.29 +2.953 0.81 113.66 +2.963 0.64 110.25 +2.973 0.44 107.04 +2.983 0.93 105.00 +2.993 0.93 103.04 +3.003 0.98 101.15 +3.013 0.98 101.15 +3.023 0.61 100.23 +3.033 0.19 99.32 +3.043 0.27 99.32 +3.053 0.63 98.44 +3.063 0.50 96.71 +3.073 0.46 92.65 +3.083 0.00 612.50 +3.093 0.00 848.08 +3.103 0.00 787.50 +3.113 0.00 2756.25 +3.123 0.00 3675.00 +3.133 0.56 2756.25 +3.143 0.56 2756.25 +3.153 0.28 2756.25 +3.163 0.26 2756.25 +3.173 0.00 103.04 +3.183 0.38 108.09 +3.193 0.72 104.01 +3.203 0.54 104.01 +3.213 0.18 151.03 +3.223 0.84 122.50 +3.233 0.58 104.01 +3.243 0.29 121.15 +3.253 0.55 80.47 +3.263 0.70 80.47 +3.273 0.70 80.47 +3.283 0.08 91.88 +3.293 0.00 80.47 +3.302 0.00 2205.00 +3.312 0.00 2205.00 +3.322 0.27 918.75 +3.332 0.71 918.75 +3.342 0.71 918.75 +3.352 0.71 918.75 +3.362 0.71 918.75 +3.372 0.27 123.88 +3.382 0.29 126.72 +3.392 0.72 132.83 +3.402 0.59 129.71 +3.412 0.78 125.28 +3.422 0.87 121.15 +3.432 0.87 121.15 +3.442 0.87 121.15 +3.452 0.85 118.55 +3.462 0.70 119.84 +3.472 0.81 121.15 +3.482 0.87 121.15 +3.492 0.90 123.88 +3.502 0.89 121.15 +3.512 0.92 118.55 +3.522 0.71 112.50 +3.532 0.70 101.15 +3.542 0.51 107.04 +3.552 0.59 86.81 +3.562 0.87 103.04 +3.572 0.77 117.29 +3.582 0.83 121.15 +3.592 0.84 119.84 +3.602 0.77 118.55 +3.612 0.93 117.29 +3.622 0.92 117.29 +3.632 0.95 118.55 +3.642 0.91 119.84 +3.652 0.89 121.15 +3.662 0.88 121.15 +3.672 0.89 121.15 +3.682 0.50 123.88 +3.692 0.70 121.15 +3.702 0.63 122.50 +3.712 0.68 122.50 +3.722 0.76 121.15 +3.732 0.78 119.84 +3.741 0.84 118.55 +3.751 0.80 114.84 +3.761 0.90 111.36 +3.771 0.95 108.09 +3.781 0.95 106.01 +3.791 0.95 105.00 +3.801 0.95 102.08 +3.811 0.91 102.08 +3.821 0.95 102.08 +3.831 0.91 101.15 +3.841 0.91 101.15 +3.851 0.90 101.15 +3.861 0.92 100.23 +3.871 0.93 98.44 +3.881 0.94 96.71 +3.891 0.93 95.04 +3.901 0.92 95.04 +3.911 0.33 97.57 +3.921 0.35 118.55 +3.931 0.42 93.43 +3.941 0.71 95.04 +3.951 0.77 96.71 +3.961 0.84 98.44 +3.971 0.84 98.44 +3.981 0.84 98.44 +3.991 0.83 97.57 +4.001 0.93 95.87 +4.011 0.93 95.87 +4.021 0.84 96.71 +4.031 0.83 97.57 +4.041 0.87 96.71 +4.051 0.91 95.87 +4.061 0.83 94.23 +4.071 0.53 90.37 +4.081 0.88 91.88 +4.091 0.93 94.23 +4.101 0.26 95.04 +4.111 0.72 95.87 +4.121 0.61 93.43 +4.131 0.93 92.65 +4.141 0.87 91.88 +4.151 0.76 90.37 +4.161 0.53 89.63 +4.171 0.91 95.87 +4.180 0.93 94.23 +4.190 0.93 94.23 +4.200 0.91 95.04 +4.210 0.90 93.43 +4.220 0.41 103.04 +4.230 0.93 93.43 +4.240 0.93 93.43 +4.250 0.92 92.65 +4.260 0.92 92.65 +4.270 0.82 91.12 +4.280 0.92 92.65 +4.290 0.76 94.23 +4.300 0.66 93.43 +4.310 0.54 91.12 +4.320 0.44 80.47 +4.330 0.65 89.63 +4.340 0.41 95.87 +4.350 0.59 92.65 +4.360 0.59 92.65 +4.370 0.00 114.84 +4.380 0.17 121.15 +4.390 0.00 91.88 +4.400 0.56 114.84 +4.410 0.82 97.57 +4.420 0.67 91.12 +4.430 0.51 82.28 +4.440 0.40 99.32 +4.450 0.35 441.00 +4.460 0.55 102.08 +4.470 0.00 89.63 +4.480 0.34 86.13 +4.490 0.27 501.14 +4.500 0.00 501.14 +4.510 0.00 132.83 +4.520 0.05 11025.00 +4.530 0.50 11025.00 +4.540 0.50 11025.00 +4.550 0.50 11025.00 +4.560 0.50 11025.00 +4.570 0.04 91.12 +4.580 0.00 91.12 +4.590 0.58 108.09 +4.600 0.00 134.45 +4.610 0.00 91.12 +4.620 0.40 11025.00 +4.629 0.06 11025.00 +4.639 0.00 11025.00 +4.649 0.21 11025.00 +4.659 0.00 91.88 +4.669 0.34 11025.00 +4.679 0.05 11025.00 +4.689 0.26 80.47 +4.699 0.00 80.47 +4.709 0.60 80.47 +4.719 0.46 98.44 +4.729 0.56 95.04 +4.739 0.66 94.23 +4.749 0.00 95.04 +4.759 0.61 85.47 +4.769 0.03 80.47 +4.779 0.00 80.47 +4.789 0.15 11025.00 +4.799 0.00 129.71 +4.809 0.09 98.44 +4.819 0.68 104.01 +4.829 0.60 107.04 +4.839 0.23 118.55 +4.849 0.00 92.65 +4.859 0.60 82.89 +4.869 0.00 80.47 +4.879 0.00 80.47 +4.889 0.52 100.23 +4.899 0.00 90.37 +4.909 0.17 102.08 +4.919 0.00 99.32 +4.929 0.39 90.37 +4.939 0.53 80.47 +4.949 0.00 80.47 +4.959 0.60 80.47 +4.969 0.60 80.47 +4.979 0.60 80.47 +4.989 0.04 80.47 +4.999 0.60 80.47 +5.009 0.00 157.50 +5.019 0.28 162.13 +5.029 0.52 136.11 +5.039 0.00 114.84 +5.049 0.00 147.00 +5.059 0.00 90.37 +5.068 0.04 94.23 +5.078 0.66 96.71 +5.088 0.71 96.71 +5.098 0.86 100.23 +5.108 0.89 97.57 +5.118 0.85 94.23 +5.128 0.92 95.04 +5.138 0.94 92.65 +5.148 0.92 91.12 +5.158 0.78 88.91 +5.168 0.59 82.28 +5.178 0.68 80.47 +5.188 0.68 80.47 +5.198 0.68 80.47 +5.208 0.40 100.23 +5.218 0.00 91.88 +5.228 0.46 167.05 +5.238 0.00 96.71 +5.248 0.00 100.23 +5.258 0.82 80.47 +5.268 0.82 80.47 +5.278 0.00 80.47 +5.288 0.36 80.47 +5.298 0.00 95.87 +5.308 0.15 11025.00 +5.318 0.40 11025.00 +5.328 0.00 108.09 +5.338 0.00 99.32 +5.348 0.83 90.37 +5.358 0.90 90.37 +5.368 0.93 89.63 +5.378 0.93 89.63 +5.388 0.88 88.20 +5.398 0.92 85.47 +5.408 0.92 87.50 +5.418 0.90 87.50 +5.428 0.93 86.81 +5.438 0.92 84.81 +5.448 0.85 82.28 +5.458 0.92 84.81 +5.468 0.54 84.81 +5.478 0.67 85.47 +5.488 0.52 80.47 +5.498 0.67 85.47 +5.507 0.56 5512.50 +5.517 0.56 5512.50 +5.527 0.56 5512.50 +5.537 0.00 551.25 +5.547 0.05 501.14 +5.557 0.57 525.00 +5.567 0.28 97.57 +5.577 0.42 92.65 +5.587 0.79 89.63 +5.597 0.80 88.91 +5.607 0.91 87.50 +5.617 0.90 86.81 +5.627 0.91 87.50 +5.637 0.89 86.81 +5.647 0.91 86.13 +5.657 0.87 86.13 +5.667 0.89 84.81 +5.677 0.92 85.47 +5.687 0.87 84.16 +5.697 0.90 83.52 +5.707 0.85 82.28 +5.717 0.85 81.07 +5.727 0.92 80.47 +5.737 0.71 80.47 +5.747 0.64 90.37 +5.757 0.77 80.47 +5.767 0.72 80.47 +5.777 0.89 81.67 +5.787 0.65 90.37 +5.797 0.43 88.91 +5.807 0.52 551.25 +5.817 0.68 459.38 +5.827 0.24 551.25 +5.837 0.00 106.01 +5.847 0.00 128.20 +5.857 0.69 125.28 +5.867 0.65 106.01 +5.877 0.19 106.01 +5.887 0.40 90.37 +5.897 0.59 612.50 +5.907 0.00 612.50 +5.917 0.02 11025.00 +5.927 0.62 5512.50 +5.937 0.62 5512.50 +5.946 0.62 5512.50 +5.956 0.62 5512.50 +5.966 0.58 5512.50 +5.976 0.58 5512.50 +5.986 0.58 5512.50 +5.996 0.00 122.50 +6.006 0.08 98.44 +6.016 0.64 100.23 +6.026 0.84 85.47 +6.036 0.87 80.47 +6.046 0.87 80.47 +6.056 0.87 80.47 +6.066 0.61 93.43 +6.076 0.51 90.37 +6.086 0.64 648.53 +6.096 0.64 648.53 +6.106 0.56 89.63 +6.116 0.63 89.63 +6.126 0.95 80.47 +6.136 0.95 80.47 +6.146 0.92 81.07 +6.156 0.80 81.67 +6.166 0.67 81.67 +6.176 0.63 82.28 +6.186 0.67 82.89 +6.196 0.63 81.67 +6.206 0.53 81.07 +6.216 0.63 81.67 +6.226 0.50 82.89 +6.236 0.60 86.13 +6.246 0.67 82.28 +6.256 0.60 80.47 +6.266 0.35 81.07 +6.276 0.32 81.67 +6.286 0.18 91.12 +6.296 0.33 1575.00 +6.306 0.05 95.87 +6.316 0.00 290.13 +6.326 0.05 306.25 +6.336 0.42 334.09 +6.346 0.25 324.26 +6.356 0.08 408.33 +6.366 0.40 1837.50 +6.376 0.30 1837.50 +6.385 0.53 1837.50 +6.395 0.53 1837.50 +6.405 0.53 1837.50 +6.415 0.38 918.75 +6.425 0.39 918.75 +6.435 0.56 918.75 +6.445 0.28 918.75 +6.455 0.11 848.08 +6.465 0.07 1837.50 +6.475 0.37 580.26 +6.485 0.04 580.26 +6.495 0.22 551.25 +6.505 0.17 117.29 +6.515 0.17 612.50 +6.525 0.14 580.26 +6.535 0.45 580.26 +6.545 0.49 1837.50 +6.555 0.10 1837.50 +6.565 0.49 1837.50 +6.575 0.39 2205.00 +6.585 0.00 132.83 +6.595 0.27 104.01 +6.605 0.58 84.16 +6.615 0.71 84.16 +6.625 0.68 83.52 +6.635 0.62 83.52 +6.645 0.45 96.71 +6.655 0.08 250.57 +6.665 0.00 220.50 +6.675 0.00 525.00 +6.685 0.27 1837.50 +6.695 0.00 81.67 +6.705 0.22 80.47 +6.715 0.69 94.23 +6.725 0.43 116.05 +6.735 0.74 111.36 +6.745 0.42 94.23 +6.755 0.00 104.01 +6.765 0.49 11025.00 +6.775 0.09 11025.00 +6.785 0.49 11025.00 +6.795 0.34 137.81 +6.805 0.00 145.07 +6.815 0.00 117.29 +6.824 0.72 119.84 +6.834 0.19 126.72 +6.844 0.00 101.15 +6.854 0.27 95.04 +6.864 0.00 100.23 +6.874 0.47 99.32 +6.884 0.48 103.04 +6.894 0.00 86.81 +6.904 0.27 128.20 +6.914 0.00 145.07 +6.924 0.00 145.07 +6.934 0.00 111.36 +6.944 0.13 121.15 +6.954 0.18 106.01 +6.964 0.39 143.18 +6.974 0.51 114.84 +6.984 0.76 126.72 +6.994 0.47 107.04 +7.004 0.00 107.04 +7.014 0.29 95.87 +7.024 0.00 100.23 +7.034 0.27 117.29 +7.044 0.04 126.72 +7.054 0.00 126.72 +7.064 0.49 148.99 +7.074 0.00 126.72 +7.084 0.00 126.72 +7.094 0.00 129.71 +7.104 0.00 111.36 +7.114 0.00 81.67 +7.124 0.52 96.71 +7.134 0.01 119.84 +7.144 0.44 100.23 +7.154 0.19 103.04 +7.164 0.03 86.13 +7.174 0.00 95.87 +7.184 0.19 80.47 +7.194 0.24 1837.50 +7.204 0.27 1837.50 +7.214 0.68 1837.50 +7.224 0.72 1837.50 +7.234 0.75 1837.50 +7.244 0.75 1837.50 +7.254 0.75 1837.50 +7.263 0.75 1837.50 +7.273 0.75 1837.50 +7.283 0.74 1837.50 +7.293 0.48 1837.50 +7.303 0.47 1837.50 +7.313 0.72 1837.50 +7.323 0.72 1837.50 +7.333 0.72 1837.50 +7.343 0.58 1837.50 +7.353 0.11 1837.50 +7.363 0.00 84.16 +7.373 0.52 95.04 +7.383 0.72 81.67 +7.393 0.06 81.07 +7.403 0.00 97.57 +7.413 0.59 1837.50 +7.423 0.59 1837.50 +7.433 0.27 1837.50 +7.443 0.00 1837.50 +7.453 0.00 106.01 +7.463 0.53 102.08 +7.473 0.00 108.09 +7.483 0.62 86.81 +7.493 0.23 82.28 +7.503 0.32 90.37 +7.513 0.00 256.40 +7.523 0.00 107.04 +7.533 0.00 80.47 +7.543 0.59 91.12 +7.553 0.47 94.23 +7.563 0.00 107.04 +7.573 0.48 113.66 +7.583 0.28 134.45 +7.593 0.45 134.45 +7.603 0.56 108.09 +7.613 0.36 121.15 +7.623 0.38 119.84 +7.633 0.51 105.00 +7.643 0.00 80.47 +7.653 0.57 84.16 +7.663 0.11 80.47 +7.673 0.00 183.75 +7.683 0.69 216.18 +7.693 0.58 216.18 +7.702 0.69 216.18 +7.712 0.88 225.00 +7.722 0.91 220.50 +7.732 0.91 220.50 +7.742 0.06 220.50 +7.752 0.00 220.50 +7.762 0.71 216.18 +7.772 0.71 216.18 +7.782 0.07 220.50 +7.792 0.00 220.50 +7.802 0.00 225.00 +7.812 0.00 551.25 +7.822 0.66 250.57 +7.832 0.77 239.67 +7.842 0.92 225.00 +7.852 0.90 459.38 +7.862 0.93 459.38 +7.872 0.93 459.38 +7.882 0.93 459.38 +7.892 0.93 459.38 +7.902 0.00 441.00 +7.912 0.00 424.04 +7.922 0.04 196.88 +7.932 0.19 147.00 +7.942 0.34 129.71 +7.952 0.00 132.83 +7.962 0.47 153.12 +7.972 0.29 190.09 +7.982 0.38 141.35 +7.992 0.00 91.88 +8.002 0.47 220.50 +8.012 0.64 225.00 +8.022 0.78 216.18 +8.032 0.78 216.18 +8.042 0.19 193.42 +8.052 0.37 121.15 +8.062 0.60 128.20 +8.072 0.52 117.29 +8.082 0.33 122.50 +8.092 0.40 204.17 +8.102 0.00 229.69 +8.112 0.50 501.14 +8.122 0.84 501.14 +8.132 0.92 525.00 +8.141 0.92 525.00 +8.151 0.86 525.00 +8.161 0.74 551.25 +8.171 0.91 268.90 +8.181 0.29 282.69 +8.191 0.36 268.90 +8.201 0.45 157.50 +8.211 0.62 169.62 +8.221 0.00 145.07 +8.231 0.31 145.07 +8.241 0.00 125.28 +8.251 0.27 80.47 +8.261 0.42 132.83 +8.271 0.18 122.50 +8.281 0.66 107.04 +8.291 0.35 125.28 +8.301 0.30 111.36 +8.311 0.00 125.28 +8.321 0.67 131.25 +8.331 0.93 106.01 +8.341 0.93 106.01 +8.351 0.41 103.04 +8.361 0.52 105.00 +8.371 0.57 104.01 +8.381 0.86 103.04 +8.391 0.93 102.08 +8.401 0.93 101.15 +8.411 0.94 100.23 +8.421 0.93 99.32 +8.431 0.91 99.32 +8.441 0.81 98.44 +8.451 0.69 97.57 +8.461 0.60 97.57 +8.471 0.63 89.63 +8.481 0.86 92.65 +8.491 0.72 91.12 +8.501 0.30 99.32 +8.511 0.61 106.01 +8.521 0.86 99.32 +8.531 0.53 96.71 +8.541 0.76 95.04 +8.551 0.94 94.23 +8.561 0.91 95.04 +8.571 0.94 94.23 +8.580 0.94 94.23 +8.590 0.84 95.04 +8.600 0.82 91.12 +8.610 0.87 89.63 +8.620 0.84 88.91 +8.630 0.87 88.91 +8.640 0.87 88.91 +8.650 0.93 86.13 +8.660 0.91 85.47 +8.670 0.93 86.13 +8.680 0.93 86.13 +8.690 0.70 86.81 +8.700 0.56 97.57 +8.710 0.46 92.65 +8.720 0.48 101.15 +8.730 0.01 11025.00 +8.740 0.23 11025.00 +8.750 0.65 5512.50 +8.760 0.68 5512.50 +8.770 0.68 5512.50 +8.780 0.68 5512.50 +8.790 0.45 5512.50 +8.800 0.13 5512.50 +8.810 0.00 2756.25 +8.820 0.49 2205.00 +8.830 0.49 2205.00 +8.840 0.00 118.55 +8.850 0.29 109.16 +8.860 0.68 100.23 +8.870 0.57 94.23 +8.880 0.53 92.65 +8.890 0.53 91.12 +8.900 0.64 88.91 +8.910 0.40 93.43 +8.920 0.40 87.50 +8.930 0.72 86.13 +8.940 0.83 86.13 +8.950 0.84 84.81 +8.960 0.77 81.07 +8.970 0.58 92.65 +8.980 0.50 91.12 +8.990 0.29 89.63 +9.000 0.51 117.29 +9.010 0.00 128.20 +9.020 0.00 113.66 +9.029 0.00 111.36 +9.039 0.06 109.16 +9.049 0.72 89.63 +9.059 0.60 91.88 +9.069 0.82 83.52 +9.079 0.30 98.44 +9.089 0.22 104.01 +9.099 0.00 200.45 +9.109 0.00 119.84 +9.119 0.00 136.11 +9.129 0.06 11025.00 +9.139 0.50 11025.00 +9.149 0.21 11025.00 +9.159 0.44 80.47 +9.169 0.08 80.47 +9.179 0.73 80.47 +9.189 0.73 80.47 +9.199 0.73 80.47 +9.209 0.38 104.01 +9.219 0.60 88.20 +9.229 0.82 83.52 +9.239 0.86 82.28 +9.249 0.83 80.47 +9.259 0.84 80.47 +9.269 0.84 80.47 +9.279 0.61 91.12 +9.289 0.56 91.12 +9.299 0.52 90.37 +9.309 0.50 612.50 +9.319 0.48 648.53 +9.329 0.45 87.50 +9.339 0.01 11025.00 +9.349 0.46 501.14 +9.359 0.41 92.65 +9.369 0.49 80.47 +9.379 0.87 80.47 +9.389 0.75 81.07 +9.399 0.53 95.87 +9.409 0.30 90.37 +9.419 0.00 408.33 +9.429 0.00 355.65 +9.439 0.62 80.47 +9.449 0.00 96.71 +9.459 0.30 86.13 +9.468 0.00 2205.00 +9.478 0.32 1837.50 +9.488 0.66 1837.50 +9.498 0.66 1837.50 +9.508 0.66 1837.50 +9.518 0.27 80.47 +9.528 0.13 116.05 +9.538 0.56 95.04 +9.548 0.00 81.07 +9.558 0.47 95.87 +9.568 0.51 103.04 +9.578 0.00 128.20 +9.588 0.00 102.08 +9.598 0.00 262.50 +9.608 0.00 86.13 +9.618 0.00 86.13 +9.628 0.34 102.08 +9.638 0.00 80.47 +9.648 0.69 80.47 +9.658 0.69 80.47 +9.668 0.00 98.44 +9.678 0.03 86.81 +9.688 0.49 11025.00 +9.698 0.49 11025.00 +9.708 0.26 80.47 +9.718 0.51 80.47 +9.728 0.51 80.47 +9.738 0.51 80.47 +9.748 0.39 1575.00 +9.758 0.19 98.44 +9.768 0.11 98.44 +9.778 0.66 81.07 +9.788 0.80 85.47 +9.798 0.55 83.52 +9.808 0.33 81.67 +9.818 0.17 83.52 +9.828 0.50 83.52 +9.838 0.25 1837.50 +9.848 0.17 1837.50 +9.858 0.78 1837.50 +9.868 0.78 1837.50 +9.878 0.78 1837.50 +9.888 0.52 1837.50 +9.898 0.65 1837.50 +9.907 0.27 1575.00 +9.917 0.28 114.84 +9.927 0.20 114.84 +9.937 0.51 112.50 +9.947 0.34 112.50 +9.957 0.29 109.16 +9.967 0.48 580.26 +9.977 0.48 580.26 +9.987 0.33 212.02 +9.997 0.39 216.18 +10.007 0.49 212.02 +10.017 0.39 220.50 +10.027 0.05 129.71 +10.037 0.30 129.71 +10.047 0.54 109.16 +10.057 0.33 164.55 +10.067 0.39 220.50 +10.077 0.55 612.50 +10.087 0.79 612.50 +10.097 0.81 612.50 +10.107 0.78 580.26 +10.117 0.62 580.26 +10.127 0.00 648.53 +10.137 0.03 689.06 +10.147 0.48 787.50 +10.157 0.41 848.08 +10.167 0.48 848.08 +10.177 0.00 787.50 +10.187 0.00 918.75 +10.197 0.27 100.23 +10.207 0.00 132.83 +10.217 0.00 98.44 +10.227 0.00 108.09 +10.237 0.42 113.66 +10.247 0.10 99.32 +10.257 0.31 116.05 +10.267 0.00 114.84 +10.277 0.36 83.52 +10.287 0.55 92.65 +10.297 0.44 104.01 +10.307 0.28 102.08 +10.317 0.15 86.81 +10.327 0.53 86.81 +10.337 0.44 88.91 +10.346 0.26 80.47 +10.356 0.00 104.01 +10.366 0.00 121.15 +10.376 0.35 91.12 +10.386 0.68 104.01 +10.396 0.68 104.01 +10.406 0.35 103.04 +10.416 0.00 220.50 +10.426 0.30 208.02 +10.436 0.64 190.09 +10.446 0.23 126.72 +10.456 0.33 122.50 +10.466 0.71 102.08 +10.476 0.56 119.84 +10.486 0.61 86.81 +10.496 0.53 216.18 +10.506 0.62 122.50 +10.516 0.59 141.35 +10.526 0.74 137.81 +10.536 0.59 162.13 +10.546 0.64 132.83 +10.556 0.59 848.08 +10.566 0.69 95.87 +10.576 0.63 735.00 +10.586 0.35 250.57 +10.596 0.57 250.57 +10.606 0.76 250.57 +10.616 0.45 245.00 +10.626 0.44 239.67 +10.636 0.48 735.00 +10.646 0.29 848.08 +10.656 0.08 111.36 +10.666 0.00 90.37 +10.676 0.61 107.04 +10.686 0.47 91.88 +10.696 0.00 109.16 +10.706 0.45 83.52 +10.716 0.60 95.04 +10.726 0.65 90.37 +10.736 0.14 80.47 +10.746 0.54 80.47 +10.756 0.54 80.47 +10.766 0.52 93.43 +10.776 0.00 116.05 +10.785 0.19 99.32 +10.795 0.18 86.13 +10.805 0.70 80.47 +10.815 0.70 80.47 +10.825 0.50 81.07 +10.835 0.30 80.47 +10.845 0.00 80.47 +10.855 0.18 103.04 +10.865 0.00 80.47 +10.875 0.44 84.16 +10.885 0.00 82.89 +10.895 0.31 81.67 +10.905 0.75 250.57 +10.915 0.91 250.57 +10.925 0.91 250.57 +10.935 0.91 250.57 +10.945 0.83 250.57 +10.955 0.93 256.40 +10.965 0.88 256.40 +10.975 0.95 262.50 +10.985 0.95 262.50 +10.995 0.95 262.50 +11.005 0.95 262.50 +11.015 0.94 262.50 +11.025 0.64 268.90 +11.035 0.74 268.90 +11.045 0.66 268.90 +11.055 0.83 275.62 +11.065 0.83 275.62 +11.075 0.00 239.67 +11.085 0.00 239.67 +11.095 0.00 80.47 +11.105 0.00 86.81 +11.115 0.45 86.13 +11.125 0.00 256.40 +11.135 0.00 256.40 +11.145 0.78 250.57 +11.155 0.87 239.67 +11.165 0.85 229.69 +11.175 0.84 225.00 +11.185 0.57 225.00 +11.195 0.75 220.50 +11.205 0.05 216.18 +11.215 0.00 212.02 +11.224 0.38 80.47 +11.234 0.15 87.50 +11.244 0.26 101.15 +11.254 0.53 204.17 +11.264 0.53 196.88 +11.274 0.76 196.88 +11.284 0.54 190.09 +11.294 0.74 196.88 +11.304 0.80 200.45 +11.314 0.00 196.88 +11.324 0.30 193.42 +11.334 0.00 116.05 +11.344 0.00 117.29 +11.354 0.25 80.47 +11.364 0.46 91.12 +11.374 0.30 95.87 +11.384 0.32 193.42 +11.394 0.51 193.42 +11.404 0.79 193.42 +11.414 0.85 190.09 +11.424 0.90 190.09 +11.434 0.92 190.09 +11.444 0.92 190.09 +11.454 0.92 190.09 +11.464 0.95 193.42 +11.474 0.95 193.42 +11.484 0.95 193.42 +11.494 0.95 193.42 +11.504 0.95 193.42 +11.514 0.84 196.88 +11.524 0.85 196.88 +11.534 0.82 200.45 +11.544 0.84 200.45 +11.554 0.84 200.45 +11.564 0.48 193.42 +11.574 0.38 245.00 +11.584 0.26 175.00 +11.594 0.28 99.32 +11.604 0.19 234.57 +11.614 0.30 220.50 +11.624 0.57 204.17 +11.634 0.00 250.57 +11.644 0.00 183.75 +11.654 0.34 1378.12 +11.663 0.34 1378.12 +11.673 0.15 1378.12 +11.683 0.00 216.18 +11.693 0.00 80.47 +11.703 0.00 105.00 +11.713 0.27 105.00 +11.723 0.78 123.88 +11.733 0.13 105.00 +11.743 0.00 105.00 +11.753 0.57 80.47 +11.763 0.57 80.47 +11.773 0.62 80.47 +11.783 0.08 81.67 +11.793 0.62 80.47 +11.803 0.62 80.47 +11.813 0.00 100.23 +11.823 0.00 123.88 +11.833 0.00 111.36 +11.843 0.36 99.32 +11.853 0.18 100.23 +11.863 0.81 80.47 +11.873 0.81 80.47 +11.883 0.00 100.23 +11.893 0.00 100.23 +11.903 0.72 111.36 +11.913 0.00 94.23 +11.923 0.19 94.23 +11.933 0.00 151.03 +11.943 0.00 80.47 +11.953 0.00 100.23 +11.963 0.06 108.09 +11.973 0.18 100.23 +11.983 0.09 100.23 +11.993 0.50 80.47 +12.003 0.35 84.16 +12.013 0.08 85.47 +12.023 0.00 136.11 +12.033 0.00 95.87 +12.043 0.07 95.04 +12.053 0.41 91.88 +12.063 0.21 82.28 +12.073 0.03 131.25 +12.083 0.06 132.83 +12.093 0.45 155.28 +12.102 0.45 141.35 +12.112 0.45 118.55 +12.122 0.28 134.45 +12.132 0.50 125.28 +12.142 0.69 131.25 +12.152 0.51 134.45 +12.162 0.69 131.25 +12.172 0.56 119.84 +12.182 0.47 129.71 +12.192 0.56 119.84 +12.202 0.03 148.99 +12.212 0.00 148.99 +12.222 0.16 80.47 +12.232 0.00 80.47 +12.242 0.00 80.47 +12.252 0.00 99.32 +12.262 0.00 105.00 +12.272 0.45 84.81 +12.282 0.00 91.88 +12.292 0.25 84.81 +12.302 0.47 80.47 +12.312 0.52 80.47 +12.322 0.62 85.47 +12.332 0.56 80.47 +12.342 0.28 80.47 +12.352 0.56 80.47 +12.362 0.24 95.04 +12.372 0.49 104.01 +12.382 0.68 100.23 +12.392 0.34 204.17 +12.402 0.68 100.23 +12.412 0.82 100.23 +12.422 0.86 204.17 +12.432 0.83 204.17 +12.442 0.94 204.17 +12.452 0.94 204.17 +12.462 0.89 204.17 +12.472 0.91 200.45 +12.482 0.80 196.88 +12.492 0.54 204.17 +12.502 0.54 83.52 +12.512 0.57 80.47 +12.522 0.34 186.86 +12.532 0.25 212.02 +12.541 0.77 200.45 +12.551 0.06 196.88 +12.561 0.12 172.27 +12.571 0.00 103.04 +12.581 0.58 82.89 +12.591 0.28 80.47 +12.601 0.00 80.47 +12.611 0.00 147.00 +12.621 0.53 175.00 +12.631 0.67 172.27 +12.641 0.78 167.05 +12.651 0.57 164.55 +12.661 0.45 151.03 +12.671 0.51 153.12 +12.681 0.54 151.03 +12.691 0.54 151.03 +12.701 0.29 164.55 +12.711 0.00 186.86 +12.721 0.00 290.13 +12.731 0.00 80.47 +12.741 0.00 90.37 +12.751 0.00 80.47 +12.761 0.59 95.04 +12.771 0.00 118.55 +12.781 0.47 88.20 +12.791 0.19 109.16 +12.801 0.20 84.81 +12.811 0.28 96.71 +12.821 0.28 86.13 +12.831 0.42 131.25 +12.841 0.42 90.37 +12.851 0.47 106.01 +12.861 0.06 106.01 +12.871 0.00 85.47 +12.881 0.47 86.13 +12.891 0.67 84.81 +12.901 0.10 105.00 +12.911 0.00 86.81 +12.921 0.00 119.84 +12.931 0.00 121.15 +12.941 0.00 86.13 +12.951 0.78 97.57 +12.961 0.00 82.28 +12.971 0.78 97.57 +12.980 0.11 88.20 +12.990 0.00 121.15 +13.000 0.40 123.88 +13.010 0.45 114.84 +13.020 0.22 118.55 +13.030 0.28 105.00 +13.040 0.17 114.84 +13.050 0.10 89.63 +13.060 0.52 103.04 +13.070 0.00 86.81 +13.080 0.45 91.12 +13.090 0.46 220.50 +13.100 0.00 132.83 +13.110 0.00 90.37 +13.120 0.54 107.04 +13.130 0.00 91.88 +13.140 0.00 122.50 +13.150 0.40 80.47 +13.160 0.33 82.28 +13.170 0.08 113.66 +13.180 0.24 117.29 +13.190 0.67 95.87 +13.200 0.38 81.07 +13.210 0.39 81.07 +13.220 0.30 80.47 +13.230 0.11 116.05 +13.240 0.56 94.23 +13.250 0.13 101.15 +13.260 0.41 103.04 +13.270 0.62 92.65 +13.280 0.56 84.16 +13.290 0.32 83.52 +13.300 0.00 89.63 +13.310 0.47 114.84 +13.320 0.17 117.29 +13.330 0.23 118.55 +13.340 0.00 122.50 +13.350 0.01 84.81 +13.360 0.04 112.50 +13.370 0.46 100.23 +13.380 0.18 101.15 +13.390 0.15 88.91 +13.400 0.00 80.47 +13.410 0.64 91.12 +13.420 0.39 113.66 +13.429 0.00 90.37 +13.439 0.45 97.57 +13.449 0.00 87.50 +13.459 0.00 90.37 +13.469 0.61 93.43 +13.479 0.17 102.08 +13.489 0.21 113.66 +13.499 0.12 250.57 +13.509 0.44 80.47 +13.519 0.11 113.66 +13.529 0.00 80.47 +13.539 0.60 91.88 +13.549 0.73 88.20 +13.559 0.00 106.01 +13.569 0.11 80.47 +13.579 0.50 164.55 +13.589 0.00 145.07 +13.599 0.00 148.99 +13.609 0.36 80.47 +13.619 0.36 80.47 +13.629 0.28 80.47 +13.639 0.24 84.81 +13.649 0.83 83.52 +13.659 0.27 88.20 +13.669 0.00 102.08 +13.679 0.00 101.15 +13.689 0.33 117.29 +13.699 0.47 119.84 +13.709 0.75 137.81 +13.719 0.36 125.28 +13.729 0.24 116.05 +13.739 0.24 91.12 +13.749 0.77 94.23 +13.759 0.37 111.36 +13.769 0.00 117.29 +13.779 0.77 88.91 +13.789 0.00 110.25 +13.799 0.53 105.00 +13.809 0.60 117.29 +13.819 0.00 125.28 +13.829 0.38 136.11 +13.839 0.22 106.01 +13.849 0.06 183.75 +13.859 0.54 200.45 +13.868 0.83 196.88 +13.878 0.45 212.02 +13.888 0.39 225.00 +13.898 0.48 89.63 +13.908 0.30 96.71 +13.918 0.58 95.87 +13.928 0.00 82.28 +13.938 0.24 81.07 +13.948 0.00 183.75 +13.958 0.02 525.00 +13.968 0.00 393.75 +13.978 0.34 220.50 +13.988 0.05 216.18 +13.998 0.20 121.15 +14.008 0.00 132.83 +14.018 0.56 107.04 +14.028 0.43 113.66 +14.038 0.23 110.25 +14.048 0.50 121.15 +14.058 0.15 114.84 +14.068 0.32 128.20 +14.078 0.34 81.07 +14.088 0.28 91.12 +14.098 0.46 91.88 +14.108 0.25 108.09 +14.118 0.38 122.50 +14.128 0.76 101.15 +14.138 0.91 103.04 +14.148 0.91 103.04 +14.158 0.91 103.04 +14.168 0.96 102.08 +14.178 0.91 100.23 +14.188 0.87 96.71 +14.198 0.74 94.23 +14.208 0.61 87.50 +14.218 0.58 98.44 +14.228 0.58 169.62 +14.238 0.52 87.50 +14.248 0.76 96.71 +14.258 0.76 96.71 +14.268 0.90 96.71 +14.278 0.89 95.87 +14.288 0.90 96.71 +14.298 0.87 93.43 +14.307 0.90 91.88 +14.317 0.89 90.37 +14.327 0.86 90.37 +14.337 0.41 80.47 +14.347 0.25 81.07 +14.357 0.40 106.01 +14.367 0.67 97.57 +14.377 0.20 112.50 +14.387 0.28 290.13 +14.397 0.19 212.02 +14.407 0.69 245.00 +14.417 0.09 225.00 +14.427 0.00 212.02 +14.437 0.00 193.42 +14.447 0.01 11025.00 +14.457 0.01 11025.00 +14.467 0.00 11025.00 +14.477 0.00 5512.50 +14.487 0.00 3675.00 +14.497 0.00 80.47 +14.507 0.00 100.23 +14.517 0.35 80.47 +14.527 0.00 100.23 +14.537 0.35 80.47 +14.547 0.35 80.47 +14.557 0.00 99.32 +14.567 0.00 99.32 +14.577 0.45 117.29 +14.587 0.41 145.07 +14.597 0.00 99.32 +14.607 0.00 186.86 +14.617 0.14 143.18 +14.627 0.41 114.84 +14.637 0.00 128.20 +14.647 0.28 121.15 +14.657 0.35 92.65 +14.667 0.00 84.81 +14.677 0.23 204.17 +14.687 0.41 204.17 +14.697 0.81 200.45 +14.707 0.45 196.88 +14.717 0.00 225.00 +14.727 0.57 200.45 +14.737 0.41 204.17 +14.746 0.00 196.88 +14.756 0.00 408.33 +14.766 0.00 501.14 +14.776 0.62 229.69 +14.786 0.87 216.18 +14.796 0.92 216.18 +14.806 0.92 216.18 +14.816 0.92 216.18 +14.826 0.92 216.18 +14.836 0.88 208.02 +14.846 0.72 204.17 +14.856 0.39 200.45 +14.866 0.36 200.45 +14.876 0.35 105.00 +14.886 0.60 95.04 +14.896 0.61 97.57 +14.906 0.47 114.84 +14.916 0.29 95.87 +14.926 0.10 95.87 +14.936 0.67 91.88 +14.946 0.62 93.43 +14.956 0.61 92.65 +14.966 0.31 91.88 +14.976 0.29 90.37 +14.986 0.49 88.20 +14.996 0.37 91.12 +15.006 0.34 84.81 +15.016 0.35 84.81 +15.026 0.30 186.86 +15.036 0.39 175.00 +15.046 0.86 175.00 +15.056 0.86 175.00 +15.066 0.75 177.82 +15.076 0.75 177.82 +15.086 0.75 177.82 +15.096 0.34 180.74 +15.106 0.46 164.55 +15.116 0.26 128.20 +15.126 0.00 88.20 +15.136 0.23 86.13 +15.146 0.46 80.47 +15.156 0.63 85.47 +15.166 0.31 88.20 +15.176 0.63 85.47 +15.185 0.00 80.47 +15.195 0.00 80.47 +15.205 0.00 306.25 +15.215 0.00 256.40 +15.225 0.00 290.13 +15.235 0.18 105.00 +15.245 0.00 123.88 +15.255 0.30 167.05 +15.265 0.58 162.13 +15.275 0.66 159.78 +15.285 0.66 159.78 +15.295 0.00 157.50 +15.305 0.33 157.50 +15.315 0.00 408.33 +15.325 0.01 441.00 +15.335 0.44 459.38 +15.345 0.00 424.04 +15.355 0.49 479.35 +15.365 0.05 580.26 +15.375 0.00 525.00 +15.385 0.00 580.26 +15.395 0.36 153.12 +15.405 0.31 147.00 +15.415 0.72 162.13 +15.425 0.18 157.50 +15.435 0.51 153.12 +15.445 0.19 151.03 +15.455 0.00 175.00 +15.465 0.66 177.82 +15.475 0.88 169.62 +15.485 0.88 169.62 +15.495 0.88 169.62 +15.505 0.88 169.62 +15.515 0.82 169.62 +15.525 0.59 167.05 +15.535 0.81 167.05 +15.545 0.81 167.05 +15.555 0.21 186.86 +15.565 0.34 164.55 +15.575 0.60 131.25 +15.585 0.68 128.20 +15.595 0.33 157.50 +15.605 0.34 110.25 +15.615 0.27 155.28 +15.624 0.52 162.13 +15.634 0.08 167.05 +15.644 0.22 167.05 +15.654 0.15 147.00 +15.664 0.36 97.57 +15.674 0.17 101.15 +15.684 0.60 100.23 +15.694 0.18 116.05 +15.704 0.18 117.29 +15.714 0.17 117.29 +15.724 0.56 94.23 +15.734 0.22 80.47 +15.744 0.00 80.47 +15.754 0.40 107.04 +15.764 0.56 123.88 +15.774 0.18 125.28 +15.784 0.34 125.28 +15.794 0.59 101.15 +15.804 0.41 123.88 +15.814 0.22 125.28 +15.824 0.29 137.81 +15.834 0.00 134.45 +15.844 0.44 134.45 +15.854 0.56 122.50 +15.864 0.66 108.09 +15.874 0.17 122.50 +15.884 0.52 134.45 +15.894 0.56 125.28 +15.904 0.30 155.28 +15.914 0.33 122.50 +15.924 0.29 148.99 +15.934 0.00 159.78 +15.944 0.18 117.29 +15.954 0.63 137.81 +15.964 0.03 122.50 +15.974 0.60 110.25 +15.984 0.63 117.29 +15.994 0.45 139.56 +16.004 0.40 110.25 +16.014 0.26 100.23 +16.024 0.51 118.55 +16.034 0.18 136.11 +16.044 0.54 121.15 +16.054 0.29 114.84 +16.063 0.40 102.08 +16.073 0.24 118.55 +16.083 0.68 98.44 +16.093 0.00 122.50 +16.103 0.50 113.66 +16.113 0.04 98.44 +16.123 0.57 116.05 +16.133 0.00 117.29 +16.143 0.45 108.09 +16.153 0.57 141.35 +16.163 0.18 119.84 +16.173 0.43 172.27 +16.183 0.07 153.12 +16.193 0.03 153.12 +16.203 0.18 112.50 +16.213 0.20 95.87 +16.223 0.41 112.50 +16.233 0.27 125.28 +16.243 0.24 126.72 +16.253 0.38 86.13 +16.263 0.38 88.91 +16.273 0.38 88.91 +16.283 0.21 80.47 +16.293 0.19 95.04 +16.303 0.18 153.12 +16.313 0.03 113.66 +16.323 0.14 84.81 +16.333 0.55 95.04 +16.343 0.29 125.28 +16.353 0.00 101.15 +16.363 0.59 119.84 +16.373 0.00 101.15 +16.383 0.00 101.15 +16.393 0.32 80.47 +16.403 0.32 80.47 +16.413 0.13 91.88 +16.423 0.16 117.29 +16.433 0.56 95.87 +16.443 0.00 114.84 +16.453 0.00 169.62 +16.463 0.60 134.45 +16.473 0.81 137.81 +16.483 0.99 139.56 +16.493 0.99 139.56 +16.502 0.92 137.81 +16.512 0.82 137.81 +16.522 0.54 126.72 +16.532 0.91 123.88 +16.542 0.91 125.28 +16.552 0.91 123.88 +16.562 0.90 117.29 +16.572 0.69 119.84 +16.582 0.64 132.83 +16.592 0.66 128.20 +16.602 0.80 129.71 +16.612 0.91 136.11 +16.622 0.91 137.81 +16.632 0.93 141.35 +16.642 0.93 141.35 +16.652 0.68 137.81 +16.662 0.48 119.84 +16.672 0.83 113.66 +16.682 0.67 123.88 +16.692 0.38 141.35 +16.702 0.77 139.56 +16.712 0.63 129.71 +16.722 0.23 141.35 +16.732 0.06 145.07 +16.742 0.39 137.81 +16.752 0.69 131.25 +16.762 0.98 136.11 +16.772 0.99 136.11 +16.782 0.99 136.11 +16.792 0.99 136.11 +16.802 0.99 136.11 +16.812 0.88 132.83 +16.822 0.84 132.83 +16.832 0.84 136.11 +16.842 0.93 137.81 +16.852 0.90 141.35 +16.862 0.93 143.18 +16.872 0.96 147.00 +16.882 0.92 148.99 +16.892 0.96 147.00 +16.902 0.33 136.11 +16.912 0.30 137.81 +16.922 0.00 147.00 +16.932 0.00 136.11 +16.941 0.75 134.45 +16.951 0.19 125.28 +16.961 0.28 148.99 +16.971 0.37 134.45 +16.981 0.57 112.50 +16.991 0.53 108.09 +17.001 0.20 99.32 +17.011 0.48 96.71 +17.021 0.48 96.71 +17.031 0.00 81.67 +17.041 0.00 110.25 +17.051 0.42 131.25 +17.061 0.53 128.20 +17.071 0.51 122.50 +17.081 0.16 119.84 +17.091 0.55 121.15 +17.101 0.22 102.08 +17.111 0.26 151.03 +17.121 0.00 408.33 +17.131 0.00 459.38 +17.141 0.32 580.26 +17.151 0.66 580.26 +17.161 0.82 648.53 +17.171 0.00 648.53 +17.181 0.00 109.16 +17.191 0.81 109.16 +17.201 0.85 121.15 +17.211 0.81 125.28 +17.221 0.71 125.28 +17.231 0.66 129.71 +17.241 0.68 137.81 +17.251 0.77 141.35 +17.261 0.71 151.03 +17.271 0.85 162.13 +17.281 0.84 175.00 +17.291 0.91 183.75 +17.301 0.91 186.86 +17.311 0.96 200.45 +17.321 0.96 200.45 +17.331 0.91 204.17 +17.341 0.91 220.50 +17.351 0.91 216.18 +17.361 0.90 212.02 +17.371 0.92 204.17 +17.380 0.92 196.88 +17.390 0.91 180.74 +17.400 0.92 172.27 +17.410 0.92 167.05 +17.420 0.93 159.78 +17.430 0.91 157.50 +17.440 0.93 153.12 +17.450 0.90 151.03 +17.460 0.91 147.00 +17.470 0.90 141.35 +17.480 0.92 131.25 +17.490 0.90 122.50 +17.500 0.90 118.55 +17.510 0.90 109.16 +17.520 0.91 112.50 +17.530 0.93 108.09 +17.540 0.92 104.01 +17.550 0.89 96.71 +17.560 0.78 90.37 +17.570 0.42 81.67 +17.580 0.61 112.50 +17.590 0.23 101.15 +17.600 0.00 114.84 +17.610 0.59 3675.00 +17.620 0.40 3675.00 +17.630 0.59 3675.00 +17.640 0.42 11025.00 +17.650 0.49 3675.00 +17.660 0.49 3675.00 +17.670 0.44 3675.00 +17.680 0.75 2756.25 +17.690 0.75 2756.25 +17.700 0.00 3675.00 +17.710 0.00 2756.25 +17.720 0.56 128.20 +17.730 0.60 123.88 +17.740 0.67 117.29 +17.750 0.79 113.66 +17.760 0.85 111.36 +17.770 0.77 108.09 +17.780 0.54 129.71 +17.790 0.37 111.36 +17.800 0.74 648.53 +17.810 0.74 648.53 +17.820 0.74 648.53 +17.829 0.14 612.50 +17.839 0.11 129.71 +17.849 0.38 136.11 +17.859 0.74 113.66 +17.869 0.00 98.44 +17.879 0.28 105.00 +17.889 0.70 3675.00 +17.899 0.70 3675.00 +17.909 0.08 107.04 +17.919 0.59 95.04 +17.929 0.71 95.87 +17.939 0.49 93.43 +17.949 0.57 92.65 +17.959 0.64 88.91 +17.969 0.87 86.81 +17.979 0.64 82.28 +17.989 0.44 98.44 +17.999 0.72 5512.50 +18.009 0.67 5512.50 +18.019 0.72 5512.50 +18.029 0.55 5512.50 +18.039 0.72 5512.50 +18.049 0.69 2205.00 +18.059 0.69 2205.00 +18.069 0.43 3675.00 +18.079 0.81 3675.00 +18.089 0.81 3675.00 +18.099 0.81 3675.00 +18.109 0.81 3675.00 +18.119 0.31 106.01 +18.129 0.75 88.91 +18.139 0.37 86.13 +18.149 0.25 81.67 +18.159 0.00 80.47 +18.169 0.70 81.07 +18.179 0.51 80.47 +18.189 0.00 86.81 +18.199 0.54 91.12 +18.209 0.56 88.91 +18.219 0.91 88.20 +18.229 0.91 88.20 +18.239 0.89 87.50 +18.249 0.87 87.50 +18.259 0.90 86.81 +18.268 0.89 85.47 +18.278 0.90 84.81 +18.288 0.94 84.16 +18.298 0.94 84.16 +18.308 0.93 84.81 +18.318 0.94 86.81 +18.328 0.83 88.20 +18.338 0.76 89.63 +18.348 0.80 90.37 +18.358 0.66 89.63 +18.368 0.50 87.50 +18.378 0.76 86.81 +18.388 0.93 86.13 +18.398 0.95 85.47 +18.408 0.86 84.81 +18.418 0.76 83.52 +18.428 0.57 82.28 +18.438 0.62 82.89 +18.448 0.92 83.52 +18.458 0.55 85.47 +18.468 0.92 86.81 +18.478 0.92 86.81 +18.488 0.91 86.81 +18.498 0.93 86.13 +18.508 0.91 85.47 +18.518 0.90 85.47 +18.528 0.91 84.81 +18.538 0.96 83.52 +18.548 0.33 92.65 +18.558 0.44 94.23 +18.568 0.61 83.52 +18.578 0.41 81.07 +18.588 0.21 89.63 +18.598 0.30 91.12 +18.608 0.91 80.47 +18.618 0.92 84.16 +18.628 0.90 85.47 +18.638 0.81 84.81 +18.648 0.56 102.08 +18.658 0.28 100.23 +18.668 0.19 2205.00 +18.678 0.51 2205.00 +18.688 0.57 3675.00 +18.698 0.77 3675.00 +18.707 0.77 3675.00 +18.717 0.77 3675.00 +18.727 0.00 5512.50 +18.737 0.09 97.57 +18.747 0.74 95.04 +18.757 0.90 95.87 +18.767 0.93 89.63 +18.777 0.91 90.37 +18.787 0.79 90.37 +18.797 0.93 86.81 +18.807 0.95 86.81 +18.817 0.95 86.81 +18.827 0.97 86.81 +18.837 0.92 87.50 +18.847 0.97 86.81 +18.857 0.97 86.81 +18.867 0.97 86.81 +18.877 0.00 108.09 +18.887 0.40 101.15 +18.897 0.47 136.11 +18.907 0.00 114.84 +18.917 0.01 101.15 +18.927 0.07 81.07 +18.937 0.52 85.47 +18.947 0.21 106.01 +18.957 0.24 89.63 +18.967 0.34 88.20 +18.977 0.66 87.50 +18.987 0.84 86.81 +18.997 0.83 86.81 +19.007 0.84 86.13 +19.017 0.84 86.13 +19.027 0.79 83.52 +19.037 0.58 82.28 +19.047 0.71 82.28 +19.057 0.63 80.47 +19.067 0.76 82.28 +19.077 0.33 80.47 +19.087 0.31 116.05 +19.097 0.80 114.84 +19.107 0.80 114.84 +19.117 0.75 118.55 +19.127 0.70 111.36 +19.137 0.46 111.36 +19.146 0.71 112.50 +19.156 0.67 110.25 +19.166 0.77 109.16 +19.176 0.87 108.09 +19.186 0.90 107.04 +19.196 0.89 105.00 +19.206 0.89 105.00 +19.216 0.90 424.04 +19.226 0.45 393.75 +19.236 0.79 99.32 +19.246 0.87 96.71 +19.256 0.82 99.32 +19.266 0.71 100.23 +19.276 0.43 100.23 +19.286 0.36 95.87 +19.296 0.00 306.25 +19.306 0.35 297.97 +19.316 0.67 306.25 +19.326 0.18 282.69 +19.336 0.49 315.00 +19.346 0.32 95.04 +19.356 0.79 91.88 +19.366 0.83 92.65 +19.376 0.79 91.88 +19.386 0.83 92.65 +19.396 0.64 93.43 +19.406 0.55 95.04 +19.416 0.09 315.00 +19.426 0.39 96.71 +19.436 0.38 102.08 +19.446 0.22 324.26 +19.456 0.05 306.25 +19.466 0.38 97.57 +19.476 0.28 648.53 +19.486 0.26 275.62 +19.496 0.45 204.17 +19.506 0.46 225.00 +19.516 0.16 239.67 +19.526 0.27 245.00 +19.536 0.40 128.20 +19.546 0.38 268.90 +19.556 0.29 97.57 +19.566 0.28 459.38 +19.576 0.38 479.35 +19.585 0.29 102.08 +19.595 0.48 107.04 +19.605 0.65 111.36 +19.615 0.72 110.25 +19.625 0.04 96.71 +19.635 0.38 112.50 +19.645 0.54 81.67 +19.655 0.45 96.71 +19.665 0.74 96.71 +19.675 0.51 96.71 +19.685 0.45 95.87 +19.695 0.47 172.27 +19.705 0.53 95.87 +19.715 0.39 89.63 +19.725 0.21 104.01 +19.735 0.40 200.45 +19.745 0.50 172.27 +19.755 0.17 196.88 +19.765 0.75 200.45 +19.775 0.63 196.88 +19.785 0.55 193.42 +19.795 0.49 186.86 +19.805 0.80 186.86 +19.815 0.80 186.86 +19.825 0.80 186.86 +19.835 0.44 167.05 +19.845 0.46 367.50 +19.855 0.64 367.50 +19.865 0.69 424.04 +19.875 0.31 459.38 +19.885 0.55 393.75 +19.895 0.24 157.50 +19.905 0.64 175.00 +19.915 0.09 190.09 +19.925 0.06 216.18 +19.935 0.16 84.81 +19.945 0.38 88.91 +19.955 0.33 159.78 +19.965 0.57 175.00 +19.975 0.78 177.82 +19.985 0.56 180.74 +19.995 0.69 183.75 +20.005 0.65 177.82 +20.015 0.70 172.27 +20.024 0.58 175.00 +20.034 0.22 147.00 +20.044 0.48 180.74 +20.054 0.61 177.82 +20.064 0.59 88.91 +20.074 0.48 180.74 +20.084 0.55 169.62 +20.094 0.68 172.27 +20.104 0.69 177.82 +20.114 0.48 180.74 +20.124 0.38 175.00 +20.134 0.34 164.55 +20.144 0.62 162.13 +20.154 0.57 147.00 +20.164 0.37 145.07 +20.174 0.53 147.00 +20.184 0.51 147.00 +20.194 0.76 153.12 +20.204 0.71 155.28 +20.214 0.41 155.28 +20.224 0.44 159.78 +20.234 0.38 159.78 +20.244 0.70 153.12 +20.254 0.55 164.55 +20.264 0.00 155.28 +20.274 0.00 180.74 +20.284 0.13 3675.00 +20.294 0.00 103.04 +20.304 0.18 141.35 +20.314 0.36 119.84 +20.324 0.00 82.28 +20.334 0.00 98.44 +20.344 0.46 97.57 +20.354 0.68 82.28 +20.364 0.44 95.04 +20.374 0.89 88.20 +20.384 0.96 86.13 +20.394 0.90 88.20 +20.404 0.92 87.50 +20.414 0.94 88.20 +20.424 0.94 88.91 +20.434 0.91 88.20 +20.444 0.97 87.50 +20.454 0.94 88.20 +20.463 0.93 88.20 +20.473 0.95 88.20 +20.483 0.90 88.91 +20.493 0.94 87.50 +20.503 0.77 86.13 +20.513 0.94 87.50 +20.523 0.71 88.91 +20.533 0.00 106.01 +20.543 0.45 91.88 +20.553 0.04 109.16 +20.563 0.00 114.84 +20.573 0.34 118.55 +20.583 0.80 136.11 +20.593 0.00 114.84 +20.603 0.00 114.84 +20.613 0.48 80.47 +20.623 0.49 81.07 +20.633 0.73 86.13 +20.643 0.22 80.47 +20.653 0.18 80.47 +20.663 0.29 110.25 +20.673 0.57 111.36 +20.683 0.38 612.50 +20.693 0.41 612.50 +20.703 0.66 648.53 +20.713 0.66 648.53 +20.723 0.66 648.53 +20.733 0.34 689.06 +20.743 0.10 648.53 +20.753 0.02 122.50 +20.763 0.00 82.89 +20.773 0.00 145.07 +20.783 0.00 459.38 +20.793 0.13 459.38 +20.803 0.87 459.38 +20.813 0.78 229.69 +20.823 0.77 229.69 +20.833 0.95 229.69 +20.833 0.87 225.00 diff --git a/test/regression/chan3.logspec b/test/regression/chan3.logspec new file mode 100644 index 0000000..66b1c9f Binary files /dev/null and b/test/regression/chan3.logspec differ diff --git a/test/regression/chan3.mfc b/test/regression/chan3.mfc new file mode 100644 index 0000000..356c85e Binary files /dev/null and b/test/regression/chan3.mfc differ diff --git a/test/regression/chan3.raw b/test/regression/chan3.raw new file mode 100644 index 0000000..8c1d012 Binary files /dev/null and b/test/regression/chan3.raw differ diff --git a/test/regression/chan3.sph b/test/regression/chan3.sph new file mode 100644 index 0000000..19965df Binary files /dev/null and b/test/regression/chan3.sph differ diff --git a/test/regression/chan3.wav b/test/regression/chan3.wav new file mode 100644 index 0000000..252cf5e Binary files /dev/null and b/test/regression/chan3.wav differ diff --git a/test/regression/polite.gram b/test/regression/polite.gram new file mode 100644 index 0000000..b4a0550 --- /dev/null +++ b/test/regression/polite.gram @@ -0,0 +1,12 @@ +#JSGF V1.0; + +/** + * JSGF Grammar for Hello World example + */ + +grammar polite; + +public = [please | kindly | could you | oh mighty computer]; +public = [please | thanks | thank you]; + +public = ( | )*; diff --git a/test/regression/right_recursion_53.fsg b/test/regression/right_recursion_53.fsg new file mode 100644 index 0000000..0f40d0d --- /dev/null +++ b/test/regression/right_recursion_53.fsg @@ -0,0 +1,98 @@ +FSG_BEGIN +NUM_STATES 65 +START_STATE 0 +FINAL_STATE 1 +TRANSITION 0 2 0.500041 +TRANSITION 0 59 0.500041 +TRANSITION 2 4 1.000000 +TRANSITION 3 1 1.000000 +TRANSITION 4 6 1.000000 +TRANSITION 5 36 1.000000 +TRANSITION 6 22 0.500041 +TRANSITION 6 8 0.500041 +TRANSITION 7 5 1.000000 +TRANSITION 8 20 0.083336 TWO +TRANSITION 8 21 0.083336 ONE +TRANSITION 8 10 0.083336 THOUSAND +TRANSITION 8 11 0.083336 HUNDRED +TRANSITION 8 12 0.083336 TEN +TRANSITION 8 13 0.083336 NINE +TRANSITION 8 14 0.083336 EIGHT +TRANSITION 8 15 0.083336 SEVEN +TRANSITION 8 16 0.083336 SIX +TRANSITION 8 17 0.083336 FIVE +TRANSITION 8 18 0.083336 FOUR +TRANSITION 8 19 0.083336 THREE +TRANSITION 9 7 1.000000 +TRANSITION 10 9 1.000000 +TRANSITION 11 9 1.000000 +TRANSITION 12 9 1.000000 +TRANSITION 13 9 1.000000 +TRANSITION 14 9 1.000000 +TRANSITION 15 9 1.000000 +TRANSITION 16 9 1.000000 +TRANSITION 17 9 1.000000 +TRANSITION 18 9 1.000000 +TRANSITION 19 9 1.000000 +TRANSITION 20 9 1.000000 +TRANSITION 21 9 1.000000 +TRANSITION 22 24 0.083336 THOUSAND +TRANSITION 22 25 0.083336 HUNDRED +TRANSITION 22 26 0.083336 TEN +TRANSITION 22 27 0.083336 NINE +TRANSITION 22 28 0.083336 EIGHT +TRANSITION 22 29 0.083336 SEVEN +TRANSITION 22 30 0.083336 SIX +TRANSITION 22 31 0.083336 FIVE +TRANSITION 22 32 0.083336 FOUR +TRANSITION 22 33 0.083336 THREE +TRANSITION 22 34 0.083336 TWO +TRANSITION 22 35 0.083336 ONE +TRANSITION 23 6 1.000000 +TRANSITION 24 23 1.000000 +TRANSITION 25 23 1.000000 +TRANSITION 26 23 1.000000 +TRANSITION 27 23 1.000000 +TRANSITION 28 23 1.000000 +TRANSITION 29 23 1.000000 +TRANSITION 30 23 1.000000 +TRANSITION 31 23 1.000000 +TRANSITION 32 23 1.000000 +TRANSITION 33 23 1.000000 +TRANSITION 34 23 1.000000 +TRANSITION 35 23 1.000000 +TRANSITION 36 38 1.000000 +TRANSITION 37 43 1.000000 +TRANSITION 38 40 0.333356 MILE +TRANSITION 38 41 0.333356 CENTIMETER +TRANSITION 38 42 0.333356 METER +TRANSITION 39 37 1.000000 +TRANSITION 40 39 1.000000 +TRANSITION 41 39 1.000000 +TRANSITION 42 39 1.000000 +TRANSITION 43 45 1.000000 EQUAL +TRANSITION 44 47 1.000000 +TRANSITION 45 46 1.000000 TO +TRANSITION 46 44 1.000000 +TRANSITION 47 50 0.500041 HOW +TRANSITION 47 49 0.500041 +TRANSITION 48 52 1.000000 +TRANSITION 49 48 1.000000 +TRANSITION 50 51 1.000000 MANY +TRANSITION 51 48 1.000000 +TRANSITION 52 54 1.000000 +TRANSITION 53 3 1.000000 +TRANSITION 54 56 0.333356 MILE +TRANSITION 54 57 0.333356 CENTIMETER +TRANSITION 54 58 0.333356 METER +TRANSITION 55 53 1.000000 +TRANSITION 56 55 1.000000 +TRANSITION 57 55 1.000000 +TRANSITION 58 55 1.000000 +TRANSITION 59 61 1.000000 WHAT +TRANSITION 60 1 1.000000 +TRANSITION 61 62 1.000000 IS +TRANSITION 62 63 1.000000 YOUR +TRANSITION 63 64 1.000000 NAME +TRANSITION 64 60 1.000000 +FSG_END diff --git a/test/regression/right_recursion_53.gram b/test/regression/right_recursion_53.gram new file mode 100644 index 0000000..af988bd --- /dev/null +++ b/test/regression/right_recursion_53.gram @@ -0,0 +1,8 @@ +#JSGF V1.0; + +// See https://github.com/cmusphinx/pocketsphinx/issues/53 + +grammar testGrammar; + = (METER|CENTIMETER|MILE); + = (ONE|TWO|THREE|FOUR|FIVE|SIX|SEVEN|EIGHT|NINE|TEN|HUNDRED|THOUSAND)+; +public = (WHAT IS YOUR NAME) | ( (EQUAL TO) [HOW MANY] ) ; diff --git a/test/regression/test-align.sh b/test/regression/test-align.sh new file mode 100755 index 0000000..d97b7b7 --- /dev/null +++ b/test/regression/test-align.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +: ${CMAKE_BINARY_DIR:=$(pwd)} +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh + +bn=`basename $0 .sh` + +echo "Test: $bn" +run_program pocketsphinx_batch \ + -loglevel INFO \ + -hmm $model/en-us/en-us \ + -dict $model/en-us/cmudict-en-us.dict \ + -alignctl $data/librivox/fileids \ + -aligndir $data/librivox \ + -alignext .txt \ + -ctl $data/librivox/fileids \ + -cepdir $data/librivox \ + -cepext .wav \ + -adcin yes \ + -adchdr 44 \ + -hyp $bn.align \ + -hypseg $bn.matchseg \ + -bestpath no \ + -backtrace yes \ + > $bn.log 2>&1 + +# Test whether it actually completed +if [ $? = 0 ]; then + pass "run" +else + fail "run" +fi + +# Check the decoding results +grep AVERAGE $bn.log +compare_table "matchseg" $data/librivox/test-align.matchseg $bn.matchseg 1000000 +compare_table "matchseg" $data/librivox/test-align.align $bn.align 1000000 diff --git a/test/regression/test-cards.sh b/test/regression/test-cards.sh index 83f26fe..415841d 100755 --- a/test/regression/test-cards.sh +++ b/test/regression/test-cards.sh @@ -1,15 +1,18 @@ -#!/bin/sh +#!/bin/bash -. ../testfuncs.sh +: ${CMAKE_BINARY_DIR:=$(pwd)} +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh bn=`basename $0 .sh` echo "Test: $bn" run_program pocketsphinx_batch \ + -loglevel INFO \ -hmm $model/en-us/en-us \ -jsgf $data/cards/cards.gram \ -dict $model/en-us/cmudict-en-us.dict\ -ctl $data/cards/cards.fileids \ + -bestpath no \ -adcin yes \ -cepdir $data/cards \ -cepext .wav \ diff --git a/test/regression/test-cepview.sh b/test/regression/test-cepview.sh new file mode 100755 index 0000000..cde6a98 --- /dev/null +++ b/test/regression/test-cepview.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +: ${CMAKE_BINARY_DIR:=$(pwd)} +.${CMAKE_BINARY_DIR}/test/testfuncs.sh + +echo "CEPVIEW TEST" +tmpout="test-cepview.out" + +run_program sphinx_cepview/sphinx_cepview \ +-i 13 \ +-d 13 \ +-f $tests/regression/chan3.mfc \ +> $tmpout 2>test-cepview.err +if diff -w $tmpout $tests/regression/chan3.cepview > /dev/null 2>&1; then +pass "CEPVIEW test"; else +fail "CEPVIEW test"; fi diff --git a/test/regression/test-lm.sh b/test/regression/test-lm.sh index d8d562c..8846274 100755 --- a/test/regression/test-lm.sh +++ b/test/regression/test-lm.sh @@ -1,6 +1,7 @@ -#!/bin/sh +#!/bin/bash -. ../testfuncs.sh +: ${CMAKE_BINARY_DIR:=$(pwd)} +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh bn=`basename $0 .sh` @@ -14,6 +15,7 @@ run_program pocketsphinx_batch \ -cepext .wav \ -adcin yes \ -hyp $bn.match \ + -loglevel INFO \ -backtrace yes \ > $bn.log 2>&1 diff --git a/test/regression/test-main-align.sh b/test/regression/test-main-align.sh new file mode 100755 index 0000000..99d3d8b --- /dev/null +++ b/test/regression/test-main-align.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +: ${CMAKE_BINARY_DIR:=$(pwd)} +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh + +bn=`basename $0 .sh` + +echo "Test: $bn" +for wav in $data/librivox/*.wav; do \ + utt=$(basename $wav .wav) + run_program pocketsphinx \ + -loglevel INFO \ + -hmm $model/en-us/en-us \ + -dict $model/en-us/cmudict-en-us.dict \ + align $wav $(cat $data/librivox/$utt.txt) \ + > $utt.json 2>>$bn.log + run_program pocketsphinx \ + -loglevel INFO \ + -phone_align yes \ + -hmm $model/en-us/en-us \ + -dict $model/en-us/cmudict-en-us.dict \ + align $wav $(cat $data/librivox/$utt.txt) \ + > $utt.phone.json 2>>$bn.phone.log + run_program pocketsphinx \ + -loglevel INFO \ + -state_align yes \ + -hmm $model/en-us/en-us \ + -dict $model/en-us/cmudict-en-us.dict \ + align $wav $(cat $data/librivox/$utt.txt) \ + > $utt.state.json 2>>$bn.state.log + + # Test whether it actually completed + if [ $? = 0 ]; then + pass "run $utt" + else + fail "run $utt" + fi + # Check the decoding results + compare_table "match $utt" $data/librivox/$utt.json $utt.json 1.0 + compare_table "match $utt.phone" $data/librivox/$utt.phone.json $utt.phone.json 1.0 + compare_table "match $utt.state" $data/librivox/$utt.state.json $utt.state.json 1.0 +done + +run_program pocketsphinx \ + -loglevel INFO \ + -hmm $model/en-us/en-us \ + -lm $model/en-us/en-us.lm.bin \ + -dict $model/en-us/cmudict-en-us.dict align $data/null.wav ' ' \ + 2>>$bn.log >null-align.json +compare_table "match" $data/null-align.json null-align.json 1.0 diff --git a/test/regression/test-main.sh b/test/regression/test-main.sh new file mode 100755 index 0000000..1851c07 --- /dev/null +++ b/test/regression/test-main.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +: ${CMAKE_BINARY_DIR:=$(pwd)} +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh + +bn=`basename $0 .sh` + +echo "Test: $bn" +export POCKETSPHINX_PATH=$model +sox $data/librivox/*.wav $(run_program pocketsphinx soxflags) | \ + run_program pocketsphinx -loglevel INFO - \ + 2>$bn.log >$bn.json + +# Test whether it actually completed +if [ $? = 0 ]; then + pass "run" +else + fail "run" +fi + +if grep -q 'define FIXED' "${CMAKE_BINARY_DIR}/config.h"; then + ref="$data/librivox/$bn.fixed.json" +else + ref="$data/librivox/$bn.json" +fi + +# Check the decoding results +compare_table "match" $ref $bn.json 1000000 + +run_program pocketsphinx \ + -loglevel INFO \ + -hmm $model/en-us/en-us \ + -lm $model/en-us/en-us.lm.bin \ + -dict $model/en-us/cmudict-en-us.dict single $data/null.wav \ + 2>>$bn.log >null.json +compare_table "match" $data/null.json null.json 1000000 diff --git a/test/regression/test-sphinx_fe-ctl.sh b/test/regression/test-sphinx_fe-ctl.sh new file mode 100755 index 0000000..3ddda54 --- /dev/null +++ b/test/regression/test-sphinx_fe-ctl.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +: ${CMAKE_BINARY_DIR:=$(pwd)} +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh + +tmpout="test-sphinx_fe-ctl.out" + +echo "WAVE2FEAT CTL/WAV/SPH TEST" +run_program sphinx_fe/sphinx_fe \ +-samprate 11025 \ +-vad_threshold 2.0 \ +-frate 105 \ +-wlen 0.024 \ +-alpha 0.97 \ +-ncep 13 \ +-nfft 512 \ +-nfilt 36 \ +-upperf 5400 \ +-lowerf 130 \ +-blocksize 262500 \ +-verbose yes \ +-c $tests/regression/chan3.ctl \ +-di $tests/regression \ +-do . \ +-eo mfc \ +-input_endian little \ +> $tmpout 2>&1 + +run_program sphinx_fe/sphinx_fe \ +-samprate 11025 \ +-vad_threshold 2.0 \ +-frate 105 \ +-wlen 0.024 \ +-alpha 0.97 \ +-ncep 13 \ +-nfft 512 \ +-nfilt 36 \ +-upperf 5400 \ +-lowerf 130 \ +-blocksize 262500 \ +-nchans 2 \ +-i $tests/regression/chan3.2chan.wav \ +-o chan3.2chan.wav.mfc +> $tmpout 2>&1 + +if ! cmp chan3.wav.mfc chan3.raw.mfc; then + fail "WAV and RAW compare" +fi + +if ! cmp chan3.2chan.wav.mfc chan3.wav.mfc; then + fail "WAV2 and WAV compare" +fi + +if ! cmp chan3.raw.mfc chan3.sph.mfc; then + fail "SPH and RAW compare" +fi + +run_program sphinx_cepview/sphinx_cepview \ +-i 13 \ +-d 13 \ +-f chan3.wav.mfc \ +> test-sphinx_fe.cepview 2>>$tmpout + +compare_table "WAVE2FEAT test" test-sphinx_fe.cepview $tests/regression/chan3.cepview 0.1 diff --git a/test/regression/test-sphinx_fe-dct.sh b/test/regression/test-sphinx_fe-dct.sh new file mode 100755 index 0000000..215ae03 --- /dev/null +++ b/test/regression/test-sphinx_fe-dct.sh @@ -0,0 +1,33 @@ +#!/bin/bash + + +: ${CMAKE_BINARY_DIR:=$(pwd)} +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh + +tmpout="test-sphinx_fe-dct.out" + +echo "WAVE2FEAT-DCT INVERTIBLE TEST" +run_program sphinx_fe/sphinx_fe \ +-transform dct \ +-cep2spec yes \ +-nfilt 36 \ +-i $tests/regression/chan3.mfc \ +-o test-sphinx_fe-dct.logspec.out \ +> $tmpout 2>&1 + +run_program sphinx_fe/sphinx_fe \ +-transform dct \ +-spec2cep yes \ +-nfilt 36 \ +-i test-sphinx_fe-dct.logspec.out \ +-o test-sphinx_fe-dct.mfc.out \ +>> $tmpout 2>&1 + +run_program sphinx_cepview/sphinx_cepview \ +-i 13 \ +-d 13 \ +-f test-sphinx_fe-dct.mfc.out \ +> test-sphinx_fe-dct.cepview.out 2>>$tmpout + +compare_table "WAVE2FEAT-DCT INVERTIBLE test" test-sphinx_fe-dct.cepview.out \ + $tests/regression/chan3.cepview diff --git a/test/regression/test-sphinx_fe-dither-seed.sh b/test/regression/test-sphinx_fe-dither-seed.sh new file mode 100755 index 0000000..4cd07aa --- /dev/null +++ b/test/regression/test-sphinx_fe-dither-seed.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +: ${CMAKE_BINARY_DIR:=$(pwd)} +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh + +tmpout="test-sphinx_fe-dither-seed.out" + +# Run sphinx_fe with dither and seed, so it is repeatable. There's +# nothing special about the seed. Just chose it because it's pretty +echo "WAVE2FEAT-DITHER-SEED TEST" +run_program sphinx_fe/sphinx_fe \ +-dither 1 \ +-vad_threshold 2.0 \ +-seed 1234 \ +-samprate 11025 \ +-frate 105 \ +-wlen 0.024 \ +-alpha 0.97 \ +-ncep 13 \ +-nfft 512 \ +-nfilt 36 \ +-upperf 5400 \ +-lowerf 130 \ +-blocksize 262500 \ +-i $tests/regression/chan3.raw \ +-input_endian little \ +-o test-sphinx_fe-dither-seed.mfc.out \ +-raw 1 > $tmpout 2>&1 + +run_program sphinx_cepview/sphinx_cepview \ +-i 13 \ +-d 13 \ +-f test-sphinx_fe-dither-seed.mfc.out \ +> test-sphinx_fe-dither-seed.cepview.out 2>>$tmpout + +compare_table "WAVE2FEAT-DITHER-SEED test" test-sphinx_fe-dither-seed.cepview.out \ + $tests/regression/chan3-dither.cepview 0.1 diff --git a/test/regression/test-sphinx_fe-logspec.sh b/test/regression/test-sphinx_fe-logspec.sh new file mode 100755 index 0000000..5c960b5 --- /dev/null +++ b/test/regression/test-sphinx_fe-logspec.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +: ${CMAKE_BINARY_DIR:=$(pwd)} +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh + +tmpout="test-sphinx_fe-logspec.out" + +echo "WAVE2FEAT-LOGSPEC TEST" +run_program sphinx_fe/sphinx_fe \ +-logspec 1 \ +-vad_threshold 2.0 \ +-samprate 11025 \ +-frate 105 \ +-wlen 0.024 \ +-alpha 0.97 \ +-nfft 512 \ +-nfilt 36 \ +-upperf 5400 \ +-lowerf 130 \ +-blocksize 262500 \ +-i $tests/regression/chan3.raw \ +-input_endian little \ +-o test-sphinx_fe-logspec.mfc.out \ +-raw 1 > $tmpout 2>&1 + +run_program sphinx_cepview/sphinx_cepview \ +-i 36 \ +-d 36 \ +-f test-sphinx_fe-logspec.mfc.out \ +> test-sphinx_fe-logspec.cepview.out 2>>$tmpout + +compare_table "WAVE2FEAT-LOGSPEC test" test-sphinx_fe-logspec.cepview.out \ + $tests/regression/chan3-logspec.cepview 0.2 diff --git a/test/regression/test-sphinx_fe-logspec2cep.sh b/test/regression/test-sphinx_fe-logspec2cep.sh new file mode 100755 index 0000000..d9122fb --- /dev/null +++ b/test/regression/test-sphinx_fe-logspec2cep.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +: ${CMAKE_BINARY_DIR:=$(pwd)} +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh + +tmpout="test-sphinx_fe-logspec2cep.out" + +echo "WAVE2FEAT-LOGSPEC2CEP TEST" +run_program sphinx_fe/sphinx_fe \ +-spec2cep yes \ +-nfilt 36 \ +-i $tests/regression/chan3.logspec \ +-o test-sphinx_fe-logspec2cep.mfc.out \ +> $tmpout 2>&1 + +run_program sphinx_cepview/sphinx_cepview \ +-i 13 \ +-d 13 \ +-f test-sphinx_fe-logspec2cep.mfc.out \ +> test-sphinx_fe-logspec2cep.cepview.out 2>>$tmpout + +compare_table "WAVE2FEAT-LOGSPEC2CEP test" test-sphinx_fe-logspec2cep.cepview.out \ + $tests/regression/chan3.cepview diff --git a/test/regression/test-sphinx_fe-smoothspec.sh b/test/regression/test-sphinx_fe-smoothspec.sh new file mode 100755 index 0000000..334fbb1 --- /dev/null +++ b/test/regression/test-sphinx_fe-smoothspec.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +: ${CMAKE_BINARY_DIR:=$(pwd)} +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh + +tmpout="test-sphinx_fe-smoothspec.out" + +echo "WAVE2FEAT-SMOOTHSPEC TEST" +run_program sphinx_fe/sphinx_fe \ +-smoothspec yes \ +-samprate 11025 \ +-vad_threshold 2.0 \ +-frate 105 \ +-wlen 0.024 \ +-alpha 0.97 \ +-nfft 512 \ +-nfilt 36 \ +-upperf 5400 \ +-lowerf 130 \ +-blocksize 262500 \ +-i $tests/regression/chan3.raw \ +-input_endian little \ +-o test-sphinx_fe-smoothspec.logspec.out \ +-raw yes > $tmpout 2>&1 + +run_program sphinx_cepview/sphinx_cepview \ +-i 36 \ +-d 36 \ +-f test-sphinx_fe-smoothspec.logspec.out \ +> test-sphinx_fe-smoothspec.cepview.out 2>>$tmpout + +compare_table "WAVE2FEAT-SMOOTHSPEC test" test-sphinx_fe-smoothspec.cepview.out \ + $tests/regression/chan3-smoothspec.cepview 0.1 diff --git a/test/regression/test-sphinx_fe.sh b/test/regression/test-sphinx_fe.sh new file mode 100755 index 0000000..3f713f5 --- /dev/null +++ b/test/regression/test-sphinx_fe.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +: ${CMAKE_BINARY_DIR:=$(pwd)} +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh + +tmpout="test-sphinx_fe.out" + +echo "WAVE2FEAT TEST" +run_program sphinx_fe/sphinx_fe \ +-vad_threshold 2.0 \ +-samprate 11025 \ +-frate 105 \ +-wlen 0.024 \ +-alpha 0.97 \ +-ncep 13 \ +-nfft 512 \ +-nfilt 36 \ +-upperf 5400 \ +-lowerf 130 \ +-blocksize 262500 \ +-i $tests/regression/chan3.raw \ +-input_endian little \ +-o test-sphinx_fe.mfc \ +-raw 1 > $tmpout 2>&1 + +run_program sphinx_cepview/sphinx_cepview \ +-i 13 \ +-d 13 \ +-f test-sphinx_fe.mfc \ +> test-sphinx_fe.cepview 2>>$tmpout + +compare_table "WAVE2FEAT test" test-sphinx_fe.cepview $tests/regression/chan3.cepview 0.1 diff --git a/test/regression/test-sphinx_jsgf2fsg.sh b/test/regression/test-sphinx_jsgf2fsg.sh new file mode 100755 index 0000000..7b6f226 --- /dev/null +++ b/test/regression/test-sphinx_jsgf2fsg.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +: ${CMAKE_BINARY_DIR:=$(pwd)} +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh + +echo "JSGF2FSG TEST" +rules="test.rightRecursion test.nestedRightRecursion test.kleene test.nulltest test.command" + +tmpout="test-jsgf2fsg.out" +rm -f $tmpout + +JSGF_PATH=$tests/regression +export JSGF_PATH +for r in $rules; do + run_program pocketsphinx_jsgf2fsg \ + -jsgf $tests/regression/test.gram -toprule $r -fsg $r.out 2>>$tmpout + compare_table $r $r.out $tests/regression/$r.fsg +done + +run_program pocketsphinx_jsgf2fsg \ + -jsgf $tests/regression/right_recursion_53.gram -fsg right_recursion_53.fsg 2>>$tmpout +compare_table right_recursion_53 right_recursion_53.fsg $tests/regression/right_recursion_53.fsg + diff --git a/test/regression/test-sphinx_pitch.sh b/test/regression/test-sphinx_pitch.sh new file mode 100755 index 0000000..02960cf --- /dev/null +++ b/test/regression/test-sphinx_pitch.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +: ${CMAKE_BINARY_DIR:=$(pwd)} +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh + +tmpout="test-sphinx_pitch.out" + +echo "PITCH TEST" +run_program sphinx_adtools/sphinx_pitch \ +-samprate 11025 \ +-i $tests/regression/chan3.raw \ +-input_endian little \ +-o test-sphinx_pitch.f0 \ +-raw yes > $tmpout 2>&1 + +compare_table "PITCH test" test-sphinx_pitch.f0 $tests/regression/chan3.f0 0.1 diff --git a/test/regression/test-tidigits-fsg.sh b/test/regression/test-tidigits-fsg.sh index 4e7af80..113daf0 100755 --- a/test/regression/test-tidigits-fsg.sh +++ b/test/regression/test-tidigits-fsg.sh @@ -1,6 +1,7 @@ -#!/bin/sh +#!/bin/bash -. ../testfuncs.sh +: ${CMAKE_BINARY_DIR:=$(pwd)} +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh bn=`basename $0 .sh` @@ -13,6 +14,8 @@ run_program pocketsphinx_batch \ -cepdir $data/tidigits \ -hyp $bn.match \ -wbeam 1e-48 \ + -bestpath no \ + -loglevel INFO \ > $bn.log 2>&1 # Test whether it actually completed diff --git a/test/regression/test-tidigits-simple.sh b/test/regression/test-tidigits-simple.sh index 17d3231..c2789cf 100755 --- a/test/regression/test-tidigits-simple.sh +++ b/test/regression/test-tidigits-simple.sh @@ -1,6 +1,7 @@ -#!/bin/sh +#!/bin/bash -. ../testfuncs.sh +: ${CMAKE_BINARY_DIR:=$(pwd)} +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh bn=`basename $0 .sh` @@ -12,6 +13,7 @@ run_program pocketsphinx_batch \ -ctl $data/tidigits/tidigits.ctl \ -cepdir $data/tidigits \ -hyp $bn.match \ + -loglevel INFO \ > $bn.log 2>&1 # Test whether it actually completed diff --git a/test/regression/test.command.fsg b/test/regression/test.command.fsg new file mode 100644 index 0000000..68bc9b0 --- /dev/null +++ b/test/regression/test.command.fsg @@ -0,0 +1,47 @@ +FSG_BEGIN +NUM_STATES 33 +START_STATE 0 +FINAL_STATE 1 +TRANSITION 0 2 1.000000 +TRANSITION 2 4 1.000000 +TRANSITION 3 14 1.000000 +TRANSITION 4 7 0.200004 oh +TRANSITION 4 10 0.200004 could +TRANSITION 4 12 0.200004 kindly +TRANSITION 4 13 0.200004 please +TRANSITION 4 6 0.200004 +TRANSITION 5 3 1.000000 +TRANSITION 6 5 1.000000 +TRANSITION 7 8 1.000000 mighty +TRANSITION 8 9 1.000000 computer +TRANSITION 9 5 1.000000 +TRANSITION 10 11 1.000000 you +TRANSITION 11 5 1.000000 +TRANSITION 12 5 1.000000 +TRANSITION 13 5 1.000000 +TRANSITION 14 20 0.500041 +TRANSITION 14 16 0.500041 +TRANSITION 15 24 1.000000 +TRANSITION 16 18 0.500041 stop +TRANSITION 16 19 0.500041 stop +TRANSITION 17 15 1.000000 +TRANSITION 18 17 1.000000 +TRANSITION 19 16 1.000000 +TRANSITION 20 23 0.500041 go +TRANSITION 20 22 0.500041 +TRANSITION 21 15 1.000000 +TRANSITION 22 21 1.000000 +TRANSITION 23 20 1.000000 +TRANSITION 24 26 1.000000 +TRANSITION 25 1 1.000000 +TRANSITION 26 29 0.250016 thank +TRANSITION 26 31 0.250016 thanks +TRANSITION 26 32 0.250016 please +TRANSITION 26 28 0.250016 +TRANSITION 27 25 1.000000 +TRANSITION 28 27 1.000000 +TRANSITION 29 30 1.000000 you +TRANSITION 30 27 1.000000 +TRANSITION 31 27 1.000000 +TRANSITION 32 27 1.000000 +FSG_END diff --git a/test/regression/test.gram b/test/regression/test.gram new file mode 100644 index 0000000..826493a --- /dev/null +++ b/test/regression/test.gram @@ -0,0 +1,38 @@ +#JSGF V1.0; + +/** + * JSGF Grammar for Hello World example + */ + +grammar test; + +import ; +import ; + + +public = | ; + = stop | start; + = and ; + + + +public = something | ; + = another | ; + + +public = * don't crash; + = please | kindly | oh mighty computer; + + +public = ; + + = (one [and] one); + = (two [and] two); + = (three [and] three); + + + +public = ; + + = go* | stop+; + diff --git a/test/regression/test.kleene.fsg b/test/regression/test.kleene.fsg new file mode 100644 index 0000000..68eb52f --- /dev/null +++ b/test/regression/test.kleene.fsg @@ -0,0 +1,21 @@ +FSG_BEGIN +NUM_STATES 14 +START_STATE 0 +FINAL_STATE 1 +TRANSITION 0 2 1.000000 +TRANSITION 2 4 0.500041 +TRANSITION 2 5 0.500041 +TRANSITION 3 12 1.000000 don't +TRANSITION 4 3 1.000000 +TRANSITION 5 7 0.333356 oh +TRANSITION 5 10 0.333356 kindly +TRANSITION 5 11 0.333356 please +TRANSITION 6 2 1.000000 +TRANSITION 7 8 1.000000 mighty +TRANSITION 8 9 1.000000 computer +TRANSITION 9 6 1.000000 +TRANSITION 10 6 1.000000 +TRANSITION 11 6 1.000000 +TRANSITION 12 13 1.000000 crash +TRANSITION 13 1 1.000000 +FSG_END diff --git a/test/regression/test.nestedRightRecursion.fsg b/test/regression/test.nestedRightRecursion.fsg new file mode 100644 index 0000000..ba8c810 --- /dev/null +++ b/test/regression/test.nestedRightRecursion.fsg @@ -0,0 +1,12 @@ +FSG_BEGIN +NUM_STATES 6 +START_STATE 0 +FINAL_STATE 1 +TRANSITION 0 5 0.500041 something +TRANSITION 0 2 0.500041 +TRANSITION 2 4 0.500041 another +TRANSITION 2 0 0.500041 +TRANSITION 3 1 1.000000 +TRANSITION 4 3 1.000000 +TRANSITION 5 1 1.000000 +FSG_END diff --git a/test/regression/test.nulltest.fsg b/test/regression/test.nulltest.fsg new file mode 100644 index 0000000..5f0b815 --- /dev/null +++ b/test/regression/test.nulltest.fsg @@ -0,0 +1,42 @@ +FSG_BEGIN +NUM_STATES 35 +START_STATE 0 +FINAL_STATE 1 +TRANSITION 0 2 1.000000 +TRANSITION 2 4 1.000000 +TRANSITION 3 13 1.000000 +TRANSITION 4 5 1.000000 +TRANSITION 5 7 1.000000 one +TRANSITION 6 3 1.000000 +TRANSITION 7 8 1.000000 +TRANSITION 8 11 0.500041 and +TRANSITION 8 10 0.500041 +TRANSITION 9 12 1.000000 one +TRANSITION 10 9 1.000000 +TRANSITION 11 9 1.000000 +TRANSITION 12 6 1.000000 +TRANSITION 13 15 1.000000 +TRANSITION 14 24 1.000000 +TRANSITION 15 16 1.000000 +TRANSITION 16 18 1.000000 two +TRANSITION 17 14 1.000000 +TRANSITION 18 19 1.000000 +TRANSITION 19 22 0.500041 and +TRANSITION 19 21 0.500041 +TRANSITION 20 23 1.000000 two +TRANSITION 21 20 1.000000 +TRANSITION 22 20 1.000000 +TRANSITION 23 17 1.000000 +TRANSITION 24 26 1.000000 +TRANSITION 25 1 1.000000 +TRANSITION 26 27 1.000000 +TRANSITION 27 29 1.000000 three +TRANSITION 28 25 1.000000 +TRANSITION 29 30 1.000000 +TRANSITION 30 33 0.500041 and +TRANSITION 30 32 0.500041 +TRANSITION 31 34 1.000000 three +TRANSITION 32 31 1.000000 +TRANSITION 33 31 1.000000 +TRANSITION 34 28 1.000000 +FSG_END diff --git a/test/regression/test.rightRecursion.fsg b/test/regression/test.rightRecursion.fsg new file mode 100644 index 0000000..83de3af --- /dev/null +++ b/test/regression/test.rightRecursion.fsg @@ -0,0 +1,20 @@ +FSG_BEGIN +NUM_STATES 13 +START_STATE 0 +FINAL_STATE 1 +TRANSITION 0 2 0.500041 +TRANSITION 0 9 0.500041 +TRANSITION 2 4 1.000000 +TRANSITION 3 1 1.000000 +TRANSITION 4 6 0.500041 start +TRANSITION 4 7 0.500041 stop +TRANSITION 5 8 1.000000 and +TRANSITION 6 5 1.000000 +TRANSITION 7 5 1.000000 +TRANSITION 8 0 1.000000 +TRANSITION 9 11 0.500041 start +TRANSITION 9 12 0.500041 stop +TRANSITION 10 1 1.000000 +TRANSITION 11 10 1.000000 +TRANSITION 12 10 1.000000 +FSG_END diff --git a/test/testfuncs.sh.in b/test/testfuncs.sh.in index beec392..f87c005 100644 --- a/test/testfuncs.sh.in +++ b/test/testfuncs.sh.in @@ -1,34 +1,35 @@ # Utility functions and parameters for regression tests +# No longer very useful with CMake but whatever # Predefined directories you may need -# Stupid broken CMU Facilities autoconf doesn't do @abs_top_srcdir@ -builddir=../"@top_builddir@" -sourcedir=../"@top_srcdir@" +builddir="@CMAKE_BINARY_DIR@" +sourcedir="@CMAKE_SOURCE_DIR@" tests=$sourcedir/test data=$sourcedir/test/data model=$sourcedir/model -programs="$builddir/src/programs" +programs=$builddir # Automatically report failures on exit failures="" +trap "fail $0" 4 6 7 10 11 trap "report_failures" 0 run_program() { program="$1" shift - $builddir/libtool --mode=execute "$programs/$program" $@ + "$programs/$program" "$@" } debug_program() { program="$1" shift - $builddir/libtool --mode=execute gdb --args "$programs/$program" $@ + gdb --args "$programs/$program" "$@" } memcheck_program() { program="$1" shift - $builddir/libtool --mode=execute valgrind --leak-check=full "$programs/$program" $@ + valgrind --leak-check=full "$programs/$program" "$@" } pass() { @@ -45,7 +46,7 @@ fail() { compare_table() { title="$1" shift - if perl "$tests/compare_table.pl" $@ | grep SUCCESS >/dev/null 2>&1; then + if perl "$tests/compare_table.pl" "$@" | grep SUCCESS >/dev/null 2>&1; then pass "$title" else fail "$title" diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt new file mode 100644 index 0000000..af108b7 --- /dev/null +++ b/test/unit/CMakeLists.txt @@ -0,0 +1,58 @@ +configure_file(test_macros.h.in test_macros.h @ONLY) +set(TESTS + test_acmod + test_acmod_grow + test_alignment + test_allphone + test_bitvec + test_config + test_dict2pid + test_dict + test_fe + test_fwdflat + test_fwdtree_bestpath + test_fwdtree + test_init + test_jsgf + test_keyphrase + test_lattice + test_ngram_model_read + test_log_shifted + test_log_int8 + test_log_int16 + test_mllr + test_nbest + test_pitch + test_posterior + test_ptm_mgau + test_reinit + test_senfh + test_set_search + test_simple + test_state_align + test_vad + test_word_align + test_endpointer + ) +foreach(TEST_EXECUTABLE ${TESTS}) + add_executable(${TEST_EXECUTABLE} EXCLUDE_FROM_ALL ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) + add_test(NAME ${TEST_EXECUTABLE} COMMAND ${TEST_EXECUTABLE}) + add_dependencies(check ${TEST_EXECUTABLE}) +endforeach() + +add_subdirectory(test_alloc) +add_subdirectory(test_case) +add_subdirectory(test_feat) +add_subdirectory(test_fsg) +add_subdirectory(test_hash) +add_subdirectory(test_lineiter) +add_subdirectory(test_matrix) +add_subdirectory(test_ngram) +add_subdirectory(test_string) +add_subdirectory(test_util) diff --git a/test/unit/Makefile.am b/test/unit/Makefile.am deleted file mode 100644 index 578c0d5..0000000 --- a/test/unit/Makefile.am +++ /dev/null @@ -1,49 +0,0 @@ -check_PROGRAMS = \ - test_acmod \ - test_acmod_grow \ - test_alignment \ - test_allphone \ - test_dict2pid \ - test_dict \ - test_fsg \ - test_fwdflat \ - test_fwdtree_bestpath \ - test_fwdtree \ - test_init \ - test_jsgf \ - test_keyphrase \ - test_lattice \ - test_lm_read \ - test_mllr \ - test_nbest \ - test_posterior \ - test_ptm_mgau \ - test_reinit \ - test_senfh \ - test_set_search \ - test_simple \ - test_state_align - -TESTS = $(check_PROGRAMS) - -EXTRA_DIST = test_ps.c - -noinst_HEADERS = test_macros.h - -AM_CFLAGS =-I$(top_srcdir)/include \ - -I$(top_srcdir)/src/libpocketsphinx \ - -I$(top_builddir)/include \ - -I$(srcdir) \ - -DMODELDIR=\"${top_srcdir}/model\" \ - -DDATADIR=\"${top_srcdir}/test/data\" - -LDADD = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la \ - -lsphinxbase - -CLEANFILES = *.log *.out *.lat *.mfc *.raw *.dic *.sen - -valgrind-check: - for testf in .libs/lt-*; do valgrind --leak-check=full --show-reachable=yes \ - $$testf; done >& valgrind.log - diff --git a/test/unit/Makefile.in b/test/unit/Makefile.in deleted file mode 100644 index 2e30804..0000000 --- a/test/unit/Makefile.in +++ /dev/null @@ -1,1407 +0,0 @@ -# Makefile.in generated by automake 1.13.4 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2013 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -check_PROGRAMS = test_acmod$(EXEEXT) test_acmod_grow$(EXEEXT) \ - test_alignment$(EXEEXT) test_allphone$(EXEEXT) \ - test_dict2pid$(EXEEXT) test_dict$(EXEEXT) test_fsg$(EXEEXT) \ - test_fwdflat$(EXEEXT) test_fwdtree_bestpath$(EXEEXT) \ - test_fwdtree$(EXEEXT) test_init$(EXEEXT) test_jsgf$(EXEEXT) \ - test_keyphrase$(EXEEXT) test_lattice$(EXEEXT) \ - test_lm_read$(EXEEXT) test_mllr$(EXEEXT) test_nbest$(EXEEXT) \ - test_posterior$(EXEEXT) test_ptm_mgau$(EXEEXT) \ - test_reinit$(EXEEXT) test_senfh$(EXEEXT) \ - test_set_search$(EXEEXT) test_simple$(EXEEXT) \ - test_state_align$(EXEEXT) -subdir = test/unit -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/depcomp $(noinst_HEADERS) \ - $(top_srcdir)/test-driver -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pkg_swig.m4 \ - $(top_srcdir)/m4/ax_python_devel.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -test_acmod_SOURCES = test_acmod.c -test_acmod_OBJECTS = test_acmod.$(OBJEXT) -test_acmod_LDADD = $(LDADD) -test_acmod_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -AM_V_lt = $(am__v_lt_@AM_V@) -am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) -am__v_lt_0 = --silent -am__v_lt_1 = -test_acmod_grow_SOURCES = test_acmod_grow.c -test_acmod_grow_OBJECTS = test_acmod_grow.$(OBJEXT) -test_acmod_grow_LDADD = $(LDADD) -test_acmod_grow_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -test_alignment_SOURCES = test_alignment.c -test_alignment_OBJECTS = test_alignment.$(OBJEXT) -test_alignment_LDADD = $(LDADD) -test_alignment_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -test_allphone_SOURCES = test_allphone.c -test_allphone_OBJECTS = test_allphone.$(OBJEXT) -test_allphone_LDADD = $(LDADD) -test_allphone_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -test_dict_SOURCES = test_dict.c -test_dict_OBJECTS = test_dict.$(OBJEXT) -test_dict_LDADD = $(LDADD) -test_dict_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -test_dict2pid_SOURCES = test_dict2pid.c -test_dict2pid_OBJECTS = test_dict2pid.$(OBJEXT) -test_dict2pid_LDADD = $(LDADD) -test_dict2pid_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -test_fsg_SOURCES = test_fsg.c -test_fsg_OBJECTS = test_fsg.$(OBJEXT) -test_fsg_LDADD = $(LDADD) -test_fsg_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -test_fwdflat_SOURCES = test_fwdflat.c -test_fwdflat_OBJECTS = test_fwdflat.$(OBJEXT) -test_fwdflat_LDADD = $(LDADD) -test_fwdflat_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -test_fwdtree_SOURCES = test_fwdtree.c -test_fwdtree_OBJECTS = test_fwdtree.$(OBJEXT) -test_fwdtree_LDADD = $(LDADD) -test_fwdtree_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -test_fwdtree_bestpath_SOURCES = test_fwdtree_bestpath.c -test_fwdtree_bestpath_OBJECTS = test_fwdtree_bestpath.$(OBJEXT) -test_fwdtree_bestpath_LDADD = $(LDADD) -test_fwdtree_bestpath_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -test_init_SOURCES = test_init.c -test_init_OBJECTS = test_init.$(OBJEXT) -test_init_LDADD = $(LDADD) -test_init_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -test_jsgf_SOURCES = test_jsgf.c -test_jsgf_OBJECTS = test_jsgf.$(OBJEXT) -test_jsgf_LDADD = $(LDADD) -test_jsgf_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -test_keyphrase_SOURCES = test_keyphrase.c -test_keyphrase_OBJECTS = test_keyphrase.$(OBJEXT) -test_keyphrase_LDADD = $(LDADD) -test_keyphrase_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -test_lattice_SOURCES = test_lattice.c -test_lattice_OBJECTS = test_lattice.$(OBJEXT) -test_lattice_LDADD = $(LDADD) -test_lattice_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -test_lm_read_SOURCES = test_lm_read.c -test_lm_read_OBJECTS = test_lm_read.$(OBJEXT) -test_lm_read_LDADD = $(LDADD) -test_lm_read_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -test_mllr_SOURCES = test_mllr.c -test_mllr_OBJECTS = test_mllr.$(OBJEXT) -test_mllr_LDADD = $(LDADD) -test_mllr_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -test_nbest_SOURCES = test_nbest.c -test_nbest_OBJECTS = test_nbest.$(OBJEXT) -test_nbest_LDADD = $(LDADD) -test_nbest_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -test_posterior_SOURCES = test_posterior.c -test_posterior_OBJECTS = test_posterior.$(OBJEXT) -test_posterior_LDADD = $(LDADD) -test_posterior_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -test_ptm_mgau_SOURCES = test_ptm_mgau.c -test_ptm_mgau_OBJECTS = test_ptm_mgau.$(OBJEXT) -test_ptm_mgau_LDADD = $(LDADD) -test_ptm_mgau_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -test_reinit_SOURCES = test_reinit.c -test_reinit_OBJECTS = test_reinit.$(OBJEXT) -test_reinit_LDADD = $(LDADD) -test_reinit_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -test_senfh_SOURCES = test_senfh.c -test_senfh_OBJECTS = test_senfh.$(OBJEXT) -test_senfh_LDADD = $(LDADD) -test_senfh_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -test_set_search_SOURCES = test_set_search.c -test_set_search_OBJECTS = test_set_search.$(OBJEXT) -test_set_search_LDADD = $(LDADD) -test_set_search_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -test_simple_SOURCES = test_simple.c -test_simple_OBJECTS = test_simple.$(OBJEXT) -test_simple_LDADD = $(LDADD) -test_simple_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -test_state_align_SOURCES = test_state_align.c -test_state_align_OBJECTS = test_state_align.$(OBJEXT) -test_state_align_LDADD = $(LDADD) -test_state_align_DEPENDENCIES = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -AM_V_CC = $(am__v_CC_@AM_V@) -am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) -am__v_CC_0 = @echo " CC " $@; -am__v_CC_1 = -CCLD = $(CC) -LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CCLD = $(am__v_CCLD_@AM_V@) -am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) -am__v_CCLD_0 = @echo " CCLD " $@; -am__v_CCLD_1 = -SOURCES = test_acmod.c test_acmod_grow.c test_alignment.c \ - test_allphone.c test_dict.c test_dict2pid.c test_fsg.c \ - test_fwdflat.c test_fwdtree.c test_fwdtree_bestpath.c \ - test_init.c test_jsgf.c test_keyphrase.c test_lattice.c \ - test_lm_read.c test_mllr.c test_nbest.c test_posterior.c \ - test_ptm_mgau.c test_reinit.c test_senfh.c test_set_search.c \ - test_simple.c test_state_align.c -DIST_SOURCES = test_acmod.c test_acmod_grow.c test_alignment.c \ - test_allphone.c test_dict.c test_dict2pid.c test_fsg.c \ - test_fwdflat.c test_fwdtree.c test_fwdtree_bestpath.c \ - test_init.c test_jsgf.c test_keyphrase.c test_lattice.c \ - test_lm_read.c test_mllr.c test_nbest.c test_posterior.c \ - test_ptm_mgau.c test_reinit.c test_senfh.c test_set_search.c \ - test_simple.c test_state_align.c -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -HEADERS = $(noinst_HEADERS) -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -am__tty_colors_dummy = \ - mgn= red= grn= lgn= blu= brg= std=; \ - am__color_tests=no -am__tty_colors = { \ - $(am__tty_colors_dummy); \ - if test "X$(AM_COLOR_TESTS)" = Xno; then \ - am__color_tests=no; \ - elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ - am__color_tests=yes; \ - elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ - am__color_tests=yes; \ - fi; \ - if test $$am__color_tests = yes; then \ - red=''; \ - grn=''; \ - lgn=''; \ - blu=''; \ - mgn=''; \ - brg=''; \ - std=''; \ - fi; \ -} -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__recheck_rx = ^[ ]*:recheck:[ ]* -am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* -am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* -# A command that, given a newline-separated list of test names on the -# standard input, print the name of the tests that are to be re-run -# upon "make recheck". -am__list_recheck_tests = $(AWK) '{ \ - recheck = 1; \ - while ((rc = (getline line < ($$0 ".trs"))) != 0) \ - { \ - if (rc < 0) \ - { \ - if ((getline line2 < ($$0 ".log")) < 0) \ - recheck = 0; \ - break; \ - } \ - else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ - { \ - recheck = 0; \ - break; \ - } \ - else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ - { \ - break; \ - } \ - }; \ - if (recheck) \ - print $$0; \ - close ($$0 ".trs"); \ - close ($$0 ".log"); \ -}' -# A command that, given a newline-separated list of test names on the -# standard input, create the global log from their .trs and .log files. -am__create_global_log = $(AWK) ' \ -function fatal(msg) \ -{ \ - print "fatal: making $@: " msg | "cat >&2"; \ - exit 1; \ -} \ -function rst_section(header) \ -{ \ - print header; \ - len = length(header); \ - for (i = 1; i <= len; i = i + 1) \ - printf "="; \ - printf "\n\n"; \ -} \ -{ \ - copy_in_global_log = 1; \ - global_test_result = "RUN"; \ - while ((rc = (getline line < ($$0 ".trs"))) != 0) \ - { \ - if (rc < 0) \ - fatal("failed to read from " $$0 ".trs"); \ - if (line ~ /$(am__global_test_result_rx)/) \ - { \ - sub("$(am__global_test_result_rx)", "", line); \ - sub("[ ]*$$", "", line); \ - global_test_result = line; \ - } \ - else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ - copy_in_global_log = 0; \ - }; \ - if (copy_in_global_log) \ - { \ - rst_section(global_test_result ": " $$0); \ - while ((rc = (getline line < ($$0 ".log"))) != 0) \ - { \ - if (rc < 0) \ - fatal("failed to read from " $$0 ".log"); \ - print line; \ - }; \ - printf "\n"; \ - }; \ - close ($$0 ".trs"); \ - close ($$0 ".log"); \ -}' -# Restructured Text title. -am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } -# Solaris 10 'make', and several other traditional 'make' implementations, -# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it -# by disabling -e (using the XSI extension "set +e") if it's set. -am__sh_e_setup = case $$- in *e*) set +e;; esac -# Default flags passed to test drivers. -am__common_driver_flags = \ - --color-tests "$$am__color_tests" \ - --enable-hard-errors "$$am__enable_hard_errors" \ - --expect-failure "$$am__expect_failure" -# To be inserted before the command running the test. Creates the -# directory for the log if needed. Stores in $dir the directory -# containing $f, in $tst the test, in $log the log. Executes the -# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and -# passes TESTS_ENVIRONMENT. Set up options for the wrapper that -# will run the test scripts (or their associated LOG_COMPILER, if -# thy have one). -am__check_pre = \ -$(am__sh_e_setup); \ -$(am__vpath_adj_setup) $(am__vpath_adj) \ -$(am__tty_colors); \ -srcdir=$(srcdir); export srcdir; \ -case "$@" in \ - */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ - *) am__odir=.;; \ -esac; \ -test "x$$am__odir" = x"." || test -d "$$am__odir" \ - || $(MKDIR_P) "$$am__odir" || exit $$?; \ -if test -f "./$$f"; then dir=./; \ -elif test -f "$$f"; then dir=; \ -else dir="$(srcdir)/"; fi; \ -tst=$$dir$$f; log='$@'; \ -if test -n '$(DISABLE_HARD_ERRORS)'; then \ - am__enable_hard_errors=no; \ -else \ - am__enable_hard_errors=yes; \ -fi; \ -case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ - am__expect_failure=yes;; \ - *) \ - am__expect_failure=no;; \ -esac; \ -$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) -# A shell command to get the names of the tests scripts with any registered -# extension removed (i.e., equivalently, the names of the test logs, with -# the '.log' extension removed). The result is saved in the shell variable -# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, -# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", -# since that might cause problem with VPATH rewrites for suffix-less tests. -# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. -am__set_TESTS_bases = \ - bases='$(TEST_LOGS)'; \ - bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ - bases=`echo $$bases` -RECHECK_LOGS = $(TEST_LOGS) -AM_RECURSIVE_TARGETS = check recheck -TEST_SUITE_LOG = test-suite.log -TEST_EXTENSIONS = @EXEEXT@ .test -LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver -LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) -am__set_b = \ - case '$@' in \ - */*) \ - case '$*' in \ - */*) b='$*';; \ - *) b=`echo '$@' | sed 's/\.log$$//'`; \ - esac;; \ - *) \ - b='$*';; \ - esac -am__test_logs1 = $(TESTS:=.log) -am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) -TEST_LOGS = $(am__test_logs2:.test.log=.log) -TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver -TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ - $(TEST_LOG_FLAGS) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GST_CFLAGS = @GST_CFLAGS@ -GST_LIBS = @GST_LIBS@ -GST_MAJORMINOR = @GST_MAJORMINOR@ -GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ -GStreamer_CFLAGS = @GStreamer_CFLAGS@ -GStreamer_LIBS = @GStreamer_LIBS@ -HAVE_DOXYGEN = @HAVE_DOXYGEN@ -HAVE_PKGCONFIG = @HAVE_PKGCONFIG@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PKG_CONFIG = @PKG_CONFIG@ -PYTHON = @PYTHON@ -PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ -PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ -PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ -PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ -PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ -PYTHON_PLATFORM = @PYTHON_PLATFORM@ -PYTHON_PREFIX = @PYTHON_PREFIX@ -PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ -PYTHON_VERSION = @PYTHON_VERSION@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SPHINXBASE_CFLAGS = @SPHINXBASE_CFLAGS@ -SPHINXBASE_LIBS = @SPHINXBASE_LIBS@ -SPHINXBASE_SWIG = @SPHINXBASE_SWIG@ -STRIP = @STRIP@ -SWIG = @SWIG@ -SWIG_LIB = @SWIG_LIB@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -pkgpyexecdir = @pkgpyexecdir@ -pkgpythondir = @pkgpythondir@ -plugindir = @plugindir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -pyexecdir = @pyexecdir@ -pythondir = @pythondir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -TESTS = $(check_PROGRAMS) -EXTRA_DIST = test_ps.c -noinst_HEADERS = test_macros.h -AM_CFLAGS = -I$(top_srcdir)/include \ - -I$(top_srcdir)/src/libpocketsphinx \ - -I$(top_builddir)/include \ - -I$(srcdir) \ - -DMODELDIR=\"${top_srcdir}/model\" \ - -DDATADIR=\"${top_srcdir}/test/data\" - -LDADD = \ - $(top_builddir)/src/libpocketsphinx/libpocketsphinx.la \ - -lsphinxbase - -CLEANFILES = *.log *.out *.lat *.mfc *.raw *.dic *.sen -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/unit/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign test/unit/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -clean-checkPROGRAMS: - @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ - echo " rm -f" $$list; \ - rm -f $$list || exit $$?; \ - test -n "$(EXEEXT)" || exit 0; \ - list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f" $$list; \ - rm -f $$list - -test_acmod$(EXEEXT): $(test_acmod_OBJECTS) $(test_acmod_DEPENDENCIES) $(EXTRA_test_acmod_DEPENDENCIES) - @rm -f test_acmod$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_acmod_OBJECTS) $(test_acmod_LDADD) $(LIBS) - -test_acmod_grow$(EXEEXT): $(test_acmod_grow_OBJECTS) $(test_acmod_grow_DEPENDENCIES) $(EXTRA_test_acmod_grow_DEPENDENCIES) - @rm -f test_acmod_grow$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_acmod_grow_OBJECTS) $(test_acmod_grow_LDADD) $(LIBS) - -test_alignment$(EXEEXT): $(test_alignment_OBJECTS) $(test_alignment_DEPENDENCIES) $(EXTRA_test_alignment_DEPENDENCIES) - @rm -f test_alignment$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_alignment_OBJECTS) $(test_alignment_LDADD) $(LIBS) - -test_allphone$(EXEEXT): $(test_allphone_OBJECTS) $(test_allphone_DEPENDENCIES) $(EXTRA_test_allphone_DEPENDENCIES) - @rm -f test_allphone$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_allphone_OBJECTS) $(test_allphone_LDADD) $(LIBS) - -test_dict$(EXEEXT): $(test_dict_OBJECTS) $(test_dict_DEPENDENCIES) $(EXTRA_test_dict_DEPENDENCIES) - @rm -f test_dict$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_dict_OBJECTS) $(test_dict_LDADD) $(LIBS) - -test_dict2pid$(EXEEXT): $(test_dict2pid_OBJECTS) $(test_dict2pid_DEPENDENCIES) $(EXTRA_test_dict2pid_DEPENDENCIES) - @rm -f test_dict2pid$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_dict2pid_OBJECTS) $(test_dict2pid_LDADD) $(LIBS) - -test_fsg$(EXEEXT): $(test_fsg_OBJECTS) $(test_fsg_DEPENDENCIES) $(EXTRA_test_fsg_DEPENDENCIES) - @rm -f test_fsg$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_fsg_OBJECTS) $(test_fsg_LDADD) $(LIBS) - -test_fwdflat$(EXEEXT): $(test_fwdflat_OBJECTS) $(test_fwdflat_DEPENDENCIES) $(EXTRA_test_fwdflat_DEPENDENCIES) - @rm -f test_fwdflat$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_fwdflat_OBJECTS) $(test_fwdflat_LDADD) $(LIBS) - -test_fwdtree$(EXEEXT): $(test_fwdtree_OBJECTS) $(test_fwdtree_DEPENDENCIES) $(EXTRA_test_fwdtree_DEPENDENCIES) - @rm -f test_fwdtree$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_fwdtree_OBJECTS) $(test_fwdtree_LDADD) $(LIBS) - -test_fwdtree_bestpath$(EXEEXT): $(test_fwdtree_bestpath_OBJECTS) $(test_fwdtree_bestpath_DEPENDENCIES) $(EXTRA_test_fwdtree_bestpath_DEPENDENCIES) - @rm -f test_fwdtree_bestpath$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_fwdtree_bestpath_OBJECTS) $(test_fwdtree_bestpath_LDADD) $(LIBS) - -test_init$(EXEEXT): $(test_init_OBJECTS) $(test_init_DEPENDENCIES) $(EXTRA_test_init_DEPENDENCIES) - @rm -f test_init$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_init_OBJECTS) $(test_init_LDADD) $(LIBS) - -test_jsgf$(EXEEXT): $(test_jsgf_OBJECTS) $(test_jsgf_DEPENDENCIES) $(EXTRA_test_jsgf_DEPENDENCIES) - @rm -f test_jsgf$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_jsgf_OBJECTS) $(test_jsgf_LDADD) $(LIBS) - -test_keyphrase$(EXEEXT): $(test_keyphrase_OBJECTS) $(test_keyphrase_DEPENDENCIES) $(EXTRA_test_keyphrase_DEPENDENCIES) - @rm -f test_keyphrase$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_keyphrase_OBJECTS) $(test_keyphrase_LDADD) $(LIBS) - -test_lattice$(EXEEXT): $(test_lattice_OBJECTS) $(test_lattice_DEPENDENCIES) $(EXTRA_test_lattice_DEPENDENCIES) - @rm -f test_lattice$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_lattice_OBJECTS) $(test_lattice_LDADD) $(LIBS) - -test_lm_read$(EXEEXT): $(test_lm_read_OBJECTS) $(test_lm_read_DEPENDENCIES) $(EXTRA_test_lm_read_DEPENDENCIES) - @rm -f test_lm_read$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_lm_read_OBJECTS) $(test_lm_read_LDADD) $(LIBS) - -test_mllr$(EXEEXT): $(test_mllr_OBJECTS) $(test_mllr_DEPENDENCIES) $(EXTRA_test_mllr_DEPENDENCIES) - @rm -f test_mllr$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_mllr_OBJECTS) $(test_mllr_LDADD) $(LIBS) - -test_nbest$(EXEEXT): $(test_nbest_OBJECTS) $(test_nbest_DEPENDENCIES) $(EXTRA_test_nbest_DEPENDENCIES) - @rm -f test_nbest$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_nbest_OBJECTS) $(test_nbest_LDADD) $(LIBS) - -test_posterior$(EXEEXT): $(test_posterior_OBJECTS) $(test_posterior_DEPENDENCIES) $(EXTRA_test_posterior_DEPENDENCIES) - @rm -f test_posterior$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_posterior_OBJECTS) $(test_posterior_LDADD) $(LIBS) - -test_ptm_mgau$(EXEEXT): $(test_ptm_mgau_OBJECTS) $(test_ptm_mgau_DEPENDENCIES) $(EXTRA_test_ptm_mgau_DEPENDENCIES) - @rm -f test_ptm_mgau$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_ptm_mgau_OBJECTS) $(test_ptm_mgau_LDADD) $(LIBS) - -test_reinit$(EXEEXT): $(test_reinit_OBJECTS) $(test_reinit_DEPENDENCIES) $(EXTRA_test_reinit_DEPENDENCIES) - @rm -f test_reinit$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_reinit_OBJECTS) $(test_reinit_LDADD) $(LIBS) - -test_senfh$(EXEEXT): $(test_senfh_OBJECTS) $(test_senfh_DEPENDENCIES) $(EXTRA_test_senfh_DEPENDENCIES) - @rm -f test_senfh$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_senfh_OBJECTS) $(test_senfh_LDADD) $(LIBS) - -test_set_search$(EXEEXT): $(test_set_search_OBJECTS) $(test_set_search_DEPENDENCIES) $(EXTRA_test_set_search_DEPENDENCIES) - @rm -f test_set_search$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_set_search_OBJECTS) $(test_set_search_LDADD) $(LIBS) - -test_simple$(EXEEXT): $(test_simple_OBJECTS) $(test_simple_DEPENDENCIES) $(EXTRA_test_simple_DEPENDENCIES) - @rm -f test_simple$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_simple_OBJECTS) $(test_simple_LDADD) $(LIBS) - -test_state_align$(EXEEXT): $(test_state_align_OBJECTS) $(test_state_align_DEPENDENCIES) $(EXTRA_test_state_align_DEPENDENCIES) - @rm -f test_state_align$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_state_align_OBJECTS) $(test_state_align_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_acmod.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_acmod_grow.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_alignment.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_allphone.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_dict.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_dict2pid.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_fsg.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_fwdflat.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_fwdtree.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_fwdtree_bestpath.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_init.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_jsgf.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_keyphrase.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_lattice.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_lm_read.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_mllr.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_nbest.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_posterior.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ptm_mgau.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_reinit.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_senfh.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_set_search.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_simple.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_state_align.Po@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-am - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-am - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -# Recover from deleted '.trs' file; this should ensure that -# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create -# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells -# to avoid problems with "make -n". -.log.trs: - rm -f $< $@ - $(MAKE) $(AM_MAKEFLAGS) $< - -# Leading 'am--fnord' is there to ensure the list of targets does not -# expand to empty, as could happen e.g. with make check TESTS=''. -am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) -am--force-recheck: - @: - -$(TEST_SUITE_LOG): $(TEST_LOGS) - @$(am__set_TESTS_bases); \ - am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ - redo_bases=`for i in $$bases; do \ - am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ - done`; \ - if test -n "$$redo_bases"; then \ - redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ - redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ - if $(am__make_dryrun); then :; else \ - rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ - fi; \ - fi; \ - if test -n "$$am__remaking_logs"; then \ - echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ - "recursion detected" >&2; \ - else \ - am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ - fi; \ - if $(am__make_dryrun); then :; else \ - st=0; \ - errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ - for i in $$redo_bases; do \ - test -f $$i.trs && test -r $$i.trs \ - || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ - test -f $$i.log && test -r $$i.log \ - || { echo "$$errmsg $$i.log" >&2; st=1; }; \ - done; \ - test $$st -eq 0 || exit 1; \ - fi - @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ - ws='[ ]'; \ - results=`for b in $$bases; do echo $$b.trs; done`; \ - test -n "$$results" || results=/dev/null; \ - all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ - pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ - fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ - skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ - xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ - xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ - error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ - if test `expr $$fail + $$xpass + $$error` -eq 0; then \ - success=true; \ - else \ - success=false; \ - fi; \ - br='==================='; br=$$br$$br$$br$$br; \ - result_count () \ - { \ - if test x"$$1" = x"--maybe-color"; then \ - maybe_colorize=yes; \ - elif test x"$$1" = x"--no-color"; then \ - maybe_colorize=no; \ - else \ - echo "$@: invalid 'result_count' usage" >&2; exit 4; \ - fi; \ - shift; \ - desc=$$1 count=$$2; \ - if test $$maybe_colorize = yes && test $$count -gt 0; then \ - color_start=$$3 color_end=$$std; \ - else \ - color_start= color_end=; \ - fi; \ - echo "$${color_start}# $$desc $$count$${color_end}"; \ - }; \ - create_testsuite_report () \ - { \ - result_count $$1 "TOTAL:" $$all "$$brg"; \ - result_count $$1 "PASS: " $$pass "$$grn"; \ - result_count $$1 "SKIP: " $$skip "$$blu"; \ - result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ - result_count $$1 "FAIL: " $$fail "$$red"; \ - result_count $$1 "XPASS:" $$xpass "$$red"; \ - result_count $$1 "ERROR:" $$error "$$mgn"; \ - }; \ - { \ - echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ - $(am__rst_title); \ - create_testsuite_report --no-color; \ - echo; \ - echo ".. contents:: :depth: 2"; \ - echo; \ - for b in $$bases; do echo $$b; done \ - | $(am__create_global_log); \ - } >$(TEST_SUITE_LOG).tmp || exit 1; \ - mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ - if $$success; then \ - col="$$grn"; \ - else \ - col="$$red"; \ - test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ - fi; \ - echo "$${col}$$br$${std}"; \ - echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ - echo "$${col}$$br$${std}"; \ - create_testsuite_report --maybe-color; \ - echo "$$col$$br$$std"; \ - if $$success; then :; else \ - echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ - if test -n "$(PACKAGE_BUGREPORT)"; then \ - echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ - fi; \ - echo "$$col$$br$$std"; \ - fi; \ - $$success || exit 1 - -check-TESTS: - @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list - @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list - @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) - @set +e; $(am__set_TESTS_bases); \ - log_list=`for i in $$bases; do echo $$i.log; done`; \ - trs_list=`for i in $$bases; do echo $$i.trs; done`; \ - log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ - $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ - exit $$?; -recheck: all $(check_PROGRAMS) - @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) - @set +e; $(am__set_TESTS_bases); \ - bases=`for i in $$bases; do echo $$i; done \ - | $(am__list_recheck_tests)` || exit 1; \ - log_list=`for i in $$bases; do echo $$i.log; done`; \ - log_list=`echo $$log_list`; \ - $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ - am__force_recheck=am--force-recheck \ - TEST_LOGS="$$log_list"; \ - exit $$? -test_acmod.log: test_acmod$(EXEEXT) - @p='test_acmod$(EXEEXT)'; \ - b='test_acmod'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_acmod_grow.log: test_acmod_grow$(EXEEXT) - @p='test_acmod_grow$(EXEEXT)'; \ - b='test_acmod_grow'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_alignment.log: test_alignment$(EXEEXT) - @p='test_alignment$(EXEEXT)'; \ - b='test_alignment'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_allphone.log: test_allphone$(EXEEXT) - @p='test_allphone$(EXEEXT)'; \ - b='test_allphone'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_dict2pid.log: test_dict2pid$(EXEEXT) - @p='test_dict2pid$(EXEEXT)'; \ - b='test_dict2pid'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_dict.log: test_dict$(EXEEXT) - @p='test_dict$(EXEEXT)'; \ - b='test_dict'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_fsg.log: test_fsg$(EXEEXT) - @p='test_fsg$(EXEEXT)'; \ - b='test_fsg'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_fwdflat.log: test_fwdflat$(EXEEXT) - @p='test_fwdflat$(EXEEXT)'; \ - b='test_fwdflat'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_fwdtree_bestpath.log: test_fwdtree_bestpath$(EXEEXT) - @p='test_fwdtree_bestpath$(EXEEXT)'; \ - b='test_fwdtree_bestpath'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_fwdtree.log: test_fwdtree$(EXEEXT) - @p='test_fwdtree$(EXEEXT)'; \ - b='test_fwdtree'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_init.log: test_init$(EXEEXT) - @p='test_init$(EXEEXT)'; \ - b='test_init'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_jsgf.log: test_jsgf$(EXEEXT) - @p='test_jsgf$(EXEEXT)'; \ - b='test_jsgf'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_keyphrase.log: test_keyphrase$(EXEEXT) - @p='test_keyphrase$(EXEEXT)'; \ - b='test_keyphrase'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_lattice.log: test_lattice$(EXEEXT) - @p='test_lattice$(EXEEXT)'; \ - b='test_lattice'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_lm_read.log: test_lm_read$(EXEEXT) - @p='test_lm_read$(EXEEXT)'; \ - b='test_lm_read'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_mllr.log: test_mllr$(EXEEXT) - @p='test_mllr$(EXEEXT)'; \ - b='test_mllr'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_nbest.log: test_nbest$(EXEEXT) - @p='test_nbest$(EXEEXT)'; \ - b='test_nbest'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_posterior.log: test_posterior$(EXEEXT) - @p='test_posterior$(EXEEXT)'; \ - b='test_posterior'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_ptm_mgau.log: test_ptm_mgau$(EXEEXT) - @p='test_ptm_mgau$(EXEEXT)'; \ - b='test_ptm_mgau'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_reinit.log: test_reinit$(EXEEXT) - @p='test_reinit$(EXEEXT)'; \ - b='test_reinit'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_senfh.log: test_senfh$(EXEEXT) - @p='test_senfh$(EXEEXT)'; \ - b='test_senfh'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_set_search.log: test_set_search$(EXEEXT) - @p='test_set_search$(EXEEXT)'; \ - b='test_set_search'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_simple.log: test_simple$(EXEEXT) - @p='test_simple$(EXEEXT)'; \ - b='test_simple'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -test_state_align.log: test_state_align$(EXEEXT) - @p='test_state_align$(EXEEXT)'; \ - b='test_state_align'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -.test.log: - @p='$<'; \ - $(am__set_b); \ - $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -@am__EXEEXT_TRUE@.test$(EXEEXT).log: -@am__EXEEXT_TRUE@ @p='$<'; \ -@am__EXEEXT_TRUE@ $(am__set_b); \ -@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ -@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ -@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ -@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) - $(MAKE) $(AM_MAKEFLAGS) check-TESTS -check: check-am -all-am: Makefile $(HEADERS) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) - -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) - -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) - -clean-generic: - -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: check-am install-am install-strip - -.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ - clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \ - ctags ctags-am distclean distclean-compile distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - recheck tags tags-am uninstall uninstall-am - - -valgrind-check: - for testf in .libs/lt-*; do valgrind --leak-check=full --show-reachable=yes \ - $$testf; done >& valgrind.log - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/test/unit/test_204.cc b/test/unit/test_204.cc new file mode 100644 index 0000000..a223c85 --- /dev/null +++ b/test/unit/test_204.cc @@ -0,0 +1,67 @@ +#include +#include "acmod.h" +#include +#include +#include +#include +#include + +static void process(acmod_t* acmod, const std::vector& inout_raw_vector, const bool full_utt) +{ + acmod_start_utt(acmod); + size_t inout_n_samps = inout_raw_vector.size(); + const int16* inout_raw = inout_raw_vector.data(); + const auto ret = acmod_process_raw( + acmod, + &inout_raw, + &inout_n_samps, + full_utt ? 1 : 0); + acmod_end_utt(acmod); +} + +int main(int argc, char** argv) +{ + logmath_t* lm = nullptr; + acmod_t* acmod = nullptr; + cmd_ln_t* config = nullptr; + + lm = logmath_init(1.0001, 0, 0); + + config = ps_config_parse_json( + NULL, + "samprate: 18098.744141," + "frate: 6068," + "svspec: \"0-12/13-25/26-38\""); + ps_config_set_str(config, "mdef", MODELDIR "/en-us/en-us/mdef"); + ps_config_set_str(config, "mean", MODELDIR "/en-us/en-us/means"); + ps_config_set_str(config, "var", MODELDIR "/en-us/en-us/variances"); + ps_config_set_str(config, "tmat", MODELDIR "/en-us/en-us/transition_matrices"); + ps_config_set_str(config, "sendump", MODELDIR "/en-us/en-us/sendump"); + ps_config_set_str(config, "mixw", NULL); + ps_config_set_str(config, "lda", NULL); + ps_config_set_str(config, "senmgau", NULL); + + acmod = acmod_init(config, lm, nullptr, nullptr); + + /* First */ + { + std::vector inout_raw_vector = {1285, 1285, 1285, -1, 1285, 1285, 1285, 1285, 1285, 1285, 4883, -1, -1, -1, -1, -1, -1, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 4963, 1285, -1, -1, -1, -1, -1, 1285, 1285, 1285, 1285, 1285, 4869, 4883, 1285, 1285, 1285, 1285, 1285, 4883, 1299, 1285, 1285, 1285, 1285, -1, 1285, 1285, 1285, 1285, 1285, -1, -1, -1, 1285, 4883, 1285, 1285, 1285, 1285, 1285, 25363, 1535, -1, -1, -1, 1285, 1285, 1285, 4883, 1285, 1285, 1285, -31355, -31355, -1, -1, -1, -1, -1, -1, -31233, -31355, -31355, -31355, -31355, 1285, -1, 1285, 1285, 1285, 1285, 1285, -1, -1, -1, -1, -1, -1, -1, -1, 1285, 1285, 1285, 25363, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5119, 1285, 1285, 1285, 1285, 1285, 25363, -1, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 6401, 1285, 1285, 1280, 1285, 1285, -251, -1, -1, -1, -1, -1, -1, -1, -212, -1, -1, -1, 6401, -1, -1, -1, -1, 1535, 1285, 1285, 4883, 1285, 1285, 4883, -13057, 1285, 1285, 1535, 1285, 1285, 1285, 5893, 1285, 1285, -1, -1, 5119, 6401, 1285, 1285, 1285, 1285, 1285, 4869, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1285, 1285, 1285, 6401, -1, -1, -1, -1, 1535, -1, 1285, 4883, -1, -1, -1, 1285, 4883, 1285, 1285, -1, -1, -1, -1, -1, -1, 1285, 1285, 1285, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4963, -251, -1, -1, -1, 1285, 1285, 4869, 4883, 1285, 1285, 1285, -31355, -1, -1, -1, -1, -1, 1285, 1285, 1285, 1285, 1285, 4869, 4883, 1285, 1285, 1285, 1285, 1285, 4883, 1299, 1285, 1285, 1285, 1285, -1, 1285, 1285, 1285, 1285, 1285, 1285, 1285, -1, -1, 1285, 1285, 1285, 1285, 1285, 25363, 1285, 1285, 1285, 1285, 1285, 4889, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 4883, 4883, -1, -1, -1, -1, -1, -1, 1285, 1285, 1285, 1285, 1285, -1, -1, -1, -1, -1, -1, -1, -1, 1285, 1285, 1285, 1285, 1285, 1285, -237, -1, 1285, -1, 1285, 1285, 1285, 1285, 1285, 4883, -1, -1, 1285, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1285, 4883, 1285, 1285, 1285, -31355, -1, -1, -1, -1, -1, 1285, 1285, 1285, 1285, 1285, 1285, -251, -1, -1, -1, -1, -1, -1, -1, -1, 1285, 1285, 6401, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1285, 1285, 1285, -1, -1, -1, -1, -1, -1, -1, 1285, -1, -1, -1, -1, -1, -1, 1285, 1285, 1285, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4883, -1, -1, -1, -1, 1285, 1285, 1285, 4883, 1285, 1285, 1285, -31355, -123, -1, -1, -1, -1, -1, 1285, 1285, 1285, 1285, 1285, 4883, 1285, 1285, 1323, 1285, 1285, 1285, 4883, 1285, 1285, 1285, 1285, -1, 1285, 1285, 1285, 1285, 1285, -1, -1, -1, 1285, 4963, 1285, 1285, 1285, 1285, 1285, 4883, -1, -1, -1, -1, 1285, 4869, 4883, 1285, -251, -1, -1, -1, -1, -1, 1535, 1285, 1285, 1285, -1, -1, -1, -1, -1, -1, -1, 11519, 1535, 4883, -1, -1, -1, -1, 1285, 1285, 4883, 9747, 1285, 1285, 1285, -31355, -1, -1, -1, -1, -1, 1285, 1285, 1285, 1285, 1285, 275, 1299, 1285, 1285, 1285, 1285, 1285, 275, 1285, 1285, 1285, 1285, 1285}; + process(acmod, inout_raw_vector, true); + } + + /* Second */ + { + std::vector inout_raw_vector = {1285, 1285, 1285, 1285, 1285, 1285, -1, -1, 1285, 1285, 1285, 1285, 1285, 25363, 1285, 1285, 1285, 1285, 1285, 4889, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 4883, 4883, -1, -1, -1, -1, -1, -1, 1285, 1285, 1285, 1285, 1285, -1, -1, -1, -1, -1, -1, -1, -1, 1285, 1285, 1285, 1285, 1285, 1285, -237, -1, 1285, -1, 1285, 1285, 1285, 1285, 1285, 4883, -1, -1, 1285, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1285, 4883, 1285, 1285, 1285, -31355, -1, -1, -1, -1, -1, 1285, 1285, 1285, 1285, 1285, 1285, -251, -1, -1, -1, -1, -1, -1, -1, -1, 1285, 1285, 6401, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1285, 1285, 1285, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1285, 1285, 4883, -1, 1285, 1285, -1, 1285, 1285, 1285, 1285, 1285, 4963, 1285, 1285, 1285, 1285, 1285, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4883, -1, -1, -1, -1, 1285, 1285, 1285, 4883, 1285, 1285, 1285, -31355, -123, -1, -1, -1, -1, -1, 1285, 1285, 1285, 1285, 1285, 4883, 1285, 1285, 1323, 1285, 1285, 1285, 4883, 1285, 1285, 1285, 1285, -1, 1285, 1285, 1285, 1285, 1285, -1, -1, -1, 1285, 4889, 1285, 1285, 1285, 1285, 1285}; + process(acmod, inout_raw_vector, true); + } + + /* Third */ + { + std::vector inout_raw_vector = {1029, 1285, 1285, 1285, -1, -1, -1, -1, -1, -1, -1, -1, 1285, 1285, 1285, -237, -1, -1, -1, -1, -1, -1, -1, 1285, 1285, -1, -1, -1, 4883, 1299, 1285, 1285, 1285, 1285, 1285, 4883, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1285, 1285, 1285, 4883, -1, -1, -1, -1, -1, 1285, 1285, 4889, -1, -1, -1, 1535, 4963, 1285, 1285, -1, -1, -1, -1, -1, -1, 1285, 1285, 1285, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4883, -1, -1, -1, -1, 1285, 1285, 1285, 4883, 1285, 1285, 1285, -31355, -123, -1, -1, -1, -1, -1, 1285, 1285, 1285, 1285, 1285, 4883, 1285, 1285, 1323, 1285, 1285, 1285, 4883, 1285, 1285, 1285, 1285, -1, 1285, 1285, 1285, 1285, 1285, 1285, 1285, -1, -1, 1285, 1285, 1285, 1285, 1285, 4883, 1285, 1285, 1285, 1285, 1285, 6401, 1285, 1285, 1285, 1285, 1285, 1535, 1285, 1285, 1285, 1285, 1285, 4869, 4883, -1, -1, -1, -1, -1, -1, 1285, 1285, 1285, 1285, 1285, -1, -1, -1, -1, -1, -1, -1, -1, 1299, 1285, 1285, 1285, 1285, 1285, 4883, -1, 1285, -251, 1285, 1285, 1285, 1285, 1285, 4889, -1, -1, 1285, -251, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1285, 4963, 1285, 1285, 1285, -31355, -1, -1, -1, -1, -1, 1285, 1535, 1285, 1285, 1285, 1285, 1285, -65, -1, -1, -1, -1, -1, -1, -1, 1285, 1285, 275, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1285, 1285, 1285, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1285, 1285, 4869, -1, 1535, 1285, -1, 1285, 1285, 1285, 1285, 1285, 25363, 1285, 1285, 1285, 1285, 1285, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4883, -1, -1, -1, -1, 1285, 1285, 1285, 4963, 1285, 1285, 1285, -31355, -31355, -1, -1, -1, -1, -1, 1285, 1285, 1285, 1285, 1285, 4963, 1285, 1285, 11051, 1285, 1285, 1285, 4883, 1285, 1285, 1285, 1285, -251, 1326, 1285, 1285, 1285, 1285, -251, -1, -1, 1285, 6401, 1285, 1285, 1285, 1285, 1285, 4869, -1, -1, -1, -1, -1, 1285, 1285, 6401, 1285, 1285, 1285, 1285, -31355, 8449, -1, -1, -1, -1, -1, -1, -31355, -31355, -31355, -31355, -31355, 1285, -1, 1285, 1285, 1285, 1285, 1285, -1, -1, -1, -1, -1, -1, -1, -1, 1285, 1285, 1285, 4883, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1299, 1285, 1285, 1285, 1285, 1285, 4883, -1, 1285, -251, 1285, 1285, 1285, 1285, 1285, 4883, 1285, 1285, 1285, 1285, 1285, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 25363, 1535, -1, -1, -1, 1285, 1285, 1285, 4883, 1285, 1285, 1285, -31355, -31355, -31355, 19789, 19789, 19789, 19789, 19789, 19789, 19789, 19789, 19789, -31355, 0, -31355, -31355, 1285, -1, 1285, 1285, 1285, 1285, 1285, 4883, 1285, 1285, 5, 1285, 1285, 1285, 1285, 1285, 1285, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4883, -1, -1, -1, -1, 1285, 1285, 1285, 4963, 1285, 1285, 1285, -31355, -31355, -1, -1, -1, -1, -1, 1285, 1285, 1285, 1285, 1285, 4963, 1285, 1285, 11051, 1285, 1285, 1285, 4883, 1285, 1285, 1285, 1285, -251, 1326, 1285, 1285, 1285, 1285, -251, -1, -1, 1285, 6401, 1285, 1285, 1285, 1285, 1285, 4869, -1, -1, -1, -1, -1, 1285, 1285, 6401, 1285, 1285, 1285, 1285, -31355, -31355, -1, -1, -1, -1, -1, -1, -31355, -31355, -31355, -31355, 1413, 1285, -1, 1285, 1284, 1285, 1285, 1285, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1285, 1285, 1285, 1285, 1285, 6401, 3859, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1285, 1285, 1285, 1285, 1285, 25363, 1285, 1285, 1285, -256, -1, -1, -1, -1, -1, -1, 1285, 22055}; + process(acmod, inout_raw_vector, false); + } + + acmod_free(acmod); + cmd_ln_free_r(config); + logmath_free(lm); +} diff --git a/test/unit/test_acmod.c b/test/unit/test_acmod.c index 3518323..776124d 100644 --- a/test/unit/test_acmod.c +++ b/test/unit/test_acmod.c @@ -2,7 +2,8 @@ #include #include -#include +#include +#include #include "acmod.h" #include "test_macros.h" @@ -23,6 +24,16 @@ static const mfcc_t cmninit[13] = { FLOAT2MFCC(1.17) }; +static void +assert_cmninit(cmn_t *cmn) +{ + int i; + for (i = 0; i < cmn->veclen; ++i) { + TEST_EQUAL_MFCC(cmn->cmn_mean[i], cmninit[i]); + TEST_EQUAL_MFCC(cmn->sum[i], cmninit[i] * CMN_WIN); + } +} + int main(int argc, char *argv[]) { @@ -38,31 +49,38 @@ main(int argc, char *argv[]) int frame_counter; int bestsen1[270]; + (void)argc; + (void)argv; + err_set_loglevel(ERR_INFO); lmath = logmath_init(1.0001, 0, 0); - config = cmd_ln_init(NULL, ps_args(), TRUE, - "-compallsen", "true", - "-cmn", "live", - "-tmatfloor", "0.0001", - "-mixwfloor", "0.001", - "-varfloor", "0.0001", - "-mmap", "no", - "-topn", "4", - "-ds", "1", - "-samprate", "16000", NULL); + config = ps_config_parse_json( + NULL, + "compallsen: true, cmn: live, tmatfloor: 0.0001," + "mixwfloor: 0.001, varfloor: 0.0001," + "mmap: false, topn: 4, ds: 1, samprate: 16000"); TEST_ASSERT(config); cmd_ln_parse_file_r(config, ps_args(), MODELDIR "/en-us/en-us/feat.params", FALSE); - cmd_ln_set_str_extra_r(config, "_mdef", MODELDIR "/en-us/en-us/mdef"); - cmd_ln_set_str_extra_r(config, "_mean", MODELDIR "/en-us/en-us/means"); - cmd_ln_set_str_extra_r(config, "_var", MODELDIR "/en-us/en-us/variances"); - cmd_ln_set_str_extra_r(config, "_tmat", MODELDIR "/en-us/en-us/transition_matrices"); - cmd_ln_set_str_extra_r(config, "_sendump", MODELDIR "/en-us/en-us/sendump"); - cmd_ln_set_str_extra_r(config, "_mixw", NULL); - cmd_ln_set_str_extra_r(config, "_lda", NULL); - cmd_ln_set_str_extra_r(config, "_senmgau", NULL); + cmd_ln_set_str_extra_r(config, "mdef", MODELDIR "/en-us/en-us/mdef"); + cmd_ln_set_str_extra_r(config, "mean", MODELDIR "/en-us/en-us/means"); + cmd_ln_set_str_extra_r(config, "var", MODELDIR "/en-us/en-us/variances"); + cmd_ln_set_str_extra_r(config, "tmat", MODELDIR "/en-us/en-us/transition_matrices"); + cmd_ln_set_str_extra_r(config, "sendump", MODELDIR "/en-us/en-us/sendump"); + cmd_ln_set_str_extra_r(config, "mixw", NULL); + cmd_ln_set_str_extra_r(config, "lda", NULL); + cmd_ln_set_str_extra_r(config, "senmgau", NULL); + /* Ensure that -cmninit does what it should */ + ps_config_set_str(config, "cmninit", + "41.00,-5.29,-0.12,5.09,2.48,-4.07,-1.37,-1.78,-5.08,-2.05,-6.45,-1.42,1.17"); TEST_ASSERT(acmod = acmod_init(config, lmath, NULL, NULL)); + assert_cmninit(acmod->fcb->cmn_struct); + /* Ensure that the two different ways of setting CMN do the right thing. */ cmn_live_set(acmod->fcb->cmn_struct, cmninit); + assert_cmninit(acmod->fcb->cmn_struct); + cmn_set_repr(acmod->fcb->cmn_struct, + "41.00,-5.29,-0.12,5.09,2.48,-4.07,-1.37,-1.78,-5.08,-2.05,-6.45,-1.42,1.17"); + assert_cmninit(acmod->fcb->cmn_struct); nsamps = 2048; frame_counter = 0; @@ -91,6 +109,9 @@ main(int argc, char *argv[]) } } TEST_EQUAL(0, acmod_end_utt(acmod)); + /* Make sure -cmninit was updated. */ + TEST_ASSERT(ps_config_str(config, "cmninit") != NULL); + E_INFO("New -cmninit: %s\n", ps_config_str(config, "cmninit")); nread = 0; { int16 best_score; @@ -121,6 +142,9 @@ main(int argc, char *argv[]) TEST_EQUAL(0, acmod_start_utt(acmod)); acmod_process_raw(acmod, &bptr, &nsamps, TRUE); TEST_EQUAL(0, acmod_end_utt(acmod)); + /* Make sure -cmninit was updated. */ + TEST_ASSERT(ps_config_str(config, "cmninit") != NULL); + E_INFO("New -cmninit: %s\n", ps_config_str(config, "cmninit")); { int16 best_score; int frame_idx = -1, best_senid; @@ -147,7 +171,7 @@ main(int argc, char *argv[]) nsamps = ftell(rawfh) / sizeof(*buf); bptr = buf; nfr = frame_counter; - fe_process_frames(acmod->fe, &bptr, &nsamps, cepbuf, &nfr, NULL); + fe_process_frames(acmod->fe, &bptr, &nsamps, cepbuf, &nfr); fe_end_utt(acmod->fe, cepbuf[frame_counter-1], &nfr); E_INFO("Incremental(MFCC):\n"); @@ -173,6 +197,9 @@ main(int argc, char *argv[]) } } TEST_EQUAL(0, acmod_end_utt(acmod)); + /* Make sure -cmninit was updated. */ + TEST_ASSERT(ps_config_str(config, "cmninit") != NULL); + E_INFO("New -cmninit: %s\n", ps_config_str(config, "cmninit")); nfr = 0; acmod_process_cep(acmod, &cptr, &nfr, FALSE); { @@ -198,7 +225,7 @@ main(int argc, char *argv[]) nsamps = ftell(rawfh) / sizeof(*buf); bptr = buf; nfr = frame_counter; - fe_process_frames(acmod->fe, &bptr, &nsamps, cepbuf, &nfr, NULL); + fe_process_frames(acmod->fe, &bptr, &nsamps, cepbuf, &nfr); fe_end_utt(acmod->fe, cepbuf[frame_counter-1], &nfr); E_INFO("Whole utterance (MFCC):\n"); @@ -208,6 +235,9 @@ main(int argc, char *argv[]) nfr = frame_counter; acmod_process_cep(acmod, &cptr, &nfr, TRUE); TEST_EQUAL(0, acmod_end_utt(acmod)); + /* Make sure -cmninit was updated. */ + TEST_ASSERT(ps_config_str(config, "cmninit") != NULL); + E_INFO("New -cmninit: %s\n", ps_config_str(config, "cmninit")); { int16 best_score; int frame_idx = -1, best_senid; @@ -252,6 +282,6 @@ main(int argc, char *argv[]) ckd_free(buf); acmod_free(acmod); logmath_free(lmath); - cmd_ln_free_r(config); + ps_config_free(config); return 0; } diff --git a/test/unit/test_acmod_grow.c b/test/unit/test_acmod_grow.c index 197cbb6..15e7cda 100644 --- a/test/unit/test_acmod_grow.c +++ b/test/unit/test_acmod_grow.c @@ -2,9 +2,10 @@ #include #include -#include +#include #include "acmod.h" +#include "ptm_mgau.h" #include "test_macros.h" static const mfcc_t cmninit[13] = { @@ -23,6 +24,8 @@ static const mfcc_t cmninit[13] = { FLOAT2MFCC(1.17) }; +#define NUM_BEST_SEN 270 + int main(int argc, char *argv[]) { @@ -35,30 +38,33 @@ main(int argc, char *argv[]) size_t nread, nsamps; int nfr; int frame_counter; - int bestsen1[270]; + int bestsen1[NUM_BEST_SEN]; + (void)argc; + (void)argv; lmath = logmath_init(1.0001, 0, 0); - config = cmd_ln_init(NULL, ps_args(), TRUE, - "-compallsen", "true", - "-cmn", "live", - "-tmatfloor", "0.0001", - "-mixwfloor", "0.001", - "-varfloor", "0.0001", - "-mmap", "no", - "-topn", "4", - "-ds", "1", - "-samprate", "16000", NULL); + config = ps_config_parse_json( + NULL, + "compallsen: true," + "cmn: live," + "tmatfloor: 0.0001," + "mixwfloor: 0.001," + "varfloor: 0.0001," + "mmap: no," + "topn: 4," + "ds: 1," + "samprate: 16000"); TEST_ASSERT(config); cmd_ln_parse_file_r(config, ps_args(), MODELDIR "/en-us/en-us/feat.params", FALSE); - cmd_ln_set_str_extra_r(config, "_mdef", MODELDIR "/en-us/en-us/mdef"); - cmd_ln_set_str_extra_r(config, "_mean", MODELDIR "/en-us/en-us/means"); - cmd_ln_set_str_extra_r(config, "_var", MODELDIR "/en-us/en-us/variances"); - cmd_ln_set_str_extra_r(config, "_tmat", MODELDIR "/en-us/en-us/transition_matrices"); - cmd_ln_set_str_extra_r(config, "_sendump", MODELDIR "/en-us/en-us/sendump"); - cmd_ln_set_str_extra_r(config, "_mixw", NULL); - cmd_ln_set_str_extra_r(config, "_lda", NULL); - cmd_ln_set_str_extra_r(config, "_senmgau", NULL); + cmd_ln_set_str_extra_r(config, "mdef", MODELDIR "/en-us/en-us/mdef"); + cmd_ln_set_str_extra_r(config, "mean", MODELDIR "/en-us/en-us/means"); + cmd_ln_set_str_extra_r(config, "var", MODELDIR "/en-us/en-us/variances"); + cmd_ln_set_str_extra_r(config, "tmat", MODELDIR "/en-us/en-us/transition_matrices"); + cmd_ln_set_str_extra_r(config, "sendump", MODELDIR "/en-us/en-us/sendump"); + cmd_ln_set_str_extra_r(config, "mixw", NULL); + cmd_ln_set_str_extra_r(config, "lda", NULL); + cmd_ln_set_str_extra_r(config, "senmgau", NULL); TEST_ASSERT(acmod = acmod_init(config, lmath, NULL, NULL)); cmn_live_set(acmod->fcb->cmn_struct, cmninit); @@ -83,14 +89,15 @@ main(int argc, char *argv[]) printf("Frame %d best senone %d score %d\n", frame_idx, best_senid, best_score); TEST_EQUAL(frame_counter, frame_idx); - if (frame_counter < 190) + if (frame_counter < NUM_BEST_SEN) bestsen1[frame_counter] = best_senid; ++frame_counter; frame_idx = -1; } } } - TEST_EQUAL(0, acmod_end_utt(acmod)); + /* Match pocketsphinx-0.8 as we do not remove silence anymore */ + TEST_EQUAL(1, acmod_end_utt(acmod)); nread = 0; acmod_process_raw(acmod, NULL, &nread, FALSE); { @@ -102,7 +109,7 @@ main(int argc, char *argv[]) best_score = acmod_best_score(acmod, &best_senid); printf("Frame %d best senone %d score %d\n", frame_idx, best_senid, best_score); - if (frame_counter < 190) + if (frame_counter < NUM_BEST_SEN) bestsen1[frame_counter] = best_senid; TEST_EQUAL(frame_counter, frame_idx); ++frame_counter; @@ -112,6 +119,8 @@ main(int argc, char *argv[]) printf("Rewound (MFCC):\n"); TEST_EQUAL(0, acmod_rewind(acmod)); + /* Clear fast history buffers to ensure repeatability */ + ptm_mgau_reset_fast_hist(acmod->mgau); { int16 best_score; int frame_idx = -1, best_senid; @@ -122,7 +131,7 @@ main(int argc, char *argv[]) best_score = acmod_best_score(acmod, &best_senid); printf("Frame %d best senone %d score %d\n", frame_idx, best_senid, best_score); - if (frame_counter < 190) + if (frame_counter < NUM_BEST_SEN) TEST_EQUAL(best_senid, bestsen1[frame_counter]); TEST_EQUAL(frame_counter, frame_idx); ++frame_counter; @@ -135,6 +144,6 @@ main(int argc, char *argv[]) ckd_free(buf); acmod_free(acmod); logmath_free(lmath); - cmd_ln_free_r(config); + ps_config_free(config); return 0; } diff --git a/test/unit/test_alignment.c b/test/unit/test_alignment.c index 305bb38..03475cf 100644 --- a/test/unit/test_alignment.c +++ b/test/unit/test_alignment.c @@ -1,6 +1,6 @@ #include -#include "ps_alignment.h" +#include "ps_alignment_internal.h" #include "pocketsphinx_internal.h" #include "test_macros.h" @@ -12,28 +12,35 @@ main(int argc, char *argv[]) dict_t *dict; dict2pid_t *d2p; ps_alignment_t *al; - ps_alignment_iter_t *itor; + ps_alignment_iter_t *itor, *itor2; cmd_ln_t *config; + int score, start, duration; - config = cmd_ln_init(NULL, NULL, FALSE, - "-dict", MODELDIR "/en-us/cmudict-en-us.dict", - "_fdict", MODELDIR "/en-us/en-us/noisedict", - NULL); + (void)argc; + (void)argv; + config = ps_config_parse_json(NULL, + "dict: \"" MODELDIR "/en-us/cmudict-en-us.dict\", " + "fdict: \"" MODELDIR "/en-us/en-us/noisedict\""); mdef = bin_mdef_read(NULL, MODELDIR "/en-us/en-us/mdef"); dict = dict_init(config, mdef); d2p = dict2pid_build(mdef, dict); al = ps_alignment_init(d2p); - TEST_EQUAL(1, ps_alignment_add_word(al, dict_wordid(dict, ""), 0)); - TEST_EQUAL(2, ps_alignment_add_word(al, dict_wordid(dict, "hello"), 0)); - TEST_EQUAL(3, ps_alignment_add_word(al, dict_wordid(dict, "world"), 0)); - TEST_EQUAL(4, ps_alignment_add_word(al, dict_wordid(dict, ""), 0)); + TEST_EQUAL(1, ps_alignment_add_word(al, dict_wordid(dict, ""), 0, 0)); + TEST_EQUAL(2, ps_alignment_add_word(al, dict_wordid(dict, "hello"), 0, 0)); + TEST_EQUAL(3, ps_alignment_add_word(al, dict_wordid(dict, "world"), 0, 0)); + TEST_EQUAL(4, ps_alignment_add_word(al, dict_wordid(dict, ""), 0, 0)); TEST_EQUAL(0, ps_alignment_populate(al)); itor = ps_alignment_words(al); TEST_EQUAL(ps_alignment_iter_get(itor)->id.wid, dict_wordid(dict, "")); itor = ps_alignment_iter_next(itor); TEST_EQUAL(ps_alignment_iter_get(itor)->id.wid, dict_wordid(dict, "hello")); + score = ps_alignment_iter_seg(itor, &start, &duration); + TEST_EQUAL(0, strcmp(ps_alignment_iter_name(itor), "hello")); + TEST_EQUAL(score, 0); + TEST_EQUAL(start, 0); + TEST_EQUAL(duration, 0); itor = ps_alignment_iter_next(itor); TEST_EQUAL(ps_alignment_iter_get(itor)->id.wid, dict_wordid(dict, "world")); itor = ps_alignment_iter_next(itor); @@ -46,11 +53,26 @@ main(int argc, char *argv[]) ps_alignment_n_phones(al), ps_alignment_n_states(al)); + itor = ps_alignment_words(al); + itor = ps_alignment_iter_next(itor); + TEST_EQUAL(ps_alignment_iter_get(itor)->id.wid, dict_wordid(dict, "hello")); + itor2 = ps_alignment_iter_children(itor); + ps_alignment_iter_free(itor); + TEST_EQUAL(0, strcmp(ps_alignment_iter_name(itor2), "HH")); + itor2 = ps_alignment_iter_next(itor2); + TEST_EQUAL(0, strcmp(ps_alignment_iter_name(itor2), "AH")); + itor2 = ps_alignment_iter_next(itor2); + TEST_EQUAL(0, strcmp(ps_alignment_iter_name(itor2), "L")); + itor2 = ps_alignment_iter_next(itor2); + TEST_EQUAL(0, strcmp(ps_alignment_iter_name(itor2), "OW")); + itor2 = ps_alignment_iter_next(itor2); + TEST_EQUAL(NULL, itor2); + ps_alignment_free(al); dict_free(dict); dict2pid_free(d2p); bin_mdef_free(mdef); - cmd_ln_free_r(config); + ps_config_free(config); return 0; } diff --git a/test/unit/test_alloc/CMakeLists.txt b/test/unit/test_alloc/CMakeLists.txt new file mode 100644 index 0000000..c3a846b --- /dev/null +++ b/test/unit/test_alloc/CMakeLists.txt @@ -0,0 +1,25 @@ +set(TEST_EXECUTABLES + test_ckd_alloc + test_ckd_alloc_catch + test_ckd_alloc_fail + test_ckd_alloc_abort + test_listelem_alloc + ) +foreach(TEST_EXECUTABLE ${TEST_EXECUTABLES}) + add_executable(${TEST_EXECUTABLE} EXCLUDE_FROM_ALL ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR}/test/unit + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) + add_dependencies(check ${TEST_EXECUTABLE}) +endforeach() +add_test(NAME test_ckd_alloc COMMAND test_ckd_alloc) +add_test(NAME test_listelem_alloc COMMAND test_listelem_alloc) +add_test(NAME test_ckd_alloc_catch COMMAND test_ckd_alloc_catch) +add_test(NAME test_ckd_alloc_fail COMMAND test_ckd_alloc_fail) +set_property(TEST test_ckd_alloc_fail PROPERTY WILL_FAIL TRUE) +add_test(NAME test_ckd_alloc_abort COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/test_ckd_alloc_abort.sh) +set_property(TEST test_ckd_alloc_abort PROPERTY ENVIRONMENT CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}) diff --git a/test/unit/test_alloc/test_ckd_alloc.c b/test/unit/test_alloc/test_ckd_alloc.c new file mode 100644 index 0000000..274b61a --- /dev/null +++ b/test/unit/test_alloc/test_ckd_alloc.c @@ -0,0 +1,105 @@ +#include + +#include "util/ckd_alloc.h" + +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + int *alloc1; + int **alloc2; + int ***alloc3; + int i; + + (void)argc; + (void)argv; + TEST_ASSERT(alloc1 = ckd_calloc(3*3*3, sizeof(*alloc1))); + TEST_ASSERT(alloc2 = ckd_calloc_2d(3, 3, sizeof(**alloc2))); + TEST_ASSERT(alloc3 = ckd_calloc_3d(3, 3, 3, sizeof(***alloc3))); + + for (i = 0; i < 27; ++i) { + TEST_EQUAL(alloc1[i], 0); + alloc1[i] = i + 1; + } + for (i = 0; i < 27; ++i) + TEST_EQUAL(alloc1[i], i+1); + + for (i = 0; i < 3; ++i) { + int j; + for (j = 0; j < 3; ++j) { + TEST_EQUAL(alloc2[i][j], 0); + alloc2[i][j] = i * 3 + j + 1; + } + } + /* Verify that row-major ordering is in use. */ + for (i = 0; i < 9; ++i) { + TEST_EQUAL(alloc2[0][i], i+1); + TEST_EQUAL(alloc2[0][i], alloc1[i]); + } + for (i = 0; i < 3; ++i) { + int j; + for (j = 0; j < 3; ++j) { + TEST_EQUAL(alloc2[i][j], i * 3 + j + 1); + } + } + /* Now test alloc_ptr. */ + ckd_free_2d(alloc2); + alloc2 = ckd_alloc_2d_ptr(3, 3, alloc1, sizeof(*alloc1)); + for (i = 0; i < 9; ++i) { + TEST_EQUAL(alloc2[0][i], i+1); + TEST_EQUAL(alloc2[0][i], alloc1[i]); + } + for (i = 0; i < 3; ++i) { + int j; + for (j = 0; j < 3; ++j) { + TEST_EQUAL(alloc2[i][j], i * 3 + j + 1); + } + } + ckd_free_2d_ptr(alloc2); + + for (i = 0; i < 3; ++i) { + int j; + for (j = 0; j < 3; ++j) { + int k; + for (k = 0; k < 3; ++k) { + TEST_EQUAL(alloc3[i][j][k], 0); + alloc3[i][j][k] = i * 3 * 3 + j * 3 + k + 1; + } + } + } + /* Verify that row-major ordering is in use. */ + for (i = 0; i < 27; ++i) { + TEST_EQUAL(alloc3[0][0][i], i+1); + TEST_EQUAL(alloc3[0][0][i], alloc1[i]); + } + for (i = 0; i < 3; ++i) { + int j; + for (j = 0; j < 3; ++j) { + int k; + for (k = 0; k < 3; ++k) { + TEST_EQUAL(alloc3[i][j][k], i * 3 * 3 + j * 3 + k + 1); + } + } + } + /* Now test alloc_ptr. */ + ckd_free_3d(alloc3); + alloc3 = ckd_alloc_3d_ptr(3, 3, 3, alloc1, sizeof(*alloc1)); + for (i = 0; i < 27; ++i) { + TEST_EQUAL(alloc3[0][0][i], i+1); + TEST_EQUAL(alloc3[0][0][i], alloc1[i]); + } + for (i = 0; i < 3; ++i) { + int j; + for (j = 0; j < 3; ++j) { + int k; + for (k = 0; k < 3; ++k) { + TEST_EQUAL(alloc3[i][j][k], i * 3 * 3 + j * 3 + k + 1); + } + } + } + ckd_free_3d_ptr(alloc3); + ckd_free(alloc1); + + return 0; +} diff --git a/test/unit/test_alloc/test_ckd_alloc_abort.c b/test/unit/test_alloc/test_ckd_alloc_abort.c new file mode 100644 index 0000000..53e1d30 --- /dev/null +++ b/test/unit/test_alloc/test_ckd_alloc_abort.c @@ -0,0 +1,20 @@ +#include + +#include "util/ckd_alloc.h" + +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + int bad_alloc_did_not_fail = FALSE; + + (void)argc; + (void)argv; + ckd_set_jump(NULL, TRUE); + /* Guaranteed to fail, we hope!. */ + (void) ckd_calloc(-1,-1); + TEST_ASSERT(bad_alloc_did_not_fail); + + return 0; +} diff --git a/test/unit/test_alloc/test_ckd_alloc_abort.sh b/test/unit/test_alloc/test_ckd_alloc_abort.sh new file mode 100755 index 0000000..e681c84 --- /dev/null +++ b/test/unit/test_alloc/test_ckd_alloc_abort.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh + +ulimit -c 0 +if ./test_ckd_alloc_abort; then + fail expected_failure +else + pass expected_failure +fi + diff --git a/test/unit/test_alloc/test_ckd_alloc_catch.c b/test/unit/test_alloc/test_ckd_alloc_catch.c new file mode 100644 index 0000000..9a968f4 --- /dev/null +++ b/test/unit/test_alloc/test_ckd_alloc_catch.c @@ -0,0 +1,27 @@ +#include + +#include "util/ckd_alloc.h" + +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + jmp_buf env; + + (void)argc; + (void)argv; + ckd_set_jump(&env, FALSE); + if (setjmp(env)) { + printf("Successfully caught bad allocation!\n"); + } + else { + int failed_to_catch_bad_alloc = FALSE; + + /* Guaranteed to fail, we hope!. */ + (void) ckd_calloc(-1,-1); + TEST_ASSERT(failed_to_catch_bad_alloc); + } + + return 0; +} diff --git a/test/unit/test_alloc/test_ckd_alloc_fail.c b/test/unit/test_alloc/test_ckd_alloc_fail.c new file mode 100644 index 0000000..31a27f5 --- /dev/null +++ b/test/unit/test_alloc/test_ckd_alloc_fail.c @@ -0,0 +1,20 @@ +#include + +#include "util/ckd_alloc.h" + +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + int bad_alloc_did_not_fail = FALSE; + + (void)argc; + (void)argv; + ckd_set_jump(NULL, FALSE); + /* Guaranteed to fail, we hope!. */ + (void) ckd_calloc(-1,-1); + TEST_ASSERT(bad_alloc_did_not_fail); + + return 0; +} diff --git a/test/unit/test_alloc/test_listelem_alloc.c b/test/unit/test_alloc/test_listelem_alloc.c new file mode 100644 index 0000000..599cd25 --- /dev/null +++ b/test/unit/test_alloc/test_listelem_alloc.c @@ -0,0 +1,66 @@ +#include +#include + +#include "util/listelem_alloc.h" + +#include "test_macros.h" + +struct bogus { + char const *str; + long foobie; +}; + +int +main(int argc, char *argv[]) +{ + listelem_alloc_t *le; + struct bogus *bogus1, *bogus2; + int i; + + (void)argc; + (void)argv; + TEST_ASSERT(le = listelem_alloc_init(sizeof(struct bogus))); + bogus1 = listelem_malloc(le); + bogus1->str = "hello"; + bogus1->foobie = 42; + bogus2 = listelem_malloc(le); + bogus2->str = "goodbye"; + bogus2->foobie = 69; + TEST_EQUAL(bogus1->foobie, 42); + TEST_EQUAL(0, strcmp(bogus1->str, "hello")); + listelem_free(le, bogus1); + listelem_free(le, bogus2); + listelem_alloc_free(le); + + TEST_ASSERT(le = listelem_alloc_init(sizeof(struct bogus))); + listelem_stats(le); + for (i = 0; i < 60; ++i) + bogus1 = listelem_malloc(le); + listelem_stats(le); + listelem_alloc_free(le); + + { + struct bogus *bogus[600]; + int32 bogus_id[600]; + + le = listelem_alloc_init(sizeof(struct bogus)); + for (i = 0; i < 600; ++i) + bogus[i] = listelem_malloc_id(le, bogus_id + i); + listelem_stats(le); + for (i = 0; i < 600; ++i) { + TEST_EQUAL(bogus[i], listelem_get_item(le, bogus_id[i])); + } + for (i = 0; i < 600; ++i) + listelem_free(le, bogus[i]); + listelem_stats(le); + for (i = 0; i < 600; ++i) + bogus[i] = listelem_malloc_id(le, bogus_id + i); + listelem_stats(le); + for (i = 0; i < 600; ++i) + TEST_EQUAL(bogus[i], listelem_get_item(le, bogus_id[i])); + listelem_alloc_free(le); + } + + + return 0; +} diff --git a/test/unit/test_allphone.c b/test/unit/test_allphone.c index 31d6a8c..d5c2cf9 100644 --- a/test/unit/test_allphone.c +++ b/test/unit/test_allphone.c @@ -11,11 +11,12 @@ main(int argc, char *argv[]) { cmd_ln_t *config; + (void)argc; + (void)argv; TEST_ASSERT(config = - cmd_ln_init(NULL, ps_args(), TRUE, - "-hmm", MODELDIR "/en-us/en-us", - "-allphone", MODELDIR "/en-us/en-us-phone.lm.bin", - "-beam", "1e-20", "-pbeam", "1e-10", "-allphone_ci", "no", "-lw", "2.0", - NULL)); + ps_config_parse_json(NULL, + "hmm: \"" MODELDIR "/en-us/en-us\", " + "allphone: \"" MODELDIR "/en-us/en-us-phone.lm.bin\", " + "beam: 1e-20, pbeam: 1e-10, allphone_ci: false, lw: 2.0")); return ps_decoder_test(config, "ALLPHONE", "SIL G OW F AO R W ER D T AE N M IY IH ZH ER Z S V SIL"); } diff --git a/test/unit/test_bitvec.c b/test/unit/test_bitvec.c new file mode 100644 index 0000000..992a217 --- /dev/null +++ b/test/unit/test_bitvec.c @@ -0,0 +1,64 @@ +#include +#include + +#include "util/bitvec.h" +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + bitvec_t *bv; + int i, j; + clock_t c; + + (void)argc; + (void)argv; + TEST_ASSERT(bv = bitvec_alloc(199)); + bitvec_set(bv,198); + bitvec_set(bv,0); + bitvec_set(bv,42); + bitvec_set(bv,43); + bitvec_set(bv,44); + TEST_ASSERT(bitvec_is_set(bv,198)); + TEST_ASSERT(bitvec_is_set(bv,0)); + TEST_ASSERT(bitvec_is_set(bv,42)); + TEST_ASSERT(bitvec_is_set(bv,43)); + TEST_ASSERT(bitvec_is_set(bv,44)); + TEST_EQUAL(5, bitvec_count_set(bv, 199)); + bitvec_clear(bv, 43); + TEST_EQUAL(0, bitvec_is_set(bv,43)); + + c = clock(); + for (j = 0; j < 1000000; ++j) + bitvec_count_set(bv, 199); + c = clock() - c; + printf("1000000 * 199 bitvec_count_set in %.2f sec\n", + (double)c / CLOCKS_PER_SEC); + bitvec_free(bv); + + bv = bitvec_alloc(1314); + c = clock(); + for (j = 0; j < 50000; ++j) + for (i = 0; i < 1314; ++i) + bitvec_set(bv, i); + c = clock() - c; + printf("50000 * 1314 bitvec_set in %.2f sec\n", + (double)c / CLOCKS_PER_SEC); + bitvec_free(bv); + + /* Test realloc */ + bv = bitvec_alloc(13); + for (i = 1; i < 13; i+=2) + bitvec_set(bv, i); + printf("Bits set %ld\n", bitvec_count_set(bv, 13)); + TEST_EQUAL(6, bitvec_count_set(bv, 13)); + bv = bitvec_realloc(bv, 13, 2000); + for (i = 0; i < 2000; i++) { + /* printf("%d %d\n", i, bitvec_is_set(bv, i) != 0); */ + } + printf("Bits set after realloc %ld\n", bitvec_count_set(bv, 2000)); + TEST_EQUAL(6, bitvec_count_set(bv, 2000)); + bitvec_free(bv); + + return 0; +} diff --git a/test/unit/test_case/CMakeLists.txt b/test/unit/test_case/CMakeLists.txt new file mode 100644 index 0000000..2a75aa0 --- /dev/null +++ b/test/unit/test_case/CMakeLists.txt @@ -0,0 +1,29 @@ +set(TEST_EXECUTABLES + chgCase + ) +foreach(TEST_EXECUTABLE ${TEST_EXECUTABLES}) + add_executable(${TEST_EXECUTABLE} EXCLUDE_FROM_ALL ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR}/test/unit + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) + add_dependencies(check ${TEST_EXECUTABLE}) +endforeach() +set(TESTS + _lcase1.test + _lcase2.test + _lcase3.test + _strcmp1.test + _strcmp2.test + _strcmp3.test + _ucase1.test + _ucase2.test + _ucase3.test +) +foreach(TEST ${TESTS}) + add_test(NAME ${TEST} COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/${TEST} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) +endforeach() diff --git a/test/unit/test_case/_lcase1.test b/test/unit/test_case/_lcase1.test new file mode 100755 index 0000000..984c7e3 --- /dev/null +++ b/test/unit/test_case/_lcase1.test @@ -0,0 +1,2 @@ +#!/bin/bash +./chgCase lcase 5 3 diff --git a/test/unit/test_case/_lcase2.test b/test/unit/test_case/_lcase2.test new file mode 100755 index 0000000..2d44f42 --- /dev/null +++ b/test/unit/test_case/_lcase2.test @@ -0,0 +1,2 @@ +#!/bin/bash +./chgCase lcase 1 1 diff --git a/test/unit/test_case/_lcase3.test b/test/unit/test_case/_lcase3.test new file mode 100755 index 0000000..26a21a2 --- /dev/null +++ b/test/unit/test_case/_lcase3.test @@ -0,0 +1,2 @@ +#!/bin/bash +./chgCase lcase \ No newline at end of file diff --git a/test/unit/test_case/_strcmp1.test b/test/unit/test_case/_strcmp1.test new file mode 100755 index 0000000..d4bd794 --- /dev/null +++ b/test/unit/test_case/_strcmp1.test @@ -0,0 +1,2 @@ +#!/bin/bash +./chgCase strcmp_nocase 2 3 \ No newline at end of file diff --git a/test/unit/test_case/_strcmp2.test b/test/unit/test_case/_strcmp2.test new file mode 100755 index 0000000..92200c8 --- /dev/null +++ b/test/unit/test_case/_strcmp2.test @@ -0,0 +1,2 @@ +#!/bin/bash +./chgCase strcmp_nocase 1 1 \ No newline at end of file diff --git a/test/unit/test_case/_strcmp3.test b/test/unit/test_case/_strcmp3.test new file mode 100755 index 0000000..4118c39 --- /dev/null +++ b/test/unit/test_case/_strcmp3.test @@ -0,0 +1,2 @@ +#!/bin/bash +./chgCase strcmp_nocase \ No newline at end of file diff --git a/test/unit/test_case/_ucase1.test b/test/unit/test_case/_ucase1.test new file mode 100755 index 0000000..102af80 --- /dev/null +++ b/test/unit/test_case/_ucase1.test @@ -0,0 +1,2 @@ +#!/bin/bash +./chgCase ucase 2 4 \ No newline at end of file diff --git a/test/unit/test_case/_ucase2.test b/test/unit/test_case/_ucase2.test new file mode 100755 index 0000000..ddafa1c --- /dev/null +++ b/test/unit/test_case/_ucase2.test @@ -0,0 +1,2 @@ +#!/bin/bash +./chgCase ucase 1 1 \ No newline at end of file diff --git a/test/unit/test_case/_ucase3.test b/test/unit/test_case/_ucase3.test new file mode 100755 index 0000000..b3996f3 --- /dev/null +++ b/test/unit/test_case/_ucase3.test @@ -0,0 +1,2 @@ +#!/bin/bash +./chgCase ucase \ No newline at end of file diff --git a/test/unit/test_case/chgCase.c b/test/unit/test_case/chgCase.c new file mode 100644 index 0000000..4389f04 --- /dev/null +++ b/test/unit/test_case/chgCase.c @@ -0,0 +1,99 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +#include +#include +#include +#include "util/case.h" +#include + +#define MAX_STR_LEN 64 +#define NUM_STRS 6 + +#define STR0 "this string should NEVER show up" +#define STR1 "" +#define STR2 "az3o%\tW@^#\\\n\r[]{}|\() '\"" +#define STR3 "az3o%\tw@^#\\\n\r[]{}|\() '\"" +#define STR4 "AZ3O%\tW@^#\\\n\r[]{}|\() '\"" +#define STR5 "AZ3O%\tw@^#\\\n\r[]{}|\() '\"" + + +int +main(int argc, char **argv) +{ + int cmp; + char *n1 = NULL; + char *n2 = NULL; + + char s1[MAX_STR_LEN]; + char s2[MAX_STR_LEN]; + + char strs[NUM_STRS][MAX_STR_LEN] = { STR0, + STR1, + STR2, + STR3, + STR4, + STR5 + }; + + if (argc < 2 || + 3 == argc || + argc > 4 || + (strcmp(argv[1], "lcase") && + strcmp(argv[1], "ucase") && strcmp(argv[1], "strcmp_nocase") + )) { + /*printf("INVALID PARAMETERS to chgCase\n"); */ + exit(1); + } + + + if (2 == argc) { + if (0 == strcmp(argv[1], "ucase")) { + ucase(n1); + } + else if (0 == strcmp(argv[1], "lcase")) { + lcase(n1); + } + else { + strcmp_nocase(n1, n2); + } + /* + if we're still alive we obviously didn't segfault + */ + exit(0); + } + + if (4 == argc) { + + if (0 >= atoi(argv[2]) || + atoi(argv[2]) >= NUM_STRS || + 0 >= atoi(argv[3]) || atoi(argv[3]) >= NUM_STRS) { + E_INFO("INVALID PARAMS TO chkCase\n"); + exit(1); + } + + strcpy(s1, strs[atoi(argv[2])]); + strcpy(s2, strs[atoi(argv[3])]); + + if (0 == strcmp(argv[1], "ucase")) { + ucase(s1); + cmp = strcmp(s1, s2); + } + else if (0 == strcmp(argv[1], "lcase")) { + lcase(s1); + cmp = strcmp(s1, s2); + } + else { + cmp = strcmp_nocase(s1, s2); + } + + /* E_INFO("Value of cmp %d\n", cmp); */ + if (0 != cmp) { + E_FATAL("test failed\nstr1:|%s|\nstr2:|%s|\n", s1, s2); + } + + return (cmp != 0); + } + + /*somehow we got here and we shouldn't have */ + + exit(1); +} diff --git a/test/unit/test_config.c b/test/unit/test_config.c new file mode 100644 index 0000000..1a69bae --- /dev/null +++ b/test/unit/test_config.c @@ -0,0 +1,246 @@ +#include +#include "pocketsphinx_internal.h" +#include "test_macros.h" + +#define LEN(array) (sizeof(array) / sizeof(array[0])) +static char *good_argv[] = { + "pocketsphinx", + "-hmm", + "en-us", + "-samprate", + "16000", + "-beam", + "0.005", + "-backtrace", + "yes" +}; +static int good_argc = LEN(good_argv); +static char *good_json = \ + "{ \"hmm\": \"en-us\",\n" + " \"samprate\": 16000,\n" + " \"beam\": 5e-3,\n" + " \"backtrace\": true\n" + "}"; +static char *cmd_argv[] = { + "pocketsphinx", + "-hmm", + "en-us", + "-samprate", + "16000", + "-beam", + "0.005", + "-backtrace", + "yes" +}; +static int cmd_argc = LEN(cmd_argv); +static char *bad_argv[] = { + "pocketsphinx", + "-hmm", + "en-us", + "-samprate", + "forty-two", + "beam", + "1e-80", + "-backtrace", + "WTF" +}; +static int bad_argc = LEN(bad_argv); +static char *bad_json = \ + "{ \"hmm\": en us,\n" + " \"samprate\": 16000,\n" + " \"beam\": 5e-3,\n" + " \"backtrace\": true\n" + "}"; +static char *ugly_json = \ + "hmm: en-us samprate: 16000 beam: 0.005 backtrace: true"; +static char *hard_json = \ + "{ \"hmm\": \"\\\\model\\\\en-us\",\n" + " \"keyphrase\": \"spam\tspam \\\"spam\\\" eggs\\nand spam\"\n" + "}"; +/* FIXME: Someday this will be supported */ +static char *bad_hard_json = \ + "{ \"hmm\": \"\\\\model\\\\en-us\",\n" + " \"keyphrase\": \"spam\tspam \\\"spam\\\"\\u0020eggs\\nand spam\"\n" + "}"; + +static void +check_live_args(ps_config_t *config) +{ + /* Check parsed values */ + TEST_EQUAL(0, strcmp("en-us", ps_config_str(config, "hmm"))); + TEST_EQUAL(16000, ps_config_int(config, "samprate")); + TEST_EQUAL_FLOAT(5e-3, ps_config_float(config, "beam")); + + /* Set new values */ + TEST_ASSERT(ps_config_set_str(config, "hmm", "fr-fr")); + TEST_EQUAL(0, strcmp("fr-fr", ps_config_str(config, "hmm"))); + TEST_ASSERT(ps_config_set_int(config, "samprate", 8000)); + TEST_EQUAL(8000, ps_config_int(config, "samprate")); + TEST_ASSERT(ps_config_set_float(config, "beam", 1e-40)); + TEST_EQUAL_FLOAT(1e-40, ps_config_float(config, "beam")); +} + +static void +test_config_init(void) +{ + ps_config_t *config; + + TEST_ASSERT(config = ps_config_init(NULL)); + ps_config_retain(config); + TEST_EQUAL(1, ps_config_free(config)); + TEST_EQUAL(0, ps_config_free(config)); + + TEST_ASSERT(config = ps_config_init(NULL)); + TEST_ASSERT(ps_config_set_str(config, "hmm", "en-us")); + TEST_ASSERT(ps_config_set_int(config, "samprate", 16000)); + TEST_ASSERT(ps_config_set_float(config, "beam", 0.005)); + check_live_args(config); + TEST_EQUAL(0, ps_config_free(config)); +} + +static void +test_config_args(void) +{ + ps_config_t *config; + TEST_ASSERT(config = ps_config_parse_args(NULL, good_argc, good_argv)); + TEST_EQUAL(0, ps_config_free(config)); + TEST_EQUAL(NULL, ps_config_parse_args(NULL, bad_argc, bad_argv)); + + TEST_ASSERT(config = ps_config_parse_args(NULL, cmd_argc, cmd_argv)); + check_live_args(config); + TEST_EQUAL(0, ps_config_free(config)); +} + +static void +test_config_json(void) +{ + ps_config_t *config; + char *json; + + TEST_ASSERT(config = ps_config_parse_json(NULL, good_json)); + TEST_EQUAL(0, ps_config_free(config)); + TEST_EQUAL(NULL, ps_config_parse_json(NULL, bad_json)); + + TEST_ASSERT(config = ps_config_parse_json(NULL, good_json)); + check_live_args(config); + TEST_EQUAL(0, ps_config_free(config)); + + TEST_ASSERT(config = ps_config_parse_json(NULL, ugly_json)); + /* Make a copy now, before it changes in check_live_args */ + json = ckd_salloc(ps_config_serialize_json(config)); + check_live_args(config); + TEST_EQUAL(0, ps_config_free(config)); + + /* Check that serialized JSON gives the same result */ + TEST_ASSERT(config = ps_config_parse_json(NULL, json)); + check_live_args(config); + TEST_EQUAL(0, ps_config_free(config)); + ckd_free(json); + + TEST_ASSERT(config = ps_config_parse_json(NULL, hard_json)); + printf("%s\n", ps_config_str(config, "hmm")); + printf("%s\n", ps_config_str(config, "keyphrase")); + TEST_EQUAL(0, strcmp(ps_config_str(config, "hmm"), + "\\model\\en-us")); + TEST_EQUAL(0, strcmp(ps_config_str(config, "keyphrase"), + "spam\tspam \"spam\" eggs\nand spam")); + json = ckd_salloc(ps_config_serialize_json(config)); + ps_config_free(config); + + TEST_ASSERT(config = ps_config_parse_json(NULL, json)); + printf("%s\n", ps_config_str(config, "hmm")); + printf("%s\n", ps_config_str(config, "keyphrase")); + TEST_EQUAL(0, strcmp(ps_config_str(config, "hmm"), + "\\model\\en-us")); + TEST_EQUAL(0, strcmp(ps_config_str(config, "keyphrase"), + "spam\tspam \"spam\" eggs\nand spam")); + ps_config_free(config); + ckd_free(json); + TEST_EQUAL(NULL, ps_config_parse_json(NULL, bad_hard_json)); +} + +static void +test_validate_config(void) +{ + ps_config_t *config; + TEST_ASSERT(config = + ps_config_parse_json( + NULL, + "hmm: \"" MODELDIR "/en-us/en-us\"," + "lm: \"" MODELDIR "/en-us/en-us.lm.bin\"," + "dict: \"" MODELDIR "/en-us/cmudict-en-us.dict\"," + "fwdtree: true," + "fwdflat: false," + "bestpath: false," + "samprate: 16000")); + TEST_EQUAL(0, ps_config_validate(config)); + ps_config_free(config); + TEST_ASSERT(config = + ps_config_parse_json( + NULL, + "hmm: \"" MODELDIR "/en-us/en-us\"," + "lm: \"" MODELDIR "/en-us/en-us.lm.bin\"," + "jsgf: \"" DATADIR "/goforward.gram\"," + "dict: \"" MODELDIR "/en-us/cmudict-en-us.dict\"," + "fwdtree: true," + "fwdflat: false," + "bestpath: false," + "samprate: 16000")); + TEST_ASSERT(ps_config_validate(config) < 0); + ps_config_free(config); + TEST_ASSERT(config = + ps_config_parse_json( + NULL, + "hmm: \"" MODELDIR "/en-us/en-us\"," + "kws: \"" DATADIR "/goforward.kws\"," + "jsgf: \"" DATADIR "/goforward.gram\"," + "fsg: \"" DATADIR "/goforward.fsg\"," + "dict: \"" MODELDIR "/en-us/cmudict-en-us.dict\"," + "fwdtree: true," + "fwdflat: false," + "bestpath: false," + "samprate: 16000")); + TEST_ASSERT(ps_config_validate(config) < 0); + ps_config_free(config); + TEST_ASSERT(config = + ps_config_parse_json( + NULL, + "hmm: \"" MODELDIR "/en-us/en-us\"," + "keyphrase: \"bonjour alexis\"," + "fwdtree: true," + "fwdflat: false," + "bestpath: false," + "samprate: 16000")); + TEST_EQUAL(0, ps_config_validate(config)); + ps_config_free(config); +} + +static void +test_config_default(void) +{ + ps_config_t *config; + TEST_ASSERT(config = ps_config_init(NULL)); + setenv("POCKETSPHINX_PATH", MODELDIR, 1); + ps_default_search_args(config); + TEST_EQUAL(0, strcmp(ps_config_str(config, "hmm"), + MODELDIR "/en-us/en-us")); + TEST_EQUAL(0, strcmp(ps_config_str(config, "lm"), + MODELDIR "/en-us/en-us.lm.bin")); + TEST_EQUAL(0, strcmp(ps_config_str(config, "dict"), + MODELDIR "/en-us/cmudict-en-us.dict")); + ps_config_free(config); +} + +int +main(int argc, char *argv[]) +{ + (void)argc; (void)argv; + + test_config_init(); + test_config_args(); + test_config_json(); + test_validate_config(); + test_config_default(); + + return 0; +} diff --git a/test/unit/test_dict.c b/test/unit/test_dict.c index e01590e..4cb0b8d 100644 --- a/test/unit/test_dict.c +++ b/test/unit/test_dict.c @@ -12,15 +12,18 @@ main(int argc, char *argv[]) { bin_mdef_t *mdef; dict_t *dict; - cmd_ln_t *config; + ps_config_t *config; int i; char buf[100]; - TEST_ASSERT(config = cmd_ln_init(NULL, NULL, FALSE, - "-dict", MODELDIR "/en-us/cmudict-en-us.dict", - "_fdict", MODELDIR "/en-us/en-us/noisedict", - NULL)); + (void)argc; + (void)argv; + TEST_ASSERT(config = + ps_config_parse_json( + NULL, + "dict: \"" MODELDIR "/en-us/cmudict-en-us.dict\"," + "fdict: \"" MODELDIR "/en-us/en-us/noisedict\"")); /* Test dictionary in standard fashion. */ TEST_ASSERT(mdef = bin_mdef_read(NULL, MODELDIR "/en-us/en-us/mdef")); @@ -57,7 +60,7 @@ main(int argc, char *argv[]) } dict_free(dict); - cmd_ln_free_r(config); + ps_config_free(config); return 0; } diff --git a/test/unit/test_dict2pid.c b/test/unit/test_dict2pid.c index 1281325..7c9e453 100644 --- a/test/unit/test_dict2pid.c +++ b/test/unit/test_dict2pid.c @@ -2,8 +2,8 @@ #include #include -#include +#include "bin_mdef.h" #include "dict.h" #include "dict2pid.h" #include "test_macros.h" @@ -14,12 +14,13 @@ main(int argc, char *argv[]) bin_mdef_t *mdef; dict_t *dict; dict2pid_t *d2p; - cmd_ln_t *config; + ps_config_t *config; - TEST_ASSERT(config = cmd_ln_init(NULL, NULL, FALSE, - "-dict", MODELDIR "/en-us/cmudict-en-us.dict", - "_fdict", MODELDIR "/en-us/en-us/noisedict", - NULL)); + (void)argc; + (void)argv; + TEST_ASSERT(config = ps_config_parse_json(NULL, + "dict:" MODELDIR "/en-us/cmudict-en-us.dict " + "fdict:" MODELDIR "/en-us/en-us/noisedict")); TEST_ASSERT(mdef = bin_mdef_read(NULL, MODELDIR "/en-us/en-us/mdef")); TEST_ASSERT(dict = dict_init(config, mdef)); TEST_ASSERT(d2p = dict2pid_build(mdef, dict)); @@ -27,7 +28,7 @@ main(int argc, char *argv[]) dict_free(dict); dict2pid_free(d2p); bin_mdef_free(mdef); - cmd_ln_free_r(config); + ps_config_free(config); return 0; } diff --git a/test/unit/test_endpointer.c b/test/unit/test_endpointer.c new file mode 100644 index 0000000..64f3c8c --- /dev/null +++ b/test/unit/test_endpointer.c @@ -0,0 +1,146 @@ +/* Test endpointing. + * + * MIT license (c) 2022, see LICENSE for more information. + * + * Author: David Huggins-Daines + */ +#include +#include "util/ckd_alloc.h" +#include "test_macros.h" + +static int sample_rates[] = { + 8000, + 16000, + 32000, + 48000, + 11025, + 22050, + //44100 +}; +static const int n_sample_rates = sizeof(sample_rates)/sizeof(sample_rates[0]); + +static float labels[] = { + 0.24, + 1.80, + 2.88, + 12.12, + 12.51, + 15.75, + 16.44, + 20.87 +}; +static const int n_labels = sizeof(labels)/sizeof(labels[0]); + + +static FILE * +open_data(int sample_rate) +{ + char *soxcmd; + int len; + FILE *sox; +#define SOXCMD "sox -q -D -G " TESTDATADIR "/chan3.wav -r %d -t raw -" + len = snprintf(NULL, 0, SOXCMD, sample_rate); + if ((soxcmd = malloc(len + 1)) == NULL) + E_FATAL_SYSTEM("Failed to allocate string"); + if (snprintf(soxcmd, len + 1, SOXCMD, sample_rate) != len) + E_FATAL_SYSTEM("snprintf() failed"); + if ((sox = popen(soxcmd, "r")) == NULL) + E_FATAL_SYSTEM("Failed to popen(%s)", soxcmd); + free(soxcmd); + + return sox; +} + +static int +test_sample_rate(int sample_rate) +{ + ps_endpointer_t *ep; + size_t frame_size, nsamp, end_nsamp; + const short *speech; + short *frame; + FILE *fh; + int i; + + E_INFO("Sample rate %d\n", sample_rate); + ep = ps_endpointer_init(0, 0, 0, sample_rate, 0); + frame_size = ps_endpointer_frame_size(ep); + frame = ckd_calloc(sizeof(*frame), frame_size); + fh = open_data(sample_rate); + TEST_ASSERT(fh); + i = 0; + while ((nsamp = fread(frame, sizeof(*frame), frame_size, fh)) == frame_size) { + int prev_in_speech = ps_endpointer_in_speech(ep); + TEST_ASSERT(i < n_labels); + speech = ps_endpointer_process(ep, frame); + if (speech != NULL) { + if (!prev_in_speech) { + E_INFO("Speech start at %.2f (label %.2f)\n", + ps_endpointer_speech_start(ep), labels[i]); + TEST_ASSERT(fabs(ps_endpointer_speech_start(ep) + - labels[i++]) < 0.3); + } + if (!ps_endpointer_in_speech(ep)) { + E_INFO("Speech end at %.2f (label %.2f)\n", + ps_endpointer_speech_end(ep), labels[i]); + TEST_ASSERT(fabs(ps_endpointer_speech_end(ep) + /* FIXME: This difference should be smaller */ + - labels[i++]) < 0.8); + } + } + } + speech = ps_endpointer_end_stream(ep, frame, nsamp, &end_nsamp); + if (speech != NULL) { + TEST_ASSERT(i < n_labels); + E_INFO("Speech end at %.2f (label %.2f)\n", + ps_endpointer_speech_end(ep), labels[i]); + TEST_ASSERT(fabs(ps_endpointer_speech_end(ep) + - labels[i]) < 0.3); + } + pclose(fh); + ckd_free(frame); + ps_endpointer_free(ep); + + return 0; +} + +int +main(int argc, char *argv[]) +{ + ps_endpointer_t *ep; + int i; + + (void)argc; (void)argv; + err_set_loglevel(ERR_INFO); + /* Test initialization with default parameters. */ + ep = ps_endpointer_init(0, 0, 0, 0, 0); + TEST_ASSERT(ep); + /* Retain and release, should still be there. */ + TEST_ASSERT((ep = ps_endpointer_retain(ep))); + TEST_ASSERT(ps_endpointer_free(ep)); + + /* Test default parameters. */ + TEST_EQUAL(ps_endpointer_sample_rate(ep), + PS_VAD_DEFAULT_SAMPLE_RATE); + TEST_EQUAL(ps_endpointer_frame_size(ep), + (int)(PS_VAD_DEFAULT_SAMPLE_RATE * PS_VAD_DEFAULT_FRAME_LENGTH)); + ps_endpointer_free(ep); + + + /* Test rejection of unreasonable sample rates. */ + ep = ps_endpointer_init(0, 0, 0, 42, 0); + TEST_ASSERT(ep == NULL); + ep = ps_endpointer_init(0, 0, 0, 96000, 0); + TEST_ASSERT(ep == NULL); + + /* Test rejection of unreasonable windows and ratios. */ + ep = ps_endpointer_init(0.3, 0.99, 0, 0, 0); + TEST_ASSERT(ep == NULL); + ep = ps_endpointer_init(0.03, 0.1, 0, 0, 0); + TEST_ASSERT(ep == NULL); + + /* Test a variety of sample rates. */ + for (i = 0; i < n_sample_rates; ++i) + test_sample_rate(sample_rates[i]); + + return 0; +} diff --git a/test/unit/test_fe.c b/test/unit/test_fe.c new file mode 100644 index 0000000..5762875 --- /dev/null +++ b/test/unit/test_fe.c @@ -0,0 +1,264 @@ +#include +#include + +#include "fe/fe.h" +#include "util/cmd_ln.h" +#include "util/ckd_alloc.h" +#include + +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + static const ps_arg_t fe_args[] = { + waveform_to_cepstral_command_line_macro(), + { NULL, 0, NULL, NULL } + }; + FILE *raw; + cmd_ln_t *config; + fe_t *fe; + int16 buf[1024]; + int16 const *inptr; + int32 frame_shift, frame_size; + mfcc_t **cepbuf1, **cepbuf2, **cptr; + int32 nfr, i; + size_t nsamp; + + err_set_loglevel_str("INFO"); + TEST_ASSERT(config = cmd_ln_parse_r(NULL, fe_args, argc, argv, FALSE)); + TEST_ASSERT(fe = fe_init_auto_r(config)); + + TEST_EQUAL(fe_get_output_size(fe), DEFAULT_NUM_CEPSTRA); + + fe_get_input_size(fe, &frame_shift, &frame_size); + TEST_EQUAL(frame_shift, DEFAULT_FRAME_SHIFT); + TEST_EQUAL(frame_size, (int)(DEFAULT_WINDOW_LENGTH*DEFAULT_SAMPLING_RATE)); + + TEST_ASSERT(raw = fopen(TESTDATADIR "/chan3.raw", "rb")); + + TEST_EQUAL(0, fe_start_utt(fe)); + TEST_EQUAL(1024, fread(buf, sizeof(int16), 1024, raw)); + + nsamp = 1024; + TEST_ASSERT(fe_process_frames(fe, NULL, &nsamp, NULL, &nfr) >= 0); + TEST_EQUAL(1024, nsamp); + TEST_EQUAL(4, nfr); + + cepbuf1 = ckd_calloc_2d(5, DEFAULT_NUM_CEPSTRA, sizeof(**cepbuf1)); + inptr = &buf[0]; + nfr = 1; + + /* Process the data, one frame at a time. */ + E_INFO("Testing one frame at a time (1024 samples)\n"); + E_INFO("frame_size %d frame_shift %d\n", frame_size, frame_shift); + TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, &cepbuf1[0], &nfr) >= 0); + E_INFO("updated inptr %ld remaining nsamp %ld processed nfr %d\n", + inptr - buf, nsamp, nfr); + TEST_EQUAL(nfr, 1); + TEST_EQUAL(inptr - buf, frame_size + frame_shift); + + nfr = 1; + TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, &cepbuf1[1], &nfr) >= 0); + E_INFO("updated inptr %ld remaining nsamp %ld processed nfr %d\n", + inptr - buf, nsamp, nfr); + TEST_EQUAL(nfr, 1); + TEST_EQUAL(inptr - buf, frame_size + 2 * frame_shift); + + nfr = 1; + TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, &cepbuf1[2], &nfr) >= 0); + E_INFO("updated inptr %ld remaining nsamp %ld processed nfr %d\n", + inptr - buf, nsamp, nfr); + TEST_EQUAL(nfr, 1); + TEST_EQUAL(inptr - buf, frame_size + 3 * frame_shift); + + /* Should consume all the input at this point. */ + nfr = 1; + TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, &cepbuf1[3], &nfr) >= 0); + E_INFO("updated inptr %ld remaining nsamp %ld processed nfr %d\n", + inptr - buf, nsamp, nfr); + TEST_EQUAL(nfr, 1); + TEST_EQUAL(inptr - buf, 1024); + TEST_EQUAL(nsamp, 0); + + /* Should get a frame here due to overflow samples. */ + TEST_ASSERT(fe_end_utt(fe, cepbuf1[4], &nfr) >= 0); + E_INFO("fe_end_utt nfr %d\n", nfr); + TEST_EQUAL(nfr, 1); + + /* Test that the output we get by processing one frame at a time + * is exactly the same as what we get from doing them all at once. */ + E_INFO("Testing all data at once (1024 samples)\n"); + cepbuf2 = ckd_calloc_2d(5, DEFAULT_NUM_CEPSTRA, sizeof(**cepbuf2)); + inptr = &buf[0]; + nfr = 5; + nsamp = 1024; + TEST_EQUAL(0, fe_start_utt(fe)); + TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, cepbuf2, &nfr) >= 0); + E_INFO("fe_process_frames consumed nfr %d frames\n", nfr); + TEST_EQUAL(nfr, 4); + TEST_EQUAL(inptr - buf, 1024); + TEST_EQUAL(nsamp, 0); + /* And again, should get a frame here due to overflow samples. */ + TEST_ASSERT(fe_end_utt(fe, cepbuf2[4], &nfr) >= 0); + E_INFO("fe_end_utt nfr %d\n", nfr); + TEST_EQUAL(nfr, 1); + + /* output features stored in cepbuf should be the same */ + for (nfr = 0; nfr < 5; ++nfr) { + E_INFO("%d: ", nfr); + for (i = 0; i < DEFAULT_NUM_CEPSTRA; ++i) { + E_INFOCONT("%.2f,%.2f ", + MFCC2FLOAT(cepbuf1[nfr][i]), + MFCC2FLOAT(cepbuf2[nfr][i])); + TEST_EQUAL_MFCC(cepbuf1[nfr][i], cepbuf2[nfr][i]); + } + E_INFOCONT("\n"); + } + + /* Now, also test to make sure that even if we feed data in + * little tiny bits we can still make things work. */ + E_INFO("Testing inputs smaller than one frame (256 samples)\n"); + memset(cepbuf2[0], 0, 5 * DEFAULT_NUM_CEPSTRA * sizeof(**cepbuf2)); + inptr = &buf[0]; + cptr = &cepbuf2[0]; + nfr = 5; + i = 5; + nsamp = 256; + TEST_EQUAL(0, fe_start_utt(fe)); + /* Process up to 5 frames (that will not happen) */ + TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, cptr, &i) >= 0); + E_INFO("updated inptr %ld remaining nsamp %ld processed nfr %d\n", + inptr - buf, nsamp, i); + cptr += i; + /* Process up to however many frames are left to make 5 */ + nfr -= i; + i = nfr; + nsamp = 256; + TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, cptr, &i) >= 0); + E_INFO("updated inptr %ld remaining nsamp %ld processed nfr %d\n", + inptr - buf, nsamp, i); + cptr += i; + nfr -= i; + i = nfr; + nsamp = 256; + TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, cptr, &i) >= 0); + E_INFO("updated inptr %ld remaining nsamp %ld processed nfr %d\n", + inptr - buf, nsamp, i); + cptr += i; + nfr -= i; + i = nfr; + nsamp = 256; + TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, cptr, &i) >= 0); + E_INFO("updated inptr %ld remaining nsamp %ld processed nfr %d\n", + inptr - buf, nsamp, i); + cptr += i; + nfr -= i; + E_INFO("nfr %d\n", nfr); + /* We processed 1024 bytes, which should give us 4 frames */ + TEST_EQUAL(nfr, 1); + TEST_ASSERT(fe_end_utt(fe, *cptr, &nfr) >= 0); + E_INFO("nfr %d\n", nfr); + TEST_EQUAL(nfr, 1); + + /* output features stored in cepbuf should be the same */ + for (nfr = 0; nfr < 5; ++nfr) { + E_INFO("%d: ", nfr); + for (i = 0; i < DEFAULT_NUM_CEPSTRA; ++i) { + E_INFOCONT("%.2f,%.2f ", + MFCC2FLOAT(cepbuf1[nfr][i]), + MFCC2FLOAT(cepbuf2[nfr][i])); + TEST_EQUAL_MFCC(cepbuf1[nfr][i], cepbuf2[nfr][i]); + } + E_INFOCONT("\n"); + } + + /* And now, finally, test fe_process_utt() */ + E_INFO("Test fe_process_utt (apparently, it is deprecated)\n"); + inptr = &buf[0]; + i = 0; + TEST_EQUAL(0, fe_start_utt(fe)); + TEST_ASSERT(fe_process_utt(fe, inptr, 256, &cptr, &nfr) >= 0); + E_INFO("i %d nfr %d\n", i, nfr); + if (nfr) + memcpy(cepbuf2[i], cptr[0], nfr * DEFAULT_NUM_CEPSTRA * sizeof(**cptr)); + ckd_free_2d(cptr); + i += nfr; + inptr += 256; + TEST_ASSERT(fe_process_utt(fe, inptr, 256, &cptr, &nfr) >= 0); + E_INFO("i %d nfr %d\n", i, nfr); + if (nfr) + memcpy(cepbuf2[i], cptr[0], nfr * DEFAULT_NUM_CEPSTRA * sizeof(**cptr)); + ckd_free_2d(cptr); + i += nfr; + inptr += 256; + TEST_ASSERT(fe_process_utt(fe, inptr, 256, &cptr, &nfr) >= 0); + E_INFO("i %d nfr %d\n", i, nfr); + if (nfr) + memcpy(cepbuf2[i], cptr[0], nfr * DEFAULT_NUM_CEPSTRA * sizeof(**cptr)); + ckd_free_2d(cptr); + i += nfr; + inptr += 256; + TEST_ASSERT(fe_process_utt(fe, inptr, 256, &cptr, &nfr) >= 0); + E_INFO("i %d nfr %d\n", i, nfr); + if (nfr) + memcpy(cepbuf2[i], cptr[0], nfr * DEFAULT_NUM_CEPSTRA * sizeof(**cptr)); + ckd_free_2d(cptr); + i += nfr; + inptr += 256; + TEST_ASSERT(fe_end_utt(fe, cepbuf2[i], &nfr) >= 0); + E_INFO("i %d nfr %d\n", i, nfr); + TEST_EQUAL(nfr, 1); + + /* output features stored in cepbuf should be the same */ + for (nfr = 0; nfr < 5; ++nfr) { + E_INFO("%d: ", nfr); + for (i = 0; i < DEFAULT_NUM_CEPSTRA; ++i) { + E_INFOCONT("%.2f,%.2f ", + MFCC2FLOAT(cepbuf1[nfr][i]), + MFCC2FLOAT(cepbuf2[nfr][i])); + TEST_EQUAL_MFCC(cepbuf1[nfr][i], cepbuf2[nfr][i]); + } + E_INFOCONT("\n"); + } + + /* Now test -remove_noise */ + fe_free(fe); + ps_config_set_bool(config, "remove_noise", TRUE); + TEST_ASSERT(fe = fe_init_auto_r(config)); + E_INFO("Testing all data at once (1024 samples)\n"); + inptr = &buf[0]; + nfr = 5; + nsamp = 1024; + TEST_EQUAL(0, fe_start_utt(fe)); + TEST_ASSERT(fe_process_frames(fe, &inptr, &nsamp, cepbuf2, &nfr) >= 0); + E_INFO("fe_process_frames consumed nfr %d frames\n", nfr); + TEST_EQUAL(nfr, 4); + TEST_EQUAL(inptr - buf, 1024); + TEST_EQUAL(nsamp, 0); + /* And again, should get a frame here due to overflow samples. */ + TEST_ASSERT(fe_end_utt(fe, cepbuf2[4], &nfr) >= 0); + E_INFO("fe_end_utt nfr %d\n", nfr); + TEST_EQUAL(nfr, 1); + + /* output features stored in cepbuf will not be the same */ + E_INFO("Expect differences due to -remove_noise\n"); + for (nfr = 0; nfr < 5; ++nfr) { + E_INFO("%d: ", nfr); + for (i = 0; i < DEFAULT_NUM_CEPSTRA; ++i) { + E_INFOCONT("%.2f,%.2f ", + MFCC2FLOAT(cepbuf1[nfr][i]), + MFCC2FLOAT(cepbuf2[nfr][i])); + } + E_INFOCONT("\n"); + } + + fe_free(fe); + ckd_free_2d(cepbuf1); + ckd_free_2d(cepbuf2); + fclose(raw); + ps_config_free(config); + + + return 0; +} diff --git a/test/unit/test_feat/CMakeLists.txt b/test/unit/test_feat/CMakeLists.txt new file mode 100644 index 0000000..b3d1fde --- /dev/null +++ b/test/unit/test_feat/CMakeLists.txt @@ -0,0 +1,31 @@ +set(TEST_EXECUTABLES + test_feat + test_feat_live + test_feat_fe + test_subvq + ) +foreach(TEST_EXECUTABLE ${TEST_EXECUTABLES}) + add_executable(${TEST_EXECUTABLE} EXCLUDE_FROM_ALL ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR}/test/unit + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) + add_dependencies(check ${TEST_EXECUTABLE}) +endforeach() +set(TESTS + _test_feat.test + test_feat_live + test_feat_fe + test_subvq +) +foreach(TEST ${TESTS}) + if(${TEST} MATCHES "\.(test|sh)$") + add_test(NAME ${TEST} COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/${TEST}) + else() + add_test(NAME ${TEST} COMMAND ${TEST}) + endif() + set_property(TEST ${TEST} PROPERTY ENVIRONMENT CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}) +endforeach() diff --git a/test/unit/test_feat/_test_feat.res b/test/unit/test_feat/_test_feat.res new file mode 100644 index 0000000..b104b55 --- /dev/null +++ b/test/unit/test_feat/_test_feat.res @@ -0,0 +1,18 @@ +15.114 -1.424 -0.953 0.186 -0.656 -0.226 -0.105 -0.412 -0.024 -0.091 -0.124 -0.158 -0.197 +14.729 -1.313 -0.892 0.140 -0.676 -0.089 -0.313 -0.422 -0.058 -0.101 -0.100 -0.128 -0.123 +14.502 -1.351 -1.028 -0.189 -0.718 -0.139 -0.121 -0.365 -0.139 -0.154 0.041 0.009 -0.073 +14.557 -1.676 -0.864 0.118 -0.445 -0.168 -0.069 -0.503 -0.013 0.007 -0.056 -0.075 -0.237 +14.665 -1.498 -0.582 0.209 -0.487 -0.247 -0.142 -0.439 0.059 -0.058 -0.265 -0.109 -0.196 +15.025 -1.199 -0.607 0.235 -0.499 -0.080 -0.062 -0.554 -0.209 -0.124 -0.445 -0.352 -0.400 +15.114 -1.424 -0.953 0.186 -0.656 -0.226 -0.105 -0.412 -0.024 -0.091 -0.124 -0.158 -0.197 15.114 -1.424 -0.953 0.186 -0.656 -0.226 -0.105 -0.412 -0.024 -0.091 -0.124 -0.158 -0.197 14.729 -1.313 -0.892 0.140 -0.676 -0.089 -0.313 -0.422 -0.058 -0.101 -0.100 -0.128 -0.123 +15.114 -1.424 -0.953 0.186 -0.656 -0.226 -0.105 -0.412 -0.024 -0.091 -0.124 -0.158 -0.197 14.729 -1.313 -0.892 0.140 -0.676 -0.089 -0.313 -0.422 -0.058 -0.101 -0.100 -0.128 -0.123 14.502 -1.351 -1.028 -0.189 -0.718 -0.139 -0.121 -0.365 -0.139 -0.154 0.041 0.009 -0.073 +14.729 -1.313 -0.892 0.140 -0.676 -0.089 -0.313 -0.422 -0.058 -0.101 -0.100 -0.128 -0.123 14.502 -1.351 -1.028 -0.189 -0.718 -0.139 -0.121 -0.365 -0.139 -0.154 0.041 0.009 -0.073 14.557 -1.676 -0.864 0.118 -0.445 -0.168 -0.069 -0.503 -0.013 0.007 -0.056 -0.075 -0.237 +14.502 -1.351 -1.028 -0.189 -0.718 -0.139 -0.121 -0.365 -0.139 -0.154 0.041 0.009 -0.073 14.557 -1.676 -0.864 0.118 -0.445 -0.168 -0.069 -0.503 -0.013 0.007 -0.056 -0.075 -0.237 14.665 -1.498 -0.582 0.209 -0.487 -0.247 -0.142 -0.439 0.059 -0.058 -0.265 -0.109 -0.196 +14.557 -1.676 -0.864 0.118 -0.445 -0.168 -0.069 -0.503 -0.013 0.007 -0.056 -0.075 -0.237 14.665 -1.498 -0.582 0.209 -0.487 -0.247 -0.142 -0.439 0.059 -0.058 -0.265 -0.109 -0.196 15.025 -1.199 -0.607 0.235 -0.499 -0.080 -0.062 -0.554 -0.209 -0.124 -0.445 -0.352 -0.400 +14.665 -1.498 -0.582 0.209 -0.487 -0.247 -0.142 -0.439 0.059 -0.058 -0.265 -0.109 -0.196 15.025 -1.199 -0.607 0.235 -0.499 -0.080 -0.062 -0.554 -0.209 -0.124 -0.445 -0.352 -0.400 15.025 -1.199 -0.607 0.235 -0.499 -0.080 -0.062 -0.554 -0.209 -0.124 -0.445 -0.352 -0.400 +15.114 -1.424 -0.953 0.186 -0.656 -0.226 -0.105 -0.412 -0.024 -0.091 -0.124 -0.158 -0.197 -0.612 0.073 -0.075 -0.375 -0.062 0.087 -0.016 0.047 -0.115 -0.063 0.165 0.167 0.124 -0.172 -0.363 0.028 -0.022 0.231 -0.079 0.244 -0.081 0.045 0.108 0.044 0.053 -0.114 +14.729 -1.313 -0.892 0.140 -0.676 -0.089 -0.313 -0.422 -0.058 -0.101 -0.100 -0.128 -0.123 -0.557 -0.252 0.089 -0.068 0.211 0.058 0.036 -0.091 0.011 0.098 0.068 0.083 -0.040 0.163 -0.147 0.446 0.398 0.231 -0.108 -0.021 -0.074 0.198 0.096 -0.306 -0.118 -0.123 +14.502 -1.351 -1.028 -0.189 -0.718 -0.139 -0.121 -0.365 -0.139 -0.154 0.041 0.009 -0.073 -0.449 -0.074 0.371 0.023 0.169 -0.021 -0.037 -0.027 0.083 0.033 -0.141 0.049 0.001 0.853 0.366 0.196 0.163 -0.034 -0.049 0.215 -0.041 -0.162 -0.121 -0.413 -0.307 -0.237 +14.557 -1.676 -0.864 0.118 -0.445 -0.168 -0.069 -0.503 -0.013 0.007 -0.056 -0.075 -0.237 0.296 0.114 0.285 0.095 0.177 0.009 0.251 -0.132 -0.151 -0.023 -0.345 -0.224 -0.277 0.972 0.226 0.050 0.401 0.050 0.080 0.096 -0.162 -0.153 -0.003 -0.345 -0.410 -0.328 +14.665 -1.498 -0.582 0.209 -0.487 -0.247 -0.142 -0.439 0.059 -0.058 -0.265 -0.109 -0.196 0.523 0.152 0.421 0.424 0.219 0.059 0.059 -0.189 -0.070 0.030 -0.486 -0.361 -0.327 0.172 0.363 -0.028 0.022 -0.231 0.079 -0.244 0.081 -0.045 -0.108 -0.044 -0.053 0.114 +15.025 -1.199 -0.607 0.235 -0.499 -0.080 -0.062 -0.554 -0.209 -0.124 -0.445 -0.352 -0.400 0.468 0.477 0.257 0.117 -0.054 0.088 0.007 -0.051 -0.196 -0.131 -0.389 -0.277 -0.163 -0.163 0.147 -0.446 -0.398 -0.231 0.108 0.021 0.074 -0.198 -0.096 0.306 0.118 0.123 diff --git a/test/unit/test_feat/_test_feat.test b/test/unit/test_feat/_test_feat.test new file mode 100755 index 0000000..17ee377 --- /dev/null +++ b/test/unit/test_feat/_test_feat.test @@ -0,0 +1,6 @@ +#!/bin/bash +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh + +set -e +"${CMAKE_BINARY_DIR}/test_feat" > _test_feat.out +compare_table feat _test_feat.out $tests/unit/test_feat/_test_feat.res diff --git a/test/unit/test_feat/test_feat.c b/test/unit/test_feat/test_feat.c new file mode 100644 index 0000000..f658c93 --- /dev/null +++ b/test/unit/test_feat/test_feat.c @@ -0,0 +1,110 @@ +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "feat/feat.h" +#include "util/ckd_alloc.h" + +mfcc_t data[6][13] = { + { FLOAT2MFCC(15.114), FLOAT2MFCC(-1.424), FLOAT2MFCC(-0.953), + FLOAT2MFCC(0.186), FLOAT2MFCC(-0.656), FLOAT2MFCC(-0.226), + FLOAT2MFCC(-0.105), FLOAT2MFCC(-0.412), FLOAT2MFCC(-0.024), + FLOAT2MFCC(-0.091), FLOAT2MFCC(-0.124), FLOAT2MFCC(-0.158), FLOAT2MFCC(-0.197)}, + { FLOAT2MFCC(14.729), FLOAT2MFCC(-1.313), FLOAT2MFCC(-0.892), + FLOAT2MFCC(0.140), FLOAT2MFCC(-0.676), FLOAT2MFCC(-0.089), + FLOAT2MFCC(-0.313), FLOAT2MFCC(-0.422), FLOAT2MFCC(-0.058), + FLOAT2MFCC(-0.101), FLOAT2MFCC(-0.100), FLOAT2MFCC(-0.128), FLOAT2MFCC(-0.123)}, + { FLOAT2MFCC(14.502), FLOAT2MFCC(-1.351), FLOAT2MFCC(-1.028), + FLOAT2MFCC(-0.189), FLOAT2MFCC(-0.718), FLOAT2MFCC(-0.139), + FLOAT2MFCC(-0.121), FLOAT2MFCC(-0.365), FLOAT2MFCC(-0.139), + FLOAT2MFCC(-0.154), FLOAT2MFCC(0.041), FLOAT2MFCC(0.009), FLOAT2MFCC(-0.073)}, + { FLOAT2MFCC(14.557), FLOAT2MFCC(-1.676), FLOAT2MFCC(-0.864), + FLOAT2MFCC(0.118), FLOAT2MFCC(-0.445), FLOAT2MFCC(-0.168), + FLOAT2MFCC(-0.069), FLOAT2MFCC(-0.503), FLOAT2MFCC(-0.013), + FLOAT2MFCC(0.007), FLOAT2MFCC(-0.056), FLOAT2MFCC(-0.075), FLOAT2MFCC(-0.237)}, + { FLOAT2MFCC(14.665), FLOAT2MFCC(-1.498), FLOAT2MFCC(-0.582), + FLOAT2MFCC(0.209), FLOAT2MFCC(-0.487), FLOAT2MFCC(-0.247), + FLOAT2MFCC(-0.142), FLOAT2MFCC(-0.439), FLOAT2MFCC(0.059), + FLOAT2MFCC(-0.058), FLOAT2MFCC(-0.265), FLOAT2MFCC(-0.109), FLOAT2MFCC(-0.196)}, + { FLOAT2MFCC(15.025), FLOAT2MFCC(-1.199), FLOAT2MFCC(-0.607), + FLOAT2MFCC(0.235), FLOAT2MFCC(-0.499), FLOAT2MFCC(-0.080), + FLOAT2MFCC(-0.062), FLOAT2MFCC(-0.554), FLOAT2MFCC(-0.209), + FLOAT2MFCC(-0.124), FLOAT2MFCC(-0.445), FLOAT2MFCC(-0.352), FLOAT2MFCC(-0.400)}, +}; + +int +main(int argc, char *argv[]) +{ + feat_t *fcb; + mfcc_t **in_feats, ***out_feats; + int32 i, j, ncep; + + (void)argc; + (void)argv; + /* Test "raw" features without concatenation */ + fcb = feat_init("13", CMN_NONE, 0, AGC_NONE, 1, 13); + + in_feats = (mfcc_t **)ckd_alloc_2d_ptr(6, 13, data, sizeof(mfcc_t)); + out_feats = (mfcc_t ***)ckd_calloc_3d(6, 1, 13, sizeof(mfcc_t)); + ncep = 6; + feat_s2mfc2feat_live(fcb, in_feats, &ncep, 1, 1, out_feats); + + for (i = 0; i < 6; ++i) { + for (j = 0; j < 13; ++j) { + printf("%.3f ", MFCC2FLOAT(out_feats[i][0][j])); + } + printf("\n"); + } + feat_free(fcb); + ckd_free(in_feats); + ckd_free_3d(out_feats); + + /* Test "raw" features with concatenation */ + fcb = feat_init("13:1", CMN_NONE, 0, AGC_NONE, 1, 13); + + in_feats = (mfcc_t **)ckd_alloc_2d_ptr(6, 13, data, sizeof(mfcc_t)); + out_feats = (mfcc_t ***)ckd_calloc_3d(8, 1, 39, sizeof(mfcc_t)); + ncep = 6; + feat_s2mfc2feat_live(fcb, in_feats, &ncep, 1, 1, out_feats); + + for (i = 0; i < 6; ++i) { + for (j = 0; j < 39; ++j) { + printf("%.3f ", MFCC2FLOAT(out_feats[i][0][j])); + } + printf("\n"); + } + feat_free(fcb); + + /* Test 1s_c_d_dd features */ + fcb = feat_init("1s_c_d_dd", CMN_NONE, 0, AGC_NONE, 1, 13); + ncep = 6; + feat_s2mfc2feat_live(fcb, in_feats, &ncep, 1, 1, out_feats); + + for (i = 0; i < 6; ++i) { + for (j = 0; j < 39; ++j) { + printf("%.3f ", MFCC2FLOAT(out_feats[i][0][j])); + } + printf("\n"); + } + + /* Verify that the deltas are correct. */ + for (i = 2; i < 4; ++i) { + for (j = 0; j < 13; ++j) { + if (fabs(MFCC2FLOAT(out_feats[i][0][13+j] - + (out_feats[i+2][0][j] + - out_feats[i-2][0][j]))) > 0.01) { + printf("Delta mismatch in [%d][%d]\n", i, j); + return 1; + } + } + } + feat_free(fcb); + ckd_free(in_feats); + ckd_free_3d(out_feats); + + return 0; +} diff --git a/test/unit/test_feat/test_feat_fe.c b/test/unit/test_feat/test_feat_fe.c new file mode 100644 index 0000000..20f12fd --- /dev/null +++ b/test/unit/test_feat/test_feat_fe.c @@ -0,0 +1,153 @@ +#include +#include + +#include "fe/fe.h" +#include "feat/feat.h" +#include "util/cmd_ln.h" +#include "util/ckd_alloc.h" + +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + static const ps_arg_t fe_args[] = { + waveform_to_cepstral_command_line_macro(), + { NULL, 0, NULL, NULL } + }; + FILE *raw; + cmd_ln_t *config; + fe_t *fe; + feat_t *fcb; + int16 buf[2048]; + mfcc_t **cepbuf, **cptr; + mfcc_t ***featbuf1, ***featbuf2, ***fptr; + size_t nsamp; + int32 total_frames, ncep, nfr, i; + + if ((raw = fopen(TESTDATADIR "/chan3.raw", "rb")) == NULL) { + perror(TESTDATADIR "/chan3.raw"); + return 1; + } + + config = cmd_ln_parse_r(NULL, fe_args, argc, argv, FALSE); + fe = fe_init_auto_r(config); + fcb = feat_init("1s_c_d_dd", CMN_NONE, FALSE, AGC_NONE, + TRUE, fe_get_output_size(fe)); + + /* Determine how much data and how many MFCC frames we need. */ + fseek(raw, 0, SEEK_END); + nsamp = ftell(raw) / sizeof(int16); + fe_process_frames(fe, NULL, &nsamp, NULL, &total_frames); + printf("%ld samples, %d + 1 frames\n", nsamp, total_frames); + total_frames++; /* For the possible fe_end_utt() frame */ + cepbuf = ckd_calloc_2d(total_frames + 1, fe_get_output_size(fe), sizeof(**cepbuf)); + fseek(raw, 0, SEEK_SET); + + /* Pay close attention, kids. This is how you use fe_process_frames(). */ + fe_start_utt(fe); + cptr = cepbuf; + nfr = total_frames; + while ((nsamp = fread(buf, sizeof(int16), 2048, raw)) > 0) { + int16 const *bptr = buf; + while (nsamp) { + int32 ncep = nfr; + fe_process_frames(fe, &bptr, &nsamp, cptr, &ncep); + cptr += ncep; + nfr -= ncep; + } + } + fe_end_utt(fe, *cptr, &nfr); + + /* Now test some feature extraction problems. */ + featbuf1 = feat_array_alloc(fcb, total_frames); + featbuf2 = feat_array_alloc(fcb, total_frames); + + /* Whole utterance: canonical, assumed to be correct. */ + ncep = total_frames; + TEST_EQUAL(total_frames, + feat_s2mfc2feat_live(fcb, cepbuf, + &ncep, TRUE, TRUE, + featbuf1)); + TEST_EQUAL(ncep, total_frames); + + /* Process one frame at a time. */ + cptr = cepbuf; + fptr = featbuf2; + ncep = 1; + nfr = feat_s2mfc2feat_live(fcb, cptr, &ncep, TRUE, FALSE, fptr); + TEST_EQUAL(nfr, 0); /* Not possible to make any frames yet. */ + TEST_EQUAL(ncep, 1); /* But we should have consumed one. */ + cptr += ncep; + for (i = 1; i < total_frames - 1; ++i) { + ncep = 1; + nfr = feat_s2mfc2feat_live(fcb, cptr, &ncep, FALSE, FALSE, fptr); + cptr += ncep; + fptr += nfr; + } + nfr = feat_s2mfc2feat_live(fcb, cptr, &ncep, FALSE, TRUE, fptr); + TEST_EQUAL(nfr, 4); /* This should have dumped the trailing window. */ + TEST_EQUAL(ncep, 1); /* And only consumed one frame of MFCCs. */ + cptr += ncep; + fptr += nfr; + /* Verify that we actually got the correct number of frames. */ + TEST_EQUAL(cptr - cepbuf, total_frames); + TEST_EQUAL(fptr - featbuf2, total_frames); + + /* Now verify that the results are equal. */ + for (i = 0; i < total_frames; ++i) { + int32 j; + printf("%-4d ", i); + for (j = 0; (uint32)j < feat_dimension(fcb); ++j) { + TEST_EQUAL_MFCC(featbuf1[i][0][j], featbuf2[i][0][j]); + } + if (i % 10 == 9) + printf("\n"); + } + printf("\n"); + + /* Process large chunks of frames at once, so as to exceed the + * internal ringbuffer size in feat_s2mfc2feat_live(). */ + cptr = cepbuf; + fptr = featbuf2; + ncep = total_frames; + nfr = feat_s2mfc2feat_live(fcb, cptr, &ncep, TRUE, FALSE, fptr); + TEST_ASSERT(ncep != nfr); + cptr += ncep; + fptr += nfr; + ncep = total_frames - ncep; + while (ncep) { + int32 tmp_ncep; + tmp_ncep = ncep; + nfr = feat_s2mfc2feat_live(fcb, cptr, &tmp_ncep, FALSE, FALSE, fptr); + cptr += tmp_ncep; + fptr += nfr; + ncep -= tmp_ncep; + } + nfr = feat_s2mfc2feat_live(fcb, cptr, &ncep, FALSE, TRUE, fptr); + cptr += ncep; + fptr += nfr; + TEST_EQUAL(cptr - cepbuf, total_frames); + TEST_EQUAL(fptr - featbuf2, total_frames); + + /* Now verify that the results are equal. */ + for (i = 0; i < total_frames; ++i) { + int32 j; + printf("%-4d ", i); + for (j = 0; (uint32)j < feat_dimension(fcb); ++j) + TEST_EQUAL_MFCC(featbuf1[i][0][j], featbuf2[i][0][j]); + if (i % 10 == 9) + printf("\n"); + } + printf("\n"); + + fclose(raw); + fe_free(fe); + feat_array_free(featbuf1); + feat_array_free(featbuf2); + feat_free(fcb); + ckd_free_2d(cepbuf); + ps_config_free(config); + + return 0; +} diff --git a/test/unit/test_feat/test_feat_live.c b/test/unit/test_feat/test_feat_live.c new file mode 100644 index 0000000..1034a1c --- /dev/null +++ b/test/unit/test_feat/test_feat_live.c @@ -0,0 +1,121 @@ +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "feat/feat.h" +#include "util/ckd_alloc.h" + +#include "test_macros.h" + +mfcc_t data[6][13] = { + { FLOAT2MFCC(15.114), FLOAT2MFCC(-1.424), FLOAT2MFCC(-0.953), + FLOAT2MFCC(0.186), FLOAT2MFCC(-0.656), FLOAT2MFCC(-0.226), + FLOAT2MFCC(-0.105), FLOAT2MFCC(-0.412), FLOAT2MFCC(-0.024), + FLOAT2MFCC(-0.091), FLOAT2MFCC(-0.124), FLOAT2MFCC(-0.158), FLOAT2MFCC(-0.197)}, + { FLOAT2MFCC(14.729), FLOAT2MFCC(-1.313), FLOAT2MFCC(-0.892), + FLOAT2MFCC(0.140), FLOAT2MFCC(-0.676), FLOAT2MFCC(-0.089), + FLOAT2MFCC(-0.313), FLOAT2MFCC(-0.422), FLOAT2MFCC(-0.058), + FLOAT2MFCC(-0.101), FLOAT2MFCC(-0.100), FLOAT2MFCC(-0.128), FLOAT2MFCC(-0.123)}, + { FLOAT2MFCC(14.502), FLOAT2MFCC(-1.351), FLOAT2MFCC(-1.028), + FLOAT2MFCC(-0.189), FLOAT2MFCC(-0.718), FLOAT2MFCC(-0.139), + FLOAT2MFCC(-0.121), FLOAT2MFCC(-0.365), FLOAT2MFCC(-0.139), + FLOAT2MFCC(-0.154), FLOAT2MFCC(0.041), FLOAT2MFCC(0.009), FLOAT2MFCC(-0.073)}, + { FLOAT2MFCC(14.557), FLOAT2MFCC(-1.676), FLOAT2MFCC(-0.864), + FLOAT2MFCC(0.118), FLOAT2MFCC(-0.445), FLOAT2MFCC(-0.168), + FLOAT2MFCC(-0.069), FLOAT2MFCC(-0.503), FLOAT2MFCC(-0.013), + FLOAT2MFCC(0.007), FLOAT2MFCC(-0.056), FLOAT2MFCC(-0.075), FLOAT2MFCC(-0.237)}, + { FLOAT2MFCC(14.665), FLOAT2MFCC(-1.498), FLOAT2MFCC(-0.582), + FLOAT2MFCC(0.209), FLOAT2MFCC(-0.487), FLOAT2MFCC(-0.247), + FLOAT2MFCC(-0.142), FLOAT2MFCC(-0.439), FLOAT2MFCC(0.059), + FLOAT2MFCC(-0.058), FLOAT2MFCC(-0.265), FLOAT2MFCC(-0.109), FLOAT2MFCC(-0.196)}, + { FLOAT2MFCC(15.025), FLOAT2MFCC(-1.199), FLOAT2MFCC(-0.607), + FLOAT2MFCC(0.235), FLOAT2MFCC(-0.499), FLOAT2MFCC(-0.080), + FLOAT2MFCC(-0.062), FLOAT2MFCC(-0.554), FLOAT2MFCC(-0.209), + FLOAT2MFCC(-0.124), FLOAT2MFCC(-0.445), FLOAT2MFCC(-0.352), FLOAT2MFCC(-0.400)}, +}; + +int +main(int argc, char *argv[]) +{ + feat_t *fcb; + mfcc_t **in_feats, ***out_feats, ***out_feats2, ***optr; + int32 i, j, ncep, nfr, nfr1, nfr2; + + (void)argc; + (void)argv; + in_feats = (mfcc_t **)ckd_alloc_2d_ptr(6, 13, data, sizeof(mfcc_t)); + out_feats = (mfcc_t ***)ckd_calloc_3d(8, 1, 39, sizeof(mfcc_t)); + /* Test 1s_c_d_dd features */ + fcb = feat_init("1s_c_d_dd", CMN_NONE, 0, AGC_NONE, 1, 13); + ncep = 6; + nfr1 = feat_s2mfc2feat_live(fcb, in_feats, &ncep, 1, 1, out_feats); + printf("Processed %d input %d output frames\n", ncep, nfr1); + for (i = 0; i < nfr1; ++i) { + printf("%d: ", i); + for (j = 0; j < 39; ++j) { + printf("%.3f ", MFCC2FLOAT(out_feats[i][0][j])); + } + printf("\n"); + } + feat_free(fcb); + + /* Test in "live" mode. */ + fcb = feat_init("1s_c_d_dd", CMN_NONE, 0, AGC_NONE, 1, 13); + optr = out_feats2 = (mfcc_t ***)ckd_calloc_3d(8, 1, 39, sizeof(mfcc_t)); + nfr2 = 0; + ncep = 2; + nfr = feat_s2mfc2feat_live(fcb, in_feats, &ncep, TRUE, FALSE, optr); + printf("Processed %d input %d output frames\n", ncep, nfr); + nfr2 += nfr; + for (i = 0; i < nfr; ++i) { + printf("%d: ", i); + for (j = 0; j < 39; ++j) { + printf("%.3f ", MFCC2FLOAT(optr[i][0][j])); + } + printf("\n"); + } + optr += nfr; + + ncep = 2; + nfr = feat_s2mfc2feat_live(fcb, in_feats + 2, &ncep, FALSE, FALSE, optr); + nfr2 += nfr; + printf("Processed %d input %d output frames\n", ncep, nfr); + for (i = 0; i < nfr; ++i) { + printf("%d: ", i); + for (j = 0; j < 39; ++j) { + printf("%.3f ", MFCC2FLOAT(optr[i][0][j])); + } + printf("\n"); + } + optr += nfr; + + ncep = 2; + nfr = feat_s2mfc2feat_live(fcb, in_feats + 4, &ncep, FALSE, TRUE, optr); + nfr2 += nfr; + printf("Processed %d input %d output frames\n", ncep, nfr); + for (i = 0; i < nfr; ++i) { + printf("%d: ", i); + for (j = 0; j < 39; ++j) { + printf("%.3f ", MFCC2FLOAT(optr[i][0][j])); + } + printf("\n"); + } + optr += nfr; + feat_free(fcb); + + TEST_EQUAL(nfr1, nfr2); + for (i = 0; i < nfr1; ++i) { + for (j = 0; j < 39; ++j) { + TEST_EQUAL(out_feats[i][0][j], out_feats2[i][0][j]); + } + } + ckd_free_3d(out_feats2); + ckd_free_3d(out_feats); + ckd_free(in_feats); + + return 0; +} diff --git a/test/unit/test_feat/test_subvq.c b/test/unit/test_feat/test_subvq.c new file mode 100644 index 0000000..42cf034 --- /dev/null +++ b/test/unit/test_feat/test_subvq.c @@ -0,0 +1,94 @@ +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "feat/feat.h" +#include "util/ckd_alloc.h" + +#include "test_macros.h" + +mfcc_t data[6][13] = { + { FLOAT2MFCC(15.114), FLOAT2MFCC(-1.424), FLOAT2MFCC(-0.953), + FLOAT2MFCC(0.186), FLOAT2MFCC(-0.656), FLOAT2MFCC(-0.226), + FLOAT2MFCC(-0.105), FLOAT2MFCC(-0.412), FLOAT2MFCC(-0.024), + FLOAT2MFCC(-0.091), FLOAT2MFCC(-0.124), FLOAT2MFCC(-0.158), FLOAT2MFCC(-0.197)}, + { FLOAT2MFCC(14.729), FLOAT2MFCC(-1.313), FLOAT2MFCC(-0.892), + FLOAT2MFCC(0.140), FLOAT2MFCC(-0.676), FLOAT2MFCC(-0.089), + FLOAT2MFCC(-0.313), FLOAT2MFCC(-0.422), FLOAT2MFCC(-0.058), + FLOAT2MFCC(-0.101), FLOAT2MFCC(-0.100), FLOAT2MFCC(-0.128), FLOAT2MFCC(-0.123)}, + { FLOAT2MFCC(14.502), FLOAT2MFCC(-1.351), FLOAT2MFCC(-1.028), + FLOAT2MFCC(-0.189), FLOAT2MFCC(-0.718), FLOAT2MFCC(-0.139), + FLOAT2MFCC(-0.121), FLOAT2MFCC(-0.365), FLOAT2MFCC(-0.139), + FLOAT2MFCC(-0.154), FLOAT2MFCC(0.041), FLOAT2MFCC(0.009), FLOAT2MFCC(-0.073)}, + { FLOAT2MFCC(14.557), FLOAT2MFCC(-1.676), FLOAT2MFCC(-0.864), + FLOAT2MFCC(0.118), FLOAT2MFCC(-0.445), FLOAT2MFCC(-0.168), + FLOAT2MFCC(-0.069), FLOAT2MFCC(-0.503), FLOAT2MFCC(-0.013), + FLOAT2MFCC(0.007), FLOAT2MFCC(-0.056), FLOAT2MFCC(-0.075), FLOAT2MFCC(-0.237)}, + { FLOAT2MFCC(14.665), FLOAT2MFCC(-1.498), FLOAT2MFCC(-0.582), + FLOAT2MFCC(0.209), FLOAT2MFCC(-0.487), FLOAT2MFCC(-0.247), + FLOAT2MFCC(-0.142), FLOAT2MFCC(-0.439), FLOAT2MFCC(0.059), + FLOAT2MFCC(-0.058), FLOAT2MFCC(-0.265), FLOAT2MFCC(-0.109), FLOAT2MFCC(-0.196)}, + { FLOAT2MFCC(15.025), FLOAT2MFCC(-1.199), FLOAT2MFCC(-0.607), + FLOAT2MFCC(0.235), FLOAT2MFCC(-0.499), FLOAT2MFCC(-0.080), + FLOAT2MFCC(-0.062), FLOAT2MFCC(-0.554), FLOAT2MFCC(-0.209), + FLOAT2MFCC(-0.124), FLOAT2MFCC(-0.445), FLOAT2MFCC(-0.352), FLOAT2MFCC(-0.400)}, +}; + +int +main(int argc, char *argv[]) +{ + static char const svspec[] = "1-12/14-25/0,13,26/27-38"; + int32 **subvecs, i, j, k, ncep; + mfcc_t **in_feats, ***out_feats; + feat_t *fcb; + + (void)argc; + (void)argv; + /* Test parsing of a subvector spec. */ + subvecs = parse_subvecs(svspec); + TEST_ASSERT(subvecs); + for (i = 0; i < 12; ++i) { + TEST_EQUAL(subvecs[0][i], i+1); + } + for (i = 0; i < 12; ++i) { + TEST_EQUAL(subvecs[1][i], i+14); + } + TEST_EQUAL(subvecs[2][0], 0); + TEST_EQUAL(subvecs[2][1], 13); + TEST_EQUAL(subvecs[2][2], 26); + for (i = 0; i < 12; ++i) { + TEST_EQUAL(subvecs[3][i], i+27); + } + + /* Create a 1s_c_d_dd feature stream and split it into subvectors. */ + fcb = feat_init("1s_c_d_dd", CMN_NONE, 0, AGC_NONE, 1, 13); + TEST_ASSERT(fcb); + feat_set_subvecs(fcb, subvecs); + + in_feats = (mfcc_t **)ckd_alloc_2d_ptr(6, 13, data, sizeof(mfcc_t)); + out_feats = feat_array_alloc(fcb, 6); + TEST_ASSERT(out_feats); + + ncep = 6; + feat_s2mfc2feat_live(fcb, in_feats, &ncep, 1, 1, out_feats); + + for (i = 0; i < 6; ++i) { + for (j = 0; j < feat_dimension1(fcb); ++j) { + for (k = 0; (uint32)k < feat_dimension2(fcb, j); ++k) { + printf("%.3f ", MFCC2FLOAT(out_feats[i][j][k])); + } + printf("\n"); + } + printf("\n"); + } + + feat_array_free(out_feats); + ckd_free(in_feats); + feat_free(fcb); + + return 0; +} diff --git a/test/unit/test_fsg/CMakeLists.txt b/test/unit/test_fsg/CMakeLists.txt new file mode 100644 index 0000000..8739a55 --- /dev/null +++ b/test/unit/test_fsg/CMakeLists.txt @@ -0,0 +1,20 @@ +set(TEST_EXECUTABLES + test_fsg_read + test_fsg_jsgf + test_fsg_write_fsm + test_fsg_accept + ) +foreach(TEST_EXECUTABLE ${TEST_EXECUTABLES}) + add_executable(${TEST_EXECUTABLE} EXCLUDE_FROM_ALL ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR}/test/unit + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) + add_test(NAME ${TEST_EXECUTABLE} COMMAND ${TEST_EXECUTABLE}) + set_property(TARGET ${TEST_EXECUTABLE} + PROPERTY COMPILE_DEFINITIONS LMDIR="${CMAKE_CURRENT_SOURCE_DIR}") + add_dependencies(check ${TEST_EXECUTABLE}) +endforeach() diff --git a/test/unit/test_fsg/goforward.fsg b/test/unit/test_fsg/goforward.fsg new file mode 100644 index 0000000..89b6f11 --- /dev/null +++ b/test/unit/test_fsg/goforward.fsg @@ -0,0 +1,24 @@ +FSG_BEGIN turtle +NUM_STATES 7 +START_STATE 0 +FINAL_STATE 6 + +# Transitions +TRANSITION 0 1 1.0 GO +TRANSITION 1 2 0.5 FORWARD +TRANSITION 1 3 0.5 BACKWARD +TRANSITION 2 4 1.0 +TRANSITION 3 4 1.0 +TRANSITION 4 5 0.1 ONE +TRANSITION 4 5 0.1 TWO +TRANSITION 4 5 0.1 THREE +TRANSITION 4 5 0.1 FOUR +TRANSITION 4 5 0.1 FIVE +TRANSITION 4 5 0.1 SIX +TRANSITION 4 5 0.1 SEVEN +TRANSITION 4 5 0.1 EIGHT +TRANSITION 4 5 0.1 NINE +TRANSITION 4 5 0.1 TEN +TRANSITION 5 6 0.1 METER +TRANSITION 5 6 0.9 METERS +FSG_END diff --git a/test/unit/test_fsg/polite.gram b/test/unit/test_fsg/polite.gram new file mode 100644 index 0000000..49805f0 --- /dev/null +++ b/test/unit/test_fsg/polite.gram @@ -0,0 +1,10 @@ +#JSGF V1.0; + +/** + * JSGF Grammar for Hello World example + */ + +grammar polite; + +public = [please | kindly | could you | oh mighty computer]; +public = [please | thanks | thank you]; diff --git a/test/unit/test_fsg/public.gram b/test/unit/test_fsg/public.gram new file mode 100644 index 0000000..127f2a3 --- /dev/null +++ b/test/unit/test_fsg/public.gram @@ -0,0 +1,7 @@ +#JSGF V1.0; + +/* Grammar that uses reserved keywords in tokens */ + +grammar public; + +public = grammar /* some comment */ | public | import; diff --git a/test/unit/test_fsg.c b/test/unit/test_fsg/test_fsg.c similarity index 98% rename from test/unit/test_fsg.c rename to test/unit/test_fsg/test_fsg.c index 7e67549..2182984 100644 --- a/test/unit/test_fsg.c +++ b/test/unit/test_fsg/test_fsg.c @@ -58,7 +58,7 @@ main(int argc, char *argv[]) ps_lattice_hyp(dag, ps_lattice_bestpath(dag, NULL, 1.0, 15.0))); ps_lattice_posterior(dag, NULL, 15.0); ps_free(ps); - cmd_ln_free_r(config); + ps_config_free(config); return 0; } diff --git a/test/unit/test_fsg/test_fsg_accept.c b/test/unit/test_fsg/test_fsg_accept.c new file mode 100644 index 0000000..25f635f --- /dev/null +++ b/test/unit/test_fsg/test_fsg_accept.c @@ -0,0 +1,107 @@ +/** + * Make sure FSG code accepts things it should and refuses things it shouldn't + */ +#include +#include +#include + +#include "lm/fsg_model.h" +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + fsg_model_t *fsg; + + (void)argc; + (void)argv; + + err_set_loglevel(ERR_INFO); + lmath = logmath_init(1.0001, 0, 0); + + /* Try an easy one. */ + fsg = fsg_model_readfile(LMDIR "/goforward.fsg", lmath, 7.5); + TEST_ASSERT(fsg); + + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "GO FORWARD TEN METERS")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "GO FORWARD TEN METER")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "GO FORWARD SIX METER")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "GO FORWARD TEN METER")); + TEST_EQUAL(FALSE, fsg_model_accept(fsg, "GO FORWARD TEN")); + TEST_EQUAL(FALSE, fsg_model_accept(fsg, "GO FORWARD THREE FOUR METERS")); + TEST_EQUAL(FALSE, fsg_model_accept(fsg, "GO FORWARD YOURSELF")); + TEST_EQUAL(FALSE, fsg_model_accept(fsg, "")); + fsg_model_free(fsg); + + /* Try some harder ones. */ + fsg = fsg_model_readfile( + LMDIR "/../../regression/test.rightRecursion.fsg", lmath, 7.5); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "stop")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "start")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "stop and start")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "stop and stop")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "start and start")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, + "start and start and start")); + TEST_EQUAL(FALSE, fsg_model_accept(fsg, "stop stop")); + TEST_EQUAL(FALSE, fsg_model_accept(fsg, "")); + TEST_EQUAL(FALSE, fsg_model_accept(fsg, "and stop")); + TEST_EQUAL(FALSE, fsg_model_accept(fsg, "stop and")); + fsg_model_free(fsg); + + /* Try some harder ones. */ + fsg = fsg_model_readfile( + LMDIR "/../../regression/test.nestedRightRecursion.fsg", lmath, 7.5); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "something")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "another")); + /* nothing else should be accepted!! */ + TEST_EQUAL(FALSE, fsg_model_accept(fsg, "another another")); + TEST_EQUAL(FALSE, fsg_model_accept(fsg, "something another")); + TEST_EQUAL(FALSE, fsg_model_accept(fsg, "something something")); + fsg_model_free(fsg); + + fsg = fsg_model_readfile( + LMDIR "/../../regression/test.kleene.fsg", lmath, 7.5); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "please oh mighty computer kindly don't crash")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "please please please don't crash")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "please don't crash")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "kindly don't crash")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "oh mighty computer don't crash")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "don't crash")); + TEST_EQUAL(FALSE, fsg_model_accept(fsg, "kindly oh mighty computer")); + TEST_EQUAL(FALSE, fsg_model_accept(fsg, "")); + fsg_model_free(fsg); + + fsg = fsg_model_readfile( + LMDIR "/../../regression/test.command.fsg", lmath, 7.5); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "oh mighty computer thanks")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "go go go go go")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "stop")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "stop stop stop")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "could you stop thanks")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "could you stop")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "kindly go go go thank you")); + TEST_EQUAL(FALSE, fsg_model_accept(fsg, "go stop")); + TEST_EQUAL(FALSE, fsg_model_accept(fsg, "please kindly go please")); + TEST_EQUAL(FALSE, fsg_model_accept(fsg, "please go please thanks")); + fsg_model_free(fsg); + + fsg = fsg_model_readfile( + LMDIR "/../../regression/right_recursion_53.fsg", lmath, 7.5); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "ONE THOUSAND FIVE METER EQUAL TO CENTIMETER")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "ONE ONE THREE THREE THOUSAND TEN NINE CENTIMETER EQUAL TO METER")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "WHAT IS YOUR NAME")); + TEST_EQUAL(TRUE, fsg_model_accept(fsg, "THREE METER EQUAL TO HOW MANY CENTIMETER")); + TEST_EQUAL(FALSE, fsg_model_accept(fsg, "")); + TEST_EQUAL(FALSE, fsg_model_accept(fsg, "METER EQUAL TO HOW MANY MILE")); + TEST_EQUAL(FALSE, fsg_model_accept(fsg, "ONE THREE HOW MANY MILE")); + TEST_EQUAL(FALSE, fsg_model_accept(fsg, "WHAT IS YOUR NAME HOW MANY THOUSAND THOUSAND")); + TEST_EQUAL(FALSE, fsg_model_accept(fsg, "ONE TWO WHAT IS YOUR NAME")); + TEST_EQUAL(FALSE, fsg_model_accept(fsg, "THOUSAND WHAT IS YOUR NAME")); + fsg_model_free(fsg); + logmath_free(lmath); + + return 0; +} diff --git a/test/unit/test_fsg/test_fsg_jsgf.c b/test/unit/test_fsg/test_fsg_jsgf.c new file mode 100644 index 0000000..402a27f --- /dev/null +++ b/test/unit/test_fsg/test_fsg_jsgf.c @@ -0,0 +1,57 @@ +#include "lm/jsgf.h" +#include "lm/fsg_model.h" +#include + +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + fsg_model_t *fsg; + jsgf_t *jsgf; + jsgf_rule_t *rule; + + (void)argc; + (void)argv; + lmath = logmath_init(1.0001, 0, 0); + + /* Test loading */ + jsgf = jsgf_parse_file(LMDIR "/polite.gram", NULL); + TEST_ASSERT(jsgf); + rule = jsgf_get_rule(jsgf, "polite.startPolite"); + TEST_ASSERT(rule); + fsg = jsgf_build_fsg(jsgf, rule, lmath, 7.5); + TEST_ASSERT(fsg); + TEST_EQUAL_STRING("polite", jsgf_grammar_name(jsgf)); + + TEST_ASSERT(fsg_model_add_silence(fsg, "", -1, 0.3)); + TEST_ASSERT(fsg_model_add_silence(fsg, "++NOISE++", -1, 0.3)); + TEST_ASSERT(fsg_model_add_alt(fsg, "please", "please(2)")); + + jsgf_grammar_free(jsgf); + fsg_model_write(fsg, stdout); + fsg_model_free(fsg); + + /* Or do everything at once */ + fsg = jsgf_read_file(LMDIR "/public.gram", lmath, 1.0); + fsg_model_free(fsg); + + /* Test grammar with keywords inside */ + jsgf = jsgf_parse_file(LMDIR "/public.gram", NULL); + TEST_ASSERT(jsgf); + jsgf_grammar_free(jsgf); + + jsgf = jsgf_parse_string("#JSGF V1.0; grammar test; public = yes | no;", NULL); + TEST_ASSERT(jsgf); + rule = jsgf_get_rule(jsgf, "test.choice"); + TEST_ASSERT(rule); + fsg = jsgf_build_fsg(jsgf, rule, lmath, 7.5); + fsg_model_write(fsg, stdout); + fsg_model_free(fsg); + jsgf_grammar_free(jsgf); + + logmath_free(lmath); + + return 0; +} diff --git a/test/unit/test_fsg/test_fsg_read.c b/test/unit/test_fsg/test_fsg_read.c new file mode 100644 index 0000000..4c2b2d1 --- /dev/null +++ b/test/unit/test_fsg/test_fsg_read.c @@ -0,0 +1,58 @@ +#include "lm/fsg_model.h" + +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + fsg_model_t *fsg; + fsg_arciter_t *itor; + + (void)argc; + (void)argv; + /* Initialize a logmath object to pass to fsg_model_read */ + lmath = logmath_init(1.0001, 0, 0); + /* Read a FSG. */ + fsg = fsg_model_readfile(LMDIR "/goforward.fsg", lmath, 7.5); + TEST_ASSERT(fsg); + + TEST_ASSERT(fsg_model_add_silence(fsg, "", -1, 0.3)); + TEST_ASSERT(fsg_model_add_silence(fsg, "++NOISE++", -1, 0.3)); + TEST_ASSERT(fsg_model_add_alt(fsg, "FORWARD", "FORWARD(2)")); + + fsg_model_write(fsg, stdout); + + /* Test reference counting. */ + TEST_ASSERT(fsg = fsg_model_retain(fsg)); + TEST_EQUAL(1, fsg_model_free(fsg)); + fsg_model_write(fsg, stdout); + + /* Test iteration. */ + for (itor = fsg_model_arcs(fsg, 3); + itor; itor = fsg_arciter_next(itor)) { + fsg_link_t *link = fsg_arciter_get(itor); + + TEST_EQUAL(fsg_link_from_state(link), 3); + if (fsg_link_wid(link) == -1) { + TEST_EQUAL(fsg_link_to_state(link), 4); + TEST_EQUAL(fsg_link_logs2prob(link), 0); + } + else if (fsg_link_wid(link) == fsg_model_word_id(fsg, "++NOISE++") + || fsg_link_wid(link) == fsg_model_word_id(fsg, "")) { + TEST_EQUAL(fsg_link_to_state(link), 3); + TEST_EQUAL_LOG(fsg_link_logs2prob(link), -90300); + } + printf("%d => %d %s %d\n", + fsg_link_from_state(link), + fsg_link_to_state(link), + fsg_link_wid(link) == -1 + ? "ε" : fsg_model_word_str(fsg, fsg_link_wid(link)), + fsg_link_logs2prob(link)); + } + + TEST_EQUAL(0, fsg_model_free(fsg)); + logmath_free(lmath); + + return 0; +} diff --git a/test/unit/test_fsg/test_fsg_write_fsm.c b/test/unit/test_fsg/test_fsg_write_fsm.c new file mode 100644 index 0000000..092671d --- /dev/null +++ b/test/unit/test_fsg/test_fsg_write_fsm.c @@ -0,0 +1,36 @@ +#include "lm/jsgf.h" +#include "lm/fsg_model.h" + +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + fsg_model_t *fsg; + jsgf_t *jsgf; + jsgf_rule_t *rule; + + (void)argc; + (void)argv; + /* Initialize a logmath object to pass to fsg_model_read */ + lmath = logmath_init(1.0001, 0, 0); + jsgf = jsgf_parse_file(LMDIR "/polite.gram", NULL); + TEST_ASSERT(jsgf); + rule = jsgf_get_rule(jsgf, "polite.startPolite"); + TEST_ASSERT(rule); + fsg = jsgf_build_fsg(jsgf, rule, lmath, 7.5); + TEST_ASSERT(fsg); + + TEST_ASSERT(fsg_model_add_silence(fsg, "", -1, 0.3)); + TEST_ASSERT(fsg_model_add_silence(fsg, "++NOISE++", -1, 0.3)); + TEST_ASSERT(fsg_model_add_alt(fsg, "please", "please(2)")); + + jsgf_grammar_free(jsgf); + fsg_model_write_fsm(fsg, stdout); + fsg_model_write_symtab(fsg, stdout); + fsg_model_free(fsg); + logmath_free(lmath); + + return 0; +} diff --git a/test/unit/test_fwdflat.c b/test/unit/test_fwdflat.c index 0aa8d15..ebe2bca 100644 --- a/test/unit/test_fwdflat.c +++ b/test/unit/test_fwdflat.c @@ -11,17 +11,20 @@ main(int argc, char *argv[]) { cmd_ln_t *config; + (void)argc; + (void)argv; TEST_ASSERT(config = - cmd_ln_init(NULL, ps_args(), TRUE, - "-hmm", MODELDIR "/en-us/en-us", - "-lm", MODELDIR "/en-us/en-us.lm.bin", - "-dict", MODELDIR "/en-us/cmudict-en-us.dict", - "-fwdflatlw", "6.5", - "-fwdtree", "no", - "-fwdflat", "yes", - "-bestpath", "no", - "-fwdflatbeam", "1e-30", - "-fwdflatwbeam", "1e-20", - "-samprate", "16000", NULL)); + ps_config_parse_json( + NULL, + "hmm: \"" MODELDIR "/en-us/en-us\"," + "lm: \"" MODELDIR "/en-us/en-us.lm.bin\"," + "dict: \"" MODELDIR "/en-us/cmudict-en-us.dict\"," + "fwdflatlw: 6.5," + "fwdtree: false," + "fwdflat: true," + "bestpath: false," + "fwdflatbeam: 1e-30," + "fwdflatwbeam: 1e-20," + "samprate: 16000")); return ps_decoder_test(config, "FWDFLAT", "go forward ten meters"); } diff --git a/test/unit/test_fwdtree.c b/test/unit/test_fwdtree.c index f20b8b8..1db512d 100644 --- a/test/unit/test_fwdtree.c +++ b/test/unit/test_fwdtree.c @@ -11,14 +11,17 @@ main(int argc, char *argv[]) { cmd_ln_t *config; + (void)argc; + (void)argv; TEST_ASSERT(config = - cmd_ln_init(NULL, ps_args(), TRUE, - "-hmm", MODELDIR "/en-us/en-us", - "-lm", MODELDIR "/en-us/en-us.lm.bin", - "-dict", MODELDIR "/en-us/cmudict-en-us.dict", - "-fwdtree", "yes", - "-fwdflat", "no", - "-bestpath", "no", - "-samprate", "16000", NULL)); + ps_config_parse_json( + NULL, + "hmm: \"" MODELDIR "/en-us/en-us\"," + "lm: \"" MODELDIR "/en-us/en-us.lm.bin\"," + "dict: \"" MODELDIR "/en-us/cmudict-en-us.dict\"," + "fwdtree: true," + "fwdflat: false," + "bestpath: false," + "samprate: 16000")); return ps_decoder_test(config, "FWDTREE", "go forward ten meters"); } diff --git a/test/unit/test_fwdtree_bestpath.c b/test/unit/test_fwdtree_bestpath.c index 82b5e21..7c6f610 100644 --- a/test/unit/test_fwdtree_bestpath.c +++ b/test/unit/test_fwdtree_bestpath.c @@ -11,14 +11,14 @@ main(int argc, char *argv[]) { cmd_ln_t *config; + (void)argc; + (void)argv; TEST_ASSERT(config = - cmd_ln_init(NULL, ps_args(), TRUE, - "-hmm", MODELDIR "/en-us/en-us", - "-lm", MODELDIR "/en-us/en-us.lm.bin", - "-dict", MODELDIR "/en-us/cmudict-en-us.dict", - "-fwdtree", "yes", - "-fwdflat", "no", - "-bestpath", "yes", - "-samprate", "16000", NULL)); + ps_config_parse_json(NULL, + "hmm: \"" MODELDIR "/en-us/en-us\", " + "lm: \"" MODELDIR "/en-us/en-us.lm.bin\", " + "dict: \"" MODELDIR "/en-us/cmudict-en-us.dict\", " + "fwdtree: true, fwdflat: no, bestpath: yes, " + "samprate: 16000")) return ps_decoder_test(config, "BESTPATH", "go forward ten meters"); } diff --git a/test/unit/test_hash/CMakeLists.txt b/test/unit/test_hash/CMakeLists.txt new file mode 100644 index 0000000..8b8c54f --- /dev/null +++ b/test/unit/test_hash/CMakeLists.txt @@ -0,0 +1,32 @@ +set(TEST_EXECUTABLES + displayhash + deletehash + test_hash_iter + ) +foreach(TEST_EXECUTABLE ${TEST_EXECUTABLES}) + add_executable(${TEST_EXECUTABLE} EXCLUDE_FROM_ALL ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR}/test/unit + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) + add_dependencies(check ${TEST_EXECUTABLE}) +endforeach() +set(TESTS + test_hash_iter + _hash_delete1.test + _hash_delete2.test + _hash_delete3.test + _hash_delete4.test + _hash_delete5.test +) +foreach(TEST ${TESTS}) + if(${TEST} MATCHES "\.(test|sh)$") + add_test(NAME ${TEST} COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/${TEST}) + else() + add_test(NAME ${TEST} COMMAND ${TEST}) + endif() + set_property(TEST ${TEST} PROPERTY ENVIRONMENT CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}) +endforeach() diff --git a/test/unit/test_hash/_hash_delete1.res b/test/unit/test_hash/_hash_delete1.res new file mode 100644 index 0000000..1fb4237 --- /dev/null +++ b/test/unit/test_hash/_hash_delete1.res @@ -0,0 +1,6 @@ +Hash with chaining representation of the hash table +|key:-bla|len:4|val=8|->NULL +|key:-hmmdump|len:8|val=1|->|key:-subvq|len:6|val=7|->|key:-outlatdir|len:10|val=3|->NULL +|key:-svq4svq|len:8|val=2|->|key:-lminmemory|len:11|val=6|->NULL +|key:-beam|len:5|val=5|->NULL +The total number of keys =7 diff --git a/test/unit/test_hash/_hash_delete1.test b/test/unit/test_hash/_hash_delete1.test new file mode 100755 index 0000000..4eca3f5 --- /dev/null +++ b/test/unit/test_hash/_hash_delete1.test @@ -0,0 +1,7 @@ +#!/bin/bash +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh + +set -e +"${CMAKE_BINARY_DIR}/deletehash" -lm > _hash_delete1.out 2>&1 +compare_table delete1 _hash_delete1.out $tests/unit/test_hash/_hash_delete1.res +rm -f _hash_delete1.out diff --git a/test/unit/test_hash/_hash_delete2.res b/test/unit/test_hash/_hash_delete2.res new file mode 100644 index 0000000..5f8151a --- /dev/null +++ b/test/unit/test_hash/_hash_delete2.res @@ -0,0 +1,7 @@ +Hash with chaining representation of the hash table +|key:-bla|len:4|val=8|->NULL +|key:-hmmdump|len:8|val=1|->|key:-outlatdir|len:10|val=3|->NULL +|key:-svq4svq|len:8|val=2|->|key:-lminmemory|len:11|val=6|->NULL +|key:-lm|len:3|val=4|->NULL +|key:-beam|len:5|val=5|->NULL +The total number of keys =7 diff --git a/test/unit/test_hash/_hash_delete2.test b/test/unit/test_hash/_hash_delete2.test new file mode 100755 index 0000000..6f0438b --- /dev/null +++ b/test/unit/test_hash/_hash_delete2.test @@ -0,0 +1,7 @@ +#!/bin/bash +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh + +set -e +"${CMAKE_BINARY_DIR}/deletehash" -subvq > _hash_delete2.out 2>&1 +compare_table delete2 _hash_delete2.out $tests/unit/test_hash/_hash_delete2.res +rm -f _hash_delete2.out diff --git a/test/unit/test_hash/_hash_delete3.res b/test/unit/test_hash/_hash_delete3.res new file mode 100644 index 0000000..949300e --- /dev/null +++ b/test/unit/test_hash/_hash_delete3.res @@ -0,0 +1,7 @@ +Hash with chaining representation of the hash table +|key:-bla|len:4|val=8|->NULL +|key:-hmmdump|len:8|val=1|->|key:-subvq|len:6|val=7|->|key:-outlatdir|len:10|val=3|->NULL +|key:-lminmemory|len:11|val=6|->NULL +|key:-lm|len:3|val=4|->NULL +|key:-beam|len:5|val=5|->NULL +The total number of keys =7 diff --git a/test/unit/test_hash/_hash_delete3.test b/test/unit/test_hash/_hash_delete3.test new file mode 100755 index 0000000..49490ae --- /dev/null +++ b/test/unit/test_hash/_hash_delete3.test @@ -0,0 +1,7 @@ +#!/bin/bash +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh + +set -e +"${CMAKE_BINARY_DIR}/deletehash" -svq4svq > _hash_delete3.out 2>&1 +compare_table delete3 _hash_delete3.out $tests/unit/test_hash/_hash_delete3.res +rm -f _hash_delete3.out diff --git a/test/unit/test_hash/_hash_delete4.res b/test/unit/test_hash/_hash_delete4.res new file mode 100644 index 0000000..5ee8c03 --- /dev/null +++ b/test/unit/test_hash/_hash_delete4.res @@ -0,0 +1,7 @@ +Hash with chaining representation of the hash table +|key:-bla|len:4|val=8|->NULL +|key:-subvq|len:6|val=7|->|key:-outlatdir|len:10|val=3|->NULL +|key:-svq4svq|len:8|val=2|->|key:-lminmemory|len:11|val=6|->NULL +|key:-lm|len:3|val=4|->NULL +|key:-beam|len:5|val=5|->NULL +The total number of keys =7 diff --git a/test/unit/test_hash/_hash_delete4.test b/test/unit/test_hash/_hash_delete4.test new file mode 100755 index 0000000..837f39b --- /dev/null +++ b/test/unit/test_hash/_hash_delete4.test @@ -0,0 +1,7 @@ +#!/bin/bash +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh + +set -e +"${CMAKE_BINARY_DIR}/deletehash" -hmmdump > _hash_delete4.out 2>&1 +compare_table delete4 _hash_delete4.out $tests/unit/test_hash/_hash_delete4.res +rm -f _hash_delete4.out diff --git a/test/unit/test_hash/_hash_delete5.res b/test/unit/test_hash/_hash_delete5.res new file mode 100644 index 0000000..d203c2f --- /dev/null +++ b/test/unit/test_hash/_hash_delete5.res @@ -0,0 +1 @@ +Failed as expected diff --git a/test/unit/test_hash/_hash_delete5.test b/test/unit/test_hash/_hash_delete5.test new file mode 100755 index 0000000..2bb325e --- /dev/null +++ b/test/unit/test_hash/_hash_delete5.test @@ -0,0 +1,7 @@ +#!/bin/bash +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh + +set -e +"${CMAKE_BINARY_DIR}/deletehash" -foo > _hash_delete5.out 2>&1 +compare_table delete5 _hash_delete5.out $tests/unit/test_hash/_hash_delete5.res +rm -f _hash_delete5.out diff --git a/test/unit/test_hash/deletehash.c b/test/unit/test_hash/deletehash.c new file mode 100644 index 0000000..3948854 --- /dev/null +++ b/test/unit/test_hash/deletehash.c @@ -0,0 +1,119 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +#include +#include +#include + +#include "util/hash_table.h" +#include + +/* Explore a more complicated case for deletion */ +int +main(int argc, char **argv) +{ + hash_table_t *ht; + void *val; + char *bkey = "key"; + + if (argc != 2) { + printf("deletehash \n"); + exit(-1); + } + + /* Make sure failure gets printed! */ + err_set_loglevel(ERR_INFO); + ht = hash_table_new(75, 0); + + if (hash_table_enter(ht, "-hmmdump", (void *)1) != (void *)1) { + E_FATAL("Insertion of -hmmdump failed\n"); + } + + if (hash_table_enter(ht, "-svq4svq", (void *)2) != (void *)2) { + E_FATAL("Insertion of -svq4svq failed\n"); + } + + if (hash_table_enter(ht, "-outlatdir", (void *)3) != (void *)3) { + E_FATAL("Insertion of -svq4svq failed\n"); + } + + if (hash_table_enter(ht, "-lm", (void *)4) != (void *)4) { + E_FATAL("Insertion of -lm failed\n"); + } + + if (hash_table_enter(ht, "-beam", (void *)5) != (void *)5) { + E_FATAL("Insertion of -beam failed\n"); + } + + if (hash_table_enter(ht, "-lminmemory", (void *)6) != (void *)6) { + E_FATAL("Insertion of -lminmemory failed\n"); + } + + if (hash_table_enter(ht, "-subvq", (void *)7) != (void *)7) { + E_FATAL("Insertion of -outlatdir failed\n"); + } + + if (hash_table_enter(ht, "-bla", (void *)8) != (void *)8) { + E_FATAL("Insertion of -bla failed\n"); + } + + /* hash_table_display(ht,1); */ + if (hash_table_delete(ht, argv[1]) == NULL) { + E_INFOCONT("Failed as expected\n"); + return 0; + } + else { + hash_table_display(ht, 1); + } + + /* Test emptying */ + hash_table_empty(ht); + if (hash_table_lookup(ht, "-beam", &val) == 0) { + E_FATAL("Emptying hash table failed\n"); + } + + hash_table_free(ht); + ht = NULL; + + /* Test bkey */ + ht = hash_table_new(75, HASH_CASE_YES); + + if (hash_table_enter_bkey(ht, bkey, 3, (void *)1) != (void *)1) { + E_FATAL("Insertion of bkey failed\n"); + } + if (hash_table_lookup_bkey(ht, bkey, 3, &val) != 0) { + E_FATAL("Lookup failed\n"); + } + if (hash_table_delete_bkey(ht, bkey, 3) == NULL) { + E_FATAL("Delete bkey failed\n"); + } + if (hash_table_lookup_bkey(ht, bkey, 3, &val) != -1) { + E_FATAL("Second bkey lookup failed\n"); + } + hash_table_empty(ht); + hash_table_free(ht); + ht = NULL; + + return 0; +} + + +#if 0 +E_INFO("Hash table in the command line\n"); +hash_table_display(ht, 1); + +E_INFO("After deletion of -lm\n"); +hash_table_delete(ht, "-lm"); +hash_table_display(ht, 1); + +E_INFO("After deletion of -lm\n"); + +hash_table_delete(ht, "-lm"); +hash_table_display(ht, 1); + +E_INFO("After deletion of -svq4svq\n"); +hash_table_delete(ht, "-svq4svq"); +hash_table_display(ht, 1); + +E_INFO("After deletion of -beam\n"); +hash_table_delete(ht, "-beam"); +hash_table_display(ht, 1); +#endif diff --git a/test/unit/test_hash/display.res b/test/unit/test_hash/display.res new file mode 100644 index 0000000..addb1d5 --- /dev/null +++ b/test/unit/test_hash/display.res @@ -0,0 +1,6 @@ +Hash with chaining representation of the hash table +|key:-hmmdump|len:8|val=1|->NULL +|key:-svq4svq|len:8|val=1|->|key:-lminmemory|len:11|val=1|->NULL +|key:-lm|len:3|val=1|->NULL +|key:-beam|len:5|val=1|->NULL +The total number of keys =5 diff --git a/test/unit/test_hash/displayhash.c b/test/unit/test_hash/displayhash.c new file mode 100644 index 0000000..f921c2e --- /dev/null +++ b/test/unit/test_hash/displayhash.c @@ -0,0 +1,66 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +#include +#include +#include + +#include "util/hash_table.h" +#include + +/* Insert -hmmdump, -lm, -svq4svq, -beam, -lminmemory into a hash and display it. */ +int +main(int argc, char **argv) +{ + hash_table_t *ht; + ht = hash_table_new(75, 0); + + (void)argc; + (void)argv; + if (hash_table_enter(ht, "-hmmdump", (void *)1) != (void *)1) { + E_FATAL("Insertion of -hmmdump failed\n"); + } + + if (hash_table_enter(ht, "-svq4svq", (void *)1) != (void *)1) { + E_FATAL("Insertion of -svq4svq failed\n"); + } + + if (hash_table_enter(ht, "-lm", (void *)1) != (void *)1) { + E_FATAL("Insertion of -lm failed\n"); + } + + if (hash_table_enter(ht, "-beam", (void *)1) != (void *)1) { + E_FATAL("Insertion of -beam failed\n"); + } + + if (hash_table_enter(ht, "-lminmemory", (void *)1) != (void *)1) { + E_FATAL("Insertion of -lminmemory failed\n"); + } + + hash_table_display(ht, 1); + + hash_table_free(ht); + ht = NULL; + return 0; +} + + +#if 0 +E_INFO("Hash table in the command line\n"); +hash_table_display(ht, 1); + +E_INFO("After deletion of -lm\n"); +hash_table_delete(ht, "-lm"); +hash_table_display(ht, 1); + +E_INFO("After deletion of -lm\n"); + +hash_table_delete(ht, "-lm"); +hash_table_display(ht, 1); + +E_INFO("After deletion of -svq4svq\n"); +hash_table_delete(ht, "-svq4svq"); +hash_table_display(ht, 1); + +E_INFO("After deletion of -beam\n"); +hash_table_delete(ht, "-beam"); +hash_table_display(ht, 1); +#endif diff --git a/test/unit/test_hash/test_hash_iter.c b/test/unit/test_hash/test_hash_iter.c new file mode 100644 index 0000000..7fb9cc3 --- /dev/null +++ b/test/unit/test_hash/test_hash_iter.c @@ -0,0 +1,55 @@ +/** + * @file test_hash_iter.c Test hash table iterators + * @author David Huggins-Daines + */ + +#include "util/hash_table.h" +#include "util/ckd_alloc.h" + +#include "test_macros.h" + +#include +#include +#include + +int +main(int argc, char *argv[]) +{ + hash_table_t *h; + hash_iter_t *itor; + char *foo2 = ckd_salloc("foo"); + char *foo3 = ckd_salloc("foo"); + + (void)argc; + (void)argv; + /* Test insertion and replacement. */ + TEST_ASSERT(h = hash_table_new(42, FALSE)); + TEST_EQUAL((void*)0xdeadbeef, hash_table_enter(h, "foo", (void*)0xdeadbeef)); + TEST_EQUAL((void*)0xdeadbeef, hash_table_replace(h, foo2, (void*)0xd0d0feed)); + TEST_EQUAL((void*)0xd0d0feed, hash_table_replace(h, foo3, (void*)0xdeadbeaf)); + TEST_EQUAL((void*)0xcafec0de, hash_table_enter(h, "bar", (void*)0xcafec0de)); + TEST_EQUAL((void*)0xeeefeeef, hash_table_enter(h, "baz", (void*)0xeeefeeef)); + TEST_EQUAL((void*)0xbabababa, hash_table_enter(h, "quux", (void*)0xbabababa)); + + hash_table_display(h, TRUE); + /* Now test iterators. */ + for (itor = hash_table_iter(h); itor; itor = hash_table_iter_next(itor)) { + printf("%s %p\n", itor->ent->key, itor->ent->val); + if (0 == strcmp(itor->ent->key, "foo")) { + TEST_EQUAL(itor->ent->val, (void*)0xdeadbeaf); + } + else if (0 == strcmp(itor->ent->key, "bar")) { + TEST_EQUAL(itor->ent->val, (void*)0xcafec0de); + } + else if (0 == strcmp(itor->ent->key, "baz")) { + TEST_EQUAL(itor->ent->val, (void*)0xeeefeeef); + } + else if (0 == strcmp(itor->ent->key, "quux")) { + TEST_EQUAL(itor->ent->val, (void*)0xbabababa); + } + } + ckd_free(foo2); + ckd_free(foo3); + + return 0; +} diff --git a/test/unit/test_init.c b/test/unit/test_init.c index e9ad8d3..d5ba90e 100644 --- a/test/unit/test_init.c +++ b/test/unit/test_init.c @@ -1,6 +1,7 @@ #include #include #include +#include "util/cmd_ln.h" #include "test_macros.h" @@ -8,21 +9,23 @@ int main(int argc, char *argv[]) { ps_decoder_t *ps; - cmd_ln_t *config; + ps_config_t *config; + (void)argc; + (void)argv; + err_set_loglevel(ERR_INFO); TEST_ASSERT(config = - cmd_ln_init(NULL, ps_args(), TRUE, - "-hmm", MODELDIR "/en-us/en-us", - "-lm", MODELDIR "/en-us/en-us.lm.bin", - "-dict", MODELDIR "/en-us/cmudict-en-us.dict", - "-fwdtree", "yes", - "-fwdflat", "yes", - "-bestpath", "yes", - "-samprate", "16000", NULL)); + ps_config_parse_json(NULL, + "hmm: " MODELDIR "/en-us/en-us " + "lm: " MODELDIR "/en-us/en-us.lm.bin " + "dict:" MODELDIR "/en-us/cmudict-en-us.dict " + "fwdtree: true, fwdflat: true, bestpath: true " + "samprate: 16000")); + cmd_ln_log_values_r(config, ps_args()); TEST_ASSERT(ps = ps_init(config)); ps_free(ps); - cmd_ln_free_r(config); + ps_config_free(config); return 0; } diff --git a/test/unit/test_jsgf.c b/test/unit/test_jsgf.c index fd21251..5dcb229 100644 --- a/test/unit/test_jsgf.c +++ b/test/unit/test_jsgf.c @@ -3,8 +3,8 @@ #include #include -#include -#include +#include "lm/jsgf.h" +#include "lm/fsg_model.h" #include "pocketsphinx_internal.h" #include "fsg_search_internal.h" @@ -22,11 +22,14 @@ main(int argc, char *argv[]) char const *hyp; int32 score, prob; + (void)argc; + (void)argv; TEST_ASSERT(config = - cmd_ln_init(NULL, ps_args(), TRUE, - "-hmm", MODELDIR "/en-us/en-us", - "-dict", DATADIR "/turtle.dic", - "-samprate", "16000", NULL)); + ps_config_parse_json( + NULL, + "hmm: \"" MODELDIR "/en-us/en-us\"," + "dict: \"" DATADIR "/turtle.dic\"," + "samprate: 16000")); TEST_ASSERT(ps = ps_init(config)); jsgf = jsgf_parse_file(DATADIR "/goforward.gram", NULL); @@ -36,8 +39,8 @@ main(int argc, char *argv[]) fsg = jsgf_build_fsg(jsgf, rule, ps->lmath, 7.5); TEST_ASSERT(fsg); fsg_model_write(fsg, stdout); - ps_set_fsg(ps, "goforward.move2", fsg); - ps_set_search(ps, "goforward.move2"); + ps_add_fsg(ps, "goforward.move2", fsg); + ps_activate_search(ps, "goforward.move2"); TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); ps_decode_raw(ps, rawfh, -1); hyp = ps_get_hyp(ps, &score); @@ -46,15 +49,16 @@ main(int argc, char *argv[]) TEST_EQUAL(0, strcmp("go forward ten meters", hyp)); ps_free(ps); fclose(rawfh); - cmd_ln_free_r(config); + ps_config_free(config); TEST_ASSERT(config = - cmd_ln_init(NULL, ps_args(), TRUE, - "-hmm", MODELDIR "/en-us/en-us", - "-dict", DATADIR "/turtle.dic", - "-jsgf", DATADIR "/goforward.gram", - "-samprate", "16000", NULL)); + ps_config_parse_json( + NULL, + "hmm: \"" MODELDIR "/en-us/en-us\"," + "dict: \"" DATADIR "/turtle.dic\"," + "jsgf: \"" DATADIR "/goforward.gram\"," + "samprate: 16000")); TEST_ASSERT(ps = ps_init(config)); TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); ps_decode_raw(ps, rawfh, -1); @@ -64,15 +68,15 @@ main(int argc, char *argv[]) TEST_EQUAL(0, strcmp("go forward ten meters", hyp)); ps_free(ps); fclose(rawfh); - cmd_ln_free_r(config); + ps_config_free(config); TEST_ASSERT(config = - cmd_ln_init(NULL, ps_args(), TRUE, - "-hmm", MODELDIR "/en-us/en-us", - "-dict", DATADIR "/turtle.dic", - "-jsgf", DATADIR "/goforward.gram", - "-toprule", "goforward.move2", - "-samprate", "16000", NULL)); + ps_config_parse_json( + NULL, + "hmm: \"" MODELDIR "/en-us/en-us\"," + "dict: \"" DATADIR "/turtle.dic\"," + "jsgf: \"" DATADIR "/goforward.gram\"," + "toprule: goforward.move2, samprate: 16000")); TEST_ASSERT(ps = ps_init(config)); TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); ps_decode_raw(ps, rawfh, -1); @@ -81,17 +85,17 @@ main(int argc, char *argv[]) printf("%s (%d, %d)\n", hyp, score, prob); TEST_EQUAL(0, strcmp("go forward ten meters", hyp)); ps_free(ps); - cmd_ln_free_r(config); + ps_config_free(config); fclose(rawfh); TEST_ASSERT(config = - cmd_ln_init(NULL, ps_args(), TRUE, - "-hmm", MODELDIR "/en-us/en-us", - "-dict", DATADIR "/turtle.dic", - "-jsgf", DATADIR "/defective.gram", - NULL)); + ps_config_parse_json( + NULL, + "hmm: \"" MODELDIR "/en-us/en-us\"," + "dict: \"" DATADIR "/turtle.dic\"," + "jsgf: \"" DATADIR "/defective.gram\",")); TEST_ASSERT(NULL == ps_init(config)); - cmd_ln_free_r(config); + ps_config_free(config); return 0; } diff --git a/test/unit/test_keyphrase.c b/test/unit/test_keyphrase.c index 7c6325e..721dfc3 100644 --- a/test/unit/test_keyphrase.c +++ b/test/unit/test_keyphrase.c @@ -11,10 +11,13 @@ main(int argc, char *argv[]) { cmd_ln_t *config; + (void)argc; + (void)argv; TEST_ASSERT(config = - cmd_ln_init(NULL, ps_args(), TRUE, - "-hmm", MODELDIR "/en-us/en-us", - "-kws", DATADIR "/goforward.kws", - "-dict", MODELDIR "/en-us/cmudict-en-us.dict", NULL)); - return ps_decoder_test(config, "KEYPHRASE", "forward"); + ps_config_parse_json( + NULL, + "hmm: \"" MODELDIR "/en-us/en-us\"," + "kws: \"" DATADIR "/goforward.kws\"," + "dict: \"" MODELDIR "/en-us/cmudict-en-us.dict\"")); + return ps_decoder_test(config, "KEYPHRASE", "forward meters"); } diff --git a/test/unit/test_lattice.c b/test/unit/test_lattice.c index 610cc2b..8272400 100644 --- a/test/unit/test_lattice.c +++ b/test/unit/test_lattice.c @@ -102,15 +102,18 @@ main(int argc, char *argv[]) char const *hyp; int32 score; - TEST_ASSERT(config = - cmd_ln_init(NULL, ps_args(), TRUE, - "-hmm", MODELDIR "/en-us/en-us", - "-lm", MODELDIR "/en-us/en-us.lm.bin", - "-dict", MODELDIR "/en-us/cmudict-en-us.dict", - "-fwdtree", "yes", - "-fwdflat", "no", - "-bestpath", "no", - "-samprate", "16000", NULL)); + (void)argc; + (void)argv; + TEST_ASSERT(config = + ps_config_parse_json( + NULL, + "hmm: \"" MODELDIR "/en-us/en-us\"," + "lm: \"" MODELDIR "/en-us/en-us.lm.bin\"," + "dict: \"" MODELDIR "/en-us/cmudict-en-us.dict\"," + "fwdtree: true," + "fwdflat: false," + "bestpath: false," + "samprate: 16000")); TEST_ASSERT(ps = ps_init(config)); TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); ps_decode_raw(ps, rawfh, -1); @@ -135,7 +138,7 @@ main(int argc, char *argv[]) test_nodes_and_stuff(dag); ps_lattice_free(dag); ps_free(ps); - cmd_ln_free_r(config); + ps_config_free(config); /* Now test standalone lattices. */ dag = ps_lattice_read(NULL, "goforward.lat"); diff --git a/test/unit/test_lineiter/CMakeLists.txt b/test/unit/test_lineiter/CMakeLists.txt new file mode 100644 index 0000000..bcc2f9d --- /dev/null +++ b/test/unit/test_lineiter/CMakeLists.txt @@ -0,0 +1,17 @@ +set(TEST_EXECUTABLES + test_lineiter + ) +foreach(TEST_EXECUTABLE ${TEST_EXECUTABLES}) + add_executable(${TEST_EXECUTABLE} EXCLUDE_FROM_ALL ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR}/test/unit + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) + add_test(NAME ${TEST_EXECUTABLE} COMMAND ${TEST_EXECUTABLE}) + set_property(TARGET ${TEST_EXECUTABLE} + PROPERTY COMPILE_DEFINITIONS FILEDIR="${CMAKE_CURRENT_SOURCE_DIR}") + add_dependencies(check ${TEST_EXECUTABLE}) +endforeach() diff --git a/test/unit/test_lineiter/test.txt b/test/unit/test_lineiter/test.txt new file mode 100644 index 0000000..5bc8a5d --- /dev/null +++ b/test/unit/test_lineiter/test.txt @@ -0,0 +1,7 @@ +# This is a comment +# This is too +This is a line +This is too +# This is a comment again + Foo +Bar diff --git a/test/unit/test_lineiter/test_lineiter.c b/test/unit/test_lineiter/test_lineiter.c new file mode 100644 index 0000000..0cc1dda --- /dev/null +++ b/test/unit/test_lineiter/test_lineiter.c @@ -0,0 +1,39 @@ +#include "util/pio.h" +#include + +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + FILE *fp; + fp = fopen(FILEDIR "/test.txt", "rb"); + lineiter_t *li; + int i; + + (void)argc; + (void)argv; + for (i = 0, li = lineiter_start(fp); i < 3 && li; li = lineiter_next(li), i++) { + printf ("Line is %s\n", li->buf); + } + + printf("Buf is %s\n", li->buf); + TEST_EQUAL_STRING(li->buf, "This is too\n"); + TEST_EQUAL(lineiter_lineno(li), 4); + + lineiter_free(li); + + fseek(fp, 0L, SEEK_SET); + + for (i = 0, li = lineiter_start_clean(fp); i < 3 && li; li = lineiter_next(li), i++) { + printf ("Clean line is %s\n", li->buf); + } + + TEST_EQUAL_STRING(li->buf, "Bar"); + TEST_EQUAL(lineiter_lineno(li), 7); + + lineiter_free(li); + fclose(fp); + + return 0; +} diff --git a/test/unit/test_log_int16.c b/test/unit/test_log_int16.c new file mode 100644 index 0000000..6f397a1 --- /dev/null +++ b/test/unit/test_log_int16.c @@ -0,0 +1,80 @@ +#include + +#include "test_macros.h" + +#undef LOG_EPSILON +#define LOG_EPSILON 1500 + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + int32 rv; + + (void)argc; + (void)argv; + lmath = logmath_init(1.0001, 0, 1); + TEST_ASSERT(lmath); + printf("log(1e-150) = %d\n", logmath_log(lmath, 1e-150)); + TEST_EQUAL_LOG(logmath_log(lmath, 1e-150), -3454050); + printf("exp(log(1e-150)) = %e\n",logmath_exp(lmath, logmath_log(lmath, 1e-150))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 1e-150)), 1e-150); + printf("log(1e-48) = %d\n", logmath_log(lmath, 1e-48)); + printf("exp(log(1e-48)) = %e\n",logmath_exp(lmath, logmath_log(lmath, 1e-48))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 1e-48)), 1e-48); + printf("log(42) = %d\n", logmath_log(lmath, 42)); + TEST_EQUAL_LOG(logmath_log(lmath, 42), 37378); + printf("exp(log(42)) = %f\n",logmath_exp(lmath, logmath_log(lmath, 42))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 42)), 42); + printf("log(1e-3 + 5e-3) = %d l+ %d = %d\n", + logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3), + logmath_add(lmath, logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3))); + printf("log(1e-3 + 5e-3) = %e + %e = %e\n", + logmath_exp(lmath, logmath_log(lmath, 1e-3)), + logmath_exp(lmath, logmath_log(lmath, 5e-3)), + logmath_exp(lmath, logmath_add(lmath, logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3)))); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 5e-48)), + logmath_log(lmath, 6e-48)); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 42)), + logmath_log(lmath, 42)); + + rv = logmath_write(lmath, "tmp.logadd"); + TEST_EQUAL(rv, 0); + logmath_free(lmath); + lmath = logmath_read("tmp.logadd"); + TEST_ASSERT(lmath); + printf("log(1e-150) = %d\n", logmath_log(lmath, 1e-150)); + TEST_EQUAL_LOG(logmath_log(lmath, 1e-150), -3454050); + printf("exp(log(1e-150)) = %e\n",logmath_exp(lmath, logmath_log(lmath, 1e-150))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 1e-150)), 1e-150); + printf("log(1e-48) = %d\n", logmath_log(lmath, 1e-48)); + printf("exp(log(1e-48)) = %e\n",logmath_exp(lmath, logmath_log(lmath, 1e-48))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 1e-48)), 1e-48); + printf("log(42) = %d\n", logmath_log(lmath, 42)); + TEST_EQUAL_LOG(logmath_log(lmath, 42), 37378); + printf("exp(log(42)) = %f\n",logmath_exp(lmath, logmath_log(lmath, 42))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 42)), 41.99); + printf("log(1e-3 + 5e-3) = %d l+ %d = %d\n", + logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3), + logmath_add(lmath, logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3))); + printf("log(1e-3 + 5e-3) = %e + %e = %e\n", + logmath_exp(lmath, logmath_log(lmath, 1e-3)), + logmath_exp(lmath, logmath_log(lmath, 5e-3)), + logmath_exp(lmath, logmath_add(lmath, logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3)))); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 5e-48)), + logmath_log(lmath, 6e-48)); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 42)), + logmath_log(lmath, 42)); + + return 0; +} diff --git a/test/unit/test_log_int8.c b/test/unit/test_log_int8.c new file mode 100644 index 0000000..ac094a4 --- /dev/null +++ b/test/unit/test_log_int8.c @@ -0,0 +1,47 @@ +#include + +#include "test_macros.h" + +#undef LOG_EPSILON +#define LOG_EPSILON 1500 + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + int32 rv; + + (void)argc; + (void)argv; + lmath = logmath_init(1.003, 0, 1); + TEST_ASSERT(lmath); + printf("log(1e-48) = %d\n", logmath_log(lmath, 1e-48)); + TEST_EQUAL_LOG(logmath_log(lmath, 1e-48), -36896); + printf("exp(log(1e-48)) = %e\n",logmath_exp(lmath, -36896)); + TEST_EQUAL_FLOAT(logmath_exp(lmath, -36896), 1e-48); + printf("log(42) = %d\n", logmath_log(lmath, 42)); + TEST_EQUAL_LOG(logmath_log(lmath, 42), 1247); + printf("exp(log(42)) = %f\n",logmath_exp(lmath, 1247)); + TEST_EQUAL_FLOAT(logmath_exp(lmath, 1247), 41.9); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 5e-48)), + logmath_log(lmath, 6e-48)); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 42)), 1247); + + rv = logmath_write(lmath, "tmp.logadd"); + TEST_EQUAL(rv, 0); + logmath_free(lmath); + lmath = logmath_read("tmp.logadd"); + TEST_ASSERT(lmath); + TEST_EQUAL_LOG(logmath_log(lmath, 1e-48), -36896); + TEST_EQUAL_LOG(logmath_log(lmath, 42), 1247); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 5e-48)), + logmath_log(lmath, 6e-48)); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 42)), 1247); + logmath_free(lmath); + + return 0; +} diff --git a/test/unit/test_log_shifted.c b/test/unit/test_log_shifted.c new file mode 100644 index 0000000..a9dfe5f --- /dev/null +++ b/test/unit/test_log_shifted.c @@ -0,0 +1,80 @@ +#include + +#include "test_macros.h" + +#undef LOG_EPSILON +#define LOG_EPSILON 1500 + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + int32 rv; + + (void)argc; + (void)argv; + lmath = logmath_init(1.0001, 8, 1); + TEST_ASSERT(lmath); + printf("log(1e-150) = %d\n", logmath_log(lmath, 1e-150)); + TEST_EQUAL_LOG(logmath_log(lmath, 1e-150), -13493); + printf("exp(log(1e-150)) = %e\n",logmath_exp(lmath, logmath_log(lmath, 1e-150))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 1e-150)), 1e-150); + printf("log(1e-48) = %d\n", logmath_log(lmath, 1e-48)); + printf("exp(log(1e-48)) = %e\n",logmath_exp(lmath, logmath_log(lmath, 1e-48))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 1e-48)), 1e-48); + printf("log(42) = %d\n", logmath_log(lmath, 42)); + TEST_EQUAL_LOG(logmath_log(lmath, 42), 146); + printf("exp(log(42)) = %f\n",logmath_exp(lmath, logmath_log(lmath, 42))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 42)), 41.99); + printf("log(1e-3 + 5e-3) = %d l+ %d = %d\n", + logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3), + logmath_add(lmath, logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3))); + printf("log(1e-3 + 5e-3) = %e + %e = %e\n", + logmath_exp(lmath, logmath_log(lmath, 1e-3)), + logmath_exp(lmath, logmath_log(lmath, 5e-3)), + logmath_exp(lmath, logmath_add(lmath, logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3)))); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 5e-48)), + logmath_log(lmath, 6e-48)); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 42)), + logmath_log(lmath, 42)); + + rv = logmath_write(lmath, "tmp.logadd"); + TEST_EQUAL(rv, 0); + logmath_free(lmath); + lmath = logmath_read("tmp.logadd"); + TEST_ASSERT(lmath); + printf("log(1e-150) = %d\n", logmath_log(lmath, 1e-150)); + TEST_EQUAL_LOG(logmath_log(lmath, 1e-150), -13493); + printf("exp(log(1e-150)) = %e\n",logmath_exp(lmath, logmath_log(lmath, 1e-150))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 1e-150)), 1e-150); + printf("log(1e-48) = %d\n", logmath_log(lmath, 1e-48)); + printf("exp(log(1e-48)) = %e\n",logmath_exp(lmath, logmath_log(lmath, 1e-48))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 1e-48)), 1e-48); + printf("log(42) = %d\n", logmath_log(lmath, 42)); + TEST_EQUAL_LOG(logmath_log(lmath, 42), 146); + printf("exp(log(42)) = %f\n",logmath_exp(lmath, logmath_log(lmath, 42))); + TEST_EQUAL_FLOAT(logmath_exp(lmath, logmath_log(lmath, 42)), 41.99); + printf("log(1e-3 + 5e-3) = %d l+ %d = %d\n", + logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3), + logmath_add(lmath, logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3))); + printf("log(1e-3 + 5e-3) = %e + %e = %e\n", + logmath_exp(lmath, logmath_log(lmath, 1e-3)), + logmath_exp(lmath, logmath_log(lmath, 5e-3)), + logmath_exp(lmath, logmath_add(lmath, logmath_log(lmath, 1e-3), + logmath_log(lmath, 5e-3)))); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 5e-48)), + logmath_log(lmath, 6e-48)); + TEST_EQUAL_LOG(logmath_add(lmath, logmath_log(lmath, 1e-48), + logmath_log(lmath, 42)), + logmath_log(lmath, 42)); + + return 0; +} diff --git a/test/unit/test_macros.h b/test/unit/test_macros.h deleted file mode 100644 index 9a7d1f8..0000000 --- a/test/unit/test_macros.h +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include - -#include - -#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } -#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) -#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) -#define LOG_EPSILON 200 -#define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) diff --git a/test/unit/test_macros.h.in b/test/unit/test_macros.h.in new file mode 100644 index 0000000..541bf4e --- /dev/null +++ b/test/unit/test_macros.h.in @@ -0,0 +1,22 @@ +#include +#include +#include +#include + +#include + +#define EPSILON 0.01 +#define TEST_ASSERT(x) if (!(x)) { fprintf(stderr, "FAIL: %s\n", #x); exit(1); } +#define TEST_EQUAL(a,b) TEST_ASSERT((a) == (b)) +#define TEST_EQUAL_FLOAT(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) +#ifdef FIXED_POINT +#define TEST_EQUAL_MFCC(a,b) TEST_EQUAL(a,b) +#else +#define TEST_EQUAL_MFCC(a,b) TEST_ASSERT(fabs((a) - (b)) < EPSILON) +#endif +#define TEST_EQUAL_STRING(a,b) TEST_ASSERT(0 == strcmp((a), (b))) +#define LOG_EPSILON 200 +#define TEST_EQUAL_LOG(a,b) TEST_ASSERT(abs((a) - (b)) < LOG_EPSILON) +#define MODELDIR "@CMAKE_SOURCE_DIR@/model" +#define DATADIR "@CMAKE_SOURCE_DIR@/test/data" +#define TESTDATADIR "@CMAKE_SOURCE_DIR@/test/regression" diff --git a/test/unit/test_matrix/CMakeLists.txt b/test/unit/test_matrix/CMakeLists.txt new file mode 100644 index 0000000..8790daf --- /dev/null +++ b/test/unit/test_matrix/CMakeLists.txt @@ -0,0 +1,30 @@ +set(TEST_EXECUTABLES + test_solve + test_invert + test_determinant + ) +foreach(TEST_EXECUTABLE ${TEST_EXECUTABLES}) + add_executable(${TEST_EXECUTABLE} EXCLUDE_FROM_ALL ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR}/test/unit + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) + add_dependencies(check ${TEST_EXECUTABLE}) +endforeach() +set(TESTS + _test_determinant.test + _test_invert.test + _test_solve.test +) +foreach(TEST ${TESTS}) + if(${TEST} MATCHES "\.(test|sh)$") + add_test(NAME ${TEST} COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/${TEST} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + else() + add_test(NAME ${TEST} COMMAND ${TEST}) + endif() + set_property(TEST ${TEST} PROPERTY ENVIRONMENT CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}) +endforeach() diff --git a/test/unit/test_matrix/_test_determinant.res b/test/unit/test_matrix/_test_determinant.res new file mode 100644 index 0000000..24a5f55 --- /dev/null +++ b/test/unit/test_matrix/_test_determinant.res @@ -0,0 +1,2 @@ +5.22 +-1.00 diff --git a/test/unit/test_matrix/_test_determinant.test b/test/unit/test_matrix/_test_determinant.test new file mode 100755 index 0000000..08f3ddb --- /dev/null +++ b/test/unit/test_matrix/_test_determinant.test @@ -0,0 +1,7 @@ +#!/bin/bash +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh + +set -e +./test_determinant | sed -e 's,-0\.0,0.0,g' > _test_determinant.out +compare_table determinant _test_determinant.out $tests/unit/test_matrix/_test_determinant.res +rm -f _test_determinant.out diff --git a/test/unit/test_matrix/_test_invert.res b/test/unit/test_matrix/_test_invert.res new file mode 100644 index 0000000..edcd0e6 --- /dev/null +++ b/test/unit/test_matrix/_test_invert.res @@ -0,0 +1,19 @@ +0 +0.75 -0.25 -0.25 +-0.25 0.75 -0.25 +-0.25 -0.25 0.75 +1.00 0.00 0.00 +0.00 1.00 0.00 +0.00 0.00 1.00 +0 +0.67 0.00 -0.33 +0.00 0.67 -0.33 +-0.33 -0.33 0.83 +1.00 0.00 0.00 +0.00 1.00 0.00 +0.00 0.00 1.00 +0 +0 +0.75 -0.25 -0.25 +-0.25 0.75 -0.25 +-0.25 -0.25 0.75 diff --git a/test/unit/test_matrix/_test_invert.test b/test/unit/test_matrix/_test_invert.test new file mode 100755 index 0000000..71e5aa9 --- /dev/null +++ b/test/unit/test_matrix/_test_invert.test @@ -0,0 +1,7 @@ +#!/bin/bash +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh + +set -e +./test_invert | sed -e 's,-0\.0,0.0,g' > _test_invert.out +compare_table invert _test_invert.out $tests/unit/test_matrix/_test_invert.res +rm -f _test_invert.out diff --git a/test/unit/test_matrix/_test_solve.res b/test/unit/test_matrix/_test_solve.res new file mode 100644 index 0000000..f5f338a --- /dev/null +++ b/test/unit/test_matrix/_test_solve.res @@ -0,0 +1 @@ +-0.25 1.75 -0.25 diff --git a/test/unit/test_matrix/_test_solve.test b/test/unit/test_matrix/_test_solve.test new file mode 100755 index 0000000..f3e9b42 --- /dev/null +++ b/test/unit/test_matrix/_test_solve.test @@ -0,0 +1,7 @@ +#!/bin/bash +. ${CMAKE_BINARY_DIR}/test/testfuncs.sh + +set -e +./test_solve > _test_solve.out +compare_table solve _test_solve.out $tests/unit/test_matrix/_test_solve.res +rm -f _test_solve.out diff --git a/test/unit/test_matrix/test_determinant.c b/test/unit/test_matrix/test_determinant.c new file mode 100644 index 0000000..434834d --- /dev/null +++ b/test/unit/test_matrix/test_determinant.c @@ -0,0 +1,38 @@ +#include +#include + +#include "util/matrix.h" +#include "util/ckd_alloc.h" + +const float32 foo[3][3] = { + {2, 0.42, 1}, + {0.42, 2, -0.3}, + {1, -0.3, 2} +}; +const float32 bar[3][3] = { + {1, 0, 1}, + {0, 1, 0}, + {0, 0, 1} +}; + +int +main(int argc, char *argv[]) +{ + float32 **a; + + (void)argc; + (void)argv; + a = (float32 **)ckd_calloc_2d(3, 3, sizeof(float32)); + + memcpy(a[0], foo, sizeof(float32) * 3 * 3); + /* Should see 5.22 */ + printf("%.2f\n", determinant(a, 3)); + + /* Should see -1.0 */ + memcpy(a[0], bar, sizeof(float32) * 3 * 3); + printf("%.2f\n", determinant(a, 3)); + + ckd_free_2d((void **)a); + + return 0; +} diff --git a/test/unit/test_matrix/test_invert.c b/test/unit/test_matrix/test_invert.c new file mode 100644 index 0000000..0fb3e77 --- /dev/null +++ b/test/unit/test_matrix/test_invert.c @@ -0,0 +1,106 @@ +#include +#include + +#include "util/matrix.h" +#include "util/ckd_alloc.h" + +const float32 foo[3][3] = { + {2, 1, 1}, + {1, 2, 1}, + {1, 1, 2} +}; +const float32 bar[3][3] = { + {2, 0.5, 1}, + {0.5, 2, 1}, + {1, 1, 2} +}; + +int +main(int argc, char *argv[]) +{ + float32 **a, **ainv, **ii; + int i, j; + + (void)argc; + (void)argv; + a = (float32 **)ckd_calloc_2d(3, 3, sizeof(float32)); + ainv = (float32 **)ckd_calloc_2d(3, 3, sizeof(float32)); + ii = (float32 **)ckd_calloc_2d(3, 3, sizeof(float32)); + + memcpy(a[0], foo, sizeof(float32) * 3 * 3); + printf("%d\n", invert(ainv, a, 3)); + /* Should see: + 0.75 -0.25 -0.25 + -0.25 0.75 -0.25 + -0.25 -0.25 0.75 + */ + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + printf("%.2f ", ainv[i][j]); + } + printf("\n"); + } + /* Should see: + 1.00 0.00 0.00 + 0.00 1.00 0.00 + 0.00 0.00 1.00 + */ + matrixmultiply(ii, ainv, a, 3); + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + printf("%.2f ", ii[i][j]); + } + printf("\n"); + } + + memcpy(a[0], bar, sizeof(float32) * 3 * 3); + printf("%d\n", invert(ainv, a, 3)); + /* Should see: + */ + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + printf("%.2f ", ainv[i][j]); + } + printf("\n"); + } + /* Should see: + 1.00 0.00 0.00 + 0.00 1.00 0.00 + 0.00 0.00 1.00 + */ + memset(ii[0], 0, sizeof(float32) * 3 * 3); + matrixmultiply(ii, ainv, a, 3); + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + printf("%.2f ", ii[i][j]); + } + printf("\n"); + } + + /* Should see: + -1 + */ + a[0][0] = 1.0; + printf("%d\n", invert(ainv, a, 3)); + + + memcpy(a[0], foo, sizeof(float32) * 3 * 3); + printf("%d\n", invert(a, a, 3)); + /* Should see: + 0.75 -0.25 -0.25 + -0.25 0.75 -0.25 + -0.25 -0.25 0.75 + */ + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + printf("%.2f ", a[i][j]); + } + printf("\n"); + } + + ckd_free_2d((void **)a); + ckd_free_2d((void **)ainv); + ckd_free_2d((void **)ii); + + return 0; +} diff --git a/test/unit/test_matrix/test_solve.c b/test/unit/test_matrix/test_solve.c new file mode 100644 index 0000000..4c110c2 --- /dev/null +++ b/test/unit/test_matrix/test_solve.c @@ -0,0 +1,38 @@ +#include +#include + +#include "util/matrix.h" +#include "util/ckd_alloc.h" + +const float32 foo[3][3] = { + {2, 1, 1}, + {1, 2, 1}, + {1, 1, 2} +}; +float32 bar[3] = {1, 3, 1}; + +int +main(int argc, char *argv[]) +{ + float32 **a, *x; + int i; + + (void)argc; + (void)argv; + a = (float32 **)ckd_calloc_2d(3, 3, sizeof(float32)); + memcpy(a[0], foo, sizeof(float32) * 3 * 3); + x = ckd_calloc(3, sizeof(float32)); + + /* Should see: + -0.25 1.75 -0.25 + */ + solve(a, bar, x, 3); + for (i = 0; i < 3; ++i) + printf("%.2f ", x[i]); + printf("\n"); + + ckd_free_2d((void **)a); + ckd_free(x); + + return 0; +} diff --git a/test/unit/test_mllr.c b/test/unit/test_mllr.c index 4f0e008..8b779eb 100644 --- a/test/unit/test_mllr.c +++ b/test/unit/test_mllr.c @@ -15,13 +15,16 @@ main(int argc, char *argv[]) char const *hyp; int32 score; + (void)argc; + (void)argv; TEST_ASSERT(config = - cmd_ln_init(NULL, ps_args(), TRUE, - "-hmm", DATADIR "/an4_ci_cont", - "-lm", DATADIR "/turtle.lm.bin", - "-dict", DATADIR "/turtle.dic", - "-mllr", DATADIR "/mllr_matrices", - "-samprate", "16000", NULL)); + ps_config_parse_json( + NULL, + "hmm: \"" DATADIR "/an4_ci_cont\"," + "lm: \"" DATADIR "/turtle.lm.bin\"," + "dict: \"" DATADIR "/turtle.dic\"," + "mllr: \"" DATADIR "/mllr_matrices\"," + "samprate: 16000")); TEST_ASSERT(ps = ps_init(config)); TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); @@ -30,6 +33,6 @@ main(int argc, char *argv[]) hyp = ps_get_hyp(ps, &score); printf("FWDFLAT: %s (%d)\n", hyp, score); ps_free(ps); - cmd_ln_free_r(config); + ps_config_free(config); return 0; } diff --git a/test/unit/test_nbest.c b/test/unit/test_nbest.c index 1767d4f..2fe36f8 100644 --- a/test/unit/test_nbest.c +++ b/test/unit/test_nbest.c @@ -16,15 +16,18 @@ main(int argc, char *argv[]) char const *hyp; int32 score, n; - TEST_ASSERT(config = - cmd_ln_init(NULL, ps_args(), TRUE, - "-hmm", MODELDIR "/en-us/en-us", - "-lm", MODELDIR "/en-us/en-us.lm.bin", - "-dict", MODELDIR "/en-us/cmudict-en-us.dict", - "-fwdtree", "yes", - "-fwdflat", "yes", - "-bestpath", "yes", - "-samprate", "16000", NULL)); + (void)argc; + (void)argv; + TEST_ASSERT(config = + ps_config_parse_json( + NULL, + "hmm: \"" MODELDIR "/en-us/en-us\"," + "lm: \"" MODELDIR "/en-us/en-us.lm.bin\"," + "dict: \"" MODELDIR "/en-us/cmudict-en-us.dict\"," + "fwdtree: true," + "fwdflat: true," + "bestpath: true," + "samprate: 16000")); TEST_ASSERT(ps = ps_init(config)); TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); ps_decode_raw(ps, rawfh, -1); @@ -49,6 +52,6 @@ main(int argc, char *argv[]) if (nbest) ps_nbest_free(nbest); ps_free(ps); - cmd_ln_free_r(config); + ps_config_free(config); return 0; } diff --git a/test/unit/test_ngram/100.lm.bin b/test/unit/test_ngram/100.lm.bin new file mode 100644 index 0000000..93f58e1 Binary files /dev/null and b/test/unit/test_ngram/100.lm.bin differ diff --git a/test/unit/test_ngram/100.lm.bz2 b/test/unit/test_ngram/100.lm.bz2 new file mode 100644 index 0000000..4451d7e Binary files /dev/null and b/test/unit/test_ngram/100.lm.bz2 differ diff --git a/test/unit/test_ngram/100.lm.dmp b/test/unit/test_ngram/100.lm.dmp new file mode 100644 index 0000000..1eb9cc5 Binary files /dev/null and b/test/unit/test_ngram/100.lm.dmp differ diff --git a/test/unit/test_ngram/100.lm.gz b/test/unit/test_ngram/100.lm.gz new file mode 100644 index 0000000..d334c10 Binary files /dev/null and b/test/unit/test_ngram/100.lm.gz differ diff --git a/test/unit/test_ngram/100.lmctl b/test/unit/test_ngram/100.lmctl new file mode 100644 index 0000000..f81422a --- /dev/null +++ b/test/unit/test_ngram/100.lmctl @@ -0,0 +1,4 @@ +{ 100.probdef } +100.lm.dmp 100 { scylla zero } +102.lm.gz 102 +turtle.lm turtle diff --git a/test/unit/test_ngram/100.probdef b/test/unit/test_ngram/100.probdef new file mode 100644 index 0000000..be283da --- /dev/null +++ b/test/unit/test_ngram/100.probdef @@ -0,0 +1,11 @@ +LMCLASS scylla +scylla:scylla 0.4 +karybdis:scylla 0.4 +scooby:scylla 0.1 +redwood:scylla 0.1 +END scylla + +LMCLASS zero +zero:zero 0.3 +oh:zero 0.7 +END zero diff --git a/test/unit/test_ngram/102.lm.dmp b/test/unit/test_ngram/102.lm.dmp new file mode 100644 index 0000000..ce2dc4d Binary files /dev/null and b/test/unit/test_ngram/102.lm.dmp differ diff --git a/test/unit/test_ngram/102.lm.gz b/test/unit/test_ngram/102.lm.gz new file mode 100644 index 0000000..1da0ca5 Binary files /dev/null and b/test/unit/test_ngram/102.lm.gz differ diff --git a/test/unit/test_ngram/104.lm.gz b/test/unit/test_ngram/104.lm.gz new file mode 100644 index 0000000..6e2c429 Binary files /dev/null and b/test/unit/test_ngram/104.lm.gz differ diff --git a/test/unit/test_ngram/105.lm.gz b/test/unit/test_ngram/105.lm.gz new file mode 100644 index 0000000..06435f5 Binary files /dev/null and b/test/unit/test_ngram/105.lm.gz differ diff --git a/test/unit/test_ngram/106.lm.gz b/test/unit/test_ngram/106.lm.gz new file mode 100644 index 0000000..b95fbf6 Binary files /dev/null and b/test/unit/test_ngram/106.lm.gz differ diff --git a/test/unit/test_ngram/107.lm.gz b/test/unit/test_ngram/107.lm.gz new file mode 100644 index 0000000..9a67951 Binary files /dev/null and b/test/unit/test_ngram/107.lm.gz differ diff --git a/test/unit/test_ngram/CMakeLists.txt b/test/unit/test_ngram/CMakeLists.txt new file mode 100644 index 0000000..f8c6d29 --- /dev/null +++ b/test/unit/test_ngram/CMakeLists.txt @@ -0,0 +1,23 @@ +set(TEST_EXECUTABLES + test_lm_read + test_lm_score + test_lm_add + test_lm_casefold + test_lm_class + test_lm_set + test_lm_write + ) +foreach(TEST_EXECUTABLE ${TEST_EXECUTABLES}) + add_executable(${TEST_EXECUTABLE} EXCLUDE_FROM_ALL ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR}/test/unit + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) + add_test(NAME ${TEST_EXECUTABLE} COMMAND ${TEST_EXECUTABLE}) + set_property(TARGET ${TEST_EXECUTABLE} + PROPERTY COMPILE_DEFINITIONS LMDIR="${CMAKE_CURRENT_SOURCE_DIR}") + add_dependencies(check ${TEST_EXECUTABLE}) +endforeach() diff --git a/test/unit/test_ngram/test_lm_add.c b/test/unit/test_ngram/test_lm_add.c new file mode 100644 index 0000000..f0bf35b --- /dev/null +++ b/test/unit/test_ngram/test_lm_add.c @@ -0,0 +1,45 @@ +#include "lm/ngram_model.h" +#include +#include "util/strfuncs.h" + +#include "test_macros.h" + +#include +#include +#include + +void +run_tests(logmath_t *lmath, ngram_model_t *model) +{ + int32 score; + + ngram_model_add_word(model, "foobie", 1.0); + score = ngram_score(model, "foobie", NULL); + TEST_EQUAL_LOG(score, logmath_log(lmath, 1.0/401)); /* #unigrams */ + + ngram_model_add_word(model, "quux", 0.5); + score = ngram_score(model, "quux", NULL); + TEST_EQUAL_LOG(score, logmath_log(lmath, 0.5/402)); /* #unigrams */ +} + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + ngram_model_t *model; + + (void)argc; + (void)argv; + lmath = logmath_init(1.0001, 0, 0); + + model = ngram_model_read(NULL, LMDIR "/100.lm.dmp", NGRAM_BIN, lmath); + run_tests(lmath, model); + ngram_model_free(model); + + model = ngram_model_read(NULL, LMDIR "/100.lm.gz", NGRAM_ARPA, lmath); + run_tests(lmath, model); + ngram_model_free(model); + + logmath_free(lmath); + return 0; +} diff --git a/test/unit/test_ngram/test_lm_casefold.c b/test/unit/test_ngram/test_lm_casefold.c new file mode 100755 index 0000000..30e2079 --- /dev/null +++ b/test/unit/test_ngram/test_lm_casefold.c @@ -0,0 +1,46 @@ +#include "lm/ngram_model.h" +#include +#include "util/strfuncs.h" + +#include "test_macros.h" + +#include +#include +#include + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + ngram_model_t *model; + + (void)argc; + (void)argv; + /* Initialize a logmath object to pass to ngram_read */ + lmath = logmath_init(1.0001, 0, 0); + + /* Read a language model */ + model = ngram_model_read(NULL, LMDIR "/100.lm.dmp", NGRAM_BIN, lmath); + TEST_ASSERT(model); + + ngram_model_casefold(model, NGRAM_UPPER); + + TEST_EQUAL(0, strcmp("", ngram_word(model, 5))); + TEST_EQUAL(0, strcmp("BE", ngram_word(model, 42))); + TEST_EQUAL(0, strcmp("FLOORED", ngram_word(model, 130))); + TEST_EQUAL(0, strcmp("ZERO", ngram_word(model, 398))); + TEST_EQUAL(0, strcmp("~", ngram_word(model, 399))); + + ngram_model_casefold(model, NGRAM_LOWER); + + TEST_EQUAL(0, strcmp("
", ngram_word(model, 5))); + TEST_EQUAL(0, strcmp("be", ngram_word(model, 42))); + TEST_EQUAL(0, strcmp("floored", ngram_word(model, 130))); + TEST_EQUAL(0, strcmp("zero", ngram_word(model, 398))); + TEST_EQUAL(0, strcmp("~", ngram_word(model, 399))); + + ngram_model_free(model); + logmath_free(lmath); + + return 0; +} diff --git a/test/unit/test_ngram/test_lm_class.c b/test/unit/test_ngram/test_lm_class.c new file mode 100644 index 0000000..07e2283 --- /dev/null +++ b/test/unit/test_ngram/test_lm_class.c @@ -0,0 +1,125 @@ +#include "lm/ngram_model.h" +#include +#include "util/strfuncs.h" + +#include "test_macros.h" + +#include +#include +#include + +void +run_tests(logmath_t *lmath, ngram_model_t *model) +{ + int32 rv, i; + + TEST_ASSERT(model); + + TEST_EQUAL(ngram_wid(model, "scylla"), 285); + TEST_EQUAL(strcmp(ngram_word(model, 285), "scylla"), 0); + + rv = ngram_model_read_classdef(model, LMDIR "/100.probdef"); + TEST_EQUAL(rv, 0); + + /* Verify that class word IDs remain the same. */ + TEST_EQUAL(ngram_wid(model, "scylla"), 285); + TEST_EQUAL(strcmp(ngram_word(model, 285), "scylla"), 0); + + /* Verify in-class word IDs. */ + TEST_EQUAL((uint32)ngram_wid(model, "scylla:scylla"), 0x80000000 | 400); + + /* Verify in-class and out-class unigram scores. */ + TEST_EQUAL_LOG(ngram_score(model, "scylla:scylla", NULL), + logmath_log10_to_log(lmath, -2.7884) + logmath_log(lmath, 0.4)); + TEST_EQUAL_LOG(ngram_score(model, "scooby:scylla", NULL), + logmath_log10_to_log(lmath, -2.7884) + logmath_log(lmath, 0.1)); + TEST_EQUAL_LOG(ngram_score(model, "scylla", NULL), + logmath_log10_to_log(lmath, -2.7884)); + TEST_EQUAL_LOG(ngram_score(model, "oh:zero", NULL), + logmath_log10_to_log(lmath, -1.9038) + logmath_log(lmath, 0.7)); + TEST_EQUAL_LOG(ngram_score(model, "zero", NULL), + logmath_log10_to_log(lmath, -1.9038)); + + /* Verify class bigram scores. */ + TEST_EQUAL_LOG(ngram_score(model, "scylla", "on", NULL), + logmath_log10_to_log(lmath, -1.2642)); + TEST_EQUAL_LOG(ngram_score(model, "scylla:scylla", "on", NULL), + logmath_log10_to_log(lmath, -1.2642) + logmath_log(lmath, 0.4)); + TEST_EQUAL_LOG(ngram_score(model, "apparently", "scylla", NULL), + logmath_log10_to_log(lmath, -0.5172)); + TEST_EQUAL_LOG(ngram_score(model, "apparently", "karybdis:scylla", NULL), + logmath_log10_to_log(lmath, -0.5172)); + TEST_EQUAL_LOG(ngram_score(model, "apparently", "scooby:scylla", NULL), + logmath_log10_to_log(lmath, -0.5172)); + + /* Verify class trigram scores. */ + TEST_EQUAL_LOG(ngram_score(model, "zero", "be", "will", NULL), + logmath_log10_to_log(lmath, -0.5725)); + TEST_EQUAL_LOG(ngram_score(model, "oh:zero", "be", "will", NULL), + logmath_log10_to_log(lmath, -0.5725) + logmath_log(lmath, 0.7)); + TEST_EQUAL_LOG(ngram_score(model, "should", "variance", "zero", NULL), + logmath_log10_to_log(lmath, -0.9404)); + TEST_EQUAL_LOG(ngram_score(model, "should", "variance", "zero:zero", NULL), + logmath_log10_to_log(lmath, -0.9404)); + + /* Add words to classes. */ + rv = ngram_model_add_class_word(model, "scylla", "scrappy:scylla", 1.0); + TEST_ASSERT(rv >= 0); + TEST_EQUAL((uint32)ngram_wid(model, "scrappy:scylla"), 0x80000196); + TEST_EQUAL_LOG(ngram_score(model, "scrappy:scylla", NULL), + logmath_log10_to_log(lmath, -2.7884) + logmath_log(lmath, 0.2)); + printf("scrappy:scylla %08x %d %f\n", + ngram_wid(model, "scrappy:scylla"), + ngram_score(model, "scrappy:scylla", NULL), + logmath_exp(lmath, ngram_score(model, "scrappy:scylla", NULL))); + /* Add a lot of words to a class. */ + for (i = 0; i < 129; ++i) { + char word[32]; + sprintf(word, "%d:scylla", i); + rv = ngram_model_add_class_word(model, "scylla", word, 1.0); + printf("%s %08x %d %f\n", word, + ngram_wid(model, word), + ngram_score(model, word, NULL), + logmath_exp(lmath, ngram_score(model, word, NULL))); + TEST_ASSERT(rv >= 0); + TEST_EQUAL((uint32)ngram_wid(model, word), 0x80000197 + i); + } + + /* Add a new class. */ + { + char *words[] = { "blatz:foobie", "hurf:foobie" }; + float32 weights[] = { 0.6, 0.4 }; + int32 foobie_prob; + rv = ngram_model_add_class(model, "[foobie]", 1.0, + words, weights, 2); + TEST_ASSERT(rv >= 0); + foobie_prob = ngram_score(model, "[foobie]", NULL); + TEST_EQUAL_LOG(ngram_score(model, "blatz:foobie", NULL), + foobie_prob + logmath_log(lmath, 0.6)); + TEST_EQUAL_LOG(ngram_score(model, "hurf:foobie", NULL), + foobie_prob + logmath_log(lmath, 0.4)); + } +} + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + ngram_model_t *model; + + (void)argc; + (void)argv; + lmath = logmath_init(1.0001, 0, 0); + + model = ngram_model_read(NULL, LMDIR "/100.lm.dmp", NGRAM_BIN, lmath); + run_tests(lmath, model); + ngram_model_free(model); + + model = ngram_model_read(NULL, LMDIR "/100.lm.gz", NGRAM_ARPA, lmath); + run_tests(lmath, model); + ngram_model_free(model); + + logmath_free(lmath); + + return 0; +} diff --git a/test/unit/test_ngram/test_lm_read.c b/test/unit/test_ngram/test_lm_read.c new file mode 100644 index 0000000..da558ee --- /dev/null +++ b/test/unit/test_ngram/test_lm_read.c @@ -0,0 +1,108 @@ +#include "lm/ngram_model.h" +#include +#include "util/strfuncs.h" +#include + +#include "test_macros.h" + +#include +#include +#include +#include + +static int +test_lm_vals(ngram_model_t *model) +{ + int32 n_used; + TEST_ASSERT(model); + TEST_EQUAL(ngram_wid(model, ""), 0); + TEST_EQUAL(strcmp(ngram_word(model, 0), ""), 0); + TEST_EQUAL(ngram_wid(model, "absolute"), 13); + TEST_EQUAL(strcmp(ngram_word(model, 13), "absolute"), 0); + /* Test unigrams. */ + TEST_EQUAL(ngram_score(model, "", NULL), -75346); + TEST_EQUAL(ngram_bg_score(model, ngram_wid(model, ""), + NGRAM_INVALID_WID, &n_used), -75346); + TEST_EQUAL(n_used, 1); + TEST_EQUAL(ngram_score(model, "sphinxtrain", NULL), -64208); + TEST_EQUAL(ngram_bg_score(model, ngram_wid(model, "sphinxtrain"), + NGRAM_INVALID_WID, &n_used), -64208); + TEST_EQUAL(n_used, 1); + /* Test bigrams. */ + TEST_EQUAL(ngram_score(model, "huggins", "david", NULL), -831); + /* Test trigrams. */ + TEST_EQUAL_LOG(ngram_score(model, "daines", "huggins", "david", NULL), -9450); + return 0; +} + +static int +test_lm_ug_vals(ngram_model_t *model) +{ + TEST_ASSERT(model); + TEST_EQUAL(ngram_score(model, "BACKWARD", NULL), -53008); + return 0; +} + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + ngram_model_t *model; + + (void)argc; + (void)argv; + err_set_loglevel(ERR_INFO); + + /* Initialize a logmath object to pass to ngram_read */ + lmath = logmath_init(1.0001, 0, 0); + + /* Read a language model */ + model = ngram_model_read(NULL, LMDIR "/turtle.ug.lm", NGRAM_ARPA, lmath); + test_lm_ug_vals(model); + TEST_EQUAL(0, ngram_model_free(model)); + + /* Read a language model */ + model = ngram_model_read(NULL, LMDIR "/turtle.ug.lm.dmp", NGRAM_BIN, lmath); + test_lm_ug_vals(model); + TEST_EQUAL(0, ngram_model_free(model)); + + /* Read a language model with missing backoffs */ + model = ngram_model_read(NULL, LMDIR "/104.lm.gz", NGRAM_ARPA, lmath); + TEST_EQUAL(0, ngram_model_free(model)); + + /* Read corrupted language model, error expected */ + model = ngram_model_read(NULL, LMDIR "/105.lm.gz", NGRAM_ARPA, lmath); + TEST_EQUAL(NULL, model); + + /* Read corrupted language model, error expected */ + model = ngram_model_read(NULL, LMDIR "/106.lm.gz", NGRAM_ARPA, lmath); + TEST_EQUAL(NULL, model); + + /* Read corrupted language model with wrong format line, error expected */ + model = ngram_model_read(NULL, LMDIR "/107.lm.gz", NGRAM_ARPA, lmath); + TEST_EQUAL(0, ngram_model_free(model)); + + /* Read a language model */ + model = ngram_model_read(NULL, LMDIR "/100.lm.bz2", NGRAM_ARPA, lmath); + test_lm_vals(model); + TEST_EQUAL(0, ngram_model_free(model)); + + /* Read a language model */ + model = ngram_model_read(NULL, LMDIR "/100.lm.bin", NGRAM_BIN, lmath); + test_lm_vals(model); + TEST_EQUAL(0, ngram_model_free(model)); + + /* Read a language model */ + model = ngram_model_read(NULL, LMDIR "/100.lm.dmp", NGRAM_BIN, lmath); + test_lm_vals(model); + /* Test refcounting. */ + model = ngram_model_retain(model); + TEST_EQUAL(1, ngram_model_free(model)); + TEST_EQUAL(ngram_score(model, "daines", "huggins", "david", NULL), -9452); + TEST_EQUAL(0, ngram_model_free(model)); + + + logmath_free(lmath); + + return 0; +} diff --git a/test/unit/test_ngram/test_lm_score.c b/test/unit/test_ngram/test_lm_score.c new file mode 100644 index 0000000..3f4c0ee --- /dev/null +++ b/test/unit/test_ngram/test_lm_score.c @@ -0,0 +1,90 @@ +#include "lm/ngram_model.h" +#include +#include "util/strfuncs.h" + +#include "test_macros.h" + +#include +#include +#include + +void +run_tests(ngram_model_t *model) +{ + int32 n_used; + + ngram_tg_score(model, + ngram_wid(model, "daines"), + ngram_wid(model, "huggins"), + ngram_wid(model, "huggins"), &n_used); + TEST_EQUAL(n_used, 2); + ngram_tg_score(model, + ngram_wid(model, "david"), + ngram_wid(model, "david"), + ngram_wid(model, "david"), &n_used); + TEST_EQUAL(n_used, 1); + + /* Apply weights. */ + ngram_model_apply_weights(model, 7.5, 0.5); + /* -9452 * 7.5 + log(0.5) = -77821 */ + TEST_EQUAL_LOG(ngram_score(model, "daines", "huggins", "david", NULL), + -77821); + /* Recover original score. */ + TEST_EQUAL_LOG(ngram_probv(model, "daines", "huggins", "david", NULL), + -9452); + TEST_EQUAL_LOG(ngram_probv(model, "huggins", "david", NULL), -831); + + /* Un-apply weights. */ + ngram_model_apply_weights(model, 1.0, 1.0); + TEST_EQUAL_LOG(ngram_score(model, "daines", "huggins", "david", NULL), + -9452); + TEST_EQUAL_LOG(ngram_score(model, "huggins", "david", NULL), -831); + /* Recover original score. */ + TEST_EQUAL_LOG(ngram_probv(model, "daines", "huggins", "david", NULL), + -9452); + + /* Pre-weighting, this should give the "raw" score. */ + TEST_EQUAL_LOG(ngram_score(model, "daines", "huggins", "david", NULL), + -9452); + TEST_EQUAL_LOG(ngram_score(model, "huggins", "david", NULL), -831); + /* Verify that backoff mode calculations work. */ + ngram_bg_score(model, + ngram_wid(model, "huggins"), + ngram_wid(model, "david"), &n_used); + TEST_EQUAL(n_used, 2); + ngram_bg_score(model, + ngram_wid(model, "blorglehurfle"), + ngram_wid(model, "david"), &n_used); + TEST_EQUAL(n_used, 1); + ngram_bg_score(model, + ngram_wid(model, "david"), + ngram_wid(model, "david"), &n_used); + TEST_EQUAL(n_used, 1); + ngram_tg_score(model, + ngram_wid(model, "daines"), + ngram_wid(model, "huggins"), + ngram_wid(model, "david"), &n_used); + TEST_EQUAL(n_used, 3); +} + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + ngram_model_t *model; + + (void)argc; + (void)argv; + lmath = logmath_init(1.0001, 0, 0); + + model = ngram_model_read(NULL, LMDIR "/100.lm.bin", NGRAM_BIN, lmath); + run_tests(model); + ngram_model_free(model); + + model = ngram_model_read(NULL, LMDIR "/100.lm.gz", NGRAM_ARPA, lmath); + run_tests(model); + ngram_model_free(model); + + logmath_free(lmath); + return 0; +} diff --git a/test/unit/test_ngram/test_lm_set.c b/test/unit/test_ngram/test_lm_set.c new file mode 100644 index 0000000..f20294d --- /dev/null +++ b/test/unit/test_ngram/test_lm_set.c @@ -0,0 +1,199 @@ +#include "lm/ngram_model.h" +#include +#include "util/strfuncs.h" + +#include "test_macros.h" + +#include +#include +#include +#include + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + ngram_model_t *lms[3]; + ngram_model_t *lmset; + const char *names[] = { "100", "102" }; + const char *words[] = { + "", + "ROBOMAN", + "libio", + "sphinxtrain", + "bigbird", + "quuxfuzz" + }; + const int32 n_words = sizeof(words) / sizeof(words[0]); + float32 weights[] = { 0.6, 0.4 }; + + (void)argc; + (void)argv; + lmath = logmath_init(1.0001, 0, 0); + + lms[0] = ngram_model_read(NULL, LMDIR "/100.lm.dmp", NGRAM_BIN, lmath); + lms[1] = ngram_model_read(NULL, LMDIR "/102.lm.dmp", NGRAM_BIN, lmath); + + lmset = ngram_model_set_init(NULL, lms, (char **)names, NULL, 2); + TEST_ASSERT(lmset); + TEST_EQUAL(ngram_model_set_select(lmset, "102"), lms[1]); + TEST_EQUAL(ngram_model_set_select(lmset, "100"), lms[0]); + TEST_EQUAL(ngram_score(lmset, "sphinxtrain", NULL), + logmath_log10_to_log(lmath, -2.7884)); + TEST_EQUAL(ngram_score(lmset, "huggins", "david", NULL), + logmath_log10_to_log(lmath, -0.0361)); + TEST_EQUAL_LOG(ngram_score(lmset, "daines", "huggins", "david", NULL), + logmath_log10_to_log(lmath, -0.4105)); + + TEST_EQUAL(ngram_model_set_select(lmset, "102"), lms[1]); + TEST_EQUAL(ngram_score(lmset, "sphinxtrain", NULL), + logmath_log10_to_log(lmath, -2.8192)); + TEST_EQUAL(ngram_score(lmset, "huggins", "david", NULL), + logmath_log10_to_log(lmath, -0.1597)); + TEST_EQUAL_LOG(ngram_score(lmset, "daines", "huggins", "david", NULL), + logmath_log10_to_log(lmath, -0.0512)); + + /* Test interpolation with default weights. */ + TEST_ASSERT(ngram_model_set_interp(lmset, NULL, NULL)); + TEST_EQUAL_LOG(ngram_score(lmset, "sphinxtrain", NULL), + logmath_log(lmath, + 0.5 * pow(10, -2.7884) + + 0.5 * pow(10, -2.8192))); + + /* Test interpolation with set weights. */ + TEST_ASSERT(ngram_model_set_interp(lmset, names, weights)); + TEST_EQUAL_LOG(ngram_score(lmset, "sphinxtrain", NULL), + logmath_log(lmath, + 0.6 * pow(10, -2.7884) + + 0.4 * pow(10, -2.8192))); + + /* Test switching back to selected mode. */ + TEST_EQUAL(ngram_model_set_select(lmset, "102"), lms[1]); + TEST_EQUAL(ngram_score(lmset, "sphinxtrain", NULL), + logmath_log10_to_log(lmath, -2.8192)); + TEST_EQUAL(ngram_score(lmset, "huggins", "david", NULL), + logmath_log10_to_log(lmath, -0.1597)); + TEST_EQUAL_LOG(ngram_score(lmset, "daines", "huggins", "david", NULL), + logmath_log10_to_log(lmath, -0.0512)); + + /* Test interpolation with previously set weights. */ + TEST_ASSERT(ngram_model_set_interp(lmset, NULL, NULL)); + TEST_EQUAL_LOG(ngram_score(lmset, "sphinxtrain", NULL), + logmath_log(lmath, + 0.6 * pow(10, -2.7884) + + 0.4 * pow(10, -2.8192))); + + /* Test interpolation with closed-vocabulary models and OOVs. */ + lms[2] = ngram_model_read(NULL, LMDIR "/turtle.lm", NGRAM_ARPA, lmath); + TEST_ASSERT(ngram_model_set_add(lmset, lms[2], "turtle", 1.0, FALSE)); + TEST_EQUAL_LOG(ngram_score(lmset, "sphinxtrain", NULL), + logmath_log(lmath, + 0.6 * (2.0 / 3.0) * pow(10, -2.7884) + + 0.4 * (2.0 / 3.0) * pow(10, -2.8192))); + ngram_model_free(lmset); + + /* Test adding and removing language models with preserved + * word ID mappings. */ + lms[0] = ngram_model_read(NULL, LMDIR "/100.lm.dmp", NGRAM_BIN, lmath); + lms[1] = ngram_model_read(NULL, LMDIR "/102.lm.dmp", NGRAM_BIN, lmath); + lms[2] = ngram_model_read(NULL, LMDIR "/turtle.lm", NGRAM_ARPA, lmath); + lmset = ngram_model_set_init(NULL, lms, (char **)names, NULL, 1); + { + int32 wid; + wid = ngram_wid(lmset, "sphinxtrain"); + TEST_ASSERT(ngram_model_set_add(lmset, lms[1], "102", 1.0, TRUE)); + /* Verify that it is the same. */ + TEST_EQUAL(wid, ngram_wid(lmset, "sphinxtrain")); + /* Now add another model and verify that its words + * don't actually get added. */ + TEST_ASSERT(ngram_model_set_add(lmset, lms[2], "turtle", 1.0, TRUE)); + TEST_EQUAL(wid, ngram_wid(lmset, "sphinxtrain")); + TEST_EQUAL(ngram_unknown_wid(lmset), ngram_wid(lmset, "FORWARD")); + /* Remove language model, make sure this doesn't break horribly. */ + TEST_EQUAL(lms[1], ngram_model_set_remove(lmset, "102", TRUE)); + ngram_model_free(lms[1]); + TEST_EQUAL(wid, ngram_wid(lmset, "sphinxtrain")); + /* Now enable remapping of word IDs and verify that it works. */ + TEST_EQUAL(lms[2], ngram_model_set_remove(lmset, "turtle", TRUE)); + TEST_ASSERT(ngram_model_set_add(lmset, lms[2], "turtle", 1.0, FALSE)); + printf("FORWARD = %d\n", ngram_wid(lmset, "FORWARD")); + } + + ngram_model_free(lmset); + + /* Now test lmctl files. */ + lmset = ngram_model_set_read(NULL, LMDIR "/100.lmctl", lmath); + TEST_ASSERT(lmset); + /* Test iterators. */ + { + ngram_model_set_iter_t *itor; + char const *lmname; + + itor = ngram_model_set_iter(lmset); + TEST_ASSERT(itor); + ngram_model_set_iter_model(itor, &lmname); + printf("1: %s\n", lmname); + itor = ngram_model_set_iter_next(itor); + ngram_model_set_iter_model(itor, &lmname); + printf("2: %s\n", lmname); + itor = ngram_model_set_iter_next(itor); + ngram_model_set_iter_model(itor, &lmname); + printf("3: %s\n", lmname); + itor = ngram_model_set_iter_next(itor); + TEST_EQUAL(itor, NULL); + } + + TEST_EQUAL(ngram_score(lmset, "sphinxtrain", NULL), + logmath_log10_to_log(lmath, -2.7884)); + + TEST_ASSERT(ngram_model_set_interp(lmset, NULL, NULL)); + TEST_EQUAL_LOG(ngram_score(lmset, "sphinxtrain", NULL), + logmath_log(lmath, + (1.0 / 3.0) * pow(10, -2.7884) + + (1.0 / 3.0) * pow(10, -2.8192))); + + ngram_model_set_select(lmset, "102"); + TEST_EQUAL(ngram_score(lmset, "sphinxtrain", NULL), + logmath_log10_to_log(lmath, -2.8192)); + TEST_EQUAL(ngram_score(lmset, "huggins", "david", NULL), + logmath_log10_to_log(lmath, -0.1597)); + TEST_EQUAL_LOG(ngram_score(lmset, "daines", "huggins", "david", NULL), + logmath_log10_to_log(lmath, -0.0512)); + + ngram_model_set_select(lmset, "100"); + TEST_EQUAL(ngram_score(lmset, "sphinxtrain", NULL), + logmath_log10_to_log(lmath, -2.7884)); + TEST_EQUAL(ngram_score(lmset, "huggins", "david", NULL), + logmath_log10_to_log(lmath, -0.0361)); + TEST_EQUAL_LOG(ngram_score(lmset, "daines", "huggins", "david", NULL), + logmath_log10_to_log(lmath, -0.4105)); + + /* Test class probabilities. */ + ngram_model_set_select(lmset, "100"); + TEST_EQUAL_LOG(ngram_score(lmset, "scylla:scylla", NULL), + logmath_log10_to_log(lmath, -2.7884) + logmath_log(lmath, 0.4)); + TEST_EQUAL_LOG(ngram_score(lmset, "scooby:scylla", NULL), + logmath_log10_to_log(lmath, -2.7884) + logmath_log(lmath, 0.1)); + TEST_EQUAL_LOG(ngram_score(lmset, "apparently", "karybdis:scylla", NULL), + logmath_log10_to_log(lmath, -0.5172)); + + /* Test word ID mapping. */ + ngram_model_set_select(lmset, "turtle"); + TEST_EQUAL(ngram_wid(lmset, "ROBOMAN"), + ngram_wid(lmset, ngram_word(lmset, ngram_wid(lmset, "ROBOMAN")))); + TEST_EQUAL(ngram_wid(lmset, "bigbird"), + ngram_wid(lmset, ngram_word(lmset, ngram_wid(lmset, "bigbird")))); + TEST_EQUAL(ngram_wid(lmset, "quuxfuzz"), ngram_unknown_wid(lmset)); + TEST_EQUAL(ngram_score(lmset, "quuxfuzz", NULL), ngram_zero(lmset)); + ngram_model_set_map_words(lmset, words, n_words); + TEST_EQUAL(ngram_wid(lmset, "ROBOMAN"), + ngram_wid(lmset, ngram_word(lmset, ngram_wid(lmset, "ROBOMAN")))); + TEST_EQUAL(ngram_wid(lmset, "bigbird"), + ngram_wid(lmset, ngram_word(lmset, ngram_wid(lmset, "bigbird")))); + TEST_EQUAL(ngram_wid(lmset, "quuxfuzz"), 5); + TEST_EQUAL(ngram_score(lmset, "quuxfuzz", NULL), ngram_zero(lmset)); + + ngram_model_free(lmset); + logmath_free(lmath); + return 0; +} diff --git a/test/unit/test_ngram/test_lm_write.c b/test/unit/test_ngram/test_lm_write.c new file mode 100644 index 0000000..be63d40 --- /dev/null +++ b/test/unit/test_ngram/test_lm_write.c @@ -0,0 +1,111 @@ +#include "lm/ngram_model.h" +#include +#include "util/strfuncs.h" +#include + +#include "test_macros.h" + +#include +#include +#include + +static int +test_lm_vals(ngram_model_t *model) +{ + int32 n_used, score; + + TEST_ASSERT(model); + TEST_EQUAL(ngram_wid(model, ""), 0); + TEST_EQUAL(strcmp(ngram_word(model, 0), ""), 0); + TEST_EQUAL(ngram_wid(model, "absolute"), 13); + TEST_EQUAL(strcmp(ngram_word(model, 13), "absolute"), 0); + /* Test unigrams. */ + score = ngram_score(model, "", NULL); + E_INFO("%d\n", score); + TEST_EQUAL_LOG(score, -75346); + score = ngram_bg_score(model, ngram_wid(model, ""), + NGRAM_INVALID_WID, &n_used); + E_INFO("%d\n", score); + TEST_EQUAL_LOG(score, -75346); + TEST_EQUAL(n_used, 1); + score = ngram_score(model, "sphinxtrain", NULL); + E_INFO("%d\n", score); + TEST_EQUAL_LOG(score, -64208); + TEST_EQUAL_LOG(ngram_bg_score(model, ngram_wid(model, "sphinxtrain"), + NGRAM_INVALID_WID, &n_used), -64208); + TEST_EQUAL(n_used, 1); + /* Test bigrams. */ + score = ngram_score(model, "huggins", "david", NULL); + E_INFO("%d\n", score); + TEST_EQUAL_LOG(score, -831); + /* Test trigrams. */ + score = ngram_score(model, "daines", "huggins", "david", NULL); + E_INFO("%d\n", score); + TEST_EQUAL_LOG(score, -9450); + return 0; +} + +int +main(int argc, char *argv[]) +{ + logmath_t *lmath; + ngram_model_t *model; + + (void)argc; + (void)argv; + err_set_loglevel(ERR_INFO); + + /* Initialize a logmath object to pass to ngram_read */ + lmath = logmath_init(1.0001, 0, 0); + + E_INFO("Converting ARPA to BIN\n"); + model = ngram_model_read(NULL, LMDIR "/100.lm.bz2", NGRAM_ARPA, lmath); + E_INFO("Verifying ARPA\n"); + test_lm_vals(model); + E_INFO("Writing BIN\n"); + TEST_EQUAL(0, ngram_model_write(model, "100.tmp.lm.bin", NGRAM_BIN)); + ngram_model_free(model); + +#ifdef DEBUG_ENDIAN + E_INFO("Debugging endianness, will not use pre-existing model\n"); +#else + E_INFO("Converting BIN to ARPA\n"); + model = ngram_model_read(NULL, LMDIR "/100.lm.bin", NGRAM_BIN, lmath); + test_lm_vals(model); + TEST_EQUAL(0, ngram_model_write(model, "100.tmp.lm", NGRAM_ARPA)); + ngram_model_free(model); +#endif + + E_INFO("Testing converted BIN\n"); + model = ngram_model_read(NULL, "100.tmp.lm.bin", NGRAM_BIN, lmath); + test_lm_vals(model); +#ifdef DEBUG_ENDIAN + TEST_EQUAL(0, ngram_model_write(model, "100.tmp.lm", NGRAM_ARPA)); +#endif + ngram_model_free(model); + + E_INFO("Testing converted ARPA\n"); + model = ngram_model_read(NULL, "100.tmp.lm", NGRAM_ARPA, lmath); + test_lm_vals(model); + ngram_model_free(model); + + E_INFO("Converting ARPA back to BIN\n"); + model = ngram_model_read(NULL, "100.tmp.lm", NGRAM_ARPA, lmath); + test_lm_vals(model); + TEST_EQUAL(0, ngram_model_write(model, "100.tmp.lm.bin", NGRAM_BIN)); + ngram_model_free(model); + + E_INFO("Converting BIN back to ARPA\n"); + model = ngram_model_read(NULL, "100.tmp.lm.bin", NGRAM_BIN, lmath); + test_lm_vals(model); + TEST_EQUAL(0, ngram_model_write(model, "100.tmp.lm", NGRAM_ARPA)); + ngram_model_free(model); + + E_INFO("Converting unigram ARPA to BIN\n"); + model = ngram_model_read(NULL, LMDIR "/turtle.ug.lm", NGRAM_ARPA, lmath); + TEST_EQUAL(0, ngram_model_write(model, "turtle.ug.tmp.lm.bin", NGRAM_BIN)); + ngram_model_free(model); + + logmath_free(lmath); + return 0; +} diff --git a/test/unit/test_ngram/turtle.lm b/test/unit/test_ngram/turtle.lm new file mode 100644 index 0000000..1cf3d7a --- /dev/null +++ b/test/unit/test_ngram/turtle.lm @@ -0,0 +1,498 @@ +Language model created by QuickLM on Wed Aug 4 14:21:56 EDT 1999 +Carnegie Mellon University (c) 1996 + +This model based on a corpus of sentences and words +The (fixed) discount mass is 0.5 + +\data\ +ngram 1=91 +ngram 2=212 +ngram 3=177 + +\1-grams: +-0.9129
-0.3010 +-0.9129 -0.2144 +-2.6031 A -0.2999 +-2.6031 AND -0.2989 +-2.3021 ARE -0.2978 +-2.6031 AROUND -0.2444 +-2.3021 BACKWARD -0.2338 +-2.9042 BACKWARDS -0.2444 +-2.6031 BYE -0.2432 +-2.9042 CENTIMETER -0.2444 +-2.9042 CENTIMETERS -0.2444 +-2.9042 CHASE -0.2989 +-2.9042 COLOR -0.2999 +-1.9499 DEGREES -0.2444 +-2.6031 DISPLAY -0.2999 +-2.9042 DO -0.2983 +-2.9042 DOING -0.2444 +-2.9042 EIGHT -0.2444 +-2.9042 EIGHTEEN -0.2444 +-2.4271 EIGHTY -0.2388 +-2.9042 ELEVEN -0.2444 +-2.9042 EXIT -0.2444 +-2.9042 EXPLORE -0.2444 +-2.6031 FIFTEEN -0.2388 +-2.9042 FIFTY -0.2444 +-2.9042 FIND -0.2989 +-2.9042 FINISH -0.2444 +-2.1260 FIVE -0.2338 +-2.3021 FORTY -0.2407 +-2.0011 FORWARD -0.2281 +-2.9042 FOUR -0.2444 +-2.9042 FOURTEEN -0.2444 +-1.7001 GO -0.2923 +-2.9042 GREY -0.2999 +-2.9042 GUARD -0.2989 +-2.4271 HALF -0.2420 +-2.9042 HALL -0.2444 +-2.9042 HALLWAY -0.2444 +-2.9042 HALT -0.2444 +-2.9042 HELLO -0.2444 +-2.9042 HOME -0.2444 +-2.6031 HUNDRED -0.2432 +-2.9042 KEVIN -0.2444 +-2.6031 LAB -0.2444 +-2.2052 LEFT -0.2338 +-2.9042 LISTENING -0.2444 +-2.9042 LOST -0.2444 +-2.3021 METER -0.2444 +-2.0011 METERS -0.2444 +-2.6031 MINUS -0.2983 +-2.9042 NINE -0.2444 +-2.9042 NINETEEN -0.2444 +-2.4271 NINETY -0.2388 +-2.9042 OFFICE -0.2444 +-2.0011 ONE -0.2351 +-2.9042 PERSON -0.2444 +-2.4271 QUARTER -0.2444 +-2.9042 QUARTERS -0.2444 +-2.9042 QUIT -0.2444 +-2.9042 READY -0.2444 +-2.9042 REID -0.2444 +-2.1260 RIGHT -0.2325 +-2.9042 ROBOMAN -0.2444 +-2.9042 ROOM -0.2444 +-2.0591 ROTATE -0.2950 +-2.6031 SAY -0.2994 +-2.9042 SEBASTIAN -0.2444 +-2.6031 SEVEN -0.2395 +-2.9042 SEVENTEEN -0.2444 +-2.9042 SEVENTY -0.2444 +-2.9042 SIX -0.2444 +-2.9042 SIXTEEN -0.2444 +-2.9042 SIXTY -0.2444 +-2.9042 STOP -0.2444 +-2.4271 TEN -0.2338 +-2.3021 THE -0.2432 +-2.9042 THEN -0.2444 +-2.9042 THIRTEEN -0.2444 +-2.6031 THIRTY -0.2388 +-2.3021 THREE -0.2370 +-2.6031 TO -0.2420 +-2.9042 TOM -0.2444 +-2.2052 TURN -0.2939 +-2.9042 TWELVE -0.2444 +-2.9042 TWENTY -0.2444 +-2.4271 TWO -0.2395 +-2.9042 UNDERSTAND -0.2444 +-2.9042 WANDER -0.2999 +-2.9042 WHAT -0.2989 +-2.6031 WINDOW -0.2444 +-2.2052 YOU -0.2967 + +\2-grams: +-2.2923 AND -0.1761 +-1.9912 ARE -0.0969 +-2.2923 CENTIMETER 0.0000 +-2.2923 CENTIMETERS 0.0000 +-2.2923 CHASE 0.0000 +-1.9912 DISPLAY 0.0000 +-2.2923 DO 0.0000 +-2.2923 EIGHT 0.0000 +-2.2923 EIGHTEEN 0.0000 +-2.2923 EIGHTY -0.2218 +-2.2923 ELEVEN 0.0000 +-2.2923 EXIT 0.0000 +-2.2923 EXPLORE 0.0000 +-2.2923 FIFTEEN -0.1761 +-2.2923 FIFTY 0.0000 +-2.2923 FIND 0.0000 +-2.2923 FINISH 0.0000 +-2.2923 FIVE -0.2218 +-1.9912 FORTY 0.0000 +-2.2923 FOUR 0.0000 +-2.2923 FOURTEEN 0.0000 +-1.0881 GO 0.0000 +-2.2923 GUARD 0.0000 +-2.2923 HALF -0.1249 +-2.2923 HALL 0.0000 +-2.2923 HALLWAY 0.0000 +-2.2923 HALT 0.0000 +-2.2923 HUNDRED -0.1761 +-2.2923 KEVIN 0.0000 +-2.2923 LAB 0.0000 +-2.2923 METER 0.0000 +-2.2923 METERS 0.0000 +-2.2923 NINE 0.0000 +-2.2923 NINETEEN 0.0000 +-2.2923 NINETY -0.2218 +-2.2923 OFFICE 0.0000 +-1.8151 ONE -0.1761 +-2.2923 PERSON 0.0000 +-2.2923 QUARTER 0.0000 +-2.2923 QUIT 0.0000 +-2.2923 REID 0.0000 +-2.2923 ROBOMAN 0.0000 +-2.2923 ROOM 0.0000 +-1.4472 ROTATE 0.0000 +-1.9912 SAY 0.0000 +-2.2923 SEBASTIAN 0.0000 +-2.2923 SEVEN -0.1761 +-2.2923 SEVENTEEN 0.0000 +-2.2923 SEVENTY 0.0000 +-2.2923 SIX 0.0000 +-2.2923 SIXTEEN 0.0000 +-2.2923 SIXTY 0.0000 +-2.2923 STOP 0.0000 +-2.2923 TEN -0.2218 +-2.2923 THIRTEEN 0.0000 +-2.2923 THIRTY -0.1761 +-1.8151 THREE -0.0969 +-2.2923 TOM 0.0000 +-1.5933 TURN 0.0000 +-2.2923 TWELVE 0.0000 +-2.2923 TWENTY 0.0000 +-2.2923 TWO -0.2218 +-2.2923 WANDER 0.0000 +-2.2923 WHAT 0.0000 +-2.2923 YOU -0.2553 +-0.6021 A COLOR 0.0000 +-0.6021 A GREY 0.0000 +-0.6021 AND EIGHTY -0.1249 +-0.6021 AND THEN 0.0000 +-0.9031 ARE LOST 0.0000 +-0.4260 ARE YOU -0.1461 +-0.3010 AROUND -0.3010 +-0.9031 BACKWARD -0.3010 +-0.9031 BACKWARD FIVE -0.2218 +-0.9031 BACKWARD ONE -0.2430 +-0.9031 BACKWARD TWO -0.1249 +-0.3010 BACKWARDS -0.3010 +-0.6021 BYE -0.3010 +-0.6021 BYE BYE -0.1761 +-0.3010 CENTIMETER -0.3010 +-0.3010 CENTIMETERS -0.3010 +-0.3010 CHASE THE -0.0969 +-0.3010 COLOR WINDOW 0.0000 +-0.3010 DEGREES -0.3010 +-0.3010 DISPLAY A 0.0000 +-0.3010 DO YOU -0.2553 +-0.3010 DOING -0.3010 +-0.3010 EIGHT -0.3010 +-0.3010 EIGHTEEN -0.3010 +-0.7782 EIGHTY -0.3010 +-0.4771 EIGHTY DEGREES 0.0000 +-0.3010 ELEVEN -0.3010 +-0.3010 EXIT -0.3010 +-0.3010 EXPLORE -0.3010 +-0.6021 FIFTEEN -0.3010 +-0.6021 FIFTEEN DEGREES 0.0000 +-0.3010 FIFTY -0.3010 +-0.3010 FIND THE -0.0969 +-0.3010 FINISH -0.3010 +-0.7782 FIVE -0.3010 +-0.7782 FIVE DEGREES 0.0000 +-0.7782 FIVE METERS 0.0000 +-0.9031 FORTY -0.3010 +-0.4260 FORTY FIVE -0.1249 +-1.2041 FORWARD -0.3010 +-1.2041 FORWARD FIVE -0.2218 +-0.9031 FORWARD ONE -0.1761 +-1.2041 FORWARD SEVEN -0.1761 +-1.2041 FORWARD TEN -0.2218 +-1.2041 FORWARD THREE -0.2430 +-1.2041 FORWARD TWO -0.1249 +-0.3010 FOUR -0.3010 +-0.3010 FOURTEEN -0.3010 +-0.9031 GO BACKWARD 0.0000 +-1.5051 GO BACKWARDS 0.0000 +-0.6021 GO FORWARD 0.0000 +-1.5051 GO HOME 0.0000 +-1.2041 GO TO 0.0000 +-0.3010 GREY WINDOW 0.0000 +-0.3010 GUARD THE -0.0969 +-0.4771 HALF -0.3010 +-0.7782 HALF METER 0.0000 +-0.3010 HALL -0.3010 +-0.3010 HALLWAY -0.3010 +-0.3010 HALT -0.3010 +-0.3010 HELLO -0.3010 +-0.3010 HOME -0.3010 +-0.6021 HUNDRED -0.3010 +-0.6021 HUNDRED AND -0.1761 +-0.3010 KEVIN -0.3010 +-0.3010 LAB -0.3010 +-1.0000 LEFT -0.3010 +-1.0000 LEFT FORTY -0.0969 +-1.0000 LEFT MINUS -0.1761 +-1.0000 LEFT NINETY -0.1249 +-1.0000 LEFT ONE -0.2730 +-0.3010 LISTENING -0.3010 +-0.3010 LOST -0.3010 +-0.3010 METER -0.3010 +-0.3010 METERS -0.3010 +-0.6021 MINUS NINETY -0.1249 +-0.6021 MINUS THIRTY -0.1761 +-0.3010 NINE -0.3010 +-0.3010 NINETEEN -0.3010 +-0.7782 NINETY -0.3010 +-0.4771 NINETY DEGREES 0.0000 +-0.3010 OFFICE -0.3010 +-1.2041 ONE -0.3010 +-1.2041 ONE EIGHTY -0.1249 +-0.9031 ONE HALF 0.0000 +-1.2041 ONE HUNDRED -0.1761 +-0.9031 ONE METER 0.0000 +-1.2041 ONE QUARTER 0.0000 +-0.3010 PERSON -0.3010 +-0.3010 QUARTER -0.3010 +-0.3010 QUARTERS -0.3010 +-0.3010 QUIT -0.3010 +-0.3010 READY -0.3010 +-0.3010 REID -0.3010 +-1.0792 RIGHT -0.3010 +-1.0792 RIGHT FIFTEEN -0.1761 +-1.0792 RIGHT FORTY -0.0969 +-1.0792 RIGHT MINUS -0.1761 +-1.0792 RIGHT ONE -0.2730 +-1.0792 RIGHT TEN -0.2218 +-0.3010 ROBOMAN -0.3010 +-0.3010 ROOM -0.3010 +-0.6690 ROTATE LEFT -0.1461 +-0.5441 ROTATE RIGHT -0.1249 +-0.6021 SAY BYE -0.1761 +-0.6021 SAY HELLO 0.0000 +-0.3010 SEBASTIAN -0.3010 +-0.6021 SEVEN -0.3010 +-0.6021 SEVEN METERS 0.0000 +-0.3010 SEVENTEEN -0.3010 +-0.3010 SEVENTY -0.3010 +-0.3010 SIX -0.3010 +-0.3010 SIXTEEN -0.3010 +-0.3010 SIXTY -0.3010 +-0.3010 STOP -0.3010 +-0.7782 TEN -0.3010 +-0.7782 TEN DEGREES 0.0000 +-0.7782 TEN METERS 0.0000 +-0.4260 THE -0.3010 +-0.9031 THE LAB 0.0000 +-0.3010 THEN -0.3010 +-0.3010 THIRTEEN -0.3010 +-0.6021 THIRTY -0.3010 +-0.6021 THIRTY DEGREES 0.0000 +-0.9031 THREE -0.3010 +-0.9031 THREE METERS 0.0000 +-0.9031 THREE QUARTER 0.0000 +-0.9031 THREE QUARTERS 0.0000 +-0.6021 TO -0.3010 +-0.6021 TO THE -0.2430 +-0.3010 TOM -0.3010 +-1.0000 TURN AROUND 0.0000 +-0.6990 TURN LEFT -0.2041 +-0.6990 TURN RIGHT -0.2218 +-0.3010 TWELVE -0.3010 +-0.3010 TWENTY -0.3010 +-0.7782 TWO -0.3010 +-0.4771 TWO METERS 0.0000 +-0.3010 UNDERSTAND -0.3010 +-0.3010 WANDER AROUND 0.0000 +-0.3010 WHAT ARE -0.0969 +-0.3010 WINDOW -0.3010 +-1.0000 YOU ARE -0.2430 +-1.0000 YOU DOING 0.0000 +-1.0000 YOU LISTENING 0.0000 +-1.0000 YOU READY 0.0000 +-1.0000 YOU UNDERSTAND 0.0000 + +\3-grams: +-0.3010 AND THEN +-0.3010 ARE YOU +-0.3010 CENTIMETER +-0.3010 CENTIMETERS +-0.3010 CHASE THE +-0.3010 DISPLAY A +-0.3010 DO YOU +-0.3010 EIGHT +-0.3010 EIGHTEEN +-0.3010 EIGHTY +-0.3010 ELEVEN +-0.3010 EXIT +-0.3010 EXPLORE +-0.3010 FIFTEEN +-0.3010 FIFTY +-0.3010 FIND THE +-0.3010 FINISH +-0.3010 FIVE +-0.6021 FORTY +-0.6021 FORTY FIVE +-0.3010 FOUR +-0.3010 FOURTEEN +-0.9031 GO BACKWARD +-1.5051 GO BACKWARDS +-0.6021 GO FORWARD +-1.5051 GO HOME +-1.2041 GO TO +-0.3010 GUARD THE +-0.3010 HALF +-0.3010 HALL +-0.3010 HALLWAY +-0.3010 HALT +-0.3010 HUNDRED +-0.3010 KEVIN +-0.3010 LAB +-0.3010 METER +-0.3010 METERS +-0.3010 NINE +-0.3010 NINETEEN +-0.3010 NINETY +-0.3010 OFFICE +-0.7782 ONE +-0.7782 ONE HALF +-0.7782 ONE QUARTER +-0.3010 PERSON +-0.3010 QUARTER +-0.3010 QUIT +-0.3010 REID +-0.3010 ROBOMAN +-0.3010 ROOM +-0.6690 ROTATE LEFT +-0.5441 ROTATE RIGHT +-0.6021 SAY BYE +-0.6021 SAY HELLO +-0.3010 SEBASTIAN +-0.3010 SEVEN +-0.3010 SEVENTEEN +-0.3010 SEVENTY +-0.3010 SIX +-0.3010 SIXTEEN +-0.3010 SIXTY +-0.3010 STOP +-0.3010 TEN +-0.3010 THIRTEEN +-0.3010 THIRTY +-0.7782 THREE +-0.7782 THREE QUARTER +-0.7782 THREE QUARTERS +-0.3010 TOM +-1.0000 TURN AROUND +-0.6990 TURN LEFT +-0.6990 TURN RIGHT +-0.3010 TWELVE +-0.3010 TWENTY +-0.3010 TWO +-0.3010 WANDER AROUND +-0.3010 WHAT ARE +-0.3010 YOU ARE +-0.3010 A COLOR WINDOW +-0.3010 A GREY WINDOW +-0.3010 AND EIGHTY DEGREES +-0.3010 AND THEN +-0.3010 ARE LOST +-0.7782 ARE YOU DOING +-0.7782 ARE YOU LISTENING +-0.7782 ARE YOU READY +-0.3010 BACKWARD FIVE METERS +-0.3010 BACKWARD ONE METER +-0.3010 BACKWARD TWO METERS +-0.3010 BYE BYE +-0.3010 CHASE THE +-0.3010 COLOR WINDOW +-0.6021 DISPLAY A COLOR +-0.6021 DISPLAY A GREY +-0.3010 DO YOU UNDERSTAND +-0.3010 EIGHTY DEGREES +-0.3010 FIFTEEN DEGREES +-0.3010 FIND THE +-0.3010 FIVE DEGREES +-0.3010 FIVE METERS +-0.7782 FORTY FIVE +-0.4771 FORTY FIVE DEGREES +-0.3010 FORWARD FIVE METERS +-0.6021 FORWARD ONE HALF +-0.6021 FORWARD ONE METER +-0.3010 FORWARD SEVEN METERS +-0.3010 FORWARD TEN METERS +-0.3010 FORWARD THREE METERS +-0.3010 FORWARD TWO METERS +-0.9031 GO BACKWARD +-0.9031 GO BACKWARD FIVE +-0.9031 GO BACKWARD ONE +-0.9031 GO BACKWARD TWO +-0.3010 GO BACKWARDS +-1.2041 GO FORWARD +-1.2041 GO FORWARD FIVE +-0.9031 GO FORWARD ONE +-1.2041 GO FORWARD SEVEN +-1.2041 GO FORWARD TEN +-1.2041 GO FORWARD THREE +-1.2041 GO FORWARD TWO +-0.3010 GO HOME +-0.6021 GO TO +-0.6021 GO TO THE +-0.3010 GREY WINDOW +-0.3010 GUARD THE +-0.3010 HALF METER +-0.3010 HUNDRED AND EIGHTY +-0.3010 LEFT FORTY FIVE +-0.3010 LEFT MINUS NINETY +-0.3010 LEFT NINETY DEGREES +-0.3010 LEFT ONE EIGHTY +-0.3010 MINUS NINETY DEGREES +-0.3010 MINUS THIRTY DEGREES +-0.3010 NINETY DEGREES +-0.3010 ONE EIGHTY DEGREES +-0.6021 ONE HALF +-0.6021 ONE HALF METER +-0.3010 ONE HUNDRED AND +-0.3010 ONE METER +-0.3010 ONE QUARTER +-0.3010 RIGHT FIFTEEN DEGREES +-0.3010 RIGHT FORTY FIVE +-0.3010 RIGHT MINUS THIRTY +-0.3010 RIGHT ONE HUNDRED +-0.3010 RIGHT TEN DEGREES +-0.7782 ROTATE LEFT FORTY +-0.7782 ROTATE LEFT MINUS +-0.7782 ROTATE LEFT ONE +-0.9031 ROTATE RIGHT FIFTEEN +-0.9031 ROTATE RIGHT MINUS +-0.9031 ROTATE RIGHT ONE +-0.9031 ROTATE RIGHT TEN +-0.3010 SAY BYE BYE +-0.3010 SAY HELLO +-0.3010 SEVEN METERS +-0.3010 TEN DEGREES +-0.3010 TEN METERS +-0.3010 THE LAB +-0.3010 THIRTY DEGREES +-0.3010 THREE METERS +-0.3010 THREE QUARTER +-0.3010 THREE QUARTERS +-0.3010 TO THE LAB +-0.3010 TURN AROUND +-0.6021 TURN LEFT +-0.6021 TURN LEFT NINETY +-0.6021 TURN RIGHT +-0.6021 TURN RIGHT FORTY +-0.3010 TWO METERS +-0.3010 WANDER AROUND +-0.3010 WHAT ARE YOU +-0.3010 YOU ARE LOST +-0.3010 YOU DOING +-0.3010 YOU LISTENING +-0.3010 YOU READY +-0.3010 YOU UNDERSTAND + +\end\ diff --git a/test/unit/test_ngram/turtle.lm.dmp b/test/unit/test_ngram/turtle.lm.dmp new file mode 100644 index 0000000..cef559b Binary files /dev/null and b/test/unit/test_ngram/turtle.lm.dmp differ diff --git a/test/unit/test_ngram/turtle.ug.lm b/test/unit/test_ngram/turtle.ug.lm new file mode 100644 index 0000000..77bb834 --- /dev/null +++ b/test/unit/test_ngram/turtle.ug.lm @@ -0,0 +1,98 @@ +This is an ARPA-format language model file, generated by CMU Sphinx +\data\ +ngram 1=91 + +\1-grams: +-0.9128 +-0.9128 +-2.6030 A +-2.6030 AND +-2.3020 ARE +-2.6030 AROUND +-2.3020 BACKWARD +-2.9042 BACKWARDS +-2.6030 BYE +-2.9042 CENTIMETER +-2.9042 CENTIMETERS +-2.9042 CHASE +-2.9042 COLOR +-1.9499 DEGREES +-2.6030 DISPLAY +-2.9042 DO +-2.9042 DOING +-2.9042 EIGHT +-2.9042 EIGHTEEN +-2.4271 EIGHTY +-2.9042 ELEVEN +-2.9042 EXIT +-2.9042 EXPLORE +-2.6030 FIFTEEN +-2.9042 FIFTY +-2.9042 FIND +-2.9042 FINISH +-2.1259 FIVE +-2.3020 FORTY +-2.0011 FORWARD +-2.9042 FOUR +-2.9042 FOURTEEN +-1.7000 GO +-2.9042 GREY +-2.9042 GUARD +-2.4271 HALF +-2.9042 HALL +-2.9042 HALLWAY +-2.9042 HALT +-2.9042 HELLO +-2.9042 HOME +-2.6030 HUNDRED +-2.9042 KEVIN +-2.6030 LAB +-2.2052 LEFT +-2.9042 LISTENING +-2.9042 LOST +-2.3020 METER +-2.0011 METERS +-2.6030 MINUS +-2.9042 NINE +-2.9042 NINETEEN +-2.4271 NINETY +-2.9042 OFFICE +-2.0011 ONE +-2.9042 PERSON +-2.4271 QUARTER +-2.9042 QUARTERS +-2.9042 QUIT +-2.9042 READY +-2.9042 REID +-2.1259 RIGHT +-2.9042 ROBOMAN +-2.9042 ROOM +-2.0590 ROTATE +-2.6030 SAY +-2.9042 SEBASTIAN +-2.6030 SEVEN +-2.9042 SEVENTEEN +-2.9042 SEVENTY +-2.9042 SIX +-2.9042 SIXTEEN +-2.9042 SIXTY +-2.9042 STOP +-2.4271 TEN +-2.3020 THE +-2.9042 THEN +-2.9042 THIRTEEN +-2.6030 THIRTY +-2.3020 THREE +-2.6030 TO +-2.9042 TOM +-2.2052 TURN +-2.9042 TWELVE +-2.9042 TWENTY +-2.4271 TWO +-2.9042 UNDERSTAND +-2.9042 WANDER +-2.9042 WHAT +-2.6030 WINDOW +-2.2052 YOU + +\end\ diff --git a/test/unit/test_ngram/turtle.ug.lm.dmp b/test/unit/test_ngram/turtle.ug.lm.dmp new file mode 100644 index 0000000..d39a97d Binary files /dev/null and b/test/unit/test_ngram/turtle.ug.lm.dmp differ diff --git a/test/unit/test_lm_read.c b/test/unit/test_ngram_model_read.c similarity index 82% rename from test/unit/test_lm_read.c rename to test/unit/test_ngram_model_read.c index 3955219..5837c2f 100644 --- a/test/unit/test_lm_read.c +++ b/test/unit/test_ngram_model_read.c @@ -2,6 +2,7 @@ #include #include +#include "lm/ngram_model.h" #include "test_macros.h" @@ -10,19 +11,22 @@ main(int argc, char *argv[]) { char const *hyp; ps_decoder_t *ps; - cmd_ln_t *config; + ps_config_t *config; ngram_model_t *lm; FILE *rawfh; int32 score; + (void)argc; + (void)argv; /* First decode it with the crappy WSJ language model. */ TEST_ASSERT(config = - cmd_ln_init(NULL, ps_args(), TRUE, - "-hmm", MODELDIR "/en-us/en-us", - "-lm", MODELDIR "/en-us/en-us.lm.bin", - "-dict", DATADIR "/defective.dic", - "-dictcase", "yes", - "-samprate", "16000", NULL)); + ps_config_parse_json( + NULL, + "hmm: \"" MODELDIR "/en-us/en-us\"," + "lm: \"" MODELDIR "/en-us/en-us.lm.bin\"," + "dict: \"" DATADIR "/defective.dic\"," + "dictcase: true, loglevel: INFO, bestpath: false, fwdflat: false," + "samprate: 16000")); TEST_ASSERT(ps = ps_init(config)); TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); @@ -34,8 +38,8 @@ main(int argc, char *argv[]) /* Now load the turtle language model. */ lm = ngram_model_read(config, DATADIR "/turtle.lm.bin", NGRAM_AUTO, ps_get_logmath(ps)); - ps_set_lm(ps, "turtle", lm); - ps_set_search(ps, "turtle"); + ps_add_lm(ps, "turtle", lm); + ps_activate_search(ps, "turtle"); clearerr(rawfh); fseek(rawfh, 0, SEEK_SET); TEST_ASSERT(ps_decode_raw(ps, rawfh, -1)); @@ -87,7 +91,7 @@ main(int argc, char *argv[]) fclose(rawfh); ps_free(ps); - cmd_ln_free_r(config); + ps_config_free(config); return 0; } diff --git a/test/unit/test_pitch.c b/test/unit/test_pitch.c new file mode 100644 index 0000000..d7893f2 --- /dev/null +++ b/test/unit/test_pitch.c @@ -0,0 +1,57 @@ +#include + +#include "fe/yin.h" +#include "util/ckd_alloc.h" + +#include "test_macros.h" + +int +main(int argc, char *argv[]) +{ + /* This is 11025Hz data (yikes) */ + static const int frame_shift = 110, frame_size = 265; + FILE *raw; + yin_t *pe; + int16 *buf; + size_t nsamp, start; + uint16 period, bestdiff; + int nfr; + + (void)argc; + (void)argv; + /* To make life easier, read the whole thing. */ + TEST_ASSERT(raw = fopen(TESTDATADIR "/chan3.raw", "rb")); + fseek(raw, 0, SEEK_END); + nsamp = ftell(raw) / 2; + buf = ckd_calloc(nsamp, 2); + fseek(raw, 0, SEEK_SET); + TEST_EQUAL(nsamp, fread(buf, 2, nsamp, raw)); + fclose(raw); + + TEST_ASSERT(pe = yin_init(frame_size, 0.1, 0.2, 2)); + yin_start(pe); + nfr = 0; + for (start = 0; start + frame_size < nsamp; start += frame_shift) { + yin_write(pe, buf + start); + if (yin_read(pe, &period, &bestdiff)) { + if (bestdiff < 0.2 * 32768) + printf("%d ", period ? 11025/period : 0); + else + printf("0 "); + ++nfr; + } + } + yin_end(pe); + while (yin_read(pe, &period, &bestdiff)) { + if (bestdiff < 0.2 * 32768) + printf("%d ", period ? 11025/period : 0); + else + printf("0 "); + ++nfr; + } + printf("\n"); + yin_free(pe); + ckd_free(buf); + + return 0; +} diff --git a/test/unit/test_posterior.c b/test/unit/test_posterior.c index f00b8a8..d4e15e8 100644 --- a/test/unit/test_posterior.c +++ b/test/unit/test_posterior.c @@ -140,19 +140,22 @@ main(int argc, char *argv[]) cmd_ln_t *config; int rv; - TEST_ASSERT(config = - cmd_ln_init(NULL, ps_args(), TRUE, - "-hmm", MODELDIR "/en-us/en-us", - "-lm", MODELDIR "/en-us/en-us.lm.bin", - "-dict", MODELDIR "/en-us/cmudict-en-us.dict", - "-fwdtree", "yes", - "-fwdflat", "no", - "-bestpath", "yes", - "-samprate", "16000", NULL)); + (void)argc; + (void)argv; + TEST_ASSERT(config = + ps_config_parse_json( + NULL, + "hmm: \"" MODELDIR "/en-us/en-us\"," + "lm: \"" MODELDIR "/en-us/en-us.lm.bin\"," + "dict: \"" MODELDIR "/en-us/cmudict-en-us.dict\"," + "fwdtree: true," + "fwdflat: false," + "bestpath: true," + "samprate: 16000")); TEST_ASSERT(ps = ps_init(config)); rv = test_decode(ps); ps_free(ps); - cmd_ln_free_r(config); + ps_config_free(config); return rv; } diff --git a/test/unit/test_ps.c b/test/unit/test_ps.c index f655b64..6ee2763 100644 --- a/test/unit/test_ps.c +++ b/test/unit/test_ps.c @@ -11,6 +11,7 @@ ps_decoder_test(cmd_ln_t *config, char const *sname, char const *expected) { ps_decoder_t *ps; mfcc_t **cepbuf; + float32 **floatbuf; FILE *rawfh; int16 *buf; int16 const *bptr; @@ -20,8 +21,12 @@ ps_decoder_test(cmd_ln_t *config, char const *sname, char const *expected) char const *hyp; double n_speech, n_cpu, n_wall; ps_seg_t *seg; + char *prev_cmn; TEST_ASSERT(ps = ps_init(config)); + prev_cmn = ckd_salloc(ps_get_cmn(ps, FALSE)); + printf("CMN: %s\n", prev_cmn); + err_set_loglevel(ERR_INFO); /* Test it first with pocketsphinx_decode_raw() */ TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); ps_decode_raw(ps, rawfh, -1); @@ -35,18 +40,31 @@ ps_decoder_test(cmd_ln_t *config, char const *sname, char const *expected) n_speech, n_cpu, n_wall); printf("%.2f xRT (CPU), %.2f xRT (elapsed)\n", n_cpu / n_speech, n_wall / n_speech); + TEST_ASSERT(0 != strcmp(prev_cmn, ps_get_cmn(ps, FALSE))); + ckd_free(prev_cmn); + prev_cmn = ckd_salloc(ps_get_cmn(ps, FALSE)); + printf("CMN: %s\n", prev_cmn); /* Test it with ps_process_raw() */ clearerr(rawfh); fseek(rawfh, 0, SEEK_END); nsamps = ftell(rawfh) / sizeof(*buf); fseek(rawfh, 0, SEEK_SET); + ps_start_stream(ps); TEST_EQUAL(0, ps_start_utt(ps)); nsamps = 2048; buf = ckd_calloc(nsamps, sizeof(*buf)); + i = 0; while (!feof(rawfh)) { nread = fread(buf, sizeof(*buf), nsamps, rawfh); ps_process_raw(ps, buf, nread, FALSE, FALSE); + if (i++ == 1) { + /* Test updating CMN while decoding */ + TEST_ASSERT(0 != strcmp(prev_cmn, ps_get_cmn(ps, TRUE))); + ckd_free(prev_cmn); + prev_cmn = ckd_salloc(ps_get_cmn(ps, FALSE)); + printf("CMN: %s\n", prev_cmn); + } } TEST_EQUAL(0, ps_end_utt(ps)); hyp = ps_get_hyp(ps, &score); @@ -60,24 +78,41 @@ ps_decoder_test(cmd_ln_t *config, char const *sname, char const *expected) n_cpu / n_speech, n_wall / n_speech); /* Now read the whole file and produce an MFCC buffer. */ + ps_start_stream(ps); clearerr(rawfh); fseek(rawfh, 0, SEEK_END); nsamps = ftell(rawfh) / sizeof(*buf); fseek(rawfh, 0, SEEK_SET); bptr = buf = ckd_realloc(buf, nsamps * sizeof(*buf)); TEST_EQUAL(nsamps, fread(buf, sizeof(*buf), nsamps, rawfh)); - fe_process_frames(ps->acmod->fe, &bptr, &nsamps, NULL, &nfr, NULL); + fe_process_frames(ps->acmod->fe, &bptr, &nsamps, NULL, &nfr); cepbuf = ckd_calloc_2d(nfr + 1, fe_get_output_size(ps->acmod->fe), sizeof(**cepbuf)); fe_start_utt(ps->acmod->fe); - fe_process_frames(ps->acmod->fe, &bptr, &nsamps, cepbuf, &nfr, NULL); + fe_process_frames(ps->acmod->fe, &bptr, &nsamps, cepbuf, &nfr); fe_end_utt(ps->acmod->fe, cepbuf[nfr], &i); /* Decode it with process_cep() */ +#ifdef FIXED_POINT + floatbuf = ckd_calloc_2d(nfr + 1, + fe_get_output_size(ps->acmod->fe), + sizeof(**floatbuf)); + fe_mfcc_to_float(ps->acmod->fe, cepbuf, floatbuf, nfr + 1); +#else + floatbuf = cepbuf; +#endif + TEST_EQUAL(0, ps_start_utt(ps)); for (i = 0; i < nfr; ++i) { - ps_process_cep(ps, cepbuf + i, 1, FALSE, FALSE); + ps_process_cep(ps, floatbuf + i, 1, FALSE, FALSE); + if (i == nfr - 5) { + /* Test updating CMN while decoding */ + TEST_ASSERT(0 != strcmp(prev_cmn, ps_get_cmn(ps, TRUE))); + ckd_free(prev_cmn); + prev_cmn = ckd_salloc(ps_get_cmn(ps, FALSE)); + printf("CMN: %s\n", prev_cmn); + } } TEST_EQUAL(0, ps_end_utt(ps)); hyp = ps_get_hyp(ps, &score); @@ -108,12 +143,20 @@ ps_decoder_test(cmd_ln_t *config, char const *sname, char const *expected) n_speech, n_cpu, n_wall); printf("TOTAL: %.2f xRT (CPU), %.2f xRT (elapsed)\n", n_cpu / n_speech, n_wall / n_speech); + TEST_ASSERT(0 != strcmp(prev_cmn, ps_get_cmn(ps, FALSE))); + ckd_free(prev_cmn); + prev_cmn = ckd_salloc(ps_get_cmn(ps, FALSE)); + printf("CMN: %s\n", prev_cmn); fclose(rawfh); ps_free(ps); - cmd_ln_free_r(config); + ps_config_free(config); +#ifdef FIXED_POINT + ckd_free_2d(floatbuf); +#endif ckd_free_2d(cepbuf); ckd_free(buf); + ckd_free(prev_cmn); return 0; } diff --git a/test/unit/test_ptm_mgau.c b/test/unit/test_ptm_mgau.c index 6a2981d..8023bb9 100644 --- a/test/unit/test_ptm_mgau.c +++ b/test/unit/test_ptm_mgau.c @@ -88,37 +88,37 @@ main(int argc, char *argv[]) ptm_mgau_t *s; int i, lastcb; + (void)argc; + (void)argv; lmath = logmath_init(1.0001, 0, 0); - config = cmd_ln_init(NULL, ps_args(), TRUE, - "-compallsen", "yes", - NULL); + config = ps_config_init(NULL); + ps_config_set_bool(config, "compallsen", TRUE); cmd_ln_parse_file_r(config, ps_args(), MODELDIR "/en-us/en-us/feat.params", FALSE); - cmd_ln_set_str_extra_r(config, "_mdef", MODELDIR "/en-us/en-us/mdef"); - cmd_ln_set_str_extra_r(config, "_mean", MODELDIR "/en-us/en-us/means"); - cmd_ln_set_str_extra_r(config, "_var", MODELDIR "/en-us/en-us/variances"); - cmd_ln_set_str_extra_r(config, "_tmat", MODELDIR "/en-us/en-us/transition_matrices"); - cmd_ln_set_str_extra_r(config, "_sendump", MODELDIR "/en-us/en-us/sendump"); - cmd_ln_set_str_extra_r(config, "_mixw", NULL); - cmd_ln_set_str_extra_r(config, "_lda", NULL); - cmd_ln_set_str_extra_r(config, "_senmgau", NULL); + cmd_ln_set_str_extra_r(config, "mdef", MODELDIR "/en-us/en-us/mdef"); + cmd_ln_set_str_extra_r(config, "mean", MODELDIR "/en-us/en-us/means"); + cmd_ln_set_str_extra_r(config, "var", MODELDIR "/en-us/en-us/variances"); + cmd_ln_set_str_extra_r(config, "tmat", MODELDIR "/en-us/en-us/transition_matrices"); + cmd_ln_set_str_extra_r(config, "sendump", MODELDIR "/en-us/en-us/sendump"); + cmd_ln_set_str_extra_r(config, "mixw", NULL); + cmd_ln_set_str_extra_r(config, "lda", NULL); + cmd_ln_set_str_extra_r(config, "senmgau", NULL); - err_set_debug_level(3); TEST_ASSERT(config); TEST_ASSERT((acmod = acmod_init(config, lmath, NULL, NULL))); TEST_ASSERT((ps = acmod->mgau)); TEST_EQUAL(0, strcmp(ps->vt->name, "ptm")); s = (ptm_mgau_t *)ps; - E_DEBUG(2,("PTM model loaded: %d codebooks, %d senones, %d frames of history\n", - s->g->n_mgau, s->n_sen, s->n_fast_hist)); - E_DEBUG(2,("Senone to codebook mappings:\n")); + E_DEBUG("PTM model loaded: %d codebooks, %d senones, %d frames of history\n", + s->g->n_mgau, s->n_sen, s->n_fast_hist); + E_DEBUG("Senone to codebook mappings:\n"); lastcb = s->sen2cb[0]; - E_DEBUG(2,("\t%d: 0", lastcb)); + E_DEBUG("\t%d: 0", lastcb); for (i = 0; i < s->n_sen; ++i) { if (s->sen2cb[i] != lastcb) { lastcb = s->sen2cb[i]; - E_DEBUGCONT(2,("-%d\n", i-1)); - E_DEBUGCONT(2,("\t%d: %d", lastcb, i)); + E_DEBUG("-%d\n", i-1); + E_DEBUG("\t%d: %d", lastcb, i); } } E_INFOCONT("-%d\n", i-1); @@ -127,12 +127,12 @@ main(int argc, char *argv[]) #if 0 /* Replace it with ms_mgau. */ ptm_mgau_free(ps); - cmd_ln_set_str_r(config, + ps_config_set_str(config, "-mixw", MODELDIR "/en-us/en-us/mixture_weights"); TEST_ASSERT((acmod->mgau = ms_mgau_init(acmod, lmath, acmod->mdef))); run_acmod_test(acmod); - cmd_ln_free_r(config); + ps_config_free(config); #endif return 0; diff --git a/test/unit/test_reinit.c b/test/unit/test_reinit.c index 9244ea3..d1c5fb7 100644 --- a/test/unit/test_reinit.c +++ b/test/unit/test_reinit.c @@ -1,6 +1,7 @@ #include #include #include +#include "util/ckd_alloc.h" #include "test_macros.h" @@ -8,32 +9,49 @@ int main(int argc, char *argv[]) { ps_decoder_t *ps; - cmd_ln_t *config; + ps_config_t *config; + char *pron; + (void)argc; + (void)argv; TEST_ASSERT(config = - cmd_ln_init(NULL, ps_args(), TRUE, - "-hmm", DATADIR "/tidigits/hmm", - "-dict", DATADIR "/tidigits/lm/tidigits.dic", - NULL)); + ps_config_parse_json( + NULL, "hmm: \"" DATADIR "/tidigits/hmm\"," + "dict: \"" DATADIR "/tidigits/lm/tidigits.dic\"")); TEST_ASSERT(ps = ps_init(config)); - cmd_ln_free_r(config); + ps_config_free(config); TEST_ASSERT(config = - cmd_ln_init(NULL, ps_args(), TRUE, - "-hmm", MODELDIR "/en-us/en-us", - "-dict", MODELDIR "/en-us/cmudict-en-us.dict", - NULL)); + ps_config_parse_json( + NULL, "hmm: \"" MODELDIR "/en-us/en-us\"," + "dict: \"" MODELDIR "/en-us/cmudict-en-us.dict\"")); TEST_EQUAL(0, ps_reinit(ps, config)); /* Reinit when adding words */ ps_add_word(ps, "foobie", "F UW B IY", FALSE); ps_add_word(ps, "hellosomething", "HH EH L OW S", TRUE); + /* Reinit features only, words should remain */ + ps_config_set_str(config, "cmninit", "41,-4,1"); + TEST_EQUAL(0, ps_reinit_feat(ps, config)); + TEST_EQUAL(0, strcmp(ps_config_str(ps_get_config(ps), "cmninit"), + "41,-4,1")); + pron = ps_lookup_word(ps, "foobie"); + TEST_ASSERT(pron != NULL); + TEST_EQUAL(0, strcmp(pron, "F UW B IY")); + ckd_free(pron); + /* Reinit with existing config */ ps_reinit(ps, NULL); + /* Words added above are gone, we expect that. */ + pron = ps_lookup_word(ps, "foobie"); + TEST_ASSERT(pron == NULL); + /* Hooray! -cmninit isn't in feat.params anymore, so yes! */ + TEST_EQUAL(0, strcmp(ps_config_str(ps_get_config(ps), "cmninit"), + "41,-4,1")); ps_free(ps); - cmd_ln_free_r(config); + ps_config_free(config); return 0; } diff --git a/test/unit/test_senfh.c b/test/unit/test_senfh.c index 664fe9b..57051ac 100644 --- a/test/unit/test_senfh.c +++ b/test/unit/test_senfh.c @@ -15,15 +15,18 @@ main(int argc, char *argv[]) acmod_t *acmod; ngram_search_t *ngs; + (void)argc; + (void)argv; TEST_ASSERT(config = - cmd_ln_init(NULL, ps_args(), TRUE, - "-hmm", MODELDIR "/en-us/en-us", - "-lm", MODELDIR "/en-us/en-us.lm.bin", - "-dict", MODELDIR "/en-us/cmudict-en-us.dict", - "-fwdtree", "yes", - "-fwdflat", "no", - "-bestpath", "no", - "-samprate", "16000", NULL)); + ps_config_parse_json( + NULL, + "hmm: \"" MODELDIR "/en-us/en-us\"," + "lm: \"" MODELDIR "/en-us/en-us.lm.bin\"," + "dict: \"" MODELDIR "/en-us/cmudict-en-us.dict\"," + "fwdtree: true," + "fwdflat: false," + "bestpath: false," + "samprate: 16000")); TEST_ASSERT(ps = ps_init(config)); ngs = (ngram_search_t *)ps->search; @@ -84,7 +87,7 @@ main(int argc, char *argv[]) fclose(senfh); } ps_free(ps); - cmd_ln_free_r(config); + ps_config_free(config); return 0; } diff --git a/test/unit/test_set_search.c b/test/unit/test_set_search.c index ab17c0f..c0498f5 100644 --- a/test/unit/test_set_search.c +++ b/test/unit/test_set_search.c @@ -1,16 +1,18 @@ -#include +#include "lm/jsgf.h" #include -#include +#include "pocketsphinx_internal.h" +#include "lm/ngram_model.h" #include "test_macros.h" -static cmd_ln_t * +static ps_config_t * default_config() { - return cmd_ln_init(NULL, ps_args(), TRUE, - "-hmm", MODELDIR "/en-us/en-us", - "-dict", MODELDIR "/en-us/cmudict-en-us.dict", NULL); + ps_config_t *config = ps_config_init(NULL); + ps_config_set_str(config, "hmm", MODELDIR "/en-us/en-us"); + ps_config_set_str(config, "dict", MODELDIR "/en-us/cmudict-en-us.dict"); + return config; } static void @@ -18,66 +20,77 @@ test_no_search() { cmd_ln_t *config = default_config(); ps_decoder_t *ps = ps_init(config); + /* Expect failure and error message here */ TEST_ASSERT(ps_start_utt(ps) < 0); ps_free(ps); - cmd_ln_free_r(config); + ps_config_free(config); } static void test_default_fsg() { - cmd_ln_t *config = default_config(); - cmd_ln_set_str_r(config, "-hmm", DATADIR "/tidigits/hmm"); - cmd_ln_set_str_r(config, "-dict", DATADIR "/tidigits/lm/tidigits.dic"); - cmd_ln_set_str_r(config, "-fsg", DATADIR "/tidigits/lm/tidigits.fsg"); + cmd_ln_t *config = ps_config_init(NULL); + ps_config_set_str(config, "hmm", DATADIR "/tidigits/hmm"); + ps_config_set_str(config, "dict", DATADIR "/tidigits/lm/tidigits.dic"); + ps_config_set_str(config, "fsg", DATADIR "/tidigits/lm/tidigits.fsg"); ps_decoder_t *ps = ps_init(config); TEST_ASSERT(!ps_get_lm(ps, PS_DEFAULT_SEARCH)); TEST_ASSERT(ps_get_fsg(ps, PS_DEFAULT_SEARCH)); + TEST_EQUAL(ps_get_fsg(ps, PS_DEFAULT_SEARCH), + ps_get_fsg(ps, NULL)); ps_free(ps); - cmd_ln_free_r(config); + ps_config_free(config); } static void test_default_jsgf() { cmd_ln_t *config = default_config(); - cmd_ln_set_str_r(config, "-jsgf", DATADIR "/goforward.gram"); + ps_config_set_str(config, "jsgf", DATADIR "/goforward.gram"); ps_decoder_t *ps = ps_init(config); TEST_ASSERT(!ps_get_lm(ps, PS_DEFAULT_SEARCH)); TEST_ASSERT(ps_get_fsg(ps, PS_DEFAULT_SEARCH)); + TEST_EQUAL(ps_get_fsg(ps, PS_DEFAULT_SEARCH), + ps_get_fsg(ps, NULL)); ps_free(ps); - cmd_ln_free_r(config); + ps_config_free(config); } static void test_default_lm() { cmd_ln_t *config = default_config(); - cmd_ln_set_str_r(config, "-lm", MODELDIR "/en-us/en-us.lm.bin"); + ps_config_set_str(config, "lm", MODELDIR "/en-us/en-us.lm.bin"); ps_decoder_t *ps = ps_init(config); TEST_ASSERT(!ps_get_fsg(ps, PS_DEFAULT_SEARCH)); TEST_ASSERT(ps_get_lm(ps, PS_DEFAULT_SEARCH)); + TEST_EQUAL(ps_get_lm(ps, PS_DEFAULT_SEARCH), + ps_get_lm(ps, NULL)); ps_free(ps); - cmd_ln_free_r(config); + ps_config_free(config); } static void test_default_lmctl() { cmd_ln_t *config = default_config(); - cmd_ln_set_str_r(config, "-lmctl", DATADIR "/test.lmctl"); - cmd_ln_set_str_r(config, "-lmname", "tidigits"); + ps_config_set_str(config, "lmctl", DATADIR "/test.lmctl"); + ps_config_set_str(config, "lmname", "tidigits"); ps_decoder_t *ps = ps_init(config); TEST_ASSERT(ps_get_lm(ps, "tidigits")); TEST_ASSERT(ps_get_lm(ps, "turtle")); - TEST_ASSERT(!ps_set_search(ps, "turtle")); - TEST_ASSERT(!ps_set_search(ps, "tidigits")); + TEST_ASSERT(!ps_activate_search(ps, "turtle")); + TEST_EQUAL(ps_get_lm(ps, "turtle"), + ps_get_lm(ps, NULL)); + TEST_ASSERT(!ps_activate_search(ps, "tidigits")); + TEST_EQUAL(ps_get_lm(ps, "tidigits"), + ps_get_lm(ps, NULL)); ps_free(ps); - cmd_ln_free_r(config); + ps_config_free(config); } static void -test_set_search() +test_activate_search() { cmd_ln_t *config = default_config(); ps_decoder_t *ps = ps_init(config); @@ -86,23 +99,29 @@ test_set_search() jsgf_t *jsgf = jsgf_parse_file(DATADIR "/goforward.gram", NULL); fsg_model_t *fsg = jsgf_build_fsg(jsgf, jsgf_get_rule(jsgf, "goforward.move"), - ps->lmath, cmd_ln_int32_r(config, "-lw")); - TEST_ASSERT(!ps_set_fsg(ps, "goforward", fsg)); + ps->lmath, ps_config_int(config, "lw")); + TEST_ASSERT(!ps_add_fsg(ps, "goforward", fsg)); fsg_model_free(fsg); jsgf_grammar_free(jsgf); - TEST_ASSERT(!ps_set_jsgf_file(ps, "goforward_other", DATADIR "/goforward.gram")); + TEST_ASSERT(!ps_add_jsgf_file(ps, "goforward_other", DATADIR "/goforward.gram")); // Second time - TEST_ASSERT(!ps_set_jsgf_file(ps, "goforward_other", DATADIR "/goforward.gram")); + TEST_ASSERT(!ps_add_jsgf_file(ps, "goforward_other", DATADIR "/goforward.gram")); ngram_model_t *lm = ngram_model_read(config, DATADIR "/tidigits/lm/tidigits.lm.bin", NGRAM_AUTO, ps->lmath); - TEST_ASSERT(!ps_set_lm(ps, "tidigits", lm)); + TEST_ASSERT(!ps_add_lm(ps, "tidigits", lm)); ngram_model_free(lm); - TEST_ASSERT(!ps_set_search(ps, "tidigits")); + TEST_ASSERT(!ps_activate_search(ps, "tidigits")); + TEST_EQUAL(ps_get_lm(ps, "tidigits"), + ps_get_lm(ps, NULL)); + TEST_EQUAL(0, strcmp("tidigits", ps_current_search(ps))); - TEST_ASSERT(!ps_set_search(ps, "goforward")); + TEST_ASSERT(!ps_activate_search(ps, "goforward")); + TEST_EQUAL(ps_get_fsg(ps, "goforward"), + ps_get_fsg(ps, NULL)); + TEST_EQUAL(0, strcmp("goforward", ps_current_search(ps))); itor = ps_search_iter(ps); TEST_EQUAL(0, strcmp("goforward_other", ps_search_iter_val(itor))); @@ -114,11 +133,19 @@ test_set_search() TEST_EQUAL(0, strcmp("_default_pl", ps_search_iter_val(itor))); itor = ps_search_iter_next(itor); TEST_EQUAL(NULL, itor); + + TEST_EQUAL(0, ps_remove_search(ps, "goforward")); + TEST_EQUAL(ps_get_fsg(ps, "goforward"), NULL); + TEST_EQUAL(ps_current_search(ps), NULL); + TEST_ASSERT(!ps_activate_search(ps, "tidigits")); + TEST_EQUAL(0, strcmp("tidigits", ps_current_search(ps))); + TEST_EQUAL(0, ps_remove_search(ps, "goforward_other")); + TEST_EQUAL(0, strcmp("tidigits", ps_current_search(ps))); TEST_ASSERT(!ps_start_utt(ps)); TEST_ASSERT(!ps_end_utt(ps)); ps_free(ps); - cmd_ln_free_r(config); + ps_config_free(config); } static void @@ -127,33 +154,38 @@ test_check_mode() cmd_ln_t *config = default_config(); ps_decoder_t *ps = ps_init(config); - TEST_ASSERT(!ps_set_jsgf_file(ps, "goforward", DATADIR "/goforward.gram")); + TEST_ASSERT(!ps_add_jsgf_file(ps, "goforward", DATADIR "/goforward.gram")); ngram_model_t *lm = ngram_model_read(config, DATADIR "/tidigits/lm/tidigits.lm.bin", NGRAM_AUTO, ps->lmath); - TEST_ASSERT(!ps_set_lm(ps, "tidigits", lm)); + TEST_ASSERT(!ps_add_lm(ps, "tidigits", lm)); ngram_model_free(lm); - TEST_ASSERT(!ps_set_search(ps, "tidigits")); + TEST_ASSERT(!ps_activate_search(ps, "tidigits")); + TEST_EQUAL(ps_get_lm(ps, "tidigits"), + ps_get_lm(ps, NULL)); + TEST_EQUAL(0, strcmp("tidigits", ps_current_search(ps))); ps_start_utt(ps); - TEST_EQUAL(-1, ps_set_search(ps, "tidigits")); - TEST_EQUAL(-1, ps_set_search(ps, "goforward")); + TEST_EQUAL(-1, ps_activate_search(ps, "tidigits")); + TEST_EQUAL(-1, ps_activate_search(ps, "goforward")); ps_end_utt(ps); ps_free(ps); - cmd_ln_free_r(config); + ps_config_free(config); } int main(int argc, char* argv[]) { + (void)argc; + (void)argv; test_no_search(); test_default_fsg(); test_default_jsgf(); test_default_lm(); test_default_lmctl(); - test_set_search(); + test_activate_search(); test_check_mode(); return 0; diff --git a/test/unit/test_simple.c b/test/unit/test_simple.c index e75d0a1..e9eb88f 100644 --- a/test/unit/test_simple.c +++ b/test/unit/test_simple.c @@ -11,16 +11,18 @@ main(int argc, char *argv[]) { cmd_ln_t *config; + (void)argc; + (void)argv; TEST_ASSERT(config = - cmd_ln_init(NULL, ps_args(), TRUE, - "-hmm", MODELDIR "/en-us/en-us", - "-lm", MODELDIR "/en-us/en-us.lm.bin", - "-dict", MODELDIR "/en-us/cmudict-en-us.dict", - "-fwdtree", "yes", - "-fwdflat", "yes", - "-bestpath", "yes", - "-mfclogdir", ".", - "-rawlogdir", ".", - "-samprate", "16000", NULL)); + ps_config_parse_json( + NULL, + "hmm: \"" MODELDIR "/en-us/en-us\"," + "lm: \"" MODELDIR "/en-us/en-us.lm.bin\"," + "dict: \"" MODELDIR "/en-us/cmudict-en-us.dict\"," + "fwdtree: true," + "fwdflat: true," + "bestpath: true," + "mfclogdir: \".\", rawlogdir: \".\"," + "samprate: 16000")); return ps_decoder_test(config, "BESTPATH", "go forward ten meters"); } diff --git a/test/unit/test_state_align.c b/test/unit/test_state_align.c index 5a77bda..c68f272 100644 --- a/test/unit/test_state_align.c +++ b/test/unit/test_state_align.c @@ -1,6 +1,8 @@ + +/* -*- c-basic-offset: 4 -*- */ #include -#include "ps_alignment.h" +#include "ps_alignment_internal.h" #include "state_align_search.h" #include "pocketsphinx_internal.h" @@ -33,7 +35,6 @@ do_search(ps_search_t *search, acmod_t *acmod) return ps_search_finish(search); } - int main(int argc, char *argv[]) { @@ -47,22 +48,26 @@ main(int argc, char *argv[]) cmd_ln_t *config; int i; - config = cmd_ln_init(NULL, ps_args(), FALSE, - "-hmm", MODELDIR "/en-us/en-us", - "-dict", MODELDIR "/en-us/cmudict-en-us.dict", - "-samprate", "16000", NULL); + (void)argc; + (void)argv; + TEST_ASSERT(config = + ps_config_parse_json( + NULL, + "hmm: \"" MODELDIR "/en-us/en-us\"," + "dict: \"" MODELDIR "/en-us/cmudict-en-us.dict\"," + "samprate: 16000")); TEST_ASSERT(ps = ps_init(config)); dict = ps->dict; d2p = ps->d2p; acmod = ps->acmod; al = ps_alignment_init(d2p); - TEST_EQUAL(1, ps_alignment_add_word(al, dict_wordid(dict, ""), 0)); - TEST_EQUAL(2, ps_alignment_add_word(al, dict_wordid(dict, "go"), 0)); - TEST_EQUAL(3, ps_alignment_add_word(al, dict_wordid(dict, "forward"), 0)); - TEST_EQUAL(4, ps_alignment_add_word(al, dict_wordid(dict, "ten"), 0)); - TEST_EQUAL(5, ps_alignment_add_word(al, dict_wordid(dict, "meters"), 0)); - TEST_EQUAL(6, ps_alignment_add_word(al, dict_wordid(dict, ""), 0)); + TEST_EQUAL(1, ps_alignment_add_word(al, dict_wordid(dict, ""), 0, 0)); + TEST_EQUAL(2, ps_alignment_add_word(al, dict_wordid(dict, "go"), 0, 0)); + TEST_EQUAL(3, ps_alignment_add_word(al, dict_wordid(dict, "forward"), 0, 0)); + TEST_EQUAL(4, ps_alignment_add_word(al, dict_wordid(dict, "ten"), 0, 0)); + TEST_EQUAL(5, ps_alignment_add_word(al, dict_wordid(dict, "meters"), 0, 0)); + TEST_EQUAL(6, ps_alignment_add_word(al, dict_wordid(dict, ""), 0, 0)); TEST_EQUAL(0, ps_alignment_populate(al)); TEST_ASSERT(search = state_align_search_init("state_align", config, acmod, al)); @@ -70,47 +75,38 @@ main(int argc, char *argv[]) for (i = 0; i < 5; i++) do_search(search, acmod); + for (itor = ps_alignment_words(al); itor; + itor = ps_alignment_iter_next(itor)) { + ps_alignment_entry_t *ent = ps_alignment_iter_get(itor); + + printf("%s %d %d\n", + dict_wordstr(dict, ent->id.wid), + ent->start, ent->duration); + } itor = ps_alignment_words(al); TEST_EQUAL(ps_alignment_iter_get(itor)->start, 0); - TEST_EQUAL(ps_alignment_iter_get(itor)->duration, 8); + TEST_EQUAL(ps_alignment_iter_get(itor)->duration, 46); itor = ps_alignment_iter_next(itor); - TEST_EQUAL(ps_alignment_iter_get(itor)->start, 8); + TEST_EQUAL(ps_alignment_iter_get(itor)->start, 46); TEST_EQUAL(ps_alignment_iter_get(itor)->duration, 18); itor = ps_alignment_iter_next(itor); - TEST_EQUAL(ps_alignment_iter_get(itor)->start, 26); + TEST_EQUAL(ps_alignment_iter_get(itor)->start, 64); TEST_EQUAL(ps_alignment_iter_get(itor)->duration, 53); itor = ps_alignment_iter_next(itor); - TEST_EQUAL(ps_alignment_iter_get(itor)->start, 79); + TEST_EQUAL(ps_alignment_iter_get(itor)->start, 117); TEST_EQUAL(ps_alignment_iter_get(itor)->duration, 36); itor = ps_alignment_iter_next(itor); - TEST_EQUAL(ps_alignment_iter_get(itor)->start, 115); + TEST_EQUAL(ps_alignment_iter_get(itor)->start, 153); TEST_EQUAL(ps_alignment_iter_get(itor)->duration, 59); itor = ps_alignment_iter_next(itor); - TEST_EQUAL(ps_alignment_iter_get(itor)->start, 174); - TEST_EQUAL(ps_alignment_iter_get(itor)->duration, 49); + TEST_EQUAL(ps_alignment_iter_get(itor)->start, 212); + TEST_EQUAL(ps_alignment_iter_get(itor)->duration, 62); itor = ps_alignment_iter_next(itor); TEST_EQUAL(itor, NULL); ps_search_free(search); ps_alignment_free(al); - - /* Test bad alignment */ - - al = ps_alignment_init(d2p); - TEST_EQUAL(1, ps_alignment_add_word(al, dict_wordid(dict, ""), 0)); - for (i = 0; i < 20; i++) { - TEST_EQUAL(i + 2, ps_alignment_add_word(al, dict_wordid(dict, "hello"), 0)); - } - TEST_EQUAL(22, ps_alignment_add_word(al, dict_wordid(dict, ""), 0)); - TEST_EQUAL(0, ps_alignment_populate(al)); - TEST_ASSERT(search = state_align_search_init("state_align", config, acmod, al)); - E_INFO("Error here is expected, testing bad alignment\n"); - TEST_EQUAL(-1, do_search(search, acmod)); - - ps_search_free(search); - ps_alignment_free(al); - ps_free(ps); - cmd_ln_free_r(config); + ps_config_free(config); return 0; } diff --git a/test/unit/test_string/CMakeLists.txt b/test/unit/test_string/CMakeLists.txt new file mode 100644 index 0000000..4a3c8cb --- /dev/null +++ b/test/unit/test_string/CMakeLists.txt @@ -0,0 +1,34 @@ +set(TEST_EXECUTABLES + strtest + test_atof + ) +foreach(TEST_EXECUTABLE ${TEST_EXECUTABLES}) + add_executable(${TEST_EXECUTABLE} EXCLUDE_FROM_ALL ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR}/test/unit + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) + set_property(TARGET ${TEST_EXECUTABLE} + PROPERTY COMPILE_DEFINITIONS FILEDIR="${CMAKE_CURRENT_SOURCE_DIR}") + add_dependencies(check ${TEST_EXECUTABLE}) +endforeach() +set(TESTS + _fread_line.test + _nextword.test + _str2words.test + _string_join.test + _string_trim.test + test_atof +) +foreach(TEST ${TESTS}) + if(${TEST} MATCHES "\.(test|sh)$") + add_test(NAME ${TEST} COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/${TEST} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + else() + add_test(NAME ${TEST} COMMAND ${TEST}) + endif() + set_property(TEST ${TEST} PROPERTY ENVIRONMENT CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}) +endforeach() diff --git a/test/unit/test_string/_fread_line.test b/test/unit/test_string/_fread_line.test new file mode 100755 index 0000000..0a2939f --- /dev/null +++ b/test/unit/test_string/_fread_line.test @@ -0,0 +1,2 @@ +#!/bin/bash +exec ./strtest fread_line diff --git a/test/unit/test_string/_fread_line.txt b/test/unit/test_string/_fread_line.txt new file mode 100644 index 0000000..e00c129 --- /dev/null +++ b/test/unit/test_string/_fread_line.txt @@ -0,0 +1,3 @@ +Hello world! +123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 +All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. diff --git a/test/unit/test_string/_nextword.test b/test/unit/test_string/_nextword.test new file mode 100755 index 0000000..beb8658 --- /dev/null +++ b/test/unit/test_string/_nextword.test @@ -0,0 +1,2 @@ +#!/bin/bash +exec ./strtest nextword diff --git a/test/unit/test_string/_str2words.test b/test/unit/test_string/_str2words.test new file mode 100755 index 0000000..7c7a1bb --- /dev/null +++ b/test/unit/test_string/_str2words.test @@ -0,0 +1,2 @@ +#!/bin/bash +exec ./strtest str2words diff --git a/test/unit/test_string/_string_join.test b/test/unit/test_string/_string_join.test new file mode 100755 index 0000000..cbec32f --- /dev/null +++ b/test/unit/test_string/_string_join.test @@ -0,0 +1,2 @@ +#!/bin/bash +exec ./strtest string_join diff --git a/test/unit/test_string/_string_trim.test b/test/unit/test_string/_string_trim.test new file mode 100755 index 0000000..060c1c2 --- /dev/null +++ b/test/unit/test_string/_string_trim.test @@ -0,0 +1,2 @@ +#!/bin/bash +exec ./strtest string_trim diff --git a/test/unit/test_string/strtest.c b/test/unit/test_string/strtest.c new file mode 100644 index 0000000..c286b5a --- /dev/null +++ b/test/unit/test_string/strtest.c @@ -0,0 +1,191 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +#include +#include + +#include "util/strfuncs.h" +#include "util/pio.h" +#include "util/ckd_alloc.h" + +int +main(int argc, char *argv[]) +{ + if (argc < 2) + return 1; + + if (!strcmp(argv[1], "string_join")) { + char *foo = string_join("bar", "baz", "quux", NULL); + if (strcmp(foo, "barbazquux") != 0) { + printf("%s != barbazquux\n", foo); + return 1; + } + foo = string_join("hello", NULL); + if (strcmp(foo, "hello") != 0) { + printf("%s != hello\n", foo); + return 1; + } + return 0; + } + else if (!strcmp(argv[1], "fread_line")) { + FILE *fp = fopen(FILEDIR "/_fread_line.txt", "r"); + char *line; + size_t len; + + if (fp == NULL) { + perror("Failed to open " FILEDIR "/_fread_line.txt"); + return 1; + } + line = fread_line(fp, &len); + printf("len = %zd orig = %zd\n", len, + strlen("Hello world!\n")); + if (strcmp(line, "Hello world!\n") != 0) { + printf("'%s' != 'Hello world!\\n'\n", line); + return 1; + } + ckd_free(line); + line = fread_line(fp, &len); + /* A line of exactly 127 characters. */ + printf("len = %zd orig = %zd\n", len, + strlen("123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456\n")); + if (strcmp(line, "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456\n") != 0) { + printf("'%s' != '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456\\n'\n", line); + return 1; + } + ckd_free(line); + /* A very long line. */ + line = fread_line(fp, &len); + printf("len = %zd orig = %zd\n", len, + strlen("All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. \n")); + if (strcmp(line, "All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. \n") != 0) { + printf("'%s' != 'All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. All work and no play makes Jack a very dull boy. \\n'\n", line); + return 1; + } + ckd_free(line); + line = fread_line(fp, &len); + if (line != NULL) { + printf("%p != NULL\n", line); + return 1; + } + } + else if (!strcmp(argv[1], "string_trim")) { + char *foo = ckd_salloc("\t foo bar baz \n"); + string_trim(foo, STRING_BOTH); + if (strcmp(foo, "foo bar baz") != 0) { + printf("'%s' != 'foo bar baz'\n", foo); + return 1; + } + string_trim(foo, STRING_BOTH); + if (strcmp(foo, "foo bar baz") != 0) { + printf("'%s' != 'foo bar baz'\n", foo); + return 1; + } + strcpy(foo, "foo\nbar\n\n"); + string_trim(foo, STRING_END); + if (strcmp(foo, "foo\nbar") != 0) { + printf("'%s' != 'foo\\nbar'\n", foo); + return 1; + } + strcpy(foo, " \t \t foobar\n"); + string_trim(foo, STRING_START); + if (strcmp(foo, "foobar\n") != 0) { + printf("'%s' != 'foobar\\n'\n", foo); + return 1; + } + } + else if (!strcmp(argv[1], "str2words")) { + char *line = ckd_salloc(" foo bar baz argh"); + char **words; + int n; + + n = str2words(line, NULL, 0); + if (n != 4) { + printf("%d != 4\n", n); + return 1; + } + words = ckd_calloc(n, sizeof(*words)); + n = str2words(line, words, n); + if (n != 4) { + printf("%d != 4\n", n); + return 1; + } + if (strcmp(words[0], "foo") != 0 + || strcmp(words[1], "bar") != 0 + || strcmp(words[2], "baz") != 0 + || strcmp(words[3], "argh") != 0) { + printf("%s, %s, %s, %s != foo, bar, baz, argh\n", + words[0], words[1], words[2], words[3]); + return 1; + } + return 0; + } + else if (!strcmp(argv[1], "nextword")) { + char *line = ckd_salloc(" \tfoo bar\nbaz argh"); + char *word; + const char *delim = " \t\n"; + char delimfound; + int n; + + n = nextword(line, delim, &word, &delimfound); + if (strcmp(word, "foo") != 0) { + printf("%s != foo\n", word); + return 1; + } + if (delimfound != ' ') { + printf("didn't find ' '\n"); + return 1; + } + word[n] = delimfound; + line = word + n; + n = nextword(line, delim, &word, &delimfound); + if (strcmp(word, "bar") != 0) { + printf("%s != bar\n", word); + return 1; + } + if (delimfound != '\n') { + printf("didn't find '\\n'\n"); + return 1; + } + word[n] = delimfound; + line = word + n; + n = nextword(line, delim, &word, &delimfound); + if (strcmp(word, "baz") != 0) { + printf("%s != baz\n", word); + return 1; + } + if (delimfound != ' ') { + printf("didn't find ' '\n"); + return 1; + } + word[n] = delimfound; + line = word + n; + n = nextword(line, delim, &word, &delimfound); + if (strcmp(word, "argh") != 0) { + printf("%s != argh\n", word); + return 1; + } + if (delimfound != '\0') { + printf("didn't find NUL\n"); + return 1; + } + word[n] = delimfound; + line = word + n; + n = nextword(line, delim, &word, &delimfound); + if (n != -1) { + printf("didn't get -1 at end of string\n"); + } + + line = ckd_salloc("FOO!"); + n = nextword(line, delim, &word, &delimfound); + if (strcmp(word, "FOO!") != 0) { + printf("%s != FOO!\n", word); + return 1; + } + if (delimfound != '\0') { + printf("didn't find NUL\n"); + return 1; + } + + return 0; + } + return 0; +} diff --git a/test/unit/test_string/test_atof.c b/test/unit/test_string/test_atof.c new file mode 100644 index 0000000..c5ada32 --- /dev/null +++ b/test/unit/test_string/test_atof.c @@ -0,0 +1,42 @@ +#include +#include +#include +#include +#include + +#include "util/strfuncs.h" + +int +main(int argc, char *argv[]) +{ + double foo; + + (void)argc; + (void)argv; + /* Ensure that it's really locale-independent. */ + if (setlocale(LC_ALL, "fr_CA.UTF-8") == NULL) + fprintf(stderr, "Note: setlocale(LC_ALL, fr_CA.UTF-8) failed\n"); + + foo = atof("1.5324523524523423"); + printf("atof(): 1.5324523524523423 %f\n", foo); + + foo = atof_c("1.5324523524523423"); + printf("1.5324523524523423 %f\n", foo); + if (fabs(foo - 1.532) > 0.01) + return 1; + + foo = atof_c("5e-3"); + printf("5e-3 %f\n", foo); + if (fabs(foo - 0.005) > 0.01) + return 1; + + foo = atof_c("1.2e+2"); + printf("1.2e+2 %f\n", foo); + if (fabs(foo - 120.0) > 0.01) + return 1; + + foo = atof_c("1e-80"); + printf("1e-80 %g\n", foo); + + return 0; +} diff --git a/test/unit/test_util/CMakeLists.txt b/test/unit/test_util/CMakeLists.txt new file mode 100644 index 0000000..b88e6e9 --- /dev/null +++ b/test/unit/test_util/CMakeLists.txt @@ -0,0 +1,23 @@ +set(TEST_EXECUTABLES + test_fopen + test_bitarr + test_bit_encode + test_build_directory + test_heap + test_filename + test_readfile + ) +foreach(TEST_EXECUTABLE ${TEST_EXECUTABLES}) + add_executable(${TEST_EXECUTABLE} EXCLUDE_FROM_ALL ${TEST_EXECUTABLE}.c) + target_link_libraries(${TEST_EXECUTABLE} pocketsphinx) + target_include_directories( + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_SOURCE_DIR}/src + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR} + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_BINARY_DIR}/test/unit + ${TEST_EXECUTABLE} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ) + add_test(NAME ${TEST_EXECUTABLE} COMMAND ${TEST_EXECUTABLE}) + set_property(TARGET ${TEST_EXECUTABLE} + PROPERTY COMPILE_DEFINITIONS LMDIR="${CMAKE_SOURCE_DIR}/test/unit/test_ngram") + add_dependencies(check ${TEST_EXECUTABLE}) +endforeach() diff --git a/test/unit/test_util/test_bit_encode.c b/test/unit/test_util/test_bit_encode.c new file mode 100644 index 0000000..2d6fd78 --- /dev/null +++ b/test/unit/test_util/test_bit_encode.c @@ -0,0 +1,53 @@ +/** + * @file test_bit_encode.c Test bitstream encoding + * @author David Huggins-Daines + */ + +#include "util/pio.h" +#include "test_macros.h" + +#include +#include +#include + +int +main(int argc, char *argv[]) +{ + FILE *fh; + bit_encode_t *be; + int i; + static unsigned char const bits[] = "\xde\xad\xbe\xef"; + uint32 cw = 0xdeadbeef; + unsigned char inbits[16]; + + (void)argc; + (void)argv; + fh = fopen("bittest.out", "wb"); + be = bit_encode_attach(fh); + bit_encode_write(be, bits, 8); + bit_encode_write(be, bits + 1, 16); + bit_encode_write(be, bits + 3, 8); + bit_encode_write_cw(be, cw >> 24, 8); + bit_encode_write_cw(be, cw >> 16, 8); + bit_encode_write_cw(be, cw >> 8, 8); + bit_encode_write_cw(be, cw, 8); + bit_encode_write_cw(be, cw >> 26, 6); + bit_encode_write_cw(be, cw >> 14, 12); + bit_encode_write_cw(be, cw >> 8, 6); + bit_encode_write_cw(be, cw, 8); + for (i = 0; i < 32; ++i) { + bit_encode_write_cw(be, cw >> (31-i), 1); + } + bit_encode_flush(be); + bit_encode_free(be); + fclose(fh); + fh = fopen("bittest.out", "rb"); + i = fread(inbits, 1, 16, fh); + TEST_ASSERT(0 == memcmp(inbits, bits, 4)); + TEST_ASSERT(0 == memcmp(inbits + 4, bits, 4)); + TEST_ASSERT(0 == memcmp(inbits + 8, bits, 4)); + TEST_ASSERT(0 == memcmp(inbits + 12, bits, 4)); + fclose(fh); + + return 0; +} diff --git a/test/unit/test_util/test_bitarr.c b/test/unit/test_util/test_bitarr.c new file mode 100644 index 0000000..e7fc964 --- /dev/null +++ b/test/unit/test_util/test_bitarr.c @@ -0,0 +1,99 @@ +/** + * @file test_bitarr.c Test bit array io + */ + +#include "lm/bitarr.h" +#include +#include "test_macros.h" + +#include +#include +#include + +typedef union { + float f; + uint32 i; +} float_enc; + +int +main(int argc, char *argv[]) +{ + float_enc neg1 = { -1.0 }, pos1 = { 1.0 }; + uint64 test57 = 0x123456789abcdefULL; + uint32 test25 = 0x1234567; + char mem[57+8]; + bitarr_address_t address; + + (void)argc; + (void)argv; + err_set_loglevel(ERR_INFO); + //sign bit should be 0x80000000 (BUT WHY?!?!?) + TEST_EQUAL((neg1.i ^ pos1.i), 0x80000000); + memset(mem, 0, sizeof(mem)); + address.base = mem; + + /* Test packed bits */ + for (address.offset = 0; address.offset < 57 * 8; address.offset += 57) + bitarr_write_int57(address, 57, test57); + E_INFO("%d\n", mem[0]); + E_INFO("%d\n", mem[1]); + E_INFO("%d\n", mem[2]); + E_INFO("%d\n", mem[3]); + for (address.offset = 0; address.offset < 57 * 8; address.offset += 57) { + uint64 read57 = bitarr_read_int57(address, 57, ((1ULL << 57) - 1)); + E_INFO("Testing %llx at %d = %llx\n", test57, address.offset, read57); + TEST_EQUAL(test57, read57); + } + /* Test arbitrary addresses */ + for (address.offset = 0; address.offset < 57 * 8; address.offset += 1) { + uint64 read57; + + memset(mem, 0, sizeof(mem)); + bitarr_write_int57(address, 57, test57); + read57 = bitarr_read_int57(address, 57, ((1ULL << 57) - 1)); + E_INFO("Testing %llx at %d = %llx\n", test57, address.offset, read57); + TEST_EQUAL(test57, read57); + } + memset(mem, 0, sizeof(mem)); + + /* Test packed bits */ + for (address.offset = 0; address.offset < 57 * 8; address.offset += 25) + bitarr_write_int25(address, 25, test25); + E_INFO("%d\n", mem[0]); + E_INFO("%d\n", mem[1]); + E_INFO("%d\n", mem[2]); + E_INFO("%d\n", mem[3]); + for (address.offset = 0; address.offset < 57 * 8; address.offset += 25) { + uint32 read25 = bitarr_read_int25(address, 25, ((1UL << 25) - 1)); + E_INFO("Testing %lx at %d = %lx\n", test25, address.offset, read25); + TEST_EQUAL(test25, read25); + } + /* Test arbitrary addresses */ + for (address.offset = 0; address.offset < 57 * 8; address.offset += 1) { + uint32 read25; + + memset(mem, 0, sizeof(mem)); + bitarr_write_int25(address, 25, test25); + read25 = bitarr_read_int25(address, 25, ((1UL << 25) - 1)); + E_INFO("Testing %lx at %d = %lx\n", test25, address.offset, read25); + TEST_EQUAL(test25, read25); + } + memset(mem, 0, sizeof(mem)); + + /* Test mixing 32 and 64-bit access. */ + for (address.offset = 0; address.offset < 57 * 8; address.offset += 82) { + bitarr_address_t address2 = address; + uint64 read25; + + bitarr_write_int25(address, 25, test25); + address2.offset += 25; + bitarr_write_int57(address2, 57, test57); + read25 = bitarr_read_int25(address, 25, ((1UL << 25) - 1)); + E_INFO("Testing %lx at %d = %lx\n", test25, address.offset, read25); + TEST_EQUAL(test25, read25); + read25 = bitarr_read_int57(address2, 57, ((1ULL << 57) - 1)); + E_INFO("Testing %llx at %d = %llx\n", test57, address2.offset, read25); + TEST_EQUAL(test57, read25); + } + return 0; +} diff --git a/test/unit/test_util/test_build_directory.c b/test/unit/test_util/test_build_directory.c new file mode 100644 index 0000000..f251975 --- /dev/null +++ b/test/unit/test_util/test_build_directory.c @@ -0,0 +1,28 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/** + * @file test_build_directory.c Test recursive directory creation + * @author David Huggins-Daines + */ + +#include "util/pio.h" +#include "test_macros.h" + +#include +#include + +int +main(int argc, char *argv[]) +{ + (void)argc; + (void)argv; + TEST_EQUAL(0, build_directory("foo/bar/baz")); + TEST_ASSERT(stat_mtime("foo/bar/baz") != -1); + TEST_EQUAL(0, build_directory("./quux/")); + TEST_ASSERT(stat_mtime("quux") != -1); + TEST_EQUAL(0, build_directory("./foo/bar/baz")); + TEST_ASSERT(stat_mtime("foo/bar/baz") != -1); + TEST_EQUAL(0, build_directory("/tmp/sphinxbase_foo_bar_baz")); + TEST_ASSERT(stat_mtime("/tmp/sphinxbase_foo_bar_baz") != -1); + + return 0; +} diff --git a/test/unit/test_util/test_filename.c b/test/unit/test_util/test_filename.c new file mode 100644 index 0000000..2817200 --- /dev/null +++ b/test/unit/test_util/test_filename.c @@ -0,0 +1,45 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/** + * @file test_filename.c Test file name operations + * @author David Huggins-Daines + */ + +#include "util/filename.h" +#include "test_macros.h" + +#include +#include +#include + +int +main(int argc, char *argv[]) +{ +#if defined(_WIN32) || defined(__CYGWIN__) + char const testname[] = "\\foo\\bar\\baz\\quux.argh"; + char const testname2[] = "foo\\bar\\baz"; + char const testname3[] = "\\foo"; + char const result1[] = "\\foo\\bar\\baz"; + char const result2[] = "foo\\bar"; +#else + char const testname[] = "/foo/bar/baz/quux.argh"; + char const testname2[] = "foo/bar/baz"; + char const testname3[] = "/foo"; + char const result1[] = "/foo/bar/baz"; + char const result2[] = "foo/bar"; +#endif + char testout[32]; + (void)argc; + (void)argv; + TEST_EQUAL(0, strcmp("quux.argh", path2basename(testname))); + + path2dirname(testname, testout); + TEST_EQUAL(0, strcmp(result1, testout)); + + path2dirname(testname2, testout); + TEST_EQUAL(0, strcmp(result2, testout)); + + path2dirname(testname3, testout); + TEST_EQUAL(0, strcmp(".", testout)); + + return 0; +} diff --git a/test/unit/test_util/test_fopen.c b/test/unit/test_util/test_fopen.c new file mode 100644 index 0000000..5552970 --- /dev/null +++ b/test/unit/test_util/test_fopen.c @@ -0,0 +1,46 @@ +/** + * @file test_fopen.c Test file opening + * @author David Huggins-Daines + */ + +#include "util/pio.h" +#include "test_macros.h" + +#include +#include + +int +main(int argc, char *argv[]) +{ + FILE *fh; + char line[256]; + int ispipe; + + (void)argc; + (void)argv; + fh = fopen_comp(LMDIR "/100.lm.gz", "r", &ispipe); + TEST_ASSERT(fh != NULL); + (void) fgets(line, sizeof(line), fh); + TEST_EQUAL('#', line[0]); + fclose_comp(fh, ispipe); + + fh = fopen_compchk(LMDIR "/100.lm.gz", &ispipe); + TEST_ASSERT(fh != NULL); + (void) fgets(line, sizeof(line), fh); + TEST_EQUAL('#', line[0]); + fclose_comp(fh, ispipe); + + fh = fopen_compchk(LMDIR "/100.lm.bz2", &ispipe); + TEST_ASSERT(fh != NULL); + (void) fgets(line, sizeof(line), fh); + TEST_EQUAL('#', line[0]); + fclose_comp(fh, ispipe); + + fh = fopen_compchk(LMDIR "/100.lm", &ispipe); + TEST_ASSERT(fh != NULL); + (void) fgets(line, sizeof(line), fh); + TEST_EQUAL('#', line[0]); + fclose_comp(fh, ispipe); + + return 0; +} diff --git a/test/unit/test_util/test_heap.c b/test/unit/test_util/test_heap.c new file mode 100644 index 0000000..2c6d706 --- /dev/null +++ b/test/unit/test_util/test_heap.c @@ -0,0 +1,42 @@ +/** + * @file test_heap.c Test heaps + * @author David Huggins-Daines + */ + +#include "util/heap.h" +#include "test_macros.h" + +#include +#include +#include + +int +main(int argc, char *argv[]) +{ + heap_t *heap; + int i; + + (void)argc; + (void)argv; + heap = heap_new(); + for (i = 0; i < 25; ++i) + heap_insert(heap, (void *)(long)i, i); + for (i = 0; i < 25; ++i) { + int32 val; + void *data; + TEST_EQUAL(1, heap_pop(heap, &data, &val)); + TEST_EQUAL(val, i); + TEST_EQUAL((int)(long)data, i); + TEST_EQUAL(heap_size(heap), (size_t)25 - i - 1); + } + for (i = 0; i < 25; ++i) + heap_insert(heap, (void *)(long)i, i); + TEST_EQUAL(0, heap_remove(heap, (void *)(long)10)); + TEST_EQUAL(-1, heap_remove(heap, (void *)(long)10)); + TEST_EQUAL(heap_size(heap), 24); + TEST_EQUAL(0, heap_remove(heap, (void *)(long)15)); + TEST_EQUAL(0, heap_remove(heap, (void *)(long)9)); + TEST_EQUAL(0, heap_remove(heap, (void *)(long)0)); + TEST_EQUAL(heap_size(heap), 21); + return 0; +} diff --git a/test/unit/test_util/test_readfile.c b/test/unit/test_util/test_readfile.c new file mode 100644 index 0000000..27f02a5 --- /dev/null +++ b/test/unit/test_util/test_readfile.c @@ -0,0 +1,29 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/** + * @file test_readfile.c: Test for the methods to read the file + * @author David Huggins-Daines + */ + +#include "util/ckd_alloc.h" +#include "util/bio.h" +#include "test_macros.h" + +#include +#include +#include + +int +main(int argc, char *argv[]) +{ + size_t nsamps; + int16 *data; + + (void)argc; + (void)argv; + data = bio_read_wavfile(TESTDATADIR, "chan3", ".wav", 44, FALSE, &nsamps); + TEST_EQUAL(230108, nsamps); + + ckd_free(data); + + return 0; +} diff --git a/test/unit/test_vad.c b/test/unit/test_vad.c new file mode 100644 index 0000000..b85cfb1 --- /dev/null +++ b/test/unit/test_vad.c @@ -0,0 +1,137 @@ +/* Test voice activity detection. + * + * MIT license (c) 2022, see LICENSE for more information. + * + * Author: David Huggins-Daines + */ + +#include +#include "util/ckd_alloc.h" +#include "test_macros.h" + +static const char *expecteds[] = { + "011110111111111111111111111100", + "011110111111111111111111111100", + "000000111111111111111111110000", + "000000111111111111111100000000" +}; +static const int n_modes = sizeof(expecteds)/sizeof(expecteds[0]); + +static int sample_rates[] = { + 8000, + 16000, + 32000, + 48000, + 11025, + 22050, + 44100 +}; +static const int n_sample_rates = sizeof(sample_rates)/sizeof(sample_rates[0]); + +static FILE * +open_data(int sample_rate) +{ + char *soxcmd; + int len; + FILE *sox; +#define SOXCMD "sox -q -r 8000 -c 1 -b 16 -e signed-integer -t raw -D -G " \ + DATADIR "/vad/test-audio.raw -r %d -t raw -" + + if (sample_rate == 8000) + return fopen(DATADIR "/vad/test-audio.raw", "rb"); + len = snprintf(NULL, 0, SOXCMD, sample_rate); + if ((soxcmd = malloc(len + 1)) == NULL) + E_FATAL_SYSTEM("Failed to allocate string"); + if (snprintf(soxcmd, len + 1, SOXCMD, sample_rate) != len) + E_FATAL_SYSTEM("snprintf() failed"); + if ((sox = popen(soxcmd, "r")) == NULL) + E_FATAL_SYSTEM("Failed to popen(%s)", soxcmd); + free(soxcmd); + + return sox; +} + +static void +close_data(FILE *fh, int sample_rate) +{ + if (sample_rate == 8000) + fclose(fh); + else + pclose(fh); +} + +static int +test_sample_rate(int sample_rate) +{ + ps_vad_t *vader; + short *frame; + int i; + + /* Test VAD modes with py-webrtcvad test data. */ + for (i = 0; i < n_modes; ++i) { + FILE *fh; + size_t frame_size; + char *classification, *c; + + E_INFO("Sample rate %d, mode %d\n", sample_rate, i); + /* Extra space for approximate rates */ + c = classification = ckd_calloc(1, strlen(expecteds[i]) * 2); + vader = ps_vad_init(i, sample_rate, 0.03); + TEST_ASSERT(vader); + frame_size = ps_vad_frame_size(vader); + frame = ckd_calloc(sizeof(*frame), frame_size); + TEST_ASSERT(frame); + + fh = open_data(sample_rate); + TEST_ASSERT(fh); + while (fread(frame, sizeof(*frame), frame_size, fh) == frame_size) { + int is_speech = ps_vad_classify(vader, frame); + TEST_ASSERT(is_speech != PS_VAD_ERROR); + *c++ = (is_speech == PS_VAD_SPEECH) ? '1' : '0'; + } + E_INFO("true: %s\n", expecteds[i]); + E_INFO("pred: %s\n", classification); + if (sample_rate != 48000 /* Has Problems for some reason */ + && ps_vad_frame_length(vader) == 0.03) /* skip approximate rates */ + TEST_EQUAL(0, strcmp(expecteds[i], classification)); + ckd_free(classification); + ps_vad_free(vader); + ckd_free(frame); + close_data(fh, sample_rate); + } + return 0; +} + +int +main(int argc, char *argv[]) +{ + ps_vad_t *vader; + int i; + + (void)argc; (void)argv; + err_set_loglevel(ERR_INFO); + /* Test initialization with default parameters. */ + vader = ps_vad_init(0, 0, 0); + TEST_ASSERT(vader); + /* Retain and release, should still be there. */ + TEST_ASSERT((vader = ps_vad_retain(vader))); + TEST_ASSERT(ps_vad_free(vader)); + + /* Test default frame size. */ + TEST_EQUAL(ps_vad_frame_size(vader), + (int)(PS_VAD_DEFAULT_SAMPLE_RATE * PS_VAD_DEFAULT_FRAME_LENGTH)); + TEST_EQUAL_FLOAT(ps_vad_frame_length(vader), PS_VAD_DEFAULT_FRAME_LENGTH); + TEST_ASSERT(ps_vad_free(vader) == 0); + + /* Test a variety of sample rates. */ + for (i = 0; i < n_sample_rates; ++i) + test_sample_rate(sample_rates[i]); + + /* Test rejection of unreasonable sample rates. */ + vader = ps_vad_init(0, 42, 0.03); + TEST_ASSERT(vader == NULL); + vader = ps_vad_init(0, 96000, 0.03); + TEST_ASSERT(vader == NULL); + + return 0; +} diff --git a/test/unit/test_word_align.c b/test/unit/test_word_align.c new file mode 100644 index 0000000..e6d5e0d --- /dev/null +++ b/test/unit/test_word_align.c @@ -0,0 +1,195 @@ +/* -*- c-basic-offset: 4 -*- */ +#include + +#include "test_macros.h" +#include "pocketsphinx_internal.h" + +//#define AUSTEN_TEXT "and mister john dashwood had then leisure to consider how much there might be prudently in his power to do for them" +#define AUSTEN_TEXT "he was not an ill disposed young man" +static int +do_decode(ps_decoder_t *ps) +{ + FILE *rawfh; + const char *hyp; + long nsamp; + int score; + + TEST_ASSERT(rawfh = fopen(DATADIR "/librivox/sense_and_sensibility_01_austen_64kb-0880.wav", "rb")); + fseek(rawfh, 44, SEEK_SET); + nsamp = ps_decode_raw(ps, rawfh, -1); + hyp = ps_get_hyp(ps, &score); + printf("%s (%ld samples, %d score)\n", hyp, nsamp, score); + TEST_ASSERT(nsamp > 0); + TEST_ASSERT((0 == strcmp(hyp, AUSTEN_TEXT) + || 0 == strcmp(hyp, " " AUSTEN_TEXT " "))); + fclose(rawfh); + + return 0; +} + +int +main(int argc, char *argv[]) +{ + ps_decoder_t *ps; + ps_alignment_t *al; + ps_alignment_iter_t *itor; + ps_seg_t *seg; + ps_config_t *config; + int i, sf, ef, last_ef; + int *sfs, *efs; + + (void)argc; + (void)argv; + err_set_loglevel(ERR_INFO); + TEST_ASSERT(config = + ps_config_parse_json( + NULL, + "loglevel: INFO, bestpath: false," + "hmm: \"" MODELDIR "/en-us/en-us\"," + "dict: \"" MODELDIR "/en-us/cmudict-en-us.dict\"," + "samprate: 16000")); + TEST_ASSERT(ps = ps_init(config)); + /* Test alignment through the decoder/search API */ + TEST_EQUAL(0, ps_set_align_text(ps, AUSTEN_TEXT)); + do_decode(ps); + TEST_EQUAL(0, strcmp(ps_get_hyp(ps, &i), AUSTEN_TEXT)); + printf("Word alignment:\n"); + i = 0; last_ef = -1; + for (seg = ps_seg_iter(ps); seg; seg = ps_seg_next(seg)) { + ps_seg_frames(seg, &sf, &ef); + printf("%s %d %d\n", ps_seg_word(seg), sf, ef); + TEST_ASSERT(sf == last_ef + 1); + TEST_ASSERT(ef > sf); + last_ef = ef; + i++; + } + TEST_EQUAL(NULL, seg); + + /* Save start and end points for comparison */ + sfs = ckd_calloc(i, sizeof(*sfs)); + efs = ckd_calloc(i, sizeof(*efs)); + i = 0; + for (seg = ps_seg_iter(ps); seg; seg = ps_seg_next(seg)) { + ps_seg_frames(seg, &sfs[i], &efs[i]); + i++; + } + + /* Test second pass alignment. Ensure that alignment and seg give + * the same results and that phones have constraints propagated to + * them. */ + printf("Converted to subword alignment constraints:\n"); + TEST_EQUAL(0, ps_set_alignment(ps, NULL)); + TEST_ASSERT(al = ps_get_alignment(ps)); + for (i = 0, seg = ps_seg_iter(ps), itor = ps_alignment_words(al); itor; + i++, seg = ps_seg_next(seg), itor = ps_alignment_iter_next(itor)) { + int score, start, duration; + ps_alignment_iter_t *pitor; + + ps_seg_frames(seg, &sf, &ef); + TEST_ASSERT(seg); + score = ps_alignment_iter_seg(itor, &start, &duration); + printf("%s %d %d %s %d %d\n", ps_seg_word(seg), sf, ef, + ps_alignment_iter_name(itor), start, duration); + TEST_EQUAL(0, strcmp(ps_seg_word(seg), ps_alignment_iter_name(itor))); + TEST_EQUAL(sf, sfs[i]); + TEST_EQUAL(ef, efs[i]); + TEST_EQUAL(0, score); + TEST_EQUAL(start, sf); + TEST_EQUAL(duration, ef - sf + 1); + /* Durations are propagated down from words, each phone will + * have the same duration as its parent, and these are used as + * constraints to alignment. */ + for (pitor = ps_alignment_iter_children(itor); pitor; + pitor = ps_alignment_iter_next(pitor)) { + score = ps_alignment_iter_seg(pitor, &start, &duration); + TEST_EQUAL(0, score); + TEST_EQUAL(start, sf); + TEST_EQUAL(duration, ef - sf + 1); + } + } + + do_decode(ps); + TEST_ASSERT(al = ps_get_alignment(ps)); + printf("Subword alignment:\n"); + /* It should have durations assigned (and properly constrained). */ + for (i = 0, seg = ps_seg_iter(ps), itor = ps_alignment_words(al); itor; + i++, seg = ps_seg_next(seg), itor = ps_alignment_iter_next(itor)) { + int score, start, duration; + ps_alignment_iter_t *pitor; + + ps_seg_frames(seg, &sf, &ef); + TEST_ASSERT(seg); + score = ps_alignment_iter_seg(itor, &start, &duration); + printf("%s %d %d %d %d %s %d %d %d\n", ps_seg_word(seg), + sfs[i], efs[i], sf, ef, + ps_alignment_iter_name(itor), start, duration, score); + TEST_EQUAL(sf, sfs[i]); + TEST_EQUAL(ef, efs[i]); + TEST_ASSERT(score != 0); + TEST_EQUAL(start, sf); + TEST_EQUAL(duration, ef - sf + 1); + + /* Phone segmentations should be constrained by words */ + pitor = ps_alignment_iter_children(itor); + score = ps_alignment_iter_seg(pitor, &start, &duration); + /* First phone should be aligned with word */ + TEST_EQUAL(start, sf); + while (pitor) { + ps_alignment_iter_t *sitor; + int state_start, state_duration; + score = ps_alignment_iter_seg(pitor, &start, &duration); + printf("%s %d %d %s %d %d %d\n", ps_seg_word(seg), sf, ef, + ps_alignment_iter_name(pitor), start, duration, score); + /* State segmentations should be constrained by phones */ + sitor = ps_alignment_iter_children(pitor); + score = ps_alignment_iter_seg(sitor, &state_start, &state_duration); + /* First state should be aligned with phone */ + TEST_EQUAL(state_start, start); + while (sitor) { + score = ps_alignment_iter_seg(sitor, &state_start, &state_duration); + printf("%s %d %d %s %d %d %d\n", ps_seg_word(seg), sf, ef, + ps_alignment_iter_name(sitor), state_start, state_duration, + score); + sitor = ps_alignment_iter_next(sitor); + } + /* Last state should fill phone duration */ + TEST_EQUAL(state_start + state_duration, start + duration); + pitor = ps_alignment_iter_next(pitor); + } + /* Last phone should fill word duration */ + TEST_EQUAL(start + duration - 1, ef); + } + + /* Segmentations should all be contiguous */ + last_ef = 0; + for (itor = ps_alignment_words(al); itor; + itor = ps_alignment_iter_next(itor)) { + int start, duration; + (void)ps_alignment_iter_seg(itor, &start, &duration); + TEST_EQUAL(start, last_ef); + last_ef = start + duration; + } + last_ef = 0; + for (itor = ps_alignment_phones(al); itor; + itor = ps_alignment_iter_next(itor)) { + int start, duration; + (void)ps_alignment_iter_seg(itor, &start, &duration); + TEST_EQUAL(start, last_ef); + last_ef = start + duration; + } + last_ef = 0; + for (itor = ps_alignment_states(al); itor; + itor = ps_alignment_iter_next(itor)) { + int start, duration; + (void)ps_alignment_iter_seg(itor, &start, &duration); + TEST_EQUAL(start, last_ef); + last_ef = start + duration; + } + + ckd_free(sfs); + ckd_free(efs); + ps_free(ps); + ps_config_free(config); + + return 0; +} diff --git a/test/word_align.pl b/test/word_align.pl index 400da6d..d6f6d80 100755 --- a/test/word_align.pl +++ b/test/word_align.pl @@ -3,7 +3,7 @@ # word_align.pl - Calculate word error and accuracy for a recognition # hypothesis file vs. a reference transcription # -# Written by David Huggins-Daines for Speech +# Written by David Huggins-Daines for Speech # Recognition and Understanding 11-751, Carnegie Mellon University, # October 2004. @@ -11,7 +11,7 @@ use Getopt::Long; use Pod::Usage; use vars qw($Verbose $CER $IgnoreUttID); -use encoding 'utf8'; +use utf8; my ($help,%hyphash); GetOptions( diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..aa50497 --- /dev/null +++ b/tox.ini @@ -0,0 +1,22 @@ +[tox] +env_list = py{38,39,310,311,312,313} +minversion = 4.11.4 + +[testenv] +description = run the tests with pytest +package = wheel +wheel_build_env = .pkg +deps = + pytest>=6 + memory_profiler +commands = + pytest {tty:--color=yes} {posargs} + +[gh] +python = + 3.13 = py313 + 3.12 = py312 + 3.11 = py311 + 3.10 = py310 + 3.9 = py39 + 3.8 = py38 diff --git a/win32/pocketsphinx/pocketsphinx.vcxproj b/win32/pocketsphinx/pocketsphinx.vcxproj deleted file mode 100755 index 30ba89c..0000000 --- a/win32/pocketsphinx/pocketsphinx.vcxproj +++ /dev/null @@ -1,214 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - - {94001A0E-A837-445C-8004-F918F10D0226} - pocketsphinx - - - - DynamicLibrary - false - MultiByte - v110 - - - - - - - - - Win32 - X64 - MachineX64 - MachineX86 - - - $(SolutionDir)\bin\$(Configuration)\$(Platform)\ - $(Configuration)\$(Platform)\ - false - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - $(TargetEnv) - .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.tlb - - - - - MaxSpeed - OnlyExplicitInline - ../../include;../../src/libpocketsphinx;../../../sphinxbase/include;../../../sphinxbase/include/win32;%(AdditionalIncludeDirectories) - NDEBUG;_USRDLL;SPHINX_DLL;POCKETSPHINX_EXPORTS;HAVE_CONFIG_H;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - true - MultiThreadedDLL - true - .\$(Configuration)\$(Platform)/pocketsphinx.pch - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - Level3 - true - - - NDEBUG;%(PreprocessorDefinitions) - 0x0409 - - - sphinxbase.lib;winmm.lib;%(AdditionalDependencies) - ..\..\bin\$(Configuration)\$(Platform)\pocketsphinx.dll - true - ..\..\..\sphinxbase\bin\$(Configuration)\$(Platform);%(AdditionalLibraryDirectories) - ..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.pdb - false - - - ..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.lib - $(MachineArch) - - - true - .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.bsc - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - $(TargetEnv) - .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.tlb - - - - - Disabled - ../../include;../../src/libpocketsphinx;../../../sphinxbase/include;../../../sphinxbase/include/win32;%(AdditionalIncludeDirectories) - _DEBUG;_USRDLL;SPHINX_DLL;POCKETSPHINX_EXPORTS;HAVE_CONFIG_H;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - .\$(Configuration)\$(Platform)/pocketsphinx.pch - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - Level3 - true - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - sphinxbase.lib;winmm.lib;%(AdditionalDependencies) - ../../bin/$(Configuration)/$(Platform)/pocketsphinx.dll - true - ..\..\..\sphinxbase\bin\$(Configuration)\$(Platform);%(AdditionalLibraryDirectories) - true - ..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.pdb - false - - - ..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.lib - $(MachineArch) - false - - - true - .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx.bsc - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/win32/pocketsphinx/pocketsphinx.vcxproj.filters b/win32/pocketsphinx/pocketsphinx.vcxproj.filters deleted file mode 100755 index ec585d2..0000000 --- a/win32/pocketsphinx/pocketsphinx.vcxproj.filters +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/win32/pocketsphinx_batch/pocketsphinx_batch.vcxproj b/win32/pocketsphinx_batch/pocketsphinx_batch.vcxproj deleted file mode 100755 index b1a595e..0000000 --- a/win32/pocketsphinx_batch/pocketsphinx_batch.vcxproj +++ /dev/null @@ -1,150 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - - {CB47D94B-2F84-41BC-A3C4-A1EBDCDE922A} - pocketsphinx_batch - - - - Application - false - MultiByte - v110 - - - - - - - - - Win32 - X64 - MachineX64 - MachineX86 - - - $(SolutionDir)\bin\$(Configuration)\$(Platform)\ - $(Configuration)\$(Platform)\ - false - - - - .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx_batch.tlb - - - - - MaxSpeed - OnlyExplicitInline - ../../include;../../../sphinxbase/include;../../../sphinxbase/include/win32;../../src/libpocketsphinx;%(AdditionalIncludeDirectories) - NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;SPHINX_DLL;HAVE_CONFIG_H;%(PreprocessorDefinitions) - true - MultiThreadedDLL - true - .\$(Configuration)\$(Platform)/pocketsphinx_batch.pch - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - Level3 - true - - - NDEBUG;%(PreprocessorDefinitions) - 0x0409 - - - sphinxbase.lib;winmm.lib;%(AdditionalDependencies) - ..\..\bin\$(Configuration)\$(Platform)\pocketsphinx_batch.exe - true - ..\..\..\sphinxbase\bin\$(Configuration)\$(Platform);%(AdditionalLibraryDirectories) - ..\..\bin\$(Configuration)\$(Platform)/pocketsphinx_batch.pdb - Console - false - - - $(MachineArch) - - - true - .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx_batch.bsc - - - - - .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx_batch.tlb - - - - - Disabled - ../../include;../../../sphinxbase/include;../../../sphinxbase/include/win32;../../src/libpocketsphinx;%(AdditionalIncludeDirectories) - _DEBUG;_CONSOLE;HAVE_CONFIG_H;_CRT_SECURE_NO_WARNINGS;SPHINX_DLL;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - .\$(Configuration)\$(Platform)/pocketsphinx_batch.pch - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - Level3 - true - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - sphinxbase.lib;winmm.lib;pocketsphinx.lib;%(AdditionalDependencies) - ../../bin/$(Configuration)/$(Platform)/pocketsphinx_batch.exe - true - ..\..\..\sphinxbase\bin\$(Configuration)\$(Platform);..\..\bin\$(Configuration)\$(Platform);%(AdditionalLibraryDirectories) - true - ..\..\bin\$(Configuration)\$(Platform)/pocketsphinx_batch.pdb - Console - false - - - $(MachineArch) - false - - - true - .\..\..\..\bin\$(Configuration)\$(Platform)/pocketsphinx_batch.bsc - - - - - - - - - - - {94001a0e-a837-445c-8004-f918f10d0226} - - - - - - \ No newline at end of file diff --git a/win32/pocketsphinx_continuous/pocketsphinx_continuous.vcxproj b/win32/pocketsphinx_continuous/pocketsphinx_continuous.vcxproj deleted file mode 100755 index 3c5cb3f..0000000 --- a/win32/pocketsphinx_continuous/pocketsphinx_continuous.vcxproj +++ /dev/null @@ -1,150 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - - {1380AF76-C926-44D0-8002-06C228AC869A} - pocketsphinx_continuous - - - - Application - false - v110 - MultiByte - - - - - - - - - Win32 - X64 - MachineX64 - MachineX86 - - - $(SolutionDir)\bin\$(Configuration)\$(Platform)\ - $(Configuration)\$(Platform)\ - false - - - - $(SolutionDir)\bin\$(Configuration)\$(Platform)/pocketsphinx_continuous.tlb - - - - - Disabled - ../../include;../../../sphinxbase/include;../../../sphinxbase/include/win32;../../src/libpocketsphinx;%(AdditionalIncludeDirectories) - _DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;SPHINX_DLL;AD_BACKEND_WIN32;HAVE_CONFIG_H;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - .\$(Configuration)\$(Platform)/pocketsphinx_continuous.pch - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - Level3 - true - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - sphinxbase.lib;winmm.lib;pocketsphinx.lib;%(AdditionalDependencies) - $(SolutionDir)\bin\$(Configuration)\$(Platform)\pocketsphinx_continuous.exe - true - ..\..\..\sphinxbase\bin\$(Configuration)\$(Platform);..\..\bin\$(Configuration)\$(Platform);%(AdditionalLibraryDirectories) - true - $(SolutionDir)\bin\$(Configuration)\$(Platform)/pocketsphinx_continuous.pdb - Console - false - - - $(MachineArch) - false - - - true - $(SolutionDir)\bin\$(Configuration)\$(Platform)/pocketsphinx_continuous.bsc - - - - - $(SolutionDir)\bin\$(Configuration)\$(Platform)/pocketsphinx_continuous.tlb - - - - - MaxSpeed - OnlyExplicitInline - ../../include;../../../sphinxbase/include;../../../sphinxbase/include/win32;../../src/libpocketsphinx;%(AdditionalIncludeDirectories) - NDEBUG;_CONSOLE;AD_BACKEND_WIN32;_CRT_SECURE_NO_WARNINGS;SPHINX_DLL;HAVE_CONFIG_H;%(PreprocessorDefinitions) - true - MultiThreadedDLL - true - .\$(Configuration)\$(Platform)/pocketsphinx_continuous.pch - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - .\$(Configuration)\$(Platform)/ - Level3 - true - - - NDEBUG;%(PreprocessorDefinitions) - 0x0409 - - - sphinxbase.lib;winmm.lib;%(AdditionalDependencies) - $(SolutionDir)\bin\$(Configuration)\$(Platform)\pocketsphinx_continuous.exe - true - ..\..\..\sphinxbase\bin\$(Configuration)\$(Platform);%(AdditionalLibraryDirectories) - $(SolutionDir)\bin\$(Configuration)\$(Platform)/pocketsphinx_continuous.pdb - Console - false - - - $(MachineArch) - - - true - $(SolutionDir)\bin\$(Configuration)\$(Platform)/pocketsphinx_continuous.bsc - - - - - - - - - - - {94001a0e-a837-445c-8004-f918f10d0226} - - - - - - \ No newline at end of file diff --git a/win32/pocketsphinx_mdef_convert/pocketsphinx_mdef_convert.vcxproj b/win32/pocketsphinx_mdef_convert/pocketsphinx_mdef_convert.vcxproj deleted file mode 100755 index 3a995c1..0000000 --- a/win32/pocketsphinx_mdef_convert/pocketsphinx_mdef_convert.vcxproj +++ /dev/null @@ -1,98 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - - - - - - {94001a0e-a837-445c-8004-f918f10d0226} - - - - {4FB65800-11B8-46BD-95B8-6E4F73BDAD91} - Win32Proj - pocketsphinx_mdef_convert - - - - Application - false - MultiByte - v110 - - - - - - - - - Win32 - X64 - MachineX64 - MachineX86 - - - $(SolutionDir)\bin\$(Configuration)\$(Platform)\ - $(Configuration)\$(Platform)\ - false - - - - - - Level3 - Disabled - _DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;SPHINX_DLL;HAVE_CONFIG_H;%(PreprocessorDefinitions) - ../../include;../../../sphinxbase/include;../../../sphinxbase/include/win32;../../src/libpocketsphinx;%(AdditionalIncludeDirectories) - - - Console - true - sphinxbase.lib;pocketsphinx.lib;%(AdditionalDependencies) - $(SolutionDir)/bin/$(Configuration)/$(Platform)/pocketsphinx_mdef_convert.exe - ..\..\..\sphinxbase\bin\$(Configuration)\$(Platform);..\..\bin\$(Configuration)\$(Platform);%(AdditionalLibraryDirectories) - false - - - - - Level3 - - - MaxSpeed - true - true - NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;SPHINX_DLL;HAVE_CONFIG_H;%(PreprocessorDefinitions) - ../../include;../../../sphinxbase/include;../../../sphinxbase/include/win32;../../src/libpocketsphinx;%(AdditionalIncludeDirectories) - - - Console - true - true - true - - - - - - \ No newline at end of file