aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUpstream <upstream-import@none>1970-01-12 13:46:40 +0000
committerUpstream <upstream-import@none>1970-01-12 13:46:40 +0000
commit8fbc7e6b026f40333767b2383bbaf0c5da473135 (patch)
tree2c3ebccb12be28118cb7abe57429c12da802f8ce
downloadnetperf-8fbc7e6b026f40333767b2383bbaf0c5da473135.tar.gz
external/netperf 2.4.4upstream/2.4.4
-rw-r--r--Makefile.am22
-rw-r--r--Makefile.in554
-rw-r--r--NetPerfDir/inet_ntop.c1
-rw-r--r--NetPerfDir/makefile7
-rw-r--r--NetPerfDir/sources27
-rw-r--r--NetPerfDir/sources~27
-rw-r--r--NetServerDir/inet_ntop.c1
-rw-r--r--NetServerDir/makefile7
-rw-r--r--NetServerDir/sources26
-rw-r--r--NetServerDir/sources~26
-rw-r--r--dirs3
-rw-r--r--hist.h116
-rw-r--r--missing/Makefile.am7
-rw-r--r--missing/Makefile.in486
-rw-r--r--missing/getaddrinfo.c605
-rw-r--r--missing/getaddrinfo.h238
-rw-r--r--missing/inet_ntop.c140
-rw-r--r--missing/m4/Makefile.am1
-rw-r--r--missing/m4/Makefile.in269
-rw-r--r--missing/m4/herrno.m441
-rw-r--r--missing/m4/in6addr.m489
-rw-r--r--missing/m4/sockaddrin6.m460
-rw-r--r--missing/m4/sockinttypes.m4154
-rw-r--r--missing/m4/socklent.m481
-rw-r--r--missing/m4/type_socklen_t.m425
-rw-r--r--netcpu.h19
-rw-r--r--netcpu_kstat.c415
-rw-r--r--netcpu_kstat10.c559
-rw-r--r--netcpu_looper.c656
-rw-r--r--netcpu_none.c67
-rw-r--r--netcpu_ntperf.c497
-rw-r--r--netcpu_osx.c149
-rw-r--r--netcpu_perfstat.c351
-rw-r--r--netcpu_procstat.c265
-rw-r--r--netcpu_pstat.c307
-rw-r--r--netcpu_pstatnew.c398
-rw-r--r--netcpu_sysctl.c127
-rw-r--r--netlib.c4161
-rw-r--r--netlib.h621
-rw-r--r--netperf-2.4.4/AUTHORS215
-rw-r--r--netperf-2.4.4/COPYING43
-rw-r--r--netperf-2.4.4/ChangeLog1
-rw-r--r--netperf-2.4.4/INSTALL229
-rw-r--r--netperf-2.4.4/Makefile.am4
-rw-r--r--netperf-2.4.4/Makefile.in552
-rw-r--r--netperf-2.4.4/NEWS0
-rw-r--r--netperf-2.4.4/README49
-rw-r--r--netperf-2.4.4/README.aix24
-rw-r--r--netperf-2.4.4/README.hpux31
-rw-r--r--netperf-2.4.4/README.osx4
-rw-r--r--netperf-2.4.4/README.ovms66
-rw-r--r--netperf-2.4.4/README.solaris29
-rw-r--r--netperf-2.4.4/README.windows106
-rw-r--r--netperf-2.4.4/Release_Notes762
-rw-r--r--netperf-2.4.4/acinclude.m4341
-rw-r--r--netperf-2.4.4/aclocal.m41203
-rwxr-xr-xnetperf-2.4.4/config.guess1466
-rw-r--r--netperf-2.4.4/config.h.in348
-rwxr-xr-xnetperf-2.4.4/config.sub1579
-rwxr-xr-xnetperf-2.4.4/configure10644
-rw-r--r--netperf-2.4.4/configure.ac664
-rwxr-xr-xnetperf-2.4.4/depcomp479
-rw-r--r--netperf-2.4.4/doc/Makefile.am22
-rw-r--r--netperf-2.4.4/doc/Makefile.in601
-rw-r--r--netperf-2.4.4/doc/examples/Makefile.am11
-rw-r--r--netperf-2.4.4/doc/examples/Makefile.in279
-rwxr-xr-xnetperf-2.4.4/doc/examples/arr_script386
-rwxr-xr-xnetperf-2.4.4/doc/examples/packet_byte_script163
-rw-r--r--netperf-2.4.4/doc/examples/sctp_stream_script104
-rwxr-xr-xnetperf-2.4.4/doc/examples/snapshot_script226
-rwxr-xr-xnetperf-2.4.4/doc/examples/tcp_range_script113
-rwxr-xr-xnetperf-2.4.4/doc/examples/tcp_rr_script107
-rwxr-xr-xnetperf-2.4.4/doc/examples/tcp_stream_script104
-rwxr-xr-xnetperf-2.4.4/doc/examples/udp_rr_script107
-rw-r--r--netperf-2.4.4/doc/examples/udp_stream_script104
-rw-r--r--netperf-2.4.4/doc/netperf.info2859
-rw-r--r--netperf-2.4.4/doc/netperf.man214
-rw-r--r--netperf-2.4.4/doc/netperf.texi2822
-rw-r--r--netperf-2.4.4/doc/netperf_old.ps24014
-rw-r--r--netperf-2.4.4/doc/netserver.man56
-rw-r--r--netperf-2.4.4/doc/texinfo.tex6744
-rw-r--r--netperf-2.4.4/inet_ntop.c1
-rwxr-xr-xnetperf-2.4.4/install-sh294
-rwxr-xr-xnetperf-2.4.4/missing336
-rwxr-xr-xnetperf-2.4.4/mkinstalldirs111
-rw-r--r--netperf-2.4.4/netperf.spec.in55
-rw-r--r--netperf.c284
-rw-r--r--netperf_version.h1
-rw-r--r--netperf_version.h.in1
-rw-r--r--netserver.c1022
-rw-r--r--netsh.c1002
-rw-r--r--netsh.h149
-rw-r--r--nettest_bsd.c12333
-rw-r--r--nettest_bsd.h471
-rw-r--r--nettest_dlpi.c3798
-rw-r--r--nettest_dlpi.h215
-rw-r--r--nettest_sctp.c4869
-rw-r--r--nettest_sctp.h128
-rw-r--r--nettest_sdp.c3553
-rw-r--r--nettest_sdp.h170
-rw-r--r--nettest_unix.c3431
-rw-r--r--nettest_unix.h198
-rw-r--r--nettest_xti.c6026
-rw-r--r--nettest_xti.h264
104 files changed, 108192 insertions, 0 deletions
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..251af54
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,22 @@
+SUBDIRS = missing
+
+CLEANFILES = netperf_version.h
+
+bin_PROGRAMS = netperf netserver
+
+AM_CFLAGS = $(NETPERF_CFLAGS)
+
+USE_CPU_SOURCE=netcpu_@NETCPU_SOURCE@.c
+
+EXTRA_DIST = netcpu_none.c netcpu_looper.c netcpu_pstat.c netcpu_pstatnew.c netcpu_perfstat.c netcpu_procstat.c netcpu_kstat.c netcpu_kstat10.c netcpu_sysctl.c netcpu_ntperf.c netcpu_osx.c dirs NetPerfDir/* NetServerDir/* netperf_version.h.in
+
+COMMON_SRC = hist.h netlib.c netlib.h netcpu.h netsh.c netsh.h nettest_bsd.c nettest_bsd.h nettest_dlpi.c nettest_dlpi.h nettest_unix.c nettest_unix.h nettest_xti.c nettest_xti.h nettest_sctp.c nettest_sctp.h netperf_version.h nettest_sdp.c nettest_sdp.h
+
+netperf_SOURCES = netperf.c $(COMMON_SRC) $(USE_CPU_SOURCE)
+netserver_SOURCES = netserver.c $(COMMON_SRC) $(USE_CPU_SOURCE)
+
+# if there are any "missing" routines, the libobjs should cover it
+if NEED_LIBCOMPAT
+netperf_LDADD = missing/libcompat.a
+netserver_LDADD = missing/libcompat.a
+endif
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..b012560
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,554 @@
+# Makefile.in generated by automake 1.7.9 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
+# 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@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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 = :
+host_triplet = @host@
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+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@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GREP = @GREP@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+NEED_LIBCOMPAT_FALSE = @NEED_LIBCOMPAT_FALSE@
+NEED_LIBCOMPAT_TRUE = @NEED_LIBCOMPAT_TRUE@
+NETCPU_SOURCE = @NETCPU_SOURCE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+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@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+SUBDIRS = missing
+
+CLEANFILES = netperf_version.h
+
+bin_PROGRAMS = netperf netserver
+
+AM_CFLAGS = $(NETPERF_CFLAGS)
+
+USE_CPU_SOURCE = netcpu_@NETCPU_SOURCE@.c
+
+EXTRA_DIST = netcpu_none.c netcpu_looper.c netcpu_pstat.c netcpu_pstatnew.c netcpu_perfstat.c netcpu_procstat.c netcpu_kstat.c netcpu_kstat10.c netcpu_sysctl.c netcpu_ntperf.c netcpu_osx.c dirs NetPerfDir/* NetServerDir/* netperf_version.h.in
+
+COMMON_SRC = hist.h netlib.c netlib.h netcpu.h netsh.c netsh.h nettest_bsd.c nettest_bsd.h nettest_dlpi.c nettest_dlpi.h nettest_unix.c nettest_unix.h nettest_xti.c nettest_xti.h nettest_sctp.c nettest_sctp.h netperf_version.h nettest_sdp.c nettest_sdp.h
+
+netperf_SOURCES = netperf.c $(COMMON_SRC) $(USE_CPU_SOURCE)
+netserver_SOURCES = netserver.c $(COMMON_SRC) $(USE_CPU_SOURCE)
+
+# if there are any "missing" routines, the libobjs should cover it
+@NEED_LIBCOMPAT_TRUE@netperf_LDADD = missing/libcompat.a
+@NEED_LIBCOMPAT_TRUE@netserver_LDADD = missing/libcompat.a
+subdir = src
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = netperf_version.h
+bin_PROGRAMS = netperf$(EXEEXT) netserver$(EXEEXT)
+PROGRAMS = $(bin_PROGRAMS)
+
+am__objects_1 = netlib.$(OBJEXT) netsh.$(OBJEXT) nettest_bsd.$(OBJEXT) \
+ nettest_dlpi.$(OBJEXT) nettest_unix.$(OBJEXT) \
+ nettest_xti.$(OBJEXT) nettest_sctp.$(OBJEXT) \
+ nettest_sdp.$(OBJEXT)
+am__objects_2 = netcpu_@NETCPU_SOURCE@.$(OBJEXT)
+am_netperf_OBJECTS = netperf.$(OBJEXT) $(am__objects_1) $(am__objects_2)
+netperf_OBJECTS = $(am_netperf_OBJECTS)
+@NEED_LIBCOMPAT_TRUE@netperf_DEPENDENCIES = missing/libcompat.a
+@NEED_LIBCOMPAT_FALSE@netperf_DEPENDENCIES =
+netperf_LDFLAGS =
+am_netserver_OBJECTS = netserver.$(OBJEXT) $(am__objects_1) \
+ $(am__objects_2)
+netserver_OBJECTS = $(am_netserver_OBJECTS)
+@NEED_LIBCOMPAT_TRUE@netserver_DEPENDENCIES = missing/libcompat.a
+@NEED_LIBCOMPAT_FALSE@netserver_DEPENDENCIES =
+netserver_LDFLAGS =
+
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/netcpu_@NETCPU_SOURCE@.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/netlib.Po ./$(DEPDIR)/netperf.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/netserver.Po ./$(DEPDIR)/netsh.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/nettest_bsd.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/nettest_dlpi.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/nettest_sctp.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/nettest_sdp.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/nettest_unix.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/nettest_xti.Po
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+DIST_SOURCES = $(netperf_SOURCES) $(netserver_SOURCES)
+
+RECURSIVE_TARGETS = info-recursive dvi-recursive pdf-recursive \
+ ps-recursive install-info-recursive uninstall-info-recursive \
+ all-recursive install-data-recursive install-exec-recursive \
+ installdirs-recursive install-recursive uninstall-recursive \
+ check-recursive installcheck-recursive
+DIST_COMMON = $(srcdir)/Makefile.in Makefile.am netperf_version.h.in
+DIST_SUBDIRS = $(SUBDIRS)
+SOURCES = $(netperf_SOURCES) $(netserver_SOURCES)
+
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4)
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu src/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+netperf_version.h: $(top_builddir)/config.status netperf_version.h.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(bindir)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f"; \
+ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f $(DESTDIR)$(bindir)/$$f"; \
+ rm -f $(DESTDIR)$(bindir)/$$f; \
+ done
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+netperf$(EXEEXT): $(netperf_OBJECTS) $(netperf_DEPENDENCIES)
+ @rm -f netperf$(EXEEXT)
+ $(LINK) $(netperf_LDFLAGS) $(netperf_OBJECTS) $(netperf_LDADD) $(LIBS)
+netserver$(EXEEXT): $(netserver_OBJECTS) $(netserver_DEPENDENCIES)
+ @rm -f netserver$(EXEEXT)
+ $(LINK) $(netserver_LDFLAGS) $(netserver_OBJECTS) $(netserver_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT) core *.core
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netcpu_@NETCPU_SOURCE@.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netlib.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netperf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netserver.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netsh.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nettest_bsd.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nettest_dlpi.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nettest_sctp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nettest_sdp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nettest_unix.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nettest_xti.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
+@am__fastdepCC_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
+@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@ fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
+
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
+@am__fastdepCC_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
+@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@ fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`
+uninstall-info-am:
+
+# 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.
+$(RECURSIVE_TARGETS):
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; 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; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ETAGS = etags
+ETAGSFLAGS =
+
+CTAGS = ctags
+CTAGSFLAGS =
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ if (etags --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ else \
+ include_option=--include; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -f $$subdir/TAGS && \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$tags$$unique" \
+ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique
+
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+ $(mkinstalldirs) $(distdir)/NetPerfDir $(distdir)/NetServerDir
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkinstalldirs) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -d $(distdir)/$$subdir \
+ || mkdir $(distdir)/$$subdir \
+ || exit 1; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" \
+ distdir=../$(distdir)/$$subdir \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(PROGRAMS)
+installdirs: installdirs-recursive
+installdirs-am:
+ $(mkinstalldirs) $(DESTDIR)$(bindir)
+
+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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -rm -f $(CONFIG_CLEAN_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-binPROGRAMS clean-generic 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:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-recursive
+
+install-man:
+
+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
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am clean \
+ clean-binPROGRAMS clean-generic clean-recursive ctags \
+ ctags-recursive distclean distclean-compile distclean-generic \
+ distclean-recursive distclean-tags distdir dvi dvi-am \
+ dvi-recursive info info-am info-recursive install install-am \
+ install-binPROGRAMS install-data install-data-am \
+ install-data-recursive install-exec install-exec-am \
+ install-exec-recursive install-info install-info-am \
+ install-info-recursive install-man install-recursive \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am installdirs-recursive maintainer-clean \
+ maintainer-clean-generic maintainer-clean-recursive mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-recursive \
+ pdf pdf-am pdf-recursive ps ps-am ps-recursive tags \
+ tags-recursive uninstall uninstall-am uninstall-binPROGRAMS \
+ uninstall-info-am uninstall-info-recursive uninstall-recursive
+
+# 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/NetPerfDir/inet_ntop.c b/NetPerfDir/inet_ntop.c
new file mode 100644
index 0000000..a1ceaf0
--- /dev/null
+++ b/NetPerfDir/inet_ntop.c
@@ -0,0 +1 @@
+#include "..\missing\inet_ntop.c" \ No newline at end of file
diff --git a/NetPerfDir/makefile b/NetPerfDir/makefile
new file mode 100644
index 0000000..b90b71d
--- /dev/null
+++ b/NetPerfDir/makefile
@@ -0,0 +1,7 @@
+#
+# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
+# file to this component. This file merely indirects to the real make file
+# that is shared by all the driver components of the Windows NT DDK
+#
+
+!INCLUDE $(NTMAKEENV)\makefile.def \ No newline at end of file
diff --git a/NetPerfDir/sources b/NetPerfDir/sources
new file mode 100644
index 0000000..37f6969
--- /dev/null
+++ b/NetPerfDir/sources
@@ -0,0 +1,27 @@
+TARGETNAME=netperf
+TARGETPATH=OBJ
+TARGETTYPE=PROGRAM
+
+LINKLIBS= \
+ $(SDK_LIB_PATH)\kernel32.lib \
+ $(SDK_LIB_PATH)\ws2_32.lib \
+ $(SDK_LIB_PATH)\wsock32.lib
+
+USE_MSVCRT=1
+UMTYPE=console
+
+INCLUDES=$(SDK_INC_PATH);.
+
+MSC_WARNING_LEVEL=/W3 /WX
+
+C_DEFINES=$(C_DEFINES) -D_CONSOLE_ -DHAVE_STRUCT_SOCKADDR_STORAGE -DHAVE_GETADDRINFO -DHAVE_GETNAMEINFO -DSTDC_HEADERS
+
+SOURCES= \
+ ..\netcpu_ntperf.c \
+ ..\netlib.c \
+ ..\netsh.c \
+ ..\nettest_bsd.c \
+ inet_ntop.c \
+ ..\netperf.c
+
+
diff --git a/NetPerfDir/sources~ b/NetPerfDir/sources~
new file mode 100644
index 0000000..57d231b
--- /dev/null
+++ b/NetPerfDir/sources~
@@ -0,0 +1,27 @@
+TARGETNAME=netperf
+TARGETPATH=OBJ
+TARGETTYPE=PROGRAM
+
+LINKLIBS= \
+ $(SDK_LIB_PATH)\kernel32.lib \
+ $(SDK_LIB_PATH)\ws2_32.lib \
+ $(SDK_LIB_PATH)\wsock32.lib
+
+USE_CRTDLL=1
+UMTYPE=console
+
+INCLUDES=$(SDK_INC_PATH);.
+
+MSC_WARNING_LEVEL=/W3 /WX
+
+C_DEFINES=$(C_DEFINES) -D_CONSOLE_ -DHAVE_GETADDRINFO -DHAVE_GETNAMEINFO -DSTDC_HEADERS
+
+SOURCES= \
+ ..\netcpu_ntperf.c \
+ ..\netlib.c \
+ ..\netsh.c \
+ ..\nettest_bsd.c \
+ inet_ntop.c \
+ ..\netperf.c
+
+
diff --git a/NetServerDir/inet_ntop.c b/NetServerDir/inet_ntop.c
new file mode 100644
index 0000000..a1ceaf0
--- /dev/null
+++ b/NetServerDir/inet_ntop.c
@@ -0,0 +1 @@
+#include "..\missing\inet_ntop.c" \ No newline at end of file
diff --git a/NetServerDir/makefile b/NetServerDir/makefile
new file mode 100644
index 0000000..b90b71d
--- /dev/null
+++ b/NetServerDir/makefile
@@ -0,0 +1,7 @@
+#
+# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
+# file to this component. This file merely indirects to the real make file
+# that is shared by all the driver components of the Windows NT DDK
+#
+
+!INCLUDE $(NTMAKEENV)\makefile.def \ No newline at end of file
diff --git a/NetServerDir/sources b/NetServerDir/sources
new file mode 100644
index 0000000..c48a5a6
--- /dev/null
+++ b/NetServerDir/sources
@@ -0,0 +1,26 @@
+TARGETNAME=netserver
+TARGETPATH=OBJ
+TARGETTYPE=PROGRAM
+
+LINKLIBS= \
+ $(SDK_LIB_PATH)\kernel32.lib \
+ $(SDK_LIB_PATH)\ws2_32.lib \
+ $(SDK_LIB_PATH)\wsock32.lib
+
+USE_MSVCRT=1
+UMTYPE=console
+
+INCLUDES=$(SDK_INC_PATH);.
+
+MSC_WARNING_LEVEL=/W3 /WX
+
+C_DEFINES=$(C_DEFINES) -D_CONSOLE_ -DHAVE_STRUCT_SOCKADDR_STORAGE -DHAVE_GETADDRINFO -DHAVE_GETNAMEINFO -DSTDC_HEADERS
+
+SOURCES= \
+ ..\netcpu_ntperf.c \
+ ..\netlib.c \
+ ..\netsh.c \
+ ..\nettest_bsd.c \
+ inet_ntop.c \
+ ..\netserver.c
+
diff --git a/NetServerDir/sources~ b/NetServerDir/sources~
new file mode 100644
index 0000000..69117cf
--- /dev/null
+++ b/NetServerDir/sources~
@@ -0,0 +1,26 @@
+TARGETNAME=netserver
+TARGETPATH=OBJ
+TARGETTYPE=PROGRAM
+
+LINKLIBS= \
+ $(SDK_LIB_PATH)\kernel32.lib \
+ $(SDK_LIB_PATH)\ws2_32.lib \
+ $(SDK_LIB_PATH)\wsock32.lib
+
+USE_CRTDLL=1
+UMTYPE=console
+
+INCLUDES=$(SDK_INC_PATH);.
+
+MSC_WARNING_LEVEL=/W3 /WX
+
+C_DEFINES=$(C_DEFINES) -D_CONSOLE_ -DHAVE_GETADDRINFO -DHAVE_GETNAMEINFO -DSTDC_HEADERS
+
+SOURCES= \
+ ..\netcpu_ntperf.c \
+ ..\netlib.c \
+ ..\netsh.c \
+ ..\nettest_bsd.c \
+ inet_ntop.c \
+ ..\netserver.c
+
diff --git a/dirs b/dirs
new file mode 100644
index 0000000..47972b1
--- /dev/null
+++ b/dirs
@@ -0,0 +1,3 @@
+DIRS= \
+ NetPerfDir \
+ NetServerDir \ No newline at end of file
diff --git a/hist.h b/hist.h
new file mode 100644
index 0000000..b2ed22b
--- /dev/null
+++ b/hist.h
@@ -0,0 +1,116 @@
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+
+/* hist.h
+
+ Given a time difference in microseconds, increment one of 61
+ different buckets:
+
+ 0 - 9 in increments of 1 usec
+ 0 - 9 in increments of 10 usecs
+ 0 - 9 in increments of 100 usecs
+ 0 - 9 in increments of 1 msec
+ 0 - 9 in increments of 10 msecs
+ 0 - 9 in increments of 100 msecs
+ 0 - 9 in increments of 1 sec
+ 0 - 9 in increments of 10 sec
+ > 100 secs
+
+ This will allow any time to be recorded to within an accuracy of
+ 10%, and provides a compact representation for capturing the
+ distribution of a large number of time differences (e.g.
+ request-response latencies).
+
+ Colin Low 10/6/93
+ Rick Jones 2004-06-15 - extend to 1 and 10 usec
+*/
+#ifndef _HIST_INCLUDED
+#define _HIST_INCLUDED
+
+#ifdef IRIX
+#include <sys/time.h>
+#endif /* IRIX */
+
+#if defined(HAVE_GET_HRT)
+#include "hrt.h"
+#endif
+
+struct histogram_struct {
+ int unit_usec[10];
+ int ten_usec[10];
+ int hundred_usec[10];
+ int unit_msec[10];
+ int ten_msec[10];
+ int hundred_msec[10];
+ int unit_sec[10];
+ int ten_sec[10];
+ int ridiculous;
+ int total;
+};
+
+typedef struct histogram_struct *HIST;
+
+/*
+ HIST_new - return a new, cleared histogram data type
+*/
+
+HIST HIST_new(void);
+
+/*
+ HIST_clear - reset a histogram by clearing all totals to zero
+*/
+
+void HIST_clear(HIST h);
+
+/*
+ HIST_add - add a time difference to a histogram. Time should be in
+ microseconds.
+*/
+
+void HIST_add(register HIST h, int time_delta);
+
+/*
+ HIST_report - create an ASCII report on the contents of a histogram.
+ Currently printsto standard out
+*/
+
+void HIST_report(HIST h);
+
+/*
+ HIST_timestamp - take a timestamp suitable for use in a histogram.
+*/
+
+#ifdef HAVE_GETHRTIME
+void HIST_timestamp(hrtime_t *timestamp);
+#elif defined(HAVE_GET_HRT)
+void HIST_timestamp(hrt_t *timestamp);
+#elif defined(WIN32)
+void HIST_timestamp(LARGE_INTEGER *timestamp);
+#else
+void HIST_timestamp(struct timeval *timestamp);
+#endif
+
+/*
+ delta_micro - calculate the difference in microseconds between two
+ timestamps
+*/
+#ifdef HAVE_GETHRTIME
+int delta_micro(hrtime_t *begin, hrtime_t *end);
+#elif defined(HAVE_GET_HRT)
+int delta_micro(hrt_t *begin, hrt_t *end);
+#elif defined(WIN32)
+int delta_micro(LARGE_INTEGER *begin, LARGE_INTEGER *end);
+#else
+int delta_micro(struct timeval *begin, struct timeval *end);
+#endif
+
+#endif
+
diff --git a/missing/Makefile.am b/missing/Makefile.am
new file mode 100644
index 0000000..2972cca
--- /dev/null
+++ b/missing/Makefile.am
@@ -0,0 +1,7 @@
+SUBDIRS = m4
+
+if NEED_LIBCOMPAT
+noinst_LIBRARIES = libcompat.a
+libcompat_a_SOURCES = getaddrinfo.h
+libcompat_a_LIBADD = $(LIBOBJS) $(ALLOCA)
+endif
diff --git a/missing/Makefile.in b/missing/Makefile.in
new file mode 100644
index 0000000..48c17e8
--- /dev/null
+++ b/missing/Makefile.in
@@ -0,0 +1,486 @@
+# Makefile.in generated by automake 1.7.9 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
+# 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@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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 = :
+host_triplet = @host@
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+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@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GREP = @GREP@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+NEED_LIBCOMPAT_FALSE = @NEED_LIBCOMPAT_FALSE@
+NEED_LIBCOMPAT_TRUE = @NEED_LIBCOMPAT_TRUE@
+NETCPU_SOURCE = @NETCPU_SOURCE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+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@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+SUBDIRS = m4
+
+@NEED_LIBCOMPAT_TRUE@noinst_LIBRARIES = libcompat.a
+@NEED_LIBCOMPAT_TRUE@libcompat_a_SOURCES = getaddrinfo.h
+@NEED_LIBCOMPAT_TRUE@libcompat_a_LIBADD = $(LIBOBJS) $(ALLOCA)
+subdir = src/missing
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+
+libcompat_a_AR = $(AR) cru
+@NEED_LIBCOMPAT_TRUE@libcompat_a_DEPENDENCIES = @LIBOBJS@
+@NEED_LIBCOMPAT_FALSE@libcompat_a_DEPENDENCIES =
+am__libcompat_a_SOURCES_DIST = getaddrinfo.h
+@NEED_LIBCOMPAT_TRUE@am_libcompat_a_OBJECTS =
+libcompat_a_OBJECTS = $(am_libcompat_a_OBJECTS)
+
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/getaddrinfo.Po $(DEPDIR)/inet_ntop.Po
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+DIST_SOURCES = $(am__libcompat_a_SOURCES_DIST)
+
+RECURSIVE_TARGETS = info-recursive dvi-recursive pdf-recursive \
+ ps-recursive install-info-recursive uninstall-info-recursive \
+ all-recursive install-data-recursive install-exec-recursive \
+ installdirs-recursive install-recursive uninstall-recursive \
+ check-recursive installcheck-recursive
+DIST_COMMON = $(srcdir)/Makefile.in Makefile.am getaddrinfo.c \
+ inet_ntop.c
+DIST_SUBDIRS = $(SUBDIRS)
+SOURCES = $(libcompat_a_SOURCES)
+
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4)
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu src/missing/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+
+AR = ar
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libcompat.a: $(libcompat_a_OBJECTS) $(libcompat_a_DEPENDENCIES)
+ -rm -f libcompat.a
+ $(libcompat_a_AR) libcompat.a $(libcompat_a_OBJECTS) $(libcompat_a_LIBADD)
+ $(RANLIB) libcompat.a
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT) core *.core
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getaddrinfo.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/inet_ntop.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
+@am__fastdepCC_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
+@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@ fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
+
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
+@am__fastdepCC_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
+@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@ fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`
+uninstall-info-am:
+
+# 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.
+$(RECURSIVE_TARGETS):
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; 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; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ETAGS = etags
+ETAGSFLAGS =
+
+CTAGS = ctags
+CTAGSFLAGS =
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ if (etags --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ else \
+ include_option=--include; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -f $$subdir/TAGS && \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$tags$$unique" \
+ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique
+
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ../..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkinstalldirs) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -d $(distdir)/$$subdir \
+ || mkdir $(distdir)/$$subdir \
+ || exit 1; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" \
+ distdir=../$(distdir)/$$subdir \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(LIBRARIES)
+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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f $(CONFIG_CLEAN_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-noinstLIBRARIES 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:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+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
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am clean \
+ clean-generic clean-noinstLIBRARIES clean-recursive ctags \
+ ctags-recursive distclean distclean-compile distclean-generic \
+ distclean-recursive distclean-tags distdir dvi dvi-am \
+ dvi-recursive info info-am info-recursive install install-am \
+ install-data install-data-am install-data-recursive \
+ install-exec install-exec-am install-exec-recursive \
+ install-info install-info-am install-info-recursive install-man \
+ install-recursive install-strip installcheck installcheck-am \
+ installdirs installdirs-am installdirs-recursive \
+ maintainer-clean maintainer-clean-generic \
+ maintainer-clean-recursive mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-recursive pdf pdf-am \
+ pdf-recursive ps ps-am ps-recursive tags tags-recursive \
+ uninstall uninstall-am uninstall-info-am \
+ uninstall-info-recursive uninstall-recursive
+
+# 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/missing/getaddrinfo.c b/missing/getaddrinfo.c
new file mode 100644
index 0000000..f6f2916
--- /dev/null
+++ b/missing/getaddrinfo.c
@@ -0,0 +1,605 @@
+/*
+ * Copyright (c) 2001, 02 Motoyuki Kasahara
+ *
+ * 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 project 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 PROJECT 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 PROJECT 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.
+ */
+
+/*
+ * This program provides getaddrinfo() and getnameinfo() described in
+ * RFC2133, 2553 and 3493. These functions are mainly used for IPv6
+ * application to resolve hostname or address.
+ *
+ * This program is designed to be working on traditional IPv4 systems
+ * which don't have those functions. Therefore, this implementation
+ * supports IPv4 only.
+ *
+ * This program is useful for application which should support both IPv6
+ * and traditional IPv4 systems. Use genuine getaddrinfo() and getnameinfo()
+ * provided by system if the system supports IPv6. Otherwise, use this
+ * implementation.
+ *
+ * This program is intended to be used in combination with GNU Autoconf.
+ *
+ * This program also provides freeaddrinfo() and gai_strerror().
+ *
+ * To use this program in your application, insert the following lines to
+ * C source files after including `sys/types.h', `sys/socket.h' and
+ * `netdb.h'. `getaddrinfo.h' defines `struct addrinfo' and AI_, NI_,
+ * EAI_ macros.
+ *
+ * #ifndef HAVE_GETADDRINFO
+ * #include "getaddrinfo.h"
+ * #endif
+ *
+ * Restriction:
+ * getaddrinfo() and getnameinfo() of this program are NOT thread
+ * safe, unless the cpp macro ENABLE_PTHREAD is defined.
+ */
+
+/*
+ * Add the following code to your configure.ac (or configure.in).
+ * AC_C_CONST
+ * AC_HEADER_STDC
+ * AC_CHECK_HEADERS(string.h memory.h stdlib.h)
+ * AC_CHECK_FUNCS(memcpy)
+ * AC_REPLACE_FUNCS(memset)
+ * AC_TYPE_SOCKLEN_T
+ * AC_TYPE_IN_PORT_T
+ * AC_DECL_H_ERRNO
+ *
+ * AC_CHECK_FUNCS(getaddrinfo getnameinfo)
+ * if test "$ac_cv_func_getaddrinfo$ac_cv_func_getnameinfo" != yesyes ; then
+ * LIBOBJS="$LIBOBJS getaddrinfo.$ac_objext"
+ * fi
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+#include <stdio.h>
+
+#ifdef WIN32
+#include <time.h>
+#include <winsock2.h>
+#ifdef DO_IPV6
+#include <ws2tcpip.h>
+#endif /* DO_IPV6 */
+#include <windows.h>
+#else
+#include <sys/socket.h>
+#endif
+
+
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
+#include <string.h>
+#if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H)
+#include <memory.h>
+#endif /* not STDC_HEADERS and HAVE_MEMORY_H */
+#else /* not STDC_HEADERS and not HAVE_STRING_H */
+#include <strings.h>
+#endif /* not STDC_HEADERS and not HAVE_STRING_H */
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef ENABLE_PTHREAD
+#include <pthread.h>
+#endif
+
+#ifdef ENABLE_NLS
+#include <libintl.h>
+#endif
+
+#ifndef HAVE_MEMCPY
+#define memcpy(d, s, n) bcopy((s), (d), (n))
+#ifdef __STDC__
+void *memchr(const void *, int, size_t);
+int memcmp(const void *, const void *, size_t);
+void *memmove(void *, const void *, size_t);
+void *memset(void *, int, size_t);
+#else /* not __STDC__ */
+char *memchr();
+int memcmp();
+char *memmove();
+char *memset();
+#endif /* not __STDC__ */
+#endif /* not HAVE_MEMCPY */
+
+#ifndef H_ERRNO_DECLARED
+extern int h_errno;
+#endif
+
+#include "getaddrinfo.h"
+
+#ifdef ENABLE_NLS
+#define _(string) gettext(string)
+#ifdef gettext_noop
+#define N_(string) gettext_noop(string)
+#else
+#define N_(string) (string)
+#endif
+#else
+#define gettext(string) (string)
+#define _(string) (string)
+#define N_(string) (string)
+#endif
+
+/*
+ * Error messages for gai_strerror().
+ */
+static char *eai_errlist[] = {
+ N_("Success"),
+
+ /* EAI_ADDRFAMILY */
+ N_("Address family for hostname not supported"),
+
+ /* EAI_AGAIN */
+ N_("Temporary failure in name resolution"),
+
+ /* EAI_BADFLAGS */
+ N_("Invalid value for ai_flags"),
+
+ /* EAI_FAIL */
+ N_("Non-recoverable failure in name resolution"),
+
+ /* EAI_FAMILY */
+ N_("ai_family not supported"),
+
+ /* EAI_MEMORY */
+ N_("Memory allocation failure"),
+
+ /* EAI_NONAME */
+ N_("hostname nor servname provided, or not known"),
+
+ /* EAI_OVERFLOW */
+ N_("An argument buffer overflowed"),
+
+ /* EAI_SERVICE */
+ N_("servname not supported for ai_socktype"),
+
+ /* EAI_SOCKTYPE */
+ N_("ai_socktype not supported"),
+
+ /* EAI_SYSTEM */
+ N_("System error returned in errno")
+};
+
+/*
+ * Default hints for getaddrinfo().
+ */
+static struct addrinfo default_hints = {
+ 0, PF_UNSPEC, 0, 0, 0, NULL, NULL, NULL
+};
+
+/*
+ * Mutex.
+ */
+#ifdef ENABLE_PTHREAD
+static pthread_mutex_t gai_mutex = PTHREAD_MUTEX_INITIALIZER;
+#endif
+
+/*
+ * Declaration of static functions.
+ */
+#ifdef __STDC__
+static int is_integer(const char *);
+static int is_address(const char *);
+static int itoa_length(int);
+#else
+static int is_integer();
+static int is_address();
+static int itoa_length();
+#endif
+
+/*
+ * gai_strerror().
+ */
+const char *
+gai_strerror(ecode)
+ int ecode;
+{
+ if (ecode < 0 || ecode > EAI_SYSTEM)
+ return _("Unknown error");
+
+ return gettext(eai_errlist[ecode]);
+}
+
+/*
+ * freeaddrinfo().
+ */
+void
+freeaddrinfo(ai)
+ struct addrinfo *ai;
+{
+ struct addrinfo *next_ai;
+
+ while (ai != NULL) {
+ if (ai->ai_canonname != NULL)
+ free(ai->ai_canonname);
+ if (ai->ai_addr != NULL)
+ free(ai->ai_addr);
+ next_ai = ai->ai_next;
+ free(ai);
+ ai = next_ai;
+ }
+}
+
+/*
+ * Return 1 if the string `s' represents an integer.
+ */
+static int
+is_integer(s)
+ const char *s;
+{
+ if (*s == '-' || *s == '+')
+ s++;
+ if (*s < '0' || '9' < *s)
+ return 0;
+
+ s++;
+ while ('0' <= *s && *s <= '9')
+ s++;
+
+ return (*s == '\0');
+}
+
+/*
+ * Return 1 if the string `s' represents an IPv4 address.
+ * Unlike inet_addr(), it doesn't permit malformed nortation such
+ * as "192.168".
+ */
+static int
+is_address(s)
+ const char *s;
+{
+ const static char delimiters[] = {'.', '.', '.', '\0'};
+ int i, j;
+ int octet;
+
+ for (i = 0; i < 4; i++) {
+ if (*s == '0' && *(s + 1) != delimiters[i])
+ return 0;
+ for (j = 0, octet = 0; '0' <= *s && *s <= '9' && j < 3; s++, j++)
+ octet = octet * 10 + (*s - '0');
+ if (j == 0 || octet > 255 || *s != delimiters[i])
+ return 0;
+ s++;
+ }
+
+ return 1;
+}
+
+/*
+ * Calcurate length of the string `s', where `s' is set by
+ * sprintf(s, "%d", n).
+ */
+static int
+itoa_length(n)
+ int n;
+{
+ int result = 1;
+
+ if (n < 0) {
+ n = -n;
+ result++;
+ }
+
+ while (n >= 10) {
+ result++;
+ n /= 10;
+ }
+
+ return result;
+}
+
+/*
+ * getaddrinfo().
+ */
+int
+getaddrinfo(nodename, servname, hints, res)
+ const char *nodename;
+ const char *servname;
+ const struct addrinfo *hints;
+ struct addrinfo **res;
+{
+ struct addrinfo *head_res = NULL;
+ struct addrinfo *tail_res = NULL;
+ struct addrinfo *new_res;
+ struct sockaddr_in *sa_in;
+ struct in_addr **addr_list;
+ struct in_addr *addr_list_buf[2];
+ struct in_addr addr_buf;
+ struct in_addr **ap;
+ struct servent *servent;
+ struct hostent *hostent;
+ const char *canonname = NULL;
+ in_port_t port;
+ int saved_h_errno;
+ int result = 0;
+
+#ifdef ENABLE_PTHREAD
+ pthread_mutex_lock(&gai_mutex);
+#endif
+
+ saved_h_errno = h_errno;
+
+ if (nodename == NULL && servname == NULL) {
+ result = EAI_NONAME;
+ goto end;
+ }
+
+ if (hints != NULL) {
+ if (hints->ai_family != PF_INET && hints->ai_family != PF_UNSPEC) {
+ result = EAI_FAMILY;
+ goto end;
+ }
+ if (hints->ai_socktype != SOCK_DGRAM
+ && hints->ai_socktype != SOCK_STREAM
+ && hints->ai_socktype != 0) {
+ result = EAI_SOCKTYPE;
+ goto end;
+ }
+ } else {
+ hints = &default_hints;
+ }
+
+ if (servname != NULL) {
+ if (is_integer(servname))
+ port = htons(atoi(servname));
+ else {
+ if (hints->ai_flags & AI_NUMERICSERV) {
+ result = EAI_NONAME;
+ goto end;
+ }
+
+ if (hints->ai_socktype == SOCK_DGRAM)
+ servent = getservbyname(servname, "udp");
+ else if (hints->ai_socktype == SOCK_STREAM)
+ servent = getservbyname(servname, "tcp");
+ else if (hints->ai_socktype == 0)
+ servent = getservbyname(servname, "tcp");
+ else {
+ result = EAI_SOCKTYPE;
+ goto end;
+ }
+
+ if (servent == NULL) {
+ result = EAI_SERVICE;
+ goto end;
+ }
+ port = servent->s_port;
+ }
+ } else {
+ port = htons(0);
+ }
+
+ if (nodename != NULL) {
+ if (is_address(nodename)) {
+ addr_buf.s_addr = inet_addr(nodename);
+ addr_list_buf[0] = &addr_buf;
+ addr_list_buf[1] = NULL;
+ addr_list = addr_list_buf;
+
+ if (hints->ai_flags & AI_CANONNAME
+ && !(hints->ai_flags & AI_NUMERICHOST)) {
+ hostent = gethostbyaddr((char *)&addr_buf,
+ sizeof(struct in_addr), AF_INET);
+ if (hostent != NULL)
+ canonname = hostent->h_name;
+ else
+ canonname = nodename;
+ }
+ } else {
+ if (hints->ai_flags & AI_NUMERICHOST) {
+ result = EAI_NONAME;
+ goto end;
+ }
+
+ hostent = gethostbyname(nodename);
+ if (hostent == NULL) {
+ switch (h_errno) {
+ case HOST_NOT_FOUND:
+ case NO_DATA:
+ result = EAI_NONAME;
+ goto end;
+ case TRY_AGAIN:
+ result = EAI_AGAIN;
+ goto end;
+ default:
+ result = EAI_FAIL;
+ goto end;
+ }
+ }
+ addr_list = (struct in_addr **)hostent->h_addr_list;
+
+ if (hints->ai_flags & AI_CANONNAME)
+ canonname = hostent->h_name;
+ }
+ } else {
+ if (hints->ai_flags & AI_PASSIVE)
+ addr_buf.s_addr = htonl(INADDR_ANY);
+ else
+ addr_buf.s_addr = htonl(0x7F000001);
+ addr_list_buf[0] = &addr_buf;
+ addr_list_buf[1] = NULL;
+ addr_list = addr_list_buf;
+ }
+
+ for (ap = addr_list; *ap != NULL; ap++) {
+ new_res = (struct addrinfo *)malloc(sizeof(struct addrinfo));
+ if (new_res == NULL) {
+ if (head_res != NULL)
+ freeaddrinfo(head_res);
+ result = EAI_MEMORY;
+ goto end;
+ }
+
+ new_res->ai_family = PF_INET;
+ new_res->ai_socktype = hints->ai_socktype;
+ new_res->ai_protocol = hints->ai_protocol;
+ new_res->ai_addr = NULL;
+ new_res->ai_addrlen = sizeof(struct sockaddr_in);
+ new_res->ai_canonname = NULL;
+ new_res->ai_next = NULL;
+
+ new_res->ai_addr = (struct sockaddr *)
+ malloc(sizeof(struct sockaddr_in));
+ if (new_res->ai_addr == NULL) {
+ free(new_res);
+ if (head_res != NULL)
+ freeaddrinfo(head_res);
+ result = EAI_MEMORY;
+ goto end;
+ }
+
+ sa_in = (struct sockaddr_in *)new_res->ai_addr;
+ memset(sa_in, 0, sizeof(struct sockaddr_in));
+ sa_in->sin_family = PF_INET;
+ sa_in->sin_port = port;
+ memcpy(&sa_in->sin_addr, *ap, sizeof(struct in_addr));
+
+ if (head_res == NULL)
+ head_res = new_res;
+ else
+ tail_res->ai_next = new_res;
+ tail_res = new_res;
+ }
+
+ if (canonname != NULL && head_res != NULL) {
+ head_res->ai_canonname = (char *)malloc(strlen(canonname) + 1);
+ if (head_res->ai_canonname != NULL)
+ strcpy(head_res->ai_canonname, canonname);
+ }
+
+ *res = head_res;
+
+ end:
+ h_errno = saved_h_errno;
+#ifdef ENABLE_PTHREAD
+ pthread_mutex_unlock(&gai_mutex);
+#endif
+ return result;
+}
+
+/*
+ * getnameinfo().
+ */
+int
+getnameinfo(sa, salen, node, nodelen, serv, servlen, flags)
+ const struct sockaddr *sa;
+ socklen_t salen;
+ char *node;
+ socklen_t nodelen;
+ char *serv;
+ socklen_t servlen;
+ int flags;
+{
+ const struct sockaddr_in *sa_in = (const struct sockaddr_in *)sa;
+ struct hostent *hostent;
+ struct servent *servent;
+ char *ntoa_address;
+ int saved_h_errno;
+ int result = 0;
+
+#ifdef ENABLE_PTHREAD
+ pthread_mutex_lock(&gai_mutex);
+#endif
+
+ saved_h_errno = h_errno;
+
+ if (sa_in->sin_family != PF_INET) {
+ result = EAI_FAMILY;
+ goto end;
+ } else if (node == NULL && serv == NULL) {
+ result = EAI_NONAME;
+ goto end;
+ }
+
+ if (serv != NULL && servlen > 0) {
+ if (flags & NI_NUMERICSERV)
+ servent = NULL;
+ else if (flags & NI_DGRAM)
+ servent = getservbyport(sa_in->sin_port, "udp");
+ else
+ servent = getservbyport(sa_in->sin_port, "tcp");
+
+ if (servent != NULL) {
+ if (servlen <= strlen(servent->s_name)) {
+ result = EAI_OVERFLOW;
+ goto end;
+ }
+ strcpy(serv, servent->s_name);
+ } else {
+ if (servlen <= itoa_length(ntohs(sa_in->sin_port))) {
+ result = EAI_OVERFLOW;
+ goto end;
+ }
+ sprintf(serv, "%d", ntohs(sa_in->sin_port));
+ }
+ }
+
+ if (node != NULL && nodelen > 0) {
+ if (flags & NI_NUMERICHOST)
+ hostent = NULL;
+ else {
+ hostent = gethostbyaddr((char *)&sa_in->sin_addr,
+ sizeof(struct in_addr), AF_INET);
+ }
+ if (hostent != NULL) {
+ if (nodelen <= strlen(hostent->h_name)) {
+ result = EAI_OVERFLOW;
+ goto end;
+ }
+ strcpy(node, hostent->h_name);
+ } else {
+ if (flags & NI_NAMEREQD) {
+ result = EAI_NONAME;
+ goto end;
+ }
+ ntoa_address = inet_ntoa(sa_in->sin_addr);
+ if (nodelen <= strlen(ntoa_address)) {
+ result = EAI_OVERFLOW;
+ goto end;
+ }
+ strcpy(node, ntoa_address);
+ }
+
+ }
+
+ end:
+ h_errno = saved_h_errno;
+#ifdef ENABLE_PTHREAD
+ pthread_mutex_unlock(&gai_mutex);
+#endif
+ return result;
+}
+
diff --git a/missing/getaddrinfo.h b/missing/getaddrinfo.h
new file mode 100644
index 0000000..f965a8b
--- /dev/null
+++ b/missing/getaddrinfo.h
@@ -0,0 +1,238 @@
+/*
+ * Copyright (c) 2001, 02 Motoyuki Kasahara
+ *
+ * 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 project 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 PROJECT 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 PROJECT 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.
+ */
+
+#ifndef GETADDRINFO_H
+#define GETADDRINFO_H
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+
+#ifdef WIN32
+#include <time.h>
+#include <winsock2.h>
+#ifdef DO_IPV6
+#include <ws2tcpip.h>
+#endif /* DO_IPV6 */
+#include <windows.h>
+#else
+#include <sys/socket.h>
+#include <netdb.h>
+#endif
+
+
+/********************************************************************/
+/*
+ * Undefine all the macros.
+ * <netdb.h> might defines some of them.
+ */
+#ifdef EAI_ADDRFAMILY
+#undef EAI_ADDRFAMILY
+#endif
+#ifdef EAI_AGAIN
+#undef EAI_AGAIN
+#endif
+#ifdef EAI_BADFLAGS
+#undef EAI_BADFLAGS
+#endif
+#ifdef EAI_FAIL
+#undef EAI_FAIL
+#endif
+#ifdef EAI_FAMILY
+#undef EAI_FAMILY
+#endif
+#ifdef EAI_MEMORY
+#undef EAI_MEMORY
+#endif
+#ifdef EAI_NONAME
+#undef EAI_NONAME
+#endif
+#ifdef EAI_OVERFLOW
+#undef EAI_OVERFLOW
+#endif
+#ifdef EAI_SERVICE
+#undef EAI_SERVICE
+#endif
+#ifdef EAI_SOCKTYPE
+#undef EAI_SOCKTYPE
+#endif
+#ifdef EAI_SYSTEM
+#undef EAI_SYSTEM
+#endif
+
+#ifdef AI_PASSIVE
+#undef AI_PASSIVE
+#endif
+#ifdef AI_CANONNAME
+#undef AI_CANONNAME
+#endif
+#ifdef AI_NUMERICHOST
+#undef AI_NUMERICHOST
+#endif
+#ifdef AI_NUMERICSERV
+#undef AI_NUMERICSERV
+#endif
+#ifdef AI_V4MAPPED
+#undef AI_V4MAPPED
+#endif
+#ifdef AI_ALL
+#undef AI_ALL
+#endif
+#ifdef AI_ADDRCONFIG
+#undef AI_ADDRCONFIG
+#endif
+#ifdef AI_DEFAULT
+#undef AI_DEFAULT
+#endif
+
+#ifdef NI_NOFQDN
+#undef NI_NOFQDN
+#endif
+#ifdef NI_NUMERICHOST
+#undef NI_NUMERICHOST
+#endif
+#ifdef NI_NAMEREQD
+#undef NI_NAMEREQD
+#endif
+#ifdef NI_NUMERICSERV
+#undef NI_NUMERICSERV
+#endif
+#ifdef NI_NUMERICSCOPE
+#undef NI_NUMERICSCOPE
+#endif
+
+#ifdef NI_DGRAM
+#undef NI_DGRAM
+#endif
+#ifdef NI_MAXHOST
+#undef NI_MAXHOST
+#endif
+#ifdef NI_MAXSERV
+#undef NI_MAXSERV
+#endif
+
+/*
+ * Fake struct and function names.
+ * <netdb.h> might declares all or some of them.
+ */
+#if defined(HAVE_GETADDRINFO) || defined(HAVE_GETNAMEINFO)
+#define addrinfo my_addrinfo
+#define gai_strerror my_gai_strerror
+#define freeaddrinfo my_freeaddrinfo
+#define getaddrinfo my_getaddrinfo
+#define getnameinfo my_getnameinfo
+#endif
+
+/********************************************************************/
+/*
+ * Error codes.
+ */
+#define EAI_ADDRFAMILY 1
+#define EAI_AGAIN 2
+#define EAI_BADFLAGS 3
+#define EAI_FAIL 4
+#define EAI_FAMILY 5
+#define EAI_MEMORY 6
+#define EAI_NONAME 7
+#define EAI_OVERFLOW 8
+#define EAI_SERVICE 9
+#define EAI_SOCKTYPE 10
+#define EAI_SYSTEM 11
+
+/*
+ * Flags for getaddrinfo().
+ */
+#define AI_ADDRCONFIG 0x0001
+#define AI_ALL 0x0002
+#define AI_CANONNAME 0x0004
+#define AI_NUMERICHOST 0x0008
+#define AI_NUMERICSERV 0x0010
+#define AI_PASSIVE 0x0020
+#define AI_V4MAPPED 0x0040
+#define AI_DEFAULT (AI_V4MAPPED | AI_ADDRCONFIG)
+
+/*
+ * Flags for getnameinfo().
+ */
+#define NI_DGRAM 0x0001
+#define NI_NAMEREQD 0x0002
+#define NI_NOFQDN 0x0004
+#define NI_NUMERICHOST 0x0008
+#define NI_NUMERICSCOPE 0x0010
+#define NI_NUMERICSERV 0x0020
+
+/*
+ * Maximum length of FQDN and servie name for getnameinfo().
+ */
+#define NI_MAXHOST 1025
+#define NI_MAXSERV 32
+
+/*
+ * Address families and Protocol families.
+ */
+#ifndef AF_UNSPEC
+#define AF_UNSPEC AF_INET
+#endif
+#ifndef PF_UNSPEC
+#define PF_UNSPEC PF_INET
+#endif
+
+/*
+ * struct addrinfo.
+ */
+struct addrinfo {
+ int ai_flags;
+ int ai_family;
+ int ai_socktype;
+ int ai_protocol;
+ socklen_t ai_addrlen;
+ char *ai_canonname;
+ struct sockaddr *ai_addr;
+ struct addrinfo *ai_next;
+};
+
+/*
+ * Functions.
+ */
+#ifdef __STDC__
+const char *gai_strerror(int);
+void freeaddrinfo(struct addrinfo *);
+int getaddrinfo(const char *, const char *, const struct addrinfo *,
+ struct addrinfo **);
+int getnameinfo(const struct sockaddr *, socklen_t, char *,
+ socklen_t, char *, socklen_t, int);
+#else
+const char *gai_strerror();
+void freeaddrinfo();
+int getaddrinfo();
+int getnameinfo();
+#endif
+
+#endif /* not GETADDRINFO_H */
diff --git a/missing/inet_ntop.c b/missing/inet_ntop.c
new file mode 100644
index 0000000..77a4455
--- /dev/null
+++ b/missing/inet_ntop.c
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) 1999 Kungliga Tekniska Högskolan
+ * (Royal Institute of Technology, Stockholm, Sweden).
+ * 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. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the Kungliga Tekniska
+ * Högskolan and its contributors.
+ *
+ * 4. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
+ */
+
+/* $Id: inet_ntop.c,v 1.7 2003/11/16 09:36:50 guy Exp $ */
+
+#ifndef lint
+static const char rcsid[] =
+ "@(#) $Header: /tcpdump/master/tcpdump/missing/inet_ntop.c,v 1.7 2003/11/16 09:36:50 guy Exp $";
+#endif
+
+/* we aren't tcpdump :) */
+#ifdef notdef
+#include <tcpdump-stdinc.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+
+#ifndef WIN32
+#include <errno.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+#else /* WIN32 */
+#include <time.h>
+#include <winsock2.h>
+#ifdef DO_IPV6
+#include <ws2tcpip.h>
+#endif /* DO_IPV6 */
+#include <windows.h>
+
+/* The below are copied from netlib.h */
+#ifdef errno
+/* delete the one from stdlib.h */
+/*#define errno (*_errno()) */
+#undef errno
+#endif
+#define errno GetLastError()
+#define Set_errno(num) SetLastError((num))
+
+/* INVALID_SOCKET == INVALID_HANDLE_VALUE == (unsigned int)(~0) */
+/* SOCKET_ERROR == -1 */
+#define ENOTSOCK WSAENOTSOCK
+#define EINTR WSAEINTR
+#define ENOBUFS WSAENOBUFS
+#define EWOULDBLOCK WSAEWOULDBLOCK
+#define EAFNOSUPPORT WSAEAFNOSUPPORT
+/* from public\sdk\inc\crt\errno.h */
+#define ENOSPC 28
+#endif /* WIN32 */
+
+/*
+ *
+ */
+
+#ifndef INET_ADDRSTRLEN
+#define INET_ADDRSTRLEN 16
+#endif
+
+static const char *
+inet_ntop_v4 (const void *src, char *dst, size_t size)
+{
+ const char digits[] = "0123456789";
+ int i;
+ struct in_addr *addr = (struct in_addr *)src;
+ u_long a = ntohl(addr->s_addr);
+ const char *orig_dst = dst;
+
+ if (size < INET_ADDRSTRLEN) {
+ Set_errno(ENOSPC);
+ return NULL;
+ }
+ for (i = 0; i < 4; ++i) {
+ int n = (a >> (24 - i * 8)) & 0xFF;
+ int non_zerop = 0;
+
+ if (non_zerop || n / 100 > 0) {
+ *dst++ = digits[n / 100];
+ n %= 100;
+ non_zerop = 1;
+ }
+ if (non_zerop || n / 10 > 0) {
+ *dst++ = digits[n / 10];
+ n %= 10;
+ non_zerop = 1;
+ }
+ *dst++ = digits[n];
+ if (i != 3)
+ *dst++ = '.';
+ }
+ *dst++ = '\0';
+ return orig_dst;
+}
+
+const char *
+inet_ntop(int af, const void *src, char *dst, size_t size)
+{
+ switch (af) {
+ case AF_INET :
+ return inet_ntop_v4 (src, dst, size);
+ default :
+ Set_errno(EAFNOSUPPORT);
+ return NULL;
+ }
+}
diff --git a/missing/m4/Makefile.am b/missing/m4/Makefile.am
new file mode 100644
index 0000000..7bcfad9
--- /dev/null
+++ b/missing/m4/Makefile.am
@@ -0,0 +1 @@
+EXTRA_DIST = *.m4
diff --git a/missing/m4/Makefile.in b/missing/m4/Makefile.in
new file mode 100644
index 0000000..4456a03
--- /dev/null
+++ b/missing/m4/Makefile.in
@@ -0,0 +1,269 @@
+# Makefile.in generated by automake 1.7.9 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
+# 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@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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 = :
+host_triplet = @host@
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+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@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GREP = @GREP@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+NEED_LIBCOMPAT_FALSE = @NEED_LIBCOMPAT_FALSE@
+NEED_LIBCOMPAT_TRUE = @NEED_LIBCOMPAT_TRUE@
+NETCPU_SOURCE = @NETCPU_SOURCE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+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@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+EXTRA_DIST = *.m4
+subdir = src/missing/m4
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DIST_COMMON = $(srcdir)/Makefile.in Makefile.am
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4)
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu src/missing/m4/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ../../..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkinstalldirs) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f $(CONFIG_CLEAN_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 mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+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
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+ distclean-generic distdir dvi dvi-am info info-am install \
+ install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \
+ uninstall-info-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/missing/m4/herrno.m4 b/missing/m4/herrno.m4
new file mode 100644
index 0000000..f0c0d9b
--- /dev/null
+++ b/missing/m4/herrno.m4
@@ -0,0 +1,41 @@
+dnl *
+dnl * Copyright (c) 2001 Motoyuki Kasahara
+dnl *
+dnl * Redistribution and use in source and binary forms, with or without
+dnl * modification, are permitted provided that the following conditions
+dnl * are met:
+dnl * 1. Redistributions of source code must retain the above copyright
+dnl * notice, this list of conditions and the following disclaimer.
+dnl * 2. Redistributions in binary form must reproduce the above copyright
+dnl * notice, this list of conditions and the following disclaimer in the
+dnl * documentation and/or other materials provided with the distribution.
+dnl * 3. Neither the name of the project nor the names of its contributors
+dnl * may be used to endorse or promote products derived from this software
+dnl * without specific prior written permission.
+dnl *
+dnl * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+dnl * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+dnl * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+dnl * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORSBE
+dnl * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+dnl * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+dnl * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+dnl * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+dnl * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+dnl * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+dnl * THE POSSIBILITY OF SUCH DAMAGE.
+dnl *
+
+dnl *
+dnl * Check for h_errno.
+dnl *
+AC_DEFUN([AC_DECL_H_ERRNO],
+[AC_CACHE_CHECK(for h_errno declaration in netdb.h, ac_cv_decl_h_errno,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <netdb.h>]], [[
+h_errno = 0;
+]])],[ac_cv_decl_h_errno=yes],[ac_cv_decl_h_errno=no])])
+if test "$ac_cv_decl_h_errno" = yes; then
+ AC_DEFINE(H_ERRNO_DECLARED, 1,
+[Define to 1 if `h_errno' is declared by <netdb.h>])
+fi])
diff --git a/missing/m4/in6addr.m4 b/missing/m4/in6addr.m4
new file mode 100644
index 0000000..fd6e82f
--- /dev/null
+++ b/missing/m4/in6addr.m4
@@ -0,0 +1,89 @@
+dnl *
+dnl * Copyright (c) 2001 Motoyuki Kasahara
+dnl *
+dnl * Redistribution and use in source and binary forms, with or without
+dnl * modification, are permitted provided that the following conditions
+dnl * are met:
+dnl * 1. Redistributions of source code must retain the above copyright
+dnl * notice, this list of conditions and the following disclaimer.
+dnl * 2. Redistributions in binary form must reproduce the above copyright
+dnl * notice, this list of conditions and the following disclaimer in the
+dnl * documentation and/or other materials provided with the distribution.
+dnl * 3. Neither the name of the project nor the names of its contributors
+dnl * may be used to endorse or promote products derived from this software
+dnl * without specific prior written permission.
+dnl *
+dnl * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+dnl * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+dnl * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+dnl * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORSBE
+dnl * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+dnl * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+dnl * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+dnl * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+dnl * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+dnl * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+dnl * THE POSSIBILITY OF SUCH DAMAGE.
+dnl *
+
+dnl *
+dnl * Check for struct in6_addr
+dnl *
+AC_DEFUN([AC_STRUCT_IN6_ADDR],
+[AC_CACHE_CHECK(for struct in6_addr, ac_cv_struct_in6_addr,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>]], [[
+struct in6_addr address;
+]])],[ac_cv_struct_in6_addr=yes],[ac_cv_struct_in6_addr=no])])
+if test "$ac_cv_struct_in6_addr" = yes; then
+ AC_DEFINE(HAVE_STRUCT_IN6_ADDR, 1,
+[Define to 1 if <netinet/in.h> defines `struct in6_addr'])
+fi])
+
+dnl *
+dnl * Check for in6addr_any.
+dnl *
+AC_DEFUN([AC_DECL_IN6ADDR_ANY],
+[AC_REQUIRE([AC_STRUCT_IN6_ADDR])
+if test $ac_cv_struct_in6_addr = no; then
+ ac_cv_decl_in6addr_any=no
+else
+ AC_CACHE_CHECK(for in6addr_any declaration in netinet/in.h,
+ ac_cv_decl_in6addr_any,
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>]], [[
+unsigned char *address;
+address = (char *)&in6addr_any;
+]])],[ac_cv_decl_in6addr_any=yes],[ac_cv_decl_in6addr_any=no])])
+ if test "$ac_cv_decl_in6addr_any" = yes; then
+ AC_DEFINE(IN6ADDR_ANY_DECLARED, 1,
+[Define to 1 if `in6addr_any' is declared by <netinet/in.h>])
+ fi
+fi])
+
+dnl *
+dnl * Check for in6addr_loopback.
+dnl *
+AC_DEFUN([AC_DECL_IN6ADDR_LOOPBACK],
+[AC_REQUIRE([AC_STRUCT_IN6_ADDR])
+if test $ac_cv_struct_in6_addr = no; then
+ ac_cv_decl_in6addr_loopback=no
+else
+ AC_CACHE_CHECK(for in6addr_loopback declaration in netinet/in.h,
+ ac_cv_decl_in6addr_loopback,
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>]], [[
+unsigned char *address;
+address = (char *)&in6addr_loopback;
+]])],[ac_cv_decl_in6addr_loopback=yes],[ac_cv_decl_in6addr_loopback=no])])
+ if test "$ac_cv_decl_in6addr_loopback" = yes; then
+ AC_DEFINE(IN6ADDR_LOOPBACK_DECLARED, 1,
+[Define to 1 if `in6addr_loopback' is declared by <netinet/in.h>])
+ fi
+fi])
diff --git a/missing/m4/sockaddrin6.m4 b/missing/m4/sockaddrin6.m4
new file mode 100644
index 0000000..c4270f3
--- /dev/null
+++ b/missing/m4/sockaddrin6.m4
@@ -0,0 +1,60 @@
+dnl *
+dnl * Copyright (c) 2001 Motoyuki Kasahara
+dnl *
+dnl * Redistribution and use in source and binary forms, with or without
+dnl * modification, are permitted provided that the following conditions
+dnl * are met:
+dnl * 1. Redistributions of source code must retain the above copyright
+dnl * notice, this list of conditions and the following disclaimer.
+dnl * 2. Redistributions in binary form must reproduce the above copyright
+dnl * notice, this list of conditions and the following disclaimer in the
+dnl * documentation and/or other materials provided with the distribution.
+dnl * 3. Neither the name of the project nor the names of its contributors
+dnl * may be used to endorse or promote products derived from this software
+dnl * without specific prior written permission.
+dnl *
+dnl * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+dnl * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+dnl * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+dnl * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORSBE
+dnl * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+dnl * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+dnl * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+dnl * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+dnl * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+dnl * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+dnl * THE POSSIBILITY OF SUCH DAMAGE.
+dnl *
+
+dnl *
+dnl * Check for struct sockaddr_in6
+dnl *
+AC_DEFUN([AC_STRUCT_SOCKADDR_IN6],
+[AC_CACHE_CHECK(for struct sockaddr_in6, ac_cv_struct_sockaddr_in6,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>]], [[
+struct sockaddr_in6 address;
+]])],[ac_cv_struct_sockaddr_in6=yes],[ac_cv_struct_sockaddr_in6=no])])
+if test "$ac_cv_struct_sockaddr_in6" = yes; then
+ AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6, 1,
+[Define to 1 if <netinet/in.h> defines `struct sockaddr_in6'])
+fi])
+
+dnl *
+dnl * Check for struct sockaddr_storage
+dnl *
+AC_DEFUN([AC_STRUCT_SOCKADDR_STORAGE],
+[AC_CACHE_CHECK(for struct sockaddr_storage, ac_cv_struct_sockaddr_storage,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>]], [[
+struct sockaddr_storage address;
+]])],[ac_cv_struct_sockaddr_storage=yes],[ac_cv_struct_sockaddr_storage=no])])
+if test "$ac_cv_struct_sockaddr_storage" = yes; then
+ AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE, 1,
+[Define to 1 if <netinet/in.h> defines `struct sockaddr_storage'])
+fi])
+
diff --git a/missing/m4/sockinttypes.m4 b/missing/m4/sockinttypes.m4
new file mode 100644
index 0000000..6d94063
--- /dev/null
+++ b/missing/m4/sockinttypes.m4
@@ -0,0 +1,154 @@
+dnl *
+dnl * Copyright (c) 2001, 2003 Motoyuki Kasahara
+dnl *
+dnl * Redistribution and use in source and binary forms, with or without
+dnl * modification, are permitted provided that the following conditions
+dnl * are met:
+dnl * 1. Redistributions of source code must retain the above copyright
+dnl * notice, this list of conditions and the following disclaimer.
+dnl * 2. Redistributions in binary form must reproduce the above copyright
+dnl * notice, this list of conditions and the following disclaimer in the
+dnl * documentation and/or other materials provided with the distribution.
+dnl * 3. Neither the name of the project nor the names of its contributors
+dnl * may be used to endorse or promote products derived from this software
+dnl * without specific prior written permission.
+dnl *
+dnl * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+dnl * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+dnl * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+dnl * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORSBE
+dnl * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+dnl * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+dnl * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+dnl * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+dnl * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+dnl * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+dnl * THE POSSIBILITY OF SUCH DAMAGE.
+dnl *
+
+dnl *
+dnl * Check for socklen_t.
+dnl *
+AC_DEFUN([AC_TYPE_SOCKLEN_T],
+[AC_CACHE_CHECK([for socklen_t], ac_cv_type_socklen_t,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/socket.h>]], [[
+socklen_t socklen;
+]])],[ac_cv_type_socklen_t=yes],[ac_cv_type_socklen_t=no])])
+if test "$ac_cv_type_socklen_t" != yes; then
+ AC_DEFINE(socklen_t, int,
+[Define to `int' if <sys/types.h> or <sys/socket.h> does not define.])
+fi])
+
+dnl *
+dnl * Check for in_port_t.
+dnl *
+AC_DEFUN([AC_TYPE_IN_PORT_T],
+[AC_CACHE_CHECK([for in_port_t], ac_cv_type_in_port_t,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>]], [[
+in_port_t in_port;
+]])],[ac_cv_type_in_port_t=yes],[ac_cv_type_in_port_t=no])])
+if test "$ac_cv_type_in_port_t" != yes; then
+ ac_cv_sin_port_size=unknown
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+ int main() {
+ struct sockaddr_in addr;
+ return (sizeof(addr.sin_port) == sizeof(long)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sin_port_size=long],[],[])
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+ int main() {
+ struct sockaddr_in addr;
+ return (sizeof(addr.sin_port) == sizeof(int)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sin_port_size=int],[],[])
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+ int main() {
+ struct sockaddr_in addr;
+ return (sizeof(addr.sin_port) == sizeof(short)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sin_port_size=short],[],[])
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+ int main() {
+ struct sockaddr_in addr;
+ return (sizeof(addr.sin_port) == sizeof(char)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sin_port_size=char],[],[])
+ if test "$ac_cv_sin_port_size" = unknown; then
+ AC_MSG_ERROR([Failed to get size of sin_port in struct sockaddr_in.])
+ fi
+ AC_DEFINE_UNQUOTED(in_port_t, unsigned $ac_cv_sin_port_size,
+[Define to `unsigned char', `unsigned short', `unsigned int' or
+`unsigned long' according with size of `sin_port' in `struct sockaddr_in',
+if <sys/types.h>, <sys/socket.h> or <netinet/in.h> does not define
+`in_port_t'.])
+fi])
+
+dnl *
+dnl * Check for sa_family_t.
+dnl *
+AC_DEFUN([AC_TYPE_SA_FAMILY_T],
+[AC_CACHE_CHECK([for sa_family_t], ac_cv_type_sa_family_t,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/socket.h>]], [[
+sa_family_t sa_family;
+]])],[ac_cv_type_sa_family_t=yes],[ac_cv_type_sa_family_t=no])])
+if test "$ac_cv_type_sa_family_t" != yes; then
+ ac_cv_sa_family_size=unknown
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ int main() {
+ struct sockaddr addr;
+ return (sizeof(addr.sa_family) == sizeof(long)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sa_family_size=long],[],[])
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ int main() {
+ struct sockaddr addr;
+ return (sizeof(addr.sa_family) == sizeof(int)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sa_family_size=int],[],[])
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ int main() {
+ struct sockaddr addr;
+ return (sizeof(addr.sa_family) == sizeof(short)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sa_family_size=short],[],[])
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ int main() {
+ struct sockaddr addr;
+ return (sizeof(addr.sa_family) == sizeof(char)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sa_family_size=char],[],[])
+ if test "$ac_cv_sa_family_size" = unknown; then
+ AC_MSG_ERROR([Failed to get size of sa_family in struct sockaddr.])
+ fi
+ AC_DEFINE_UNQUOTED(sa_family_t, unsigned $ac_cv_sa_family_size,
+[Define to `unsigned char', `unsigned short', `unsigned int' or
+`unsigned long' according with size of `sa_family' in `struct sockaddr',
+if <sys/types.h> or <sys/socket.h> does not define `sa_family_t'.])
+fi])
diff --git a/missing/m4/socklent.m4 b/missing/m4/socklent.m4
new file mode 100644
index 0000000..6849925
--- /dev/null
+++ b/missing/m4/socklent.m4
@@ -0,0 +1,81 @@
+dnl This comes from libcurl's acinclude.m4. it is not clear if this
+dnl is original libcurl code, or other code, so we include the libcurl
+dnl copyright here
+dnl
+dnl
+dnl Copyright (c) 1996 - 2005, Daniel Stenberg, <daniel@haxx.se>.
+dnl
+dnl All rights reserved.
+dnl
+dnl Permission to use, copy, modify, and distribute this software for any purpose
+dnl with or without fee is hereby granted, provided that the above copyright
+dnl notice and this permission notice appear in all copies.
+dnl
+dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+dnl IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+dnl FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN
+dnl NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
+dnl OR OTHER DEALINGS IN THE SOFTWARE.
+dnl
+dnl Except as contained in this notice, the name of a copyright holder shall not
+dnl be used in advertising or otherwise to promote the sale, use or other dealings
+dnl in this Software without prior written authorization of the copyright holder.
+
+dnl Check for socklen_t: historically on BSD it is an int, and in
+dnl POSIX 1g it is a type of its own, but some platforms use different
+dnl types for the argument to getsockopt, getpeername, etc. So we
+dnl have to test to find something that will work.
+
+dnl Remove the AC_CHECK_TYPE - on HP-UX it would find a socklen_t, but the
+dnl function prototypes for getsockopt et al will not actually use
+dnl socklen_t args unless _XOPEN_SOURCE_EXTENDED is defined. so, the
+dnl AC_CHECK_TYPE will find a socklen_t and think all is happiness and
+dnl joy when you will really get warnings about mismatch types - type
+dnl mismatches that would be possibly Bad (tm) in a 64-bit compile.
+dnl raj 2005-05-11 this change may be redistributed at will
+
+dnl also, added "extern" to the "int getpeername" in an attempt to resolve
+dnl an issue with this code under Solaris 2.9. this too may be
+dnl redistributed at will
+
+AC_DEFUN([OLD_TYPE_SOCKLEN_T],
+[
+ AC_MSG_CHECKING([for socklen_t equivalent])
+ AC_CACHE_VAL([curl_cv_socklen_t_equiv],
+ [
+ # Systems have either "struct sockaddr *" or
+ # "void *" as the second argument to getpeername
+ curl_cv_socklen_t_equiv=
+ for arg2 in "struct sockaddr" void; do
+ for t in int size_t unsigned long "unsigned long" socklen_t; do
+ AC_TRY_COMPILE([
+ #ifdef HAVE_SYS_TYPES_H
+ #include <sys/types.h>
+ #endif
+ #ifdef HAVE_SYS_SOCKET_H
+ #include <sys/socket.h>
+ #endif
+
+ extern int getpeername (int, $arg2 *, $t *);
+ ],[
+ $t len;
+ getpeername(0,0,&len);
+ ],[
+ curl_cv_socklen_t_equiv="$t"
+ break
+ ])
+ done
+ done
+
+ if test "x$curl_cv_socklen_t_equiv" = x; then
+ # take a wild guess
+ curl_cv_socklen_t_equiv="socklen_t"
+ AC_MSG_WARN([Cannot find a type to use in place of socklen_t, guessing socklen_t])
+ fi
+ ])
+ AC_MSG_RESULT($curl_cv_socklen_t_equiv)
+ AC_DEFINE_UNQUOTED(netperf_socklen_t, $curl_cv_socklen_t_equiv,
+ [type to use in place of socklen_t if not defined])
+])
diff --git a/missing/m4/type_socklen_t.m4 b/missing/m4/type_socklen_t.m4
new file mode 100644
index 0000000..349aad8
--- /dev/null
+++ b/missing/m4/type_socklen_t.m4
@@ -0,0 +1,25 @@
+dnl @synopsis TYPE_SOCKLEN_T
+dnl
+dnl Check whether sys/socket.h defines type socklen_t. Please note that
+dnl some systems require sys/types.h to be included before sys/socket.h
+dnl can be compiled.
+dnl
+dnl @category Misc
+dnl @author Lars Brinkhoff <lars@nocrew.org>
+dnl @version 2005-01-11
+dnl @license GPLWithACException
+
+AC_DEFUN([TYPE_SOCKLEN_T],
+[AC_CACHE_CHECK([for socklen_t], ac_cv_type_socklen_t,
+[
+ AC_TRY_COMPILE(
+ [#include <sys/types.h>
+ #include <sys/socket.h>],
+ [socklen_t len = 42; return 0;],
+ ac_cv_type_socklen_t=yes,
+ ac_cv_type_socklen_t=no)
+])
+ if test $ac_cv_type_socklen_t != yes; then
+ AC_DEFINE(socklen_t, int, [Substitute for socklen_t])
+ fi
+])
diff --git a/netcpu.h b/netcpu.h
new file mode 100644
index 0000000..58d1e1c
--- /dev/null
+++ b/netcpu.h
@@ -0,0 +1,19 @@
+/* This should define all the common routines etc exported by the
+ various netcpu_mumble.c files raj 2005-01-26 */
+
+extern void cpu_util_init(void);
+extern void cpu_util_terminate(void);
+extern int get_cpu_method();
+
+#ifdef WIN32
+/* +*+ temp until I figure out what header this is in; I know it's
+ there someplace... */
+typedef unsigned __int64 uint64_t;
+#endif
+
+extern void get_cpu_idle(uint64_t *res);
+extern float calibrate_idle_rate(int iterations, int interval);
+extern float calc_cpu_util_internal(float elapsed);
+extern void cpu_start_internal(void);
+extern void cpu_stop_internal(void);
+
diff --git a/netcpu_kstat.c b/netcpu_kstat.c
new file mode 100644
index 0000000..6320658
--- /dev/null
+++ b/netcpu_kstat.c
@@ -0,0 +1,415 @@
+char netcpu_kstat_id[]="\
+@(#)netcpu_kstat.c Version 2.4.0";
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+
+#include <kstat.h>
+#include <sys/sysinfo.h>
+
+#include "netsh.h"
+#include "netlib.h"
+
+/* the lib_start_count and lib_end_count arrays hold the starting
+ and ending values of whatever is counting when the system is
+ idle. The rate at which this increments during a test is compared
+ with a previous calibrarion to arrive at a CPU utilization
+ percentage. raj 2005-01-26 */
+static uint64_t lib_start_count[MAXCPUS];
+static uint64_t lib_end_count[MAXCPUS];
+
+static kstat_t *cpu_ks[MAXCPUS]; /* the addresses that kstat will
+ need to pull the cpu info from
+ the kstat interface. at least I
+ think that is what this is :) raj
+ 8/2000 */
+
+#define UPDKCID(nk,ok) \
+if (nk == -1) { \
+ perror("kstat_read "); \
+ exit(1); \
+} \
+if (nk != ok)\
+ goto kcid_changed;
+
+static kstat_ctl_t *kc = NULL;
+static kid_t kcid = 0;
+
+/* do the initial open of the kstat interface, get the chain id's all
+ straightened-out and set-up the addresses for get_kstat_idle to do
+ its thing. liberally borrowed from the sources to TOP. raj 8/2000 */
+
+static int
+open_kstat()
+{
+ kstat_t *ks;
+ kid_t nkcid;
+ int i;
+ int changed = 0;
+ static int ncpu = 0;
+
+ kstat_named_t *kn;
+
+ if (debug) {
+ fprintf(where,"open_kstat: enter\n");
+ fflush(where);
+ }
+
+ /*
+ * 0. kstat_open
+ */
+
+ if (!kc)
+ {
+ kc = kstat_open();
+ if (!kc)
+ {
+ perror("kstat_open ");
+ exit(1);
+ }
+ changed = 1;
+ kcid = kc->kc_chain_id;
+ }
+#ifdef rickwasstupid
+ else {
+ fprintf(where,"open_kstat double open!\n");
+ fflush(where);
+ exit(1);
+ }
+#endif
+
+ /* keep doing it until no more changes */
+ kcid_changed:
+
+ if (debug) {
+ fprintf(where,"passing kcid_changed\n");
+ fflush(where);
+ }
+
+ /*
+ * 1. kstat_chain_update
+ */
+ nkcid = kstat_chain_update(kc);
+ if (nkcid)
+ {
+ /* UPDKCID will abort if nkcid is -1, so no need to check */
+ changed = 1;
+ kcid = nkcid;
+ }
+ UPDKCID(nkcid,0);
+
+ if (debug) {
+ fprintf(where,"kstat_lookup for unix/system_misc\n");
+ fflush(where);
+ }
+
+ ks = kstat_lookup(kc, "unix", 0, "system_misc");
+ if (kstat_read(kc, ks, 0) == -1) {
+ perror("kstat_read");
+ exit(1);
+ }
+
+
+ if (changed) {
+
+ /*
+ * 2. get data addresses
+ */
+
+ ncpu = 0;
+
+ kn = kstat_data_lookup(ks, "ncpus");
+ if (kn && kn->value.ui32 > lib_num_loc_cpus) {
+ fprintf(stderr,"number of CPU's mismatch!");
+ exit(1);
+ }
+
+ for (ks = kc->kc_chain; ks;
+ ks = ks->ks_next)
+ {
+ if (strncmp(ks->ks_name, "cpu_stat", 8) == 0)
+ {
+ nkcid = kstat_read(kc, ks, NULL);
+ /* if kcid changed, pointer might be invalid. we'll deal
+ wtih changes at this stage, but will not accept them
+ when we are actually in the middle of reading
+ values. hopefully this is not going to be a big
+ issue. raj 8/2000 */
+ UPDKCID(nkcid, kcid);
+
+ if (debug) {
+ fprintf(where,"cpu_ks[%d] getting %p\n",ncpu,ks);
+ fflush(where);
+ }
+
+ cpu_ks[ncpu] = ks;
+ ncpu++;
+ if (ncpu > lib_num_loc_cpus)
+ {
+ /* with the check above, would we ever hit this? */
+ fprintf(stderr,
+ "kstat finds too many cpus %d: should be %d\n",
+ ncpu,lib_num_loc_cpus);
+ exit(1);
+ }
+ }
+ }
+ /* note that ncpu could be less than ncpus, but that's okay */
+ changed = 0;
+ }
+}
+
+/* return the value of the idle tick counter for the specified CPU */
+static long
+get_kstat_idle(cpu)
+ int cpu;
+{
+ cpu_stat_t cpu_stat;
+ kid_t nkcid;
+
+ if (debug) {
+ fprintf(where,
+ "get_kstat_idle reading with kc %x and ks %p\n",
+ kc,
+ cpu_ks[cpu]);
+ }
+
+ nkcid = kstat_read(kc, cpu_ks[cpu], &cpu_stat);
+ /* if kcid changed, pointer might be invalid, fail the test */
+ UPDKCID(nkcid, kcid);
+
+ return(cpu_stat.cpu_sysinfo.cpu[CPU_IDLE]);
+
+ kcid_changed:
+ perror("kcid changed midstream and I cannot deal with that!");
+ exit(1);
+}
+
+void
+cpu_util_init(void)
+{
+ open_kstat();
+ return;
+}
+
+void
+cpu_util_terminate(void)
+{
+ return;
+}
+
+int
+get_cpu_method(void)
+{
+ return KSTAT;
+}
+
+void
+get_cpu_idle(uint64_t *res)
+{
+
+ int i;
+
+ /* this open may be redundant */
+ open_kstat();
+
+ for (i = 0; i < lib_num_loc_cpus; i++){
+ res[i] = get_kstat_idle(i);
+ }
+ return;
+}
+
+float
+calibrate_idle_rate(int iterations, int interval)
+{
+
+ long
+ firstcnt[MAXCPUS],
+ secondcnt[MAXCPUS];
+
+ float
+ elapsed,
+ temp_rate,
+ rate[MAXTIMES],
+ local_maxrate;
+
+ long
+ sec,
+ usec;
+
+ int
+ i,
+ j;
+
+ struct timeval time1, time2 ;
+ struct timezone tz;
+
+ if (debug) {
+ fprintf(where,"calling open_kstat from calibrate_kstat\n");
+ fflush(where);
+ }
+
+ open_kstat();
+
+ if (iterations > MAXTIMES) {
+ iterations = MAXTIMES;
+ }
+
+ local_maxrate = (float)-1.0;
+
+ for(i = 0; i < iterations; i++) {
+ rate[i] = (float)0.0;
+ for (j = 0; j < lib_num_loc_cpus; j++) {
+ firstcnt[j] = get_kstat_idle(j);
+ }
+ gettimeofday (&time1, &tz);
+ sleep(interval);
+ gettimeofday (&time2, &tz);
+
+ if (time2.tv_usec < time1.tv_usec)
+ {
+ time2.tv_usec += 1000000;
+ time2.tv_sec -=1;
+ }
+ sec = time2.tv_sec - time1.tv_sec;
+ usec = time2.tv_usec - time1.tv_usec;
+ elapsed = (float)sec + ((float)usec/(float)1000000.0);
+
+ if(debug) {
+ fprintf(where, "Calibration for kstat counter run: %d\n",i);
+ fprintf(where,"\tsec = %ld usec = %ld\n",sec,usec);
+ fprintf(where,"\telapsed time = %g\n",elapsed);
+ }
+
+ for (j = 0; j < lib_num_loc_cpus; j++) {
+ secondcnt[j] = get_kstat_idle(j);
+ if(debug) {
+ /* I know that there are situations where compilers know about */
+ /* long long, but the library functions do not... raj 4/95 */
+ fprintf(where,
+ "\tfirstcnt[%d] = 0x%8.8lx%8.8lx secondcnt[%d] = 0x%8.8lx%8.8lx\n",
+ j,
+ firstcnt[j],
+ firstcnt[j],
+ j,
+ secondcnt[j],
+ secondcnt[j]);
+ }
+ /* we assume that it would wrap no more than once. we also */
+ /* assume that the result of subtracting will "fit" raj 4/95 */
+ temp_rate = (secondcnt[j] >= firstcnt[j]) ?
+ (float)(secondcnt[j] - firstcnt[j])/elapsed :
+ (float)(secondcnt[j]-firstcnt[j]+MAXLONG)/elapsed;
+ if (temp_rate > rate[i]) rate[i] = temp_rate;
+ if(debug) {
+ fprintf(where,"\trate[%d] = %g\n",i,rate[i]);
+ fflush(where);
+ }
+ if (local_maxrate < rate[i]) local_maxrate = rate[i];
+ }
+ }
+ if(debug) {
+ fprintf(where,"\tlocal maxrate = %g per sec. \n",local_maxrate);
+ fflush(where);
+ }
+ return local_maxrate;
+}
+
+float
+calc_cpu_util_internal(float elapsed_time)
+{
+ int i;
+ float correction_factor;
+ float actual_rate;
+
+ lib_local_cpu_util = (float)0.0;
+ /* It is possible that the library measured a time other than */
+ /* the one that the user want for the cpu utilization */
+ /* calculations - for example, tests that were ended by */
+ /* watchdog timers such as the udp stream test. We let these */
+ /* tests tell up what the elapsed time should be. */
+
+ if (elapsed_time != 0.0) {
+ correction_factor = (float) 1.0 +
+ ((lib_elapsed - elapsed_time) / elapsed_time);
+ }
+ else {
+ correction_factor = (float) 1.0;
+ }
+
+ for (i = 0; i < lib_num_loc_cpus; i++) {
+
+ /* it would appear that on some systems, in loopback, nice is
+ *very* effective, causing the looper process to stop dead in its
+ tracks. if this happens, we need to ensure that the calculation
+ does not go south. raj 6/95 and if we run completely out of idle,
+ the same thing could in theory happen to the USE_KSTAT path. raj
+ 8/2000 */
+
+ if (lib_end_count[i] == lib_start_count[i]) {
+ lib_end_count[i]++;
+ }
+
+ actual_rate = (lib_end_count[i] > lib_start_count[i]) ?
+ (float)(lib_end_count[i] - lib_start_count[i])/lib_elapsed :
+ (float)(lib_end_count[i] - lib_start_count[i] +
+ MAXLONG)/ lib_elapsed;
+ if (debug) {
+ fprintf(where,
+ "calc_cpu_util: actual_rate on processor %d is %f start %lx end %lx\n",
+ i,
+ actual_rate,
+ lib_start_count[i],
+ lib_end_count[i]);
+ }
+ lib_local_per_cpu_util[i] = (lib_local_maxrate - actual_rate) /
+ lib_local_maxrate * 100;
+ lib_local_cpu_util += lib_local_per_cpu_util[i];
+ }
+ /* we want the average across all n processors */
+ lib_local_cpu_util /= (float)lib_num_loc_cpus;
+
+ lib_local_cpu_util *= correction_factor;
+ return lib_local_cpu_util;
+
+
+}
+
+void
+cpu_start_internal(void)
+{
+ get_cpu_idle(lib_start_count);
+ return;
+}
+
+void
+cpu_stop_internal(void)
+{
+ get_cpu_idle(lib_end_count);
+}
diff --git a/netcpu_kstat10.c b/netcpu_kstat10.c
new file mode 100644
index 0000000..299e66d
--- /dev/null
+++ b/netcpu_kstat10.c
@@ -0,0 +1,559 @@
+char netcpu_kstat10_id[]="\
+@(#)netcpu_kstat10.c (c) Copyright 2005-2007, Hewlett-Packard Company Version 2.4.3";
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+
+#include <errno.h>
+
+#include <kstat.h>
+#include <sys/sysinfo.h>
+
+#include "netsh.h"
+#include "netlib.h"
+
+static kstat_ctl_t *kc = NULL;
+static kid_t kcid = 0;
+
+typedef struct cpu_time_counters {
+ uint64_t idle;
+ uint64_t user;
+ uint64_t kernel;
+ uint64_t interrupt;
+} cpu_time_counters_t;
+
+static cpu_time_counters_t starting_cpu_counters[MAXCPUS];
+static cpu_time_counters_t ending_cpu_counters[MAXCPUS];
+static cpu_time_counters_t delta_cpu_counters[MAXCPUS];
+static cpu_time_counters_t corrected_cpu_counters[MAXCPUS];
+
+static void
+print_cpu_time_counters(char *name, int instance, cpu_time_counters_t *counters)
+{
+ fprintf(where,"%s[%d]:\n",name,instance);
+ fprintf(where,
+ "\t idle %llu\n",counters[instance].idle);
+ fprintf(where,
+ "\t user %llu\n",counters[instance].user);
+ fprintf(where,
+ "\t kernel %llu\n",counters[instance].kernel);
+ fprintf(where,
+ "\t interrupt %llu\n",counters[instance].interrupt);
+}
+
+void
+cpu_util_init(void)
+{
+ kc = kstat_open();
+
+ if (kc == NULL) {
+ fprintf(where,
+ "cpu_util_init: kstat_open: errno %d %s\n",
+ errno,
+ strerror(errno));
+ fflush(where);
+ exit(-1);
+ }
+ return;
+}
+
+void
+cpu_util_terminate(void)
+{
+ kstat_close(kc);
+ return;
+}
+
+int
+get_cpu_method(void)
+{
+ return KSTAT_10;
+}
+
+static void
+print_unexpected_statistic_warning(char *who, char *what, char *why)
+{
+ if (why) {
+ fprintf(where,
+ "WARNING! WARNING! WARNING! WARNING!\n");
+ fprintf(where,
+ "%s found an unexpected %s statistic %.16s\n",
+ who,
+ why,
+ what);
+ }
+ else {
+ fprintf(where,
+ "%s is ignoring statistic %.16s\n",
+ who,
+ what);
+ }
+}
+
+static void
+get_cpu_counters(int cpu_num, cpu_time_counters_t *counters)
+{
+
+ kstat_t *ksp;
+ int found=0;
+ kid_t nkcid;
+ kstat_named_t *knp;
+ int i;
+
+ ksp = kstat_lookup(kc, "cpu", cpu_num, "sys");
+ if ((ksp) && (ksp->ks_type == KSTAT_TYPE_NAMED)) {
+ /* happiness and joy, keep going */
+ nkcid = kstat_read(kc, ksp, NULL);
+ if (nkcid != -1) {
+ /* happiness and joy, keep going. we could consider adding a
+ "found < 3" to the end conditions, but then we wouldn't
+ search to the end and find that Sun added some nsec. we
+ probably want to see if they add an nsec. raj 2005-01-28 */
+ for (i = ksp->ks_ndata, knp = ksp->ks_data;
+ i > 0;
+ knp++,i--) {
+ /* we would be hosed if the same name could appear twice */
+ if (!strcmp("cpu_nsec_idle",knp->name)) {
+ found++;
+ counters[cpu_num].idle = knp->value.ui64;
+ }
+ else if (!strcmp("cpu_nsec_user",knp->name)) {
+ found++;
+ counters[cpu_num].user = knp->value.ui64;
+ }
+ else if (!strcmp("cpu_nsec_kernel",knp->name)) {
+ found++;
+ counters[cpu_num].kernel = knp->value.ui64;
+ }
+ else if (strstr(knp->name,"nsec")) {
+ /* finding another nsec here means Sun have changed
+ something and we need to warn the user. raj 2005-01-28 */
+ print_unexpected_statistic_warning("get_cpu_counters",
+ knp->name,
+ "nsec");
+ }
+ else if (debug >=2) {
+
+ /* might want to tell people about what we are skipping.
+ however, only display other names debug >=2. raj
+ 2005-01-28
+ */
+
+ print_unexpected_statistic_warning("get_cpu_counters",
+ knp->name,
+ NULL);
+ }
+ }
+ if (3 == found) {
+ /* happiness and joy */
+ return;
+ }
+ else {
+ fprintf(where,
+ "get_cpu_counters could not find one or more of the expected counters!\n");
+ fflush(where);
+ exit(-1);
+ }
+ }
+ else {
+ /* the kstat_read returned an error or the chain changed */
+ fprintf(where,
+ "get_cpu_counters: kstat_read failed or chain id changed %d %s\n",
+ errno,
+ strerror(errno));
+ fflush(where);
+ exit(-1);
+ }
+ }
+ else {
+ /* the lookup failed or found the wrong type */
+ fprintf(where,
+ "get_cpu_counters: kstat_lookup failed for module 'cpu' instance %d name 'sys' and KSTAT_TYPE_NAMED: errno %d %s\n",
+ cpu_num,
+ errno,
+ strerror(errno));
+ fflush(where);
+ exit(-1);
+ }
+}
+
+static void
+get_interrupt_counters(int cpu_num, cpu_time_counters_t *counters)
+{
+ kstat_t *ksp;
+ int found=0;
+ kid_t nkcid;
+ kstat_named_t *knp;
+ int i;
+
+ ksp = kstat_lookup(kc, "cpu", cpu_num, "intrstat");
+
+ counters[cpu_num].interrupt = 0;
+ if ((ksp) && (ksp->ks_type == KSTAT_TYPE_NAMED)) {
+ /* happiness and joy, keep going */
+ nkcid = kstat_read(kc, ksp, NULL);
+ if (nkcid != -1) {
+ /* happiness and joy, keep going. we could consider adding a
+ "found < 15" to the end conditions, but then we wouldn't
+ search to the end and find that Sun added some "time." we
+ probably want to see if they add a "nsec." raj 2005-01-28 */
+ for (i = ksp->ks_ndata, knp = ksp->ks_data;
+ i > 0;
+ knp++,i--) {
+ if (strstr(knp->name,"time")) {
+ found++;
+ counters[cpu_num].interrupt += knp->value.ui64;
+ }
+ else if (debug >=2) {
+
+ /* might want to tell people about what we are skipping.
+ however, only display other names debug >=2. raj
+ 2005-01-28
+ */
+
+ print_unexpected_statistic_warning("get_cpu_counters",
+ knp->name,
+ NULL);
+ }
+ }
+ if (15 == found) {
+ /* happiness and joy */
+ return;
+ }
+ else {
+ fprintf(where,
+ "get_cpu_counters could not find one or more of the expected counters!\n");
+ fflush(where);
+ exit(-1);
+ }
+ }
+ else {
+ /* the kstat_read returned an error or the chain changed */
+ fprintf(where,
+ "get_cpu_counters: kstat_read failed or chain id changed %d %s\n",
+ errno,
+ strerror(errno));
+ fflush(where);
+ exit(-1);
+ }
+ }
+ else {
+ /* the lookup failed or found the wrong type */
+ fprintf(where,
+ "get_cpu_counters: kstat_lookup failed for module 'cpu' instance %d class 'intrstat' and KSTAT_TYPE_NAMED: errno %d %s\n",
+ cpu_num,
+ errno,
+ strerror(errno));
+ fflush(where);
+ exit(-1);
+ }
+
+}
+
+static void
+get_cpu_time_counters(cpu_time_counters_t *counters)
+{
+
+ int i;
+
+ for (i = 0; i < lib_num_loc_cpus; i++){
+ get_cpu_counters(i, counters);
+ get_interrupt_counters(i, counters);
+ }
+
+ return;
+}
+
+/* the kstat10 mechanism, since it is based on actual nanosecond
+ counters is not going to use a comparison to an idle rate. so, the
+ calibrate_idle_rate routine will be rather simple :) raj 2005-01-28
+ */
+
+float
+calibrate_idle_rate(int iterations, int interval)
+{
+ return 0.0;
+}
+
+float
+calc_cpu_util_internal(float elapsed_time)
+{
+ int i;
+ float correction_factor;
+ float actual_rate;
+
+ uint64_t total_cpu_nsec;
+
+ /* multiply by 100 and divide by total and you get whole
+ percentages. multiply by 1000 and divide by total and you get
+ tenths of percentages. multiply by 10000 and divide by total and
+ you get hundredths of percentages. etc etc etc raj 2005-01-28 */
+
+#define CALC_PERCENT 100
+#define CALC_TENTH_PERCENT 1000
+#define CALC_HUNDREDTH_PERCENT 10000
+#define CALC_THOUSANDTH_PERCENT 100000
+#define CALC_ACCURACY CALC_THOUSANDTH_PERCENT
+
+ uint64_t fraction_idle;
+ uint64_t fraction_user;
+ uint64_t fraction_kernel;
+ uint64_t fraction_interrupt;
+
+ uint64_t interrupt_idle;
+ uint64_t interrupt_user;
+ uint64_t interrupt_kernel;
+
+ lib_local_cpu_util = (float)0.0;
+
+ /* It is possible that the library measured a time other than */
+ /* the one that the user want for the cpu utilization */
+ /* calculations - for example, tests that were ended by */
+ /* watchdog timers such as the udp stream test. We let these */
+ /* tests tell up what the elapsed time should be. */
+
+ if (elapsed_time != 0.0) {
+ correction_factor = (float) 1.0 +
+ ((lib_elapsed - elapsed_time) / elapsed_time);
+ }
+ else {
+ correction_factor = (float) 1.0;
+ }
+
+ for (i = 0; i < lib_num_loc_cpus; i++) {
+
+ /* this is now the fun part. we have the nanoseconds _allegedly_
+ spent in user, idle and kernel. We also have nanoseconds spent
+ servicing interrupts. Sadly, in the developer's finite wisdom,
+ the interrupt time accounting is in parallel with the other
+ accounting. this means that time accounted in user, kernel or
+ idle will also include time spent in interrupt. for netperf's
+ porpoises we do not really care about that for user and kernel,
+ but we certainly do care for idle. the $64B question becomes -
+ how to "correct" for this?
+
+ we could just subtract interrupt time from idle. that has the
+ virtue of simplicity and also "punishes" Sun for doing
+ something that seems to be so stupid. however, we probably
+ have to be "fair" even to the allegedly stupid so the other
+ mechanism, suggested by a Sun engineer is to subtract interrupt
+ time from each of user, kernel and idle in proportion to their
+ numbers. then we sum the corrected user, kernel and idle along
+ with the interrupt time and use that to calculate a new idle
+ percentage and thus a CPU util percentage.
+
+ that is what we will attempt to do here. raj 2005-01-28
+
+ of course, we also have to wonder what we should do if there is
+ more interrupt time than the sum of user, kernel and idle.
+ that is a theoretical possibility I suppose, but for the
+ time-being, one that we will blythly ignore, except perhaps for
+ a quick check. raj 2005-01-31
+ */
+
+ /* we ass-u-me that these counters will never wrap during a
+ netperf run. this may not be a particularly safe thing to
+ do. raj 2005-01-28 */
+ delta_cpu_counters[i].idle = ending_cpu_counters[i].idle -
+ starting_cpu_counters[i].idle;
+ delta_cpu_counters[i].user = ending_cpu_counters[i].user -
+ starting_cpu_counters[i].user;
+ delta_cpu_counters[i].kernel = ending_cpu_counters[i].kernel -
+ starting_cpu_counters[i].kernel;
+ delta_cpu_counters[i].interrupt = ending_cpu_counters[i].interrupt -
+ starting_cpu_counters[i].interrupt;
+
+ if (debug) {
+ print_cpu_time_counters("delta_cpu_counters",i,delta_cpu_counters);
+ }
+
+ /* for this summation, we do not include interrupt time */
+ total_cpu_nsec =
+ delta_cpu_counters[i].idle +
+ delta_cpu_counters[i].user +
+ delta_cpu_counters[i].kernel;
+
+ if (debug) {
+ fprintf(where,"total_cpu_nsec %llu\n",total_cpu_nsec);
+ }
+
+ if (delta_cpu_counters[i].interrupt > total_cpu_nsec) {
+ /* we are not in Kansas any more Toto, and I am not quite sure
+ the best way to get our tails out of here so let us just
+ punt. raj 2005-01-31 */
+ fprintf(where,
+ "WARNING! WARNING! WARNING! WARNING! WARNING! \n");
+ fprintf(where,
+ "calc_cpu_util_internal: more interrupt time than others combined!\n");
+ fprintf(where,
+ "\tso CPU util cannot be estimated\n");
+ fprintf(where,
+ "\t delta[%d].interrupt %llu\n",i,delta_cpu_counters[i].interrupt);
+ fprintf(where,
+ "\t delta[%d].idle %llu\n",i,delta_cpu_counters[i].idle);
+ fprintf(where,
+ "\t delta[%d].user %llu\n",i,delta_cpu_counters[i].user);
+ fprintf(where,
+ "\t delta[%d].kernel %llu\n",i,delta_cpu_counters[i].kernel);
+ fflush(where);
+
+ lib_local_cpu_util = -1.0;
+ lib_local_per_cpu_util[i] = -1.0;
+ return -1.0;
+ }
+
+ /* and now some fun with integer math. i initially tried to
+ promote things to long doubled but that didn't seem to result
+ in happiness and joy. raj 2005-01-28 */
+
+ fraction_idle =
+ (delta_cpu_counters[i].idle * CALC_ACCURACY) / total_cpu_nsec;
+
+ fraction_user =
+ (delta_cpu_counters[i].user * CALC_ACCURACY) / total_cpu_nsec;
+
+ fraction_kernel =
+ (delta_cpu_counters[i].kernel * CALC_ACCURACY) / total_cpu_nsec;
+
+ /* ok, we have our fractions, now we want to take that fraction of
+ the interrupt time and subtract that from the bucket. */
+
+ interrupt_idle = ((delta_cpu_counters[i].interrupt * fraction_idle) /
+ CALC_ACCURACY);
+
+ interrupt_user = ((delta_cpu_counters[i].interrupt * fraction_user) /
+ CALC_ACCURACY);
+
+ interrupt_kernel = ((delta_cpu_counters[i].interrupt * fraction_kernel) /
+ CALC_ACCURACY);
+
+ if (debug) {
+ fprintf(where,
+ "\tfraction_idle %llu interrupt_idle %llu\n",
+ fraction_idle,
+ interrupt_idle);
+ fprintf(where,
+ "\tfraction_user %llu interrupt_user %llu\n",
+ fraction_user,
+ interrupt_user);
+ fprintf(where,"\tfraction_kernel %llu interrupt_kernel %llu\n",
+ fraction_kernel,
+ interrupt_kernel);
+ }
+
+ corrected_cpu_counters[i].idle = delta_cpu_counters[i].idle -
+ interrupt_idle;
+
+ corrected_cpu_counters[i].user = delta_cpu_counters[i].user -
+ interrupt_user;
+
+ corrected_cpu_counters[i].kernel = delta_cpu_counters[i].kernel -
+ interrupt_kernel;
+
+ corrected_cpu_counters[i].interrupt = delta_cpu_counters[i].interrupt;
+
+ if (debug) {
+ print_cpu_time_counters("corrected_cpu_counters",
+ i,
+ corrected_cpu_counters);
+ }
+
+ /* I was going to checkfor going less than zero, but since all the
+ calculations are in unsigned quantities that would seem to be a
+ triffle silly... raj 2005-01-28 */
+
+ /* ok, now we sum the numbers again, this time including interrupt
+ */
+
+ total_cpu_nsec =
+ corrected_cpu_counters[i].idle +
+ corrected_cpu_counters[i].user +
+ corrected_cpu_counters[i].kernel +
+ corrected_cpu_counters[i].interrupt;
+
+ /* and recalculate our fractions we are really only going to use
+ fraction_idle, but lets calculate the rest just for the heck of
+ it. one day we may want to display them. raj 2005-01-28 */
+
+ /* multiply by 100 and divide by total and you get whole
+ percentages. multiply by 1000 and divide by total and you get
+ tenths of percentages. multiply by 10000 and divide by total
+ and you get hundredths of percentages. etc etc etc raj
+ 2005-01-28 */
+ fraction_idle =
+ (corrected_cpu_counters[i].idle * CALC_ACCURACY) / total_cpu_nsec;
+
+ fraction_user =
+ (corrected_cpu_counters[i].user * CALC_ACCURACY) / total_cpu_nsec;
+
+ fraction_kernel =
+ (corrected_cpu_counters[i].kernel * CALC_ACCURACY) / total_cpu_nsec;
+
+ fraction_interrupt =
+ (corrected_cpu_counters[i].interrupt * CALC_ACCURACY) / total_cpu_nsec;
+
+ if (debug) {
+ fprintf(where,"\tfraction_idle %lu\n",fraction_idle);
+ fprintf(where,"\tfraction_user %lu\n",fraction_user);
+ fprintf(where,"\tfraction_kernel %lu\n",fraction_kernel);
+ fprintf(where,"\tfraction_interrupt %lu\n",fraction_interrupt);
+ }
+
+ /* and finally, what is our CPU utilization? */
+ lib_local_per_cpu_util[i] = 100.0 - (((float)fraction_idle /
+ (float)CALC_ACCURACY) * 100.0);
+ if (debug) {
+ fprintf(where,
+ "lib_local_per_cpu_util[%d] %g\n",
+ i,
+ lib_local_per_cpu_util[i]);
+ }
+ lib_local_cpu_util += lib_local_per_cpu_util[i];
+ }
+ /* we want the average across all n processors */
+ lib_local_cpu_util /= (float)lib_num_loc_cpus;
+
+ lib_local_cpu_util *= correction_factor;
+ return lib_local_cpu_util;
+
+
+}
+
+void
+cpu_start_internal(void)
+{
+ get_cpu_time_counters(starting_cpu_counters);
+ return;
+}
+
+void
+cpu_stop_internal(void)
+{
+ get_cpu_time_counters(ending_cpu_counters);
+}
diff --git a/netcpu_looper.c b/netcpu_looper.c
new file mode 100644
index 0000000..b76c7c9
--- /dev/null
+++ b/netcpu_looper.c
@@ -0,0 +1,656 @@
+char netcpu_looper_id[]="\
+@(#)netcpu_looper.c (c) Copyright 2005-2007. Version 2.4.3";
+
+/* netcpu_looper.c
+
+ Implement the soaker process specific portions of netperf CPU
+ utilization measurements. These are broken-out into a separate file
+ to make life much nicer over in netlib.c which had become a maze of
+ twisty, CPU-util-related, #ifdefs, all different. raj 2005-01-26
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#if defined(HAVE_MMAP) || defined(HAVE_SYS_MMAN_H)
+# include <sys/mman.h>
+#else
+# error netcpu_looper requires mmap
+#endif
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#if HAVE_SYS_WAIT_H
+# include <sys/wait.h>
+#endif
+
+#ifdef HAVE_SIGNAL_H
+#include <signal.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#include "netsh.h"
+#include "netlib.h"
+
+#define PAGES_PER_CHILD 2
+
+/* the lib_start_count and lib_end_count arrays hold the starting
+ and ending values of whatever is counting when the system is
+ idle. The rate at which this increments during a test is compared
+ with a previous calibrarion to arrive at a CPU utilization
+ percentage. raj 2005-01-26 */
+static uint64_t lib_start_count[MAXCPUS];
+static uint64_t lib_end_count[MAXCPUS];
+
+static int *cpu_mappings;
+
+static int lib_idle_fd;
+static uint64_t *lib_idle_address[MAXCPUS];
+static long *lib_base_pointer;
+static pid_t lib_idle_pids[MAXCPUS];
+static int lib_loopers_running=0;
+
+/* we used to use this code to bind the loopers, but since we have
+ decided to enable processor affinity for the actual
+ netperf/netserver processes we will use that affinity routine,
+ which happens to know about more systems than this */
+
+#ifdef NOTDEF
+static void
+bind_to_processor(int child_num)
+{
+ /* This routine will bind the calling process to a particular */
+ /* processor. We are not choosy as to which processor, so it will be */
+ /* the process id mod the number of processors - shifted by one for */
+ /* those systems which name processor starting from one instead of */
+ /* zero. on those systems where I do not yet know how to bind a */
+ /* process to a processor, this routine will be a no-op raj 10/95 */
+
+ /* just as a reminder, this is *only* for the looper processes, not */
+ /* the actual measurement processes. those will, should, MUST float */
+ /* or not float from CPU to CPU as controlled by the operating */
+ /* system defaults. raj 12/95 */
+
+#ifdef __hpux
+#include <sys/syscall.h>
+#include <sys/mp.h>
+
+ int old_cpu = -2;
+
+ if (debug) {
+ fprintf(where,
+ "child %d asking for CPU %d as pid %d with %d CPUs\n",
+ child_num,
+ (child_num % lib_num_loc_cpus),
+ getpid(),
+ lib_num_loc_cpus);
+ fflush(where);
+ }
+
+ SETPROCESS((child_num % lib_num_loc_cpus), getpid());
+ return;
+
+#else
+#if defined(__sun) && defined(__SVR4)
+ /* should only be Solaris */
+#include <sys/processor.h>
+#include <sys/procset.h>
+
+ int old_binding;
+
+ if (debug) {
+ fprintf(where,
+ "bind_to_processor: child %d asking for CPU %d as pid %d with %d CPUs\n",
+ child_num,
+ (child_num % lib_num_loc_cpus),
+ getpid(),
+ lib_num_loc_cpus);
+ fflush(where);
+ }
+
+ if (processor_bind(P_PID,
+ getpid(),
+ (child_num % lib_num_loc_cpus),
+ &old_binding) != 0) {
+ fprintf(where,"bind_to_processor: unable to perform processor binding\n");
+ fprintf(where," errno %d\n",errno);
+ fflush(where);
+ }
+ return;
+#else
+#ifdef WIN32
+
+ if (!SetThreadAffinityMask(GetCurrentThread(), (ULONG_PTR)1 << (child_num % lib_num_loc_cpus))) {
+ perror("SetThreadAffinityMask failed");
+ fflush(stderr);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "bind_to_processor: child %d asking for CPU %d of %d CPUs\n",
+ child_num,
+ (child_num % lib_num_loc_cpus),
+ lib_num_loc_cpus);
+ fflush(where);
+ }
+
+#endif
+ return;
+#endif /* __sun && _SVR4 */
+#endif /* __hpux */
+}
+#endif
+
+ /* sit_and_spin will just spin about incrementing a value */
+ /* this value will either be in a memory mapped region on Unix shared */
+ /* by each looper process, or something appropriate on Windows/NT */
+ /* (malloc'd or such). This routine is reasonably ugly in that it has */
+ /* priority manipulating code for lots of different operating */
+ /* systems. This routine never returns. raj 1/96 */
+
+static void
+sit_and_spin(int child_index)
+
+{
+ uint64_t *my_counter_ptr;
+
+ /* only use C stuff if we are not WIN32 unless and until we */
+ /* switch from CreateThread to _beginthread. raj 1/96 */
+#ifndef WIN32
+ /* we are the child. we could decide to exec some separate */
+ /* program, but that doesn't really seem worthwhile - raj 4/95 */
+ if (debug > 1) {
+ fprintf(where,
+ "Looper child %d is born, pid %d\n",
+ child_index,
+ getpid());
+ fflush(where);
+ }
+
+#endif /* WIN32 */
+
+ /* reset our base pointer to be at the appropriate offset */
+ my_counter_ptr = (uint64_t *) ((char *)lib_base_pointer +
+ (netlib_get_page_size() *
+ PAGES_PER_CHILD * child_index));
+
+ /* in the event we are running on an MP system, it would */
+ /* probably be good to bind the soaker processes to specific */
+ /* processors. I *think* this is the most reasonable thing to */
+ /* do, and would be closes to simulating the information we get */
+ /* on HP-UX with pstat. I could put all the system-specific code */
+ /* here, but will "abstract it into another routine to keep this */
+ /* area more readable. I'll probably do the same thine with the */
+ /* "low pri code" raj 10/95 */
+
+ /* since we are "flying blind" wrt where we should bind the looper
+ processes, we want to use the cpu_map that was prepared by netlib
+ rather than assume that the CPU ids on the system start at zero
+ and are contiguous. raj 2006-04-03 */
+ bind_to_specific_processor(child_index % lib_num_loc_cpus,1);
+
+ for (*my_counter_ptr = 0L;
+ ;
+ (*my_counter_ptr)++) {
+ if (!(*lib_base_pointer % 1)) {
+ /* every once and again, make sure that our process priority is */
+ /* nice and low. also, by making system calls, it may be easier */
+ /* for us to be pre-empted by something that needs to do useful */
+ /* work - like the thread of execution actually sending and */
+ /* receiving data across the network :) */
+#ifdef _AIX
+ int pid,prio;
+
+ prio = PRIORITY;
+ pid = getpid();
+ /* if you are not root, this call will return EPERM - why one */
+ /* cannot change one's own priority to lower value is beyond */
+ /* me. raj 2/26/96 */
+ setpri(pid, prio);
+#else /* _AIX */
+#ifdef __sgi
+ int pid,prio;
+
+ prio = PRIORITY;
+ pid = getpid();
+ schedctl(NDPRI, pid, prio);
+ sginap(0);
+#else /* __sgi */
+#ifdef WIN32
+ SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_IDLE);
+#else /* WIN32 */
+#if defined(__sun) && defined(__SVR4)
+#include <sys/types.h>
+#include <sys/priocntl.h>
+#include <sys/rtpriocntl.h>
+#include <sys/tspriocntl.h>
+ /* I would *really* like to know how to use priocntl to make the */
+ /* priority low for this looper process. however, either my mind */
+ /* is addled, or the manpage in section two for priocntl is not */
+ /* terribly helpful - for one, it has no examples :( so, if you */
+ /* can help, I'd love to hear from you. in the meantime, we will */
+ /* rely on nice(39). raj 2/26/96 */
+ nice(39);
+#else /* __sun && __SVR4 */
+ nice(39);
+#endif /* __sun && _SVR4 */
+#endif /* WIN32 */
+#endif /* __sgi */
+#endif /* _AIX */
+ }
+ }
+}
+
+
+
+ /* this routine will start all the looper processes or threads for */
+ /* measuring CPU utilization. */
+
+static void
+start_looper_processes()
+{
+
+ unsigned int i, file_size;
+
+ /* we want at least two pages for each processor. the */
+ /* child for any one processor will write to the first of his two */
+ /* pages, and the second page will be a buffer in case there is page */
+ /* prefetching. if your system pre-fetches more than a single page, */
+ /* well, you'll have to modify this or live with it :( raj 4/95 */
+
+ file_size = ((netlib_get_page_size() * PAGES_PER_CHILD) *
+ lib_num_loc_cpus);
+
+#ifndef WIN32
+
+ /* we we are not using WINDOWS NT (or 95 actually :), then we want */
+ /* to create a memory mapped region so we can see all the counting */
+ /* rates of the loopers */
+
+ /* could we just use an anonymous memory region for this? it is */
+ /* possible that using a mmap()'ed "real" file, while convenient for */
+ /* debugging, could result in some filesystem activity - like */
+ /* metadata updates? raj 4/96 */
+ lib_idle_fd = open("/tmp/netperf_cpu",O_RDWR | O_CREAT | O_EXCL);
+
+ if (lib_idle_fd == -1) {
+ fprintf(where,"create_looper: file creation; errno %d\n",errno);
+ fflush(where);
+ exit(1);
+ }
+
+ if (chmod("/tmp/netperf_cpu",0644) == -1) {
+ fprintf(where,"create_looper: chmod; errno %d\n",errno);
+ fflush(where);
+ exit(1);
+ }
+
+ /* with the file descriptor in place, lets be sure that the file is */
+ /* large enough. */
+
+ if (truncate("/tmp/netperf_cpu",file_size) == -1) {
+ fprintf(where,"create_looper: truncate: errno %d\n",errno);
+ fflush(where);
+ exit(1);
+ }
+
+ /* the file should be large enough now, so we can mmap it */
+
+ /* if the system does not have MAP_VARIABLE, just define it to */
+ /* be zero. it is only used/needed on HP-UX (?) raj 4/95 */
+#ifndef MAP_VARIABLE
+#define MAP_VARIABLE 0x0000
+#endif /* MAP_VARIABLE */
+#ifndef MAP_FILE
+#define MAP_FILE 0x0000
+#endif /* MAP_FILE */
+ if ((lib_base_pointer = (long *)mmap(NULL,
+ file_size,
+ PROT_READ | PROT_WRITE,
+ MAP_FILE | MAP_SHARED | MAP_VARIABLE,
+ lib_idle_fd,
+ 0)) == (long *)-1) {
+ fprintf(where,"create_looper: mmap: errno %d\n",errno);
+ fflush(where);
+ exit(1);
+ }
+
+
+ if (debug > 1) {
+ fprintf(where,"num CPUs %d, file_size %d, lib_base_pointer %p\n",
+ lib_num_loc_cpus,
+ file_size,
+ lib_base_pointer);
+ fflush(where);
+ }
+
+ /* we should have a valid base pointer. lets fork */
+
+ for (i = 0; i < (unsigned int)lib_num_loc_cpus; i++) {
+ switch (lib_idle_pids[i] = fork()) {
+ case -1:
+ perror("netperf: fork");
+ exit(1);
+ case 0:
+ /* we are the child. we could decide to exec some separate */
+ /* program, but that doesn't really seem worthwhile - raj 4/95 */
+
+ signal(SIGTERM, SIG_DFL);
+ sit_and_spin(i);
+
+ /* we should never really get here, but if we do, just exit(0) */
+ exit(0);
+ break;
+ default:
+ /* we must be the parent */
+ lib_idle_address[i] = (uint64_t *) ((char *)lib_base_pointer +
+ (netlib_get_page_size() *
+ PAGES_PER_CHILD * i));
+ if (debug) {
+ fprintf(where,"lib_idle_address[%d] is %p\n",
+ i,
+ lib_idle_address[i]);
+ fflush(where);
+ }
+ }
+ }
+#else
+ /* we are compiled -DWIN32 */
+ if ((lib_base_pointer = malloc(file_size)) == NULL) {
+ fprintf(where,
+ "create_looper_process could not malloc %d bytes\n",
+ file_size);
+ fflush(where);
+ exit(1);
+ }
+
+ /* now, create all the threads */
+ for(i = 0; i < (unsigned int)lib_num_loc_cpus; i++) {
+ long place_holder;
+ if ((lib_idle_pids[i] = CreateThread(0,
+ 0,
+ (LPTHREAD_START_ROUTINE)sit_and_spin,
+ (LPVOID)(ULONG_PTR)i,
+ 0,
+ &place_holder)) == NULL ) {
+ fprintf(where,
+ "create_looper_process: CreateThread failed\n");
+ fflush(where);
+ /* I wonder if I need to look for other threads to kill? */
+ exit(1);
+ }
+ lib_idle_address[i] = (long *) ((char *)lib_base_pointer +
+ (netlib_get_page_size() *
+ PAGES_PER_CHILD * i));
+ if (debug) {
+ fprintf(where,"lib_idle_address[%d] is %p\n",
+ i,
+ lib_idle_address[i]);
+ fflush(where);
+ }
+ }
+#endif /* WIN32 */
+
+ /* we need to have the looper processes settled-in before we do */
+ /* anything with them, so lets sleep for say 30 seconds. raj 4/95 */
+
+ sleep(30);
+}
+
+void
+cpu_util_init(void)
+{
+ cpu_method = LOOPER;
+
+ /* we want to get the looper processes going */
+ if (!lib_loopers_running) {
+ start_looper_processes();
+ lib_loopers_running = 1;
+ }
+
+ return;
+}
+
+/* clean-up any left-over CPU util resources - looper processes,
+ files, whatever. raj 2005-01-26 */
+void
+cpu_util_terminate() {
+
+#ifdef WIN32
+ /* it would seem that if/when the process exits, all the threads */
+ /* will go away too, so I don't think I need any explicit thread */
+ /* killing calls here. raj 1/96 */
+#else
+
+ int i;
+
+ /* now go through and kill-off all the child processes */
+ for (i = 0; i < lib_num_loc_cpus; i++){
+ /* SIGKILL can leave core files behind - thanks to Steinar Haug */
+ /* for pointing that out. */
+ kill(lib_idle_pids[i],SIGTERM);
+ }
+ lib_loopers_running = 0;
+ /* reap the children */
+ while(waitpid(-1, NULL, WNOHANG) > 0) { }
+
+ /* finally, unlink the mmaped file */
+ munmap((caddr_t)lib_base_pointer,
+ ((netlib_get_page_size() * PAGES_PER_CHILD) *
+ lib_num_loc_cpus));
+ unlink("/tmp/netperf_cpu");
+#endif
+ return;
+}
+
+int
+get_cpu_method(void)
+{
+ return LOOPER;
+}
+
+ /* calibrate_looper */
+
+ /* Loop a number of iterations, sleeping interval seconds each and */
+ /* count how high the idle counter gets each time. Return the */
+ /* measured cpu rate to the calling routine. raj 4/95 */
+
+float
+calibrate_idle_rate (int iterations, int interval)
+{
+
+ uint64_t
+ firstcnt[MAXCPUS],
+ secondcnt[MAXCPUS];
+
+ float
+ elapsed,
+ temp_rate,
+ rate[MAXTIMES],
+ local_maxrate;
+
+ long
+ sec,
+ usec;
+
+ int
+ i,
+ j;
+
+ struct timeval time1, time2 ;
+ struct timezone tz;
+
+ if (iterations > MAXTIMES) {
+ iterations = MAXTIMES;
+ }
+
+ local_maxrate = (float)-1.0;
+
+ for(i = 0; i < iterations; i++) {
+ rate[i] = (float)0.0;
+ for (j = 0; j < lib_num_loc_cpus; j++) {
+ firstcnt[j] = *(lib_idle_address[j]);
+ }
+ gettimeofday (&time1, &tz);
+ sleep(interval);
+ gettimeofday (&time2, &tz);
+
+ if (time2.tv_usec < time1.tv_usec)
+ {
+ time2.tv_usec += 1000000;
+ time2.tv_sec -=1;
+ }
+ sec = time2.tv_sec - time1.tv_sec;
+ usec = time2.tv_usec - time1.tv_usec;
+ elapsed = (float)sec + ((float)usec/(float)1000000.0);
+
+ if(debug) {
+ fprintf(where, "Calibration for counter run: %d\n",i);
+ fprintf(where,"\tsec = %ld usec = %ld\n",sec,usec);
+ fprintf(where,"\telapsed time = %g\n",elapsed);
+ }
+
+ for (j = 0; j < lib_num_loc_cpus; j++) {
+ secondcnt[j] = *(lib_idle_address[j]);
+ if(debug) {
+ /* I know that there are situations where compilers know about */
+ /* long long, but the library fucntions do not... raj 4/95 */
+ fprintf(where,
+ "\tfirstcnt[%d] = 0x%8.8lx%8.8lx secondcnt[%d] = 0x%8.8lx%8.8lx\n",
+ j,
+ (uint32_t)(firstcnt[j]>>32),
+ (uint32_t)(firstcnt[j]&0xffffffff),
+ j,
+ (uint32_t)(secondcnt[j]>>32),
+ (uint32_t)(secondcnt[j]&0xffffffff));
+ }
+ /* we assume that it would wrap no more than once. we also */
+ /* assume that the result of subtracting will "fit" raj 4/95 */
+ temp_rate = (secondcnt[j] >= firstcnt[j]) ?
+ (float)(secondcnt[j] - firstcnt[j])/elapsed :
+ (float)(secondcnt[j]-firstcnt[j]+MAXLONG)/elapsed;
+ if (temp_rate > rate[i]) rate[i] = temp_rate;
+ if(debug) {
+ fprintf(where,"\trate[%d] = %g\n",i,rate[i]);
+ fflush(where);
+ }
+ if (local_maxrate < rate[i]) local_maxrate = rate[i];
+ }
+ }
+ if(debug) {
+ fprintf(where,"\tlocal maxrate = %g per sec. \n",local_maxrate);
+ fflush(where);
+ }
+ return local_maxrate;
+}
+
+
+void
+get_cpu_idle (uint64_t *res)
+{
+ int i;
+
+ for (i = 0; i < lib_num_loc_cpus; i++){
+ res[i] = *lib_idle_address[i];
+ }
+
+}
+
+float
+calc_cpu_util_internal(float elapsed_time)
+{
+ int i;
+ float correction_factor;
+ float actual_rate;
+
+ lib_local_cpu_util = (float)0.0;
+ /* It is possible that the library measured a time other than */
+ /* the one that the user want for the cpu utilization */
+ /* calculations - for example, tests that were ended by */
+ /* watchdog timers such as the udp stream test. We let these */
+ /* tests tell up what the elapsed time should be. */
+
+ if (elapsed_time != 0.0) {
+ correction_factor = (float) 1.0 +
+ ((lib_elapsed - elapsed_time) / elapsed_time);
+ }
+ else {
+ correction_factor = (float) 1.0;
+ }
+
+ for (i = 0; i < lib_num_loc_cpus; i++) {
+
+ /* it would appear that on some systems, in loopback, nice is
+ *very* effective, causing the looper process to stop dead in its
+ tracks. if this happens, we need to ensure that the calculation
+ does not go south. raj 6/95 and if we run completely out of idle,
+ the same thing could in theory happen to the USE_KSTAT path. raj
+ 8/2000 */
+
+ if (lib_end_count[i] == lib_start_count[i]) {
+ lib_end_count[i]++;
+ }
+
+ actual_rate = (lib_end_count[i] > lib_start_count[i]) ?
+ (float)(lib_end_count[i] - lib_start_count[i])/lib_elapsed :
+ (float)(lib_end_count[i] - lib_start_count[i] +
+ MAXLONG)/ lib_elapsed;
+ if (debug) {
+ fprintf(where,
+ "calc_cpu_util: actual_rate on processor %d is %f start 0x%8.8lx%8.8lx end 0x%8.8lx%8.8lx\n",
+ i,
+ actual_rate,
+ (uint32_t)(lib_start_count[i]>>32),
+ (uint32_t)(lib_start_count[i]&0xffffffff),
+ (uint32_t)(lib_end_count[i]>>32),
+ (uint32_t)(lib_end_count[i]&0xffffffff));
+ }
+ lib_local_per_cpu_util[i] = (lib_local_maxrate - actual_rate) /
+ lib_local_maxrate * 100;
+ lib_local_cpu_util += lib_local_per_cpu_util[i];
+ }
+ /* we want the average across all n processors */
+ lib_local_cpu_util /= (float)lib_num_loc_cpus;
+
+ lib_local_cpu_util *= correction_factor;
+ return lib_local_cpu_util;
+
+
+}
+void
+cpu_start_internal(void)
+{
+ get_cpu_idle(lib_start_count);
+ return;
+}
+
+void
+cpu_stop_internal(void)
+{
+ get_cpu_idle(lib_end_count);
+}
diff --git a/netcpu_none.c b/netcpu_none.c
new file mode 100644
index 0000000..f71b240
--- /dev/null
+++ b/netcpu_none.c
@@ -0,0 +1,67 @@
+char netcpu_none_id[]="\
+@(#)netcpu_none.c (c) Copyright 2005, Hewlett-Packard Company, Version 2.4.0";
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+
+#include "netsh.h"
+#include "netlib.h"
+
+void
+cpu_util_init(void)
+{
+ return;
+}
+
+void
+cpu_util_terminate(void)
+{
+ return;
+}
+
+int
+get_cpu_method(void)
+{
+ return CPU_UNKNOWN;
+}
+
+void
+get_cpu_idle(uint64_t *res)
+{
+ return;
+}
+
+float
+calibrate_idle_rate(int iterations, int interval)
+{
+ return 0.0;
+}
+
+float
+calc_cpu_util_internal(float elapsed_time)
+{
+ return -1.0;
+}
+
+void
+cpu_start_internal(void)
+{
+ return;
+}
+
+void
+cpu_stop_internal(void)
+{
+ return;
+}
diff --git a/netcpu_ntperf.c b/netcpu_ntperf.c
new file mode 100644
index 0000000..e8d8f76
--- /dev/null
+++ b/netcpu_ntperf.c
@@ -0,0 +1,497 @@
+char netcpu_ntperf_id[]="\
+@(#)netcpu_ntperf.c (c) Copyright 2005-2007, Hewlett-Packard Company, Version 2.4.3";
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+
+#if 0
+#include <limits.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#endif
+
+#include <assert.h>
+
+#include <process.h>
+#include <time.h>
+
+#include <windows.h>
+#include <assert.h>
+
+#include <winsock2.h>
+// If you are trying to compile on Windows 2000 or NT 4.0 you may
+// need to define DONT_IPV6 in the "sources" files.
+#ifndef DONT_IPV6
+#include <ws2tcpip.h>
+#endif
+
+#include "netsh.h"
+#include "netlib.h"
+
+//
+// System CPU time information class.
+// Used to get CPU time information.
+//
+// SDK\inc\ntexapi.h
+// Function x8: SystemProcessorPerformanceInformation
+// DataStructure: SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION
+//
+
+#define SystemProcessorPerformanceInformation 0x08
+
+typedef struct
+{
+ LARGE_INTEGER IdleTime;
+ LARGE_INTEGER KernelTime;
+ LARGE_INTEGER UserTime;
+ LARGE_INTEGER DpcTime;
+ LARGE_INTEGER InterruptTime;
+ LONG InterruptCount;
+} SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION, *PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION;
+
+//
+// Calls to get the information
+//
+typedef ULONG (__stdcall *NT_QUERY_SYSTEM_INFORMATION)(
+ ULONG SystemInformationClass,
+ PVOID SystemInformation,
+ ULONG SystemInformationLength,
+ PULONG ReturnLength
+ );
+
+NT_QUERY_SYSTEM_INFORMATION NtQuerySystemInformation = NULL;
+
+
+static LARGE_INTEGER TickHz = {0,0};
+
+_inline LARGE_INTEGER ReadPerformanceCounter(VOID)
+{
+ LARGE_INTEGER Counter;
+ QueryPerformanceCounter(&Counter);
+
+ return(Counter);
+} // ReadperformanceCounter
+
+
+/* The NT performance data is accessed through the NtQuerySystemInformation
+ call. References to the PDH.DLL have been deleted. This structure
+ is the root for these data structures. */
+
+typedef struct sPerfObj
+{
+ LARGE_INTEGER StartTime;
+ LARGE_INTEGER EndTime;
+ SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION StartInfo[MAXCPUS +1];
+ SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION EndInfo[MAXCPUS +1];
+} PerfObj, *PPerfObj;
+
+static PerfObj *PerfCntrs;
+
+// Forward declarations
+
+PerfObj *InitPerfCntrs();
+void RestartPerfCntrs(PerfObj *PerfCntrs);
+double ReportPerfCntrs(PerfObj *PerfCntrs); /* returns CPU utilization */
+void ClosePerfCntrs(PerfObj *PerfCntrs);
+
+
+void
+cpu_util_init(void)
+{
+ if (NtQuerySystemInformation == NULL) {
+ // Open the performance counter interface
+ PerfCntrs = InitPerfCntrs();
+ }
+ return;
+}
+
+void
+cpu_util_terminate(void)
+{
+ return;
+}
+
+int
+get_cpu_method(void)
+{
+ return NT_METHOD;
+}
+
+typedef unsigned __int64 uint64_t;
+
+void
+get_cpu_idle(uint64_t *res)
+{
+ RestartPerfCntrs(PerfCntrs);
+ return;
+}
+
+float
+calibrate_idle_rate(int iterations, int interval)
+{
+ return (float)0.0;
+}
+
+
+/*
+ InitPerfCntrs() -
+
+ Changed to no longer access the NT performance registry interfaces.
+ A direct call to NtQuerySystemInformation (an undocumented NT API)
+ is made instead. Parameters determined by decompilation of ntkrnlmp
+ and ntdll.
+*/
+
+
+PerfObj *InitPerfCntrs()
+{
+ PerfObj *NewPerfCntrs;
+ DWORD NTVersion;
+ DWORD status;
+ SYSTEM_INFO SystemInfo;
+
+ GetSystemInfo(&SystemInfo);
+
+ NewPerfCntrs = (PerfObj *)GlobalAlloc(GPTR, sizeof(PerfObj));
+ assert(NewPerfCntrs != NULL);
+
+ ZeroMemory((PCHAR)NewPerfCntrs, sizeof(PerfObj));
+
+ // get NT version
+ NTVersion = GetVersion();
+ if (NTVersion >= 0x80000000)
+ {
+ fprintf(stderr, "Not running on Windows NT\n");
+ exit(1);
+ }
+
+ // locate the calls we need in NTDLL
+ //Lint
+ NtQuerySystemInformation =
+ (NT_QUERY_SYSTEM_INFORMATION)GetProcAddress( GetModuleHandle("ntdll.dll"),
+ "NtQuerySystemInformation" );
+
+ if ( !(NtQuerySystemInformation) )
+ {
+ //Lint
+ status = GetLastError();
+ fprintf(stderr, "GetProcAddressFailed, status: %X\n", status);
+ exit(1);
+ }
+
+ // setup to measure timestamps with the high resolution timers.
+ if (QueryPerformanceFrequency(&TickHz) == FALSE)
+ {
+ fprintf(stderr,"MAIN - QueryPerformanceFrequency Failed!\n");
+ exit(2);
+ }
+
+ RestartPerfCntrs(NewPerfCntrs);
+
+ return(NewPerfCntrs);
+} /* InitPerfCntrs */
+
+/*
+ RestartPerfCntrs() -
+
+ The Performance counters must be read twice to produce rate and
+ percentage results. This routine is called before the start of a
+ benchmark to establish the initial counters. It must be called a
+ second time after the benchmark completes to collect the final state
+ of the performance counters. ReportPerfCntrs is called to print the
+ results after the benchmark completes.
+*/
+
+void RestartPerfCntrs(PerfObj *PerfCntrs)
+{
+ DWORD returnLength = 0; //Lint
+ DWORD returnNumCPUs; //Lint
+ DWORD i;
+
+ DWORD status;
+ SYSTEM_INFO SystemInfo;
+
+ GetSystemInfo(&SystemInfo);
+
+ // Move previous data from EndInfo to StartInfo.
+ CopyMemory((PCHAR)&PerfCntrs->StartInfo[0],
+ (PCHAR)&PerfCntrs->EndInfo[0],
+ sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)*(MAXCPUS +1));
+
+ PerfCntrs->StartTime = PerfCntrs->EndTime;
+
+ // get the current CPUTIME information
+ if ( (status = NtQuerySystemInformation( SystemProcessorPerformanceInformation,
+ (PCHAR)&PerfCntrs->EndInfo[0], sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)*MAXCPUS,
+ &returnLength )) != 0)
+ {
+ fprintf(stderr, "NtQuery failed, status: %X\n", status);
+ exit(1);
+ }
+
+ PerfCntrs->EndTime = ReadPerformanceCounter();
+
+ // Validate that NtQuery returned a reasonable amount of data
+ if ((returnLength % sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)) != 0)
+ {
+ fprintf(stderr, "NtQuery didn't return expected amount of data\n");
+ fprintf(stderr, "Expected a multiple of %i, returned %i\n",
+ sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION), returnLength);
+ exit(1);
+ }
+ returnNumCPUs = returnLength / sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION);
+
+ if (returnNumCPUs != (int)SystemInfo.dwNumberOfProcessors)
+ {
+ fprintf(stderr, "NtQuery didn't return expected amount of data\n");
+ fprintf(stderr, "Expected data for %i CPUs, returned %i\n",
+ (int)SystemInfo.dwNumberOfProcessors, returnNumCPUs);
+ exit(1);
+ }
+
+ // Zero entries not returned by NtQuery
+ ZeroMemory((PCHAR)&PerfCntrs->EndInfo[returnNumCPUs],
+ sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)*
+ (MAXCPUS +1 - returnNumCPUs));
+
+ // Total all of the CPUs
+ // KernelTime needs to be fixed-up; it includes both idle &
+ // true kernel time
+ // Note that kernel time also includes DpcTime & InterruptTime, but
+ // I like this.
+ for (i=0; i < returnNumCPUs; i++)
+ {
+ PerfCntrs->EndInfo[i].KernelTime.QuadPart -= PerfCntrs->EndInfo[i].IdleTime.QuadPart;
+ PerfCntrs->EndInfo[MAXCPUS].IdleTime.QuadPart += PerfCntrs->EndInfo[i].IdleTime.QuadPart;
+ PerfCntrs->EndInfo[MAXCPUS].KernelTime.QuadPart += PerfCntrs->EndInfo[i].KernelTime.QuadPart;
+ PerfCntrs->EndInfo[MAXCPUS].UserTime.QuadPart += PerfCntrs->EndInfo[i].UserTime.QuadPart;
+ PerfCntrs->EndInfo[MAXCPUS].DpcTime.QuadPart += PerfCntrs->EndInfo[i].DpcTime.QuadPart;
+ PerfCntrs->EndInfo[MAXCPUS].InterruptTime.QuadPart += PerfCntrs->EndInfo[i].InterruptTime.QuadPart;
+ PerfCntrs->EndInfo[MAXCPUS].InterruptCount += PerfCntrs->EndInfo[i].InterruptCount;
+ }
+
+} /* RestartPerfCntrs */
+
+/*
+ ReportPerfCntrs() -
+ This routine reports the results of the various performance
+ counters.
+*/
+
+double ReportPerfCntrs(PerfObj *PerfCntrs)
+{
+ double tot_CPU_Util;
+ int i;
+ int duration; // in 100 usecs
+
+ LARGE_INTEGER ActualDuration;
+
+ SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION DeltaInfo[MAXCPUS +1];
+
+ LARGE_INTEGER TotalCPUTime[MAXCPUS +1];
+
+ SYSTEM_INFO SystemInfo;
+
+ GetSystemInfo(&SystemInfo);
+
+ for (i=0; i <= MAXCPUS; i++)
+ {
+ DeltaInfo[i].IdleTime.QuadPart = PerfCntrs->EndInfo[i].IdleTime.QuadPart -
+ PerfCntrs->StartInfo[i].IdleTime.QuadPart;
+ DeltaInfo[i].KernelTime.QuadPart = PerfCntrs->EndInfo[i].KernelTime.QuadPart -
+ PerfCntrs->StartInfo[i].KernelTime.QuadPart;
+ DeltaInfo[i].UserTime.QuadPart = PerfCntrs->EndInfo[i].UserTime.QuadPart -
+ PerfCntrs->StartInfo[i].UserTime.QuadPart;
+ DeltaInfo[i].DpcTime.QuadPart = PerfCntrs->EndInfo[i].DpcTime.QuadPart -
+ PerfCntrs->StartInfo[i].DpcTime.QuadPart;
+ DeltaInfo[i].InterruptTime.QuadPart = PerfCntrs->EndInfo[i].InterruptTime.QuadPart -
+ PerfCntrs->StartInfo[i].InterruptTime.QuadPart;
+ DeltaInfo[i].InterruptCount = PerfCntrs->EndInfo[i].InterruptCount -
+ PerfCntrs->StartInfo[i].InterruptCount;
+
+ TotalCPUTime[i].QuadPart =
+ DeltaInfo[i].IdleTime.QuadPart +
+ DeltaInfo[i].KernelTime.QuadPart +
+ DeltaInfo[i].UserTime.QuadPart;
+ // KernelTime already includes DpcTime & InterruptTime!
+ // + DeltaInfo[i].DpcTime.QuadPart +
+ // DeltaInfo[i].InterruptTime.QuadPart;
+ }
+
+ tot_CPU_Util = 100.0*(1.0 - (double)DeltaInfo[MAXCPUS].IdleTime.QuadPart/(double)TotalCPUTime[MAXCPUS].QuadPart); //Lint
+
+ // Re-calculate duration, since we may have stoped early due to cntr-C.
+ ActualDuration.QuadPart = PerfCntrs->EndTime.QuadPart -
+ PerfCntrs->StartTime.QuadPart;
+
+ // convert to 1/10 milliseconds (100 usec)
+ ActualDuration.QuadPart = (ActualDuration.QuadPart*10000)/TickHz.QuadPart;
+ duration = ActualDuration.LowPart;
+
+ if (verbosity > 1)
+ {
+ fprintf(where,"ActualDuration (ms): %d\n", duration/10);
+ }
+
+ if (verbosity > 1)
+ {
+ fprintf(where, "%% CPU _Total");
+ if ((int)SystemInfo.dwNumberOfProcessors > 1)
+ {
+ for (i=0; i < (int)SystemInfo.dwNumberOfProcessors; i++)
+ {
+ fprintf(where, "\t CPU %i", i);
+ }
+ }
+ fprintf(where, "\n");
+
+ fprintf(where, "Busy %5.2f", tot_CPU_Util);
+ if ((int)SystemInfo.dwNumberOfProcessors > 1)
+ {
+ for (i=0; i < (int)SystemInfo.dwNumberOfProcessors; i++)
+ {
+ fprintf(where, "\t %5.2f",
+ 100.0*(1.0 - (double)DeltaInfo[i].IdleTime.QuadPart/(double)TotalCPUTime[i].QuadPart)); //Lint
+ }
+ }
+ fprintf(where, "\n");
+
+ fprintf(where, "Kernel %5.2f",
+ 100.0*(double)DeltaInfo[MAXCPUS].KernelTime.QuadPart/(double)TotalCPUTime[MAXCPUS].QuadPart); //Lint
+
+ if ((int)SystemInfo.dwNumberOfProcessors > 1)
+ {
+ for (i=0; i < (int)SystemInfo.dwNumberOfProcessors; i++)
+ {
+ fprintf(where, "\t %5.2f",
+ 100.0*(double)DeltaInfo[i].KernelTime.QuadPart/(double)TotalCPUTime[i].QuadPart); //Lint
+ }
+ }
+ fprintf(where, "\n");
+
+ fprintf(where, "User %5.2f",
+ 100.0*(double)DeltaInfo[MAXCPUS].UserTime.QuadPart/(double)TotalCPUTime[MAXCPUS].QuadPart);
+
+ if ((int)SystemInfo.dwNumberOfProcessors > 1)
+ {
+ for (i=0; i < (int)SystemInfo.dwNumberOfProcessors; i++)
+ {
+ fprintf(where, "\t %5.2f",
+ 100.0*(double)DeltaInfo[i].UserTime.QuadPart/TotalCPUTime[i].QuadPart); //Lint
+ }
+ }
+ fprintf(where, "\n");
+
+ fprintf(where, "Dpc %5.2f",
+ 100.0*(double)DeltaInfo[MAXCPUS].DpcTime.QuadPart/(double)TotalCPUTime[MAXCPUS].QuadPart); //Lint
+
+ if ((int)SystemInfo.dwNumberOfProcessors > 1)
+ {
+ for (i=0; i < (int)SystemInfo.dwNumberOfProcessors; i++)
+ {
+ fprintf(where, "\t %5.2f",
+ 100.0*(double)DeltaInfo[i].DpcTime.QuadPart/(double)TotalCPUTime[i].QuadPart); //Lint
+ }
+ }
+ fprintf(where, "\n");
+
+ fprintf(where, "Interrupt %5.2f",
+ 100.0*(double)DeltaInfo[MAXCPUS].InterruptTime.QuadPart/(double)TotalCPUTime[MAXCPUS].QuadPart); //Lint
+
+ if ((int)SystemInfo.dwNumberOfProcessors > 1)
+ {
+ for (i=0; i < (int)SystemInfo.dwNumberOfProcessors; i++)
+ {
+ fprintf(where, "\t %5.2f",
+ 100.0*(double)DeltaInfo[i].InterruptTime.QuadPart/TotalCPUTime[i].QuadPart); //Lint
+ }
+ }
+ fprintf(where, "\n\n");
+
+ fprintf(where, "Interrupt/Sec. %5.1f",
+ (double)DeltaInfo[MAXCPUS].InterruptCount*10000.0/(double)duration);
+
+ if ((int)SystemInfo.dwNumberOfProcessors > 1)
+ {
+ for (i=0; i < (int)SystemInfo.dwNumberOfProcessors; i++)
+ {
+ fprintf(where, "\t %5.1f",
+ (double)DeltaInfo[i].InterruptCount*10000.0/(double)duration);
+ }
+ }
+ fprintf(where, "\n\n");
+ fflush(where);
+ }
+
+ return (tot_CPU_Util);
+
+} /* ReportPerfCntrs */
+
+/*
+ ClosePerfCntrs() -
+
+ This routine cleans up the performance counter APIs.
+*/
+
+void ClosePerfCntrs(PerfObj *PerfCntrs)
+{
+ GlobalFree(PerfCntrs);
+
+ NtQuerySystemInformation = NULL;
+} /* ClosePerfCntrs */
+
+void
+cpu_start_internal(void)
+{
+ RestartPerfCntrs(PerfCntrs);
+}
+
+void
+cpu_stop_internal(void)
+{
+ RestartPerfCntrs(PerfCntrs);
+}
+
+float
+calc_cpu_util_internal(float elapsed_time)
+{
+ float correction_factor;
+ lib_local_cpu_util = (float)0.0;
+ /* It is possible that the library measured a time other than */
+ /* the one that the user want for the cpu utilization */
+ /* calculations - for example, tests that were ended by */
+ /* watchdog timers such as the udp stream test. We let these */
+ /* tests tell up what the elapsed time should be. */
+
+ if (elapsed_time != 0.0) {
+ correction_factor = (float) 1.0 +
+ ((lib_elapsed - elapsed_time) / elapsed_time);
+ }
+ else {
+ correction_factor = (float) 1.0;
+ }
+
+ if (debug) {
+ fprintf(where, "correction factor: %f\n", correction_factor);
+ }
+
+ lib_local_cpu_util = (float)ReportPerfCntrs(PerfCntrs);
+ lib_local_cpu_util *= correction_factor;
+ return lib_local_cpu_util;
+
+}
diff --git a/netcpu_osx.c b/netcpu_osx.c
new file mode 100644
index 0000000..2132be1
--- /dev/null
+++ b/netcpu_osx.c
@@ -0,0 +1,149 @@
+char netcpu_sysctl_id[]="\
+@(#)netcpu_osx.c Version 2.4.3";
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+#if HAVE_LIMITS_H
+# include <limits.h>
+# ifndef LONG_LONG_MAX
+# define LONG_LONG_MAX LLONG_MAX
+# endif /* LONG_LONG_MAX */
+#endif
+
+
+#include <errno.h>
+
+#include <mach/host_info.h>
+#include <mach/mach_types.h>
+/* it would seem that on 10.3.9 mach_msg_type_number_t is in
+ <mach/message.h> so we'll see about including that one too.
+ hopefully it still exists in 10.4. if not, we will need to add some
+ .h file checks in configure so we can use "HAVE_mumble" ifdefs
+ here */
+#include <mach/message.h>
+
+#include "netsh.h"
+#include "netlib.h"
+
+#define UNSIGNED_DIFFERENCE(x,y) (x >= y ? x - y : (0 - y) + x )
+
+static host_cpu_load_info_data_t lib_start_ticks;
+static host_cpu_load_info_data_t lib_end_ticks;
+
+static mach_port_t lib_host_port;
+
+void
+cpu_util_init(void)
+{
+ lib_host_port = mach_host_self();
+ return;
+}
+
+void
+cpu_util_terminate(void)
+{
+ mach_port_deallocate(lib_host_port);
+ return;
+}
+
+int
+get_cpu_method(void)
+{
+ return OSX;
+}
+
+void
+get_cpu_idle(uint64_t *res)
+{
+ return;
+}
+
+void
+get_host_ticks(host_cpu_load_info_t info)
+{
+ mach_msg_type_number_t count;
+
+ count = HOST_CPU_LOAD_INFO_COUNT;
+ host_statistics(lib_host_port, HOST_CPU_LOAD_INFO, (host_info_t)info, &count);
+ return;
+}
+
+/* calibrate_sysctl - perform the idle rate calculation using the
+ sysctl call - typically on BSD */
+
+float
+calibrate_idle_rate(int iterations, int interval)
+{
+ return (float)0.0;
+}
+
+float
+calc_cpu_util_internal(float elapsed_time)
+{
+ float correction_factor;
+ natural_t userticks, systicks, idleticks, totalticks;
+
+ lib_local_cpu_util = (float)0.0;
+ /* It is possible that the library measured a time other than */
+ /* the one that the user want for the cpu utilization */
+ /* calculations - for example, tests that were ended by */
+ /* watchdog timers such as the udp stream test. We let these */
+ /* tests tell up what the elapsed time should be. */
+
+ if (elapsed_time != 0.0) {
+ correction_factor = (float) 1.0 +
+ ((lib_elapsed - elapsed_time) / elapsed_time);
+ }
+ else {
+ correction_factor = (float) 1.0;
+ }
+
+ if (debug) {
+ fprintf(where, "correction factor: %f\n", correction_factor);
+ }
+
+ userticks = UNSIGNED_DIFFERENCE((lib_end_ticks.cpu_ticks[CPU_STATE_USER] + lib_end_ticks.cpu_ticks[CPU_STATE_NICE]),
+ (lib_start_ticks.cpu_ticks[CPU_STATE_USER] + lib_start_ticks.cpu_ticks[CPU_STATE_NICE]));
+ systicks = UNSIGNED_DIFFERENCE(lib_end_ticks.cpu_ticks[CPU_STATE_SYSTEM], lib_start_ticks.cpu_ticks[CPU_STATE_SYSTEM]);
+ idleticks = UNSIGNED_DIFFERENCE(lib_end_ticks.cpu_ticks[CPU_STATE_IDLE], lib_start_ticks.cpu_ticks[CPU_STATE_IDLE]);
+ totalticks = userticks + systicks + idleticks;
+
+ lib_local_cpu_util = ((float)userticks + (float)systicks)/(float)totalticks * 100.0f;
+ lib_local_cpu_util *= correction_factor;
+
+ return lib_local_cpu_util;
+
+}
+void
+cpu_start_internal(void)
+{
+ get_host_ticks(&lib_start_ticks);
+}
+
+void
+cpu_stop_internal(void)
+{
+ get_host_ticks(&lib_end_ticks);
+}
diff --git a/netcpu_perfstat.c b/netcpu_perfstat.c
new file mode 100644
index 0000000..f928a25
--- /dev/null
+++ b/netcpu_perfstat.c
@@ -0,0 +1,351 @@
+char netcpu_perfstat_id[]="\
+@(#)netcpu_perfstat.c Version 2.4.0";
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+
+#if HAVE_LIMITS_H
+# include <limits.h>
+# ifndef LONG_LONG_MAX
+# define LONG_LONG_MAX LLONG_MAX
+# endif /* LONG_LONG_MAX */
+#endif
+
+#include <errno.h>
+
+#include "netsh.h"
+#include "netlib.h"
+
+/* the lib_start_count and lib_end_count arrays hold the starting
+ and ending values of whatever is counting when the system is
+ idle. The rate at which this increments during a test is compared
+ with a previous calibration to arrive at a CPU utilization
+ percentage. raj 2005-01-26 */
+static uint64_t lib_start_count[MAXCPUS];
+static uint64_t lib_end_count[MAXCPUS];
+
+
+void
+cpu_util_init(void)
+{
+ return;
+}
+
+void
+cpu_util_terminate(void)
+{
+ return;
+}
+
+int
+get_cpu_method(void)
+{
+ return PERFSTAT;
+}
+
+void
+get_cpu_idle(uint64_t *res)
+{
+ perfstat_cpu_t *perfstat_buffer;
+ perfstat_cpu_t *per_cpu_pointer;
+ perfstat_id_t name;
+ int i,ret;
+
+ /* a name of "" will cause us to start from the beginning */
+ strcpy(name.name,"");
+ perfstat_buffer = (perfstat_cpu_t *)malloc(lib_num_loc_cpus *
+ sizeof(perfstat_cpu_t));
+ if (perfstat_buffer == NULL) {
+ fprintf(where,
+ "cpu_start: malloc failed errno %d\n",
+ errno);
+ fflush(where);
+ exit(-1);
+ }
+
+ /* happiness and joy, keep going */
+ ret = perfstat_cpu(&name,
+ perfstat_buffer,
+ sizeof(perfstat_cpu_t),
+ lib_num_loc_cpus);
+
+ if ((ret == -1) ||
+ (ret != lib_num_loc_cpus)) {
+ fprintf(where,
+ "cpu_start: perfstat_cpu failed/count off; errno %d cpus %d count %d\n",
+ errno,
+ lib_num_loc_cpus,
+ ret);
+ fflush(where);
+ exit(-1);
+ }
+
+ per_cpu_pointer = perfstat_buffer;
+ for (i = 0; i < lib_num_loc_cpus; i++){
+ res[i] = per_cpu_pointer->idle;
+ per_cpu_pointer++;
+ }
+ free(perfstat_buffer);
+
+ return;
+}
+
+float
+calibrate_idle_rate(int iterations, int interval)
+{
+ unsigned long long
+ firstcnt[MAXCPUS],
+ secondcnt[MAXCPUS];
+
+ float
+ elapsed,
+ temp_rate,
+ rate[MAXTIMES],
+ local_maxrate;
+
+ long
+ sec,
+ usec;
+
+ int
+ i,
+ j;
+
+ struct timeval time1, time2 ;
+ struct timezone tz;
+
+ perfstat_cpu_t *perfstat_buffer;
+ perfstat_cpu_t *per_cpu_pointer;
+ perfstat_id_t name;
+ int ret;
+
+ if (debug) {
+ fprintf(where,"enter calibrate_perfstat\n");
+ fflush(where);
+ }
+
+ if (iterations > MAXTIMES) {
+ iterations = MAXTIMES;
+ }
+
+ local_maxrate = (float)-1.0;
+
+ perfstat_buffer = (perfstat_cpu_t *)malloc(lib_num_loc_cpus *
+ sizeof(perfstat_cpu_t));
+ if (perfstat_buffer == NULL) {
+ fprintf(where,
+ "calibrate_perfstat: malloc failed errno %d\n",
+ errno);
+ fflush(where);
+ exit(-1);
+ }
+
+ for(i = 0; i < iterations; i++) {
+ rate[i] = (float)0.0;
+ /* a name of "" will cause us to start from the beginning */
+ strcpy(name.name,"");
+
+ /* happiness and joy, keep going */
+ ret = perfstat_cpu(&name,
+ perfstat_buffer,
+ sizeof(perfstat_cpu_t),
+ lib_num_loc_cpus);
+
+ if ((ret == -1) ||
+ (ret != lib_num_loc_cpus)) {
+ fprintf(where,
+ "calibrate_perfstat: perfstat_cpu failed/count off; errno %d cpus %d count %d\n",
+ errno,
+ lib_num_loc_cpus,
+ ret);
+ fflush(where);
+ exit(-1);
+ }
+
+ per_cpu_pointer = perfstat_buffer;
+ for (j = 0; j < lib_num_loc_cpus; j++) {
+ firstcnt[j] = per_cpu_pointer->idle;
+ per_cpu_pointer++;
+ }
+ gettimeofday (&time1, &tz);
+ sleep(interval);
+ gettimeofday (&time2, &tz);
+
+ if (time2.tv_usec < time1.tv_usec)
+ {
+ time2.tv_usec += 1000000;
+ time2.tv_sec -=1;
+ }
+ sec = time2.tv_sec - time1.tv_sec;
+ usec = time2.tv_usec - time1.tv_usec;
+ elapsed = (float)sec + ((float)usec/(float)1000000.0);
+
+ /* happiness and joy, keep going */
+ ret = perfstat_cpu(&name,
+ perfstat_buffer,
+ sizeof(perfstat_cpu_t),
+ lib_num_loc_cpus);
+
+ if ((ret == -1) ||
+ (ret != lib_num_loc_cpus)) {
+ fprintf(where,
+ "calibrate_perfstat: perfstat_cpu failed/count off; errno %d cpus %d count %d\n",
+ errno,
+ lib_num_loc_cpus,
+ ret);
+ fflush(where);
+ exit(-1);
+ }
+
+ per_cpu_pointer = perfstat_buffer;
+
+ if(debug) {
+ fprintf(where, "Calibration for perfstat counter run: %d\n",i);
+ fprintf(where,"\tsec = %ld usec = %ld\n",sec,usec);
+ fprintf(where,"\telapsed time = %g\n",elapsed);
+ }
+
+ for (j = 0; j < lib_num_loc_cpus; j++) {
+ secondcnt[j] = per_cpu_pointer->idle;
+ per_cpu_pointer++;
+ if(debug) {
+ /* I know that there are situations where compilers know about */
+ /* long long, but the library functions do not... raj 4/95 */
+ fprintf(where,
+ "\tfirstcnt[%d] = 0x%8.8lx%8.8lx secondcnt[%d] = 0x%8.8lx%8.8lx\n",
+ j,
+ firstcnt[j],
+ firstcnt[j],
+ j,
+ secondcnt[j],
+ secondcnt[j]);
+ }
+ /* we assume that it would wrap no more than once. we also */
+ /* assume that the result of subtracting will "fit" raj 4/95 */
+ temp_rate = (secondcnt[j] >= firstcnt[j]) ?
+ (float)(secondcnt[j] - firstcnt[j])/elapsed :
+ (float)(secondcnt[j]-firstcnt[j]+MAXLONG)/elapsed;
+ if (temp_rate > rate[i]) rate[i] = temp_rate;
+ if(debug) {
+ fprintf(where,"\trate[%d] = %g\n",i,rate[i]);
+ fflush(where);
+ }
+ if (local_maxrate < rate[i]) local_maxrate = rate[i];
+ }
+ }
+ if(debug) {
+ fprintf(where,"\tlocal maxrate = %g per sec. \n",local_maxrate);
+ fflush(where);
+ }
+ free(perfstat_buffer);
+ return local_maxrate;
+}
+
+float
+calc_cpu_util_internal(float elapsed_time)
+{
+ int i;
+
+ float actual_rate;
+ float correction_factor;
+
+ lib_local_cpu_util = (float)0.0;
+ /* It is possible that the library measured a time other than */
+ /* the one that the user want for the cpu utilization */
+ /* calculations - for example, tests that were ended by */
+ /* watchdog timers such as the udp stream test. We let these */
+ /* tests tell up what the elapsed time should be. */
+
+ if (elapsed_time != 0.0) {
+ correction_factor = (float) 1.0 +
+ ((lib_elapsed - elapsed_time) / elapsed_time);
+ }
+ else {
+ correction_factor = (float) 1.0;
+ }
+
+ /* this looks just like the looper case. at least I think it */
+ /* should :) raj 4/95 */
+ for (i = 0; i < lib_num_loc_cpus; i++) {
+
+ /* we assume that the two are not more than a long apart. I */
+ /* know that this is bad, but trying to go from long longs to */
+ /* a float (perhaps a double) is boggling my mind right now. */
+ /* raj 4/95 */
+
+ long long
+ diff;
+
+ if (lib_end_count[i] >= lib_start_count[i]) {
+ diff = lib_end_count[i] - lib_start_count[i];
+ }
+ else {
+ diff = lib_end_count[i] - lib_start_count[i] + LONG_LONG_MAX;
+ }
+ actual_rate = (float) diff / lib_elapsed;
+ lib_local_per_cpu_util[i] = (lib_local_maxrate - actual_rate) /
+ lib_local_maxrate * 100;
+ lib_local_cpu_util += lib_local_per_cpu_util[i];
+ if (debug) {
+ fprintf(where,
+ "calc_cpu_util: actual_rate on cpu %d is %g max_rate %g cpu %6.2f\n",
+ i,
+ actual_rate,
+ lib_local_maxrate,
+ lib_local_per_cpu_util[i]);
+ }
+ }
+
+ /* we want the average across all n processors */
+ lib_local_cpu_util /= (float)lib_num_loc_cpus;
+
+ if (debug) {
+ fprintf(where,
+ "calc_cpu_util: average across CPUs is %g\n",lib_local_cpu_util);
+ }
+
+ lib_local_cpu_util *= correction_factor;
+
+ if (debug) {
+ fprintf(where,
+ "calc_cpu_util: returning %g\n",lib_local_cpu_util);
+ }
+
+ return lib_local_cpu_util;
+
+}
+void
+cpu_start_internal(void)
+{
+ get_cpu_idle(lib_start_count);
+ return;
+}
+
+void
+cpu_stop_internal(void)
+{
+ get_cpu_idle(lib_end_count);
+}
+
diff --git a/netcpu_procstat.c b/netcpu_procstat.c
new file mode 100644
index 0000000..5bdadea
--- /dev/null
+++ b/netcpu_procstat.c
@@ -0,0 +1,265 @@
+char netcpu_procstat_id[]="\
+@(#)netcpu_procstat.c (c) Copyright 2005-2007 Version 2.4.3";
+
+/* netcpu_procstat.c
+
+ Implement the /proc/stat specific portions of netperf CPU
+ utilization measurements. These are broken-out into a separate file
+ to make life much nicer over in netlib.c which had become a maze of
+ twisty, CPU-util-related, #ifdefs, all different. raj 2005-01-26
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+
+#include <string.h>
+
+#include "netsh.h"
+#include "netlib.h"
+
+/* the lib_start_count and lib_end_count arrays hold the starting
+ and ending values of whatever is counting when the system is
+ idle. The rate at which this increments during a test is compared
+ with a previous calibrarion to arrive at a CPU utilization
+ percentage. raj 2005-01-26 */
+static uint64_t lib_start_count[MAXCPUS];
+static uint64_t lib_end_count[MAXCPUS];
+
+
+/* The max. length of one line of /proc/stat cpu output */
+#define CPU_LINE_LENGTH ((8 * sizeof (long) / 3 + 1) * 4 + 8)
+#define PROC_STAT_FILE_NAME "/proc/stat"
+#define N_CPU_LINES(nr) (nr == 1 ? 1 : 1 + nr)
+
+static int proc_stat_fd = -1;
+static char *proc_stat_buf = NULL;
+static int proc_stat_buflen = 0;
+
+void
+cpu_util_init(void)
+{
+
+ if (debug) {
+ fprintf(where,
+ "cpu_util_init enter, proc_stat_fd %d proc_stat_buf %p\n",
+ proc_stat_fd,
+ proc_stat_buf);
+ fflush(where);
+ }
+ if (proc_stat_fd < 0) {
+ proc_stat_fd = open (PROC_STAT_FILE_NAME, O_RDONLY, NULL);
+ if (proc_stat_fd < 0) {
+ fprintf (stderr, "Cannot open %s!\n", PROC_STAT_FILE_NAME);
+ exit (1);
+ };
+ };
+
+ if (!proc_stat_buf) {
+ proc_stat_buflen = N_CPU_LINES (lib_num_loc_cpus) * CPU_LINE_LENGTH;
+ if (debug) {
+ fprintf(where,
+ "lib_num_loc_cpus %d lines %d CPU_LINE_LENGTH %d proc_stat_buflen %d\n",
+ lib_num_loc_cpus,
+ N_CPU_LINES(lib_num_loc_cpus),
+ CPU_LINE_LENGTH,
+ proc_stat_buflen);
+ fflush(where);
+ }
+ proc_stat_buf = (char *)malloc (proc_stat_buflen);
+ if (!proc_stat_buf) {
+ fprintf (stderr, "Cannot allocate buffer memory!\n");
+ exit (1);
+ }
+ }
+ return;
+}
+
+void
+cpu_util_terminate(void)
+{
+ close(proc_stat_fd);
+ proc_stat_fd = -1;
+ free(proc_stat_buf);
+ proc_stat_buf = NULL;
+ return;
+}
+
+int
+get_cpu_method()
+{
+ return PROC_STAT;
+}
+
+float
+calibrate_idle_rate (int iterations, int interval)
+{
+ if (proc_stat_fd < 0) {
+ proc_stat_fd = open (PROC_STAT_FILE_NAME, O_RDONLY, NULL);
+ if (proc_stat_fd < 0) {
+ fprintf (stderr, "Cannot open %s!\n", PROC_STAT_FILE_NAME);
+ exit (1);
+ };
+ };
+
+ if (!proc_stat_buf) {
+ proc_stat_buflen = N_CPU_LINES (lib_num_loc_cpus) * CPU_LINE_LENGTH;
+ if (debug) {
+ fprintf(where,
+ "calibrate: lib_num_loc_cpus %d lines %d CPU_LINE_LENGTH %d proc_stat_buflen %d\n",
+ lib_num_loc_cpus,
+ N_CPU_LINES(lib_num_loc_cpus),
+ CPU_LINE_LENGTH,
+ proc_stat_buflen);
+ fflush(where);
+ }
+ proc_stat_buf = (char *)malloc (proc_stat_buflen);
+ if (!proc_stat_buf) {
+ fprintf (stderr, "Cannot allocate buffer memory!\n");
+ exit (1);
+ };
+ };
+
+ return sysconf (_SC_CLK_TCK);
+}
+
+void
+get_cpu_idle (uint64_t *res)
+{
+ int space;
+ int i;
+ int n = lib_num_loc_cpus;
+ char *p = proc_stat_buf;
+
+ lseek (proc_stat_fd, 0, SEEK_SET);
+ read (proc_stat_fd, p, proc_stat_buflen);
+
+ if (debug) {
+ fprintf(where,"proc_stat_buf '%.*s'\n",proc_stat_buflen,p);
+ fflush(where);
+ }
+ /* Skip first line (total) on SMP */
+ if (n > 1) p = strchr (p, '\n');
+
+ /* Idle time is the 4th space-separated token */
+ for (i = 0; i < n; i++) {
+ for (space = 0; space < 4; space ++) {
+ p = strchr (p, ' ');
+ while (*++p == ' ');
+ };
+ res[i] = strtoul (p, &p, 10);
+ if (debug) {
+ fprintf(where,"res[%d] is %llu\n",i,res[i]);
+ fflush(where);
+ }
+ p = strchr (p, '\n');
+ };
+
+}
+
+/* take the initial timestamp and start collecting CPU utilization if
+ requested */
+
+void
+measure_cpu_start()
+{
+ cpu_method = PROC_STAT;
+ get_cpu_idle(lib_start_count);
+}
+
+/* collect final CPU utilization raw data */
+void
+measure_cpu_stop()
+{
+ get_cpu_idle(lib_end_count);
+}
+
+float
+calc_cpu_util_internal(float elapsed_time)
+{
+ int i;
+
+ float actual_rate;
+ float correction_factor;
+
+ lib_local_cpu_util = (float)0.0;
+ /* It is possible that the library measured a time other than */
+ /* the one that the user want for the cpu utilization */
+ /* calculations - for example, tests that were ended by */
+ /* watchdog timers such as the udp stream test. We let these */
+ /* tests tell up what the elapsed time should be. */
+
+ if (elapsed_time != 0.0) {
+ correction_factor = (float) 1.0 +
+ ((lib_elapsed - elapsed_time) / elapsed_time);
+ }
+ else {
+ correction_factor = (float) 1.0;
+ }
+
+ for (i = 0; i < lib_num_loc_cpus; i++) {
+
+ /* it would appear that on some systems, in loopback, nice is
+ *very* effective, causing the looper process to stop dead in its
+ tracks. if this happens, we need to ensure that the calculation
+ does not go south. raj 6/95 and if we run completely out of idle,
+ the same thing could in theory happen to the USE_KSTAT path. raj
+ 8/2000 */
+
+ if (lib_end_count[i] == lib_start_count[i]) {
+ lib_end_count[i]++;
+ }
+
+ actual_rate = (lib_end_count[i] > lib_start_count[i]) ?
+ (float)(lib_end_count[i] - lib_start_count[i])/lib_elapsed :
+ (float)(lib_end_count[i] - lib_start_count[i] +
+ MAXLONG)/ lib_elapsed;
+ lib_local_per_cpu_util[i] = (lib_local_maxrate - actual_rate) /
+ lib_local_maxrate * 100;
+ if (debug) {
+ fprintf(where,
+ "calc_cpu_util: actual_rate on processor %d is %f start %llx end %llx util %f\n",
+ i,
+ actual_rate,
+ lib_start_count[i],
+ lib_end_count[i],
+ lib_local_per_cpu_util[i]);
+ }
+ lib_local_cpu_util += lib_local_per_cpu_util[i];
+ }
+ /* we want the average across all n processors */
+ lib_local_cpu_util /= (float)lib_num_loc_cpus;
+
+ lib_local_cpu_util *= correction_factor;
+ return lib_local_cpu_util;
+}
+
+void
+cpu_start_internal(void)
+{
+ get_cpu_idle(lib_start_count);
+ return;
+}
+
+void
+cpu_stop_internal(void)
+{
+ get_cpu_idle(lib_end_count);
+}
diff --git a/netcpu_pstat.c b/netcpu_pstat.c
new file mode 100644
index 0000000..08f27c1
--- /dev/null
+++ b/netcpu_pstat.c
@@ -0,0 +1,307 @@
+char netcpu_pstat_id[]="\
+@(#)netcpu_pstat.c (c) Copyright 2005, Hewlett-Packard Company, Version 2.4.0";
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+
+#if HAVE_LIMITS_H
+# include <limits.h>
+#endif
+
+#include <sys/dk.h>
+#include <sys/pstat.h>
+
+#ifndef PSTAT_IPCINFO
+# error Sorry, pstat() CPU utilization on 10.0 and later only
+#endif
+
+#include "netsh.h"
+#include "netlib.h"
+
+/* the lib_start_count and lib_end_count arrays hold the starting
+ and ending values of whatever is counting when the system is
+ idle. The rate at which this increments during a test is compared
+ with a previous calibrarion to arrive at a CPU utilization
+ percentage. raj 2005-01-26 */
+static uint64_t lib_start_count[MAXCPUS];
+static uint64_t lib_end_count[MAXCPUS];
+
+void
+cpu_util_init(void)
+{
+ return;
+}
+
+void
+cpu_util_terminate(void)
+{
+ return;
+}
+
+int
+get_cpu_method(void)
+{
+ return HP_IDLE_COUNTER;
+}
+
+void
+get_cpu_idle(uint64_t *res)
+{
+ /* get the idle sycle counter for each processor */
+ struct pst_processor *psp;
+ union overlay_u {
+ long long full;
+ long word[2];
+ } *overlay;
+
+ psp = (struct pst_processor *)malloc(lib_num_loc_cpus * sizeof(*psp));
+ if (psp == NULL) {
+ printf("malloc(%d) failed!\n", lib_num_loc_cpus * sizeof(*psp));
+ exit(1);
+ }
+ if (pstat_getprocessor(psp, sizeof(*psp), lib_num_loc_cpus, 0) != -1) {
+ int i;
+ for (i = 0; i < lib_num_loc_cpus; i++) {
+ overlay = (union overlay_u *)&(res[i]);
+ overlay->word[0] = psp[i].psp_idlecycles.psc_hi;
+ overlay->word[1] = psp[i].psp_idlecycles.psc_lo;
+ if(debug) {
+ fprintf(where,
+ "\tres[%d] = 0x%8.8x%8.8x\n",
+ i,
+ hi_32(&res[i]),
+ lo_32(&res[i]));
+ fflush(where);
+ }
+ }
+ free(psp);
+ }
+}
+
+/* calibrate_pstat
+ Loop a number of iterations, sleeping wait_time seconds each and
+ count how high the idle counter gets each time. Return the measured
+ cpu rate to the calling routine. */
+
+float
+calibrate_idle_rate(int iterations, int interval)
+{
+
+ uint64_t
+ firstcnt[MAXCPUS],
+ secondcnt[MAXCPUS];
+
+ float
+ elapsed,
+ temp_rate,
+ rate[MAXTIMES],
+ local_maxrate;
+
+ long
+ sec,
+ usec;
+
+ int
+ i,
+ j;
+
+ long count;
+
+ struct timeval time1, time2;
+ struct timezone tz;
+
+ struct pst_processor *psp;
+
+ if (iterations > MAXTIMES) {
+ iterations = MAXTIMES;
+ }
+
+ local_maxrate = -1.0;
+
+ psp = (struct pst_processor *)malloc(lib_num_loc_cpus * sizeof(*psp));
+ if (psp == NULL) {
+ printf("malloc(%d) failed!\n", lib_num_loc_cpus * sizeof(*psp));
+ exit(1);
+ }
+
+ for(i = 0; i < iterations; i++) {
+ rate[i] = 0.0;
+ /* get the idle sycle counter for each processor */
+ if (pstat_getprocessor(psp, sizeof(*psp), lib_num_loc_cpus, 0) != -1) {
+ for (j = 0; j < lib_num_loc_cpus; j++) {
+ union overlay_u {
+ long long full;
+ long word[2];
+ } *overlay;
+ overlay = (union overlay_u *)&(firstcnt[j]);
+ overlay->word[0] = psp[j].psp_idlecycles.psc_hi;
+ overlay->word[1] = psp[j].psp_idlecycles.psc_lo;
+ }
+ }
+ else {
+ fprintf(where,"pstat_getprocessor failure errno %d\n",errno);
+ fflush(where);
+ exit(1);
+ }
+
+ gettimeofday (&time1, &tz);
+ sleep(interval);
+ gettimeofday (&time2, &tz);
+
+ if (time2.tv_usec < time1.tv_usec)
+ {
+ time2.tv_usec += 1000000;
+ time2.tv_sec -=1;
+ }
+ sec = time2.tv_sec - time1.tv_sec;
+ usec = time2.tv_usec - time1.tv_usec;
+ elapsed = (float)sec + ((float)usec/(float)1000000.0);
+
+ if(debug) {
+ fprintf(where, "Calibration for counter run: %d\n",i);
+ fprintf(where,"\tsec = %ld usec = %ld\n",sec,usec);
+ fprintf(where,"\telapsed time = %g\n",elapsed);
+ }
+
+ if (pstat_getprocessor(psp, sizeof(*psp), lib_num_loc_cpus, 0) != -1) {
+ for (j = 0; j < lib_num_loc_cpus; j++) {
+ union overlay_u {
+ long long full;
+ long word[2];
+ } *overlay;
+ overlay = (union overlay_u *)&(secondcnt[j]);
+ overlay->word[0] = psp[j].psp_idlecycles.psc_hi;
+ overlay->word[1] = psp[j].psp_idlecycles.psc_lo;
+ if(debug) {
+ /* I know that there are situations where compilers know about */
+ /* long long, but the library fucntions do not... raj 4/95 */
+ fprintf(where,
+ "\tfirstcnt[%d] = 0x%8.8x%8.8x secondcnt[%d] = 0x%8.8x%8.8x\n",
+ j,
+ hi_32(&firstcnt[j]),
+ lo_32(&firstcnt[j]),
+ j,
+ hi_32(&secondcnt[j]),
+ lo_32(&secondcnt[j]));
+ }
+ temp_rate = (secondcnt[j] >= firstcnt[j]) ?
+ (float)(secondcnt[j] - firstcnt[j] )/elapsed :
+ (float)(secondcnt[j] - firstcnt[j] + LONG_LONG_MAX)/elapsed;
+ if (temp_rate > rate[i]) rate[i] = temp_rate;
+ if(debug) {
+ fprintf(where,"\trate[%d] = %g\n",i,rate[i]);
+ fflush(where);
+ }
+ if (local_maxrate < rate[i]) local_maxrate = rate[i];
+ }
+ }
+ else {
+ fprintf(where,"pstat failure; errno %d\n",errno);
+ fflush(where);
+ exit(1);
+ }
+ }
+ if(debug) {
+ fprintf(where,"\tlocal maxrate = %g per sec. \n",local_maxrate);
+ fflush(where);
+ }
+ return local_maxrate;
+
+}
+
+float
+calc_cpu_util_internal(float elapsed_time)
+{
+ int i;
+
+ float actual_rate;
+ float correction_factor;
+
+ lib_local_cpu_util = (float)0.0;
+ /* It is possible that the library measured a time other than */
+ /* the one that the user want for the cpu utilization */
+ /* calculations - for example, tests that were ended by */
+ /* watchdog timers such as the udp stream test. We let these */
+ /* tests tell up what the elapsed time should be. */
+
+ if (elapsed_time != 0.0) {
+ correction_factor = (float) 1.0 +
+ ((lib_elapsed - elapsed_time) / elapsed_time);
+ }
+ else {
+ correction_factor = (float) 1.0;
+ }
+
+ /* this looks just like the looper case. at least I think it */
+ /* should :) raj 4/95 */
+ for (i = 0; i < lib_num_loc_cpus; i++) {
+
+ /* we assume that the two are not more than a long apart. I */
+ /* know that this is bad, but trying to go from long longs to */
+ /* a float (perhaps a double) is boggling my mind right now. */
+ /* raj 4/95 */
+
+ long long
+ diff;
+
+ if (lib_end_count[i] >= lib_start_count[i]) {
+ diff = lib_end_count[i] - lib_start_count[i];
+ }
+ else {
+ diff = lib_end_count[i] - lib_start_count[i] + LONG_LONG_MAX;
+ }
+ actual_rate = (float) diff / lib_elapsed;
+ lib_local_per_cpu_util[i] = (lib_local_maxrate - actual_rate) /
+ lib_local_maxrate * 100;
+ lib_local_cpu_util += lib_local_per_cpu_util[i];
+ if (debug) {
+ fprintf(where,
+ "calc_cpu_util: actual_rate on cpu %d is %g max_rate %g cpu %6.2f\n",
+ i,
+ actual_rate,
+ lib_local_maxrate,
+ lib_local_per_cpu_util[i]);
+ }
+ }
+
+ /* we want the average across all n processors */
+ lib_local_cpu_util /= (float)lib_num_loc_cpus;
+
+ if (debug) {
+ fprintf(where,
+ "calc_cpu_util: average across CPUs is %g\n",lib_local_cpu_util);
+ }
+
+ lib_local_cpu_util *= correction_factor;
+
+ if (debug) {
+ fprintf(where,
+ "calc_cpu_util: returning %g\n",lib_local_cpu_util);
+ }
+
+ return lib_local_cpu_util;
+
+}
+void
+cpu_start_internal(void)
+{
+ get_cpu_idle(lib_start_count);
+ return;
+}
+
+void
+cpu_stop_internal(void)
+{
+ get_cpu_idle(lib_end_count);
+}
diff --git a/netcpu_pstatnew.c b/netcpu_pstatnew.c
new file mode 100644
index 0000000..fd2d036
--- /dev/null
+++ b/netcpu_pstatnew.c
@@ -0,0 +1,398 @@
+char netcpu_pstatnew_id[]="\
+@(#)netcpu_pstatnew.c (c) Copyright 2005, Hewlett-Packard Company, Version 2.4.1";
+
+/* since we "know" that this interface is available only on 11.23 and
+ later, and that 11.23 and later are strictly 64-bit kernels, we can
+ arbitrarily set _PSTAT64 here and not have to worry about it up in
+ the configure script and makefiles. raj 2005/09/06 */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+
+#include <unistd.h>
+
+#if HAVE_LIMITS_H
+# include <limits.h>
+#endif
+
+#include <sys/dk.h>
+#include <sys/pstat.h>
+
+/* HP-UX 11.23 seems to have added three other cycle counters to the
+ original psp_idlecycles - one for user, one for kernel and one for
+ interrupt. so, we can now use those to calculate CPU utilization
+ without requiring any calibration phase. raj 2005-02-16 */
+
+#ifndef PSTAT_IPCINFO
+# error Sorry, pstat() CPU utilization on 10.0 and later only
+#endif
+
+typedef struct cpu_time_counters {
+ uint64_t idle;
+ uint64_t user;
+ uint64_t kernel;
+ uint64_t interrupt;
+} cpu_time_counters_t;
+
+uint64_t lib_iticksperclktick;
+
+#include "netsh.h"
+#include "netlib.h"
+
+/* the lib_start_count and lib_end_count arrays hold the starting
+ and ending values of whatever is counting when the system is
+ idle. The rate at which this increments during a test is compared
+ with a previous calibrarion to arrive at a CPU utilization
+ percentage. raj 2005-01-26 */
+
+static cpu_time_counters_t starting_cpu_counters[MAXCPUS];
+static cpu_time_counters_t ending_cpu_counters[MAXCPUS];
+static cpu_time_counters_t delta_cpu_counters[MAXCPUS];
+
+void
+cpu_util_init(void)
+{
+ return;
+}
+
+void
+cpu_util_terminate(void)
+{
+ return;
+}
+
+int
+get_cpu_method(void)
+{
+ return HP_IDLE_COUNTER;
+}
+
+void
+get_cpu_counters(cpu_time_counters_t *res)
+{
+ /* get the idle sycle counter for each processor. now while on a
+ 64-bit kernel the ".psc_hi" and ".psc_lo" fields are 64 bits,
+ only the bottom 32-bits are actually valid. don't ask me
+ why, that is just the way it is. soo, we shift the psc_hi
+ value by 32 bits and then just sum-in the psc_lo value. raj
+ 2005/09/06 */
+ struct pst_processor *psp;
+
+ psp = (struct pst_processor *)malloc(lib_num_loc_cpus * sizeof(*psp));
+ if (psp == NULL) {
+ printf("malloc(%d) failed!\n", lib_num_loc_cpus * sizeof(*psp));
+ exit(1);
+ }
+ if (pstat_getprocessor(psp, sizeof(*psp), lib_num_loc_cpus, 0) != -1) {
+ int i;
+ /* we use lib_iticksperclktick in our sanity checking. we
+ ass-u-me it is the same value for each CPU - famous last
+ words no doubt. raj 2005/09/06 */
+ lib_iticksperclktick = psp[0].psp_iticksperclktick;
+ for (i = 0; i < lib_num_loc_cpus; i++) {
+ res[i].idle = (((uint64_t)psp[i].psp_idlecycles.psc_hi << 32) +
+ psp[i].psp_idlecycles.psc_lo);
+ if(debug) {
+ fprintf(where,
+ "\tidle[%d] = 0x%"PRIx64" ",
+ i,
+ res[i].idle);
+ fflush(where);
+ }
+ res[i].user = (((uint64_t)psp[i].psp_usercycles.psc_hi << 32) +
+ psp[i].psp_usercycles.psc_lo);
+ if(debug) {
+ fprintf(where,
+ "user[%d] = 0x%"PRIx64" ",
+ i,
+ res[i].user);
+ fflush(where);
+ }
+ res[i].kernel = (((uint64_t)psp[i].psp_systemcycles.psc_hi << 32) +
+ psp[i].psp_systemcycles.psc_lo);
+ if(debug) {
+ fprintf(where,
+ "kern[%d] = 0x%"PRIx64" ",
+ i,
+ res[i].kernel);
+ fflush(where);
+ }
+ res[i].interrupt = (((uint64_t)psp[i].psp_interruptcycles.psc_hi << 32) +
+ psp[i].psp_interruptcycles.psc_lo);
+ if(debug) {
+ fprintf(where,
+ "intr[%d] = 0x%"PRIx64"\n",
+ i,
+ res[i].interrupt);
+ fflush(where);
+ }
+ }
+ free(psp);
+ }
+}
+
+/* calibrate_pstatnew
+ there really isn't anything much to do here since we have all the
+ counters and use their ratios for CPU util measurement. raj
+ 2005-02-16 */
+
+float
+calibrate_idle_rate(int iterations, int interval)
+{
+ return 0.0;
+}
+
+static void
+print_cpu_time_counters(char *name, int instance, cpu_time_counters_t *counters)
+{
+ fprintf(where,"%s[%d]:\n",name,instance);
+ fprintf(where,
+ "\t idle %llu\n",counters[instance].idle);
+ fprintf(where,
+ "\t user %llu\n",counters[instance].user);
+ fprintf(where,
+ "\t kernel %llu\n",counters[instance].kernel);
+ fprintf(where,
+ "\t interrupt %llu\n",counters[instance].interrupt);
+}
+
+float
+calc_cpu_util_internal(float elapsed_time)
+{
+ int i;
+
+ uint64_t total_cpu_cycles;
+ uint64_t sanity_cpu_cycles;
+
+#ifndef USE_INTEGER_MATH
+ double fraction_idle;
+ double fraction_user;
+ double fraction_kernel;
+ double fraction_interrupt;
+ double estimated_fraction_interrupt;
+#else
+ uint64_t fraction_idle;
+ uint64_t fraction_user;
+ uint64_t fraction_kernel;
+ uint64_t fraction_interrupt;
+ uint64_t estimated_fraction_interrupt;
+
+#define CALC_PERCENT 100
+#define CALC_TENTH_PERCENT 1000
+#define CALC_HUNDREDTH_PERCENT 10000
+#define CALC_THOUSANDTH_PERCENT 100000
+#define CALC_ACCURACY CALC_THOUSANDTH_PERCENT
+
+#endif /* USE_INTEGER_MATH */
+ float actual_rate;
+ float correction_factor;
+
+ lib_local_cpu_util = (float)0.0;
+
+ /* It is possible that the library measured a time other than */
+ /* the one that the user want for the cpu utilization */
+ /* calculations - for example, tests that were ended by */
+ /* watchdog timers such as the udp stream test. We let these */
+ /* tests tell up what the elapsed time should be. */
+
+ if (elapsed_time != 0.0) {
+ correction_factor = (float) 1.0 +
+ ((lib_elapsed - elapsed_time) / elapsed_time);
+ }
+ else {
+ correction_factor = (float) 1.0;
+ }
+
+ /* calculate our sanity check on cycles */
+ if (debug) {
+ fprintf(where,
+ "lib_elapsed %g _SC_CLK_TCK %d lib_iticksperclktick %"PRIu64"\n",
+ lib_elapsed,
+ sysconf(_SC_CLK_TCK),
+ lib_iticksperclktick);
+ }
+
+ /* Ok, elsewhere I may have said that HP-UX 11.23 does the "right"
+ thing in measuring user, kernel, interrupt and idle all together
+ instead of overlapping interrupt with the others like an OS that
+ shall not be named. However.... it seems there is a bug in the
+ accounting for interrupt cycles, whereby the cycles do not get
+ properly accounted. The sum of user, kernel, interrupt and idle
+ does not equal the clock rate multiplied by the elapsed time.
+ Some cycles go missing.
+
+ Since we see agreement between netperf and glance/vsar with the
+ old "pstat" mechanism, we can presume that the accounting for
+ idle cycles is sufficiently accurate. So, while we will still do
+ math with user, kernel and interrupt cycles, we will only
+ caculate CPU utilization based on the ratio of idle to _real_
+ total cycles. I am told that a "future release" of HP-UX will
+ fix the interupt cycle accounting. raj 2005/09/14 */
+
+ /* calculate what the sum of CPU cycles _SHOULD_ be */
+ sanity_cpu_cycles = (uint64_t) ((double)lib_elapsed *
+ (double) sysconf(_SC_CLK_TCK) * (double)lib_iticksperclktick);
+
+ /* this looks just like the looper case. at least I think it */
+ /* should :) raj 4/95 */
+ for (i = 0; i < lib_num_loc_cpus; i++) {
+
+ /* we ass-u-me that these counters will never wrap during a
+ netperf run. this may not be a particularly safe thing to
+ do. raj 2005-01-28 */
+ delta_cpu_counters[i].idle = ending_cpu_counters[i].idle -
+ starting_cpu_counters[i].idle;
+ delta_cpu_counters[i].user = ending_cpu_counters[i].user -
+ starting_cpu_counters[i].user;
+ delta_cpu_counters[i].kernel = ending_cpu_counters[i].kernel -
+ starting_cpu_counters[i].kernel;
+ delta_cpu_counters[i].interrupt = ending_cpu_counters[i].interrupt -
+ starting_cpu_counters[i].interrupt;
+
+ if (debug) {
+ print_cpu_time_counters("delta_cpu_counters",i,delta_cpu_counters);
+ }
+
+ /* now get the sum, which we ass-u-me does not overflow a 64-bit
+ counter. raj 2005-02-16 */
+ total_cpu_cycles =
+ delta_cpu_counters[i].idle +
+ delta_cpu_counters[i].user +
+ delta_cpu_counters[i].kernel +
+ delta_cpu_counters[i].interrupt;
+
+ if (debug) {
+ fprintf(where,
+ "total_cpu_cycles %"PRIu64" sanity_cpu_cycles %"PRIu64" missing %"PRIu64"\n",
+ total_cpu_cycles,
+ sanity_cpu_cycles,
+ sanity_cpu_cycles - total_cpu_cycles);
+ }
+
+ /* since HP-UX 11.23 does the _RIGHT_ thing and idle/user/kernel
+ does _NOT_ overlap with interrupt, we do not have to apply any
+ correction kludge. raj 2005-02-16 */
+
+#ifndef USE_INTEGER_MATH
+ /* when the accounting for interrupt time gets its act together,
+ we can use total_cpu_cycles rather than sanity_cpu_cycles, but
+ until then, use sanity_cpu_ccles. raj 2005/09/14 */
+
+ fraction_idle = (double)delta_cpu_counters[i].idle /
+ (double)sanity_cpu_cycles;
+
+ fraction_user = (double)delta_cpu_counters[i].user /
+ (double)sanity_cpu_cycles;
+
+ fraction_kernel = (double) delta_cpu_counters[i].kernel /
+ (double)sanity_cpu_cycles;
+
+ fraction_interrupt = (double)delta_cpu_counters[i].interrupt /
+ (double)sanity_cpu_cycles;
+
+ /* ass-u-me that it is only interrupt that is bogus, and assign
+ all the "missing" cycles to it. raj 2005/09/14 */
+ estimated_fraction_interrupt = ((double)delta_cpu_counters[i].interrupt +
+ (sanity_cpu_cycles - total_cpu_cycles)) /
+ (double)sanity_cpu_cycles;
+
+ if (debug) {
+ fprintf(where,"\tfraction_idle %g\n",fraction_idle);
+ fprintf(where,"\tfraction_user %g\n",fraction_user);
+ fprintf(where,"\tfraction_kernel %g\n",fraction_kernel);
+ fprintf(where,"\tfraction_interrupt %g WARNING, possibly under-counted!\n",fraction_interrupt);
+ fprintf(where,"\testimated_fraction_interrupt %g\n",
+ estimated_fraction_interrupt);
+ }
+
+ /* and finally, what is our CPU utilization? */
+ lib_local_per_cpu_util[i] = 100.0 - (fraction_idle * 100.0);
+#else
+ /* and now some fun with integer math. i initially tried to
+ promote things to long doubled but that didn't seem to result
+ in happiness and joy. raj 2005-01-28 */
+
+ /* multiply by 100 and divide by total and you get whole
+ percentages. multiply by 1000 and divide by total and you get
+ tenths of percentages. multiply by 10000 and divide by total
+ and you get hundredths of percentages. etc etc etc raj
+ 2005-01-28 */
+
+ /* when the accounting for interrupt time gets its act together,
+ we can use total_cpu_cycles rather than sanity_cpu_cycles, but
+ until then, use sanity_cpu_ccles. raj 2005/09/14 */
+
+ fraction_idle =
+ (delta_cpu_counters[i].idle * CALC_ACCURACY) / sanity_cpu_cycles;
+
+ fraction_user =
+ (delta_cpu_counters[i].user * CALC_ACCURACY) / sanity_cpu_cycles;
+
+ fraction_kernel =
+ (delta_cpu_counters[i].kernel * CALC_ACCURACY) / sanity_cpu_cycles;
+
+ fraction_interrupt =
+ (delta_cpu_counters[i].interrupt * CALC_ACCURACY) / sanity_cpu_cycles;
+
+
+ estimated_fraction_interrupt =
+ ((delta_cpu_counters[i].interrupt +
+ (sanity_cpu_cycles - total_cpu_cycles)) *
+ CALC_ACCURACY) / sanity_cpu_cycles;
+
+ if (debug) {
+ fprintf(where,"\tfraction_idle %"PRIu64"\n",fraction_idle);
+ fprintf(where,"\tfraction_user %"PRIu64"\n",fraction_user);
+ fprintf(where,"\tfraction_kernel %"PRIu64"\n",fraction_kernel);
+ fprintf(where,"\tfraction_interrupt %"PRIu64"WARNING, possibly under-counted!\n",fraction_interrupt);
+ fprintf(where,"\testimated_fraction_interrupt %"PRIu64"\n",
+ estimated_fraction_interrupt);
+ }
+
+ /* and finally, what is our CPU utilization? */
+ lib_local_per_cpu_util[i] = 100.0 - (((float)fraction_idle /
+ (float)CALC_ACCURACY) * 100.0);
+#endif
+ if (debug) {
+ fprintf(where,
+ "lib_local_per_cpu_util[%d] %g\n",
+ i,
+ lib_local_per_cpu_util[i]);
+ }
+ lib_local_cpu_util += lib_local_per_cpu_util[i];
+ }
+ /* we want the average across all n processors */
+ lib_local_cpu_util /= (float)lib_num_loc_cpus;
+
+ lib_local_cpu_util *= correction_factor;
+
+ if (debug) {
+ fprintf(where,
+ "calc_cpu_util: returning %g\n",lib_local_cpu_util);
+ }
+
+ return lib_local_cpu_util;
+
+}
+void
+cpu_start_internal(void)
+{
+ get_cpu_counters(starting_cpu_counters);
+}
+
+void
+cpu_stop_internal(void)
+{
+ get_cpu_counters(ending_cpu_counters);
+}
diff --git a/netcpu_sysctl.c b/netcpu_sysctl.c
new file mode 100644
index 0000000..919f62c
--- /dev/null
+++ b/netcpu_sysctl.c
@@ -0,0 +1,127 @@
+char netcpu_sysctl_id[]="\
+@(#)netcpu_sysctl.c Version 2.4.3";
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <unistd.h>
+
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+#if HAVE_LIMITS_H
+# include <limits.h>
+# ifndef LONG_LONG_MAX
+# define LONG_LONG_MAX LLONG_MAX
+# endif /* LONG_LONG_MAX */
+#endif
+
+
+#include <errno.h>
+
+/* need to have some sort of check for sys/sysctl.h versus sysctl.h */
+#include <sys/sysctl.h>
+
+
+/* this has been liberally cut and pasted from <sys/resource.h> on
+ FreeBSD. in general, this would be a bad idea, but I don't want to
+ have to do a _KERNEL define to get these and that is what
+ sys/resource.h seems to want. raj 2002-03-03 */
+#define CP_USER 0
+#define CP_NICE 1
+#define CP_SYS 2
+#define CP_INTR 3
+#define CP_IDLE 4
+#define CPUSTATES 5
+
+
+#include "netsh.h"
+#include "netlib.h"
+
+static long lib_start_count[CPUSTATES];
+static long lib_end_count[CPUSTATES];
+
+void
+cpu_util_init(void)
+{
+ return;
+}
+
+void
+cpu_util_terminate(void)
+{
+ return;
+}
+
+int
+get_cpu_method(void)
+{
+ return SYSCTL;
+}
+
+static void
+get_cpu_time(long *cpu_time)
+{
+ size_t cpu_time_len = CPUSTATES * sizeof (cpu_time[0]);
+
+ if (sysctlbyname("kern.cp_time", cpu_time, &cpu_time_len, NULL, 0) == -1) {
+ fprintf (stderr, "Cannot get CPU time!\n");
+ exit (1);
+ }
+}
+
+/* calibrate_sysctl - perform the idle rate calculation using the
+ sysctl call - typically on BSD */
+
+float
+calibrate_idle_rate(int iterations, int interval)
+{
+ return sysconf (_SC_CLK_TCK);
+}
+
+float
+calc_cpu_util_internal(float elapsed_time)
+{
+ long sum_idle, sum_busy;
+ int i;
+
+ for (sum_busy = 0, i = 0; i < CPUSTATES; i++) {
+ if (i != CP_IDLE)
+ sum_busy += lib_end_count[i] - lib_start_count[i];
+ }
+
+ sum_idle = lib_end_count[CP_IDLE] - lib_start_count[CP_IDLE];
+ lib_local_cpu_util = (float)sum_busy / (float)(sum_busy + sum_idle);
+ lib_local_cpu_util *= 100.0;
+
+ return lib_local_cpu_util;
+
+}
+void
+cpu_start_internal(void)
+{
+ get_cpu_time(lib_start_count);
+}
+
+void
+cpu_stop_internal(void)
+{
+ get_cpu_time(lib_end_count);
+}
diff --git a/netlib.c b/netlib.c
new file mode 100644
index 0000000..bee93c8
--- /dev/null
+++ b/netlib.c
@@ -0,0 +1,4161 @@
+char netlib_id[]="\
+@(#)netlib.c (c) Copyright 1993-2007 Hewlett-Packard Company. Version 2.4.3";
+
+
+/****************************************************************/
+/* */
+/* netlib.c */
+/* */
+/* the common utility routines available to all... */
+/* */
+/* establish_control() establish the control socket */
+/* calibrate_local_cpu() do local cpu calibration */
+/* calibrate_remote_cpu() do remote cpu calibration */
+/* send_request() send a request to the remote */
+/* recv_response() receive a response from remote */
+/* send_response() send a response to the remote */
+/* recv_request() recv a request from the remote */
+/* dump_request() dump request contents */
+/* dump_response() dump response contents */
+/* cpu_start() start measuring cpu */
+/* cpu_stop() stop measuring cpu */
+/* calc_cpu_util() calculate the cpu utilization */
+/* calc_service_demand() calculate the service demand */
+/* calc_thruput() calulate the tput in units */
+/* calibrate() really calibrate local cpu */
+/* identify_local() print local host information */
+/* identify_remote() print remote host information */
+/* format_number() format the number (KB, MB,etc) */
+/* format_units() return the format in english */
+/* msec_sleep() sleep for some msecs */
+/* start_timer() start a timer */
+/* */
+/* the routines you get when WANT_DLPI is defined... */
+/* */
+/* dl_open() open a file descriptor and */
+/* attach to the card */
+/* dl_mtu() find the MTU of the card */
+/* dl_bind() bind the sap do the card */
+/* dl_connect() sender's have of connect */
+/* dl_accpet() receiver's half of connect */
+/* dl_set_window() set the window size */
+/* dl_stats() retrieve statistics */
+/* dl_send_disc() initiate disconnect (sender) */
+/* dl_recv_disc() accept disconnect (receiver) */
+/****************************************************************/
+
+/****************************************************************/
+/* */
+/* Global include files */
+/* */
+/****************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+ /* It would seem that most of the includes being done here from */
+ /* "sys/" actually have higher-level wrappers at just /usr/include. */
+ /* This is based on a spot-check of a couple systems at my disposal. */
+ /* If you have trouble compiling you may want to add "sys/" raj 10/95 */
+#include <limits.h>
+#include <signal.h>
+#ifdef MPE
+# define NSIG _NSIG
+#endif /* MPE */
+#include <sys/types.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#include <assert.h>
+#ifdef HAVE_ENDIAN_H
+#include <endian.h>
+#endif
+
+
+#ifndef WIN32
+ /* at some point, I would like to get rid of all these "sys/" */
+ /* includes where appropriate. if you have a system that requires */
+ /* them, speak now, or your system may not comile later revisions of */
+ /* netperf. raj 1/96 */
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/times.h>
+#ifndef MPE
+#include <time.h>
+#include <sys/time.h>
+#endif /* MPE */
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <errno.h>
+#include <sys/utsname.h>
+#if !defined(MPE) && !defined(__VMS)
+#include <sys/param.h>
+#endif /* MPE */
+
+#else /* WIN32 */
+
+#include <process.h>
+#include <time.h>
+#include <winsock2.h>
+#define netperf_socklen_t socklen_t
+#include <windows.h>
+
+/* the only time someone should need to define DONT_IPV6 in the
+ "sources" file is if they are trying to compile on Windows 2000 or
+ NT4 and I suspect this may not be their only problem :) */
+#ifndef DONT_IPV6
+#include <ws2tcpip.h>
+#endif
+
+#include <windows.h>
+
+#define SIGALRM (14)
+#define sleep(x) Sleep((x)*1000)
+
+#endif /* WIN32 */
+
+#ifdef _AIX
+#include <sys/select.h>
+#include <sys/sched.h>
+#include <sys/pri.h>
+#define PRIORITY PRI_LOW
+#else/* _AIX */
+#ifdef __sgi
+#include <sys/prctl.h>
+#include <sys/schedctl.h>
+#define PRIORITY NDPLOMIN
+#endif /* __sgi */
+#endif /* _AIX */
+
+#ifdef WANT_DLPI
+#include <sys/stream.h>
+#include <sys/stropts.h>
+#include <sys/poll.h>
+#ifdef __osf__
+#include <sys/dlpihdr.h>
+#else /* __osf__ */
+#include <sys/dlpi.h>
+#ifdef __hpux
+#include <sys/dlpi_ext.h>
+#endif /* __hpux */
+#endif /* __osf__ */
+#endif /* WANT_DLPI */
+
+#ifdef HAVE_MPCTL
+#include <sys/mpctl.h>
+#endif
+
+#if !defined(HAVE_GETADDRINFO) || !defined(HAVE_GETNAMEINFO)
+# include "missing/getaddrinfo.h"
+#endif
+
+
+#ifdef WANT_HISTOGRAM
+#include "hist.h"
+#endif /* WANT_HISTOGRAM */
+/****************************************************************/
+/* */
+/* Local Include Files */
+/* */
+/****************************************************************/
+#define NETLIB
+#include "netlib.h"
+#include "netsh.h"
+#include "netcpu.h"
+
+/****************************************************************/
+/* */
+/* Global constants, macros and variables */
+/* */
+/****************************************************************/
+
+#if defined(WIN32) || defined(__VMS)
+struct timezone {
+ int dummy ;
+ } ;
+#ifndef __VMS
+SOCKET win_kludge_socket = INVALID_SOCKET;
+SOCKET win_kludge_socket2 = INVALID_SOCKET;
+#endif /* __VMS */
+#endif /* WIN32 || __VMS */
+
+#ifndef LONG_LONG_MAX
+#define LONG_LONG_MAX 9223372036854775807LL
+#endif /* LONG_LONG_MAX */
+
+ /* older versions of netperf knew about the HP kernel IDLE counter. */
+ /* this is now obsolete - in favor of either pstat(), times, or a */
+ /* process-level looper process. we also now require support for the */
+ /* "long" integer type. raj 4/95. */
+
+int
+ lib_num_loc_cpus, /* the number of cpus in the system */
+ lib_num_rem_cpus; /* how many we think are in the remote */
+
+#define PAGES_PER_CHILD 2
+
+int lib_use_idle;
+int cpu_method;
+
+struct timeval time1, time2;
+struct timezone tz;
+float lib_elapsed,
+ lib_local_maxrate,
+ lib_remote_maxrate,
+ lib_local_cpu_util,
+ lib_remote_cpu_util;
+
+float lib_local_per_cpu_util[MAXCPUS];
+int lib_cpu_map[MAXCPUS];
+
+int *request_array;
+int *response_array;
+
+/* INVALID_SOCKET == INVALID_HANDLE_VALUE == (unsigned int)(~0) == -1 */
+SOCKET netlib_control = INVALID_SOCKET;
+SOCKET server_sock = INVALID_SOCKET;
+
+/* global variables to hold the value for processor affinity */
+int local_proc_affinity,remote_proc_affinity = -1;
+
+/* these are to allow netperf to be run easily through those evil,
+ end-to-end breaking things known as firewalls */
+char local_data_port[10];
+char remote_data_port[10];
+
+char *local_data_address=NULL;
+char *remote_data_address=NULL;
+
+int local_data_family=AF_UNSPEC;
+int remote_data_family=AF_UNSPEC;
+
+ /* in the past, I was overlaying a structure on an array of ints. now */
+ /* I am going to have a "real" structure, and point an array of ints */
+ /* at it. the real structure will be forced to the same alignment as */
+ /* the type "double." this change will mean that pre-2.1 netperfs */
+ /* cannot be mixed with 2.1 and later. raj 11/95 */
+
+union netperf_request_struct netperf_request;
+union netperf_response_struct netperf_response;
+
+FILE *where;
+
+char libfmt = '?';
+
+#ifdef WANT_DLPI
+/* some stuff for DLPI control messages */
+#define DLPI_DATA_SIZE 2048
+
+unsigned long control_data[DLPI_DATA_SIZE];
+struct strbuf control_message = {DLPI_DATA_SIZE, 0, (char *)control_data};
+
+#endif /* WANT_DLPI */
+
+#ifdef WIN32
+HANDLE hAlarm = INVALID_HANDLE_VALUE;
+#endif
+
+int times_up;
+
+#ifdef WIN32
+ /* we use a getopt implementation from net.sources */
+/*
+ * get option letter from argument vector
+ */
+int
+ opterr = 1, /* should error messages be printed? */
+ optind = 1, /* index into parent argv vector */
+ optopt; /* character checked for validity */
+char
+ *optarg; /* argument associated with option */
+
+#define EMSG ""
+
+#endif /* WIN32 */
+
+static int measuring_cpu;
+int
+netlib_get_page_size(void) {
+
+ /* not all systems seem to have the sysconf for page size. for
+ those which do not, we will assume that the page size is 8192
+ bytes. this should be more than enough to be sure that there is
+ no page or cache thrashing by looper processes on MP
+ systems. otherwise that's really just too bad - such systems
+ should define _SC_PAGE_SIZE - raj 4/95 */
+
+#ifndef _SC_PAGE_SIZE
+#ifdef WIN32
+
+SYSTEM_INFO SystemInfo;
+
+ GetSystemInfo(&SystemInfo);
+
+ return SystemInfo.dwPageSize;
+#else
+ return(8192L);
+#endif /* WIN32 */
+#else
+ return(sysconf(_SC_PAGE_SIZE));
+#endif /* _SC_PAGE_SIZE */
+
+}
+
+
+#ifdef WANT_INTERVALS
+static unsigned int usec_per_itvl;
+
+
+void
+stop_itimer()
+
+{
+
+ struct itimerval new_interval;
+ struct itimerval old_interval;
+
+ new_interval.it_interval.tv_sec = 0;
+ new_interval.it_interval.tv_usec = 0;
+ new_interval.it_value.tv_sec = 0;
+ new_interval.it_value.tv_usec = 0;
+ if (setitimer(ITIMER_REAL,&new_interval,&old_interval) != 0) {
+ /* there was a problem arming the interval timer */
+ perror("netperf: setitimer");
+ exit(1);
+ }
+ return;
+}
+#endif /* WANT_INTERVALS */
+
+
+
+#ifdef WIN32
+static void
+error(char *pch)
+{
+ if (!opterr) {
+ return; /* without printing */
+ }
+ fprintf(stderr, "%s: %s: %c\n",
+ (NULL != program) ? program : "getopt", pch, optopt);
+}
+
+int
+getopt(int argc, char **argv, char *ostr)
+{
+ static char *place = EMSG; /* option letter processing */
+ register char *oli; /* option letter list index */
+
+ if (!*place) {
+ /* update scanning pointer */
+ if (optind >= argc || *(place = argv[optind]) != '-' || !*++place) {
+ return EOF;
+ }
+ if (*place == '-') {
+ /* found "--" */
+ ++optind;
+ place = EMSG ; /* Added by shiva for Netperf */
+ return EOF;
+ }
+ }
+
+ /* option letter okay? */
+ if ((optopt = (int)*place++) == (int)':'
+ || !(oli = strchr(ostr, optopt))) {
+ if (!*place) {
+ ++optind;
+ }
+ error("illegal option");
+ return BADCH;
+ }
+ if (*++oli != ':') {
+ /* don't need argument */
+ optarg = NULL;
+ if (!*place)
+ ++optind;
+ } else {
+ /* need an argument */
+ if (*place) {
+ optarg = place; /* no white space */
+ } else if (argc <= ++optind) {
+ /* no arg */
+ place = EMSG;
+ error("option requires an argument");
+ return BADCH;
+ } else {
+ optarg = argv[optind]; /* white space */
+ }
+ place = EMSG;
+ ++optind;
+ }
+ return optopt; /* return option letter */
+}
+#endif /* WIN32 */
+
+/*----------------------------------------------------------------------------
+ * WIN32 implementation of perror, does not deal very well with WSA errors
+ * The stdlib.h version of perror only deals with the ancient XENIX error codes.
+ *
+ * +*+SAF Why can't all WSA errors go through GetLastError? Most seem to...
+ *--------------------------------------------------------------------------*/
+
+#ifdef WIN32
+void PrintWin32Error(FILE *stream, LPSTR text)
+{
+ LPSTR szTemp;
+ DWORD dwResult;
+ DWORD dwError;
+
+ dwError = GetLastError();
+ dwResult = FormatMessage(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ARGUMENT_ARRAY,
+ NULL,
+ dwError,
+ LANG_NEUTRAL,
+ (LPTSTR)&szTemp,
+ 0,
+ NULL );
+
+ if (dwResult)
+ fprintf(stream, "%s: %s\n", text, szTemp);
+ else
+ fprintf(stream, "%s: error 0x%x\n", text, dwError);
+ fflush(stream);
+
+ if (szTemp)
+ LocalFree((HLOCAL)szTemp);
+}
+#endif /* WIN32 */
+
+
+char *
+inet_ttos(int type)
+{
+ switch (type) {
+ case SOCK_DGRAM:
+ return("SOCK_DGRAM");
+ break;
+ case SOCK_STREAM:
+ return("SOCK_STREAM");
+ break;
+ default:
+ return("SOCK_UNKNOWN");
+ }
+}
+
+
+
+char unknown[32];
+
+char *
+inet_ptos(int protocol) {
+ switch (protocol) {
+ case IPPROTO_TCP:
+ return("IPPROTO_TCP");
+ break;
+ case IPPROTO_UDP:
+ return("IPPROTO_UDP");
+ break;
+#if defined(IPPROTO_SCTP)
+ case IPPROTO_SCTP:
+ return("IPPROTO_SCTP");
+ break;
+#endif
+ default:
+ snprintf(unknown,sizeof(unknown),"IPPROTO_UNKNOWN(%d)",protocol);
+ return(unknown);
+ }
+}
+
+/* one of these days, this should not be required */
+#ifndef AF_INET_SDP
+#define AF_INET_SDP 27
+#define PF_INET_SDP AF_INET_SDP
+#endif
+
+char *
+inet_ftos(int family)
+{
+ switch(family) {
+ case AF_INET:
+ return("AF_INET");
+ break;
+#if defined(AF_INET6)
+ case AF_INET6:
+ return("AF_INET6");
+ break;
+#endif
+#if defined(AF_INET_SDP)
+ case AF_INET_SDP:
+ return("AF_INET_SDP");
+ break;
+#endif
+ default:
+ return("AF_UNSPEC");
+ }
+}
+
+int
+inet_nton(int af, const void *src, char *dst, int cnt)
+
+{
+
+ switch (af) {
+ case AF_INET:
+ /* magic constants again... :) */
+ if (cnt >= 4) {
+ memcpy(dst,src,4);
+ return 4;
+ }
+ else {
+ Set_errno(ENOSPC);
+ return(-1);
+ }
+ break;
+#if defined(AF_INET6)
+ case AF_INET6:
+ if (cnt >= 16) {
+ memcpy(dst,src,16);
+ return(16);
+ }
+ else {
+ Set_errno(ENOSPC);
+ return(-1);
+ }
+ break;
+#endif
+ default:
+ Set_errno(EAFNOSUPPORT);
+ return(-1);
+ }
+}
+
+double
+ntohd(double net_double)
+
+{
+ /* we rely on things being nicely packed */
+ union {
+ double whole_thing;
+ unsigned int words[2];
+ unsigned char bytes[8];
+ } conv_rec;
+
+ unsigned char scratch;
+ int i;
+
+ /* on those systems where ntohl is a no-op, we want to return the */
+ /* original value, unchanged */
+
+ if (ntohl(1L) == 1L) {
+ return(net_double);
+ }
+
+ conv_rec.whole_thing = net_double;
+
+ /* we know that in the message passing routines that ntohl will have */
+ /* been called on the 32 bit quantities. we need to put those back */
+ /* the way they belong before we swap */
+ conv_rec.words[0] = htonl(conv_rec.words[0]);
+ conv_rec.words[1] = htonl(conv_rec.words[1]);
+
+ /* now swap */
+ for (i=0; i<= 3; i++) {
+ scratch = conv_rec.bytes[i];
+ conv_rec.bytes[i] = conv_rec.bytes[7-i];
+ conv_rec.bytes[7-i] = scratch;
+ }
+
+#if defined(__FLOAT_WORD_ORDER) && defined(__BYTE_ORDER)
+ if (__FLOAT_WORD_ORDER != __BYTE_ORDER) {
+ /* Fixup mixed endian floating point machines */
+ unsigned int scratch = conv_rec.words[0];
+ conv_rec.words[0] = conv_rec.words[1];
+ conv_rec.words[1] = scratch;
+ }
+#endif
+
+ return(conv_rec.whole_thing);
+
+}
+
+double
+htond(double host_double)
+
+{
+ /* we rely on things being nicely packed */
+ union {
+ double whole_thing;
+ unsigned int words[2];
+ unsigned char bytes[8];
+ } conv_rec;
+
+ unsigned char scratch;
+ int i;
+
+ /* on those systems where ntohl is a no-op, we want to return the */
+ /* original value, unchanged */
+
+ if (ntohl(1L) == 1L) {
+ return(host_double);
+ }
+
+ conv_rec.whole_thing = host_double;
+
+ /* now swap */
+ for (i=0; i<= 3; i++) {
+ scratch = conv_rec.bytes[i];
+ conv_rec.bytes[i] = conv_rec.bytes[7-i];
+ conv_rec.bytes[7-i] = scratch;
+ }
+
+#if defined(__FLOAT_WORD_ORDER) && defined(__BYTE_ORDER)
+ if (__FLOAT_WORD_ORDER != __BYTE_ORDER) {
+ /* Fixup mixed endian floating point machines */
+ unsigned int scratch = conv_rec.words[0];
+ conv_rec.words[0] = conv_rec.words[1];
+ conv_rec.words[1] = scratch;
+ }
+#endif
+
+ /* we know that in the message passing routines htonl will */
+ /* be called on the 32 bit quantities. we need to set things up so */
+ /* that when this happens, the proper order will go out on the */
+ /* network */
+ conv_rec.words[0] = htonl(conv_rec.words[0]);
+ conv_rec.words[1] = htonl(conv_rec.words[1]);
+
+ return(conv_rec.whole_thing);
+
+}
+
+
+/* one of these days, this should be abstracted-out just like the CPU
+ util stuff. raj 2005-01-27 */
+int
+get_num_cpus()
+
+{
+
+ /* on HP-UX, even when we use the looper procs we need the pstat */
+ /* call */
+
+ int temp_cpus;
+
+#ifdef __hpux
+#include <sys/pstat.h>
+
+ struct pst_dynamic psd;
+
+ if (pstat_getdynamic((struct pst_dynamic *)&psd,
+ (size_t)sizeof(psd), (size_t)1, 0) != -1) {
+ temp_cpus = psd.psd_proc_cnt;
+ }
+ else {
+ temp_cpus = 1;
+ }
+
+#else
+ /* MW: <unistd.h> was included for non-Windows systems above. */
+ /* Thus if _SC_NPROC_ONLN is defined, we should be able to use sysconf. */
+#ifdef _SC_NPROCESSORS_ONLN
+ temp_cpus = sysconf(_SC_NPROCESSORS_ONLN);
+
+#ifdef USE_PERFSTAT
+ temp_cpus = perfstat_cpu(NULL,NULL, sizeof(perfstat_cpu_t), 0);
+#endif /* USE_PERFSTAT */
+
+#else /* no _SC_NPROCESSORS_ONLN */
+
+#ifdef WIN32
+ SYSTEM_INFO SystemInfo;
+ GetSystemInfo(&SystemInfo);
+
+ temp_cpus = SystemInfo.dwNumberOfProcessors;
+#else
+ /* we need to know some other ways to do this, or just fall-back on */
+ /* a global command line option - raj 4/95 */
+ temp_cpus = shell_num_cpus;
+#endif /* WIN32 */
+#endif /* _SC_NPROCESSORS_ONLN */
+#endif /* __hpux */
+
+ if (temp_cpus > MAXCPUS) {
+ fprintf(where,
+ "Sorry, this system has more CPUs (%d) than I can handle (%d).\n",
+ temp_cpus,
+ MAXCPUS);
+ fprintf(where,
+ "Please alter MAXCPUS in netlib.h and recompile.\n");
+ fflush(where);
+ exit(1);
+ }
+
+ return(temp_cpus);
+
+}
+
+#ifdef WIN32
+#ifdef __GNUC__
+ #define S64_SUFFIX(x) x##LL
+#else
+ #define S64_SUFFIX(x) x##i64
+#endif
+
+/*
+ * Number of 100 nanosecond units from 1/1/1601 to 1/1/1970
+ */
+#define EPOCH_BIAS S64_SUFFIX(116444736000000000)
+
+/*
+ * Union to facilitate converting from FILETIME to unsigned __int64
+ */
+typedef union {
+ unsigned __int64 ft_scalar;
+ FILETIME ft_struct;
+} FT;
+
+void
+gettimeofday( struct timeval *tv , struct timezone *not_used )
+{
+ FT nt_time;
+ __int64 UnixTime; /* microseconds since 1/1/1970 */
+
+ GetSystemTimeAsFileTime( &(nt_time.ft_struct) );
+
+ UnixTime = ((nt_time.ft_scalar - EPOCH_BIAS) / S64_SUFFIX(10));
+ tv->tv_sec = (long)(time_t)(UnixTime / S64_SUFFIX(1000000));
+ tv->tv_usec = (unsigned long)(UnixTime % S64_SUFFIX(1000000));
+}
+#endif /* WIN32 */
+
+
+
+/************************************************************************/
+/* */
+/* signal catcher */
+/* */
+/************************************************************************/
+
+void
+#if defined(__hpux)
+catcher(sig, code, scp)
+ int sig;
+ int code;
+ struct sigcontext *scp;
+#else
+catcher(int sig)
+#endif /* __hpux || __VMS */
+{
+
+#ifdef __hpux
+ if (debug > 2) {
+ fprintf(where,"caught signal %d ",sig);
+ if (scp) {
+ fprintf(where,"while in syscall %d\n",
+ scp->sc_syscall);
+ }
+ else {
+ fprintf(where,"null scp\n");
+ }
+ fflush(where);
+ }
+#endif /* RAJ_DEBUG */
+
+ switch(sig) {
+
+ case SIGINT:
+ fprintf(where,"netperf: caught SIGINT\n");
+ fflush(where);
+ exit(1);
+ break;
+ case SIGALRM:
+ if (--test_len_ticks == 0) {
+ /* the test is over */
+ if (times_up != 0) {
+ fprintf(where,"catcher: timer popped with times_up != 0\n");
+ fflush(where);
+ }
+ times_up = 1;
+#if defined(WANT_INTERVALS) && !defined(WANT_SPIN)
+ stop_itimer();
+#endif /* WANT_INTERVALS */
+ break;
+ }
+ else {
+#ifdef WANT_INTERVALS
+#ifdef __hpux
+ /* the test is not over yet and we must have been using the */
+ /* interval timer. if we were in SYS_SIGSUSPEND we want to */
+ /* re-start the system call. Otherwise, we want to get out of */
+ /* the sigsuspend call. I NEED TO KNOW HOW TO DO THIS FOR OTHER */
+ /* OPERATING SYSTEMS. If you know how, please let me know. rick */
+ /* jones <raj@cup.hp.com> */
+ if (scp->sc_syscall != SYS_SIGSUSPEND) {
+ if (debug > 2) {
+ fprintf(where,
+ "catcher: Time to send burst > interval!\n");
+ fflush(where);
+ }
+ scp->sc_syscall_action = SIG_RESTART;
+ }
+#endif /* __hpux */
+#else /* WANT_INTERVALS */
+ fprintf(where,
+ "catcher: interval timer running unexpectedly!\n");
+ fflush(where);
+ times_up = 1;
+#endif /* WANT_INTERVALS */
+ break;
+ }
+ }
+ return;
+}
+
+
+void
+install_signal_catchers()
+
+{
+ /* just a simple little routine to catch a bunch of signals */
+
+#ifndef WIN32
+ struct sigaction action;
+ int i;
+
+ fprintf(where,"installing catcher for all signals\n");
+ fflush(where);
+
+ sigemptyset(&(action.sa_mask));
+ action.sa_handler = catcher;
+
+#ifdef SA_INTERRUPT
+ action.sa_flags = SA_INTERRUPT;
+#else /* SA_INTERRUPT */
+ action.sa_flags = 0;
+#endif /* SA_INTERRUPT */
+
+
+ for (i = 1; i <= NSIG; i++) {
+ if (i != SIGALRM) {
+ if (sigaction(i,&action,NULL) != 0) {
+ fprintf(where,
+ "Could not install signal catcher for sig %d, errno %d\n",
+ i,
+ errno);
+ fflush(where);
+
+ }
+ }
+ }
+#else
+ return;
+#endif /* WIN32 */
+}
+
+
+#ifdef WIN32
+#define SIGALRM (14)
+void
+emulate_alarm( int seconds )
+{
+ DWORD ErrorCode;
+
+ /* Wait on this event for parm seconds. */
+
+ ErrorCode = WaitForSingleObject(hAlarm, seconds*1000);
+ if (ErrorCode == WAIT_FAILED)
+ {
+ perror("WaitForSingleObject failed");
+ exit(1);
+ }
+
+ if (ErrorCode == WAIT_TIMEOUT)
+ {
+ /* WaitForSingleObject timed out; this means the timer
+ wasn't canceled. */
+
+ times_up = 1;
+
+ /* We have yet to find a good way to fully emulate the effects */
+ /* of signals and getting EINTR from system calls under */
+ /* winsock, so what we do here is close the socket out from */
+ /* under the other thread. It is rather kludgy, but should be */
+ /* sufficient to get this puppy shipped. The concept can be */
+ /* attributed/blamed :) on Robin raj 1/96 */
+
+ if (win_kludge_socket != INVALID_SOCKET) {
+ closesocket(win_kludge_socket);
+ }
+ if (win_kludge_socket2 != INVALID_SOCKET) {
+ closesocket(win_kludge_socket2);
+ }
+ }
+}
+
+#endif /* WIN32 */
+
+void
+start_timer(int time)
+{
+
+#ifdef WIN32
+ /*+*+SAF What if StartTimer is called twice without the first timer */
+ /*+*+SAF expiring? */
+
+ DWORD thread_id ;
+ HANDLE tHandle;
+
+ if (hAlarm == (HANDLE) INVALID_HANDLE_VALUE)
+ {
+ /* Create the Alarm event object */
+ hAlarm = CreateEvent(
+ (LPSECURITY_ATTRIBUTES) NULL, /* no security */
+ FALSE, /* auto reset event */
+ FALSE, /* init. state = reset */
+ (void *)NULL); /* unnamed event object */
+ if (hAlarm == (HANDLE) INVALID_HANDLE_VALUE)
+ {
+ perror("CreateEvent failure");
+ exit(1);
+ }
+ }
+ else
+ {
+ ResetEvent(hAlarm);
+ }
+
+
+ tHandle = CreateThread(0,
+ 0,
+ (LPTHREAD_START_ROUTINE)emulate_alarm,
+ (LPVOID)(ULONG_PTR)time,
+ 0,
+ &thread_id ) ;
+ CloseHandle(tHandle);
+
+#else /* not WIN32 */
+
+struct sigaction action;
+
+if (debug) {
+ fprintf(where,"About to start a timer for %d seconds.\n",time);
+ fflush(where);
+}
+
+ action.sa_handler = catcher;
+ sigemptyset(&(action.sa_mask));
+ sigaddset(&(action.sa_mask),SIGALRM);
+
+#ifdef SA_INTERRUPT
+ /* on some systems (SunOS 4.blah), system calls are restarted. we do */
+ /* not want that */
+ action.sa_flags = SA_INTERRUPT;
+#else /* SA_INTERRUPT */
+ action.sa_flags = 0;
+#endif /* SA_INTERRUPT */
+
+ if (sigaction(SIGALRM, &action, NULL) < 0) {
+ fprintf(where,"start_timer: error installing alarm handler ");
+ fprintf(where,"errno %d\n",errno);
+ fflush(where);
+ exit(1);
+ }
+
+ /* this is the easy case - just set the timer for so many seconds */
+ if (alarm(time) != 0) {
+ fprintf(where,
+ "error starting alarm timer, errno %d\n",
+ errno);
+ fflush(where);
+ }
+#endif /* WIN32 */
+
+ test_len_ticks = 1;
+
+}
+
+
+ /* this routine will disable any running timer */
+void
+stop_timer()
+{
+#ifndef WIN32
+ alarm(0);
+#else
+ /* at some point we may need some win32 equivalent */
+ if (hAlarm != (HANDLE) INVALID_HANDLE_VALUE)
+ {
+ SetEvent(hAlarm);
+ }
+#endif /* WIN32 */
+
+}
+
+
+#ifdef WANT_INTERVALS
+ /* this routine will enable the interval timer and set things up so */
+ /* that for a timed test the test will end at the proper time. it */
+ /* should detect the presence of POSIX.4 timer_* routines one of */
+ /* these days */
+void
+start_itimer(unsigned int interval_len_msec )
+{
+
+ unsigned int ticks_per_itvl;
+
+ struct itimerval new_interval;
+ struct itimerval old_interval;
+
+ /* if -DWANT_INTERVALS was used, we will use the ticking of the itimer to */
+ /* tell us when the test is over. while the user will be specifying */
+ /* some number of milliseconds, we know that the interval timer is */
+ /* really in units of 1/HZ. so, to prevent the test from running */
+ /* "long" it would be necessary to keep this in mind when calculating */
+ /* the number of itimer events */
+
+ ticks_per_itvl = ((interval_wate * sysconf(_SC_CLK_TCK) * 1000) /
+ 1000000);
+
+ if (ticks_per_itvl == 0) ticks_per_itvl = 1;
+
+ /* how many usecs in each interval? */
+ usec_per_itvl = ticks_per_itvl * (1000000 / sysconf(_SC_CLK_TCK));
+
+ /* how many times will the timer pop before the test is over? */
+ if (test_time > 0) {
+ /* this was a timed test */
+ test_len_ticks = (test_time * 1000000) / usec_per_itvl;
+ }
+ else {
+ /* this was not a timed test, use MAXINT */
+ test_len_ticks = INT_MAX;
+ }
+
+ if (debug) {
+ fprintf(where,"setting the interval timer to %d sec %d usec ",
+ usec_per_itvl / 1000000,
+ usec_per_itvl % 1000000);
+ fprintf(where,"test len %d ticks\n",
+ test_len_ticks);
+ fflush(where);
+ }
+
+ /* if this was not a timed test, then we really aught to enable the */
+ /* signal catcher raj 2/95 */
+
+ new_interval.it_interval.tv_sec = usec_per_itvl / 1000000;
+ new_interval.it_interval.tv_usec = usec_per_itvl % 1000000;
+ new_interval.it_value.tv_sec = usec_per_itvl / 1000000;
+ new_interval.it_value.tv_usec = usec_per_itvl % 1000000;
+ if (setitimer(ITIMER_REAL,&new_interval,&old_interval) != 0) {
+ /* there was a problem arming the interval timer */
+ perror("netperf: setitimer");
+ exit(1);
+ }
+}
+#endif /* WANT_INTERVALS */
+
+void
+netlib_init_cpu_map() {
+
+ int i;
+#ifdef HAVE_MPCTL
+ int num;
+ i = 0;
+ /* I go back and forth on whether this should be the system-wide set
+ of calls, or if the processor set versions (sans the _SYS) should
+ be used. at the moment I believe that the system-wide version
+ should be used. raj 2006-04-03 */
+ num = mpctl(MPC_GETNUMSPUS_SYS,0,0);
+ lib_cpu_map[i] = mpctl(MPC_GETFIRSTSPU_SYS,0,0);
+ for (i = 1;((i < num) && (i < MAXCPUS)); i++) {
+ lib_cpu_map[i] = mpctl(MPC_GETNEXTSPU_SYS,lib_cpu_map[i-1],0);
+ }
+ /* from here, we set them all to -1 because if we launch more
+ loopers than actual CPUs, well, I'm not sure why :) */
+ for (; i < MAXCPUS; i++) {
+ lib_cpu_map[i] = -1;
+ }
+
+#else
+ /* we assume that there is indeed a contiguous mapping */
+ for (i = 0; i < MAXCPUS; i++) {
+ lib_cpu_map[i] = i;
+ }
+#endif
+}
+
+
+/****************************************************************/
+/* */
+/* netlib_init() */
+/* */
+/* initialize the performance library... */
+/* */
+/****************************************************************/
+
+void
+netlib_init()
+{
+ int i;
+
+ where = stdout;
+
+ request_array = (int *)(&netperf_request);
+ response_array = (int *)(&netperf_response);
+
+ for (i = 0; i < MAXCPUS; i++) {
+ lib_local_per_cpu_util[i] = 0.0;
+ }
+
+ /* on those systems where we know that CPU numbers may not start at
+ zero and be contiguous, we provide a way to map from a
+ contiguous, starting from 0 CPU id space to the actual CPU ids.
+ at present this is only used for the netcpu_looper stuff because
+ we ass-u-me that someone setting processor affinity from the
+ netperf commandline will provide a "proper" CPU identifier. raj
+ 2006-04-03 */
+
+ netlib_init_cpu_map();
+
+ if (debug) {
+ fprintf(where,
+ "netlib_init: request_array at %p\n",
+ request_array);
+ fprintf(where,
+ "netlib_init: response_array at %p\n",
+ response_array);
+
+ fflush(where);
+ }
+
+}
+
+ /* this routine will conver the string into an unsigned integer. it */
+ /* is used primarily for the command-line options taking a number */
+ /* (such as the socket size) which could be rather large. If someone */
+ /* enters 32M, then the number will be converted to 32 * 1024 * 1024. */
+ /* If they inter 32m, the number will be converted to 32 * 1000 * */
+ /* 1000 */
+unsigned int
+convert(char *string)
+
+{
+ unsigned int base;
+ base = atoi(string);
+ if (strstr(string,"K")) {
+ base *= 1024;
+ }
+ if (strstr(string,"M")) {
+ base *= (1024 * 1024);
+ }
+ if (strstr(string,"G")) {
+ base *= (1024 * 1024 * 1024);
+ }
+ if (strstr(string,"k")) {
+ base *= (1000);
+ }
+ if (strstr(string,"m")) {
+ base *= (1000 * 1000);
+ }
+ if (strstr(string,"g")) {
+ base *= (1000 * 1000 * 1000);
+ }
+ return(base);
+}
+
+/* this routine is like convert, but it is used for an interval time
+ specification instead of stuff like socket buffer or send sizes.
+ it converts everything to microseconds for internal use. if there
+ is an 'm' at the end it assumes the user provided milliseconds, s
+ will imply seconds, u will imply microseconds. in the future n
+ will imply nanoseconds but for now it will be ignored. if there is
+ no suffix or an unrecognized suffix, it will be assumed the user
+ provided milliseconds, which was the long-time netperf default. one
+ of these days, we should probably revisit that nanosecond business
+ wrt the return value being just an int rather than a uint64_t or
+ something. raj 2006-02-06 */
+
+unsigned int
+convert_timespec(char *string) {
+
+ unsigned int base;
+ base = atoi(string);
+ if (strstr(string,"m")) {
+ base *= 1000;
+ }
+ else if (strstr(string,"u")) {
+ base *= (1);
+ }
+ else if (strstr(string,"s")) {
+ base *= (1000 * 1000);
+ }
+ else {
+ base *= (1000);
+ }
+ return(base);
+}
+
+
+ /* this routine will allocate a circular list of buffers for either */
+ /* send or receive operations. each of these buffers will be aligned */
+ /* and offset as per the users request. the circumference of this */
+ /* ring will be controlled by the setting of send_width. the buffers */
+ /* will be filled with data from the file specified in fill_file. if */
+ /* fill_file is an empty string, the buffers will not be filled with */
+ /* any particular data */
+
+struct ring_elt *
+allocate_buffer_ring(int width, int buffer_size, int alignment, int offset)
+{
+
+ struct ring_elt *first_link = NULL;
+ struct ring_elt *temp_link = NULL;
+ struct ring_elt *prev_link;
+
+ int i;
+ int malloc_size;
+ int bytes_left;
+ int bytes_read;
+ int do_fill;
+
+ FILE *fill_source;
+ char default_fill[] = "netperf";
+ int fill_cursor = 0;
+
+ malloc_size = buffer_size + alignment + offset;
+
+ /* did the user wish to have the buffers pre-filled with data from a */
+ /* particular source? */
+ if (strcmp(fill_file,"") == 0) {
+ do_fill = 0;
+ fill_source = NULL;
+ }
+ else {
+ do_fill = 1;
+ fill_source = (FILE *)fopen(fill_file,"r");
+ if (fill_source == (FILE *)NULL) {
+ perror("Could not open requested fill file");
+ exit(1);
+ }
+ }
+
+ assert(width >= 1);
+
+ prev_link = NULL;
+ for (i = 1; i <= width; i++) {
+ /* get the ring element */
+ temp_link = (struct ring_elt *)malloc(sizeof(struct ring_elt));
+ if (temp_link == NULL) {
+ printf("malloc(%u) failed!\n", sizeof(struct ring_elt));
+ exit(1);
+ }
+ /* remember the first one so we can close the ring at the end */
+ if (i == 1) {
+ first_link = temp_link;
+ }
+ temp_link->buffer_base = (char *)malloc(malloc_size);
+ if (temp_link == NULL) {
+ printf("malloc(%d) failed!\n", malloc_size);
+ exit(1);
+ }
+
+#ifndef WIN32
+ temp_link->buffer_ptr = (char *)(( (long)(temp_link->buffer_base) +
+ (long)alignment - 1) &
+ ~((long)alignment - 1));
+#else
+ temp_link->buffer_ptr = (char *)(( (ULONG_PTR)(temp_link->buffer_base) +
+ (ULONG_PTR)alignment - 1) &
+ ~((ULONG_PTR)alignment - 1));
+#endif
+ temp_link->buffer_ptr += offset;
+ /* is where the buffer fill code goes. */
+ if (do_fill) {
+ char *bufptr = temp_link->buffer_ptr;
+ bytes_left = buffer_size;
+ while (bytes_left) {
+ if (((bytes_read = (int)fread(bufptr,
+ 1,
+ bytes_left,
+ fill_source)) == 0) &&
+ (feof(fill_source))){
+ rewind(fill_source);
+ }
+ bufptr += bytes_read;
+ bytes_left -= bytes_read;
+ }
+ }
+ else {
+ /* use the default fill to ID our data traffic on the
+ network. it ain't exactly pretty, but it should work */
+ int j;
+ char *bufptr = temp_link->buffer_ptr;
+ for (j = 0; j < buffer_size; j++) {
+ bufptr[j] = default_fill[fill_cursor];
+ fill_cursor += 1;
+ /* the Windows DDK compiler with an x86_64 target wants a cast
+ here */
+ if (fill_cursor > (int)strlen(default_fill)) {
+ fill_cursor = 0;
+ }
+ }
+
+ }
+ temp_link->next = prev_link;
+ prev_link = temp_link;
+ }
+ if (first_link) { /* SAF Prefast made me do it... */
+ first_link->next = temp_link;
+ }
+
+ return(first_link); /* it's a circle, doesn't matter which we return */
+}
+
+/* this routine will dirty the first dirty_count bytes of the
+ specified buffer and/or read clean_count bytes from the buffer. it
+ will go N bytes at a time, the only question is how large should N
+ be and if we should be going continguously, or based on some
+ assumption of cache line size */
+
+void
+access_buffer(char *buffer_ptr,int length, int dirty_count, int clean_count) {
+
+ char *temp_buffer;
+ char *limit;
+ int i, dirty_totals;
+
+ temp_buffer = buffer_ptr;
+ limit = temp_buffer + length;
+ dirty_totals = 0;
+
+ for (i = 0;
+ ((i < dirty_count) && (temp_buffer < limit));
+ i++) {
+ *temp_buffer += (char)i;
+ dirty_totals += *temp_buffer;
+ temp_buffer++;
+ }
+
+ for (i = 0;
+ ((i < clean_count) && (temp_buffer < limit));
+ i++) {
+ dirty_totals += *temp_buffer;
+ temp_buffer++;
+ }
+
+ if (debug > 100) {
+ fprintf(where,
+ "This was here to try to avoid dead-code elimination %d\n",
+ dirty_totals);
+ fflush(where);
+ }
+}
+
+
+#ifdef HAVE_ICSC_EXS
+
+#include <sys/mman.h>
+#include <sys/exs.h>
+
+ /* this routine will allocate a circular list of buffers for either */
+ /* send or receive operations. each of these buffers will be aligned */
+ /* and offset as per the users request. the circumference of this */
+ /* ring will be controlled by the setting of send_width. the buffers */
+ /* will be filled with data from the file specified in fill_file. if */
+ /* fill_file is an empty string, the buffers will not be filled with */
+ /* any particular data */
+
+struct ring_elt *
+allocate_exs_buffer_ring (int width, int buffer_size, int alignment, int offset, exs_mhandle_t *mhandlep)
+{
+
+ struct ring_elt *first_link;
+ struct ring_elt *temp_link;
+ struct ring_elt *prev_link;
+
+ int i;
+ int malloc_size;
+ int bytes_left;
+ int bytes_read;
+ int do_fill;
+
+ FILE *fill_source;
+
+ int mmap_size;
+ char *mmap_buffer, *mmap_buffer_aligned;
+
+ malloc_size = buffer_size + alignment + offset;
+
+ /* did the user wish to have the buffers pre-filled with data from a */
+ /* particular source? */
+ if (strcmp (fill_file, "") == 0) {
+ do_fill = 0;
+ fill_source = NULL;
+ } else {
+ do_fill = 1;
+ fill_source = (FILE *) fopen (fill_file, "r");
+ if (fill_source == (FILE *) NULL) {
+ perror ("Could not open requested fill file");
+ exit (1);
+ }
+ }
+
+ assert (width >= 1);
+
+ if (debug) {
+ fprintf (where, "allocate_exs_buffer_ring: "
+ "width=%d buffer_size=%d alignment=%d offset=%d\n",
+ width, buffer_size, alignment, offset);
+ }
+
+ /* allocate shared memory */
+ mmap_size = width * malloc_size;
+ mmap_buffer = (char *) mmap ((caddr_t)NULL, mmap_size+NBPG-1,
+ PROT_READ|PROT_WRITE,
+ MAP_SHARED|MAP_ANONYMOUS, -1, 0);
+ if (mmap_buffer == NULL) {
+ perror ("allocate_exs_buffer_ring: mmap failed");
+ exit (1);
+ }
+ mmap_buffer_aligned = (char *) ((uintptr_t)mmap_buffer & ~(NBPG-1));
+ if (debug) {
+ fprintf (where, "allocate_exs_buffer_ring: "
+ "mmap buffer size=%d address=0x%p aligned=0x%p\n",
+ mmap_size, mmap_buffer, mmap_buffer_aligned);
+ }
+
+ /* register shared memory */
+ *mhandlep = exs_mregister ((void *)mmap_buffer_aligned, (size_t)mmap_size, 0);
+ if (*mhandlep == EXS_MHANDLE_INVALID) {
+ perror ("allocate_exs_buffer_ring: exs_mregister failed");
+ exit (1);
+ }
+ if (debug) {
+ fprintf (where, "allocate_exs_buffer_ring: mhandle=%d\n",
+ *mhandlep);
+ }
+
+ /* allocate ring elements */
+ first_link = (struct ring_elt *) malloc (width * sizeof (struct ring_elt));
+ if (first_link == NULL) {
+ printf ("malloc(%d) failed!\n", width * sizeof (struct ring_elt));
+ exit (1);
+ }
+
+ /* initialize buffer ring */
+ prev_link = first_link + width - 1;
+
+ for (i = 0, temp_link = first_link; i < width; i++, temp_link++) {
+
+ temp_link->buffer_base = (char *) mmap_buffer_aligned + (i*malloc_size);
+#ifndef WIN32
+ temp_link->buffer_ptr = (char *)
+ (((long)temp_link->buffer_base + (long)alignment - 1) &
+ ~((long)alignment - 1));
+#else
+ temp_link->buffer_ptr = (char *)
+ (((ULONG_PTR)temp_link->buffer_base + (ULONG_PTR)alignment - 1) &
+ ~((ULONG_PTR)alignment - 1));
+#endif
+ temp_link->buffer_ptr += offset;
+
+ if (debug) {
+ fprintf (where, "allocate_exs_buffer_ring: "
+ "buffer: index=%d base=0x%p ptr=0x%p\n",
+ i, temp_link->buffer_base, temp_link->buffer_ptr);
+ }
+
+ /* is where the buffer fill code goes. */
+ if (do_fill) {
+ bytes_left = buffer_size;
+ while (bytes_left) {
+ if (((bytes_read = (int) fread (temp_link->buffer_ptr,
+ 1,
+ bytes_left,
+ fill_source)) == 0) &&
+ (feof (fill_source))) {
+ rewind (fill_source);
+ }
+ bytes_left -= bytes_read;
+ }
+ }
+
+ /* do linking */
+ prev_link->next = temp_link;
+ prev_link = temp_link;
+ }
+
+ return (first_link); /* it's a circle, doesn't matter which we return */
+}
+
+#endif /* HAVE_ICSC_EXS */
+
+
+
+#ifdef HAVE_SENDFILE
+/* this routine will construct a ring of sendfile_ring_elt structs
+ that the routine sendfile_tcp_stream() will use to get parameters
+ to its calls to sendfile(). It will setup the ring to point at the
+ file specified in the global -F option that is already used to
+ pre-fill buffers in the send() case. 08/2000
+
+ if there is no file specified in a global -F option, we will create
+ a tempoarary file and fill it with random data and use that
+ instead. raj 2007-08-09 */
+
+struct sendfile_ring_elt *
+alloc_sendfile_buf_ring(int width,
+ int buffer_size,
+ int alignment,
+ int offset)
+
+{
+
+ struct sendfile_ring_elt *first_link = NULL;
+ struct sendfile_ring_elt *temp_link = NULL;
+ struct sendfile_ring_elt *prev_link;
+
+ int i;
+ int fildes;
+ struct stat statbuf;
+
+ /* if the user has not specified a file with the -F option, we will
+ fail the test. otherwise, go ahead and try to open the
+ file. 08/2000 */
+ if (strcmp(fill_file,"") == 0) {
+ /* use an temp file for the fill file */
+ char *temp_file;
+ int *temp_buffer;
+
+ /* make sure we have at least an ints worth, even if the user is
+ using an insane buffer size for a sendfile test. we are
+ ass-u-me-ing that malloc will return something at least aligned
+ on an int boundary... */
+ temp_buffer = (int *) malloc(buffer_size + sizeof(int));
+ if (temp_buffer) {
+ /* ok, we have the buffer we are going to write, lets get a
+ temporary filename */
+ temp_file = tmpnam(NULL);
+ if (NULL != temp_file) {
+ fildes = open(temp_file,O_RDWR | O_EXCL | O_CREAT,0600);
+ if (-1 != fildes) {
+ int count;
+ int *int_ptr;
+
+ /* initialize the random number generator */
+ srand(getpid());
+
+ /* unlink the file so it goes poof when we
+ exit. unless/until shown to be a problem we will
+ blissfully ignore the return value. raj 2007-08-09 */
+ unlink(temp_file);
+
+ /* now fill-out the file with at least buffer_size * width bytes */
+ for (count = 0; count < width; count++) {
+ /* fill the buffer with random data. it doesn't have to be
+ really random, just "random enough" :) we do this here rather
+ than up above because we want each write to the file to be
+ different random data */
+ int_ptr = temp_buffer;
+ for (i = 0; i <= buffer_size/sizeof(int); i++) {
+ *int_ptr = rand();
+ int_ptr++;
+ }
+ if (write(fildes,temp_buffer,buffer_size+sizeof(int)) !=
+ buffer_size + sizeof(int)) {
+ perror("allocate_sendfile_buf_ring: incomplete write");
+ exit(-1);
+ }
+ }
+ }
+ else {
+ perror("allocate_sendfile_buf_ring: could not open tempfile");
+ exit(-1);
+ }
+ }
+ else {
+ perror("allocate_sendfile_buf_ring: could not allocate temp name");
+ exit(-1);
+ }
+ }
+ else {
+ perror("alloc_sendfile_buf_ring: could not allocate buffer for file");
+ exit(-1);
+ }
+ }
+ else {
+ /* the user pointed us at a file, so try it */
+ fildes = open(fill_file , O_RDONLY);
+ if (fildes == -1){
+ perror("alloc_sendfile_buf_ring: Could not open requested file");
+ exit(1);
+ }
+ /* make sure there is enough file there to allow us to make a
+ complete ring. that way we do not need additional logic in the
+ ring setup to deal with wrap-around issues. we might want that
+ someday, but not just now. 08/2000 */
+ if (stat(fill_file,&statbuf) != 0) {
+ perror("alloc_sendfile_buf_ring: could not stat file");
+ exit(1);
+ }
+ if (statbuf.st_size < (width * buffer_size)) {
+ /* the file is too short */
+ fprintf(stderr,"alloc_sendfile_buf_ring: specified file too small.\n");
+ fprintf(stderr,"file must be larger than send_width * send_size\n");
+ fflush(stderr);
+ exit(1);
+ }
+ }
+
+ /* so, at this point we know that fildes is a descriptor which
+ references a file of sufficient size for our nefarious
+ porpoises. raj 2007-08-09 */
+
+ prev_link = NULL;
+ for (i = 1; i <= width; i++) {
+ /* get the ring element. we should probably make sure the malloc()
+ was successful, but for now we'll just let the code bomb
+ mysteriously. 08/2000 */
+
+ temp_link = (struct sendfile_ring_elt *)
+ malloc(sizeof(struct sendfile_ring_elt));
+ if (temp_link == NULL) {
+ printf("malloc(%u) failed!\n", sizeof(struct sendfile_ring_elt));
+ exit(1);
+ }
+
+ /* remember the first one so we can close the ring at the end */
+
+ if (i == 1) {
+ first_link = temp_link;
+ }
+
+ /* now fill-in the fields of the structure with the apropriate
+ stuff. just how should we deal with alignment and offset I
+ wonder? until something better comes-up, I think we will just
+ ignore them. 08/2000 */
+
+ temp_link->fildes = fildes; /* from which file do we send? */
+ temp_link->offset = offset; /* starting at which offset? */
+ offset += buffer_size; /* get ready for the next elt */
+ temp_link->length = buffer_size; /* how many bytes to send */
+ temp_link->hdtrl = NULL; /* no header or trailer */
+ temp_link->flags = 0; /* no flags */
+
+ /* is where the buffer fill code went. */
+
+ temp_link->next = prev_link;
+ prev_link = temp_link;
+ }
+ /* close the ring */
+ first_link->next = temp_link;
+
+ return(first_link); /* it's a dummy ring */
+}
+
+#endif /* HAVE_SENDFILE */
+
+
+ /***********************************************************************/
+ /* */
+ /* dump_request() */
+ /* */
+ /* display the contents of the request array to the user. it will */
+ /* display the contents in decimal, hex, and ascii, with four bytes */
+ /* per line. */
+ /* */
+ /***********************************************************************/
+
+void
+dump_request()
+{
+int counter = 0;
+fprintf(where,"request contents:\n");
+for (counter = 0; counter < ((sizeof(netperf_request)/4)-3); counter += 4) {
+ fprintf(where,"%d:\t%8x %8x %8x %8x \t|%4.4s| |%4.4s| |%4.4s| |%4.4s|\n",
+ counter,
+ request_array[counter],
+ request_array[counter+1],
+ request_array[counter+2],
+ request_array[counter+3],
+ (char *)&request_array[counter],
+ (char *)&request_array[counter+1],
+ (char *)&request_array[counter+2],
+ (char *)&request_array[counter+3]);
+}
+fflush(where);
+}
+
+
+ /***********************************************************************/
+ /* */
+ /* dump_response() */
+ /* */
+ /* display the content of the response array to the user. it will */
+ /* display the contents in decimal, hex, and ascii, with four bytes */
+ /* per line. */
+ /* */
+ /***********************************************************************/
+
+void
+dump_response()
+{
+int counter = 0;
+
+fprintf(where,"response contents\n");
+for (counter = 0; counter < ((sizeof(netperf_response)/4)-3); counter += 4) {
+ fprintf(where,"%d:\t%8x %8x %8x %8x \t>%4.4s< >%4.4s< >%4.4s< >%4.4s<\n",
+ counter,
+ response_array[counter],
+ response_array[counter+1],
+ response_array[counter+2],
+ response_array[counter+3],
+ (char *)&response_array[counter],
+ (char *)&response_array[counter+1],
+ (char *)&response_array[counter+2],
+ (char *)&response_array[counter+3]);
+}
+fflush(where);
+}
+
+ /*
+
+ format_number()
+
+ return a pointer to a formatted string containing the value passed
+ translated into the units specified. It assumes that the base units
+ are bytes. If the format calls for bits, it will use SI units (10^)
+ if the format calls for bytes, it will use CS units (2^)... This
+ routine should look familiar to uses of the latest ttcp...
+
+ we would like to use "t" or "T" for transactions, but probably
+ should leave those for terabits and terabytes respectively, so for
+ transactions, we will use "x" which will, by default, do absolutely
+ nothing to the result. why? so we don't have to special case code
+ elsewhere such as in the TCP_RR-as-bidirectional test case.
+
+ */
+
+
+char *
+format_number(double number)
+{
+ static char fmtbuf[64];
+
+ switch (libfmt) {
+ case 'K':
+ snprintf(fmtbuf, sizeof(fmtbuf), "%-7.2f" , number / 1024.0);
+ break;
+ case 'M':
+ snprintf(fmtbuf, sizeof(fmtbuf), "%-7.2f", number / 1024.0 / 1024.0);
+ break;
+ case 'G':
+ snprintf(fmtbuf, sizeof(fmtbuf), "%-7.2f", number / 1024.0 / 1024.0 / 1024.0);
+ break;
+ case 'k':
+ snprintf(fmtbuf, sizeof(fmtbuf), "%-7.2f", number * 8 / 1000.0);
+ break;
+ case 'm':
+ snprintf(fmtbuf, sizeof(fmtbuf), "%-7.2f", number * 8 / 1000.0 / 1000.0);
+ break;
+ case 'g':
+ snprintf(fmtbuf, sizeof(fmtbuf), "%-7.2f", number * 8 / 1000.0 / 1000.0 / 1000.0);
+ break;
+ case 'x':
+ snprintf(fmtbuf, sizeof(fmtbuf), "%-7.2f", number);
+ break;
+ default:
+ snprintf(fmtbuf, sizeof(fmtbuf), "%-7.2f", number / 1024.0);
+ }
+
+ return fmtbuf;
+}
+
+char
+format_cpu_method(int method)
+{
+
+ char method_char;
+
+ switch (method) {
+ case CPU_UNKNOWN:
+ method_char = 'U';
+ break;
+ case HP_IDLE_COUNTER:
+ method_char = 'I';
+ break;
+ case PSTAT:
+ method_char = 'P';
+ break;
+ case KSTAT:
+ method_char = 'K';
+ break;
+ case KSTAT_10:
+ method_char = 'M';
+ break;
+ case PERFSTAT:
+ method_char = 'E';
+ break;
+ case TIMES: /* historical only, completely unsuitable
+ for netperf's purposes */
+ method_char = 'T';
+ break;
+ case GETRUSAGE: /* historical only, completely unsuitable
+ for netperf;s purposes */
+ method_char = 'R';
+ break;
+ case LOOPER:
+ method_char = 'L';
+ break;
+ case NT_METHOD:
+ method_char = 'N';
+ break;
+ case PROC_STAT:
+ method_char = 'S';
+ break;
+ case SYSCTL:
+ method_char = 'C';
+ break;
+ case OSX:
+ method_char = 'O';
+ break;
+ default:
+ method_char = '?';
+ }
+
+ return method_char;
+
+}
+
+char *
+format_units()
+{
+ static char unitbuf[64];
+
+ switch (libfmt) {
+ case 'K':
+ strcpy(unitbuf, "KBytes");
+ break;
+ case 'M':
+ strcpy(unitbuf, "MBytes");
+ break;
+ case 'G':
+ strcpy(unitbuf, "GBytes");
+ break;
+ case 'k':
+ strcpy(unitbuf, "10^3bits");
+ break;
+ case 'm':
+ strcpy(unitbuf, "10^6bits");
+ break;
+ case 'g':
+ strcpy(unitbuf, "10^9bits");
+ break;
+ case 'x':
+ strcpy(unitbuf, "Trans");
+ break;
+
+ default:
+ strcpy(unitbuf, "KBytes");
+ }
+
+ return unitbuf;
+}
+
+
+/****************************************************************/
+/* */
+/* shutdown_control() */
+/* */
+/* tear-down the control connection between me and the server. */
+/****************************************************************/
+
+void
+shutdown_control()
+{
+
+ char *buf = (char *)&netperf_response;
+ int buflen = sizeof(netperf_response);
+
+ /* stuff for select, use fd_set for better compliance */
+ fd_set readfds;
+ struct timeval timeout;
+
+ if (debug) {
+ fprintf(where,
+ "shutdown_control: shutdown of control connection requested.\n");
+ fflush(where);
+ }
+
+ /* first, we say that we will be sending no more data on the */
+ /* connection */
+ if (shutdown(netlib_control,1) == SOCKET_ERROR) {
+ Print_errno(where,
+ "shutdown_control: error in shutdown");
+ fflush(where);
+ exit(1);
+ }
+
+ /* Now, we hang on a select waiting for the socket to become */
+ /* readable to receive the shutdown indication from the remote. this */
+ /* will be "just" like the recv_response() code */
+
+ /* we only select once. it is assumed that if the response is split */
+ /* (which should not be happening, that we will receive the whole */
+ /* thing and not have a problem ;-) */
+
+ FD_ZERO(&readfds);
+ FD_SET(netlib_control,&readfds);
+ timeout.tv_sec = 60; /* wait one minute then punt */
+ timeout.tv_usec = 0;
+
+ /* select had better return one, or there was either a problem or a */
+ /* timeout... */
+ if (select(FD_SETSIZE,
+ &readfds,
+ 0,
+ 0,
+ &timeout) != 1) {
+ Print_errno(where,
+ "shutdown_control: no response received");
+ fflush(where);
+ exit(1);
+ }
+
+ /* we now assume that the socket has come ready for reading */
+ recv(netlib_control, buf, buflen,0);
+
+}
+
+/*
+ bind_to_specific_processor will bind the calling process to the
+ processor in "processor" It has lots of ugly ifdefs to deal with
+ all the different ways systems do processor affinity. this is a
+ generalization of work initially done by stephen burger. raj
+ 2004/12/13 */
+
+void
+bind_to_specific_processor(int processor_affinity, int use_cpu_map)
+{
+
+ int mapped_affinity;
+
+ /* this is in place because the netcpu_looper processor affinity
+ ass-u-me-s a contiguous CPU id space starting with 0. for the
+ regular netperf/netserver affinity, we ass-u-me the user has used
+ a suitable CPU id even when the space is not contiguous and
+ starting from zero */
+ if (use_cpu_map) {
+ mapped_affinity = lib_cpu_map[processor_affinity];
+ }
+ else {
+ mapped_affinity = processor_affinity;
+ }
+
+#ifdef HAVE_MPCTL
+ /* indeed, at some point it would be a good idea to check the return
+ status and pass-along notification of error... raj 2004/12/13 */
+ mpctl(MPC_SETPROCESS_FORCE, mapped_affinity, getpid());
+#elif HAVE_PROCESSOR_BIND
+#include <sys/types.h>
+#include <sys/processor.h>
+#include <sys/procset.h>
+ processor_bind(P_PID,P_MYID,mapped_affinity,NULL);
+#elif HAVE_BINDPROCESSOR
+#include <sys/processor.h>
+ /* this is the call on AIX. It takes a "what" of BINDPROCESS or
+ BINDTHRAD, then "who" and finally "where" which is a CPU number
+ or it seems PROCESSOR_CLASS_ANY there also seems to be a mycpu()
+ call to return the current CPU assignment. this is all based on
+ the sys/processor.h include file. from empirical testing, it
+ would seem that the my_cpu() call returns the current CPU on
+ which we are running rather than the CPU binding, so it's return
+ value will not tell you if you are bound vs unbound. */
+ bindprocessor(BINDPROCESS,getpid(),(cpu_t)mapped_affinity);
+#elif HAVE_SCHED_SETAFFINITY
+#include <sched.h>
+ /* in theory this should cover systems with more CPUs than bits in a
+ long, without having to specify __USE_GNU. we "cheat" by taking
+ defines from /usr/include/bits/sched.h, which we ass-u-me is
+ included by <sched.h>. If they are not there we will just
+ fall-back on what we had before, which is to use just the size of
+ an unsigned long. raj 2006-09-14 */
+
+#if defined(__CPU_SETSIZE)
+#define NETPERF_CPU_SETSIZE __CPU_SETSIZE
+#define NETPERF_CPU_SET(cpu, cpusetp) __CPU_SET(cpu, cpusetp)
+#define NETPERF_CPU_ZERO(cpusetp) __CPU_ZERO (cpusetp)
+ typedef cpu_set_t netperf_cpu_set_t;
+#else
+#define NETPERF_CPU_SETSIZE sizeof(unsigned long)
+#define NETPERF_CPU_SET(cpu, cpusetp) *cpusetp = 1 << cpu
+#define NETPERF_CPU_ZERO(cpusetp) *cpusetp = (unsigned long)0
+ typedef unsigned long netperf_cpu_set_t;
+#endif
+
+ netperf_cpu_set_t netperf_cpu_set;
+ unsigned int len = sizeof(netperf_cpu_set);
+
+ if (mapped_affinity < 8*sizeof(netperf_cpu_set)) {
+ NETPERF_CPU_ZERO(&netperf_cpu_set);
+ NETPERF_CPU_SET(mapped_affinity,&netperf_cpu_set);
+
+ if (sched_setaffinity(getpid(), len, &netperf_cpu_set)) {
+ if (debug) {
+ fprintf(stderr, "failed to set PID %d's CPU affinity errno %d\n",
+ getpid(),errno);
+ fflush(stderr);
+ }
+ }
+ }
+ else {
+ if (debug) {
+ fprintf(stderr,
+ "CPU number larger than pre-compiled limits. Consider a recompile.\n");
+ fflush(stderr);
+ }
+ }
+
+#elif HAVE_BIND_TO_CPU_ID
+ /* this is the one for Tru64 */
+#include <sys/types.h>
+#include <sys/resource.h>
+#include <sys/processor.h>
+
+ /* really should be checking a return code one of these days. raj
+ 2005/08/31 */
+
+ bind_to_cpu_id(getpid(), mapped_affinity,0);
+
+#elif WIN32
+
+ {
+ ULONG_PTR AffinityMask;
+ ULONG_PTR ProcessAffinityMask;
+ ULONG_PTR SystemAffinityMask;
+
+ if ((mapped_affinity < 0) ||
+ (mapped_affinity > MAXIMUM_PROCESSORS)) {
+ fprintf(where,
+ "Invalid processor_affinity specified: %d\n", mapped_affinity); fflush(where);
+ return;
+ }
+
+ if (!GetProcessAffinityMask(
+ GetCurrentProcess(),
+ &ProcessAffinityMask,
+ &SystemAffinityMask))
+ {
+ perror("GetProcessAffinityMask failed");
+ fflush(stderr);
+ exit(1);
+ }
+
+ AffinityMask = (ULONG_PTR)1 << mapped_affinity;
+
+ if (AffinityMask & ProcessAffinityMask) {
+ if (!SetThreadAffinityMask( GetCurrentThread(), AffinityMask)) {
+ perror("SetThreadAffinityMask failed");
+ fflush(stderr);
+ }
+ } else if (debug) {
+ fprintf(where,
+ "Processor affinity set to CPU# %d\n", mapped_affinity);
+ fflush(where);
+ }
+ }
+
+#else
+ if (debug) {
+ fprintf(where,
+ "Processor affinity not available for this platform!\n");
+ fflush(where);
+ }
+#endif
+}
+
+
+/*
+ * Sets a socket to non-blocking operation.
+ */
+int
+set_nonblock (SOCKET sock)
+{
+#ifdef WIN32
+ unsigned long flags = 1;
+ return (ioctlsocket(sock, FIONBIO, &flags) != SOCKET_ERROR);
+#else
+ return (fcntl(sock, F_SETFL, O_NONBLOCK) != -1);
+#endif
+}
+
+
+
+ /***********************************************************************/
+ /* */
+ /* send_request() */
+ /* */
+ /* send a netperf request on the control socket to the remote half of */
+ /* the connection. to get us closer to intervendor interoperability, */
+ /* we will call htonl on each of the int that compose the message to */
+ /* be sent. the server-half of the connection will call the ntohl */
+ /* routine to undo any changes that may have been made... */
+ /* */
+ /***********************************************************************/
+
+void
+send_request()
+{
+ int counter=0;
+
+ /* display the contents of the request if the debug level is high */
+ /* enough. otherwise, just send the darned thing ;-) */
+
+ if (debug > 1) {
+ fprintf(where,"entered send_request...contents before htonl:\n");
+ dump_request();
+ }
+
+ /* pass the processor affinity request value to netserver */
+ /* this is a kludge and I know it. sgb 8/11/04 */
+
+ netperf_request.content.dummy = remote_proc_affinity;
+
+ /* put the entire request array into network order. We do this */
+ /* arbitrarily rather than trying to figure-out just how much */
+ /* of the request array contains real information. this should */
+ /* be simpler, and at any rate, the performance of sending */
+ /* control messages for this benchmark is not of any real */
+ /* concern. */
+
+ for (counter=0;counter < sizeof(netperf_request)/4; counter++) {
+ request_array[counter] = htonl(request_array[counter]);
+ }
+
+ if (debug > 1) {
+ fprintf(where,"send_request...contents after htonl:\n");
+ dump_request();
+
+ fprintf(where,
+ "\nsend_request: about to send %u bytes from %p\n",
+ sizeof(netperf_request),
+ &netperf_request);
+ fflush(where);
+ }
+
+ if (send(netlib_control,
+ (char *)&netperf_request,
+ sizeof(netperf_request),
+ 0) != sizeof(netperf_request)) {
+ perror("send_request: send call failure");
+
+ exit(1);
+ }
+}
+
+/***********************************************************************/
+ /* */
+ /* send_response() */
+ /* */
+ /* send a netperf response on the control socket to the remote half of */
+ /* the connection. to get us closer to intervendor interoperability, */
+ /* we will call htonl on each of the int that compose the message to */
+ /* be sent. the other half of the connection will call the ntohl */
+ /* routine to undo any changes that may have been made... */
+ /* */
+ /***********************************************************************/
+
+void
+send_response()
+{
+ int counter=0;
+ int bytes_sent;
+
+ /* display the contents of the request if the debug level is high */
+ /* enough. otherwise, just send the darned thing ;-) */
+
+ if (debug > 1) {
+ fprintf(where,
+ "send_response: contents of %u ints before htonl\n",
+ sizeof(netperf_response)/4);
+ dump_response();
+ }
+
+ /* put the entire response_array into network order. We do this */
+ /* arbitrarily rather than trying to figure-out just how much of the */
+ /* request array contains real information. this should be simpler, */
+ /* and at any rate, the performance of sending control messages for */
+ /* this benchmark is not of any real concern. */
+
+ for (counter=0;counter < sizeof(netperf_response)/4; counter++) {
+ response_array[counter] = htonl(response_array[counter]);
+ }
+
+ if (debug > 1) {
+ fprintf(where,
+ "send_response: contents after htonl\n");
+ dump_response();
+ fprintf(where,
+ "about to send %u bytes from %p\n",
+ sizeof(netperf_response),
+ &netperf_response);
+ fflush(where);
+ }
+
+ /*KC*/
+ if ((bytes_sent = send(server_sock,
+ (char *)&netperf_response,
+ sizeof(netperf_response),
+ 0)) != sizeof(netperf_response)) {
+ perror("send_response: send call failure");
+ fprintf(where, "BytesSent: %d\n", bytes_sent);
+ exit(1);
+ }
+
+}
+
+ /***********************************************************************/
+ /* */
+ /* recv_request() */
+ /* */
+ /* receive the remote's request on the control socket. we will put */
+ /* the entire response into host order before giving it to the */
+ /* calling routine. hopefully, this will go most of the way to */
+ /* insuring intervendor interoperability. if there are any problems, */
+ /* we will just punt the entire situation. */
+ /* */
+ /***********************************************************************/
+
+void
+recv_request()
+{
+int tot_bytes_recvd,
+ bytes_recvd,
+ bytes_left;
+char *buf = (char *)&netperf_request;
+int buflen = sizeof(netperf_request);
+int counter;
+
+tot_bytes_recvd = 0;
+ bytes_recvd = 0; /* nt_lint; bytes_recvd uninitialized if buflen == 0 */
+bytes_left = buflen;
+while ((tot_bytes_recvd != buflen) &&
+ ((bytes_recvd = recv(server_sock, buf, bytes_left,0)) > 0 )) {
+ tot_bytes_recvd += bytes_recvd;
+ buf += bytes_recvd;
+ bytes_left -= bytes_recvd;
+}
+
+/* put the request into host order */
+
+for (counter = 0; counter < sizeof(netperf_request)/sizeof(int); counter++) {
+ request_array[counter] = ntohl(request_array[counter]);
+}
+
+if (debug) {
+ fprintf(where,
+ "recv_request: received %d bytes of request.\n",
+ tot_bytes_recvd);
+ fflush(where);
+}
+
+if (bytes_recvd == SOCKET_ERROR) {
+ Print_errno(where,
+ "recv_request: error on recv");
+ fflush(where);
+ exit(1);
+}
+
+if (bytes_recvd == 0) {
+ /* the remote has shutdown the control connection, we should shut it */
+ /* down as well and exit */
+
+ if (debug) {
+ fprintf(where,
+ "recv_request: remote requested shutdown of control\n");
+ fflush(where);
+ }
+
+ if (netlib_control != INVALID_SOCKET) {
+ shutdown_control();
+ }
+ exit(0);
+}
+
+if (tot_bytes_recvd < buflen) {
+ if (debug > 1)
+ dump_request();
+
+ fprintf(where,
+ "recv_request: partial request received of %d bytes\n",
+ tot_bytes_recvd);
+ fflush(where);
+ exit(1);
+}
+
+ if (debug > 1) {
+ dump_request();
+ }
+
+ /* get the processor affinity request value from netperf */
+ /* this is a kludge and I know it. sgb 8/11/04 */
+
+ local_proc_affinity = netperf_request.content.dummy;
+
+ if (local_proc_affinity != -1) {
+ bind_to_specific_processor(local_proc_affinity,0);
+ }
+
+}
+
+ /*
+
+ recv_response_timed()
+
+ receive the remote's response on the control socket. we will put the
+ entire response into host order before giving it to the calling
+ routine. hopefully, this will go most of the way to insuring
+ intervendor interoperability. if there are any problems, we will just
+ punt the entire situation.
+
+ The call to select at the beginning is to get us out of hang
+ situations where the remote gives-up but we don't find-out about
+ it. This seems to happen only rarely, but it would be nice to be
+ somewhat robust ;-)
+
+ The "_timed" part is to allow the caller to add (or I suppose
+ subtract) from the length of timeout on the select call. this was
+ added since not all the CPU utilization mechanisms require a 40
+ second calibration, and we used to have an aribtrary 40 second sleep
+ in "calibrate_remote_cpu" - since we don't _always_ need that, we
+ want to simply add 40 seconds to the select() timeout from that call,
+ but don't want to change all the "recv_response" calls in the code
+ right away. sooo, we push the functionality of the old
+ recv_response() into a new recv_response_timed(addl_timout) call, and
+ have recv_response() call recv_response_timed(0). raj 2005-05-16
+
+ */
+
+
+void
+recv_response_timed(int addl_time)
+{
+int tot_bytes_recvd,
+ bytes_recvd = 0,
+ bytes_left;
+char *buf = (char *)&netperf_response;
+int buflen = sizeof(netperf_response);
+int counter;
+
+ /* stuff for select, use fd_set for better compliance */
+fd_set readfds;
+struct timeval timeout;
+
+tot_bytes_recvd = 0;
+bytes_left = buflen;
+
+/* zero out the response structure */
+
+/* BUG FIX SJB 2/4/93 - should be < not <= */
+for (counter = 0; counter < sizeof(netperf_response)/sizeof(int); counter++) {
+ response_array[counter] = 0;
+}
+
+ /* we only select once. it is assumed that if the response is split */
+ /* (which should not be happening, that we will receive the whole */
+ /* thing and not have a problem ;-) */
+
+FD_ZERO(&readfds);
+FD_SET(netlib_control,&readfds);
+timeout.tv_sec = 120 + addl_time; /* wait at least two minutes
+ before punting - the USE_LOOPER
+ CPU stuff may cause remote's to
+ have a bit longer time of it
+ than 60 seconds would allow.
+ triggered by fix from Jeff
+ Dwork. */
+timeout.tv_usec = 0;
+
+ /* select had better return one, or there was either a problem or a */
+ /* timeout... */
+
+if ((counter = select(FD_SETSIZE,
+ &readfds,
+ 0,
+ 0,
+ &timeout)) != 1) {
+ fprintf(where,
+ "netperf: receive_response: no response received. errno %d counter %d\n",
+ errno,
+ counter);
+ exit(1);
+}
+
+while ((tot_bytes_recvd != buflen) &&
+ ((bytes_recvd = recv(netlib_control, buf, bytes_left,0)) > 0 )) {
+ tot_bytes_recvd += bytes_recvd;
+ buf += bytes_recvd;
+ bytes_left -= bytes_recvd;
+}
+
+if (debug) {
+ fprintf(where,"recv_response: received a %d byte response\n",
+ tot_bytes_recvd);
+ fflush(where);
+}
+
+/* put the response into host order */
+
+for (counter = 0; counter < sizeof(netperf_response)/sizeof(int); counter++) {
+ response_array[counter] = ntohl(response_array[counter]);
+}
+
+if (bytes_recvd == SOCKET_ERROR) {
+ perror("recv_response");
+ exit(1);
+}
+if (tot_bytes_recvd < buflen) {
+ fprintf(stderr,
+ "recv_response: partial response received: %d bytes\n",
+ tot_bytes_recvd);
+ fflush(stderr);
+ if (debug > 1)
+ dump_response();
+ exit(1);
+}
+if (debug > 1) {
+ dump_response();
+}
+}
+
+void
+recv_response()
+{
+ recv_response_timed(0);
+}
+
+
+
+#if defined(USE_PSTAT) || defined (USE_SYSCTL)
+int
+hi_32(big_int)
+ long long *big_int;
+{
+ union overlay_u {
+ long long dword;
+ long words[2];
+ } *overlay;
+
+ overlay = (union overlay_u *)big_int;
+ /* on those systems which are byte swapped, we really wish to */
+ /* return words[1] - at least I think so - raj 4/95 */
+ if (htonl(1L) == 1L) {
+ /* we are a "normal" :) machine */
+ return(overlay->words[0]);
+ }
+ else {
+ return(overlay->words[1]);
+ }
+}
+
+int
+lo_32(big_int)
+ long long *big_int;
+{
+ union overlay_u {
+ long long dword;
+ long words[2];
+ } *overlay;
+
+ overlay = (union overlay_u *)big_int;
+ /* on those systems which are byte swapped, we really wish to */
+ /* return words[0] - at least I think so - raj 4/95 */
+ if (htonl(1L) == 1L) {
+ /* we are a "normal" :) machine */
+ return(overlay->words[1]);
+ }
+ else {
+ return(overlay->words[0]);
+ }
+}
+
+#endif /* USE_PSTAT || USE_SYSCTL */
+
+
+void libmain()
+{
+fprintf(where,"hello world\n");
+fprintf(where,"debug: %d\n",debug);
+}
+
+
+void
+set_sock_buffer (SOCKET sd, enum sock_buffer which, int requested_size, int *effective_sizep)
+{
+#ifdef SO_SNDBUF
+ int optname = (which == SEND_BUFFER) ? SO_SNDBUF : SO_RCVBUF;
+ netperf_socklen_t sock_opt_len;
+
+ /* seems that under Windows, setting a value of zero is how one
+ tells the stack you wish to enable copy-avoidance. Knuth only
+ knows what it will do on other stacks, but it might be
+ interesting to find-out, so we won't bother #ifdef'ing the change
+ to allow asking for 0 bytes. Courtesy of SAF, 2007-05 raj
+ 2007-05-31 */
+ if (requested_size >= 0) {
+ if (setsockopt(sd, SOL_SOCKET, optname,
+ (char *)&requested_size, sizeof(int)) < 0) {
+ fprintf(where, "netperf: set_sock_buffer: %s option: errno %d\n",
+ (which == SEND_BUFFER) ? "SO_SNDBUF" : "SO_RCVBUF",
+ errno);
+ fflush(where);
+ exit(1);
+ }
+ if (debug > 1) {
+ fprintf(where, "netperf: set_sock_buffer: %s of %d requested.\n",
+ (which == SEND_BUFFER) ? "SO_SNDBUF" : "SO_RCVBUF",
+ requested_size);
+ fflush(where);
+ }
+ }
+
+ /* Now, we will find-out what the size actually became, and report */
+ /* that back to the user. If the call fails, we will just report a -1 */
+ /* back to the initiator for the recv buffer size. */
+
+ sock_opt_len = sizeof(netperf_socklen_t);
+ if (getsockopt(sd, SOL_SOCKET, optname, (char *)effective_sizep,
+ &sock_opt_len) < 0) {
+ fprintf(where, "netperf: set_sock_buffer: getsockopt %s: errno %d\n",
+ (which == SEND_BUFFER) ? "SO_SNDBUF" : "SO_RCVBUF", errno);
+ fflush(where);
+ *effective_sizep = -1;
+ }
+
+ if (debug) {
+ fprintf(where, "netperf: set_sock_buffer: "
+ "%s socket size determined to be %d\n",
+ (which == SEND_BUFFER) ? "send" : "receive", *effective_sizep);
+ fflush(where);
+ }
+#else /* SO_SNDBUF */
+ *effective_size = -1;
+#endif /* SO_SNDBUF */
+}
+
+void
+dump_addrinfo(FILE *dumploc, struct addrinfo *info,
+ char *host, char *port, int family)
+{
+ struct sockaddr *ai_addr;
+ struct addrinfo *temp;
+ temp=info;
+
+ fprintf(dumploc, "getaddrinfo returned the following for host '%s' ", host);
+ fprintf(dumploc, "port '%s' ", port);
+ fprintf(dumploc, "family %s\n", inet_ftos(family));
+ while (temp) {
+ /* seems that Solaris 10 GA bits will not give a canonical name
+ for ::0 or 0.0.0.0, and their fprintf() cannot deal with a null
+ pointer, so we have to check for a null pointer. probably a
+ safe thing to do anyway, eventhough it was not necessary on
+ linux or hp-ux. raj 2005-02-09 */
+ if (temp->ai_canonname) {
+ fprintf(dumploc,
+ "\tcannonical name: '%s'\n",temp->ai_canonname);
+ }
+ else {
+ fprintf(dumploc,
+ "\tcannonical name: '%s'\n","(nil)");
+ }
+ fprintf(dumploc,
+ "\tflags: %x family: %s: socktype: %s protocol %s addrlen %d\n",
+ temp->ai_flags,
+ inet_ftos(temp->ai_family),
+ inet_ttos(temp->ai_socktype),
+ inet_ptos(temp->ai_protocol),
+ temp->ai_addrlen);
+ ai_addr = temp->ai_addr;
+ if (ai_addr != NULL) {
+ fprintf(dumploc,
+ "\tsa_family: %s sadata: %d %d %d %d %d %d\n",
+ inet_ftos(ai_addr->sa_family),
+ (u_char)ai_addr->sa_data[0],
+ (u_char)ai_addr->sa_data[1],
+ (u_char)ai_addr->sa_data[2],
+ (u_char)ai_addr->sa_data[3],
+ (u_char)ai_addr->sa_data[4],
+ (u_char)ai_addr->sa_data[5]);
+ }
+ temp = temp->ai_next;
+ }
+ fflush(dumploc);
+}
+
+/*
+ establish_control()
+
+set-up the control connection between netperf and the netserver so we
+can actually run some tests. if we cannot establish the control
+connection, that may or may not be a good thing, so we will let the
+caller decide what to do.
+
+to assist with pesky end-to-end-unfriendly things like firewalls, we
+allow the caller to specify both the remote hostname and port, and the
+local addressing info. i believe that in theory it is possible to
+have an IPv4 endpoint and an IPv6 endpoint communicate with one
+another, but for the time being, we are only going to take-in one
+requested address family parameter. this means that the only way
+(iirc) that we might get a mixed-mode connection would be if the
+address family is specified as AF_UNSPEC, and getaddrinfo() returns
+different families for the local and server names.
+
+the "names" can also be IP addresses in ASCII string form.
+
+raj 2003-02-27 */
+
+SOCKET
+establish_control_internal(char *hostname,
+ char *port,
+ int remfam,
+ char *localhost,
+ char *localport,
+ int locfam)
+{
+ int not_connected;
+ SOCKET control_sock;
+ int count;
+ int error;
+
+ struct addrinfo hints;
+ struct addrinfo *local_res;
+ struct addrinfo *remote_res;
+ struct addrinfo *local_res_temp;
+ struct addrinfo *remote_res_temp;
+
+ if (debug) {
+ fprintf(where,
+ "establish_control called with host '%s' port '%s' remfam %s\n",
+ hostname,
+ port,
+ inet_ftos(remfam));
+ fprintf(where,
+ "\t\tlocal '%s' port '%s' locfam %s\n",
+ localhost,
+ localport,
+ inet_ftos(locfam));
+ fflush(where);
+ }
+
+ /* first, we do the remote */
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = remfam;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_protocol = IPPROTO_TCP;
+ hints.ai_flags = 0|AI_CANONNAME;
+ count = 0;
+ do {
+ error = getaddrinfo((char *)hostname,
+ (char *)port,
+ &hints,
+ &remote_res);
+ count += 1;
+ if (error == EAI_AGAIN) {
+ if (debug) {
+ fprintf(where,"Sleeping on getaddrinfo EAI_AGAIN\n");
+ fflush(where);
+ }
+ sleep(1);
+ }
+ } while ((error == EAI_AGAIN) && (count <= 5));
+
+ if (error) {
+ printf("establish control: could not resolve remote '%s' port '%s' af %s",
+ hostname,
+ port,
+ inet_ftos(remfam));
+ printf("\n\tgetaddrinfo returned %d %s\n",
+ error,
+ gai_strerror(error));
+ return(INVALID_SOCKET);
+ }
+
+ if (debug) {
+ dump_addrinfo(where, remote_res, hostname, port, remfam);
+ }
+
+ /* now we do the local */
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = locfam;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_protocol = IPPROTO_TCP;
+ hints.ai_flags = AI_PASSIVE|AI_CANONNAME;
+ count = 0;
+ do {
+ count += 1;
+ error = getaddrinfo((char *)localhost,
+ (char *)localport,
+ &hints,
+ &local_res);
+ if (error == EAI_AGAIN) {
+ if (debug) {
+ fprintf(where,
+ "Sleeping on getaddrinfo(%s,%s) EAI_AGAIN count %d \n",
+ localhost,
+ localport,
+ count);
+ fflush(where);
+ }
+ sleep(1);
+ }
+ } while ((error == EAI_AGAIN) && (count <= 5));
+
+ if (error) {
+ printf("establish control: could not resolve local '%s' port '%s' af %s",
+ localhost,
+ localport,
+ inet_ftos(locfam));
+ printf("\n\tgetaddrinfo returned %d %s\n",
+ error,
+ gai_strerror(error));
+ return(INVALID_SOCKET);
+ }
+
+ if (debug) {
+ dump_addrinfo(where, local_res, localhost, localport, locfam);
+ }
+
+ not_connected = 1;
+ local_res_temp = local_res;
+ remote_res_temp = remote_res;
+ /* we want to loop through all the possibilities. looping on the
+ local addresses will be handled within the while loop. I suppose
+ these is some more "C-expert" way to code this, but it has not
+ lept to mind just yet :) raj 2003-02024 */
+
+ while (remote_res_temp != NULL) {
+
+ /* I am guessing that we should use the address family of the
+ local endpoint, and we will not worry about mixed family types
+ - presumeably the stack or other transition mechanisms will be
+ able to deal with that for us. famous last words :) raj 2003-02-26 */
+ control_sock = socket(local_res_temp->ai_family,
+ SOCK_STREAM,
+ 0);
+ if (control_sock == INVALID_SOCKET) {
+ /* at some point we'll need a more generic "display error"
+ message for when/if we use GUIs and the like. unlike a bind
+ or connect failure, failure to allocate a socket is
+ "immediately fatal" and so we return to the caller. raj 2003-02-24 */
+ if (debug) {
+ perror("establish_control: unable to allocate control socket");
+ }
+ return(INVALID_SOCKET);
+ }
+
+ /* if we are going to control the local enpoint addressing, we
+ need to call bind. of course, we should probably be setting one
+ of the SO_REUSEmumble socket options? raj 2005-02-04 */
+ if (bind(control_sock,
+ local_res_temp->ai_addr,
+ local_res_temp->ai_addrlen) == 0) {
+ if (debug) {
+ fprintf(where,
+ "bound control socket to %s and %s\n",
+ localhost,
+ localport);
+ }
+
+ if (connect(control_sock,
+ remote_res_temp->ai_addr,
+ remote_res_temp->ai_addrlen) == 0) {
+ /* we have successfully connected to the remote netserver */
+ if (debug) {
+ fprintf(where,
+ "successful connection to remote netserver at %s and %s\n",
+ hostname,
+ port);
+ }
+ not_connected = 0;
+ /* this should get us out of the while loop */
+ break;
+ } else {
+ /* the connect call failed */
+ if (debug) {
+ fprintf(where,
+ "establish_control: connect failed, errno %d %s\n",
+ errno,
+ strerror(errno));
+ fprintf(where, " trying next address combination\n");
+ fflush(where);
+ }
+ }
+ }
+ else {
+ /* the bind failed */
+ if (debug) {
+ fprintf(where,
+ "establish_control: bind failed, errno %d %s\n",
+ errno,
+ strerror(errno));
+ fprintf(where, " trying next address combination\n");
+ fflush(where);
+ }
+ }
+
+ if ((local_res_temp = local_res_temp->ai_next) == NULL) {
+ /* wrap the local and move to the next server, don't forget to
+ close the current control socket. raj 2003-02-24 */
+ local_res_temp = local_res;
+ /* the outer while conditions will deal with the case when we
+ get to the end of all the possible remote addresses. */
+ remote_res_temp = remote_res_temp->ai_next;
+ /* it is simplest here to just close the control sock. since
+ this is not a performance critical section of code, we
+ don't worry about overheads for socket allocation or
+ close. raj 2003-02-24 */
+ }
+ close(control_sock);
+ }
+
+ /* we no longer need the addrinfo stuff */
+ freeaddrinfo(local_res);
+ freeaddrinfo(remote_res);
+
+ /* so, we are either connected or not */
+ if (not_connected) {
+ fprintf(where, "establish control: are you sure there is a netserver listening on %s at port %s?\n",hostname,port);
+ fflush(where);
+ return(INVALID_SOCKET);
+ }
+ /* at this point, we are connected. we probably want some sort of
+ version check with the remote at some point. raj 2003-02-24 */
+ return(control_sock);
+}
+
+void
+establish_control(char *hostname,
+ char *port,
+ int remfam,
+ char *localhost,
+ char *localport,
+ int locfam)
+
+{
+
+ netlib_control = establish_control_internal(hostname,
+ port,
+ remfam,
+ localhost,
+ localport,
+ locfam);
+ if (netlib_control == INVALID_SOCKET) {
+ fprintf(where,
+ "establish_control could not establish the control connection from %s port %s address family %s to %s port %s address family %s\n",
+ localhost,localport,inet_ftos(locfam),
+ hostname,port,inet_ftos(remfam));
+ fflush(where);
+ exit(INVALID_SOCKET);
+ }
+}
+
+
+
+
+ /***********************************************************************/
+ /* */
+ /* get_id() */
+ /* */
+ /* Return a string to the calling routine that contains the */
+ /* identifying information for the host we are running on. This */
+ /* information will then either be displayed locally, or returned to */
+ /* a remote caller for display there. */
+ /* */
+ /***********************************************************************/
+
+char *
+get_id()
+{
+ static char id_string[80];
+#ifdef WIN32
+char system_name[MAX_COMPUTERNAME_LENGTH+1] ;
+DWORD name_len = MAX_COMPUTERNAME_LENGTH + 1 ;
+#else
+struct utsname system_name;
+#endif /* WIN32 */
+
+#ifdef WIN32
+ SYSTEM_INFO SystemInfo;
+ GetSystemInfo( &SystemInfo ) ;
+ if ( !GetComputerName(system_name , &name_len) )
+ strcpy(system_name , "no_name") ;
+#else
+ if (uname(&system_name) <0) {
+ perror("identify_local: uname");
+ exit(1);
+ }
+#endif /* WIN32 */
+
+ snprintf(id_string, sizeof(id_string),
+#ifdef WIN32
+ "%-15s%-15s%d.%d%d",
+ "Windows NT",
+ system_name ,
+ GetVersion() & 0xFF ,
+ GetVersion() & 0xFF00 ,
+ SystemInfo.dwProcessorType
+
+#else
+ "%-15s%-15s%-15s%-15s%-15s",
+ system_name.sysname,
+ system_name.nodename,
+ system_name.release,
+ system_name.version,
+ system_name.machine
+#endif /* WIN32 */
+ );
+ return (id_string);
+}
+
+
+ /***********************************************************************/
+ /* */
+ /* identify_local() */
+ /* */
+ /* Display identifying information about the local host to the user. */
+ /* At first release, this information will be the same as that which */
+ /* is returned by the uname -a command, with the exception of the */
+ /* idnumber field, which seems to be a non-POSIX item, and hence */
+ /* non-portable. */
+ /* */
+ /***********************************************************************/
+
+void
+identify_local()
+{
+
+char *local_id;
+
+local_id = get_id();
+
+fprintf(where,"Local Information \n\
+Sysname Nodename Release Version Machine\n");
+
+fprintf(where,"%s\n",
+ local_id);
+
+}
+
+
+ /***********************************************************************/
+ /* */
+ /* identify_remote() */
+ /* */
+ /* Display identifying information about the remote host to the user. */
+ /* At first release, this information will be the same as that which */
+ /* is returned by the uname -a command, with the exception of the */
+ /* idnumber field, which seems to be a non-POSIX item, and hence */
+ /* non-portable. A request is sent to the remote side, which will */
+ /* return a string containing the utsname information in a */
+ /* pre-formatted form, which is then displayed after the header. */
+ /* */
+ /***********************************************************************/
+
+void
+identify_remote()
+{
+
+char *remote_id="";
+
+/* send a request for node info to the remote */
+netperf_request.content.request_type = NODE_IDENTIFY;
+
+send_request();
+
+/* and now wait for the reply to come back */
+
+recv_response();
+
+if (netperf_response.content.serv_errno) {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("identify_remote: on remote");
+ exit(1);
+}
+
+fprintf(where,"Remote Information \n\
+Sysname Nodename Release Version Machine\n");
+
+fprintf(where,"%s",
+ remote_id);
+}
+
+void
+cpu_start(int measure_cpu)
+{
+
+ gettimeofday(&time1,
+ &tz);
+
+ if (measure_cpu) {
+ cpu_util_init();
+ measuring_cpu = 1;
+ cpu_method = get_cpu_method();
+ cpu_start_internal();
+ }
+}
+
+
+void
+cpu_stop(int measure_cpu, float *elapsed)
+
+{
+
+ int sec,
+ usec;
+
+ if (measure_cpu) {
+ cpu_stop_internal();
+ cpu_util_terminate();
+ }
+
+ gettimeofday(&time2,
+ &tz);
+
+ if (time2.tv_usec < time1.tv_usec) {
+ time2.tv_usec += 1000000;
+ time2.tv_sec -= 1;
+ }
+
+ sec = time2.tv_sec - time1.tv_sec;
+ usec = time2.tv_usec - time1.tv_usec;
+ lib_elapsed = (float)sec + ((float)usec/(float)1000000.0);
+
+ *elapsed = lib_elapsed;
+
+}
+
+
+double
+calc_thruput_interval(double units_received,double elapsed)
+
+{
+ double divisor;
+
+ /* We will calculate the thruput in libfmt units/second */
+ switch (libfmt) {
+ case 'K':
+ divisor = 1024.0;
+ break;
+ case 'M':
+ divisor = 1024.0 * 1024.0;
+ break;
+ case 'G':
+ divisor = 1024.0 * 1024.0 * 1024.0;
+ break;
+ case 'k':
+ divisor = 1000.0 / 8.0;
+ break;
+ case 'm':
+ divisor = 1000.0 * 1000.0 / 8.0;
+ break;
+ case 'g':
+ divisor = 1000.0 * 1000.0 * 1000.0 / 8.0;
+ break;
+
+ default:
+ divisor = 1024.0;
+ }
+
+ return (units_received / divisor / elapsed);
+
+}
+
+double
+calc_thruput(double units_received)
+
+{
+ return(calc_thruput_interval(units_received,lib_elapsed));
+}
+
+/* these "_omni" versions are ones which understand 'x' as a unit,
+ meaning transactions/s. we have a separate routine rather than
+ convert the existing routine so we don't have to go and change
+ _all_ the nettest_foo.c files at one time. raj 2007-06-08 */
+
+double
+calc_thruput_interval_omni(double units_received,double elapsed)
+
+{
+ double divisor;
+
+ /* We will calculate the thruput in libfmt units/second */
+ switch (libfmt) {
+ case 'K':
+ divisor = 1024.0;
+ break;
+ case 'M':
+ divisor = 1024.0 * 1024.0;
+ break;
+ case 'G':
+ divisor = 1024.0 * 1024.0 * 1024.0;
+ break;
+ case 'k':
+ divisor = 1000.0 / 8.0;
+ break;
+ case 'm':
+ divisor = 1000.0 * 1000.0 / 8.0;
+ break;
+ case 'g':
+ divisor = 1000.0 * 1000.0 * 1000.0 / 8.0;
+ break;
+ case 'x':
+ divisor = 1.0;
+ break;
+
+ default:
+ fprintf(where,
+ "WARNING calc_throughput_internal_omni: unknown units %c\n",
+ libfmt);
+ fflush(where);
+ divisor = 1024.0;
+ }
+
+ return (units_received / divisor / elapsed);
+
+}
+
+double
+calc_thruput_omni(double units_received)
+
+{
+ return(calc_thruput_interval_omni(units_received,lib_elapsed));
+}
+
+
+
+
+
+float
+calc_cpu_util(float elapsed_time)
+{
+ return(calc_cpu_util_internal(elapsed_time));
+}
+
+float
+calc_service_demand_internal(double unit_divisor,
+ double units_sent,
+ float elapsed_time,
+ float cpu_utilization,
+ int num_cpus)
+
+{
+
+ double service_demand;
+ double thruput;
+
+ if (debug) {
+ fprintf(where,"calc_service_demand called: units_sent = %f\n",
+ units_sent);
+ fprintf(where," elapsed_time = %f\n",
+ elapsed_time);
+ fprintf(where," cpu_util = %f\n",
+ cpu_utilization);
+ fprintf(where," num cpu = %d\n",
+ num_cpus);
+ fflush(where);
+ }
+
+ if (num_cpus == 0) num_cpus = lib_num_loc_cpus;
+
+ if (elapsed_time == 0.0) {
+ elapsed_time = lib_elapsed;
+ }
+ if (cpu_utilization == 0.0) {
+ cpu_utilization = lib_local_cpu_util;
+ }
+
+ thruput = (units_sent /
+ (double) unit_divisor /
+ (double) elapsed_time);
+
+ /* on MP systems, it is necessary to multiply the service demand by */
+ /* the number of CPU's. at least, I believe that to be the case:) */
+ /* raj 10/95 */
+
+ /* thruput has a "per second" component. if we were using 100% ( */
+ /* 100.0) of the CPU in a second, that would be 1 second, or 1 */
+ /* millisecond, so we multiply cpu_utilization by 10 to go to */
+ /* milliseconds, or 10,000 to go to micro seconds. With revision */
+ /* 2.1, the service demand measure goes to microseconds per unit. */
+ /* raj 12/95 */
+ service_demand = (cpu_utilization*10000.0/thruput) *
+ (float) num_cpus;
+
+ if (debug) {
+ fprintf(where,"calc_service_demand using: units_sent = %f\n",
+ units_sent);
+ fprintf(where," elapsed_time = %f\n",
+ elapsed_time);
+ fprintf(where," cpu_util = %f\n",
+ cpu_utilization);
+ fprintf(where," num cpu = %d\n",
+ num_cpus);
+ fprintf(where,"calc_service_demand got: thruput = %f\n",
+ thruput);
+ fprintf(where," servdem = %f\n",
+ service_demand);
+ fflush(where);
+ }
+ return (float)service_demand;
+}
+
+float calc_service_demand(double units_sent,
+ float elapsed_time,
+ float cpu_utilization,
+ int num_cpus)
+
+{
+
+ double unit_divisor = (double)1024.0;
+
+ return(calc_service_demand_internal(unit_divisor,
+ units_sent,
+ elapsed_time,
+ cpu_utilization,
+ num_cpus));
+}
+
+float calc_service_demand_trans(double units_sent,
+ float elapsed_time,
+ float cpu_utilization,
+ int num_cpus)
+
+{
+
+ double unit_divisor = (double)1.0;
+
+ return(calc_service_demand_internal(unit_divisor,
+ units_sent,
+ elapsed_time,
+ cpu_utilization,
+ num_cpus));
+}
+
+
+
+float
+calibrate_local_cpu(float local_cpu_rate)
+{
+
+ lib_num_loc_cpus = get_num_cpus();
+
+ lib_use_idle = 0;
+#ifdef USE_LOOPER
+ cpu_util_init();
+ lib_use_idle = 1;
+#endif /* USE_LOOPER */
+
+ if (local_cpu_rate > 0) {
+ /* The user think that he knows what the cpu rate is. We assume */
+ /* that all the processors of an MP system are essentially the */
+ /* same - for this reason we do not have a per processor maxrate. */
+ /* if the machine has processors which are different in */
+ /* performance, the CPU utilization will be skewed. raj 4/95 */
+ lib_local_maxrate = local_cpu_rate;
+ }
+ else {
+ /* if neither USE_LOOPER nor USE_PSTAT are defined, we return a */
+ /* 0.0 to indicate that times or getrusage should be used. raj */
+ /* 4/95 */
+ lib_local_maxrate = (float)0.0;
+#if defined(USE_PROC_STAT) || defined(USE_LOOPER) || defined(USE_PSTAT) || defined(USE_KSTAT) || defined(USE_PERFSTAT) || defined(USE_SYSCTL)
+ lib_local_maxrate = calibrate_idle_rate(4,10);
+#endif
+ }
+ return lib_local_maxrate;
+}
+
+
+float
+calibrate_remote_cpu()
+{
+ float remrate;
+
+ netperf_request.content.request_type = CPU_CALIBRATE;
+ send_request();
+ /* we know that calibration will last at least 40 seconds, so go to */
+ /* sleep for that long so the 60 second select in recv_response will */
+ /* not pop. raj 7/95 */
+
+ /* we know that CPU calibration may last as long as 40 seconds, so
+ make sure we "select" for at least that long while looking for
+ the response. raj 2005-05-16 */
+ recv_response_timed(40);
+
+ if (netperf_response.content.serv_errno) {
+ /* initially, silently ignore remote errors and pass */
+ /* back a zero to the caller this should allow us to */
+ /* mix rev 1.0 and rev 1.1 netperfs... */
+ return((float)0.0);
+ }
+ else {
+ /* the rate is the first word of the test_specific data */
+ bcopy((char *)netperf_response.content.test_specific_data,
+ (char *)&remrate,
+ sizeof(remrate));
+ bcopy((char *)netperf_response.content.test_specific_data + sizeof(remrate),
+ (char *)&lib_num_rem_cpus,
+ sizeof(lib_num_rem_cpus));
+/* remrate = (float) netperf_response.content.test_specific_data[0]; */
+ return(remrate);
+ }
+}
+
+#ifndef WIN32
+/* WIN32 requires that at least one of the file sets to select be non-null. */
+/* Since msec_sleep routine is only called by nettest_dlpi & nettest_unix, */
+/* let's duck this issue. */
+
+int
+msec_sleep( int msecs )
+{
+ int rval ;
+
+ struct timeval timeout;
+
+ timeout.tv_sec = msecs / 1000;
+ timeout.tv_usec = (msecs - (msecs/1000) *1000) * 1000;
+ if ((rval = select(0,
+ 0,
+ 0,
+ 0,
+ &timeout))) {
+ if ( SOCKET_EINTR(rval) ) {
+ return(1);
+ }
+ perror("msec_sleep: select");
+ exit(1);
+ }
+ return(0);
+}
+#endif /* WIN32 */
+
+#ifdef WANT_HISTOGRAM
+/* hist.c
+
+ Given a time difference in microseconds, increment one of 61
+ different buckets:
+
+ 0 - 9 in increments of 1 usec
+ 0 - 9 in increments of 10 usecs
+ 0 - 9 in increments of 100 usecs
+ 1 - 9 in increments of 1 msec
+ 1 - 9 in increments of 10 msecs
+ 1 - 9 in increments of 100 msecs
+ 1 - 9 in increments of 1 sec
+ 1 - 9 in increments of 10 sec
+ > 100 secs
+
+ This will allow any time to be recorded to within an accuracy of
+ 10%, and provides a compact representation for capturing the
+ distribution of a large number of time differences (e.g.
+ request-response latencies).
+
+ Colin Low 10/6/93
+ Rick Jones 2004-06-15 extend to unit and ten usecs
+*/
+
+/* #include "sys.h" */
+
+/*#define HIST_TEST*/
+
+HIST
+HIST_new(void){
+ HIST h;
+ if((h = (HIST) malloc(sizeof(struct histogram_struct))) == NULL) {
+ perror("HIST_new - malloc failed");
+ exit(1);
+ }
+ HIST_clear(h);
+ return h;
+}
+
+void
+HIST_clear(HIST h){
+ int i;
+ for(i = 0; i < 10; i++){
+ h->unit_usec[i] = 0;
+ h->ten_usec[i] = 0;
+ h->hundred_usec[i] = 0;
+ h->unit_msec[i] = 0;
+ h->ten_msec[i] = 0;
+ h->hundred_msec[i] = 0;
+ h->unit_sec[i] = 0;
+ h->ten_sec[i] = 0;
+ }
+ h->ridiculous = 0;
+ h->total = 0;
+}
+
+void
+HIST_add(register HIST h, int time_delta){
+ register int val;
+ h->total++;
+ val = time_delta;
+ if(val <= 9) h->unit_usec[val]++;
+ else {
+ val = val/10;
+ if(val <= 9) h->ten_usec[val]++;
+ else {
+ val = val/10;
+ if(val <= 9) h->hundred_usec[val]++;
+ else {
+ val = val/10;
+ if(val <= 9) h->unit_msec[val]++;
+ else {
+ val = val/10;
+ if(val <= 9) h->ten_msec[val]++;
+ else {
+ val = val/10;
+ if(val <= 9) h->hundred_msec[val]++;
+ else {
+ val = val/10;
+ if(val <= 9) h->unit_sec[val]++;
+ else {
+ val = val/10;
+ if(val <= 9) h->ten_sec[val]++;
+ else h->ridiculous++;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+#define RB_printf printf
+
+void
+output_row(FILE *fd, char *title, int *row){
+ register int i;
+ RB_printf("%s", title);
+ for(i = 0; i < 10; i++) RB_printf(": %4d", row[i]);
+ RB_printf("\n");
+}
+
+int
+sum_row(int *row) {
+ int sum = 0;
+ int i;
+ for (i = 0; i < 10; i++) sum += row[i];
+ return(sum);
+}
+
+void
+HIST_report(HIST h){
+#ifndef OLD_HISTOGRAM
+ output_row(stdout, "UNIT_USEC ", h->unit_usec);
+ output_row(stdout, "TEN_USEC ", h->ten_usec);
+ output_row(stdout, "HUNDRED_USEC ", h->hundred_usec);
+#else
+ h->hundred_usec[0] += sum_row(h->unit_usec);
+ h->hundred_usec[0] += sum_row(h->ten_usec);
+ output_row(stdout, "TENTH_MSEC ", h->hundred_usec);
+#endif
+ output_row(stdout, "UNIT_MSEC ", h->unit_msec);
+ output_row(stdout, "TEN_MSEC ", h->ten_msec);
+ output_row(stdout, "HUNDRED_MSEC ", h->hundred_msec);
+ output_row(stdout, "UNIT_SEC ", h->unit_sec);
+ output_row(stdout, "TEN_SEC ", h->ten_sec);
+ RB_printf(">100_SECS: %d\n", h->ridiculous);
+ RB_printf("HIST_TOTAL: %d\n", h->total);
+}
+
+#endif
+
+/* with the advent of sit-and-spin intervals support, we might as well
+ make these things available all the time, not just for demo or
+ histogram modes. raj 2006-02-06 */
+#ifdef HAVE_GETHRTIME
+
+void
+HIST_timestamp(hrtime_t *timestamp)
+{
+ *timestamp = gethrtime();
+}
+
+int
+delta_micro(hrtime_t *begin, hrtime_t *end)
+{
+ long nsecs;
+ nsecs = (*end) - (*begin);
+ return(nsecs/1000);
+}
+
+#elif defined(HAVE_GET_HRT)
+#include "hrt.h"
+
+void
+HIST_timestamp(hrt_t *timestamp)
+{
+ *timestamp = get_hrt();
+}
+
+int
+delta_micro(hrt_t *begin, hrt_t *end)
+{
+
+ return((int)get_hrt_delta(*end,*begin));
+
+}
+#elif defined(WIN32)
+void HIST_timestamp(LARGE_INTEGER *timestamp)
+{
+ QueryPerformanceCounter(timestamp);
+}
+
+int delta_micro(LARGE_INTEGER *begin, LARGE_INTEGER *end)
+{
+ LARGE_INTEGER DeltaTimestamp;
+ static LARGE_INTEGER TickHz = {0,0};
+
+ if (TickHz.QuadPart == 0)
+ {
+ QueryPerformanceFrequency(&TickHz);
+ }
+
+ /*+*+ Rick; this will overflow after ~2000 seconds, is that
+ good enough? Spencer: Yes, that should be more than good
+ enough for histogram support */
+
+ DeltaTimestamp.QuadPart = (end->QuadPart - begin->QuadPart) *
+ 1000000/TickHz.QuadPart;
+ assert((DeltaTimestamp.HighPart == 0) &&
+ ((int)DeltaTimestamp.LowPart >= 0));
+
+ return (int)DeltaTimestamp.LowPart;
+}
+
+#else
+
+void
+HIST_timestamp(struct timeval *timestamp)
+{
+ gettimeofday(timestamp,NULL);
+}
+
+ /* return the difference (in micro seconds) between two timeval */
+ /* timestamps */
+int
+delta_micro(struct timeval *begin,struct timeval *end)
+
+{
+
+ int usecs, secs;
+
+ if (end->tv_usec < begin->tv_usec) {
+ /* borrow a second from the tv_sec */
+ end->tv_usec += 1000000;
+ end->tv_sec--;
+ }
+ usecs = end->tv_usec - begin->tv_usec;
+ secs = end->tv_sec - begin->tv_sec;
+
+ usecs += (secs * 1000000);
+
+ return(usecs);
+
+}
+#endif /* HAVE_GETHRTIME */
+
+
+#ifdef WANT_DLPI
+
+int
+put_control(fd, len, pri, ack)
+ int fd, len, pri, ack;
+{
+ int error;
+ int flags = 0;
+ dl_error_ack_t *err_ack = (dl_error_ack_t *)control_data;
+
+ control_message.len = len;
+
+ if ((error = putmsg(fd, &control_message, 0, pri)) < 0 ) {
+ fprintf(where,"put_control: putmsg error %d\n",error);
+ fflush(where);
+ return(-1);
+ }
+ if ((error = getmsg(fd, &control_message, 0, &flags)) < 0) {
+ fprintf(where,"put_control: getsmg error %d\n",error);
+ fflush(where);
+ return(-1);
+ }
+ if (err_ack->dl_primitive != ack) {
+ fprintf(where,"put_control: acknowledgement error wanted %u got %u \n",
+ ack,err_ack->dl_primitive);
+ if (err_ack->dl_primitive == DL_ERROR_ACK) {
+ fprintf(where," dl_error_primitive: %u\n",
+ err_ack->dl_error_primitive);
+ fprintf(where," dl_errno: %u\n",
+ err_ack->dl_errno);
+ fprintf(where," dl_unix_errno %u\n",
+ err_ack->dl_unix_errno);
+ }
+ fflush(where);
+ return(-1);
+ }
+
+ return(0);
+}
+
+int
+dl_open(char devfile[], int ppa)
+{
+ int fd;
+ dl_attach_req_t *attach_req = (dl_attach_req_t *)control_data;
+
+ if ((fd = open(devfile, O_RDWR)) == -1) {
+ fprintf(where,"netperf: dl_open: open of %s failed, errno = %d\n",
+ devfile,
+ errno);
+ return(-1);
+ }
+
+ attach_req->dl_primitive = DL_ATTACH_REQ;
+ attach_req->dl_ppa = ppa;
+
+ if (put_control(fd, sizeof(dl_attach_req_t), 0, DL_OK_ACK) < 0) {
+ fprintf(where,
+ "netperf: dl_open: could not send control message, errno = %d\n",
+ errno);
+ return(-1);
+ }
+ return(fd);
+}
+
+int
+dl_bind(int fd, int sap, int mode, char *dlsap_ptr, int *dlsap_len)
+{
+ dl_bind_req_t *bind_req = (dl_bind_req_t *)control_data;
+ dl_bind_ack_t *bind_ack = (dl_bind_ack_t *)control_data;
+
+ bind_req->dl_primitive = DL_BIND_REQ;
+ bind_req->dl_sap = sap;
+ bind_req->dl_max_conind = 1;
+ bind_req->dl_service_mode = mode;
+ bind_req->dl_conn_mgmt = 0;
+ bind_req->dl_xidtest_flg = 0;
+
+ if (put_control(fd, sizeof(dl_bind_req_t), 0, DL_BIND_ACK) < 0) {
+ fprintf(where,
+ "netperf: dl_bind: could not send control message, errno = %d\n",
+ errno);
+ return(-1);
+ }
+
+ /* at this point, the control_data portion of the control message */
+ /* structure should contain a DL_BIND_ACK, which will have a full */
+ /* DLSAP in it. we want to extract this and pass it up so that */
+ /* it can be passed around. */
+ if (*dlsap_len >= bind_ack->dl_addr_length) {
+ bcopy((char *)bind_ack+bind_ack->dl_addr_offset,
+ dlsap_ptr,
+ bind_ack->dl_addr_length);
+ *dlsap_len = bind_ack->dl_addr_length;
+ return(0);
+ }
+ else {
+ return (-1);
+ }
+}
+
+int
+dl_connect(int fd, unsigned char *remote_addr, int remote_addr_len)
+{
+ dl_connect_req_t *connection_req = (dl_connect_req_t *)control_data;
+ dl_connect_con_t *connection_con = (dl_connect_con_t *)control_data;
+ struct pollfd pinfo;
+
+ int flags = 0;
+
+ /* this is here on the off chance that we really want some data */
+ u_long data_area[512];
+ struct strbuf data_message;
+
+ int error;
+
+ data_message.maxlen = 2048;
+ data_message.len = 0;
+ data_message.buf = (char *)data_area;
+
+ connection_req->dl_primitive = DL_CONNECT_REQ;
+ connection_req->dl_dest_addr_length = remote_addr_len;
+ connection_req->dl_dest_addr_offset = sizeof(dl_connect_req_t);
+ connection_req->dl_qos_length = 0;
+ connection_req->dl_qos_offset = 0;
+ bcopy (remote_addr,
+ (unsigned char *)control_data + sizeof(dl_connect_req_t),
+ remote_addr_len);
+
+ /* well, I would call the put_control routine here, but the sequence */
+ /* of connection stuff with DLPI is a bit screwey with all this */
+ /* message passing - Toto, I don't think were in Berkeley anymore. */
+
+ control_message.len = sizeof(dl_connect_req_t) + remote_addr_len;
+ if ((error = putmsg(fd,&control_message,0,0)) !=0) {
+ fprintf(where,"dl_connect: putmsg failure, errno = %d, error 0x%x \n",
+ errno,error);
+ fflush(where);
+ return(-1);
+ };
+
+ pinfo.fd = fd;
+ pinfo.events = POLLIN | POLLPRI;
+ pinfo.revents = 0;
+
+ if ((error = getmsg(fd,&control_message,&data_message,&flags)) != 0) {
+ fprintf(where,"dl_connect: getmsg failure, errno = %d, error 0x%x \n",
+ errno,error);
+ fflush(where);
+ return(-1);
+ }
+ while (control_data[0] == DL_TEST_CON) {
+ /* i suppose we spin until we get an error, or a connection */
+ /* indication */
+ if((error = getmsg(fd,&control_message,&data_message,&flags)) !=0) {
+ fprintf(where,"dl_connect: getmsg failure, errno = %d, error = 0x%x\n",
+ errno,error);
+ fflush(where);
+ return(-1);
+ }
+ }
+
+ /* we are out - it either worked or it didn't - which was it? */
+ if (control_data[0] == DL_CONNECT_CON) {
+ return(0);
+ }
+ else {
+ return(-1);
+ }
+}
+
+int
+dl_accept(fd, remote_addr, remote_addr_len)
+ int fd;
+ unsigned char *remote_addr;
+ int remote_addr_len;
+{
+ dl_connect_ind_t *connect_ind = (dl_connect_ind_t *)control_data;
+ dl_connect_res_t *connect_res = (dl_connect_res_t *)control_data;
+ int tmp_cor;
+ int flags = 0;
+
+ /* hang around and wait for a connection request */
+ getmsg(fd,&control_message,0,&flags);
+ while (control_data[0] != DL_CONNECT_IND) {
+ getmsg(fd,&control_message,0,&flags);
+ }
+
+ /* now respond to the request. at some point, we may want to be sure */
+ /* that the connection came from the correct station address, but */
+ /* will assume that we do not have to worry about it just now. */
+
+ tmp_cor = connect_ind->dl_correlation;
+
+ connect_res->dl_primitive = DL_CONNECT_RES;
+ connect_res->dl_correlation = tmp_cor;
+ connect_res->dl_resp_token = 0;
+ connect_res->dl_qos_length = 0;
+ connect_res->dl_qos_offset = 0;
+ connect_res->dl_growth = 0;
+
+ return(put_control(fd, sizeof(dl_connect_res_t), 0, DL_OK_ACK));
+
+}
+
+int
+dl_set_window(fd, window)
+ int fd, window;
+{
+ return(0);
+}
+
+void
+dl_stats(fd)
+ int fd;
+{
+}
+
+int
+dl_send_disc(fd)
+ int fd;
+{
+}
+
+int
+dl_recv_disc(fd)
+ int fd;
+{
+}
+#endif /* WANT_DLPI*/
+
+ /* these routines for confidence intervals are courtesy of IBM. They */
+ /* have been modified slightly for more general usage beyond TCP/UDP */
+ /* tests. raj 11/94 I would suspect that this code carries an IBM */
+ /* copyright that is much the same as that for the original HP */
+ /* netperf code */
+int confidence_iterations; /* for iterations */
+
+double
+ result_confid=-10.0,
+ loc_cpu_confid=-10.0,
+ rem_cpu_confid=-10.0,
+
+ measured_sum_result=0.0,
+ measured_square_sum_result=0.0,
+ measured_mean_result=0.0,
+ measured_var_result=0.0,
+
+ measured_sum_local_cpu=0.0,
+ measured_square_sum_local_cpu=0.0,
+ measured_mean_local_cpu=0.0,
+ measured_var_local_cpu=0.0,
+
+ measured_sum_remote_cpu=0.0,
+ measured_square_sum_remote_cpu=0.0,
+ measured_mean_remote_cpu=0.0,
+ measured_var_remote_cpu=0.0,
+
+ measured_sum_local_service_demand=0.0,
+ measured_square_sum_local_service_demand=0.0,
+ measured_mean_local_service_demand=0.0,
+ measured_var_local_service_demand=0.0,
+
+ measured_sum_remote_service_demand=0.0,
+ measured_square_sum_remote_service_demand=0.0,
+ measured_mean_remote_service_demand=0.0,
+ measured_var_remote_service_demand=0.0,
+
+ measured_sum_local_time=0.0,
+ measured_square_sum_local_time=0.0,
+ measured_mean_local_time=0.0,
+ measured_var_local_time=0.0,
+
+ measured_mean_remote_time=0.0,
+
+ measured_fails,
+ measured_local_results,
+ confidence=-10.0;
+/* interval=0.1; */
+
+/************************************************************************/
+/* */
+/* Constants for Confidence Intervals */
+/* */
+/************************************************************************/
+void
+init_stat()
+{
+ measured_sum_result=0.0;
+ measured_square_sum_result=0.0;
+ measured_mean_result=0.0;
+ measured_var_result=0.0;
+
+ measured_sum_local_cpu=0.0;
+ measured_square_sum_local_cpu=0.0;
+ measured_mean_local_cpu=0.0;
+ measured_var_local_cpu=0.0;
+
+ measured_sum_remote_cpu=0.0;
+ measured_square_sum_remote_cpu=0.0;
+ measured_mean_remote_cpu=0.0;
+ measured_var_remote_cpu=0.0;
+
+ measured_sum_local_service_demand=0.0;
+ measured_square_sum_local_service_demand=0.0;
+ measured_mean_local_service_demand=0.0;
+ measured_var_local_service_demand=0.0;
+
+ measured_sum_remote_service_demand=0.0;
+ measured_square_sum_remote_service_demand=0.0;
+ measured_mean_remote_service_demand=0.0;
+ measured_var_remote_service_demand=0.0;
+
+ measured_sum_local_time=0.0;
+ measured_square_sum_local_time=0.0;
+ measured_mean_local_time=0.0;
+ measured_var_local_time=0.0;
+
+ measured_mean_remote_time=0.0;
+
+ measured_fails = 0.0;
+ measured_local_results=0.0,
+ confidence=-10.0;
+}
+
+ /* this routine does a simple table lookup for some statistical */
+ /* function that I would remember if I stayed awake in my probstats */
+ /* class... raj 11/94 */
+double
+confid(int level, int freedom)
+{
+double t99[35],t95[35];
+
+ t95[1]=12.706;
+ t95[2]= 4.303;
+ t95[3]= 3.182;
+ t95[4]= 2.776;
+ t95[5]= 2.571;
+ t95[6]= 2.447;
+ t95[7]= 2.365;
+ t95[8]= 2.306;
+ t95[9]= 2.262;
+ t95[10]= 2.228;
+ t95[11]= 2.201;
+ t95[12]= 2.179;
+ t95[13]= 2.160;
+ t95[14]= 2.145;
+ t95[15]= 2.131;
+ t95[16]= 2.120;
+ t95[17]= 2.110;
+ t95[18]= 2.101;
+ t95[19]= 2.093;
+ t95[20]= 2.086;
+ t95[21]= 2.080;
+ t95[22]= 2.074;
+ t95[23]= 2.069;
+ t95[24]= 2.064;
+ t95[25]= 2.060;
+ t95[26]= 2.056;
+ t95[27]= 2.052;
+ t95[28]= 2.048;
+ t95[29]= 2.045;
+ t95[30]= 2.042;
+
+ t99[1]=63.657;
+ t99[2]= 9.925;
+ t99[3]= 5.841;
+ t99[4]= 4.604;
+ t99[5]= 4.032;
+ t99[6]= 3.707;
+ t99[7]= 3.499;
+ t99[8]= 3.355;
+ t99[9]= 3.250;
+ t99[10]= 3.169;
+ t99[11]= 3.106;
+ t99[12]= 3.055;
+ t99[13]= 3.012;
+ t99[14]= 2.977;
+ t99[15]= 2.947;
+ t99[16]= 2.921;
+ t99[17]= 2.898;
+ t99[18]= 2.878;
+ t99[19]= 2.861;
+ t99[20]= 2.845;
+ t99[21]= 2.831;
+ t99[22]= 2.819;
+ t99[23]= 2.807;
+ t99[24]= 2.797;
+ t99[25]= 2.787;
+ t99[26]= 2.779;
+ t99[27]= 2.771;
+ t99[28]= 2.763;
+ t99[29]= 2.756;
+ t99[30]= 2.750;
+
+ if(level==95){
+ return(t95[freedom]);
+ } else if(level==99){
+ return(t99[freedom]);
+ } else{
+ return(0);
+ }
+}
+
+void
+calculate_confidence(int confidence_iterations,
+ float time,
+ double result,
+ float loc_cpu,
+ float rem_cpu,
+ float loc_sd,
+ float rem_sd)
+{
+
+ if (debug) {
+ fprintf(where,
+ "calculate_confidence: itr %d; time %f; res %f\n",
+ confidence_iterations,
+ time,
+ result);
+ fprintf(where,
+ " lcpu %f; rcpu %f\n",
+ loc_cpu,
+ rem_cpu);
+ fprintf(where,
+ " lsdm %f; rsdm %f\n",
+ loc_sd,
+ rem_sd);
+ fflush(where);
+ }
+
+ /* the test time */
+ measured_sum_local_time +=
+ (double) time;
+ measured_square_sum_local_time +=
+ (double) time*time;
+ measured_mean_local_time =
+ (double) measured_sum_local_time/confidence_iterations;
+ measured_var_local_time =
+ (double) measured_square_sum_local_time/confidence_iterations
+ -measured_mean_local_time*measured_mean_local_time;
+
+ /* the test result */
+ measured_sum_result +=
+ (double) result;
+ measured_square_sum_result +=
+ (double) result*result;
+ measured_mean_result =
+ (double) measured_sum_result/confidence_iterations;
+ measured_var_result =
+ (double) measured_square_sum_result/confidence_iterations
+ -measured_mean_result*measured_mean_result;
+
+ /* local cpu utilization */
+ measured_sum_local_cpu +=
+ (double) loc_cpu;
+ measured_square_sum_local_cpu +=
+ (double) loc_cpu*loc_cpu;
+ measured_mean_local_cpu =
+ (double) measured_sum_local_cpu/confidence_iterations;
+ measured_var_local_cpu =
+ (double) measured_square_sum_local_cpu/confidence_iterations
+ -measured_mean_local_cpu*measured_mean_local_cpu;
+
+ /* remote cpu util */
+ measured_sum_remote_cpu +=
+ (double) rem_cpu;
+ measured_square_sum_remote_cpu+=
+ (double) rem_cpu*rem_cpu;
+ measured_mean_remote_cpu =
+ (double) measured_sum_remote_cpu/confidence_iterations;
+ measured_var_remote_cpu =
+ (double) measured_square_sum_remote_cpu/confidence_iterations
+ -measured_mean_remote_cpu*measured_mean_remote_cpu;
+
+ /* local service demand */
+ measured_sum_local_service_demand +=
+ (double) loc_sd;
+ measured_square_sum_local_service_demand+=
+ (double) loc_sd*loc_sd;
+ measured_mean_local_service_demand =
+ (double) measured_sum_local_service_demand/confidence_iterations;
+ measured_var_local_service_demand =
+ (double) measured_square_sum_local_service_demand/confidence_iterations
+ -measured_mean_local_service_demand*measured_mean_local_service_demand;
+
+ /* remote service demand */
+ measured_sum_remote_service_demand +=
+ (double) rem_sd;
+ measured_square_sum_remote_service_demand+=
+ (double) rem_sd*rem_sd;
+ measured_mean_remote_service_demand =
+ (double) measured_sum_remote_service_demand/confidence_iterations;
+ measured_var_remote_service_demand =
+ (double) measured_square_sum_remote_service_demand/confidence_iterations
+ -measured_mean_remote_service_demand*measured_mean_remote_service_demand;
+
+ if(confidence_iterations>1){
+ result_confid= (double) interval -
+ 2.0 * confid(confidence_level,confidence_iterations-1)*
+ sqrt(measured_var_result/(confidence_iterations-1.0)) /
+ measured_mean_result;
+
+ loc_cpu_confid= (double) interval -
+ 2.0 * confid(confidence_level,confidence_iterations-1)*
+ sqrt(measured_var_local_cpu/(confidence_iterations-1.0)) /
+ measured_mean_local_cpu;
+
+ rem_cpu_confid= (double) interval -
+ 2.0 * confid(confidence_level,confidence_iterations-1)*
+ sqrt(measured_var_remote_cpu/(confidence_iterations-1.0)) /
+ measured_mean_remote_cpu;
+
+ if(debug){
+ printf("Conf_itvl %2d: results:%4.1f%% loc_cpu:%4.1f%% rem_cpu:%4.1f%%\n",
+ confidence_iterations,
+ (interval-result_confid)*100.0,
+ (interval-loc_cpu_confid)*100.0,
+ (interval-rem_cpu_confid)*100.0);
+ }
+
+ /* if the user has requested that we only wait for the result to
+ be confident rather than the result and CPU util(s) then do
+ so. raj 2007-08-08 */
+ if (!result_confidence_only) {
+ confidence = min(min(result_confid,loc_cpu_confid),rem_cpu_confid);
+ }
+ else {
+ confidence = result_confid;
+ }
+ }
+}
+
+ /* here ends the IBM code */
+
+void
+retrieve_confident_values(float *elapsed_time,
+ double *thruput,
+ float *local_cpu_utilization,
+ float *remote_cpu_utilization,
+ float *local_service_demand,
+ float *remote_service_demand)
+
+{
+ *elapsed_time = (float)measured_mean_local_time;
+ *thruput = measured_mean_result;
+ *local_cpu_utilization = (float)measured_mean_local_cpu;
+ *remote_cpu_utilization = (float)measured_mean_remote_cpu;
+ *local_service_demand = (float)measured_mean_local_service_demand;
+ *remote_service_demand = (float)measured_mean_remote_service_demand;
+}
+
+ /* display_confidence() is called when we could not achieve the */
+ /* desirec confidence in the results. it will print the achieved */
+ /* confidence to "where" raj 11/94 */
+void
+display_confidence()
+
+{
+ fprintf(where,
+ "!!! WARNING\n");
+ fprintf(where,
+ "!!! Desired confidence was not achieved within ");
+ fprintf(where,
+ "the specified iterations.\n");
+ fprintf(where,
+ "!!! This implies that there was variability in ");
+ fprintf(where,
+ "the test environment that\n");
+ fprintf(where,
+ "!!! must be investigated before going further.\n");
+ fprintf(where,
+ "!!! Confidence intervals: Throughput : %4.1f%%\n",
+ 100.0 * (interval - result_confid));
+ fprintf(where,
+ "!!! Local CPU util : %4.1f%%\n",
+ 100.0 * (interval - loc_cpu_confid));
+ fprintf(where,
+ "!!! Remote CPU util : %4.1f%%\n\n",
+ 100.0 * (interval - rem_cpu_confid));
+}
+
diff --git a/netlib.h b/netlib.h
new file mode 100644
index 0000000..5b6900e
--- /dev/null
+++ b/netlib.h
@@ -0,0 +1,621 @@
+/*
+ Copyright (C) 1993-2005 Hewlett-Packard Company
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#if defined(HAVE_SYS_SOCKET_H)
+# include <sys/socket.h>
+#endif
+#if defined(HAVE_NETDB_H)
+# include <netdb.h>
+#endif
+#if !defined(HAVE_GETADDRINFO) || !defined(HAVE_GETNAMEINFO)
+# include "missing/getaddrinfo.h"
+#endif
+
+#define PAD_TIME 4
+/* library routine specifc defines */
+#define MAXSPECDATA 62 /* how many ints worth of data */
+ /* can tests send... */
+#define MAXTIMES 4 /* how many times may we loop */
+ /* to calibrate */
+#define MAXCPUS 256 /* how many CPU's can we track */
+#define MAXMESSAGESIZE 65536
+#define MAXALIGNMENT 16384
+#define MAXOFFSET 4096
+#define DATABUFFERLEN MAXMESSAGESIZE+MAXALIGNMENT+MAXOFFSET
+
+#define DEBUG_ON 1
+#define DEBUG_OFF 2
+#define DEBUG_OK 3
+#define NODE_IDENTIFY 4
+#define CPU_CALIBRATE 5
+
+#define DO_TCP_STREAM 10
+#define TCP_STREAM_RESPONSE 11
+#define TCP_STREAM_RESULTS 12
+
+#define DO_TCP_RR 13
+#define TCP_RR_RESPONSE 14
+#define TCP_RR_RESULTS 15
+
+#define DO_UDP_STREAM 16
+#define UDP_STREAM_RESPONSE 17
+#define UDP_STREAM_RESULTS 18
+
+#define DO_UDP_RR 19
+#define UDP_RR_RESPONSE 20
+#define UDP_RR_RESULTS 21
+
+#define DO_DLPI_CO_STREAM 22
+#define DLPI_CO_STREAM_RESPONSE 23
+#define DLPI_CO_STREAM_RESULTS 24
+
+#define DO_DLPI_CO_RR 25
+#define DLPI_CO_RR_RESPONSE 26
+#define DLPI_CO_RR_RESULTS 27
+
+#define DO_DLPI_CL_STREAM 28
+#define DLPI_CL_STREAM_RESPONSE 29
+#define DLPI_CL_STREAM_RESULTS 30
+
+#define DO_DLPI_CL_RR 31
+#define DLPI_CL_RR_RESPONSE 32
+#define DLPI_CL_RR_RESULTS 33
+
+#define DO_TCP_CRR 34
+#define TCP_CRR_RESPONSE 35
+#define TCP_CRR_RESULTS 36
+
+#define DO_STREAM_STREAM 37
+#define STREAM_STREAM_RESPONSE 38
+#define STREAM_STREAM_RESULTS 39
+
+#define DO_STREAM_RR 40
+#define STREAM_RR_RESPONSE 41
+#define STREAM_RR_RESULTS 42
+
+#define DO_DG_STREAM 43
+#define DG_STREAM_RESPONSE 44
+#define DG_STREAM_RESULTS 45
+
+#define DO_DG_RR 46
+#define DG_RR_RESPONSE 47
+#define DG_RR_RESULTS 48
+
+#define DO_FORE_STREAM 49
+#define FORE_STREAM_RESPONSE 50
+#define FORE_STREAM_RESULTS 51
+
+#define DO_FORE_RR 52
+#define FORE_RR_RESPONSE 53
+#define FORE_RR_RESULTS 54
+
+#define DO_HIPPI_STREAM 55
+#define HIPPI_STREAM_RESPONSE 56
+#define HIPPI_STREAM_RESULTS 57
+
+#define DO_HIPPI_RR 52
+#define HIPPI_RR_RESPONSE 53
+#define HIPPI_RR_RESULTS 54
+
+#define DO_XTI_TCP_STREAM 55
+#define XTI_TCP_STREAM_RESPONSE 56
+#define XTI_TCP_STREAM_RESULTS 57
+
+#define DO_XTI_TCP_RR 58
+#define XTI_TCP_RR_RESPONSE 59
+#define XTI_TCP_RR_RESULTS 60
+
+#define DO_XTI_UDP_STREAM 61
+#define XTI_UDP_STREAM_RESPONSE 62
+#define XTI_UDP_STREAM_RESULTS 63
+
+#define DO_XTI_UDP_RR 64
+#define XTI_UDP_RR_RESPONSE 65
+#define XTI_UDP_RR_RESULTS 66
+
+#define DO_XTI_TCP_CRR 67
+#define XTI_TCP_CRR_RESPONSE 68
+#define XTI_TCP_CRR_RESULTS 69
+
+#define DO_TCP_TRR 70
+#define TCP_TRR_RESPONSE 71
+#define TCP_TRR_RESULTS 72
+
+#define DO_TCP_NBRR 73
+#define TCP_NBRR_RESPONSE 74
+#define TCP_NBRR_RESULTS 75
+
+#define DO_TCPIPV6_STREAM 76
+#define TCPIPV6_STREAM_RESPONSE 77
+#define TCPIPV6_STREAM_RESULTS 78
+
+#define DO_TCPIPV6_RR 79
+#define TCPIPV6_RR_RESPONSE 80
+#define TCPIPV6_RR_RESULTS 81
+
+#define DO_UDPIPV6_STREAM 82
+#define UDPIPV6_STREAM_RESPONSE 83
+#define UDPIPV6_STREAM_RESULTS 84
+
+#define DO_UDPIPV6_RR 85
+#define UDPIPV6_RR_RESPONSE 86
+#define UDPIPV6_RR_RESULTS 87
+
+#define DO_TCPIPV6_CRR 88
+#define TCPIPV6_CRR_RESPONSE 89
+#define TCPIPV6_CRR_RESULTS 90
+
+#define DO_TCPIPV6_TRR 91
+#define TCPIPV6_TRR_RESPONSE 92
+#define TCPIPV6_TRR_RESULTS 93
+
+#define DO_TCP_MAERTS 94
+#define TCP_MAERTS_RESPONSE 95
+#define TCP_MAERTS_RESULTS 96
+
+#define DO_LWPSTR_STREAM 100
+#define LWPSTR_STREAM_RESPONSE 110
+#define LWPSTR_STREAM_RESULTS 120
+
+#define DO_LWPSTR_RR 130
+#define LWPSTR_RR_RESPONSE 140
+#define LWPSTR_RR_RESULTS 150
+
+#define DO_LWPDG_STREAM 160
+#define LWPDG_STREAM_RESPONSE 170
+#define LWPDG_STREAM_RESULTS 180
+
+#define DO_LWPDG_RR 190
+#define LWPDG_RR_RESPONSE 200
+#define LWPDG_RR_RESULTS 210
+
+#define DO_TCP_CC 300
+#define TCP_CC_RESPONSE 301
+#define TCP_CC_RESULTS 302
+
+/* The DNS_RR test has been removed from netperf but we leave these
+ here for historical purposes. Those wanting to do DNS_RR tests
+ should use netperf4 instead. */
+#define DO_DNS_RR 400
+#define DNS_RR_RESPONSE 401
+#define DNS_RR_RESULTS 402
+
+#define DO_SCTP_STREAM 500
+#define SCTP_STREAM_RESPONSE 501
+#define SCTP_STREAM_RESULT 502
+
+#define DO_SCTP_STREAM_MANY 510
+#define SCTP_STREAM_MANY_RESPONSE 511
+#define SCTP_STREAM_MANY_RESULT 512
+
+#define DO_SCTP_RR 520
+#define SCTP_RR_RESPONSE 521
+#define SCTP_RR_RESULT 502
+
+#define DO_SCTP_RR_MANY 530
+#define SCTP_RR_MANY_RESPONSE 531
+#define SCTP_RR_MANY_RESULT 532
+
+#define DO_SDP_STREAM 540
+#define SDP_STREAM_RESPONSE 541
+#define SDP_STREAM_RESULTS 542
+
+#define DO_SDP_RR 543
+#define SDP_RR_RESPONSE 544
+#define SDP_RR_RESULTS 545
+
+#define DO_SDP_MAERTS 546
+#define SDP_MAERTS_RESPONSE 547
+#define SDP_MAERTS_RESULTS 548
+
+#define DO_SDP_CRR 549
+#define SDP_CRR_RESPONSE 550
+#define SDP_CRR_RESULTS 551
+
+#define DO_SDP_CC 552
+#define SDP_CC_RESPONSE 553
+#define SDP_CC_RESULTS 554
+
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+
+enum sock_buffer{
+ SEND_BUFFER,
+ RECV_BUFFER
+};
+
+ /* some of the fields in these structures are going to be doubles and */
+ /* such. so, we probably want to ensure that they will start on */
+ /* "double" boundaries. this will break compatability to pre-2.1 */
+ /* releases, but then, backwards compatability has never been a */
+ /* stated goal of netperf. raj 11/95 */
+
+union netperf_request_struct {
+ struct {
+ int request_type;
+ int dummy;
+ int test_specific_data[MAXSPECDATA];
+ } content;
+ double dummy;
+};
+
+union netperf_response_struct {
+ struct {
+ int response_type;
+ int serv_errno;
+ int test_specific_data[MAXSPECDATA];
+ } content;
+ double dummy;
+};
+
+struct ring_elt {
+ struct ring_elt *next; /* next element in the ring */
+ char *buffer_base; /* in case we have to free it at somepoint */
+ char *buffer_ptr; /* the aligned and offset pointer */
+};
+
+/* +*+ SAF Sorry about the hacks with errno; NT made me do it :(
+
+ WinNT does define an errno.
+ It is mostly a legacy from the XENIX days.
+
+ Depending upon the version of the C run time that is linked in, it is
+ either a simple variable (like UNIX code expects), but more likely it
+ is the address of a procedure to return the error number. So any
+ code that sets errno is likely to be overwriting the address of this
+ procedure. Worse, only a tiny fraction of NT's errors get set
+ through errno.
+
+ So I have changed the netperf code to use a define Set_errno when
+ that is it's intent. On non-windows platforms this is just an
+ assignment to errno. But on NT this calls SetLastError.
+
+ I also define errno (now only used on right side of assignments)
+ on NT to be GetLastError.
+
+ Similarly, perror is defined on NT, but it only accesses the same
+ XENIX errors that errno covers. So on NT this is redefined to be
+ Perror and it expands all GetLastError texts. */
+
+
+#ifdef WIN32
+/* INVALID_SOCKET == INVALID_HANDLE_VALUE == (unsigned int)(~0) */
+/* SOCKET_ERROR == -1 */
+#define ENOTSOCK WSAENOTSOCK
+#define EINTR WSAEINTR
+#define ENOBUFS WSAENOBUFS
+#define EWOULDBLOCK WSAEWOULDBLOCK
+#define EAFNOSUPPORT WSAEAFNOSUPPORT
+/* I don't use a C++ style of comment because it upsets some C
+ compilers, possibly even when it is inside an ifdef WIN32... */
+/* from public\sdk\inc\crt\errno.h */
+#define ENOSPC 28
+
+#ifdef errno
+/* delete the one from stdlib.h */
+/*#define errno (*_errno()) */
+#undef errno
+#endif
+#define errno GetLastError()
+#define Set_errno(num) SetLastError((num))
+
+#define perror(text) PrintWin32Error(stderr, (text))
+#define Print_errno(stream, text) PrintWin32Error((stream), (text))
+
+extern void PrintWin32Error(FILE *stream, LPSTR text);
+
+#if !defined(NT_PERF) && !defined(USE_LOOPER)
+#define NT_PERF
+#endif
+#else
+/* Really shouldn't use manifest constants! */
+/*+*+SAF There are other examples of "== -1" and "<0" that probably */
+/*+*+SAF should be cleaned up as well. */
+#define INVALID_SOCKET -1
+#define SOCKET_ERROR -1
+
+#define SOCKET int
+#define Set_errno(num) errno = (num)
+
+#define Print_errno(stream, text) fprintf((stream), "%s errno %d\n", (text), errno)
+#endif
+
+/* Robin & Rick's kludge to try to have a timer signal EINTR by closing */
+/* the socket from another thread can also return several other errors. */
+/* Let's define a macro to hide all of this. */
+
+#ifndef WIN32
+#define SOCKET_EINTR(return_value) (errno == EINTR)
+#define SOCKET_EADDRINUSE(return_value) (errno == EADDRINUSE)
+#define SOCKET_EADDRNOTAVAIL(return_value) (errno == EADDRNOTAVAIL)
+
+#else
+
+/* not quite sure I like the extra cases for WIN32 but that is what my
+ WIN32 expert sugested. I'm not sure what WSA's to put for
+ EADDRINUSE */
+
+#define SOCKET_EINTR(return_value) \
+ (((return_value) == SOCKET_ERROR) && \
+ ((errno == EINTR) || \
+ (errno == WSAECONNABORTED) || \
+ (errno == WSAECONNRESET) ))
+#define SOCKET_EADDRINUSE(return_value) \
+ (((return_value) == SOCKET_ERROR) && \
+ ((errno == WSAEADDRINUSE) ))
+#define SOCKET_EADDRNOTAVAIL(return_value) \
+ (((return_value) == SOCKET_ERROR) && \
+ ((errno == WSAEADDRNOTAVAIL) ))
+#endif
+
+#ifdef HAVE_SENDFILE
+
+struct sendfile_ring_elt {
+ struct sendfile_ring_elt *next; /* next element in the ring */
+ int fildes; /* the file descriptor of the source
+ file */
+ off_t offset; /* the offset from the beginning of
+ the file for this send */
+ size_t length; /* the number of bytes to send -
+ this is redundant with the
+ send_size variable but I decided
+ to include it anyway */
+ struct iovec *hdtrl; /* a pointer to a header/trailer
+ that we do not initially use and
+ so should be set to NULL when the
+ ring is setup. */
+ int flags; /* the flags to pass to sendfile() -
+ presently unused and should be
+ set to zero when the ring is
+ setup. */
+};
+
+#endif /* HAVE_SENDFILE */
+
+ /* the diferent codes to denote the type of CPU utilization */
+ /* methods used */
+#define CPU_UNKNOWN 0
+#define HP_IDLE_COUNTER 1
+#define PSTAT 2
+#define TIMES 3
+#define LOOPER 4
+#define GETRUSAGE 5
+#define NT_METHOD 6
+#define KSTAT 7
+#define PROC_STAT 8
+#define SYSCTL 9
+#define PERFSTAT 10
+#define KSTAT_10 11
+#define OSX 12
+
+#define BADCH ('?')
+
+#ifndef NETLIB
+#ifdef WIN32
+#ifndef _GETOPT_
+#define _GETOPT_
+
+int getopt(int argc, char **argv, char *optstring);
+
+extern char *optarg; /* returned arg to go with this option */
+extern int optind; /* index to next argv element to process */
+extern int opterr; /* should error messages be printed? */
+extern int optopt; /* */
+
+#endif /* _GETOPT_ */
+
+extern SOCKET win_kludge_socket, win_kludge_socket2;
+#endif /* WIN32 */
+
+extern int local_proc_affinity, remote_proc_affinity;
+
+/* these are to allow netperf to be run easily through those evil,
+ end-to-end breaking things known as firewalls */
+extern char local_data_port[10];
+extern char remote_data_port[10];
+
+extern char *local_data_address;
+extern char *remote_data_address;
+
+extern int local_data_family;
+extern int remote_data_family;
+
+extern union netperf_request_struct netperf_request;
+extern union netperf_response_struct netperf_response;
+
+extern float lib_local_cpu_util;
+extern float lib_elapsed;
+extern float lib_local_maxrate;
+
+extern char libfmt;
+
+extern int cpu_method;
+extern int lib_num_loc_cpus;
+extern int lib_num_rem_cpus;
+extern SOCKET server_sock;
+extern int times_up;
+extern FILE *where;
+extern int loops_per_msec;
+extern float lib_local_per_cpu_util[];
+
+extern void netlib_init();
+extern int netlib_get_page_size();
+extern void install_signal_catchers();
+extern void establish_control(char hostname[],
+ char port[],
+ int af,
+ char local_hostname[],
+ char local_port[],
+ int local_af);
+extern void shutdown_control();
+extern void init_stat();
+extern void send_request();
+extern void recv_response();
+extern void send_response();
+extern void recv_request();
+extern void dump_request();
+extern void dump_addrinfo(FILE *dumploc, struct addrinfo *info,
+ char *host, char *port, int family);
+extern void start_timer(int time);
+extern void stop_timer();
+extern void cpu_start(int measure_cpu);
+extern void cpu_stop(int measure_cpu, float *elapsed);
+extern void calculate_confidence(int confidence_iterations,
+ float time,
+ double result,
+ float loc_cpu,
+ float rem_cpu,
+ float loc_sd,
+ float rem_sd);
+extern void retrieve_confident_values(float *elapsed_time,
+ double *thruput,
+ float *local_cpu_utilization,
+ float *remote_cpu_utilization,
+ float *local_service_demand,
+ float *remote_service_demand);
+extern void display_confidence();
+extern void set_sock_buffer(SOCKET sd,
+ enum sock_buffer which,
+ int requested_size,
+ int *effective_sizep);
+extern char *format_units();
+
+extern char *inet_ftos(int family);
+extern char *inet_ttos(int type);
+extern char *inet_ptos(int protocol);
+extern double ntohd(double net_double);
+extern double htond(double host_double);
+extern int inet_nton(int af, const void *src, char *dst, int cnt);
+extern void libmain();
+extern double calc_thruput(double units_received);
+extern double calc_thruput_interval(double units_received,double elapsed);
+extern double calc_thruput_omni(double units_received);
+extern double calc_thruput_interval_omni(double units_received,double elapsed);
+extern float calibrate_local_cpu(float local_cpu_rate);
+extern float calibrate_remote_cpu();
+extern void bind_to_specific_processor(int processor_affinity,int use_cpu_map);
+extern int set_nonblock (SOCKET sock);
+
+#ifndef WIN32
+
+/* WIN32 requires that at least one of the file sets to select be
+ non-null. Since msec_sleep routine is only called by nettest_dlpi &
+ nettest_unix, let's duck this issue. */
+
+extern int msec_sleep( int msecs );
+#endif /* WIN32 */
+extern float calc_cpu_util(float elapsed_time);
+extern float calc_service_demand(double units_sent,
+ float elapsed_time,
+ float cpu_utilization,
+ int num_cpus);
+extern float calc_service_demand_trans(double units_sent,
+ float elapsed_time,
+ float cpu_utilization,
+ int num_cpus);
+#if defined(__hpux)
+extern void catcher(int, siginfo_t *,void *);
+#else
+extern void catcher(int);
+#endif /* __hpux */
+extern struct ring_elt *allocate_buffer_ring();
+extern void access_buffer(char *buffer_ptr,
+ int length,
+ int dirty_count,
+ int clean_count);
+
+#ifdef HAVE_ICSC_EXS
+extern struct ring_elt *allocate_exs_buffer_ring();
+#endif /* HAVE_ICSC_EXS */
+#ifdef HAVE_SENDFILE
+extern struct sendfile_ring_elt *alloc_sendfile_buf_ring();
+#endif /* HAVE_SENDFILE */
+#ifdef WANT_DLPI
+/* it seems that AIX in its finite wisdom has some bogus define in an
+ include file which defines "rem_addr" which then screws-up this extern
+ unless we change the names to protect the guilty. reported by Eric
+ Jones */
+extern int dl_connect(int fd, unsigned char *remote_addr, int remote_addr_len);
+extern int dl_bind(int fd, int sap, int mode, char *dlsap_ptr, int *dlsap_len);
+extern int dl_open(char devfile[], int ppa);
+#endif /* WANT_DLPI */
+extern char format_cpu_method(int method);
+extern unsigned int convert(char *string);
+extern unsigned int convert_timespec(char *string);
+
+#ifdef WANT_INTERVALS
+extern void start_itimer(unsigned int interval_len_msec);
+#endif
+ /* these are all for the confidence interval stuff */
+extern double confidence;
+
+#endif
+
+#ifdef WIN32
+#define close(x) closesocket(x)
+#define strcasecmp(a,b) _stricmp(a,b)
+#define getpid() ((int)GetCurrentProcessId())
+#endif
+
+#ifdef WIN32
+#if 0
+/* Should really use safe string functions; but not for now... */
+#include <strsafe.h>
+/* Microsoft has deprecated _snprintf; it isn't guarenteed to null terminate the result buffer. */
+/* They want us to call StringCbPrintf instead; it always null terminates the string. */
+#endif
+
+#define snprintf _snprintf
+#endif
+
+/* Define a macro to align a buffer with an offset from a power of 2
+ boundary. */
+
+#ifndef WIN32
+#define ULONG_PTR unsigned long
+#endif
+
+#define ALIGN_BUFFER(BufPtr, Align, Offset) \
+ (char *)(( (ULONG_PTR)(BufPtr) + \
+ (ULONG_PTR) (Align) -1) & \
+ ~((ULONG_PTR) (Align) - 1)) + (ULONG_PTR)(Offset)
+
+ /* if your system has bcopy and bzero, include it here, otherwise, we */
+ /* will try to use memcpy aand memset. fix from Bruce Barnett @ GE. */
+#if defined(hpux) || defined (__VMS)
+#define HAVE_BCOPY
+#define HAVE_BZERO
+#endif
+
+#ifdef WIN32
+#define HAVE_MIN
+#else
+#define _stdcall
+#define _cdecl
+#endif
+
+#ifndef HAVE_BCOPY
+#define bcopy(s,d,h) memcpy((d),(s),(h))
+#endif /* HAVE_BCOPY */
+
+#ifndef HAVE_BZERO
+#define bzero(p,h) memset((p),0,(h))
+#endif /* HAVE_BZERO */
+
+#ifndef HAVE_MIN
+#define min(a,b) ((a < b) ? a : b)
+#endif /* HAVE_MIN */
+
+#ifdef USE_PERFSTAT
+# include <libperfstat.h>
+#endif
diff --git a/netperf-2.4.4/AUTHORS b/netperf-2.4.4/AUTHORS
new file mode 100644
index 0000000..c04f25e
--- /dev/null
+++ b/netperf-2.4.4/AUTHORS
@@ -0,0 +1,215 @@
+This file is here for people to list their contributions to the
+netperf benchmark. When you enhance or fix something, put your name
+and a description of the what/where/whey/why/how here. If you like,
+feel free to include an email address.
+
+I would like to apologize in advance to anyone I've forgotten to
+include.
+
+Rick Jones <raj@cup.hp.com>
+Responsible for initial packaging and release of netperf and
+"editorial" continuity for subsequent releases.
+
+Karen Choy
+Code to allow netserver to run as a standalone daemon.
+
+Dave Shield <daves@csc.liv.ac.uk>
+Wrote the first revision of the netperf and netserver manpages.
+
+Sarr Blumson <sarr@citi.umich.edu>
+Fixes for AIX 3.1 and 3.2. Also fixes for Solaris 2.1 without
+realizing it ;-)
+
+Jeff Smits <jgs@usl.com>
+Fixes for TCP_RR and UDP_RR on sytems with an htonl that is not a no-op.
+
+Warren Burnett <somewhere in Kansas>
+Example code for DLPI tests.
+
+Several Folks
+Code to tell SunOS 4 to *not* restart system calls on receipt of a
+signal.
+
+Fore Systems Inc.
+Manpages for the FORE API and question answering
+
+David Channin
+Access to systems running the Fore ATM API
+
+Jonathan Stone <jonathan@DSG.Stanford.EDU>
+Include file fixes for Ultrix
+
+Bruce Barnett <barnett@grymoire.crd.ge.com>
+Bunches of warnings fixes and lint picks for Solaris 2.3
+
+Herman Dierks et al <dierks@austin.ibm.com>
+Code to calculate confidence intervals for tests
+
+Hal Murray <murray@pa.dec.com>
+Helpful suggestions for the scripts to make them more compatible with
+the netperf database (http://www.cup.hp.com/netperf/NetperfPage.html).
+His prompting finally got me off my whatever to put the confidence
+interval stuff from the guys at IBM into netperf
+
+Peter Skopp pds@cs.columbia.edu
+Fixes to make netperf more secure.
+
+Tom Wilson <tcwilson@newbridge.com>
+A fix to send_udp_rr to correct bogus throughput values.
+
+Thorsten Lockert <tholo@tetherless.com>
+A bunch of clean-up for the *BSD OSes
+
+Serge Pachkovsky <ps@ocisgi7.unizh.ch>
+Code for low-priority soaker process for AIX and SGI
+
+The fine folks at Adaptec
+The initial port of netperf (1.9PL4) to Windows NT 3.51.
+
+Robin Callender <robin_callender@VNET.IBM.COM>
+The PPC binaries for the 1.9PL4 port of netperf to NT and for assorted
+code clean-ups and help with CPU utilization measurements.
+
+"Todd J. Derr" <tjd@fore.com>
+For offering to take-on support of the Fore ATM API files with 2.1 and
+for his help in making the tar files and such more user-friendly
+
+Michael Shuldman <michaels@inet.no>
+Improvements to the makefile and additional checks for OpenBSD
+
+Kris Corwin
+discovery of a debug statement outside of if (debug) that may have
+been the cause of all the nasty connection refused errors in random
+UDP_RR tests...
+
+Charles Harris
+Initial prototype of the TCP_SENDFILE test support
+
+Philip Pishioneri of Cornel
+Conversion of the netperf.ps manul to PDF format.
+
+The Hewlett-Packard OpenVMS folks
+Assistance with the port to OpenVMS
+
+Munechika SUMIKAWA @ KAME Project / FreeBSD.org
+IPv6 fixes
+
+Jan Iven of CERN
+initial mods for sendfile() under Linux
+
+Fabrice Bacchella
+for pointing-out that Solaris 9 has a copy of Linux sendfile()
+
+Andrew Gallatin
+for assistance with the FreeBSD sysctl() stuff, and later making it
+calibration-free
+fixes to configure to recognize Solaris 11
+
+Mark Cooper
+pointing-out the need for -lresolv when compiling -DDO_DNS on RedHat
+7.1
+
+Carl Mascott
+finding some cut-and-paste erors in create_data_socket error logging
+
+Fabrice Bacchella
+Fixes for -DHISTOGRAM and -DUNIX on Mac OS X, updates to usage strings
+
+Spencer Frink
+Fixes and Cleanup for WIN32. Many over many years.
+
+Nicholas Thomas
+Fixes for DLPI on SVR4 Streams under Linux
+
+Dave Craig
+Fixes for getaddrinfo error returns
+
+David Mosberger of HP
+Workaround for the Linux getsockopt() bug that returns more than that
+for which one asked.
+
+Stephen Burger of HP
+Code to implement the netserver CPU binding.
+
+Vladislav "Vlad" Yasevich of HP
+Initial SCTP tests. Enhancements to the configure.ac sources to show
+the way to make many of the LIBS="foo" before ./configure unnecessary.
+
+Padmanabhan "Paddu" S N of HP
+Patches for /proc/stat CPU util and recv_tcp_rr.
+
+Cary Coutant and other hp-mac-users of HP
+Access to Mac OS X systems for porting netperf 2.4.0
+
+Chris Bertin of HP
+Access to AIX for initial porting of netperf 2.4.0
+
+James Carlson
+Assistance finding the right magic to compile SCTP on Solaris 10.
+
+Gavin
+Pointers on Solaris 10 Microstate accounting.
+
+Brent Draney
+Getting netcpu_perfstat.c in running order on AIX and other misc
+fixups in places such as BSD.
+
+Samuel Ying
+Change struct sockaddr to struct sockaddr storage in netserver.c
+
+Rodolpho Boer
+Fix for default message size in UDP_STREAM when defualt SO_SNDBUF size
+is > max UDP datagram size.
+
+Michael Dorff
+Getting netperf/netserver to compile under Windows with MS Visual
+Studio 2003
+
+George Davis
+Changes to deal with different floating-point formats.
+
+Anonymous
+Changes to retrieve CPU util on MacOS X.
+
+Dickon Reed
+Patches to attend to some windows in TCP_CRR and TCP_CC under Windows
+
+Bret McKee <bret@hp.com>
+Fixes to get netcpu_looper compiling and working after the "netcpu"
+split
+
+Hans Blom
+Improvements to closing/redirecting stdin/stdout/stderr in netserver
+
+Martin Brown
+RPM support in the form of netperf.spec.in and related configure.ac
+etc changes
+
+Shilpi Agarwal
+Changes to allow UDP_STREAM to use connected sockets on both sides.
+
+Steve Reinhardt <stever@eecs.umich.edu>
+Fixes for buffer filling.
+
+Gisle Vanem
+Fixes for Windows compilation under MingW/gcc.
+
+Scott Weitzenkamp
+Patches to enable demo mode in the UDP_STREAM test
+
+Emir Halepovic
+Feedback on the manual
+
+Kouhei Sutou
+Generate netperf_version.h and netperf.spec via configure rather than
+makefile, include limits to get PathMAX on FreeBSD.
+
+Dan Yost
+Fix to fflush() each interim result in demo mode to make things
+happier for folks redirecting same to a file.
+
+Alexander Duyck
+Fixes to replace struct sockaddr_in with struct sockaddr_storage
+
+Anonymous
+Support for sendfile() on OSX \ No newline at end of file
diff --git a/netperf-2.4.4/COPYING b/netperf-2.4.4/COPYING
new file mode 100644
index 0000000..3f3ceb2
--- /dev/null
+++ b/netperf-2.4.4/COPYING
@@ -0,0 +1,43 @@
+
+
+ Copyright (C) 1993 Hewlett-Packard Company
+ ALL RIGHTS RESERVED.
+
+ The enclosed software and documentation includes copyrighted works
+ of Hewlett-Packard Co. For as long as you comply with the following
+ limitations, you are hereby authorized to (i) use, reproduce, and
+ modify the software and documentation, and to (ii) distribute the
+ software and documentation, including modifications, for
+ non-commercial purposes only.
+
+ 1. The enclosed software and documentation is made available at no
+ charge in order to advance the general development of
+ high-performance networking products.
+
+ 2. You may not delete any copyright notices contained in the
+ software or documentation. All hard copies, and copies in
+ source code or object code form, of the software or
+ documentation (including modifications) must contain at least
+ one of the copyright notices.
+
+ 3. The enclosed software and documentation has not been subjected
+ to testing and quality control and is not a Hewlett-Packard Co.
+ product. At a future time, Hewlett-Packard Co. may or may not
+ offer a version of the software and documentation as a product.
+
+ 4. THE SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS".
+ HEWLETT-PACKARD COMPANY DOES NOT WARRANT THAT THE USE,
+ REPRODUCTION, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR
+ DOCUMENTATION WILL NOT INFRINGE A THIRD PARTY'S INTELLECTUAL
+ PROPERTY RIGHTS. HP DOES NOT WARRANT THAT THE SOFTWARE OR
+ DOCUMENTATION IS ERROR FREE. HP DISCLAIMS ALL WARRANTIES,
+ EXPRESS AND IMPLIED, WITH REGARD TO THE SOFTWARE AND THE
+ DOCUMENTATION. HP SPECIFICALLY DISCLAIMS ALL WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+ 5. HEWLETT-PACKARD COMPANY WILL NOT IN ANY EVENT BE LIABLE FOR ANY
+ DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
+ (INCLUDING LOST PROFITS) RELATED TO ANY USE, REPRODUCTION,
+ MODIFICATION, OR DISTRIBUTION OF THE SOFTWARE OR DOCUMENTATION.
+
+
diff --git a/netperf-2.4.4/ChangeLog b/netperf-2.4.4/ChangeLog
new file mode 100644
index 0000000..f9402b1
--- /dev/null
+++ b/netperf-2.4.4/ChangeLog
@@ -0,0 +1 @@
+See the file Release_Notes. \ No newline at end of file
diff --git a/netperf-2.4.4/INSTALL b/netperf-2.4.4/INSTALL
new file mode 100644
index 0000000..54caf7c
--- /dev/null
+++ b/netperf-2.4.4/INSTALL
@@ -0,0 +1,229 @@
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software
+Foundation, Inc.
+
+ This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+ It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring. (Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.)
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+ The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'. You only need
+`configure.ac' if you want to change it or regenerate `configure' using
+a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes awhile. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+ You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment. Here
+is an example:
+
+ ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
+
+ *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not support the `VPATH'
+variable, you have to compile the package for one architecture at a
+time in the source code directory. After you have installed the
+package for one architecture, use `make distclean' before reconfiguring
+for another architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on. Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+ CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+ OS KERNEL-OS
+
+ See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+ If you are _building_ compiler tools for cross-compiling, you should
+use the `--target=TYPE' option to select the type of system they will
+produce code for.
+
+ If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+ Variables not defined in a site shell script can be set in the
+environment passed to `configure'. However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost. In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'. For example:
+
+ ./configure CC=/usr/local2/bin/gcc
+
+will cause the specified gcc to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+`configure' Invocation
+======================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+ Print a summary of the options to `configure', and exit.
+
+`--version'
+`-V'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`--cache-file=FILE'
+ Enable the cache: use and save the results of the tests in FILE,
+ traditionally `config.cache'. FILE defaults to `/dev/null' to
+ disable caching.
+
+`--config-cache'
+`-C'
+ Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to `/dev/null' (any error
+ messages will still be shown).
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`configure' also accepts some other, not widely useful, options. Run
+`configure --help' for more details.
+
diff --git a/netperf-2.4.4/Makefile.am b/netperf-2.4.4/Makefile.am
new file mode 100644
index 0000000..35f5d46
--- /dev/null
+++ b/netperf-2.4.4/Makefile.am
@@ -0,0 +1,4 @@
+
+AUTOMAKE_OPTIONS = dist-bzip2 dist-zip
+SUBDIRS = src doc
+EXTRA_DIST = README.* Release_Notes inet_ntop.c
diff --git a/netperf-2.4.4/Makefile.in b/netperf-2.4.4/Makefile.in
new file mode 100644
index 0000000..b6881e5
--- /dev/null
+++ b/netperf-2.4.4/Makefile.in
@@ -0,0 +1,552 @@
+# Makefile.in generated by automake 1.7.9 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
+# 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@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = .
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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 = :
+host_triplet = @host@
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+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@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GREP = @GREP@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+NEED_LIBCOMPAT_FALSE = @NEED_LIBCOMPAT_FALSE@
+NEED_LIBCOMPAT_TRUE = @NEED_LIBCOMPAT_TRUE@
+NETCPU_SOURCE = @NETCPU_SOURCE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+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@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+
+AUTOMAKE_OPTIONS = dist-bzip2 dist-zip
+SUBDIRS = src doc
+EXTRA_DIST = README.* Release_Notes inet_ntop.c
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = netperf.spec
+DIST_SOURCES =
+
+RECURSIVE_TARGETS = info-recursive dvi-recursive pdf-recursive \
+ ps-recursive install-info-recursive uninstall-info-recursive \
+ all-recursive install-data-recursive install-exec-recursive \
+ installdirs-recursive install-recursive uninstall-recursive \
+ check-recursive installcheck-recursive
+DIST_COMMON = README $(srcdir)/Makefile.in $(srcdir)/configure AUTHORS \
+ COPYING ChangeLog INSTALL Makefile.am NEWS acinclude.m4 \
+ aclocal.m4 config.guess config.h.in config.sub configure \
+ configure.ac depcomp install-sh missing mkinstalldirs \
+ netperf.spec.in
+DIST_SUBDIRS = $(SUBDIRS)
+all: config.h
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4)
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)
+
+$(top_builddir)/config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+$(srcdir)/configure: $(srcdir)/configure.ac $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
+ cd $(srcdir) && $(AUTOCONF)
+
+$(ACLOCAL_M4): configure.ac acinclude.m4
+ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+config.h: stamp-h1
+ @if test ! -f $@; then \
+ rm -f stamp-h1; \
+ $(MAKE) stamp-h1; \
+ else :; fi
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+ @rm -f stamp-h1
+ cd $(top_builddir) && $(SHELL) ./config.status config.h
+
+$(srcdir)/config.h.in: $(top_srcdir)/configure.ac $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOHEADER)
+ touch $(srcdir)/config.h.in
+
+distclean-hdr:
+ -rm -f config.h stamp-h1
+netperf.spec: $(top_builddir)/config.status netperf.spec.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+uninstall-info-am:
+
+# 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.
+$(RECURSIVE_TARGETS):
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; 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; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ETAGS = etags
+ETAGSFLAGS =
+
+CTAGS = ctags
+CTAGSFLAGS =
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ if (etags --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ else \
+ include_option=--include; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -f $$subdir/TAGS && \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$tags$$unique" \
+ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique
+
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = .
+distdir = $(PACKAGE)-$(VERSION)
+
+am__remove_distdir = \
+ { test ! -d $(distdir) \
+ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -fr $(distdir); }; }
+
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+
+distdir: $(DISTFILES)
+ $(am__remove_distdir)
+ mkdir $(distdir)
+ $(mkinstalldirs) $(distdir)/. $(distdir)/src
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkinstalldirs) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -d $(distdir)/$$subdir \
+ || mkdir $(distdir)/$$subdir \
+ || exit 1; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" \
+ distdir=../$(distdir)/$$subdir \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -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 $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r $(distdir)
+dist-gzip: distdir
+ $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+dist-bzip2: distdir
+ $(AMTAR) chof - $(distdir) | bzip2 -9 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__remove_distdir)
+
+dist dist-all: distdir
+ $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(AMTAR) chof - $(distdir) | bzip2 -9 -c >$(distdir).tar.bz2
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__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
+ $(am__remove_distdir)
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf -
+ chmod -R a-w $(distdir); chmod a+w $(distdir)
+ mkdir $(distdir)/_build
+ mkdir $(distdir)/_inst
+ chmod a-w $(distdir)
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && cd $(distdir)/_build \
+ && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ $(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 ../.. && $(mkinstalldirs) "$$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-gzip \
+ && rm -f $(distdir).tar.gz \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+ $(am__remove_distdir)
+ @echo "$(distdir).tar.gz is ready for distribution" | \
+ sed 'h;s/./=/g;p;x;p;x'
+distuninstallcheck:
+ @cd $(distuninstallcheck_dir) \
+ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+ || { 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 config.h
+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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f $(CONFIG_CLEAN_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 mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+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
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am clean \
+ clean-generic clean-recursive ctags ctags-recursive dist \
+ dist-all dist-bzip2 dist-gzip dist-zip distcheck distclean \
+ distclean-generic distclean-hdr distclean-recursive \
+ distclean-tags distcleancheck distdir distuninstallcheck dvi \
+ dvi-am dvi-recursive info info-am info-recursive install \
+ install-am install-data install-data-am install-data-recursive \
+ install-exec install-exec-am install-exec-recursive \
+ install-info install-info-am install-info-recursive install-man \
+ install-recursive install-strip installcheck installcheck-am \
+ installdirs installdirs-am installdirs-recursive \
+ maintainer-clean maintainer-clean-generic \
+ maintainer-clean-recursive mostlyclean mostlyclean-generic \
+ mostlyclean-recursive pdf pdf-am pdf-recursive ps ps-am \
+ ps-recursive tags tags-recursive uninstall uninstall-am \
+ uninstall-info-am uninstall-info-recursive uninstall-recursive
+
+# 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/netperf-2.4.4/NEWS b/netperf-2.4.4/NEWS
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/netperf-2.4.4/NEWS
diff --git a/netperf-2.4.4/README b/netperf-2.4.4/README
new file mode 100644
index 0000000..7745b96
--- /dev/null
+++ b/netperf-2.4.4/README
@@ -0,0 +1,49 @@
+
+BE SURE TO READ THE MANUAL. EVEN THOUGH IT MAY BE OUTDATED.
+
+This is a brief readme file for the netperf TCP/UDP/sockets/etc
+performance benchmark. This is here mostly as a boot-strap. The real
+information is in the manual, which can be found in netperf.ps and
+online from http://www.netperf.org/netperf/NetperfPage.html. The
+sources, and a limited number of binaries, can be found from
+ftp://ftp.cup.hp.com/dist/networking/benchmarks/netperf/ .
+
+BE SURE TO READ THE MANUAL. EVEN THOUGH IT MAY BE OUTDATED.
+
+There is a COPYRIGHT file included. It is called COPYING because that
+is what autosomethingorother wanted. It is based on what the HP Legal
+Eagles gave me. I am not sure if the legalese is clear, but the intent
+is to say "Here is a benchmark. Use it in good health. Pass it along,
+port it, enhance it. You didn't pay for this tool, so don't expect it
+to be perfect ;-)" The rest of it is there to keep the layers happy...
+
+While the copyright is pretty much in spirit an "open source" one, it
+is not in letter - I never took the time to try to get it approved.
+If you feel strongly about the license of the code you use and want
+something under the GPL, consider netperf4:
+
+http://www.netperf.org/svn/netperf4/trunk
+
+Feel free to report netperf results in public forums, but please be
+excruciatingly complete in your description of the test envorinment.
+The old netperf database at:
+
+ http://www.netperf.org/netperf/NetperfPage.html
+
+is no more - or rather the utilities for accessing it no longer run.
+The data is still present in the tree, albeit _VERY_ old now.
+
+There is an Internet mailing list devoted to netperf. It is called
+netperf-talk and it is hosted on netperf.org. Subscription requests
+should go to netperf-talk-request@netperf.org.
+
+Please DO NOT SEND subscription requests to netperf-talk!
+
+If you run into severe difficulties, or are just feeling chatty,
+please feel free to drop some email to me - Rick Jones
+<raj@cup.hp.com>. Be sure to include a meaningful subject lines.
+
+happy benchmarking,
+rick jones
+
+BE SURE TO READ THE MANUAL. EVEN THOUGH IT MAY BE OUTDATED.
diff --git a/netperf-2.4.4/README.aix b/netperf-2.4.4/README.aix
new file mode 100644
index 0000000..2e57b64
--- /dev/null
+++ b/netperf-2.4.4/README.aix
@@ -0,0 +1,24 @@
+Pseudo-random things about netperf on AIX:
+
+While it _should_ not be necessary in the release bits, the rc bits
+for netperf 2.4.0 required:
+
+ configure _may_ need:
+
+ CFLAGS="-qcpluscmt -lperfstat"
+
+ until such time as Rick Jones can figure-out or be told how to
+ automagically add those using the configure script (hint hint :)
+
+The release bits should be OK without the above. Depending on the
+name used to invoke the compiler, the -qmumble option may be implicit.
+
+AIX include files have a VERY unfortuneate set of #define's in them
+for phrases network oriented programs are QUITE likely to have in
+their source - "rem_addr" and "rem_size" A "cousin" of the Netperf
+Contributing Editor reports this interferes with --enable-dlpi
+compilation and that it was also a problem for MySQL compiltion.
+While we await IBM's APAR with bated breath, netperf has been kludged
+to workaround this bug in IBM's include files. It has been reported
+that a "PMR" 34940,212,848 has been submitted to IBM in relation to
+this bug in their header files.
diff --git a/netperf-2.4.4/README.hpux b/netperf-2.4.4/README.hpux
new file mode 100644
index 0000000..7818449
--- /dev/null
+++ b/netperf-2.4.4/README.hpux
@@ -0,0 +1,31 @@
+A note about CPU utilization...
+
+For HP-UX 11.0 <= system < 11.23 the configure script will select the
+"pstat" CPU utilization mechanism. This mechanism is the familiar
+HP-UX idle counter mechanism (for all incense and porpoises) and
+requires calibration. See src/netcpu_pstat.c for all the details.
+
+For HP-UX 11.23 >= system, the configure script will select the
+"pstatnew" CPU utilization mechanism. 11.23 adds cycle counts for
+user, kernel and interrupt modes to the idle cycle counter. As such,
+it _should_ be possible to simply take the sum of the four and the
+fractions and know how much time was spent in each mode.
+HOWEVER... there is a bug in the accounting for interrupt cycles,
+where interrupt cycles go missing. SOOO, since there is an accurate
+way to know what the total number of cycles should have been over the
+interval, and we know (ass-u-me) that the idle cycle counter is good
+(since the pstat mechanism has tested that one OK), we will take the
+ratio of idle to total cycles to compute CPU util.
+
+We will still calculate fractions for user, kernel and interrupt, and
+report them in debug (-d) output, but with a warning for interrupt
+time. See src/netcpu_pstatnew.c for all the details.
+
+Up through HP-UX 11.23 (aka 11iV2) if you enable burst mode, and
+happen to send sub-MSS requests and/or responses you _cannot_ assume
+that the packet per second rate on the wire will match the transaction
+per second rate reported by netperf, even if you set TCP_NODELAY with
+the test-specific -D option. The HP-UX 11.X TCP stack likely will be
+generating some immediate 'standalone' ACKnowledgements which may not
+be generated by other stacks. This has been reported to the HP-UX TCP
+folks, and an announcement will be made when that issue is resolved.
diff --git a/netperf-2.4.4/README.osx b/netperf-2.4.4/README.osx
new file mode 100644
index 0000000..eb5dbe5
--- /dev/null
+++ b/netperf-2.4.4/README.osx
@@ -0,0 +1,4 @@
+If you are reading this, it suggests you are using a version of
+netperf in which the issue of file/directory name case insensitivity
+in OSX has been worked-around by renaming the NetPerf and NetServer
+directories to NetPerfDir and NetServerDir respectively.
diff --git a/netperf-2.4.4/README.ovms b/netperf-2.4.4/README.ovms
new file mode 100644
index 0000000..f37b89d
--- /dev/null
+++ b/netperf-2.4.4/README.ovms
@@ -0,0 +1,66 @@
+February 11, 2003
+
+At the time of the initial port, I was not aware of a make facility
+for OpenVMS. So, I would just compile and link the various files by
+hand:
+
+ $ cc netperf.c
+ $ cc netlib.c
+ $ cc netsh.c
+ $ cc nettest_bsd.c
+ $ cc netserver.c
+ $ link/exe=netperf netperf.obj,netsh.obj,netlib.obj,nettest_bsd.obj
+ $ link/exe=netserver netserver.obj,netsh.obj,netlib.obj,nettest_bsd.obj
+
+Installation for OpenVMS has a few differences from installation under
+say Unix. There is no inetd for VMS - however, there is the concept
+of an adding an auxilliary service that seems quite similar.
+
+To configure netperf for operation as an auxilliary service, you will
+need to edit/use the netserver_run.com file and alter the "path" to
+netserver accordingly. The version that ships is setup for where Rick
+Jones did his initial porting work and most likely is not apropriate
+for you :)
+
+ $ define sys$output sys$sysroot:[netperf]hello_service.log
+ $ define sys$error sys$sysroot:[netperf]hello_service.log
+ $ run sys$sysroot:[netperf]netserver.exe
+
+Then it will be necessary to "define" netperf (netserver) as an
+auxilliary service. This will need to be customized as apropriate for
+your system
+
+ $ tcpip set service netserver -
+ _$ /port=12865 -
+ _$ /protocol=tcp -
+ _$ /user=system -
+ _$ /limit=48 -
+ _$ /process_name=netserver -
+ _$ /file=sys$sysroot:[netperf]netserver_run.com
+
+And then it is necessary to enable the service:
+
+$ tcpip enable service netserver
+
+If you want to disable the service, you can issue the command
+
+$ tcpip set noservice netserver
+
+By default, OpenVMS is case-insensitive with commandlines, and will
+downshift everything to lower case. This does not interact well with
+netperf's use of command-line options like "-H" and "-h" with rather
+different meanings.
+
+To workaround that, the following defines are believed to be
+sufficient.
+
+$ define DECC$ARGV_PARSE_STYLE ENABLE
+$ define DECC$EFS_CASE_PRESERVE ENABLE
+$ define DECC$POSIX_SEEK_STREAM_FILE ENABLE
+$ define DECC$EFS_CHARSET ENABLE
+$ set process /parse_style=extended
+
+I do not know if this will be something one can also do for the
+netserver - presumeably one could put these things in the
+netserver_run.com file (guessing). At present though I've not tried
+that, and I'm also not sure that netserver has any upper-case options.
diff --git a/netperf-2.4.4/README.solaris b/netperf-2.4.4/README.solaris
new file mode 100644
index 0000000..c60ca10
--- /dev/null
+++ b/netperf-2.4.4/README.solaris
@@ -0,0 +1,29 @@
+Until the release bits the following was true:
+
+ Until such time as Rick Jones can figure-out or be told how to make it
+ automagic in the configure script, prior to configure on solaris, you
+ may need:
+
+ CFLAGS="-lsocket -lnsl -lkstat"
+
+ and if you are trying to compile the SCTP tests:
+
+ CFLAGS="-lxnet -lsocket -lnsl -lkstat -D_XOPEN_SOURCE=500 -D__EXTENSIONS__"
+
+as the release bits have a "smarter" configure script, and the SCTP
+tests use libsctp, the above no longer applies. It should all just be
+automagic (although for SCTP you still must --enable-sctp at configure
+time)
+
+Beware CPU util figures on anything before Solaris 10 that does not
+say 100%, and still be a triffle cautious with Solaris 10 CPU util
+reports. The CPU time accounting mechanisms either do not track time
+spent servicing interrupts, or do so in parallel with time spent in
+user/kernel/idle which means that some idle time isn't _really_ idle
+time.
+
+And beyond that, it is still not clear if the CPU utilization reported
+on systems with hardware threading support (eg UltraSPARC-T1) is
+really accurate even ignoring the issue with interrupt time. It is
+likely that to be truely accurate, it is necessary to know how much
+"real work" any one strand performed.
diff --git a/netperf-2.4.4/README.windows b/netperf-2.4.4/README.windows
new file mode 100644
index 0000000..db945f5
--- /dev/null
+++ b/netperf-2.4.4/README.windows
@@ -0,0 +1,106 @@
+It has been reported that versions of netperf have configured and
+compiled under Cygwin.
+
+It is also known that netperf has compiled using the Windows DDK.
+Here is a skeleton of the instructions to do so:
+
+Steps are:
+
+A) Install the Windows driver developer kit (if not already done).
+
+B) open a Cmd windows (i.e., a DOS box) for the target environment
+ (target OS version; free vs checked build; x86, AMD64, or IA64).
+ This is picked from the "Start\Developer Kits" path.
+
+C) enter the src\NetPerfDir directory
+
+D) Edit sources to enable any desired optional features (eg
+ -DWANT_HISTOGRAM) or to remove features which your version of
+ Windows might not support (eg -DHAVE_STRUCT_SOCKADDR_STORAGE)
+
+E) while still in the src\NetperfDir directory type "build /cD".
+
+F) Repeat steps C through E in src\NetServerDir
+
+G) the target files will be in a directory like:
+ NetPerfDir\objchk_wnet_IA64\IA64, NetServerDir\objchk_wnet_IA64\IA64
+ NetPerfDir\objfre_wnet_x86\i386, or NetPerfDir\objfre_wnet_AMD64\amd64
+
+NOTE: If any components of the path (ie the full names of the files,
+including parent directories) contain spaces (eg "My Documents"),
+build will charge off into the weeds.
+
+And if that weren't enough, it is also known that netperf has been
+compiled using MS Visual Studio 2003. Here are the instructions from
+the person who made that work (See Authors):
+
+1. Under the PROJECT tab, <project name> PROPERTIES, LINKER folder,
+Select COMMAND LINE and add WS2_32.lib in the whitespace labeled
+Additional Options:
+
+
+2. Under the PROJECT tab, <project name> PROPERTIES, C/C++ foleder,
+Select Preprocessor, On the right, add DO_IPV6; at the end of the
+Preprocessor Definitions whitespace.
+
+
+He goes on to say:
+
+NOTE: WHEN COMPLING NETSERVER, it works, but I got issued the
+foillowing warnigns in my build:
+
+
+------ Rebuild All started: Project: netserver, Configuration: Debug Win32 ------
+
+Deleting intermediate files and output files for project 'netserver', configuration 'Debug|Win32'.
+
+Compiling...
+
+nettest_bsd.c
+
+g:\Program Files\netperf\netperf-2.4.1rc1\src\nettest_bsd.c(846) : warning C4267: 'function' : conversion from 'size_t' to 'int', possible loss of data
+
+g:\Program Files\netperf\netperf-2.4.1rc1\src\nettest_bsd.c(1303) : warning C4267: 'function' : conversion from 'size_t' to 'int', possible loss of data
+
+g:\Program Files\netperf\netperf-2.4.1rc1\src\nettest_bsd.c(2020) : warning C4267: 'function' : conversion from 'size_t' to 'int', possible loss of data
+
+g:\Program Files\netperf\netperf-2.4.1rc1\src\nettest_bsd.c(5080) : warning C4267: 'function' : conversion from 'size_t' to 'int', possible loss of data
+
+g:\Program Files\netperf\netperf-2.4.1rc1\src\nettest_bsd.c(5715) : warning C4267: 'function' : conversion from 'size_t' to 'int', possible loss of data
+
+g:\Program Files\netperf\netperf-2.4.1rc1\src\nettest_bsd.c(6591) : warning C4267: 'function' : conversion from 'size_t' to 'int', possible loss of data
+
+g:\Program Files\netperf\netperf-2.4.1rc1\src\nettest_bsd.c(8013) : warning C4267: 'function' : conversion from 'size_t' to 'int', possible loss of data
+
+g:\Program Files\netperf\netperf-2.4.1rc1\src\nettest_bsd.c(11123) : warning C4267: 'function' : conversion from 'size_t' to 'int', possible loss of data
+
+netsh.c
+
+netserver.c
+
+g:\Program Files\netperf\netperf-2.4.1rc1\src\netserver.c(457) : warning C4267: 'function' : conversion from 'size_t' to 'int', possible loss of data
+
+netlib.c
+
+g:\Program Files\netperf\netperf-2.4.1rc1\src\netlib.c(2470) : warning C4267: 'function' : conversion from 'size_t' to 'int', possible loss of data
+
+g:\Program Files\netperf\netperf-2.4.1rc1\src\netlib.c(2480) : warning C4267: 'function' : conversion from 'size_t' to 'int', possible loss of data
+
+netcpu_ntperf.c
+
+inet_ntop.c
+
+Generating Code...
+
+Linking...
+
+Build log was saved at "file://g:\Documents and Settings\Administrator\My Documents\Visual Studio Projects\netserver\Debug\BuildLog.htm"
+
+netserver - 0 error(s), 11 warning(s)
+
+
+
+---------------------- Done ----------------------
+
+Rebuild All: 1 succeeded, 0 failed, 0 skipped
+
diff --git a/netperf-2.4.4/Release_Notes b/netperf-2.4.4/Release_Notes
new file mode 100644
index 0000000..b78ebd2
--- /dev/null
+++ b/netperf-2.4.4/Release_Notes
@@ -0,0 +1,762 @@
+These are the Release Notes leading-up to Revision 2.4.4 of netperf:
+
+Things changed in this release:
+
+*) The LOC_CPU and REM_CPU tests will report their respective beliefs
+ as to the number of CPUs present when the verbosity is set to more
+ than one. This can be used when trying to diagnose issues with CPU
+ utilization.
+
+*) A kind soul who wishes to remain anonymous provided a patch to
+ enable use of sendfile() on OSX.
+
+*) Fix a misplaced \n in a format string of send_tcp_maerts, courtesy
+ of Alexander Duyck.
+
+*) There is an experimental global -r option which will allow one to
+ include CPU utilization measurements, but make the decision about
+ hitting confidence based on the result only. The test banner will
+ reflects this when -r is used.
+
+*) It is no longer necessary to specify a file with the global -F
+ option when running a _SENDFILE test. Netperf will create a
+ temporary file and populate it with random data and use that. If
+ running aggregate tests it is strongly suggested one use a -F
+ option. Otherwise, the overhead spent creating and populating the
+ temporary file will be included in the CPU utilization calculation.
+
+*) The configure script recognizes Solaris 11 and selects the correct
+ CPU utilization mechanism - or rather it selects the same mechanism
+ as is used in Solaris 10. Fix courtesy of Andrew Gallatin.
+
+*) Convert a number of struct sockaddr_in's to struct
+ sockaddr_storage's and add requisite casts to deal with some abort
+ problems on Windows and perhaps other platforms as well. Kudos to
+ Alexander Duyck.
+
+*) One can now pass a value of 'x' to the global -f option to specify
+ the units as transactions per second. This is the default for any
+ request/response test, which is determined by there being a "double
+ `r'" in the name - eg "RR," "rr," "Rr," or "rR." At present only
+ the TCP_RR test actually looks for this to be set.
+
+*) One can request bits/bytes per second as the primary output of a
+ TCP_RR test by setting the global -f option to [kmgKMG] as with any
+ of the "STREAM" tests. This converts the primary throughput metric
+ to a bitrate (byterate) following the verbosity rules for a STREAM
+ test. Service demand remains usec/Transaction regardless of the
+ setting of the global -f option.
+
+ A verbosity level of 2 or more will cause the TCP_RR test to report
+ calculated average RTT latency, transaction rate, and inbound and
+ outbound transfer rates regardless of the primary units selected
+ with the global -f paramter. If the primary output is transactions
+ per second, the reported inbound and outbound transfer rates will
+ be 10^6 bits per second, otherwise, they honor the setting of the
+ global -f option.
+
+ All of this is EXPERIMENTAL and subject to change without prior
+ notice in future versions of netperf.
+
+*) Replace "break" with "break 2" in acinclude.m4 for a socklen macro
+
+*) The default for the requested socket buffer size is changed from 0
+ to -1 to enable passing a value of 0 under Windows, which tells that
+ stack one wishes to enable copy-avoidance.
+
+*) Call fflush() on each interim result displayed in demo mode to make
+ things happier for folks redirecting same to a file. From Dan
+ Yost.
+
+*) In theory each distinct netserver child will have a debug log with
+ its pid appended to the name, somewhat like what appears to happen
+ under Windows.
+
+*) A new global, command-line option to netperf and netserver has been
+ added. The -V option will cause netperf/netserver to display its
+ version and exit.
+
+*) Setting -I without setting -i will now implicitly set the iteration
+ minimum and maximums as if a -i 10,3 were set. Also, some further
+ sanity checking on the bounds for each is made.
+
+*) Fixed a typo in the manual (found by Emir Halepovic) so the
+ description for the -s and -S options properly specifies they
+ affect the data connection.
+
+These are the Release Notes for Revision 2.4.3 of netperf:
+
+Things changed in this release:
+
+*) The UDP_STREAM test includes --enable-demo support, courtesy of
+ patches from Scott Weitzenkamp.
+
+*) The nettest_dns.* files have been removed from the release and the
+ repository. Those wishing to perform DNS server tests should
+ migrate to netperf4 which has better support for DNS test.
+
+*) Fixes for compiling under Windows with Mingw/gcc courtesy of Gisle
+ Vanem.
+
+*) A new global option - -N - has been added. When specified, this
+ option will tell netperf to not bother to try to establish a
+ control connection with a remote netserver. Instead, netperf will
+ only attempt to make a data connection to the remote system. By
+ default, this will be to the "discard" service for a "STREAM" or
+ "SENDFILE" test, the "echo" service for a "RR" test and the
+ "chargen" service for a "MAERTS" test. Any "remote" settings are
+ changed to reflect their being unused in the test, and a "no
+ control" tag is added to the test banner when -N is specified.
+
+ This still needs to be propagated to other test files - at least
+ for those for which it may make sense.
+
+*) The tests in nettest_bsd.c have been altered to not actually take
+ timestamps and deltas in --enable-histogram unless the verbosity
+ level has been set to actually display a histogram. This reduces
+ the overhead measurably, even on systems with "fast" time calls,
+ which _may_ mean that a future release of netperf may have
+ histogram support enabled by default.
+
+ This still needs to be propagated to other test files. Patches
+ from the community would be most welcome :)
+
+*) Eliminate a bogus fprintf from the signal catching routine which
+ was being executed when both intervals and demo mode were active at
+ the same time.
+
+*) The nettest_ipv6.* files are no longer included in the source
+ tar/zip file. IPv6 functionality has been subsumed into the
+ nettest_bsd.* files for some time now.
+
+*) Use a higher resolution "time" source for HISTOGRAM support under
+ Windows, courtesy of Spencer Frink. Prior to this it had no better
+ than 10ms granularity which could lead to some rather strange
+ looking results :)
+
+*) A bug fix reporting recv_size rather than send_size in TCP_MAERTS
+ when CPU utilization was requested.
+
+*) A bug fix for buffer filling from a file to properly advance the
+ buffer pointer when the file is smaller than the send buffer.
+
+*) Enable certain UDP tests which previously used unconnected sockets
+ to use connected sockets. Courtesy of Shilpi Agarwal.
+
+*) The OSX CPU utilization code actually gets put into the tarball in
+ a make dist now :)
+
+*) The check to make sure that getaddrinfo returned ai_protocol and/or
+ ai_socktype's matching that which we requested is done for all socket
+ and/or protocol types and a warning is emitted if it returns any which
+ do not match.
+
+*) The linux CPU affinity code has been made capable of binding to
+ CPU's >=32 on a 32-bit compilation and >=64 on a 64-bit
+ compilation.
+
+*) More complete closing/redirecting of stdin/stdout/stderr/where in
+ netserver to make it easier to launch netserver at the far-end of a
+ remote shell. Courtesy of Hans Blom.
+
+*) Sendfile changes for Solaris courtesy of Andrew Gallatin.
+
+*) "spec" file support to generate RPMs courtesy of Martin Brown
+
+These are the Release Notes for Revision 2.4.2 of netperf:
+
+Things changed in this release:
+
+*) Fixes for floating point format differences, courtesy of George
+ Davis.
+
+*) Additions for CPU util support on MacOS X, courtesy of Anonymous.
+
+*) Processor affinity is now supported on AIX 5.3 (perhaps earlier)
+ via the bindprocessor system call.
+
+*) Fixes for test lockups with TCP_CRR and TCP_CC under Windows
+ courtesy of Dikon Reed.
+
+*) Fixes to netcpu_looper.c to get it to actually compile :)
+
+*) Have netcpu_looper use the bind_to_specific_processor() call
+ provided by netlib since that knows about more platforms than the
+ code in netcpu_looper did. The looper CPU binding will use a
+ mapping to handle cases where the CPU id's on the system may not be
+ a contiguous space starting from zero. At present, the code that
+ setups the mapping only knows about retrieving actual CPU ids under
+ HP-UX.
+
+*) The netcpu_sysctl method becomes calibration-free, courtesy of
+ Andrew Gallatin
+
+These are the Release Notes for Revision 2.4.1 of netperf:
+
+Things changed in this release:
+
+*) There is now a -B global command-line argument that will append its
+ parameter as a string to the end of result lines when test banners
+ have been suppressed. this is to make it easier to distinguish one
+ result from another when aggregate restults are being run in
+ parallel, without having to resort to having the individual results
+ shell redirected to a file. This has been done for some of the
+ tests in nettest_bsd.c, but not all of them, nor for the tests in
+ the other nettest_mumble.c files.
+
+*) There is now an --enable-spin configure option that will enable
+ intervals if not already enabled and will have the sender sit and
+ spin in a tight loop until time for the next interval rather than
+ wait for an interval timer to expire. This means it should be
+ possible to have a much finer granularity on the interval, at the
+ expense of an EXTREME increase in CPU utilization. (To the extent
+ I'm considering disabling measurement of local CPU utilization when
+ that mode is enabled, and bursts have been requested - your
+ feedback on that topic would be most appreciated)
+
+ If only --enable-intervals is used with configure, the old set the
+ interval timer and wait method is still used.
+
+ If --enable-spin is configured, the test banner will include "spin
+ intervals" rather than the "intervals" from a plain
+ --enable-intervals. The sit and spin will either use
+ gettimeofday(), or gethrtime() if gethrtime() is available.
+
+ This has been implemented in the tests of nettest_bsd.c but none of
+ the others. Volunteers would be most welcome. I would entertain
+ the notion of making the implementation a series of inline
+ functions in netlib. This holds true for the demo mode - why will
+ become clear when you look at nettest_bsd.c. While things are
+ considerably cleaner than they were before, with reuse within
+ nettest_bsd.c, there is no resuse with the rest of the
+ nettest_mumble.c files.
+
+*) the -w option for the interval time now takes three optional
+ suffixes. if the suffix is 'm' (eg 10m) it will assume the user has
+ specified time in units of milliseconds. if the suffix is 'u' it
+ will assume microseconds, and if 's' seconds. no suffix remains
+ milliseconds for backwards compatability with previous netperf
+ versions.
+
+*) It should be possible to successfully compile with
+ --enable-intervals.
+
+These are the Release Notes for Revision 2.4.1 of netperf:
+
+Things changed in this release:
+
+*) netcpu_pstatnew.c has been altered to workaround a bug in the
+ interrupt cycle accounting in HP-UX 11.23 that is not expected to
+ be resolved until a later release. basically, some interrupt time
+ is not counted, which means the sum of idle, user, kernel and
+ interrupt is less than the cycles per second multiplied by the
+ elapsed time. the workaround preserves the "no calibration
+ required" nature of the pstatnew CPU utilization mechanism. you
+ can see more in netcpu_pstatnew.c and/or in debug output.
+
+*) in netlib.c recv_response has been renamed
+ recv_response_timed(addl_time) which is now used in
+ calibrate_remote_cpu in place of the "sleep(40);recv_response()"
+ sequence. This then allows the REM_CPU test to complete in less
+ than 40 seconds when the remote's CPU utilization mechanism does
+ not require calibration. The value of "addl_time" is added to the
+ tc_sec field of the select() timeout. A "new" recv_response has
+ been added that simply calls recv_response_timed(0) - this is to
+ minimize the number of changes needed elsewhere in the code.
+
+*) hopefully, this release fixes problems people have been having with
+ the configure script failing when picking a type for socklen_t.
+ now, instead of generating an error, it emits a warning and simply
+ tries socklen_t
+
+*) the configure script no longer looks for the size of an in_port_t
+
+*) netlib.c now has code to perform processor binding for Tru64, but
+ the configure script may or may not detect it correctly. This means
+ that one may have to edit the config.h file by hand to get the
+ functionality.
+
+*) it is known that netperf will compile under Windows XP and 2003
+ using the DDK it is possible that netperf 2.4.1 will compile on a
+ Windows system under VC++/Visual Studio. It might even work!-) See
+ the README.window file for additional details.
+
+Things _NOT_ changed in this release:
+
+*) The automagic determination of the number and type of parameters to
+ sched_setaffinity under Linux remains brittle at best.
+
+These are the Release Notes for Revision 2.4.0 of netperf:
+
+Things changed in this release:
+
+*) Netperf has been converted to use a configure script. Yes boys and
+ girls, after 12 years of distributing netperf with just a makefile
+ I have finally bitten the bullet and cast my fate to autoconf,
+ automake, etc. To get the most basic netperf built all you should
+ need to do is:
+
+ cd to the netperf directory
+ ./configure
+ make
+ and perhaps
+ make install
+
+ (Note, I've not done much with make install - I'm hemming and
+ hawing over what the default installation location should be)
+
+ Please keep in mind that this is the first time I've tried to use
+ autoconf et al. I am sure there are things that should be done
+ differently and would welcome any and all constructive criticisms.
+
+ I suspect there are several places where I've not fully
+ demonstrated being of the autoconf body - particulary as pertains
+ to include files being in "#if mumble #endif" blocks. Fixes would
+ be most welcome.
+
+*) Speaking of becomming one with various GNU tools, work on a new
+ netperf manual has begun, with the source being a texinfo document
+ that is converted to "all" the other formats. This resides in doc/
+ .
+
+*) The platform-specific parts of CPU utilization measurement have
+ been broken-out into separate .c files and selected at configure
+ time a la the pcap_mumble files of tcpdump. This makes
+ src/netlib.c _much_ easier to read and the addition of new CPU
+ utilization mechanisms much easier.
+
+*) New HP-UX 11.23 and Solaris 10 CPU utilization measurement
+ mechanisms (called pstatnew and kstat10 respectively) need no
+ calibration step. Both have variations on microstate accounting.
+ HP-UX 11.23 still identifies the method in the headers as 'P' for
+ pstat. The kstat10 method is identified as 'M' for Microstate.
+
+ Scripts which make calibration runs with LOC_CPU and REM_CPU may
+ continue to do so, they will just run forty to eighty seconds
+ faster on platforms with the calibration-free CPU util mechanisms.
+
+*) Automatic detection of CPU utilization mechanism for HP-UX, Linux,
+ AIX, *BSD and Solaris. If you do not like what the configure
+ script selects, you can use --enable-cpuutil=<foo> .
+
+*) The "times" (aka 'T') CPU utilization mechanism has been removed.
+ It was never very accurate at all, only showing CPU time charged to
+ the process, and with interrupts and other network processing it is
+ rarely chaged to a or the correct process. It and other methods
+ may remain in the format_cpu_method() routine of src/netlib.c for
+ historical purposes only.
+
+*) CAVEAT - the "kstat" mechanism is KNOWN TO BE BOGUS for Solaris.
+ It does not include time spent processing interrupts, and
+ networking benchmarks will generate at least a few of those...
+ This affects _ALL_ versions of Solaris with kstat.
+
+ So, do NOT trust any CPU util figures where netperf says the method
+ was 'K' for kstat - unless perhaps it reports 100% CPU util.
+
+ Solaris 10 takes a step in the right direction adding microstate
+ accounting similar to what netperf uses on HP-UX 11.23. HOWEVER,
+ Solaris 10's accounting for user/kernel/idle is done in _parallel_
+ with interrupt, which means they overlap. Doubleplusungood. Netperf
+ attempts to compensate for that with some handwaving
+ (src/netcpu_kstat10.c)
+
+*) Initial support for SCTP has been added with the SCTP_STREAM and
+ SCTP_RR tests. These tests use the libsctp mechanisms for
+ increased portability. It has been explained that libsctp should
+ not impart all that much overhead and it does make things rather
+ simpler.
+
+*) Netperf now uses getaddrinfo() to resolve hostnames and IP
+ addresses. A replacement getaddrinfo() is provided for those
+ platforms where the configure script cannot tell that getaddrinfo
+ is present.
+
+ There are cases where a host's getaddrinfo call may return results
+ that ignore the hints for protocol. Netperf catches these and
+ reports a warning so you can pester your OS source for fixes.
+
+ Solaris getaddrinfo() seems to return results with SCTP procotol
+ cleared.
+
+ Mac OS X getaddrinfo botches when the service/port is specified as
+ "0" so one must specify a port number on the netperf command line.
+
+ AIX 5.something getaddrinfo has a different but similar problem
+ with "0" as a port/service name as well.
+
+ Linux 2.6 and HP-UX 11i getaddrinfo seem to be fine - at least as
+ far as netperf goes :)
+
+*) A "Demo Mode" has been added to the main BSD Sockets/TCP/UDP tests:
+ TCP_STREAM, TCP_MAERTS, TCP_SENDFILE, TCP_RR, TCP_CC, TCP_CRR and
+ UDP_RR. It has not been added to UDP_STREAM. This mode is enabled
+ with --enable-demo when configuring netperf, which activates a
+ global "-D" option. By default, -D will cause interim results
+ (throughput or transactions/s only, not CPU util) from the
+ netperf's perspective to be emitted no sooner than once per second.
+ An optional parameter can specify another interval in units
+ (floating point) of seconds:
+
+ -D 1.5
+
+ will make the reporting interval at least 1.5 seconds.
+
+ This mode makes no use of explicit interval timers since that can
+ be so, well fun on different platforms. Instead, an initial guess
+ of how many units of work must be done to consume the desired
+ reporting interval is made, and that guess is refined throughout
+ the entire test. If something happens to dramatically slow-down
+ the test, the reproting interval may become must larger for a few
+ intervals. When things speed-up it is detected very quickly. As
+ with the --enable-historgram support, if gethrtime() is available
+ on the platform, it will be used in lieu of gettimeofday(). In any
+ case, the number of calls to gettimeofday()/gethrtime() is much,
+ Much, MUCH smaller than for --enable-histogram so while there may
+ be a measurable effect on the results, it should be rather small.
+
+*) The global -H option has been enhanced to take an optional address
+ family specification for the control connection:
+
+ -H <remote>,<family>
+
+ Unlike other comma-separated options, where specifying only one
+ thing will set both, here specifying only one thing will be
+ ass-u-me-d to be the <remote> and will leave <family> defaulted
+ (AF_UNSPEC). Family can be specified as "4" or "inet" for
+ AF_INET, "6" or "inet6" for AF_INET6.
+
+*) A new global -L option has been added to specify the local name/IP
+ and/or address family for the control connection:
+
+ -L <local>,<family>
+
+ Unlike other comma-separated options, where specifying only one
+ thing will set both, here specifying only one thing will be
+ ass-u-me-d to be the <local> and will leave <family> defaulted
+ (AF_UNSPEC). Family can be specified as "4" or "inet" for
+ AF_INET, "6" or "inet6" for AF_INET6.
+
+*) Test-specific -H and -L options are present for the TCP, UDP and
+ SCTP tests, which are now (intended to be) IP protocol version
+ agnostic.
+
+*) Global -4 and -6 options will set the both the local and remote
+ address family to either AF_INET or AF_INET6 respectively.
+
+*) Test-specific -4 and -6 options have been added for TCP, UDP and
+ SCTP tests.
+
+*) Since the basic TCP UDP and SCTP tests are no longer IPv4-only, the
+ nettest_ipv6.[ch] files are only included in the source
+ distribution for historical interest.
+
+*) The main test banners for the TCP, UDP and SCTP tests have been
+ enhanced to give both local and remote addressing information for
+ the data connection.
+
+*) Compilation under Windows is likely FUBAR at this point. I _hope_
+ to start trying to do builds under the DDK soon, but am not sure
+ when I'll be able to start. Any and all assistance you can give
+ there would be most welcome.
+
+*) Various and sundry fixes. TCP_RR should no longer go into an
+ infinite loop when you abort netperf. I'm sure there are others.
+
+*) Unix domain socket tests are compiled-in with --enable-unix=yes at
+ configure time.
+
+*) DLPI tests are compiled-in with --enable-dlpi=yes at configure
+ time.
+
+*) XTI tests are compiled-in with --enable-xti=yes at configure time.
+
+Things not changed in this release:
+
+*) Seems like everything has changed :)
+
+These are the Release Notes for Revision 2.3pl2 of netperf:
+
+Things changed in this release
+
+*) One can bind netperf or netserver to specific CPUs with the -T
+ option. This is a generalization of some HP-UX and netserver specific
+ work from 2.3pl1.
+
+*) Extend the kludge to workaround the Linux setsockopt/getsockopt
+ bizzarreness to the socket buffer sizes for the remote side in
+ addition to the local side.
+
+*) Fix the lack of initialization of times_up in recv_tcp_maerts()
+ that caused confidence intervals to fail miserably.
+
+*) Other misc fixes - than you to all of you who sent them.
+
+These are the Release Notes for revision 2.3pl1 of netperf:
+
+Things changed in this release
+
+*) The bind() call in create_data_socket() in the file nettest_bsd.c
+ is no longer conditional on the user's specifying an IP address or
+ port number to which the data socket should be bound. This fixes
+ the "connection refused" errors in the UDP tests.
+
+*) Some experimental code to allow one to specify a CPU to which the
+ remote netserver should be bound. This is intended to allow one to
+ get greater certainty (as in confidence intervals) on SMP
+ systems. At present the functionality is HP-UX specific.
+ Submittals of changes for a more general approach are welcomed.
+
+These are the Release Notes for revision 2.3 of netperf:
+
+Things changed in this release
+
+*) The user can now specify local and/or remote port numbers for the
+ data connection using the -P test-specific option. This is to
+ support those folks who want to run netperf through those evil,
+ end-to-end-breaking things known as firewalls... :) This changes
+ the format of some of the control messages, hence the bump in the
+ update number in the VUF. While it may be possible to mix 2.3 and
+ pre-2.3 netperf and netserver, it is not supported.
+
+*) The user can now specify local and/or remote IP addresses for the
+ data connection using the -I test-specific option. This is to
+ support those folks who want to run netperf through those evil,
+ end-to-end-breaking things known as firewalls... :) This changes
+ the format of some of the control messages, hence the bump in the
+ update number in the VUF. While it may be possible to mix 2.3 and
+ pre-2.3 netperf and netserver, it is not supported.
+
+*) Set DL_mumble message priorities in the DLPI tests
+
+*) Fix error return check for getaddrinfo()
+
+*) Those systems with gethrtime() can define -DHAVE_GETHRTIME to use
+ gethrtime() instead of gettimeofday() and reduce the measurement
+ overhead when enabling the -DHISTOGRAM functionality.
+
+*) The default for -DHISTOGRAM compilation now adds a UNIT_USEC and
+ TEN_USEC row and renames TENTH_MSEC to HUNDRED_USEC. If you want
+ the old behaviour add -DOLD_HISTOGRAM to CFLAGS.
+
+*) Add missing '!' in the recv_udp*_stream so we recognize the end of
+ a timed test correctly.
+
+*) Replace "||" with "&&" to fix an infinite loop in
+ recv_tcp_conn_rr() most likely introduced in 2.2pl5.
+
+*) Code has been added to kludge around the bug in Linux getsockopt()
+ where it almost always returns twice the value for which one
+ asks unlike virtually every other stack on the face of the
+ planet. This was doing some unpleasant things to tests in which
+ confidence intervals were requested.
+
+Things not changed in this release
+
+*) Lots :)
+
+These are the Release Notes for revision 2.2pl5 of netperf:
+
+Things changed in this release
+
+*) Improved (perhaps even usable :) support for Windows, including
+compilation and run on Win64.
+
+*) Fixes for MacOS X and FreeBSD
+
+Things not changed in this release
+
+*) Specifying the port number(s) for the data connection
+
+These are the Release Notes for Revision 2.2pl4 of netperf:
+
+Things changed in this release
+
+*) USE_SYSCTL available on suitable FreeBSD releases to measure CPU
+ utilization without having to resort to -DUSE_LOOPER.
+
+*) Include Solaris 9 with the Linux sendfile path under -DHAVE_SENDFILE
+
+This still outstanding in this release
+
+*) Knowing why signals are not interrupting socket calls under
+ OpenVMS. A quick try to use threads for timing a la Win32 worked,
+ but also cut performance in half. Any and all assistance in this
+ area would be most welcome.
+
+These are the Release Notes for revisoin 2.2pl3 of netperf:
+
+Things changed in this release
+
+*) I started practicing what I preach and will set SO_REUSEADDR before
+ netserver tries to bind to its well-known port.
+
+*) Initial port to OpenVMS. This includes support for the OVMS
+ Auxilliary server (inetd replacement). See README.ovms for more
+ details on what is involved in compiling and running netperf under
+ OpenVMS.
+
+*) Testname comparisons are now case insensitive. This is a side
+ effect of OpenVMS downshifting commandlines to lowercase. I made
+ the change and decided it was OK to keep it that way, even though
+ for OpenVMS one _has_ to set the right defines to disable that
+ downshifting or the command-line options will not work. For example
+ "-H" will become "-h" which isn't quite the same thing...
+
+*) Misc fixes for nettest_ipv6.c.
+
+*) Support for sendfile() under Linux
+
+Thins I would like to have changed but did not know how or didn't have
+time:
+
+*) Allow netserver to run as a standalone daemon under OpenVMS
+*) Allow netserver to run as a standalone daemon under Windows
+*) Rediscover an inetd-like facility for Windows
+*) Figure-out how to get low-overhead, accurate, per-CPU utilization
+ figures under OpenVMS
+*) Get the UDP_RR and UDP_STREAM tests to work under OpenVMS, and get
+ the TCP_RR test to work based on time rather than transaction
+ count. There is some bug (possibly in OpenVMS?) where the SIGALRM
+ fires, but a socket call will not return an EINTR.
+
+Things that changed prior to this release:
+
+*) Addition of the TCP_MAERTS test - this is a TCP_STREAM test where
+ the data flows from the netserver to the netperf rather than from
+ the netperf to the netserver. This can be useful in those
+ situations where netperf (netserver) is installed on a remote
+ system, but the tester has no shell access and wishes to get
+ performance data for the path from netserver to netperf.
+
+These are the Release Notes for the 2.2 revision of netperf:
+
+Things changed in this release
+
+*) Various and sundry bugs fixed (in theory) for platforms such as
+ FreeBSD and Linux. If I left-out your bug fix, it was purely
+ accidental - my mind has a very small cache, and sometimes I will
+ "lose" email in the shuffle.
+
+*) Initial support for sendfile() on HP-UX. This test will use the
+ sendfile() call instead of send() to send data to the
+ remote. Netperf "lies" to netserver and calls it a TCP_STREAM test
+ since what netserver needs to do is exactly the same. A future
+ patch may change that and simply have netserver call the same
+ routine for both test types. Kudos to Charles Harris for the
+ initial prototype.
+
+*) The Fore ATM API and HiPPI tests have been dropped from the
+ distribution.
+
+Things I would have liked to have changed, but did not have time for:
+
+*) Conversion of the source and makefile to use the GNU configure/autoconf
+ utility to make it easier for folks to build by not having to edit
+ makefiles... You will notice that I have started to switch from
+ "DO_MUMBLE" to "HAVE_MUMBLE"
+
+as always - happy benchmarking,
+
+rick jones <raj@cup.hp.com>
+
+---------------------------------------------------------------------
+
+These are the Release Notes for the 2.1pl3 revision of netperf:
+
+*) An OBOB (Off By One Bug) in netlib.c that was causing a core dump
+ on Irix should be fixed.
+
+*) Irix systems should now be able to determine the number of CPU's
+ present automagically (code from outside, not tested yet because I
+ have no MP Irix systems at my disposal)
+
+*) An alpha version of a TCP_CC test has been added - this is a
+ TCP_CRR test with out the "RR."
+
+*) The -Ae has been removed from the default makefile. If someone has
+ a nice way to automagically generate the correct makefile for
+ different platforms I would like to learn how.
+
+happy benchmarking,
+
+rick jones <raj@cup.hp.com>
+
+----------------------------------------------------------------------
+
+These are the Release Notes for the 2.1 revision of netperf:
+
+Things Changed in this release:
+
+*) The XTI (Version 2 of the spec) tests are now documented in the
+ manual.
+
+*) The TCP_CRR (Connect Request/Response) test is now documented in
+ the manual, including a description of how it mimics the behaviour
+ of http (the protocol underlying the WWW).
+
+*) Support for for Windows NT 3.51 OS in the BSD Sockets tests (ok, so
+ they are really Winsock in that case :). Other test suites may be
+ ported as required/desired/appropriate.
+
+*) Tests for TCP and UDP, using the IPv6 extensions to BSD sockets are
+ included in this release. They are included by adding -DUSE_IPv6 to
+ the makefile and recompiling.
+
+*) Support for a "long long" datatype should only be required for
+ -DUSE_PSTAT compilation which is an HP-UX only thing. The
+ *unbundled* HP compilers from at least "HP92453-01 A.09.61 HP C
+ Compiler" and later should have the required support. The bundled
+ compiler may not. GCC should work - check the archives listed in
+ the comp.sys.hp.hpux FAQ for copies. The FAQ is archived on
+ rtfm.mit.edu under the path pub/usenet/comp.sys.hp.hpux.
+
+*) A "proper" fix for double data type alignment has been included.
+
+*) A new script is included with this release which can be used to
+ measure aggregate TCP_RR performance (multiple, concurrent
+ instances of the TCP_RR test). A related use of this script would
+ be measuring MP scaling. A single-byte TCP_RR test is good for this
+ purpose for two reasons:
+
+ 1) it excercises the control/protocol paths heavily without
+ using much in the way of data copies which may be easier to
+ scale.
+ 2) most systems can easily saturate cards with bandwidth, but
+ not so easily with request/response
+
+ Of course, feedback on this is most welcome.
+
+*) When measuring CPU utilization, the units for service demand have
+ been changed from milliseconds (designated ms) of CPU per unit (KB
+ or Transaction) to microseconds (desginated us).
+
+*) For accurate reporting of service demand, netperf needs to know the
+ number of CPU's present on a system. On some systems (HP-UX), this
+ is automatic. For others (All), it is necessary to add a global "-n
+ <numcpu>" option to both netperf and netserver.
+
+ !! IF THIS IS LEFT-OUT CPU UTILIZATION AND SERVICE DEMAND FOR !!
+ !! MULTI-PROCESSOR SYSTEMS WILL BE WRONG. !!
+
+ If you know of ways to programatically determine the number of
+ active CPUs on a system, please let the author Rick Jones
+ <raj@cup.hp.com> know.
+
+*) other things I've probably forgotten :)
+
+Things Not Changed in this release:
+
+*) The ancillary test suites are essentially unchanged - DLPI,
+ HiPPI/LLA, Unix Domain, and Fore ATM API. Unless there is much
+ interest expressed in these tests, 2.1 may be the last release in
+ which they are included. The order of retirement would likely be
+ Unix Domain, HiPPI/LLA, Fore ATM API, and then DLPI.
+
+Miscelaneous Comments:
+
+*) The -DUSE_LOOPER CPU utilization _seems_ to be nice and low-impact
+ on HP-UX, Digital Unix, and IRIX. It does not yet seem to be
+ low-impact on Solaris (I need an example of priocntl usage), AIX
+ (setpri only works if you are root), and NT (not sure of the
+ reason). Help with those problems would be most appreciated.
diff --git a/netperf-2.4.4/acinclude.m4 b/netperf-2.4.4/acinclude.m4
new file mode 100644
index 0000000..3895177
--- /dev/null
+++ b/netperf-2.4.4/acinclude.m4
@@ -0,0 +1,341 @@
+
+dnl This comes from libcurl's acinclude.m4. it is not clear if this
+dnl is original libcurl code, or other code, so we include the libcurl
+dnl copyright here
+dnl
+dnl
+dnl Copyright (c) 1996 - 2005, Daniel Stenberg, <daniel@haxx.se>.
+dnl
+dnl All rights reserved.
+dnl
+dnl Permission to use, copy, modify, and distribute this software for any purpose
+dnl with or without fee is hereby granted, provided that the above copyright
+dnl notice and this permission notice appear in all copies.
+dnl
+dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+dnl IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+dnl FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN
+dnl NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
+dnl OR OTHER DEALINGS IN THE SOFTWARE.
+dnl
+dnl Except as contained in this notice, the name of a copyright holder shall not
+dnl be used in advertising or otherwise to promote the sale, use or other dealings
+dnl in this Software without prior written authorization of the copyright holder.
+
+dnl Check for socklen_t: historically on BSD it is an int, and in
+dnl POSIX 1g it is a type of its own, but some platforms use different
+dnl types for the argument to getsockopt, getpeername, etc. So we
+dnl have to test to find something that will work.
+
+dnl Remove the AC_CHECK_TYPE - on HP-UX it would find a socklen_t, but the
+dnl function prototypes for getsockopt et al will not actually use
+dnl socklen_t args unless _XOPEN_SOURCE_EXTENDED is defined. so, the
+dnl AC_CHECK_TYPE will find a socklen_t and think all is happiness and
+dnl joy when you will really get warnings about mismatch types - type
+dnl mismatches that would be possibly Bad (tm) in a 64-bit compile.
+dnl raj 2005-05-11 this change may be redistributed at will
+
+dnl also, added "extern" to the "int getpeername" in an attempt to resolve
+dnl an issue with this code under Solaris 2.9. this too may be
+dnl redistributed at will
+
+
+AC_DEFUN([OLD_TYPE_SOCKLEN_T],
+[
+ AC_MSG_CHECKING([for socklen_t equivalent])
+ AC_CACHE_VAL([curl_cv_socklen_t_equiv],
+ [
+ # Systems have either "struct sockaddr *" or
+ # "void *" as the second argument to getpeername
+ curl_cv_socklen_t_equiv=
+ for arg2 in "struct sockaddr" void; do
+ for t in int size_t unsigned long "unsigned long" socklen_t; do
+ AC_TRY_COMPILE([
+ #ifdef HAVE_SYS_TYPES_H
+ #include <sys/types.h>
+ #endif
+ #ifdef HAVE_SYS_SOCKET_H
+ #include <sys/socket.h>
+ #endif
+
+ extern int getpeername (int, $arg2 *, $t *);
+ ],[
+ $t len;
+ getpeername(0,0,&len);
+ ],[
+ curl_cv_socklen_t_equiv="$t"
+ break 2
+ ])
+ done
+ done
+
+ if test "x$curl_cv_socklen_t_equiv" = x; then
+ # take a wild guess
+ curl_cv_socklen_t_equiv="socklen_t"
+ AC_MSG_WARN([Cannot find a type to use in place of socklen_t, guessing socklen_t])
+ fi
+ ])
+ AC_MSG_RESULT($curl_cv_socklen_t_equiv)
+ AC_DEFINE_UNQUOTED(netperf_socklen_t, $curl_cv_socklen_t_equiv,
+ [type to use in place of socklen_t if not defined])
+])
+
+
+dnl *
+dnl * Copyright (c) 2001 Motoyuki Kasahara
+dnl *
+dnl * Redistribution and use in source and binary forms, with or without
+dnl * modification, are permitted provided that the following conditions
+dnl * are met:
+dnl * 1. Redistributions of source code must retain the above copyright
+dnl * notice, this list of conditions and the following disclaimer.
+dnl * 2. Redistributions in binary form must reproduce the above copyright
+dnl * notice, this list of conditions and the following disclaimer in the
+dnl * documentation and/or other materials provided with the distribution.
+dnl * 3. Neither the name of the project nor the names of its contributors
+dnl * may be used to endorse or promote products derived from this software
+dnl * without specific prior written permission.
+dnl *
+dnl * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+dnl * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+dnl * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+dnl * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORSBE
+dnl * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+dnl * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+dnl * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+dnl * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+dnl * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+dnl * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+dnl * THE POSSIBILITY OF SUCH DAMAGE.
+dnl *
+
+dnl *
+dnl * Check for h_errno.
+dnl *
+AC_DEFUN([AC_DECL_H_ERRNO],
+[AC_CACHE_CHECK(for h_errno declaration in netdb.h, ac_cv_decl_h_errno,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <netdb.h>]], [[
+h_errno = 0;
+]])],[ac_cv_decl_h_errno=yes],[ac_cv_decl_h_errno=no])])
+if test "$ac_cv_decl_h_errno" = yes; then
+ AC_DEFINE(H_ERRNO_DECLARED, 1,
+[Define to 1 if `h_errno' is declared by <netdb.h>])
+fi])
+
+dnl *
+dnl * Copyright (c) 2001 Motoyuki Kasahara
+dnl *
+dnl * Redistribution and use in source and binary forms, with or without
+dnl * modification, are permitted provided that the following conditions
+dnl * are met:
+dnl * 1. Redistributions of source code must retain the above copyright
+dnl * notice, this list of conditions and the following disclaimer.
+dnl * 2. Redistributions in binary form must reproduce the above copyright
+dnl * notice, this list of conditions and the following disclaimer in the
+dnl * documentation and/or other materials provided with the distribution.
+dnl * 3. Neither the name of the project nor the names of its contributors
+dnl * may be used to endorse or promote products derived from this software
+dnl * without specific prior written permission.
+dnl *
+dnl * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+dnl * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+dnl * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+dnl * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORSBE
+dnl * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+dnl * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+dnl * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+dnl * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+dnl * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+dnl * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+dnl * THE POSSIBILITY OF SUCH DAMAGE.
+dnl *
+
+dnl *
+dnl * Check for struct sockaddr_in6
+dnl *
+AC_DEFUN([AC_STRUCT_SOCKADDR_IN6],
+[AC_CACHE_CHECK(for struct sockaddr_in6, ac_cv_struct_sockaddr_in6,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>]], [[
+struct sockaddr_in6 address;
+]])],[ac_cv_struct_sockaddr_in6=yes],[ac_cv_struct_sockaddr_in6=no])])
+if test "$ac_cv_struct_sockaddr_in6" = yes; then
+ AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6, 1,
+[Define to 1 if <netinet/in.h> defines `struct sockaddr_in6'])
+fi])
+
+dnl *
+dnl * Check for struct sockaddr_storage
+dnl *
+AC_DEFUN([AC_STRUCT_SOCKADDR_STORAGE],
+[AC_CACHE_CHECK(for struct sockaddr_storage, ac_cv_struct_sockaddr_storage,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>]], [[
+struct sockaddr_storage address;
+]])],[ac_cv_struct_sockaddr_storage=yes],[ac_cv_struct_sockaddr_storage=no])])
+if test "$ac_cv_struct_sockaddr_storage" = yes; then
+ AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE, 1,
+[Define to 1 if <netinet/in.h> defines `struct sockaddr_storage'])
+fi])
+
+dnl *
+dnl * Copyright (c) 2001, 2003 Motoyuki Kasahara
+dnl *
+dnl * Redistribution and use in source and binary forms, with or without
+dnl * modification, are permitted provided that the following conditions
+dnl * are met:
+dnl * 1. Redistributions of source code must retain the above copyright
+dnl * notice, this list of conditions and the following disclaimer.
+dnl * 2. Redistributions in binary form must reproduce the above copyright
+dnl * notice, this list of conditions and the following disclaimer in the
+dnl * documentation and/or other materials provided with the distribution.
+dnl * 3. Neither the name of the project nor the names of its contributors
+dnl * may be used to endorse or promote products derived from this software
+dnl * without specific prior written permission.
+dnl *
+dnl * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+dnl * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+dnl * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+dnl * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORSBE
+dnl * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+dnl * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+dnl * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+dnl * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+dnl * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+dnl * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+dnl * THE POSSIBILITY OF SUCH DAMAGE.
+dnl *
+
+dnl *
+dnl * Check for socklen_t.
+dnl *
+AC_DEFUN([AC_TYPE_SOCKLEN_T],
+[AC_CACHE_CHECK([for socklen_t], ac_cv_type_socklen_t,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/socket.h>]], [[
+socklen_t socklen;
+]])],[ac_cv_type_socklen_t=yes],[ac_cv_type_socklen_t=no])])
+if test "$ac_cv_type_socklen_t" != yes; then
+ AC_DEFINE(socklen_t, int,
+[Define to `int' if <sys/types.h> or <sys/socket.h> does not define.])
+fi])
+
+dnl *
+dnl * Check for in_port_t.
+dnl *
+AC_DEFUN([AC_TYPE_IN_PORT_T],
+[AC_CACHE_CHECK([for in_port_t], ac_cv_type_in_port_t,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>]], [[
+in_port_t in_port;
+]])],[ac_cv_type_in_port_t=yes],[ac_cv_type_in_port_t=no])])
+if test "$ac_cv_type_in_port_t" != yes; then
+ ac_cv_sin_port_size=unknown
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+ int main() {
+ struct sockaddr_in addr;
+ return (sizeof(addr.sin_port) == sizeof(long)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sin_port_size=long],[],[])
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+ int main() {
+ struct sockaddr_in addr;
+ return (sizeof(addr.sin_port) == sizeof(int)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sin_port_size=int],[],[])
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+ int main() {
+ struct sockaddr_in addr;
+ return (sizeof(addr.sin_port) == sizeof(short)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sin_port_size=short],[],[])
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+ int main() {
+ struct sockaddr_in addr;
+ return (sizeof(addr.sin_port) == sizeof(char)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sin_port_size=char],[],[])
+ if test "$ac_cv_sin_port_size" = unknown; then
+ AC_MSG_ERROR([Failed to get size of sin_port in struct sockaddr_in.])
+ fi
+ AC_DEFINE_UNQUOTED(in_port_t, unsigned $ac_cv_sin_port_size,
+[Define to `unsigned char', `unsigned short', `unsigned int' or
+`unsigned long' according with size of `sin_port' in `struct sockaddr_in',
+if <sys/types.h>, <sys/socket.h> or <netinet/in.h> does not define
+`in_port_t'.])
+fi])
+
+dnl *
+dnl * Check for sa_family_t.
+dnl *
+AC_DEFUN([AC_TYPE_SA_FAMILY_T],
+[AC_CACHE_CHECK([for sa_family_t], ac_cv_type_sa_family_t,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/socket.h>]], [[
+sa_family_t sa_family;
+]])],[ac_cv_type_sa_family_t=yes],[ac_cv_type_sa_family_t=no])])
+if test "$ac_cv_type_sa_family_t" != yes; then
+ ac_cv_sa_family_size=unknown
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ int main() {
+ struct sockaddr addr;
+ return (sizeof(addr.sa_family) == sizeof(long)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sa_family_size=long],[],[])
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ int main() {
+ struct sockaddr addr;
+ return (sizeof(addr.sa_family) == sizeof(int)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sa_family_size=int],[],[])
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ int main() {
+ struct sockaddr addr;
+ return (sizeof(addr.sa_family) == sizeof(short)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sa_family_size=short],[],[])
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ int main() {
+ struct sockaddr addr;
+ return (sizeof(addr.sa_family) == sizeof(char)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sa_family_size=char],[],[])
+ if test "$ac_cv_sa_family_size" = unknown; then
+ AC_MSG_ERROR([Failed to get size of sa_family in struct sockaddr.])
+ fi
+ AC_DEFINE_UNQUOTED(sa_family_t, unsigned $ac_cv_sa_family_size,
+[Define to `unsigned char', `unsigned short', `unsigned int' or
+`unsigned long' according with size of `sa_family' in `struct sockaddr',
+if <sys/types.h> or <sys/socket.h> does not define `sa_family_t'.])
+fi])
diff --git a/netperf-2.4.4/aclocal.m4 b/netperf-2.4.4/aclocal.m4
new file mode 100644
index 0000000..87cba3e
--- /dev/null
+++ b/netperf-2.4.4/aclocal.m4
@@ -0,0 +1,1203 @@
+# generated automatically by aclocal 1.7.9 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002
+# 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.
+
+
+dnl This comes from libcurl's acinclude.m4. it is not clear if this
+dnl is original libcurl code, or other code, so we include the libcurl
+dnl copyright here
+dnl
+dnl
+dnl Copyright (c) 1996 - 2005, Daniel Stenberg, <daniel@haxx.se>.
+dnl
+dnl All rights reserved.
+dnl
+dnl Permission to use, copy, modify, and distribute this software for any purpose
+dnl with or without fee is hereby granted, provided that the above copyright
+dnl notice and this permission notice appear in all copies.
+dnl
+dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+dnl IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+dnl FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN
+dnl NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
+dnl OR OTHER DEALINGS IN THE SOFTWARE.
+dnl
+dnl Except as contained in this notice, the name of a copyright holder shall not
+dnl be used in advertising or otherwise to promote the sale, use or other dealings
+dnl in this Software without prior written authorization of the copyright holder.
+
+dnl Check for socklen_t: historically on BSD it is an int, and in
+dnl POSIX 1g it is a type of its own, but some platforms use different
+dnl types for the argument to getsockopt, getpeername, etc. So we
+dnl have to test to find something that will work.
+
+dnl Remove the AC_CHECK_TYPE - on HP-UX it would find a socklen_t, but the
+dnl function prototypes for getsockopt et al will not actually use
+dnl socklen_t args unless _XOPEN_SOURCE_EXTENDED is defined. so, the
+dnl AC_CHECK_TYPE will find a socklen_t and think all is happiness and
+dnl joy when you will really get warnings about mismatch types - type
+dnl mismatches that would be possibly Bad (tm) in a 64-bit compile.
+dnl raj 2005-05-11 this change may be redistributed at will
+
+dnl also, added "extern" to the "int getpeername" in an attempt to resolve
+dnl an issue with this code under Solaris 2.9. this too may be
+dnl redistributed at will
+
+
+AC_DEFUN([OLD_TYPE_SOCKLEN_T],
+[
+ AC_MSG_CHECKING([for socklen_t equivalent])
+ AC_CACHE_VAL([curl_cv_socklen_t_equiv],
+ [
+ # Systems have either "struct sockaddr *" or
+ # "void *" as the second argument to getpeername
+ curl_cv_socklen_t_equiv=
+ for arg2 in "struct sockaddr" void; do
+ for t in int size_t unsigned long "unsigned long" socklen_t; do
+ AC_TRY_COMPILE([
+ #ifdef HAVE_SYS_TYPES_H
+ #include <sys/types.h>
+ #endif
+ #ifdef HAVE_SYS_SOCKET_H
+ #include <sys/socket.h>
+ #endif
+
+ extern int getpeername (int, $arg2 *, $t *);
+ ],[
+ $t len;
+ getpeername(0,0,&len);
+ ],[
+ curl_cv_socklen_t_equiv="$t"
+ break 2
+ ])
+ done
+ done
+
+ if test "x$curl_cv_socklen_t_equiv" = x; then
+ # take a wild guess
+ curl_cv_socklen_t_equiv="socklen_t"
+ AC_MSG_WARN([Cannot find a type to use in place of socklen_t, guessing socklen_t])
+ fi
+ ])
+ AC_MSG_RESULT($curl_cv_socklen_t_equiv)
+ AC_DEFINE_UNQUOTED(netperf_socklen_t, $curl_cv_socklen_t_equiv,
+ [type to use in place of socklen_t if not defined])
+])
+
+
+dnl *
+dnl * Copyright (c) 2001 Motoyuki Kasahara
+dnl *
+dnl * Redistribution and use in source and binary forms, with or without
+dnl * modification, are permitted provided that the following conditions
+dnl * are met:
+dnl * 1. Redistributions of source code must retain the above copyright
+dnl * notice, this list of conditions and the following disclaimer.
+dnl * 2. Redistributions in binary form must reproduce the above copyright
+dnl * notice, this list of conditions and the following disclaimer in the
+dnl * documentation and/or other materials provided with the distribution.
+dnl * 3. Neither the name of the project nor the names of its contributors
+dnl * may be used to endorse or promote products derived from this software
+dnl * without specific prior written permission.
+dnl *
+dnl * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+dnl * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+dnl * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+dnl * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORSBE
+dnl * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+dnl * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+dnl * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+dnl * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+dnl * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+dnl * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+dnl * THE POSSIBILITY OF SUCH DAMAGE.
+dnl *
+
+dnl *
+dnl * Check for h_errno.
+dnl *
+AC_DEFUN([AC_DECL_H_ERRNO],
+[AC_CACHE_CHECK(for h_errno declaration in netdb.h, ac_cv_decl_h_errno,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <netdb.h>]], [[
+h_errno = 0;
+]])],[ac_cv_decl_h_errno=yes],[ac_cv_decl_h_errno=no])])
+if test "$ac_cv_decl_h_errno" = yes; then
+ AC_DEFINE(H_ERRNO_DECLARED, 1,
+[Define to 1 if `h_errno' is declared by <netdb.h>])
+fi])
+
+dnl *
+dnl * Copyright (c) 2001 Motoyuki Kasahara
+dnl *
+dnl * Redistribution and use in source and binary forms, with or without
+dnl * modification, are permitted provided that the following conditions
+dnl * are met:
+dnl * 1. Redistributions of source code must retain the above copyright
+dnl * notice, this list of conditions and the following disclaimer.
+dnl * 2. Redistributions in binary form must reproduce the above copyright
+dnl * notice, this list of conditions and the following disclaimer in the
+dnl * documentation and/or other materials provided with the distribution.
+dnl * 3. Neither the name of the project nor the names of its contributors
+dnl * may be used to endorse or promote products derived from this software
+dnl * without specific prior written permission.
+dnl *
+dnl * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+dnl * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+dnl * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+dnl * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORSBE
+dnl * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+dnl * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+dnl * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+dnl * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+dnl * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+dnl * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+dnl * THE POSSIBILITY OF SUCH DAMAGE.
+dnl *
+
+dnl *
+dnl * Check for struct sockaddr_in6
+dnl *
+AC_DEFUN([AC_STRUCT_SOCKADDR_IN6],
+[AC_CACHE_CHECK(for struct sockaddr_in6, ac_cv_struct_sockaddr_in6,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>]], [[
+struct sockaddr_in6 address;
+]])],[ac_cv_struct_sockaddr_in6=yes],[ac_cv_struct_sockaddr_in6=no])])
+if test "$ac_cv_struct_sockaddr_in6" = yes; then
+ AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6, 1,
+[Define to 1 if <netinet/in.h> defines `struct sockaddr_in6'])
+fi])
+
+dnl *
+dnl * Check for struct sockaddr_storage
+dnl *
+AC_DEFUN([AC_STRUCT_SOCKADDR_STORAGE],
+[AC_CACHE_CHECK(for struct sockaddr_storage, ac_cv_struct_sockaddr_storage,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>]], [[
+struct sockaddr_storage address;
+]])],[ac_cv_struct_sockaddr_storage=yes],[ac_cv_struct_sockaddr_storage=no])])
+if test "$ac_cv_struct_sockaddr_storage" = yes; then
+ AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE, 1,
+[Define to 1 if <netinet/in.h> defines `struct sockaddr_storage'])
+fi])
+
+dnl *
+dnl * Copyright (c) 2001, 2003 Motoyuki Kasahara
+dnl *
+dnl * Redistribution and use in source and binary forms, with or without
+dnl * modification, are permitted provided that the following conditions
+dnl * are met:
+dnl * 1. Redistributions of source code must retain the above copyright
+dnl * notice, this list of conditions and the following disclaimer.
+dnl * 2. Redistributions in binary form must reproduce the above copyright
+dnl * notice, this list of conditions and the following disclaimer in the
+dnl * documentation and/or other materials provided with the distribution.
+dnl * 3. Neither the name of the project nor the names of its contributors
+dnl * may be used to endorse or promote products derived from this software
+dnl * without specific prior written permission.
+dnl *
+dnl * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+dnl * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+dnl * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+dnl * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORSBE
+dnl * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+dnl * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+dnl * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+dnl * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+dnl * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+dnl * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+dnl * THE POSSIBILITY OF SUCH DAMAGE.
+dnl *
+
+dnl *
+dnl * Check for socklen_t.
+dnl *
+AC_DEFUN([AC_TYPE_SOCKLEN_T],
+[AC_CACHE_CHECK([for socklen_t], ac_cv_type_socklen_t,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/socket.h>]], [[
+socklen_t socklen;
+]])],[ac_cv_type_socklen_t=yes],[ac_cv_type_socklen_t=no])])
+if test "$ac_cv_type_socklen_t" != yes; then
+ AC_DEFINE(socklen_t, int,
+[Define to `int' if <sys/types.h> or <sys/socket.h> does not define.])
+fi])
+
+dnl *
+dnl * Check for in_port_t.
+dnl *
+AC_DEFUN([AC_TYPE_IN_PORT_T],
+[AC_CACHE_CHECK([for in_port_t], ac_cv_type_in_port_t,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>]], [[
+in_port_t in_port;
+]])],[ac_cv_type_in_port_t=yes],[ac_cv_type_in_port_t=no])])
+if test "$ac_cv_type_in_port_t" != yes; then
+ ac_cv_sin_port_size=unknown
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+ int main() {
+ struct sockaddr_in addr;
+ return (sizeof(addr.sin_port) == sizeof(long)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sin_port_size=long],[],[])
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+ int main() {
+ struct sockaddr_in addr;
+ return (sizeof(addr.sin_port) == sizeof(int)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sin_port_size=int],[],[])
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+ int main() {
+ struct sockaddr_in addr;
+ return (sizeof(addr.sin_port) == sizeof(short)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sin_port_size=short],[],[])
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+ int main() {
+ struct sockaddr_in addr;
+ return (sizeof(addr.sin_port) == sizeof(char)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sin_port_size=char],[],[])
+ if test "$ac_cv_sin_port_size" = unknown; then
+ AC_MSG_ERROR([Failed to get size of sin_port in struct sockaddr_in.])
+ fi
+ AC_DEFINE_UNQUOTED(in_port_t, unsigned $ac_cv_sin_port_size,
+[Define to `unsigned char', `unsigned short', `unsigned int' or
+`unsigned long' according with size of `sin_port' in `struct sockaddr_in',
+if <sys/types.h>, <sys/socket.h> or <netinet/in.h> does not define
+`in_port_t'.])
+fi])
+
+dnl *
+dnl * Check for sa_family_t.
+dnl *
+AC_DEFUN([AC_TYPE_SA_FAMILY_T],
+[AC_CACHE_CHECK([for sa_family_t], ac_cv_type_sa_family_t,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/socket.h>]], [[
+sa_family_t sa_family;
+]])],[ac_cv_type_sa_family_t=yes],[ac_cv_type_sa_family_t=no])])
+if test "$ac_cv_type_sa_family_t" != yes; then
+ ac_cv_sa_family_size=unknown
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ int main() {
+ struct sockaddr addr;
+ return (sizeof(addr.sa_family) == sizeof(long)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sa_family_size=long],[],[])
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ int main() {
+ struct sockaddr addr;
+ return (sizeof(addr.sa_family) == sizeof(int)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sa_family_size=int],[],[])
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ int main() {
+ struct sockaddr addr;
+ return (sizeof(addr.sa_family) == sizeof(short)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sa_family_size=short],[],[])
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ int main() {
+ struct sockaddr addr;
+ return (sizeof(addr.sa_family) == sizeof(char)) ? 0 : 1;
+ }
+ ]])],[ac_cv_sa_family_size=char],[],[])
+ if test "$ac_cv_sa_family_size" = unknown; then
+ AC_MSG_ERROR([Failed to get size of sa_family in struct sockaddr.])
+ fi
+ AC_DEFINE_UNQUOTED(sa_family_t, unsigned $ac_cv_sa_family_size,
+[Define to `unsigned char', `unsigned short', `unsigned int' or
+`unsigned long' according with size of `sa_family' in `struct sockaddr',
+if <sys/types.h> or <sys/socket.h> does not define `sa_family_t'.])
+fi])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# 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.
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
+# 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 10
+
+AC_PREREQ([2.54])
+
+# Autoconf 2.50 wants to disallow AM_ names. We explicitly allow
+# the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+
+# 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_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+ AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+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],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])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)
+AM_MISSING_PROG(AMTAR, tar)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+# 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([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES(CC)],
+ [define([AC_PROG_CC],
+ defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES(CXX)],
+ [define([AC_PROG_CXX],
+ defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# 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_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $1 | $1:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright 2002 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+
+# 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.
+AC_DEFUN([AM_AUTOMAKE_VERSION],[am__api_version="1.7"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+ [AM_AUTOMAKE_VERSION([1.7.9])])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright 2001, 2002 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 2
+
+# _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],
+[AC_FOREACH([_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])])
+
+#
+# Check to make sure that the build environment is sane.
+#
+
+# Copyright 1996, 1997, 2000, 2001 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 3
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# 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 (
+ 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
+ rm -f conftest.file
+ 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
+
+ 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)])
+
+# -*- Autoconf -*-
+
+
+# Copyright 1997, 1999, 2000, 2001 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 3
+
+# 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 supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# AM_AUX_DIR_EXPAND
+
+# Copyright 2001 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# 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.
+
+# Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])
+
+AC_DEFUN([AM_AUX_DIR_EXPAND], [
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+
+# Copyright 2001 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# AM_PROG_INSTALL_STRIP
+
+# Copyright 2001 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# 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="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# -*- Autoconf -*-
+# Copyright (C) 2003 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 1
+
+# 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])])
+
+# serial 5 -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+
+# 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", "GCJ", or "OBJC".
+# 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
+
+ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
+ [$1], CXX, [depcc="$CXX" am_compiler_list=],
+ [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$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'.
+ 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
+ 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
+ : > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ 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
+ ;;
+ none) break ;;
+ esac
+ # 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.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} 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
+ # (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored.
+ if grep 'ignoring option' 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,
+[ --disable-dependency-tracking Speeds up one-time builds
+ --enable-dependency-tracking Do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright 1999, 2000, 2001, 2002 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+#serial 2
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; 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.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`AS_DIRNAME("$mf")`
+ else
+ continue
+ fi
+ grep '^DEP_FILES *= *[[^ @%:@]]' < "$mf" > /dev/null || continue
+ # Extract the definition of DEP_FILES from the Makefile without
+ # running `make'.
+ DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n -e '/^U = / s///p' < "$mf"`
+ test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR"
+ # 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 -e '
+ /^DEP_FILES = .*\\\\$/ {
+ s/^DEP_FILES = //
+ :loop
+ s/\\\\$//
+ p
+ n
+ /\\\\$/ b loop
+ p
+ }
+ /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/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"])
+])
+
+# Check to see how 'make' treats includes. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 2
+
+# 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 done
+.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
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright 1997, 2000, 2001 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 5
+
+AC_PREREQ(2.52)
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+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])])
+
+# Like AC_CONFIG_HEADER, but automatically create stamp file. -*- Autoconf -*-
+
+# Copyright 1996, 1997, 2000, 2001 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+AC_PREREQ([2.52])
+
+# serial 6
+
+# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS.
+AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
+
diff --git a/netperf-2.4.4/config.guess b/netperf-2.4.4/config.guess
new file mode 100755
index 0000000..ad5281e
--- /dev/null
+++ b/netperf-2.4.4/config.guess
@@ -0,0 +1,1466 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+timestamp='2005-08-03'
+
+# 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 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., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, 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.
+
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+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 <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+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 -q "$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
+
+# 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 tupples: *-*-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 ;;
+ *) 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 __ELF__ >/dev/null
+ 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 ;;
+ *: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 ;;
+ macppc:MirBSD:*:*)
+ echo powerppc-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'`
+ exit ;;
+ 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 ;;
+ 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:SunOS:5.*:*)
+ echo i386-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 <stdio.h> /* 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 <sys/systemcfg.h>
+
+ 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:*:[45])
+ 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 <stdlib.h>
+ #include <unistd.h>
+
+ 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 __LP64__ >/dev/null
+ 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 <unistd.h>
+ 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:*:*)
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit ;;
+ i*:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit ;;
+ i*:windows32*:*)
+ # uname -m includes "-pc" on this system.
+ echo ${UNAME_MACHINE}-mingw32
+ exit ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+ exit ;;
+ x86:Interix*:[34]*)
+ echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//'
+ exit ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-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-gnu`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/[-(].*//'`-gnu
+ exit ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+ exit ;;
+ arm*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ cris:Linux:*:*)
+ echo cris-axis-linux-gnu
+ exit ;;
+ crisv32:Linux:*:*)
+ echo crisv32-axis-linux-gnu
+ exit ;;
+ frv:Linux:*:*)
+ echo frv-unknown-linux-gnu
+ exit ;;
+ ia64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m32r*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m68*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ mips:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mipsel
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips
+ #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-gnu"; exit; }
+ ;;
+ mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips64
+ #undef mips64el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mips64el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips64
+ #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-gnu"; exit; }
+ ;;
+ or32:Linux:*:*)
+ echo or32-unknown-linux-gnu
+ exit ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-gnu
+ exit ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-gnu
+ 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 ld.so.1 >/dev/null
+ if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${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-gnu ;;
+ PA8*) echo hppa2.0-unknown-linux-gnu ;;
+ *) echo hppa-unknown-linux-gnu ;;
+ esac
+ exit ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-gnu
+ exit ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo ${UNAME_MACHINE}-ibm-linux
+ exit ;;
+ sh64*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sh*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ x86_64:Linux:*:*)
+ echo x86_64-unknown-linux-gnu
+ exit ;;
+ i*86:Linux:*:*)
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us. cd to the root directory to prevent
+ # problems with other programs or directories called `ld' in the path.
+ # Set LC_ALL=C to ensure ld outputs messages in English.
+ ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+ | sed -ne '/supported targets:/!d
+ s/[ ][ ]*/ /g
+ s/.*supported targets: *//
+ s/ .*//
+ p'`
+ case "$ld_supported_targets" in
+ elf32-i386)
+ TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+ ;;
+ a.out-i386-linux)
+ echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+ exit ;;
+ coff-i386)
+ echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+ exit ;;
+ "")
+ # Either a pre-BFD a.out linker (linux-gnuoldld) or
+ # one that does not give us useful --help.
+ echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+ exit ;;
+ esac
+ # Determine whether the default compiler is a.out or elf
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <features.h>
+ #ifdef __ELF__
+ # ifdef __GLIBC__
+ # if __GLIBC__ >= 2
+ LIBC=gnu
+ # else
+ LIBC=gnulibc1
+ # endif
+ # else
+ LIBC=gnulibc1
+ # endif
+ #else
+ #ifdef __INTEL_COMPILER
+ LIBC=gnu
+ #else
+ LIBC=gnuaout
+ #endif
+ #endif
+ #ifdef __dietlibc__
+ LIBC=dietlibc
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+ test x"${LIBC}" != x && {
+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+ exit
+ }
+ test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; 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.0*:*)
+ 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' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/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 i386.
+ echo i386-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; } ;;
+ 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.0*:*)
+ 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 <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # 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 ;;
+ 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 ;;
+ 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
+ case $UNAME_PROCESSOR in
+ *86) UNAME_PROCESSOR=i686 ;;
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ 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 ;;
+ 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 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#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 <sys/param.h>
+ 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 <sys/param.h>
+# 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 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+and
+ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> 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/netperf-2.4.4/config.h.in b/netperf-2.4.4/config.h.in
new file mode 100644
index 0000000..93eca0d
--- /dev/null
+++ b/netperf-2.4.4/config.h.in
@@ -0,0 +1,348 @@
+/* config.h.in. Generated from configure.ac by autoheader. */
+
+/* Define to one to enable dirty buffer support. May affect results. */
+#undef DIRTY
+
+/* Define to 1 if you have the `alarm' function. */
+#undef HAVE_ALARM
+
+/* Define to 1 if you have the <arpa/inet.h> header file. */
+#undef HAVE_ARPA_INET_H
+
+/* Define to 1 if you have the `bindprocessor' function. */
+#undef HAVE_BINDPROCESSOR
+
+/* Define to 1 if you have the `bind_to_cpu_id' function. */
+#undef HAVE_BIND_TO_CPU_ID
+
+/* Define to 1 if you have the `bzero' function. */
+#undef HAVE_BZERO
+
+/* Define to 1 if you have the <endian.h> header file. */
+#undef HAVE_ENDIAN_H
+
+/* Define to 1 if you have the <errno.h> header file. */
+#undef HAVE_ERRNO_H
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define to 1 if you have the `fork' function. */
+#undef HAVE_FORK
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+#undef HAVE_GETADDRINFO
+
+/* Define to 1 if you have the `gethostbyname' function. */
+#undef HAVE_GETHOSTBYNAME
+
+/* Define to 1 if you have the `gethrtime' function. */
+#undef HAVE_GETHRTIME
+
+/* Define to 1 if you have the `getnameinfo' function. */
+#undef HAVE_GETNAMEINFO
+
+/* Define to 1 if you have the `getpagesize' function. */
+#undef HAVE_GETPAGESIZE
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define to one to include ICSC-EXS tests. */
+#undef HAVE_ICSC_EXS
+
+/* Define to 1 if you have the `inet_ntoa' function. */
+#undef HAVE_INET_NTOA
+
+/* Define to 1 if you have the `inet_ntop' function. */
+#undef HAVE_INET_NTOP
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the `exs' library (-lexs). */
+#undef HAVE_LIBEXS
+
+/* Define to 1 if you have the `kstat' library (-lkstat). */
+#undef HAVE_LIBKSTAT
+
+/* Define to 1 if you have the `m' library (-lm). */
+#undef HAVE_LIBM
+
+/* Define to 1 if you have the `mach' library (-lmach). */
+#undef HAVE_LIBMACH
+
+/* Define to 1 if you have the `nsl' library (-lnsl). */
+#undef HAVE_LIBNSL
+
+/* Define to 1 if you have the `perfstat' library (-lperfstat). */
+#undef HAVE_LIBPERFSTAT
+
+/* Define to 1 if you have the `sctp' library (-lsctp). */
+#undef HAVE_LIBSCTP
+
+/* Define to 1 if you have the `sdp' library (-lsdp). */
+#undef HAVE_LIBSDP
+
+/* Define to 1 if you have the `sendfile' library (-lsendfile). */
+#undef HAVE_LIBSENDFILE
+
+/* Define to 1 if you have the `socket' library (-lsocket). */
+#undef HAVE_LIBSOCKET
+
+/* Define to 1 if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define to 1 if you have the <malloc.h> header file. */
+#undef HAVE_MALLOC_H
+
+/* Define to 1 if you have the `memcpy' function. */
+#undef HAVE_MEMCPY
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `memset' function. */
+#undef HAVE_MEMSET
+
+/* Define to 1 if you have a working `mmap' system call. */
+#undef HAVE_MMAP
+
+/* Define to 1 if you have the `mpctl' function. */
+#undef HAVE_MPCTL
+
+/* Define to 1 if you have the `munmap' function. */
+#undef HAVE_MUNMAP
+
+/* Define to 1 if you have the <netdb.h> header file. */
+#undef HAVE_NETDB_H
+
+/* Define to 1 if you have the <netinet/in.h> header file. */
+#undef HAVE_NETINET_IN_H
+
+/* Define to 1 if you have the <netinet/sctp.h> header file. */
+#undef HAVE_NETINET_SCTP_H
+
+/* Define to 1 if you have the `processor_bind' function. */
+#undef HAVE_PROCESSOR_BIND
+
+/* Define to 1 if you have the `sched_setaffinity' function. */
+#undef HAVE_SCHED_SETAFFINITY
+
+/* Define to 1 if `struct sctp_event_subscribe' has a
+ `sctp_adaptation_layer_event' member */
+#undef HAVE_SCTP_ADAPTATION_LAYER_EVENT
+
+/* Define to 1 if you have the `select' function. */
+#undef HAVE_SELECT
+
+/* Define to 1 if you have the `sendfile' function. */
+#undef HAVE_SENDFILE
+
+/* Define to 1 if you have the <signal.h> header file. */
+#undef HAVE_SIGNAL_H
+
+/* Define to 1 if you have the `socket' function. */
+#undef HAVE_SOCKET
+
+/* Define to 1 if you have the `sqrt' function. */
+#undef HAVE_SQRT
+
+/* Define to 1 if stdbool.h conforms to C99. */
+#undef HAVE_STDBOOL_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strcasecmp' function. */
+#undef HAVE_STRCASECMP
+
+/* Define to 1 if you have the `strchr' function. */
+#undef HAVE_STRCHR
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the `strstr' function. */
+#undef HAVE_STRSTR
+
+/* Define to 1 if you have the `strtoul' function. */
+#undef HAVE_STRTOUL
+
+/* Define to 1 if <netinet/in.h> defines `struct sockaddr_storage' */
+#undef HAVE_STRUCT_SOCKADDR_STORAGE
+
+/* Define to 1 if you have the <sys/ioctl.h> header file. */
+#undef HAVE_SYS_IOCTL_H
+
+/* Define to 1 if you have the <sys/mman.h> header file. */
+#undef HAVE_SYS_MMAN_H
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/select.h> header file. */
+#undef HAVE_SYS_SELECT_H
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#undef HAVE_SYS_SOCKET_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
+#undef HAVE_SYS_WAIT_H
+
+/* Define to 1 if you have the `uname' function. */
+#undef HAVE_UNAME
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the `vfork' function. */
+#undef HAVE_VFORK
+
+/* Define to 1 if you have the <vfork.h> header file. */
+#undef HAVE_VFORK_H
+
+/* Define to 1 if `fork' works. */
+#undef HAVE_WORKING_FORK
+
+/* Define to 1 if `vfork' works. */
+#undef HAVE_WORKING_VFORK
+
+/* Define to 1 if the system has the type `_Bool'. */
+#undef HAVE__BOOL
+
+/* Define to 1 if `h_errno' is declared by <netdb.h> */
+#undef H_ERRNO_DECLARED
+
+/* Name of package */
+#undef PACKAGE
+
+/* 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 version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define as the return type of signal handlers (`int' or `void'). */
+#undef RETSIGTYPE
+
+/* Define to the type of arg 1 for `select'. */
+#undef SELECT_TYPE_ARG1
+
+/* Define to the type of args 2, 3 and 4 for `select'. */
+#undef SELECT_TYPE_ARG234
+
+/* Define to the type of arg 5 for `select'. */
+#undef SELECT_TYPE_ARG5
+
+/* Define to 1 if the `setpgrp' function takes no argument. */
+#undef SETPGRP_VOID
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#undef TIME_WITH_SYS_TIME
+
+/* Use Solaris's kstat interface to measure CPU util. */
+#undef USE_KSTAT
+
+/* Use looper/soaker processes to measure CPU util. */
+#undef USE_LOOPER
+
+/* Use MacOS X's host_info interface to measure CPU util. */
+#undef USE_OSX
+
+/* Use AIX's perfstat interface to measure CPU util. */
+#undef USE_PERFSTAT
+
+/* Use Linux's procstat interface to measure CPU util. */
+#undef USE_PROC_STAT
+
+/* Use HP-UX's pstat interface to measure CPU util. */
+#undef USE_PSTAT
+
+/* Use FreeBSD's sysctl interface to measure CPU util. */
+#undef USE_SYSCTL
+
+/* Version number of package */
+#undef VERSION
+
+/* Define to one to enable demo support. May affect results. */
+#undef WANT_DEMO
+
+/* Define to one to include DLPI tests. */
+#undef WANT_DLPI
+
+/* Define to one to enable initial _RR burst support. May affect results. */
+#undef WANT_FIRST_BURST
+
+/* Define to one to enable histogram support. May affect results. */
+#undef WANT_HISTOGRAM
+
+/* Define to one to enable paced operation support. May affect results. */
+#undef WANT_INTERVALS
+
+/* Define to one to include SCTP tests. */
+#undef WANT_SCTP
+
+/* Define to one to include SDP tests. */
+#undef WANT_SDP
+
+/* Define to one to spin waiting on paced operation. WILL AFFEFCT CPU
+ UTILIZATION */
+#undef WANT_SPIN
+
+/* Define to one to include Unix Domain socket tests. */
+#undef WANT_UNIX
+
+/* Define to one to include XTI tests. */
+#undef WANT_XTI
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* type to use in place of socklen_t if not defined */
+#undef netperf_socklen_t
+
+/* Define to `long int' if <sys/types.h> does not define. */
+#undef off_t
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef pid_t
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#undef size_t
+
+/* Define as `fork' if `vfork' does not work. */
+#undef vfork
diff --git a/netperf-2.4.4/config.sub b/netperf-2.4.4/config.sub
new file mode 100755
index 0000000..1c366df
--- /dev/null
+++ b/netperf-2.4.4/config.sub
@@ -0,0 +1,1579 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+timestamp='2005-07-08'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# 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 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., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, 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.
+
+
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# 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.
+
+# 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 <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+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-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
+ kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ 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)
+ os=
+ basic_machine=$1
+ ;;
+ -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
+ ;;
+ -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/'`
+ ;;
+ -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*)
+ 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 \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+ | bfin \
+ | c4x | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | fr30 | frv \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+ | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64vr | mips64vrel \
+ | mips64orion | mips64orionel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | ms1 \
+ | msp430 \
+ | ns16k | ns32k \
+ | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | pyramid \
+ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b \
+ | strongarm \
+ | tahoe | thumb | tic4x | tic80 | tron \
+ | v850 | v850e \
+ | we32k \
+ | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
+ | z8k)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m32c)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12)
+ # Motorola 68HC11/12.
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
+
+ # 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-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* \
+ | bfin-* | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+ | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | ms1-* \
+ | msp430-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | pyramid-* \
+ | romp-* | rs6000-* \
+ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \
+ | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+ | tahoe-* | thumb-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tron-* \
+ | v850-* | v850e-* | vax-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
+ | xstormy16-* | xtensa-* \
+ | ymp-* \
+ | z8k-*)
+ ;;
+ m32c-*)
+ ;;
+ # 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
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ 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
+ ;;
+ cr16c)
+ basic_machine=cr16c-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
+ ;;
+ 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'm not sure what "Sysv32" means. Should this be sysv3.2?
+ 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
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ mingw32)
+ basic_machine=i386-pc
+ os=-mingw32
+ ;;
+ 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
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ 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
+ ;;
+ 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
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ 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) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) 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-*) 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
+ ;;
+ 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
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ 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
+ ;;
+ 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
+ ;;
+ tic54x | c54x*)
+ basic_machine=tic54x-unknown
+ os=-coff
+ ;;
+ tic55x | c55x*)
+ basic_machine=tic55x-unknown
+ os=-coff
+ ;;
+ tic6x | c6x*)
+ basic_machine=tic6x-unknown
+ os=-coff
+ ;;
+ 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
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-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[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+ sparc | sparcv8 | sparcv9 | sparcv9b)
+ 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.
+ -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* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
+ | -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* \
+ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -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*)
+ # 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
+ ;;
+ -kaos*)
+ os=-kaos
+ ;;
+ -zvmoe)
+ os=-zvmoe
+ ;;
+ -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
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ 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
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ 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
+ ;;
+ -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/netperf-2.4.4/configure b/netperf-2.4.4/configure
new file mode 100755
index 0000000..8a19d3c
--- /dev/null
+++ b/netperf-2.4.4/configure
@@ -0,0 +1,10644 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.61 for netperf 2.4.4.
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006 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=:
+ # 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
+
+
+
+
+# PATH needs CR
+# 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
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+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.)
+as_nl='
+'
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+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
+ echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+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
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+ if (eval ":") 2>/dev/null; then
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+
+ if test $as_have_required = yes && (eval ":
+(as_func_return () {
+ (exit \$1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+ as_lineno_1=\$LINENO
+ as_lineno_2=\$LINENO
+ test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+ test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+ :
+else
+ as_candidate_shells=
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ case $as_dir in
+ /*)
+ for as_base in sh bash ksh sh5; do
+ as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+ done;;
+ esac
+done
+IFS=$as_save_IFS
+
+
+ for as_shell in $as_candidate_shells $SHELL; do
+ # Try only shells that exist, to save several forks.
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { ("$as_shell") 2> /dev/null <<\_ASEOF
+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
+
+
+:
+_ASEOF
+}; then
+ CONFIG_SHELL=$as_shell
+ as_have_required=yes
+ if { "$as_shell" 2> /dev/null <<\_ASEOF
+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
+
+
+:
+(as_func_return () {
+ (exit $1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+ break
+fi
+
+fi
+
+ done
+
+ if test "x$CONFIG_SHELL" != x; then
+ for as_var in BASH_ENV ENV
+ do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+ done
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+ if test $as_have_required = no; then
+ echo This script requires a shell more modern than all the
+ echo shells that I found on your system. Please install a
+ echo modern shell, or manually run the script under such a
+ echo shell if you do have one.
+ { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+ (exit \$1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+ echo No shell found that supports shell functions.
+ echo Please tell autoconf@gnu.org about your system,
+ echo including any error possibly output before this
+ echo message
+}
+
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line after each line using $LINENO; the second 'sed'
+ # does the real work. The second script uses 'N' to pair each
+ # line-number line with the line containing $LINENO, and appends
+ # trailing '-' during substitution so that $LINENO is not a special
+ # case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # scripts with optimization help from Paolo Bonzini. 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" ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # 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
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+ case `echo 'x\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ *) ECHO_C='\c';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+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
+fi
+echo >conf$$.file
+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 -p'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+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=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+ as_test_x='test -x'
+else
+ if ls -dL / >/dev/null 2>&1; then
+ as_ls_L_option=L
+ else
+ as_ls_L_option=
+ fi
+ as_test_x='
+ eval sh -c '\''
+ if test -d "$1"; then
+ test -d "$1/.";
+ else
+ case $1 in
+ -*)set "./$1";;
+ esac;
+ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+ ???[sx]*):;;*)false;;esac;fi
+ '\'' sh
+ '
+fi
+as_executable_p=$as_test_x
+
+# 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 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, 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=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME='netperf'
+PACKAGE_TARNAME='netperf'
+PACKAGE_VERSION='2.4.4'
+PACKAGE_STRING='netperf 2.4.4'
+PACKAGE_BUGREPORT=''
+
+ac_unique_file="src/hist.h"
+ac_config_libobj_dir=src/missing
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+build
+build_cpu
+build_vendor
+build_os
+host
+host_cpu
+host_vendor
+host_os
+target
+target_cpu
+target_vendor
+target_os
+INSTALL_PROGRAM
+INSTALL_SCRIPT
+INSTALL_DATA
+CYGPATH_W
+PACKAGE
+VERSION
+ACLOCAL
+AUTOCONF
+AUTOMAKE
+AUTOHEADER
+MAKEINFO
+AMTAR
+install_sh
+STRIP
+INSTALL_STRIP_PROGRAM
+AWK
+SET_MAKE
+am__leading_dot
+CC
+CFLAGS
+LDFLAGS
+CPPFLAGS
+ac_ct_CC
+EXEEXT
+OBJEXT
+DEPDIR
+am__include
+am__quote
+AMDEP_TRUE
+AMDEP_FALSE
+AMDEPBACKSLASH
+CCDEPMODE
+am__fastdepCC_TRUE
+am__fastdepCC_FALSE
+RANLIB
+CPP
+GREP
+EGREP
+LIBOBJS
+NEED_LIBCOMPAT_TRUE
+NEED_LIBCOMPAT_FALSE
+NETCPU_SOURCE
+LTLIBOBJS'
+ac_subst_files=''
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# 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=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_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+ eval enable_$ac_feature=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_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+ eval enable_$ac_feature=\$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_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+ eval with_$ac_package=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+ eval with_$ac_package=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 ;;
+
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ 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'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute directory names.
+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
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; }
+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
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ 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 .` ||
+ { echo "$as_me: error: Working directory cannot be determined" >&2
+ { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ { echo "$as_me: error: pwd does not report name of working directory" >&2
+ { (exit 1); exit 1; }; }
+
+
+# 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 -- "$0" ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$0" : 'X\(//\)[^/]' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$0" |
+ 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 .."
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
+ { (exit 1); exit 1; }; }
+ 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 netperf 2.4.4 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/netperf]
+ --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]
+ --target=TARGET configure for building compilers for TARGET [HOST]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of netperf 2.4.4:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --disable-dependency-tracking Speeds up one-time builds
+ --enable-dependency-tracking Do not reject slow dependency extractors
+ --disable-largefile omit support for large files
+ --enable-histogram include individual op timing, may affect result
+ --enable-dirty write to buffers each time, may affect result
+ --enable-demo emit interim results during the run. May affect
+ results.
+ --enable-unixdomain include Unix Domain socket tests
+ --enable-dlpi include DLPI (link-layer) tests
+ --enable-xti include XTI socket tests
+ --enable-sdp include SDP socket tests
+ --enable-exs include ICSC async sockets tests
+ --enable-sctp include tests to measure SCTP performance
+ --enable-intervals include ability to pace operations, may affect
+ result
+ --enable-spin paced operations (--enable-intervals) should sit and
+ spin - WILL affect result
+ --enable-burst include intial request burst ability in _RR tests,
+ may affect result
+ --enable-cpuutil include code to measure CPU utilization using
+ specified mechanism
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ CPP C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_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" || continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`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
+ 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
+netperf configure 2.4.4
+generated by GNU Autoconf 2.61
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 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
+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 netperf $as_me 2.4.4, which was
+generated by GNU Autoconf 2.61. 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=.
+ 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=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 2)
+ ac_configure_args1="$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
+ ac_configure_args="$ac_configure_args '$ac_arg'"
+ ;;
+ esac
+ done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ 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_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ *) $as_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
+
+ cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal"
+ 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'; { (exit 1); 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
+
+# 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
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+ set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+ set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+ set x "$ac_default_prefix/share/config.site" \
+ "$ac_default_prefix/etc/config.site"
+fi
+shift
+for ac_site_file
+do
+ if test -r "$ac_site_file"; then
+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file"
+ 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.
+ if test -f "$cache_file"; then
+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+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,)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+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
+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`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.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+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
+
+
+# use the target version rather than host - one day we may want cross-compile
+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
+ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
+echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
+ { (exit 1); exit 1; }; }
+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.
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+ { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
+echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
+ { (exit 1); exit 1; }; }
+
+{ echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6; }
+if test "${ac_cv_build+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 &&
+ { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+ { (exit 1); exit 1; }; }
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+ { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
+echo "$as_me: error: invalid value of canonical build" >&2;}
+ { (exit 1); exit 1; }; };;
+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
+
+
+{ echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6; }
+if test "${ac_cv_host+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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` ||
+ { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
+echo "$as_me: error: invalid value of canonical host" >&2;}
+ { (exit 1); exit 1; }; };;
+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
+
+
+{ echo "$as_me:$LINENO: checking target system type" >&5
+echo $ECHO_N "checking target system type... $ECHO_C" >&6; }
+if test "${ac_cv_target+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "x$target_alias" = x; then
+ ac_cv_target=$ac_cv_host
+else
+ ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
+ { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_target" >&5
+echo "${ECHO_T}$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical target" >&5
+echo "$as_me: error: invalid value of canonical target" >&2;}
+ { (exit 1); exit 1; }; };;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+am__api_version="1.7"
+# 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.
+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$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
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+IFS=$as_save_IFS
+
+
+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
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$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'
+
+{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# 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 (
+ 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
+ rm -f conftest.file
+ 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".
+ { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+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 $. echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm -f conftest.sed
+
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_AWK+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_AWK="$ac_prog"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+ test -n "$AWK" && break
+done
+
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+ SET_MAKE=
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+
+ # test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+ { (exit 1); exit 1; }; }
+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='netperf'
+ VERSION='2.4.4'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# 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"}
+
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# 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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+
+
+
+ac_config_headers="$ac_config_headers config.h"
+
+# AC_CONFIG_HEADER(config.h)
+
+
+
+# make sure we build netperf_version.h
+touch src/netperf_version.h.in
+
+# Checks for programs.
+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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compiler --version >&5") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compiler -v >&5") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compiler -V >&5") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out 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.
+{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+#
+# List of possible output files, starting from the most likely.
+# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
+# only as a last resort. b.out is created by i960 compilers.
+ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
+#
+# The IRIX 6 linker writes into existing files which may not be
+# executable, retaining their permissions. Remove them first so a
+# subsequent execution test works.
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; 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 | *.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
+
+{ echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6; }
+if test -z "$ac_file"; then
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+ if { ac_try='./$ac_file'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ fi
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6; }
+
+{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; 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 | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
+if test "${ac_cv_objext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; 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 ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ 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
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ CFLAGS=""
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+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
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$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
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* 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"
+ 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_prog_cc_c89=$ac_arg
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+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)
+ { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+ xno)
+ { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c89"
+ { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+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
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+
+
+{ echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_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='\'
+fi
+
+
+if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+
+
+depcc="$CC" am_compiler_list=
+
+{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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'.
+ 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
+ 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
+ : > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ 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
+ ;;
+ none) break ;;
+ esac
+ # 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.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} 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
+ # (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored.
+ if grep 'ignoring option' 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
+{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$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
+
+
+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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+
+
+{ echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; }
+if test "${ac_cv_c_const+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+ /* Ultrix mips cc rejects this. */
+ typedef int charset[2];
+ const charset cs;
+ /* SunOS 4.1.1 cc rejects this. */
+ char const *const *pcpcc;
+ char **ppc;
+ /* NEC SVR4.0.2 mips cc rejects this. */
+ struct point {int x, y;};
+ static struct point const zero = {0,0};
+ /* AIX XL C 1.02.0.0 rejects this.
+ It does not let you subtract one const X* pointer from another in
+ an arm of an if-expression whose if-part is not a constant
+ expression */
+ const char *g = "string";
+ pcpcc = &g + (g ? g-g : 0);
+ /* HPUX 7.0 cc rejects these. */
+ ++pcpcc;
+ ppc = (char**) pcpcc;
+ pcpcc = (char const *const *) ppc;
+ { /* SCO 3.2v4 cc rejects this. */
+ char *t;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 0;
+ if (s) return 0;
+ }
+ { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
+ int x[] = {25, 17};
+ const int *foo = &x[0];
+ ++foo;
+ }
+ { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+ typedef const int *iptr;
+ iptr p = 0;
+ ++p;
+ }
+ { /* AIX XL C 1.02.0.0 rejects this saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; };
+ struct s *b; b->j = 5;
+ }
+ { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+ if (!foo) return 0;
+ }
+ return !cs[0] && !zero.x;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_c_const=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_c_const=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define const
+_ACEOF
+
+fi
+
+
+# Checks for libraries.
+
+{ echo "$as_me:$LINENO: checking for main in -lm" >&5
+echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6; }
+if test "${ac_cv_lib_m_main+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+
+int
+main ()
+{
+return main ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_lib_m_main=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_m_main=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5
+echo "${ECHO_T}$ac_cv_lib_m_main" >&6; }
+if test $ac_cv_lib_m_main = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBM 1
+_ACEOF
+
+ LIBS="-lm $LIBS"
+
+fi
+ac_cv_lib_m=ac_cv_lib_m_main
+
+
+# Checks for header files.
+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
+{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test "${ac_cv_prog_CPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> 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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f 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
+{ echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$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 <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> 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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+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
+
+
+{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
+echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Extract the first word of "grep ggrep" to use in msg output
+if test -z "$GREP"; then
+set dummy grep ggrep; ac_prog_name=$2
+if test "${ac_cv_path_GREP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ 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"
+ { test -f "$ac_path_GREP" && $as_test_x "$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
+ echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ 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
+ ac_count=`expr $ac_count + 1`
+ 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
+
+
+fi
+
+GREP="$ac_cv_path_GREP"
+if test -z "$GREP"; then
+ { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
+echo "${ECHO_T}$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ # Extract the first word of "egrep" to use in msg output
+if test -z "$EGREP"; then
+set dummy egrep; ac_prog_name=$2
+if test "${ac_cv_path_EGREP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ 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"
+ { test -f "$ac_path_EGREP" && $as_test_x "$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
+ echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ 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
+ ac_count=`expr $ac_count + 1`
+ 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
+
+
+fi
+
+EGREP="$ac_cv_path_EGREP"
+if test -z "$EGREP"; then
+ { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+
+ fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
+echo "${ECHO_T}$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_header_stdc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ 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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <string.h>
+
+_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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#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
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for sys/wait.h that is POSIX.1 compatible" >&5
+echo $ECHO_N "checking for sys/wait.h that is POSIX.1 compatible... $ECHO_C" >&6; }
+if test "${ac_cv_header_sys_wait_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <sys/wait.h>
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)
+#endif
+#ifndef WIFEXITED
+# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
+#endif
+
+int
+main ()
+{
+ int s;
+ wait (&s);
+ s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_header_sys_wait_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_header_sys_wait_h=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_sys_wait_h" >&5
+echo "${ECHO_T}$ac_cv_header_sys_wait_h" >&6; }
+if test $ac_cv_header_sys_wait_h = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_SYS_WAIT_H 1
+_ACEOF
+
+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=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_Header=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+for ac_header in arpa/inet.h endian.h errno.h fcntl.h limits.h malloc.h netdb.h netinet/in.h signal.h stdlib.h string.h strings.h sys/ioctl.h sys/mman.h sys/param.h sys/socket.h sys/time.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+# Some platforms require these. There may be a better way.
+
+{ echo "$as_me:$LINENO: checking for main in -lsocket" >&5
+echo $ECHO_N "checking for main in -lsocket... $ECHO_C" >&6; }
+if test "${ac_cv_lib_socket_main+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+
+int
+main ()
+{
+return main ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_lib_socket_main=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_socket_main=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_socket_main" >&5
+echo "${ECHO_T}$ac_cv_lib_socket_main" >&6; }
+if test $ac_cv_lib_socket_main = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBSOCKET 1
+_ACEOF
+
+ LIBS="-lsocket $LIBS"
+
+fi
+ac_cv_lib_socket=ac_cv_lib_socket_main
+
+if test "$ac_cv_lib_socket_main" = yes ; then
+
+{ echo "$as_me:$LINENO: checking for main in -lnsl" >&5
+echo $ECHO_N "checking for main in -lnsl... $ECHO_C" >&6; }
+if test "${ac_cv_lib_nsl_main+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+
+int
+main ()
+{
+return main ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_lib_nsl_main=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_nsl_main=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_main" >&5
+echo "${ECHO_T}$ac_cv_lib_nsl_main" >&6; }
+if test $ac_cv_lib_nsl_main = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBNSL 1
+_ACEOF
+
+ LIBS="-lnsl $LIBS"
+
+fi
+ac_cv_lib_nsl=ac_cv_lib_nsl_main
+
+
+{ echo "$as_me:$LINENO: checking for main in -lsendfile" >&5
+echo $ECHO_N "checking for main in -lsendfile... $ECHO_C" >&6; }
+if test "${ac_cv_lib_sendfile_main+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsendfile $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+
+int
+main ()
+{
+return main ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_lib_sendfile_main=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_sendfile_main=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_sendfile_main" >&5
+echo "${ECHO_T}$ac_cv_lib_sendfile_main" >&6; }
+if test $ac_cv_lib_sendfile_main = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBSENDFILE 1
+_ACEOF
+
+ LIBS="-lsendfile $LIBS"
+
+fi
+ac_cv_lib_sendfile=ac_cv_lib_sendfile_main
+
+ # Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then
+ enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+ { echo "$as_me:$LINENO: checking for special C compiler options needed for large files" >&5
+echo $ECHO_N "checking for special C compiler options needed for large files... $ECHO_C" >&6; }
+if test "${ac_cv_sys_largefile_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_sys_largefile_CC=no
+ if test "$GCC" != yes; then
+ ac_save_CC=$CC
+ while :; do
+ # IRIX 6.2 and later do not support large files by default,
+ # so use the C compiler's -n32 option if that helps.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+ CC="$CC -n32"
+ 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_sys_largefile_CC=' -n32'; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+ break
+ done
+ CC=$ac_save_CC
+ rm -f conftest.$ac_ext
+ fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sys_largefile_CC" >&5
+echo "${ECHO_T}$ac_cv_sys_largefile_CC" >&6; }
+ if test "$ac_cv_sys_largefile_CC" != no; then
+ CC=$CC$ac_cv_sys_largefile_CC
+ fi
+
+ { echo "$as_me:$LINENO: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+echo $ECHO_N "checking for _FILE_OFFSET_BITS value needed for large files... $ECHO_C" >&6; }
+if test "${ac_cv_sys_file_offset_bits+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_sys_file_offset_bits=no; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_sys_file_offset_bits=64; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cv_sys_file_offset_bits=unknown
+ break
+done
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sys_file_offset_bits" >&5
+echo "${ECHO_T}$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+ no | unknown) ;;
+ *)
+cat >>confdefs.h <<_ACEOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+_ACEOF
+;;
+esac
+rm -f conftest*
+ if test $ac_cv_sys_file_offset_bits = unknown; then
+ { echo "$as_me:$LINENO: checking for _LARGE_FILES value needed for large files" >&5
+echo $ECHO_N "checking for _LARGE_FILES value needed for large files... $ECHO_C" >&6; }
+if test "${ac_cv_sys_large_files+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_sys_large_files=no; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_sys_large_files=1; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cv_sys_large_files=unknown
+ break
+done
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sys_large_files" >&5
+echo "${ECHO_T}$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+ no | unknown) ;;
+ *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+_ACEOF
+;;
+esac
+rm -f conftest*
+ fi
+fi
+
+fi
+
+# this one is for Tru64 and bind_to_cpu_id
+
+{ echo "$as_me:$LINENO: checking for main in -lmach" >&5
+echo $ECHO_N "checking for main in -lmach... $ECHO_C" >&6; }
+if test "${ac_cv_lib_mach_main+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lmach $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+
+int
+main ()
+{
+return main ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_lib_mach_main=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_mach_main=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_mach_main" >&5
+echo "${ECHO_T}$ac_cv_lib_mach_main" >&6; }
+if test $ac_cv_lib_mach_main = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBMACH 1
+_ACEOF
+
+ LIBS="-lmach $LIBS"
+
+fi
+ac_cv_lib_mach=ac_cv_lib_mach_main
+
+
+# Checks for typedefs, structures, and compiler characteristics.
+{ echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; }
+if test "${ac_cv_c_const+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+ /* Ultrix mips cc rejects this. */
+ typedef int charset[2];
+ const charset cs;
+ /* SunOS 4.1.1 cc rejects this. */
+ char const *const *pcpcc;
+ char **ppc;
+ /* NEC SVR4.0.2 mips cc rejects this. */
+ struct point {int x, y;};
+ static struct point const zero = {0,0};
+ /* AIX XL C 1.02.0.0 rejects this.
+ It does not let you subtract one const X* pointer from another in
+ an arm of an if-expression whose if-part is not a constant
+ expression */
+ const char *g = "string";
+ pcpcc = &g + (g ? g-g : 0);
+ /* HPUX 7.0 cc rejects these. */
+ ++pcpcc;
+ ppc = (char**) pcpcc;
+ pcpcc = (char const *const *) ppc;
+ { /* SCO 3.2v4 cc rejects this. */
+ char *t;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 0;
+ if (s) return 0;
+ }
+ { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
+ int x[] = {25, 17};
+ const int *foo = &x[0];
+ ++foo;
+ }
+ { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+ typedef const int *iptr;
+ iptr p = 0;
+ ++p;
+ }
+ { /* AIX XL C 1.02.0.0 rejects this saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; };
+ struct s *b; b->j = 5;
+ }
+ { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+ if (!foo) return 0;
+ }
+ return !cs[0] && !zero.x;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_c_const=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_c_const=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define const
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for off_t" >&5
+echo $ECHO_N "checking for off_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_off_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef off_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_type_off_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_off_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5
+echo "${ECHO_T}$ac_cv_type_off_t" >&6; }
+if test $ac_cv_type_off_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define off_t long int
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for size_t" >&5
+echo $ECHO_N "checking for size_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_size_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef size_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_type_size_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_size_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
+echo "${ECHO_T}$ac_cv_type_size_t" >&6; }
+if test $ac_cv_type_size_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
+
+fi
+
+# AC_TYPE_SOCKLEN_T
+
+
+ { echo "$as_me:$LINENO: checking for socklen_t equivalent" >&5
+echo $ECHO_N "checking for socklen_t equivalent... $ECHO_C" >&6; }
+ if test "${curl_cv_socklen_t_equiv+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ # Systems have either "struct sockaddr *" or
+ # "void *" as the second argument to getpeername
+ curl_cv_socklen_t_equiv=
+ for arg2 in "struct sockaddr" void; do
+ for t in int size_t unsigned long "unsigned long" socklen_t; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+ #ifdef HAVE_SYS_TYPES_H
+ #include <sys/types.h>
+ #endif
+ #ifdef HAVE_SYS_SOCKET_H
+ #include <sys/socket.h>
+ #endif
+
+ extern int getpeername (int, $arg2 *, $t *);
+
+int
+main ()
+{
+
+ $t len;
+ getpeername(0,0,&len);
+
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+
+ curl_cv_socklen_t_equiv="$t"
+ break 2
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+ done
+
+ if test "x$curl_cv_socklen_t_equiv" = x; then
+ # take a wild guess
+ curl_cv_socklen_t_equiv="socklen_t"
+ { echo "$as_me:$LINENO: WARNING: Cannot find a type to use in place of socklen_t, guessing socklen_t" >&5
+echo "$as_me: WARNING: Cannot find a type to use in place of socklen_t, guessing socklen_t" >&2;}
+ fi
+
+fi
+
+ { echo "$as_me:$LINENO: result: $curl_cv_socklen_t_equiv" >&5
+echo "${ECHO_T}$curl_cv_socklen_t_equiv" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define netperf_socklen_t $curl_cv_socklen_t_equiv
+_ACEOF
+
+
+
+# AC_TYPE_IN_PORT_T
+{ echo "$as_me:$LINENO: checking for h_errno declaration in netdb.h" >&5
+echo $ECHO_N "checking for h_errno declaration in netdb.h... $ECHO_C" >&6; }
+if test "${ac_cv_decl_h_errno+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <netdb.h>
+int
+main ()
+{
+
+h_errno = 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_decl_h_errno=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_decl_h_errno=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_decl_h_errno" >&5
+echo "${ECHO_T}$ac_cv_decl_h_errno" >&6; }
+if test "$ac_cv_decl_h_errno" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define H_ERRNO_DECLARED 1
+_ACEOF
+
+fi
+{ echo "$as_me:$LINENO: checking for struct sockaddr_storage" >&5
+echo $ECHO_N "checking for struct sockaddr_storage... $ECHO_C" >&6; }
+if test "${ac_cv_struct_sockaddr_storage+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+int
+main ()
+{
+
+struct sockaddr_storage address;
+
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_struct_sockaddr_storage=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_struct_sockaddr_storage=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_struct_sockaddr_storage" >&5
+echo "${ECHO_T}$ac_cv_struct_sockaddr_storage" >&6; }
+if test "$ac_cv_struct_sockaddr_storage" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_STRUCT_SOCKADDR_STORAGE 1
+_ACEOF
+
+fi
+{ echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5
+echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6; }
+if test "${ac_cv_header_time+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+
+int
+main ()
+{
+if ((struct tm *) 0)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_header_time=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_header_time=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5
+echo "${ECHO_T}$ac_cv_header_time" >&6; }
+if test $ac_cv_header_time = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define TIME_WITH_SYS_TIME 1
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for stdbool.h that conforms to C99" >&5
+echo $ECHO_N "checking for stdbool.h that conforms to C99... $ECHO_C" >&6; }
+if test "${ac_cv_header_stdbool_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <stdbool.h>
+#ifndef bool
+ "error: bool is not defined"
+#endif
+#ifndef false
+ "error: false is not defined"
+#endif
+#if false
+ "error: false is not 0"
+#endif
+#ifndef true
+ "error: true is not defined"
+#endif
+#if true != 1
+ "error: true is not 1"
+#endif
+#ifndef __bool_true_false_are_defined
+ "error: __bool_true_false_are_defined is not defined"
+#endif
+
+ struct s { _Bool s: 1; _Bool t; } s;
+
+ char a[true == 1 ? 1 : -1];
+ char b[false == 0 ? 1 : -1];
+ char c[__bool_true_false_are_defined == 1 ? 1 : -1];
+ char d[(bool) 0.5 == true ? 1 : -1];
+ bool e = &s;
+ char f[(_Bool) 0.0 == false ? 1 : -1];
+ char g[true];
+ char h[sizeof (_Bool)];
+ char i[sizeof s.t];
+ enum { j = false, k = true, l = false * true, m = true * 256 };
+ _Bool n[m];
+ char o[sizeof n == m * sizeof n[0] ? 1 : -1];
+ char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
+# if defined __xlc__ || defined __GNUC__
+ /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0
+ reported by James Lemley on 2005-10-05; see
+ http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html
+ This test is not quite right, since xlc is allowed to
+ reject this program, as the initializer for xlcbug is
+ not one of the forms that C requires support for.
+ However, doing the test right would require a runtime
+ test, and that would make cross-compilation harder.
+ Let us hope that IBM fixes the xlc bug, and also adds
+ support for this kind of constant expression. In the
+ meantime, this test will reject xlc, which is OK, since
+ our stdbool.h substitute should suffice. We also test
+ this with GCC, where it should work, to detect more
+ quickly whether someone messes up the test in the
+ future. */
+ char digs[] = "0123456789";
+ int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1);
+# endif
+ /* Catch a bug in an HP-UX C compiler. See
+ http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+ http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
+ */
+ _Bool q = true;
+ _Bool *pq = &q;
+
+int
+main ()
+{
+
+ *pq |= q;
+ *pq |= ! q;
+ /* Refer to every declared value, to avoid compiler optimizations. */
+ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l
+ + !m + !n + !o + !p + !q + !pq);
+
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_header_stdbool_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_header_stdbool_h=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_stdbool_h" >&5
+echo "${ECHO_T}$ac_cv_header_stdbool_h" >&6; }
+{ echo "$as_me:$LINENO: checking for _Bool" >&5
+echo $ECHO_N "checking for _Bool... $ECHO_C" >&6; }
+if test "${ac_cv_type__Bool+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef _Bool ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_type__Bool=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type__Bool=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type__Bool" >&5
+echo "${ECHO_T}$ac_cv_type__Bool" >&6; }
+if test $ac_cv_type__Bool = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE__BOOL 1
+_ACEOF
+
+
+fi
+
+if test $ac_cv_header_stdbool_h = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_STDBOOL_H 1
+_ACEOF
+
+fi
+
+
+# Checks for library functions.
+# AC_FUNC_ERROR_AT_LINE
+{ echo "$as_me:$LINENO: checking for pid_t" >&5
+echo $ECHO_N "checking for pid_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_pid_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef pid_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_type_pid_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_pid_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5
+echo "${ECHO_T}$ac_cv_type_pid_t" >&6; }
+if test $ac_cv_type_pid_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define pid_t int
+_ACEOF
+
+fi
+
+
+for ac_header in vfork.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+for ac_func in fork vfork
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+if test "x$ac_cv_func_fork" = xyes; then
+ { echo "$as_me:$LINENO: checking for working fork" >&5
+echo $ECHO_N "checking for working fork... $ECHO_C" >&6; }
+if test "${ac_cv_func_fork_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_fork_works=cross
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+
+ /* By Ruediger Kuhlmann. */
+ return fork () < 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_fork_works=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_fork_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_fork_works" >&5
+echo "${ECHO_T}$ac_cv_func_fork_works" >&6; }
+
+else
+ ac_cv_func_fork_works=$ac_cv_func_fork
+fi
+if test "x$ac_cv_func_fork_works" = xcross; then
+ case $host in
+ *-*-amigaos* | *-*-msdosdjgpp*)
+ # Override, as these systems have only a dummy fork() stub
+ ac_cv_func_fork_works=no
+ ;;
+ *)
+ ac_cv_func_fork_works=yes
+ ;;
+ esac
+ { echo "$as_me:$LINENO: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5
+echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;}
+fi
+ac_cv_func_vfork_works=$ac_cv_func_vfork
+if test "x$ac_cv_func_vfork" = xyes; then
+ { echo "$as_me:$LINENO: checking for working vfork" >&5
+echo $ECHO_N "checking for working vfork... $ECHO_C" >&6; }
+if test "${ac_cv_func_vfork_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_vfork_works=cross
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Thanks to Paul Eggert for this test. */
+$ac_includes_default
+#include <sys/wait.h>
+#ifdef HAVE_VFORK_H
+# include <vfork.h>
+#endif
+/* On some sparc systems, changes by the child to local and incoming
+ argument registers are propagated back to the parent. The compiler
+ is told about this with #include <vfork.h>, but some compilers
+ (e.g. gcc -O) don't grok <vfork.h>. Test for this by using a
+ static variable whose address is put into a register that is
+ clobbered by the vfork. */
+static void
+#ifdef __cplusplus
+sparc_address_test (int arg)
+# else
+sparc_address_test (arg) int arg;
+#endif
+{
+ static pid_t child;
+ if (!child) {
+ child = vfork ();
+ if (child < 0) {
+ perror ("vfork");
+ _exit(2);
+ }
+ if (!child) {
+ arg = getpid();
+ write(-1, "", 0);
+ _exit (arg);
+ }
+ }
+}
+
+int
+main ()
+{
+ pid_t parent = getpid ();
+ pid_t child;
+
+ sparc_address_test (0);
+
+ child = vfork ();
+
+ if (child == 0) {
+ /* Here is another test for sparc vfork register problems. This
+ test uses lots of local variables, at least as many local
+ variables as main has allocated so far including compiler
+ temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris
+ 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should
+ reuse the register of parent for one of the local variables,
+ since it will think that parent can't possibly be used any more
+ in this routine. Assigning to the local variable will thus
+ munge parent in the parent process. */
+ pid_t
+ p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(),
+ p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid();
+ /* Convince the compiler that p..p7 are live; otherwise, it might
+ use the same hardware register for all 8 local variables. */
+ if (p != p1 || p != p2 || p != p3 || p != p4
+ || p != p5 || p != p6 || p != p7)
+ _exit(1);
+
+ /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent
+ from child file descriptors. If the child closes a descriptor
+ before it execs or exits, this munges the parent's descriptor
+ as well. Test for this by closing stdout in the child. */
+ _exit(close(fileno(stdout)) != 0);
+ } else {
+ int status;
+ struct stat st;
+
+ while (wait(&status) != child)
+ ;
+ return (
+ /* Was there some problem with vforking? */
+ child < 0
+
+ /* Did the child fail? (This shouldn't happen.) */
+ || status
+
+ /* Did the vfork/compiler bug occur? */
+ || parent != getpid()
+
+ /* Did the file descriptor bug occur? */
+ || fstat(fileno(stdout), &st) != 0
+ );
+ }
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_vfork_works=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_vfork_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_vfork_works" >&5
+echo "${ECHO_T}$ac_cv_func_vfork_works" >&6; }
+
+fi;
+if test "x$ac_cv_func_fork_works" = xcross; then
+ ac_cv_func_vfork_works=$ac_cv_func_vfork
+ { echo "$as_me:$LINENO: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5
+echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;}
+fi
+
+if test "x$ac_cv_func_vfork_works" = xyes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_WORKING_VFORK 1
+_ACEOF
+
+else
+
+cat >>confdefs.h <<\_ACEOF
+#define vfork fork
+_ACEOF
+
+fi
+if test "x$ac_cv_func_fork_works" = xyes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_WORKING_FORK 1
+_ACEOF
+
+fi
+
+# AC_FUNC_MALLOC
+
+
+for ac_header in stdlib.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_func in getpagesize
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+{ echo "$as_me:$LINENO: checking for working mmap" >&5
+echo $ECHO_N "checking for working mmap... $ECHO_C" >&6; }
+if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_mmap_fixed_mapped=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+/* malloc might have been renamed as rpl_malloc. */
+#undef malloc
+
+/* Thanks to Mike Haertel and Jim Avera for this test.
+ Here is a matrix of mmap possibilities:
+ mmap private not fixed
+ mmap private fixed at somewhere currently unmapped
+ mmap private fixed at somewhere already mapped
+ mmap shared not fixed
+ mmap shared fixed at somewhere currently unmapped
+ mmap shared fixed at somewhere already mapped
+ For private mappings, we should verify that changes cannot be read()
+ back from the file, nor mmap's back from the file at a different
+ address. (There have been systems where private was not correctly
+ implemented like the infamous i386 svr4.0, and systems where the
+ VM page cache was not coherent with the file system buffer cache
+ like early versions of FreeBSD and possibly contemporary NetBSD.)
+ For shared mappings, we should conversely verify that changes get
+ propagated back to all the places they're supposed to be.
+
+ Grep wants private fixed already mapped.
+ The main things grep needs to know about mmap are:
+ * does it exist and is it safe to write into the mmap'd area
+ * how to use it (BSD variants) */
+
+#include <fcntl.h>
+#include <sys/mman.h>
+
+#if !defined STDC_HEADERS && !defined HAVE_STDLIB_H
+char *malloc ();
+#endif
+
+/* This mess was copied from the GNU getpagesize.h. */
+#ifndef HAVE_GETPAGESIZE
+/* Assume that all systems that can run configure have sys/param.h. */
+# ifndef HAVE_SYS_PARAM_H
+# define HAVE_SYS_PARAM_H 1
+# endif
+
+# ifdef _SC_PAGESIZE
+# define getpagesize() sysconf(_SC_PAGESIZE)
+# else /* no _SC_PAGESIZE */
+# ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+# ifdef EXEC_PAGESIZE
+# define getpagesize() EXEC_PAGESIZE
+# else /* no EXEC_PAGESIZE */
+# ifdef NBPG
+# define getpagesize() NBPG * CLSIZE
+# ifndef CLSIZE
+# define CLSIZE 1
+# endif /* no CLSIZE */
+# else /* no NBPG */
+# ifdef NBPC
+# define getpagesize() NBPC
+# else /* no NBPC */
+# ifdef PAGESIZE
+# define getpagesize() PAGESIZE
+# endif /* PAGESIZE */
+# endif /* no NBPC */
+# endif /* no NBPG */
+# endif /* no EXEC_PAGESIZE */
+# else /* no HAVE_SYS_PARAM_H */
+# define getpagesize() 8192 /* punt totally */
+# endif /* no HAVE_SYS_PARAM_H */
+# endif /* no _SC_PAGESIZE */
+
+#endif /* no HAVE_GETPAGESIZE */
+
+int
+main ()
+{
+ char *data, *data2, *data3;
+ int i, pagesize;
+ int fd;
+
+ pagesize = getpagesize ();
+
+ /* First, make a file with some known garbage in it. */
+ data = (char *) malloc (pagesize);
+ if (!data)
+ return 1;
+ for (i = 0; i < pagesize; ++i)
+ *(data + i) = rand ();
+ umask (0);
+ fd = creat ("conftest.mmap", 0600);
+ if (fd < 0)
+ return 1;
+ if (write (fd, data, pagesize) != pagesize)
+ return 1;
+ close (fd);
+
+ /* Next, try to mmap the file at a fixed address which already has
+ something else allocated at it. If we can, also make sure that
+ we see the same garbage. */
+ fd = open ("conftest.mmap", O_RDWR);
+ if (fd < 0)
+ return 1;
+ data2 = (char *) malloc (2 * pagesize);
+ if (!data2)
+ return 1;
+ data2 += (pagesize - ((long int) data2 & (pagesize - 1))) & (pagesize - 1);
+ if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_FIXED, fd, 0L))
+ return 1;
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data2 + i))
+ return 1;
+
+ /* Finally, make sure that changes to the mapped area do not
+ percolate back to the file as seen by read(). (This is a bug on
+ some variants of i386 svr4.0.) */
+ for (i = 0; i < pagesize; ++i)
+ *(data2 + i) = *(data2 + i) + 1;
+ data3 = (char *) malloc (pagesize);
+ if (!data3)
+ return 1;
+ if (read (fd, data3, pagesize) != pagesize)
+ return 1;
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data3 + i))
+ return 1;
+ close (fd);
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_mmap_fixed_mapped=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_mmap_fixed_mapped=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_mmap_fixed_mapped" >&5
+echo "${ECHO_T}$ac_cv_func_mmap_fixed_mapped" >&6; }
+if test $ac_cv_func_mmap_fixed_mapped = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_MMAP 1
+_ACEOF
+
+fi
+rm -f conftest.mmap
+
+
+
+for ac_header in sys/select.h sys/socket.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+{ echo "$as_me:$LINENO: checking types of arguments for select" >&5
+echo $ECHO_N "checking types of arguments for select... $ECHO_C" >&6; }
+if test "${ac_cv_func_select_args+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ for ac_arg234 in 'fd_set *' 'int *' 'void *'; do
+ for ac_arg1 in 'int' 'size_t' 'unsigned long int' 'unsigned int'; do
+ for ac_arg5 in 'struct timeval *' 'const struct timeval *'; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#ifdef HAVE_SYS_SELECT_H
+# include <sys/select.h>
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+
+int
+main ()
+{
+extern int select ($ac_arg1,
+ $ac_arg234, $ac_arg234, $ac_arg234,
+ $ac_arg5);
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_func_select_args="$ac_arg1,$ac_arg234,$ac_arg5"; break 3
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+ done
+done
+# Provide a safe default value.
+: ${ac_cv_func_select_args='int,int *,struct timeval *'}
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_select_args" >&5
+echo "${ECHO_T}$ac_cv_func_select_args" >&6; }
+ac_save_IFS=$IFS; IFS=','
+set dummy `echo "$ac_cv_func_select_args" | sed 's/\*/\*/g'`
+IFS=$ac_save_IFS
+shift
+
+cat >>confdefs.h <<_ACEOF
+#define SELECT_TYPE_ARG1 $1
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define SELECT_TYPE_ARG234 ($2)
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define SELECT_TYPE_ARG5 ($3)
+_ACEOF
+
+rm -f conftest*
+
+{ echo "$as_me:$LINENO: checking whether setpgrp takes no argument" >&5
+echo $ECHO_N "checking whether setpgrp takes no argument... $ECHO_C" >&6; }
+if test "${ac_cv_func_setpgrp_void+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot check setpgrp when cross compiling" >&5
+echo "$as_me: error: cannot check setpgrp when cross compiling" >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+/* If this system has a BSD-style setpgrp which takes arguments,
+ setpgrp(1, 1) will fail with ESRCH and return -1, in that case
+ exit successfully. */
+ return setpgrp (1,1) != -1;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_setpgrp_void=no
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_setpgrp_void=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_setpgrp_void" >&5
+echo "${ECHO_T}$ac_cv_func_setpgrp_void" >&6; }
+if test $ac_cv_func_setpgrp_void = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define SETPGRP_VOID 1
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking return type of signal handlers" >&5
+echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6; }
+if test "${ac_cv_type_signal+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <signal.h>
+
+int
+main ()
+{
+return *(signal (0, 0)) (0) == 1;
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_type_signal=int
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_signal=void
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5
+echo "${ECHO_T}$ac_cv_type_signal" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define RETSIGTYPE $ac_cv_type_signal
+_ACEOF
+
+
+# AC_FUNC_STAT
+# remove pstat_getdynamic (at least for now) since we don't do
+# anything conditional with the check anyway...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+for ac_func in alarm bzero gethostbyname gethrtime gettimeofday inet_ntoa memset memcpy munmap select socket sqrt strcasecmp strchr strstr strtoul uname
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+#AC_CONFIG_SUBDIRS(src/missing)
+
+# does this platform need the replacement getaddrinfo
+
+
+
+for ac_func in getnameinfo getaddrinfo inet_ntop
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+# AC_REPLACE_FUNCS([getaddrinfo])
+
+
+if test "$ac_cv_func_getaddrinfo$ac_cv_func_getnameinfo" != yesyes ; then
+ { echo "$as_me:$LINENO: Requesting replacement getaddrinfo/getnameinfo" >&5
+echo "$as_me: Requesting replacement getaddrinfo/getnameinfo" >&6;}
+ case " $LIBOBJS " in
+ *" getaddrinfo.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS getaddrinfo.$ac_objext"
+ ;;
+esac
+
+ HAVE_MISSING=yes
+fi
+if test "$ac_cv_func_inet_ntop" != yes ; then
+ { echo "$as_me:$LINENO: Requesting replacement inet_ntop" >&5
+echo "$as_me: Requesting replacement inet_ntop" >&6;}
+ case " $LIBOBJS " in
+ *" inet_ntop.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS inet_ntop.$ac_objext"
+ ;;
+esac
+
+ HAVE_MISSING=yes
+fi
+
+
+if test "$HAVE_MISSING" = "yes"; then
+ NEED_LIBCOMPAT_TRUE=
+ NEED_LIBCOMPAT_FALSE='#'
+else
+ NEED_LIBCOMPAT_TRUE='#'
+ NEED_LIBCOMPAT_FALSE=
+fi
+
+
+
+for ac_func in sendfile
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+# check for the various CPU binding calls
+
+
+
+
+
+for ac_func in mpctl processor_bind sched_setaffinity bind_to_cpu_id bindprocessor
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* 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 $ac_func ();
+/* 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_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+# see if we should be enabling histogram support
+
+{ echo "$as_me:$LINENO: checking whether to include histogram support" >&5
+echo $ECHO_N "checking whether to include histogram support... $ECHO_C" >&6; }
+
+# Check whether --enable-histogram was given.
+if test "${enable_histogram+set}" = set; then
+ enableval=$enable_histogram;
+fi
+
+
+case "$enable_histogram" in
+ yes)
+ use_histogram=true
+ ;;
+ no)
+ use_histogram=false
+ ;;
+ '')
+ # whatever
+ use_histogram=false
+ ;;
+ *)
+ { { echo "$as_me:$LINENO: error: --enable-histogram takes yes or no" >&5
+echo "$as_me: error: --enable-histogram takes yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+if $use_histogram
+then
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+if $use_histogram
+then
+
+cat >>confdefs.h <<\_ACEOF
+#define WANT_HISTOGRAM
+_ACEOF
+
+fi
+# see if we should be enabling histogram support
+
+{ echo "$as_me:$LINENO: checking whether to include dirty support" >&5
+echo $ECHO_N "checking whether to include dirty support... $ECHO_C" >&6; }
+
+# Check whether --enable-dirty was given.
+if test "${enable_dirty+set}" = set; then
+ enableval=$enable_dirty;
+fi
+
+
+case "$enable_dirty" in
+ yes)
+ use_dirty=true
+ ;;
+ no)
+ use_dirty=false
+ ;;
+ '')
+ # whatever
+ use_dirty=false
+ ;;
+ *)
+ { { echo "$as_me:$LINENO: error: --enable-dirty takes yes or no" >&5
+echo "$as_me: error: --enable-dirty takes yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+if $use_dirty
+then
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+if $use_dirty
+then
+
+cat >>confdefs.h <<\_ACEOF
+#define DIRTY
+_ACEOF
+
+fi
+
+# see if we should be enabling demo support
+
+{ echo "$as_me:$LINENO: checking whether to include demo support" >&5
+echo $ECHO_N "checking whether to include demo support... $ECHO_C" >&6; }
+
+# Check whether --enable-demo was given.
+if test "${enable_demo+set}" = set; then
+ enableval=$enable_demo;
+fi
+
+
+case "$enable_demo" in
+ yes)
+ use_demo=true
+ ;;
+ no)
+ use_demo=false
+ ;;
+ '')
+ # whatever
+ use_demo=false
+ ;;
+ *)
+ { { echo "$as_me:$LINENO: error: --enable-demo takes yes or no" >&5
+echo "$as_me: error: --enable-demo takes yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+if $use_demo
+then
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+if $use_demo
+then
+
+cat >>confdefs.h <<\_ACEOF
+#define WANT_DEMO
+_ACEOF
+
+fi
+
+# see if we should be including the AF_UNIX tests
+
+{ echo "$as_me:$LINENO: checking whether to include Unix-domain socket tests" >&5
+echo $ECHO_N "checking whether to include Unix-domain socket tests... $ECHO_C" >&6; }
+
+# Check whether --enable-unixdomain was given.
+if test "${enable_unixdomain+set}" = set; then
+ enableval=$enable_unixdomain;
+fi
+
+
+case "$enable_unixdomain" in
+ yes)
+ use_unixdomain=true
+ ;;
+ no)
+ use_unixdomain=false
+ ;;
+ '')
+ use_unixdomain=false
+ ;;
+ *)
+ { { echo "$as_me:$LINENO: error: --enable-unixdomain takes yes or no" >&5
+echo "$as_me: error: --enable-unixdomain takes yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+if $use_unixdomain
+then
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+if $use_unixdomain
+then
+
+cat >>confdefs.h <<\_ACEOF
+#define WANT_UNIX
+_ACEOF
+
+fi
+
+# see if we should be including the DLPI tests
+
+{ echo "$as_me:$LINENO: checking whether to include DLPI tests" >&5
+echo $ECHO_N "checking whether to include DLPI tests... $ECHO_C" >&6; }
+
+# Check whether --enable-dlpi was given.
+if test "${enable_dlpi+set}" = set; then
+ enableval=$enable_dlpi;
+fi
+
+
+case "$enable_dlpi" in
+ yes)
+ use_dlpi=true
+ ;;
+ no)
+ use_dlpi=false
+ ;;
+ '')
+ use_dlpi=false
+ ;;
+ *)
+ { { echo "$as_me:$LINENO: error: --enable-dlpi takes yes or no" >&5
+echo "$as_me: error: --enable-dlpi takes yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+if $use_dlpi
+then
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+if $use_dlpi
+then
+
+cat >>confdefs.h <<\_ACEOF
+#define WANT_DLPI
+_ACEOF
+
+fi
+
+
+# see if we should be including the XTI tests
+
+{ echo "$as_me:$LINENO: checking whether to include XTI tests" >&5
+echo $ECHO_N "checking whether to include XTI tests... $ECHO_C" >&6; }
+
+# Check whether --enable-xti was given.
+if test "${enable_xti+set}" = set; then
+ enableval=$enable_xti;
+fi
+
+
+case "$enable_xti" in
+ yes)
+ use_xti=true
+ ;;
+ no)
+ use_xti=false
+ ;;
+ '')
+ use_xti=false
+ ;;
+ *)
+ { { echo "$as_me:$LINENO: error: --enable-xti takes yes or no" >&5
+echo "$as_me: error: --enable-xti takes yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+if $use_xti
+then
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+if $use_xti
+then
+
+cat >>confdefs.h <<\_ACEOF
+#define WANT_XTI
+_ACEOF
+
+fi
+
+# see if we should be including the SDP tests
+
+{ echo "$as_me:$LINENO: checking whether to include SDP tests" >&5
+echo $ECHO_N "checking whether to include SDP tests... $ECHO_C" >&6; }
+
+# Check whether --enable-sdp was given.
+if test "${enable_sdp+set}" = set; then
+ enableval=$enable_sdp;
+fi
+
+
+case "$enable_sdp" in
+ yes)
+ # probably need to be a bit more sophisticated here
+
+{ echo "$as_me:$LINENO: checking for t_open in -lsdp" >&5
+echo $ECHO_N "checking for t_open in -lsdp... $ECHO_C" >&6; }
+if test "${ac_cv_lib_sdp_t_open+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsdp $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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 t_open ();
+int
+main ()
+{
+return t_open ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_lib_sdp_t_open=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_sdp_t_open=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_sdp_t_open" >&5
+echo "${ECHO_T}$ac_cv_lib_sdp_t_open" >&6; }
+if test $ac_cv_lib_sdp_t_open = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBSDP 1
+_ACEOF
+
+ LIBS="-lsdp $LIBS"
+
+fi
+
+ use_sdp=true
+ ;;
+ no)
+ use_sdp=false
+ ;;
+ '')
+ use_sdp=false
+ ;;
+ *)
+ { { echo "$as_me:$LINENO: error: --enable-sdp takes yes or no" >&5
+echo "$as_me: error: --enable-sdp takes yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+if $use_sdp
+then
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+if $use_sdp
+then
+
+cat >>confdefs.h <<\_ACEOF
+#define WANT_SDP
+_ACEOF
+
+fi
+
+# see if we should be including the ICSC-EXS tests
+
+{ echo "$as_me:$LINENO: checking whether to include ICSC-EXS tests" >&5
+echo $ECHO_N "checking whether to include ICSC-EXS tests... $ECHO_C" >&6; }
+
+# Check whether --enable-exs was given.
+if test "${enable_exs+set}" = set; then
+ enableval=$enable_exs;
+fi
+
+
+case "$enable_exs" in
+ yes)
+ use_exs=true
+ if test "${ac_cv_header_sys_exs_h+set}" = set; then
+ { echo "$as_me:$LINENO: checking for sys/exs.h" >&5
+echo $ECHO_N "checking for sys/exs.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_sys_exs_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_sys_exs_h" >&5
+echo "${ECHO_T}$ac_cv_header_sys_exs_h" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking sys/exs.h usability" >&5
+echo $ECHO_N "checking sys/exs.h usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <sys/exs.h>
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking sys/exs.h presence" >&5
+echo $ECHO_N "checking sys/exs.h presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/exs.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: sys/exs.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: sys/exs.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/exs.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: sys/exs.h: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: sys/exs.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: sys/exs.h: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/exs.h: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: sys/exs.h: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/exs.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: sys/exs.h: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/exs.h: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: sys/exs.h: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/exs.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: sys/exs.h: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/exs.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: sys/exs.h: in the future, the compiler will take precedence" >&2;}
+
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for sys/exs.h" >&5
+echo $ECHO_N "checking for sys/exs.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_sys_exs_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_header_sys_exs_h=$ac_header_preproc
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_sys_exs_h" >&5
+echo "${ECHO_T}$ac_cv_header_sys_exs_h" >&6; }
+
+fi
+if test $ac_cv_header_sys_exs_h = yes; then
+ :
+else
+ use_exs=false
+fi
+
+
+
+{ echo "$as_me:$LINENO: checking for exs_init in -lexs" >&5
+echo $ECHO_N "checking for exs_init in -lexs... $ECHO_C" >&6; }
+if test "${ac_cv_lib_exs_exs_init+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lexs $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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 exs_init ();
+int
+main ()
+{
+return exs_init ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_lib_exs_exs_init=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_exs_exs_init=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_exs_exs_init" >&5
+echo "${ECHO_T}$ac_cv_lib_exs_exs_init" >&6; }
+if test $ac_cv_lib_exs_exs_init = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBEXS 1
+_ACEOF
+
+ LIBS="-lexs $LIBS"
+
+else
+ use_exs=false
+fi
+
+ ;;
+ no)
+ use_exs=false
+ ;;
+ '')
+ use_exs=false
+ ;;
+ *)
+ { { echo "$as_me:$LINENO: error: --enable-exs takes yes or no" >&5
+echo "$as_me: error: --enable-exs takes yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+if $use_exs
+then
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+if $use_exs
+then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ICSC_EXS
+_ACEOF
+
+fi
+
+# see if we should be enabling SCTP support
+
+
+# Check whether --enable-sctp was given.
+if test "${enable_sctp+set}" = set; then
+ enableval=$enable_sctp;
+fi
+
+
+case "$enable_sctp" in
+ yes)
+ use_sctp=true
+
+for ac_header in netinet/sctp.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <sys/socket.h>
+
+
+#include <$ac_header>
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_Header=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ use_sctp=false
+fi
+
+done
+
+ case "$host" in
+ *-*-freebsd7.*)
+ # FreeBSD 7.x SCTP support doesn't need -lsctp.
+ ;;
+ *)
+
+{ echo "$as_me:$LINENO: checking for main in -lsctp" >&5
+echo $ECHO_N "checking for main in -lsctp... $ECHO_C" >&6; }
+if test "${ac_cv_lib_sctp_main+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsctp $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+
+int
+main ()
+{
+return main ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_lib_sctp_main=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_sctp_main=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_sctp_main" >&5
+echo "${ECHO_T}$ac_cv_lib_sctp_main" >&6; }
+if test $ac_cv_lib_sctp_main = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBSCTP 1
+_ACEOF
+
+ LIBS="-lsctp $LIBS"
+
+else
+ use_sctp=false
+fi
+ac_cv_lib_sctp=ac_cv_lib_sctp_main
+
+ ;;
+ esac
+ { echo "$as_me:$LINENO: checking for struct sctp_event_subscribe.sctp_adaptation_layer_event" >&5
+echo $ECHO_N "checking for struct sctp_event_subscribe.sctp_adaptation_layer_event... $ECHO_C" >&6; }
+if test "${ac_cv_member_struct_sctp_event_subscribe_sctp_adaptation_layer_event+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <netinet/sctp.h>
+
+int
+main ()
+{
+static struct sctp_event_subscribe ac_aggr;
+if (ac_aggr.sctp_adaptation_layer_event)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_member_struct_sctp_event_subscribe_sctp_adaptation_layer_event=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <netinet/sctp.h>
+
+int
+main ()
+{
+static struct sctp_event_subscribe ac_aggr;
+if (sizeof ac_aggr.sctp_adaptation_layer_event)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_member_struct_sctp_event_subscribe_sctp_adaptation_layer_event=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_member_struct_sctp_event_subscribe_sctp_adaptation_layer_event=no
+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
+{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_sctp_event_subscribe_sctp_adaptation_layer_event" >&5
+echo "${ECHO_T}$ac_cv_member_struct_sctp_event_subscribe_sctp_adaptation_layer_event" >&6; }
+
+ if test "$ac_cv_member_struct_sctp_event_subscribe_sctp_adaptation_layer_event" = "yes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_SCTP_ADAPTATION_LAYER_EVENT 1
+_ACEOF
+
+ fi
+ ;;
+ no)
+ use_sctp=false
+ ;;
+ '')
+ # whatever
+ use_sctp=false
+ ;;
+ *)
+ { { echo "$as_me:$LINENO: error: --enable-sctp takes yes or no" >&5
+echo "$as_me: error: --enable-sctp takes yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+{ echo "$as_me:$LINENO: checking whether to include SCTP tests" >&5
+echo $ECHO_N "checking whether to include SCTP tests... $ECHO_C" >&6; }
+
+if $use_sctp
+then
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+if $use_sctp
+then
+
+cat >>confdefs.h <<\_ACEOF
+#define WANT_SCTP
+_ACEOF
+
+fi
+
+# see if we should be enabling paced sends
+
+{ echo "$as_me:$LINENO: checking whether to include paced send (intervals) support" >&5
+echo $ECHO_N "checking whether to include paced send (intervals) support... $ECHO_C" >&6; }
+
+# Check whether --enable-intervals was given.
+if test "${enable_intervals+set}" = set; then
+ enableval=$enable_intervals;
+fi
+
+
+case "$enable_intervals" in
+ yes)
+ use_intervals=true
+ ;;
+ no)
+ use_intervals=false
+ ;;
+ '')
+ use_intervals=false
+ ;;
+ *)
+ { { echo "$as_me:$LINENO: error: --enable-intervals takes yes or no" >&5
+echo "$as_me: error: --enable-intervals takes yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+if $use_intervals
+then
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+if $use_intervals
+then
+
+cat >>confdefs.h <<\_ACEOF
+#define WANT_INTERVALS
+_ACEOF
+
+fi
+
+# see if paced sends should wait and spin
+
+{ echo "$as_me:$LINENO: checking whether paced sends should spin" >&5
+echo $ECHO_N "checking whether paced sends should spin... $ECHO_C" >&6; }
+
+# Check whether --enable-spin was given.
+if test "${enable_spin+set}" = set; then
+ enableval=$enable_spin;
+fi
+
+
+case "$enable_spin" in
+ yes)
+ use_spin=true
+ ;;
+ no)
+ use_spin=false
+ ;;
+ '')
+ use_spin=false
+ ;;
+ *)
+ { { echo "$as_me:$LINENO: error: --enable-spin takes yes or no" >&5
+echo "$as_me: error: --enable-spin takes yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+if $use_spin
+then
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+if $use_spin
+then
+
+cat >>confdefs.h <<\_ACEOF
+#define WANT_INTERVALS
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define WANT_SPIN
+_ACEOF
+
+fi
+
+# see if we should be enabling initial request bursts
+
+{ echo "$as_me:$LINENO: checking whether to include initial burst support in _RR tests" >&5
+echo $ECHO_N "checking whether to include initial burst support in _RR tests... $ECHO_C" >&6; }
+
+# Check whether --enable-burst was given.
+if test "${enable_burst+set}" = set; then
+ enableval=$enable_burst;
+fi
+
+
+case "$enable_burst" in
+ yes)
+ use_burst=true
+ ;;
+ no)
+ use_burst=false
+ ;;
+ '')
+ use_burst=false
+ ;;
+ *)
+ { { echo "$as_me:$LINENO: error: --enable-burst takes yes or no" >&5
+echo "$as_me: error: --enable-burst takes yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+if $use_burst
+then
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+if $use_burst
+then
+
+cat >>confdefs.h <<\_ACEOF
+#define WANT_FIRST_BURST
+_ACEOF
+
+fi
+
+# time to see about CPU utilization measurements
+
+{ echo "$as_me:$LINENO: checking which CPU utilization measurement type to use" >&5
+echo $ECHO_N "checking which CPU utilization measurement type to use... $ECHO_C" >&6; }
+
+# Check whether --enable-cpuutil was given.
+if test "${enable_cpuutil+set}" = set; then
+ enableval=$enable_cpuutil;
+fi
+
+
+NETCPU_SOURCE="$enable_cpuutil"
+case "$enable_cpuutil" in
+ pstat)
+ use_cpuutil=true
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_PSTAT
+_ACEOF
+
+ ;;
+ pstatnew)
+ use_cpuutil=true
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_PSTAT
+_ACEOF
+
+ ;;
+ perfstat)
+ use_cpuutil=true
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_PERFSTAT
+_ACEOF
+
+
+{ echo "$as_me:$LINENO: checking for main in -lperfstat" >&5
+echo $ECHO_N "checking for main in -lperfstat... $ECHO_C" >&6; }
+if test "${ac_cv_lib_perfstat_main+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lperfstat $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+
+int
+main ()
+{
+return main ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_lib_perfstat_main=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_perfstat_main=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_perfstat_main" >&5
+echo "${ECHO_T}$ac_cv_lib_perfstat_main" >&6; }
+if test $ac_cv_lib_perfstat_main = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBPERFSTAT 1
+_ACEOF
+
+ LIBS="-lperfstat $LIBS"
+
+fi
+ac_cv_lib_perfstat=ac_cv_lib_perfstat_main
+
+ ;;
+
+ looper)
+ use_cpuutil=true
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_LOOPER
+_ACEOF
+
+ ;;
+ procstat)
+ use_cpuutil=true
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_PROC_STAT
+_ACEOF
+
+ ;;
+ kstat)
+ use_cpuutil=true
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_KSTAT
+_ACEOF
+
+
+{ echo "$as_me:$LINENO: checking for main in -lkstat" >&5
+echo $ECHO_N "checking for main in -lkstat... $ECHO_C" >&6; }
+if test "${ac_cv_lib_kstat_main+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lkstat $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+
+int
+main ()
+{
+return main ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_lib_kstat_main=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_kstat_main=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_kstat_main" >&5
+echo "${ECHO_T}$ac_cv_lib_kstat_main" >&6; }
+if test $ac_cv_lib_kstat_main = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBKSTAT 1
+_ACEOF
+
+ LIBS="-lkstat $LIBS"
+
+fi
+ac_cv_lib_kstat=ac_cv_lib_kstat_main
+
+ ;;
+ kstat10)
+ use_cpuutil=true
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_KSTAT
+_ACEOF
+
+
+{ echo "$as_me:$LINENO: checking for main in -lkstat" >&5
+echo $ECHO_N "checking for main in -lkstat... $ECHO_C" >&6; }
+if test "${ac_cv_lib_kstat_main+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lkstat $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+
+int
+main ()
+{
+return main ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_lib_kstat_main=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_kstat_main=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_kstat_main" >&5
+echo "${ECHO_T}$ac_cv_lib_kstat_main" >&6; }
+if test $ac_cv_lib_kstat_main = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBKSTAT 1
+_ACEOF
+
+ LIBS="-lkstat $LIBS"
+
+fi
+ac_cv_lib_kstat=ac_cv_lib_kstat_main
+
+ ;;
+ osx)
+ use_cpuutil=true
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_OSX
+_ACEOF
+
+ ;;
+ '')
+# ia64-hp-hpux11.23
+# i386-pc-solaris2.10
+# guess it automagically in a nice big case statement
+ case $target in
+ *-*-linux*)
+ use_cpuutil=true
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_PROC_STAT
+_ACEOF
+
+ enable_cpuutil="procstat - auto"
+ NETCPU_SOURCE="procstat"
+ ;;
+ *-*-hpux11.23 | *-*-hpux11.31)
+ use_cpuutil=true
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_PSTAT
+_ACEOF
+
+ enable_cpuutil="pstatnew - auto"
+ NETCPU_SOURCE="pstatnew"
+ ;;
+ *-*-hpux11* | *-*-hpux10*)
+ use_cpuutil=true
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_PSTAT
+_ACEOF
+
+ enable_cpuutil="pstat - auto"
+ NETCPU_SOURCE="pstat"
+ ;;
+ *-*-aix5.*)
+ use_puutil=true
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_PERFSTAT
+_ACEOF
+
+
+{ echo "$as_me:$LINENO: checking for main in -lperfstat" >&5
+echo $ECHO_N "checking for main in -lperfstat... $ECHO_C" >&6; }
+if test "${ac_cv_lib_perfstat_main+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lperfstat $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+
+int
+main ()
+{
+return main ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_lib_perfstat_main=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_perfstat_main=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_perfstat_main" >&5
+echo "${ECHO_T}$ac_cv_lib_perfstat_main" >&6; }
+if test $ac_cv_lib_perfstat_main = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBPERFSTAT 1
+_ACEOF
+
+ LIBS="-lperfstat $LIBS"
+
+fi
+ac_cv_lib_perfstat=ac_cv_lib_perfstat_main
+
+ enable_cpuutil="perfstat - auto"
+ NETCPU_SOURCE="perfstat"
+ ;;
+ *-*-solaris2.1*)
+ use_cpuutil=true
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_KSTAT
+_ACEOF
+
+
+{ echo "$as_me:$LINENO: checking for main in -lkstat" >&5
+echo $ECHO_N "checking for main in -lkstat... $ECHO_C" >&6; }
+if test "${ac_cv_lib_kstat_main+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lkstat $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+
+int
+main ()
+{
+return main ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_lib_kstat_main=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_kstat_main=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_kstat_main" >&5
+echo "${ECHO_T}$ac_cv_lib_kstat_main" >&6; }
+if test $ac_cv_lib_kstat_main = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBKSTAT 1
+_ACEOF
+
+ LIBS="-lkstat $LIBS"
+
+fi
+ac_cv_lib_kstat=ac_cv_lib_kstat_main
+
+ enable_cpuutil="kstat10 - auto"
+ NETCPU_SOURCE="kstat10"
+ ;;
+ *-*-solaris2.*)
+ use_cpuutil=true
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_KSTAT
+_ACEOF
+
+
+{ echo "$as_me:$LINENO: checking for main in -lkstat" >&5
+echo $ECHO_N "checking for main in -lkstat... $ECHO_C" >&6; }
+if test "${ac_cv_lib_kstat_main+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lkstat $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+
+int
+main ()
+{
+return main ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_lib_kstat_main=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_kstat_main=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_kstat_main" >&5
+echo "${ECHO_T}$ac_cv_lib_kstat_main" >&6; }
+if test $ac_cv_lib_kstat_main = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBKSTAT 1
+_ACEOF
+
+ LIBS="-lkstat $LIBS"
+
+fi
+ac_cv_lib_kstat=ac_cv_lib_kstat_main
+
+ enable_cpuutil="kstat - auto"
+ NETCPU_SOURCE="kstat"
+ ;;
+ *-*-freebsd4.* | *-*-freebsd5.* | *-*-freebsd6.* | *-*-freebsd7.* )
+ use_cpuutil=true
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_SYSCTL
+_ACEOF
+
+ enable_cpuutil="sysctl - auto"
+ NETCPU_SOURCE="sysctl"
+ ;;
+ *-*-darwin*)
+ use_cpuutil=true
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_OSX
+_ACEOF
+
+ enable_cpuutil="osx - auto"
+ NETCPU_SOURCE="osx"
+ ;;
+ *)
+ use_cpuutil=false
+ NETCPU_SOURCE="none"
+ enable_cpuutil="none. Consider teaching configure about your platform."
+ ;;
+ esac
+ ;;
+ none)
+ use_cpuutil=false
+ ;;
+ *)
+ { { echo "$as_me:$LINENO: error: --enable-cpuutil takes kstat" >&5
+echo "$as_me: error: --enable-cpuutil takes kstat" >&2;}
+ { (exit pstat); exit pstat; }; }
+ ;;
+esac
+
+ { echo "$as_me:$LINENO: result: \"$enable_cpuutil\"" >&5
+echo "${ECHO_T}\"$enable_cpuutil\"" >&6; }
+
+
+
+# now spit it all out
+ac_config_files="$ac_config_files Makefile src/netperf_version.h src/Makefile src/missing/Makefile src/missing/m4/Makefile doc/Makefile doc/examples/Makefile netperf.spec"
+
+
+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_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ *) $as_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
+ test "x$cache_file" != "x/dev/null" &&
+ { echo "$as_me:$LINENO: updating cache $cache_file" >&5
+echo "$as_me: updating cache $cache_file" >&6;}
+ cat confcache >$cache_file
+ else
+ { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+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=
+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=`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.
+ ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${NEED_LIBCOMPAT_TRUE}" && test -z "${NEED_LIBCOMPAT_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"NEED_LIBCOMPAT\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"NEED_LIBCOMPAT\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $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}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## 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=:
+ # 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
+
+
+
+
+# PATH needs CR
+# 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
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+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.)
+as_nl='
+'
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+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
+ echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+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
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line after each line using $LINENO; the second 'sed'
+ # does the real work. The second script uses 'N' to pair each
+ # line-number line with the line containing $LINENO, and appends
+ # trailing '-' during substitution so that $LINENO is not a special
+ # case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # scripts with optimization help from Paolo Bonzini. 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" ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # 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
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+ case `echo 'x\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ *) ECHO_C='\c';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+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
+fi
+echo >conf$$.file
+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 -p'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+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=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+ as_test_x='test -x'
+else
+ if ls -dL / >/dev/null 2>&1; then
+ as_ls_L_option=L
+ else
+ as_ls_L_option=
+ fi
+ as_test_x='
+ eval sh -c '\''
+ if test -d "$1"; then
+ test -d "$1/.";
+ else
+ case $1 in
+ -*)set "./$1";;
+ esac;
+ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+ ???[sx]*):;;*)false;;esac;fi
+ '\'' sh
+ '
+fi
+as_executable_p=$as_test_x
+
+# 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
+
+# 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 netperf $as_me 2.4.4, which was
+generated by GNU Autoconf 2.61. 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
+
+cat >>$CONFIG_STATUS <<_ACEOF
+# 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_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ -q, --quiet 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 <bug-autoconf@gnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+netperf config.status 2.4.4
+configured by $0, generated by GNU Autoconf 2.61,
+ with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2006 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'
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+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=$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 )
+ echo "$ac_cs_version"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ { echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ 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.
+ -*) { echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$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
+if \$ac_cs_recheck; then
+ echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+ CONFIG_SHELL=$SHELL
+ export CONFIG_SHELL
+ exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+ "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "src/netperf_version.h") CONFIG_FILES="$CONFIG_FILES src/netperf_version.h" ;;
+ "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+ "src/missing/Makefile") CONFIG_FILES="$CONFIG_FILES src/missing/Makefile" ;;
+ "src/missing/m4/Makefile") CONFIG_FILES="$CONFIG_FILES src/missing/m4/Makefile" ;;
+ "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+ "doc/examples/Makefile") CONFIG_FILES="$CONFIG_FILES doc/examples/Makefile" ;;
+ "netperf.spec") CONFIG_FILES="$CONFIG_FILES netperf.spec" ;;
+
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ 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=
+ trap 'exit_status=$?
+ { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} ||
+{
+ echo "$me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+#
+# Set up the sed scripts for CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "$CONFIG_FILES"; then
+
+_ACEOF
+
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ cat >conf$$subs.sed <<_ACEOF
+SHELL!$SHELL$ac_delim
+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
+PACKAGE_NAME!$PACKAGE_NAME$ac_delim
+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
+PACKAGE_STRING!$PACKAGE_STRING$ac_delim
+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
+exec_prefix!$exec_prefix$ac_delim
+prefix!$prefix$ac_delim
+program_transform_name!$program_transform_name$ac_delim
+bindir!$bindir$ac_delim
+sbindir!$sbindir$ac_delim
+libexecdir!$libexecdir$ac_delim
+datarootdir!$datarootdir$ac_delim
+datadir!$datadir$ac_delim
+sysconfdir!$sysconfdir$ac_delim
+sharedstatedir!$sharedstatedir$ac_delim
+localstatedir!$localstatedir$ac_delim
+includedir!$includedir$ac_delim
+oldincludedir!$oldincludedir$ac_delim
+docdir!$docdir$ac_delim
+infodir!$infodir$ac_delim
+htmldir!$htmldir$ac_delim
+dvidir!$dvidir$ac_delim
+pdfdir!$pdfdir$ac_delim
+psdir!$psdir$ac_delim
+libdir!$libdir$ac_delim
+localedir!$localedir$ac_delim
+mandir!$mandir$ac_delim
+DEFS!$DEFS$ac_delim
+ECHO_C!$ECHO_C$ac_delim
+ECHO_N!$ECHO_N$ac_delim
+ECHO_T!$ECHO_T$ac_delim
+LIBS!$LIBS$ac_delim
+build_alias!$build_alias$ac_delim
+host_alias!$host_alias$ac_delim
+target_alias!$target_alias$ac_delim
+build!$build$ac_delim
+build_cpu!$build_cpu$ac_delim
+build_vendor!$build_vendor$ac_delim
+build_os!$build_os$ac_delim
+host!$host$ac_delim
+host_cpu!$host_cpu$ac_delim
+host_vendor!$host_vendor$ac_delim
+host_os!$host_os$ac_delim
+target!$target$ac_delim
+target_cpu!$target_cpu$ac_delim
+target_vendor!$target_vendor$ac_delim
+target_os!$target_os$ac_delim
+INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim
+INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim
+INSTALL_DATA!$INSTALL_DATA$ac_delim
+CYGPATH_W!$CYGPATH_W$ac_delim
+PACKAGE!$PACKAGE$ac_delim
+VERSION!$VERSION$ac_delim
+ACLOCAL!$ACLOCAL$ac_delim
+AUTOCONF!$AUTOCONF$ac_delim
+AUTOMAKE!$AUTOMAKE$ac_delim
+AUTOHEADER!$AUTOHEADER$ac_delim
+MAKEINFO!$MAKEINFO$ac_delim
+AMTAR!$AMTAR$ac_delim
+install_sh!$install_sh$ac_delim
+STRIP!$STRIP$ac_delim
+INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim
+AWK!$AWK$ac_delim
+SET_MAKE!$SET_MAKE$ac_delim
+am__leading_dot!$am__leading_dot$ac_delim
+CC!$CC$ac_delim
+CFLAGS!$CFLAGS$ac_delim
+LDFLAGS!$LDFLAGS$ac_delim
+CPPFLAGS!$CPPFLAGS$ac_delim
+ac_ct_CC!$ac_ct_CC$ac_delim
+EXEEXT!$EXEEXT$ac_delim
+OBJEXT!$OBJEXT$ac_delim
+DEPDIR!$DEPDIR$ac_delim
+am__include!$am__include$ac_delim
+am__quote!$am__quote$ac_delim
+AMDEP_TRUE!$AMDEP_TRUE$ac_delim
+AMDEP_FALSE!$AMDEP_FALSE$ac_delim
+AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim
+CCDEPMODE!$CCDEPMODE$ac_delim
+am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim
+am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim
+RANLIB!$RANLIB$ac_delim
+CPP!$CPP$ac_delim
+GREP!$GREP$ac_delim
+EGREP!$EGREP$ac_delim
+LIBOBJS!$LIBOBJS$ac_delim
+NEED_LIBCOMPAT_TRUE!$NEED_LIBCOMPAT_TRUE$ac_delim
+NEED_LIBCOMPAT_FALSE!$NEED_LIBCOMPAT_FALSE$ac_delim
+NETCPU_SOURCE!$NETCPU_SOURCE$ac_delim
+LTLIBOBJS!$LTLIBOBJS$ac_delim
+_ACEOF
+
+ if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 92; then
+ break
+ elif $ac_last_try; then
+ { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+ { (exit 1); exit 1; }; }
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+ ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+ ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+:end
+s/|#_!!_#|//g
+CEOF$ac_eof
+_ACEOF
+
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ 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[ ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[ ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+fi # test -n "$CONFIG_FILES"
+
+
+for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+ { (exit 1); exit 1; }; };;
+ :[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="$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 ||
+ { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+ ac_file_inputs="$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 "`IFS=:
+ echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ fi
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$tmp/stdin";;
+ 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 ||
+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"
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`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 ||
+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" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+ { (exit 1); exit 1; }; }; }
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`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
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# 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=
+
+case `sed -n '/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+' $ac_file_inputs` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ 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
+ sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s&@configure_input@&$configure_input&;t t
+s&@top_builddir@&$ac_top_builddir_sub&;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
+$ac_datarootdir_hack
+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+ { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined." >&5
+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 "$tmp/stdin"
+ case $ac_file in
+ -) cat "$tmp/out"; rm -f "$tmp/out";;
+ *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
+ esac
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+_ACEOF
+
+# Transform confdefs.h into a sed script `conftest.defines', that
+# substitutes the proper values into config.h.in to produce config.h.
+rm -f conftest.defines conftest.tail
+# First, append a space to every undef/define line, to ease matching.
+echo 's/$/ /' >conftest.defines
+# Then, protect against being on the right side of a sed subst, or in
+# an unquoted here document, in config.status. If some macros were
+# called several times there might be several #defines for the same
+# symbol, which is useless. But do not sort them, since the last
+# AC_DEFINE must be honored.
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where
+# NAME is the cpp macro being defined, VALUE is the value it is being given.
+# PARAMS is the parameter list in the macro definition--in most cases, it's
+# just an empty string.
+ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*'
+ac_dB='\\)[ (].*,\\1define\\2'
+ac_dC=' '
+ac_dD=' ,'
+
+uniq confdefs.h |
+ sed -n '
+ t rset
+ :rset
+ s/^[ ]*#[ ]*define[ ][ ]*//
+ t ok
+ d
+ :ok
+ s/[\\&,]/\\&/g
+ s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p
+ s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p
+ ' >>conftest.defines
+
+# Remove the space that was appended to ease matching.
+# Then 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.
+# (The regexp can be short, since the line contains either #define or #undef.)
+echo 's/ $//
+s,^[ #]*u.*,/* & */,' >>conftest.defines
+
+# Break up conftest.defines:
+ac_max_sed_lines=50
+
+# First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1"
+# Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2"
+# Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1"
+# et cetera.
+ac_in='$ac_file_inputs'
+ac_out='"$tmp/out1"'
+ac_nxt='"$tmp/out2"'
+
+while :
+do
+ # Write a here document:
+ cat >>$CONFIG_STATUS <<_ACEOF
+ # First, check the format of the line:
+ cat >"\$tmp/defines.sed" <<\\CEOF
+/^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def
+/^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def
+b
+:def
+_ACEOF
+ sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS
+ ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in
+ sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail
+ grep . conftest.tail >/dev/null || break
+ rm -f conftest.defines
+ mv conftest.tail conftest.defines
+done
+rm -f conftest.defines conftest.tail
+
+echo "ac_result=$ac_in" >>$CONFIG_STATUS
+cat >>$CONFIG_STATUS <<\_ACEOF
+ if test x"$ac_file" != x-; then
+ echo "/* $configure_input */" >"$tmp/config.h"
+ cat "$ac_result" >>"$tmp/config.h"
+ if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then
+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f $ac_file
+ mv "$tmp/config.h" $ac_file
+ fi
+ else
+ echo "/* $configure_input */"
+ cat "$ac_result"
+ fi
+ rm -f "$tmp/out12"
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $ac_file | $ac_file:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $ac_file" >`$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 ||
+echo X$ac_file |
+ 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) { echo "$as_me:$LINENO: executing $ac_file commands" >&5
+echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; 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.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /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 ||
+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
+ grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue
+ # Extract the definition of DEP_FILES from the Makefile without
+ # running `make'.
+ DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n -e '/^U = / s///p' < "$mf"`
+ test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR"
+ # 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 -e '
+ /^DEP_FILES = .*\\\\$/ {
+ s/^DEP_FILES = //
+ :loop
+ s/\\\\$//
+ p
+ n
+ /\\\\$/ b loop
+ p
+ }
+ /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/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 ||
+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
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`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 ||
+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" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+ { (exit 1); exit 1; }; }; }
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+ ;;
+
+ esac
+done # for ac_tag
+
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# 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 || { (exit 1); exit 1; }
+fi
+
diff --git a/netperf-2.4.4/configure.ac b/netperf-2.4.4/configure.ac
new file mode 100644
index 0000000..5176171
--- /dev/null
+++ b/netperf-2.4.4/configure.ac
@@ -0,0 +1,664 @@
+# -*- Autoconf -*-
+# Process this file with autoconf to produce a configure script.
+
+FULL-PACKAGE-NAME=netperf
+VERSION=2.4.4
+BUG-REPORT-ADDRESS=netperf-feedback@netperf.org
+
+AC_PREREQ(2.59)
+AC_INIT(netperf, 2.4.4)
+# use the target version rather than host - one day we may want cross-compile
+AC_CANONICAL_TARGET
+AC_CONFIG_SRCDIR([src/hist.h])
+AM_INIT_AUTOMAKE([dist-zip])
+AM_CONFIG_HEADER(config.h)
+# AC_CONFIG_HEADER(config.h)
+
+AC_CONFIG_LIBOBJ_DIR(src/missing)
+
+# make sure we build netperf_version.h
+touch src/netperf_version.h.in
+
+# Checks for programs.
+AC_PROG_CC
+AC_PROG_RANLIB
+
+AC_C_CONST
+
+# Checks for libraries.
+AC_HAVE_LIBRARY(m)
+
+# Checks for header files.
+AC_HEADER_STDC
+AC_HEADER_SYS_WAIT
+AC_CHECK_HEADERS([arpa/inet.h endian.h errno.h fcntl.h limits.h malloc.h netdb.h netinet/in.h signal.h stdlib.h string.h strings.h sys/ioctl.h sys/mman.h sys/param.h sys/socket.h sys/time.h unistd.h])
+
+# Some platforms require these. There may be a better way.
+AC_HAVE_LIBRARY(socket)
+if test "$ac_cv_lib_socket_main" = yes ; then
+ AC_HAVE_LIBRARY(nsl)
+ AC_HAVE_LIBRARY(sendfile)
+ AC_SYS_LARGEFILE
+fi
+
+# this one is for Tru64 and bind_to_cpu_id
+AC_HAVE_LIBRARY(mach)
+
+# Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_TYPE_OFF_T
+AC_TYPE_SIZE_T
+# AC_TYPE_SOCKLEN_T
+
+OLD_TYPE_SOCKLEN_T
+
+# AC_TYPE_IN_PORT_T
+AC_DECL_H_ERRNO
+AC_STRUCT_SOCKADDR_STORAGE
+AC_HEADER_TIME
+AC_HEADER_STDBOOL
+
+# Checks for library functions.
+# AC_FUNC_ERROR_AT_LINE
+AC_FUNC_FORK
+# AC_FUNC_MALLOC
+AC_FUNC_MMAP
+AC_FUNC_SELECT_ARGTYPES
+AC_FUNC_SETPGRP
+AC_TYPE_SIGNAL
+# AC_FUNC_STAT
+# remove pstat_getdynamic (at least for now) since we don't do
+# anything conditional with the check anyway...
+AC_CHECK_FUNCS([alarm bzero gethostbyname gethrtime gettimeofday inet_ntoa memset memcpy munmap select socket sqrt strcasecmp strchr strstr strtoul uname])
+
+#AC_CONFIG_SUBDIRS(src/missing)
+
+# does this platform need the replacement getaddrinfo
+AC_CHECK_FUNCS([getnameinfo getaddrinfo inet_ntop])
+# AC_REPLACE_FUNCS([getaddrinfo])
+
+
+if test "$ac_cv_func_getaddrinfo$ac_cv_func_getnameinfo" != yesyes ; then
+ AC_MSG_NOTICE([Requesting replacement getaddrinfo/getnameinfo])
+ AC_LIBOBJ(getaddrinfo)
+ HAVE_MISSING=yes
+fi
+if test "$ac_cv_func_inet_ntop" != yes ; then
+ AC_MSG_NOTICE([Requesting replacement inet_ntop])
+ AC_LIBOBJ(inet_ntop)
+ HAVE_MISSING=yes
+fi
+AM_CONDITIONAL(NEED_LIBCOMPAT, test "$HAVE_MISSING" = "yes")
+
+AC_CHECK_FUNCS(sendfile)
+
+# check for the various CPU binding calls
+AC_CHECK_FUNCS(mpctl processor_bind sched_setaffinity bind_to_cpu_id bindprocessor)
+
+# see if we should be enabling histogram support
+
+AC_MSG_CHECKING(whether to include histogram support)
+
+AC_ARG_ENABLE(histogram,
+ [AS_HELP_STRING([--enable-histogram],[include individual op timing, may affect result]) ])
+
+case "$enable_histogram" in
+ yes)
+ use_histogram=true
+ ;;
+ no)
+ use_histogram=false
+ ;;
+ '')
+ # whatever
+ use_histogram=false
+ ;;
+ *)
+ AC_MSG_ERROR([--enable-histogram takes yes or no])
+ ;;
+esac
+
+if $use_histogram
+then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+
+if $use_histogram
+then
+ AC_DEFINE([WANT_HISTOGRAM],,[Define to one to enable histogram support. May affect results.])
+fi
+# see if we should be enabling histogram support
+
+AC_MSG_CHECKING(whether to include dirty support)
+
+AC_ARG_ENABLE(dirty,
+ [AS_HELP_STRING([--enable-dirty],[write to buffers each time, may affect result]) ])
+
+case "$enable_dirty" in
+ yes)
+ use_dirty=true
+ ;;
+ no)
+ use_dirty=false
+ ;;
+ '')
+ # whatever
+ use_dirty=false
+ ;;
+ *)
+ AC_MSG_ERROR([--enable-dirty takes yes or no])
+ ;;
+esac
+
+if $use_dirty
+then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+
+if $use_dirty
+then
+ AC_DEFINE([DIRTY],,[Define to one to enable dirty buffer support. May affect results.])
+fi
+
+# see if we should be enabling demo support
+
+AC_MSG_CHECKING(whether to include demo support)
+
+AC_ARG_ENABLE(demo,
+ [AS_HELP_STRING([--enable-demo],[emit interim results during the run. May affect results.])])
+
+case "$enable_demo" in
+ yes)
+ use_demo=true
+ ;;
+ no)
+ use_demo=false
+ ;;
+ '')
+ # whatever
+ use_demo=false
+ ;;
+ *)
+ AC_MSG_ERROR([--enable-demo takes yes or no])
+ ;;
+esac
+
+if $use_demo
+then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+
+if $use_demo
+then
+ AC_DEFINE([WANT_DEMO],,[Define to one to enable demo support. May affect results.])
+fi
+
+# see if we should be including the AF_UNIX tests
+
+AC_MSG_CHECKING(whether to include Unix-domain socket tests)
+
+AC_ARG_ENABLE(unixdomain,
+ [AS_HELP_STRING([--enable-unixdomain],[include Unix Domain socket tests])])
+
+case "$enable_unixdomain" in
+ yes)
+ use_unixdomain=true
+ ;;
+ no)
+ use_unixdomain=false
+ ;;
+ '')
+ use_unixdomain=false
+ ;;
+ *)
+ AC_MSG_ERROR([--enable-unixdomain takes yes or no])
+ ;;
+esac
+
+if $use_unixdomain
+then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+
+if $use_unixdomain
+then
+ AC_DEFINE([WANT_UNIX],,[Define to one to include Unix Domain socket tests.])
+fi
+
+# see if we should be including the DLPI tests
+
+AC_MSG_CHECKING(whether to include DLPI tests)
+
+AC_ARG_ENABLE(dlpi,
+ [AS_HELP_STRING([--enable-dlpi],[include DLPI (link-layer) tests])])
+
+case "$enable_dlpi" in
+ yes)
+ use_dlpi=true
+ ;;
+ no)
+ use_dlpi=false
+ ;;
+ '')
+ use_dlpi=false
+ ;;
+ *)
+ AC_MSG_ERROR([--enable-dlpi takes yes or no])
+ ;;
+esac
+
+if $use_dlpi
+then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+
+if $use_dlpi
+then
+ AC_DEFINE([WANT_DLPI],,[Define to one to include DLPI tests.])
+fi
+
+
+# see if we should be including the XTI tests
+
+AC_MSG_CHECKING(whether to include XTI tests)
+
+AC_ARG_ENABLE(xti,
+ [AS_HELP_STRING([--enable-xti],[include XTI socket tests])])
+
+case "$enable_xti" in
+ yes)
+ use_xti=true
+ ;;
+ no)
+ use_xti=false
+ ;;
+ '')
+ use_xti=false
+ ;;
+ *)
+ AC_MSG_ERROR([--enable-xti takes yes or no])
+ ;;
+esac
+
+if $use_xti
+then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+
+if $use_xti
+then
+ AC_DEFINE([WANT_XTI],,[Define to one to include XTI tests.])
+fi
+
+# see if we should be including the SDP tests
+
+AC_MSG_CHECKING(whether to include SDP tests)
+
+AC_ARG_ENABLE(sdp,
+ [AS_HELP_STRING([--enable-sdp],[include SDP socket tests])])
+
+case "$enable_sdp" in
+ yes)
+ # probably need to be a bit more sophisticated here
+ AC_CHECK_LIB(sdp,t_open)
+ use_sdp=true
+ ;;
+ no)
+ use_sdp=false
+ ;;
+ '')
+ use_sdp=false
+ ;;
+ *)
+ AC_MSG_ERROR([--enable-sdp takes yes or no])
+ ;;
+esac
+
+if $use_sdp
+then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+
+if $use_sdp
+then
+ AC_DEFINE([WANT_SDP],,[Define to one to include SDP tests.])
+fi
+
+# see if we should be including the ICSC-EXS tests
+
+AC_MSG_CHECKING(whether to include ICSC-EXS tests)
+
+AC_ARG_ENABLE(exs,
+ [AS_HELP_STRING([--enable-exs],[include ICSC async sockets tests])])
+
+case "$enable_exs" in
+ yes)
+ use_exs=true
+ AC_CHECK_HEADER(sys/exs.h,,[use_exs=false])
+ AC_CHECK_LIB(exs,exs_init,,[use_exs=false])
+ ;;
+ no)
+ use_exs=false
+ ;;
+ '')
+ use_exs=false
+ ;;
+ *)
+ AC_MSG_ERROR([--enable-exs takes yes or no])
+ ;;
+esac
+
+if $use_exs
+then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+
+if $use_exs
+then
+ AC_DEFINE([HAVE_ICSC_EXS],,[Define to one to include ICSC-EXS tests.])
+fi
+
+# see if we should be enabling SCTP support
+
+
+AC_ARG_ENABLE(sctp,
+ [AS_HELP_STRING([--enable-sctp],[include tests to measure SCTP performance ])])
+
+case "$enable_sctp" in
+ yes)
+ use_sctp=true
+ AC_CHECK_HEADERS(netinet/sctp.h,,use_sctp=false,
+[[
+#include <sys/socket.h>
+]])
+ case "$host" in
+ *-*-freebsd7.*)
+ # FreeBSD 7.x SCTP support doesn't need -lsctp.
+ ;;
+ *)
+ AC_HAVE_LIBRARY(sctp,,use_sctp=false)
+ ;;
+ esac
+ AC_CHECK_MEMBER(struct sctp_event_subscribe.sctp_adaptation_layer_event,
+ , , [#include <netinet/sctp.h>])
+ if test "$ac_cv_member_struct_sctp_event_subscribe_sctp_adaptation_layer_event" = "yes"; then
+ AC_DEFINE([HAVE_SCTP_ADAPTATION_LAYER_EVENT], 1,
+ [Define to 1 if `struct sctp_event_subscribe' has a `sctp_adaptation_layer_event' member])
+ fi
+ ;;
+ no)
+ use_sctp=false
+ ;;
+ '')
+ # whatever
+ use_sctp=false
+ ;;
+ *)
+ AC_MSG_ERROR([--enable-sctp takes yes or no])
+ ;;
+esac
+
+AC_MSG_CHECKING(whether to include SCTP tests)
+
+if $use_sctp
+then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+
+if $use_sctp
+then
+ AC_DEFINE([WANT_SCTP],,[Define to one to include SCTP tests.])
+fi
+
+# see if we should be enabling paced sends
+
+AC_MSG_CHECKING([whether to include paced send (intervals) support])
+
+AC_ARG_ENABLE(intervals,
+ [AS_HELP_STRING([--enable-intervals],[include ability to pace operations, may affect result])])
+
+case "$enable_intervals" in
+ yes)
+ use_intervals=true
+ ;;
+ no)
+ use_intervals=false
+ ;;
+ '')
+ use_intervals=false
+ ;;
+ *)
+ AC_MSG_ERROR([--enable-intervals takes yes or no])
+ ;;
+esac
+
+if $use_intervals
+then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+
+if $use_intervals
+then
+ AC_DEFINE([WANT_INTERVALS],,[Define to one to enable paced operation support. May affect results.])
+fi
+
+# see if paced sends should wait and spin
+
+AC_MSG_CHECKING([whether paced sends should spin])
+
+AC_ARG_ENABLE(spin,
+ [AS_HELP_STRING([--enable-spin],[paced operations (--enable-intervals) should sit and spin - WILL affect result])])
+
+case "$enable_spin" in
+ yes)
+ use_spin=true
+ ;;
+ no)
+ use_spin=false
+ ;;
+ '')
+ use_spin=false
+ ;;
+ *)
+ AC_MSG_ERROR([--enable-spin takes yes or no])
+ ;;
+esac
+
+if $use_spin
+then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+
+if $use_spin
+then
+ AC_DEFINE([WANT_INTERVALS],,[Define to one to enable paced operation support. May affect results.])
+ AC_DEFINE([WANT_SPIN],,[Define to one to spin waiting on paced operation. WILL AFFEFCT CPU UTILIZATION])
+fi
+
+# see if we should be enabling initial request bursts
+
+AC_MSG_CHECKING([whether to include initial burst support in _RR tests])
+
+AC_ARG_ENABLE(burst,
+ [AS_HELP_STRING([--enable-burst],[include intial request burst ability in _RR tests, may affect result])])
+
+case "$enable_burst" in
+ yes)
+ use_burst=true
+ ;;
+ no)
+ use_burst=false
+ ;;
+ '')
+ use_burst=false
+ ;;
+ *)
+ AC_MSG_ERROR([--enable-burst takes yes or no])
+ ;;
+esac
+
+if $use_burst
+then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+
+if $use_burst
+then
+ AC_DEFINE([WANT_FIRST_BURST],,[Define to one to enable initial _RR burst support. May affect results.])
+fi
+
+# time to see about CPU utilization measurements
+
+AC_MSG_CHECKING([which CPU utilization measurement type to use])
+
+AC_ARG_ENABLE(cpuutil,
+ [AS_HELP_STRING([--enable-cpuutil],[include code to measure CPU utilization using specified mechanism])])
+
+NETCPU_SOURCE="$enable_cpuutil"
+case "$enable_cpuutil" in
+ pstat)
+ use_cpuutil=true
+ AC_DEFINE([USE_PSTAT],,[Use HP-UX's pstat interface to measure CPU util.])
+ ;;
+ pstatnew)
+ use_cpuutil=true
+ AC_DEFINE([USE_PSTAT],,[Use HP-UX's pstat interface to measure CPU util.])
+ ;;
+ perfstat)
+ use_cpuutil=true
+ AC_DEFINE([USE_PERFSTAT],,[Use AIX's perfstat interface to measure CPU util.])
+ AC_HAVE_LIBRARY(perfstat)
+ ;;
+
+ looper)
+ use_cpuutil=true
+ AC_DEFINE([USE_LOOPER],,[Use looper/soaker processes to measure CPU util.])
+ ;;
+ procstat)
+ use_cpuutil=true
+ AC_DEFINE([USE_PROC_STAT],,[Use Linux's procstat interface to measure CPU util.])
+ ;;
+ kstat)
+ use_cpuutil=true
+ AC_DEFINE([USE_KSTAT],,[Use Solaris's kstat interface to measure CPU util.])
+ AC_HAVE_LIBRARY(kstat)
+ ;;
+ kstat10)
+ use_cpuutil=true
+ AC_DEFINE([USE_KSTAT],,[Use Solaris's kstat interface to measure CPU util.])
+ AC_HAVE_LIBRARY(kstat)
+ ;;
+ osx)
+ use_cpuutil=true
+ AC_DEFINE([USE_OSX],,[Use MacOS X's host_info interface to measure CPU util.])
+ ;;
+ '')
+# ia64-hp-hpux11.23
+# i386-pc-solaris2.10
+# guess it automagically in a nice big case statement
+ case $target in
+ *-*-linux*)
+ use_cpuutil=true
+ AC_DEFINE([USE_PROC_STAT],,[Use Linux's procstat interface to measure CPU util.])
+ enable_cpuutil="procstat - auto"
+ NETCPU_SOURCE="procstat"
+ ;;
+ *-*-hpux11.23 | *-*-hpux11.31)
+ use_cpuutil=true
+ AC_DEFINE([USE_PSTAT],,[Use HP-UX's pstat interface to measure CPU util.])
+ enable_cpuutil="pstatnew - auto"
+ NETCPU_SOURCE="pstatnew"
+ ;;
+ *-*-hpux11* | *-*-hpux10*)
+ use_cpuutil=true
+ AC_DEFINE([USE_PSTAT],,[Use HP-UX's pstat interface to measure CPU util.])
+ enable_cpuutil="pstat - auto"
+ NETCPU_SOURCE="pstat"
+ ;;
+ *-*-aix5.*)
+ use_puutil=true
+ AC_DEFINE([USE_PERFSTAT],,[Use AIX's perfstat interface to measure CPU util.])
+ AC_HAVE_LIBRARY(perfstat)
+ enable_cpuutil="perfstat - auto"
+ NETCPU_SOURCE="perfstat"
+ ;;
+ *-*-solaris2.1*)
+ use_cpuutil=true
+ AC_DEFINE([USE_KSTAT],,[Use Solaris's kstat interface to measure CPU util.])
+ AC_HAVE_LIBRARY(kstat)
+ enable_cpuutil="kstat10 - auto"
+ NETCPU_SOURCE="kstat10"
+ ;;
+ *-*-solaris2.*)
+ use_cpuutil=true
+ AC_DEFINE([USE_KSTAT],,[Use Solaris's kstat interface to measure CPU util.])
+ AC_HAVE_LIBRARY(kstat)
+ enable_cpuutil="kstat - auto"
+ NETCPU_SOURCE="kstat"
+ ;;
+ *-*-freebsd4.* | *-*-freebsd5.* | *-*-freebsd6.* | *-*-freebsd7.* )
+ use_cpuutil=true
+ AC_DEFINE([USE_SYSCTL],,[Use FreeBSD's sysctl interface to measure CPU util.])
+ enable_cpuutil="sysctl - auto"
+ NETCPU_SOURCE="sysctl"
+ ;;
+ *-*-darwin*)
+ use_cpuutil=true
+ AC_DEFINE([USE_OSX],,[Use MacOS X's host_info interface to measure CPU util.])
+ enable_cpuutil="osx - auto"
+ NETCPU_SOURCE="osx"
+ ;;
+ *)
+ use_cpuutil=false
+ NETCPU_SOURCE="none"
+ enable_cpuutil="none. Consider teaching configure about your platform."
+ ;;
+ esac
+ ;;
+ none)
+ use_cpuutil=false
+ ;;
+ *)
+ AC_MSG_ERROR(--enable-cpuutil takes kstat, pstat, looper, procstat or none])
+ ;;
+esac
+
+ AC_MSG_RESULT("$enable_cpuutil")
+
+AC_SUBST(NETCPU_SOURCE)
+
+# now spit it all out
+AC_CONFIG_FILES([Makefile
+ src/netperf_version.h
+ src/Makefile
+ src/missing/Makefile
+ src/missing/m4/Makefile
+ doc/Makefile
+ doc/examples/Makefile
+ netperf.spec])
+
+AC_OUTPUT
diff --git a/netperf-2.4.4/depcomp b/netperf-2.4.4/depcomp
new file mode 100755
index 0000000..edb5d38
--- /dev/null
+++ b/netperf-2.4.4/depcomp
@@ -0,0 +1,479 @@
+#! /bin/sh
+
+# depcomp - compile a program generating dependencies as side-effects
+# Copyright 1999, 2000, 2003 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, 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.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+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
+# `libtool' can also be set to `yes' or `no'.
+
+if test -z "$depfile"; then
+ base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'`
+ dir=`echo "$object" | sed 's,/.*$,/,'`
+ if test "$dir" = "$object"; then
+ dir=
+ fi
+ # FIXME: should be _deps on DOS.
+ depfile="$dir.deps/$base"
+fi
+
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# 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
+
+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.
+ "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ mv "$tmpdepfile" "$depfile"
+ ;;
+
+gcc)
+## 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).
+## - 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 -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## 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.
+ tr ' ' '
+' < "$tmpdepfile" |
+## 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.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -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 -eq 0; then :
+ else
+ 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 ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+ tr '
+' ' ' >> $depfile
+ echo >> $depfile
+
+ # The second pass generates a dummy entry for each header file.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> $depfile
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+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.
+ stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
+ tmpdepfile="$stripped.u"
+ if test "$libtool" = yes; then
+ "$@" -Wc,-M
+ else
+ "$@" -M
+ fi
+ stat=$?
+
+ if test -f "$tmpdepfile"; then :
+ else
+ stripped=`echo "$stripped" | sed 's,^.*/,,'`
+ tmpdepfile="$stripped.u"
+ fi
+
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+
+ if test -f "$tmpdepfile"; then
+ outname="$stripped.o"
+ # Each line is of the form `foo.o: dependent.h'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
+ sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+icc)
+ # Intel's C compiler understands `-MD -MF file'. However on
+ # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+ # ICC 7.0 will fill foo.d with something like
+ # foo.o: sub/foo.c
+ # foo.o: sub/foo.h
+ # which is wrong. We want:
+ # sub/foo.o: sub/foo.c
+ # sub/foo.o: sub/foo.h
+ # sub/foo.c:
+ # sub/foo.h:
+ # ICC 7.1 will output
+ # foo.o: sub/foo.c sub/foo.h
+ # and will wrap long lines using \ :
+ # foo.o: sub/foo.c ... \
+ # sub/foo.h ... \
+ # ...
+
+ "$@" -MD -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ 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"
+ ;;
+
+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.
+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+ test "x$dir" = "x$object" && dir=
+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+ if test "$libtool" = yes; then
+ tmpdepfile1="$dir.libs/$base.lo.d"
+ tmpdepfile2="$dir.libs/$base.d"
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1="$dir$base.o.d"
+ tmpdepfile2="$dir$base.d"
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile1" "$tmpdepfile2"
+ exit $stat
+ fi
+
+ if test -f "$tmpdepfile1"; then
+ tmpdepfile="$tmpdepfile1"
+ else
+ tmpdepfile="$tmpdepfile2"
+ fi
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+ # That's a tab and a space in the [].
+ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+ else
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+#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 $1 != '--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:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ 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 $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+ # X makedepend
+ shift
+ cleared=no
+ for arg in "$@"; do
+ case $cleared in
+ no)
+ set ""; shift
+ cleared=yes ;;
+ esac
+ 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.
+ -*|$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"
+ cat < "$tmpdepfile" > "$depfile"
+ sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ 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 $1 != '--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 '/^# [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, regardless of -o,
+ # because we must use -o when running libtool.
+ "$@" || exit $?
+ IFS=" "
+ for arg
+ do
+ case "$arg" in
+ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+ set fnord "$@"
+ shift
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
+ esac
+ done
+ "$@" -E |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
+ echo " " >> "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+none)
+ exec "$@"
+ ;;
+
+*)
+ echo "Unknown depmode $depmode" 1>&2
+ exit 1
+ ;;
+esac
+
+exit 0
diff --git a/netperf-2.4.4/doc/Makefile.am b/netperf-2.4.4/doc/Makefile.am
new file mode 100644
index 0000000..40167a6
--- /dev/null
+++ b/netperf-2.4.4/doc/Makefile.am
@@ -0,0 +1,22 @@
+# what is your philosophy - distribute pre-made .pdf et al in a make dist
+# or not? choose your EXTRA_DIST line accordingly
+# EXTRA_DIST = netperf.man netserver.man netperf.txt netperf.html netperf.xml netperf_old.ps netperf.pdf netperf.ps netperf.texi examples
+
+SUBDIRS = examples
+
+EXTRA_DIST = netperf.man netserver.man netperf_old.ps netperf.texi
+man1_MANS = netperf.man netserver.man
+info_TEXINFOS = netperf.texi
+CLEANFILES = netperf.txt netperf.xml netperf.html
+
+netperf.html: $(info_TEXINFOS)
+ $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) --html --no-split -I $(srcdir) \
+ -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+
+netperf.txt: $(info_TEXINFOS)
+ $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) --plaintext -I $(srcdir) \
+ -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+
+netperf.xml: $(info_TEXINFOS)
+ $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) --xml -I $(srcdir) \
+ -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
diff --git a/netperf-2.4.4/doc/Makefile.in b/netperf-2.4.4/doc/Makefile.in
new file mode 100644
index 0000000..0ec00b9
--- /dev/null
+++ b/netperf-2.4.4/doc/Makefile.in
@@ -0,0 +1,601 @@
+# Makefile.in generated by automake 1.7.9 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
+# 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@
+
+# what is your philosophy - distribute pre-made .pdf et al in a make dist
+# or not? choose your EXTRA_DIST line accordingly
+# EXTRA_DIST = netperf.man netserver.man netperf.txt netperf.html netperf.xml netperf_old.ps netperf.pdf netperf.ps netperf.texi examples
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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 = :
+host_triplet = @host@
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+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@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GREP = @GREP@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+NEED_LIBCOMPAT_FALSE = @NEED_LIBCOMPAT_FALSE@
+NEED_LIBCOMPAT_TRUE = @NEED_LIBCOMPAT_TRUE@
+NETCPU_SOURCE = @NETCPU_SOURCE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+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@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+
+SUBDIRS = examples
+
+EXTRA_DIST = netperf.man netserver.man netperf_old.ps netperf.texi
+man1_MANS = netperf.man netserver.man
+info_TEXINFOS = netperf.texi
+CLEANFILES = netperf.txt netperf.xml netperf.html
+subdir = doc
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+am__TEXINFO_TEX_DIR = $(srcdir)
+INFO_DEPS = netperf.info
+DVIS = netperf.dvi
+PDFS = netperf.pdf
+PSS = netperf.ps
+TEXINFOS = netperf.texi
+
+NROFF = nroff
+MANS = $(man1_MANS)
+
+RECURSIVE_TARGETS = info-recursive dvi-recursive pdf-recursive \
+ ps-recursive install-info-recursive uninstall-info-recursive \
+ all-recursive install-data-recursive install-exec-recursive \
+ installdirs-recursive install-recursive uninstall-recursive \
+ check-recursive installcheck-recursive
+DIST_COMMON = $(srcdir)/Makefile.in Makefile.am texinfo.tex
+DIST_SUBDIRS = $(SUBDIRS)
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .dvi .info .pdf .ps .texi
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4)
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu doc/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+
+.texi.info:
+ @rm -f $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]
+ $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+
+.texi.dvi:
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2DVI) `test -f '$<' || echo '$(srcdir)/'`$<
+
+.texi.pdf:
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2PDF) `test -f '$<' || echo '$(srcdir)/'`$<
+netperf.info: netperf.texi
+netperf.dvi: netperf.texi
+netperf.pdf: netperf.texi
+TEXI2DVI = texi2dvi
+
+TEXI2PDF = $(TEXI2DVI) --pdf --batch
+DVIPS = dvips
+.dvi.ps:
+ $(DVIPS) -o $@ $<
+
+uninstall-info-am:
+ $(PRE_UNINSTALL)
+ @if (install-info --version && \
+ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ echo " install-info --info-dir=$(DESTDIR)$(infodir) --remove $(DESTDIR)$(infodir)/$$relfile"; \
+ install-info --info-dir=$(DESTDIR)$(infodir) --remove $(DESTDIR)$(infodir)/$$relfile; \
+ done; \
+ else :; fi
+ @$(NORMAL_UNINSTALL)
+ @list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \
+ (if cd $(DESTDIR)$(infodir); then \
+ echo " rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9])"; \
+ rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \
+ else :; fi); \
+ done
+
+dist-info: $(INFO_DEPS)
+ list='$(INFO_DEPS)'; \
+ for base in $$list; do \
+ if test -f $$base; then d=.; else d=$(srcdir); fi; \
+ for file in $$d/$$base*; do \
+ relfile=`expr "$$file" : "$$d/\(.*\)"`; \
+ test -f $(distdir)/$$relfile || \
+ cp -p $$file $(distdir)/$$relfile; \
+ done; \
+ done
+
+mostlyclean-aminfo:
+ -rm -f netperf.aux netperf.cp netperf.cps netperf.fn netperf.fns netperf.ky \
+ netperf.kys netperf.log netperf.pg netperf.pgs netperf.tmp \
+ netperf.toc netperf.tp netperf.tps netperf.vr netperf.vrs \
+ netperf.dvi netperf.pdf netperf.ps
+
+maintainer-clean-aminfo:
+ @list='$(INFO_DEPS)'; for i in $$list; do \
+ i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \
+ echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \
+ rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \
+ done
+
+man1dir = $(mandir)/man1
+install-man1: $(man1_MANS) $(man_MANS)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(man1dir)
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \
+ $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \
+ done
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \
+ rm -f $(DESTDIR)$(man1dir)/$$inst; \
+ done
+
+# 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.
+$(RECURSIVE_TARGETS):
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; 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; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ETAGS = etags
+ETAGSFLAGS =
+
+CTAGS = ctags
+CTAGSFLAGS =
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ if (etags --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ else \
+ include_option=--include; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -f $$subdir/TAGS && \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$tags$$unique" \
+ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique
+
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkinstalldirs) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -d $(distdir)/$$subdir \
+ || mkdir $(distdir)/$$subdir \
+ || exit 1; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" \
+ distdir=../$(distdir)/$$subdir \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-info
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(INFO_DEPS) $(MANS)
+installdirs: installdirs-recursive
+installdirs-am:
+ $(mkinstalldirs) $(DESTDIR)$(infodir) $(DESTDIR)$(man1dir)
+
+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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -rm -f $(CONFIG_CLEAN_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 mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am: $(DVIS)
+
+info: info-recursive
+
+info-am: $(INFO_DEPS)
+
+install-data-am: install-info-am install-man
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-info-am: $(INFO_DEPS)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(infodir)
+ @list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ if test -f $$file; then d=.; else d=$(srcdir); fi; \
+ file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \
+ for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \
+ $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \
+ if test -f $$ifile; then \
+ relfile=`echo "$$ifile" | sed 's|^.*/||'`; \
+ echo " $(INSTALL_DATA) $$ifile $(DESTDIR)$(infodir)/$$relfile"; \
+ $(INSTALL_DATA) $$ifile $(DESTDIR)$(infodir)/$$relfile; \
+ else : ; fi; \
+ done; \
+ done
+ @$(POST_INSTALL)
+ @if (install-info --version && \
+ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ echo " install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$relfile";\
+ install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$relfile || :;\
+ done; \
+ else : ; fi
+install-man: install-man1
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-aminfo \
+ maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-aminfo mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am: $(PDFS)
+
+ps: ps-recursive
+
+ps-am: $(PSS)
+
+uninstall-am: uninstall-info-am uninstall-man
+
+uninstall-info: uninstall-info-recursive
+
+uninstall-man: uninstall-man1
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am clean \
+ clean-generic clean-recursive ctags ctags-recursive dist-info \
+ distclean distclean-generic distclean-recursive distclean-tags \
+ distdir dvi dvi-am dvi-recursive info info-am info-recursive \
+ install install-am install-data install-data-am \
+ install-data-recursive install-exec install-exec-am \
+ install-exec-recursive install-info install-info-am \
+ install-info-recursive install-man install-man1 \
+ install-recursive install-strip installcheck installcheck-am \
+ installdirs installdirs-am installdirs-recursive \
+ maintainer-clean maintainer-clean-aminfo \
+ maintainer-clean-generic maintainer-clean-recursive mostlyclean \
+ mostlyclean-aminfo mostlyclean-generic mostlyclean-recursive \
+ pdf pdf-am pdf-recursive ps ps-am ps-recursive tags \
+ tags-recursive uninstall uninstall-am uninstall-info-am \
+ uninstall-info-recursive uninstall-man uninstall-man1 \
+ uninstall-recursive
+
+
+netperf.html: $(info_TEXINFOS)
+ $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) --html --no-split -I $(srcdir) \
+ -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+
+netperf.txt: $(info_TEXINFOS)
+ $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) --plaintext -I $(srcdir) \
+ -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+
+netperf.xml: $(info_TEXINFOS)
+ $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) --xml -I $(srcdir) \
+ -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+# 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/netperf-2.4.4/doc/examples/Makefile.am b/netperf-2.4.4/doc/examples/Makefile.am
new file mode 100644
index 0000000..9b2a0be
--- /dev/null
+++ b/netperf-2.4.4/doc/examples/Makefile.am
@@ -0,0 +1,11 @@
+EXTRA_DIST = \
+ arr_script \
+ packet_byte_script \
+ sctp_stream_script \
+ snapshot_script \
+ tcp_range_script \
+ tcp_rr_script \
+ tcp_stream_script \
+ udp_rr_script \
+ udp_stream_script
+
diff --git a/netperf-2.4.4/doc/examples/Makefile.in b/netperf-2.4.4/doc/examples/Makefile.in
new file mode 100644
index 0000000..1b29ff7
--- /dev/null
+++ b/netperf-2.4.4/doc/examples/Makefile.in
@@ -0,0 +1,279 @@
+# Makefile.in generated by automake 1.7.9 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
+# 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@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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 = :
+host_triplet = @host@
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+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@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GREP = @GREP@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+NEED_LIBCOMPAT_FALSE = @NEED_LIBCOMPAT_FALSE@
+NEED_LIBCOMPAT_TRUE = @NEED_LIBCOMPAT_TRUE@
+NETCPU_SOURCE = @NETCPU_SOURCE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+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@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+EXTRA_DIST = \
+ arr_script \
+ packet_byte_script \
+ sctp_stream_script \
+ snapshot_script \
+ tcp_range_script \
+ tcp_rr_script \
+ tcp_stream_script \
+ udp_rr_script \
+ udp_stream_script
+
+subdir = doc/examples
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DIST_COMMON = $(srcdir)/Makefile.in Makefile.am
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4)
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu doc/examples/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ../..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkinstalldirs) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f $(CONFIG_CLEAN_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 mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+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
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+ distclean-generic distdir dvi dvi-am info info-am install \
+ install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \
+ uninstall-info-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/netperf-2.4.4/doc/examples/arr_script b/netperf-2.4.4/doc/examples/arr_script
new file mode 100755
index 0000000..fbcf3f6
--- /dev/null
+++ b/netperf-2.4.4/doc/examples/arr_script
@@ -0,0 +1,386 @@
+# this is retained mostly for historical purposes and may not be
+# up to date for contemporary netperf versions
+#
+# a script that can be used to measure aggregate netperf performance,
+# original author is Mike Traynor. Modifications to create the
+# "netperf TCP_ARR test" by rick jones
+#
+
+init_parms() {
+ TEST_TIME=60
+ NTEST=3
+ TOLERANCE=15
+ MAX_RETRIES=3
+
+ NETPERF="/usr/local/netperf/netperf"
+ NETPERF="./netperf"
+
+ NPROC_LIST=""
+ RR_SIZES=""
+ REM_HOST_LIST=""
+ DEVFILELIST=""
+ LLA=0
+ TCP=1
+ UDP=0
+ GPROF=0
+}
+
+set_default_parms() {
+ if [ "X$NPROC_LIST" = "X" ]
+ then
+ NPROC_LIST="1"
+ fi
+
+ if [ "X$REM_HOST_LIST" = "X" ]
+ then
+ REM_HOST_LIST="127.0.0.1"
+ fi
+
+ if [ "X$RR_SIZES" = "X" ]
+ then
+ RR_SIZES="1,1"
+ fi
+
+ NHOSTS=`echo $REM_HOST_LIST | awk '{printf "%d",NF}'`
+ GPROF_RUN_TIME=`expr $TEST_TIME - 20`
+}
+
+usage() {
+more << @EOF
+
+$*
+
+ USAGE: scale_script {test_options} {hostlist}
+
+ Measure maximum system network throughput.
+
+ The following are optional parameters:
+
+ -t nsec : Causes each test to be run for nsec seconds.
+ -gprof system : Take a gprof sample during the test. system
+ is the name of the kernel the system was booted
+ with.
+ -n "nproclist" : One series of tests is run for each space-separated
+ value in nproclist.
+ -r "sizelist" : One series of tests is run for each space-separated
+ request,reply pair in sizelist.
+ hostlist : A space separated list of hosts to test against.
+
+ +|-tcp : Run/Don't run TCP tests.
+ +|-udp : Run/Don't run UDP tests.
+ +|-lla : Run/Don't run LLA tests; this option also requires
+ the user to specify a list of network device files
+ using the -d option described below.
+
+ The following option must be provided when using the -lla option
+ described above:
+
+ -d "devfilelst" : Where devfilelst is a space-separated list
+ of network device file pairs. Each pair in
+ the list contains two device file names,
+ separated by a comma (eg. /dev/lan0,/dev/lan1),
+ where the device file on the left side of the
+ comma is for the local system and the device
+ file on the right side is for the remote system.
+ A device file pair must be specified for each
+ remote host which is specified.
+
+ Examples:
+
+ scale_script -n "8 16" -udp LGs37U1 LGs37U2 -r "1,1 100,100"
+
+ scale_script -t 1000 -n "16" -tcp -gprof /stand/vmunix LGs37U1 LGs37U2
+
+ scale_script -n 4 -lla -d /dev/lan0,/dev/lan0 /dev/lan1,/dev/lan0 \\
+ LGs37U1 LGs37U2
+
+@EOF
+}
+
+check_usage() {
+ if [ `expr $TCP + $UDP + $LLA` -eq 0 ]
+ then
+ usage $0: ERROR: Must specify a test
+ exit
+ fi
+
+ if [ $LLA -eq 1 ]
+ then
+ NDEV=`echo $DEVFILELIST | awk '{printf "%d",NF}'`
+ if [ $NDEV -ne $NHOSTS ]
+ then
+ usage $0: ERROR: Number of device files does not match number of hosts
+ exit
+ fi
+ fi
+
+ for HOST in $REM_HOST_LIST
+ do
+ if [ `/etc/ping $HOST 100 1 | awk '/transmitted/{print $4}'`0 -ne 10 ]
+ then
+ usage $0: ERROR: Cannot ping host: $HOST
+ exit
+ fi
+ done
+
+ if [ $GPROF -eq 1 ]
+ then
+ if [ ! -r $GPROF_KERNEL ]
+ then
+ usage $0: ERROR: Cannot find system file: $GPROF_KERNEL
+ exit
+ fi
+ if [ $GPROF_RUN_TIME -le 800 ]
+ then
+ echo "\nWARNING: GPROF RUN TIME LESS THAN 800 SECONDS\n"
+ fi
+ fi
+}
+
+display_headstone() {
+cat << @EOF
+
+$TESTNAME Aggregate REQUEST/RESPONSE TEST to $REM_HOST_LIST
+Local /Remote
+Socket Size Request Resp. Elapsed Trans. Num.
+Send Recv Size Size Time Rate Concurrent
+bytes Bytes bytes bytes secs. per sec Netperfs
+
+@EOF
+}
+
+display_test_banner() {
+cat << @EOF
+@EOF
+}
+
+build_sap_list() {
+ LSAP=4
+ SAPLIST=""
+ PROC=0
+ while [ $PROC -lt $NPROCS ]
+ do
+ PROC=`expr $PROC + 1`
+ LSAP=`expr $LSAP + 4`
+ RSAP=`expr $LSAP + 2`
+ SAPLIST="$SAPLIST $LSAP,$RSAP"
+ done
+}
+
+start_gprof() {
+ if [ $GPROF -eq 1 ]
+ then
+ ( kgmon -h; kgmon -r; sleep 10; kgmon -b; sleep $GPROF_RUN_TIME; kgmon -h; kgmon -p $GPROF_KERNEL; mv gmon.out gmon.out.$TEST.$NPROCS )&
+ fi
+}
+
+start_1_proc_per_host() {
+ HOSTNUM=0
+ for HOST in $REM_HOST_LIST
+ do
+ if [ "$TEST" = "HIPPI_RR" ]
+ then
+ PROCNUM=`expr $PROCNUM + 1`
+ SAP=`echo $SAPLIST | awk "{print \\$$PROCNUM}"`
+ SAP="-s $SAP"
+ HOSTNUM=`expr $HOSTNUM + 1`
+ DEVFILE=`echo $DEVFILELIST | awk "{print \\$$HOSTNUM}"`
+ DEVFILE="-D $DEVFILE"
+ fi
+ $NETPERF -t $TEST -l $TEST_TIME -H $HOST -P0 -v0 -- \
+ $COW $DEVFILE $SAP $RR_SIZE $SEND_SIZE $SOCKET_SIZE &
+ done
+}
+
+start_n_procs_per_host() {
+ PROC=0
+ while [ $PROC -lt $1 ]
+ do
+ PROCNUM=`expr $PROC \* ${NHOSTS}`
+ start_1_proc_per_host &
+ PROC=`expr $PROC + 1`
+ done
+ wait
+}
+
+run_1_test() {
+ start_n_procs_per_host $PROCS_PER_HOST |\
+ awk 'BEGIN {max=0;min=99999;sum=0;n=0} \
+ {sum += $1;n++;ave=sum/n} \
+ $1<min {min=$1} \
+ $1>max {max=$1} \
+ {errl=(ave-min)/ave;errm=(max-ave)/ave;err=errl} \
+ errm>errl {err=errm} \
+ END {printf "Aggregate throughput: %2.2f TPS +/- %2.2f %%\n",sum,err*100}'
+}
+
+run_test_n_times() {
+ RETRY=0
+ TEST_COUNT=0
+ while [ $TEST_COUNT -lt $1 ]
+ do
+ TEST_COUNT=`expr $TEST_COUNT + 1`
+ start_gprof
+ run_1_test > .run_test_n_file
+ cat .run_test_n_file
+ ERROR_LVL=`awk '{print int($6+0.99)}' .run_test_n_file`
+ if [ $ERROR_LVL -gt $TOLERANCE ]
+ then
+ RETRY=`expr $RETRY + 1`
+ if [ $RETRY -le $MAX_RETRIES ]
+ then
+ TEST_COUNT=`expr $TEST_COUNT - 1`
+ TEST_TIME=`expr $TEST_TIME \* 2`
+ else
+ echo "!!!This is an INVALID RUN of the arr_script!!!" >&2
+ echo "!!!UNABLE to hit TOLERANCE of " $TOLERANCE "!!!" >&2
+ echo "Please select a longer initial time and try again." >&2
+ exit
+ fi
+ fi
+ done
+}
+
+do_req_rr_sizes() {
+ for S2 in $RR_SIZES
+ do
+ RR_SIZE="-r $S2"
+ display_test_banner $NPROCS $TEST $S2
+ run_test_n_times $NTEST > .do_series_file
+ TPS=`awk "int(\$6+0.99)<=$TOLERANCE {print}" .do_series_file |\
+ awk 'BEGIN {sum=0;n=1} \
+ sum>0 {n++} \
+ {sum+=$3} \
+ END {printf "%2.2f\n",(sum)/(n)}'`
+ SOCK_SEND=`echo $SOCKET_SIZE | awk '{print $2}'`
+ SOCK_RECV=`echo $SOCKET_SIZE | awk '{print $4}'`
+ REQ_SIZE=`echo $S2 | awk -F"," '{print $1}'`
+ RSP_SIZE=`echo $S2 | awk -F"," '{print $2}'`
+ echo $SOCK_SEND $SOCK_RECV $REQ_SIZE $RSP_SIZE $TEST_TIME $TPS $PROCS |\
+ awk '{printf "%5d %5d %5d %5d %5d %8.2f %5d",$1,$2,$3,$4,$5,$6,$7}'
+ done
+}
+
+tcp_test() {
+ #Run the TCP RR tests
+ TEST="TCP_RR"
+ SEND_SIZE=""
+ SOCKET_SIZE="-s 8192 -S 8192"
+ COW="-V"
+ do_req_rr_sizes
+ echo
+}
+
+udp_test() {
+ #Run the UDP RR tests
+ TEST="UDP_RR"
+ SEND_SIZE=""
+ SOCKET_SIZE="-s 9216 -S 9216"
+ COW="-V"
+ do_req_rr_sizes
+ echo
+}
+
+lla_test() {
+ #Run the UDP RR tests
+ TEST="HIPPI_RR"
+ SEND_SIZE=""
+ SOCKET_SIZE=""
+ COW=""
+ build_sap_list
+ do_req_rr_sizes
+ echo
+}
+
+do_req_procs() {
+ if [ $TCP -eq 1 ]
+ then
+ TESTNAME="TCP"
+ display_headstone
+ for PROCS in $NPROC_LIST
+ do
+ #Determine number of procs per host
+ PROCS_PER_HOST=`echo $PROCS $REM_HOST_LIST | awk '{printf "%d",($1+NF-2)/(NF-1)}'`
+ NPROCS=`expr $PROCS_PER_HOST \* $NHOSTS`
+ tcp_test
+ done
+ fi
+
+ if [ $UDP -eq 1 ]
+ then
+ TESTNAME="UDP"
+ display_headstone
+ for PROCS in $NPROC_LIST
+ do
+ #Determine number of procs per host
+ PROCS_PER_HOST=`echo $PROCS $REM_HOST_LIST | awk '{printf "%d",($1+NF-2)/(NF-1)}'`
+ NPROCS=`expr $PROCS_PER_HOST \* $NHOSTS`
+ udp_test
+ done
+ fi
+
+ if [ $LLA -eq 1 ]
+ then
+ TESTNAME="LLA"
+ display_headstone
+ for PROCS in $NPROC_LIST
+ do
+ #Determine number of procs per host
+ PROCS_PER_HOST=`echo $PROCS $REM_HOST_LIST | awk '{printf "%d",($1+NF-2)/(NF-1)}'`
+ NPROCS=`expr $PROCS_PER_HOST \* $NHOSTS`
+ lla_test
+ done
+ fi
+}
+
+######################################################################
+
+init_parms
+
+PARMS="${0##*/} ${@}"
+
+# Parse the command line
+while [ $# != 0 ]
+do
+ case $1 in
+ \-gprof) GPROF=1
+ GPROF_KERNEL=$2
+ shift
+ ;;
+ \-t) TEST_TIME=$2
+ shift
+ ;;
+ \-n) NPROC_LIST="$NPROC_LIST $2"
+ shift
+ ;;
+ \+lla) LLA=1
+ ;;
+ \+tcp) TCP=1
+ ;;
+ \+udp) UDP=1
+ ;;
+ \-lla) LLA=0
+ ;;
+ \-tcp) TCP=0
+ ;;
+ \-udp) UDP=0
+ ;;
+ \-d) DEVFILELIST="$DEVFILELIST $2"
+ shift
+ ;;
+ \-r) RR_SIZES="$RR_SIZES $2"
+ shift
+ ;;
+ \-*) usage $0: ERROR: Unexpected paramter: $1
+ exit
+ ;;
+ *) REM_HOST_LIST="$REM_HOST_LIST $1"
+ ;;
+ esac
+ shift
+done
+
+set_default_parms
+check_usage
+do_req_procs
+
diff --git a/netperf-2.4.4/doc/examples/packet_byte_script b/netperf-2.4.4/doc/examples/packet_byte_script
new file mode 100755
index 0000000..9362ad5
--- /dev/null
+++ b/netperf-2.4.4/doc/examples/packet_byte_script
@@ -0,0 +1,163 @@
+#!/bin/sh
+#
+# This script runs a series of netperf tests intended to gather the
+# raw material necessary to arrive at estimates for the cost of
+# sending and receiving a TCP segment, the cost of each additional byte
+# and the cost of each incremental segment.
+#
+# there are a number of data points gathered by this script - it might
+# run for a considerable length of time.
+#
+# rick jones 4/99
+#
+
+if [ $# -gt 2 ]; then
+ echo "try again, correctly -> packet_byte_script hostname [CPU]"
+ exit 1
+fi
+
+if [ $# -eq 0 ]; then
+ echo "try again, correctly -> packet_byte_script hostname [CPU]"
+ exit 1
+fi
+
+# where is netperf
+NETPERF_CMD=${NETPERF_CMD:=/opt/netperf/netperf}
+
+# at what port will netserver be waiting? If you decide to run
+# netserver at a differnet port than the default of 12865, then set
+# the value of NETPERF_PORT apropriately
+# NETPERF_PORT="-p some_other_portnum"
+NETPERF_PORT=${NETPERF_PORT:=""}
+
+
+# The test length in seconds
+NETPERF_TIME=${NETPERF_TIME:=20}
+
+# How accurate we want the estimate of performance:
+# maximum and minimum test iterations (-i)
+# confidence level (99 or 95) and interval (percent)
+NETPERF_STATS=${NETPERF_STATS:="-i 10,3 -I 99,5"}
+
+# The socket sizes that we will be testing - using -1 will let it
+# be the system default.
+NETPERF_SKTS=${NETPERF_SKTS:="-1"}
+
+# The request,response sizes that we will be using. The netperf
+# command parser will treat "1" the same as "1,1" - I use 1,1 to
+# remember that it is "request,response"
+NETPERF_REQS=${NETPERF_REQS:="1 16 32 64 128 256 512 1024 \
+ 1460 1461 2920 2921 4380 4381"}
+
+NETPERF_RESP=${NETPERF_RESP:="1 16 32 64 128 256 512 1024 \
+ 1460 1461 2920 2921 4380 4381"}
+
+# if there are two parms, parm one it the hostname and parm two will
+# be a CPU indicator. actually, anything as a second parm will cause
+# the CPU to be measured, but we will "advertise" it should be "CPU"
+
+if [ $# -eq 2 ]; then
+ REM_HOST=$1
+ LOC_CPU="-c"
+ REM_CPU="-C"
+fi
+
+if [ $# -eq 1 ]; then
+ REM_HOST=$1
+fi
+
+# If we are measuring CPU utilization, then we can save beaucoup
+# time by saving the results of the CPU calibration and passing
+# them in during the real tests. So, we execute the new CPU "tests"
+# of netperf and put the values into shell vars.
+case $LOC_CPU in
+\-c) LOC_RATE=`$NETPERF_CMD $PORT -t LOC_CPU`;;
+*) LOC_RATE=""
+esac
+
+case $REM_CPU in
+\-C) REM_RATE=`$NETPERF_CMD $PORT -t REM_CPU -H $REM_HOST`;;
+*) REM_RATE=""
+esac
+
+# This disables header display
+NO_HDR="-P 0"
+NO_HDR=""
+
+for SOCKET_SIZE in $NETPERF_SKTS
+ do
+ echo
+ echo ------------------------------------------------------
+ echo Testing with the following command line:
+ # we echo the command line for cut and paste to th database
+ echo $NETPERF_CMD $NETPERF_PORT -l $NETPERF_TIME -H $REM_HOST -t TCP_RR \
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
+ -s $SOCKET_SIZE -S $SOCKET_SIZE
+ echo
+ echo and these settings for send sizes $NETPERF_REQS
+ echo
+
+ for REQ in $NETPERF_REQS
+ do
+ # since we have the confidence interval stuff, we do not
+ # need to repeat a test multiple times from the shell
+ $NETPERF_CMD $NETPERF_PORT -l $NETPERF_TIME -H $REM_HOST $NO_HDR \
+ -t TCP_RR $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
+ -r ${REQ},1 -s $SOCKET_SIZE -S $SOCKET_SIZE
+ NO_HDR="-P 0"
+ done
+ echo
+ echo ------------------------------------------------------
+ NO_HDR=""
+ echo Testing with the following command line:
+ # we echo the command line for cut and paste to th database
+ echo $NETPERF_CMD $NETPERF_PORT -l $NETPERF_TIME -H $REM_HOST -t TCP_RR \
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
+ -s $SOCKET_SIZE -S $SOCKET_SIZE
+ echo and these settings for response sizes $NETPERF_RESP
+ echo
+ for RESP in $NETPERF_RESP
+ do
+ # since we have the confidence interval stuff, we do not
+ # need to repeat a test multiple times from the shell
+ $NETPERF_CMD $PORT -l $NETPERF_TIME -H $REM_HOST $NO_HDR \
+ -t TCP_RR $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
+ -r 1,${RESP} -s $SOCKET_SIZE -S $SOCKET_SIZE
+ NO_HDR="-P 0"
+ done
+ echo
+ echo ------------------------------------------------------
+ NO_HDR=""
+ echo Testing with the following command line:
+ # we echo the command line for cut and paste to th database
+ echo $NETPERF_CMD $NETPERF_PORT -l $NETPERF_TIME -H $REM_HOST -t TCP_STREAM\
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
+ -s $SOCKET_SIZE -S $SOCKET_SIZE
+ echo and these settings for response sizes $NETPERF_RESP
+ echo
+ for REQ in $NETPERF_REQS
+ do
+ # since we have the confidence interval stuff, we do not
+ # need to repeat a test multiple times from the shell
+ $NETPERF_CMD $PORT -l $NETPERF_TIME -H $REM_HOST $NO_HDR \
+ -t TCP_STREAM $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
+ -m ${REQ} -s $SOCKET_SIZE -S $SOCKET_SIZE -D
+ NO_HDR="-P 0"
+ done
+done
+
+# The test length in seconds for the CRR test, which needs to be
+# longer for a connect/request/response test
+
+NETPERF_CRR_TIME=${NETPERF_CRR_TIME:=120}
+
+# now we do the TCP_CRR test
+echo
+echo ------------------------------------------------------
+echo $NETPERF_CMD $NETPERF_PORT -l $NETPERF_CRR_TIME -H $REM_HOST -t TCP_CRR\
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
+ -s $SOCKET_SIZE -S $SOCKET_SIZE
+echo
+$NETPERF_CMD $NETPERF_PORT -l $NETPERF_CRR_TIME -H $REM_HOST -t TCP_CRR\
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
+ -s $SOCKET_SIZE -S $SOCKET_SIZE
diff --git a/netperf-2.4.4/doc/examples/sctp_stream_script b/netperf-2.4.4/doc/examples/sctp_stream_script
new file mode 100644
index 0000000..ebd850b
--- /dev/null
+++ b/netperf-2.4.4/doc/examples/sctp_stream_script
@@ -0,0 +1,104 @@
+#!/bin/sh
+#
+# This is an example script for using netperf. Feel free to modify it
+# as necessary, but I would suggest that you copy this one first.
+#
+# This version has been modified to take advantage of the confidence
+# interval support in revision 2.0 of netperf. it has also been altered
+# to make submitting its resutls to the netperf database easier
+# raj 11/94
+#
+# usage: tcp_stream_script hostname [CPU]
+#
+
+if [ $# -gt 2 ]; then
+ echo "try again, correctly -> sctp_stream_script hostname [CPU]"
+ exit 1
+fi
+
+if [ $# -eq 0 ]; then
+ echo "try again, correctly -> sctp_stream_script hostname [CPU]"
+ exit 1
+fi
+
+# where the programs are
+#NETHOME=/usr/local/netperf
+#NETHOME="/opt/netperf"
+NETHOME=.
+
+# at what port will netserver be waiting? If you decide to run
+# netserver at a differnet port than the default of 12865, then set
+# the value of PORT apropriately
+#PORT="-p some_other_portnum"
+PORT=""
+
+# The test length in seconds
+TEST_TIME=60
+
+# How accurate we want the estimate of performance:
+# maximum and minimum test iterations (-i)
+# confidence level (99 or 95) and interval (percent)
+STATS_STUFF="-i 10,2 -I 99,5"
+
+# The socket sizes that we will be testing
+SOCKET_SIZES="57344 32768 8192"
+
+# The send sizes that we will be using
+SEND_SIZES="4096 8192 32768"
+
+# if there are two parms, parm one it the hostname and parm two will
+# be a CPU indicator. actually, anything as a second parm will cause
+# the CPU to be measured, but we will "advertise" it should be "CPU"
+
+if [ $# -eq 2 ]; then
+ REM_HOST=$1
+ LOC_CPU="-c"
+ REM_CPU="-C"
+fi
+
+if [ $# -eq 1 ]; then
+ REM_HOST=$1
+fi
+
+# If we are measuring CPU utilization, then we can save beaucoup
+# time by saving the results of the CPU calibration and passing
+# them in during the real tests. So, we execute the new CPU "tests"
+# of netperf and put the values into shell vars.
+case $LOC_CPU in
+\-c) LOC_RATE=`$NETHOME/netperf $PORT -t LOC_CPU`;;
+*) LOC_RATE=""
+esac
+
+case $REM_CPU in
+\-C) REM_RATE=`$NETHOME/netperf $PORT -t REM_CPU -H $REM_HOST`;;
+*) REM_RATE=""
+esac
+
+# this will disable headers
+NO_HDR="-P 0"
+
+for SOCKET_SIZE in $SOCKET_SIZES
+ do
+ for SEND_SIZE in $SEND_SIZES
+ do
+ echo
+ echo ------------------------------------
+ echo
+ # we echo the command line for cut and paste
+ echo $NETHOME/netperf $PORT -l $TEST_TIME -H $REM_HOST -t SCTP_STREAM\
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $STATS_STUFF --\
+ -m $SEND_SIZE -s $SOCKET_SIZE -S $SOCKET_SIZE
+
+ echo
+ # since we have the confidence interval stuff, we do not
+ # need to repeat a test multiple times from the shell
+ $NETHOME/netperf $PORT -l $TEST_TIME -H $REM_HOST -t SCTP_STREAM\
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $STATS_STUFF --\
+ -m $SEND_SIZE -s $SOCKET_SIZE -S $SOCKET_SIZE
+
+ done
+ done
+echo If you wish to submit these results to the netperf database at
+echo http://www.cup.hp.com/netperf/NetperfPage.html, please submit each
+echo datapoint individually. Individual datapoints are separated by
+echo lines of dashes.
diff --git a/netperf-2.4.4/doc/examples/snapshot_script b/netperf-2.4.4/doc/examples/snapshot_script
new file mode 100755
index 0000000..0fe6357
--- /dev/null
+++ b/netperf-2.4.4/doc/examples/snapshot_script
@@ -0,0 +1,226 @@
+#!/bin/sh
+#set -x
+#
+# This is a script to generate a quick "snapshot" of performance for a
+# pair of nodes. At first, it will perform the following tests:
+#
+# TCP Stream test with 56KB socket buffers and 4KB sends
+# TCP Stream test with 32KB socket buffers and 4KB sends
+# TCP Request/Response test with 1 byte requests and 1 byte responses
+# UDP Request/Response test with 1 byte requests and 1 byte responses
+# UDP Request/Response test with 516 byte requests and 4 byte responses
+# UDP Stream test with 32KB socket buffers and 4KB sends
+# UDP Stream test with 32KB socket buffers and 1KB sends
+#
+# All tests will run for sixty seconds. Confidence intervals are used
+# to insure the repeatability of the test. This means that the soonest
+# the script will be finished is 21 minutes.
+#
+# This script takes two parameters. The first parm is the name of the
+# remote host. It is a required parameter. The second will either
+# enable or disable CPU utilization measurements. It is an optional
+# parameter which defaults to no CPU utilization measurements.
+#
+# usage: snapshot_script hostname [CPU]
+#
+# mod 6/29/95 - echo progress information to stderr so that we can
+# see forward progress even when the results are
+# re-directed to a file
+#
+# mod 5/27/96 - switch from NETHOME to NETPERF and take the user's value
+# if it is already set
+#
+# mod 8/12/96 - fix the default netperf command variable so it finds the
+# executable and not the directory...
+#
+# First, let us set-up some of the defaults
+#
+# where is netperf installed, there are a few possible places:
+
+NETPERF_CMD=${NETPERF_CMD:=/opt/netperf/netperf}
+
+
+# there should be no more than two parms passed
+
+if [ $# -gt 2 ]; then
+ echo "try again, correctly -> snapshot_script hostname [CPU]"
+ exit 1
+fi
+
+if [ $# -eq 0 ]; then
+ echo "try again, correctly -> snapshot_script hostname [CPU]"
+ exit 1
+fi
+
+# if there are two parms, parm one it the hostname and parm two will
+# be a CPU indicator. actuall, anything as a second parm will cause
+# the CPU to be measured, but we will "advertise" it should be "CPU"
+
+if [ $# -eq 2 ]; then
+ REM_HOST=$1
+ LOC_CPU="-c"
+ REM_CPU="-C"
+fi
+
+if [ $# -eq 1 ]; then
+ REM_HOST=$1
+fi
+
+# at what port will netserver be waiting? If you decide to run
+# netserver at a differnet port than the default of 12865, then set
+# the value of PORT apropriately
+#NETPERF_PORT="-p some_other_portnum"
+NETPERF_PORT=${NETPERF_PORT:=""}
+
+# How accurate we want the estimate of performance:
+# maximum and minimum test iterations (-i)
+# confidence level (99 or 95) and interval (percent)
+STATS_STUFF="-i 10,3 -I 99,5"
+
+# length in time of the test - should be 60 seconds
+NETPERF_TIME=${NETPERF_TIME:=60}
+
+# where is the bitbucket?
+BITBUCKET="/dev/null"
+
+# announce start of test
+echo Netperf snapshot script started at `date` >&2
+
+# If we are measuring CPU utilization, then we can save beaucoup time
+# by saving the results of the CPU calibration and passing them in
+# during the real tests. So, we execute the new CPU "tests" of netperf
+# and put the values into shell vars.
+
+case $LOC_CPU in
+\-c) LOC_RATE=`$NETPERF_CMD $NETPERF_PORT -t LOC_CPU`;;
+*) LOC_RATE=""
+esac
+
+case $REM_CPU in
+\-C) REM_RATE=`$NETPERF_CMD $NETPERF_PORT -t REM_CPU -H $REM_HOST`;;
+*) REM_RATE=""
+esac
+
+# We will perform three twenty second warm-up tests at this point, but
+# we will not display the results of those tests. This is unlikely to
+# make any difference in the results except right after a system
+# reboot, but this is supposed to be rather "general." We will do a
+# TCP stream and a TCP req/resp test
+
+WARM_TIME="10"
+
+$NETPERF_CMD $NETPERF_PORT -l $WARM_TIME -t TCP_STREAM -H $REM_HOST -- \
+ -s 32768 -S 32768 -m 4096 > ${BITBUCKET}
+$NETPERF_CMD $NETPERF_PORT -l $WARM_TIME -t TCP_STREAM -H $REM_HOST -- \
+ -s 32768 -S 32768 -m 96 > ${BITBUCKET}
+$NETPERF_CMD $NETPERF_PORT -l $WARM_TIME -t TCP_RR -H $REM_HOST -- \
+ -r 1,1 > ${BITBUCKET}
+
+# The warm-ups are complete, so perform the real tests first, the
+# stream tests, then the request/response
+
+echo Starting 56x4 TCP_STREAM tests at `date` >&2
+
+# a 56x4 TCP_STREAM test
+echo
+echo ------------------------------------
+echo Testing with the following command line:
+echo $NETPERF_CMD $NETPERF_PORT -t TCP_STREAM -l $NETPERF_TIME -H $REM_HOST \
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $STATS_STUFF -- \
+ -s 57344 -S 57344 -m 4096
+echo
+$NETPERF_CMD $NETPERF_PORT -t TCP_STREAM -l $NETPERF_TIME -H $REM_HOST \
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $STATS_STUFF -- \
+ -s 57344 -S 57344 -m 4096
+echo
+echo
+# a 32x4 TCP_STREAM test
+echo Starting 32x4 TCP_STREAM tests at `date` >&2
+echo
+echo ------------------------------------
+echo Testing with the following command line:
+echo $NETPERF_CMD $NETPERF_PORT -t TCP_STREAM -l $NETPERF_TIME -H $REM_HOST \
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $STATS_STUFF -- \
+ -s 32768 -S 32768 -m 4096
+echo
+$NETPERF_CMD $NETPERF_PORT -t TCP_STREAM -l $NETPERF_TIME -H $REM_HOST \
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $STATS_STUFF -- \
+ -s 32768 -S 32768 -m 4096
+echo
+echo
+# a single-byte TCP_RR
+echo Starting 1,1 TCP_RR tests at `date` >&2
+echo
+echo ------------------------------------
+echo Testing with the following command line:
+echo $NETPERF_CMD $NETPERF_PORT -t TCP_RR -l $NETPERF_TIME -H $REM_HOST \
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $STATS_STUFF -- \
+ -r 1,1
+echo
+$NETPERF_CMD $NETPERF_PORT -t TCP_RR -l $NETPERF_TIME -H $REM_HOST \
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $STATS_STUFF -- \
+ -r 1,1
+echo
+echo
+echo Starting 1,1 UDP_RR tests at `date` >&2
+echo
+echo ------------------------------------
+echo Testing with the following command line:
+# a single-byte UDP_RR
+echo $NETPERF_CMD $NETPERF_PORT -t UDP_RR -l $NETPERF_TIME -H $REM_HOST \
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $STATS_STUFF -- \
+ -r 1,1
+echo
+$NETPERF_CMD $NETPERF_PORT -t UDP_RR -l $NETPERF_TIME -H $REM_HOST \
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $STATS_STUFF -- \
+ -r 1,1
+echo
+echo
+# a UDP_RR test much like tftp
+echo Starting 512,4 UDP_RR tests at `date` >&2
+echo
+echo ------------------------------------
+echo Testing with the following command line:
+echo $NETPERF_CMD $NETPERF_PORT -t UDP_RR -l $NETPERF_TIME -H $REM_HOST \
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $STATS_STUFF -- \
+ -r 516,4
+echo
+$NETPERF_CMD $NETPERF_PORT -t UDP_RR -l $NETPERF_TIME -H $REM_HOST \
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $STATS_STUFF -- -r 516,4
+# a 32x4 UDP_STREAM test
+echo Starting 32x4 UDP_STREAM tests at `date` >&2
+echo
+echo ------------------------------------
+echo Testing with the following command line:
+echo $NETPERF_CMD $NETPERF_PORT -t UDP_STREAM -l $NETPERF_TIME -H $REM_HOST \
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $STATS_STUFF -- \
+ -s 32768 -S 32768 -m 4096
+echo
+$NETPERF_CMD $NETPERF_PORT -t UDP_STREAM -l $NETPERF_TIME -H $REM_HOST \
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $STATS_STUFF -- \
+ -s 32768 -S 32768 -m 4096
+echo
+echo
+# a 32x1 UDP_STREAM test
+echo Starting 32x1 UDP_STREAM tests at `date` >&2
+echo
+echo ------------------------------------
+echo Testing with the following command line:
+echo $NETPERF_CMD $NETPERF_PORT -t UDP_STREAM -l $NETPERF_TIME -H $REM_HOST \
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $STATS_STUFF -- \
+ -s 32768 -S 32768 -m 1024
+echo
+$NETPERF_CMD $NETPERF_PORT -t UDP_STREAM -l $NETPERF_TIME -H $REM_HOST \
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $STATS_STUFF -- \
+ -s 32768 -S 32768 -m 1024
+echo
+echo
+
+# and that's that
+echo Tests completed at `date` >&2
+
+echo
+echo If you wish to submit these results to the netperf database at
+echo http://www.cup.hp.com/netperf/NetperfPage.html, please submit each
+echo datapoint individually. Individual datapoints are separated by
+echo lines of dashes.
diff --git a/netperf-2.4.4/doc/examples/tcp_range_script b/netperf-2.4.4/doc/examples/tcp_range_script
new file mode 100755
index 0000000..b4ec140
--- /dev/null
+++ b/netperf-2.4.4/doc/examples/tcp_range_script
@@ -0,0 +1,113 @@
+#!/bin/sh
+#
+# stream_range
+#
+# generate a whole lot of numbers from netperf to see the effects
+# of send size on thruput
+#
+
+#
+# usage : tcp_stream_range hostname [CPU]
+#
+
+if [ $# -gt 2 ]; then
+ echo "try again, correctly -> tcp_stream_range hostname [CPU]"
+ exit 1
+fi
+
+if [ $# -eq 0 ]; then
+ echo "try again, correctly -> tcp_stream_range hostname [CPU]"
+ exit 1
+fi
+
+# if there are two parms, parm one it the hostname and parm two will
+# be a CPU indicator. actually, anything as a second parm will cause
+# the CPU to be measured, but we will "advertise" it should be "CPU"
+
+if [ $# -eq 2 ]; then
+ REM_HOST=$1
+ LOC_CPU="-c"
+ REM_CPU="-C"
+fi
+
+if [ $# -eq 1 ]; then
+ REM_HOST=$1
+fi
+
+# at what port will netserver be waiting? If you decide to run
+# netserver at a differnet port than the default of 12865, then set
+# the value of PORT apropriately
+#PORT="-p some_other_portnum"
+PORT=""
+
+# where is netperf, and are there any "constant" options such as
+# the netserver port number
+#NETHOME=/usr/etc/net_perf
+NETHOME="."
+NETPERF=$NETHOME/netperf $PORT
+
+# How accurate we want the estimate of performance:
+# maximum and minimum test iterations (-i)
+# confidence level (99 or 95) and interval (percent)
+STATS_STUFF="-i 10,2 -I 99,3"
+
+#
+# some stuff for the arithmetic
+#
+# we start at start, and then multiply by MULT and add ADD. by changing
+# these numbers, we can double each time, or increase by a fixed
+# amount, or go up by 4x, whatever we like...
+#
+START=1
+
+END=65536
+
+MULT=4
+
+ADD=0
+
+# If we are measuring CPU utilization, then we can save beaucoup
+# time by saving the results of the CPU calibration and passing
+# them in during the real tests. So, we execute the new CPU "tests"
+# of netperf and put the values into shell vars.
+case $LOC_CPU in
+\-c) LOC_RATE=`$NETPERF -t LOC_CPU`;;
+*) LOC_RATE=""
+esac
+
+case $REM_CPU in
+\-C) REM_RATE=`$NETPERF -t REM_CPU -H $REM_HOST`;;
+*) REM_RATE=""
+esac
+
+TIME="60"
+
+#
+# the maximum socket buffer size is system dependent. for the
+# "cannonical" tests we use 32KB, but this can be altered
+#
+SOCKET_SIZE="-s 32768 -S 32768"
+
+MESSAGE=$START
+while [ $MESSAGE -le $END ]; do
+ echo
+ echo ------------------------------------
+ echo Testing with the following command line:
+ echo $NETPERF -l $TIME -H $REM_HOST -t TCP_STREAM\
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $STATS_STUFF --\
+ -m $MESSAGE $SOCKET_SIZE
+ echo
+ $NETPERF -l $TIME -H $REM_HOST -t TCP_STREAM\
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $STATS_STUFF --\
+ -m $MESSAGE $SOCKET_SIZE
+
+ MESSAGE=`expr $MESSAGE + $ADD`
+ MESSAGE=`expr $MESSAGE \* $MULT`
+
+done
+echo
+echo If you wish to submit these results to the netperf database at
+echo http://www.cup.hp.com/netperf/NetperfPage.html, please submit each
+echo datapoint individually. Individual datapoints are separated by
+echo lines of dashes.
+
diff --git a/netperf-2.4.4/doc/examples/tcp_rr_script b/netperf-2.4.4/doc/examples/tcp_rr_script
new file mode 100755
index 0000000..1b12a6f
--- /dev/null
+++ b/netperf-2.4.4/doc/examples/tcp_rr_script
@@ -0,0 +1,107 @@
+#!/bin/sh
+#
+# This is an example script for using netperf. Feel free to modify it
+# as necessary, but I would suggest that you copy this one first.
+#
+#
+# This version has been modified to take advantage of the confidence
+# interval support in revision 2.0 of netperf. it has also been altered
+# to make submitting its resutls to the netperf database easier
+# raj 11/94
+#
+# usage: tcp_rr_script hostname [CPU]
+#
+
+if [ $# -gt 2 ]; then
+ echo "try again, correctly -> tcp_rr_script hostname [CPU]"
+ exit 1
+fi
+
+if [ $# -eq 0 ]; then
+ echo "try again, correctly -> tcp_rr_script hostname [CPU]"
+ exit 1
+fi
+
+# where the programs are
+#NETHOME=/usr/local/netperf
+#NETHOME="/opt/netperf"
+NETHOME=.
+
+# at what port will netserver be waiting? If you decide to run
+# netserver at a differnet port than the default of 12865, then set
+# the value of PORT apropriately
+#PORT="-p some_other_portnum"
+PORT=""
+
+# The test length in seconds
+TEST_TIME=60
+
+# How accurate we want the estimate of performance:
+# maximum and minimum test iterations (-i)
+# confidence level (99 or 95) and interval (percent)
+STATS_STUFF="-i 10,3 -I 99,5"
+
+# The socket sizes that we will be testing - using zero will let it
+# be the system default.
+SOCKET_SIZES="0"
+
+# The request,response sizes that we will be using. The netperf
+# command parser will treat "1" the same as "1,1" - I use 1,1 to
+# remember that it is "request,response"
+RR_SIZES="1,1 64,64 100,200 128,8192"
+
+# if there are two parms, parm one it the hostname and parm two will
+# be a CPU indicator. actually, anything as a second parm will cause
+# the CPU to be measured, but we will "advertise" it should be "CPU"
+
+if [ $# -eq 2 ]; then
+ REM_HOST=$1
+ LOC_CPU="-c"
+ REM_CPU="-C"
+fi
+
+if [ $# -eq 1 ]; then
+ REM_HOST=$1
+fi
+
+# If we are measuring CPU utilization, then we can save beaucoup
+# time by saving the results of the CPU calibration and passing
+# them in during the real tests. So, we execute the new CPU "tests"
+# of netperf and put the values into shell vars.
+case $LOC_CPU in
+\-c) LOC_RATE=`$NETHOME/netperf $PORT -t LOC_CPU`;;
+*) LOC_RATE=""
+esac
+
+case $REM_CPU in
+\-C) REM_RATE=`$NETHOME/netperf $PORT -t REM_CPU -H $REM_HOST`;;
+*) REM_RATE=""
+esac
+
+# This disables header display
+NO_HDR="-P 0"
+
+for SOCKET_SIZE in $SOCKET_SIZES
+ do
+ for RR_SIZE in $RR_SIZES
+ do
+ echo
+ echo ------------------------------------------------------
+ echo Testing with the following command line:
+ # we echo the command line for cut and paste to th database
+ echo $NETHOME/netperf $PORT -l $TEST_TIME -H $REM_HOST -t TCP_RR \
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $STATS_STUFF --\
+ -r $RR_SIZE -s $SOCKET_SIZE -S $SOCKET_SIZE
+ echo
+ # since we have the confidence interval stuff, we do not
+ # need to repeat a test multiple times from the shell
+ $NETHOME/netperf $PORT -l $TEST_TIME -H $REM_HOST -t TCP_RR \
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $STATS_STUFF --\
+ -r $RR_SIZE -s $SOCKET_SIZE -S $SOCKET_SIZE
+ done
+done
+echo
+echo If you wish to submit these results to the netperf database at
+echo http://www.cup.hp.com/netperf/NetperfPage.html, please submit each
+echo datapoint individually. Individual datapoints are separated by
+echo lines of dashes.
diff --git a/netperf-2.4.4/doc/examples/tcp_stream_script b/netperf-2.4.4/doc/examples/tcp_stream_script
new file mode 100755
index 0000000..c728cb7
--- /dev/null
+++ b/netperf-2.4.4/doc/examples/tcp_stream_script
@@ -0,0 +1,104 @@
+#!/bin/sh
+#
+# This is an example script for using netperf. Feel free to modify it
+# as necessary, but I would suggest that you copy this one first.
+#
+# This version has been modified to take advantage of the confidence
+# interval support in revision 2.0 of netperf. it has also been altered
+# to make submitting its resutls to the netperf database easier
+# raj 11/94
+#
+# usage: tcp_stream_script hostname [CPU]
+#
+
+if [ $# -gt 2 ]; then
+ echo "try again, correctly -> tcp_stream_script hostname [CPU]"
+ exit 1
+fi
+
+if [ $# -eq 0 ]; then
+ echo "try again, correctly -> tcp_stream_script hostname [CPU]"
+ exit 1
+fi
+
+# where the programs are
+#NETHOME=/usr/local/netperf
+#NETHOME="/opt/netperf"
+NETHOME=.
+
+# at what port will netserver be waiting? If you decide to run
+# netserver at a different port than the default of 12865, then set
+# the value of PORT apropriately
+#PORT="-p some_other_portnum"
+PORT=""
+
+# The test length in seconds
+TEST_TIME=60
+
+# How accurate we want the estimate of performance:
+# maximum and minimum test iterations (-i)
+# confidence level (99 or 95) and interval (percent)
+STATS_STUFF="-i 10,2 -I 99,5"
+
+# The socket sizes that we will be testing
+SOCKET_SIZES="128K 57344 32768 8192"
+
+# The send sizes that we will be using
+SEND_SIZES="4096 8192 32768"
+
+# if there are two parms, parm one it the hostname and parm two will
+# be a CPU indicator. actually, anything as a second parm will cause
+# the CPU to be measured, but we will "advertise" it should be "CPU"
+
+if [ $# -eq 2 ]; then
+ REM_HOST=$1
+ LOC_CPU="-c"
+ REM_CPU="-C"
+fi
+
+if [ $# -eq 1 ]; then
+ REM_HOST=$1
+fi
+
+# If we are measuring CPU utilization, then we can save beaucoup
+# time by saving the results of the CPU calibration and passing
+# them in during the real tests. So, we execute the new CPU "tests"
+# of netperf and put the values into shell vars.
+case $LOC_CPU in
+\-c) LOC_RATE=`$NETHOME/netperf $PORT -t LOC_CPU`;;
+*) LOC_RATE=""
+esac
+
+case $REM_CPU in
+\-C) REM_RATE=`$NETHOME/netperf $PORT -t REM_CPU -H $REM_HOST`;;
+*) REM_RATE=""
+esac
+
+# this will disable headers
+NO_HDR="-P 0"
+
+for SOCKET_SIZE in $SOCKET_SIZES
+ do
+ for SEND_SIZE in $SEND_SIZES
+ do
+ echo
+ echo ------------------------------------
+ echo
+ # we echo the command line for cut and paste
+ echo $NETHOME/netperf $PORT -l $TEST_TIME -H $REM_HOST -t TCP_STREAM\
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $STATS_STUFF --\
+ -m $SEND_SIZE -s $SOCKET_SIZE -S $SOCKET_SIZE
+
+ echo
+ # since we have the confidence interval stuff, we do not
+ # need to repeat a test multiple times from the shell
+ $NETHOME/netperf $PORT -l $TEST_TIME -H $REM_HOST -t TCP_STREAM\
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $STATS_STUFF --\
+ -m $SEND_SIZE -s $SOCKET_SIZE -S $SOCKET_SIZE
+
+ done
+ done
+echo If you wish to submit these results to the netperf database at
+echo http://www.cup.hp.com/netperf/NetperfPage.html, please submit each
+echo datapoint individually. Individual datapoints are separated by
+echo lines of dashes.
diff --git a/netperf-2.4.4/doc/examples/udp_rr_script b/netperf-2.4.4/doc/examples/udp_rr_script
new file mode 100755
index 0000000..0248677
--- /dev/null
+++ b/netperf-2.4.4/doc/examples/udp_rr_script
@@ -0,0 +1,107 @@
+#!/bin/sh
+#
+# This is an example script for using netperf. Feel free to modify it
+# as necessary, but I would suggest that you copy this one first.
+#
+#
+# uncomment the next line if you think the script is broken
+#set -x
+
+
+if [ $# -gt 2 ]; then
+ echo "try again, correctly -> udp_rr_script hostname [CPU]"
+ exit 1
+fi
+
+if [ $# -eq 0 ]; then
+ echo "try again, correctly -> udp_rr_script hostname [CPU]"
+ exit 1
+fi
+
+# where the programs are
+
+#NETHOME=/usr/local/netperf
+#NETHOME="/opt/netperf"
+NETHOME="."
+
+# at what port will netserver be waiting? If you decide to run
+# netserver at a differnet port than the default of 12865, then set
+# the value of PORT apropriately
+#PORT="-p some_other_portnum"
+PORT=""
+
+
+# The test length in seconds
+
+TEST_TIME=60
+
+# How accurate we want the estimate of performance:
+# maximum and minimum test iterations (-i)
+# confidence level (99 or 95) and interval (percent)
+
+STATS_STUFF="-i 10,2 -I 99,10"
+
+# The socket sizes that we will be testing - -1 means use default
+# not much point in changing the socket buffer for a UDP request/
+# response test - unless you want to have requests/responses which
+# are larger than the default
+
+SOCKET_SIZES="-1"
+
+# The send sizes that we will be using
+
+RR_SIZES="1,1 64,64 100,200 1024,1024"
+
+# if there are two parms, parm one it the hostname and parm two will
+# be a CPU indicator. actually, anything as a second parm will cause
+# the CPU to be measured, but we will "advertise" it should be "CPU"
+
+if [ $# -eq 2 ]; then
+ REM_HOST=$1
+ LOC_CPU="-c"
+ REM_CPU="-C"
+fi
+
+if [ $# -eq 1 ]; then
+ LOC_CPU=""
+ REM_CPU=""
+ REM_HOST=$1
+fi
+
+# If we are measuring CPU utilization, then we can save beaucoup
+# time by saving the results of the CPU calibration and passing
+# them in during the real tests. So, we execute the new CPU "tests"
+# of netperf and put the values into shell vars.
+case $LOC_CPU in
+\-c) LOC_RATE=`$NETHOME/netperf $PORT -t LOC_CPU`;;
+*) LOC_RATE=""
+esac
+
+case $REM_CPU in
+\-C) REM_RATE=`$NETHOME/netperf $PORT -t REM_CPU -H $REM_HOST`;;
+*) REM_RATE=""
+esac
+
+# This turns-off the display headers
+NO_HDR="-P 0"
+
+for SOCKET_SIZE in $SOCKET_SIZES
+do
+ for RR_SIZE in $RR_SIZES
+ do
+ echo
+ echo ------------------------------------------------------
+ echo Testing with the following command line:
+ echo $NETHOME/netperf $PORT -l $TEST_TIME -H $REM_HOST $STATS_STUFF \
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE -t UDP_RR --\
+ -r $RR_SIZE -s $SOCKET_SIZE -S $SOCKET_SIZE
+ $NETHOME/netperf $PORT -l $TEST_TIME -H $REM_HOST $STATS_STUFF \
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE -t UDP_RR $NO_HDR --\
+ -r $RR_SIZE -s $SOCKET_SIZE -S $SOCKET_SIZE
+ done
+done
+echo
+echo If you wish to submit these results to the netperf database at
+echo http://www.cup.hp.com/netperf/NetperfPage.html, please submit each
+echo datapoint individually. Individual datapoints are separated by
+echo lines of dashes.
diff --git a/netperf-2.4.4/doc/examples/udp_stream_script b/netperf-2.4.4/doc/examples/udp_stream_script
new file mode 100644
index 0000000..41ae975
--- /dev/null
+++ b/netperf-2.4.4/doc/examples/udp_stream_script
@@ -0,0 +1,104 @@
+#!/bin/sh
+#
+# This is an example script for using netperf. Feel free to modify it
+# as necessary, but I would suggest that you copy this one first.
+# This script performs various UDP unidirectional stream tests.
+#
+
+if [ $# -gt 2 ]; then
+ echo "try again, correctly -> udp_stream_script hostname [CPU]"
+ exit 1
+fi
+
+if [ $# -eq 0 ]; then
+ echo "try again, correctly -> udp_stream_script hostname [CPU]"
+ exit 1
+fi
+
+# where the programs are
+
+#NETHOME=/usr/local/netperf
+#NETHOME="/opt/netperf"
+NETHOME="."
+
+# at what port will netserver be waiting? If you decide to run
+# netserver at a differnet port than the default of 12865, then set
+# the value of PORT apropriately
+#PORT="-p some_other_portnum"
+PORT=""
+
+# The test length in seconds
+TEST_TIME=60
+
+# How accurate we want the estimate of performance:
+# maximum and minimum test iterations (-i)
+# confidence level (99 or 95) and interval (percent)
+
+STATS_STUFF="-i 10,2 -I 99,10"
+
+# The socket sizes that we will be testing. This should be a list of
+# integers separated by spaces
+
+SOCKET_SIZES="32768"
+
+# The send sizes that we will be using. Using send sizes that result
+# in UDP packets which are larger than link size can be a bad thing to do.
+# for FDDI, you can tack-on a 4096 data point
+
+SEND_SIZES="64 1024 1472"
+
+# if there are two parms, parm one it the hostname and parm two will
+# be a CPU indicator. actually, anything as a second parm will cause
+# the CPU to be measured, but we will "advertise" it should be "CPU"
+
+if [ $# -eq 2 ]; then
+ REM_HOST=$1
+ LOC_CPU="-c"
+ REM_CPU="-C"
+fi
+
+if [ $# -eq 1 ]; then
+ LOC_CPU=""
+ REM_CPU=""
+ REM_HOST=$1
+fi
+
+# If we are measuring CPU utilization, then we can save beaucoup
+# time by saving the results of the CPU calibration and passing
+# them in during the real tests. So, we execute the new CPU "tests"
+# of netperf and put the values into shell vars.
+case $LOC_CPU in
+\-c) LOC_RATE=`$NETHOME/netperf $PORT -t LOC_CPU`;;
+*) LOC_RATE=""
+esac
+
+case $REM_CPU in
+\-C) REM_RATE=`$NETHOME/netperf $PORT -t REM_CPU -H $REM_HOST`;;
+*) REM_RATE=""
+esac
+
+# This will tell netperf that headers are not to be displayed
+NO_HDR="-P 0"
+
+for SOCKET_SIZE in $SOCKET_SIZES
+do
+ for SEND_SIZE in $SEND_SIZES
+ do
+ echo
+ echo ------------------------------------------------------
+ echo Testing with the following command line:
+ echo $NETHOME/netperf $PORT -l $TEST_TIME -H $REM_HOST $STATS_STUFF \
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE -t UDP_STREAM -- \
+ -m $SEND_SIZE -s $SOCKET_SIZE -S $SOCKET_SIZE
+
+ $NETHOME/netperf $PORT -l $TEST_TIME -H $REM_HOST $STATS_STUFF \
+ $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE -t UDP_STREAM -- \
+ -m $SEND_SIZE -s $SOCKET_SIZE -S $SOCKET_SIZE
+
+ done
+done
+echo
+echo If you wish to submit these results to the netperf database at
+echo http://www.cup.hp.com/netperf/NetperfPage.html, please submit each
+echo datapoint individually. Individual datapoints are separated by
+echo lines of dashes.
diff --git a/netperf-2.4.4/doc/netperf.info b/netperf-2.4.4/doc/netperf.info
new file mode 100644
index 0000000..998733c
--- /dev/null
+++ b/netperf-2.4.4/doc/netperf.info
@@ -0,0 +1,2859 @@
+This is netperf.info, produced by makeinfo version 4.8 from
+netperf.texi.
+
+ This is Rick Jones' feeble attempt at a Texinfo-based manual for the
+netperf benchmark.
+
+ Copyright (C) 2005-2007 Hewlett-Packard Company
+
+ Permission is granted to copy, distribute and/or modify this
+ document per the terms of the netperf source licence, a copy of
+ which can be found in the file `COPYING' of the basic netperf
+ distribution.
+
+
+File: netperf.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir)
+
+Netperf Manual
+**************
+
+This is Rick Jones' feeble attempt at a Texinfo-based manual for the
+netperf benchmark.
+
+ Copyright (C) 2005-2007 Hewlett-Packard Company
+
+ Permission is granted to copy, distribute and/or modify this
+ document per the terms of the netperf source licence, a copy of
+ which can be found in the file `COPYING' of the basic netperf
+ distribution.
+
+* Menu:
+
+* Introduction:: An introduction to netperf - what it is and whatit is not.
+* Installing Netperf:: How to go about installing netperf.
+* The Design of Netperf::
+* Global Command-line Options::
+* Using Netperf to Measure Bulk Data Transfer::
+* Using Netperf to Measure Request/Response ::
+* Using Netperf to Measure Aggregate Performance::
+* Using Netperf to Measure Bidirectional Transfer::
+* Other Netperf Tests::
+* Address Resolution::
+* Enhancing Netperf::
+* Netperf4::
+* Concept Index::
+* Option Index::
+
+ --- The Detailed Node Listing ---
+
+Introduction
+
+* Conventions::
+
+Installing Netperf
+
+* Getting Netperf Bits::
+* Installing Netperf Bits::
+* Verifying Installation::
+
+The Design of Netperf
+
+* CPU Utilization::
+
+Global Command-line Options
+
+* Command-line Options Syntax::
+* Global Options::
+
+Using Netperf to Measure Bulk Data Transfer
+
+* Issues in Bulk Transfer::
+* Options common to TCP UDP and SCTP tests::
+
+Options common to TCP UDP and SCTP tests
+
+* TCP_STREAM::
+* TCP_MAERTS::
+* TCP_SENDFILE::
+* UDP_STREAM::
+* XTI_TCP_STREAM::
+* XTI_UDP_STREAM::
+* SCTP_STREAM::
+* DLCO_STREAM::
+* DLCL_STREAM::
+* STREAM_STREAM::
+* DG_STREAM::
+
+Using Netperf to Measure Request/Response
+
+* Issues in Request/Response::
+* Options Common to TCP UDP and SCTP _RR tests::
+
+Options Common to TCP UDP and SCTP _RR tests
+
+* TCP_RR::
+* TCP_CC::
+* TCP_CRR::
+* UDP_RR::
+* XTI_TCP_RR::
+* XTI_TCP_CC::
+* XTI_TCP_CRR::
+* XTI_UDP_RR::
+* DLCL_RR::
+* DLCO_RR::
+* SCTP_RR::
+
+Using Netperf to Measure Aggregate Performance
+
+* Running Concurrent Netperf Tests::
+* Using --enable-burst::
+
+Using Netperf to Measure Bidirectional Transfer
+
+* Bidirectional Transfer with Concurrent Tests::
+* Bidirectional Transfer with TCP_RR::
+
+Other Netperf Tests
+
+* CPU rate calibration::
+
+
+File: netperf.info, Node: Introduction, Next: Installing Netperf, Prev: Top, Up: Top
+
+1 Introduction
+**************
+
+Netperf is a benchmark that can be use to measure various aspect of
+networking performance. The primary foci are bulk (aka unidirectional)
+data transfer and request/response performance using either TCP or UDP
+and the Berkeley Sockets interface. As of this writing, the tests
+available either unconditionally or conditionally include:
+
+ * TCP and UDP unidirectional transfer and request/response over IPv4
+ and IPv6 using the Sockets interface.
+
+ * TCP and UDP unidirectional transfer and request/response over IPv4
+ using the XTI interface.
+
+ * Link-level unidirectional transfer and request/response using the
+ DLPI interface.
+
+ * Unix domain sockets
+
+ * SCTP unidirectional transfer and request/response over IPv4 and
+ IPv6 using the sockets interface.
+
+ While not every revision of netperf will work on every platform
+listed, the intention is that at least some version of netperf will
+work on the following platforms:
+
+ * Unix - at least all the major variants.
+
+ * Linux
+
+ * Windows
+
+ * OpenVMS
+
+ * Others
+
+ Netperf is maintained and informally supported primarily by Rick
+Jones, who can perhaps be best described as Netperf Contributing
+Editor. Non-trivial and very appreciated assistance comes from others
+in the network performance community, who are too numerous to mention
+here. While it is often used by them, netperf is NOT supported via any
+of the formal Hewlett-Packard support channels. You should feel free
+to make enhancements and modifications to netperf to suit your
+nefarious porpoises, so long as you stay within the guidelines of the
+netperf copyright. If you feel so inclined, you can send your changes
+to netperf-feedback <netperf-feedback@netperf.org> for possible
+inclusion into subsequent versions of netperf.
+
+ If you would prefer to make contributions to networking benchmark
+using certified "open source" license, please considuer netperf4, which
+is distributed under the terms of the GPL.
+
+ The netperf-talk <netperf-talk@netperf.org> mailing list is
+available to discuss the care and feeding of netperf with others who
+share your interest in network performance benchmarking. The
+netperf-talk mailing list is a closed list and you must first subscribe
+by sending email to netperf-talk-request
+<netperf-talk-request@netperf.org>.
+
+* Menu:
+
+* Conventions::
+
+
+File: netperf.info, Node: Conventions, Prev: Introduction, Up: Introduction
+
+1.1 Conventions
+===============
+
+A "sizespec" is a one or two item, comma-separated list used as an
+argument to a command-line option that can set one or two, related
+netperf parameters. If you wish to set both parameters to separate
+values, items should be separated by a comma:
+
+ parameter1,parameter2
+
+ If you wish to set the first parameter without altering the value of
+the second from its default, you should follow the first item with a
+comma:
+
+ parameter1,
+
+ Likewise, precede the item with a comma if you wish to set only the
+second parameter:
+
+ ,parameter2
+
+ An item with no commas:
+
+ parameter1and2
+
+ will set both parameters to the same value. This last mode is one of
+the most frequently used.
+
+ There is another variant of the comma-separated, two-item list called
+a "optionspec" which is like a sizespec with the exception that a
+single item with no comma:
+
+ parameter1
+
+ will only set the value of the first parameter and will leave the
+second parameter at its default value.
+
+ Netperf has two types of command-line options. The first are global
+command line options. They are essentially any option not tied to a
+particular test or group of tests. An example of a global command-line
+option is the one which sets the test type - `-t'.
+
+ The second type of options are test-specific options. These are
+options which are only applicable to a particular test or set of tests.
+An example of a test-specific option would be the send socket buffer
+size for a TCP_STREAM test.
+
+ Global command-line options are specified first with test-specific
+options following after a `--' as in:
+
+ netperf <global> -- <test-specific>
+
+
+File: netperf.info, Node: Installing Netperf, Next: The Design of Netperf, Prev: Introduction, Up: Top
+
+2 Installing Netperf
+********************
+
+Netperf's primary form of distribution is source code. This allows
+installation on systems other than those to which the authors have
+ready access and thus the ability to create binaries. There are two
+styles of netperf installation. The first runs the netperf server
+program - netserver - as a child of inetd. This requires the installer
+to have sufficient privileges to edit the files `/etc/services' and
+`/etc/inetd.conf' or their platform-specific equivalents.
+
+ The second style is to run netserver as a standalone daemon. This
+second method does not require edit privileges on `/etc/services' and
+`/etc/inetd.conf' but does mean you must remember to run the netserver
+program explicitly after every system reboot.
+
+ This manual assumes that those wishing to measure networking
+performance already know how to use anonymous FTP and/or a web browser.
+It is also expected that you have at least a passing familiarity with
+the networking protocols and interfaces involved. In all honesty, if
+you do not have such familiarity, likely as not you have some
+experience to gain before attempting network performance measurements.
+The excellent texts by authors such as Stevens, Fenner and Rudoff
+and/or Stallings would be good starting points. There are likely other
+excellent sources out there as well.
+
+* Menu:
+
+* Getting Netperf Bits::
+* Installing Netperf Bits::
+* Verifying Installation::
+
+
+File: netperf.info, Node: Getting Netperf Bits, Next: Installing Netperf Bits, Prev: Installing Netperf, Up: Installing Netperf
+
+2.1 Getting Netperf Bits
+========================
+
+Gzipped tar files of netperf sources can be retrieved via anonymous FTP
+(ftp://ftp.netperf.org/netperf) for "released" versions of the bits.
+Pre-release versions of the bits can be retrieved via anonymous FTP
+from the experimental (ftp://ftp.netperf.org/netperf/experimental)
+subdirectory.
+
+ For convenience and ease of remembering, a link to the download site
+is provided via the NetperfPage (http://www.netperf.org/)
+
+ The bits corresponding to each discrete release of netperf are
+tagged (http://www.netperf.org/svn/netperf2/tags) for retrieval via
+subversion. For example, there is a tag for the first version
+corresponding to this version of the manual - netperf 2.4.3
+(http://www.netperf.org/svn/netperf2/tags/netperf-2.4.3). Those
+wishing to be on the bleeding edge of netperf development can use
+subversion to grab the top of trunk
+(http://www.netperf.org/svn/netperf2/trunk).
+
+ There are likely other places around the Internet from which one can
+download netperf bits. These may be simple mirrors of the main netperf
+site, or they may be local variants on netperf. As with anything one
+downloads from the Internet, take care to make sure it is what you
+really wanted and isn't some malicious Trojan or whatnot. Caveat
+downloader.
+
+ As a general rule, binaries of netperf and netserver are not
+distributed from ftp.netperf.org. From time to time a kind soul or
+souls has packaged netperf as a Debian package available via the
+apt-get mechanism or as an RPM. I would be most interested in learning
+how to enhance the makefiles to make that easier for people, and
+perhaps to generate HP-UX swinstall"depots."
+
+
+File: netperf.info, Node: Installing Netperf Bits, Next: Verifying Installation, Prev: Getting Netperf Bits, Up: Installing Netperf
+
+2.2 Installing Netperf
+======================
+
+Once you have downloaded the tar file of netperf sources onto your
+system(s), it is necessary to unpack the tar file, cd to the netperf
+directory, run configure and then make. Most of the time it should be
+sufficient to just:
+
+ gzcat <netperf-version>.tar.gz | tar xf -
+ cd <netperf-version>
+ ./configure
+ make
+ make install
+
+ Most of the "usual" configure script options should be present
+dealing with where to install binaries and whatnot.
+ ./configure --help
+ should list all of those and more.
+
+ If the netperf configure script does not know how to automagically
+detect which CPU utilization mechanism to use on your platform you may
+want to add a `--enable-cpuutil=mumble' option to the configure
+command. If you have knowledge and/or experience to contribute to
+that area, feel free to contact <netperf-feedback@netperf.org>.
+
+ Similarly, if you want tests using the XTI interface, Unix Domain
+Sockets, DLPI or SCTP it will be necessary to add one or more
+`--enable-[xti|unix|dlpi|sctp]=yes' options to the configure command.
+As of this writing, the configure script will not include those tests
+automagically.
+
+ On some platforms, it may be necessary to precede the configure
+command with a CFLAGS and/or LIBS variable as the netperf configure
+script is not yet smart enough to set them itself. Whenever possible,
+these requirements will be found in `README.PLATFORM' files. Expertise
+and assistance in making that more automagical in the configure script
+would be most welcome.
+
+ Other optional configure-time settings include
+`--enable-intervals=yes' to give netperf the ability to "pace" its
+_STREAM tests and `--enable-histogram=yes' to have netperf keep a
+histogram of interesting times. Each of these will have some effect on
+the measured result. If your system supports `gethrtime()' the effect
+of the histogram measurement should be minimized but probably still
+measurable. For example, the histogram of a netperf TCP_RR test will
+be of the individual transaction times:
+ netperf -t TCP_RR -H lag -v 2
+ TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to lag.hpl.hp.com (15.4.89.214) port 0 AF_INET : histogram
+ Local /Remote
+ Socket Size Request Resp. Elapsed Trans.
+ Send Recv Size Size Time Rate
+ bytes Bytes bytes bytes secs. per sec
+
+ 16384 87380 1 1 10.00 3538.82
+ 32768 32768
+ Alignment Offset
+ Local Remote Local Remote
+ Send Recv Send Recv
+ 8 0 0 0
+ Histogram of request/response times
+ UNIT_USEC : 0: 0: 0: 0: 0: 0: 0: 0: 0: 0
+ TEN_USEC : 0: 0: 0: 0: 0: 0: 0: 0: 0: 0
+ HUNDRED_USEC : 0: 34480: 111: 13: 12: 6: 9: 3: 4: 7
+ UNIT_MSEC : 0: 60: 50: 51: 44: 44: 72: 119: 100: 101
+ TEN_MSEC : 0: 105: 0: 0: 0: 0: 0: 0: 0: 0
+ HUNDRED_MSEC : 0: 0: 0: 0: 0: 0: 0: 0: 0: 0
+ UNIT_SEC : 0: 0: 0: 0: 0: 0: 0: 0: 0: 0
+ TEN_SEC : 0: 0: 0: 0: 0: 0: 0: 0: 0: 0
+ >100_SECS: 0
+ HIST_TOTAL: 35391
+
+ Long-time users of netperf will notice the expansion of the main test
+header. This stems from the merging-in of IPv6 with the standard IPv4
+tests and the addition of code to specify addressing information for
+both sides of the data connection.
+
+ The histogram you see above is basically a base-10 log histogram
+where we can see that most of the transaction times were on the order
+of one hundred to one-hundred, ninety-nine microseconds, but they were
+occasionally as long as ten to nineteen milliseconds
+
+ The `--enable-demo=yes' configure option will cause code to be
+included to report interim results during a test run. The rate at
+which interim results are reported can then be controlled via the
+global `-D' option. Here is an example of -enable-demo mode output:
+
+ src/netperf -D 1.35 -H lag -f M
+ TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to lag.hpl.hp.com (15.4.89.214) port 0 AF_INET : demo
+ Interim result: 9.66 MBytes/s over 1.67 seconds
+ Interim result: 9.64 MBytes/s over 1.35 seconds
+ Interim result: 9.58 MBytes/s over 1.36 seconds
+ Interim result: 9.51 MBytes/s over 1.36 seconds
+ Interim result: 9.71 MBytes/s over 1.35 seconds
+ Interim result: 9.66 MBytes/s over 1.36 seconds
+ Interim result: 9.61 MBytes/s over 1.36 seconds
+ Recv Send Send
+ Socket Socket Message Elapsed
+ Size Size Size Time Throughput
+ bytes bytes bytes secs. MBytes/sec
+
+ 32768 16384 16384 10.00 9.61
+
+ Notice how the units of the interim result track that requested by
+the `-f' option. Also notice that sometimes the interval will be
+longer than the value specified in the `-D' option. This is normal and
+stems from how demo mode is implemented without relying on interval
+timers, but by calculating how many units of work must be performed to
+take at least the desired interval.
+
+ As of this writing, a `make install' will not actually update the
+files `/etc/services' and/or `/etc/inetd.conf' or their
+platform-specific equivalents. It remains necessary to perform that
+bit of installation magic by hand. Patches to the makefile sources to
+effect an automagic editing of the necessary files to have netperf
+installed as a child of inetd would be most welcome.
+
+ Starting the netserver as a standalone daemon should be as easy as:
+ $ netserver
+ Starting netserver at port 12865
+ Starting netserver at hostname 0.0.0.0 port 12865 and family 0
+
+ Over time the specifics of the messages netserver prints to the
+screen may change but the gist will remain the same.
+
+ If the compilation of netperf or netserver happens to fail, feel free
+to contact <netperf-feedback@netperf.org> or join and ask in
+<netperf-talk@netperf.org>. However, it is quite important that you
+include the actual compilation errors and perhaps even the configure
+log in your email. Otherwise, it will be that much more difficult for
+someone to assist you.
+
+
+File: netperf.info, Node: Verifying Installation, Prev: Installing Netperf Bits, Up: Installing Netperf
+
+2.3 Verifying Installation
+==========================
+
+Basically, once netperf is installed and netserver is configured as a
+child of inetd, or launched as a standalone daemon, simply typing:
+ netperf
+ should result in output similar to the following:
+ $ netperf
+ TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to localhost.localdomain (127.0.0.1) port 0 AF_INET
+ Recv Send Send
+ Socket Socket Message Elapsed
+ Size Size Size Time Throughput
+ bytes bytes bytes secs. 10^6bits/sec
+
+ 87380 16384 16384 10.00 2997.84
+
+
+File: netperf.info, Node: The Design of Netperf, Next: Global Command-line Options, Prev: Installing Netperf, Up: Top
+
+3 The Design of Netperf
+***********************
+
+Netperf is designed around a basic client-server model. There are two
+executables - netperf and netserver. Generally you will only execute
+the netperf program, with the netserver program being invoked by the
+remote system's inetd or equivalent. When you execute netperf, the
+first that that will happen is the establishment of a control
+connection to the remote system. This connection will be used to pass
+test configuration information and results to and from the remote
+system. Regardless of the type of test to be run, the control
+connection will be a TCP connection using BSD sockets. The control
+connection can use either IPv4 or IPv6.
+
+ Once the control connection is up and the configuration information
+has been passed, a separate "data" connection will be opened for the
+measurement itself using the API's and protocols appropriate for the
+specified test. When the test is completed, the data connection will
+be torn-down and results from the netserver will be passed-back via the
+control connection and combined with netperf's result for display to
+the user.
+
+ Netperf places no traffic on the control connection while a test is
+in progress. Certain TCP options, such as SO_KEEPALIVE, if set as your
+systems' default, may put packets out on the control connection while a
+test is in progress. Generally speaking this will have no effect on
+the results.
+
+* Menu:
+
+* CPU Utilization::
+
+
+File: netperf.info, Node: CPU Utilization, Prev: The Design of Netperf, Up: The Design of Netperf
+
+3.1 CPU Utilization
+===================
+
+CPU utilization is an important, and alas all-too infrequently reported
+component of networking performance. Unfortunately, it can be one of
+the most difficult metrics to measure accurately as many systems offer
+mechanisms that are at best il-suited to measuring CPU utilization in
+high interrupt rate (eg networking) situations.
+
+ CPU utilization in netperf is reported as a value between 0 and 100%
+regardless of the number of CPUs involved. In addition to CPU
+utilization, netperf will report a metric called a "service demand".
+The service demand is the normalization of CPU utilization and work
+performed. For a _STREAM test it is the microseconds of CPU time
+consumed to transfer on KB (K == 1024) of data. For a _RR test it is
+the microseconds of CPU time consumed processing a single transaction.
+For both CPU utilization and service demand, lower is better.
+
+ Service demand can be particularly useful when trying to gauge the
+effect of a performance change. It is essentially a measure of
+efficiency, with smaller values being more efficient.
+
+ Netperf is coded to be able to use one of several, generally
+platform-specific CPU utilization measurement mechanisms. Single
+letter codes will be included in the CPU portion of the test banner to
+indicate which mechanism was used on each of the local (netperf) and
+remote (netserver) system.
+
+ As of this writing those codes are:
+
+`U'
+ The CPU utilization measurement mechanism was unknown to netperf or
+ netperf/netserver was not compiled to include CPU utilization
+ measurements. The code for the null CPU utilization mechanism can
+ be found in `src/netcpu_none.c'.
+
+`I'
+ An HP-UX-specific CPU utilization mechanism whereby the kernel
+ incremented a per-CPU counter by one for each trip through the idle
+ loop. This mechanism was only available on specially-compiled HP-UX
+ kernels prior to HP-UX 10 and is mentioned here only for the sake
+ of historical completeness and perhaps as a suggestion to those
+ who might be altering other operating systems. While rather
+ simple, perhaps even simplistic, this mechanism was quite robust
+ and was not affected by the concerns of statistical methods, or
+ methods attempting to track time in each of user, kernel,
+ interrupt and idle modes which require quite careful accounting.
+ It can be thought-of as the in-kernel version of the looper `L'
+ mechanism without the context switch overhead. This mechanism
+ required calibration.
+
+`P'
+ An HP-UX-specific CPU utilization mechanism whereby the kernel
+ keeps-track of time (in the form of CPU cycles) spent in the kernel
+ idle loop (HP-UX 10.0 to 11.23 inclusive), or where the kernel
+ keeps track of time spent in idle, user, kernel and interrupt
+ processing (HP-UX 11.23 and later). The former requires
+ calibration, the latter does not. Values in either case are
+ retrieved via one of the pstat(2) family of calls, hence the use
+ of the letter `P'. The code for these mechanisms is found in
+ `src/netcpu_pstat.c' and `src/netcpu_pstatnew.c' respectively.
+
+`K'
+ A Solaris-specific CPU utilization mechanism where by the kernel
+ keeps track of ticks (eg HZ) spent in the idle loop. This method
+ is statistical and is known to be inaccurate when the interrupt
+ rate is above epsilon as time spent processing interrupts is not
+ subtracted from idle. The value is retrieved via a kstat() call -
+ hence the use of the letter `K'. Since this mechanism uses units
+ of ticks (HZ) the calibration value should invariably match HZ.
+ (Eg 100) The code for this mechanism is implemented in
+ `src/netcpu_kstat.c'.
+
+`M'
+ A Solaris-specific mechanism available on Solaris 10 and latter
+ which uses the new microstate accounting mechanisms. There are
+ two, alas, overlapping, mechanisms. The first tracks nanoseconds
+ spent in user, kernel, and idle modes. The second mechanism tracks
+ nanoseconds spent in interrupt. Since the mechanisms overlap,
+ netperf goes through some hand-waving to try to "fix" the problem.
+ Since the accuracy of the handwaving cannot be completely
+ determined, one must presume that while better than the `K'
+ mechanism, this mechanism too is not without issues. The values
+ are retrieved via kstat() calls, but the letter code is set to `M'
+ to distinguish this mechanism from the even less accurate `K'
+ mechanism. The code for this mechanism is implemented in
+ `src/netcpu_kstat10.c'.
+
+`L'
+ A mechanism based on "looper"or "soaker" processes which sit in
+ tight loops counting as fast as they possibly can. This mechanism
+ starts a looper process for each known CPU on the system. The
+ effect of processor hyperthreading on the mechanism is not yet
+ known. This mechanism definitely requires calibration. The code
+ for the "looper"mechanism can be found in `src/netcpu_looper.c'
+
+`N'
+ A Microsoft Windows-specific mechanism, the code for which can be
+ found in `src/netcpu_ntperf.c'. This mechanism too is based on
+ what appears to be a form of micro-state accounting and requires no
+ calibration. On laptops, or other systems which may dynamically
+ alter the CPU frequency to minimize power consumtion, it has been
+ suggested that this mechanism may become slightly confsed, in
+ which case using BIOS settings to disable the power saving would
+ be indicated.
+
+`S'
+ This mechanism uses `/proc/stat' on Linux to retrieve time (ticks)
+ spent in idle mode. It is thought but not known to be reasonably
+ accurate. The code for this mechanism can be found in
+ `src/netcpu_procstat.c'.
+
+`C'
+ A mechanism somewhat similar to `S' but using the sysctl() call on
+ BSD-like Operating systems (*BSD and MacOS X). The code for this
+ mechanism can be found in `src/netcpu_sysctl.c'.
+
+`Others'
+ Other mechanisms included in netperf in the past have included
+ using the times() and getrusage() calls. These calls are actually
+ rather poorly suited to the task of measuring CPU overhead for
+ networking as they tend to be process-specific and much
+ network-related processing can happen outside the context of a
+ process, in places where it is not a given it will be charged to
+ the correct, or even a process. They are mentioned here as a
+ warning to anyone seeing those mechanisms used in other networking
+ benchmarks. These mechanisms are not available in netperf 2.4.0
+ and later.
+
+ For many platforms, the configure script will chose the best
+available CPU utilization mechanism. However, some platforms have no
+particularly good mechanisms. On those platforms, it is probably best
+to use the "LOOPER" mechanism which is basically some number of
+processes (as many as there are processors) sitting in tight little
+loops counting as fast as they can. The rate at which the loopers
+count when the system is believed to be idle is compared with the rate
+when the system is running netperf and the ratio is used to compute CPU
+utilization.
+
+ In the past, netperf included some mechanisms that only reported CPU
+time charged to the calling process. Those mechanisms have been
+removed from netperf versions 2.4.0 and later because they are
+hopelessly inaccurate. Networking can and often results in CPU time
+being spent in places - such as interrupt contexts - that do not get
+charged to a or the correct process.
+
+ In fact, time spent in the processing of interrupts is a common issue
+for many CPU utilization mechanisms. In particular, the "PSTAT"
+mechanism was eventually known to have problems accounting for certain
+interrupt time prior to HP-UX 11.11 (11iv1). HP-UX 11iv1 and later are
+known to be good. The "KSTAT" mechanism is known to have problems on
+all versions of Solaris up to and including Solaris 10. Even the
+microstate accounting available via kstat in Solaris 10 has issues,
+though perhaps not as bad as those of prior versions.
+
+ The /proc/stat mechanism under Linux is in what the author would
+consider an "uncertain" category as it appears to be statistical, which
+may also have issues with time spent processing interrupts.
+
+ In summary, be sure to "sanity-check" the CPU utilization figures
+with other mechanisms. However, platform tools such as top, vmstat or
+mpstat are often based on the same mechanisms used by netperf.
+
+
+File: netperf.info, Node: Global Command-line Options, Next: Using Netperf to Measure Bulk Data Transfer, Prev: The Design of Netperf, Up: Top
+
+4 Global Command-line Options
+*****************************
+
+This section describes each of the global command-line options
+available in the netperf and netserver binaries. Essentially, it is an
+expanded version of the usage information displayed by netperf or
+netserver when invoked with the `-h' global command-line option.
+
+* Menu:
+
+* Command-line Options Syntax::
+* Global Options::
+
+
+File: netperf.info, Node: Command-line Options Syntax, Next: Global Options, Prev: Global Command-line Options, Up: Global Command-line Options
+
+4.1 Command-line Options Syntax
+===============================
+
+Revision 1.8 of netperf introduced enough new functionality to overrun
+the English alphabet for mnemonic command-line option names, and the
+author was not and is not quite ready to switch to the contemporary
+`--mumble' style of command-line options. (Call him a Luddite).
+
+ For this reason, the command-line options were split into two parts -
+the first are the global command-line options. They are options that
+affect nearly any and every test type of netperf. The second type are
+the test-specific command-line options. Both are entered on the same
+command line, but they must be separated from one another by a `--' for
+correct parsing. Global command-line options come first, followed by
+the `--' and then test-specific command-line options. If there are no
+test-specific options to be set, the `--' may be omitted. If there are
+no global command-line options to be set, test-specific options must
+still be preceded by a `--'. For example:
+ netperf <global> -- <test-specific>
+ sets both global and test-specific options:
+ netperf <global>
+ sets just global options and:
+ netperf -- <test-specific>
+ sets just test-specific options.
+
+
+File: netperf.info, Node: Global Options, Prev: Command-line Options Syntax, Up: Global Command-line Options
+
+4.2 Global Options
+==================
+
+`-a <sizespec>'
+ This option allows you to alter the alignment of the buffers used
+ in the sending and receiving calls on the local system.. Changing
+ the alignment of the buffers can force the system to use different
+ copy schemes, which can have a measurable effect on performance.
+ If the page size for the system were 4096 bytes, and you want to
+ pass page-aligned buffers beginning on page boundaries, you could
+ use `-a 4096'. By default the units are bytes, but suffix of "G,"
+ "M," or "K" will specify the units to be 2^30 (GB), 2^20 (MB) or
+ 2^10 (KB) respectively. A suffix of "g," "m" or "k" will specify
+ units of 10^9, 10^6 or 10^3 bytes respectively. [Default: 8 bytes]
+
+`-A <sizespec>'
+ This option is identical to the `-a' option with the difference
+ being it affects alignments for the remote system.
+
+`-b <size>'
+ This option is only present when netperf has been configure with
+ -enable-intervals=yes prior to compilation. It sets the size of
+ the burst of send calls in a _STREAM test. When used in
+ conjunction with the `-w' option it can cause the rate at which
+ data is sent to be "paced."
+
+`-B <string>'
+ This option will cause `<string>' to be appended to the brief (see
+ -P) output of netperf.
+
+`-c [rate]'
+ This option will ask that CPU utilization and service demand be
+ calculated for the local system. For those CPU utilization
+ mechanisms requiring calibration, the options rate parameter may
+ be specified to preclude running another calibration step, saving
+ 40 seconds of time. For those CPU utilization mechanisms
+ requiring no calibration, the optional rate parameter will be
+ utterly and completely ignored. [Default: no CPU measurements]
+
+`-C [rate]'
+ This option requests CPU utilization and service demand
+ calculations for the remote system. It is otherwise identical to
+ the `-c' option.
+
+`-d'
+ Each instance of this option will increase the quantity of
+ debugging output displayed during a test. If the debugging output
+ level is set high enough, it may have a measurable effect on
+ performance. Debugging information for the local system is
+ printed to stdout. Debugging information for the remote system is
+ sent by default to the file `/tmp/netperf.debug'. [Default: no
+ debugging output]
+
+`-D [interval,units]'
+ This option is only available when netperf is configured with
+ -enable-demo=yes. When set, it will cause netperf to emit periodic
+ reports of performance during the run. [INTERVAL,UNITS] follow
+ the semantics of an optionspec. If specified, INTERVAL gives the
+ minimum interval in real seconds, it does not have to be whole
+ seconds. The UNITS value can be used for the first guess as to
+ how many units of work (bytes or transactions) must be done to
+ take at least INTERVAL seconds. If omitted, INTERVAL defaults to
+ one second and UNITS to values specific to each test type.
+
+`-f G|M|K|g|m|k'
+ This option can be used to change the reporting units for _STREAM
+ tests. Arguments of "G," "M," or "K" will set the units to 2^30,
+ 2^20 or 2^10 bytes/s respectively (EG power of two GB, MB or KB).
+ Arguments of "g," ",m" or "k" will set the units to 10^9, 10^6 or
+ 10^3 bits/s respectively. [Default: 'm' or 10^6 bits/s]
+
+`-F <fillfile>'
+ This option specified the file from which send which buffers will
+ be pre-filled . While the buffers will contain data from the
+ specified file, the file is not fully transfered to the remote
+ system as the receiving end of the test will not write the
+ contents of what it receives to a file. This can be used to
+ pre-fill the send buffers with data having different
+ compressibility and so is useful when measuring performance over
+ mechanisms which perform compression.
+
+ While optional for most tests, this option is required for a test
+ utilizing the sendfile() or related calls because sendfile tests
+ need a name of a file to reference.
+
+`-h'
+ This option causes netperf to display its usage string and exit to
+ the exclusion of all else.
+
+`-H <optionspec>'
+ This option will set the name of the remote system and or the
+ address family used for the control connection. For example:
+ -H linger,4
+ will set the name of the remote system to "tardy" and tells
+ netperf to use IPv4 addressing only.
+ -H ,6
+ will leave the name of the remote system at its default, and
+ request that only IPv6 addresses be used for the control
+ connection.
+ -H lag
+ will set the name of the remote system to "lag" and leave the
+ address family to AF_UNSPEC which means selection of IPv4 vs IPv6
+ is left to the system's address resolution.
+
+ A value of "inet" can be used in place of "4" to request IPv4 only
+ addressing. Similarly, a value of "inet6" can be used in place of
+ "6" to request IPv6 only addressing. A value of "0" can be used
+ to request either IPv4 or IPv6 addressing as name resolution
+ dictates.
+
+ By default, the options set with the global `-H' option are
+ inherited by the test for its data connection, unless a
+ test-specific `-H' option is specified.
+
+ If a `-H' option follows either the `-4' or `-6' options, the
+ family setting specified with the -H option will override the `-4'
+ or `-6' options for the remote address family. If no address
+ family is specified, settings from a previous `-4' or `-6' option
+ will remain. In a nutshell, the last explicit global command-line
+ option wins.
+
+ [Default: "localhost" for the remote name/IP address and "0" (eg
+ AF_UNSPEC) for the remote address family.]
+
+`-I <optionspec>'
+ This option enables the calculation of confidence intervals and
+ sets the confidence and width parameters with the first have of the
+ optionspec being either 99 or 95 for 99% or 95% confidence
+ respectively. The second value of the optionspec specifies the
+ width of the desired confidence interval. For example
+ -I 99,5
+ asks netperf to be 99% confident that the measured mean values for
+ throughput and CPU utilization are within +/- 2.5% of the "real"
+ mean values. If the `-i' option is specified and the `-I' option
+ is omitted, the confidence defaults to 99% and the width to 5%
+ (giving +/- 2.5%)
+
+ If netperf calculates that the desired confidence intervals have
+ not been met, it emits a noticeable warning that cannot be
+ suppressed with the `-P' or `-v' options:
+
+ netperf -H tardy.cup -i 3 -I 99,5
+ TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to tardy.cup.hp.com (15.244.44.58) port 0 AF_INET : +/-2.5% 99% conf.
+ !!! WARNING
+ !!! Desired confidence was not achieved within the specified iterations.
+ !!! This implies that there was variability in the test environment that
+ !!! must be investigated before going further.
+ !!! Confidence intervals: Throughput : 6.8%
+ !!! Local CPU util : 0.0%
+ !!! Remote CPU util : 0.0%
+
+ Recv Send Send
+ Socket Socket Message Elapsed
+ Size Size Size Time Throughput
+ bytes bytes bytes secs. 10^6bits/sec
+
+ 32768 16384 16384 10.01 40.23
+
+ Where we see that netperf did not meet the desired convidence
+ intervals. Instead of being 99% confident it was within +/- 2.5%
+ of the real mean value of throughput it is only confident it was
+ within +/-3.4%. In this example, increasing the `-i' option
+ (described below) and/or increasing the iteration length with the
+ `-l' option might resolve the situation.
+
+`-i <sizespec>'
+ This option enables the calculation of confidence intervals and
+ sets the minimum and maximum number of iterations to run in
+ attempting to achieve the desired confidence interval. The first
+ value sets the maximum number of iterations to run, the second,
+ the minimum. The maximum number of iterations is silently capped
+ at 30 and the minimum is silently floored at 3. Netperf repeats
+ the measurement the minimum number of iterations and continues
+ until it reaches either the desired confidence interval, or the
+ maximum number of iterations, whichever comes first.
+
+ If the `-I' option is specified and the `-i' option omitted the
+ maximum number of iterations is set to 10 and the minimum to three.
+
+ If netperf determines that the desired confidence intervals have
+ not been met, it emits a noticeable warning.
+
+ The total test time will be somewhere between the minimum and
+ maximum number of iterations multiplied by the test length
+ supplied by the `-l' option.
+
+`-l testlen'
+ This option controls the length of any one iteration of the
+ requested test. A positive value for TESTLEN will run each
+ iteration of the test for at least TESTLEN seconds. A negative
+ value for TESTLEN will run each iteration for the absolute value of
+ TESTLEN transactions for a _RR test or bytes for a _STREAM test.
+ Certain tests, notably those using UDP can only be timed, they
+ cannot be limited by transaction or byte count.
+
+ In some situations, individual iterations of a test may run for
+ longer for the number of seconds specified by the `-l' option. In
+ particular, this may occur for those tests where the socket buffer
+ size(s) are significantly longer than the bandwidthXdelay product
+ of the link(s) over which the data connection passes, or those
+ tests where there may be non-trivial numbers of retransmissions.
+
+ If confidence intervals are enabled via either `-I' or `-i' the
+ total length of the netperf test will be somewhere between the
+ minimum and maximum iteration count multiplied by TESTLEN.
+
+`-L <optionspec>'
+ This option is identical to the `-H' option with the difference
+ being it sets the _local_ hostname/IP and/or address family
+ information. This option is generally unnecessary, but can be
+ useful when you wish to make sure that the netperf control and data
+ connections go via different paths. It can also come-in handy if
+ one is trying to run netperf through those evil, end-to-end
+ breaking things known as firewalls.
+
+ [Default: 0.0.0.0 (eg INADDR_ANY) for IPv4 and ::0 for IPv6 for the
+ local name. AF_UNSPEC for the local address family.]
+
+`-n numcpus'
+ This option tells netperf how many CPUs it should ass-u-me are
+ active on the system running netperf. In particular, this is used
+ for the *Note CPU utilization: CPU Utilization. and service demand
+ calculations. On certain systems, netperf is able to determine
+ the number of CPU's automagically. This option will override any
+ number netperf might be able to determine on its own.
+
+ Note that this option does _not_ set the number of CPUs on the
+ system running netserver. When netperf/netserver cannot
+ automagically determine the number of CPUs that can only be set
+ for netserver via a netserver `-n' command-line option.
+
+`-N'
+ This option tells netperf to forego establishing a control
+ connection. This makes it is possible to run some limited netperf
+ tests without a corresponding netserver on the remote system.
+
+ With this option set, the test to be run is to get all the
+ addressing information it needs to establish its data connection
+ from the command line or internal defaults. If not otherwise
+ specified by test-specific command line options, the data
+ connection for a "STREAM" or "SENDFILE" test will be to the
+ "discard" port, an "RR" test will be to the "echo" port, and a
+ "MEARTS" test will be to the chargen port.
+
+ The response size of an "RR" test will be silently set to be the
+ same as the request size. Otherwise the test would hang if the
+ response size was larger than the request size, or would report an
+ incorrect, inflated transaction rate if the response size was less
+ than the request size.
+
+ Since there is no control connection when this option is
+ specified, it is not possible to set "remote" properties such as
+ socket buffer size and the like via the netperf command line. Nor
+ is it possible to retrieve such interesting remote information as
+ CPU utilization. These items will be set to values which when
+ displayed should make it immediately obvious that was the case.
+
+ The only way to change remote characteristics such as socket buffer
+ size or to obtain information such as CPU utilization is to employ
+ platform-specific methods on the remote system. Frankly, if one
+ has access to the remote system to employ those methods one aught
+ to be able to run a netserver there. However, that ability may
+ not be present in certain "support" situations, hence the addition
+ of this option.
+
+ Added in netperf 2.4.3.
+
+`-o <sizespec>'
+ The value(s) passed-in with this option will be used as an offset
+ added to the alignment specified with the `-a' option. For
+ example:
+ -o 3 -a 4096
+ will cause the buffers passed to the local send and receive calls
+ to begin three bytes past an address aligned to 4096 bytes.
+ [Default: 0 bytes]
+
+`-O <sizespec>'
+ This option behaves just as the `-o' option but on the remote
+ system and in conjunction with the `-A' option. [Default: 0 bytes]
+
+`-p <optionspec>'
+ The first value of the optionspec passed-in with this option tells
+ netperf the port number at which it should expect the remote
+ netserver to be listening for control connections. The second
+ value of the optionspec will request netperf to bind to that local
+ port number before establishing the control connection. For
+ example
+ -p 12345
+ tells netperf that the remote netserver is listening on port 12345
+ and leaves selection of the local port number for the control
+ connection up to the local TCP/IP stack whereas
+ -p ,32109
+ leaves the remote netserver port at the default value of 12865 and
+ causes netperf to bind to the local port number 32109 before
+ connecting to the remote netserver.
+
+ In general, setting the local port number is only necessary when
+ one is looking to run netperf through those evil, end-to-end
+ breaking things known as firewalls.
+
+`-P 0|1'
+ A value of "1" for the `-P' option will enable display of the test
+ banner. A value of "0" will disable display of the test banner.
+ One might want to disable display of the test banner when running
+ the same basic test type (eg TCP_STREAM) multiple times in
+ succession where the test banners would then simply be redundant
+ and unnecessarily clutter the output. [Default: 1 - display test
+ banners]
+
+`-t testname'
+ This option is used to tell netperf which test you wish to run.
+ As of this writing, valid values for TESTNAME include:
+ * *Note TCP_STREAM::, *Note TCP_MAERTS::, *Note TCP_SENDFILE::,
+ *Note TCP_RR::, *Note TCP_CRR::, *Note TCP_CC::
+
+ * *Note UDP_STREAM::, *Note UDP_RR::
+
+ * *Note XTI_TCP_STREAM::, *Note XTI_TCP_RR::, *Note
+ XTI_TCP_CRR::, *Note XTI_TCP_CC::
+
+ * *Note XTI_UDP_STREAM::, *Note XTI_UDP_RR::
+
+ * *Note SCTP_STREAM::, *Note SCTP_RR::
+
+ * *Note DLCO_STREAM::, *Note DLCO_RR::, *Note DLCL_STREAM::,
+ *Note DLCL_RR::
+
+ * *Note LOC_CPU: Other Netperf Tests, *Note REM_CPU: Other
+ Netperf Tests.
+ Not all tests are always compiled into netperf. In particular, the
+ "XTI," "SCTP," "UNIX," and "DL*" tests are only included in
+ netperf when configured with `--enable-[xti|sctp|unix|dlpi]=yes'.
+
+ Netperf only runs one type of test no matter how many `-t' options
+ may be present on the command-line. The last `-t' global
+ command-line option will determine the test to be run. [Default:
+ TCP_STREAM]
+
+`-v verbosity'
+ This option controls how verbose netperf will be in its output,
+ and is often used in conjunction with the `-P' option. If the
+ verbosity is set to a value of "0" then only the test's SFM (Single
+ Figure of Merit) is displayed. If local *Note CPU utilization:
+ CPU Utilization. is requested via the `-c' option then the SFM is
+ the local service demand. Othersise, if remote CPU utilization is
+ requested via the `-C' option then the SFM is the remote service
+ demand. If neither local nor remote CPU utilization are requested
+ the SFM will be the measured throughput or transaction rate as
+ implied by the test specified with the `-t' option.
+
+ If the verbosity level is set to "1" then the "normal" netperf
+ result output for each test is displayed.
+
+ If the verbosity level is set to "2" then "extra" information will
+ be displayed. This may include, but is not limited to the number
+ of send or recv calls made and the average number of bytes per
+ send or recv call, or a histogram of the time spent in each send()
+ call or for each transaction if netperf was configured with
+ `--enable-histogram=yes'. [Default: 1 - normal verbosity]
+
+`-w time'
+ If netperf was configured with `--enable-intervals=yes' then this
+ value will set the inter-burst time to time milliseconds, and the
+ `-b' option will set the number of sends per burst. The actual
+ inter-burst time may vary depending on the system's timer
+ resolution.
+
+`-W <sizespec>'
+ This option controls the number of buffers in the send (first or
+ only value) and or receive (second or only value) buffer rings.
+ Unlike some benchmarks, netperf does not continuously send or
+ receive from a single buffer. Instead it rotates through a ring of
+ buffers. [Default: One more than the size of the send or receive
+ socket buffer sizes (`-s' and/or `-S' options) divided by the send
+ `-m' or receive `-M' buffer size respectively]
+
+`-4'
+ Specifying this option will set both the local and remote address
+ families to AF_INET - that is use only IPv4 addresses on the
+ control connection. This can be overridden by a subsequent `-6',
+ `-H' or `-L' option. Basically, the last option explicitly
+ specifying an address family wins. Unless overridden by a
+ test-specific option, this will be inherited for the data
+ connection as well.
+
+`-6'
+ Specifying this option will set both local and and remote address
+ families to AF_INET6 - that is use only IPv6 addresses on the
+ control connection. This can be overridden by a subsequent `-4',
+ `-H' or `-L' option. Basically, the last address family
+ explicitly specified wins. Unless overridden by a test-specific
+ option, this will be inherited for the data connection as well.
+
+
+
+File: netperf.info, Node: Using Netperf to Measure Bulk Data Transfer, Next: Using Netperf to Measure Request/Response, Prev: Global Command-line Options, Up: Top
+
+5 Using Netperf to Measure Bulk Data Transfer
+*********************************************
+
+The most commonly measured aspect of networked system performance is
+that of bulk or unidirectional transfer performance. Everyone wants to
+know how many bits or bytes per second they can push across the
+network. The netperf convention for a bulk data transfer test name is
+to tack a "_STREAM" suffix to a test name.
+
+* Menu:
+
+* Issues in Bulk Transfer::
+* Options common to TCP UDP and SCTP tests::
+
+
+File: netperf.info, Node: Issues in Bulk Transfer, Next: Options common to TCP UDP and SCTP tests, Prev: Using Netperf to Measure Bulk Data Transfer, Up: Using Netperf to Measure Bulk Data Transfer
+
+5.1 Issues in Bulk Transfer
+===========================
+
+There are any number of things which can affect the performance of a
+bulk transfer test.
+
+ Certainly, absent compression, bulk-transfer tests can be limited by
+the speed of the slowest link in the path from the source to the
+destination. If testing over a gigabit link, you will not see more
+than a gigabit :) Such situations can be described as being
+"network-limited" or "NIC-limited".
+
+ CPU utilization can also affect the results of a bulk-transfer test.
+If the networking stack requires a certain number of instructions or
+CPU cycles per KB of data transferred, and the CPU is limited in the
+number of instructions or cycles it can provide, then the transfer can
+be described as being "CPU-bound".
+
+ A bulk-transfer test can be CPU bound even when netperf reports less
+than 100% CPU utilization. This can happen on an MP system where one
+or more of the CPUs saturate at 100% but other CPU's remain idle.
+Typically, a single flow of data, such as that from a single instance
+of a netperf _STREAM test cannot make use of much more than the power
+of one CPU. Exceptions to this generally occur when netperf and/or
+netserver run on CPU(s) other than the CPU(s) taking interrupts from
+the NIC(s).
+
+ Distance and the speed-of-light can affect performance for a
+bulk-transfer; often this can be mitigated by using larger windows.
+One common limit to the performance of a transport using window-based
+flow-control is:
+ Throughput <= WindowSize/RoundTripTime
+ As the sender can only have a window's-worth of data outstanding on
+the network at any one time, and the soonest the sender can receive a
+window update from the receiver is one RoundTripTime (RTT). TCP and
+SCTP are examples of such protocols.
+
+ Packet losses and their effects can be particularly bad for
+performance. This is especially true if the packet losses result in
+retransmission timeouts for the protocol(s) involved. By the time a
+retransmission timeout has happened, the flow or connection has sat
+idle for a considerable length of time.
+
+ On many platforms, some variant on the `netstat' command can be used
+to retrieve statistics about packet loss and retransmission. For
+example:
+ netstat -p tcp
+ will retrieve TCP statistics on the HP-UX Operating System. On other
+platforms, it may not be possible to retrieve statistics for a specific
+protocol and something like:
+ netstat -s
+ would be used instead.
+
+ Many times, such network statistics are keep since the time the stack
+started, and we are only really interested in statistics from when
+netperf was running. In such situations something along the lines of:
+ netstat -p tcp > before
+ netperf -t TCP_mumble...
+ netstat -p tcp > after
+ is indicated. The beforeafter
+(ftp://ftp.cup.hp.com/dist/networking/tools/) utility can be used to
+subtract the statistics in `before' from the statistics in `after'
+ beforeafter before after > delta
+ and then one can look at the statistics in `delta'. Beforeafter is
+distributed in source form so one can compile it on the platofrm(s) of
+interest.
+
+ While it was written with HP-UX's netstat in mind, the annotated
+netstat
+(ftp://ftp.cup.hp.com/dist/networking/briefs/annotated_netstat.txt)
+writeup may be helpful with other platforms as well.
+
+
+File: netperf.info, Node: Options common to TCP UDP and SCTP tests, Prev: Issues in Bulk Transfer, Up: Using Netperf to Measure Bulk Data Transfer
+
+5.2 Options common to TCP UDP and SCTP tests
+============================================
+
+Many "test-specific" options are actually common across the different
+tests. For those tests involving TCP, UDP and SCTP, whether using the
+BSD Sockets or the XTI interface those common options include:
+
+`-h'
+ Display the test-suite-specific usage string and exit. For a TCP_
+ or UDP_ test this will be the usage string from the source file
+ nettest_bsd.c. For an XTI_ test, this will be the usage string
+ from the source file nettest_xti.c. For an SCTP test, this will
+ be the usage string from the source file nettest_sctp.c.
+
+`-H <optionspec>'
+ Normally, the remote hostname|IP and address family information is
+ inherited from the settings for the control connection (eg global
+ command-line `-H', `-4' and/or `-6' options). The test-specific
+ `-H' will override those settings for the data (aka test)
+ connection only. Settings for the control connection are left
+ unchanged.
+
+`-L <optionspec>'
+ The test-specific `-L' option is identical to the test-specific
+ `-H' option except it affects the local hostname|IP and address
+ family information. As with its global command-line counterpart,
+ this is generally only useful when measuring though those evil,
+ end-to-end breaking things called firewalls.
+
+`-m bytes'
+ Set the size of the buffer passed-in to the "send" calls of a
+ _STREAM test. Note that this may have only an indirect effect on
+ the size of the packets sent over the network, and certain Layer 4
+ protocols do _not_ preserve or enforce message boundaries, so
+ setting `-m' for the send size does not necessarily mean the
+ receiver will receive that many bytes at any one time. By default
+ the units are bytes, but suffix of "G," "M," or "K" will specify
+ the units to be 2^30 (GB), 2^20 (MB) or 2^10 (KB) respectively. A
+ suffix of "g," "m" or "k" will specify units of 10^9, 10^6 or 10^3
+ bytes respectively. For example:
+ `-m 32K'
+ will set the size to 32KB or 32768 bytes. [Default: the local send
+ socket buffer size for the connection - either the system's
+ default or the value set via the `-s' option.]
+
+`-M bytes'
+ Set the size of the buffer passed-in to the "recv" calls of a
+ _STREAM test. This will be an upper bound on the number of bytes
+ received per receive call. By default the units are bytes, but
+ suffix of "G," "M," or "K" will specify the units to be 2^30 (GB),
+ 2^20 (MB) or 2^10 (KB) respectively. A suffix of "g," "m" or "k"
+ will specify units of 10^9, 10^6 or 10^3 bytes respectively. For
+ example:
+ `-M 32K'
+ will set the size to 32KB or 32768 bytes. [Default: the remote
+ receive socket buffer size for the data connection - either the
+ system's default or the value set via the `-S' option.]
+
+`-P <optionspec>'
+ Set the local and/or remote port numbers for the data connection.
+
+`-s <sizespec>'
+ This option sets the local send and receive socket buffer sizes for
+ the data connection to the value(s) specified. Often, this will
+ affect the advertised and/or effective TCP or other window, but on
+ some platforms it may not. By default the units are bytes, but
+ suffix of "G," "M," or "K" will specify the units to be 2^30 (GB),
+ 2^20 (MB) or 2^10 (KB) respectively. A suffix of "g," "m" or "k"
+ will specify units of 10^9, 10^6 or 10^3 bytes respectively. For
+ example:
+ `-s 128K'
+ Will request the local send and receive socket buffer sizes to be
+ 128KB or 131072 bytes.
+
+ While the historic expectation is that setting the socket buffer
+ size has a direct effect on say the TCP window, today that may not
+ hold true for all stacks. Further, while the historic expectation
+ is that the value specified in a setsockopt() call will be the
+ value returned via a getsockopt() call, at least one stack is
+ known to deliberately ignore history. When running under Windows
+ a value of 0 may be used which will be an indication to the stack
+ the user wants to enable a form of copy avoidance. [Default: -1 -
+ use the system's default socket buffer sizes]
+
+`-S <sizespec>'
+ This option sets the remote send and/or receive socket buffer sizes
+ for the data connection to the value(s) specified. Often, this
+ will affect the advertised and/or effective TCP or other window,
+ but on some platforms it may not. By default the units are bytes,
+ but suffix of "G," "M," or "K" will specify the units to be 2^30
+ (GB), 2^20 (MB) or 2^10 (KB) respectively. A suffix of "g," "m"
+ or "k" will specify units of 10^9, 10^6 or 10^3 bytes respectively.
+ For example:
+ `-s 128K'
+ Will request the local send and receive socket buffer sizes to be
+ 128KB or 131072 bytes.
+
+ While the historic expectation is that setting the socket buffer
+ size has a direct effect on say the TCP window, today that may not
+ hold true for all stacks. Further, while the historic expectation
+ is that the value specified in a setsockopt() call will be the
+ value returned via a getsockopt() call, at least one stack is
+ known to deliberately ignore history. When running under Windows
+ a value of 0 may be used which will be an indication to the stack
+ the user wants to enable a form of copy avoidance. [Default: -1 -
+ use the system's default socket buffer sizes]
+
+`-4'
+ Set the local and remote address family for the data connection to
+ AF_INET - ie use IPv4 addressing only. Just as with their global
+ command-line counterparts the last of the `-4', `-6', `-H' or `-L'
+ option wins for their respective address families.
+
+`-6'
+ This option is identical to its `-4' cousin, but requests IPv6
+ addresses for the local and remote ends of the data connection.
+
+
+* Menu:
+
+* TCP_STREAM::
+* TCP_MAERTS::
+* TCP_SENDFILE::
+* UDP_STREAM::
+* XTI_TCP_STREAM::
+* XTI_UDP_STREAM::
+* SCTP_STREAM::
+* DLCO_STREAM::
+* DLCL_STREAM::
+* STREAM_STREAM::
+* DG_STREAM::
+
+
+File: netperf.info, Node: TCP_STREAM, Next: TCP_MAERTS, Prev: Options common to TCP UDP and SCTP tests, Up: Options common to TCP UDP and SCTP tests
+
+5.2.1 TCP_STREAM
+----------------
+
+The TCP_STREAM test is the default test in netperf. It is quite
+simple, transferring some quantity of data from the system running
+netperf to the system running netserver. While time spent establishing
+the connection is not included in the throughput calculation, time
+spent flushing the last of the data to the remote at the end of the
+test is. This is how netperf knows that all the data it sent was
+received by the remote. In addition to the *Note options common to
+STREAM tests: Options common to TCP UDP and SCTP tests, the following
+test-specific options can be included to possibly alter the behavior of
+the test:
+
+`-C'
+ This option will set TCP_CORK mode on the data connection on those
+ systems where TCP_CORK is defined (typically Linux). A full
+ description of TCP_CORK is beyond the scope of this manual, but in
+ a nutshell it forces sub-MSS sends to be buffered so every segment
+ sent is Maximum Segment Size (MSS) unless the application performs
+ an explicit flush operation or the connection is closed. At
+ present netperf does not perform any explicit flush operations.
+ Setting TCP_CORK may improve the bitrate of tests where the "send
+ size" (`-m' option) is smaller than the MSS. It should also
+ improve (make smaller) the service demand.
+
+ The Linux tcp(7) manpage states that TCP_CORK cannot be used in
+ conjunction with TCP_NODELAY (set via the `-d' option), however
+ netperf does not validate command-line options to enforce that.
+
+`-D'
+ This option will set TCP_NODELAY on the data connection on those
+ systems where TCP_NODELAY is defined. This disables something
+ known as the Nagle Algorithm, which is intended to make the
+ segments TCP sends as large as reasonably possible. Setting
+ TCP_NODELAY for a TCP_STREAM test should either have no effect
+ when the send size (`-m' option) is larger than the MSS or will
+ decrease reported bitrate and increase service demand when the
+ send size is smaller than the MSS. This stems from TCP_NODELAY
+ causing each sub-MSS send to be its own TCP segment rather than
+ being aggregated with other small sends. This means more trips up
+ and down the protocol stack per KB of data transferred, which
+ means greater CPU utilization.
+
+ If setting TCP_NODELAY with `-D' affects throughput and/or service
+ demand for tests where the send size (`-m') is larger than the MSS
+ it suggests the TCP/IP stack's implementation of the Nagle
+ Algorithm _may_ be broken, perhaps interpreting the Nagle
+ Algorithm on a segment by segment basis rather than the proper user
+ send by user send basis. However, a better test of this can be
+ achieved with the *Note TCP_RR:: test.
+
+
+ Here is an example of a basic TCP_STREAM test, in this case from a
+Debian Linux (2.6 kernel) system to an HP-UX 11iv2 (HP-UX 11.23) system:
+
+ $ netperf -H lag
+ TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to lag.hpl.hp.com (15.4.89.214) port 0 AF_INET
+ Recv Send Send
+ Socket Socket Message Elapsed
+ Size Size Size Time Throughput
+ bytes bytes bytes secs. 10^6bits/sec
+
+ 32768 16384 16384 10.00 80.42
+
+ We see that the default receive socket buffer size for the receiver
+(lag - HP-UX 11.23) is 32768 bytes, and the default socket send buffer
+size for the sender (Debian 2.6 kernel) is 16384 bytes. Througput is
+expressed as 10^6 (aka Mega) bits per second, and the test ran for 10
+seconds. IPv4 addresses (AF_INET) were used.
+
+
+File: netperf.info, Node: TCP_MAERTS, Next: TCP_SENDFILE, Prev: TCP_STREAM, Up: Options common to TCP UDP and SCTP tests
+
+5.2.2 TCP_MAERTS
+----------------
+
+A TCP_MAERTS (MAERTS is STREAM backwards) test is "just like" a *Note
+TCP_STREAM:: test except the data flows from the netserver to the
+netperf. The global command-line `-F' option is ignored for this test
+type. The test-specific command-line `-C' option is ignored for this
+test type.
+
+ Here is an example of a TCP_MAERTS test between the same two systems
+as in the example for the *Note TCP_STREAM:: test. This time we request
+larger socket buffers with `-s' and `-S' options:
+
+ $ netperf -H lag -t TCP_MAERTS -- -s 128K -S 128K
+ TCP MAERTS TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to lag.hpl.hp.com (15.4.89.214) port 0 AF_INET
+ Recv Send Send
+ Socket Socket Message Elapsed
+ Size Size Size Time Throughput
+ bytes bytes bytes secs. 10^6bits/sec
+
+ 221184 131072 131072 10.03 81.14
+
+ Where we see that Linux, unlike HP-UX, may not return the same value
+in a getsockopt() as was requested in the prior setsockopt().
+
+ This test is included more for benchmarking convenience than anything
+else.
+
+
+File: netperf.info, Node: TCP_SENDFILE, Next: UDP_STREAM, Prev: TCP_MAERTS, Up: Options common to TCP UDP and SCTP tests
+
+5.2.3 TCP_SENDFILE
+------------------
+
+The TCP_SENDFILE test is "just like" a *Note TCP_STREAM:: test except
+netperf the platform's `sendfile()' call instead of calling `send()'.
+Often this results in a "zero-copy" operation where data is sent
+directly from the filesystem buffer cache. This _should_ result in
+lower CPU utilization and possibly higher throughput. If it does not,
+then you may want to contact your vendor(s) because they have a problem
+on their hands.
+
+ Zero-copy mechanisms may also alter the characteristics (size and
+number of buffers per) of packets passed to the NIC. In many stacks,
+when a copy is performed, the stack can "reserve" space at the
+beginning of the destination buffer for things like TCP, IP and Link
+headers. This then has the packet contained in a single buffer which
+can be easier to DMA to the NIC. When no copy is performed, there is
+no opportunity to reserve space for headers and so a packet will be
+contained in two or more buffers.
+
+ The *Note global `-F' option: Global Options. is required for this
+test and it must specify a file of at least the size of the send ring
+(*Note the global `-W' option: Global Options.) multiplied by the send
+size (*Note the test-specific `-m' option: Options common to TCP UDP
+and SCTP tests.). All other TCP-specific options are available and
+optional.
+
+ In this first example:
+ $ netperf -H lag -F ../src/netperf -t TCP_SENDFILE -- -s 128K -S 128K
+ TCP SENDFILE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to lag.hpl.hp.com (15.4.89.214) port 0 AF_INET
+ alloc_sendfile_buf_ring: specified file too small.
+ file must be larger than send_width * send_size
+
+ we see what happens when the file is too small. Here:
+
+ $ ../src/netperf -H lag -F /boot/vmlinuz-2.6.8-1-686 -t TCP_SENDFILE -- -s 128K -S 128K
+ TCP SENDFILE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to lag.hpl.hp.com (15.4.89.214) port 0 AF_INET
+ Recv Send Send
+ Socket Socket Message Elapsed
+ Size Size Size Time Throughput
+ bytes bytes bytes secs. 10^6bits/sec
+
+ 131072 221184 221184 10.02 81.83
+
+ we resolve that issue by selecting a larger file.
+
+
+File: netperf.info, Node: UDP_STREAM, Next: XTI_TCP_STREAM, Prev: TCP_SENDFILE, Up: Options common to TCP UDP and SCTP tests
+
+5.2.4 UDP_STREAM
+----------------
+
+A UDP_STREAM test is similar to a *Note TCP_STREAM:: test except UDP is
+used as the transport rather than TCP.
+
+ A UDP_STREAM test has no end-to-end flow control - UDP provides none
+and neither does netperf. However, if you wish, you can configure
+netperf with `--enable-intervals=yes' to enable the global command-line
+`-b' and `-w' options to pace bursts of traffic onto the network.
+
+ This has a number of implications.
+
+ The biggest of these implications is the data which is sent might not
+be received by the remote. For this reason, the output of a UDP_STREAM
+test shows both the sending and receiving throughput. On some
+platforms, it may be possible for the sending throughput to be reported
+as a value greater than the maximum rate of the link. This is common
+when the CPU(s) are faster than the network and there is no
+"intra-stack" flow-control.
+
+ Here is an example of a UDP_STREAM test between two systems connected
+by a 10 Gigabit Ethernet link:
+ $ netperf -t UDP_STREAM -H 192.168.2.125 -- -m 32768
+ UDP UNIDIRECTIONAL SEND TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.2.125 (192.168.2.125) port 0 AF_INET
+ Socket Message Elapsed Messages
+ Size Size Time Okay Errors Throughput
+ bytes bytes secs # # 10^6bits/sec
+
+ 124928 32768 10.00 105672 0 2770.20
+ 135168 10.00 104844 2748.50
+
+ The first line of numbers are statistics from the sending (netperf)
+side. The second line of numbers are from the receiving (netserver)
+side. In this case, 105672 - 104844 or 828 messages did not make it
+all the way to the remote netserver process.
+
+ If the value of the `-m' option is larger than the local send socket
+buffer size (`-s' option) netperf will likely abort with an error
+message about how the send call failed:
+
+ netperf -t UDP_STREAM -H 192.168.2.125
+ UDP UNIDIRECTIONAL SEND TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.2.125 (192.168.2.125) port 0 AF_INET
+ udp_send: data send error: Message too long
+
+ If the value of the `-m' option is larger than the remote socket
+receive buffer, the reported receive throughput will likely be zero as
+the remote UDP will discard the messages as being too large to fit into
+the socket buffer.
+
+ $ netperf -t UDP_STREAM -H 192.168.2.125 -- -m 65000 -S 32768
+ UDP UNIDIRECTIONAL SEND TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.2.125 (192.168.2.125) port 0 AF_INET
+ Socket Message Elapsed Messages
+ Size Size Time Okay Errors Throughput
+ bytes bytes secs # # 10^6bits/sec
+
+ 124928 65000 10.00 53595 0 2786.99
+ 65536 10.00 0 0.00
+
+ The example above was between a pair of systems running a "Linux"
+kernel. Notice that the remote Linux system returned a value larger
+than that passed-in to the `-S' option. In fact, this value was larger
+than the message size set with the `-m' option. That the remote socket
+buffer size is reported as 65536 bytes would suggest to any sane person
+that a message of 65000 bytes would fit, but the socket isn't _really_
+65536 bytes, even though Linux is telling us so. Go figure.
+
+
+File: netperf.info, Node: XTI_TCP_STREAM, Next: XTI_UDP_STREAM, Prev: UDP_STREAM, Up: Options common to TCP UDP and SCTP tests
+
+5.2.5 XTI_TCP_STREAM
+--------------------
+
+An XTI_TCP_STREAM test is simply a *Note TCP_STREAM:: test using the XTI
+rather than BSD Sockets interface. The test-specific `-X <devspec>'
+option can be used to specify the name of the local and/or remote XTI
+device files, which is required by the `t_open()' call made by netperf
+XTI tests.
+
+ The XTI_TCP_STREAM test is only present if netperf was configured
+with `--enable-xti=yes'. The remote netserver must have also been
+configured with `--enable-xti=yes'.
+
+
+File: netperf.info, Node: XTI_UDP_STREAM, Next: SCTP_STREAM, Prev: XTI_TCP_STREAM, Up: Options common to TCP UDP and SCTP tests
+
+5.2.6 XTI_UDP_STREAM
+--------------------
+
+An XTI_UDP_STREAM test is simply a *Note UDP_STREAM:: test using the XTI
+rather than BSD Sockets Interface. The test-specific `-X <devspec>'
+option can be used to specify the name of the local and/or remote XTI
+device files, which is required by the `t_open()' call made by netperf
+XTI tests.
+
+ The XTI_UDP_STREAM test is only present if netperf was configured
+with `--enable-xti=yes'. The remote netserver must have also been
+configured with `--enable-xti=yes'.
+
+
+File: netperf.info, Node: SCTP_STREAM, Next: DLCO_STREAM, Prev: XTI_UDP_STREAM, Up: Options common to TCP UDP and SCTP tests
+
+5.2.7 SCTP_STREAM
+-----------------
+
+An SCTP_STREAM test is essentially a *Note TCP_STREAM:: test using the
+SCTP rather than TCP. The `-D' option will set SCTP_NODELAY, which is
+much like the TCP_NODELAY option for TCP. The `-C' option is not
+applicable to an SCTP test as there is no corresponding SCTP_CORK
+option. The author is still figuring-out what the test-specific `-N'
+option does :)
+
+ The SCTP_STREAM test is only present if netperf was configured with
+`--enable-sctp=yes'. The remote netserver must have also been
+configured with `--enable-sctp=yes'.
+
+
+File: netperf.info, Node: DLCO_STREAM, Next: DLCL_STREAM, Prev: SCTP_STREAM, Up: Options common to TCP UDP and SCTP tests
+
+5.2.8 DLCO_STREAM
+-----------------
+
+A DLPI Connection Oriented Stream (DLCO_STREAM) test is very similar in
+concept to a *Note TCP_STREAM:: test. Both use reliable,
+connection-oriented protocols. The DLPI test differs from the TCP test
+in that its protocol operates only at the link-level and does not
+include TCP-style segmentation and reassembly. This last difference
+means that the value passed-in with the `-m' option must be less than
+the interface MTU. Otherwise, the `-m' and `-M' options are just like
+their TCP/UDP/SCTP counterparts.
+
+ Other DLPI-specific options include:
+
+`-D <devspec>'
+ This option is used to provide the fully-qualified names for the
+ local and/or remote DPLI device files. The syntax is otherwise
+ identical to that of a "sizespec".
+
+`-p <ppaspec>'
+ This option is used to specify the local and/or remote DLPI PPA(s).
+ The PPA is used to identify the interface over which traffic is to
+ be sent/received. The syntax of a "ppaspec" is otherwise the same
+ as a "sizespec".
+
+`-s sap'
+ This option specifies the 802.2 SAP for the test. A SAP is
+ somewhat like either the port field of a TCP or UDP header or the
+ protocol field of an IP header. The specified SAP should not
+ conflict with any other active SAPs on the specified PPA's (`-p'
+ option).
+
+`-w <sizespec>'
+ This option specifies the local send and receive window sizes in
+ units of frames on those platforms which support setting such
+ things.
+
+`-W <sizespec>'
+ This option specifies the remote send and receive window sizes in
+ units of frames on those platforms which support setting such
+ things.
+
+ The DLCO_STREAM test is only present if netperf was configured with
+`--enable-dlpi=yes'. The remote netserver must have also been
+configured with `--enable-dlpi=yes'.
+
+
+File: netperf.info, Node: DLCL_STREAM, Next: STREAM_STREAM, Prev: DLCO_STREAM, Up: Options common to TCP UDP and SCTP tests
+
+5.2.9 DLCL_STREAM
+-----------------
+
+A DLPI ConnectionLess Stream (DLCL_STREAM) test is analogous to a *Note
+UDP_STREAM:: test in that both make use of unreliable/best-effort,
+connection-less transports. The DLCL_STREAM test differs from the
+*Note UDP_STREAM:: test in that the message size (`-m' option) must
+always be less than the link MTU as there is no IP-like fragmentation
+and reassembly available and netperf does not presume to provide one.
+
+ The test-specific command-line options for a DLCL_STREAM test are the
+same as those for a *Note DLCO_STREAM:: test.
+
+ The DLCL_STREAM test is only present if netperf was configured with
+`--enable-dlpi=yes'. The remote netserver must have also been
+configured with `--enable-dlpi=yes'.
+
+
+File: netperf.info, Node: STREAM_STREAM, Next: DG_STREAM, Prev: DLCL_STREAM, Up: Options common to TCP UDP and SCTP tests
+
+5.2.10 STREAM_STREAM
+--------------------
+
+A Unix Domain Stream Socket Stream test (STREAM_STREAM) is similar in
+concept to a *Note TCP_STREAM:: test, but using Unix Domain sockets.
+It is, naturally, limited to intra-machine traffic. A STREAM_STREAM
+test shares the `-m', `-M', `-s' and `-S' options of the other _STREAM
+tests. In a STREAM_STREAM test the `-p' option sets the directory in
+which the pipes will be created rather than setting a port number. The
+default is to create the pipes in the system default for the
+`tempnam()' call.
+
+ The STREAM_STREAM test is only present if netperf was configured with
+`--enable-unix=yes'. The remote netserver must have also been
+configured with `--enable-unix=yes'.
+
+
+File: netperf.info, Node: DG_STREAM, Prev: STREAM_STREAM, Up: Options common to TCP UDP and SCTP tests
+
+5.2.11 DG_STREAM
+----------------
+
+A Unix Domain Datagram Socket Stream test (SG_STREAM) is very much like
+a *Note TCP_STREAM:: test except that message boundaries are preserved.
+In this way, it may also be considered similar to certain flavors of
+SCTP test which can also preserve message boundaries.
+
+ All the options of a *Note STREAM_STREAM:: test are applicable to a
+DG_STREAM test.
+
+ The DG_STREAM test is only present if netperf was configured with
+`--enable-unix=yes'. The remote netserver must have also been
+configured with `--enable-unix=yes'.
+
+
+File: netperf.info, Node: Using Netperf to Measure Request/Response, Next: Using Netperf to Measure Aggregate Performance, Prev: Using Netperf to Measure Bulk Data Transfer, Up: Top
+
+6 Using Netperf to Measure Request/Response
+*******************************************
+
+Request/response performance is often overlooked, yet it is just as
+important as bulk-transfer performance. While things like larger
+socket buffers and TCP windows can cover a multitude of latency and
+even path-length sins, they cannot easily hide from a request/response
+test. The convention for a request/response test is to have a _RR
+suffix. There are however a few "request/response" tests that have
+other suffixes.
+
+ A request/response test, particularly synchronous, one transaction at
+at time test such as those found in netperf, is particularly sensitive
+to the path-length of the networking stack. An _RR test can also
+uncover those platforms where the NIC's are strapped by default with
+overbearing interrupt avoidance settings in an attempt to increase the
+bulk-transfer performance (or rather, decrease the CPU utilization of a
+bulk-transfer test). This sensitivity is most acute for small request
+and response sizes, such as the single-byte default for a netperf _RR
+test.
+
+ While a bulk-transfer test reports its results in units of bits or
+bytes transfered per second, a mumble_RR test reports transactions per
+second where a transaction is defined as the completed exchange of a
+request and a response. One can invert the transaction rate to arrive
+at the average round-trip latency. If one is confident about the
+symmetry of the connection, the average one-way latency can be taken as
+one-half the average round-trip latency. Netperf does not do either of
+these on its own but leaves them as exercises to the benchmarker.
+
+* Menu:
+
+* Issues in Request/Response::
+* Options Common to TCP UDP and SCTP _RR tests::
+
+
+File: netperf.info, Node: Issues in Request/Response, Next: Options Common to TCP UDP and SCTP _RR tests, Prev: Using Netperf to Measure Request/Response, Up: Using Netperf to Measure Request/Response
+
+6.1 Issues in Reqeust/Response
+==============================
+
+Most if not all the *Note Issues in Bulk Transfer:: apply to
+request/response. The issue of round-trip latency is even more
+important as netperf generally only has one transaction outstanding at
+a time.
+
+ A single instance of a one transaction outstanding _RR test should
+_never_ completely saturate the CPU of a system. If testing between
+otherwise evenly matched systems, the symmetric nature of a _RR test
+with equal request and response sizes should result in equal CPU
+loading on both systems. However, this may not hold true on MP systems,
+particularly if one CPU binds the netperf and netserver differently via
+the global `-T' option.
+
+ For smaller request and response sizes packet loss is a bigger issue
+as there is no opportunity for a "fast retransmit" or retransmission
+prior to a retransmission timer expiring.
+
+ Certain NICs have ways to minimize the number of interrupts sent to
+the host. If these are strapped badly they can significantly reduce
+the performance of something like a single-byte request/response test.
+Such setups are distinguised by seriously low reported CPU utilization
+and what seems like a low (even if in the thousands) transaction per
+second rate. Also, if you run such an OS/driver combination on faster
+or slower hardware and do not see a corresponding change in the
+transaction rate, chances are good that the drvier is strapping the NIC
+with aggressive interrupt avoidance settings. Good for bulk
+throughput, but bad for latency.
+
+ Some drivers may try to automagically adjust the interrupt avoidance
+settings. If they are not terribly good at it, you will see
+considerable run-to-run variation in reported transaction rates.
+Particularly if you "mix-up" _STREAM and _RR tests.
+
+
+File: netperf.info, Node: Options Common to TCP UDP and SCTP _RR tests, Prev: Issues in Request/Response, Up: Using Netperf to Measure Request/Response
+
+6.2 Options Common to TCP UDP and SCTP _RR tests
+================================================
+
+Many "test-specific" options are actually common across the different
+tests. For those tests involving TCP, UDP and SCTP, whether using the
+BSD Sockets or the XTI interface those common options include:
+
+`-h'
+ Display the test-suite-specific usage string and exit. For a TCP_
+ or UDP_ test this will be the usage string from the source file
+ `nettest_bsd.c'. For an XTI_ test, this will be the usage string
+ from the source file `src/nettest_xti.c'. For an SCTP test, this
+ will be the usage string from the source file `src/nettest_sctp.c'.
+
+`-H <optionspec>'
+ Normally, the remote hostname|IP and address family information is
+ inherited from the settings for the control connection (eg global
+ command-line `-H', `-4' and/or `-6' options. The test-specific
+ `-H' will override those settings for the data (aka test)
+ connection only. Settings for the control connection are left
+ unchanged. This might be used to cause the control and data
+ connections to take different paths through the network.
+
+`-L <optionspec>'
+ The test-specific `-L' option is identical to the test-specific
+ `-H' option except it affects the local hostname|IP and address
+ family information. As with its global command-line counterpart,
+ this is generally only useful when measuring though those evil,
+ end-to-end breaking things called firewalls.
+
+`-P <optionspec>'
+ Set the local and/or remote port numbers for the data connection.
+
+`-r <sizespec>'
+ This option sets the request (first value) and/or response (second
+ value) sizes for an _RR test. By default the units are bytes, but a
+ suffix of "G," "M," or "K" will specify the units to be 2^30 (GB),
+ 2^20 (MB) or 2^10 (KB) respectively. A suffix of "g," "m" or "k"
+ will specify units of 10^9, 10^6 or 10^3 bytes respectively. For
+ example:
+ `-r 128,16K'
+ Will set the request size to 128 bytes and the response size to 16
+ KB or 16384 bytes. [Default: 1 - a single-byte request and
+ response ]
+
+`-s <sizespec>'
+ This option sets the local send and receive socket buffer sizes for
+ the data connection to the value(s) specified. Often, this will
+ affect the advertised and/or effective TCP or other window, but on
+ some platforms it may not. By default the units are bytes, but a
+ suffix of "G," "M," or "K" will specify the units to be 2^30 (GB),
+ 2^20 (MB) or 2^10 (KB) respectively. A suffix of "g," "m" or "k"
+ will specify units of 10^9, 10^6 or 10^3 bytes respectively. For
+ example:
+ `-s 128K'
+ Will request the local send and receive socket buffer sizes to be
+ 128KB or 131072 bytes.
+
+ While the historic expectation is that setting the socket buffer
+ size has a direct effect on say the TCP window, today that may not
+ hold true for all stacks. When running under Windows a value of 0
+ may be used which will be an indication to the stack the user
+ wants to enable a form of copy avoidance. [Default: -1 - use the
+ system's default socket buffer sizes]
+
+`-S <sizespec>'
+ This option sets the remote send and/or receive socket buffer sizes
+ for the data connection to the value(s) specified. Often, this
+ will affect the advertised and/or effective TCP or other window,
+ but on some platforms it may not. By default the units are bytes,
+ but a suffix of "G," "M," or "K" will specify the units to be 2^30
+ (GB), 2^20 (MB) or 2^10 (KB) respectively. A suffix of "g," "m"
+ or "k" will specify units of 10^9, 10^6 or 10^3 bytes respectively.
+ For example:
+ `-s 128K'
+ Will request the local send and receive socket buffer sizes to be
+ 128KB or 131072 bytes.
+
+ While the historic expectation is that setting the socket buffer
+ size has a direct effect on say the TCP window, today that may not
+ hold true for all stacks. When running under Windows a value of 0
+ may be used which will be an indication to the stack the user
+ wants to enable a form of copy avoidance. [Default: -1 - use the
+ system's default socket buffer sizes]
+
+`-4'
+ Set the local and remote address family for the data connection to
+ AF_INET - ie use IPv4 addressing only. Just as with their global
+ command-line counterparts the last of the `-4', `-6', `-H' or `-L'
+ option wins for their respective address families.
+
+`-6'
+ This option is identical to its `-4' cousin, but requests IPv6
+ addresses for the local and remote ends of the data connection.
+
+
+* Menu:
+
+* TCP_RR::
+* TCP_CC::
+* TCP_CRR::
+* UDP_RR::
+* XTI_TCP_RR::
+* XTI_TCP_CC::
+* XTI_TCP_CRR::
+* XTI_UDP_RR::
+* DLCL_RR::
+* DLCO_RR::
+* SCTP_RR::
+
+
+File: netperf.info, Node: TCP_RR, Next: TCP_CC, Prev: Options Common to TCP UDP and SCTP _RR tests, Up: Options Common to TCP UDP and SCTP _RR tests
+
+6.2.1 TCP_RR
+------------
+
+A TCP_RR (TCP Request/Response) test is requested by passing a value of
+"TCP_RR" to the global `-t' command-line option. A TCP_RR test can be
+though-of as a user-space to user-space `ping' with no think time - it
+is a synchronous, one transaction at a time, request/response test.
+
+ The transaction rate is the number of complete transactions exchanged
+divided by the length of time it took to perform those transactions.
+
+ If the two Systems Under Test are otherwise identical, a TCP_RR test
+with the same request and response size should be symmetric - it should
+not matter which way the test is run, and the CPU utilization measured
+should be virtually the same on each system. If not, it suggests that
+the CPU utilization mechanism being used may have some, well, issues
+measuring CPU utilization completely and accurately.
+
+ Time to establish the TCP connection is not counted in the result.
+If you want connection setup overheads included, you should consider the
+TCP_CC or TCP_CRR tests.
+
+ If specifying the `-D' option to set TCP_NODELAY and disable the
+Nagle Algorithm increases the transaction rate reported by a TCP_RR
+test, it implies the stack(s) over which the TCP_RR test is running
+have a broken implementation of the Nagle Algorithm. Likely as not
+they are interpreting Nagle on a segment by segment basis rather than a
+user send by user send basis. You should contact your stack vendor(s)
+to report the problem to them.
+
+ Here is an example of two systems running a basic TCP_RR test over a
+10 Gigabit Ethernet link:
+
+ netperf -t TCP_RR -H 192.168.2.125
+ TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.2.125 (192.168.2.125) port 0 AF_INET
+ Local /Remote
+ Socket Size Request Resp. Elapsed Trans.
+ Send Recv Size Size Time Rate
+ bytes Bytes bytes bytes secs. per sec
+
+ 16384 87380 1 1 10.00 29150.15
+ 16384 87380
+
+ In this example the request and response sizes were one byte, the
+socket buffers were left at their defaults, and the test ran for all of
+10 seconds. The transaction per second rate was rather good :)
+
+
+File: netperf.info, Node: TCP_CC, Next: TCP_CRR, Prev: TCP_RR, Up: Options Common to TCP UDP and SCTP _RR tests
+
+6.2.2 TCP_CC
+------------
+
+A TCP_CC (TCP Connect/Close) test is requested by passing a value of
+"TCP_CC" to the global `-t' option. A TCP_CC test simply measures how
+fast the pair of systems can open and close connections between one
+another in a synchronous (one at a time) manner. While this is
+considered an _RR test, no request or response is exchanged over the
+connection.
+
+ The issue of TIME_WAIT reuse is an important one for a TCP_CC test.
+Basically, TIME_WAIT reuse is when a pair of systems churn through
+connections fast enough that they wrap the 16-bit port number space in
+less time than the length of the TIME_WAIT state. While it is indeed
+theoretically possible to "reuse" a connection in TIME_WAIT, the
+conditions under which such reuse is possible are rather rare. An
+attempt to reuse a connection in TIME_WAIT can result in a non-trivial
+delay in connection establishment.
+
+ Basically, any time the connection churn rate approaches:
+
+ Sizeof(clientportspace) / Lengthof(TIME_WAIT)
+
+ there is the risk of TIME_WAIT reuse. To minimize the chances of
+this happening, netperf will by default select its own client port
+numbers from the range of 5000 to 65535. On systems with a 60 second
+TIME_WAIT state, this should allow roughly 1000 transactions per
+second. The size of the client port space used by netperf can be
+controlled via the test-specific `-p' option, which takes a "sizespec"
+as a value setting the minimum (first value) and maximum (second value)
+port numbers used by netperf at the client end.
+
+ Since no requests or responses are exchanged during a TCP_CC test,
+only the `-H', `-L', `-4' and `-6' of the "common" test-specific
+options are likely to have an effect, if any, on the results. The `-s'
+and `-S' options _may_ have some effect if they alter the number and/or
+type of options carried in the TCP SYNchronize segments. The `-P' and
+`-r' options are utterly ignored.
+
+ Since connection establishment and tear-down for TCP is not
+symmetric, a TCP_CC test is not symmetric in its loading of the two
+systems under test.
+
+
+File: netperf.info, Node: TCP_CRR, Next: UDP_RR, Prev: TCP_CC, Up: Options Common to TCP UDP and SCTP _RR tests
+
+6.2.3 TCP_CRR
+-------------
+
+The TCP Connect/Request/Response (TCP_CRR) test is requested by passing
+a value of "TCP_CRR" to the global `-t' command-line option. A TCP_RR
+test is like a merger of a TCP_RR and TCP_CC test which measures the
+performance of establishing a connection, exchanging a single
+request/response transaction, and tearing-down that connection. This
+is very much like what happens in an HTTP 1.0 or HTTP 1.1 connection
+when HTTP Keepalives are not used. In fact, the TCP_CRR test was added
+to netperf to simulate just that.
+
+ Since a request and response are exchanged the `-r', `-s' and `-S'
+options can have an effect on the performance.
+
+ The issue of TIME_WAIT reuse exists for the TCP_CRR test just as it
+does for the TCP_CC test. Similarly, since connection establishment
+and tear-down is not symmetric, a TCP_CRR test is not symmetric even
+when the request and response sizes are the same.
+
+
+File: netperf.info, Node: UDP_RR, Next: XTI_TCP_RR, Prev: TCP_CRR, Up: Options Common to TCP UDP and SCTP _RR tests
+
+6.2.4 UDP_RR
+------------
+
+A UDP Request/Response (UDP_RR) test is requested by passing a value of
+"UDP_RR" to a global `-t' option. It is very much the same as a TCP_RR
+test except UDP is used rather than TCP.
+
+ UDP does not provide for retransmission of lost UDP datagrams, and
+netperf does not add anything for that either. This means that if
+_any_ request or response is lost, the exchange of requests and
+responses will stop from that point until the test timer expires.
+Netperf will not really "know" this has happened - the only symptom
+will be a low transaction per second rate.
+
+ The netperf side of a UDP_RR test will call `connect()' on its data
+socket and thenceforth use the `send()' and `recv()' socket calls. The
+netserver side of a UDP_RR test will not call `connect()' and will use
+`recvfrom()' and `sendto()' calls. This means that even if the request
+and response sizes are the same, a UDP_RR test is _not_ symmetric in
+its loading of the two systems under test.
+
+ Here is an example of a UDP_RR test between two otherwise identical
+two-CPU systems joined via a 1 Gigabit Ethernet network:
+
+ $ netperf -T 1 -H 192.168.1.213 -t UDP_RR -c -C
+ UDP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.1.213 (192.168.1.213) port 0 AF_INET
+ Local /Remote
+ Socket Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem
+ Send Recv Size Size Time Rate local remote local remote
+ bytes bytes bytes bytes secs. per sec % I % I us/Tr us/Tr
+
+ 65535 65535 1 1 10.01 15262.48 13.90 16.11 18.221 21.116
+ 65535 65535
+
+ This example includes the `-c' and `-C' options to enable CPU
+utilization reporting and shows the asymmetry in CPU loading. The `-T'
+option was used to make sure netperf and netserver ran on a given CPU
+and did not move around during the test.
+
+
+File: netperf.info, Node: XTI_TCP_RR, Next: XTI_TCP_CC, Prev: UDP_RR, Up: Options Common to TCP UDP and SCTP _RR tests
+
+6.2.5 XTI_TCP_RR
+----------------
+
+An XTI_TCP_RR test is essentially the same as a *Note TCP_RR:: test only
+using the XTI rather than BSD Sockets interface. It is requested by
+passing a value of "XTI_TCP_RR" to the `-t' global command-line option.
+
+ The test-specific options for an XTI_TCP_RR test are the same as
+those for a TCP_RR test with the addition of the `-X <devspec>' option
+to specify the names of the local and/or remote XTI device file(s).
+
+
+File: netperf.info, Node: XTI_TCP_CC, Next: XTI_TCP_CRR, Prev: XTI_TCP_RR, Up: Options Common to TCP UDP and SCTP _RR tests
+
+6.2.6 XTI_TCP_CC
+----------------
+
+
+File: netperf.info, Node: XTI_TCP_CRR, Next: XTI_UDP_RR, Prev: XTI_TCP_CC, Up: Options Common to TCP UDP and SCTP _RR tests
+
+6.2.7 XTI_TCP_CRR
+-----------------
+
+
+File: netperf.info, Node: XTI_UDP_RR, Next: DLCL_RR, Prev: XTI_TCP_CRR, Up: Options Common to TCP UDP and SCTP _RR tests
+
+6.2.8 XTI_UDP_RR
+----------------
+
+An XTI_UDP_RR test is essentially the same as a UDP_RR test only using
+the XTI rather than BSD Sockets interface. It is requested by passing
+a value of "XTI_UDP_RR" to the `-t' global command-line option.
+
+ The test-specific options for an XTI_UDP_RR test are the same as
+those for a UDP_RR test with the addition of the `-X <devspec>' option
+to specify the name of the local and/or remote XTI device file(s).
+
+
+File: netperf.info, Node: DLCL_RR, Next: DLCO_RR, Prev: XTI_UDP_RR, Up: Options Common to TCP UDP and SCTP _RR tests
+
+6.2.9 DLCL_RR
+-------------
+
+
+File: netperf.info, Node: DLCO_RR, Next: SCTP_RR, Prev: DLCL_RR, Up: Options Common to TCP UDP and SCTP _RR tests
+
+6.2.10 DLCO_RR
+--------------
+
+
+File: netperf.info, Node: SCTP_RR, Prev: DLCO_RR, Up: Options Common to TCP UDP and SCTP _RR tests
+
+6.2.11 SCTP_RR
+--------------
+
+
+File: netperf.info, Node: Using Netperf to Measure Aggregate Performance, Next: Using Netperf to Measure Bidirectional Transfer, Prev: Using Netperf to Measure Request/Response, Up: Top
+
+7 Using Netperf to Measure Aggregate Performance
+************************************************
+
+*Note Netperf4: Netperf4. is the preferred benchmark to use when one
+wants to measure aggregate performance because netperf has no support
+for explicit synchronization of concurrent tests.
+
+ Basically, there are two ways to measure aggregate performance with
+netperf. The first is to run multiple, concurrent netperf tests and
+can be applied to any of the netperf tests. The second is to configure
+netperf with `--enable-burst' and is applicable to the TCP_RR test.
+
+* Menu:
+
+* Running Concurrent Netperf Tests::
+* Using --enable-burst::
+
+
+File: netperf.info, Node: Running Concurrent Netperf Tests, Next: Using --enable-burst, Prev: Using Netperf to Measure Aggregate Performance, Up: Using Netperf to Measure Aggregate Performance
+
+7.1 Running Concurrent Netperf Tests
+====================================
+
+*Note Netperf4: Netperf4. is the preferred benchmark to use when one
+wants to measure aggregate performance because netperf has no support
+for explicit synchronization of concurrent tests. This leaves netperf2
+results vulnerable to "skew" errors.
+
+ However, since there are times when netperf4 is unavailable it may be
+necessary to run netperf. The skew error can be minimized by making use
+of the confidence interval functionality. Then one simply launches
+multiple tests from the shell using a `for' loop or the like:
+
+ for i in 1 2 3 4
+ do
+ netperf -t TCP_STREAM -H tardy.cup.hp.com -i 10 -P 0 &
+ done
+
+ which will run four, concurrent *Note TCP_STREAM: TCP_STREAM. tests
+from the system on which it is executed to tardy.cup.hp.com. Each
+concurrent netperf will iterate 10 times thanks to the `-i' option and
+will omit the test banners (option `-P') for brevity. The output looks
+something like this:
+
+ 87380 16384 16384 10.03 235.15
+ 87380 16384 16384 10.03 235.09
+ 87380 16384 16384 10.03 235.38
+ 87380 16384 16384 10.03 233.96
+
+ We can take the sum of the results and be reasonably confident that
+the aggregate performance was 940 Mbits/s.
+
+ If you see warnings about netperf not achieving the confidence
+intervals, the best thing to do is to increase the number of iterations
+with `-i' and/or increase the run length of each iteration with `-l'.
+
+ You can also enable local (`-c') and/or remote (`-C') CPU
+utilization:
+
+ for i in 1 2 3 4
+ do
+ netperf -t TCP_STREAM -H tardy.cup.hp.com -i 10 -P 0 -c -C &
+ done
+
+ 87380 16384 16384 10.03 235.47 3.67 5.09 10.226 14.180
+ 87380 16384 16384 10.03 234.73 3.67 5.09 10.260 14.225
+ 87380 16384 16384 10.03 234.64 3.67 5.10 10.263 14.231
+ 87380 16384 16384 10.03 234.87 3.67 5.09 10.253 14.215
+
+ If the CPU utilizations reported for the same system are the same or
+very very close you can be reasonably confident that skew error is
+minimized. Presumeably one could then omit `-i' but that is not
+advised, particularly when/if the CPU utilization approaches 100
+percent. In the example above we see that the CPU utilization on the
+local system remains the same for all four tests, and is only off by
+0.01 out of 5.09 on the remote system.
+
+ NOTE: It is very important to rememeber that netperf is calculating
+ system-wide CPU utilization. When calculating the service demand
+ (those last two columns in the output above) each netperf assumes
+ it is the only thing running on the system. This means that for
+ concurrent tests the service demands reported by netperf will be
+ wrong. One has to compute service demands for concurrent tests by
+ hand.
+
+ If you wish you can add a unique, global `-B' option to each command
+line to append the given string to the output:
+
+ for i in 1 2 3 4
+ do
+ netperf -t TCP_STREAM -H tardy.cup.hp.com -B "this is test $i" -i 10 -P 0 &
+ done
+
+ 87380 16384 16384 10.03 234.90 this is test 4
+ 87380 16384 16384 10.03 234.41 this is test 2
+ 87380 16384 16384 10.03 235.26 this is test 1
+ 87380 16384 16384 10.03 235.09 this is test 3
+
+ You will notice that the tests completed in an order other than they
+were started from the shell. This underscores why there is a threat of
+skew error and why netperf4 is the preferred tool for aggregate tests.
+Even if you see the Netperf Contributing Editor acting to the
+contrary!-)
+
+
+File: netperf.info, Node: Using --enable-burst, Prev: Running Concurrent Netperf Tests, Up: Using Netperf to Measure Aggregate Performance
+
+7.2 Using -enable-burst
+=======================
+
+If one configures netperf with `--enable-burst':
+
+ configure --enable-burst
+
+ Then a test-specific `-b num' option is added to the *Note TCP_RR:
+TCP_RR. and *Note UDP_RR: UDP_RR. tests. This option causes TCP_RR and
+UDP_RR to quickly work their way up to having at least `num'
+transactions in flight at one time.
+
+ This is used as an alternative to or even in conjunction with
+multiple-concurrent _RR tests. When run with just a single instance of
+netperf, increasing the burst size can determine the maximum number of
+transactions per second can be serviced by a single process:
+
+ for b in 0 1 2 4 8 16 32
+ do
+ netperf -v 0 -t TCP_RR -B "-b $b" -H hpcpc108 -P 0 -- -b $b
+ done
+
+ 9457.59 -b 0
+ 9975.37 -b 1
+ 10000.61 -b 2
+ 20084.47 -b 4
+ 29965.31 -b 8
+ 71929.27 -b 16
+ 109718.17 -b 32
+
+ The global `-v' and `-P' options were used to minimize the output to
+the single figure of merit which in this case the transaction rate.
+The global `-B' option was used to more clearly label the output, and
+the test-specific `-b' option enabled by `--enable-burst' set the
+number of transactions in flight at one time.
+
+ Now, since the test-specific `-D' option was not specified to set
+TCP_NODELAY, the stack was free to "bundle" requests and/or responses
+into TCP segments as it saw fit, and since the default request and
+response size is one byte, there could have been some considerable
+bundling. If one wants to try to achieve a closer to one-to-one
+correspondence between a request and response and a TCP segment, add
+the test-specific `-D' option:
+
+ for b in 0 1 2 4 8 16 32
+ do
+ netperf -v 0 -t TCP_RR -B "-b $b -D" -H hpcpc108 -P 0 -- -b $b -D
+ done
+
+ 8695.12 -b 0 -D
+ 19966.48 -b 1 -D
+ 20691.07 -b 2 -D
+ 49893.58 -b 4 -D
+ 62057.31 -b 8 -D
+ 108416.88 -b 16 -D
+ 114411.66 -b 32 -D
+
+ You can see that this has a rather large effect on the reported
+transaction rate. In this particular instance, the author believes it
+relates to interactions between the test and interrupt coalescing
+settings in the driver for the NICs used.
+
+ NOTE: Even if you set the `-D' option that is still not a
+ guarantee that each transaction is in its own TCP segments. You
+ should get into the habit of verifying the relationship between the
+ transaction rate and the packet rate via other means
+
+ You can also combine `--enable-burst' functionality with concurrent
+netperf tests. This would then be an "aggregate of aggregates" if you
+like:
+
+
+ for i in 1 2 3 4
+ do
+ netperf -H hpcpc108 -v 0 -P 0 -i 10 -B "aggregate $i -b 8 -D" -t TCP_RR -- -b 8 -D &
+ done
+
+ 46668.38 aggregate 4 -b 8 -D
+ 44890.64 aggregate 2 -b 8 -D
+ 45702.04 aggregate 1 -b 8 -D
+ 46352.48 aggregate 3 -b 8 -D
+
+ Since each netperf did hit the confidence intervals, we can be
+reasonably certain that the aggregate transaction per second rate was
+the sum of all four concurrent tests, or something just shy of 184,000
+transactions per second. To get some idea if that was also the packet
+per second rate, we could bracket that `for' loop with something to
+gather statistics and run the results through beforeafter
+(ftp://ftp.cup.hp.com/dist/networking/tools):
+
+ /usr/sbin/ethtool -S eth2 > before
+ for i in 1 2 3 4
+ do
+ netperf -H 192.168.2.108 -l 60 -v 0 -P 0 -B "aggregate $i -b 8 -D" -t TCP_RR -- -b 8 -D &
+ done
+ wait
+ /usr/sbin/ethtool -S eth2 > after
+
+ 52312.62 aggregate 2 -b 8 -D
+ 50105.65 aggregate 4 -b 8 -D
+ 50890.82 aggregate 1 -b 8 -D
+ 50869.20 aggregate 3 -b 8 -D
+
+ beforeafter before after > delta
+
+ grep packets delta
+ rx_packets: 12251544
+ tx_packets: 12251550
+
+ This example uses `ethtool' because the system being used is running
+Linux. Other platforms have other tools - for example HP-UX has
+lanadmin:
+
+ lanadmin -g mibstats <ppa>
+
+ and of course one could instead use `netstat'.
+
+ The `wait' is important because we are launching concurrent netperfs
+in the background. Without it, the second ethtool command would be run
+before the tests finished and perhaps even before the last of them got
+started!
+
+ The sum of the reported transaction rates is 204178 over 60 seconds,
+which is a total of 12250680 transactions. Each transaction is the
+exchange of a request and a response, so we multiply that by 2 to
+arrive at 24501360.
+
+ The sum of the ethtool stats is 24503094 packets which matches what
+netperf was reporting very well.
+
+ Had the request or response size differed, we would need to know how
+it compared with the "MSS" for the connection.
+
+ Just for grins, here is the excercise repeated, using `netstat'
+instead of `ethtool'
+
+ netstat -s -t > before
+ for i in 1 2 3 4
+ do
+ netperf -l 60 -H 192.168.2.108 -v 0 -P 0 -B "aggregate $i -b 8 -D" -t TCP_RR -- -b 8 -D & done
+ wait
+ netstat -s -t > after
+
+ 51305.88 aggregate 4 -b 8 -D
+ 51847.73 aggregate 2 -b 8 -D
+ 50648.19 aggregate 3 -b 8 -D
+ 53605.86 aggregate 1 -b 8 -D
+
+ beforeafter before after > delta
+
+ grep segments delta
+ 12445708 segments received
+ 12445730 segments send out
+ 1 segments retransmited
+ 0 bad segments received.
+
+ The sums are left as an excercise to the reader :)
+
+ Things become considerably more complicated if there are non-trvial
+packet losses and/or retransmissions.
+
+ Of course all this checking is unnecessary if the test is a UDP_RR
+test because UDP "never" aggregates multiple sends into the same UDP
+datagram, and there are no ACKnowledgements in UDP. The loss of a
+single request or response will not bring a "burst" UDP_RR test to a
+screeching halt, but it will reduce the number of transactions
+outstanding at any one time. A "burst" UDP_RR test will come to a halt
+if the sum of the lost requests and responses reaches the value
+specified in the test-specific `-b' option.
+
+
+File: netperf.info, Node: Using Netperf to Measure Bidirectional Transfer, Next: Other Netperf Tests, Prev: Using Netperf to Measure Aggregate Performance, Up: Top
+
+8 Using Netperf to Measure Bidirectional Transfer
+*************************************************
+
+There are two ways to use netperf to measure the perfomance of
+bidirectional transfer. The first is to run concurrent netperf tests
+from the command line. The second is to configure netperf with
+`--enable-burst' and use a single instance of the *Note TCP_RR: TCP_RR.
+test.
+
+ While neither method is more "correct" than the other, each is doing
+so in different ways, and that has possible implications. For
+instance, using the concurrent netperf test mechanism means that
+multiple TCP connections and multiple processes are involved, whereas
+using the single instance of TCP_RR there is only one TCP connection
+and one process on each end. They may behave differently, especially
+on an MP system.
+
+* Menu:
+
+* Bidirectional Transfer with Concurrent Tests::
+* Bidirectional Transfer with TCP_RR::
+
+
+File: netperf.info, Node: Bidirectional Transfer with Concurrent Tests, Next: Bidirectional Transfer with TCP_RR, Prev: Using Netperf to Measure Bidirectional Transfer, Up: Using Netperf to Measure Bidirectional Transfer
+
+8.1 Bidirectional Transfer with Concurrent Tests
+================================================
+
+If we had two hosts Fred and Ethel, we could simply run a netperf *Note
+TCP_STREAM: TCP_STREAM. test on Fred pointing at Ethel, and a
+concurrent netperf TCP_STREAM test on Ethel pointing at Fred, but since
+there are no mechanisms to synchronize netperf tests and we would be
+starting tests from two different systems, there is a considerable risk
+of skew error.
+
+ Far better would be to run simultaneous TCP_STREAM and *Note
+TCP_MAERTS: TCP_MAERTS. tests from just one system, using the concepts
+and procedures outlined in *Note Running Concurrent Netperf Tests:
+Running Concurrent Netperf Tests. Here then is an example:
+
+ for i in 1
+ do
+ netperf -H 192.168.2.108 -t TCP_STREAM -B "outbound" -i 10 -P 0 -v 0 -- -s 256K -S 256K &
+ netperf -H 192.168.2.108 -t TCP_MAERTS -B "inbound" -i 10 -P 0 -v 0 -- -s 256K -S 256K &
+ done
+
+ 892.66 outbound
+ 891.34 inbound
+
+ We have used a `for' loop in the shell with just one iteration
+because that will be much easier to get both tests started at more or
+less the same time than doing it by hand. The global `-P' and `-v'
+options are used because we aren't interested in anything other than
+the throughput, and the global `-B' option is used to tag each output
+so we know which was inbound and which outbound relative to the system
+on which we were running netperf. Of course that sense is switched on
+the system running netserver :) The use of the global `-i' option is
+explained in *Note Running Concurrent Netperf Tests: Running Concurrent
+Netperf Tests.
+
+
+File: netperf.info, Node: Bidirectional Transfer with TCP_RR, Prev: Bidirectional Transfer with Concurrent Tests, Up: Using Netperf to Measure Bidirectional Transfer
+
+8.2 Bidirectional Transfer with TCP_RR
+======================================
+
+If one configures netperf with `--enable-burst' then one can use the
+test-specific `-b' option to increase the number of transactions in
+flight at one time. If one also uses the -r option to make those
+transactions larger the test starts to look more and more like a
+bidirectional transfer than a request/response test.
+
+ Now, the logic behing `--enable-burst' is very simple, and there are
+no calls to `poll()' or `select()' which means we want to make sure
+that the `send()' calls will never block, or we run the risk of
+deadlock with each side stuck trying to call `send()' and neither
+calling `recv()'.
+
+ Fortunately, this is easily accomplished by setting a "large enough"
+socket buffer size with the test-specific `-s' and `-S' options.
+Presently this must be performed by the user. Future versions of
+netperf might attempt to do this automagically, but there are some
+issues to be worked-out.
+
+ Here then is an example of a bidirectional transfer test using
+`--enable-burst' and the *Note TCP_RR: TCP_RR. test:
+
+ netperf -t TCP_RR -H hpcpc108 -- -b 6 -r 32K -s 256K -S 256K
+ TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to hpcpc108.cup.hp.com (16.89.84.108) port 0 AF_INET : first burst 6
+ Local /Remote
+ Socket Size Request Resp. Elapsed Trans.
+ Send Recv Size Size Time Rate
+ bytes Bytes bytes bytes secs. per sec
+
+ 524288 524288 32768 32768 10.01 3525.97
+ 524288 524288
+
+ Now, at present netperf does not include a bit or byte rate in the
+output of an _RR test which means we must calculate it ourselves. Each
+transaction is the exchange of 32768 bytes of request and 32768 bytes
+of response, or 65536 bytes. Multiply that by 8 and we arrive at
+524288 bits per transaction. Multiply that by 3525.97 and we arrive at
+1848623759 bits per second. Since things were uniform, we can divide
+that by two and arrive at roughly 924311879 bits per second each way.
+That corresponds to "link-rate" for a 1 Gigiabit Ethernet which happens
+to be the type of netpwrk used in the example.
+
+ A future version of netperf may perform the calculation on behalf of
+the user, but it would likely not emit it unless the user specified a
+verbosity of 2 or more with the global `-v' option.
+
+
+File: netperf.info, Node: Other Netperf Tests, Next: Address Resolution, Prev: Using Netperf to Measure Bidirectional Transfer, Up: Top
+
+9 Other Netperf Tests
+*********************
+
+Apart from the typical performance tests, netperf contains some tests
+which can be used to streamline measurements and reporting. These
+include CPU rate calibration (present) and host identification (future
+enhancement).
+
+* Menu:
+
+* CPU rate calibration::
+
+
+File: netperf.info, Node: CPU rate calibration, Prev: Other Netperf Tests, Up: Other Netperf Tests
+
+9.1 CPU rate calibration
+========================
+
+Some of the CPU utilization measurement mechanisms of netperf work by
+comparing the rate at which some counter increments when the system is
+idle with the rate at which that same counter increments when the
+system is running a netperf test. The ratio of those rates is used to
+arrive at a CPU utilization percentage.
+
+ This means that netperf must know the rate at which the counter
+increments when the system is presumed to be "idle." If it does not
+know the rate, netperf will measure it before starting a data transfer
+test. This calibration step takes 40 seconds for each of the local or
+remote ystems, and if repeated for each netperf test would make taking
+repeated measurements rather slow.
+
+ Thus, the netperf CPU utilization options `-c' and and `-C' can take
+an optional calibration value. This value is used as the "idle rate"
+and the calibration step is not performed. To determine the idle rate,
+netperf can be used to run special tests which only report the value of
+the calibration - they are the LOC_CPU and REM_CPU tests. These return
+the calibration value for the local and remote system respectively. A
+common way to use these tests is to store their results into an
+environment variable and use that in subsequent netperf commands:
+
+ LOC_RATE=`netperf -t LOC_CPU`
+ REM_RATE=`netperf -H <remote> -t REM_CPU`
+ netperf -H <remote> -c $LOC_RATE -C $REM_RATE ... -- ...
+ ...
+ netperf -H <remote> -c $LOC_RATE -C $REM_RATE ... -- ...
+
+ If you are going to use netperf to measure aggregate results, it is
+important to use the LOC_CPU and REM_CPU tests to get the calibration
+values first to avoid issues with some of the aggregate netperf tests
+transferring data while others are "idle" and getting bogus calibration
+values. When running aggregate tests, it is very important to remember
+that any one instance of netperf does not know about the other
+instances of netperf. It will report global CPU utilization and will
+calculate service demand believing it was the only thing causing that
+CPU utilization. So, you can use the CPU utilization reported by
+netperf in an aggregate test, but you have to calculate service demands
+by hand.
+
+
+File: netperf.info, Node: Address Resolution, Next: Enhancing Netperf, Prev: Other Netperf Tests, Up: Top
+
+10 Address Resolution
+*********************
+
+Netperf versions 2.4.0 and later have merged IPv4 and IPv6 tests so the
+functionality of the tests in `src/nettest_ipv6.c' has been subsumed
+into the tests in `src/nettest_bsd.c' This has been accomplished in
+part by switching from `gethostbyname()'to `getaddrinfo()' exclusively.
+While it was theoretically possible to get multiple results for a
+hostname from `gethostbyname()' it was generally unlikely and netperf's
+ignoring of the second and later results was not much of an issue.
+
+ Now with `getaddrinfo' and particularly with AF_UNSPEC it is
+increasingly likely that a given hostname will have multiple associated
+addresses. The `establish_control()' routine of `src/netlib.c' will
+indeed attempt to chose from among all the matching IP addresses when
+establishing the control connection. Netperf does not _really_ care if
+the control connection is IPv4 or IPv6 or even mixed on either end.
+
+ However, the individual tests still ass-u-me that the first result in
+the address list is the one to be used. Whether or not this will
+turn-out to be an issue has yet to be determined.
+
+ If you do run into problems with this, the easiest workaround is to
+specify IP addresses for the data connection explicitly in the
+test-specific `-H' and `-L' options. At some point, the netperf tests
+_may_ try to be more sophisticated in their parsing of returns from
+`getaddrinfo()' - straw-man patches to <netperf-feedback@netperf.org>
+would of course be most welcome :)
+
+ Netperf has leveraged code from other open-source projects with
+amenable licensing to provide a replacement `getaddrinfo()' call on
+those platforms where the `configure' script believes there is no
+native getaddrinfo call. As of this writing, the replacement
+`getaddrinfo()' as been tested on HP-UX 11.0 and then presumed to run
+elsewhere.
+
+
+File: netperf.info, Node: Enhancing Netperf, Next: Netperf4, Prev: Address Resolution, Up: Top
+
+11 Enhancing Netperf
+********************
+
+Netperf is constantly evolving. If you find you want to make
+enhancements to netperf, by all means do so. If you wish to add a new
+"suite" of tests to netperf the general idea is to
+
+ 1. Add files `src/nettest_mumble.c' and `src/nettest_mumble.h' where
+ mumble is replaced with something meaningful for the test-suite.
+
+ 2. Add support for an apropriate `--enable-mumble' option in
+ `configure.ac'.
+
+ 3. Edit `src/netperf.c', `netsh.c', and `netserver.c' as required,
+ using #ifdef WANT_MUMBLE.
+
+ 4. Compile and test
+
+ If you wish to submit your changes for possible inclusion into the
+mainline sources, please try to base your changes on the latest
+available sources. (*Note Getting Netperf Bits::.) and then send email
+describing the changes at a high level to
+<netperf-feedback@netperf.org> or perhaps <netperf-talk@netperf.org>.
+If the concensus is positive, then sending context `diff' results to
+<netperf-feedback@netperf.org> is the next step. From that point, it
+is a matter of pestering the Netperf Contributing Editor until he gets
+the changes incorporated :)
+
+
+File: netperf.info, Node: Netperf4, Next: Concept Index, Prev: Enhancing Netperf, Up: Top
+
+12 Netperf4
+***********
+
+Netperf4 is the shorthand name given to version 4.X.X of netperf. This
+is really a separate benchmark more than a newer version of netperf,
+but it is a decendant of netperf so the netperf name is kept. The
+facitious way to describe netperf4 is to say it is the
+egg-laying-wolly-milk-pig version of netperf :) The more respectful
+way to describe it is to say it is the version of netperf with support
+for synchronized, multiple-thread, multiple-test, multiple-system,
+network-oriented benchmarking.
+
+ Netperf4 is still undergoing rapid evolution. Those wishing to work
+with or on netperf4 are encouraged to join the netperf-dev
+(http://www.netperf.org/cgi-bin/mailman/listinfo/netperf-dev) mailing
+list and/or peruse the current sources
+(http://www.netperf.org/svn/netperf4/trunk).
+
+
+File: netperf.info, Node: Concept Index, Next: Option Index, Prev: Netperf4, Up: Top
+
+Concept Index
+*************
+
+
+* Menu:
+
+* Aggregate Performance: Using Netperf to Measure Aggregate Performance.
+ (line 3)
+* Bandwidth Limitation: Installing Netperf Bits.
+ (line 41)
+* Connection Latency: TCP_CC. (line 3)
+* CPU Utilization: The Design of Netperf.
+ (line 35)
+* Design of Netperf: The Design of Netperf.
+ (line 6)
+* Installation: Installing Netperf. (line 6)
+* Introduction: Introduction. (line 6)
+* Latency, Connection Establishment <1>: XTI_TCP_CRR. (line 3)
+* Latency, Connection Establishment <2>: XTI_TCP_CC. (line 3)
+* Latency, Connection Establishment <3>: TCP_CRR. (line 3)
+* Latency, Connection Establishment: TCP_CC. (line 3)
+* Latency, Request-Response <1>: SCTP_RR. (line 3)
+* Latency, Request-Response <2>: DLCO_RR. (line 3)
+* Latency, Request-Response <3>: DLCL_RR. (line 3)
+* Latency, Request-Response <4>: XTI_UDP_RR. (line 3)
+* Latency, Request-Response <5>: XTI_TCP_CRR. (line 3)
+* Latency, Request-Response <6>: XTI_TCP_RR. (line 3)
+* Latency, Request-Response <7>: UDP_RR. (line 3)
+* Latency, Request-Response <8>: TCP_CRR. (line 3)
+* Latency, Request-Response: TCP_RR. (line 3)
+* Limiting Bandwidth <1>: UDP_STREAM. (line 9)
+* Limiting Bandwidth: Installing Netperf Bits.
+ (line 41)
+* Measuring Latency: TCP_RR. (line 3)
+* Packet Loss: UDP_RR. (line 3)
+* Port Reuse: TCP_CC. (line 13)
+* TIME_WAIT: TCP_CC. (line 13)
+
+
+File: netperf.info, Node: Option Index, Prev: Concept Index, Up: Top
+
+Option Index
+************
+
+
+* Menu:
+
+* --enable-burst, Configure: Using Netperf to Measure Aggregate Performance.
+ (line 3)
+* --enable-cpuutil, Configure: Installing Netperf Bits.
+ (line 22)
+* --enable-dlpi, Configure: Installing Netperf Bits.
+ (line 28)
+* --enable-histogram, Configure: Installing Netperf Bits.
+ (line 41)
+* --enable-intervals, Configure: Installing Netperf Bits.
+ (line 41)
+* --enable-sctp, Configure: Installing Netperf Bits.
+ (line 28)
+* --enable-unix, Configure: Installing Netperf Bits.
+ (line 28)
+* --enable-xti, Configure: Installing Netperf Bits.
+ (line 28)
+* -4, Global: Global Options. (line 379)
+* -4, Test-specific <1>: Options Common to TCP UDP and SCTP _RR tests.
+ (line 88)
+* -4, Test-specific: Options common to TCP UDP and SCTP tests.
+ (line 110)
+* -6 Test-specific: Options Common to TCP UDP and SCTP _RR tests.
+ (line 94)
+* -6, Global: Global Options. (line 388)
+* -6, Test-specific: Options common to TCP UDP and SCTP tests.
+ (line 116)
+* -A, Global: Global Options. (line 18)
+* -a, Global: Global Options. (line 6)
+* -B, Global: Global Options. (line 29)
+* -b, Global: Global Options. (line 22)
+* -C, Global: Global Options. (line 42)
+* -c, Global: Global Options. (line 33)
+* -D, Global: Global Options. (line 56)
+* -d, Global: Global Options. (line 47)
+* -F, Global: Global Options. (line 74)
+* -f, Global: Global Options. (line 67)
+* -H, Global: Global Options. (line 92)
+* -h, Global: Global Options. (line 88)
+* -H, Test-specific: Options Common to TCP UDP and SCTP _RR tests.
+ (line 17)
+* -h, Test-specific <1>: Options Common to TCP UDP and SCTP _RR tests.
+ (line 10)
+* -h, Test-specific: Options common to TCP UDP and SCTP tests.
+ (line 10)
+* -i, Global: Global Options. (line 168)
+* -I, Global: Global Options. (line 127)
+* -L, Global: Global Options. (line 209)
+* -l, Global: Global Options. (line 189)
+* -L, Test-specific <1>: Options Common to TCP UDP and SCTP _RR tests.
+ (line 26)
+* -L, Test-specific: Options common to TCP UDP and SCTP tests.
+ (line 25)
+* -M, Test-specific: Options common to TCP UDP and SCTP tests.
+ (line 48)
+* -m, Test-specific: Options common to TCP UDP and SCTP tests.
+ (line 32)
+* -N, Global: Global Options. (line 234)
+* -n, Global: Global Options. (line 221)
+* -O, Global: Global Options. (line 279)
+* -o, Global: Global Options. (line 270)
+* -P, Global: Global Options. (line 303)
+* -p, Global: Global Options. (line 283)
+* -P, Test-specific <1>: Options Common to TCP UDP and SCTP _RR tests.
+ (line 33)
+* -P, Test-specific: Options common to TCP UDP and SCTP tests.
+ (line 61)
+* -r, Test-specific: Options Common to TCP UDP and SCTP _RR tests.
+ (line 36)
+* -S Test-specific: Options common to TCP UDP and SCTP tests.
+ (line 87)
+* -S, Test-specific: Options Common to TCP UDP and SCTP _RR tests.
+ (line 68)
+* -s, Test-specific <1>: Options Common to TCP UDP and SCTP _RR tests.
+ (line 48)
+* -s, Test-specific: Options common to TCP UDP and SCTP tests.
+ (line 64)
+* -t, Global: Global Options. (line 312)
+* -v, Global: Global Options. (line 341)
+* -W, Global: Global Options. (line 370)
+* -w, Global: Global Options. (line 363)
+
+
+
+Tag Table:
+Node: Top441
+Node: Introduction2702
+Node: Conventions5163
+Node: Installing Netperf6926
+Node: Getting Netperf Bits8480
+Node: Installing Netperf Bits10298
+Node: Verifying Installation16762
+Node: The Design of Netperf17466
+Node: CPU Utilization19048
+Node: Global Command-line Options27661
+Node: Command-line Options Syntax28200
+Node: Global Options29582
+Node: Using Netperf to Measure Bulk Data Transfer48878
+Node: Issues in Bulk Transfer49543
+Node: Options common to TCP UDP and SCTP tests53072
+Node: TCP_STREAM59366
+Node: TCP_MAERTS63134
+Node: TCP_SENDFILE64367
+Node: UDP_STREAM66683
+Node: XTI_TCP_STREAM70119
+Node: XTI_UDP_STREAM70764
+Node: SCTP_STREAM71409
+Node: DLCO_STREAM72109
+Node: DLCL_STREAM74082
+Node: STREAM_STREAM74956
+Node: DG_STREAM75802
+Node: Using Netperf to Measure Request/Response76471
+Node: Issues in Request/Response78392
+Node: Options Common to TCP UDP and SCTP _RR tests80398
+Node: TCP_RR85377
+Node: TCP_CC87721
+Node: TCP_CRR89918
+Node: UDP_RR90964
+Node: XTI_TCP_RR92985
+Node: XTI_TCP_CC93568
+Node: XTI_TCP_CRR93734
+Node: XTI_UDP_RR93902
+Node: DLCL_RR94479
+Node: DLCO_RR94632
+Node: SCTP_RR94784
+Node: Using Netperf to Measure Aggregate Performance94920
+Node: Running Concurrent Netperf Tests95755
+Node: Using --enable-burst99647
+Node: Using Netperf to Measure Bidirectional Transfer105832
+Node: Bidirectional Transfer with Concurrent Tests106905
+Node: Bidirectional Transfer with TCP_RR108771
+Node: Other Netperf Tests111305
+Node: CPU rate calibration111751
+Node: Address Resolution114092
+Node: Enhancing Netperf116068
+Node: Netperf4117305
+Node: Concept Index118214
+Node: Option Index120604
+
+End Tag Table
diff --git a/netperf-2.4.4/doc/netperf.man b/netperf-2.4.4/doc/netperf.man
new file mode 100644
index 0000000..f1002c4
--- /dev/null
+++ b/netperf-2.4.4/doc/netperf.man
@@ -0,0 +1,214 @@
+.TH netperf 1 ""
+.SH NAME
+
+netperf \- a network performance benchmark
+
+.SH SYNOPSIS
+
+.B netperf
+[global options] -- [test specific options]
+
+.SH DESCRIPTION
+.B Netperf
+is a benchmark that can be used to measure various aspects of
+networking performance.
+Currently, its focus is on bulk data transfer and request/response
+performance using either TCP or UDP, and the Berkeley Sockets
+interface. In addition, tests for DLPI, and Unix Domain
+Sockets, tests for IPv6 may be conditionally compiled-in.
+
+.SS GLOBAL OPTIONS
+
+.TP
+.B \-4
+Use AF_INET (aka IPv4) addressing for the control and possibly data
+connections.
+.TP
+.B \-6
+Use AF_INET6 (aka IPv6) addressing for the control and possibly data
+connections.
+.TP
+.B \-a sizespec
+Alter the send and receive buffer alignments on the local system.
+This defaults to 8 bytes.
+.TP
+.B \-A sizespec
+As -a, but for the remote system.
+.TP
+.B \-B brandstr
+Add brandstr to the output of a test with banners disabled.
+.TP
+.B \-c [rate]
+Request CPU utilization and service demand calculations for the
+local system. If the optional rate parameter is specified,
+.B netperf
+will use that instead of calculating the rate itself.
+.TP
+.B \-C [rate]
+As -c, but for the remote system.
+.TP
+.B \-d
+Increase the quantity of debugging output displayed during
+a test (possibly at the expense of performance).
+.TP
+.B \-D [secs,units] (*)
+Display interim results at least every secs seconds uning units as the
+initial guess for units per second. This is only available when
+netperf has been configured with --enable-demo.
+.TP
+.B \-f GMKgmk
+Change the units of measure for *_STREAM tests. Capital letters are
+powers of two, lowercase are powers of ten.
+.TP
+.B \-F fill_file
+Pre-fill the send buffers with data from the named file. This is
+intended to provide a means for avoiding buffers that are filled with
+data which is trivially easy to compress. A good choice for a file
+that should be present on any system is this manpage - netperf.man.
+Other files may be provided as part of the distribution.
+.TP
+.B \-h
+Display a usage string, and exit.
+.TP
+.B \-H name|ip,family (*)
+Set the hostname (or IP address) and address family to use to
+establish the control connection to the remote system. Passing a
+single name with no comma will only set remote_host and will leave
+selection of address family for the control connection to the stack or
+by a -4 -r -6 command line option.
+.TP
+.B \-i max,min
+Set the maximum and minimum number of iterations when trying to reach
+certain confidence levels.
+.TP
+.B \-I lvl,[,intvl]
+Specify the confidence level (either 95 or 99 - 99 is the default) and
+the width of the confidence interval as a percentage (default 10)
+.TP
+.B \-l testlen
+Specify the length of the test (default 10 seconds).
+A negative value sets the number of request/response transactions,
+or the number of bytes for a stream test.
+.TP
+.B \-L name|ip,fam (*)
+Set the local name|IP and/or address family for the socket used for
+the control connection to the remote netserver.
+.TP
+.B \-n numcpus
+Specify the number of CPU's in the system on those systems for which
+netperf has no way to find the number of CPU's programatically.
+.TP
+.B \-N
+This option will tell netperf to not establish a control connection to
+a remote netserver. Instead it will try to establish a data
+connection directly, using only the information supplied by the
+command line parameters and/or internal defaults. Unless other ports
+are provided by the command line, by default the data connection will
+be to the "discard" port for a "STREAM" or "SENDFILE" test, the "echo"
+port for an "RR" test or the "chargen" port for a "MAERTS" test.
+.TP
+.B \-o sizespec
+Set an offset from the alignment specified with -a.
+.TP
+.B \-O sizespec
+As -o, but for the remote system.
+.TP
+.B \-p portnum,locport (*)
+Direct the control connection to a netserver listening on the
+specified port, rather than using a "netperf" entry in
+/etc/services or the internal default (port 12865). If ",locport" is
+specified the control connection will be established from that local
+port number. Specifying a single port number with no comma will
+specify only the remote netserver port number and will leave local
+port number selection to the stack.
+.TP
+.B \-P 0|1
+Show (1) or suppress (0) the test banner.
+.TP
+.B \-t testname
+Specify the test to perform.
+Valid testnames include, but are not limited to, nor always compiled-in:
+.RS
+.RS
+.nf
+.I TCP_STREAM
+.I TCP_SENDFILE
+.I TCP_MAERTS
+.I TCP_RR
+.I TCP_CRR
+.I UDP_STREAM
+.I UDP_RR
+.I DLCO_STREAM
+.I DLCO_RR
+.I DLCL_STREAM
+.I DLCL_RR
+.I STREAM_STREAM
+.I STREAM_RR
+.I DG_STREAM
+.I DG_RR
+.I LOC_CPU
+.I REM_CPU
+.fi
+.RE
+.RE
+.TP
+.B \-T lcpu,remcpu
+Request that netperf be bound to CPU lcpu and/or netserver be bound to
+CPU rcpu.
+.TP
+.B \-v verbosity
+Set the verbosity level for the test (only with -P).
+
+
+.SS TEST SPECIFIC OPTIONS
+
+.TP
+.B \-h
+Display a usage string based on the test name set with -t, and exit.
+
+Please consult the netperf manual
+.I
+Netperf: A Network Performance Benchmark
+(netperf.ps) for more information. Or you can join and mail to
+netperf-talk@netperf.org.
+
+.SH NOTE
+For those options taking two parms, at least one must be specified;
+specifying one value without a comma will set both parms to that
+value, specifying a value with a leading comma will set just the
+second parm, a value with a trailing comma will set just the first. To
+set each parm to unique values, specify both and separate them with a
+comma.
+
+* For these options taking two parms, specifying one value with no
+comma will only set the first parms and will leave the second at the
+default value. To set the second value it must be preceded with a
+comma or be a comma-separated pair. This is to retain previous netperf
+behaviour.
+
+
+.SH BUGS
+There are bound to be bugs. If you think you have found a bug, please
+mention it in netperf-talk@netperf.org. List membership is required
+to send email to the list. See
+http://www.netperf.org/cgi-bin/mailman/listinfo/netperf-talk . If all
+else fails send email to Rick Jones <raj@cup.hp.com>.
+
+.SH SEE ALSO
+.C netserver
+.br
+.I
+Netperf: A Network Performance Benchmark
+.br
+http://www.netperf.org/
+
+.SH AUTHORS
+HP Information Networks Division - Networking Performance Team.
+.br
+Rick Jones <raj@cup.hp.com>
+.br
+Karen Choy HP IND
+.br
+Dave Shield <daves@csc.liv.ac.uk> (man pages)
+.br
+Others too numerous to mention here - see the ACKNWLDGMNTS file
diff --git a/netperf-2.4.4/doc/netperf.texi b/netperf-2.4.4/doc/netperf.texi
new file mode 100644
index 0000000..b4961fd
--- /dev/null
+++ b/netperf-2.4.4/doc/netperf.texi
@@ -0,0 +1,2822 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename netperf.info
+@settitle Care and Feeding of Netperf 2.4.X
+@c %**end of header
+
+@copying
+This is Rick Jones' feeble attempt at a Texinfo-based manual for the
+netperf benchmark.
+
+Copyright @copyright{} 2005-2007 Hewlett-Packard Company
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+per the terms of the netperf source licence, a copy of which can be
+found in the file @file{COPYING} of the basic netperf distribution.
+@end quotation
+@end copying
+
+@titlepage
+@title Care and Feeding of Netperf
+@subtitle Versions 2.4.3 and Later
+@author Rick Jones @email{rick.jones2@@hp.com}
+@c this is here to start the copyright page
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@c begin with a table of contents
+@contents
+
+@ifnottex
+@node Top, Introduction, (dir), (dir)
+@top Netperf Manual
+
+@insertcopying
+@end ifnottex
+
+@menu
+* Introduction:: An introduction to netperf - what it is and whatit is not.
+* Installing Netperf:: How to go about installing netperf.
+* The Design of Netperf::
+* Global Command-line Options::
+* Using Netperf to Measure Bulk Data Transfer::
+* Using Netperf to Measure Request/Response ::
+* Using Netperf to Measure Aggregate Performance::
+* Using Netperf to Measure Bidirectional Transfer::
+* Other Netperf Tests::
+* Address Resolution::
+* Enhancing Netperf::
+* Netperf4::
+* Concept Index::
+* Option Index::
+
+@detailmenu
+ --- The Detailed Node Listing ---
+
+Introduction
+
+* Conventions::
+
+Installing Netperf
+
+* Getting Netperf Bits::
+* Installing Netperf Bits::
+* Verifying Installation::
+
+The Design of Netperf
+
+* CPU Utilization::
+
+Global Command-line Options
+
+* Command-line Options Syntax::
+* Global Options::
+
+Using Netperf to Measure Bulk Data Transfer
+
+* Issues in Bulk Transfer::
+* Options common to TCP UDP and SCTP tests::
+
+Options common to TCP UDP and SCTP tests
+
+* TCP_STREAM::
+* TCP_MAERTS::
+* TCP_SENDFILE::
+* UDP_STREAM::
+* XTI_TCP_STREAM::
+* XTI_UDP_STREAM::
+* SCTP_STREAM::
+* DLCO_STREAM::
+* DLCL_STREAM::
+* STREAM_STREAM::
+* DG_STREAM::
+
+Using Netperf to Measure Request/Response
+
+* Issues in Request/Response::
+* Options Common to TCP UDP and SCTP _RR tests::
+
+Options Common to TCP UDP and SCTP _RR tests
+
+* TCP_RR::
+* TCP_CC::
+* TCP_CRR::
+* UDP_RR::
+* XTI_TCP_RR::
+* XTI_TCP_CC::
+* XTI_TCP_CRR::
+* XTI_UDP_RR::
+* DLCL_RR::
+* DLCO_RR::
+* SCTP_RR::
+
+Using Netperf to Measure Aggregate Performance
+
+* Running Concurrent Netperf Tests::
+* Using --enable-burst::
+
+Using Netperf to Measure Bidirectional Transfer
+
+* Bidirectional Transfer with Concurrent Tests::
+* Bidirectional Transfer with TCP_RR::
+
+Other Netperf Tests
+
+* CPU rate calibration::
+
+@end detailmenu
+@end menu
+
+@node Introduction, Installing Netperf, Top, Top
+@chapter Introduction
+
+@cindex Introduction
+
+Netperf is a benchmark that can be use to measure various aspect of
+networking performance. The primary foci are bulk (aka
+unidirectional) data transfer and request/response performance using
+either TCP or UDP and the Berkeley Sockets interface. As of this
+writing, the tests available either unconditionally or conditionally
+include:
+
+@itemize @bullet
+@item
+TCP and UDP unidirectional transfer and request/response over IPv4 and
+IPv6 using the Sockets interface.
+@item
+TCP and UDP unidirectional transfer and request/response over IPv4
+using the XTI interface.
+@item
+Link-level unidirectional transfer and request/response using the DLPI
+interface.
+@item
+Unix domain sockets
+@item
+SCTP unidirectional transfer and request/response over IPv4 and IPv6
+using the sockets interface.
+@end itemize
+
+While not every revision of netperf will work on every platform
+listed, the intention is that at least some version of netperf will
+work on the following platforms:
+
+@itemize @bullet
+@item
+Unix - at least all the major variants.
+@item
+Linux
+@item
+Windows
+@item
+OpenVMS
+@item
+Others
+@end itemize
+
+Netperf is maintained and informally supported primarily by Rick
+Jones, who can perhaps be best described as Netperf Contributing
+Editor. Non-trivial and very appreciated assistance comes from others
+in the network performance community, who are too numerous to mention
+here. While it is often used by them, netperf is NOT supported via any
+of the formal Hewlett-Packard support channels. You should feel free
+to make enhancements and modifications to netperf to suit your
+nefarious porpoises, so long as you stay within the guidelines of the
+netperf copyright. If you feel so inclined, you can send your changes
+to
+@email{netperf-feedback@@netperf.org,netperf-feedback} for possible
+inclusion into subsequent versions of netperf.
+
+If you would prefer to make contributions to networking benchmark
+using certified ``open source'' license, please considuer netperf4,
+which is distributed under the terms of the GPL.
+
+The @email{netperf-talk@@netperf.org,netperf-talk} mailing list is
+available to discuss the care and feeding of netperf with others who
+share your interest in network performance benchmarking. The
+netperf-talk mailing list is a closed list and you must first
+subscribe by sending email to
+@email{netperf-talk-request@@netperf.org,netperf-talk-request}.
+
+
+@menu
+* Conventions::
+@end menu
+
+@node Conventions, , Introduction, Introduction
+@section Conventions
+
+A @dfn{sizespec} is a one or two item, comma-separated list used as an
+argument to a command-line option that can set one or two, related
+netperf parameters. If you wish to set both parameters to separate
+values, items should be separated by a comma:
+
+@example
+parameter1,parameter2
+@end example
+
+If you wish to set the first parameter without altering the value of
+the second from its default, you should follow the first item with a
+comma:
+
+@example
+parameter1,
+@end example
+
+
+Likewise, precede the item with a comma if you wish to set only the
+second parameter:
+
+@example
+,parameter2
+@end example
+
+An item with no commas:
+
+@example
+parameter1and2
+@end example
+
+will set both parameters to the same value. This last mode is one of
+the most frequently used.
+
+There is another variant of the comma-separated, two-item list called
+a @dfn{optionspec} which is like a sizespec with the exception that a
+single item with no comma:
+
+@example
+parameter1
+@end example
+
+will only set the value of the first parameter and will leave the
+second parameter at its default value.
+
+Netperf has two types of command-line options. The first are global
+command line options. They are essentially any option not tied to a
+particular test or group of tests. An example of a global
+command-line option is the one which sets the test type - @option{-t}.
+
+The second type of options are test-specific options. These are
+options which are only applicable to a particular test or set of
+tests. An example of a test-specific option would be the send socket
+buffer size for a TCP_STREAM test.
+
+Global command-line options are specified first with test-specific
+options following after a @code{--} as in:
+
+@example
+netperf <global> -- <test-specific>
+@end example
+
+
+@node Installing Netperf, The Design of Netperf, Introduction, Top
+@chapter Installing Netperf
+
+@cindex Installation
+
+Netperf's primary form of distribution is source code. This allows
+installation on systems other than those to which the authors have
+ready access and thus the ability to create binaries. There are two
+styles of netperf installation. The first runs the netperf server
+program - netserver - as a child of inetd. This requires the
+installer to have sufficient privileges to edit the files
+@file{/etc/services} and @file{/etc/inetd.conf} or their
+platform-specific equivalents.
+
+The second style is to run netserver as a standalone daemon. This
+second method does not require edit privileges on @file{/etc/services}
+and @file{/etc/inetd.conf} but does mean you must remember to run the
+netserver program explicitly after every system reboot.
+
+This manual assumes that those wishing to measure networking
+performance already know how to use anonymous FTP and/or a web
+browser. It is also expected that you have at least a passing
+familiarity with the networking protocols and interfaces involved. In
+all honesty, if you do not have such familiarity, likely as not you
+have some experience to gain before attempting network performance
+measurements. The excellent texts by authors such as Stevens, Fenner
+and Rudoff and/or Stallings would be good starting points. There are
+likely other excellent sources out there as well.
+
+@menu
+* Getting Netperf Bits::
+* Installing Netperf Bits::
+* Verifying Installation::
+@end menu
+
+@node Getting Netperf Bits, Installing Netperf Bits, Installing Netperf, Installing Netperf
+@section Getting Netperf Bits
+
+Gzipped tar files of netperf sources can be retrieved via
+@uref{ftp://ftp.netperf.org/netperf,anonymous FTP}
+for ``released'' versions of the bits. Pre-release versions of the
+bits can be retrieved via anonymous FTP from the
+@uref{ftp://ftp.netperf.org/netperf/experimental,experimental} subdirectory.
+
+For convenience and ease of remembering, a link to the download site
+is provided via the
+@uref{http://www.netperf.org/, NetperfPage}
+
+The bits corresponding to each discrete release of netperf are
+@uref{http://www.netperf.org/svn/netperf2/tags,tagged} for retrieval
+via subversion. For example, there is a tag for the first version
+corresponding to this version of the manual -
+@uref{http://www.netperf.org/svn/netperf2/tags/netperf-2.4.3,netperf
+2.4.3}. Those wishing to be on the bleeding edge of netperf
+development can use subversion to grab the
+@uref{http://www.netperf.org/svn/netperf2/trunk,top of trunk}.
+
+There are likely other places around the Internet from which one can
+download netperf bits. These may be simple mirrors of the main
+netperf site, or they may be local variants on netperf. As with
+anything one downloads from the Internet, take care to make sure it is
+what you really wanted and isn't some malicious Trojan or whatnot.
+Caveat downloader.
+
+As a general rule, binaries of netperf and netserver are not
+distributed from ftp.netperf.org. From time to time a kind soul or
+souls has packaged netperf as a Debian package available via the
+apt-get mechanism or as an RPM. I would be most interested in
+learning how to enhance the makefiles to make that easier for people,
+and perhaps to generate HP-UX swinstall``depots.''
+
+@node Installing Netperf Bits, Verifying Installation, Getting Netperf Bits, Installing Netperf
+@section Installing Netperf
+
+Once you have downloaded the tar file of netperf sources onto your
+system(s), it is necessary to unpack the tar file, cd to the netperf
+directory, run configure and then make. Most of the time it should be
+sufficient to just:
+
+@example
+gzcat <netperf-version>.tar.gz | tar xf -
+cd <netperf-version>
+./configure
+make
+make install
+@end example
+
+Most of the ``usual'' configure script options should be present
+dealing with where to install binaries and whatnot.
+@example
+./configure --help
+@end example
+should list all of those and more.
+
+@vindex --enable-cpuutil, Configure
+If the netperf configure script does not know how to automagically
+detect which CPU utilization mechanism to use on your platform you may
+want to add a @code{--enable-cpuutil=mumble} option to the configure
+command. If you have knowledge and/or experience to contribute to
+that area, feel free to contact @email{netperf-feedback@@netperf.org}.
+
+@vindex --enable-xti, Configure
+@vindex --enable-unix, Configure
+@vindex --enable-dlpi, Configure
+@vindex --enable-sctp, Configure
+Similarly, if you want tests using the XTI interface, Unix Domain
+Sockets, DLPI or SCTP it will be necessary to add one or more
+@code{--enable-[xti|unix|dlpi|sctp]=yes} options to the configure
+command. As of this writing, the configure script will not include
+those tests automagically.
+
+On some platforms, it may be necessary to precede the configure
+command with a CFLAGS and/or LIBS variable as the netperf configure
+script is not yet smart enough to set them itself. Whenever possible,
+these requirements will be found in @file{README.@var{platform}} files.
+Expertise and assistance in making that more automagical in the
+configure script would be most welcome.
+
+@cindex Limiting Bandwidth
+@cindex Bandwidth Limitation
+@vindex --enable-intervals, Configure
+@vindex --enable-histogram, Configure
+Other optional configure-time settings include
+@code{--enable-intervals=yes} to give netperf the ability to ``pace''
+its _STREAM tests and @code{--enable-histogram=yes} to have netperf
+keep a histogram of interesting times. Each of these will have some
+effect on the measured result. If your system supports
+@code{gethrtime()} the effect of the histogram measurement should be
+minimized but probably still measurable. For example, the histogram
+of a netperf TCP_RR test will be of the individual transaction times:
+@example
+netperf -t TCP_RR -H lag -v 2
+TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to lag.hpl.hp.com (15.4.89.214) port 0 AF_INET : histogram
+Local /Remote
+Socket Size Request Resp. Elapsed Trans.
+Send Recv Size Size Time Rate
+bytes Bytes bytes bytes secs. per sec
+
+16384 87380 1 1 10.00 3538.82
+32768 32768
+Alignment Offset
+Local Remote Local Remote
+Send Recv Send Recv
+ 8 0 0 0
+Histogram of request/response times
+UNIT_USEC : 0: 0: 0: 0: 0: 0: 0: 0: 0: 0
+TEN_USEC : 0: 0: 0: 0: 0: 0: 0: 0: 0: 0
+HUNDRED_USEC : 0: 34480: 111: 13: 12: 6: 9: 3: 4: 7
+UNIT_MSEC : 0: 60: 50: 51: 44: 44: 72: 119: 100: 101
+TEN_MSEC : 0: 105: 0: 0: 0: 0: 0: 0: 0: 0
+HUNDRED_MSEC : 0: 0: 0: 0: 0: 0: 0: 0: 0: 0
+UNIT_SEC : 0: 0: 0: 0: 0: 0: 0: 0: 0: 0
+TEN_SEC : 0: 0: 0: 0: 0: 0: 0: 0: 0: 0
+>100_SECS: 0
+HIST_TOTAL: 35391
+@end example
+
+Long-time users of netperf will notice the expansion of the main test
+header. This stems from the merging-in of IPv6 with the standard IPv4
+tests and the addition of code to specify addressing information for
+both sides of the data connection.
+
+The histogram you see above is basically a base-10 log histogram where
+we can see that most of the transaction times were on the order of one
+hundred to one-hundred, ninety-nine microseconds, but they were
+occasionally as long as ten to nineteen milliseconds
+
+The @option{--enable-demo=yes} configure option will cause code to be
+included to report interim results during a test run. The rate at
+which interim results are reported can then be controlled via the
+global @option{-D} option. Here is an example of --enable-demo mode
+output:
+
+@example
+src/netperf -D 1.35 -H lag -f M
+TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to lag.hpl.hp.com (15.4.89.214) port 0 AF_INET : demo
+Interim result: 9.66 MBytes/s over 1.67 seconds
+Interim result: 9.64 MBytes/s over 1.35 seconds
+Interim result: 9.58 MBytes/s over 1.36 seconds
+Interim result: 9.51 MBytes/s over 1.36 seconds
+Interim result: 9.71 MBytes/s over 1.35 seconds
+Interim result: 9.66 MBytes/s over 1.36 seconds
+Interim result: 9.61 MBytes/s over 1.36 seconds
+Recv Send Send
+Socket Socket Message Elapsed
+Size Size Size Time Throughput
+bytes bytes bytes secs. MBytes/sec
+
+ 32768 16384 16384 10.00 9.61
+@end example
+
+Notice how the units of the interim result track that requested by the
+@option{-f} option. Also notice that sometimes the interval will be
+longer than the value specified in the @option{-D} option. This is
+normal and stems from how demo mode is implemented without relying on
+interval timers, but by calculating how many units of work must be
+performed to take at least the desired interval.
+
+As of this writing, a @code{make install} will not actually update the
+files @file{/etc/services} and/or @file{/etc/inetd.conf} or their
+platform-specific equivalents. It remains necessary to perform that
+bit of installation magic by hand. Patches to the makefile sources to
+effect an automagic editing of the necessary files to have netperf
+installed as a child of inetd would be most welcome.
+
+Starting the netserver as a standalone daemon should be as easy as:
+@example
+$ netserver
+Starting netserver at port 12865
+Starting netserver at hostname 0.0.0.0 port 12865 and family 0
+@end example
+
+Over time the specifics of the messages netserver prints to the screen
+may change but the gist will remain the same.
+
+If the compilation of netperf or netserver happens to fail, feel free
+to contact @email{netperf-feedback@@netperf.org} or join and ask in
+@email{netperf-talk@@netperf.org}. However, it is quite important
+that you include the actual compilation errors and perhaps even the
+configure log in your email. Otherwise, it will be that much more
+difficult for someone to assist you.
+
+@node Verifying Installation, , Installing Netperf Bits, Installing Netperf
+@section Verifying Installation
+
+Basically, once netperf is installed and netserver is configured as a
+child of inetd, or launched as a standalone daemon, simply typing:
+@example
+netperf
+@end example
+should result in output similar to the following:
+@example
+$ netperf
+TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to localhost.localdomain (127.0.0.1) port 0 AF_INET
+Recv Send Send
+Socket Socket Message Elapsed
+Size Size Size Time Throughput
+bytes bytes bytes secs. 10^6bits/sec
+
+ 87380 16384 16384 10.00 2997.84
+@end example
+
+
+@node The Design of Netperf, Global Command-line Options, Installing Netperf, Top
+@chapter The Design of Netperf
+
+@cindex Design of Netperf
+
+Netperf is designed around a basic client-server model. There are
+two executables - netperf and netserver. Generally you will only
+execute the netperf program, with the netserver program being invoked
+by the remote system's inetd or equivalent.
+When you execute netperf, the first that that will happen is the
+establishment of a control connection to the remote system. This
+connection will be used to pass test configuration information and
+results to and from the remote system. Regardless of the type of test
+to be run, the control connection will be a TCP connection using BSD
+sockets. The control connection can use either IPv4 or IPv6.
+
+Once the control connection is up and the configuration information
+has been passed, a separate ``data'' connection will be opened for the
+measurement itself using the API's and protocols appropriate for the
+specified test. When the test is completed, the data connection will
+be torn-down and results from the netserver will be passed-back via the
+control connection and combined with netperf's result for display to
+the user.
+
+Netperf places no traffic on the control connection while a test is in
+progress. Certain TCP options, such as SO_KEEPALIVE, if set as your
+systems' default, may put packets out on the control connection while
+a test is in progress. Generally speaking this will have no effect on
+the results.
+
+@menu
+* CPU Utilization::
+@end menu
+
+@cindex CPU Utilization
+@node CPU Utilization, , The Design of Netperf, The Design of Netperf
+@section CPU Utilization
+
+CPU utilization is an important, and alas all-too infrequently
+reported component of networking performance. Unfortunately, it can
+be one of the most difficult metrics to measure accurately as many
+systems offer mechanisms that are at best il-suited to measuring CPU
+utilization in high interrupt rate (eg networking) situations.
+
+CPU utilization in netperf is reported as a value between 0 and 100%
+regardless of the number of CPUs involved. In addition to CPU
+utilization, netperf will report a metric called a @dfn{service
+demand}. The service demand is the normalization of CPU utilization
+and work performed. For a _STREAM test it is the microseconds of CPU
+time consumed to transfer on KB (K == 1024) of data. For a _RR test
+it is the microseconds of CPU time consumed processing a single
+transaction. For both CPU utilization and service demand, lower is
+better.
+
+Service demand can be particularly useful when trying to gauge the
+effect of a performance change. It is essentially a measure of
+efficiency, with smaller values being more efficient.
+
+Netperf is coded to be able to use one of several, generally
+platform-specific CPU utilization measurement mechanisms. Single
+letter codes will be included in the CPU portion of the test banner to
+indicate which mechanism was used on each of the local (netperf) and
+remote (netserver) system.
+
+As of this writing those codes are:
+
+@table @code
+@item U
+The CPU utilization measurement mechanism was unknown to netperf or
+netperf/netserver was not compiled to include CPU utilization
+measurements. The code for the null CPU utilization mechanism can be
+found in @file{src/netcpu_none.c}.
+@item I
+An HP-UX-specific CPU utilization mechanism whereby the kernel
+incremented a per-CPU counter by one for each trip through the idle
+loop. This mechanism was only available on specially-compiled HP-UX
+kernels prior to HP-UX 10 and is mentioned here only for the sake of
+historical completeness and perhaps as a suggestion to those who might
+be altering other operating systems. While rather simple, perhaps even
+simplistic, this mechanism was quite robust and was not affected by
+the concerns of statistical methods, or methods attempting to track
+time in each of user, kernel, interrupt and idle modes which require
+quite careful accounting. It can be thought-of as the in-kernel
+version of the looper @code{L} mechanism without the context switch
+overhead. This mechanism required calibration.
+@item P
+An HP-UX-specific CPU utilization mechanism whereby the kernel
+keeps-track of time (in the form of CPU cycles) spent in the kernel
+idle loop (HP-UX 10.0 to 11.23 inclusive), or where the kernel keeps
+track of time spent in idle, user, kernel and interrupt processing
+(HP-UX 11.23 and later). The former requires calibration, the latter
+does not. Values in either case are retrieved via one of the pstat(2)
+family of calls, hence the use of the letter @code{P}. The code for
+these mechanisms is found in @file{src/netcpu_pstat.c} and
+@file{src/netcpu_pstatnew.c} respectively.
+@item K
+A Solaris-specific CPU utilization mechanism where by the kernel
+keeps track of ticks (eg HZ) spent in the idle loop. This method is
+statistical and is known to be inaccurate when the interrupt rate is
+above epsilon as time spent processing interrupts is not subtracted
+from idle. The value is retrieved via a kstat() call - hence the use
+of the letter @code{K}. Since this mechanism uses units of ticks (HZ)
+the calibration value should invariably match HZ. (Eg 100) The code
+for this mechanism is implemented in @file{src/netcpu_kstat.c}.
+@item M
+A Solaris-specific mechanism available on Solaris 10 and latter which
+uses the new microstate accounting mechanisms. There are two, alas,
+overlapping, mechanisms. The first tracks nanoseconds spent in user,
+kernel, and idle modes. The second mechanism tracks nanoseconds spent
+in interrupt. Since the mechanisms overlap, netperf goes through some
+hand-waving to try to ``fix'' the problem. Since the accuracy of the
+handwaving cannot be completely determined, one must presume that
+while better than the @code{K} mechanism, this mechanism too is not
+without issues. The values are retrieved via kstat() calls, but the
+letter code is set to @code{M} to distinguish this mechanism from the
+even less accurate @code{K} mechanism. The code for this mechanism is
+implemented in @file{src/netcpu_kstat10.c}.
+@item L
+A mechanism based on ``looper''or ``soaker'' processes which sit in
+tight loops counting as fast as they possibly can. This mechanism
+starts a looper process for each known CPU on the system. The effect
+of processor hyperthreading on the mechanism is not yet known. This
+mechanism definitely requires calibration. The code for the
+``looper''mechanism can be found in @file{src/netcpu_looper.c}
+@item N
+A Microsoft Windows-specific mechanism, the code for which can be
+found in @file{src/netcpu_ntperf.c}. This mechanism too is based on
+what appears to be a form of micro-state accounting and requires no
+calibration. On laptops, or other systems which may dynamically alter
+the CPU frequency to minimize power consumtion, it has been suggested
+that this mechanism may become slightly confsed, in which case using
+BIOS settings to disable the power saving would be indicated.
+
+@item S
+This mechanism uses @file{/proc/stat} on Linux to retrieve time
+(ticks) spent in idle mode. It is thought but not known to be
+reasonably accurate. The code for this mechanism can be found in
+@file{src/netcpu_procstat.c}.
+@item C
+A mechanism somewhat similar to @code{S} but using the sysctl() call
+on BSD-like Operating systems (*BSD and MacOS X). The code for this
+mechanism can be found in @file{src/netcpu_sysctl.c}.
+@item Others
+Other mechanisms included in netperf in the past have included using
+the times() and getrusage() calls. These calls are actually rather
+poorly suited to the task of measuring CPU overhead for networking as
+they tend to be process-specific and much network-related processing
+can happen outside the context of a process, in places where it is not
+a given it will be charged to the correct, or even a process. They
+are mentioned here as a warning to anyone seeing those mechanisms used
+in other networking benchmarks. These mechanisms are not available in
+netperf 2.4.0 and later.
+@end table
+
+
+
+For many platforms, the configure script will chose the best available
+CPU utilization mechanism. However, some platforms have no
+particularly good mechanisms. On those platforms, it is probably best
+to use the ``LOOPER'' mechanism which is basically some number of
+processes (as many as there are processors) sitting in tight little
+loops counting as fast as they can. The rate at which the loopers
+count when the system is believed to be idle is compared with the rate
+when the system is running netperf and the ratio is used to compute
+CPU utilization.
+
+In the past, netperf included some mechanisms that only reported CPU
+time charged to the calling process. Those mechanisms have been
+removed from netperf versions 2.4.0 and later because they are
+hopelessly inaccurate. Networking can and often results in CPU time
+being spent in places - such as interrupt contexts - that do not get
+charged to a or the correct process.
+
+In fact, time spent in the processing of interrupts is a common issue
+for many CPU utilization mechanisms. In particular, the ``PSTAT''
+mechanism was eventually known to have problems accounting for certain
+interrupt time prior to HP-UX 11.11 (11iv1). HP-UX 11iv1 and later
+are known to be good. The ``KSTAT'' mechanism is known to have
+problems on all versions of Solaris up to and including Solaris 10.
+Even the microstate accounting available via kstat in Solaris 10 has
+issues, though perhaps not as bad as those of prior versions.
+
+The /proc/stat mechanism under Linux is in what the author would
+consider an ``uncertain'' category as it appears to be statistical,
+which may also have issues with time spent processing interrupts.
+
+In summary, be sure to ``sanity-check'' the CPU utilization figures
+with other mechanisms. However, platform tools such as top, vmstat or
+mpstat are often based on the same mechanisms used by netperf.
+
+@node Global Command-line Options, Using Netperf to Measure Bulk Data Transfer, The Design of Netperf, Top
+@chapter Global Command-line Options
+
+This section describes each of the global command-line options
+available in the netperf and netserver binaries. Essentially, it is
+an expanded version of the usage information displayed by netperf or
+netserver when invoked with the @option{-h} global command-line
+option.
+
+@menu
+* Command-line Options Syntax::
+* Global Options::
+@end menu
+
+@node Command-line Options Syntax, Global Options, Global Command-line Options, Global Command-line Options
+@comment node-name, next, previous, up
+@section Command-line Options Syntax
+
+Revision 1.8 of netperf introduced enough new functionality to overrun
+the English alphabet for mnemonic command-line option names, and the
+author was not and is not quite ready to switch to the contemporary
+@option{--mumble} style of command-line options. (Call him a Luddite).
+
+For this reason, the command-line options were split into two parts -
+the first are the global command-line options. They are options that
+affect nearly any and every test type of netperf. The second type are
+the test-specific command-line options. Both are entered on the same
+command line, but they must be separated from one another by a @code{--}
+for correct parsing. Global command-line options come first, followed
+by the @code{--} and then test-specific command-line options. If there
+are no test-specific options to be set, the @code{--} may be omitted. If
+there are no global command-line options to be set, test-specific
+options must still be preceded by a @code{--}. For example:
+@example
+netperf <global> -- <test-specific>
+@end example
+sets both global and test-specific options:
+@example
+netperf <global>
+@end example
+sets just global options and:
+@example
+netperf -- <test-specific>
+@end example
+sets just test-specific options.
+
+@node Global Options, , Command-line Options Syntax, Global Command-line Options
+@comment node-name, next, previous, up
+@section Global Options
+
+@table @code
+@vindex -a, Global
+@item -a <sizespec>
+This option allows you to alter the alignment of the buffers used in
+the sending and receiving calls on the local system.. Changing the
+alignment of the buffers can force the system to use different copy
+schemes, which can have a measurable effect on performance. If the
+page size for the system were 4096 bytes, and you want to pass
+page-aligned buffers beginning on page boundaries, you could use
+@samp{-a 4096}. By default the units are bytes, but suffix of ``G,''
+``M,'' or ``K'' will specify the units to be 2^30 (GB), 2^20 (MB) or
+2^10 (KB) respectively. A suffix of ``g,'' ``m'' or ``k'' will specify
+units of 10^9, 10^6 or 10^3 bytes respectively. [Default: 8 bytes]
+
+@vindex -A, Global
+@item -A <sizespec>
+This option is identical to the @option{-a} option with the difference
+being it affects alignments for the remote system.
+
+@vindex -b, Global
+@item -b <size>
+This option is only present when netperf has been configure with
+--enable-intervals=yes prior to compilation. It sets the size of the
+burst of send calls in a _STREAM test. When used in conjunction with
+the @option{-w} option it can cause the rate at which data is sent to
+be ``paced.''
+
+@vindex -B, Global
+@item -B <string>
+This option will cause @option{<string>} to be appended to the brief
+(see -P) output of netperf.
+
+@vindex -c, Global
+@item -c [rate]
+This option will ask that CPU utilization and service demand be
+calculated for the local system. For those CPU utilization mechanisms
+requiring calibration, the options rate parameter may be specified to
+preclude running another calibration step, saving 40 seconds of time.
+For those CPU utilization mechanisms requiring no calibration, the
+optional rate parameter will be utterly and completely ignored.
+[Default: no CPU measurements]
+
+@vindex -C, Global
+@item -C [rate]
+This option requests CPU utilization and service demand calculations
+for the remote system. It is otherwise identical to the @option{-c}
+option.
+
+@vindex -d, Global
+@item -d
+Each instance of this option will increase the quantity of debugging
+output displayed during a test. If the debugging output level is set
+high enough, it may have a measurable effect on performance.
+Debugging information for the local system is printed to stdout.
+Debugging information for the remote system is sent by default to the
+file @file{/tmp/netperf.debug}. [Default: no debugging output]
+
+@vindex -D, Global
+@item -D [interval,units]
+This option is only available when netperf is configured with
+--enable-demo=yes. When set, it will cause netperf to emit periodic
+reports of performance during the run. [@var{interval},@var{units}]
+follow the semantics of an optionspec. If specified,
+@var{interval} gives the minimum interval in real seconds, it does not
+have to be whole seconds. The @var{units} value can be used for the
+first guess as to how many units of work (bytes or transactions) must
+be done to take at least @var{interval} seconds. If omitted,
+@var{interval} defaults to one second and @var{units} to values
+specific to each test type.
+
+@vindex -f, Global
+@item -f G|M|K|g|m|k
+This option can be used to change the reporting units for _STREAM
+tests. Arguments of ``G,'' ``M,'' or ``K'' will set the units to
+2^30, 2^20 or 2^10 bytes/s respectively (EG power of two GB, MB or
+KB). Arguments of ``g,'' ``,m'' or ``k'' will set the units to 10^9,
+10^6 or 10^3 bits/s respectively. [Default: 'm' or 10^6 bits/s]
+
+@vindex -F, Global
+@item -F <fillfile>
+This option specified the file from which send which buffers will be
+pre-filled . While the buffers will contain data from the specified
+file, the file is not fully transfered to the remote system as the
+receiving end of the test will not write the contents of what it
+receives to a file. This can be used to pre-fill the send buffers
+with data having different compressibility and so is useful when
+measuring performance over mechanisms which perform compression.
+
+While optional for most tests, this option is required for a test
+utilizing the sendfile() or related calls because sendfile tests need
+a name of a file to reference.
+
+@vindex -h, Global
+@item -h
+This option causes netperf to display its usage string and exit to the
+exclusion of all else.
+
+@vindex -H, Global
+@item -H <optionspec>
+This option will set the name of the remote system and or the address
+family used for the control connection. For example:
+@example
+-H linger,4
+@end example
+will set the name of the remote system to ``tardy'' and tells netperf to
+use IPv4 addressing only.
+@example
+-H ,6
+@end example
+will leave the name of the remote system at its default, and request
+that only IPv6 addresses be used for the control connection.
+@example
+-H lag
+@end example
+will set the name of the remote system to ``lag'' and leave the
+address family to AF_UNSPEC which means selection of IPv4 vs IPv6 is
+left to the system's address resolution.
+
+A value of ``inet'' can be used in place of ``4'' to request IPv4 only
+addressing. Similarly, a value of ``inet6'' can be used in place of
+``6'' to request IPv6 only addressing. A value of ``0'' can be used
+to request either IPv4 or IPv6 addressing as name resolution dictates.
+
+By default, the options set with the global @option{-H} option are
+inherited by the test for its data connection, unless a test-specific
+@option{-H} option is specified.
+
+If a @option{-H} option follows either the @option{-4} or @option{-6}
+options, the family setting specified with the -H option will override
+the @option{-4} or @option{-6} options for the remote address
+family. If no address family is specified, settings from a previous
+@option{-4} or @option{-6} option will remain. In a nutshell, the
+last explicit global command-line option wins.
+
+[Default: ``localhost'' for the remote name/IP address and ``0'' (eg
+AF_UNSPEC) for the remote address family.]
+
+@vindex -I, Global
+@item -I <optionspec>
+This option enables the calculation of confidence intervals and sets
+the confidence and width parameters with the first have of the
+optionspec being either 99 or 95 for 99% or 95% confidence
+respectively. The second value of the optionspec specifies the width
+of the desired confidence interval. For example
+@example
+-I 99,5
+@end example
+asks netperf to be 99% confident that the measured mean values for
+throughput and CPU utilization are within +/- 2.5% of the ``real''
+mean values. If the @option{-i} option is specified and the
+@option{-I} option is omitted, the confidence defaults to 99% and the
+width to 5% (giving +/- 2.5%)
+
+If netperf calculates that the desired confidence intervals have not
+been met, it emits a noticeable warning that cannot be suppressed with
+the @option{-P} or @option{-v} options:
+
+@example
+netperf -H tardy.cup -i 3 -I 99,5
+TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to tardy.cup.hp.com (15.244.44.58) port 0 AF_INET : +/-2.5% @ 99% conf.
+!!! WARNING
+!!! Desired confidence was not achieved within the specified iterations.
+!!! This implies that there was variability in the test environment that
+!!! must be investigated before going further.
+!!! Confidence intervals: Throughput : 6.8%
+!!! Local CPU util : 0.0%
+!!! Remote CPU util : 0.0%
+
+Recv Send Send
+Socket Socket Message Elapsed
+Size Size Size Time Throughput
+bytes bytes bytes secs. 10^6bits/sec
+
+ 32768 16384 16384 10.01 40.23
+@end example
+
+Where we see that netperf did not meet the desired convidence
+intervals. Instead of being 99% confident it was within +/- 2.5% of
+the real mean value of throughput it is only confident it was within
++/-3.4%. In this example, increasing the @option{-i} option
+(described below) and/or increasing the iteration length with the
+@option{-l} option might resolve the situation.
+
+@vindex -i, Global
+@item -i <sizespec>
+This option enables the calculation of confidence intervals and sets
+the minimum and maximum number of iterations to run in attempting to
+achieve the desired confidence interval. The first value sets the
+maximum number of iterations to run, the second, the minimum. The
+maximum number of iterations is silently capped at 30 and the minimum
+is silently floored at 3. Netperf repeats the measurement the minimum
+number of iterations and continues until it reaches either the
+desired confidence interval, or the maximum number of iterations,
+whichever comes first.
+
+If the @option{-I} option is specified and the @option{-i} option
+omitted the maximum number of iterations is set to 10 and the minimum
+to three.
+
+If netperf determines that the desired confidence intervals have not
+been met, it emits a noticeable warning.
+
+The total test time will be somewhere between the minimum and maximum
+number of iterations multiplied by the test length supplied by the
+@option{-l} option.
+
+@vindex -l, Global
+@item -l testlen
+This option controls the length of any @b{one} iteration of the requested
+test. A positive value for @var{testlen} will run each iteration of
+the test for at least @var{testlen} seconds. A negative value for
+@var{testlen} will run each iteration for the absolute value of
+@var{testlen} transactions for a _RR test or bytes for a _STREAM test.
+Certain tests, notably those using UDP can only be timed, they cannot
+be limited by transaction or byte count.
+
+In some situations, individual iterations of a test may run for longer
+for the number of seconds specified by the @option{-l} option. In
+particular, this may occur for those tests where the socket buffer
+size(s) are significantly longer than the bandwidthXdelay product of
+the link(s) over which the data connection passes, or those tests
+where there may be non-trivial numbers of retransmissions.
+
+If confidence intervals are enabled via either @option{-I} or
+@option{-i} the total length of the netperf test will be somewhere
+between the minimum and maximum iteration count multiplied by
+@var{testlen}.
+
+@vindex -L, Global
+@item -L <optionspec>
+This option is identical to the @option{-H} option with the difference
+being it sets the _local_ hostname/IP and/or address family
+information. This option is generally unnecessary, but can be useful
+when you wish to make sure that the netperf control and data
+connections go via different paths. It can also come-in handy if one
+is trying to run netperf through those evil, end-to-end breaking
+things known as firewalls.
+
+[Default: 0.0.0.0 (eg INADDR_ANY) for IPv4 and ::0 for IPv6 for the
+local name. AF_UNSPEC for the local address family.]
+
+@vindex -n, Global
+@item -n numcpus
+This option tells netperf how many CPUs it should ass-u-me are active
+on the system running netperf. In particular, this is used for the
+@ref{CPU Utilization,CPU utilization} and service demand calculations.
+On certain systems, netperf is able to determine the number of CPU's
+automagically. This option will override any number netperf might be
+able to determine on its own.
+
+Note that this option does _not_ set the number of CPUs on the system
+running netserver. When netperf/netserver cannot automagically
+determine the number of CPUs that can only be set for netserver via a
+netserver @option{-n} command-line option.
+
+@vindex -N, Global
+@item -N
+This option tells netperf to forego establishing a control
+connection. This makes it is possible to run some limited netperf
+tests without a corresponding netserver on the remote system.
+
+With this option set, the test to be run is to get all the addressing
+information it needs to establish its data connection from the command
+line or internal defaults. If not otherwise specified by
+test-specific command line options, the data connection for a
+``STREAM'' or ``SENDFILE'' test will be to the ``discard'' port, an
+``RR'' test will be to the ``echo'' port, and a ``MEARTS'' test will
+be to the chargen port.
+
+The response size of an ``RR'' test will be silently set to be the
+same as the request size. Otherwise the test would hang if the
+response size was larger than the request size, or would report an
+incorrect, inflated transaction rate if the response size was less
+than the request size.
+
+Since there is no control connection when this option is specified, it
+is not possible to set ``remote'' properties such as socket buffer
+size and the like via the netperf command line. Nor is it possible to
+retrieve such interesting remote information as CPU utilization.
+These items will be set to values which when displayed should make it
+immediately obvious that was the case.
+
+The only way to change remote characteristics such as socket buffer
+size or to obtain information such as CPU utilization is to employ
+platform-specific methods on the remote system. Frankly, if one has
+access to the remote system to employ those methods one aught to be
+able to run a netserver there. However, that ability may not be
+present in certain ``support'' situations, hence the addition of this
+option.
+
+Added in netperf 2.4.3.
+
+@vindex -o, Global
+@item -o <sizespec>
+The value(s) passed-in with this option will be used as an offset
+added to the alignment specified with the @option{-a} option. For
+example:
+@example
+-o 3 -a 4096
+@end example
+will cause the buffers passed to the local send and receive calls to
+begin three bytes past an address aligned to 4096 bytes. [Default: 0
+bytes]
+
+@vindex -O, Global
+@item -O <sizespec>
+This option behaves just as the @option{-o} option but on the remote
+system and in conjunction with the @option{-A} option. [Default: 0
+bytes]
+
+@vindex -p, Global
+@item -p <optionspec>
+The first value of the optionspec passed-in with this option tells
+netperf the port number at which it should expect the remote netserver
+to be listening for control connections. The second value of the
+optionspec will request netperf to bind to that local port number
+before establishing the control connection. For example
+@example
+-p 12345
+@end example
+tells netperf that the remote netserver is listening on port 12345 and
+leaves selection of the local port number for the control connection
+up to the local TCP/IP stack whereas
+@example
+-p ,32109
+@end example
+leaves the remote netserver port at the default value of 12865 and
+causes netperf to bind to the local port number 32109 before
+connecting to the remote netserver.
+
+In general, setting the local port number is only necessary when one
+is looking to run netperf through those evil, end-to-end breaking
+things known as firewalls.
+
+@vindex -P, Global
+@item -P 0|1
+A value of ``1'' for the @option{-P} option will enable display of
+the test banner. A value of ``0'' will disable display of the test
+banner. One might want to disable display of the test banner when
+running the same basic test type (eg TCP_STREAM) multiple times in
+succession where the test banners would then simply be redundant and
+unnecessarily clutter the output. [Default: 1 - display test banners]
+
+@vindex -t, Global
+@item -t testname
+This option is used to tell netperf which test you wish to run. As of
+this writing, valid values for @var{testname} include:
+@itemize
+@item
+@ref{TCP_STREAM}, @ref{TCP_MAERTS}, @ref{TCP_SENDFILE}, @ref{TCP_RR}, @ref{TCP_CRR}, @ref{TCP_CC}
+@item
+@ref{UDP_STREAM}, @ref{UDP_RR}
+@item
+@ref{XTI_TCP_STREAM}, @ref{XTI_TCP_RR}, @ref{XTI_TCP_CRR}, @ref{XTI_TCP_CC}
+@item
+@ref{XTI_UDP_STREAM}, @ref{XTI_UDP_RR}
+@item
+@ref{SCTP_STREAM}, @ref{SCTP_RR}
+@item
+@ref{DLCO_STREAM}, @ref{DLCO_RR}, @ref{DLCL_STREAM}, @ref{DLCL_RR}
+@item
+@ref{Other Netperf Tests,LOC_CPU}, @ref{Other Netperf Tests,REM_CPU}
+@end itemize
+Not all tests are always compiled into netperf. In particular, the
+``XTI,'' ``SCTP,'' ``UNIX,'' and ``DL*'' tests are only included in
+netperf when configured with
+@option{--enable-[xti|sctp|unix|dlpi]=yes}.
+
+Netperf only runs one type of test no matter how many @option{-t}
+options may be present on the command-line. The last @option{-t}
+global command-line option will determine the test to be
+run. [Default: TCP_STREAM]
+
+@vindex -v, Global
+@item -v verbosity
+This option controls how verbose netperf will be in its output, and is
+often used in conjunction with the @option{-P} option. If the
+verbosity is set to a value of ``0'' then only the test's SFM (Single
+Figure of Merit) is displayed. If local @ref{CPU Utilization,CPU
+utilization} is requested via the @option{-c} option then the SFM is
+the local service demand. Othersise, if remote CPU utilization is
+requested via the @option{-C} option then the SFM is the remote
+service demand. If neither local nor remote CPU utilization are
+requested the SFM will be the measured throughput or transaction rate
+as implied by the test specified with the @option{-t} option.
+
+If the verbosity level is set to ``1'' then the ``normal'' netperf
+result output for each test is displayed.
+
+If the verbosity level is set to ``2'' then ``extra'' information will
+be displayed. This may include, but is not limited to the number of
+send or recv calls made and the average number of bytes per send or
+recv call, or a histogram of the time spent in each send() call or for
+each transaction if netperf was configured with
+@option{--enable-histogram=yes}. [Default: 1 - normal verbosity]
+
+@vindex -w, Global
+@item -w time
+If netperf was configured with @option{--enable-intervals=yes} then
+this value will set the inter-burst time to time milliseconds, and the
+@option{-b} option will set the number of sends per burst. The actual
+inter-burst time may vary depending on the system's timer resolution.
+
+@vindex -W, Global
+@item -W <sizespec>
+This option controls the number of buffers in the send (first or only
+value) and or receive (second or only value) buffer rings. Unlike
+some benchmarks, netperf does not continuously send or receive from a
+single buffer. Instead it rotates through a ring of
+buffers. [Default: One more than the size of the send or receive
+socket buffer sizes (@option{-s} and/or @option{-S} options) divided
+by the send @option{-m} or receive @option{-M} buffer size
+respectively]
+
+@vindex -4, Global
+@item -4
+Specifying this option will set both the local and remote address
+families to AF_INET - that is use only IPv4 addresses on the control
+connection. This can be overridden by a subsequent @option{-6},
+@option{-H} or @option{-L} option. Basically, the last option
+explicitly specifying an address family wins. Unless overridden by a
+test-specific option, this will be inherited for the data connection
+as well.
+
+@vindex -6, Global
+@item -6
+Specifying this option will set both local and and remote address
+families to AF_INET6 - that is use only IPv6 addresses on the control
+connection. This can be overridden by a subsequent @option{-4},
+@option{-H} or @option{-L} option. Basically, the last address family
+explicitly specified wins. Unless overridden by a test-specific
+option, this will be inherited for the data connection as well.
+
+@end table
+
+
+@node Using Netperf to Measure Bulk Data Transfer, Using Netperf to Measure Request/Response , Global Command-line Options, Top
+@chapter Using Netperf to Measure Bulk Data Transfer
+
+The most commonly measured aspect of networked system performance is
+that of bulk or unidirectional transfer performance. Everyone wants
+to know how many bits or bytes per second they can push across the
+network. The netperf convention for a bulk data transfer test name is
+to tack a ``_STREAM'' suffix to a test name.
+
+@menu
+* Issues in Bulk Transfer::
+* Options common to TCP UDP and SCTP tests::
+@end menu
+
+@node Issues in Bulk Transfer, Options common to TCP UDP and SCTP tests, Using Netperf to Measure Bulk Data Transfer, Using Netperf to Measure Bulk Data Transfer
+@comment node-name, next, previous, up
+@section Issues in Bulk Transfer
+
+There are any number of things which can affect the performance of a
+bulk transfer test.
+
+Certainly, absent compression, bulk-transfer tests can be limited by
+the speed of the slowest link in the path from the source to the
+destination. If testing over a gigabit link, you will not see more
+than a gigabit :) Such situations can be described as being
+@dfn{network-limited} or @dfn{NIC-limited}.
+
+CPU utilization can also affect the results of a bulk-transfer test.
+If the networking stack requires a certain number of instructions or
+CPU cycles per KB of data transferred, and the CPU is limited in the
+number of instructions or cycles it can provide, then the transfer can
+be described as being @dfn{CPU-bound}.
+
+A bulk-transfer test can be CPU bound even when netperf reports less
+than 100% CPU utilization. This can happen on an MP system where one
+or more of the CPUs saturate at 100% but other CPU's remain idle.
+Typically, a single flow of data, such as that from a single instance
+of a netperf _STREAM test cannot make use of much more than the power
+of one CPU. Exceptions to this generally occur when netperf and/or
+netserver run on CPU(s) other than the CPU(s) taking interrupts from
+the NIC(s).
+
+Distance and the speed-of-light can affect performance for a
+bulk-transfer; often this can be mitigated by using larger windows.
+One common limit to the performance of a transport using window-based
+flow-control is:
+@example
+Throughput <= WindowSize/RoundTripTime
+@end example
+As the sender can only have a window's-worth of data outstanding on
+the network at any one time, and the soonest the sender can receive a
+window update from the receiver is one RoundTripTime (RTT). TCP and
+SCTP are examples of such protocols.
+
+Packet losses and their effects can be particularly bad for
+performance. This is especially true if the packet losses result in
+retransmission timeouts for the protocol(s) involved. By the time a
+retransmission timeout has happened, the flow or connection has sat
+idle for a considerable length of time.
+
+On many platforms, some variant on the @command{netstat} command can
+be used to retrieve statistics about packet loss and
+retransmission. For example:
+@example
+netstat -p tcp
+@end example
+will retrieve TCP statistics on the HP-UX Operating System. On other
+platforms, it may not be possible to retrieve statistics for a
+specific protocol and something like:
+@example
+netstat -s
+@end example
+would be used instead.
+
+Many times, such network statistics are keep since the time the stack
+started, and we are only really interested in statistics from when
+netperf was running. In such situations something along the lines of:
+@example
+netstat -p tcp > before
+netperf -t TCP_mumble...
+netstat -p tcp > after
+@end example
+is indicated. The
+@uref{ftp://ftp.cup.hp.com/dist/networking/tools/,beforeafter} utility
+can be used to subtract the statistics in @file{before} from the
+statistics in @file{after}
+@example
+beforeafter before after > delta
+@end example
+and then one can look at the statistics in @file{delta}. Beforeafter
+is distributed in source form so one can compile it on the platofrm(s)
+of interest.
+
+While it was written with HP-UX's netstat in mind, the
+@uref{ftp://ftp.cup.hp.com/dist/networking/briefs/annotated_netstat.txt,annotated
+netstat} writeup may be helpful with other platforms as well.
+
+@node Options common to TCP UDP and SCTP tests, , Issues in Bulk Transfer, Using Netperf to Measure Bulk Data Transfer
+@comment node-name, next, previous, up
+@section Options common to TCP UDP and SCTP tests
+
+Many ``test-specific'' options are actually common across the
+different tests. For those tests involving TCP, UDP and SCTP, whether
+using the BSD Sockets or the XTI interface those common options
+include:
+
+@table @code
+@vindex -h, Test-specific
+@item -h
+Display the test-suite-specific usage string and exit. For a TCP_ or
+UDP_ test this will be the usage string from the source file
+nettest_bsd.c. For an XTI_ test, this will be the usage string from
+the source file nettest_xti.c. For an SCTP test, this will be the
+usage string from the source file nettest_sctp.c.
+
+@item -H <optionspec>
+Normally, the remote hostname|IP and address family information is
+inherited from the settings for the control connection (eg global
+command-line @option{-H}, @option{-4} and/or @option{-6} options).
+The test-specific @option{-H} will override those settings for the
+data (aka test) connection only. Settings for the control connection
+are left unchanged.
+
+@vindex -L, Test-specific
+@item -L <optionspec>
+The test-specific @option{-L} option is identical to the test-specific
+@option{-H} option except it affects the local hostname|IP and address
+family information. As with its global command-line counterpart, this
+is generally only useful when measuring though those evil, end-to-end
+breaking things called firewalls.
+
+@vindex -m, Test-specific
+@item -m bytes
+Set the size of the buffer passed-in to the ``send'' calls of a
+_STREAM test. Note that this may have only an indirect effect on the
+size of the packets sent over the network, and certain Layer 4
+protocols do _not_ preserve or enforce message boundaries, so setting
+@option{-m} for the send size does not necessarily mean the receiver
+will receive that many bytes at any one time. By default the units are
+bytes, but suffix of ``G,'' ``M,'' or ``K'' will specify the units to
+be 2^30 (GB), 2^20 (MB) or 2^10 (KB) respectively. A suffix of ``g,''
+``m'' or ``k'' will specify units of 10^9, 10^6 or 10^3 bytes
+respectively. For example:
+@example
+@code{-m 32K}
+@end example
+will set the size to 32KB or 32768 bytes. [Default: the local send
+socket buffer size for the connection - either the system's default or
+the value set via the @option{-s} option.]
+
+@vindex -M, Test-specific
+@item -M bytes
+Set the size of the buffer passed-in to the ``recv'' calls of a
+_STREAM test. This will be an upper bound on the number of bytes
+received per receive call. By default the units are bytes, but suffix
+of ``G,'' ``M,'' or ``K'' will specify the units to be 2^30 (GB), 2^20
+(MB) or 2^10 (KB) respectively. A suffix of ``g,'' ``m'' or ``k''
+will specify units of 10^9, 10^6 or 10^3 bytes respectively. For
+example:
+@example
+@code{-M 32K}
+@end example
+will set the size to 32KB or 32768 bytes. [Default: the remote receive
+socket buffer size for the data connection - either the system's
+default or the value set via the @option{-S} option.]
+
+@vindex -P, Test-specific
+@item -P <optionspec>
+Set the local and/or remote port numbers for the data connection.
+
+@vindex -s, Test-specific
+@item -s <sizespec>
+This option sets the local send and receive socket buffer sizes for
+the data connection to the value(s) specified. Often, this will
+affect the advertised and/or effective TCP or other window, but on
+some platforms it may not. By default the units are bytes, but suffix
+of ``G,'' ``M,'' or ``K'' will specify the units to be 2^30 (GB), 2^20
+(MB) or 2^10 (KB) respectively. A suffix of ``g,'' ``m'' or ``k''
+will specify units of 10^9, 10^6 or 10^3 bytes respectively. For
+example:
+@example
+@code{-s 128K}
+@end example
+Will request the local send and receive socket buffer sizes to be
+128KB or 131072 bytes.
+
+While the historic expectation is that setting the socket buffer size
+has a direct effect on say the TCP window, today that may not hold
+true for all stacks. Further, while the historic expectation is that
+the value specified in a setsockopt() call will be the value returned
+via a getsockopt() call, at least one stack is known to deliberately
+ignore history. When running under Windows a value of 0 may be used
+which will be an indication to the stack the user wants to enable a
+form of copy avoidance. [Default: -1 - use the system's default socket
+buffer sizes]
+
+@vindex -S Test-specific
+@item -S <sizespec>
+This option sets the remote send and/or receive socket buffer sizes
+for the data connection to the value(s) specified. Often, this
+will affect the advertised and/or effective TCP or other window, but
+on some platforms it may not. By default the units are bytes, but
+suffix of ``G,'' ``M,'' or ``K'' will specify the units to be 2^30
+(GB), 2^20 (MB) or 2^10 (KB) respectively. A suffix of ``g,'' ``m''
+or ``k'' will specify units of 10^9, 10^6 or 10^3 bytes respectively.
+For example:
+@example
+@code{-s 128K}
+@end example
+Will request the local send and receive socket buffer sizes to be
+128KB or 131072 bytes.
+
+While the historic expectation is that setting the socket buffer size
+has a direct effect on say the TCP window, today that may not hold
+true for all stacks. Further, while the historic expectation is that
+the value specified in a setsockopt() call will be the value returned
+via a getsockopt() call, at least one stack is known to deliberately
+ignore history. When running under Windows a value of 0 may be used
+which will be an indication to the stack the user wants to enable a
+form of copy avoidance. [Default: -1 - use the system's default socket
+buffer sizes]
+
+@vindex -4, Test-specific
+@item -4
+Set the local and remote address family for the data connection to
+AF_INET - ie use IPv4 addressing only. Just as with their global
+command-line counterparts the last of the @option{-4}, @option{-6},
+@option{-H} or @option{-L} option wins for their respective address
+families.
+
+@vindex -6, Test-specific
+@item -6
+This option is identical to its @option{-4} cousin, but requests IPv6
+addresses for the local and remote ends of the data connection.
+
+@end table
+
+
+@menu
+* TCP_STREAM::
+* TCP_MAERTS::
+* TCP_SENDFILE::
+* UDP_STREAM::
+* XTI_TCP_STREAM::
+* XTI_UDP_STREAM::
+* SCTP_STREAM::
+* DLCO_STREAM::
+* DLCL_STREAM::
+* STREAM_STREAM::
+* DG_STREAM::
+@end menu
+
+@node TCP_STREAM, TCP_MAERTS, Options common to TCP UDP and SCTP tests, Options common to TCP UDP and SCTP tests
+@subsection TCP_STREAM
+
+The TCP_STREAM test is the default test in netperf. It is quite
+simple, transferring some quantity of data from the system running
+netperf to the system running netserver. While time spent
+establishing the connection is not included in the throughput
+calculation, time spent flushing the last of the data to the remote at
+the end of the test is. This is how netperf knows that all the data
+it sent was received by the remote. In addition to the @ref{Options
+common to TCP UDP and SCTP tests,options common to STREAM tests}, the
+following test-specific options can be included to possibly alter the
+behavior of the test:
+
+@table @code
+@item -C
+This option will set TCP_CORK mode on the data connection on those
+systems where TCP_CORK is defined (typically Linux). A full
+description of TCP_CORK is beyond the scope of this manual, but in a
+nutshell it forces sub-MSS sends to be buffered so every segment sent
+is Maximum Segment Size (MSS) unless the application performs an
+explicit flush operation or the connection is closed. At present
+netperf does not perform any explicit flush operations. Setting
+TCP_CORK may improve the bitrate of tests where the ``send size''
+(@option{-m} option) is smaller than the MSS. It should also improve
+(make smaller) the service demand.
+
+The Linux tcp(7) manpage states that TCP_CORK cannot be used in
+conjunction with TCP_NODELAY (set via the @option{-d} option), however
+netperf does not validate command-line options to enforce that.
+
+@item -D
+This option will set TCP_NODELAY on the data connection on those
+systems where TCP_NODELAY is defined. This disables something known
+as the Nagle Algorithm, which is intended to make the segments TCP
+sends as large as reasonably possible. Setting TCP_NODELAY for a
+TCP_STREAM test should either have no effect when the send size
+(@option{-m} option) is larger than the MSS or will decrease reported
+bitrate and increase service demand when the send size is smaller than
+the MSS. This stems from TCP_NODELAY causing each sub-MSS send to be
+its own TCP segment rather than being aggregated with other small
+sends. This means more trips up and down the protocol stack per KB of
+data transferred, which means greater CPU utilization.
+
+If setting TCP_NODELAY with @option{-D} affects throughput and/or
+service demand for tests where the send size (@option{-m}) is larger
+than the MSS it suggests the TCP/IP stack's implementation of the
+Nagle Algorithm _may_ be broken, perhaps interpreting the Nagle
+Algorithm on a segment by segment basis rather than the proper user
+send by user send basis. However, a better test of this can be
+achieved with the @ref{TCP_RR} test.
+
+@end table
+
+Here is an example of a basic TCP_STREAM test, in this case from a
+Debian Linux (2.6 kernel) system to an HP-UX 11iv2 (HP-UX 11.23)
+system:
+
+@example
+$ netperf -H lag
+TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to lag.hpl.hp.com (15.4.89.214) port 0 AF_INET
+Recv Send Send
+Socket Socket Message Elapsed
+Size Size Size Time Throughput
+bytes bytes bytes secs. 10^6bits/sec
+
+ 32768 16384 16384 10.00 80.42
+@end example
+
+We see that the default receive socket buffer size for the receiver
+(lag - HP-UX 11.23) is 32768 bytes, and the default socket send buffer
+size for the sender (Debian 2.6 kernel) is 16384 bytes. Througput is
+expressed as 10^6 (aka Mega) bits per second, and the test ran for 10
+seconds. IPv4 addresses (AF_INET) were used.
+
+@node TCP_MAERTS, TCP_SENDFILE, TCP_STREAM, Options common to TCP UDP and SCTP tests
+@comment node-name, next, previous, up
+@subsection TCP_MAERTS
+
+A TCP_MAERTS (MAERTS is STREAM backwards) test is ``just like'' a
+@ref{TCP_STREAM} test except the data flows from the netserver to the
+netperf. The global command-line @option{-F} option is ignored for
+this test type. The test-specific command-line @option{-C} option is
+ignored for this test type.
+
+Here is an example of a TCP_MAERTS test between the same two systems
+as in the example for the @ref{TCP_STREAM} test. This time we request
+larger socket buffers with @option{-s} and @option{-S} options:
+
+@example
+$ netperf -H lag -t TCP_MAERTS -- -s 128K -S 128K
+TCP MAERTS TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to lag.hpl.hp.com (15.4.89.214) port 0 AF_INET
+Recv Send Send
+Socket Socket Message Elapsed
+Size Size Size Time Throughput
+bytes bytes bytes secs. 10^6bits/sec
+
+221184 131072 131072 10.03 81.14
+@end example
+
+Where we see that Linux, unlike HP-UX, may not return the same value
+in a getsockopt() as was requested in the prior setsockopt().
+
+This test is included more for benchmarking convenience than anything
+else.
+
+@node TCP_SENDFILE, UDP_STREAM, TCP_MAERTS, Options common to TCP UDP and SCTP tests
+@comment node-name, next, previous, up
+@subsection TCP_SENDFILE
+
+The TCP_SENDFILE test is ``just like'' a @ref{TCP_STREAM} test except
+netperf the platform's @code{sendfile()} call instead of calling
+@code{send()}. Often this results in a @dfn{zero-copy} operation
+where data is sent directly from the filesystem buffer cache. This
+_should_ result in lower CPU utilization and possibly higher
+throughput. If it does not, then you may want to contact your
+vendor(s) because they have a problem on their hands.
+
+Zero-copy mechanisms may also alter the characteristics (size and
+number of buffers per) of packets passed to the NIC. In many stacks,
+when a copy is performed, the stack can ``reserve'' space at the
+beginning of the destination buffer for things like TCP, IP and Link
+headers. This then has the packet contained in a single buffer which
+can be easier to DMA to the NIC. When no copy is performed, there is
+no opportunity to reserve space for headers and so a packet will be
+contained in two or more buffers.
+
+The @ref{Global Options,global @option{-F} option} is required for this test and it must
+specify a file of at least the size of the send ring (@xref{Global
+Options,the global @option{-W} option}.) multiplied by the send size
+(@xref{Options common to TCP UDP and SCTP tests,the test-specific
+@option{-m} option}.). All other TCP-specific options are available
+and optional.
+
+In this first example:
+@example
+$ netperf -H lag -F ../src/netperf -t TCP_SENDFILE -- -s 128K -S 128K
+TCP SENDFILE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to lag.hpl.hp.com (15.4.89.214) port 0 AF_INET
+alloc_sendfile_buf_ring: specified file too small.
+file must be larger than send_width * send_size
+@end example
+
+we see what happens when the file is too small. Here:
+
+@example
+$ ../src/netperf -H lag -F /boot/vmlinuz-2.6.8-1-686 -t TCP_SENDFILE -- -s 128K -S 128K
+TCP SENDFILE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to lag.hpl.hp.com (15.4.89.214) port 0 AF_INET
+Recv Send Send
+Socket Socket Message Elapsed
+Size Size Size Time Throughput
+bytes bytes bytes secs. 10^6bits/sec
+
+131072 221184 221184 10.02 81.83
+@end example
+
+we resolve that issue by selecting a larger file.
+
+
+@node UDP_STREAM, XTI_TCP_STREAM, TCP_SENDFILE, Options common to TCP UDP and SCTP tests
+@subsection UDP_STREAM
+
+A UDP_STREAM test is similar to a @ref{TCP_STREAM} test except UDP is
+used as the transport rather than TCP.
+
+@cindex Limiting Bandwidth
+A UDP_STREAM test has no end-to-end flow control - UDP provides none
+and neither does netperf. However, if you wish, you can configure
+netperf with @code{--enable-intervals=yes} to enable the global
+command-line @option{-b} and @option{-w} options to pace bursts of
+traffic onto the network.
+
+This has a number of implications.
+
+The biggest of these implications is the data which is sent might not
+be received by the remote. For this reason, the output of a
+UDP_STREAM test shows both the sending and receiving throughput. On
+some platforms, it may be possible for the sending throughput to be
+reported as a value greater than the maximum rate of the link. This
+is common when the CPU(s) are faster than the network and there is no
+@dfn{intra-stack} flow-control.
+
+Here is an example of a UDP_STREAM test between two systems connected
+by a 10 Gigabit Ethernet link:
+@example
+$ netperf -t UDP_STREAM -H 192.168.2.125 -- -m 32768
+UDP UNIDIRECTIONAL SEND TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.2.125 (192.168.2.125) port 0 AF_INET
+Socket Message Elapsed Messages
+Size Size Time Okay Errors Throughput
+bytes bytes secs # # 10^6bits/sec
+
+124928 32768 10.00 105672 0 2770.20
+135168 10.00 104844 2748.50
+
+@end example
+
+The first line of numbers are statistics from the sending (netperf)
+side. The second line of numbers are from the receiving (netserver)
+side. In this case, 105672 - 104844 or 828 messages did not make it
+all the way to the remote netserver process.
+
+If the value of the @option{-m} option is larger than the local send
+socket buffer size (@option{-s} option) netperf will likely abort with
+an error message about how the send call failed:
+
+@example
+netperf -t UDP_STREAM -H 192.168.2.125
+UDP UNIDIRECTIONAL SEND TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.2.125 (192.168.2.125) port 0 AF_INET
+udp_send: data send error: Message too long
+@end example
+
+If the value of the @option{-m} option is larger than the remote
+socket receive buffer, the reported receive throughput will likely be
+zero as the remote UDP will discard the messages as being too large to
+fit into the socket buffer.
+
+@example
+$ netperf -t UDP_STREAM -H 192.168.2.125 -- -m 65000 -S 32768
+UDP UNIDIRECTIONAL SEND TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.2.125 (192.168.2.125) port 0 AF_INET
+Socket Message Elapsed Messages
+Size Size Time Okay Errors Throughput
+bytes bytes secs # # 10^6bits/sec
+
+124928 65000 10.00 53595 0 2786.99
+ 65536 10.00 0 0.00
+@end example
+
+The example above was between a pair of systems running a ``Linux''
+kernel. Notice that the remote Linux system returned a value larger
+than that passed-in to the @option{-S} option. In fact, this value
+was larger than the message size set with the @option{-m} option.
+That the remote socket buffer size is reported as 65536 bytes would
+suggest to any sane person that a message of 65000 bytes would fit,
+but the socket isn't _really_ 65536 bytes, even though Linux is
+telling us so. Go figure.
+
+@node XTI_TCP_STREAM, XTI_UDP_STREAM, UDP_STREAM, Options common to TCP UDP and SCTP tests
+@subsection XTI_TCP_STREAM
+
+An XTI_TCP_STREAM test is simply a @ref{TCP_STREAM} test using the XTI
+rather than BSD Sockets interface. The test-specific @option{-X
+<devspec>} option can be used to specify the name of the local and/or
+remote XTI device files, which is required by the @code{t_open()} call
+made by netperf XTI tests.
+
+The XTI_TCP_STREAM test is only present if netperf was configured with
+@code{--enable-xti=yes}. The remote netserver must have also been
+configured with @code{--enable-xti=yes}.
+
+@node XTI_UDP_STREAM, SCTP_STREAM, XTI_TCP_STREAM, Options common to TCP UDP and SCTP tests
+@subsection XTI_UDP_STREAM
+
+An XTI_UDP_STREAM test is simply a @ref{UDP_STREAM} test using the XTI
+rather than BSD Sockets Interface. The test-specific @option{-X
+<devspec>} option can be used to specify the name of the local and/or
+remote XTI device files, which is required by the @code{t_open()} call
+made by netperf XTI tests.
+
+The XTI_UDP_STREAM test is only present if netperf was configured with
+@code{--enable-xti=yes}. The remote netserver must have also been
+configured with @code{--enable-xti=yes}.
+
+@node SCTP_STREAM, DLCO_STREAM, XTI_UDP_STREAM, Options common to TCP UDP and SCTP tests
+@subsection SCTP_STREAM
+
+An SCTP_STREAM test is essentially a @ref{TCP_STREAM} test using the SCTP
+rather than TCP. The @option{-D} option will set SCTP_NODELAY, which
+is much like the TCP_NODELAY option for TCP. The @option{-C} option
+is not applicable to an SCTP test as there is no corresponding
+SCTP_CORK option. The author is still figuring-out what the
+test-specific @option{-N} option does :)
+
+The SCTP_STREAM test is only present if netperf was configured with
+@code{--enable-sctp=yes}. The remote netserver must have also been
+configured with @code{--enable-sctp=yes}.
+
+@node DLCO_STREAM, DLCL_STREAM, SCTP_STREAM, Options common to TCP UDP and SCTP tests
+@subsection DLCO_STREAM
+
+A DLPI Connection Oriented Stream (DLCO_STREAM) test is very similar
+in concept to a @ref{TCP_STREAM} test. Both use reliable,
+connection-oriented protocols. The DLPI test differs from the TCP
+test in that its protocol operates only at the link-level and does not
+include TCP-style segmentation and reassembly. This last difference
+means that the value passed-in with the @option{-m} option must be
+less than the interface MTU. Otherwise, the @option{-m} and
+@option{-M} options are just like their TCP/UDP/SCTP counterparts.
+
+Other DLPI-specific options include:
+
+@table @code
+@item -D <devspec>
+This option is used to provide the fully-qualified names for the local
+and/or remote DPLI device files. The syntax is otherwise identical to
+that of a @dfn{sizespec}.
+@item -p <ppaspec>
+This option is used to specify the local and/or remote DLPI PPA(s).
+The PPA is used to identify the interface over which traffic is to be
+sent/received. The syntax of a @dfn{ppaspec} is otherwise the same as
+a @dfn{sizespec}.
+@item -s sap
+This option specifies the 802.2 SAP for the test. A SAP is somewhat
+like either the port field of a TCP or UDP header or the protocol
+field of an IP header. The specified SAP should not conflict with any
+other active SAPs on the specified PPA's (@option{-p} option).
+@item -w <sizespec>
+This option specifies the local send and receive window sizes in units
+of frames on those platforms which support setting such things.
+@item -W <sizespec>
+This option specifies the remote send and receive window sizes in
+units of frames on those platforms which support setting such things.
+@end table
+
+The DLCO_STREAM test is only present if netperf was configured with
+@code{--enable-dlpi=yes}. The remote netserver must have also been
+configured with @code{--enable-dlpi=yes}.
+
+
+@node DLCL_STREAM, STREAM_STREAM, DLCO_STREAM, Options common to TCP UDP and SCTP tests
+@subsection DLCL_STREAM
+
+A DLPI ConnectionLess Stream (DLCL_STREAM) test is analogous to a
+@ref{UDP_STREAM} test in that both make use of unreliable/best-effort,
+connection-less transports. The DLCL_STREAM test differs from the
+@ref{UDP_STREAM} test in that the message size (@option{-m} option) must
+always be less than the link MTU as there is no IP-like fragmentation
+and reassembly available and netperf does not presume to provide one.
+
+The test-specific command-line options for a DLCL_STREAM test are the
+same as those for a @ref{DLCO_STREAM} test.
+
+The DLCL_STREAM test is only present if netperf was configured with
+@code{--enable-dlpi=yes}. The remote netserver must have also been
+configured with @code{--enable-dlpi=yes}.
+
+@node STREAM_STREAM, DG_STREAM, DLCL_STREAM, Options common to TCP UDP and SCTP tests
+@comment node-name, next, previous, up
+@subsection STREAM_STREAM
+
+A Unix Domain Stream Socket Stream test (STREAM_STREAM) is similar in
+concept to a @ref{TCP_STREAM} test, but using Unix Domain sockets. It is,
+naturally, limited to intra-machine traffic. A STREAM_STREAM test
+shares the @option{-m}, @option{-M}, @option{-s} and @option{-S}
+options of the other _STREAM tests. In a STREAM_STREAM test the
+@option{-p} option sets the directory in which the pipes will be
+created rather than setting a port number. The default is to create
+the pipes in the system default for the @code{tempnam()} call.
+
+The STREAM_STREAM test is only present if netperf was configured with
+@code{--enable-unix=yes}. The remote netserver must have also been
+configured with @code{--enable-unix=yes}.
+
+@node DG_STREAM, , STREAM_STREAM, Options common to TCP UDP and SCTP tests
+@comment node-name, next, previous, up
+@subsection DG_STREAM
+
+A Unix Domain Datagram Socket Stream test (SG_STREAM) is very much
+like a @ref{TCP_STREAM} test except that message boundaries are preserved.
+In this way, it may also be considered similar to certain flavors of
+SCTP test which can also preserve message boundaries.
+
+All the options of a @ref{STREAM_STREAM} test are applicable to a DG_STREAM
+test.
+
+The DG_STREAM test is only present if netperf was configured with
+@code{--enable-unix=yes}. The remote netserver must have also been
+configured with @code{--enable-unix=yes}.
+
+
+@node Using Netperf to Measure Request/Response , Using Netperf to Measure Aggregate Performance, Using Netperf to Measure Bulk Data Transfer, Top
+@chapter Using Netperf to Measure Request/Response
+
+Request/response performance is often overlooked, yet it is just as
+important as bulk-transfer performance. While things like larger
+socket buffers and TCP windows can cover a multitude of latency and
+even path-length sins, they cannot easily hide from a request/response
+test. The convention for a request/response test is to have a _RR
+suffix. There are however a few ``request/response'' tests that have
+other suffixes.
+
+A request/response test, particularly synchronous, one transaction at
+at time test such as those found in netperf, is particularly sensitive
+to the path-length of the networking stack. An _RR test can also
+uncover those platforms where the NIC's are strapped by default with
+overbearing interrupt avoidance settings in an attempt to increase the
+bulk-transfer performance (or rather, decrease the CPU utilization of
+a bulk-transfer test). This sensitivity is most acute for small
+request and response sizes, such as the single-byte default for a
+netperf _RR test.
+
+While a bulk-transfer test reports its results in units of bits or
+bytes transfered per second, a mumble_RR test reports transactions per
+second where a transaction is defined as the completed exchange of a
+request and a response. One can invert the transaction rate to arrive
+at the average round-trip latency. If one is confident about the
+symmetry of the connection, the average one-way latency can be taken
+as one-half the average round-trip latency. Netperf does not do
+either of these on its own but leaves them as exercises to the
+benchmarker.
+
+@menu
+* Issues in Request/Response::
+* Options Common to TCP UDP and SCTP _RR tests::
+@end menu
+
+@node Issues in Request/Response, Options Common to TCP UDP and SCTP _RR tests, Using Netperf to Measure Request/Response , Using Netperf to Measure Request/Response
+@comment node-name, next, previous, up
+@section Issues in Reqeust/Response
+
+Most if not all the @ref{Issues in Bulk Transfer} apply to
+request/response. The issue of round-trip latency is even more
+important as netperf generally only has one transaction outstanding at
+a time.
+
+A single instance of a one transaction outstanding _RR test should
+_never_ completely saturate the CPU of a system. If testing between
+otherwise evenly matched systems, the symmetric nature of a _RR test
+with equal request and response sizes should result in equal CPU
+loading on both systems. However, this may not hold true on MP
+systems, particularly if one CPU binds the netperf and netserver
+differently via the global @option{-T} option.
+
+For smaller request and response sizes packet loss is a bigger issue
+as there is no opportunity for a @dfn{fast retransmit} or
+retransmission prior to a retransmission timer expiring.
+
+Certain NICs have ways to minimize the number of interrupts sent to
+the host. If these are strapped badly they can significantly reduce
+the performance of something like a single-byte request/response test.
+Such setups are distinguised by seriously low reported CPU utilization
+and what seems like a low (even if in the thousands) transaction per
+second rate. Also, if you run such an OS/driver combination on faster
+or slower hardware and do not see a corresponding change in the
+transaction rate, chances are good that the drvier is strapping the
+NIC with aggressive interrupt avoidance settings. Good for bulk
+throughput, but bad for latency.
+
+Some drivers may try to automagically adjust the interrupt avoidance
+settings. If they are not terribly good at it, you will see
+considerable run-to-run variation in reported transaction rates.
+Particularly if you ``mix-up'' _STREAM and _RR tests.
+
+
+@node Options Common to TCP UDP and SCTP _RR tests, , Issues in Request/Response, Using Netperf to Measure Request/Response
+@comment node-name, next, previous, up
+@section Options Common to TCP UDP and SCTP _RR tests
+
+Many ``test-specific'' options are actually common across the
+different tests. For those tests involving TCP, UDP and SCTP, whether
+using the BSD Sockets or the XTI interface those common options
+include:
+
+@table @code
+@vindex -h, Test-specific
+@item -h
+Display the test-suite-specific usage string and exit. For a TCP_ or
+UDP_ test this will be the usage string from the source file
+@file{nettest_bsd.c}. For an XTI_ test, this will be the usage string
+from the source file @file{src/nettest_xti.c}. For an SCTP test, this
+will be the usage string from the source file
+@file{src/nettest_sctp.c}.
+
+@vindex -H, Test-specific
+@item -H <optionspec>
+Normally, the remote hostname|IP and address family information is
+inherited from the settings for the control connection (eg global
+command-line @option{-H}, @option{-4} and/or @option{-6} options.
+The test-specific @option{-H} will override those settings for the
+data (aka test) connection only. Settings for the control connection
+are left unchanged. This might be used to cause the control and data
+connections to take different paths through the network.
+
+@vindex -L, Test-specific
+@item -L <optionspec>
+The test-specific @option{-L} option is identical to the test-specific
+@option{-H} option except it affects the local hostname|IP and address
+family information. As with its global command-line counterpart, this
+is generally only useful when measuring though those evil, end-to-end
+breaking things called firewalls.
+
+@vindex -P, Test-specific
+@item -P <optionspec>
+Set the local and/or remote port numbers for the data connection.
+
+@vindex -r, Test-specific
+@item -r <sizespec>
+This option sets the request (first value) and/or response (second
+value) sizes for an _RR test. By default the units are bytes, but a
+suffix of ``G,'' ``M,'' or ``K'' will specify the units to be 2^30
+(GB), 2^20 (MB) or 2^10 (KB) respectively. A suffix of ``g,'' ``m''
+or ``k'' will specify units of 10^9, 10^6 or 10^3 bytes
+respectively. For example:
+@example
+@code{-r 128,16K}
+@end example
+Will set the request size to 128 bytes and the response size to 16 KB
+or 16384 bytes. [Default: 1 - a single-byte request and response ]
+
+@vindex -s, Test-specific
+@item -s <sizespec>
+This option sets the local send and receive socket buffer sizes for
+the data connection to the value(s) specified. Often, this will
+affect the advertised and/or effective TCP or other window, but on
+some platforms it may not. By default the units are bytes, but a
+suffix of ``G,'' ``M,'' or ``K'' will specify the units to be 2^30
+(GB), 2^20 (MB) or 2^10 (KB) respectively. A suffix of ``g,'' ``m''
+or ``k'' will specify units of 10^9, 10^6 or 10^3 bytes
+respectively. For example:
+@example
+@code{-s 128K}
+@end example
+Will request the local send and receive socket buffer sizes to be
+128KB or 131072 bytes.
+
+While the historic expectation is that setting the socket buffer size
+has a direct effect on say the TCP window, today that may not hold
+true for all stacks. When running under Windows a value of 0 may be
+used which will be an indication to the stack the user wants to enable
+a form of copy avoidance. [Default: -1 - use the system's default
+socket buffer sizes]
+
+@vindex -S, Test-specific
+@item -S <sizespec>
+This option sets the remote send and/or receive socket buffer sizes
+for the data connection to the value(s) specified. Often, this
+will affect the advertised and/or effective TCP or other window, but
+on some platforms it may not. By default the units are bytes, but a
+suffix of ``G,'' ``M,'' or ``K'' will specify the units to be 2^30
+(GB), 2^20 (MB) or 2^10 (KB) respectively. A suffix of ``g,'' ``m''
+or ``k'' will specify units of 10^9, 10^6 or 10^3 bytes respectively.
+For example:
+@example
+@code{-s 128K}
+@end example
+Will request the local send and receive socket buffer sizes to be
+128KB or 131072 bytes.
+
+While the historic expectation is that setting the socket buffer size
+has a direct effect on say the TCP window, today that may not hold
+true for all stacks. When running under Windows a value of 0 may be
+used which will be an indication to the stack the user wants to enable
+a form of copy avoidance. [Default: -1 - use the system's default
+socket buffer sizes]
+
+@vindex -4, Test-specific
+@item -4
+Set the local and remote address family for the data connection to
+AF_INET - ie use IPv4 addressing only. Just as with their global
+command-line counterparts the last of the @option{-4}, @option{-6},
+@option{-H} or @option{-L} option wins for their respective address
+families.
+
+@vindex -6 Test-specific
+@item -6
+This option is identical to its @option{-4} cousin, but requests IPv6
+addresses for the local and remote ends of the data connection.
+
+@end table
+
+@menu
+* TCP_RR::
+* TCP_CC::
+* TCP_CRR::
+* UDP_RR::
+* XTI_TCP_RR::
+* XTI_TCP_CC::
+* XTI_TCP_CRR::
+* XTI_UDP_RR::
+* DLCL_RR::
+* DLCO_RR::
+* SCTP_RR::
+@end menu
+
+@node TCP_RR, TCP_CC, Options Common to TCP UDP and SCTP _RR tests, Options Common to TCP UDP and SCTP _RR tests
+@cindex Measuring Latency
+@cindex Latency, Request-Response
+@subsection TCP_RR
+
+A TCP_RR (TCP Request/Response) test is requested by passing a value
+of ``TCP_RR'' to the global @option{-t} command-line option. A TCP_RR
+test can be though-of as a user-space to user-space @code{ping} with
+no think time - it is a synchronous, one transaction at a time,
+request/response test.
+
+The transaction rate is the number of complete transactions exchanged
+divided by the length of time it took to perform those transactions.
+
+If the two Systems Under Test are otherwise identical, a TCP_RR test
+with the same request and response size should be symmetric - it
+should not matter which way the test is run, and the CPU utilization
+measured should be virtually the same on each system. If not, it
+suggests that the CPU utilization mechanism being used may have some,
+well, issues measuring CPU utilization completely and accurately.
+
+Time to establish the TCP connection is not counted in the result. If
+you want connection setup overheads included, you should consider the
+TCP_CC or TCP_CRR tests.
+
+If specifying the @option{-D} option to set TCP_NODELAY and disable
+the Nagle Algorithm increases the transaction rate reported by a
+TCP_RR test, it implies the stack(s) over which the TCP_RR test is
+running have a broken implementation of the Nagle Algorithm. Likely
+as not they are interpreting Nagle on a segment by segment basis
+rather than a user send by user send basis. You should contact your
+stack vendor(s) to report the problem to them.
+
+Here is an example of two systems running a basic TCP_RR test over a
+10 Gigabit Ethernet link:
+
+@example
+netperf -t TCP_RR -H 192.168.2.125
+TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.2.125 (192.168.2.125) port 0 AF_INET
+Local /Remote
+Socket Size Request Resp. Elapsed Trans.
+Send Recv Size Size Time Rate
+bytes Bytes bytes bytes secs. per sec
+
+16384 87380 1 1 10.00 29150.15
+16384 87380
+@end example
+
+In this example the request and response sizes were one byte, the
+socket buffers were left at their defaults, and the test ran for all
+of 10 seconds. The transaction per second rate was rather good :)
+
+@node TCP_CC, TCP_CRR, TCP_RR, Options Common to TCP UDP and SCTP _RR tests
+@cindex Connection Latency
+@cindex Latency, Connection Establishment
+@subsection TCP_CC
+
+A TCP_CC (TCP Connect/Close) test is requested by passing a value of
+``TCP_CC'' to the global @option{-t} option. A TCP_CC test simply
+measures how fast the pair of systems can open and close connections
+between one another in a synchronous (one at a time) manner. While
+this is considered an _RR test, no request or response is exchanged
+over the connection.
+
+@cindex Port Reuse
+@cindex TIME_WAIT
+The issue of TIME_WAIT reuse is an important one for a TCP_CC test.
+Basically, TIME_WAIT reuse is when a pair of systems churn through
+connections fast enough that they wrap the 16-bit port number space in
+less time than the length of the TIME_WAIT state. While it is indeed
+theoretically possible to ``reuse'' a connection in TIME_WAIT, the
+conditions under which such reuse is possible are rather rare. An
+attempt to reuse a connection in TIME_WAIT can result in a non-trivial
+delay in connection establishment.
+
+Basically, any time the connection churn rate approaches:
+
+Sizeof(clientportspace) / Lengthof(TIME_WAIT)
+
+there is the risk of TIME_WAIT reuse. To minimize the chances of this
+happening, netperf will by default select its own client port numbers
+from the range of 5000 to 65535. On systems with a 60 second
+TIME_WAIT state, this should allow roughly 1000 transactions per
+second. The size of the client port space used by netperf can be
+controlled via the test-specific @option{-p} option, which takes a
+@dfn{sizespec} as a value setting the minimum (first value) and
+maximum (second value) port numbers used by netperf at the client end.
+
+Since no requests or responses are exchanged during a TCP_CC test,
+only the @option{-H}, @option{-L}, @option{-4} and @option{-6} of the
+``common'' test-specific options are likely to have an effect, if any,
+on the results. The @option{-s} and @option{-S} options _may_ have
+some effect if they alter the number and/or type of options carried in
+the TCP SYNchronize segments. The @option{-P} and @option{-r}
+options are utterly ignored.
+
+Since connection establishment and tear-down for TCP is not symmetric,
+a TCP_CC test is not symmetric in its loading of the two systems under
+test.
+
+@node TCP_CRR, UDP_RR, TCP_CC, Options Common to TCP UDP and SCTP _RR tests
+@cindex Latency, Connection Establishment
+@cindex Latency, Request-Response
+@subsection TCP_CRR
+
+The TCP Connect/Request/Response (TCP_CRR) test is requested by
+passing a value of ``TCP_CRR'' to the global @option{-t} command-line
+option. A TCP_RR test is like a merger of a TCP_RR and TCP_CC test
+which measures the performance of establishing a connection, exchanging
+a single request/response transaction, and tearing-down that
+connection. This is very much like what happens in an HTTP 1.0 or
+HTTP 1.1 connection when HTTP Keepalives are not used. In fact, the
+TCP_CRR test was added to netperf to simulate just that.
+
+Since a request and response are exchanged the @option{-r},
+@option{-s} and @option{-S} options can have an effect on the
+performance.
+
+The issue of TIME_WAIT reuse exists for the TCP_CRR test just as it
+does for the TCP_CC test. Similarly, since connection establishment
+and tear-down is not symmetric, a TCP_CRR test is not symmetric even
+when the request and response sizes are the same.
+
+@node UDP_RR, XTI_TCP_RR, TCP_CRR, Options Common to TCP UDP and SCTP _RR tests
+@cindex Latency, Request-Response
+@cindex Packet Loss
+@subsection UDP_RR
+
+A UDP Request/Response (UDP_RR) test is requested by passing a value
+of ``UDP_RR'' to a global @option{-t} option. It is very much the
+same as a TCP_RR test except UDP is used rather than TCP.
+
+UDP does not provide for retransmission of lost UDP datagrams, and
+netperf does not add anything for that either. This means that if
+_any_ request or response is lost, the exchange of requests and
+responses will stop from that point until the test timer expires.
+Netperf will not really ``know'' this has happened - the only symptom
+will be a low transaction per second rate.
+
+The netperf side of a UDP_RR test will call @code{connect()} on its
+data socket and thenceforth use the @code{send()} and @code{recv()}
+socket calls. The netserver side of a UDP_RR test will not call
+@code{connect()} and will use @code{recvfrom()} and @code{sendto()}
+calls. This means that even if the request and response sizes are the
+same, a UDP_RR test is _not_ symmetric in its loading of the two
+systems under test.
+
+Here is an example of a UDP_RR test between two otherwise
+identical two-CPU systems joined via a 1 Gigabit Ethernet network:
+
+@example
+$ netperf -T 1 -H 192.168.1.213 -t UDP_RR -c -C
+UDP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.1.213 (192.168.1.213) port 0 AF_INET
+Local /Remote
+Socket Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem
+Send Recv Size Size Time Rate local remote local remote
+bytes bytes bytes bytes secs. per sec % I % I us/Tr us/Tr
+
+65535 65535 1 1 10.01 15262.48 13.90 16.11 18.221 21.116
+65535 65535
+@end example
+
+This example includes the @option{-c} and @option{-C} options to
+enable CPU utilization reporting and shows the asymmetry in CPU
+loading. The @option{-T} option was used to make sure netperf and
+netserver ran on a given CPU and did not move around during the test.
+
+@node XTI_TCP_RR, XTI_TCP_CC, UDP_RR, Options Common to TCP UDP and SCTP _RR tests
+@cindex Latency, Request-Response
+@subsection XTI_TCP_RR
+
+An XTI_TCP_RR test is essentially the same as a @ref{TCP_RR} test only
+using the XTI rather than BSD Sockets interface. It is requested by
+passing a value of ``XTI_TCP_RR'' to the @option{-t} global
+command-line option.
+
+The test-specific options for an XTI_TCP_RR test are the same as those
+for a TCP_RR test with the addition of the @option{-X <devspec>} option to
+specify the names of the local and/or remote XTI device file(s).
+
+@node XTI_TCP_CC, XTI_TCP_CRR, XTI_TCP_RR, Options Common to TCP UDP and SCTP _RR tests
+@comment node-name, next, previous, up
+@cindex Latency, Connection Establishment
+@subsection XTI_TCP_CC
+
+@node XTI_TCP_CRR, XTI_UDP_RR, XTI_TCP_CC, Options Common to TCP UDP and SCTP _RR tests
+@comment node-name, next, previous, up
+@cindex Latency, Connection Establishment
+@cindex Latency, Request-Response
+@subsection XTI_TCP_CRR
+
+@node XTI_UDP_RR, DLCL_RR, XTI_TCP_CRR, Options Common to TCP UDP and SCTP _RR tests
+@cindex Latency, Request-Response
+@subsection XTI_UDP_RR
+
+An XTI_UDP_RR test is essentially the same as a UDP_RR test only using
+the XTI rather than BSD Sockets interface. It is requested by passing
+a value of ``XTI_UDP_RR'' to the @option{-t} global command-line
+option.
+
+The test-specific options for an XTI_UDP_RR test are the same as those
+for a UDP_RR test with the addition of the @option{-X <devspec>}
+option to specify the name of the local and/or remote XTI device
+file(s).
+
+@node DLCL_RR, DLCO_RR, XTI_UDP_RR, Options Common to TCP UDP and SCTP _RR tests
+@comment node-name, next, previous, up
+@cindex Latency, Request-Response
+@subsection DLCL_RR
+
+@node DLCO_RR, SCTP_RR, DLCL_RR, Options Common to TCP UDP and SCTP _RR tests
+@comment node-name, next, previous, up
+@cindex Latency, Request-Response
+@subsection DLCO_RR
+
+@node SCTP_RR, , DLCO_RR, Options Common to TCP UDP and SCTP _RR tests
+@comment node-name, next, previous, up
+@cindex Latency, Request-Response
+@subsection SCTP_RR
+
+@node Using Netperf to Measure Aggregate Performance, Using Netperf to Measure Bidirectional Transfer, Using Netperf to Measure Request/Response , Top
+@comment node-name, next, previous, up
+@cindex Aggregate Performance
+@vindex --enable-burst, Configure
+@chapter Using Netperf to Measure Aggregate Performance
+
+@ref{Netperf4,Netperf4} is the preferred benchmark to use when one
+wants to measure aggregate performance because netperf has no support
+for explicit synchronization of concurrent tests.
+
+Basically, there are two ways to measure aggregate performance with
+netperf. The first is to run multiple, concurrent netperf tests and
+can be applied to any of the netperf tests. The second is to
+configure netperf with @code{--enable-burst} and is applicable to the
+TCP_RR test.
+
+@menu
+* Running Concurrent Netperf Tests::
+* Using --enable-burst::
+@end menu
+
+@node Running Concurrent Netperf Tests, Using --enable-burst, Using Netperf to Measure Aggregate Performance, Using Netperf to Measure Aggregate Performance
+@comment node-name, next, previous, up
+@section Running Concurrent Netperf Tests
+
+@ref{Netperf4,Netperf4} is the preferred benchmark to use when one
+wants to measure aggregate performance because netperf has no support
+for explicit synchronization of concurrent tests. This leaves
+netperf2 results vulnerable to @dfn{skew} errors.
+
+However, since there are times when netperf4 is unavailable it may be
+necessary to run netperf. The skew error can be minimized by making
+use of the confidence interval functionality. Then one simply
+launches multiple tests from the shell using a @code{for} loop or the
+like:
+
+@example
+for i in 1 2 3 4
+do
+netperf -t TCP_STREAM -H tardy.cup.hp.com -i 10 -P 0 &
+done
+@end example
+
+which will run four, concurrent @ref{TCP_STREAM,TCP_STREAM} tests from
+the system on which it is executed to tardy.cup.hp.com. Each
+concurrent netperf will iterate 10 times thanks to the @option{-i}
+option and will omit the test banners (option @option{-P}) for
+brevity. The output looks something like this:
+
+@example
+ 87380 16384 16384 10.03 235.15
+ 87380 16384 16384 10.03 235.09
+ 87380 16384 16384 10.03 235.38
+ 87380 16384 16384 10.03 233.96
+@end example
+
+We can take the sum of the results and be reasonably confident that
+the aggregate performance was 940 Mbits/s.
+
+If you see warnings about netperf not achieving the confidence
+intervals, the best thing to do is to increase the number of
+iterations with @option{-i} and/or increase the run length of each
+iteration with @option{-l}.
+
+You can also enable local (@option{-c}) and/or remote (@option{-C})
+CPU utilization:
+
+@example
+for i in 1 2 3 4
+do
+netperf -t TCP_STREAM -H tardy.cup.hp.com -i 10 -P 0 -c -C &
+done
+
+87380 16384 16384 10.03 235.47 3.67 5.09 10.226 14.180
+87380 16384 16384 10.03 234.73 3.67 5.09 10.260 14.225
+87380 16384 16384 10.03 234.64 3.67 5.10 10.263 14.231
+87380 16384 16384 10.03 234.87 3.67 5.09 10.253 14.215
+@end example
+
+If the CPU utilizations reported for the same system are the same or
+very very close you can be reasonably confident that skew error is
+minimized. Presumeably one could then omit @option{-i} but that is
+not advised, particularly when/if the CPU utilization approaches 100
+percent. In the example above we see that the CPU utilization on the
+local system remains the same for all four tests, and is only off by
+0.01 out of 5.09 on the remote system.
+
+@quotation
+@b{NOTE: It is very important to rememeber that netperf is calculating
+system-wide CPU utilization. When calculating the service demand
+(those last two columns in the output above) each netperf assumes it
+is the only thing running on the system. This means that for
+concurrent tests the service demands reported by netperf will be
+wrong. One has to compute service demands for concurrent tests by
+hand.}
+@end quotation
+
+If you wish you can add a unique, global @option{-B} option to each
+command line to append the given string to the output:
+
+@example
+for i in 1 2 3 4
+do
+netperf -t TCP_STREAM -H tardy.cup.hp.com -B "this is test $i" -i 10 -P 0 &
+done
+
+87380 16384 16384 10.03 234.90 this is test 4
+87380 16384 16384 10.03 234.41 this is test 2
+87380 16384 16384 10.03 235.26 this is test 1
+87380 16384 16384 10.03 235.09 this is test 3
+@end example
+
+You will notice that the tests completed in an order other than they
+were started from the shell. This underscores why there is a threat
+of skew error and why netperf4 is the preferred tool for aggregate
+tests. Even if you see the Netperf Contributing Editor acting to the
+contrary!-)
+
+@node Using --enable-burst, , Running Concurrent Netperf Tests, Using Netperf to Measure Aggregate Performance
+@comment node-name, next, previous, up
+@section Using --enable-burst
+
+If one configures netperf with @code{--enable-burst}:
+
+@example
+configure --enable-burst
+@end example
+
+Then a test-specific @option{-b num} option is added to the
+@ref{TCP_RR,TCP_RR} and @ref{UDP_RR,UDP_RR} tests. This option causes
+TCP_RR and UDP_RR to quickly work their way up to having at least
+@option{num} transactions in flight at one time.
+
+This is used as an alternative to or even in conjunction with
+multiple-concurrent _RR tests. When run with just a single instance
+of netperf, increasing the burst size can determine the maximum number
+of transactions per second can be serviced by a single process:
+
+@example
+for b in 0 1 2 4 8 16 32
+do
+ netperf -v 0 -t TCP_RR -B "-b $b" -H hpcpc108 -P 0 -- -b $b
+done
+
+9457.59 -b 0
+9975.37 -b 1
+10000.61 -b 2
+20084.47 -b 4
+29965.31 -b 8
+71929.27 -b 16
+109718.17 -b 32
+@end example
+
+The global @option{-v} and @option{-P} options were used to minimize
+the output to the single figure of merit which in this case the
+transaction rate. The global @code{-B} option was used to more
+clearly label the output, and the test-specific @option{-b} option
+enabled by @code{--enable-burst} set the number of transactions in
+flight at one time.
+
+Now, since the test-specific @option{-D} option was not specified to
+set TCP_NODELAY, the stack was free to ``bundle'' requests and/or
+responses into TCP segments as it saw fit, and since the default
+request and response size is one byte, there could have been some
+considerable bundling. If one wants to try to achieve a closer to
+one-to-one correspondence between a request and response and a TCP
+segment, add the test-specific @option{-D} option:
+
+@example
+for b in 0 1 2 4 8 16 32
+do
+ netperf -v 0 -t TCP_RR -B "-b $b -D" -H hpcpc108 -P 0 -- -b $b -D
+done
+
+ 8695.12 -b 0 -D
+ 19966.48 -b 1 -D
+ 20691.07 -b 2 -D
+ 49893.58 -b 4 -D
+ 62057.31 -b 8 -D
+ 108416.88 -b 16 -D
+ 114411.66 -b 32 -D
+@end example
+
+You can see that this has a rather large effect on the reported
+transaction rate. In this particular instance, the author believes it
+relates to interactions between the test and interrupt coalescing
+settings in the driver for the NICs used.
+
+@quotation
+@b{NOTE: Even if you set the @option{-D} option that is still not a
+guarantee that each transaction is in its own TCP segments. You
+should get into the habit of verifying the relationship between the
+transaction rate and the packet rate via other means}
+@end quotation
+
+You can also combine @code{--enable-burst} functionality with
+concurrent netperf tests. This would then be an ``aggregate of
+aggregates'' if you like:
+
+@example
+
+for i in 1 2 3 4
+do
+ netperf -H hpcpc108 -v 0 -P 0 -i 10 -B "aggregate $i -b 8 -D" -t TCP_RR -- -b 8 -D &
+done
+
+ 46668.38 aggregate 4 -b 8 -D
+ 44890.64 aggregate 2 -b 8 -D
+ 45702.04 aggregate 1 -b 8 -D
+ 46352.48 aggregate 3 -b 8 -D
+
+@end example
+
+Since each netperf did hit the confidence intervals, we can be
+reasonably certain that the aggregate transaction per second rate was
+the sum of all four concurrent tests, or something just shy of 184,000
+transactions per second. To get some idea if that was also the packet
+per second rate, we could bracket that @code{for} loop with something
+to gather statistics and run the results through
+@uref{ftp://ftp.cup.hp.com/dist/networking/tools,beforeafter}:
+
+@example
+/usr/sbin/ethtool -S eth2 > before
+for i in 1 2 3 4
+do
+ netperf -H 192.168.2.108 -l 60 -v 0 -P 0 -B "aggregate $i -b 8 -D" -t TCP_RR -- -b 8 -D &
+done
+wait
+/usr/sbin/ethtool -S eth2 > after
+
+ 52312.62 aggregate 2 -b 8 -D
+ 50105.65 aggregate 4 -b 8 -D
+ 50890.82 aggregate 1 -b 8 -D
+ 50869.20 aggregate 3 -b 8 -D
+
+beforeafter before after > delta
+
+grep packets delta
+ rx_packets: 12251544
+ tx_packets: 12251550
+
+@end example
+
+This example uses @code{ethtool} because the system being used is
+running Linux. Other platforms have other tools - for example HP-UX
+has lanadmin:
+
+@example
+lanadmin -g mibstats <ppa>
+@end example
+
+and of course one could instead use @code{netstat}.
+
+The @code{wait} is important because we are launching concurrent
+netperfs in the background. Without it, the second ethtool command
+would be run before the tests finished and perhaps even before the
+last of them got started!
+
+The sum of the reported transaction rates is 204178 over 60 seconds,
+which is a total of 12250680 transactions. Each transaction is the
+exchange of a request and a response, so we multiply that by 2 to
+arrive at 24501360.
+
+The sum of the ethtool stats is 24503094 packets which matches what
+netperf was reporting very well.
+
+Had the request or response size differed, we would need to know how
+it compared with the @dfn{MSS} for the connection.
+
+Just for grins, here is the excercise repeated, using @code{netstat}
+instead of @code{ethtool}
+
+@example
+netstat -s -t > before
+for i in 1 2 3 4
+do
+ netperf -l 60 -H 192.168.2.108 -v 0 -P 0 -B "aggregate $i -b 8 -D" -t TCP_RR -- -b 8 -D & done
+wait
+netstat -s -t > after
+
+ 51305.88 aggregate 4 -b 8 -D
+ 51847.73 aggregate 2 -b 8 -D
+ 50648.19 aggregate 3 -b 8 -D
+ 53605.86 aggregate 1 -b 8 -D
+
+beforeafter before after > delta
+
+grep segments delta
+ 12445708 segments received
+ 12445730 segments send out
+ 1 segments retransmited
+ 0 bad segments received.
+@end example
+
+The sums are left as an excercise to the reader :)
+
+Things become considerably more complicated if there are non-trvial
+packet losses and/or retransmissions.
+
+Of course all this checking is unnecessary if the test is a UDP_RR
+test because UDP ``never'' aggregates multiple sends into the same UDP
+datagram, and there are no ACKnowledgements in UDP. The loss of a
+single request or response will not bring a ``burst'' UDP_RR test to a
+screeching halt, but it will reduce the number of transactions
+outstanding at any one time. A ``burst'' UDP_RR test @b{will} come to a
+halt if the sum of the lost requests and responses reaches the value
+specified in the test-specific @option{-b} option.
+
+
+@node Using Netperf to Measure Bidirectional Transfer, Other Netperf Tests, Using Netperf to Measure Aggregate Performance, Top
+@comment node-name, next, previous, up
+@chapter Using Netperf to Measure Bidirectional Transfer
+
+There are two ways to use netperf to measure the perfomance of
+bidirectional transfer. The first is to run concurrent netperf tests
+from the command line. The second is to configure netperf with
+@code{--enable-burst} and use a single instance of the
+@ref{TCP_RR,TCP_RR} test.
+
+While neither method is more ``correct'' than the other, each is doing
+so in different ways, and that has possible implications. For
+instance, using the concurrent netperf test mechanism means that
+multiple TCP connections and multiple processes are involved, whereas
+using the single instance of TCP_RR there is only one TCP connection
+and one process on each end. They may behave differently, especially
+on an MP system.
+
+@menu
+* Bidirectional Transfer with Concurrent Tests::
+* Bidirectional Transfer with TCP_RR::
+@end menu
+
+@node Bidirectional Transfer with Concurrent Tests, Bidirectional Transfer with TCP_RR, Using Netperf to Measure Bidirectional Transfer, Using Netperf to Measure Bidirectional Transfer
+@comment node-name, next, previous, up
+@section Bidirectional Transfer with Concurrent Tests
+
+If we had two hosts Fred and Ethel, we could simply run a netperf
+@ref{TCP_STREAM,TCP_STREAM} test on Fred pointing at Ethel, and a
+concurrent netperf TCP_STREAM test on Ethel pointing at Fred, but
+since there are no mechanisms to synchronize netperf tests and we
+would be starting tests from two different systems, there is a
+considerable risk of skew error.
+
+Far better would be to run simultaneous TCP_STREAM and
+@ref{TCP_MAERTS,TCP_MAERTS} tests from just @b{one} system, using the
+concepts and procedures outlined in @ref{Running Concurrent Netperf
+Tests,Running Concurrent Netperf Tests}. Here then is an example:
+
+@example
+for i in 1
+do
+ netperf -H 192.168.2.108 -t TCP_STREAM -B "outbound" -i 10 -P 0 -v 0 -- -s 256K -S 256K &
+ netperf -H 192.168.2.108 -t TCP_MAERTS -B "inbound" -i 10 -P 0 -v 0 -- -s 256K -S 256K &
+done
+
+ 892.66 outbound
+ 891.34 inbound
+
+@end example
+
+We have used a @code{for} loop in the shell with just one iteration
+because that will be @b{much} easier to get both tests started at more or
+less the same time than doing it by hand. The global @option{-P} and
+@option{-v} options are used because we aren't interested in anything
+other than the throughput, and the global @option{-B} option is used
+to tag each output so we know which was inbound and which outbound
+relative to the system on which we were running netperf. Of course
+that sense is switched on the system running netserver :) The use of
+the global @option{-i} option is explained in @ref{Running Concurrent
+Netperf Tests,Running Concurrent Netperf Tests}.
+
+@node Bidirectional Transfer with TCP_RR, , Bidirectional Transfer with Concurrent Tests, Using Netperf to Measure Bidirectional Transfer
+@comment node-name, next, previous, up
+@section Bidirectional Transfer with TCP_RR
+
+If one configures netperf with @code{--enable-burst} then one can use
+the test-specific @option{-b} option to increase the number of
+transactions in flight at one time. If one also uses the -r option to
+make those transactions larger the test starts to look more and more
+like a bidirectional transfer than a request/response test.
+
+Now, the logic behing @code{--enable-burst} is very simple, and there
+are no calls to @code{poll()} or @code{select()} which means we want
+to make sure that the @code{send()} calls will never block, or we run
+the risk of deadlock with each side stuck trying to call @code{send()}
+and neither calling @code{recv()}.
+
+Fortunately, this is easily accomplished by setting a ``large enough''
+socket buffer size with the test-specific @option{-s} and @option{-S}
+options. Presently this must be performed by the user. Future
+versions of netperf might attempt to do this automagically, but there
+are some issues to be worked-out.
+
+Here then is an example of a bidirectional transfer test using
+@code{--enable-burst} and the @ref{TCP_RR,TCP_RR} test:
+
+@example
+netperf -t TCP_RR -H hpcpc108 -- -b 6 -r 32K -s 256K -S 256K
+TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to hpcpc108.cup.hp.com (16.89.84.108) port 0 AF_INET : first burst 6
+Local /Remote
+Socket Size Request Resp. Elapsed Trans.
+Send Recv Size Size Time Rate
+bytes Bytes bytes bytes secs. per sec
+
+524288 524288 32768 32768 10.01 3525.97
+524288 524288
+
+@end example
+
+Now, at present netperf does not include a bit or byte rate in the
+output of an _RR test which means we must calculate it ourselves. Each
+transaction is the exchange of 32768 bytes of request and 32768 bytes
+of response, or 65536 bytes. Multiply that by 8 and we arrive at
+524288 bits per transaction. Multiply that by 3525.97 and we arrive
+at 1848623759 bits per second. Since things were uniform, we can
+divide that by two and arrive at roughly 924311879 bits per second
+each way. That corresponds to ``link-rate'' for a 1 Gigiabit Ethernet
+which happens to be the type of netpwrk used in the example.
+
+A future version of netperf may perform the calculation on behalf of
+the user, but it would likely not emit it unless the user specified a
+verbosity of 2 or more with the global @option{-v} option.
+
+@node Other Netperf Tests, Address Resolution, Using Netperf to Measure Bidirectional Transfer, Top
+@chapter Other Netperf Tests
+
+Apart from the typical performance tests, netperf contains some tests
+which can be used to streamline measurements and reporting. These
+include CPU rate calibration (present) and host identification (future
+enhancement).
+
+@menu
+* CPU rate calibration::
+@end menu
+
+@node CPU rate calibration, , Other Netperf Tests, Other Netperf Tests
+@section CPU rate calibration
+
+Some of the CPU utilization measurement mechanisms of netperf work by
+comparing the rate at which some counter increments when the system is
+idle with the rate at which that same counter increments when the
+system is running a netperf test. The ratio of those rates is used to
+arrive at a CPU utilization percentage.
+
+This means that netperf must know the rate at which the counter
+increments when the system is presumed to be ``idle.'' If it does not
+know the rate, netperf will measure it before starting a data transfer
+test. This calibration step takes 40 seconds for each of the local or
+remote ystems, and if repeated for each netperf test would make taking
+repeated measurements rather slow.
+
+Thus, the netperf CPU utilization options @option{-c} and and
+@option{-C} can take an optional calibration value. This value is
+used as the ``idle rate'' and the calibration step is not
+performed. To determine the idle rate, netperf can be used to run
+special tests which only report the value of the calibration - they
+are the LOC_CPU and REM_CPU tests. These return the calibration value
+for the local and remote system respectively. A common way to use
+these tests is to store their results into an environment variable and
+use that in subsequent netperf commands:
+
+@example
+LOC_RATE=`netperf -t LOC_CPU`
+REM_RATE=`netperf -H <remote> -t REM_CPU`
+netperf -H <remote> -c $LOC_RATE -C $REM_RATE ... -- ...
+...
+netperf -H <remote> -c $LOC_RATE -C $REM_RATE ... -- ...
+@end example
+
+If you are going to use netperf to measure aggregate results, it is
+important to use the LOC_CPU and REM_CPU tests to get the calibration
+values first to avoid issues with some of the aggregate netperf tests
+transferring data while others are ``idle'' and getting bogus
+calibration values. When running aggregate tests, it is very
+important to remember that any one instance of netperf does not know
+about the other instances of netperf. It will report global CPU
+utilization and will calculate service demand believing it was the
+only thing causing that CPU utilization. So, you can use the CPU
+utilization reported by netperf in an aggregate test, but you have to
+calculate service demands by hand.
+
+@node Address Resolution, Enhancing Netperf, Other Netperf Tests, Top
+@comment node-name, next, previous, up
+@chapter Address Resolution
+
+Netperf versions 2.4.0 and later have merged IPv4 and IPv6 tests so
+the functionality of the tests in @file{src/nettest_ipv6.c} has been
+subsumed into the tests in @file{src/nettest_bsd.c} This has been
+accomplished in part by switching from @code{gethostbyname()}to
+@code{getaddrinfo()} exclusively. While it was theoretically possible
+to get multiple results for a hostname from @code{gethostbyname()} it
+was generally unlikely and netperf's ignoring of the second and later
+results was not much of an issue.
+
+Now with @code{getaddrinfo} and particularly with AF_UNSPEC it is
+increasingly likely that a given hostname will have multiple
+associated addresses. The @code{establish_control()} routine of
+@file{src/netlib.c} will indeed attempt to chose from among all the
+matching IP addresses when establishing the control connection.
+Netperf does not _really_ care if the control connection is IPv4 or
+IPv6 or even mixed on either end.
+
+However, the individual tests still ass-u-me that the first result in
+the address list is the one to be used. Whether or not this will
+turn-out to be an issue has yet to be determined.
+
+If you do run into problems with this, the easiest workaround is to
+specify IP addresses for the data connection explicitly in the
+test-specific @option{-H} and @option{-L} options. At some point, the
+netperf tests _may_ try to be more sophisticated in their parsing of
+returns from @code{getaddrinfo()} - straw-man patches to
+@email{netperf-feedback@@netperf.org} would of course be most welcome
+:)
+
+Netperf has leveraged code from other open-source projects with
+amenable licensing to provide a replacement @code{getaddrinfo()} call
+on those platforms where the @command{configure} script believes there
+is no native getaddrinfo call. As of this writing, the replacement
+@code{getaddrinfo()} as been tested on HP-UX 11.0 and then presumed to
+run elsewhere.
+
+@node Enhancing Netperf, Netperf4, Address Resolution, Top
+@comment node-name, next, previous, up
+@chapter Enhancing Netperf
+
+Netperf is constantly evolving. If you find you want to make
+enhancements to netperf, by all means do so. If you wish to add a new
+``suite'' of tests to netperf the general idea is to
+
+@enumerate
+@item
+Add files @file{src/nettest_mumble.c} and @file{src/nettest_mumble.h}
+where mumble is replaced with something meaningful for the test-suite.
+@item
+Add support for an apropriate @option{--enable-mumble} option in
+@file{configure.ac}.
+@item
+Edit @file{src/netperf.c}, @file{netsh.c}, and @file{netserver.c} as
+required, using #ifdef WANT_MUMBLE.
+@item
+Compile and test
+@end enumerate
+
+If you wish to submit your changes for possible inclusion into the
+mainline sources, please try to base your changes on the latest
+available sources. (@xref{Getting Netperf Bits}.) and then send email
+describing the changes at a high level to
+@email{netperf-feedback@@netperf.org} or perhaps
+@email{netperf-talk@@netperf.org}. If the concensus is positive, then
+sending context @command{diff} results to
+@email{netperf-feedback@@netperf.org} is the next step. From that
+point, it is a matter of pestering the Netperf Contributing Editor
+until he gets the changes incorporated :)
+
+@node Netperf4, Concept Index, Enhancing Netperf, Top
+@comment node-name, next, previous, up
+@chapter Netperf4
+
+Netperf4 is the shorthand name given to version 4.X.X of netperf.
+This is really a separate benchmark more than a newer version of
+netperf, but it is a decendant of netperf so the netperf name is
+kept. The facitious way to describe netperf4 is to say it is the
+egg-laying-wolly-milk-pig version of netperf :) The more respectful
+way to describe it is to say it is the version of netperf with support
+for synchronized, multiple-thread, multiple-test, multiple-system,
+network-oriented benchmarking.
+
+Netperf4 is still undergoing rapid evolution. Those wishing to work
+with or on netperf4 are encouraged to join the
+@uref{http://www.netperf.org/cgi-bin/mailman/listinfo/netperf-dev,netperf-dev}
+mailing list and/or peruse the
+@uref{http://www.netperf.org/svn/netperf4/trunk,current sources}.
+
+@node Concept Index, Option Index, Netperf4, Top
+@unnumbered Concept Index
+
+@printindex cp
+
+@node Option Index, , Concept Index, Top
+@comment node-name, next, previous, up
+@unnumbered Option Index
+
+@printindex vr
+@bye
+
+@c LocalWords: texinfo setfilename settitle titlepage vskip pt filll ifnottex
+@c LocalWords: insertcopying cindex dfn uref printindex cp
diff --git a/netperf-2.4.4/doc/netperf_old.ps b/netperf-2.4.4/doc/netperf_old.ps
new file mode 100644
index 0000000..a6db420
--- /dev/null
+++ b/netperf-2.4.4/doc/netperf_old.ps
@@ -0,0 +1,24014 @@
+%!PS-Adobe-3.0
+%%Creator: (Interleaf, Inc.)
+%%Copyright: (Copyright(c) 1993 Interleaf, Inc.)
+%%Version: 6.0 0
+%%BoundingBox: 0 0 612 792
+%%For: (raj)
+%%CreationDate: (Tue, Feb 27, 1996 16:53:39)
+%%Title: (Netperf)
+%%Pages: (atend)
+%%DocumentNeededResources: (atend)
+%%DocumentSuppliedResources: (atend)
+%%DocumentProcessColors: (atend)
+%%DocumentCustomColors: (atend)
+%ILEAFJob Ticket Start
+%ILEAFPrintTo: "device"
+%ILEAFCollate: "True"
+%ILEAFCopies: "1"
+%ILEAFCoverPage: "False"
+%ILEAFCropMarks: "Off"
+%ILEAFDuplex: "None"
+%ILEAFFace: "Down"
+%ILEAFManualFeed: "True"
+%ILEAFPageSize: "Letter"
+%ILEAFCenter: "None"
+%ILEAFScale: "100"
+%ILEAFAutoScale: "False"
+%ILEAFAutoPageSize: "True"
+%ILEAFFiltArgs: "-nmsg -def '#-ppd#GENERIC.PPD#-e#-dps#A3#' "
+%ILEAFFilter: "pl2ps"
+%ILEAFSpool: "n"
+%ILEAFModel: "Generic PostScript"
+%ILEAFPPDFile: "GENERIC.PPD"
+%ILEAFFilterLoc: "desktop"
+%ILEAFJob Ticket End
+%%EndComments
+%%BeginProlog
+userdict /Ileaf_6.0.0 400 dict dup begin put
+/MAJOR 6 def/MINOR 0 def/SUB 0 def
+/bdf {bind def} bind def
+/ilput {Ileaf_6.0.0 3 1 roll dup begin put} bdf
+/ildef {bind end def} bdf
+/ldf{load def}bdf
+/xdf{exch def}bdf
+/sdf{string def}bdf
+/imatrix[1.0 0.0 0.0 -1.0 0.0 0.0]def
+/MAXCHARS 128 def
+/VMHEAD 1000 def
+/BOGUSWIDTH -1 def
+/mesg 64 sdf
+/charstr 12 sdf
+/istr 3 sdf
+/ILEncoding 256 array def
+/ILSymBEnc 256 array def
+/ILDingbats 256 array def
+/trashheap 1024 sdf
+/emsg1 256 sdf
+/emsg2 256 sdf
+/inch{72 mul}bdf
+/pgstate 0 def/DPIx 0 def/DPIy 0 def
+/PSfontobj 1024 dict def
+/BinaryMode false def
+/L /lineto ldf
+/M /moveto ldf
+/C /closepath ldf
+/N /newpath ldf
+/LW /setlinewidth ldf
+/GS /gsave ldf
+/GR /grestore ldf
+/SF /setfont ldf
+/SD /setdash ldf
+/CD /countdictstack ldf
+% User definable macros for custom prologues
+/BOJ {} def
+/EOJ {} def
+/BOS {} def
+/EOS {} def
+%
+/initialize {Ileaf_6.0.0 begin} bdf
+/terminate /end ldf
+/npop {
+ {pop} repeat
+} bdf
+%
+ /hline 0 def /y 11 def /jishdr 0 def
+ /nl {/y y .33 sub def 1 inch y inch M} bdf
+/headerpage{
+ /#copies 1 def
+ /jishdr xdf
+ jishdr {
+ /GothicBBB-Medium-83pv-RKSJ-H findfont 14 scalefont setfont
+ } {
+ /Helvetica-Bold/ILhelvb ILEncoding 0 ReEncode
+ /ILhelvb findfont 18 scalefont setfont
+ } ifelse
+ nl nl nl
+ hline length dup dup
+ 25 gt{26 sub dup hline exch(( ...))put} {pop 0}ifelse
+ exch 1 sub -1 3 -1 roll{hline exch get show nl}for
+ jishdr {
+ /GothicBBB-Medium-83pv-RKSJ-H findfont 8 scalefont setfont
+ } {
+ /Helvetica findfont 8 scalefont setfont
+ } ifelse
+ 1 inch dup M
+ emsg1 0 get 0 ne{1 inch .75 inch M emsg1 show}if
+ emsg2 0 get 0 ne{1 inch .5 inch M emsg2 show}if
+} bdf
+%
+/lline 0 def
+/logme{
+ (\tInterleaf::pl2ps 5.6.0\n)print
+ lline length dup dup
+ 5 gt {5 sub}{pop 0}ifelse
+ exch 1 sub -1 3 -1 roll{(\tInterleaf::)print lline exch get print(\n)print}for
+ flush
+}bdf
+%
+ /msg /print load def
+/vck{ % stack => major minor sub
+ 3 copy
+ MAJOR ne exch MINOR ne or exch SUB ne or {
+ headerpage
+ 4 {nl} repeat
+ (Interleaf:: FATAL ERROR: pspro.ps and pl2ps versions do not agree.\n)
+ dup msg show nl
+ (Interleaf:: pspro.ps Version 5.6.0\n) dup msg show nl
+ (Interleaf:: pl2ps Version ) dup msg show
+ 3 {mesg cvs dup msg show (.) dup msg show} repeat
+ showpage
+ quit
+ } {3 npop} ifelse
+}bdf
+%
+/el{
+ matrix currentmatrix 8 1 roll
+ translate rotate scale 0 0 1 5 -2 roll arc setmatrix
+}bdf
+/addconic{
+ matrix currentmatrix 9 1 roll
+ translate rotate scale
+ 0 0 1 6 -3 roll 1 eq{arc}{arcn}ifelse
+ setmatrix
+}bdf
+/dp{1 setlinejoin 1 setlinecap stroke}bdf
+/ALIGN_NONE 0 def/ALIGN_OPEN 1 def/ALIGN_CLOSE 2 def
+/PPWADJ [0 0 4 8 12 16 20]def
+/MINSCALE .1 def
+%
+/plDict 7 dict ilput
+ /dist 0 def /y1 0 def /x1 0 def /ymoveto 0 def /xmoveto 0 def
+ /y2 0 def /x2 0 def
+/plen{
+ plDict begin
+ /dist 0 def
+ flattenpath
+ {
+ /y1 xdf/x1 xdf
+ /ymoveto y1 def/xmoveto x1 def
+ }
+ {
+ /y2 xdf/x2 xdf
+ /dist dist y2 y1 sub dup mul
+ x2 x1 sub dup mul add sqrt add def
+ /y1 y2 def/x1 x2 def
+ }
+ {}
+ {
+ /y2 ymoveto def/x2 xmoveto def
+ /dist dist y2 y1 sub dup mul
+ x2 x1 sub dup mul add sqrt add def
+ /y1 y2 def/x1 x2 def
+ }
+ pathforall dist
+ end
+}ildef
+%
+/spDict 21 dict ilput
+ /style 0 def/width 0 def/pattern 0 def
+ /scaleup 0 def/indx 0 def/adj 0 def
+ /val 0 def/iszero 0 def/offset 0 def
+ /patternlen 0 def/n 0 def/extralen 0 def
+ /halfpatlen 0 def/scale1 0 def/scale2 0 def
+ /offset 0 def/firstdash 0 def/dashpct 0 def
+ /pathlen 0 def/x 0 def/y 0 def
+/setpenpat{
+ spDict begin
+ %
+ /patternlen 0 def/iszero 0 def
+ /style xdf/width xdf/pattern xdf
+ /scaleup DPIx 300 div def
+ /indx width 1 add scaleup div 4 div cvi def
+ indx 1 gt indx 7 lt and {
+ /adj PPWADJ indx get scaleup mul def
+ /indx 0 def
+ pattern {
+ /iszero indx 2 mod def iszero
+ 0 ne {adj add/val xdf} {/val xdf} ifelse
+ pattern indx val put /indx indx 1 add def
+ } forall
+ }if
+ %
+ /pathlen plen def
+ pattern{patternlen add/patternlen xdf}forall
+ style ALIGN_NONE eq{}if
+ %
+ style ALIGN_CLOSE eq{
+ /n pathlen patternlen div cvi def
+ /extralen pathlen cvi patternlen cvi mod def
+ /halfpatlen patternlen 2 div def
+ extralen halfpatlen gt {/n n 1 add def} if
+ n 0 eq {/n 1 def} if
+ /scale1 pathlen n patternlen mul div def
+ scale1 MINSCALE gt{
+ /indx 0 def
+ pattern{
+ scale1 mul/val xdf
+ val 0 eq{/val 1 def}if
+ pattern indx val cvi put
+ /indx indx 1 add def
+ }forall
+ }if
+ /offset pattern 0 get 2 div round def
+ }if
+ %
+ style ALIGN_OPEN eq{
+ /firstdash pattern 0 get def
+ /dashpct firstdash patternlen div def
+ /n pathlen patternlen div dashpct sub cvi def
+ /scale1 pathlen n dashpct add patternlen mul div def
+ /scale2 pathlen n dashpct add 1 add patternlen mul div def
+ /x scale2 1 sub abs def
+ /y scale1 1 sub abs def
+ x y lt{/scale1 scale2 def}if
+ scale1 MINSCALE gt{
+ /indx 0 def
+ pattern{
+ scale1 mul/val xdf
+ val 0 eq{/val 1 def}if
+ pattern indx val cvi put
+ /indx indx 1 add def
+ }forall
+ /offset 0 def
+ }if
+ }if
+ pattern offset setdash
+ end
+}ildef
+%
+/hpos 0 def /vpos 0 def /sEnd 0 def
+/msp 0 def /nsp 0 def /str 0 def
+/s{
+ /msp xdf/sEnd xdf/nsp xdf/vpos xdf/hpos xdf/str xdf
+ hpos vpos moveto
+ msp -1 ne
+ {sEnd hpos sub str stringwidth pop sub nsp div 0 msp str widthshow}
+ {str show}
+ ifelse
+}bdf
+%
+/RL /rlineto ldf
+/RM /rmoveto ldf
+/RC /rcurveto ldf
+/ptsz 0 def
+/ec{
+ /ptsz xdf/vpos xdf/hpos xdf
+ gsave
+ newpath hpos vpos moveto
+ ptsz DPIx 72 div mul 1000 div dup neg scale
+ 30 -110 RM 573 0 RL 0 873 RL -573 0 RL 0 -873 RL
+ 40 833 RM 493 0 RL 0 -793 RL -493 0 RL 0 793 RL
+ 194 -137 RM 94 0 RL 0 94 RL -94 0 RL 0 -94 RL
+ 10 -176 RM 0 -83 -162 -95 -162 -257 RC
+ 0 -119 109 -174 208 -174 RC 116 0 201 69 201 172 RC
+ 0 34 RL -83 0 RL 4 -63 -6 -148 -119 -148 RC
+ -74 0 -128 48 -128 121 RC 0 133 158 136 158 252 RC
+ 0 45 0 95 0 95 RC -75 0 RL 0 0 0 -52 0 -95 RC
+ closepath fill
+ grestore
+}bdf
+%
+/ilr{BinaryMode{readstring}{readhexstring}ifelse}bdf
+%
+/dbsize 0 def/cf 0 def
+/ccd[
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}{12}{13}{14}{15}
+ {16}{17}{18}{19}{20}{21}{22}{23}{24}{25}{26}{27}{28}{29}{30}{31}
+ {32}{33}{34}{35}{36}{37}{38}{39}{40}{41}{42}{43}{44}{45}{46}{47}
+ {48}{49}{50}{51}{52}{53}{54}{55}{56}{57}{58}{59}{60}{61}{62}{63}
+ {t1_1}{t1_2}{3 t1}{4 t1}{5 t1}{6 t1}{7 t1}{8 t1}
+ {9 t1}{10 t1}{11 t1}{12 t1}{13 t1}{14 t1}{15 t1}{16 t1}
+ {t2_1}{t2_2}{3 t2}{4 t2}{5 t2}{6 t2}{7 t2}{8 t2}
+ {9 t2}{10 t2}{11 t2}{12 t2}{ditto}{rn}{raw}
+]def
+/t1tab[
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 16#00 16#01 16#02 16#04 16#08 16#10 16#20 16#40
+ 16#80 16#03 16#06 16#0c 16#18 16#30 16#60 16#c0
+ 16#07 16#0e 16#1c 16#38 16#70 16#e0 16#0f 16#1e
+ 16#3c 16#78 16#f0 16#1f 16#3e 16#7c 16#f8 16#3f
+ 16#7e 16#fc 16#7f 16#fe 16#ff 16#a0 16#90 16#88
+ 16#84 16#82 16#81 16#50 16#48 16#44 16#42 16#41
+ 16#28 16#24 16#22 16#21 16#14 16#12 16#11 16#0a
+ 16#09 16#05 16#00 16#00 16#00 16#00 16#00 16#00
+]def
+/rn{
+ cf read pop 32 sub 6 bitshift cf read pop 32 sub or
+}bdf
+/t1_1{
+ 2 copy 2 copy
+ get cf read pop t1tab exch get xor put 1
+}bdf
+/t1_2{
+ 2 copy 2 copy
+ get cf read pop t1tab exch get xor put 1 add
+ 2 copy 2 copy
+ get cf read pop t1tab exch get xor put 1
+}bdf
+/t1{
+ {2 copy 2 copy get cf read pop t1tab exch get xor put 1 add}repeat
+ 0
+}bdf
+/s1 1 sdf
+/t2_1{
+ 2 copy 2 copy
+ get cf s1 readhexstring pop 0 get xor put 1
+}bdf
+/t2_2{
+ 2 copy 2 copy
+ get cf s1 readhexstring pop 0 get xor put 1 add
+ 2 copy 2 copy
+ get cf s1 readhexstring pop 0 get xor put 1
+}bdf
+/t2{
+ {2 copy 2 copy get cf s1 readhexstring pop 0 get xor put 1 add}repeat
+ 0
+}bdf
+/ditto{
+ dbsize
+}bdf
+/raw{
+ 2 copy pop
+ cf exch readhexstring pop pop
+ dbsize
+}bdf
+/dl{
+ dline 0 cf es readline pop
+ {ccd exch get exec add}forall pop
+ 0 dbsize getinterval
+}bdf
+/rhex {currentfile exch readhexstring pop} bdf
+/neg1Set{
+ 0 1 2 index length 1 sub {1 index exch 255 put} for
+ pop
+}bdf
+/screenSet{
+ currentscreen
+ 3 index dup length 0 eq {pop} {exch pop} ifelse
+ exch
+ 4 index dup -1 eq {pop} {exch pop} ifelse
+ exch
+ 3 -1 roll
+ 5 index dup -1 eq {pop} {exch pop} ifelse
+ 3 1 roll
+ setscreen
+ 3 npop
+}bdf
+/tDict 9 dict ilput
+ /mapsz 0 def/tf 0 def
+ /wmap 0 def/bmap 0 def/gmap 0 def/rmap 0 def/clr 0 def
+/trans {
+ tDict begin
+ /mapsz xdf/wmap xdf/bmap xdf/gmap xdf/rmap xdf/clr xdf
+ /tf {exch mapsz mul round cvi get} bdf
+ systemdict /setcolortransfer known clr and{
+ rmap length 0 ne {{rmap tf}} {{}} ifelse
+ gmap length 0 ne {{gmap tf}} {{}} ifelse
+ bmap length 0 ne {{bmap tf}} {{}} ifelse
+ {} setcolortransfer
+ }{
+ wmap length 0 ne {
+ [currenttransfer /exec load wmap /tf load /exec load]
+ cvx settransfer
+ } if
+ } ifelse
+ end
+}ildef
+/cDict 6 dict ilput
+ /sl 0 def/r 0 def/g 0 def/b 0 def/w 0 def
+/clrimg{
+ cDict begin
+ /sl xdf
+ /r sl sdf/g sl sdf/b sl sdf/w sl sdf
+
+ systemdict /colorimage known {
+ {r rhex} {g rhex} {b rhex w rhex pop} true 3 colorimage
+ }{
+ {r rhex pop g rhex pop b rhex pop w rhex} image
+ } ifelse
+ end
+}ildef
+/iDict 9 dict ilput
+ /dbsize 0 def/cf 0 def/msk 0 def/cmprs 0 def
+ /es 0 def/dline 0 def
+/ilimg{
+ iDict begin
+ /cmprs xdf/msk xdf/dbsize xdf
+ /dline dbsize sdf dline neg1Set
+
+ msk 1 eq {
+ cmprs 1 eq {
+ /cf currentfile def/es dbsize sdf
+ {dl}imagemask
+ }
+ {{dline rhex} imagemask} ifelse
+ }
+ {{dline rhex} image} ifelse
+ end
+}ildef
+/blankImg{
+ /dbsize xdf
+ /scanline dbsize sdf scanline neg1Set
+ {scanline}image
+}def
+%
+/wmode 0 def/newencoding 0 def/newname 0 def
+/ReEncode{
+ /wmode xdf/newencoding xdf/newname xdf
+ findfont dup maxlength 1 add dict begin
+ { 1 index /FID ne
+ {def} {pop pop} ifelse
+ } forall
+ currentdict end
+ dup /FontName newname put
+ newencoding -1 ne {dup /Encoding newencoding put} if
+ wmode 1 eq wmode 2 eq or{dup /WMode 1 put}if
+ wmode 2 eq{dup /CDevProc {pop pop pop pop 0 exch -1000 exch 2 div 1000} put}if
+ newname exch definefont pop
+} bdf
+/charstr 0 def/encoding 0 def/i 0 def
+/insertcharnum{
+ /charstr 12 sdf
+ %
+ /encoding xdf/i xdf
+ (char)charstr copy pop
+ i istr cvs pop
+ charstr 4 3 string putinterval
+ encoding i charstr cvn put
+}bdf
+ILEncoding 0[
+/Aacute/Acircumflex/Adieresis/Agrave/Aring/Atilde/Ccedilla/Eacute
+/Ecircumflex/Edieresis/Egrave/Iacute/Icircumflex/Idieresis/Igrave/Ntilde
+/Oacute/Ocircumflex/Odieresis/Ograve/Otilde/Scaron/Uacute/Ucircumflex
+/Udieresis/Ugrave/Ydieresis/Zcaron/char28/char29/char30/char31
+/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright
+/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash
+/zero/one/two/three/four/five/six/seven
+/eight/nine/colon/semicolon/less/equal/greater/question
+/at/A/B/C/D/E/F/G
+/H/I/J/K/L/M/N/O
+/P/Q/R/S/T/U/V/W
+/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore
+/quoteleft/a/b/c/d/e/f/g
+/h/i/j/k/l/m/n/o
+/p/q/r/s/t/u/v/w
+/x/y/z/braceleft/bar/braceright/asciitilde/quotedblleft
+/aacute/acircumflex/adieresis/agrave/aring/atilde/ccedilla/eacute
+/ecircumflex/edieresis/egrave/iacute/icircumflex/idieresis/igrave/ntilde
+/oacute/ocircumflex/odieresis/ograve/otilde/scaron/uacute/ucircumflex
+/udieresis/ugrave/ydieresis/zcaron/char156/char157/char158/char159
+/char160/exclamdown/cent/sterling/fraction/yen/florin/section
+/currency/quotesingle/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl
+/char176/endash/dagger/daggerdbl/periodcentered/char181/paragraph/bullet
+/quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/char190/questiondown
+/char192/grave/acute/circumflex/tilde/macron/breve/dotaccent
+/dieresis/char201/ring/cedilla/char204/hungarumlaut/ogonek/caron
+/emdash/char209/char210/char211/char212/char213/char214/char215
+/char216/char217/char218/char219/char220/char221/char222/char223
+/char224/AE/char226/ordfeminine/char228/char229/char230/char231
+/Lslash/Oslash/OE/ordmasculine/char236/char237/char238/char239
+/char240/ae/char242/char243/char244/dotlessi/char246/char247
+/lslash/oslash/oe/germandbls/char252/char253/char254/char255
+]putinterval
+ILSymBEnc 32[
+/space/logicalor/arrowright/arrowdblleft/arrowdblup
+/arrowdblright/lozenge/arrowhorizex/angleleft/registersans
+/Upsilon1/plusminus/second/angle/greaterequal
+/radical/ellipsis/Ifraktur/spade/lessequal
+/minute/degree/fraction/florin/infinity
+/approxequal/integral/propersuperset/parenrightbt/arrowup
+/bracketrighttp/aleph/arrowdblboth/bracerightbt/integralbt
+/notsubset/bracketleftbt/trademarksans/bracelefttp/braceleftmid
+/braceleftbt/bracketlefttp/braceex/apple/angleright
+/parenrightex/parenrighttp/arrowdown/divide/element
+/summation/bracketleftex/parenlefttp/parenleftbt/dotmath
+/copyrightsans/integralex/parenleftex/integraltp/registerserif
+/intersection/trademarkserif/arrowdbldown/gradient/logicalnot
+/reflexsubset/equivalence/propersubset/partialdiff/arrowboth
+/circlemultiply/heart/bracketrightex/bracerightmid/emptyset
+/bracketrightbt/Rfraktur/proportional/reflexsuperset/carriagereturn
+/notequal/notelement/diamond/club/bracerighttp
+/arrowleft/weierstrass/bullet/circleplus/multiply
+/arrowvertex/copyrightserif/union/product/logicaland
+]putinterval
+0 1 32{ILSymBEnc insertcharnum}for
+127 1 255{ILSymBEnc insertcharnum}for
+ILDingbats 0[
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/space/a1/a2/a202/a3/a4/a5/a119
+/a118/a117/a11/a12/a13/a14/a15/a16
+/a105/a17/a18/a19/a20/a21/a22/a23
+/a24/a25/a26/a27/a28/a6/a7/a8
+/a9/a10/a29/a30/a31/a32/a33/a34
+/a35/a36/a37/a38/a39/a40/a41/a42
+/a43/a44/a45/a46/a47/a48/a49/a50
+/a51/a52/a53/a54/a55/a56/a57/a58
+/a59/a60/a61/a62/a63/a64/a65/a66
+/a67/a68/a69/a70/a71/a72/a73/a74
+/a203/a75/a204/a76/a77/a78/a79/a81
+/a82/a83/a84/a97/a98/a99/a100/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/a205/a206/a85/a86/a87
+/a88/a89/a90/a91/a92/a93/a94/a95
+/a96/a101/a102/a103/a104/a106/a107/a108
+/a112/a111/a110/a109/a120/a121/a122/a123
+/a124/a125/a126/a127/a128/a129/a130/a131
+/a132/a133/a134/a135/a136/a137/a138/a139
+/a140/a141/a142/a143/a144/a145/a146/a147
+/a148/a149/a150/a151/a152/a153/a154/a155
+/a156/a157/a158/a159/a160/a161/a163/a164
+/a196/a165/a192/a166/a167/a168/a169/a170
+/a171/a172/a173/a162/a174/a175/a176/a177
+/a178/a179/a193/a180/a199/a181/a200/a182
+/.notdef/a201/a183/a184/a197/a185/a194/a198
+/a186/a195/a187/a188/a189/a190/a191/.notdef]putinterval
+%
+/newFont
+{
+ findfont imatrix makefont
+ exch DPIx 72 div mul scalefont
+} bdf
+/wmode 0 def/encoding 0 def/ILfont 0 def/PSfont 0 def/ptsize 0 def
+/declareNFont{
+ /wmode xdf/encoding xdf/ILfont xdf/PSfont xdf/ptsize xdf
+ FontDirectory ILfont known false eq{PSfont ILfont encoding wmode ReEncode}if
+ ptsize ILfont newFont
+}bdf
+/declareRFont{ % stack => Printerleaf Font Name
+ PSfontobj exch 2 copy dup 10 dict dup begin
+ /FontType 3 def
+ /FontMatrix[DPIx 300 div 0 0 DPIy 300 div 0 0]def
+ /FontBBox[0 0 0 0]def
+ /Encoding ILEncoding def
+ /BuildChar{
+ 0 begin
+ /char xdf
+ /fontdict xdf
+ /charname fontdict/Encoding get char get def
+ /charinfo fontdict/CharData get charname get def
+ /wx charinfo 0 get def
+ charinfo 0 get BOGUSWIDTH eq
+ {puterrchar}
+ {
+ /charbbox charinfo 1 4 getinterval def
+ wx 0 charbbox aload pop setcachedevice
+ charinfo 5 get charinfo 6 get true
+ fontdict/imagemaskmatrix get
+ dup 5 charinfo 8 get put
+ dup 4 charinfo 7 get put
+ charinfo 9 get
+ imagemask
+ }
+ ifelse
+ end
+ }def
+ /BuildChar load 0 7 dict put
+ /imagemaskmatrix[1 0 0 1 0 0]def
+ /CharData MAXCHARS dict def
+ end
+ definefont put get
+ /CharData get/space[16 0 0 1 1 16 1 0 0[<00>]cvx]put
+}def
+%
+/egDict 3 dict ilput
+ /chnum 0 def/font 0 def/w 0 def
+/numLoadEmptyGlyph{
+ egDict begin
+ /chnum xdf/font xdf/w xdf
+ w font PSfontobj font get/Encoding get chnum get
+ LoadEmptyGlyph
+ end
+}ildef
+/puterrchar{
+ PSfontobj errfontname get dup
+ /BuildChar get errcharno exch exec
+ (\tInterleaf::out of VM loading bitmap(?). Try breaking up document\n)
+ dup print flush
+ emsg1 copy pop
+}def
+/QUIT{
+ (\tInterleaf::completely out of memory. \n\tTry breaking up the document \n)
+ dup print flush
+ emsg2 copy pop stop
+}def
+/lgDict 15 dict ilput
+ /charno 0 def/fontname 0 def/height 0 def/width 0 def
+ /hsize 0 def/nbytes 0 def/glyph 0 def/tx 0 def/ty 0 def/lly 0 def
+ /llx 0 def/urx 0 def/lsb 0 def/glyph 0 def/NoVMHead 0 def
+/LoadGlyph{
+ lgDict begin
+ %
+ /charno xdf/fontname xdf/height xdf/vadj xdf/width xdf/hsize xdf/lsb xdf
+ /NoVMHead vmstatus exch sub exch pop dup
+ VMHEAD 2 idiv lt{QUIT}if
+ VMHEAD lt{true}{false}ifelse def
+ /nbytes hsize 15 add 16 idiv 2 mul height mul def
+ NoVMHead not{/glyph nbytes sdf}if
+ currentfile NoVMHead {trashheap 0 nbytes getinterval}{glyph}ifelse
+ readhexstring 2 npop
+ /hsize hsize 15 add 16 idiv 16 mul def
+ /lly height vadj add def
+ /urx hsize lsb add def
+ /tx lsb neg def
+ /ty vadj neg def
+ PSfontobj fontname get dup /Encoding get charno get
+ exch /CharData get exch
+ NoVMHead {[BOGUSWIDTH]}
+ {[width lsb lly urx vadj hsize height tx ty[glyph]cvx]}ifelse
+ put end
+}ildef
+%
+ /scfrq 0 def/scang 0 def
+/solidFill{
+ /scfrq xdf/scang xdf/scproc xdf
+ gsave
+ scfrq -1 ne scang -1 ne or /scproc load length 0 ne or{
+ scfrq scang /scproc load screenSet
+ }if
+ eofill
+ grestore
+}bdf
+ /patchar 0 def/pffontname 0 def
+ /fillpatset {/patchar xdf/pffontname xdf} def
+ /patstr 1 sdf
+/patternFill{
+ /scfrq xdf/scang xdf/scproc xdf
+ gsave
+ scfrq -1 ne scang -1 ne or /scproc load length 0 ne or{
+ scfrq scang /scproc load screenSet
+ }if
+ currentfont PSfontobj pffontname get setfont pFill
+ dup null ne{setfont}{pop}ifelse
+ grestore
+}bdf
+/pfDict 7 dict ilput
+ /paty 0 def/patx 0 def/#chars 0 def
+ /ry 0 def/rx 0 def/ly 0 def/lx 0 def
+/pFill{
+ pfDict begin
+ gsave 1 1 1 setrgbcolor eofill grestore
+ % setup factors
+ patstr 0 patchar put
+ patstr stringwidth pop
+ /paty exch def/patx paty def
+ % setup region
+ eoclip
+ pathbbox
+ /ry exch floor def
+ /rx exch floor def
+ /ly exch ceiling cvi
+ dup 0 lt{paty sub}if cvi
+ dup paty ceiling cvi mod sub def
+ /lx exch ceiling cvi
+ dup 0 lt{patx sub}if cvi
+ dup patx ceiling cvi mod sub def
+ /ry ry paty add def
+ /ly ly paty sub def
+ newpath
+ % blastchars
+ /#chars rx lx sub patx div ceiling cvi def
+ ly paty ry{lx exch M #chars{patstr show}repeat}for
+ newpath
+ end
+}ildef
+%
+/BeginEpsf{
+ /ILB4Epsf save def
+ /clp{newpath moveto lineto lineto lineto closepath clip} def
+ /ILDictCnt countdictstack def
+ /ILOpCnt count 1 sub def
+ 0 setgray 0 setlinecap
+ 1 setlinewidth 0 setlinejoin
+ 10 setmiterlimit [] 0 setdash newpath
+ /showpage {} def
+}def
+/EndEpsf{
+ count ILOpCnt sub {pop} repeat
+ countdictstack ILDictCnt sub {end} repeat
+ ILB4Epsf restore
+}def
+%
+/clp{newpath M L L L closepath clip}bdf
+%
+ /cm 0 def/pgw 0 def/pgl 0 def/cn 0 def/pw 0 def
+ /pw2 0 def/lnx 0 def/lny 0 def
+/cropdefs[
+{} % 0
+{ % 1
+ 0 0 M lnx neg 0 L
+ 0 0 M 0 lny neg L
+}
+{ % 2
+ 0 0 M lnx 0 L
+ 0 0 M 0 lny L
+}
+{ % 3
+ lnx .25 mul neg 0 M lnx neg 0 L
+ 0 lny .25 mul neg M 0 lny neg L
+}
+{ % 4
+ lnx .25 mul 0 M lnx 0 L
+ 0 lny .25 mul M 0 lny L
+}
+{ % 5
+ lnx neg 0 M lnx 0 L
+ 0 lny neg M 0 lny L
+}
+{ % 6
+ [lnx .75 mul lnx .50 mul]0 setdash
+ lnx neg 0 M lnx 0 L 0 lny neg M 0 lny L
+}
+{ % 7
+ cn 1 eq cn 3 eq or {90 rotate}if
+ 0 0 M lnx neg 0 L
+ 0 lny M 0 lny neg L
+ cn 1 eq cn 3 eq or {90 neg rotate}if
+ /cn cn 1 add def
+}
+]def
+/cutmarks{ %stack: pglen pgwid cmtype => ---
+ 0 SSG [] 0 setdash
+ /cm xdf/pgwid xdf/pglen xdf
+ /pw DPIx 80 div def/pw2 pw 2 div def
+ /lnx DPIx 4 div def/lny DPIy 4 div def
+ pw LW
+ /cn 0 def newpath
+ % upper left corner
+ pw2 neg pw2 neg translate
+ cropdefs cm get exec
+ % upper right corner
+ pgwid pw add 0 translate
+ 90 rotate cropdefs cm get exec 90 neg rotate
+ % lower right corner
+ 0 pglen pw add translate
+ 180 rotate cropdefs cm get exec 180 neg rotate
+ % lower left corner
+ pgwid pw add neg 0 translate
+ 270 rotate cropdefs cm get exec 270 neg rotate
+ dp
+}bdf
+/bop {/pgstate save def} bdf
+/eop {pgstate restore showpage} bdf
+/ndf
+{
+ 1 index where {pop pop pop} {dup xcheck {bind} if def} ifelse
+} bdf
+/setcmykcolor
+{
+ 4 copy pop add add
+ 0 eq
+ {1 sub neg setgray 3 npop}
+ {
+ 1 sub 4 1 roll
+ 3 {
+ 3 index add neg dup 0 lt {pop 0} if
+ 3 1 roll
+ } repeat
+ setrgbcolor pop
+ }
+ ifelse
+} ndf
+/packedarray
+{
+ array astore readonly
+} ndf
+/findcmykcustomcolor
+{
+ 5 packedarray
+} ndf
+/setcustomcolor
+{
+ exch
+ aload pop pop
+ 4 {4 index mul 4 1 roll} repeat
+ 5 -1 roll pop
+ setcmykcolor
+} ndf
+/setseparationgray {setgray} ndf
+/SSG {setseparationgray} def
+/FC {findcmykcustomcolor def} bdf
+/CC {setcustomcolor} def
+/ilfeatend{
+ stopped cleartomark CD exch sub dup
+ 0 gt {{end} repeat} {pop} ifelse
+}bdf
+end
+%%EndProlog
+%%BeginSetup
+Ileaf_6.0.0 /initialize get exec
+0 0 6 vck
+%%IncludeFeature: *ManualFeed True
+%%IncludeFeature: *PageRegion Letter
+%%IncludeFeature: *Duplex None
+%%EndSetup
+%%Page: (1) 1
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0044 put
+dup 3 /C0045 put
+dup 4 /C0046 put
+dup 5 /C0049 put
+dup 6 /C0050 put
+dup 7 /C0053 put
+dup 8 /C0054 put
+dup 9 /C0057 put
+dup 10 /C0058 put
+dup 11 /C0065 put
+dup 12 /C0066 put
+dup 13 /C0067 put
+dup 14 /C0068 put
+dup 15 /C0070 put
+dup 16 /C0072 put
+dup 17 /C0073 put
+dup 18 /C0078 put
+dup 19 /C0080 put
+dup 20 /C0082 put
+dup 21 /C0097 put
+dup 22 /C0098 put
+dup 23 /C0099 put
+dup 24 /C0100 put
+dup 25 /C0101 put
+dup 26 /C0102 put
+dup 27 /C0104 put
+dup 28 /C0105 put
+dup 29 /C0107 put
+dup 30 /C0108 put
+dup 31 /C0109 put
+dup 32 /C0110 put
+dup 33 /C0111 put
+dup 34 /C0112 put
+dup 35 /C0114 put
+dup 36 /C0115 put
+dup 37 /C0116 put
+dup 38 /C0117 put
+dup 39 /C0118 put
+dup 40 /C0119 put
+dup 41 /C0121 put
+readonly def
+/FontBBox [-16 -209 798 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268420EA157C62583FAA018F369F10C267E5A689
+14B3CF05D7E3E7301A1D113C
+B87969B0B7A33DFDE5
+61041C8A
+79E0C55F075199031370610430
+0D19993C66A904E0A393097C33E2B533C751B03DB292D3F16A37AEE640B3CB8F7D47F2E44B2ABFB4C83CFE179622890516BEC9EC41E287FAB18F
+46752A98
+B524197F79749498F1B81B499E
+5B173784DF8DA9E453CD0839B33BA0D67E613FCB416EEE
+9A51DA49
+4646622F22B13473EBDF96A0DA
+8A349322E8D94CD0E91C99EA0C3BC09462899C6BDDE61874BCDB50101C49F1
+E1743DDB
+AA28EA75BD57850EA9D937150B
+85ACF426E34B3183131BC979DB458E0EBAAB66D7F5CEC82005F3EE4DB4BABCBA207EE2F466925562FDBCA112942CD36FA5390091E872502364E19BF7
+EB242AAF
+39D8F4BFAE6EA27F8AC7A1AEE0
+A56BE808C10F17EB6B5D91B5695DEB6ED22DD16F2574D72935E5EC7C7575C6B182265968DA8EB6DA68C0BABFFD6F48F334792ACE62EC353A1D4E6DD37BBEF2AEC2E79F31E1F9BCC9F1A33AE39EAF26DB49D5A601
+4AC21A61
+30AE391F2BE80CBCFE383A1FF8
+8A692FD09F448C9C5F4B03B6065E06AD0FFDA68FFDC619AFAA3B0F9CC10CA085709F8BB2E0D21D20413929003D8477143562ABA4DFBF6A333A34E870017DEABEB0766CF0F1F790312030121B75B0971AC653B5B0F058
+4EB1686C
+442AE58C59831E753FA85AA04683
+23052D12A3C2410F588D51311D615774EFBC826AFD52DECFB2F903DD90EE28E43D87002B3BDB36C47A6B0C54CEE9A8D7C45CDDB50D8FD4F6356B06F528815838D2306DCD035AC49687685AB64A2F795D67F85862D716DC44A9AFBB9DC1CBBA029AB60318
+982A8B1B
+D2FFBB02FD01173E5CD80E37570A
+1CCF168699188F4C6EB598A4E1C1BC88062227672A089BB6E757698D44389F9A62F8A7A884348A3C9914F5778D1C1D8C452A326093A90FB4D3B1C4D35833F54B5FB0ECC6CD82DF7F4DBC97BB882BCF21368FC9B4B7D2CFEDA9A08D7B28E0717ECA3B2230
+42CE9CDA
+A2BE47BBFC4FCF37EE8FE6D2DC
+18EB4C0275F35929C2D50769FB6302CA7361DB4EB79376DA9232C2FDAAA3AD90213C23EA5BE7DCB51998AAD022D9B5F1D517960F9471
+1BDB3D4F
+5A1E7EC34294EB573CCDEFB149CB
+67410C30B42FEE86F6FACB036772521273A839D8802D2D75F9E33F9F4A0CC24C34E7253170E428828BB551EA9A25134702A47F849E2A0B4A3D439252EF5141F427027B79CD248B7EE41A8C106EEF5DE3BE596CCBB90B3B189AB35DDEB3542AC6A753EFB538FE79D745E342
+B12150C6
+88EC9208F2E40CE65B143031D964
+DA80934B50EB86975F0FB517161F3C6FB6371E9C7BCBC091BB417DFB5DC2E2C561131401430DEB8372E3DC7681765C50395636060E28722935D6DE8376F935757FF5B88CE250528CA3DDE197E49BBDD3A1997A980B0A8D04FCEE14A978656DC771F044152589E04E00761146896D0C3FB2882DB81C62E00903D0
+48665C99
+DD79A2AC894FFD47B73A8DDE1813
+A84E326E8D6997E4B75BA00815A988B7C067B945E0EE8B89A5308013EBD51B5DF8C9976FFB253A48ED42E03B23DD495508986176AEF41381C398B70A60642CB37DA8F96A0D7C1C2B41746CAE243937783234C2D0497E7C95A0A4D9AFA732A28EF44B208151469458
+C41094FB
+F639F26659F56EB2E0244B800E
+A15AF8C1C16150BE6CE7DBC0BEBD67767480748ACA150A7BBF822D77C4917E55EB5C9A7497A92203946F1E28A554C0A722F13219C27E8D30FEBFF24D8E5467D1C36F08F1A39326CDD93356DB6EA380C42C2C52D0FE6021
+0123DEC9
+B8EDF943F72513AF92A015AC5D6B
+5F8B5A14A9CE63EFB0EE1BFED91DB21AC9C69B44D3D0DCAE6BC8805234449191EC643A340102B404311119BEEC5263717A5057D58367A740BA188DC0AB2EA96C4640AFFDBD3A6C59A4AD78045E1CBCCC7D867A0A0597968A211189CD5C149ACFCF281DEE
+0850472B
+81C5FA1AEEF723927B57179C5C3F
+2FA8A9D8ED480A23883579198DEC83FB49C110F3AC157B61FEC86E311E6E0539931518434A54D0736D9CAFD4A07A04ABFE47B57BF5334D6167E8BC6BD6E13775DCFA2D1DCA3769F7BD4D5538793338E000EB497ECF83DED1C764AEA9884135D90203BF1C41E74AF2873A6B723455214F3FDAFAE8B47985
+5E90CAE2
+89753CAB2B3D6ABEDE6085CF2D
+85B1CE6F86551DF6306F05FB872BF842A438C03F16A8B7D5E8C641B1639DC4115BED40DDE0DE13FA9D1BA8F95589ED9581CA0CF91DD99D38A0264ADBC6A7
+D788C389
+E0113D3B2BE229D6EF51985E86
+9E1187E763DA4A7F760A8C9F02CB06029A805B2A2FBAAC660E946BCEEB17345175D3037509C381FB232404636C698931B292233B859F73641232843827B341A6A57105FB6B7977D3B3BBD7D876334B5711599345F771E06DB9E255DC1343C3
+FAC063CE
+5F3300BB595DEAB80C4842870603
+D2AD96126332E1B474B3B6E6314724924E2A182AE1BFC657C3A76312530AB7558E40586340A1CBAC9BF1B22B8293F889041ED56532B6EB112D0CA49FE74DFEE75D49E08A9AB48C7AC96D4C361AA7822F7EAF125561C8108710DDC7BE50576FF2BB044809
+E476682F
+354947D8E327F80099E5D53AB056
+B9EAE669C433E962051CF401A9720E64BAB32C526D0FA290959551A8B7736DC2D162A82EBEDB18460E29EC6AE52B600284377236AC6BE1B427068AE23442019D5227942A14EC99E1C0942965F24CA06172962BEDF6B0BD51FFE53DCC2C26FD817855A3B51832495B914BCABB563E526DC0002AE2E2
+14D4066F
+BC0200488F7D3714CEBC740FC4EB
+A1C8499D93A6BDBFDD35DBE8E0CF96DDAA8C602EC67F69FCF7AAA78276F1205E4C3BCD4A596CEB41EC06F170C20364CABF269F193326EFABD05E8B75EDC4F76F1FCAE99AEFFE428300BEF6194C0F51B3F532112796E32942F0BE538E9A3FC16A036E7C31FD28322B3E0E9F0C609ADC00CC6D01554A8248FF6FB7C2A31DF6
+8717
+B150A02F
+4B633E85
+91B7A203AB175DFBA1A815B739
+88E6499894235763247279C794D0C3253DF46D1304D36F5A3D72793D3F7A1FD6D57B038D7512E6A01EB625DBDBB846FE812056E54CEB42897219BC87C7BBDC9D4FB7A168704F3F7C539209BC8A60F85B78CFCC97543063595308CEC86140
+742E2397
+2504277105808A1FC4E56A3AA4
+2584181D7982B00E04E0D30FA1ACE8DB1D8F211FF06C6A6F344195AD874B32ABDDC6325EDE3680E4BDF4CC1777993EC2768355D89128452F5CFDDD07C9DCCDCF3D123A82E8A36FAC6ACCA651BC7F9CBE10B4
+0FAC9830
+8487361AD3AE2B86B8AEB47E1194
+13DD95565C3B6D7755DC03905D9DC58935B2D1AA4B18292E915DAFA471E15803F583646B00E401EB147F195AFC9EE37EDD5472D6CD00E37834CFB826AD0AD9FD79EE2F8A79CF6266F9338184E1B64E5FBFA469D7FFCDF4D038AE2549BC170C726B741BFBAB13EDCA511667D7
+EF79B296
+5F4F9C3DD461DFB521702A7FF9
+EE61B06EF2F5C9571F6D296019D2F88B8C064F36A72758FBE0B572DDD4D0D0F73C1B2D3673C90AA3F9C19F2013060BB61E1242FFB08EE9EFFD6BFD98DEBDFA4DFCCD4CCF7B5AAE247BF215A6C44B47CB6AC6180A322BE0F10923EB6F
+87F7295B
+65A89C92B661E31F50D4D32497
+12471E850AFED8660E5CF4E24FDE6E94C10352AFE8AA1B06D9866A54E1E7AAE7063A3A015FB37D2826634B3CCB0CA2DB8CFE3F7BF47DCD181A1170E344E1BBE34CEF9777940C1EF5BC4A1A488344DBB0ABC79A604A52000AB05EF075FE
+3B5B77F9
+D7B3A48B7BF18AB4FA4C3D2A68B2
+366102AB003CE4E8C42757183727E114C85825E1EB79397E1FDA84FEE5915B148CE9EE5F97DDE93B40B38C3B2630FA7BB016BD0B53C5A6B2621BD34F2E22739DF22CB78BA3475A1672074E9A77624D8C2FD5AAD24CE110571D86C3985D1BCC330C05BB9763A408BD
+8ADD0311
+2AEBBFA7ADEC853154E8576E72
+A81865705DEF380C9419F11D7513A35F79132BF2BDCE18CFEF5232B24A4ACC80FC43EA6E44EC03E7AFECC474781CD127EB7A87DBC53C2D81C29A8D8C022425760B2BF11C9EAE86E938AC8D45E02C
+DC6F9193
+35C629032ABF89CB22349EB99970
+7A229E2E68F92DC55D27C7B45E61B500740A14CA1D71204EBCFAF918E51F0A78EA9CD90B884DD52530C36D2DE3E320AC7044AF8578E00C32EE0D7A568332B5BCB57D541E43D1CD58944010DF89C10F9D869397ACD1E4667E79907D78CB7994F7117CFDA2B8C4141025112FF2802DBA3120EF9D0DBFF7447DE2D584557D49
+F2A4
+0E3D
+69E47849
+BA945735613CBFF1E6916E6B55
+5B31670CDDE45AA7F7D4E39D1919480719729CEA6BC3AC682A58115FA2E77BA6BAD1E9004597313AE9E7DF6E921771459913B0AA
+9F4F92F4
+996C5EE766F11D04B1A195D80866
+2B7F771BA5C2A7B2D95DC29D79416A6E9CEDB0A22BF4515C23ABFB0F876071A862BC2BD887C5CEED12DC19EBCEA0BB004B29B893EBBECEA6A95DD0E5577A4593ACB0AA30A661E7054F28289235F0E792B7D20E96F2CBFE13002FEECE567A683CB96BDCC5613703CBFC7B3BCF174F11B413B4DA7CBE5F89B210A2213CC4EB
+300C
+DBE40BF16FF1A255A7D566420C653291A4C76E1FC9F923B5FC86ADEC
+2F3A7122
+1B29A400BAA243C94285AB1D2D1A
+624F58B32F57204A2982B1AB376D067ED6A0F13CFD2BCC06E5BB254AD9B6A29484481F5762677435A7BAB00216AD461A60E1445A5E3C447A794140E16C1525D03F27225186962639E833BBA7E332681378A43A3412915F466B49DDE87C3357FF23C09A597D8F00
+289CCCB7
+60C3AF62A8001A844B0ECADFAE
+F80EC2B6BB8D16BEC1D957BEF8B8A200EE9C9B821AC12F58943B02C54C9EFCA6A6F6F935D15E60628D271B98885A44B79D2CB4325D16FDD325BEDAA9DB6A462AC1C6A5302695
+15E6A156
+89F1D0E355B17B3F652C89794FD5
+37D7AC870BB9C09978D42D533E594CB0F123F251D1E2586345ABD4C010C6C59319960C8E12D274052E5398D396532DF9222A90AF8C9E29CE881C7164D4B38B36C52D1F5D0869A99B103DD1CA36147D697A77ADC0E9C9F919DEA180A8849DF3F70A96C1077D83224B38C12857EE3970C3F7
+06DE4EF3
+F465EED40C0C0CCEEBC159A8AD
+8558F0492B1AC84CE21B091E7E32904F00B81B366E97E7FC6E91016C6D3CD26E481F31A82D9A0EBD8B2A3ABDE994DC6A23098C91DD1C18636C7E95399EF7EFD10A53D04E80B5902C1A573AAB5E9BDEB5B8B7D9DAD52C223026
+9BFB743A
+BA3CA234003C97BD2DB5E68400C6
+706D29DFC0D52384C291BD16897A484B1E6C10854C2D823A86EF031BA4008C7E65BAB6A2C70662622E820588619F497A5DC5CF002BCB71D3A1D875716545E47AB6499402D187EF081F54EA2B23049AFCC17CB9E031562B014E2C49B89214F5F6465D4E10B088D3D45B32ACA3B39717D90B3CF471016A36F3DC
+9C7E7F7B
+E4F378F7FEDBAAC5F504E24C58
+2927E6F423AD7066015A7316EDF0AED5726167B66D5CFD163F92394FA87EF377F3C29664268C3A5C5581E81E6634EEEE664A8475ADBE5984B8CECA69A178669714801ECD
+42CC67DB
+EED13891C79E497B9C46CD383D
+3857F11C59A14DBEAD3763749904F4AC91C5E5DD47C12EDEBEE214896E903990D3E15F91C1BBE10DBFC4247E4B0DBB0134026E74C82A724739AC15A95A4A3DA76B76B22B11B014E3CC5F39BD32F09D02C0C9AF4B4055AC14C22B49
+3AB2453E
+1061A11BAD86521446C7DE5F26
+AB8FC019DD681306EE5B3D94474F5374C68A12D01767E132CBD869777B37DFCE4542B0E894B9AD7226421073CABC9CBCA562451DBA9A878F8810DAE3C7AABE1DD5D048003D1CDECBDB1BC1F404859A02B548F3C508CB3891CA1E9CE0
+AC9B3C9C
+9AD01AFD3ADB2E452755D3409002
+CAE1C9042906014A4A57F1F48804301628CE167F0285B0B594B205D476598468406C5A4510F0478F075336FEBE85B9806B32DF35F2B11CEBF0729638BED415302B546457E5BB2A4B3BF5512E6133A26206C38DDEEA6E2E05F1C6B564DD023603F2A13182392E89055D90326E4CA0BAF089A046F72B9ED7681638AFAF4FE9
+4A12
+92FE42AFB7351C119DC064
+8DD0F16D
+2392EBB1920FF41778E2965DD763
+1276D516D835D9AEABF98F48ED7A58A6279CBB0D631820537BA12BDCD73F481A35A1DE134C48C7D7A72AE240ACE9898E76238D8D4294932152B9F7174D76D515DF659048878347E80FE826FE8C1FD90B24F9B3EAC4DECD1F744227FCEA13ADA7F396F578CEB8831EDB781BCA22229594EC4C0C181C47A8E531D478115D17
+44B2
+89
+669EBD9B
+12B8B755F70FD71F39567963E6EC
+917BC6FEA7CEE964
+5DC7CE2D
+ECF2B5B56033167CBDD13C88EA603E6B84DA24D9D20CADC8E60AA4BA8CEACC298EC0
+4BA8A338E8B53AD6C97F3738EF95B84C93F32370D35FDB18134C0CD8A8F9A7C517F3005ED4E8
+D54432A79CC4C0E393E2E7C3B99FB91DB69A84C63DC4AAFEA193C4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchbi
+%!FontType1-1.0: PSOwstdutchbi
+10 dict begin
+/FontName /PSOwstdutchbi def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0063 put
+readonly def
+/FontBBox [84 -13 471 683] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B3FBAEC826AC7E1E20
+250E3AABDDA9ADD30F86E07417D415A5C5F3C75B2D0826BEB6F3013607ED8A663020839C9041F4F7C7978EA3451C0F83A22A59A183D3AB0AB9DC1DDF375217A89B7556A556E7C8BD6ED64D3E9B19FEFA6DBF2A8B1D7A4AD1AB7A6DF880F7EFB3E5DF4C13A66BAC11
+56DC59CC
+EEC84A45D81614AC1B97B8A2F81D
+9A9D3BAAF1FB2118
+EC0D2C7E
+1A1D607B828FA12B6EF68C7EB5615F934707CA5B4619FE8DFF0D37E3550CECFC8A2C
+F8F223E46E11C8A14D58AD13906E8985616C0BD911D6B23DE6DC29D4D5DBD4B6A61956586E84
+5D5E25A2F6811872DC86C238C92A7EFF1905D6DD6B55F980F95573
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch24b 24.00 /PSOwstdutchb newFont def
+/wst:dutch18b 18.00 /PSOwstdutchb newFont def
+/wst:dutch72bi 72.00 /PSOwstdutchbi newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch24b SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<1219252219231a0a> 4639 2965 0 6139 -1 s
+wst:dutch18b SF
+<0b011219252821231d0113> 2922 3473 0 4642 -1 s
+<19231a21231f15201719010c1920171b1f15231d> 4631 3473 0 7853 -1 s
+<11201a21231f15251c2120011219252821231d24010e1c271c241c2120> 3261 5625 0 7514 -1 s
+<1019281e1925250313> 3473 5930 0 4984 -1 s
+<15171d152318010d211f22152029> 4973 5930 0 7303 -1 s
+<0f> 4166 6235 0 4357 -1 s
+<191623> 4343 6235 0 4792 -1 s
+<26152329010507020105090908> 4798 6235 0 6610 -1 s
+N
+53 LW
+[] 0 SD
+0.00 0.00 0.00 0.00 setcmykcolor
+122.0340 -39.8126 0 531.6085 531.6120 39.8476 6471.2510 9717.6770 addconic
+147.7512 -32.2887 0 531.9476 531.9525 -27.7457 7269.0162 9257.3427 addconic
+69.9049 -110.0760 0 531.9504 531.9438 -9.8994 7269.0695 8335.2984 addconic
+-71.8156 139.0736 0 532.0484 532.0527 40.9349 6546.3731 8147.0777 addconic
+-118.4577 99.7284 0 531.5814 531.5758 45.0000 5862.6495 8656.5755 addconic
+-161.6974 17.7169 0 532.0489 532.0446 41.6451 5694.4459 9424.5238 addconic
+{} -1.0 -1.0 solidFill
+dp
+N
+17 LW
+0.00 0.00 0.00 0.00 setcmykcolor
+-41.1168 138.8827 0 532.0465 532.0531 41.1174 6545.9506 8147.9977 addconic
+5965 9883 M
+40.0635 -139.3211 1 532.0497 532.0449 19.3299 5694.1107 9425.0767 addconic
+5597 9119 M
+119.9997 -60.0288 1 532.0451 532.0499 0.0000 5863.0202 8658.2299 addconic
+7003 7874 M
+-120.0000 60.0300 1 532.0509 532.0466 0.0000 7269.0257 8334.7658 addconic
+-28.9488 151.0224 1 532.0487 532.0535 -31.0514 7268.9782 9256.7705 addconic
+44.9998 -134.9994 1 532.0497 532.0462 -45.0000 6470.9520 9718.0035 addconic
+{} -1.0 -1.0 solidFill
+0.00 0.00 0.00 1.00 setcmykcolor
+N
+-41.1168 138.8827 0 532.0465 532.0531 41.1174 6545.9506 8147.9977 addconic
+5965 9883 M
+40.0635 -139.3211 1 532.0497 532.0449 19.3299 5694.1107 9425.0767 addconic
+5597 9119 M
+119.9997 -60.0288 1 532.0451 532.0499 0.0000 5863.0202 8658.2299 addconic
+7003 7874 M
+-120.0000 60.0300 1 532.0509 532.0466 0.0000 7269.0257 8334.7658 addconic
+-28.9488 151.0224 1 532.0487 532.0535 -31.0514 7268.9782 9256.7705 addconic
+44.9998 -134.9994 1 532.0497 532.0462 -45.0000 6470.9520 9718.0035 addconic
+dp
+0 LW
+N
+0.00 0.00 0.00 1.00 setcmykcolor
+7730 8069 M
+C
+N
+7730 9523 M
+C
+N
+6471 10251 M
+C
+N
+5233 9691 M
+C
+N
+5402 8391 M
+C
+N
+6546 7615 M
+C
+N
+0.00 0.00 0.00 0.00 setcmykcolor
+5916 8668 M
+7026 8668 L
+7026 8668 L
+7026 8917 L
+5916 8917 L
+C
+{} -1.0 -1.0 solidFill
+0.00 0.00 0.00 1.00 setcmykcolor
+N
+5916 8668 M
+7026 8668 L
+7026 8668 L
+7026 8917 L
+5916 8917 L
+C
+17 LW
+N
+0.00 0.00 0.00 1.00 setcmykcolor
+5770 7803 M
+3906 7803 L
+dp
+N
+5261 8142 M
+3398 8142 L
+dp
+N
+5007 8481 M
+3144 8481 L
+dp
+N
+5007 8820 M
+3144 8820 L
+dp
+N
+4923 9159 M
+3059 9159 L
+dp
+N
+4838 9497 M
+2974 9497 L
+dp
+N
+5092 9836 M
+3228 9836 L
+dp
+N
+5770 10175 M
+3906 10175 L
+dp
+wst:dutch72bi SF
+<01> 6354 9319 0 6976 -1 s
+wst:dutch24b SF
+<14> 4293 4490 0 4591 -1 s
+<19271c241c212001060405> 4583 4490 0 6485 -1 s
+GR
+eop
+%%PageTrailer
+%%PageResources:
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (2) 2
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0050 put
+dup 3 /C0058 put
+dup 4 /C0065 put
+dup 5 /C0066 put
+dup 6 /C0077 put
+dup 7 /C0078 put
+dup 8 /C0080 put
+dup 9 /C0097 put
+dup 10 /C0099 put
+dup 11 /C0101 put
+dup 12 /C0102 put
+dup 13 /C0103 put
+dup 14 /C0104 put
+dup 15 /C0105 put
+dup 16 /C0107 put
+dup 17 /C0109 put
+dup 18 /C0110 put
+dup 19 /C0111 put
+dup 20 /C0112 put
+dup 21 /C0114 put
+dup 22 /C0115 put
+dup 23 /C0116 put
+dup 24 /C0117 put
+dup 25 /C0119 put
+readonly def
+/FontBBox [-25 -238 920 722] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842699A34E3649842B194F49D845069DF85493
+1539025D8B7E5F8B1C5D2C91
+AC39A18D8BF0C90D95
+6DB2540D
+AEA704F12B6ACBB7C2E5688D0E
+BEACFF4986C025D87F2314C9F8814328C29A3584D4606BFBA118F6DDAC6EB68DF9350C677A064AAB1B5BE20CBE9B28CDB2882DAD10BAFEB2D1D147E70E904D0CDADE0756B853D310FB92FF9CD936EEF71B729F072664D6920F94
+1575559A
+056F112A4E8FB5C8B6658DF687
+C9A775D937976D4A3E4436A18A14A074E9891CF1A13C6BA05951978168D31C1035B5727FED5D093A2E659C4519BB8299013A4C7F259C
+6A4BE78C
+0776563D20A5997B483E76EFF022
+3DB9ACA68AEC5DFD52B784EBB0FFF289CCB8B8BC0C954629DD0207B9A31A998D6E19D620B1583B468A9F8651B476C6DBDB0CFD106418C1FC16164428A752494F9FEC1162449E3C0790123C3620EB6DE337BA8BD007A48138D207CA66206E6D7377F3F70F8267CAD5E19AE240F451CA2AEB6361
+DA18D2D2
+9D775C7E79EA542ABC602C3B5E16
+FDACB9A75E011D7BECB098F6EB8FCE09D4CEDFE700FCB1EEBDF4FE3B99C0459B751806E68EE893021163791532EF6A2EF3946E4BA30E89E1BA60AD241CFE24723C37346EDB9F78FE1579E869F75E528AD91D915FD52CC24A332E7E3516625E4BDEC8222203CE277D59F95C32991354A98F69B50352085E2C6393496A2110
+9535
+4A
+E334F45A
+63AA9EEB2E86E85E35CE52CB6583
+FA4C6F641A0923C925B20E99112AF9D789F7E9AACA5340E5A7ABE2D07B86E2E85C2F2096D75727B62B29C3A696196632910886ACED887A31876761FE895D3C00129A940ED9AA748709DBC0B63C9CE7D9C30A20B16C151D7D15D688F87DDE4FC97138F642FE563225DE4F5055B3A0C7
+E9A8412F
+46432715FC785BA1917FD25711
+0AB63FFE85D3DA34E627C01B52B0799D486492EF90EBDEBCC2EDC4EEA927297402FE71DBDDA647CD31AFE41716B111E4822C1156C2877D7FFBEE77E4531AF93CDB9E5A9AE16BECB8A3D09FB03C22323B9EFBD3B11981E62995C40AE7
+E6DEDE72
+4CC3C86B6CEB77F6C76CF6319AC5
+34D25798C1ACDD146E61A7A98172182CBFE58A4D8534B38AF00C7B403625EC01AA210C92787F4EC2780BE5C3F01307FA30ED2020AB78A279CC4C33660EBE02829343FB738A8FC643492BBBBB2C8994983EBAE0351FD328610048242D3B1A6E7FAE3797A027A13744063B
+F1B2A353
+2A200C231F4E0EAB04A115AC5D6B
+5F8B5A14B14CE3A2F281CB627C8FCB8012E2A42A3CEAEE538352DE083939FBD372EF975BB173F87591E9B0D1D285341D831448FFE1FF1E2DCD381A2D82E00B280321AD02055AEE397DF9D54897D7BE6DFCE673621F0B2DAAE978D17AD37B5E20B5686E47310E4E8EBC3A7614335D3354419555010B13DA4449AA2AFC2A20
+B724
+09F8E9
+19FC7B9B
+7639D997B93C6BCF9762A6F0E3
+58BB96C8B918B91BAC311D8E262A378CB222177CBA6EF1F0E12F922436DF200EF29D3FEE0EA51750012B4829487158895F6CA9F4A9AE3FFF97A07B164D36E3BC5E1B8EF63FA0D5ABE814940016FFCC70F572
+6B099C18
+A3A9A9D32D51C01D4605E7686D
+F03F80B28588664D596006748092A8E10CB722C9FEB0011E86AF24467208DB3F94654040F4E02D532D8A6214DCAF50A8AE0E0BCC97E19843505DF5579A066902625B74E536E0A339139B68FA470A50A93134DE69D7CFEC4B50
+CB03BE29
+63CB57DF71EA687A44CEB5C4BD
+A5A093F40660697B6DF57CEAD63CD6524F0B73E463B01371094E847F72D90E1F52A24E38BB293FAFE54D9FB9D01C09233EA1D3F262CCD7E70F11FC2361C3EEAEB7BB7B52FE25D5A1B2FB26BACD19113B0F6A6DBB9BB34A4867E54B73
+AB34E0A0
+A2089A7396EA95C4CCC241B3B206
+5A1560B1569849071545D2D705B1611F7B6D01E394812AEAC7A89E04C062929C7BDDF0D824441F03DEA862C05DD99C4D23AE15DF6467DAD3C8B1235BE93C4E6D89E023B819FD8845B150252A950D2FC096F7DFECC15807E34F398D5439374B8C57D8BBE40F06CF35039D1BD4CAACA3A4054782E57AA98FA0A575B75E6A10
+89BF
+2FE6DC6CD1128FB9CCA60385382110A647052610D2F2A8F119ABD24580F0720F532BE1CDA9164E4727D6A562E443C4
+EB5B2E92
+CC85203A7CC19F9BBBE0BE14A62F
+9F5823B793C047E50E56B0ED9D6295D8E0911AA58DC7110BA19271EB32AB6233FE86DEC5D6FD0DBA763DEA44A1B6EC43AF22464C453FD29FDFAD5524615AC8B63837DFFDD101C43E20FC9729F92642002828343154735DBFD28FEA02E5147E6BE9877E6D520A47E764AB435A13
+13E8AD87
+DDC85E7919AD1C30596D1DEA63
+1967D663F9ECDC8A976466BEC3D60E7FAC1E2F58C0C54532FD9B8642D0618A62FFEEB02F912720C2F708DB067601FAE097C6E3861EC42F1F932F3EF66B6021E73930C8F72878DEB45703A93851DE4835
+D9F13DAD
+9038B78CC18CF83BF644436D3B6D
+B6ED212E093B357C35571E479D9FD4FEEB11396EF621E3B9B2704A901AE51CD230DD341401B56D1B6D926B510F6549BF0AF3B8C23EF50EC13719EE234DEFBC4182343E4F2D970E0BA6BF969A6BBC4DB8CA5FC1290E13D8A890937D27BEE881EE1AF5D3395647FD4C6E2D8F3661A70DBAC70B129FA179AC0C79A4495F835D
+0253
+8F166AD5B1A36D2F3420BA51AB70D8C0209C9F2C4FC17CD74518D59C4F68082549DC80
+5AF1DB31
+2530EA714F5460CCC2598056EFDE
+8757BD4041C2A024E012A35C44D851FFA108722EDF4B32C1AE62B65619C31F91D78C72D8702C0476D013049942297AA41711005DD726CF130D66879422D4C0D4E2F0344CC0DA606CC0AE794150CAF93DEB9CF1C98B4B7FC6A7779A3A11A24C99CDAFE5F1D7CFA2EF596189DFAEFBAEA23BA25F1CC44E0E3F9D63527D4B96
+BAA1
+6E1E1A07AE4C53C21DAD2D942139214DB83E99B12C41CB77883D4A38C6FFB1
+F0F6F059
+4D0DE2248E9B060347A22E0879C5
+8516AC14595477E082ADB7693902C945449EF5DE20DB521D01803F1F5BA0DE2AA34CC13D5A64870BBD061C281BEA1063427C878500FFE0FBEFFA61855ED5D400818B1905E5B994EEFCCB4AF7CF69898011D7F4B0D3970E03B79DBD62A4049F0ADCE21BC8A38C7DE7C05B017A
+F9BB28F8
+B59427447151B45B92EDB859A9
+F9A257A3C6C225AD334D7DF7B3B1478821C73AF8EF869DE781C4EFEDE339F49AE5B05C80D02428C127D511F45A5C5146A420728B194D097AA77610EC7AA76056BA6422D39B8B
+E0E18883
+519421B3D7B0451069DFC144723F
+5403453E05175F7B16191D7E45EC9F24B18DED5920E6A2FD7B7EE9EE9948384DF57121337E9B75FBAB61B8B668797829C18BFF5C939FF5E13933524D58A2EA4019C1F25C8957FBDF6A994CBDBC70C0D3889DC44B13EB8E0B9537DEA5905F6565B3BE56C43DBF8C2F44CCEEE84CEF32F68C2EE14BDE4600
+BFB29360
+54153419D0AEF83EC050353832
+01CDE43ED7373FB3C41DC72F4BC0FFB8D7BCF4890D032CFC2506FE4D76DCE4A8DE05DEB4C996F4F2E1AE7F175402B12B3AFCFFBDFA808510FE60EEAC259AB8C710121C76720B76D6EEB49E2A157FE0E8D6FBF21B737113
+3F774D10
+01B8A6AC3B644B35336A485C2576
+91281454FA3A0C163AB72D5AA788832E24EF69228BD7E6E0C88DDE701B667F18F2B39EAAB5C84A9EBA7214357D6BB48C8E062E132E1DD1AE1772ADA4671E49E84B34D6402562BDB1868B33A51E8DFA97648176B425A146DBF4AB11F148A2381D6483371FEC2A45D11CAEC34C59EFCEB55149B3CF8DF68024928EC3A6
+4E99FAB3
+8E534831DED802D7A843ABCACE
+FF8F8370283BB7C36B8583F24668721BC31116D83CFD0BF9CBE65FCA8FB5D55C94851F71BE7BFA8FC1F18690D5A5FF3D8DBE53D9072238D00DF0801C43CDAB1DF7BC8F5A75
+3E8943F9
+B9CD0888116632C59D3546BE45
+5D07E9841338335DA1232D100C30C29D7909E8C2851487D5D903F8E9218B93AE706C35A83BCEC7DC5BAAB2E63E3BFB50CFFBB231214428EFE480EE806A06181AFADEE0B48E9C51AA0FCEDB52CBDDC63C4B376A315E41E03164972E0E5462FB4EB0AB
+1B44366E
+13FB0E3E2A570599121D19CA03EB
+E2F1EEE5E3D6A959FBFF537DA67F8E1D94705A77498515C2609C8AFAFD38D43EAA5FEBD9F675589D7939D894B56BFDFC5B6339F5F12954D417D07DD2CB3C50206500F7FE90BA7B431CA118F4729F1405B468875A5F84E97C3F0C0B97EE112EC8F4DAB7F06489F125309411CA0E76BB364DA39DB1CB73316FB001AD494936
+EF92
+62550B6F1B9D356C3ED1A8DBC28F
+B1B3D21C
+F3D95BE14287644D262E0C138C54
+012C6E00CCC4613C
+DB16D7A0
+1AEE3AAD3AEB6FA4CA47A5079BB62F48A6D2055C96B4BC2266D99E514C57AD80FE57
+2B26015461DDE4E2956900E48261240AB4313A24E37008E07A8BB9927F3430D66864D453CF70
+795B65FFED2385963995474E956A28EDF615561156315C3BD71026
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0046 put
+dup 3 /C0048 put
+dup 4 /C0076 put
+dup 5 /C0083 put
+dup 6 /C0084 put
+dup 7 /C0097 put
+dup 8 /C0099 put
+dup 9 /C0101 put
+dup 10 /C0102 put
+dup 11 /C0103 put
+dup 12 /C0104 put
+dup 13 /C0105 put
+dup 14 /C0108 put
+dup 15 /C0110 put
+dup 16 /C0111 put
+dup 17 /C0116 put
+dup 18 /C0117 put
+readonly def
+/FontBBox [0 -209 636 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268425D9A4327DA39CB2DFD7488DC30A83BD6536
+5400151DAC104266BE4EBCAE
+4B08321016E28AB4C8
+D564DD37
+35505D841146976EDFB4BD729A
+2F49DCCD6B4ECE1DAC32EA5679613B7894EE61C72050B6DCA08334000C4A16
+680A3781
+2832EF2992B1104EE36A2BEC06
+9187F54DBBD14CB48FBE819520EA9E057AFA159D622D74C5C4CB4C4E2F70D48C28C58AC259E41F36D6A193F1F10137F8F5642E0DA320E93E1A0774CF9A06A15A8E4A2B38163CD410C997F131229F6A
+D332FB6B
+2FBF456459B60863BA8C1F90FF
+30BDC971AE7EBD62761B023840D691D8B09A1F10C2BB2A62E0E0A98680F70AA19C2E1A5D647F7E90062E9DDCCC518B47EDA99BE33A6F060A065CBBDFBCDDC5438B410D6973CD936B49
+CE511B0D
+65C61BBB8AF8AA0FF9B7F76DBFB5
+783DB3C03649CA09CB59394CBE8B92706BD4A92F47BBCDC090D5FC43BEC0BA2D3B9DE68BAE50E2C6F2754BA7D3771C10B7E5FDF26F528B90F81CCBB2DC4042130A82D647F0F0089DB25161EF9A691224B469EE7262D2D138909BF5D553AB92F83A388F09212FF8F6F7274B254E97BB4D80DF55460CB998BC8D0264A9F017
+B892
+995D8191
+931742473EBCC599E506C676DE
+7CB1ADC71AE7563A2D5B9E9B9BE86E902832DC46E62790E0CD0A09030BC6663D2ADCF9825A962B9113455345AA10E280FFC7E3C20EC33C37949D2685012AB97FB19E1648DC1714DF49
+4C8AF35B
+4C8D51540ED76ED50F96B09FEF1E
+8801B29B674F9551A9B93028B0F66B958F93471DBA031FE00421C843EE4471ED8AE3836B1012844D063FDFB6CD6FC0491B1A5369D4590D177CFFDDDC25A31DC6C75337D89B0EB0897A4C04FF2C6613AE6733EF9CD6BD2A69E0FC6FF01DF7F773328B47FE45D6CEE02105CA85E9D7A40B52E33BC58A920550C445FFBCB568
+E6F8
+6E876E1F
+48A26CCF
+A445B617F6A475EDE5040E429B
+59000BA0B10D9973F06FCAA454A68FD04B33D9EB959F120468774D6E0CDF593B1FBDD768B585F2A6A2BAAC6A38F78538658E0595E54CE4D1A67BF90F7E9A0019260F81FC89926EC48A0A5D0117AF7FD10501
+91353519
+F8A647B334B8DA1F425DB3B914
+A0C7743BF576A6ED8ADD79A477EEDA1E500DEB56D66C581503CC690A454DCFFEC44119549362F46FF04231426E287FC443EAAD58D662D22CA510BF84D490927C6914B3FBD12B01C456574DC37BFCDD5E7F61D7B4B9F5FC1CE7665716
+268D405F
+C6AC769EAB9BF85B5D37D993CC
+C2992E449E116CB1388AA73280FE4A1CC057A59745D2F9953E2006695731E50A25241B8F9E9CDD2FA40FCE7EB1C85AD7647B2A64C252ED9E9D5700C3FE22EBCAC38BBE98CB1B6A20E2F49FD5EB16AF3B69A6B497F3A7499913911A71B8
+2DA15F7E
+9B1C8962924BBF0E9712ED925C55
+E4B0DF0EF0B6B9AA1DF1608476A8D88F47C586AFA3EFC690B78ACA9FE8B9E914EC8D5ED7950371DB3752F86402ED52E5034482240ABC6A6B24640B86CE56327B3E6BECC5BC408295F930F3B7CD81DBCBF70A00615D15B508B037F0DFAA1DC995B2943CAE780B5E128482A32AD3650B263678CFD774A46A8A815D9EE8D2FF
+5592
+9A65A487DCC54698245318247C2F62B3969FBB45940B4E24666979AF41AE4DFF86A9B57BC1
+DF6F96B3
+D56CE95C18D62CDE7CDB6D763294
+7C4AB3AF8CF87AF4C901C712F6ACD9CF51958EE7080DC57AE027355ADD1680E4B00EDE32076E48F3F5101B058A42524D7A5E3FCBD39BCB6ADCB74F4F1CD3BA618EE60611C4FA220BDD52227F2E973E80B31AB5F1AA275C4EA1078FA3F8D9D56518F306A455E6EABE
+6CFAD1EA
+3ED3110B0F658DCF2B0FB1758B
+AC67E14299CEE0D6D45B3A17F3EC3E216BAC77C24B2C257BBDEEF06A9081C874A1C69AFDFD460DA2593C6B49AB3019B66F06D8785B2B1D5F0BBFA33E8B2FFD6841B846D1AD7ACF265856D79D5AF4
+1DFD4FC3
+7546C69C7FEF40F7640028317C
+6FFE3A2D1EA4B1100DBE9255988535FACF20C1DC7A66B890ABD2E4A5B669F9C54C8968D77326EB424A441B14405F96F66CCE9B30
+4671F371
+AD9D377F7A185A45D2AF605D5D86
+CC06E8023029CFF9D381AE953B3FE64DE8E304EC4BEEEDC3EDA6F236995F6CDA51AB9692B5353FF124F7EF6E5CE1492C32599969890DCE464A26F95AA8AA9AA51E11315F1F2A58915C02E920463C1E434CB23FAAB4139B251A21CA1D75FE954CFAF72AA0EF1B7A
+DD30F2C7
+7EE5060C7C62F322E4FCD278C1
+CBB2D87B51A32205CCE6E0EB5D50E6DE9978BE98375361A7A7BE2BB8968A62745067074DE4E5D2F6890DEAD8A1189B5C8AA5F16A3DF1F10E3A431631F87611A90AE3F2690B76
+FFE57E75
+4DECB6810ECD0C0C54AA49D316
+055F12C838C48692DDD6CA890EB1E5A113D05566DA3525667AC821274C4F0D28496025A9B298999F1E35184F9875EF36B121751431A76C64697269A1E1E177A1DB78D91A
+47B9AAB2
+B813336F109D6A51C649598578
+CC1C437E16197D4B63A8F13DD90EB6403B5C78DF19CD3F7E3606C809557E05CF3F47A050012A14A181487BDED6D303FAC6280EFA21A4AC570329B23416570B82EC9FBF1FB8F729D7E64CDB9A35897E55964DDDD154C8E202AEF5C8
+EF19146C
+FDCA5A7575C40D8081CDC4403C71
+A36FEECB325C0E57
+F41D41F8
+AF10BD28B17FF96BAB1082D0F5D99BFD517674B23160B778CFB624CA76EE57F1A2B6
+2E15E2BCDBA2C77165F007402166EA5CB784F1C1EA5BFADEC57DE6EB798FB889DB8758546774
+289E053A7BD388D270DFBA485993A172AF18364CDBC86604FB5AE4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch14b 14.00 /PSOwstdutchb newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+%%IncludeResource: font Courier
+/wst:courps10 10.00 /Courier /wst:courps ILEncoding 0 declareNFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<070b17140b150c03010401050b120a0e11091510010c131501060b091618150f120d01070b17191315100108> 2207 558 0 7384 -1 s
+<0b150c13151109120a0b> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<02> 9434 13300 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a205265766973696f6e20322e313b20436f7079726967687420> 1322 13280 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13280 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13280 3 7133 32 s
+wst:dutch14b SF
+<050908110d100f> 1271 1458 0 2055 -1 s
+<00030200060c090004090b070e000511120a0a> 2055 1458 4 4007 0 s
+wst:courps10 SF
+<2020202020202020202020202020436f707972696768742028432920313939332c313939342c31393935204865776c657474b15061636b61726420436f6d70616e79> 1271 2263 18 8267 32 s
+<20202020202020202020202020202020202020202020202020414c4c205249474854532052455345525645442e> 1271 2467 27 6041 32 s
+<202054686520656e636c6f73656420736f66747761726520616e6420646f63756d656e74696f6e20696e636c7564657320636f70797269676874656420776f726b73206f66> 1271 2875 10 8585 32 s
+<20204865776c657474b15061636b61726420436f2e20466f72206173206c6f6e6720617320796f7520636f6d706c7920776974682074686520666f6c6c6f77696e67> 1271 3080 12 8267 32 s
+<20206c696d69746174696f6e732c20796f75206172652068657265627920617574686f72697a656420746f20286929207573652c20726570726f647563652c20616e64> 1271 3284 11 8373 32 s
+<20206d6f646966792074686520736f66747761726520616e6420646f63756d656e746174696f6e2c20616e6420746f2028696929206469737472696275746520746865> 1271 3488 11 8373 32 s
+<2020736f66747761726520616e6420646f63756d656e746174696f6e2c20696e636c7564696e67206d6f64696669636174696f6e732c20666f72> 1271 3692 7 7419 32 s
+<20206e6f6eb1636f6d6d65726369616c20707572706f736573206f6e6c792e> 1271 3896 4 4557 32 s
+<2020312e202054686520656e636c6f73656420736f66747761726520616e6420646f63756d656e746174696f6e206973206d61646520617661696c61626c65206174206e6f> 1271 4304 13 8585 32 s
+<20202020202063686172676520696e206f7264657220746f20616476616e6365207468652067656e6572616c20646576656c6f706d656e74206f66> 1271 4508 14 7525 32 s
+<20202020202068696768b1706572666f726d616e6365206e6574776f726b696e672070726f64756374732e> 1271 4712 8 5829 32 s
+<2020322e2020596f75206d6179206e6f742064656c65746520616e7920636f70797269676874206e6f746963657320636f6e7461696e656420696e20746865> 1271 5120 13 7949 32 s
+<202020202020736f667477617265206f7220646f63756d656e746174696f6e2e20416c6c206861726420636f706965732c20616e6420636f7069657320696e> 1271 5324 14 7949 32 s
+<202020202020736f7572636520636f6465206f72206f626a65637420636f646520666f726d2c206f662074686520736f667477617265206f72> 1271 5528 15 7313 32 s
+<202020202020646f63756d656e746174696f6e2028696e636c7564696e67206d6f64696669636174696f6e7329206d75737420636f6e7461696e206174206c65617374> 1271 5732 12 8373 32 s
+<2020202020206f6e65206f662074686520636f70797269676874206e6f74696365732e> 1271 5937 10 4981 32 s
+<2020332e202054686520656e636c6f73656420736f66747761726520616e6420646f63756d656e746174696f6e20686173206e6f74206265656e207375626a6563746564> 1271 6345 12 8479 32 s
+<202020202020746f2074657374696e6720616e64207175616c69747920636f6e74726f6c20616e64206973206e6f742061204865776c657474b15061636b61726420436f2e> 1271 6549 16 8585 32 s
+<20202020202070726f647563742e2041742061206675747572652074696d652c204865776c657474b15061636b61726420436f2e206d6179206f72206d6179206e6f74> 1271 6753 16 8373 32 s
+<2020202020206f6666657220612076657273696f6e206f662074686520736f66747761726520616e6420646f63756d656e746174696f6e20617320612070726f647563742e> 1271 6957 16 8585 32 s
+<2020342e202054484520534f46545741524520414e4420444f43554d454e544154494f4e2049532050524f564944454420ba4153204953ba2e> 1271 7365 11 7313 32 s
+<2020202020204845574c455454b15041434b41524420434f4d50414e5920444f4553204e4f542057415252414e54205448415420544845205553452c> 1271 7569 13 7631 32 s
+<202020202020524550524f44554354494f4e2c204d4f44494649434154494f4e204f5220444953545249425554494f4e204f462054484520534f465457415245204f52> 1271 7773 13 8373 32 s
+<202020202020444f43554d454e544154494f4e2057494c4c204e4f5420494e4652494e47452041205448495244205041525459275320494e54454c4c45435455414c> 1271 7977 13 8267 32 s
+<20202020202050524f5045525459205249474854532e20485020444f4553204e4f542057415252414e5420544841542054484520534f465457415245204f52> 1271 8181 15 7949 32 s
+<202020202020444f43554d454e544154494f4e204953204552524f5220465245452e20485020444953434c41494d5320414c4c2057415252414e544945532c> 1271 8385 13 7949 32 s
+<2020202020204558505245535320414e4420494d504c4945442c20574954482052454741524420544f2054484520534f46545741524520414e4420544845> 1271 8589 15 7843 32 s
+<202020202020444f43554d454e544154494f4e2e204850205350454349464943414c4c5920444953434c41494d5320414c4c2057415252414e54494553204f46> 1271 8793 12 8055 32 s
+<2020202020204d45524348414e544142494c49545920414e44204649544e45535320464f52204120504152544943554c415220505552504f53452e> 1271 8998 12 7525 32 s
+<2020352e20204845574c455454b15041434b41524420434f4d50414e592057494c4c204e4f5420494e20414e59204556454e54204245204c4941424c4520464f5220414e59> 1271 9406 14 8585 32 s
+<2020202020204449524543542c20494e4449524543542c205350454349414c2c20494e434944454e54414c204f5220434f4e53455155454e5449414c2044414d41474553> 1271 9610 12 8479 32 s
+<20202020202028494e434c5544494e47204c4f53542050524f46495453292052454c4154454420544f20414e59205553452c20524550524f44554354494f4e2c> 1271 9814 13 8055 32 s
+<2020202020204d4f44494649434154494f4e2c204f5220444953545249425554494f4e204f462054484520534f465457415245204f5220444f43554d454e544154494f4e2e> 1271 10018 13 8585 32 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Courier
+%%+ font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (3) 3
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0034 put
+dup 3 /C0039 put
+dup 4 /C0040 put
+dup 5 /C0041 put
+dup 6 /C0044 put
+dup 7 /C0045 put
+dup 8 /C0046 put
+dup 9 /C0047 put
+dup 10 /C0048 put
+dup 11 /C0049 put
+dup 12 /C0050 put
+dup 13 /C0051 put
+dup 14 /C0052 put
+dup 15 /C0053 put
+dup 16 /C0054 put
+dup 17 /C0055 put
+dup 18 /C0056 put
+dup 19 /C0057 put
+dup 20 /C0058 put
+dup 21 /C0059 put
+dup 22 /C0063 put
+dup 23 /C0065 put
+dup 24 /C0066 put
+dup 25 /C0067 put
+dup 26 /C0068 put
+dup 27 /C0069 put
+dup 28 /C0070 put
+dup 29 /C0071 put
+dup 30 /C0072 put
+dup 31 /C0073 put
+dup 32 /C0076 put
+dup 33 /C0077 put
+dup 34 /C0078 put
+dup 35 /C0080 put
+dup 36 /C0083 put
+dup 37 /C0084 put
+dup 38 /C0085 put
+dup 39 /C0087 put
+dup 40 /C0089 put
+dup 41 /C0096 put
+dup 42 /C0097 put
+dup 43 /C0098 put
+dup 44 /C0099 put
+dup 45 /C0100 put
+dup 46 /C0101 put
+dup 47 /C0102 put
+dup 48 /C0103 put
+dup 49 /C0104 put
+dup 50 /C0105 put
+dup 51 /C0107 put
+dup 52 /C0108 put
+dup 53 /C0109 put
+dup 54 /C0110 put
+dup 55 /C0111 put
+dup 56 /C0112 put
+dup 57 /C0113 put
+dup 58 /C0114 put
+dup 59 /C0115 put
+dup 60 /C0116 put
+dup 61 /C0117 put
+dup 62 /C0118 put
+dup 63 /C0119 put
+dup 64 /C0120 put
+dup 65 /C0121 put
+dup 66 /C0122 put
+dup 67 /C0127 put
+dup 68 /C0262 put
+readonly def
+/FontBBox [-25 -256 978 739] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684224C22A511BD5CA25D46542453920A678147
+AFC21FA7F4F5862CF1709F6C
+BF8C3ECCBFE4507DB5
+612E491F
+087A12D0ADB82F28DA93FC23F52C
+CEAF524940C77625947ABC17220384663B647815F94C97322EE3AA265BF180CAB3B718279AFE22F9CADE8CCD09858F70BA644F1412CDC6DAF6F810D2EA6C5020CD3D66D1E0DD45B76A301C06B1CF9602829F54913BF787A0A3F9310924D89F5C22CA6BB573DBEA
+572C228A
+9C7DD0944C1BAB2B7BEE1312FB
+9ABF4D5F7B6F67A603088289D982643065FC81628F7A3985D14F90F3109AB8363611081784019958F667C0BEB03FF8F7BEE5234089F39F63
+DDF68CE7
+A62FF96536EE116F86EF2E5BD3
+598EC528527730AF7D6474A3483502EFBFA5866450CC412CD54B059DEDBAF619E391E874A2E812CD543248E14D758644A1FDA985E68538070676AE8F727F9A72
+8FA95D48
+EA14D9C20C227A11A48F18BCCE
+AF2AD29C27D3320D85D679827CC6C46B4A74CD80071B250A6BB5CFA0E5DA375F6BE5C2B04DC88F763699602E32DE873A7F116BB7B25845D85C297DF54B3ABC
+0E5A6758
+3C1A13306805F44E79D0E8FFF4
+10792A2569C39A97D8B1746C1115D3BDA9F4FBB52C670A9E4098E33AFDA6B611A458B67F0853EE88B4D1B6011888A197AA49F3930F507029A4
+EA9387C3
+10E312CE1EE15BF81C654B754C
+7937F678F9506F922E4D2A7A48CA7E73BE40BB5C4776DB
+1E1000B1
+5AC9F7E5D4F63482EE9789840A
+5620C8DD8F68E12B965E420C86C5CAED645A7CB367DEA22DC4D7543CB68E82
+3DDCECEA
+4521ED08FBC8FA997A6A189D0C
+954FF3EE83167DCBD66CE97A015CEB3DDC5E57522C319DB82B464038
+CA3DDB2E
+011999FF3748BFA69C7F7DE951
+79875F21DFC8E20439EF74B8355B3BE608CB7F70C660FA694A444B469F7CD130E23BE90F64EFD70CA6AE7876B0E03D950A9C602880F121E19135E8C7B72CEF15567B3EEF032CF29E408D
+8EA2D55D
+98600A5FA903D45D261E3A4AFD
+B7509A19AB3AE34204F6C98BEE7C84D1F94E159348D38CE183E625E4806644BC79F8C418DFF9C60001547392584F0987DC7834645C921766DAA11CD95C56AE
+85BD57A7
+1C82AE663C5A951013CE73F632
+0E7FBCE95097A4B55348CAB6D26F568837C57791F5FF7EF641B3ACF0D7DF13EE28AAA71A6B7E03E7A879826F491636F84CD2187425BF251CCFC34349A30AC69F9AABAAE2A1FC8DAA47B48DCA440EF8618B80EBCE8EE611942AEF
+923DA4E1
+FCC51F765C42EF3EAD869C1D3E65
+22929391A21320C1CCCA124697B32BA264C0B6FE2218AF9865ACC1A2AD98E2C80D2EF7BCCDD7B65EE434B1C53360568C5D5D8710DB3D749E1F075EB53A6ECCD178E0F09DA02DF81F357F2015B61BA9D44DA65A8A60E6AA359E119643B45419D6CA408A0B4990B1DC7D3F5863982402
+A531E2D7
+CA6EB3091C9AD286C5EFC7CEA6
+075FE46AA8D75DC0B87D08DBEB5984344ECD8B0F2746A62D53878D215A611259720BDDF5BCD1C326B193EF46539DD19A6F517EC7990F6AB59FC2
+8FAD59D0
+AA88E9AA9654AA5528E6E5FCA3
+C6AD820A1A100DA2333C7B39A95D67B64A47BA85C43279A3691BABB50A769D6979427A5774A31FB90EE7FD265D705A2C6C5185941AB1E1AA519D94E1FA35D4F52D6EDF64ECFC27CCB2A3DD0CD90B254D8BB31DE2C800B5EFAF9A42183AD0915718
+1E6A292A
+80465D681A1F6ECDE5DF2DE760A9
+8868ACB4E46623EB6223F7E996280A27F1C10E1547B6735F8004178BD2386D0F843ED62BD2C097CE5E70D171A064F4EDD911EE2DF60321790E29292537E634391514B72C9D0B3329EC2ADA8B9873E0E52DBCC8765195412181EF545570515F4A27DA237B
+7C89865C
+830A53F63D5C25810538BA7DF2
+E210640A5129A80C73B47E30004CC04FC0E6B1EA2AD238A7A5487BA170898E29A677B8218D7D8F5D1C8D64
+4C351293
+DCF6D7EFA698AE73ADC9358A3A33
+68746A02CA5A9649DCCE8621B1D6F6DB819DD4472B25E1853AA2A1BEDC07298D9A375521F5F17F1A396D2509E9E492E28F2207A82D499270CE64EC80F4D825B29B64D5E73F85018DF897E8EBC75A60810BF3748CFC3114CD4FC2C3BD8AD6B7858341293470C0E470756B33B9EC13BD623523FE07B0236FE1594A
+692F601B
+ED3EC53ACDDEF7823ABC45D254B0
+F9C17873BFEFB472483B69662E7CA7BF3C3947FAD0FF274545249402FB77CCDBE56EFB69785C819D51DDB9B2947D8D64AAB259F192BADB586BADCDD8B6FC1E738647DECD0FD09383F3085850BE1EC8084819C6182508D8F0A04E2AB1CA87067299A71C8D10
+DF9C9F3D
+DD5778A961522DD57B8C8FC175
+DC6FD9A00076833BDB53D2B8FEB9063E936CA35F01B6F5723C650D67DB7183B0CC329AB36AA2D614DE9F57ADA7AEF47907E5C668B224
+FB46F259
+4E93E36622AAD5C385E431C10B
+B4D94A382CB2BF32C9F53DA41460D3A38667D6D1887CE80BD7E94454ED22D30E35D6EF934D2ADC234CFB3CCDD9A0345BDC3FB46839BB6A2237977E14974DFB54117B6FD1706B8E2786E1FCDFC3399628
+709AE4DF
+8A1DEE94B737D54876B67F2EE55B
+ABE1C5C9228F81E5A90E2476F86C80B758B282AB19E259FA05431893DF39BC65F48FC612F894705D9932F8CDEAEA57330610E0FBEBDDA11DE98DCF224B406224FF7FD779A15C0EBDEDC745AE1F00C49B596740BA06B73A8503343219E0EDE86C7BCC0D80BE87233B
+00CC2E6F
+D8AD1301B973010A8FA75A119F22
+82B0FD21DD7BC49106A928C2BDAE7E9C78E7832737557F2031AA2357973371AE4C8CDEFBAB4408686B0EABA1E9E9960D611621CBA8AA0FC3C92571FD28EF563C412837AC473AF0A1D41BBE0C819595F83508160F76203DA116C0A9F01A2D85FA8B6D3C793EAEF43AD2D383285AA51387BB8998
+D7D5E575
+1CEC17029EEF9C35FA818FAD1B23
+9532A49623BDB98B02CB67D9A8514C2D71B8EC228CF2336397C6B5A42FD06BB0C89C2BBB0D89DEEB4D4C51CB015C9DB84DD9E282AA9371A0ADA84465934350A9A6CF854048D3F200B890E1A8B6D7FB5DE665F1F80ED23DECCE62451FEB33329F0DCD5908F709C8F18DDDA3A3867FA38234F98CD4B92DE5E412A9DF4D8182
+1525
+31
+48E348C8
+D79C8309BEA5F0DB6677A763C3
+178F38BB846B264C4DA942E8B01819292AA75D09E27EAA3CBF571A7B496DED8227EAC5C4286DEB2710970ECD9B4B9770911AB92B5C03B57A8E7B24439FABC26CAD90E4DAB16568E44B9E373AFF0AD8E47784A346B48E6E26A44A444193D2FE1239
+8A84FC85
+03699F53D37D7A0E0A3189700A
+D11B06A99C4F80B727689A78CA7EC53FFE966CA2CD29E762967FE18AFE2960221E553968541BE64AF0AF0459BCF7426574A31C25ECB4719B8220558F9F56B4E30EB2DF47712357DD90821B3E1F06A1453454459DDA69585A0EDED924F3E23AF00337A1
+998DA878
+CBA3A9B330D0C9BD02D6F27D6E47
+F4FB96020706E063864498AB7CEC62C0547D88E04CB19AD2173640B9BBA498BE2E29CC347A64C3D73D9CBC3953938439B63F0E4FA1A5C7FA6295E6488DBB96BB1E818FE4D52BADDDA9460A513126DEBA627BE5AB171110E1C3BAA403FD984F024961CA8FC1E4FFD53981678ABF3ACFFE45D7C80B201A013B37BE3B8EF436
+5DB7B119
+821E3D597EFFB3FEEE149C3EE06D
+1BB6833E4CF66C0FD482C0929DE9C062D7AEFD2C12AD49AF6D8CE1DB1C6D058194E3FD437F199C6991E0812D2E5E97F47860ED3C23F95F9F7FBB24E6EABFE53BB1C9F06AA87394C00560F60C61C80E54184ACE073C41D2A796678CCCA43B579C1286AFF1A028569CFC
+20D1D307
+B41E8351698C61D0914B18C7E370
+4CDAD37EBF302E30692877DB64A07C5477AF809BF36AC2DBC2531583AC73593C9D6CE5C6DD5DF15409CDA73D444E8587EC7203D2602A914694B11E6A126C5303BD4DD1AD7FFDAD99A956A9F454CE208E3B790EC0DEB1B17F6398982F2C878728EFEA319489F42E4020372B8E5536BE703736CB57AE5188063B69
+5334DF80
+6033F7FE65F8EC0331573D99FA2E
+D03C47641C913F864FAE6EEE35F1F24BC2467787A37B7A3ED626D24D698BCE379008CED85906D83315FD100649748B9F89902A51715CA7A51A39AAAC84D10CC79E4358A0C7F81009662643DB880EBB280472CAE3074E0A226D939E167D83A6F7211AE0B017BDF334DB170B043B862EA1A3168F3549AE2AECF1391573D02D
+08FE
+71110DC5868DD2C92FF3E7
+929D692B
+3EBEACBEF86B9C1E3A6FE6622E
+CEB154CE9F17F8EDFC0AB91B62FC4B76423714E19CEC388E23C70AD9B399C49BDAD6ED7F76C80D37AE0B77E9EC9A4C09D9AAA335D39924E778896D
+CD7D2158
+51547983613D01497720782185
+9BB191D59C6C41DAE26BE002EA0156401D9C77B3594620EA0CAF67A11D928D369240A4D128837548DF680EA20223BE8DF696717B052A3438B68ECFC4C51AF1D81759981E3D3EDF
+9DCBEB15
+BE9F28BDEA18372F6885BB126FFE
+6BE2391040B86F19D6DF8ADEE180737A5FC86A51B8070E0830AB930CAC285C6CA499C2C7AE213D1817235532DAEF2FF66C2A43D6C66C519547D9B995C8EDD08CF420BFBF64F4AF6199C1E514FA8A71B5FB50FDECFBFC88AC2E2D02C907D1C78BB0B9B87717A4FD38E486865CA2F0B6
+97877723
+7FD8B2AC8525FCA3CE9BCE9E7A
+787A5C6C08A8B87AB785C977E68F9D6152F81D240EDF6F26331C6091CC2F025B10ADA4CD01BB11E4B894D201531C27BBE22EE866F31A6AB991080C0B31C0B927DDC0CF04A5A33F5E93D4CC6AF049E10181866E197B257215A83E4843
+9701AD12
+03BD113782B5611094DA2CBBEDE0
+59D026A50DDB18E68E5C1FBA1A45179DB0E1220BC486FC523CD2B36EC80F492B4611C9FFF412A988A848B27551FED4797773C338A46623FD5F37B9B2CF4F5CB161147DE6C3F2861E3EDC63D9C3942E8381DD25A7FFE8E7395243BEF9FED4CD75B828A612B8F50E5A2C1E
+27465CD7
+4D97BF9A9445FAE6C3F503CB1D43
+978B1B0677D28EE0469ED5EFDB4025E9519F24B3B69E55B4CFA66177266DEBE0B0303ABD225B68EAFFFBD6DB78644CC42CACF213344246E96BEBDDAAC67C0F186278BD8E96C9C2EA991FCB2D54A5D2D551427840756302C1A5516B8387658710BCCC5CEF352C4B572AEE173C75A1E24DA87637A53CFAC9FF4E122DCB0A93
+DE09
+2B7053
+A340C2C5
+A5778B45D05C9437C115735F17
+18E0BB5696B05F6480613B37473D8124893B67BB10369A8F7CF3B9D292A8D084F541A0A6DCD4A74F4103910613DE77BC8D957AAE39A473C236C1007EEC217C6172F756D4C20358848F8B24752A55A056AE
+F4324C63
+8514D2D498DDD91F45557EFBC166
+E9384CF3CFE81DCDEEA0AB2986B31F956132570A63E2B3F07012ECAA0C6F5B3B65D5C29AE39AAA8EAF763EF4CA9771AE9274FBCCA9356E3A4AFEA85CBEC87DD65A385F0B775A097C5CD78B96D61B1A3CD81831B9F68B2BBF1559A06EA56AAE057A27B621
+A0A477D4
+652D69A87DA6C647008F8FAF25DB
+3B6D67966149419075A6DED25B8060A7EDECE485FBA929968A5B0EA28097470EE34C4434F63B2BE568C36FE8669B91E96304DC90A05FEAF0D93925084A1888A49557F96B51950273651342CC1A43C6825830FFC9C1AB3185B008AD38247485D7E6087558D014A7C140AA730C0BFAD243F3011AD27B95A774318F893AB3AF
+732A
+AC909FFFF78BDD6A5064769097250E1A
+7ED73119
+A896F0A21B0BCC77FD2461F4B71B
+7028415C5C1938186E7D7CF32203FD04FEEB653D2E51B45984A5EF53D514C205D70E3CB718E3DF83C8FA11845D8BAF7BCF1F19F7480AF17FD087C2F15894D5F8895F656381D6C6CD2E1FE4BACFD83C275A516C0AC9CDEAC5F9AEC4E65726060C56952B29D3A0458EBB44AB4D517856A18ED733
+D731660F
+BF16EDEB13B85B9BC8976420C7
+6FC705B1C43713757899BA4C9E29A5E068CA627AA5784A6BE09CC102378F9A2B50B467AA7894196D1F2DC660D183D79C260C8DB3532D088C48D0
+EADCA6D2
+E50C11FF09D8090D17B0A6E50FDE
+64083AA77EC5F5C7E932C750AF419750688767B13DDFDE0BC6FBA8DB074A40C526EB0BE3A0F3AE5AF05462EFC1DC99DE6737EA09FB9452451AF3DA40B337567742253D64D68233C1035BCD052835F772B493AB4A7FDB47945DF4A00FD2BD06A90A421DF99C86A6E863B2EAF29110828D269B9BF6AB5794D4DE7B0C6F02A3
+1CC0
+F8C163
+72E817C4
+4F6E9D1AEA48609614B6B0A216
+CECD233B94BB3763C561B84425D68620E409C85F311EE10303CEB00B746479DFD1F2ACBC03A25463B1D4FD1BA42C883F9018AA53B5F849548BE1AEB2AFBB4B67666B41DB2E6EF69C6620C3EA5D087A664A4E57A2667BB7CE
+C3D1D584
+71D2591082E214C3423A7829EF
+715B07B720A1999884E59531DDA078E106733709BF51014B6D545402B2F666425437D2115D4EA3B0822ED1A8E8EABA8F6CBB3B7353136D66C7FDE6C07FDEDF482D083312E013C01F730C2F9FB6732D4D83FE
+927022C6
+4111DBF61941DA2CAA6BC2A8D245
+3D65A8C9EC0AB7357ECD143FAFAEFFE3C2194691B0C9831D491BB459C6BB7135AB8066E999540364EEA5D6F2845DC8D2374CF3DFE21A06331DE0D19C524F2FAA79C555E51EAC41036840B3AE4DE56B1E01D197C57C4D1C7DB27AE680EABDFA6B61805F0A268528BD320C0942620D
+F7708F69
+871DBF4C00D6A8356EB6A487F1
+4B9D9A5B9BF8EDF751B1FC04B0541F65B0AB5E7FADE531F102E7CDB869833D94A209532CF65A29AD02C9BC7AFC967EF63AFA5C7270BDD2A0178A0CC2C34CF7D27D910518A0C1E32B278B76EF3D172BE0BD166154A5EDBF2D92
+C4C8B19D
+D6BFF6073F0ECBB0F9D4CCD2D2
+49ECF4B2BECAF7E189A4F1CBCD070077A7C4E3BE59E1B077581D7491CC129082DFB5644E7D5957699C26D53E9B90EA6714D3669A368601D59F55FB37BF170F4F4479DBC0F592AFF0DF18AA49D193D5B659095812FE74543A740B2145
+2A250139
+7B01C57F9302A37EC5F7F6618C37
+5D1EC39D9F86402EA704EB316329F24B8F9296B37B74C7CC5B38D364F7D9B18E5B0B0F1DAEE9B5F77F4D8E36BD25BF971D3EEF39AA97B0B0EF491A9C47DAC8C5CEFC33A730A432FA807DC4D8B722A438575A353E88726CF67EB6587F61B1AD09766475D468F7DB8641F69D9D6A82B032B2C759DF7AFA2F618C2EC862AB49
+C614
+BE8486D1F17C3D482EE1F74DA443895E572A4BF4DD250268E3D3BB80CD473137349D8FCFEA7478550C61C6E4C29941
+94163D83
+9672EE7203FDF0DF2056D9518EAA
+9CCF3132E01DD98D0DF6CAD2A55EDD452BB6F6DB5FD6FF997B28AC38D6C4CCA9A3647419F7A0F9F1703820F821F5435F622ADDDE82AFCD26CE7F57994C5A607CF905837E30D973FD50EDEA5EFFF959DBC324F487C7A3E25F4303733F2D417CE154FD39E9FACD558266F37F2111
+D4F18D0E
+D01F6457D08E3B6606033723BA
+1DE8C7316EE11849E44E9DC4F7E552555B89E7F9EAE6318A377F4F8743BA137F053FC41A21CD7E2B4C0309906BEABDFFFA20235BF6742AD2990B7FB7B3ADDDEC34860297C363916F2E4FF2BF46FDE5AA
+BCCDEA58
+B7F309BBF1A2784B5B0590C353F4
+64EAFB98DC676A3E609D59B675771DEB1F2D6D44FA8B9DB11533EE626607FAE00FD0D82F5F97AFB3C42943BBE4C9C9FB74B2CDBFB5A21302C21A0DB3F8DD2F788D69D29F5E3D0B62EEDFA5254B3229CE039D7EDC96683C5EF111DC9CDAD4DAD8A53A5F5DB2821925906327FAC154325AE13029D8776FB8FE8F15FD809039
+7FA3
+845F56CC67251D801D892B1E859DE6A82690F70AEF5C5BB21A89242887B9D823236EEE
+41417FB6
+32F52692663EF2D7218F207745
+49A2D4DA66D3EE67FEC1ED65B9C8D2D5C065E4F34F765341385C313CA2DAC9D54817477038CA5ED40ACAC6A2B5EAD65A6CD12BBD9AE4
+FDF53C84
+783C15AD3E068D61745C62D5743D
+00BE2F710937580E62B0E579475AFBEAC31B9E72C3959C425E5E93A2C39ACE4732995037457E4F05A60BF71E5D8695B37104A409F1F43E602DC94EFDBD7415700056B96BE613E51B812BBF3B8B4353632619424CA09D47B4421F4DF97797F88CD5B8C81513E327F06BC640560D17E009A05EF1CB3CE58F58654624FDB178
+E097
+099ED867C5A5DC84C7CF576FF52AC3CA9F2BF84ACF3B77F184563C1180B19D
+7BE8096D
+13F67E595940DEEBA3AC9B2D697C
+75CE2B61DA31ACBBBE8AB5EBDA8F8E9AF8873EC5D577ED8D98F68C1DD473EF7757CFE09F99496C8D9B7F8A8757960AA8F6E84D3212968F35CE4A4EFFE7D472747D9B5CDC2B60AFD997F12759E379F79B7FBBA25ECF4892E6B52641A31764D44D01E25FE1D05F6971C3CBA0AA
+80A6A82F
+4FB2014FF4E6B86337E91CFF26
+875BC7B6C660EA39CDCD6737BFD06BA924F793D469E14747D47722EBF35A5DCD021667DF7168D08187A8CC55B566D3B890EE95D52353F600EB5B2B54B81D359585B0547BE7AE
+07465F76
+6A7B6BF084D8C37A6BF455891180
+493205BD0E371DC2206E4572FD7BA3ABF3234454EA4E58F11AF9AD10B3A35C328DCEE32B61BC0B6400F63B4EA2724A9278A64DC016508EC99EE790B7281E2116D2581946D40C2EAE4961BFADD0C4960926BFA004E3CDBD622A0F215113F30741020FBA0B597D779968C2CE2E54C7F8B8D48A6D8B40423D
+0364BD59
+E33418BE9079F356B54D4A19BC80
+F638158D6584D9C89438E1D6642D95EA5099A39915EE3760E0FAFC5B74922AFB58BF910C67897FDDB56C95B93347E4C2919155BC9D461CCADE76D14AFCA093F9A13EDF7182C50F36A4CA423E116D14042406BED3D253231BC2176EB3E32601966B2C053EE56BCB87E28D
+F2E4865B
+EDA9974E4117630FCE45C985F9
+C4EE95BC985C3B383A5CA2A4BEE4259C156F32AEADC6217235AC345E3D3E34F8B8D417D2004D0374D3D86DBFC83BC919CA9BE4587A37C1D408F2FCF446E55533C3056B00F4AEB5651AFA6B8C1D78231E102665A0F2EACB
+C45E855F
+518B51874E2CCFA1286927DD7392
+D7A101E2D772E49FCB7351E2610452D323A8838B837E5420F222258616B00562ACB597F784D06128F93FC95E118760C368C528F9247A1BC00DCBED75C58706ADCB7D162CCE1E9E5A98F88DA2B8F7DCA171636A59BC8BDCF1DAE6C351D0CFA57EF881D3AC149EAD4C8E7934D04DECB4AF68ABBD7385AB1BF5F3073D86
+F0BC1D2C
+3F6D541935A0E13DD6F9B56C36
+17FEA2E7D173FF4BAE09E1A372BE86EDA0BC00C78523C20221EAB5D55E7976A03878879F15CA5FDBE108AB78E183493E9657C3CE04974E81AAB64AEF07BCF866D3AF81C4C1
+AAAF29BF
+2A96D8CF0BBD7DCA4CDFA1B773
+04C21C36A5B0E549FE3A7011F88D2DAB6C4A8116C35D4B7B2EB589F479086EAFE358454D4517F16CA5D19AAE79D861176A2F1D800F773359234CBA33628C1057DE2E7AE7662E3065EC174FDB2CE5DA59E18D1E891BBF4DE25A7A80AC7D7DC336452B
+FA5110E5
+249A631743DEEC0039D6B683E0
+113647B28D5453B97B4A9546623E203B5A420CF97C2C6EAF9DD4030A372C6D60EE6B16E91271B4C8041FF02F9E55477FA54ED7FFFC0C710BBA11B4C9D52DEB6A48F76B932EC72ACDE5C1A974423DD67CBF1A8432C46A551D51
+6EB01FB1
+51A430917881A89FBC10793536F6
+7C1588EDA8721163CE91E514E23D3E97048525F22E977F312451DC17DBB35FE233F18FD070F7196C608B045064F718CA26BEB9CF8ACF7D6E60746C5F52E28B79BFE60EF2E2CE11C08B3383CCF2F2B1DAB2C4E23F23067D4FF175E52595D92F5CC024374E92DF463867349AE73339BC020F0FD634F00FA1F1DD095D4234D0
+5AA2
+5CF32489FC91BD050B4107DA69D0
+90F000D7
+EC794F8FCE120444DF283E70E24B
+D8D345F5FADC5B92A1005E68D7E32C048336E4916719B95FD44C8E9ED667DD23668F50C666D500AF2BB717556F54EFEC5BA47D4FD698C0D3C391522E33858ABC3DA72C99E635E344F0FB1BAE2DA075189DA59A843550F2C0B27111987E983F48C69604106D766C82C46404F368532AC8F0485B2F927F39B329FE07C235F6
+1E48
+8F720AC0B0474323E615DBE7ECC04D1625034B5C468C943F46
+BDA74E64
+D6A59A5E7E82183744B80682EB17
+2AF78530E4D0B7C5AFD04E9D64A4B19ABBF91EB867554068743418EAA9734B42A909D242547FC18B0B58956B8F76E2513748098633AC7FAF69A20007EDE057A74C4DA300F40B7C03FCCEA29EC8DB637F987EAAEAB58696C9045267112B66F0F65E393AEB555024384701C74FDF2A9CB8B6526569FE8A7AB6F858C8FC0873
+B090
+D9680AA0
+39D4650E0995D7BD0C8C664C6F
+732F6D1EFEDC008064ABB6D661B8256AC3122DBE58175AC593BB1A38BA655B88772886B9BD165941086462C7C1129FB6C623D6200482AF8847406E975DFD7F
+7E4BEA20
+865D94DF9D60FA10B5267D952A37
+9B660FE317AA8E5D41BE770444736F497431AA0E6F802732B86B50487D326A44D5F08F7E0F7B46E775FC247F68329D0FB68746F90EC11B02B2F229992558BD32E7EA3B040C0887F39EF4E8297B719115CB3306E2ED74092C9F24FCB7784DB8C537435B6B652EED4B0C
+A16ECBB6
+CDEDD10CE38C2780D767D7A65C
+52482D6E916CECBFB7DBFE36CEE122A3C6A04F7F922D
+BAFE5265
+EF8AD7CEDF922F8A36AFA0D3A18B
+B5E4115C16D89607
+D14968CD
+E36CA209BC1BA67EBC2FE9FC0FBF85D7F26FAD17C75CA2932FEAD6DC153BEADF8FA5
+4C49F6F0ABE6C5DC9AFB5E4085A35C9B6604A9D8A49906FFF72E7C415638488098CE64A95835
+F7B8745FF77A3CF0A6CFBF76C46BDD804DD9A789770772E5BF80DF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0046 put
+dup 3 /C0049 put
+dup 4 /C0067 put
+dup 5 /C0068 put
+dup 6 /C0073 put
+dup 7 /C0078 put
+dup 8 /C0079 put
+dup 9 /C0083 put
+dup 10 /C0084 put
+dup 11 /C0097 put
+dup 12 /C0098 put
+dup 13 /C0099 put
+dup 14 /C0100 put
+dup 15 /C0101 put
+dup 16 /C0102 put
+dup 17 /C0105 put
+dup 18 /C0108 put
+dup 19 /C0110 put
+dup 20 /C0111 put
+dup 21 /C0114 put
+dup 22 /C0115 put
+dup 23 /C0116 put
+dup 24 /C0117 put
+dup 25 /C0118 put
+readonly def
+/FontBBox [-4 -17 742 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842699A34E3649842B194F49D845069DF85493
+1539025D8B7E5F8B1C5D2C91
+AC39A18D8BF0C90D95
+6DB2540D
+AEA704F12ABAF3E0AAAF56159B
+724B67EB97E2C3215DDF2B15C6EBDE114EFF03C97F3A58D9ABED1553250F70
+3963F08B
+CAF922D4CB695AEE709226E53B
+46DB56C9D89C303A632921AD86F384BC96E6F4C11C52A0C1DAFDF82715F2D5A298FA9C2EB7A91E3C0DDB271EF3E065170AB1EE1C2FC5273B941F20AB
+4F994E6B
+E4167D1A86E24CC7AA9D08EA3961
+649C030976B91812E2A769ED651F0939064FAD60D2DBEC8488DD928FBBCECFD5962DBCDDD3261D9BC394C3BFC3313722924CE7F6E826A107EBC293B55F8139EEE17C527C292DBA87445D478246CBAA854239ECD27F271AA021FE35EFD30AA1899D4102DA6D02C484
+E1CB1BD2
+DC62C963EA1C46F4B1414419F5
+E85244ADA459ECCEB99B4F788823F187BE6846FE04411DC7EABECBE139A2B696F407BD1F7885D6D1B8F1BD118DDAEAC075774E3EC4D34FA205042609195E238BB143CA1EBD2C8601902590710108E91B2F468EDB050256
+DFFC7715
+47C600A4437F11EF71485A1F48
+00A5303A4438CCB5628D9AAA4D6C23FC813FDB4900BD9DD8EEF089D9F7B70FE47BADC25E841866893745517070280C95A564806CB8634201893BEB792983
+354C6A96
+001282D87D109ADAF09D46C135
+4E5FC1A690093D0822387B95135EAEA9627FDEB8CE3E9BD4203D6D59EA38279EA1BBAB5BA86CFF671881709BFA8CEAB1F5F81F8A62E34C8434D13BE61689FF3041DC81B61CAC1EAF6BBD17DF0DA01D43AC420D8D35413DD642054FD9D89762
+A0E3253E
+4E5A31296B61105981BDCF0E009C
+C38FCBE99E2B7252527C2B300A5F311D965C37E36357984B40A28C8D32C9470E2F66E7A5F4A2B71E967880280DE43696D4BE0D6439F066EB912666A83E0F0A770CCB0542224C14D0E5742C68F793CA0115C8155FBEE6DE8BA58BBC1B2279FA743F5240707AA6F738D4
+6843715C
+06E126A734A4D59A2A21D263C777
+14E5F401C9A72F255496109B763A7D902619E113537E0BAF9649F72A8867CAD9C031D45EA11432AC5A2C953B4622589ED1A2FF14BDEAB4F9D89C67956A64F95FCAF589F882FD019822D5AC46BB6326F15C09C3DD776062345A932AFBBBDFF973BD9B6B9F578C303463C2DFA74108243BDFBBE698467E8EE106CFEC6F26D1
+DA14
+66064ED5
+2CAE60EE7F0440B3A603DA8B57
+4FD56BF4392CB21893F5A642C2E00B6F6E010BC3595D205DBB7030A4B3BCBBECC897F607F752265766AB0EBC69758EB500CAC5AFE105C06065077B07C916AEF7ACC56F844C21BD0581
+8A5BF19E
+09D7D7465C35989A9A56CEDFA01A
+8BDE3627FCBAC4B3FE523C010C750A7BCFFA00DE417194826C142B2BF8D4839117B00774D7D6E7AE20954E490DE4A6F9481954A36C860A2D3A85B328D6749AA7862715C558B9BF31594733C197226C3A5A5C14EA81003FB801EFC8B6C8B25914957D2240109FD281D2C2FBF77868064F998F24E8F7A8119C26BA2447DF51
+C24C
+B7C8ACFC
+1E5A8F0A
+6DD09E2766BD6118238154EC7D
+BB3A58849E17DD315C47825AF98D3DAD189A8D0ACE32B05D0F28F8249C89F89C4B7F9B9EA43D1462934002DC1284E5C375C6901330C82072EF72449151AF18399BFEB5FBD8B182996838C875CF3B64FA676E30D398C4CF95A228434F0E83
+9C9E61F3
+CEA8ECC06F286ECD2C1870E9E7
+453C99E8ACFCE8E5DE955524F93A19C2CE1C608043B8246404F857CB7A0AD846BABF299A31901DFE9E4EBE464F1EE81C786239499B007A3A5D3BE752E84EE00D3C44CEE3EB615502A904ECB090F76E0BC7A9
+27846E9F
+93E6B5D935463D48C7A9A81BF656
+2ECE8758CD748A8BD2F9B81A51E93CA503A83158630B9A857C4C3BFB7117465488D368B6251A43FA3AFA6D07EC59C2FE97BDDB8507FB3C1B5504CC9E284437DFE5A3E9F6D1E706212E7B58ABAADE0E2B4020AA6918980F89F63FFBB0C3F33C4FDB60B582265DF7CD0D2EAE9A
+A544CE0A
+F91903E299CBE4F5F7788A7243
+C3044621688380278D3D82761B761FAA49144D4C7C230934B4D3870DF772A3F66FC6CE44454AF4769DF439B3008B1CBDD49F83C8BD528502A1D12EE8179AABC6C4F3560B910314E9CB8BC1C6F05E1E4962C08C98459E92406A8D627C
+DE83A7F5
+00313FC99C325FD1A66353DDFA
+9C87125EF692BFB532CF9BF28E2BFD8F549E8FDF3E0969B16C0065A26A8A27191EF8B591B5B227A3D3A87E3C695303A3FD26252791E0406438C22F4C1238CE6AC97D3745ADEDF7C58D6A40D8C2DF949AE6D14E0B2E95A54B801D4C49E4
+111A1D42
+579B64A1DD59E8326D12BD51E1
+2300D2729657BBA004ABB4584F5C57C6B5359BF8E9F9FFFAEBFD6542A7BA32774C9F34D992C39ABDCCE8AD64BAC3ACB0EB2CFC43C4C9A1313CCB31D6ED4C24492E88A3667D2060A72586ABD45991
+D9E700D8
+899CDC56700DE35BAED691A53B
+D33F9AED98B84A16FD578F377AFA0D925D66C74629C781CD6AB0470F61C998BEC025A1A723381B4AE8E9D8CD4684747F3A440EC2
+E6CD1AB7
+156DF724256EDB1C5EE4A540432B
+97CD7F695A0CACEA80F1E5B45F80438BE02C21F1D42DFFA2F4CFF90B6C00B407E92B9B6C5D35554671F22237F0B1F993FA9CAD620E507CD74C5D7B5E3F84D3A3DCC18284ED87DFDDDB6588FDB5F005E22B15126BF9752AE1EF626706BFC003499F988FA3E33993
+B7FFC5A1
+6E0CAB0880998BDEF0BD708901
+000DE64F9F7E1FC9D4D5F871BA8A3925EFE88D9ED2185007912EDE24CDCF7CDA8B9EBB2019E0ECE0F0DCDF18FCCA3F5B8136E7E3FE82580E1BFD50426D23971450CBD358C8C9
+FC3A6061
+4F19899200D221ED2B0DFE501A
+BDEAB932D331107E3D0C9B3B29B32709B1E4FFE0302237DAB2D6CBAAD7E4E07EA72113C930AFA82B10CD855108D3BABEEC7CC1B2EDB143C5D4D9D89F4A5B459A649BBCA20E90F9C30D588AF47FBE4CAFEEB0AFAF99B0C9E759
+C5D70ED4
+7B8979D8F61FC389EE4F92B0A965
+BEA31B1E0C516F0A896755F3C176FDBEA71F94094A4C2E45D1AC1AAA507DF92DBFE9EDC3041951A0F63C34190EADD6E9D52A8D0C67D90C594A65D4FF5D40AFEACA2DC558981A7A057F6A947F1E2C4F9206684B28BFEE0FC4A109AA5FAFA623088C5B61009B28980223E8803679E1FB6697452AF766769FCFA8
+8259406D
+0D7B964B07CE39A3D11A188FE1
+0A825C389B8C13C5017E157DD08AE3CAABF2E3A5A68E8BF2E7D2545A817515A90A75EAEFD326FADA2A68D5B8CA60F77F9CE33FEC2E10B9A60F7BB34520061418C3A23A86
+0D0AFE34
+9E9613EAF7367BD11EB96148B8
+7232D14BD566768B1B8A1C16F02689273E4B2DD8655934D2DB088DE815A02881EC3E363ED719EE705AA8BAEE09B8CE42CE22AE98CE8597C11F6B778330835B0093EFCAA28F4511B97EC2B26B06BFBB229903ED9893C4FB929BBFEA
+D2ED1477
+0D01029E72EC4271391DF278C4
+6A4F26DEA2B7FDC1EB3981D9B6E129C1104031B085B6E06F82C84791E19A5F1F43D08773E26EB7565DE40BB474B2E7BA154270E29A47D1189C9D51BE38BC4268C19B626D7F18062C03E32D4443D42C17F3E7C2BF8934DA1DC8559F81
+7D001D93
+DE44CFDEE5E5A66E1CBE88B207BD
+EAD9C0073D48B84C
+ABBD1DD2
+9296E74545A9B70F5BAD34E484DD1AA25DDF67A8A08409BF0F1019CE0DE3F8A90F3A
+C9D62BD40EA98858615EB3AFA127074E8C15782B0AD9EBA5DC042A92F2542AEA413BF8F06C7F
+A296F7837FFF9E103C0EB8B484A713EB40CB59B36080E946099F27
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchi
+%!FontType1-1.0: PSOwstdutchi
+10 dict begin
+/FontName /PSOwstdutchi def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0097 put
+dup 2 /C0099 put
+dup 3 /C0100 put
+dup 4 /C0101 put
+dup 5 /C0105 put
+dup 6 /C0108 put
+dup 7 /C0112 put
+dup 8 /C0115 put
+dup 9 /C0116 put
+dup 10 /C0122 put
+readonly def
+/FontBBox [-144 -227 513 728] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268425D1309D17F31B1F9C00C372EEE61BDCAA94
+722ED7F5FA19B18DE53144B3B19D
+36FF290BC1B65AEB29D817AB2D8434F2F92B33D00CF510E6D20E00A151499A809B832F241A5AA5170C1C93FF855205CB9E36E1007A066D77759217685FBB0C957B27835CB8B3906A5F9D69114D7C741AC5BD8278D0E5C1D37F796308B04F551F700E91CA2E5D8ACFE60F612B252E9B9CDA395040818A573615B1D49D95F2
+A56F
+FFD49763891B71ADBE7A658EFC
+6E3717B1
+FFE8790265EF9C6AF3D4BDE288
+86E9CC71D69602354EC595B930C9E69D05DE9013E10BD1BF4E70AAEAE13AC8507A9C861BF94D6FDD16A5E58F4DE19055A9A6756F2FF029A99660ACD430618A0BA273F8A3E8C8AFAD14A0502F5D89FFDFA8F086F55592D18C924B59FD1C5A4AEB
+FD1BEB04
+A9E445A1937F5865D92741BB2A5F
+77E281FF537F5FF7355ED6705006989425178636F162A7D50FA38628D27ADD4AF8DD3620F4F36CC034E76FC7BC055BEED109EFF0DC8665FC797D8D482F327942FD3934C7D98F723901113D8DEE101D7F388AB23B9A8F0F4F94861E821AD7648ED3867717A2EDA938B86CB32807D74F33CF59477D4B9BC31C953BDC578663
+7939
+92EDE3F1B007D1899C444F77808ACC9CF4E3CBC8D2CF068BC793C5F43F2C8E862C2D6D29FDE493D8C3530A91C617A022
+83224C04
+66F71C37FB5CEB957372738EB12D
+A190F7B7DE9989E761119F9EE12FB8C674AB3C03643767BCD0F87246B52CCD610D774F3057ADD7F6B14E005CD1B0A704E0FC25AC9782225C368C0DDE3884DF43475DEFE7FDC22B878F1A7D13551581094BA759CAB8391BFDEA7A25BB2685CCC008C51C1947
+10795D00
+C7498487A3D5048D36D503CCED88
+5841ECE7E5AA56B9BD0FC7092857BC7E155D64976FF1DAADD9E0F2B743E4855587064E429C6A757B1E4F36A43EDA879F09E1752B7F864D9F1227234CC2B753E10F7D1FA9218B467E8E0CB5A8B5BE0935DBA2410D9FF3834EC18CF33BBC81A2FBBC2EA11357A6A6B41ECAB3E1D1988A26E664598EAB938D455F
+0FF57B34
+A7F65529D21173E4A762CCA91A17
+36D459502C50A0D295303B1CC6A4403B599C821C5117285DAC71332641C133C3C94684827FE5634CED5A1D133C4195E348A1B468164B07BA09D9AF82FF7F360F54D06F70DAB63336393BD90BB5A6A4C008DBD20D43068B4295A585E9E3D1DE2C0E8AA3DC7F
+B30FE868
+A72ABD95B96AF3F52AC0E3561BDF
+F8913638A84E8AED2DAE7502C8E58FDBB6EF800995C567C52FBE3A0EFE34D3EFCF9E016AFED19EAF39883E05B0C3C546BE63242E4E6489362058A7ACADB3A914CBAA999DB97615BC1CD67B79AF3CFCA60B52CD054806907DACB9A7CC9AF3CA2CAB487344BC8F7DAE3D1104DAF75209C363BADE6D5E0C3F50863DAB0B217C
+26EF
+10BA015F98F4C4D33637C907DBD2C4065FA2600C5DE7ECFA270681B12D7767A40485949F6F4FECA11D76
+A64F8D7A
+1DC4104306FC92CB40F33594AFE8
+3C605102A17A3B1ABCE3ADDAA0A74C7EFD575380BD18E8AA57CD715450F993B5D9DB435770D16ABCEF27EB8B285E6ED41CD7707C4000FCFA5C1A85DFB00819D612866E3C936FF02E40B880827468A335FB7FACEED7701AC06B4521B4AA0DDC039F8AC7C72A03D3FD20B52796C4FDEFD692EEB66CEB99
+2DE3A22D
+D30489A6FA2997ADE08F51F51F
+7358CF4B0EED9294436AAA4C609D2AE1DD4335C4CE76A46CA0A98FEB864C350D67F5168D406D5397BC7C9D26A3DCC35B3949315B78663CFD085F16A5CDC771A4ECE3BD6B407717C8E84044812BE589A655AA06BCB7CB08
+3C922B37
+97D911D6EDC48AD2C5419826D9CC
+D763F5BAF44EDAADCB3201012012D6182E384A6CE910BACBF99CE50825B9A3C66906737DB01DAB50731BAEA13037524B0121442736F95014BBAADD3324C9BDDA8AED86E802A5819190D5B292638ADE571F750D0B002CE1FC77627A16256A9BD43270F285FD471E2110BCB48AEF6AF479F74A70E22499ACFD71DF20A83492
+C3DF
+9895475D92F0374154
+961AA661
+6D4F2D086BB461FDADF52584F6DA
+9923AB7499FB5432
+7E682A31
+9FA4FF3E2DA5A9580EEB03048AD96311CC765E1E294AFE15554C1FFCC080BAE37D4A
+7B27E37B46862423985FB9D9555EBA7B97FF19F3C2F68F9C9600FF12A973ABB3E10B8F38DE49
+7F08DA2360FB5F1ED1822613CB69B43486F87F17080FDE52902955
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+dup 2 /C0083 put
+readonly def
+/FontBBox [50 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684275DD89A8790EAD18EFC77D3FFAE84DA5D
+312074C4D542DD5BEC70968F75DC
+250C3954E8DFB8F4857BFEF092EBA49D248955A858C5A5F55F7B987EA06EC8428D939084C88F5B157D80AB2D706A7EB936C3429173588D2ABA6A27DC94C0B484F316663555797004CBFA79E7B8545C810BF9CA92F61ABD9E202ED9E95943DF7A5ABBF3C20BDE3B6EEC9C0B95A4C9C1D38AA7C6786ADBBB79EE183BDDF194
+1953
+6449DBB7AE47E9FC6F3ABF1DCD7A1E274E87DAE9
+A22737FA
+6404B215A27BFAF6D0B50E94D2
+07123A5BB380C86DB5033EE743181BBFCC0356571F7297A207C23F1E588257FDEF5DF229
+CABF3B3C
+9E0988C63B358ACA4B4FEB033DFB
+E2E387A06A23CACA
+8E104B90
+DFDBD41F063E8A8DFA0ABA4DD7443015526AE5255315597779E04D85849305EA4F31
+5CDAD06E5841E1B8074760C99702B8CF443D752174D996C94E690797A9587CF5017DEB11E5FE
+02576E9E08B39688BBE99A186AA8FC7E222F5E52B29A7FDF379EF5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/sym:clas12 12.00 /PSOsymclas newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch12i 12.00 /PSOwstdutchi newFont def
+/wst:dutch14b 14.00 /PSOwstdutchb newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<222e3c382e3a2f14011701182e362c31352a3a33012f373a01212e2a3b3d3a32363001222e3c3f373a330123> 2207 558 0 7384 -1 s
+<2e3a2f373a352a362c2e> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0d> 9434 13385 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13267 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13267 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13267 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13267 3 7133 32 s
+wst:dutch14b SF
+<090f0d17111413> 1271 1458 0 2055 -1 s
+<0003020006131715140e180d17111413> 2055 1458 2 3718 0 s
+wst:dutch12 SF
+<222e3c382e3a2f00323b002a> 1271 2021 2 2350 0 s
+<002b2e362c31352a3a33> 2350 2021 1 3427 0 s
+<003c312a3c002c2a36002b2e003d3b2e2d003c3700352e2a3b3d3a2e003e2a3a32373d3b002a3b382e2c3c3b00372f00362e3c3f373a3332363000382e3a2f373a> 3427 2021 11 9461 0 s
+<44> 9461 2021 0 9531 -1 s
+<352a362c2e08> 1271 2266 0 1917 -1 s
+<001f3c3b00383a32352a3a41002f372c3d3b00323b003736002b3d3433002d2a3c2a003c3a2a363b2f2e3a002a362d003a2e393d2e3b3c093a2e3b3837363b2e00382e3a2f373a352a362c2e003d3b323630002e32> 1917 2266 13 9461 0 s
+<44> 9461 2266 0 9531 -1 s
+<3c312e3a> 1271 2510 0 1642 -1 s
+<0025192300373a00261a23002a362d003c312e00182e3a332e342e410024372c332e3c3b0032363c2e3a2f2a2c2e080025312e3a2e002a3a2e0037383c3237362a34003c2e3b3c3b002a3e2a32342a2b342e003c37> 1642 2510 14 9531 0 s
+<352e2a3b3d3a2e> 1271 2755 0 2038 -1 s
+<003c312e00382e3a2f373a352a362c2e00372f001a20231f060026363240001a37352a32360024372c332e3c3b06003c312e001c> 2038 2755 9 6852 0 s
+<373a2e0017> 6844 2755 1 7338 0 s
+<2521> 7318 2755 0 7658 -1 s
+<0017231f002a362d003c312e001e23001e3223> 7658 2755 5 9461 0 s
+<44> 9461 2755 0 9531 -1 s
+<231f> 1271 3000 0 1480 -1 s
+<002020170032363c2e3a2f2a2c2e08> 1480 3000 2 2876 0 s
+<2531323b> 1271 3329 0 1665 -1 s
+<003c373734> 1665 3329 1 2064 0 s
+<00323b00352a32363c2a32362e2d002a362d0032362f373a352a343441003b3d3838373a3c2e2d002b41003c312e001f221a00222e3c3f373a333236300023> 2064 3329 10 7909 0 s
+<2e3a2f373a352a362c2e0025> 7901 3329 1 9125 0 s
+<2e2a3508> 9094 3329 0 9531 -1 s
+<1f3c> 1271 3574 0 1421 -1 s
+<00323b00> 1421 3574 2 1662 0 s
+wst:dutch12b SF
+<07080a> 1662 3574 0 2118 -1 s
+wst:dutch12 SF
+<003b3d3838373a3c2e2d003e322a002a364100372f003c312e> 2118 3574 5 4340 0 s
+<0036373a352a34001e2e3f342e3c3c0723> 4340 3574 2 6119 0 s
+<2a2c332a3a2d003b3d3838373a3c002c312a36362e343b080028> 6111 3574 3 8572 0 s
+<373d002a3a2e002f3a2e2e> 8546 3574 2 9531 0 s
+<3c37> 1271 3819 0 1456 -1 s
+<00352a332e002e36312a362c2e352e363c3b002a362d0035372d322f322c2a3c3237363b003c37003c31323b003c37373408> 1456 3819 7 6110 0 s
+<2531323b002d372c3d352e363c00323b00373a302a3632422e2d00043437373b2e3441050032363c37003b2e3e2e3a2a34003b2e2c3c3237363b002a3b002f373434373f3b14> 1271 4147 9 7464 0 s
+sym:clas12 SF
+<02> 1271 4476 0 1359 -1 s
+wst:dutch12 SF
+<242e2c3c323736000b0800323b003f312a3c0041373d002a3a2e003a2e2a2d323630003a3230313c0036373f08> 1589 4476 8 5574 0 s
+sym:clas12 SF
+<02> 1271 4805 0 1359 -1 s
+wst:dutch12 SF
+<242e2c3c323736> 1589 4805 0 2262 -1 s
+<000c08002d2e3b2c3a322b2e3b0031373f> 2262 4805 3 3776 0 s
+<003c3700302e3c003c312e00362e3c382e3a2f002b323c3b002a362d0031373f003c37003b2e3c073d380041373d3a003b413b3c2e35003c37003a3d36> 3776 4805 13 9213 0 s
+<362e3c382e3a2f08> 1589 5050 0 2304 -1 s
+<001f3c002a343b37002d2e3b2c3a322b2e3b002a003b323538342e003f2a41003c37003e2e3a322f41003c312a3c003c312e0032363b3c2a34342a3c32373600312a3b002b2e2e36003b3d2c2c2e3b3b2f3d3408> 2304 5050 14 9213 0 s
+sym:clas12 SF
+<02> 1271 5378 0 1359 -1 s
+wst:dutch12 SF
+<242e2c3c323736> 1589 5378 0 2262 -1 s
+<000d08002d2e3b2c3a322b2e3b003c312e002d2e3b32303600372f00362e3c382e3a2f08> 2262 5378 6 5342 0 s
+sym:clas12 SF
+<02> 1271 5707 0 1359 -1 s
+wst:dutch12 SF
+<242e2c3c323736> 1589 5707 0 2262 -1 s
+<000e08002d2e3b2c3a322b2e3b00362e3c382e3a2f> 2262 5707 3 4048 0 s
+<033b002b3d3433002d2a3c2a> 4060 5707 2 5074 0 s
+<003c3a2a363b2f2e3a003c2e3b3c3b002a362d003c312e323a002c3735352a362d003432362e0037383c3237363b08> 5074 5707 7 9213 0 s
+sym:clas12 SF
+<02> 1271 6035 0 1359 -1 s
+wst:dutch12 SF
+<242e2c3c323736> 1589 6035 0 2262 -1 s
+<000f08002d2e3b2c3a322b2e3b00362e3c382e3a2f> 2262 6035 3 4075 0 s
+<033b003a2e393d2e3b3c073a2e3b3837363b2e003c2e3b3c3b002a362d003c312e323a002c3735352a362d0037383c3237363b08> 4087 6035 6 8979 0 s
+sym:clas12 SF
+<02> 1271 6364 0 1359 -1 s
+wst:dutch12 SF
+<242e2c3c323736> 1589 6364 0 2262 -1 s
+<001008002d2e3b2c3a322b2e3b003b37352e> 2262 6364 3 3817 0 s
+<00372f003c312e003b3d3838373a3c323630003c2e3b3c003c41382e3b00372f00362e3c382e3a2f002a362d003c312e323a002c3735352a362d003432362e> 3817 6364 11 9213 0 s
+<37383c3237363b08> 1589 6609 0 2314 -1 s
+sym:clas12 SF
+<02> 1271 6938 0 1359 -1 s
+wst:dutch12 SF
+<242e2c3c323736> 1589 6938 0 2262 -1 s
+<00110800383a373e322d2e3b002a002d2e3b2c3a32383c32373600372f003c312e003034372b2a34002c3735352a362d073432362e0037383c3237363b002f373a00362e3c382e3a2f08> 2262 6938 11 8978 0 s
+sym:clas12 SF
+<02> 1271 7266 0 1359 -1 s
+wst:dutch12 SF
+<242e2c3c32373600120800383a373e322d2e3b003b37352e002e402a3538342e3b00372f00362e3c382e3a2f003d3b2a302e08> 1589 7266 7 6286 0 s
+sym:clas12 SF
+<02> 1271 7595 0 1359 -1 s
+wst:dutch12 SF
+<242e2c3c3237360013080034323b3c3b003c312e002c312a36302e3b002a362d002f32402e3b003236003c31323b003a2e3e323b32373600372f00362e3c382e3a2f08> 1589 7595 11 7215 0 s
+sym:clas12 SF
+<02> 1271 7924 0 1359 -1 s
+wst:dutch12 SF
+<242e2c3c323736000b0a080034323b3c3b003b2e3e2e3a2a34003336373f3600383a372b342e353b003f323c31003c31323b003a2e3e323b32373600372f00362e3c382e3a2f08> 1589 7924 10 7802 0 s
+sym:clas12 SF
+<02> 1271 8252 0 1359 -1 s
+wst:dutch12 SF
+<242e2c3c323736000b0b0800383a373e322d2e3b003b37352e003c3a373d2b342e3b3137373c323630002a3b3b323b3c2a362c2e08> 1589 8252 5 6417 0 s
+<27> 1271 8581 0 1480 -1 s
+<2e003c312a36330041373d003236002a2d3e2a362c2e002f373a0041373d3a002c3735352e363c3b06002a362d003137382e003c312a3c0041373d002f32362d003c31323b003c373734003d3b2e2f3d3408> 1463 8581 15 8890 0 s
+<25312e00352a32363c2a32362e3a3b00372f00362e3c382e3a2f08> 1271 8910 3 3759 0 s
+<29291e373f002f2a3b3c00323b00323c16001f3c033b003b37002f2a3b3c06003c312a3c000808080200150705> 1271 9238 9 4774 0 s
+wst:dutch12b SF
+<041413190f131711141316000b130e00050f101113111711141316> 1271 9682 2 3877 0 s
+wst:dutch12 SF
+<28> 1271 10074 0 1433 -1 s
+<373d> 1407 10074 0 1639 -1 s
+<00352a410036373c002b2e002f2a353234322a3a003f323c31003b37352e00372f003c312e002c37363e2e363c3237363b002a362d002d2e2f3236323c3237363b003d3b2e2d002b41003c31323b002d372c3d352e363c08> 1639 10074 15 9531 0 s
+<1d2e362e3a2a34344106> 1271 10318 0 2219 -1 s
+<00323c2e353b00372f00382a3a3c322c3d342a3a00323538373a3c2a362c2e06002c3735352a362d003432362e0037383c3237363b06002a362d002c3735352a362d3b> 2219 10318 9 8650 0 s
+<003f323434002b2e003236> 8650 10318 3 9531 0 s
+wst:dutch12b SF
+<0c14120e100b0d0f> 1271 10563 0 2035 -1 s
+wst:dutch12 SF
+<003c41382e08001c32342e362a352e3b002a362d002c3735352a362d003432362e00323c2e353b003a2e393d323a323630003d3b2e3a003b3d2b3b3c323c3d3c323736003f323434002a38382e2a3a003236> 2035 10563 12 9531 0 s
+wst:dutch12i SF
+<050901060502050a0403> 1271 10808 0 2041 -1 s
+wst:dutch12 SF
+<003c41382e08> 2041 10808 1 2532 0 s
+<1700> 1271 11137 1 1488 0 s
+wst:dutch12i SF
+<08050a0408070402> 1488 11137 0 2167 -1 s
+wst:dutch12 SF
+<00323b002a0037362e00373a003c3f3700323c2e350034323b3c00382a3b3b2e2d003f323c31002a002c3735352a362d003432362e0037383c323736003c312a3c002c2a36003b2e3c003c312e003e2a343d2e> 2167 11137 18 9531 0 s
+<372f> 1271 11382 0 1457 -1 s
+<0037362e00373a003c3f3700362e3c382e3a2f00382a3a2a352e3c2e3a3b0800001f2f0041373d003f323b31003c37003b2e3c002b373c3100382a3a2a352e3c2e3a3b003c37003b2e382a3a2a3c2e003e2a343d2e3b0600323c2e353b> 1457 11382 17 9531 0 s
+<3b31373d342d> 1271 11627 0 1874 -1 s
+<002b2e003b2e382a3a2a3c2e2d002b41002a002c3735352a0007001b30002929382a3a350b06382a3a350c0208001f2f0041373d003f323b31003c37003b2e3c003c312e002f323a3b3c00382a3a2a352e3c2e3a> 1874 11627 16 9531 0 s
+<3f323c31373d3c002a343c2e3a323630003c312e003e2a343d2e00372f003c312e003b2e2c37362d060041373d003b31373d342d002f373434373f003c312e002f323a3b3c00323c2e35003f323c31002a002c3735352a0007001b30> 1271 11871 17 9531 0 s
+<2929382a3a350b060208> 1271 12116 0 2164 -1 s
+<002032332e3f323b2e0600383a2e2c2e2d2e003c312e00323c2e35003f323c31002a002c3735352a00322f0041373d003f323b31003c37003b2e3c0037363441003c312e003b2e2c37362d00382a3a2a352e> 2164 12116 16 9461 0 s
+<44> 9461 12116 0 9531 -1 s
+<3c2e3a> 1271 12361 0 1526 -1 s
+<0007001b30004306382a3a350c020800173600323c2e35003f323c31373d3c> 1526 12361 6 4512 0 s
+<002a002c3735352a003f323434003b2e3c002b373c3100382a3a2a352e3c2e3a3b08002531323b00342a3b3c0035372d2e00323b003c312e> 4512 12361 11 9531 0 s
+<37362e> 1271 12606 0 1608 -1 s
+<0035373b3c002f3a2e393d2e363c3441003d3b2e2d08> 1608 12606 3 3608 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (4) 4
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0034 put
+dup 3 /C0040 put
+dup 4 /C0041 put
+dup 5 /C0044 put
+dup 6 /C0045 put
+dup 7 /C0046 put
+dup 8 /C0047 put
+dup 9 /C0048 put
+dup 10 /C0049 put
+dup 11 /C0050 put
+dup 12 /C0052 put
+dup 13 /C0058 put
+dup 14 /C0065 put
+dup 15 /C0066 put
+dup 16 /C0067 put
+dup 17 /C0069 put
+dup 18 /C0071 put
+dup 19 /C0073 put
+dup 20 /C0077 put
+dup 21 /C0078 put
+dup 22 /C0080 put
+dup 23 /C0082 put
+dup 24 /C0083 put
+dup 25 /C0084 put
+dup 26 /C0095 put
+dup 27 /C0096 put
+dup 28 /C0097 put
+dup 29 /C0098 put
+dup 30 /C0099 put
+dup 31 /C0100 put
+dup 32 /C0101 put
+dup 33 /C0102 put
+dup 34 /C0103 put
+dup 35 /C0104 put
+dup 36 /C0105 put
+dup 37 /C0107 put
+dup 38 /C0108 put
+dup 39 /C0109 put
+dup 40 /C0110 put
+dup 41 /C0111 put
+dup 42 /C0112 put
+dup 43 /C0114 put
+dup 44 /C0115 put
+dup 45 /C0116 put
+dup 46 /C0117 put
+dup 47 /C0118 put
+dup 48 /C0119 put
+dup 49 /C0120 put
+dup 50 /C0121 put
+dup 51 /C0122 put
+readonly def
+/FontBBox [-25 -256 920 739] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684219565F66AB74CD7DBC8621179B209E1B7D7
+DBDEFDE447C11C429FD272CE
+6A23BADE7C3E6E2917
+CDBA180E
+1D4521A443FF567762EB5199C717
+C8C05CC43DA3C8A67EDDE4B0591451A5529C9F7D872F70FBB41A95DBF76B42B5166775AA384F9E4EDC71C7F72FEAD15832540AF586F17EBED52157899180D1AAE39775B4B5BC1199A65BC43A6F26C9E011EB4C48F94C9F451209EE6211FB8B2BFFB89E236C2E83
+862A322A
+73850B28CA74F38F90C2946D5B
+9FD8DECF590381BC318A5F3088A6B1620B19A86CD20ADC2DCBF8091F12BDAA07AA79916014F9EA295CA0E60D937B0857A51B3B40FB30F9DF3F6C28A4D281AAF0
+4642954C
+360289AB62E0F91906E4D8EC13
+C0B542DBF5F3164A477F53D8AF895BFB151AF9331223F01ACC958F26366AC3E9A2F70D989156D6354C2A2806DC1F898BDEE996B0AB32B1A98FFAD9A275D3DB
+B2057F72
+6F37EA705794F55682092C9ABE
+53C544DEBFE59BB84B09EA5052FAC2C23D63A898A6BDF9905203D75386E283EFD585418FB9FDDC6C1600A884D39450B7B78A2E8C0B39930A32
+AE101DFE
+D04249F02B9C10025EA8B1E1C2
+D6AB922783ABEEBD8E49F3A3B99800E8C87184E2201014
+2EC4AAE0
+4D73D9BDFE6906549E700512C5
+8E83F41CDE09BFE578D5E1CF8EC73383D9129BE9301069DA22939F4B9EE9DD
+3D06E333
+9424EF5D91D1405992A5E0313B
+E509548C0626C6CE1F682438B986A27F8F0C08F6195A7F606C8637FB
+109AAEB6
+795019E7B3CE6641B5759C59A2
+CB5645DEA64C4AE2967228D43A48A7969CC90214634B0BD6EA612FBE01691B6FF3C1BFEB35ED2388E7A64604F4D5E3168F8F395EB0FB7738DBFD6790E8D6AA85D454C9A87E319834F9FD
+50BF435F
+C8E72B5E493642336170B47D01
+CEA50E0DBB2462824DA2FF3AE94F2273D5F94D1BF211306DB07331F4B528427D3B1DA1B3C44CC5DC6FFDDEF7EDCC7D9681B6DC494BF2DA3BECAF5587EBF051
+77BD0E58
+57C78FC9D1BBB63C659F9F4E94
+FBD66E7CBCDADB6E87C649C4209C421339FD0FBB3F15BB7E7DFD21728EF70C53AB12C18450E7DF9035FAC7D6E2DE0649918D73DD913F2A3768A19133F2E35E49931F6119D3E5AD87470F52DC6E2996C43EE4F55E876102039038
+634F1B08
+5D350520ED90DEDF99DF0196EA
+4BCB09F0B6C478A03F78A6AB212B5881D4A8044A17B12085D7515D1B742E635AD6313EF848BE4B2401E5A6254AB604D544CDA2842AB2F9A3799A
+96964347
+A6D37DAA2A4D5CF7685628A879
+49CD0D4D42CBDA18236AE904DBB5B90F8134C7A76789304BC2EF7755C12186B39C1A3312708F7CC8DCB01579EE66F207D7CC73457FA8
+4A77658A
+B8001C0B0EFF4A225B05B6C07BFB
+23791A595ACBDB59A4B56DDC58DA876252E62C591D3BAA65CC9C99CC1DD24D9B600BCACCF7351FDBFC08136090AEC0CC33279ED61D38EE52AC138ACF4287EDE6FB9B33A70BF0B30208D1A5541470F10B78F4EB6541252061714A5A6D3E5185B6F9F624914D722AFB50EA5B0C711A240F7BC94F
+684A7F57
+A92D26B914A40F3BB6B3459DD05E
+EEA240F0CF9072D19C20882833E7D7E34263AFAA7CEF7AF33509B88CAEC8CA9FF8EB2CD34D80DE9E3ED207C587EC016391FF81D05D1D89023A61C615FC2DB6B041861613B5C120CFED2B9BAF62427896478FB3F3A5DB118B3166CD1394779BF9EC495C69A73EC58CD341DDD9044F1A665CDB348CB6216646A942993FAAFE
+0CE5
+E2
+EA4B38E5
+935A453D449B7CB5B1D4677A6D
+2AED73408E2E7CE4FF9122CC7474E08163408E14383C22FF132E19A27BAE30689DB94A09CD756D54ADA51E4CEE47471230F8D35B1CA9B93901773159D0EBC93A3E3EFE78CDE03E6FD6B490BAF331FC04265ED6611770F9246CE647E54C6BAAAA54
+CA0A0B77
+5F16EA0B47E472DE554602548AA3
+3E45BC277DC6D6AF76127913C9AA1A9753FBB69A4C084E5B2A110C94A985E2C1C4C75A2659F0D3F7E2BDB95381247CDA87F6B84B2F7560A27E21540F1AE3B6000848B58A72117273A38D6583ABF180B9D25C71D829B60BC99459CB89F7F8EE5D46DACECD50125FFA8F6324BAF2F52E2A156EC127C5873575CD4AB49DDE0A
+2811DB12
+4FD08262911D0B01DD0349444EEE
+34A923569A75233D63B725D2C3F160E2631A2E945E59AC7C65840E8902BCBD59BF5A20AC3248818012F2EF1E33CC89E4CB90467C6DB911E5B88FF5192AB71B60A532A391C960C531DD5A76D9ABE1DFC71951FE9B3FAFED31618ADD8212A90B71B77756A103496F06690FF5B80AB41AAAD2EE34E9952194A3D59F
+3114AD7C
+8D6712E6474337BEFD56C524E1
+5C7E5DD0BAAF34276C9561485377B7A1EEDE0222F2A7CA6CE0113B6D2118880AE600A4442AE6267472B2219AC0F65975337B0CF54ADE938E8B4071
+F0CAA80E
+9BD048E778D602B23DB0109E5B29
+1B20B85736EDEFBAA6DC59602C5798CED2A08191A716B47330BD7F3431E4ECC83D6A74C455A50ED9997CFC51CBCD892C4C2711BE62BAAAE570A4AB16CB0A8273F55FAC55BB403F3523FBE3F1F56A60DB9129C422C08186ECC5DC07B88CE56FFC03BA761881ED0E9B9109FF66E74052
+19B365CE
+5BFB7A9AB8D75E1DF17E9FDF6F
+F3A0842C07F45A5FA1BD31EEB4DD5715A42C8391D4D5DEB78B2B07D9FAC54D75F3A543B189F2530C6B75B96F293C99DCCCDFC2F381F90A8DE0788F4C54065B4D1BA5507614B38C7AA0A5A1FAA3FB18EE70B0D629EFA6B14480FF55C4
+8944B400
+19BDB0B6A6437E37EBB8930A8833
+5101F1276870A58F8BE742BC3D254A2DB2BA9DF7766EAFC23C87CF630136491CFC40B472C756908D5689F6E49278250F5BF267617CC1A7D16309F7061DC7D4D2FBC97CC03C4484E903BEE5FB5DFB41BBEF228225D93D8AF799789803A5CEA500FEB803B372284BCE5CA6
+5BC593E6
+E69FE740F29F86F17C415C26A601
+78B8E8F8B857BC14BBE115F5FA89BADEA35FEEA0BC3BDB452B0B49C73E0FDB8BB367CF30D86F9FE26D93D9DDB8419761F8C075E1EFD47573307E0A2401F5E758EC0AB30680FB45A3EC038D000C22BA4D1A65EA74610EFFFC5BFC5ED46DA53E748E206A764729B7AA39C6AF4724893D21F4A40FC8A6ACBEE59D9B994817A0
+3B6CFFAE
+3E97F7DEAC482B33942D764A66C7
+D6AEE897BACC45E3E635C0C84C5E2D79551A856721F1CD64ED5C62FC43C2A3526F1C5BF039A9B35FD187A7E50811004ED7AC093E32F0CB1B46A43E71268EC74EA414A0164FBF06C58130BB0714F6293A64FE35D8386BC027664265918BC7DBEF2A5E6173B40DD6A9891AE7CCA0AFB5C6DF2575401B95174CC94CF84A4A29
+9C73
+CB43E4
+B81EA595
+51A3F85790A9D87F093F112C54
+B15F6B8F009904A3E2EE2BC48D4F9F023E567C1CC874CAB62662DED944AEA74A5C5D79D9E976FFE171B2E7A13A5CFF6CFD3ECF52C37EB2ACB58817DA9A1C4FA83C102F58892C6A2A0DBE6C2C0703173FFA
+41E0C894
+B14EBAEE3C5AA74B00F17A4C84
+ED0BF61A1907DFFF0A2BE300C1B2593D8E5BAB63F752
+804F96BC
+28919A267CDCBE955958FC6EAE
+7BCBA2D6CF3C923CC74E9E7C3E1BB8575C3BCF29A69A71D7698FA1EB0B67C9F68B2955348F06482F797B142CF2B1C7E1C970F394AF7A10395B06
+3386CFBB
+2ED348166F284EA583089B0BD14E
+D17ED6CB0CC6C9C1F2CD96AAC3C5E57BB61659F8AA32B1E19E36B2C23BF9FB9DEF41C5021F72ED825C333A233EAC20734424CEAABE99C2F0DCE521475A798A361DAF6ECD5B0813D9A39B9167D9C02771E442952D08914E4F1FF390ACA8B4D5529E4221E0F561EC111D93F662476288E51AF61B1504EA58667E753CBC586D
+0E66
+8DC2DF
+860ED8CB
+652AE22D811F72304AF399E09D
+4ED56A732E86B8B9E4EA6899B16C3AED4F60C11023475EAA1F39859018AC0192B17E9F6690283422585F92667AC86D8578A8761681B6AE6FF49C43680E958FB0465689D9ED532ABDC96D3FFB1E6812A6B9D13C8E71B361FA
+2E599723
+0294A761BAA81EA99627F8B594
+F29CCFDA460FC29D36B00FD2415ED210F0E99362B0F13A03E695ADADCA3235F165205467EF6805129697C4E8AEA4E6EE2A5A7886B4D623AA3BAC7C8F216E94CA917E55B046E529CB17D3BAE041B798025D48
+42261003
+596335B2368F3E9F892B59FC6D52
+EC845BE43F8E7FB72C0359B332806B568D397B17ACEE31AC36F508C605BB0F18886C516D1FD8F040F12C9F940B91292193F40812A9D559526CFC5B8E1349D467A4E114E087C838DAB56442C5E32E4536F42F7FA0BFA4F0D60A124C040E10FFD3E2E12341C3145114F7BB6AA6D879
+0AE5E587
+F798BE0D734249BA39E216DC09
+694D24069F8349B1BB9CBCF9AD28A3A0D52CFCE95FD526B7B52679D8A80BBA7ACECBCBF2AC4443A8078D7DB961A8C706F78AEAC71803CF334C76282857F270B4DDB7715BE73484B4F5EFEDD8A8DB696B1DA6C59C7507629358
+4F974CD1
+B97B12D0DC2AA5467A25524B08
+C70599D51BD9F8ED32471C304D3BB92D05E09A7EBC74F30DBA64229FB22B2404049A149FE83A0B72912C74A237C9A2659DFF115D0517ECEEFED64B943E6F81ED39C1F4491542E653A45C5D8AE07F903B2483E0C2F21016D65753FEC6
+9F912771
+259C3D703EFF81DC72433EC7E447
+4E1925903423AE6775417ABF1E43BD739723C70FD633852123C77C68C3527F83A2A567E4AF60CDAEDADD6FD155B49C7A80AE670659961DE7C2EBEA96D5D4F19532BDBE79D4BA9E7F88DD44D8DDBA241120FE3D8F432CE19319BA86275CEA3A274515F3D303C89154292FE87CA6E7EB7EDEFE52A57AC4FC9161BD052517C6
+47C3
+74079F39DC1CDFF6FCE06A2E4290695DA64DD6237A503D66DBA9614E140EE06BEBA4501974F279E07228EF7F3F40E5
+E4216064
+2E662282F70C916F6B4DBE2105B8
+61FAC6C3780BEE5CB755725BEB7161DADBEC53F79BBB76F4E48F40E56C7DF56E2ECEE844056F62D758AA1D5744CCADAD5265EC2E877A5C4E9861E2F9A5C2C2D89B0181F51EDA478A5D1DE63315BAD87FACA43524BBF7E2D763AE7C0613E9F797ECEEA2B6B72B492BC3CD20E1AD
+634CCA91
+D3816C9EC24FA71D8D7182873F
+D7866F5F2B71C69DA64CAF61E077E1FDF477A15BCFF743BDDB92BB3EDCF50C9F3860C63DBD52654E455158D6BACFCB80A3706DE482B098DCD973FAB9D4CC28C709F7A02C50F47336FA378B08B38E61F9
+7DDE8ECB
+71103F703D54F876763BD89B49C4
+0BB267263F8B42AD76B2175596C20EDB57996EB5C3463197E5382D6919C20A33C49A7F1F7BD5E56D452DA6A140729882E52C24BDCB5C8AD7BE3F60B16810791A2B354F17A3C0C76401703000A2523A8218E7057B416393994E0D85D523911182502349B1CB0DAEFABA85060BF5268F8602ADB506ED930A3D715F1B5AA7AC
+AEE1
+35164164B15AAC5D0D416CF3A635A72CE86D49C362F242A172CFE726795D5C055C2000
+1796A400
+06C81FC7EEEB06A3A02C741198
+AF6A356DDCA4940507C729D0E83BB9DDE1393D27DBBAFEE166260DCB1450B7E30E05DA6103F1C545D8C92F1297A4892E66F9C9FCA749
+82043E9F
+FE875B56589B3196571A71BD88D6
+C5CD5510FC3C8A686C5FCAFB99D3FC85503EBAD6940D4458050754AB86560B5884DB2B9DF1EE730432A263C9C1353E0467856DA2F16E1009344D1967CCA7717585EE4AF3D7189ECAD2E3D4A039496825CC885508F7358388747CF9AF30973F9C0AE7C6125E6B18B88D3A4F20212DE3CF1DECEF3EDD8CCE7C63C6B0998679
+7C16
+8C661AB46F0389EA89FBF118E11AECCB20EFD832E767581E15F972EEAC8A82
+F3FB7DC9
+083151C30385A317B3B393FAA4D9
+90B61CBA3AD7ACF3E935B96CF5A43A9953414F485713A5584E3BA8DB275CC884F8B3913BAC5A763C5CC710EE41871C37C35360455981B8C16072152A610B43BC6DFC95823D604CE36C93AF5F1AFFE3075679396C66ACBDBEE01B7C75D81AB2CBE553FAC20DFF6E0B2FD5E2C1
+33AE9C4A
+2129D2C1E5C6C9DFCCC73264E9
+4622662736DCE286B201F9B082589A253BCB8BED8D9B7AD37E589854205254F84F0EDAC2CD34AB34EE7551535C9C48ABEAE8ADF7CEA06840F40A12DB9F57FD70C8EC78F884C7
+53C56DB4
+2106FA8EA28D98707B39233093AA
+FA54FFA594366AD142116DE382AC62804B04B2BE191DD960616BDBDE2519886FED26E3FADE89FA0A5B71ABC477B5CCCF7786DEFA65016C4FE20E363F5404A378438B12A4BF54C2771AE618D7729B07E73FD8C820B7C252F7FAFBD3E9505A9AA8E8AB3ACE7E275A51FF461699F439F55516122528F6F6D0
+DD2EB48A
+AAE7C91B88F745B5B78D5B9BAC
+0B2865D5E00D5B90B68D92C924B725520FC3868CD2596B25B863EC1C7D4466FFE1F5A0E42B7BC67D9DBE04581355735EBBED620E2DC2F8B8D5F2561D5B29F6FFB66B89D9BD0852AE5EBC94251386776B2D615304453699
+244B7EFE
+D4FA60E16F6A07B289DA907B2A19
+150135B738A6307C5D7AA01B43056309E254FC6C08FB8E4581C8CD6497E002AC4D7B54C810580811748A403E53BD4A0351173A30A37A4501778BBD45E4774B8E74BB9B0BE57E627AD3E7DC303D01377ADAF3C481ABF77B9E9B04E9FB69382883B98C4C6981B69BA414849D3F7F2FBD349A1250C282EF4D1430BE7B95
+9A801858
+FD9B250D29FA6573832F796E97
+E492D77B017B5DA6BF5EF65BB07E3A288E9A0A678ED2B4A6A6C7E6D6227C95D7BD83EE38C21589056E4F36D156C596FC81E6E1A0E222F9F9FD4081C0B9854ADC8ED035B326
+C8A12CA4
+F5CD9361A5CF78D109654A5104
+DA36595623E424C7199568BE842CF66F337AA1B094F8FF7627F349411E2961BB1486C3A5B7147E550BF91A7AFB52FE8D67B364BD121D3CEE9A4350E448B9F9BEE45340A26021F609CBADCD674074C06FD9805C3DC83C6E9305A7F1BB355129CC0FD4
+687AFFF5
+E47005977AA6966C380E3C283E
+F9BDDA94360706E84A7C10FD8EBFAE1FC4038960F730BB5E85D6890E688DB3FA0211EBFB7AB24C92A90B6A47D80B1CB8D4AEE9D2AEF609BADCA67ABCBFDA7ADE20E9D4F16345A5330AA434A1D6EBDB118019446CDCCDA8A67D
+49F80FF5
+62E34FA17E69624DAE8AB113A3E3
+47B57978A2C0131B8C0E6F405833BBD672D4361973BF67A04D5B7CCD032B0AEFC605E78FE931170843A867BBE041F7AA1D7F0607979F397C50327E3E0A395C598F44CAAA0452C76B3385F208956CEBDEA8DADCF57B61557C6C002A0B2BFB311037A7352AEC5493C4955351AA2D722E679E1D1D23A51253A9BA3AFB54FB9D
+74B3
+DE30C41F3504AA820C76E16DDEFE
+04D81536
+B864704AD12624B6F6B51B179B69
+1DFCBD8186FDCFAD3610B2EFCBF6B01A30633E570BA26B6395E2A495F3E7A3DEF402F387E6A4C1DBF01E107A262A2621198F9704A2792CA205222E1B956750DAB4F193F68EB346B657EC1DCCE261E152B9E199D30FEFCF6D4D3E43659A57DB198E70493C169674473B6A36566270847C022C2968A404A5B976AF7B4727C5
+AB37
+E0466DA967BAF22A08E3DBF6334F511E0216B725E990C8C495
+691B392A
+2528805B3CA328883C63CBDC8CAB
+B9120CB680A199E447C320ADD4747E3DF10AB8B3466A61E8E1AACC0D897FC15F70DBA950FAF19D104ADD7B76E5BE4FDD240483D511A697F2915B06DFF39799B0D68F56C705D7293FDDB47235B3F7FF04EACC7D6D669214DEEBF90C6992688653120E94B3AD95BC5EE4C739F11978AB67B61D2622E707035BED01748EE31C
+837B
+57992F4C
+D542F9B7B4822E55C033F4D753
+F6CC0F038B159879083A717CDA1D86D0299853C0E103099B077EB40598B7A6F3285894CEC4CB02A9D27B8E3B5CD8DA549309B189A8544EE1DD818C80911B46
+143674CB
+53B62A669B23390046BD82F33CA6
+1BC587A593F8BF07
+C9DE0A73
+D0766AB6B8E51DEB715DDEF16290B873199591E37E0552E11420933A430C38217321
+5EF929949C0B0EE89881B4666F9FD27B46F0DAF28C3C786A358E141385FE1C5388F85907E72B
+40498A8C3D95F50E499B7C959B6D30DF685D282AAD577EC32D83A2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<15202d2a202b210d010e010f20281e23271c2b250121292b0114201c2c2e2b2428220115202d30292b250116> 2207 558 0 7384 -1 s
+<202b21292b271c281e20> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0c> 9434 13300 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13280 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13280 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13280 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13280 3 7133 32 s
+wst:dutch12 SF
+<15202d2a202b21> 1271 1431 0 1980 -1 s
+<00231c2c002d3029002d322a202c002921001e2927271c281f002624282000292a2d2429282c07> 1980 1431 7 5617 0 s
+<001923200021242b2c2d001c2b20002226291d1c26001e2927271c281f002624282000292a2d2429282c07> 5617 1431 7 9531 0 s
+<19232032> 1271 1676 0 1726 -1 s
+<001c2b2000202c2c20282d241c262632001c283200292a2d242928002d231c2d00242c0028292d002d24201f002d29> 1726 1676 9 5475 0 s
+<001c002a1c2b2d241e2e261c2b002d202c2d0500292b00222b292e2a002921002d202c2d2c07000e280020311c272a2620> 5475 1676 9 9531 0 s
+<2921> 1271 1921 0 1457 -1 s
+<001c002226291d1c26001e2927271c281f002624282000292a2d242928> 1457 1921 5 4167 0 s
+<00242c002d2320002d202c2d002d322a200700192320002c201e29281f00292a2d2429282c001c2b20002d202c2d002c2a201e2421241e00292a2d2429282c07> 4167 1921 11 9531 0 s
+<1923202c20> 1271 2166 0 1817 -1 s
+<001c2b2000292a2d2429282c003023241e23001c2b200029282632001c2a2a26241e1c1d2620002d29001c002a1c2b2d241e2e261c2b> 1817 2166 9 6504 0 s
+<002d202c2d07000e280020311c272a2620002921001c002d202c2d002c2a201e2421241e> 6504 2166 7 9531 0 s
+<292a2d242928> 1271 2411 0 1862 -1 s
+<0030292e261f001d20002d2320002c20281f002c291e25202d001d2e2121202b002c2433200021292b001c001910161a181917110e14002d202c2d07001226291d1c26001e2927271c281f0026242820> 1862 2411 14 9531 0 s
+<292a2d2429282c> 1271 2656 0 1943 -1 s
+<001c2b20002c2a201e242124201f0021242b2c2d05002d202c2d002c2a201e2421241e002c201e29281f07001923203200272e2c2d001d20002c202a1c2b1c2d201f00212b292700201c1e2300292d23202b001d32> 1943 2656 14 9377 0 s
+<001c> 9377 2656 1 9531 0 s
+<1b1b060602> 1271 2901 0 1830 -1 s
+<00032d3029001f1c2c23202c04070013210032292e0030242c23002d290022242f20002d202c2d002c2a201e2421241e00292a2d2429282c002928263205002d23203200272e2c2d001d20002a2b201e201f201f001d32> 1830 2901 16 9531 0 s
+<1b1b06060207> 1271 3146 0 1883 -1 s
+<0003111200070828202d2a202b21000606000627000a090b0c04> 1883 3146 5 4532 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (5) 5
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0034 put
+dup 3 /C0040 put
+dup 4 /C0041 put
+dup 5 /C0044 put
+dup 6 /C0045 put
+dup 7 /C0046 put
+dup 8 /C0047 put
+dup 9 /C0053 put
+dup 10 /C0058 put
+dup 11 /C0060 put
+dup 12 /C0061 put
+dup 13 /C0062 put
+dup 14 /C0064 put
+dup 15 /C0065 put
+dup 16 /C0066 put
+dup 17 /C0067 put
+dup 18 /C0070 put
+dup 19 /C0072 put
+dup 20 /C0073 put
+dup 21 /C0077 put
+dup 22 /C0078 put
+dup 23 /C0079 put
+dup 24 /C0080 put
+dup 25 /C0082 put
+dup 26 /C0084 put
+dup 27 /C0087 put
+dup 28 /C0089 put
+dup 29 /C0097 put
+dup 30 /C0098 put
+dup 31 /C0099 put
+dup 32 /C0100 put
+dup 33 /C0101 put
+dup 34 /C0102 put
+dup 35 /C0103 put
+dup 36 /C0104 put
+dup 37 /C0105 put
+dup 38 /C0107 put
+dup 39 /C0108 put
+dup 40 /C0109 put
+dup 41 /C0110 put
+dup 42 /C0111 put
+dup 43 /C0112 put
+dup 44 /C0113 put
+dup 45 /C0114 put
+dup 46 /C0115 put
+dup 47 /C0116 put
+dup 48 /C0117 put
+dup 49 /C0118 put
+dup 50 /C0119 put
+dup 51 /C0120 put
+dup 52 /C0121 put
+dup 53 /C0122 put
+dup 54 /C0127 put
+dup 55 /C0262 put
+readonly def
+/FontBBox [-25 -256 978 739] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268421912B00DE5CFBFA849BE7D67692D2B46689
+87571FF9AAC939AD7F8506F5
+E212668FC1CD93CA4F
+90F000D7
+EC794F8E1EA89333D3BB42627082
+CA3A4A3DBAFC25560F11FE1D6825562615D88EF20546AF20BBB7502A9558E2430718DE76A59BB615C1AADDE7186AA65E3331C00366B1C7B5DCEE1E600DF7ABE143B3BB6BE5AD843600860D8C93DB720945A7075F9E74782726DC65AB2AFA0E81B659CF2CABFDDA
+E163B586
+FE543E597D8376CC2E221FDCF6
+C10CD968E8B3156D20C02A3279152F687C7457EA971780CCE1605D6395FF62CEECF72CC3414B51DBF3A5C978C909F6132A8C0E12C48AA6E85BFFA40B4A0369AF
+DD672080
+A09CD2883A8F5F1895DF513D31
+54E0773807F1E363D7E86F82DF9C780EEABBB77C0845E73D35A5D93B0D7BC2592298678C1B2EEB8AD84D7A930E5520103096FF1566C8034D9F404A15FF245D
+91B47733
+105C63BFE5ABC0EAEB56F2BEC8
+DA7413927FDF1DAF1B1E3C8BE01007FB15B058A627EFBE28080A5EC168E1F5D028A21273FE3450BF55DA0A5540557112D3425355AD03934842
+97FB3BCD
+64A0B1D80DB7F0E18ABC0A8786
+08407B929B0D5D9F9E1FCBE9ACA8A25A578FA557E0A1B8
+CBE28C49
+E2D89A6680A28E03521D4783F1
+1B5F18895C457358A2C13B8605C62FCB4303CC6D932B0DEDF68FA12F2096CC
+053172E5
+7CE5D7B329822E21114416638C
+3BB4570936E2451AF9AE8B5CC2BD225B6F5D6706E22007416B00B72C
+407210FF
+310307B794E5E818DCA54F1D1B
+22718DFD6859841DFEC82194EA26A11F381D02A49782EA70BC69F9FD5B950BAA1B34169A7703BAFAF02565410EEC999BD9A222506DB7AC6ADA5816AA96CB6E6615038AD77A4B88616837525F5044AF6A7A6E0C6F0C6C1C29CFA348804616A3A9CC
+9A495AA0
+2BE869366815184BD89EC6250B
+2EE63584FF04EFE9C40A0F47BE78997CF57BC179D7B1C3559C784817E51692D374B7CB2C21494A845F752EE622B667EE7201DFCF2EBF
+1A5A8AEA
+FF53E74F66D964D6F559B8E28B
+279CF25CF8AB74791EBF15064BA866F1333AB88CC1C88B568A237EFBF37E7C7766AF2D015401A50A50
+246D8A36
+EFD67766A56BC7E14374074C25
+5686B775F5C071DF67C04C62A29D407C97659DDE67745C25A677A1B97082A6B2BACFC459
+86998E23
+AF59B47852A041F2395C15D20F
+AAC795403190C189CADE2756B88F2D787A0F686AFCD0739B2141DEC7AE6D79FD6FCD80341052F8
+0D33A21C
+DD523B2A12F0FD732F0F5D737142
+7BAC81B3C1BAEF198ECAE69D17FDA39EB1232083F749517AB41651D8F692CE04F6987280336CF66BB6DC68171F9F182BB59A402D33FA253FB512395496248E7F594A417157B74F8D78754CFA6F7383ED50CCEE01241FE52BBF9C9CC51C856820A3431734B1EC96522935E53F05622528E47BCA5A58046656DF20278810A4
+903D
+9942E7A6F823D11791F76D3F32C3FBC9FF691B90ACF688BABC12C7261BE52FC5C01DC6233BBCDE87C69F1C825E3A90708454DC037CC63ED96360CD6B347206EDD2476618F0EA6E54701C4C3A90DE64BBC160864E0162426DB22294654D5F9EB595F02FF5321E50AB70DE9F87C53539FE0A8B330E9FFF774CCD603CDDDB5B
+9B
+DFAC3882
+B47AAD832C7E749730FBD24A451A
+B19EA46786383D7FAEF25DC7941858A54C044B93661EA14FE3668E24DF6535D27644E68C50A66A98E5823666E8D976A33D362FE8BD7986225F34C8EEB401C70CC5C1ED60D81EF22F05DBAAF9EF1AF09139A9F6F62A505FBB7416246745E3928C03A48BA945689084A260984148860B67339C2D
+BA44D152
+F9937E5FC09376AF64557E05F600
+FD03CC51F27DDB895BB39F0B48A4ED1CB658621DF60366C79EAC9BB8E3E8BB6DFF1573B3118F4095827E21620C4D1ACF9053B61FEB668E659409C36068D4F95E3458ECCFE8174CB7D70D60E541DB7F380A2D26339FFECDDA5903EB06C0950EBD709F64EFAFCD2B39B6FB0856F2327A789C10FC8AC4D4F2E24BC6D474E43B
+F552
+01
+ADA2CA4E
+9EC74D6385A850CB35CE3EF01C
+D10EBE049B41FC66FC7C34E764B2944758ED3FCDDF58FED860E9D1F83988151F34C7C02BD3702A17E45DB08E38E5C62F46065733009C315D493BC3450B39D1FD0BA51034A213B1420E9BB4AD1B7C2DB0B93D706562457135FE8824AFFEC2EEDB60
+609C0383
+87534318E9EB0ACE15F7C6D5F9A8
+BB59A8136E5B4A11262ECE352A3730BF7D993215B85D22536085E8AAB28ED4D815E25A7BAAB9CCC533BF493012CC961F7752913FD26E6C8C9DFED9EB862AF9C938043776B710139C308BE2697B209A0329981733032ECAF66C0B58DB50FCB4C86B3365D465D89C8EFA
+CD7D2158
+515479836139C78DA6DBB37ADE87
+C03A2DD16687B238238EC431C338ADD3952D2F19A58F1216825AA1754BA7EEA01F09620BA27C18E0C77E7ED9B69BD2D57CDA92B436E3E46741A7E28BF6FAB341B49A207F995BF05B85270E707367E3B86F9A7513ADDBDDDFF2CBD9FA2A4C6D726D0316E4DE93365600477608CDA61D4BE5454F2B8B1B9A61BAD5390E45CC
+BBDE
+64D104B3AD65A5F1F1C0A3
+E9B3115F
+D1149858391B0A220A2E6E10D5
+505522332BEA03C78C8911515E6377C4EF86EE989B1AEF9B9FF33E571569E51E1BC4D2C3CEBFE803ED01E171BEAEE65F040AFD769CEADABE21D86F
+1928B7C5
+772A4C013390C2F4C9770A4930EF
+1E3E7332357B6807AE32C04368B059ED3AC530A30FB9FF186B69E5197A86E52FE4C6D75414D91FA57080C3F663B1109B817590CC70C1E4C749CE8730E727C35D76512540C1A37151B8CE3155ADB6351B71A06172ED07DE4BB3E40D22A7399CCF1424A051947CE5F3FAA65E107EEE2D
+19D2ABA4
+4EB55B476FB9AA1F9781DB5586
+3E11A214C1DE0C999489B47B3D8CFB2BF50F789CF9CFD879C708F333497247755449C27FB203428CA56DB64A58A4964084B9A3B999637165E65753E487AE098A8C27DD55D3E8D4C787D0EA50ACC5F382443361ADC7C5A4DD47CFF983
+205C8196
+3DE54BE13A4009FA318245A0E0
+17C3352B2D425E1F55B4A5AD6A258B8F09BFF061151A103A5B778B8354A28B2CDC785172898A1B144C0F5AB10854B4EFE545DDA6384ED439B01891A38882D580E0641C1CDC06533BA666EA642B99633D973404
+7A7E5E7D
+338DC9BD1D89B5CC5FD7876A8318
+4F0F93C90FDF128C231392F8DA3915B67C1BDC267D0AE6A744B8B2D17938173F023AD5727160B37ADCC0BAC065367DE6CC1820C10DF22B5CA46C7A1226AA52CF5BD36F43EE2BA2EE5165783170381FED4B30454C5E80C0F031EDF5BF656E31457DBDA55D41C7C4C8E992
+F8AC5C20
+56DC9144409FFF8DA878F86ED784
+92C31CE44CA6F076C87599EB4D7BD060FF528B4E82134417415ECC67B7352A5A13D3CB701D7C482E61D7038856C8656537A68F3C829E858034A383D0549225D744860E122EB8C4E40BCF7A9A9140437F5B0AD85DEC719B6EB5B9563F61453B2D7DBB30EE2E9DEF801600108807CB953E802161F4840B22799176FE310D9C
+3CB8FE2D
+B4547EE8307C556B489877E9E4
+121D68FBC4707730B55F776C3D785EFD5844EC01317E0CD70262051BA2630D08EAA6ED83935AD30172A49B9F63E5AE9AE9FB789257813D6D990278A7F902DD1F044F5F866C5A6B7C4260D9F8B1BA071A36
+85B8045E
+A54972CA1D0E2D2D1C611A4BC132
+ADADC92C4638B3C6CDBEF1843D266F3A731A60CE8C3DCEEAE596E5CE1352C65FA628F1A13B91DFD92DCBA8396D67722ED3E1C885365B5F5D9327226B91584E4B567006910814D6987C3DAE0091E150D1BD71D4063B9FD83874376A815DF1CB34DE12CC06374328EC8BDD2A45E752D03FFD4CF205178B872477626BEF0E98
+DA67
+5452953DDB74ABAC990F66FEC92227E5
+EB8634CB
+C6FE825882CC3E5EF80272314C41
+2C5DB4A6294486078B531186A9BBF77204A87A909BF95D6CDB40D62C3EE03C6DE94509F8AE1F36765422CC6A20C120B3D3FCCA10E0F088EC4C73DB389D76C899283D13FB26B95E8A714609A64ACAFE27A528E363C83E9420FD8D7249EF50A48ACE10CB8AC93D3E5473AADD8925740C0FF7BFB7
+9C5F3D64
+EAFABFC006C2C423257947C9849D
+74C89F5D8B5640CF99485C7DE4E1EFBD3901DCDF5318BEB3AF7BBC5B720EB85F68C8FECBC5E8874505230CCB0640A8CD10E9F496DF91571598C56E8DCF3B15FC35E6774A14A125E5BB7B469F014F6C6B3703147368001B233F1F2CF309537EC970B17F88F404FA77D799985A7E3B2D47333146BC12FF265CEF043DC352FB
+BBF3
+387672
+37FCCE37
+916E2EA4233DDB533925B7C87E
+1D24C34E1EE5504C3B7498C8961384758D26DAE6E98327F445C116E8DDC37D5977B9BC5904C31A4263E2DCA7B4032447225D887F373BE5C46D9441B871637CE6B531F5000481F06DAF62FA7FDDAB88AD3B593531337544D0
+0C760EB1
+5E024CFD26C7A7C3044558B100
+4827BF9D4AD8512E8FBA07368C0CF8227DF19727976DF273251E55C444BFBBDDF2F07B962631A1BA9982DE120960A799D2830D8A367BF6051B216B6B06A45E48C325898E9F4DB0459AE5D4D2A3ACF9844648
+30206548
+098D95BEF98CE2EBE692BC531F99
+999053018F3788EE2CBDECC92E530B7C7630C3D72A94E4CC7D498992FD310147BC35DC5BB2009B6BB29FBE9B74F666A66BD633F2FA5A8D17B32C90FC683FD8350882961A891E3F9FD6CA68E0D6851BAEF291CCABD73ED0735FD4FA7A8F6482CEC8C406D658F55E2D97A3A86350EF
+2EB96866
+9EAB3139DDD7710BA0284813B2
+98DD1D7E4D0DEF20D2F0AA8415D0CC163FB7130AF4F71357AB3630D8E8D26743C97F5C71CC0D8BECF4CD41099BBE9F6DF8835A37A654AEAD16008F6E97727582EF583CE51C42B204EF3BCBB840C3EC548CAED02341C5A0BAA6
+9CC7BC51
+724187981628AE29BC8ED3011D
+4E2E1A18266B561246EC3AE5D819FE5B41093BEE52A12AA5DD1618385AF4259B7372F779C9E34203E0463C8D215650200828F878DABE64D7DCD52FEBD2BB3781F46D3382E0530858DF97A0E12D2B87EA5E2D2B23D8DE5D8C399957A4
+84066BDE
+909F48C0B4AB33035C3723329DA3
+9C7D667AD876FB76C0639C5F2523773C7020274FA29A14D5CABD858A3886D72D626DDAE24823BFD39562206D394C4C06DFEEAA53EB9497433694CD921CD210ACA07F5E4C46CF1254A154C553FD2957C9DEA7D751C48679A745807E9441D8624771DC2E973239A7A3FC21CDC4C6080C090F271A4F149461D75A9D52170352
+8235
+AF13795A20E4C52D8E6F6CC123FF6693C0EF841A73EDE0F8479FA657EFEBD5EA9B9C25F26DA5FB33E64F250EE2A372
+8754A59B
+1BC42E39C33F6F531751B00C952D
+EE1F6CE60B754C79D03E0D8003267DB7478819CE157491C1724412E5799642CDC79647113D885318E3C70CAAD3E55BE694FEE81E84832DDCD0E27B0150E05D8D8897921DEA65156DE5B936058F42399F2AA932D0503BEF9F78C227728BA8C6DB97FB153E497B71EFB46424968C
+5EFB85EA
+5CB139EFCB2AB8577E6DC7F6AE
+E22D1892608C24A09A1E73093EB9C77F8A2F87DEDC98EF41730C62EB27951699463871DAF852462D7EBDD8527AA93515473255761C49FA38346432AAD220021F503CE3BF665154D5B676E5D8D71C5577
+82F0A3E1
+AE6894A949D862685EFCFF2326B4
+0E27E0344ECBE6A688CE40CED1120DC044357DE7FB6BAA47198A67199181B288159687CCA9E04D93C72F802F60B44FCB58C08BD28F5E35D0E62C2201A72B14F224DAA7029D27FBE8F82708117B65386592453BBD8CFC49088CD439644A38A4F29F6CAB22FB9700FDCA4B753FACD193E5AADBB97C01793C7E25A07CBDEB3C
+2BA8
+99F3AA7F71142B7A94CD15A5E77B958D86A41458F2CA53EF8EF3B14F62FD974F70231A
+F4060411
+78400A5DFC904FB63B39CD22CE
+9C2F3D5B960EC19A953D38174054E4144EF3679A8E26416A7B47E49603A518A7FD0027BCD00084F823191BC7490E1FE34AB9143FF83F
+3AE9B97C
+D5510745F41296E9C011312FE2FF
+D0CF3E5BC19C1E17648C2B874347CA9E598C1A057D68A6C7B1B3ABB4AED49572E9739FCD22F41BA98D2A1EB6F9548D823431C686F828B85FC64C3F7FDED818954C4BC96C26CE2B052B8B89DF5FB234AD91EA38466394DADC3ACECA328D3C97280286FB8AE4CFB5C263642E601CF119ED81AE3CE43623DD4BCF2FB67658F8
+A0DF
+C387DC5E6467D10142538102E1469BD241BBCF33C21E76136B054BBFC6D6BC
+C16B52E0
+E950C5DF47D2BAB5C0AC0DD79E71
+C527867B1357EECD6B412BF06D81821428F73269BCC5494ED8ADBDEE9D57A55173E58AEA271808D2CE68C3D035F7EB4801CBC306904368D3841EE1ED4CAF974218217CD0036F140ED2B97212A88DB4D856EA81A69179277786406D1647058F1B0C19D0A8DC9D9CC54DC58888
+898A376E
+147A1DC955D970FFE8A0BFA511
+1A578AFFD34407DEB4A31A3338E257FA0E87BC2BC38EBB13EBDA5513BF9A25AF459E25BC4876D10F21BEA73FA1FFC1064888B9AC194B4F7A80F1E9A0C2CC1A4F1660A8FB1543
+D8593FAB
+2BBD401FDE3325D4DEA0BDEF8BA5
+75387DD049C52945864370B0A5A8635C1F6F55C5D2FBCDDEBE1858BF0518A95794DE0A1BE1AF033EC28E6FB6E0593663176008AD70F331E15DBA97222DBAB09DCB8AC86BAFCA34D980BCC3CDDF5B0C883205EC2B6638ACC47B0ABF1BA0CCF52455AC5EE244D22C5CD09593D7A363909C891A16E6A90F10
+AA94B5CC
+8205151AAB0BF05F031A6363DCEF
+D2F3B251394D4963320ECA4FB126A0F91CB76D02D0905AD1AE8B5E04BE3F385C3ABED1544A84B736E6EF9B88AFBFF30DDC390691C4689999DBD8F224B495065C03FBD3E7925BA8D35409C4BA16FA6150CE75E3ABBECB8AAAAF8FE844CA9462E456847DADFCC5827DE3EB
+8534BCF5
+A83F5DB5EC2AB3A0A70EF1BEBA
+5095045A1031973C5500DC84C4063A72C2375B76DAE0820D7111FBFDFE5BEC6E5C1C459680D8C0CEF2F728D0CAC5D05D992D02CFBA49E49489EA62E06FF76CBDBB07809B7C4155B3D0FE5A5C3FB1A41A44CA7E167F4394
+AA97859F
+C36689D3E2D47C7C38E5EA0ED503
+C7B55E1F4DBADF8F17F3473B9A282BB346AB11EF6DC10984B29DF87DA3CE9DA6FFACF4CA7749004FF6738A40054E0C03160779231C1CA6F6C8A730C5AAFA8A67228F7CF643DDC6E003A4F0E825EBB816184881D46B5F89D9B282B6838C5353A1C4CEE3DA256742E682B905AF9263018DEC976970D14C302A6E35B67C
+EF4FA704
+BA8A073C071C64782DFD043464
+A75D9E0BC759852CE536B0527664B944133F0D5B9FD64F75181E1074F9BAEDBB43BF3DC1D3FF8A9D9878A6AB82657D3FBEFD8D2E37E173DFB186464D5F93DAF6D4AAA49365
+127F95F3
+33E51891CB536AC650309CF795
+520A812266602D133A8BEB8D682935DBC4780B8FCAD4F68AC4F3DB4E35E8115E92FF90090E7148FFB1DC3BC97CF7A4A28559E8837A7A553767271CE5C579EF32CFCEE258FBDF4627CF441F3E2F11C1CE5E806447F4C04DABB3E22FB4BED32515B728
+85AE4F23
+163D918F80456060906187C823
+F5330878FD629F54694A9886E0491EEA543D11801301988C2EA0A0D205E3C22BDEE3AB00910C43D147406AF7427A0D390ACA9298833E97B6ECCD34160FDDAD00E6A44B8C788F58B1319AEFCAF541951704EE211043A069C750
+B0ED6B4C
+A46FA08BAA001D31064F09927AF3
+ADE81FE968DEE362CF394828F136C5028C522995207926BD207458AC3778DC23DF71AA9569E06A7BF67683019A57940D83E3A388684EA8F1EF38DB4C299D62B878B999CD8FB1743F8D3A6FC033DAF6ACF7A07484CB17D031BDCFB405A5122E9EA516B898D784B76D4B4FC233E7EE4D28EBECBDC7FA6DF9DECC7CA34F36AE
+8192
+17B4B4CBA57F493D38CA604EECDA
+DEA5331A
+42B36DEF414BE163E5A59914AD3D
+E63CB597BA0893AADB07A605972924374CFED24E72B110E39D7FA018E0FFA267FE619C46BBCF020DBCBD22F6A14EC9F012F197C25C64332109454B3721E340FDE78F52A69FD7BE3B74FC48CC843663A39C52A33AD1649FC2714247A43E1E363FECC968E6D3B43F33ADF7262AE1CF3B3804C4751F64584101FAC202973C63
+ABD7
+A9861DCDB01A4B3E9683D87285F8E005F16F07A5FB4463EF05
+D19A38D4
+9DA063E3D242DB09675355E8D643
+E8CE7C64B03BFC9D4F19A1E77A0BDA4C76FF99C13ABC6162ED0263A77225E295C4B6EE6E68C5CA2AE0BC052105324BC6DC92A08E06865B57609B03D0179F719021FF6561A45044B0A304AD107043404689A49B34243871A9C56D7D9712ADA66DAD02999DB0A8FC72D3EFDF8A854B06983910334B22BFCABCA578A0B8DA7C
+D813
+4F5ED0E1
+935F82E8F177EED7F93DA3EAF2
+0FD084536BE7A88B4D9F31011CDB4A9EF81DB0685A53E68CE13D9FC9C481A6957EF1B7D2C3A322E95422A86BE91559C0852FB667BE122559F67DC2C9B4C98F
+8613C412
+735A6246B3800B85B8D01F20F126
+F94694A59961A2848B051F953BE51A30F900D0757DF65F7C99425322F27F49EB2032CF5209D2AEC3152AB54FB5CE711FCB77696F4E02AE51D750BDA276B0F8E39A540854EDEB9F7CF040F29785199E2152E62E25C53BE6834271EC90A0F7697126AB101A2AFA98F83E
+5B7B77FC
+B77FEC8591AB34A9EDFEE2A839
+FB365DE43A726DA77763737965FA643EFDEDCC9AB5A1
+B10BB121
+F0E242DC60AB7227B0C25A465E9F
+002FA79A5480AEF7
+B1FB89AB
+18F2437341067DC9ECDD1D765C12C74F37BCE07537D027B3E2A01AFBAE3E161CFB37
+0A0216FE165EE4069D779A7D72DACE7E7F6E234BEAC3798994E2C6F969326F541215EC59BB3A
+AF57E630814016421726AEADEB53A288BDE06C8E8D31B37A42D047
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0046 put
+dup 3 /C0050 put
+dup 4 /C0058 put
+dup 5 /C0069 put
+dup 6 /C0071 put
+dup 7 /C0073 put
+dup 8 /C0078 put
+dup 9 /C0079 put
+dup 10 /C0083 put
+dup 11 /C0084 put
+dup 12 /C0097 put
+dup 13 /C0098 put
+dup 14 /C0099 put
+dup 15 /C0100 put
+dup 16 /C0101 put
+dup 17 /C0102 put
+dup 18 /C0103 put
+dup 19 /C0104 put
+dup 20 /C0105 put
+dup 21 /C0108 put
+dup 22 /C0109 put
+dup 23 /C0110 put
+dup 24 /C0111 put
+dup 25 /C0112 put
+dup 26 /C0114 put
+dup 27 /C0115 put
+dup 28 /C0116 put
+dup 29 /C0117 put
+dup 30 /C0121 put
+readonly def
+/FontBBox [-10 -209 798 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684274C264E5F45F0286BD1B23D26C34626E07A
+5B039DB36C18005EE32CFA64
+906B285CB8BD7F0968
+D47F5242
+22DA29BB63E91AD86291368AD5
+A88A8B573E6EFBAA343D54E80F1886B6E63ADDE84119240E0B442BF2824996
+FA6F5BC7
+41125C64417312AD806FB91AFC
+16D82DEC4B8AF9280A31F07BA6E26893D28A501A95660A62DC78F63B875197074D7B446FD2F7DCD4EBAB2CCC89190FFD0C16F9B37A78310998E584FB6978CAB14862655F25F2E0CB0CE211D1F66FC3485032C411
+82DF0B9E
+7BF2AB6BD7D1702054BE49E6E2
+C27C0E78620612D9E1E891DD99D57AC02E32A6EDF4206742334ADD569D569D377533D343E6C86497E7571BF6BE2CAE74A7AEEF5A0CCC
+38DB562A
+C06486C456BC04A7FF6D562B4ED0
+40B05072B8689854FE82C7F624A417C4D47971219DB412BFE654AC71AE7D37EFF9929929A874536DD7A020F93C4113ACF1A1748B18B34080E566A7A52F2941E63DB134DD432828BBA5416516FA1567DA4C8552B17A3BF2695C57D23F178E22C288E673C44E04428B6811E7B8020B
+55738CCE
+D0E183FABC6C1D57E61E1B70EF23
+8C02844A7889B60FFC2F50A5A4E85D95A34FAD2E9B0E6109377553933CCD91F810AAA223FA2EDE0B9736621706C40CA1B3A99E031A1C88CF1C74DE8BD0BAE89325137797C72158F02209CA00ACB9CCB189E09FF86B4D9DFEBF407D3BEE7AAB15D825B65578AEF67E644B63981BCDD7F58EEEE623722235
+FC9A358D
+AFC8C19BDEF328FAD8197CA4A1
+14D09F0FF27680B547B6535F1168849785A74512650855BA4F6A9CC08C94BC90D3D2382EA543089DCEB9CDE3A3A52F61FF520BB6D88378628B5125976643
+B069DEA2
+CC62AEF6F31BD42CAEC76C7E92
+68E3BDDC9979658FFD7486A47279F32434EB1E82287B58443C4BA86DEB28C70F69E8FA7995F0C5D1DF60B184F21F121AE6F2D4BCA0D7DDD385496203A561AA02EE883A8BA04255FEB89CE09D8EE57541C568416F957FC244FDADC4AD8CA22C
+FA9BCA30
+CD95828ED8958E088D9FE70A9C4D
+007671558CBC547CE1FEBB6BFEA5A6EF7CF80AA3704017BADA97D520FD332C6A3B81F97CAD83056719BEBD6768D1CB01386526D30F36984C738B3AF5A4ABC28EF071A30EF675C00833CFCC8A197EF7C591E05601339B6B2429E1C9E689093F720BEB0D764DFFBAEDC1
+600FDD9E
+428425D2404A285576A81764CF5E
+131CE693B3BB941283C3EB72E84747ABE4266D857D06A7B667333B61C8700AAD29D94AA98B57BF2F60DB76C724E2D932B935F89B589CF4AF6F53988888B103391F406FEBEA3F9EB20550CB1981194E21C962D62E324C1DED002592DC2E117D2DE5846D2AA9ECB6E1D3D75999F9F44EF5A35598255963959626E04B6CCF10
+1804
+0399B747
+1F967A808C374AE5B4350EEE78
+C24BE584A0A8C6BBBBFA03476BDB6D06DAF776BDFE8BC8075E52C52411775092F6EFEDB3239ACFB03E9CF43EE03239F5C698D56723C069DDAA4520678C1986F18F83EF4F0C8E282714
+D975E505
+6AFA59B4285779E527BC8B7C18E2
+A7B55A71204D8F15C69FF1ACEC778B858E812BAE60E68599340DFA93E3601238A14C546E3308559B32DCA1CB86BED58680F15555EF1EA37C55A935AA10C7804B1F8C2495DA9DBEE20BFF1D7F87F9AA180AB7B936A6A8A0A0749DDEBDE90286D27BC2D88C12AC7539B331263193A5C7F484985CECEF40A27F07D2213BE87E
+9652
+09B10BB2
+07698EFB
+F280E75819C5BCFB7874A0D88A
+7F566883E1282B6F9346805913F79F9FA9F22A023674E0DF9005E37BA8D42D31D3F17D48A952A8FC9985461804CE98F551103B53C057C40315D72330B2DAAC68603619FC05348B299275551A0CE2B9CA62AC58C3A1BFF13871628CC24D7D
+5C639022
+3EE834AFE48B8D2111898E28BD
+BB4E975D3A66F1ABB827699F714ACBEC75AD22930772E0CF9F9A496C578D5C4E494CD9D1A0AA33851586399CB151C819F8D4CD43A10977476B0851F4D515578D4FB9EFADA3909663BDD6E907AE7616C250FA
+DDFA3BC2
+95292CFD9E1357E6FF2E3E20BBCD
+42F78C46751E5AE981706EA30620A3E91E76EF2BE3E10CA82AED444C490CB440D1A2CBECB675DA235294AAD355D7F4B4FD5F8DCB5F5CA193304206BC718A7100764D39BA1271725B19DBBFEF94255382DC23C3CE09EA0BEB472B57DF6B8E657CB2187E7B7243D4A490C0EC94
+772D8FC3
+C2F17846E5280CCBD7205570AC
+830F81D3FA06D6B66DE7E9508A59BBFD7F51656F9BA736DDF57D14E53A61AB3F2E2C329A7901EB66D763F6231306DE6CCBF9AFFE8E94BC0F9FB556A59F831610C56AC64D3B4AD9D512D0BE75639069FFEE6C5AC8306350F81D567982
+1F18F736
+299FA3A26D8B1ECCC6244C26ED
+6EEA47C357A8F2878C812EAD33F474ABCACAF333B15E5B3FC892A6E51CFA60CB93C4CB0E5F0054F9D452E449654D0D2258B2D69160231D36E83538F282A3C85B4BB62155D2210F3F070BF6690FBDE557917E4A478EDBD525F6EB1C453A
+564268CE
+30EDADD025DA83ECE04831A6B492
+4EB4F3D4318BC0A01CB908BF96536C41AECFCFADCFB0645BA6D6AC119740875A2E8AA3B7A71EDE61C787BEDFDEFF076726C3C56D7C0FB41FC5E1F4D08315A3DA6BDCEC4276E31CE82AE3441AAF87E800B02C099E75389F68345AB339E940261D01FFC2BB350C4D7056981BC1136D2FBAC7CDF8396C30F8CECF4159F00BA3
+F456
+8D5A092BBA61A90241767D6D4E0F9C52A12A3A3387152CD952B7EF1370DD63C7F80424D324
+49B376C4
+8569B94ACC535DB0CB99C06E05F9
+BEF1443C7D9A2AA9503419D2F07EA5A6238E7836C11167740050400E98A85E145F7B4CCCB8D7AE854368C47B961092E6E58F59BEC749C599992E504E349544269650B32834AA1A5AB103383D6FF3EE7F63A2FC708BEE853C345A8C44AA4BCCD098CDE1F9884F3E69
+DB52E7D7
+C9BA4DFCADAD98EB2A2D38BFD7
+4002ACCC1DBD57553B9533F37152758DFFB69F4916A47DC549FBC0ACF5338565B9CB265BEEB02D56DC6F48A06698E6FB1F5259AA74D34B089EA7CDC7EFA7D58B16A0ACEB32C4A6063AE82102EE99
+72557CCD
+CC65BB33B00F47BB9193E3E2CD
+CD5088764F3AFAF4FC18217C9E0CC81F269F5AEB9A7CEF4D17C8B85145B64D9975CDECB44B52363911A98D97BC2C775178E1C562
+2730514E
+167B806A5C8A42A278A6679207C7
+6C9999033BF63766F9526AD6C8B854E5ED1AAC24A3CAB9A23CBCA9D5CB4601A253E4931FAA4A930BFDDDEC6AA4A5633314FA35055C500DC8965338717674D06BB9FF9F06BCDE8EB8F5A1DD2FD4238B546EFC9A5C0858EA003AE6E53111A3D00E50BFA325BC1E21DEDECF0C1C17B94F417292C1D90C8CE1028A8AB6A5EB5F
+5641
+171B91B5E039964DF0F39BF4BA7D1B3599BB725C7435FFE2ED4FFC7F
+30424945
+AD896C6C1A6831BF28F7F660E826
+2CD10AA4F1CFAA3794EA46509CFBC23F26402F035E19F0CEBC0B3B6CBC36F24D8F77D0DA3611A6B35C1076D802BCE78C529EB0C82BCB38203A0A66246F5872BD110709A1A161C5C0175B58B52AE7E286A0438D5D887DA3C47EB436E766F21D9B05B853A3986B26
+EFAAF294
+2E75B0747770EC9BE022663B82
+E2544A6F40CC1D3F5106649F62A79C81B3CFDABF4D32094FDB71396D227BB30C4B9697AD61E8138857ED7859E082ABAD06B4AC5962A6AE98D43AA5579165D71DC747E73E56DD
+21890B5F
+2DDF9B4032C55A52393C9E1B363E
+F5FA426A8A745928D4DD30E54C763F17114F04C98E29A68A523CEE33E03847880A6676F0E04992564025338C20051472DC3A3E13C5DA113247D8A7F64441454FC57A6CF5B4C7F7203A6D5FB0C59B6AEC43291AFD56DA85D420867680FDE8FC1455CABD54BD812CCA1B61F1FCFFD629DF67
+BCC57B27
+988217BDDA826AFD6E5BF357C6
+5E46F471BBC5320A5198668B58B65484C190430FC877B9B5BA6F96832D4D15DFDC164148721BCBE05CD1482DBB7CF13133342E660C189A16A25303D975FC2532B0C05D01F7D9B99C1B6AB1A88F3744A2202D0C9F6D08A5AC5D
+7D33B32B
+7FAE2A2EB83422742C315B7E440A
+A3A095CBEE26578F5D61D2B064BEF6978FC7A1E3D61FB8B2230D710F50A9C72D900F22A7CD94F8BDA64E4A0847127814885E119127DFDB6F83C8AA35FA5539F4E2967A5A2501A968692992656F27710089FC7A966017B303D59F9D0AE523900EE2DC67A983AB1ACE2C9BA824641D2ED140147C353E8992BACB
+8FC63B6C
+1E184370D112265E6E9C7EFD39
+38553AEA148BF8C8B16586CCBA94018EBB38325E466B2EEB07551F8AF3A876E0276559D68202938E0A892325272D95875C20CF596A91115A06C312553E4399638A9F7F8E
+0C35D83B
+E381CE8B2B1CABF23014334298
+B97EA049001F8904EBEEA427618B3F18660750A8A565DE771304CCBC176D19D4F424E1D283169E19BE9CFA2A38CB2EA448578E3B5EA7032CC65F4737AEA2F954C3C57D776DAD6FD8AD0BD3D87385A62CEDB950B068926CF6C8726C
+8EEC393D
+E1F8B746701A72899A4D95874CFE
+D7C05171BCD3497A6C2AA6290010A15F66485BC8562EDC5BEFFCBBF1D262C3EC788AED97C64AEF5914659CD68935ACFF328BAB6494CA986EC65DE341D696C4677A07AAC6DBC63E85BB29240FF52F71AD021B2E91B7527E43EDD89B55E99FE232A34EA599D3E259CB4DF02EA19E6FABC18F6B6560DCF7B50828809D28301D
+E54C
+3A
+6089F82D
+63A828956C03D0D995D6E88FCF29
+C984876B6F1B5B8A
+49CBAEF9
+BBDB7219F5CC9CB5C5BFD1E329A9EADECC03AC817A01E882A3B4F2B89410EDD7F50E
+FCFF76281A7451E392C53923861B62E3059D2A8DE12CBBA6A7257F85D734E18152C54F49C81E
+2A06F2E5A904749B0F119C6DB33F3A11AD0A03EF6D434DD13E28A8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchi
+%!FontType1-1.0: PSOwstdutchi
+10 dict begin
+/FontName /PSOwstdutchi def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0046 put
+dup 3 /C0047 put
+dup 4 /C0095 put
+dup 5 /C0097 put
+dup 6 /C0098 put
+dup 7 /C0099 put
+dup 8 /C0100 put
+dup 9 /C0101 put
+dup 10 /C0102 put
+dup 11 /C0103 put
+dup 12 /C0104 put
+dup 13 /C0105 put
+dup 14 /C0107 put
+dup 15 /C0109 put
+dup 16 /C0110 put
+dup 17 /C0111 put
+dup 18 /C0112 put
+dup 19 /C0114 put
+dup 20 /C0115 put
+dup 21 /C0116 put
+dup 22 /C0117 put
+dup 23 /C0118 put
+dup 24 /C0119 put
+readonly def
+/FontBBox [-144 -236 757 725] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684269A711773B1F062EFDCE93198A765F8F55A
+6E9F60B43AD213B6F99675D4
+AE976E2319012C37B0
+302BEA47
+3B98CEF2181F487E60BC68223C
+A5F86E7A115CFC2AE9165470EAEC678CB0DB27C2BC338F2147E8CD552D1E42
+3812A612
+E3F98DB266B650DF66CA2583D3
+958E9EE0A0B63B7867F2268327D79DD9860D80713FDA4B82EE
+A74B55DA
+6381153753244DFCBD7DA2BAD9
+955F9061254DDC5A489077D97027245C05D94591F48E
+CE29B2F6
+0D5FE23555A0FE78128F1A64CDD9
+1A9718631B0CA99E469954D1736C63BC1076171D274B36E4C8E3BEF5FB9EFF35C6E47C3D0A42A70ABCD91EA5923DA436CD6BAA2E2EBF93D139D5B8ADBF4D3EB16A7D4A0A0C9A4ECF3BF4A6593BA6151291B34672DCAABC58E6B0A6A3F02B5001B3BBFCC7618D573E7E7B6B50C417E40FD1BD3E9BCD94BFF3755B9CFC53B8
+5865
+243074F954E234A9103B8FADFD
+00ACC4AA
+B7859A895242187928E9C3BCA795
+44B1A2F7D8A06CE14F279DA101AD412F27C2DD9166C4A859F2E88D42C8749F7826332F2B39D95AFE040F0C7A5975B15AA97DED5FB1E662985F7C91FE322B88491969165E64A7FAB8CE00F88F461870DD681998879E0C1F92CD29FA2A4CC502876B7CBB8E3AC6981301F3FDCA4FC5AA3C42D0D981DECEBCD14C6FE4431DD3
+957E
+B6BA1D881AEE1A83E5EE2C9F7069B1F0
+0B6D768B
+239BE3343AA73DE4EC8C466E8E
+7190803852418BBD9A90B75B1E5628D38172895FCCBB92372EAE79263C94906ECC4B80697A1F61CA8B4664E0EBA0713487080BEDD508BE2CB921A5E4E2467E250DE38ACD9A28FEDD95D4741E08EAB9A0BE2470FE4FE4EBEF8E89F2FA0543177E
+0EDB5F0A
+25F60E21630304FE6831BEF4530B
+351B697B5C7934254F1B55FE746B9387925CDEBF3DAB15BE2DE2E83580B63C7EF6383D6681E9B252054985DDAA91B731B136D2FFF4CC7366B44F11793B80C04A8F32F10CA835613823D82D9A9F4393C1BCC6347E146E6CA7A29E91ED0399CADA9B4888A41F4F28B8CF2DACF022E06E33B7988572CA3DCB0380223C0918F5
+9BF6
+F966E5E99E0698BCA0B332ECCCB097950CC731EF7FAC4D23C569371E06F5B90CA0D6725C87F225C66EE6F14539BD7CEB
+F8D0533A
+F5F750C58859172EBE961EC9198B
+C03CE04A81733BA0D3F66ADCD702556ED77DC60B3ED563B218E7CC67C3D71615E21BCFD9A47B707092110D5E67A2D5C2A521222833E3B6315A9BFD875670FBBEA5610A753289C721910F76123722A7C6324C6780C06B2EBC66951A0EAC56C346A4BCD3E761
+CAB98073
+CE511FFA322CB6090643D4799241
+3B4D7D1E498D0EE71CE1EFAFBB3AAB71984F58957C1F02DF28DBE6D4C9640A9C607AC6AF20890332D916B156C382D0F4EAFF795BFED7E423DA6AF6C11AF66167113EB0164C26330CB81497008209ACDF516FD2A64B92807FD5F0BD5657ECA6C62915B4DFB4A8B12E39F32682A930890653B32F3022E40C0EEA7FD1B103AF
+B825
+FA2DA4F6
+F8169B5F
+ACBBA0C833A918CF3428D2602173
+8105BCED0B709156ACA403D4829DC70DA0964D21C3EA7E7A3C11237BF1B058D8DA560961431B795103E7A7606AAA078DB3B25D956BDB5781D97EEB2B447FABC85454BECBF6E7E7E9B154A3F7B284CE95F8DDC8D99DDB121A6CBE20D881E98DEAF83874637AA5CFB09E437672219FB824ADAEBCD8C847F622FAC6006ACEC0
+46EC
+61F007E627B9EB0372468C82879C888A003900CAEA7810B3FE03745706109ECEDF1BA7DDB8940F43823A
+AC78344A
+110D2E7BA93154FC97C2CCDA4AB3
+9A27AE30D8E25C87A917AC66404E8D7AB9DB1F39B32E4C4B9A720EE2E31B883D896E7D0D62AA8DF10F904CCC07D61BFC01587E411113B12087833C3C3788A2F8473D7AA263AD170E1F1E284CDCBA18897B938F01D51B8D90DA53FBDD0CDAB53625CD7B3823871A29CBFE94FD85BE13055DBFCBFB491BDC50F9B325D428EF
+B7EC
+DC8B116125360C458F962944D6E0F301165104246F76F3B71F822C
+35EFFEBA
+D84563B6BB11E042A08C6FCA15CD
+098A1B0696998EA6B9385F831962A976EE9C8059828870CF3C393D9E39AE62782767CD410E516F96F8CAB81AB387DFC73FEA40803638072F2E00C5B56B0890156811FD4ACD5105462C7435D8CC64034172EC1F5D8102CEA613AE94F82DD3B4AA847C13C31D7060E9BE20D948BD725AEC5BDBEBC7E1CF17E295
+843DC060
+9A721D7BC4E86B758DE5BC32FE65
+8EDF08834B78AD3A039926DB08DCA517CE64F3E93127D02776CD9D476F0501ABDBB27627EFE5B28577F34785FB7834E7E266EE170D6C5112677C63D38133BCC4D56F7F8BC98DEDC97EA3B37D2A5F1C8A887BC8E47CFCDB1881C25F7DA475F6342ADAF13605CBA78BA3C6926D2A42991BAE51AFCEA83E923C4AD4FC8E7135
+F27D
+F1737FFA52195D36DA8F11ACDDCE9BC13285
+6A45AC9B
+CDDA87E843223CAF7B3EFDFA07FE
+94011A0B86AC32BC6C1E510062B2DA2F734B8B319D1F25E51E0F52BA7DADEF5C5AF50EA7F2C4468540DCBB0622F30D87B68CB4D63BF5197B88447BB709C56F30C701738DF6C8D3AC18DC4F7BDD0E2D4A86564F5707E0F298FD8C4C7CEFA5C8AE96FEA0BF7714B1170B01CB9502E4058F20537BD181EBBA0A78D91F148C65
+8187
+4DFA0075DF56533D26D72518E5C85864E8D91C8FA2196C218E2FE3479ED9798A9A82C6DDE5CD4F7BD2D7B3E0C8F20ED3149CB83E97DDD6E033649A90D751143AC92D5370AAF591BB2483DD
+9060815E
+4F40D7C7F22980AD0D2D05C19A89
+6203E598EFF7A8B638AA2B49EBCE82609D3FB8F0F9D909CE9B88632A7F556F153E3997334709CCCDFABC01C903E85D545A1AF26972493A849BB7A2335E19265B8F01C29E4C33E988E0EAE58EAD63F9DCD9076776E66F4DD682B0F3E3A88749519B33F5DE091BF4678678D757D48ADECC2906CE23954E2D0AB9479755F0F1
+8EAA
+A1DEFED82A8866560E81AB89EBB1E344036BEDDA4D84ECAF8B
+3504B318
+6C2F51C7DEC51ACFC884CC8A93
+D55990B09FDB1FBBAC644C3226E3F0155B27E2345050FC1C27B29AC60479A3C5CCB6B644D63DC4796343552FF5046623F048968C890BA5175F7D059588E667BFCC57F7C0089B587D82227DF30F4D08D721FC16AC5B90334335E0695BC5F5C8
+9B0CB60A
+88FD2381F55A915ECC5F0F0473D5
+983C86714C1A8ED7F22BCFD5BB20234A64E4693357B7CFE57267E5827861786371D572DE54A6D6E9A5EEF73B4279F94A9090F697D5D2B2502CE747C33A8B70822435BE5D377C8D1EDED4AFBAE521DF18F62F0271DCE118624BDE4D59C042C78FA0A4E404B70E1F4A34AA8E7D263C97BA533C55E31EB696BA5FFB988C2301
+3FCA
+A7BD88FCCEC0645DF61C455E986AE810943EAE114BA9A8BCA724CCD4D280B0E57C0430798815B70CDABC
+8EC91599
+9E0FADF1653C3FDDAFF9727A63
+2EDD250548807E34C7A7013F01DD3F1EAA52F8146A76DB2495CA2D60FB0A84F66AAD4BA157D1EEB3670157D978AD87837EB2579FD67107804514FAC39F75E255922AA6C4CC4226DB0E974CD52DE2C96A392DBECBECBE8D486224EB
+EFF0BFB6
+9F72002C6A0C5E0C566D81260345
+756E793A099D0B5CB81E29E76DDD033934329A7D773BFF97813A4387FBB4FD52FFF3F4D6351FEED6D7F84F0FD6761866829D5CEB88648B114A0E3C645919B9ADCF20FBD86B1B04E7F039A75E7998409F87E3CBD7ED65CFA66A4ED5FB76FDA409CE74B3D62A5E071A8AA7531D812420943E8616439B4B
+DE42F729
+1EB22FC2A2FBF82EFCC4FD57B0
+891FBA2EF0A76B49665B446D9D7B105BCB44793EFF49DED9A15ED203CF765E1EE7B8F6F98DA814D4E3F88656067E9A1AB781582343B05B48E33554680C6A606EFE1E0BB9791A9165B786952FC534F07B204E13EFBC9E42
+AFE2E5D3
+56945120B796546E5E316555DA1A
+22700A875B545107DFDD48A8EE2F3ECDC3520B38D8BD7AB2CA5AE1AC75B87033753866A879E23AE901E244D7AACF4350BABFEABC02A8BBE6511752F623000C699E2FCB90E9B54D7465E5E02450050235642DB933ECF7BE1BED29AC65830718C802EB14C72DA02B0BDF3D45ED734215931D736DA843D45C1218DF4E63BCD5
+B918
+2989C0C06791844E667A1CA66E4276358300D03BBE6EDF
+34E94565
+9A6DC02CDF1067C9572C41BCC1
+60FB1D79486867175555A3761C1AAEF8367F3B688C767392727863F95CC6A65828D616F8381619CCDE3262D0F1E600BBACF2A1FC9A11E5514DC38097025961DC9171568EF625543261376C10D4F6BB889F0A856F98F5F2224DB7
+5BC42A51
+F788AF2FD156C7EC710167CF3F09
+D11A879A9148BB28BC22247626EE4DC09C0370736B123D602DB66260639191A30B346A3A08CA2052CF297EAF2C3F0EC6DB5E609489FF96BD70282A803129555688C2608FD12F05B9D33166AED99894FA4B5BBC3F06793D0D1838CF2C3C0020F0996E94146026A0C79D3074C6E641B5
+A9A3BD9D
+D9519FFAD8246DF0D2618DF7D51C
+4905B01A3CAF220F
+126E3EEF
+552F3D9C4E04759D5EFB5D44FAD0033D650162424A8C11D177C90214410FEA765BDA
+34DE10D98849793C56F3BEC029B6FF4D740E0B91590DB2815DDC40E9F351989D78C010D5451F
+B516D041BAFC5114BA5A9139F78C7BBF010E319C2E6AFCB95A3906
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch12i 12.00 /PSOwstdutchi newFont def
+/wst:dutch14b 14.00 /PSOwstdutchb newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<16212f2b212d220a010f011021291f24281d2d2601222a2d0115211d2e302d2529230116212f322a2d260118> 2207 558 0 7384 -1 s
+<212d222a2d281d291f21> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<09> 9434 13385 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13267 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13267 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13267 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13267 3 7133 32 s
+wst:dutch14b SF
+<0a100e1c141817> 1271 1458 0 2055 -1 s
+<0003020007171b1c0c15151417120008101c19101a11> 2055 1458 3 4268 0 s
+wst:dutch12 SF
+<16212f2b212d22> 1271 2038 0 1980 -1 s
+<002b2d25281d2d3400222a2d28002a220020252e2f2d251e302f252a2900252e002e2a302d1f21001f2a202107001a24252e00252e002f2a001d27272a320025292e2f1d27271d2f252a29002a29002e342e2f21282e002a2f24> 1980 2038 15 9461 0 s
+<37> 9461 2038 0 9531 -1 s
+<212d> 1271 2283 0 1457 -1 s
+<002f241d29002f242a2e21002f2a003224251f24002f2421001d302f242a2d2e00241d3121001d1f1f212e2e001d2920> 1457 2283 9 5856 0 s
+<002f24302e002f2421001d1e2527252f34002f2a001f2d211d2f21001e25291d2d25212e07001a24212d21> 5856 2283 7 9531 0 s
+<1d2d21> 1271 2528 0 1562 -1 s
+<002f322a00321d342e002f2a0025292e2f1d27270029212f2b212d2207001a24210022252d2e2f002d30292e002f24210029212f2b212d22002e212d31212d002b2d2a232d1d28050029212f2e212d31212d05001d2e001d001f24252720> 1562 2528 16 9531 0 s
+<2a22> 1271 2773 0 1457 -1 s
+<002529212f2005003224251f24002d212c30252d212e002f241d2f002f24210025292e2f1d2727212d002a220029212f2b212d22001e21001d1e2721002f2a002120252f002f242100222527212e00> 1457 2773 15 8124 0 s
+wst:dutch12i SF
+<0309150703140913170d070914> 8124 2773 0 9137 -1 s
+wst:dutch12 SF
+<001d2920> 9137 2773 1 9531 0 s
+wst:dutch12i SF
+<03091507030d10091508020711100a> 1271 3018 0 2500 -1 s
+wst:dutch12 SF
+<00032a2d002f2421252d00212c3025311d2721292f0407001a2421002e211f2a292000252e002f2a002d30290029212f2e212d31212d001d2e001d002e2f1d29201d272a292100201d21282a2907> 2500 3018 13 9531 0 s
+<1a24252e> 1271 3263 0 1665 -1 s
+<002e211f2a29200028212f242a2000202a212e00292a2f002d212c30252d21002120252f001f1d2b1d1e2527252f25212e002a29> 1665 3263 8 6359 0 s
+<0000> 6359 3263 2 6456 0 s
+wst:dutch12i SF
+<0309150703140913170d070914> 6456 3263 0 7469 -1 s
+wst:dutch12 SF
+<001d292000> 7469 3263 2 7903 0 s
+wst:dutch12i SF
+<03091507030d10091508020711100a> 7903 3263 0 9132 -1 s
+wst:dutch12 SF
+<07001e302f> 9132 3263 1 9531 0 s
+<202a212e> 1271 3507 0 1689 -1 s
+<0028211d29> 1689 3507 1 2225 0 s
+<002f241d2f00342a300028302e2f002d212821281e212d002f2a002d3029002f24210029212f2e212d31212d002b2d2a232d1d280021332b27251f252f273407001a2421002e211f2a29200028212f24> 2225 3507 13 9461 0 s
+<37> 9461 3507 0 9531 -1 s
+<2a20> 1271 3752 0 1503 -1 s
+<00252e002d212c30252d212000222a2d001b> 1503 3752 4 3107 0 s
+<2529202a322e00161a> 3099 3752 1 4084 0 s
+<07> 4053 3752 0 4106 -1 s
+<1a24252e> 1271 4086 0 1665 -1 s
+<00281d29301d27001d2e2e3028212e002f241d2f002f242a2e210032252e24252923002f2a0028211d2e302d210029212f322a2d26252923> 1665 4086 8 7044 0 s
+<002b212d222a2d281d291f21001d272d211d20340026292a32> 7044 4086 3 9531 0 s
+<242a32> 1271 4331 0 1646 -1 s
+<002f2a00302e21001d292a2934282a302e00121a18> 1646 4331 4 3778 0 s
+<07> 3743 4331 0 3796 -1 s
+wst:dutch12b SF
+<06101c1c141712001c13100017101c19101a11000d141c1b00111a1816001c13100007171c101a17101c> 1271 4786 6 5031 0 s
+wst:dutch12 SF
+<12> 1271 5186 0 1402 -1 s
+<2a2d> 1394 5186 0 1591 -1 s
+<002f242a2e21002b212a2b2721001f2a2929211f2f2120002f2a002f24210014292f212d29212f050029212f2b212d2200252e001d311d25271d1e27210031251d001b1b1b> 1591 5186 11 7837 0 s
+<0700142200342a30001d2d2100292a2f001f2a29> 7806 5186 5 9461 0 s
+<37> 9461 5186 0 9531 -1 s
+<29211f2f2120> 1271 5431 0 1875 -1 s
+<002f2a002f24210014292f212d29212f002e301f24002f241d2f00342a30001f1d2900302e21001b1b1b> 1875 5431 9 5868 0 s
+<05002f242129> 5837 5431 1 6345 0 s
+<00342a3000281d34001e21001d1e2721002f2a002d212f2d252131210029212f2b212d22> 6345 5431 7 9531 0 s
+<31251d> 1271 5676 0 1530 -1 s
+<00121a18002a2d001d2900121a1800281d2527002e212d31212d07001422001d27270021272e2100221d25272e0500342a30001f1d29002e2129200021281d2527002f2a0016212f2b212d220019> 1530 5676 17 8361 0 s
+<212c30212e2f000b29212f> 8353 5676 1 9461 0 s
+<37> 9461 5676 0 9531 -1 s
+<2b212d22062d212c30212e2f0e29212f2b212d22071f302b07242b071f2a280d07> 1271 5921 0 4692 -1 s
+<1422> 1271 6254 0 1422 -1 s
+<00342a3000241d3121001d001b1b1b001e2d2a322e212d0500342a30001f1d29002d212f2d252131210029212f2b212d220031251d002f24210016212f2b212d220018> 1422 6254 13 7572 0 s
+<1d23210700142f00252e00272a1f1d2f2120001d2f> 7564 6254 4 9211 0 s
+<000b1d> 9211 6254 1 9531 0 s
+<242d21220c02242f2f2b0a0808323232071f302b07242b071f2a280829212f2b212d220816212f2b212d2218> 1271 6499 0 5606 -1 s
+<1d232107242f2827020d001a24210016212f2b212d22> 5598 6499 2 7802 0 s
+<0018> 7802 6499 1 7967 0 s
+<1d2321000b081d0d070012> 7959 6499 2 9048 0 s
+<2a27272a32> 9040 6499 0 9531 -1 s
+<2f2421> 1271 6744 0 1561 -1 s
+<00272529262e00222d2a28002f241d2f002b1d232107> 1561 6744 4 3478 0 s
+<16212f2b212d22> 1271 7077 0 1980 -1 s
+<002e2a302d1f21001e252f2e001d2d21001d272e2a001d311d25271d1e27210031251d001d292a2934282a302e00121a1800222d2a2800> 1980 7077 10 6802 0 s
+wst:dutch12b SF
+<111c19020e1d19021319020e1816> 6802 7077 0 8156 -1 s
+wst:dutch12 SF
+<002529002f24210020252d211f2f2a2d34> 8156 7077 3 9531 0 s
+wst:dutch12i SF
+<080d1415031009151811130e0d100b03060910070c0f05130e14> 1271 7322 0 3707 -1 s
+wst:dutch12 SF
+<0700001c> 3707 7322 2 3986 0 s
+<2a30002e242a30272000302e2100> 3960 7322 3 5193 0 s
+wst:dutch12b SF
+<0d14170c1a1e0016180f10> 5193 7322 1 6310 0 s
+wst:dutch12 SF
+<002f2d1d292e22212d2e0032242129001e2d252923252923002a31212d002f2421001e252f2e> 6310 7322 6 9531 0 s
+<1d2e> 1271 7567 0 1457 -1 s
+<00342a300032252727001e2100232d1d1e1e252923002f242100271d2f212e2f001f2a2b34002a22002f24252e00202a1f302821292f001d272a29230032252f24002f24210029212f2b212d220011002e2a302d1f2100222527212e07> 1457 7567 17 9531 0 s
+wst:dutch12b SF
+<08090b05> 1271 7901 0 1866 -1 s
+<0400> 1870 7901 1 1975 0 s
+wst:dutch12 SF
+<00172720212d0031212d2e252a292e002a22> 1975 7901 3 3568 0 s
+<0029212f2b212d220032212d21001d311d25271d1e27210031251d001d292a2934282a302e00121a1800222d2a2800> 3568 7901 8 7972 0 s
+wst:dutch12b SF
+<0e1815021319020e1816> 7972 7901 0 8951 -1 s
+wst:dutch12 SF
+<00302920212d> 8951 7901 1 9531 0 s
+<2f2421> 1271 8145 0 1561 -1 s
+<0020252d211f2f2a2d3400> 1561 8145 2 2447 0 s
+wst:dutch12i SF
+<080d1415031009151811130e0d100b03060910070c0f05130e1403> 2447 8145 0 4941 -1 s
+wst:dutch12 SF
+<0700172f24212d002e212d31212d2e002a29002f24210014292f212d29212f00281d34> 4941 8145 6 8021 0 s
+<00241d3121001f2a2b25212e07001a2421> 8021 8145 3 9531 0 s
+<362b2d25281d2d3402> 1271 8390 0 2179 -1 s
+<002b271d1f21002f2a00232a00222a2d0029212f2b212d22001e252f2e00252e00222f2b071f302b07242b071f2a2807> 2179 8390 8 6280 0 s
+<1b24252721> 1271 8724 0 1817 -1 s
+<002f24210029212f2b212d22002e2a302d1f21001e252f2e001f1d29001e21002b271d1f2120001d29343224212d21> 1817 8724 8 6049 0 s
+<002a29002f2421002e342e2f212805002f24252e00281d29301d270032252727001d2e2e302821> 6049 8724 7 9531 0 s
+<2f241d2f> 1271 8969 0 1630 -1 s
+<002f2421002e2a302d1f21001e252f2e001d2d21002b271d1f2120002529002f24210020252d211f2f2a2d34> 1630 8969 8 5437 0 s
+wst:dutch12i SF
+<0003111215031009151209130a03141307> 5437 8969 1 6784 0 s
+wst:dutch12 SF
+<07000018> 6784 8969 2 7076 0 s
+<2d2131252a302e002d2131252e252a292e002a220029212f2b212d22> 7072 8969 3 9531 0 s
+<32212d21> 1271 9214 0 1705 -1 s
+<001d2e2e30282120> 1705 9214 1 2527 0 s
+<002f2a001e21002b271d1f212000252900> 2527 9214 5 3914 0 s
+wst:dutch12i SF
+<031614130309150703100915041209130a03141307> 3914 9214 0 5600 -1 s
+wst:dutch12 SF
+<05001e302f002f24252e00241d2e001e212129001f241d29232120002f2a001e212f2f212d0021282b241d> 5600 9214 8 9461 0 s
+<37> 9461 9214 0 9531 -1 s
+<2e253521> 1271 9458 0 1607 -1 s
+<002f241d2f0029212f2b212d2200252e00292a2f001d29002a2222251f251d270013213227212f2f0618> 1607 9458 7 5386 0 s
+<1d1f261d2d20002b2d2a20301f2f07001c> 5378 9458 2 7036 0 s
+<2a30001d2d2100222d2121> 7010 9458 2 8020 0 s
+<002f2a002b271d1f210029212f2b212d22> 8020 9458 3 9531 0 s
+<3224212d2131212d> 1271 9703 0 2103 -1 s
+<00342a30002725262105002b2d2a3125202120002f241d2f00342a3000281d2621002f24210029211f212e2e1d2d3400282a202522251f1d2f252a292e002f2a002f2421002e1f2d252b2f2e07> 2103 9703 12 8923 0 s
+wst:dutch12b SF
+<07171b1c0c1515141712001c1310000d141c1b> 1271 10159 2 2890 0 s
+wst:dutch12 SF
+<17291f21> 1271 10558 0 1757 -1 s
+<00342a3000241d3121002b271d1f2120002f24210029212f2b212d22002e2a302d1f21001e252f2e002a292f2a002f2421002e342e2f21280500252f00252e0029211f212e2e1d2d34002f2a001f2a282b252721002f242128> 1757 10558 16 9531 0 s
+<1d2920> 1271 10803 0 1608 -1 s
+<002b212d222a2d28002e2a2821002120252f252923002f1d2e262e07001a24252e002e211f2f252a29001d2e2e3028212e002f241d2f00342a3000241d3121002127211f2f2120002f2a0025292e2f1d2727002f2421> 1608 10803 14 9531 0 s
+<1e21291f24281d2d26> 1271 11048 0 2284 -1 s
+<002e212d31212d050029212f2e212d31212d05001d2e001d001f24252720002a22002529212f2007> 2284 11048 7 5584 0 s
+<1a2421> 1271 11382 0 1631 -1 s
+<0029212f2b212d220020252e2f2d251e302f252a290025291f273020212e001d00281d262122252721003224251f24001d2e2e3028212e002f2421002133252e2f21291f21002a22002f24210020252d211f2f2a2d3400> 1631 11382 13 9138 0 s
+wst:dutch12i SF
+<0311121503> 9138 11382 0 9531 -1 s
+<1009151209130a> 1271 11627 0 1868 -1 s
+<02> 1864 11627 0 1917 -1 s
+wst:dutch12 SF
+<00142200342a3000202a00292a2f0032252e24002f2a00241d31210029212f2b212d220025292e2f1d27272120002f24212d210500252f0032252727001e210029211f212e2e1d2d3400222a2d00342a30002f2a002120252f> 1917 11627 18 9531 0 s
+<2f2421> 1271 11871 0 1561 -1 s
+<00281d26212225272107001a> 1561 11871 2 2656 0 s
+<2a001d2e2e252e2f002529002f24252e002b2d2a1f212e2e05002a1e31252a302e00281d2d26212d2e00241d3121001e212129002b271d1f2120002529002f242100281d262122252721002f2a> 2625 11871 13 9531 0 s
+<252920251f1d2f21> 1271 12116 0 1991 -1 s
+<0032241d2f0028302e2f001e21001f241d2923212007000f272e2a05002e2a2821002e342e2f21282e002d212c30252d21> 1991 12116 8 6535 0 s
+<0020252222212d21292f001f2a282b252721002e32252f1f24212e001d2920002725> 6535 12116 5 9461 0 s
+<37> 9461 12116 0 9531 -1 s
+<1e2d1d2d25212e07> 1271 12361 0 1948 -1 s
+<0012> 1948 12361 1 2113 0 s
+<2a2d002f242a2e21002e342e2f21282e003224212d21002f2421002d212c30252d212821292f2e0032212d210026292a3229002f2a002f2421001d302f242a2d2e05001f2a282821292f2e00241d3121> 2105 12361 12 9531 0 s
+<1e212129> 1271 12606 0 1710 -1 s
+<001d20202120002f2a002f242100281d26212225272107> 1710 12606 4 3793 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (6) 6
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0034 put
+dup 3 /C0036 put
+dup 4 /C0040 put
+dup 5 /C0041 put
+dup 6 /C0044 put
+dup 7 /C0045 put
+dup 8 /C0046 put
+dup 9 /C0047 put
+dup 10 /C0048 put
+dup 11 /C0049 put
+dup 12 /C0050 put
+dup 13 /C0054 put
+dup 14 /C0058 put
+dup 15 /C0060 put
+dup 16 /C0062 put
+dup 17 /C0065 put
+dup 18 /C0066 put
+dup 19 /C0067 put
+dup 20 /C0068 put
+dup 21 /C0069 put
+dup 22 /C0071 put
+dup 23 /C0072 put
+dup 24 /C0073 put
+dup 25 /C0077 put
+dup 26 /C0078 put
+dup 27 /C0079 put
+dup 28 /C0080 put
+dup 29 /C0082 put
+dup 30 /C0083 put
+dup 31 /C0084 put
+dup 32 /C0085 put
+dup 33 /C0088 put
+dup 34 /C0095 put
+dup 35 /C0097 put
+dup 36 /C0098 put
+dup 37 /C0099 put
+dup 38 /C0100 put
+dup 39 /C0101 put
+dup 40 /C0102 put
+dup 41 /C0103 put
+dup 42 /C0104 put
+dup 43 /C0105 put
+dup 44 /C0107 put
+dup 45 /C0108 put
+dup 46 /C0109 put
+dup 47 /C0110 put
+dup 48 /C0111 put
+dup 49 /C0112 put
+dup 50 /C0113 put
+dup 51 /C0114 put
+dup 52 /C0115 put
+dup 53 /C0116 put
+dup 54 /C0117 put
+dup 55 /C0118 put
+dup 56 /C0119 put
+dup 57 /C0120 put
+dup 58 /C0121 put
+dup 59 /C0122 put
+dup 60 /C0127 put
+dup 61 /C0262 put
+readonly def
+/FontBBox [-25 -256 920 766] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842247DA7FC91B9FEBA82925C7B7A9B0D22DD1
+7C0E9A7093608F1410546F00
+09F98531B5959B588C
+79CC3103
+04952A259B81E452111B161889F2
+3347D5B60BCBEE9DEA320EC36F8F8E4485C03CD6EEB3F882180086CE0471E1CA1A4F2EB1D79854FAEC9E095FE26CFBCA133E36124CDEBB7D8A85300AD1F0F916EE730CB9C210361B827FF637510A47A20B477D6788D0C4E48B1195C329378AA1D8574A6FD6BE84
+8C1C7C8C
+88054795FFE7D8388BA5324A41A2
+C2E98854954C2F9DA3C70D12E2F90CBB8E7A26AF605B104E4245BD51E585C69953D726BD3CAB51EC5F1A47FA287539198E81854D4F96E6CEE2A936FA2968BF327C3A198D1A59FFA173092B674F6208BE70A9C3F88BC9B3B53C670F9D8921EE9A5650C9E21E8FE3F07E7871F759F807A91E47DCC0FBFB766054CA1BE2CD58
+FDC7
+7F4BE1D1CBBACA12C04463C6
+AD34E6EF
+BC59EE09DEA06F016EC0255FDC
+CE0B208F6BDD63519C341761D949777A3EC4C899873DFD2DCF3F5F7FEEB0705F8B11BBE4631B9B59DD69F4C8BBED3E2DE2BA46ADC0D6F51294283DEE153C8EC5
+3670C2EA
+9AE8A0D1B2B6BA27AF73030A9F
+3040C92156C91AD44008802B9F70A1F5DC2E85BCC3174B033F4F5AC0076A783E990FD2B296CA1A157A78F02842F576687C38063D6CBA84D69870B115A31F49
+2A39A850
+CB94006B55165E0100A567FB66
+A67AB2E9E853537508FA240B1EDFD6120549F6E8FF2CC5919980386317C66D6182A342C3F54915EB2E4DD3EDD2CB1DBAB1E505366B947A50D4
+B934090C
+0D8A5E874303E0FC34A8962EF0
+DB618EEE45FFD5767ACE93A0B06AC0CCA79B79A2CB41C0
+58CBD7B7
+D4EFAE7B388F90540547C2A607
+4B263DFBAF0214BE565842FE8CF748A878792281A597ED26F02713C274627C
+61F914DF
+F17836686BCD68CA0110E0F50A
+FA773ED0CC8058672CCA1B83B42CD233DF4A42E4011DADE8892E3AD1
+772D8FC3
+C2F1784797F6584C0BA2C2AD16
+9FF342667B4077E05E7821B79A408F9330D572820F443E2EB1B7FF2B5C7B9371BEBAF246ECAC2CDE2B1C20A2E7829F3A727A6C16C5A90FCB16C780CF0C37785A1E32FBF360F71D40E779
+0A57937A
+A11A7DEB9DD813B81AA26B393A
+98569E59227826A4CCCDD1BF59AD2F9E02E6416358B9EB0BBFCEAFB07E70C1710E7DFEB4C8DA604F95813FC28B14C0A77A20A518A3CD571AB9F1CB932CCBCB
+434BEFF7
+5D3A15DDDE22D51A0694AD4A2D
+AACA192E30EE5DF17E495E924EC808546EEBFC93EAEBB4B3DCEE5981009AD393EA692C2BE16FC5CA9356AB13685E1F208E3A6A07EF5A287B0CCABA286FD6F42F018F47D72329C6857FC5E31470F2122EE590BDCD7B9B4E936B2C
+70B9D389
+05C1083E2AC53752D75664EF1F6F
+3A8F40FC9094F9FE9F39A1F650F795B0654650B44FAFED24BA99B148194A8E0ABA5B2BB75E07D0CCF1C2D9B538DB822BA6071C45BE5BDF4F5ECDBD6FD8B9BAB90E17C427D08798291E29662466F22C04BFD0CA12987C3DC4EDD73E8D6F32FF4FD19E394A
+13585AB3
+EAC7E6A16A0F9199183FCAB6E4
+0E485982E0B4A31CACEB88E873E3DA70B49424DD0047692FCF29CF2A23325A050D91A726497F395B0ADA544B312873F060AF0966FCEC
+33E5D360
+218FAF2DC0EFCFE61AF3E318B9
+83E57668F27CD511CFA75140DCDE358E090016153B0EBFEFF4046130A7460E4F4DB159E0C2C59625EF
+4C5191ED
+8FE03EDDA25E2EC971CD3EF178
+20F028D3BB6F1A31128A480694585CE3D9D1FD2F2DE056CC7D091D19FDFDFE79F88726D8B1CCB1
+B887388A
+25CD84EA9A6B528CA835FE346818
+6ECD90E27CF940B572C1EEC69606FFB07E8252B91CC94158C2DD8434AA90E0F928DF07BC89EEEA7B423F7B8407498BE06D4D7CEF16C7E4A1EDD8667DE27290B0C1FC74B48DE936411134780CAAA7BDC8C6629BB3C8216C670CF6308706AE865D3C7F51344E8B583D41FDDFF9AC4875B706BAA0
+EA4A2484
+B476D1235396513D4608DB9F3E3F
+BE084A2D4404E834E9DEB7E9B8CDCF37059F2D9ECE70E3401AC979CC71B864E7337F02FC28E1D5E20FD635F3969311948FFA318C8B025DB7A780E6AB3246F744A298C7D327146E275B92494CFFA02D22D97BE2BC7F560DA60D7DA900BD23FD4A51C6A169885198A47179637A3853B077B54048DE7993A07D323F0B0CBC97
+955D
+C0
+E2C7E3AF
+FBDF7AC26C10E8D04C9CB20A61
+7275B4BE0011F0C1118B2E87E5678EA31B9E509116CF8425F50DCBCF32613AD830B8B1DCF0CB07BBB50A5D43A40E25403D50621B6943A73D45837F79A8866C096317E3294900CAA8A74C99D60505FE6BCA4D244BA1F20E9623C447AE645CED7F3F
+7F60F55E
+28F2B41BBA0824B7714C205294
+597B0938E36441DBAFEEB432125A949F108BE1C1AA29063E48FE2031CE88C5AB0BA66AC672963D35F922F00C1729907DEFF8FAEC37EBE5B86548C12DB0EEF9E15EBDFD611F2C5D1AEB7950514F35293AECB1836A51AD9531FD41005DA80FC87BB669A1
+DE4797C6
+144A9EA221BB2820F691635CEAF7
+533AA8845FC3EA06F67CBFBB43E71B40EE05B99295549D9E35A4FC6A3B1FD0CD55FFCE718656774FA3F7F7352F2A59E8A53CAFA4A50A2B49D0450B37292472C167A76F3531A554645C7730F2ADE022D4386F9E7D1703793C294AE83ED46A6DDA41DBE4E7B37F2F5BBE3F658ABC1872164D69923A534BE1203CB9A0E0310A
+63E71A29
+4209452E9850B2D698B63A67B51A
+E8B12E5B4E776562DC71CB3620ACA3B879D45C37A2F6DA5CF847449939DC9957F9807FAF927C0FF5774D336D387A1E71A090C7637324CD22FC749CAD5CCDBA45731EB84C1B546FC4AF60ED1E1ED7E089AC27F8AD00D60AD1A1C2C7C8A9BE550A28A426E7A036B8C6A08AF7D637C762370F6142FE2B31BE0C4D23
+29171DFD
+496043B20F32710B6358C1DFC3E4
+4012F882B796BE6B9E86A97C20C663E0793C7F5D16055184D01293DB9C41BAE75992C61FF482DF14015E13415CA917B3932702F1582B86C480484C149A5CF1F4F03B34F3CA746BBE380B89E4401B43841EF3134A7B22DA62E957E402C5EDF24546597EAB7A6D6B449E9FB81A05C79D918E83C7BFC81537866199B774B70E
+864F
+878D1EF23C715FFA6ECFC6
+05E2C26A
+F78BE5D0B00B56217E03EDE66E
+6557E7BD1AA208072D8C60C55F483FC5AA17F21D7D3FB4DAA347912C63B90738C302E8AF40F45E6DD1E1404BA89D274D7D9FFBC27136BB76FDD4BC
+FD598614
+E071837C05F1CFFB27FB5B4CCA82
+5DCC6DC5DF309BB0FADBE9D1274A0734CD85BF99E04E566268C6C2214618C6BF145A564411F49F21E5872AA58A6580DCB9F370802CDBED07E60536D17AE3A9F45229512FC6C278BE393BEE218FA5208F13BD6BEE7827A551CEE708357F49AD9ACE3CDBE26EA8D38DF66C8A056837A3
+6D45A3BF
+1FE631AD9028E8AB5209E83E33
+6BA0A926D2962ECE6302923D45180E445D61D12B235664E699D1BDF2D9ECEECEF731F80978D08EA06858FDFB0E11F6FE40D8170EEEF2A973EE094E77641FD4071FC00BE5C4D786229D970DD1706DD4732B6341A78C465E8900EC90DC
+A7C9A8BF
+039F75B7CA4CD98AAB53C403EC
+4BCD0B756ED658636A7600707422180B5ADEF7C3E3EC8F976BF3DA29EE80380CC7131AF487FA27191820CC1BEB07F846CCF0F7EB9F2B17D291A95B5B30B5A9ADB57E6FBC2FE6999C6F3FD65806159C7A261331
+90745B82
+06F1358548B85B8329701B7423FF
+43EBA4579003890D9ADA19EF71F4A3ADCA2BA1EFD7611E3FFC9308740923A16569FDFBD392EFB8EDF13320BC8B6AA9254F1FD79848B0C95C40B78FED2772FC2279E57DF0A070E0D967F7DF90346F1D06516DD309BCECE61E05E20D93EBA0BA7D58228AB26F4CBBA61C19
+E0E97FE1
+6841503BDB698D6701B09126E617
+9FF4C5DDE4AFBA7DAB5D091EFFD1B5D9D0D45BFF38E6E3ACEA4A5E097CF633EE809F0A6F01713F80B7CE2B85B661E457E24BF5872377D0B722A91D95A15C424015A3A6C0C1A6F4D86E5629F521F4839E6E5929261D4DCFB35318947681E8636EF3C614F1054467C8F6F11EFA7B6FFE74F83ABB6F9F5518B4F79B80F65494
+1CC2BAD3
+B15BC11F2D1547029C949C106FFC
+54EFC06FCD2399169D48BD6FB2DDF4F8F63AE9B347CEEFE898F3AEB2ABA53FF95380B4156A92D9AFDADD7087D6B720F68DDCBCDE9BDD87423CAF652D4D9FCE2E6767B9C9EFC443CE4797C18EF589325A5F1736887462BA0CDD0B6F0A2300D86690CD6CBD226BEC638ECF27A6522C0614FE017AA995B88989219C466788D8
+7E4D
+3A1E4E
+AD299734
+96255177AD38F395C46EBC444E
+CDA998E7E499B89E5D8DA8B1EACEFF6BE72990B84B3F0B81D422EC14C31A13F8656BA7359430B9A32BE36E638F97687845771E8B6877FB0339388BF8196AC3760609FCA4F5E666155F8C0949E4EEE50952
+4FA7B3E5
+B64EEB0CB4815129BDEDBAD5B649
+4BEDC9B96D760CD98BE3820D00692CA6E3F50834906B2AE847981D703E80A66790E1869BF7711A0ABEBA651C1E3BA075EA079E4A957548A93F0434BE709E936B727EDCFAFD853C73EF41144A108708DF704FEB010FBCBD1EFA67DE3870E73036B31B0511
+473B578F
+3DDF36F7C67A2F31E4DE517463D4
+0106D9B73B325E02A17AE3E0AF4DC2D0977B78D69FCDF3349A2CCC609150642417EF3927B623B78169F70FB0F2E082129609A9B9E9124CB8AF042EEF27B3854065A3DC12FED74048940FE1666BD2996D1BF5DB7FC480EDCF27E3E218B83CE220EE8E864352CDDD569D7876E614BA2C62D09B3D781C16EDD4A620E6552546
+CFB5
+95E1FE80D1B2CB1FB10F67813FCF9FD66F0720BB88B6FF6BD9AFB7B0F077AA428303F0DF33EE23
+831C9CB7
+4B2B6A35CACA0BFC16C5DC5DED
+743A7ED49E138455BC995C3F69065B4F42BCE82065BD
+43FDF9E3
+0ED2CB38492A0BE58750AF15E6F6
+6D5889AA8BAF6F44255B8BFDA0E12CCA6D4848A700B7ADB0CEEC644F2AD788FD27B01509C97CEFAD607ADD6B1F55F9D968310B288EF173F7FF94B657952F71D896AC3A158CCA5469DFB4432F93012EBAFB4FD20DF10EF645C558FB1DE7E379C8C52331E35316D08D0B2C7B9A7F0A10147A5D233568DBAD8347E7A63C0B1B
+F30B
+72253D
+35582262
+9C76DA965AE5E42C039C740446
+C3D311F79C573079EE790A22B96ADA600E708126FC6CDD08CBA8D743C3944CF8343E07C585385AA59340001F33C874F19E0A10032297827F1D217772F0C7EF0364AF28C65422598F99DE1B009C66F809E9EF2A2622D5B39F
+5C7FAF43
+3B6996E06DEF2F09C5AD128A62
+475A39458A3A01CC72EE4CF7D4FAD46AED5EDB9BD7609FB4172CBD6CCFB7B8B92A3579496E9133D0BF70F732BC8689F6D226F031AB497B6C006E8950C0A6D59DDAFF386DFAE37FE399C6217D71FA6ABF8EAD
+012715D1
+9FAB321516A26332D541AFBDC3C6
+DA722ECF34542EBE20861B9E6EC42966028439A7DB3B85799471B184D666827C009B9146722AD04DE686E1B59571F3C9D64A5E3CBDDB9028B0D389DC00B9325E1579CC9621A13AB4BBAD454871685A39B750AF51AD7C7C25933CC03F7328E7627AE4CA6003B3E97D5EB9138B1CA6
+60A086B1
+B35633628B1DA36BEC774A65EB
+9D4782B0033D19F35A6A045C2EDB7E8BF44649A1B951E4AE0B6AC17007C66BAB6F3631A455D5B335F8D6459352D4B634235D68F50B22780D18ECEA97B569228C168FD53E5DDB8FED7D0B574A93DD9AB4FFA0F898CB58C8284A
+7584044A
+F095319F831AC8E7B6080089A0
+9EF7487CCEFD2E8959BFC4FF53F2CFD1C7C40B7A4D8EC3FB2D8A4050B8359252B485E2832B95F5E22FE164E8DB2517B25BBFBACF528E2B3BA8E6D33D13FDA1FB18EFEE0B25E7C00DA0194E55B05E99B57169C8AA5EEA61AE282D14B2
+4E7A2A9D
+5D1923EF6A024A03D6287938562B
+2203565F4608B2E000E095AC5441FAE2A35B13FE7EF291859A49F42F0D35C178FAAF64B74F798B0A298592590C1B0C62A1AD017589D3DE681AB119F2B427BB4247EE679D51C870EFB9B82EB4691904EE41D5BB33075DDF4B5C38F687A384F9524F9F2C87D7E624D01ED1EB69FD2C38211D893930FDA125946652FF2410E0
+D3E7
+B02C15D26CA581B687F35D111C6C703051E759541BD3DA0228FDB8BABD27B11CB9808B79D63220FD60332A88C677B4
+1980C73F
+50D390CDABF42D9299D0574B0504
+3CEDD701F4402EC219B25247D7C2AB18E3F56317AD6E6462CA67B57B9CEA82F92E119669289FB97480B2978DEAF68E35C79A7E171371F3BC922FF884467AA3C7E4545F90226922846D66BCF048C6C6D8E1537B3E8FB2E63E8E446F7526D61E7C82BD8D901E7CA6C631C19140B9
+FBD5DF35
+398A3F8A71FDC0CDAFA02E4DA5
+335ECFFC02723EC97DC4D7474A1E0E6452F88DC0BB8E88990963BDE49CE30EA9E8690D55BC4E619AAC87C6C855FA4DCF2A0973A58B7CC3486BE8AA7086C6102C760B8CBB8A5B06695AD55CC048870601
+BA50885F
+06B3C2D77E4EFF9C73B86E4DD3C7
+51E3FD6A3AF6E5CC2A74CFBF6E8F801D6DDE730EB40157ACF25914E9656F1C8F7FCD72D7ADDC498282D2C5DBA511E985E0C8A7750D582A5253BEB1498B40955D3D534B604BC44FF40961B1DAF3032EF1C54AA07D234AFD15983593405619D7768FB99C0A2483082A25EE3A6BCECD2562D45C195E0F8A4EB707E18EEE712A
+BE4F
+1367F070EF7B9FE1C47D53B2BAF37D71B872EAF41C70995A727D487389B1A23EC11088
+C3B1E315
+CCD831C1E8DBB8CA5E62D185F0
+51EC5EA76AB44ABB763E834649EA06A06BA537E06FF2C0C70F260468D2435F615F3241CA96C211BBDA47EF440D4EBAA1912BBB13ABA5
+CEA82E8C
+45E23315154F35333316FE2B9E87
+2DD99B668C118DBF3445FEACD98329F926E7AF2E9B6149A4069A44FC1E8FE9CB87EEB494D4709023764A9309E24DB2FFD535340A933A5A765A6BE2FE39DFE902214A81FC22DFA5C45663DDA03D8A1A7663DE42AE42DE5330B4733EA988DE5F2BE45A77B28DA263D40E90C42B63FC6179C10F2A7E52F62D2CB874BB8DB6C2
+FB76
+4771135D7714FF413B7F1E8AB382B2B913AC9387927C865AEC1B81F397F085
+A72C30E1
+2956E342AF6CDC7BD39A4C660A27
+F619ABC04AD32B12618B90E1C43B0C3B4026AF632A3EB49D14C0620664B7D19D8F989BCFCD250D7BA20ABE0E83FD410DE74A7D1DDA98CA48D816C321671034A3C41AA73B0CBAD41D2DEEAB7A2A56E8DC3F3AD7653FC61766BC407B202C88A1BC19208312E60C5C626EA407B4
+C305466C
+94841BC71F46EE936701C7DA9C
+846205E582FC84A070D53E48985892E0BBC158CA2AA1715D016AF6E7245CB2B3944A301308753EC8F9A095C4D9B447C9B1DDC60476E58B40F68639FCA26EB739A083217D60A3
+AB2E30E1
+7CEB95ED67776F2EA6A76FC6D10A
+F305373E85747D5AF2486DD949F76C179B858F1669661DA65822D6B34BBAF2AF3F495294ABA91CD4E48985C287B4BC49C698487B46D3358C23B71039A92CD31E0037E67C29D87623EAB1938C6D0A5E3931002EDA0743137E35F307774D9BF8BE7B7E28425EDCC1EAE06CB1FF66CBD6E2F5A9E2959F3425
+B32F787D
+FF0310664D966A5A5EA467EC7EF8
+F34D00DFBAC99D48B5DE39430EDD9B334B8168D7EF55A5F5C11B38812622415CF8F6703F5508826B92D4D1A705A54D6A3F8B4C22453AD61E5ABDC98ACF902772EA494917CF952C8139FAF918CA081893947C80B46479B767127DBD8E947156898D8A818C8EDAEB28962F
+EFA8F7B4
+BCF5A00E74EE39E6F0881E4C77
+381AE42DDA53F2C1F1BDC8CE6EA03A14809B7024EE25B441292847EC1EFF1AC3B4577BE36EBB46C289B9EE3076E5160174C03305979AB06FCCB529B3103EF4D41CC689E84321B278AEC2DA202AA9F53D9CE26EB0A19B29
+05AC6B0B
+50C24D9399A98BBA8EC5D53EEB44
+0910361E8AC2B6EA45A167E28C3EF8C556610066EC14A3D0778D4940AB81CCBB2C4E665EA11623A4B1CB6DB390982E5CEB29172CC933698134D6A6AB20D89E49747EA59677E0DC1EFA47AA6FD07011FA48ACB8091C378E3F425BF579AF5865ADA8330F33D81D29DF2A1470C6F27B3252787C926AAC40448273DE4021
+43A94523
+A23103EDE813E045897A57EFDD
+6BABBB2BBE157D1A2D53018C0742CBB6CA67FB0EF18266EF34A0AFABB4676195786815A68F5D6544B1AD18F58CA681084DF362F02ADABF4EA1E2CBC2B28C81AB1C96C74DE2
+6164F5AE
+382B7492870FE23A471E65E65A
+8ED13E0AF6508A5D4C998BF9A82AC92C3B5069B5AFB7249567A6CDDCBB9214D2BA89213D6D1F05AF8EB9BA2FE1BF224B92F5B452D4612C9F3783FF719DE2D3A096B444619F68A23AA41277D680631363EC40DB8EDA5F3F869D8D9BA4E4EF95B288F1
+D24C3E24
+799E1774B54103F78233B5A321
+3250E4B4E325F4DF074A467999EEB7E2173411734ABF30FEEC661A0BF3EDC938476868C9A4FBAE02D7D06A7169452A370A1B867838DF2C9886FFC735CC84A30F7763B2E3BEB9EFC444981382E981BCDF20095AEA7A13EECDB9
+84AC12BD
+D6BCA0684F11B82D99A41644BF12
+3DA78DD66C276944634E6ADFC67EE9CBEBEC8A6A622393E498927ED4F72E5872EE1F6E50185BDC7597D7FBE7286665DC62055D74E87207C9F42EF9A82EE6AD8A45DC9F27B8AB5596EF5CDB94DF7AF9E0C6EE57B7C41603057C2EFEAC7459BA260886F0E72BFD6E3E299D5231A92FA8D9D7BF1049CEC327ABB7CCE8C8FBE1
+A007
+4D618652DDE48F00F3F83A26A5B8
+7895B860
+CE2A32CC0EEECFE20A1A9AC73B31
+E33AE09B8FBB473EA6A17E14C6C0E1B63451931302FA4D71070065D9F763F1C1799D0C28D0758710096AD3827AEA148F0269865CC61C456C002F8FC4F81B1EEF079450F6FB7FCF21CAD192AD5C7B6607AC48E3A5EC7B7413A58FE65784584A7C94453B0CB0C99A9960CFB499A85F8A194579D0BC614B8BC6AA2478EC6D81
+65C4
+AA7C1786B92CD21A66FC907E1C3D4A8BA424EFBC738B70D38D
+1F5A39BE
+6AB4006E33E3EDCD9D8C96F901BF
+6D9816FFDED54E39B0B6561262FC4A862773B5C79D45BBF2F28C86711A07BA2C914EC18A0DDA9B3FFC7FA512BAC23DFD8924F32D0E8C3B3F0868BF667B90F43E65F166FF4F5842055278343F040CE47954213BD96C4ADAEF22D04777B7340D006182F78F2680F45065CA975F101202E53D060D15C48B013EB5BF21C29E11
+FEAE
+BD7DDA44
+B43FF5C5E5E9FFF8E2CE08C395
+3F99A36164C9C775EB4BE77C542835CB83DE64B145385F1D4F7806D317081A4A9A9F39D23FCFC4DC1AC8BF15877E2CCEF797D2E3E01D4A6BC9090344BE66AF
+DA63EBA0
+179BD7D01F282BA1E3DF1F701837
+6F68D27A7DF21D4ECCA4683AEAD00933C5BCE263A6DF91A64286F154A37A3875E532E3BCD986935EA7E38460E5285962E950AFFF11E71B1B043194FDE2749D0A37B803EB3F63E806D321C593EAD111863972D0F5EA661D9F6E371E4AEFCAD25648582DC6F815AD2AEC
+4891E48A
+91088B4DCC4F4ACE98FC4CF5D9
+7E5C253E7BF52CC7E9EAA1A62F4DC39317A25A6FE983
+1C349FC8
+B55785BC9E4663FF6142F4B0E5BA
+DB6E56F734E6C39E
+C063E38A
+7B1F879E50CAB4FA3EFC9359950570D97E683BF7E43C338F704578846BBA3546BBBE
+6FE358C1ADBBC280B51AEC12318EA32E2F99EC65A527C9CF13EFB947531F9FF7B733E466739A
+EC0984FD34FFA7EA84C2B93E66F01565FD9ED245A90A96C2C575D7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0045 put
+dup 3 /C0047 put
+dup 4 /C0049 put
+dup 5 /C0050 put
+dup 6 /C0053 put
+dup 7 /C0054 put
+dup 8 /C0056 put
+dup 9 /C0060 put
+dup 10 /C0062 put
+dup 11 /C0068 put
+dup 12 /C0072 put
+dup 13 /C0080 put
+dup 14 /C0082 put
+dup 15 /C0085 put
+dup 16 /C0086 put
+dup 17 /C0097 put
+dup 18 /C0098 put
+dup 19 /C0099 put
+dup 20 /C0100 put
+dup 21 /C0101 put
+dup 22 /C0102 put
+dup 23 /C0103 put
+dup 24 /C0104 put
+dup 25 /C0105 put
+dup 26 /C0107 put
+dup 27 /C0108 put
+dup 28 /C0109 put
+dup 29 /C0110 put
+dup 30 /C0111 put
+dup 31 /C0112 put
+dup 32 /C0114 put
+dup 33 /C0115 put
+dup 34 /C0116 put
+dup 35 /C0117 put
+dup 36 /C0118 put
+dup 37 /C0119 put
+dup 38 /C0121 put
+readonly def
+/FontBBox [-21 -209 798 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842744B36D3511219816A5C27D3502C6187BCE
+3912C71DBF05223FFCC33D67
+A75F80439D9C9AA951
+8032BD10
+FD5AFCD177D9EF083EA3CE8A94
+3EB45532D6EF293C6818FBD1CEB4EF93541AE403A4D4FD
+B36A7639
+D5E40E84F2A27439DEB50EC74C
+20E497DFFE29579044EFD8FEBF892C5F8D3468F13FCFCB528145
+52E341B9
+59EB6A13CB325E1C6E2558C0BA
+02DE051BA9B70D1D069DF9F06D73B32E05C33FAF159F20532C6A0CC08DF95AB2275020F28D3B0FDEE5DA3C5E25F76B747A61031A4AC30F0B490EE779
+3E7F3D2E
+E6D8CAA9080416CD2128C2FABE
+2E9DC3B5E3F3C917F86449B08F856B69D0FBDFEC16D380D4CCE15F65B37DB34B65423EBAB5D8C817A5DBEC0558834F4E5AC2BF65EA646947330E2020C4F404FEA57A71AF9155954BEEF98CF33257F3C079C8921F
+BAE00F0E
+F716C7EEB0ACB7414B2AB45A87
+B7902B284D1906A8F914E768A278EDF82E5642C2599FC82648C61BFA6DFE8A5AD16C273CA9D8ABF6083FFCAFC97088A61BD923087EE9AD675DDC9688833F7842F0886DC62ADCEFEF64A3F72A068C33796D7D5AEE3FBB
+9B3C356C
+A8D9209AB0A496C6014A1A9E8FC6
+24FF44D24A904A3669A3F8FAB722BEF9ADA99F3AC642E6F8764523C81467DC646BC5296F8C5DDAA2A1FA23D82C36E744FEA78E971BCC4F0E2850891FB5AE9F8A4221FF038DA16966720CB53207B31585FB88A831057BEE1048AAF6DE21350109F20EBB64
+8A4F3A7D
+C0A98A70CE9A41F96EC98BFC7E10
+7366EB90B005C270899F564CCDFB3583B2ED1B6ECFA5E2467B8F55BA5A646B3AAB98BD62B5E92040238211B0B0E4195E9090468D810AACE7ABBC7AE9FCFBB6A191846710ECF100F0D1D89AA772E3B85D0E686972DC5F768AECD8B2AEE6D6914C53E1BE47ED4206432298D16D6D7B5EE063AFDACF02C668847BB3
+7BBFB985
+B96339C1E5998C65F99460BCB8
+1A078A0DC0580CA635B7753ECFA3B6029E59120EF08A24B3C3B6073B4364B49F39E2D721772FD3D059
+B38A5F19
+3CDD6025831CBF4006ECFCE687
+6E4E770C2B48F2598DDC7360BC244BF220173DE244CC8720956FEDDF40D2968D77A1869DD7A1B2
+30D6D598
+2E9A9714047EFBD92594CA348F
+F578A21DA106F9241ED8748C9DFBF23275D85A12CF552D135A12AC6146280309D61FA61F1AB5E73894F098DB9D8DCEDF92D8115865F7BCD2949F47330C027A82671520B34657979DEA015CDC3CDCDF14039D1C18A7CC12
+16C1F22D
+B221DC0E2A5A06F6D6537BEAC939
+D78296077C6C5D2ADBF764426D6D2A470B873C44248A2CC0813664090338380001F7C29AA10478E562E68CC691F30DCB48574CCCB2586996EC479A0463D89AFAB5B7F8BF914F0E31CB55D1E9C18E69B77C6D20AF399CD430F2731B20A09D8E044C746B4659AE58649201DB8D942B87B294E28D6779603D
+978FB4A8
+4EDB237C6E8673697477FD4AB321
+6DF6AC300A3233773BBB38AF0EE55FCA9A8E53BBDE4B3BBA6243E034A38CA2269D2BBAE767929FFBABE625F335FBBB0EBEB2C33D001E6E43CA312B76259BA559BE8DE5E76BB9197B3B2C96ABA6D45BBB73C564D58104DAB23941990071D5FEC804D7288A
+26D8DE2C
+E6D91E062AB059FD119E399F7581
+1DBA593E53F47DE0A620DD5BD94C99E6F29ACFADA70A2A27F14508610EA60063D4A2C027A4CBCB21663394E433A52D3EB3ED7D983B490E2C61C0D32F42B4D6DFBEE827B0AE67D0403366480935E102CFADB5CFF8049CC05C7E383C39E7C09B9FF19D3DDBE5FB2F9D5B769797C22EC75B6107C84A90
+3716DEB3
+C2147DEBCFEC39EF6646B7457C36
+BF9A08460A84D442089F1300DEC24ED9FCF4C9EA5AA9B7C095D0A06382A360971EF76A4C5027154CFD8A1BB83F1B7ACFCEE8040AA331EF81F83A6971A8851F6D132CC5DEC163859D39C1F67AB28D9CBC5F7DBB5F60CADEE4095CDFB7C3F3C1995BBC3BDB020BC2
+C6C8B024
+AE0A311B8C1BA5B14377F6BBDC
+352DDD6E476CEB301EA4309DD62DCF75E9F992BB3676CF565174F5EC2320710108C01EFFC81292EE87C3EF00DF2F834A1950B85F6FBD4EAD3D9A7EC934E6224D032E2DBE90C7432FDFB5DEE314F5E50CB3D1641A15FCEE82
+1A754A77
+98CB055AF023D60CA1FE89377808
+FAA8E354BA2ACBB78C1F038D5F4B2CFE28B03BBE57C2E2041C06A8AA027189867AEBDD4A02CC2DD9C21AE5E1062682FAA964082D6570F84A8CAECD949327464F86F9F7B0A5FE85C4A585F01DF4A8D6C645C467DD31C50CF3CE885B7B8AAA50A773ED4D9E3A7A1460740134CBF0A64CDF65194098A38B413E82A0F8CA803E
+D1B2
+2F288A9C
+5392A114
+AC7BF81AE30CA9CAE203135E00
+AE34388231DD4CF293143974846FBBF514E9BE9BFDEA79783A4DBEF0E62B9429E80348E9239575259C65708D37B4B8C110A1FB19651CFE1C79E2F501532E08F60CC41F4B54327D3D4EFC990DEAE0F8023AB95FBCEE2F57DA22B79054A8EA
+0786A0A0
+68D5AAB660286C85BD23B66124
+203536CBA7825F0A766F9F4F00FCAEB803D4B959CF3AA364DAA8904B99439ABACF0D5F45CBA9FFD587E6EE737E4B9F559026857237A821CE0A9D04D8E8C618024B448DEAF0F84CE230B483BC878A835E1A67
+3E12D5DC
+0306FEF9EB10178992AF24FEF55B
+06A6036A7E13B5A65680448AB4539D0F7684430F106EB4901ABF47AA87145EB200597DA8E9A6260A1BFCBF5FE1721C343D82E44C64CF8C4D634EBC8D61CC42C16040229F89C8A807FA6EB4E4F68AAFED649EC42C9D8CC9BF17DA0C4D6E4B96456F466E18BC4CB5C2E53B1C46
+15A3708E
+849EAE6C792DC4FDD8AB0C6514
+07A581025BA58CC34A92E8B89F462C486EC0B003D3B167C31F1656E10330DC603125CC2CC36942D795D5CBD9E90AB2EDB6BFD5A3F03288571C7337532CC053E05FE685EDECA2F0452C439BC15141AE2FEAEF4CCDEB6E18FEC920B9CD
+ADDC6253
+5C28B065AB04624C26CA5BDF2C
+C4DEF46F7E537EE95F80BA580EFF9BC40F3A0DC8CCCF8D6FD52189CF6282643374F89FB227C162E4DEB63F8E54716596F4A6D18D99755ADB68CD52903888E9F7B8A90E3F7D3C2EBFB344739E1895DA5CCB951F75F9D528BC2EEB76511D
+DCADA35B
+5AF8F64CC0D592CECE6D2945F28F
+1190BE3FD63169C0F2620C3604A8C870FD1BFF61C6A41A329910846E26F1E539ACC3FDDAF1B26FCDD8BD40759E0E3A7FDB815C11515BCB8AED7E7945BFF3401A05F419CDB758B84B9A9DCE5C9DA440EA9625921A1448713A05168B2CD9774CC2AF145F623867F2EA80EBBA562746306D1B33995B55A95717F86AD77ACFCA
+6430
+CB4CE401392BFB8FE66B748757CA674F1D411241A725CAD122D52083281357E77BF56D6FAD
+B7F07896
+A4B3233F0A23894C077790BF7B6E
+45B4F867E74AB05C9566A4966388EC5BC6950A7335015EB4C022F9C41CEEBD419C8339C71C4B98B68F5258A80A8EDAD7D1B155298AFD28A34A064AD95F1382067B7B6F7180DA5E03C0979145282CF9312437A7454587F86C7B661C916D88A53B00F265669AABAEBC
+940F2688
+2FBC0E46199FC2F5E6703BC736
+6ABEDC188884393FDD07353BB01BA54B8DB94EF537A803BC40F9F20C4FE01BD0AE578B8D76155E0B86EE2AA2288E8EF2F7EB7732E81BF6DD6D1D2C9C82113BF4AE187BD08E637DB2D60F6503882A
+7ECC61E8
+BE5C2A1E9ABE7CE9B3BCB17F3714
+CECB3E580EF0FDB2C3AEFA51A4E3E0E9F247C3C644E74732C52BFB84D0441BE8E72FC76F264A7855E1495C756F326758F34FFB23E0369752D6C35D7813972067291C40E8816CC990AB70F496D21E541A7D95879C88305EF0366A7CEB300F44F2FAC305014D6C67D635BF1CBFA03B49621833BFC3956A8D90B8A2484130CA
+15AB
+12ED
+20AFDE86
+2177D09AF017B0AA948ED8DA31
+BAEEBE73325830850E03C5F6BBA6C888A8F8D8237EEAB80B911FD99260763E477B6641083FC6B343BB3008798831FC6CE81F7D2B
+6B55CE51
+F152837822230D6B23F31929DD72
+27108EFCB362F5150043F3C3697738317A7FA9CEBA901356130583F73CE7C2C32F0531EFC4C44630C5F3CF8B3D0BB8873E4B9111E0755D91AF0AC1603AB40234F943D605EECF7D65F58CEEDBA767E171E7753BD851B09230D129699BC9C193DB37C33BEC82D96ECC974C773BD05793EB71440993838EEE4C761EB91FB85D
+8E28
+C51879A3FBB9C6EAA0DE4487AFA02C332D71D588DA693A0920F5B88E
+4949138C
+7227C01ABAD32E426CA9DAD20407
+6F8CCF23A49F15B3931AADED4ACF80BB89940E76A3A891A34B6A653120E6E34101050208AFCCC68C2D70F0F186850310024DA8985740D09FBFB798F7304CCFBE86E884C6F78189F7A780B89998865ABCD033843FEDACD59B9D77DBAB29D905C5A4373A3E0AA7ED
+11518F55
+29D345B7F0273D3E797715A70A
+BD45850783B195B27F0FEAB7587755A45B27F4F26AB06656F365806E45061B3E9B909D231324403E73FB099EED0D2FFD3B41A6EA43C8764611A577D3B8F48A035CA8A19EC720
+5B0F13FD
+476218FA658144261B41D95025D9
+B717498E520E66C1F0288C72C7B20D897ADDAA20D189C7E78604983597D69145A15C068B24A213F58EB95FC890BDD77C9E1595F12F07E35AAF90347298A7FBCC9BD40D44D2D2C1D7739CE248C34F2D3036DC32894FBED2A6437A483F20AD0D521EF1429127E3A5E24DB70B6BD42DCA5CF9
+D5269092
+D0CD38934A3150FC98EBE1BDF9
+8378FC18727FE41081777F5131F28D7DE73E1EAFBD060721352BFF2264430E2BE059077311DEFF2FED088FDF13E9924914952CCF8F61BAB21A6085176D6FE42BE476D45779F9821640F23968277E7EACD019582EA7BB701A9A
+1C35B329
+6190A150EB8098D3E6591D40A984
+E6E75ABAE4558923109CE54202FFE40B51462001138D16E8F00571AEB6BC6FC36283C263EEECE209FCF30942C584AD741BE8F02347A9DFA0209EA454926C7E5545B2D65527F629ECF6483F793AF287BB6C78718AEF3F5815BA7EB0435E4A0694FC784506F40DD76B0968F8BAE28939F0FB457B3D8B92D5A594
+ECE01FF9
+73268D3B36D44BB3B6728B11CF
+5D824D9B1A0875955F69F131CE62EA47BDEC4A91128CDC1D654EF0A3BC2E5BF59754E170BF43BE019FEE7010D47E6607DEEDE7748FAB9A80085BD206F9BFF310750C1749
+5A8E5CC8
+79826230385B3ED0C32721564B
+8709C55F0FE6DDA77F157AE6BE2B8704F7BF2905784AAAD043F2BC4C3AE0E072F647FF8BAC0423B12C4F8ADDB17DF2BFE05043BE1917EB903836F2906244DA15CB29C6F50CEE2F59781E74B1F7DDEEF040DFE2A4A2F64C6E231CAF
+143CD9E7
+08C4F28302FFA58E1765E8C41C
+EFA4148AA40A6A00F1616E2D17DE438C7C9972F10B4845541CE7AC8A29FC41FB9E90029F3E16731626A2AA74E5056A00461EDD7046C78E54EE72738E677CED664A5244FCEA553D804AB3F6FA88A2FEDC79A43AF58BD44910EE63FF48
+06F3D4D6
+90CA51CA188BE6D8C32692EC4DD0
+41943F33F1B89C4031CCD84FC5923A9E8DA8A988997D20665BF238B1E512CAA1C8D728E54DDF6B84AFF9411D601364EEA7CC7B0615DC0F474FB2A7AE7AD0BEE64F81406213B75001677399504FB00F84D3BBDF4EFCD588A031F20E08E6CEAC0FA39B2B4CEB1C26224EF30C61B94133DCA74BC94A4B67BA6D2B177A9814DE
+979F
+833B08C448CC2574A8A228
+0793726A
+3E29D08919CCCD6303B23EBFFBFF
+D909356986BC7EF02C9B3D9ECE72196543265A045647A8876C344F4B8A18F0F84E970E501BA158E0CA3F792276A1ABF1893C541F7E4716C39115DDDA604030A4B3321E78BD03CB9F2F1D6B85002AB83AD9AE2B96F0BD006FDDEE90130D897A08E13ABB3C8B810DDB57FF58A0982AE622B1EA7BE56FD26CF90C7BFDFCAF67
+B848
+C7
+A16C9EE9
+BBC661E025435908FB7E377558FB
+DC1A504365B81E4D
+12FACA8E
+7A8338048084E1ED96F2482290B1F16D60F87113B0304A91E9DCDBC2C634233DB5C2
+4108FC0F2156DE7EB93519847B6137F13522D72425445B249D2461F4CB3A69401B3DBB474994
+B59C00100FD722AA7652FC5B34DEF49A23019D2EA361FDE44A2ACF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchi
+%!FontType1-1.0: PSOwstdutchi
+10 dict begin
+/FontName /PSOwstdutchi def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0046 put
+dup 3 /C0047 put
+dup 4 /C0099 put
+dup 5 /C0100 put
+dup 6 /C0101 put
+dup 7 /C0102 put
+dup 8 /C0105 put
+dup 9 /C0110 put
+dup 10 /C0111 put
+dup 11 /C0112 put
+dup 12 /C0114 put
+dup 13 /C0115 put
+dup 14 /C0116 put
+dup 15 /C0118 put
+dup 16 /C0262 put
+readonly def
+/FontBBox [-144 -228 513 724] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268425D7C73E0D9FBC2C51FC5D7A4C8466A0ACF3
+EF6A51E852ED0077B2894802
+F6E0E5B330993F73EE
+0777F375
+11FFC827436FEEDF46428460AC
+283786C06FF4BE317A706870BD8E4E31C6D7A32AB15C24D4A365D0C5696B79
+53A17EE3
+658EBDF535BA48126D4E0072FC
+B2A68715F12ACD23CDF8729640334A81E2AE55C931228540C4
+E4786B73
+D1480CAEB99C3DB225AB90EE57
+BC17191EF5E11906AB66795A1E55A92493BC699D34A9B047227E8036353311D267E02BE1DD32D67DF15CA17961F9FDB669389D4834B9A400B2273A2AB5321EC2F98C6B37536157D3AD3F9EDFE42F4B741A58B9D919EBD96446D53AB1AF5C37BA
+A8CE7824
+C7FD4F7907058373C0E937046A42
+AC005815EA0CE755F328178989CC2C12804BBB6974BAA80A7D58ABB396A0397962B42E5CA0F9DC1107855FB16D457395C7EEA2BFDAB2BBBC97E82C246A0EA0A9F6E8398C3369DF82E5D48F114617F26B947DD6742795DE56028C0EFC605F9CEDF113DBACB18A160BF15E5E2BBE9175F0A26BEE78392DA1CE0CE951F13588
+E399
+2ACCE0F43CE6739D4AE10BDD0D98CF40E864C3D2755F25A00F14DD6B1F22F1C45EE05A0407EF4A33C55695375F2A0F75
+773D29E3
+75F83C40166AC7B537EB60984DBB
+147C7E2F4F8CBF69CE7F03EF935806AF3DF17C56889C5A589DB144728EAF4C1EBB111F686D873DFFC14BC2DF96EC962B5EE2C4029DA617E6DE6C41B2593ACF6DA637DEBC9CF2F7CD3F56A2DFA07305B1C0E9F43C0A7F5EEE3D16DB26A6C0507232DC3AFF98
+EF05B31B
+4E27DE456D3022C6797862D21FC0
+6688AB93C682850E627DE0BD2E6EDCF28632AA6A5BA8AA04D484F5BA607A183CB9A897EB54CED9FE344FCCEB4841E213EA990CBB5F3908FD6019F574D3750248FF7335AB7A6C9342964F9D3891812B10F07B9441F833EC66655F6E20C6A2B66E31309053416F5C82E657BF8CB8B6804AD634FDE605130F563DAD7E33DD14
+7FCD
+722ED3C8
+3662DE5D
+4B0A79F2EFEB7EE239F0CDC435EC
+AE7B8342B639400F324CFBC8CB8CEC28C46306A9357B80C97EDC11CF0954E5CB0D4B3D5E4B20E80BB790BDB6682C240BD10CA8C4F0739D19A5A1B06BD9E553DBC1F8591E1A0E26DECDA8F8767050EC3B887B41EED659E7A7EB03B51572701D290A7192DE82799D4242126A33BA876BF3E9659D0C9AA696F33C
+735DE321
+38AC9651570E6852CD6D063A416A
+CB95507973E95452A3CB362BDFEF2F938987EDDC32F882B7B8084B147A8DD3EA6473FC098DAC7D657C449C0277AFBA195331EAFB7B73D9EF9BA2EB0240EB3F036EA622F25BB629B8632320AE23A35E537220846AAEBB998AF663ADAE46909714D473764AAB0AB31F94CE1BEA0229FFFBC5A6AFCE25123035B466C054B8A1
+CBCA
+677BDC0A1DB5634ACE52D10B79B4BD2998415116C1C2296651
+39558375
+C9C465A71C7F90A0D77727D38B
+9EE253F3957FC5168507BF9447752AFD47EB16D5B7F854EEDB87CB35E31C23DBCFFED61213991D851F9A899212B7F18085E0E7BF7DD081A20DF70ED5155C8B62C5A65ECF02E5F4C845FA3A4313D5569C81B41698B1C8DCF65920118D68FDBE
+4595E361
+AA0F0BDFEE407F109EFB68CAE798
+98785FA39074F79CC70FEB073609DCDDA9ADF7685DC14756FE906E6DD650BD18E6655FA34D97BA5196C0A7103B3F0B6B739CFB0CFD2195A402081FCDDCC0A3A87D91D1F7C0A1E1A4C5868DB745F6AEFCD89CC3AA8F9AA6707A65621CD6F3D848BD445BE04BB6FBB582C6D7D7FAB49326D90618EDE2C5B280F0CA6B1FFF84
+D671
+AC42AB66FDE8F2A952311BBD7BCE58FC5A85A6B72086FBB9179C3E90BB4BEBF3D65BCEF8641758586819
+F45AEA8C
+FC2558922CE3D079CCD71DAD38
+C0EF448DB3A75A579E09A02D89A7215CE7D592BE566BD46EA79BA1EAF3CD5CA3AE0519655018E173BC23DA58456704318C2B9233AE2303DADC2367445627DEF464EC8755980E4FB2B07409F01D5B39930C05E1D30A75AF7A8F3B64
+8ED19457
+45C8D7F881684A77C417723A236A
+EDFF5676CD4D6827827DBBBEA0150C950BE1E969CA9A4D2F05A4EDA54D06AD1CE42FFAE4ED02A66FB4075687ADC6353B19FE6082BF79CC46C44E940AEC8505676573F380904C20F6A7ECD78789EB00986A6EEB0E9AF69B79AE622EBCB668DD7AC81B4252023177884FFDD7017E79100DA1C97518273D
+103EE633
+24B108E8A88FC7CE5FE92278F3
+1B2E573F5D7B7A0142223ADC63D5B5F8A6B312915AC7597334E131A5626209F0C3C0E6F7642F46025A4456A0D147BFD7EBB917974399148167D6B71E0F72F84D2A0A8DFD20E4508EF992B497A9698A80780087442499E6
+FF61B6FE
+CEAD2A2F3B12F2AF4B08F74DC7
+1B56B74D0EAE1C8812740231D5ACE80E7F0CD3A506C654CD3E9D312A78DDB2379CFF4D3B8F8C0E87BB53D96729D1DBC4837763EB72CB8217C98361352F24FDEBBE0FFD82AB11C524A90471684FDCF0B6EF597D95F64FB0847606
+F968D3E8
+223A62D558D62E40456DAE934A
+AE1C8B84A7FEE7E0EA855D85E53BF487DAC2BE94EC889A83
+BCFF7475
+9926ED2514A70AFF31C280B61524
+827F3870890A460E
+17B99898
+7CA435388A80497A5CA2B9FEC2115097F0243233995FE4DC407F346265C4B8BF7705
+D162D03F3C0FE594C0F3735E7C79DDC9AF9822F9A8C1AE21D031CA847F9E31AB3060EA32A451
+C787C0A1E81428620623F66B869DF17A88A10942917DA0FE725DCF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch12i 12.00 /PSOwstdutchi newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<1a2735312733280e01110112272f252a2e23332c01283033011927233436332b2f29011a27353830332c011c> 2207 558 0 7384 -1 s
+<27332830332e232f2527> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0d> 9434 13300 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13280 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13280 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13280 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13280 3 7133 32 s
+wst:dutch12 SF
+<1b2f2527> 1271 1431 0 1757 -1 s
+<00352a27002e232c27282b2d27002b340025363435302e2b3b2726002334002f27272627260600342b2e312d3a00272f35273300352a270025302e2e232f260e> 1757 1431 10 7723 0 s
+<03> 1398 1778 0 1504 -1 s
+wst:dutch12b SF
+<001c111a1500191d2122111b1b> 1504 1778 2 2683 0 s
+wst:dutch12 SF
+<2833302e> 1271 2124 0 1712 -1 s
+<00382b352a2b2f00352a27002f2735312733280034303633252700262b3327253530333a08001f2a27002f2735312733280027392725363523242d273400382b2d2d0024270025302e312b2d272600232f26002530312b2726> 1712 2124 13 9531 0 s
+<2b2f353000> 1271 2369 1 1666 0 s
+wst:dutch12i SF
+<030a0b0e0309060e0b060c07> 1666 2369 0 2656 -1 s
+wst:dutch12 SF
+<00303300352a27002d302523352b302f00343127252b282b2726002b2f00352a27002e232c27282b2d27080019232c2700382b2d2d00232d3430002530313a00352a270034232e312d27003425332b3135> 2656 2369 14 9531 0 s
+<282b2d2734> 1271 2614 0 1643 -1 s
+<002b2f353000352a270034232e2700312d23252700232f26003727332b283a00352a233500352a273a00233327003427350035300024270027392725363523242d2708> 1643 2614 13 7474 0 s
+<1828> 1271 2961 0 1422 -1 s
+<003a3036002630002f3035002a23372700333030350023252527343406003033002630002f303500382b342a003530002b2f3435232d2d002f273531273328002334002300252a2b2d26003028002b2f2735260600342c2b3100353000352a27> 1422 2961 21 9531 0 s
+<343624342725352b302f> 1271 3206 0 2219 -1 s
+<00352b352d2726003c1d> 2219 3206 2 3062 0 s
+<362f2f2b2f29002f27353427333727330023340023003435232f26232d302f27001423272e302f080200> 3054 3206 6 7053 0 s
+wst:dutch12 SF
+<1a3038> 1271 3552 0 1693 -1 s
+<00352a233500352a270027392725363523242d2734002a233727002427272f002533272335272606> 1693 3552 6 5238 0 s
+<002b35002b34002f272527343423333a0035300027262b3500352a27> 5238 3552 6 7450 0 s
+wst:dutch12i SF
+<0003060e04030d060c0f0804060d> 7450 3552 1 8506 0 s
+wst:dutch12 SF
+<00232f2600> 8506 3552 2 8930 0 s
+wst:dutch12i SF
+<03060e04030809> 8930 3552 0 9461 -1 s
+<10> 9461 3552 0 9531 -1 s
+<060e0502040a0907> 1271 3797 0 1969 -1 s
+wst:dutch12 SF
+<00282b2d273408001828003a3036002a233727002627252b262726003530002c27273100352a27002f2735312733280027392725363523242d27340034302e27312d2325270030352a273300352a232f00> 1969 3797 14 9138 0 s
+wst:dutch12i SF
+<030a0b0e03> 9138 3797 0 9531 -1 s
+<09060e0b060c07> 1271 4042 0 1868 -1 s
+wst:dutch12 SF
+<06> 1868 4042 0 1921 -1 s
+<00232d35273300352a273427002d2b2f2734002325253033262b2f292d3a08001f2a2b340027262b352b2f2900343527310029272f2733232d2d3a00332732362b33273400333030350023252527343408> 1921 4042 11 8854 0 s
+<11> 1271 4388 0 1434 -1 s
+<262600352a2b34002d2b2f2700353000352a2700> 1430 4388 5 3063 0 s
+wst:dutch12i SF
+<03060e04030d060c0f0804060d> 3063 4388 0 4076 -1 s
+wst:dutch12 SF
+<00282b2d270e> 4076 4388 1 4478 0 s
+wst:dutch12b SF
+<1d15221f152016> 1398 4735 0 2055 -1 s
+<04050807060322131f> 2669 4735 0 3538 -1 s
+wst:dutch12 SF
+<1f2a272f0023262600352a2b34002d2b2f2700353000352a2700> 1271 5082 6 3538 0 s
+wst:dutch12i SF
+<03060e04030809060e0502040a0907> 3538 5082 0 4767 -1 s
+wst:dutch12 SF
+<00282b2d270e> 4767 5082 1 5169 0 s
+wst:dutch12b SF
+<1d15221f1520160021222015111c0022131f001d1e2511192200201e1e2200031e1f22031d15221f152016031d1522211520241520001d1522211520241520> 1398 5428 6 7087 0 s
+wst:dutch12 SF
+<1d> 1271 5775 0 1434 -1 s
+<362f2f2b2f29> 1426 5775 0 2051 -1 s
+<0023340033303035002b34003133302423242d3a002f30002d302f29273300332732362b3327260004183500382334003634272600302f00302d26273300372733342b302f34003028002f27353127332800382a2b252a> 2051 5775 16 9531 0 s
+<33272326> 1271 6020 0 1678 -1 s
+<002833302e0009262737092c2e272e05003430> 1678 6020 3 3582 0 s
+<002b28003a30360023332700362f25302e2830333523242d270033362f2f2b2f29002f2735342733372733002334003330303506003a30360025232f00312b252c> 3582 6020 11 9531 0 s
+<232f30352a2733> 1271 6264 0 1979 -1 s
+<002b2608001b2f252700352a2700282b2d2734002a233727002427272f0027262b35272606002b35002b34002f272527343423333a003530002a233727002b2f2735260033270725302f282b29363327002b3534272d2808> 1979 6264 15 9531 0 s
+<1b2f00232f00171c07202100343a3435272e0600352a2b34002b3400232525302e312d2b342a272600382b352a00352a270025302e2e232f260e> 1271 6509 9 7053 0 s
+<03> 1398 6856 0 1504 -1 s
+wst:dutch12b SF
+<000315221303191d152214000213> 1504 6856 2 2721 0 s
+wst:dutch12 SF
+<1b2f> 1271 7202 0 1559 -1 s
+<0034302e2700343a3435272e34002b35002b3400313034342b242d2700353000292735002b2f2735260035300033270725302f282b29363327002b3534272d2800243a> 1559 7202 12 7176 0 s
+<0034272f262b2f29002b350023001e181617201c00382b352a> 7176 7202 5 9531 0 s
+<352a27> 1271 7447 0 1561 -1 s
+<002c2b2d2d040c050025302e2e232f260e> 1561 7447 2 3171 0 s
+<03> 1398 7794 0 1504 -1 s
+wst:dutch12b SF
+<001a191b1b00020c0f0d00091f1914001e1600191d1522140a> 1504 7794 5 3991 0 s
+wst:dutch12 SF
+<1b2f> 1271 8140 0 1559 -1 s
+<0030352a273300343a3435272e34002b35002e2b292a35002427002f272527343423333a003530002c2b2d2d00232f2600332707343523333500352a27002b2f2735002623272e302f080011> 1559 8140 14 8124 0 s
+<3500352a2b340031302b2f35060033303035> 8119 8140 3 9531 0 s
+<232525273434> 1271 8385 0 1829 -1 s
+<002b34002f30002d302f292733002f272726272600232f26003a30360025232f003133302527272600353000352a27003727332b282b2523352b302f003435273108> 1829 8385 12 7712 0 s
+wst:dutch12b SF
+<10> 1271 8872 0 1406 -1 s
+<1520191626191d17002218150012192221> 1388 8872 2 2818 0 s
+wst:dutch12 SF
+<1f> 1271 9294 0 1410 -1 s
+<30003727332b283a00352a27002b2f3435232d2d23352b302f003028002f2735312733280600342b2e312d3a002739272536352700352a270025302e2e232f26> 1379 9294 9 7130 0 s
+wst:dutch12b SF
+<00031e1f22031d15221f152016031d15221f152016> 1398 9641 1 3231 0 s
+wst:dutch12 SF
+<11> 1271 9987 0 1434 -1 s
+<001f131c221e1f1d1511190035273435003028000b0a00342725302f26340026363323352b302f00342a30362d26002427003127332830332e2726003037273300352a27002d3030312423252c002b2f352733> 1434 9987 13 9461 0 s
+<3d> 9461 9987 0 9531 -1 s
+<2823252708> 1271 10232 0 1697 -1 s
+wst:dutch12b SF
+<0e> 1271 10719 0 1420 -1 s
+<231d1d191d17> 1416 10719 0 2060 -1 s
+<001d15222115202415200011210011002122111d14111b1e1d15000b11151c1e1d> 2060 10719 5 5244 0 s
+wst:dutch12 SF
+<1828> 1271 11141 0 1422 -1 s
+<003a30360025232f2f3035002b2f3435232d2d002f273531273328002334002300252a2b2d26> 1422 11141 7 4604 0 s
+<003028002b2f27352606003a30360025232f0033362f00352a27002f27353427333727330023340023003435232f26232d302f2700262327> 4604 11141 11 9461 0 s
+<3d> 9461 11141 0 9531 -1 s
+<2e302f08> 1271 11386 0 1730 -1 s
+<001e2b2e312d3a> 1730 11386 1 2391 0 s
+<0027392725363527002f273534273337273300382b352a00352a27003c0731000f31303335002f362e2427331002003031352b302f00232f26002b3500382b2d2d002a2331312b2d3a003435233335> 2391 11386 13 9531 0 s
+<2325252731352b2f29> 1271 11631 0 2129 -1 s
+<00332732362734353400302f00352a270031303335002f362e242733003a303600343127252b283a08> 2129 11631 7 5741 0 s
+<001828003a303600343127252b283a00230031303335002f362e2427330030352a273300352a232f00352a27> 5741 11631 9 9531 0 s
+<2f30332e232d> 1271 11876 0 1921 -1 s
+<002f2735312733280031303335002f362e24273306003a3036> 1921 11876 4 4314 0 s
+<00342a30362d260033272e272e24273300353000232d343000343127252b283a003c0731000f313033352f362e10020023340023> 4314 11876 9 9531 0 s
+<292d3024232d> 1271 12121 0 1824 -1 s
+<0025302e2e232f26002d2b2f27003031352b302f003028002f27353127332808> 1824 12121 5 4812 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (7) 7
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0044 put
+dup 3 /C0046 put
+dup 4 /C0055 put
+dup 5 /C0058 put
+dup 6 /C0065 put
+dup 7 /C0066 put
+dup 8 /C0073 put
+dup 9 /C0077 put
+dup 10 /C0078 put
+dup 11 /C0080 put
+dup 12 /C0084 put
+dup 13 /C0097 put
+dup 14 /C0098 put
+dup 15 /C0099 put
+dup 16 /C0100 put
+dup 17 /C0101 put
+dup 18 /C0102 put
+dup 19 /C0103 put
+dup 20 /C0104 put
+dup 21 /C0105 put
+dup 22 /C0107 put
+dup 23 /C0108 put
+dup 24 /C0109 put
+dup 25 /C0110 put
+dup 26 /C0111 put
+dup 27 /C0112 put
+dup 28 /C0114 put
+dup 29 /C0115 put
+dup 30 /C0116 put
+dup 31 /C0117 put
+dup 32 /C0118 put
+dup 33 /C0119 put
+dup 34 /C0121 put
+readonly def
+/FontBBox [-25 -238 920 722] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842748ED533AEB96B269D1612D0907811D0185
+3C8491E8FD1E7DBB515A4CCE
+0A21281DB16CBBE685
+309C72BF
+D7C117E1A2343200DFE741CAD6
+773679934C033EBD34F184B853C7BB6246B6D48FD3934BD8486687A0226A319B68025E37AC44B9750913A74309D64D8980867E5B296F17CB30
+65E60481
+D8E2091E206805CCE8AD6962C3
+17C1306D8AFB02ABD32B65017468B58D0DA736117AAAD12FA6EB25FC056580
+84AB3473
+45078D6591A5CEDBE8398F16E0
+9681886C7B04294A4B894CC9F757F5F7D02DB6D63F0EC697CEF34148DF30B8B68FAB485B0AA21A2D9867D9
+8C5C093C
+7B03C7E38F079520B4EAC79E8C
+71C2C7845AB6483F421CDCE73A30CC7E7244943EB031727C81A1B2E9ED9FD9C58B4C2773A2B4D14F26601DABAC85E6E9EC10799246D2
+7381E2AF
+FA597981E7C45F0F2E09AB770962
+6F52CC429449F0BD2B5DA086C7D646D4C6083555653ACEF0E93159D5669CCDD729F721A2B7F65718639042D590E0CDF14935F8404BF99E37A7D17171D052CEBD8C3A148C3D9C8B9128107F74A2B4C0FF5232352E271978AB80D77D1DADA7A9E20D194076248A2EAF5EE79B71CF78D4154102FC
+C1FDD36C
+C38540409AB99D377EAC1A8040DE
+1CB0C684618EF8F8C63CF94ECD6F50B14D3B672A9FA66FC553DBE661A12ADFCEC2394483FFF39AB56A4EDEBCD794FB8E8C644A2DCFDC7849E0B3F0AB9D7DB774EBF03DB23D3AC460B8ACDFC7B5ED61C4D3C818E3985D9F3D0BFE510E4FCD8840DECB6B4EC81C33B321A6BBCECB5E14F17F8F3926146D27C07F206B2AAF8D
+2FEA
+E2
+3D06E333
+9424EF5D92876FDE0D91FF42EF
+52D058EC1BA9982DF1B16B7B05B051864AD1BFB1E4B55A184F706A10F02BCFB0B9977D651CD2A3B92E36E1063A7CBACE3E99229ABBB3BC34025B65
+4530C363
+AB8CA55DBB5DD8DA067051C9296C
+2100009DF3862E466B90A252B438816992820D9F978552035425AE15F9BC1B699D715087B05C2BD621AD00AAB1A9EAB10AD9DED84535A834C929E65F93FE1653C4AE71C60E7B848E2F26B9F1394F0D5E008FD5273B3304A47C69E2BE837DBC1C12C855376BAC3F0771CD4EEB6FB4D9
+491E944D
+ACD8A19204843EC7B5658907CD
+ACFCF46A3BFCBEAD9A7FB8ACF055C6D6DDC64B58CC3273C5200E7EDF13C92A5AE4D79A940658540453B4A9A2D5F8A778C7E4456922D99DE4A19CD0E3111ED37B44CCCA1C0C32CEF8B35662B7345861493F8F03551CF27EDC7BAE53A4
+BBBF2DC2
+9F981AD60727B3DBA9D4CC62FDEA
+43428C6FD6EFA1E17AAA17E1773D6CEE3AEEB7BB1D149A467DE696B59811D5276CDB4BD0747B563F12307D5AD32E1E71749682CF345F35AFD3C6009BFB362693EF1CA7452B56777F94401C36DAED841CB99B0646F490A2B72E73CBAAA6ED04D16220C7264E1460A95BB7
+B96700A6
+07A4B92077E66EBF2C3E72EC44
+7BADD5BDC850C2001A011B45A2D9C2426CF088F779454A5994C65EFBFDBFE79045207FC4D5BA2F5E2C5F81E60A0BF1364F490D32F4A19731D3CA2DE05DE5E9FD29D20522DA6E056905C244DA799503691F
+93B50926
+D7EC5AC343EEFB25930E737FFC90
+7836765AD75AB77CE12CBA106715B5CE1C4645B06EE1618917DFA5148E329CEFA1B512EA791046B11DFCEA2C3FDCEEF544D2CD092614FA760A3EFF6EAD41FA13DF23E8CC853E609D2AAC8AA0F5AD63616FD50058727631AD20DD35C991FBB576196E7F4EA24752232C0603B68B7679AB28176AB0ADE3BB53E3359CF584BE
+302C
+92A016
+3F442F5F
+28F335879E5A618367C1DDC11E
+23572F8AAF7A4A6F4950EA9D21AA78BAB6980CC5C356BC162232001C955F7A7CB84EA368ACBDE0E6C4349A626C80E7E13A73ED9A7013DAAB7C6C367CB1AB8369FF3EF5A4DDB8F527F64F320751AF456607B3A740DEB2C96F
+0509624B
+6E709F6D866B65F635778EE114
+FDAAB49643B52F6732F54A6E130C0CC4D33083DCB04C66423F1C48293D4E4C8503B52CE2CECAC31367A898BC69AC810C935B168DDC839AC30002624EE0DF8B370D142847925CBBDFA77D91029EC51996FB22
+714CAF3D
+B431EDA2F4A486895F1A469A35FD
+6BE1B6477DA9AF179800EFEC032404B49B2541CFB5ADA1C1B160597C729DFDE960A7323E62C7C888C61241DA66588A0D94B2AE86E02B524785402842619DED1873849E3CAFD30ADE7E0F91F60F3C573908E12497ADB8B71D28372630776E6A3C1A91F651D044ECF42F21991125C2
+E7C3A86E
+9CC6CABEBD675C334C752399F9
+9D1DEC54CF916C8E8CEF593043E60E552B6B18E6BDE0A9114540AC58016D9077C218A6862625255FD4B80B21474ED24FE964F768FAAA6C05314BAEA692B7C3697128E3DD31CFC4D9F254A2D083DFF86DACCEF9BCB22A49C0F1
+6B443B87
+0C5FE1D8AB558B44448C13AAF1
+AD1906A8DDC14158A4597FA50B7A53AD0AD5B2196B8ACD53109B7FA4F80C24BE471F7FFB970C645073C5F95DF370878607E9A4DB7B74ED24C44CE3E190216DD8D8771603A48692D486DF56A9AC47BF62B2869D80B82B226E759AF0A7
+6FB24B21
+C8CC4E2B5EF83F44DA7D1C12433E
+D9CE0AF5D84D09BC87176CFB0C67CE88609C1A3E28C8FCBAE79984B52E7A5E3DB7E571034C0E019E2F450F84E03C7FC7E9E2F2C1A437E1BC532180DB75AF14FC99CDB3D05014E2FDED8C39F747F3F38EB52F6777470F4346FFE1B2FD13671BF337FBB9D9E865F11C9438C767EC2B455D63A2BDF12EB06B97210F44F50FBA
+0543
+AC8FB3D136EB7D03AE373F1C086F8342CA3A4C5C4FA1F5E588E606A0C46AB401E51414BCF279F336ADCD65ACE1114F
+CB7BF545
+2006F992BC7274C7A12CE774AFCB
+D2BA61C6A0FB4978BE3B1318E225AF2B84D8D614B51F237ED40BFA06EFB39E8BDE8E9FBEC484BF4F215DCED6C97EF4B94AFF3D557B2EEA5DFA83C2BCD787F910B6DD798E6CF420AEA097BA9B51399FA024D09568AFE769252D95295D9A2156613E99FB23FE5193F738FADF8008
+ADE0E581
+4897BB0ABC43198B5E8CC6FE26
+8840400B710318932EDDBBD49B1C6D628BBBD9A5D38931B636A04A79666CB8FC0814BFB4D6D2B37AD46D0082F11B77F4BAE034A392A64126CAB97FF2DF35002DB76E18482DEB8351DBC11F0C357A635D
+8C44AB27
+C092E5BC93A9B66F97ED60286FC8
+CBB71095B05B2C3BC1E41594F49E80B94AF29513548089B08124028CBF6E8B001485240997C4B9F59A715C85388A1EA05016442C5BABFC470235FBB10B9D5125083B0755F1895B437B7E456E707EA95BAFFB711DDC7DBA01A4D8C936E6BFE55A458F1D6091A1B0F222075D3050F8381E8FB26F719C8B1F9D1BF9E016556C
+90FE
+49E5D222BFA90CC3138EFA275D945E27D5287E4CE86996D0A814F371CF6BD695F715DC
+DC02A84C
+0F7B988044EB772CBFB17C1146
+3A393EF26D893D16EFE1C6413459C23C0186761067274F8F23EBD3036F4A1C8E14E52F78B96356D10AC8D8DDEACDBB7AC46DA3A821EF
+02053493
+D4BB3A98DC601059560C89676139
+B95B617035F515C0299340DB4DF2422BA1365EF0FF941189AB4243BB5C6975159B2BE91DCEE4D6E8CB88A3F6FA7B98E963A9292E03F42B5548FD4882E972FEA0B00EA8EC0EC1382224CDFE1CA343A89AD96E5E4043580C37A07C8D5A21EAF23532538534F356C1AC63C6B2CD7BEBAC4DB3C975BAA4692A71C0D6C49FDAEE
+F4A4
+913579BFF760B989C79AEFEF44539971AB9456F510FAB797023D328B653AB0
+FFC5ED91
+2CC06277DD36AF105D2906037E2B
+86C88F3E28CDD1277E31FDE3AC97BC04B452BA26B92BBF7BD40922756AB6A2744A7CF6E6E6851BA9A867C0A0EBE025C1D57FD7B74419DC4DC38514194B620E9CCD35E432374E1B9508D67936B6E3F80A1DD704B9E530B88FE4BC9233683DC3087D838E5F0EDD7BBFB9DD1CA4
+940C00BE
+A82051A7BB02368425A9D8AED0
+89AF77F0651543D5F9445285457BABAF24868DF8876104B1B55A636E0AF63C46A47209D3BE6A09A3EC2E53B14A2B1C4E4CF507A4456A4AB8A09631080FA68FA7A0D494B99E3A
+63B65F2B
+2B94042628AA56077924D197E739
+C1A1EC70E84FE8932DA89FA8217BB1768C9070802A0A6181EFFF6567E2D8E477038AE144D46AA2857A3BC89F67AE2F96B0F7FEC9361B7E5C6E0F3879E8EF7AE98474276C5D137F1CCB2F9FD59FE535FFC540B0B9700D32E27664DBCED4387B5EF50693A0F2AB72C05DA3CE799F161C4B50B10FB7BF5ADE
+0ACC5256
+9712B60EA8EC87B350682BEE7E
+D59D4B2FC88337F5E0D36D2D343FA18450CF81058AA3BD5FA148FBBFE9DD443BF4DB74F5BE86C7AE68197EA267FF1AB93417AF55462A9306F52E5903889FAEB273FFC551F4BB00C80AA665F7358D4E6D9727BE34B1A305
+7AC35B44
+5C4E188E3471447A01EE2DF8E452
+3812293A6EA45D66155B64AC545CA2D11DF5A2012F1F4EC86C5B5D84568958040F8F2BE26E098D1670BF7E79F9F6683929F9D735E3244B32266C1950EE226988C25B208A2B4485FE25F96C4FEAD3A32C9733F2538EAC75E6C7620768DE7750186384484CE3ED6536A61166937DEFB16B4D21A7420563621356C0CBF9
+B9F8EEC1
+ADB0D3EEF6482258A71944BDDA
+E1FB609FC90D84BB2DE3C4E63A2DBF74DD909B3473F2250D47F1662A55C9A39BAF0FE95809DCA8DCE940AD629666BFB3637E3B95B4A085A619964340F17D03B8D61D86AA3E
+5BD65614
+B861366187121EFA9FAD2AB352
+8E7F851CE6855083F2E1E6039F46AF2D511C9A8B4EBC8E565217E93F689662050DC0956EF399FC42D6E87263FD602C4021F2343E2A1BF87D2F35D8B9CDCA9FEB1FBE4D06F342CBCFBE686F06A4CEDB7A8169739B48A0B3825CA204D53CAD0BE7E592
+2312CECD
+D84C7A1060030A483A999482BF
+45A003B867FDB5CF88719A49640F174CE99A4D1FAC7D6E9E807C108EC609A638D8CEE5A1788E051FFE06E2FDC4BA035C60FEF7187A69D6E4FEAFB735A111BDEE127F37FC38E2C95FB5C43B5BAA97551B284D68AE1AD0875896
+977896CE
+840A81E07D3FD46DBA1B70D04605
+9DD207EB4C3009751C5BD09A08C8A6A730A22336EC3874067B4E6CB40166CBA274AE068C9C435C5B9A7B4BA960C4C553886A83DE40C662C7DEE98101B96F8CC7C0946B86BFEDDDF949917DBF11CA9FE15FBE156FAB08F847531C31F2B81F26D5B23237B34FD4926F47029FD1605ED46FBD3296FAC0289B1711B542321926
+C1F1
+883FC0A45FB8DC9DCA7CEAC7F095
+81EC643E
+6C90D59CC6617BCF847851CE86D4
+E2DB76078EBD785D501741E25BF7CA093894E0E50A7A341E10D2B86705A16A051A145A876E2613D75822D040771EEF23E2DF51167D89BDFF711AB22DD33676F126C672862CBF440B978E0ED2DF419B53B3965C3821D74AF1FCE665588D41316B745220E8592416F3ADDEDA45F6F6DF7F90EAA0B21EBD4C64437E8182C633
+2C86
+94C233E7
+5AB48FC29C5D608C90135A77B668
+EDFE028C1C869E12
+4CB7ACE0
+036911E42146F342FE773DF59E4EE1E8A6B5CD8ED09BC6CAD69C3D7793493F6B0D69
+868C1976CD9A4B226AE321F18FDD8E61D7CDBB7E22124D8884F3C580A73122A6627FDF6275CF
+BBFF8C71266B4EF89D6FD6D1FFB86E19D231FC20F7754C2F402477
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0047 put
+dup 3 /C0061 put
+dup 4 /C0067 put
+dup 5 /C0069 put
+dup 6 /C0070 put
+dup 7 /C0072 put
+dup 8 /C0077 put
+dup 9 /C0078 put
+dup 10 /C0079 put
+dup 11 /C0084 put
+dup 12 /C0097 put
+dup 13 /C0099 put
+dup 14 /C0101 put
+dup 15 /C0102 put
+dup 16 /C0105 put
+dup 17 /C0108 put
+dup 18 /C0109 put
+dup 19 /C0110 put
+dup 20 /C0111 put
+dup 21 /C0112 put
+dup 22 /C0114 put
+dup 23 /C0115 put
+dup 24 /C0116 put
+dup 25 /C0117 put
+dup 26 /C0121 put
+dup 27 /C0122 put
+readonly def
+/FontBBox [-18 -209 919 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842697C64AA1341376544BC83CAB3F1D3DC53F
+CCE6DA147CD7539424E5308F
+85563A985DE93ADB17
+9A9AF889
+F2B5A459E50C65F7B2C7B596DB
+B8AF64EC67E72E2A3DA94E7C843BE448E2170061BD6AFE3B4C8B
+FDB95E0C
+3E0066A626E05031EA7DEBE396
+116230FE8FBDC851AED2513E813DDA332D0D058F629F66CA95378B206D96CC4D01849912
+3665FCBB
+4D312ECE1AB5A93870F71AB70AD1
+C6615B5131DB66469FAA8CA3A7DA3D2303E75AAE0F1B0514A2B71EC7573B88D36D17CE8CF65D2B3F6DDC1A2872EAC0D4766532FFDA6D707CB2709C5DF96A5D638891089B1EDBFA8F47029D01F5005B7E1B2F8208C0DF3FD547A8E417410C3A48FE344A6DF21E0AE7
+CF1B4D2A
+A081BFAD1C2C88525943BE26D2B0
+60C26316257A2E3B58A30324E436DD6FFA83F6CF643DBE14595DFC79172D88FAF18C4A71C3FCA96195420B54626AFA47A51FBCB188D017E9822DF658C5641546647853A870C65AC3C9E6062518F0B98FBE215DCAFF1AF422D895F445FB0DB12E60B9100A66CD35A6F9619B77E8DF
+B53934F0
+F431791724AD21385CDCCAF70948
+A4492B982DC84B07CA752141328CF572C71DABDBA2B142C374BCFCA2E5BDB3B468C93DCE4C76447915F70FA2E84277741656DFD5FA0083B3D5120344CD6EB701C4A9DBBADD700C64CDDEDE9CA7842B62F092AD0F08AEEEC3D9644D119C582E8C36F34CD7
+E455460C
+26A6B7EA7C78615561E00E5B42D5
+6879A4D4537B3DBCB9036A331F4A9E17175FF735B057F82CDDBE44852BDA8A8D7935DB7043C5EE28CF4DACC442247F2C86973D866572703950404F5F08B99A6DB072F92569AE865588ABF67FA96CB7F1F23A68EF973342628389A07E3E0B73B2889DB88CF4DE37976C3479C633918441749D507571B211
+B10E01D8
+76A52BE9557D73BA77CE061BD48E
+6FB8014BD65C63845269EE519CA0344895D218D5F54541FE89ADFDF7980D24F73A1BAC69C126F73B4DF56F9A08A9E153E5F6EDF354FBAF632C065FC43400917CCDF808CB71EF3BDA7B7C0687F1087D708CB885F9FF67CD3F1C0F4701492FADF10909F64F16B0DE2C26F50F1927
+2378D81F
+8657D16DF87FA72C2FF87F9F8A
+CC096D50AC07250752785EA257C9C1F8C90BF32C4F2B4098E7BF93AE13171A33A8ECD5E7357341BDA5AFCFE28F8E4D2B15FC5F457F870A1A4C09DBD44E6A9F6A9239B5F4C1406FC5DA46E9EDDD0A0254D53BEDD785603543941A78460EFC4E
+075560A2
+9928DBB2852F15E550C2A15E2F73
+9D73D493A15DFFD0FC64318ED1ACAFAF512403A6225C26348F38BD01607E74B3B737F00C8EFB86EF6626EA815BAB49312A5CC92B66B38CAE400AA454F2A7E0886264DFD2C80E6C5CA24A1BDA7DB64AAB858B86259E2A040D79A3EA917639FC66C4721FBF2E1C2FD683
+1FBB7BF6
+A68B3D07FDCA5EB736549FE1AB
+E58BC629EBC5BFFEF38B19FCDDDA5089C30008C4C7962FA13A1FCF90F60F0C6725B4DE7AC8524B4C5A3F0E92850C84FD338FEACB14B3480AAA326053CA37D42054C53D7F1B116FB214
+FDFBA1B0
+C70144645655E868C3D99B1068A4
+AC9924F5597237E1990BD1BB6644444AB6C0DB70AAE6470A826519DF7934408186A1B69C3473EB4BD86B6A6093E83BE496095E6ABBFE3477A3430DAD6CEA519D3E5EB98761E796D74842D1036E636F9623BEE5FADBEDE9432B4748D041205E5B462FD5464645F9888AF2A564AEC20FAE26501783CDC69C23ED9EBB081EA3
+6DB9
+46AD0D1C
+9A7D1275
+333FAE0AA0512D160D28A6B212
+6EC9DB9019A734E197AE8DC507760A6813AFBA4725B7A8D2EF197E5679408DB33D63995DB6473C979A80F99A684FA733766E5400AD92973D06AE6E85DE32B26DF028DF61DCFCB984A576E1AD4ED3443249B9
+5C013D23
+964D201738B41C9649C115F1D1
+E455CA8CFFD25E611B496E65E9E3107D7A7B22B244AF5F86CBAA46366F2DEFFF16C152199408E067B815107A65C8938340B1BE121005E11CACCEAA155236F97A9CDB8494804466AA0EE960FB5654BD99B8AECF4DA62CB30170C2294C
+3353512B
+2763B61FC982AABCB4DE62566D
+C837A28F743E8E8CC1809473DDDC904FEBBC878A0C061BB71CF8A5B9467C796EA6E519C00A121076C0EF700C815DD9BE560A69F17A7688A10A648F113F584CD189755BBF17083E47CD83F5782C4087A827C492F989FAE5AF5CD937FA3D
+5B7A8E91
+96C9019C3C2064C158F320A298
+E24A387EFC5CD9BDF9D71767DEBC8124741863E12044C36F3BB359CD4054C170B83B0196D962EE269DD75C87EC608543FA30C64A1E4C4D7501BBE47A06419C51188ED80CC0C9E46B0D80BE541390
+F2E83D95
+4ED96EB24B2493E94B89CDA3C7
+19DA2D9A5684E9B42808BC578959786EDEB0E55D6F4E7DDD00E6F6ECD8D04256D40E086103F31391FFA0B17469A9560D28C20C32
+CFFFB21E
+2D7349E376CF886FCE87FE02F29A
+08B5EACD8611EFCE22583BE93ABD15F88070A4AF94A36A605DC2656149AD9CFEC9213E1ACE75A4302976B0B57DC21A188EE17F9AADD9CF95211DC9BD35E577BDEB900AC7B185CA923C5F7EF43DF86371BB6685BFA74B9DB2977759BBF9A4D38D15592FD35BBE89D0EE154579C49375717F7C10C12DF73152AC292F0356DE
+D393
+6D3E57B4A95CA2D6CAD714AD6A61FAE5B2694EB30E703D7C4EA5D995
+97996081
+1124869FAB6D47C29D5FC4DE58DB
+D2DFDCFCAE0BA7740A24F8D64A0F8EE81AA6A644F975117C618661ED8F33F8C29A5417C4D93D567F8ED6E25559106CBD3F4B2135FE224B1E22E48FF674797E978D5B4748BA0E85C9B1D58205DE50702A23FE22FDD3B64B42CA4AD5630EC4C1D9F691E73650B1E5
+394F0EA4
+0D1063607A166302A67B48585F
+B0D0EB60AAC734932284AF2184DD7D6EF5AAFA30816B8C5E72A9B00D7CD4E255F59F05EA307634A8A9DBDD539CEA3DEF84D16B84C05B1A87D4509FDEDE72C52A5F866731769A
+82023C1A
+303A9DC5FE321450874C5C3CC689
+5C0717E2897CCA5CAED43FC7640F0AFF3F113E197B87AC81C3BA135583906875E3305212E4821EC229AE32609F8D8164518BCA92A2C3B2505C051BEE316D5B1697A216B1E11D6BE772D8B6B0CD23AA474E39CBA1B9BC820A5097B0D642A94EBC88EAE70833CAE1ADF0C335A6E2C68457E4
+5D1C62E7
+82BBC381F19903A9A4C76F4F6F
+7298116ED2664599C6C7E553277E5DDF3DE6990DA58D33EF1715D9919C4E6760140C1B267AE29DFF72E9102AEE3973C9E73BE983C91F5947DCA49FA9283B7A02EC5119A33AA5A1819B43A68934A3E3A156AAC9FED836ECA5F3
+A0331A05
+074A6490BCA08CC9B93416C4CF81
+249AF3DD9BECCA4D431E2206760284E0F22DB0767FBD155012E02A890BCC81D870330BE3E7BC756B90CF083C100C47B4CFD05D50747ABD3BB464BDE16CC9264CA058CD23D0691092BA049483D092E6FAFF135B07262AE3D7A02E1FA890BA4731D00EAFB25A31A7E256E93565B4E1115827DA00E9D18235B034
+803DC3B7
+B2D19203916F5E762DA1979C1A
+E02943C194624864653F736F47C33ED9005E8943877DD796B55C9A8AA8BCAAC7313E4E7E858F29313F0A0F59921764E04603308C8B551340A5C54E125E25C93CCD6ED096
+1B446091
+0217C0E10B40827C1081E03FA1
+F4F4880880A9EA7ABB91EBF9475D0F39AD726DC580E529764B6207B81991517C8E0B3A983943AD1AFF93F0AD92A04FB6738B846866DD7989B178930B984C15DC9BCC4F53356D1928245ECD9FFE400EB1A575FB352310DF1971C29F
+9D9F04E4
+CB4B88F0EBBBBD50B72255A016EA
+9291D932D9C32E5567C85F1F4DF6AB4CF9D152A13736B1B75EABF155E4891BBD92A607E63F0E15F3E4DFE60ABED35329DC0464B20041D6C32C965B251AEA71C224AC74DEB9A56EDF85B4BA99B61CECF40D65DEDACA8D2DCE5FA3D4EDBF171BE4BB0D2CD4B25D286FEAFCD23A09F85FCED7F81B6C7E4A0D618E3BED0E76B1
+2AF6
+FE
+429F8950
+CFCCE07BB00AD81E0CD1293ACE
+84852AF3165E41C6BE25928C01FDD9E1F214A3E1DDFB9DEEA6E6CA7D6CB016B58ABD614B43C1A026A03CBBC7C76F3853DD6685FDDA097FA8907C7B3233
+8FDED4C3
+1FD04D3F24FA44621187E0062A6E
+77F33EB409ACC3BA
+1327EF14
+1DDE85D4CD3F42001BC1FC8C9844A6302C7E2C83263AAAA81A79C1F4222E318693CF
+7BAF9833D5B709B75DEFA7AF02023D36C2971DA7DB23F1878450CF1C29BC189F9C835BB114CF
+97BD140BA85A035706F8854D7AC91BFB74DBAA595C0416D641B1CE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchi
+%!FontType1-1.0: PSOwstdutchi
+10 dict begin
+/FontName /PSOwstdutchi def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0047 put
+dup 2 /C0101 put
+dup 3 /C0102 put
+dup 4 /C0110 put
+dup 5 /C0111 put
+dup 6 /C0112 put
+dup 7 /C0114 put
+dup 8 /C0116 put
+readonly def
+/FontBBox [-144 -228 480 724] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842D74828FF73C7EC70F5370B1BB98EBDDAC
+4E0BFC7144E495CB175BB3BA70
+303F2C001A68709C9F679552E1B511E3F340851F299D964617
+3F655308
+773A5B7EAD8F938622D6A364E65B
+AAFD767F464CF202A4E316FEE1BF39E07643FDA1E8A4F007015572A2761C0A29C8C2E68135A35C70F3347A0BF6CE358963EBBC87FE22A0073AA4D09219626CDDFC10ED0C2A26EB9BBAD1837E7F325B2EA419B1F5AC91F18A3A9902671BF3AA42DD88364CAF
+AE244492
+3BB0545BC7DA7024D4D6192D110D
+083804ED5B550F8FE306277964E5EACC1365639496C5B0D5D4B147DAE8A966014C907C99EF51418BE4C0D34002C0B90AF4422468D13F1EE3699F7AABCB3251CB23291CDD88AEA48D5811E69253519C9CB664BE7D3734CEC27FE7DD1388921C6C29AD5D08F3A4B532297DE4071804D64FA03211548CDA465DE5B94080530F
+5C05
+FFC2A177
+42FAE414
+369E5B5ED10669B244B88FBE932F
+21EE27EF59280E955F7DA0ABD13E57460AFA622BE2B1CED7C36AF73A80E9F8AC86F02502DA3F6A9F432495C2C50F40E527A1A6102B9C5B89DE59A6AD38AC9B5220478AA193D65F18DB74E75DD80BBB544021AB8A11D780828844873743BD901869CF7AF3B8AFDD2B3E3E3DC1E270C50B66F30BDBAA1D5D0DB590B451B701
+2DED
+A69338A98912F9BB7E626E64BE3E6E26A9D83447EFC1C6367F
+D1092793
+B29D3E6C2475D998B87B3FDA2C
+C3472D6DCEB3F19403F98277BD229233AEB7689DCE6EA27F3120CA6119AA6EB60E71835C17C2134B96E9F2DB7F9C257FDEE2B6B94C691B0F600E4AABA9F91D772F4679B2998375063E1E5696A1E4A78C4E6A40DCCC7BA2EC7BEE25BFA89F1A
+A0138AF0
+62B2E7F9B93EDE36019540E36AA7
+1D4111CBB17D40D15FD11CC7A66C2DDC598C7E9467EA444F8435900CBBCDED7980E9559C9732D55A5EC894210D13AA23D4C134AF045AC9ABB982FAF688D33A1746E5F585EDD3659975A72A071E0292514CE4B8DFD3BDAAB782C8853D6B9C9F9AFDE3C099228C786F39C8853AB190BE511ADDCA18D474A73573F8181CFB42
+5336
+96FDC787601C6E2B61DFA1630D3E4A63D1A3AB47951E0D01E6C44CFE2EBBE4DA4D0BBF1FE70C578BE62A
+A486119E
+2C96DA0747C96DB9EF070F64EC
+B9A68081FFB6DDF7021FA4DD2511DE902CDF43B4B584973EAB327F983500DBD5174A8CCA1491093DABE8E411294BB77D77178622868F0A51788CA9373F0599FBA1C99F7A6A227A143643A674F3203FA2C4FDFB18C3B05DEFD06039
+96B06F78
+7DF12BFB4953E0E78C5E300A39
+4A9E1DD2D2C3AC8A2E8DCDC3C7D4834F00C59826C34EABE8761065161338388E9B72BA88865A94B3FEA693FDC98DC6AD0032C46B31C2CA16769D37ED4C81907320C1B7333D3A7E273504A139CA91C6DF515F7945B2D3E3
+FB6D2EFE
+7549FC2ED81F603070AEF5E40246
+DE10DF2B747F942B
+4FA6CA9E
+A4446E87F940FBA8D4254936379D102DE431AFE984402279385A73E1C630E8B2FA98
+34854FF28FDF3BAB9160E7367ED5E51B2491D120EA7940A9CC0D13F1EAF3F7DB8F7A6E2C5E51
+066CDE2857B899116964844BFA456021638E835B344BDF81BDB606
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch12i 12.00 /PSOwstdutchi newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<0a111e1b111c12050106010711190f14180d1c1601121a1c0109110d1d1f1c151913010a111e211a1c16010b> 2207 558 0 7384 -1 s
+<111c121a1c180d190f11> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<04> 9434 13385 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13267 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13267 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13267 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13267 3 7133 32 s
+wst:dutch12b SF
+<0610130c11> 1271 1431 0 1754 -1 s
+<00041917181412101b0c18101413> 1754 1431 1 3142 0 s
+wst:dutch12 SF
+<0c1411> 1271 1854 0 1631 -1 s
+<001d0f1c151b1e1d001b1c1a20151011100021151e14001e14110019111e1b111c120010151d1e1c150e1f1e151a19000d1c1100211c151e1e11190021151e14001e1411000d1d1d1f181b1e151a19001e140d1e> 1631 1854 12 8834 0 s
+<0019111e1b111c12> 8834 1854 1 9531 0 s
+<151d> 1271 2099 0 1410 -1 s
+<0015191d1e0d1717111000151900> 1410 2099 3 2470 0 s
+wst:dutch12i SF
+<010506080104020806020703> 2470 2099 0 3460 -1 s
+wst:dutch12 SF
+<0300081200221a1f00140d20110010110f15101110001e1a0015191d1e0d17170019111e1b111c12001519000d0010151212111c11191e00171a0f0d1e151a190200221a1f0021151717> 3460 2099 13 9531 0 s
+<19111110> 1271 2344 0 1713 -1 s
+<001e1a001110151e00110d0f14001a12001e1411001d0f1c151b1e00121517111d000d1910000d171e111c001e14151d001715191105> 1713 2344 11 6068 0 s
+wst:dutch12b SF
+<09050b070a0805030214151802130e18150e160f> 1398 2690 0 3740 -1 s
+wst:dutch12 SF
+<1a1c001a1911001715161100151e02001e1a000e11001d1a18111e14151913001715161105> 1271 3037 7 4417 0 s
+wst:dutch12b SF
+<09050b070a08050302121a02130e18150e160f0211140d0c18101413> 1398 3384 0 4504 -1 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (8) 8
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0033 put
+dup 3 /C0034 put
+dup 4 /C0039 put
+dup 5 /C0040 put
+dup 6 /C0041 put
+dup 7 /C0042 put
+dup 8 /C0044 put
+dup 9 /C0045 put
+dup 10 /C0046 put
+dup 11 /C0048 put
+dup 12 /C0049 put
+dup 13 /C0056 put
+dup 14 /C0058 put
+dup 15 /C0063 put
+dup 16 /C0065 put
+dup 17 /C0066 put
+dup 18 /C0067 put
+dup 19 /C0068 put
+dup 20 /C0069 put
+dup 21 /C0070 put
+dup 22 /C0071 put
+dup 23 /C0072 put
+dup 24 /C0073 put
+dup 25 /C0075 put
+dup 26 /C0076 put
+dup 27 /C0077 put
+dup 28 /C0078 put
+dup 29 /C0079 put
+dup 30 /C0080 put
+dup 31 /C0082 put
+dup 32 /C0083 put
+dup 33 /C0084 put
+dup 34 /C0085 put
+dup 35 /C0086 put
+dup 36 /C0087 put
+dup 37 /C0088 put
+dup 38 /C0089 put
+dup 39 /C0095 put
+dup 40 /C0097 put
+dup 41 /C0098 put
+dup 42 /C0099 put
+dup 43 /C0100 put
+dup 44 /C0101 put
+dup 45 /C0102 put
+dup 46 /C0103 put
+dup 47 /C0104 put
+dup 48 /C0105 put
+dup 49 /C0107 put
+dup 50 /C0108 put
+dup 51 /C0109 put
+dup 52 /C0110 put
+dup 53 /C0111 put
+dup 54 /C0112 put
+dup 55 /C0113 put
+dup 56 /C0114 put
+dup 57 /C0115 put
+dup 58 /C0116 put
+dup 59 /C0117 put
+dup 60 /C0118 put
+dup 61 /C0119 put
+dup 62 /C0120 put
+dup 63 /C0121 put
+dup 64 /C0122 put
+dup 65 /C0127 put
+dup 66 /C0262 put
+readonly def
+/FontBBox [-25 -256 978 739] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842242D2C7C52988A16D3AD63FA0A6A531F598
+82C7FDFCF9F77A295F11CFFB
+5B12FD403323523254
+4E86BA9F
+872D4E553847200B488A5FAEE7
+01E74385C35D49FB3B6DDED1A522A0FADA18C1AA4E23B8C070C0FA297B23AD82279D08F991EF1040915452FF200BE62F435015E4F90719B8C599F7C2095FDF70620059BC6B
+54B433B3
+A9A2C4F2B301A3317EB2A63862D6
+5AF4E8D4235F536AF982ACA47E168132A5128B9D4FCD92629DC0B0711385886F891446D120475C112BDA8F290D0B9AE2A536C8868C12DB77C94413081F74217C8CB835F4CA6787F9CFEFE8254D60FC36BEE8B2CA3E9A68B4D09D352FE8F23060609BC43A450F68
+ED3A8D95
+59137EA683D30BF16FC51C86FE
+BB15424BA06162DD5595E7D5CC5DB8359E6B6D294A3087A5061AC20A9C39B9B89CD3B57BFA369E7CAEF01F62E530448A2315658AF7236C60
+4D7990DE
+B797AC1BA169DCAF2649400B4D
+9A8BEA50E962CB61FB22FBCA9B5E1AF613EEEB3B7A454BF4403C2C58346D713477107F8658DF2071FC2FC11E0D8C9772AA739268B6F87780F8BDCEA377160BAB
+6BAED373
+E164303DC3BB754A08B58740DC
+C4BA984C9597D0477E61672FE3E5F777CDBCE640F7A0758E1D58FB05D1729215EFBE1D24A92C9F8E5BF12CF67454C27E58A9751CE583AA961CB1919EDAC606
+0E7D5BD3
+8D06CB0FA18047898A4808F4AFE4
+61E5A2EFED1D9D0C6B6E4AC6E0696B314BDFA7137553C4E7CFA1F325B4DE4D49CBF09B1A88A03FDE0286DB8CF7DA2B3A4F301D7FFE8E3A2EE03853B9402145C5BC4C2B7754F3331C267B882083D9640D9411B85DE25100A59DD0ED1AE020839F0E7086DA2071B9B8B9C57CEACE17D208EB6762AE2C9606F8FCCB98B13CAD
+91DC
+E7B18CEFCE141D4BB9189979C172F60A5CCD6AA81D6F16B95A5B055E8D4468C8E82D16E4C0690AAA620A3504722D1AB9CF74143F860A008DEB952DA1829501
+6FDB9513
+A3DB442888AA4D6772697E79A5
+F4F65FDC8C14E201E08747DA2721DC0038FA3592E2A193DE9BCB9C9BA9EE0ECC397AC8ED374F3D901EEA2AD7586674D99DFD97582F7ECD5DC6
+78D824C8
+5FFD632F215EC7EDC559A9D237
+2D5BE1E0E6A79C2D586E197C6932DAAB9B8D16C60B94E6
+A3CDE2D1
+09BF17793A76694E559F7B5323
+7A6BF090AA8AEDE486F0202FDCD1BAEC62406F9418D46EE84B17D807E1D85D
+C8D30775
+3FE13EDE8444F8671F248D02EA
+353EA834426BDEEFB893A5CCC6A1B5AD2517247A777026628B04EF622D9570F57D1E028BE3BBE056D31352ABAD57A2DF15941D69694CCDE27EFADF96362CB6E5AC5C1A5CBCA8237343C1
+6FDB9513
+A3DB442888A722E0026666AD30
+B65C11C3A90040662AAF054E523DCCC83B9B38FE9A3EFF266BD4CAB6B086CA6CF43291B8580E8BE35D17181DE7B36A335BBBD92B99AD4BACA15CDC36311990
+4533E1C9
+DA564880FD682C574A531D361743
+9C0069B5E5A695F574242574358B83676BA83148D94AC7DE1DE8DEB041CB1CE25AAF6F0117797D93A62EE90F69007D8E74E2F1E6A6F614D723A898BA90CCF007E8EC00EAD4494154F4F740AB500DC4CBEF7D4C5D49B65B2B482FC1158362B9706D719D085AD64A42E7A7E899AC38943AA5D1B056108BF24F36E3
+DD52E785
+0E5E613C96DC86F8F2BD83B2EB
+3BCB16D69F434B84EAD4CC37D9E928A324594E9D7F3D536F79FF6315859C3DA5DBDF06C1CCE39781BBB0864F858C828D35F9480EF9B5
+872884A5
+9754373DC4BA1C9D09B81EC67FB1
+76F2ED90A44DFF2E532DBC80B024CBB247E8658E82566E7954554CFB3EE09451C2F9C33EB7567B47E037E3C592075090269EFE24BEBA0C7514FAA01CBE4F8B2CBECCF81599B5FBABF95883E3F734740D108A5085DB2B71AE831CF20F49474E5B9350ECF1160C144C
+33B1FDB3
+8B9AB10CFCC9E4FA02B7F4DD63E3
+011779EA7FA43B7E637B7F712498E50530203F7981A451E75CB33501283E2D073F37885C321F4BCC4D09B1AAE3095EF951D08E569BB8A57980712EFB9197983FC09438455ABF94EECBDF712343DB3E89BFCDBC965EE46F41DF7208B0B550438E25127D077BF9182A9FE562613D9DBB55C4CB68
+45E31FFE
+9EFF444F19F4FADE09E6E9B82942
+67C7B7CFC31BCCB03E727555D2CE19E555E517663629F45A426B1DF4B508BF012F9910ABBDEBD01A062F7A94693B172F611519EAD87808459106A35BD46B7B1B0622F79C432F0F48B0705AC05D57BA57E96CFC353A645A04F970AE8E771AC90E6B4AF369F8F93C70AC876CA967CCD3169B2F6BB14A7CCAEE1B8CC4BF7BDB
+2584
+74
+255D9ADA
+13C6FE045C50B2DA5657C0CC70
+B58A501840785C0A318C411E690A1F9FA56A69C870F97ED8896694AC7BAFD9BBCACEA4F159EE1CEB231834EBF504EC3E33136EC3670311C618EA39EBD0F1C2508A91AF12613FCF265C296FE8D0E83F4382D0B454062A38F1AB4F5D60DD41ACCE91
+55A6CE41
+C0CBC47D8CC79406016C7042DD
+FF33A954755258B87AC846BB33B427855477A04B1E60A957E04DD4CE1A5BBB6BEC2EC1A1BD621CB1D1C371D6DE095B3103EFF20F9CC19D7A3AD1F64B7D7AD04A33BDA5E28DA489FB6FB7A9D2FA81D75433F64A384D671778470ABC21FDECB025676178
+4721F623
+58E1EF19FE61DEE051CBB0DDF9A3
+963D0B11CB59B3CF78778BAC5811F73528EDDE1669CEAEFC7A9934D16AC6AAEA88D06681342EF67614A605595451BD45A8CCAC6A74BE0E0021CE669AFB86D31EAD4B704B643408E1967C0BDC2728E9D4D493C076E4B0314155DB1166766375D28477CA94D52DF9FAAC2409D54C1CA9CDE48417D0D295A49386F12DD2444F
+FEE45B59
+500BB46CC35B586B1EFC258A343C
+72A87D51E8697099F8C0A2D6E827A8F80325A3C00ADD8CF818EF2CC6FB779D10CED11C5B3F90D3487DF5D61717FD9E046C43CF7AEDFCA21D03D5155C826292EEDA46447C59C57EFA581E6451BE3E2D50B7A8E7177BAE5FD2318D329575BF37F36982059844F8922DCC
+A84CEF0A
+1022CC506C70F747EA640A7BA34D
+7C656227384EAF5BC797667DA7E9E24AD6D8C56A6A72D78A40534DBCA1997EB864C0C2F73F109AE479AD3442409CA2E151E0C1943C3C439A10AAEF3D35182685401031109D044DF44C5F7D1DB8E52CC1F606F1DC3DDD8D506BE6F0628E13332E84562D442C17925A3A93C6B05928B5427C98AC1C4B9FF49628F5
+3C99BC2E
+DF3366C6F659ECF3D96296BB76E3
+60801E60265E290B9EF6BBD3CB4E5CF712B5712D93947FC12BE5B450766A640735DB0E0F623AF44B452E93E56B2ED32EEAF2410F3130C14301B82FC922D0090D4082D40A5CCB09134A7422FFA84979E58FF5E85800F4F46C267938F3F63FABB40E8E5318C3C35D390B193D75169AEB3E4CDCAC593D6E25008F87DE81ACE9
+D9C1
+C240AEDC455EDFB4D65AB6
+159DF3A7
+EF514A061DF6DC525B8423B70E
+D44AC6EF45FAE978DF677D756547590A6F213A5652FA8AB1A5225BD61DB9F93FC305B36737F1E9F80F5534DE79C89967F7E53855910CDDA4540CE4
+2E9A7076
+628AFF8A0E0BEA1B6F6B05F0751F
+9A6B49624325F509058846AA35C59B4E8E509D491811A9863871945BAF0458256C20C8258509EF327C1072DA97C0FBFCDE4618A3C1AA0FCB21351C17BA4353B976D7F9963A90669C32FA29CA176FD615D1DA981E0B16EBF3D571D466552FCB9422CF0C5EF58182074ACF3CB4809A6DCD65082638F8D25EDF3E364AF778F5
+8C44
+93EEDFDEA7BBE594D79CBCC8EA21FF33EF813FAFAF6C5E9C0C50A356E08BD6
+D4A2E9B3
+68B1974A50DB9AEF4A320CB26E
+2BD241B93CC461A9199AF8ADA3344779B6D742BF44FA4072B6B3C27C64C1BC132E88C3395CF330A157D9AA73F0BE30627E032A7272151C1399EC2934A8E504EF3411D78347BB05
+D0BD6F19
+94426C5A4D5304A2EECE2CA74B5D
+AFA70C383C7E7C7207CCE9761BCDE53C1C1B9F0B24AD9167604A1879EC3DC0F83292F21AC6AC357754AB2AA8B806EF2AB08AFFCECA10382CAE0D911CF02C30517C149DE91D346023AA08564F43352BA2F5DBDBC4F471561E3691B1F8CE2AA90A9960D904D67DD92851179B726DF7A7
+B736153D
+42E1B02374A9802D91F62E89B5
+45CC8CE82335183FF277A2504347A81FF8C2DA0EDA41347466D0D036F90D1F7E4B2695E1C972B023336B6BAA1A1753B76328FF66FEB1F72A87BE44B742C8DDCD62718ABB5BE2487690EBB37951A8C7AD3A13EDEB9E8DEC084657D607
+5C6C9A26
+0349E1A0703BA908368DC00DE7
+254DC9D6E0D8A7B3835377DD9052FA2252FF6EE41F1EBB5926066D65BB6EC4122DF6A7BE6CF3B643C862377AC864067C396F97D151F2AC5FE657900D9B6B37076D1AEA20618778E99922165D1580B9C5C90D87
+83F0DDB6
+A160E7E8E3384C37B53D128481FF
+D5458C1DF48A90BC5C27810457047A34F96CC948CB785C7B5B01A623ECD5A0D5BB5D7F075B857F259A98BFB2DE0E60696168C7525205C961A4C3A6F286A1FCE86B0F4D2225DAC439488873F858BAA1FE33AE8FB0B08BC75BA900D65208B2EE283595EE3847B9FCCFE238
+4DEA1836
+6CC2F1D89EEA48091156B75E31AF
+8F5E1604EED7E987B7D1395D262A2384BD4BE09C4E26152847832670C2D1AE7D22FBD0D4384727B41C40D664AAC9981F4A8F32B161F741F07C91E24B0FA6E5877F2A0F2372428CB2737BD91FD542D419C56BB2E757FDE86C35DB41A8A5E237E0757E9CB54D1DEFE79E95D92BBCC1C3FB847D86D3A3DE1D1B41DE032F59AC
+15CC86E7
+A2F625B83F785179E921C567A694
+29EA3D1EC4A04D99B51725CE2D692A4BCB1218E77B32033A4E8B55A1D501AD9044E91E443BB21E273879FF4E9869D54F1060E1A5D69B8D4238F678EACB6B94BA0C4B180CC3112BF8A58A4EEF9B770925C7C960C9C63F6FDC79E1017DC1ABFAC75B09604FE44A72711AF27430BD80512BCB6151C5CCD83BE8A1E13C8C6ED9
+9EE9
+69C739
+F6A14A6F
+AB5C5FA65E9707989105EA3B58
+A38A3AC2733CBC78BBC5F7645717AA2B6F2AE33F1D085C2E76F7A41FC5BAFAEC7A2098255CACD7F8CC973EF1E7B7D1FB8DC8EDC0815062A3355D91FF7AAC98D15A926253F7C0B470D3030A608C70D4C763
+06B73B38
+870E5F99E2B839F60C033CF404AC
+2E77E5E360FAA893B987358B22C72983F0D490C1503FA982DDF8C9EE6FD0D148C54A5A3D6A3BB456D5D64ABA86647BF5379273920E9DA78A4F41E60F0B03AA49D632099AC22BAA85D37D4BFB9E9D013CC324A97C2FC67A5D5CE6C7D5A6120A542241EACB
+3DF05689
+7B142EC726259E7E6746DBE661
+C9F8F4676BFB200063137479E85C277A4104CBB3243F5BA130E4907D1E235BC84D1F87560CBC2255227CA4B3EDD850A9094EAA9FA6C4EF51394A10558FD31849F9076918E10BEF0BF39FCA69711191E733152178E92C94B357
+1FB2F07A
+F56294DC91B951835808A61C15F4
+6FD36A7144301DC3CE21BF1DEB712D1FD78B79D84E7806056ACC534A959EADBCCE8C746A38A81B0682C07E4C1003C917C76A81582D72B3B72E6F018DF60E363D1C4AA66ED4C71E466DC3D094951BB2A9DC73F89612ACB8DAAAC6DF775A784713E720E0846C5EFAFF92D515145CED1DB2D916E6D790603FC72A8AC7DE76DC
+2787
+2D01E30D16073A67825C77C0F9D6A765
+34CA4E44
+46209A7A777AF747BD50682BEE7E
+D59D4B2FFE74A513DBF7D309BDEDEEA45961F974295393B60BF6DD33C04CDFC2B64BDEAB0C0F6755CDF958B0ECA9CB99CF436E3157A7D8F2979DD90916A578E1DEFA720D446CF9BDB5E5E577413463A30FF9CE355554289F7FBA187376F96B5EC50DA745500304AEA3EF4DEAAB5F31C7011EC6B3CB455A2B87B291830486
+86C7
+B7B463F210C46D99728B27E04768862F943BBC557C9C6F9EEC38AE43D85A1ADD081400BF9B55C6
+50A292FE
+F43535CA51442AD76645D950EB67
+D443394E190E6D991B912F8850C82B58DEEF9B7EFD970ADE986F720C38D62B8F2DA4A1FDE9C4384DF4BB810344E1B64D74D8E7E262CAAD81E3160CCC4A0516779D10BBB977ACDA06AF8549C9116B78A9D8E29EB43C37E7D2EF0BC3F45EC443D91E8565F8792E44F7391A072006C4B3CAE94C97
+818FDD67
+B5F7C3A2B9CFBABF6354C526D8
+9B6B4629D0E1D0C4617E013E10377B494B9875CF5D93
+EC0F2EF3
+64E5B72F1DA81BABD28502765094
+5A5FD5CD352D22419636057C6887B54E39D8A06BB7D1B45B77C8A8C8FFC96BFEADAFF667805A0D2BEFDBF724E17A0EC6FDCD730DDDF7C56F0B93ECC6E4E7CED77088F70C6B957BD5DA48BC095F99C6E759B1ADC5F419CCD35E9C9E8A6845D1F89185C8705AE7A9EEC3330376692246501FEE6A6331A2986CA5F0E274DF33
+8855
+F79ABD
+F2A6EB4A
+84308717D9A8361D07F2F22969
+804D5A88CCCD45C0218D9379E74EA472DB8199C8F5CA79803DCEE40C8EF57D191081AA1DCB50D30BA16B465032B562CF3736D7790C8C9AED5CB87F5A84AE81A5CA478E1D43710273BA0891AA65537CDBB7C2262695C510D0
+38661459
+BF5DAC748B46880A73FFBC77AE
+08490A2C15F8C54D64DFCFC8D731BD1C911B9EB43D15C9958F9EBA2747F676A4B3D3BBA34A2E60C160E0C1E4E6AA0DADF805C8EFF5974A7EC4696C6AD40C578AA4319FBD9E632F2E4CD86BC1DBEB59791402
+9D1ED1CA
+AF0A7ED9C81C0389A77DB618B457
+D710C2B86547D7C1CAD9C5FB929EEC0717C4FD3B8ECF2C32298D91BE3616F788DC97605DC68E147F2EADA8DAD6983D385C095FF5E9B419B6005A62FC781CABC40492E1F502FEAF1149A1B9A1689688A869AF178CCFF88FAF8590937F0A2D1C4ECCE7E0409C1A6FEBFC4F66B1E4F5
+20DEE111
+593A12ABE90A83C91E624B76F5
+86D52B661DD959B8A06A1D7D685405FB2525C43A6D16A4C4EED52CFDD8D02E2C06C9C1AD68BAD4019558CE384CB844BD9DFF06647C82BA262A6EA10192999387AB6844B4BE080A06E5493D57AD6B5B2849FFC0D8D2CF9C2684
+7B1C3569
+C80D6ACCCFA061F59275819DDF
+023FF06ACA205548FBE0F10F5D4E718A2D8E3A428EE89162DC691B6E61F9277B5A3B7A195677BC17D2EE390EEA4635D3819EE0AEB482636332A8E1D6C38715B4D7E6F2991A222A3EC2C2026557DACE530784408DCEDCFE14B388A4B1
+9EDEA869
+3E2A2464AAFF539437EF5F67871F
+AD992447638ECAFAB0ACA19A99FE7CA134A5D4148E93A03415C0E4DB904125DA41BC27C6B3A0E07F0125C279A22BCAAC6D925108EC36C696E6F0DF60AFF2DA1C0D3ADEB865B964B70BC19E03D64CAE18047876BB7037268F42B55B19A6C4324AAB8D2173E4A4E331C1FD24974E57CD57C7EBAC0C7CEAEFC558788A31B02E
+F7CA
+FCBF4D5EF5BA7B2B430E106C22195FE9EB742E21E0171ED224ED8AA965524DDB166FA2E5CD867BF69242D62C165E66
+DCEAD537
+4391FA736CBDE55B291514911413
+4BFB10D16619F8B2B2ABCF882ACEF570D938B7F383B5403AD1615A2FEF62BE7EBCB5B0FF3DE8F9B2AC1E04E412660B6BACE4EB699E5D49F7896AC2197B8E7FA01FD94D4B6EEF5E8EC7B12E8928B9AA1EA5C77AA72230062E9C885333449C0A244A50A7124C60C7C23F11429C48
+8B6873E9
+2924C709676699E42FC91E30C0
+6E10EB0EC1D42CD6CFE1832FE95A70B48B7B3842155418C31A4FE65D5B2177BA7BB21A2105AA9D6D5CE41BE9833D904E2CEB45DD9D1EBAA4C9DF2CF8A16060151F002A4A8E692DD582E21D34F1367800
+7AB2FE29
+F0924AFBAB87013B1F8014C5B184
+B42EA514C09670AABDA7D1B1DDE316F8572F57EFB5EB5938E7170DE225DA055E7D49D80344D8828FBEB56CA0404D01373E9ECA1596CE760B225AE2AC257231DFC69BED3359B15306D2B4D2F91A0484A54C3CDA4049DA3FD369856C0D37153D4C704C956E4983A7D0462F23B2B965161B4F926A08647D34F1557BFFBAF4E2
+DC04
+1FF196DAF34CE14A0FEEC0B7616854B89C608A72C061160DAAED79F4E6ADAABD5E8C72
+013CD527
+52A6337052C4CC0DD1B4A6833B
+ACE8D08A745CF88FCEBE183A903869050FCAA8AB9DF9560C284B6640C1F2283FA7E3ADD18918FD08B943E5BAC4A13F3A3552C6CA33E8
+2BD4D6A7
+22289E301E6CE7D1CC3C56560C55
+438755D2D746D608CDBB4B4570E28B7E72ACB1B6859D70DF3B9E457AC5A065D9C37080FBF2CBDDD1719ECF33404397F5FFD8B24BF9F733749B351721D48142BAB97BD720133BE5ECC9FF2F324C1515DA83972F8EE4F58C87D6C5888A4F54002ECB3CD069612D1C633F333611B08F5DD8194E3AFB862CFAD3639DA54D45CE
+4593
+D1DCF191D581CE143A5EC6BD2BF2C888F1300CE61BC9CC0ADCFDF7248A58A5
+548004FA
+1378477760DE3A63758C14C49D63
+0E6E1FB475136579CAC6823902900DF2E282D6B6685E4044E70E52EC6F29DB9970446DBE6B065D4B268AF878AB4FE1957E3F3B4644B73EC5818F0FCE0D5E90BCAF314E716A2CE50B6770010CDCC6CCE10A4B27B4F7CA56D481779E20B61C574DEC870CCFC878AD88C1C057B3
+188D504E
+15F47D7DD3361096CDC8299532
+C5940356D358746B8E80282ABB7B7D435A8F0EBEB03E5DFADC850A1D29183422C56B234E9F1723FB88F04500EBC4505FD22F750D4FEA2AC693A86BC46348A52D9DB1EEC874B8
+8698EA1D
+616B29F1FB31CA9E19259C3D4F7F
+4116B07F88A5C2F26EC1D21E025D77247A3FC66F67CD9E75A18C1B4819FAE03B6FE608502412848ADE377F08D46913B8CB215EFBCD5B9A44B40CA1DAB4538999DCDCF38CBB00E6750D3054AEB0B74C2BC88279482905540A13A67DE1F4A11797AA5CB39F831BDB9158E52F1CBA5E334C6E0BD89F69A8C5
+7E49E8AF
+AC4EB3B2D03DAD7B270889B07BD0
+4EC6CCC66CF8666E797A578DC4067CECA5855472B2BAD3782F6548D06BEDA128C11306AB343C957C0E35E9B31AABB62FAB0228339EBB0A603C93E3ACBC480F4DDA6F1D9069F2CFC0139E57B8154E3CB4CE9B6A9A98174E13166FF2895DF5E5C6273C75146B27C2B53CBF
+7AA5ADFC
+51E06969C3E7D7D4CCB7BE8A5C
+27AE952FE3E0BDA43D1C321CC5DE70467ECC13EA8680A038009820E8526FA7517027921764D5BF4116DF76AE808D8C5253EB203FF1EE4134A8DEB3102B67D22F93560346A1E8CC7CC3759264C68D93B3193E1DD0CFA15C
+9445FCF1
+711D46A3166BBCD4E3F2BA2F3D1C
+14EC30CB5C30840F799CFE784BC89039B7081407636B74AA32F20D131F82CB0DB9983648397A5AA331AFF86F545BBC22A36D394F7ADC3F3EA68C25C84B8B21EA0B0D5A5963998CA1A86183FC8A32224BB6B0DA9EDC11FB9DAEA27E259D845A621D64C1C76B05314FA315799E3B2CB3B01E105E1DC49998BE11704530
+C7953A1B
+19EF6BBB443FAC4958D49D5206
+11165AAF9CE81AEA107B203B8B97D98EC6432E79B1A0266DCC7055BD0137E9D5666B6CC5C3980F0367415929B537C915357C651064852EE06687ED016AA72CFA5FCE8691E5
+31E23EBC
+BE485F0FF5DBB169954B249611
+BEAEE18037402791306C4419567016CC6908ACF30223FA13A25F8702187D7CD5A5A0CA0E86B21991CB85B7D134085472ADFE35C3D95ECE80CAE64C51C7FD12C4C56446F6155AB294EE0E32EFB4A076BDA4B4659307825E41553B825F5072D764E908
+17346FE2
+FD4B6E611A97D0E571149B38A0
+D7E4E43452030F753B3D1971D7111E4E4AE04BB86D5964E9B87498C3BBDF7A35837004D85260A1943EDF4F8B5C1604F59E2735E4B9CE56C7A89959603D78143B31CD2ECE7E1015E92071B3E32279D27DD9FBEC05AD44D39B5A
+17F87F4D
+2BC97A7BCB992DDCF35DA48B228C
+F68EE00352809455C2234B29596A6FC18DA6E2EA573D8C6B84EB3FDD6DB676CEDA21BC533DBF3B67669C40A3F863147F8B6D5C594349BBE1818C86D82BC3933AA0085A423E74D9001E9EA4BFA91F899E2F631EA91D87D130A0B19703A0F090C636B96984A363B31D64E24B7DBC5DD71407AC89F12A2229D857B3F292E04D
+B62F
+10035B718C4DA4D1C5A7318DDB23
+618E1E3B
+4FDFFF68D9E814CC786C4A17B5C3
+E9DAF063C31352E406D224D2E51675B96D618F7DFEAB5A63CD7F4D64A61533C27FB3E1231BD8DE217E82120C52E5FD331DFDBBBD532F625508AB5F28A3250B3250F4F9380520E753504BECA0913DE92FFEB9EF3C5FD6792324457327A166DAED301DB9F00A1FACD1B4D73BE8B655971DBB5F1FC0E8092B7DEC9D46F0CDD1
+3FA3
+B61DA957546A367725E74FE428644EEF78A98F5554D0CD2AC2
+49A7BF14
+A2857CBD6344DD8AD41B898E28BD
+BB4E975DE7ADE13EC4D8B5A104FC552915A067048314C32DCA575C159224BE99F95C8A042F730A5F70B88830AF0F862E483A691172F19CAE1ED4122807E6A6D0A01F201F00829574984DAAD4228F7696BD546B3A903C7B8B9B49F83B2470DE434612A3AA92ADB4B3EBD068E1C43AAC6EC14A20C7EA1C6A5D98530F5BFFA8
+8980
+F83E68EE
+D218264C37764CF4A52F971FDC
+88ED82449B93D6B7FA5A5EF61F40388AA45D685FD1CA0FB7BB41295BA874482EFC63040CA0FBBFDFB3232382B379866816B6C55EC7872AC348637BD498896F
+A2B8CF1B
+BC3EA6F31876BD790BC5F00137C6
+AF584002D3E26E0A062542450B6B6DBD412694EE447ED65B55BEC6DBBAB9E0225E0BDB8F8D7AE09290419B5535A04EC5EDC4C33066197442E65C66CA1BC46ADBAE8C7B74D376E351345FD3EE37B82B9BE4BB450D48325A1572E202CD5A207263C35B583FB72CC98F2C
+DB25ADDA
+C70F6D635522A767B2C6494E5E
+3B14FA0952345959DE98F4DDD19E1BF9431CF9371215
+4B10E106
+F365D2363521892DD032A827EC09
+C4A5745787227EE1
+81E2EABF
+1489BA1C4131103FC0B3B02FE9DE51630ACA3C65F4ABD12E4D6094A85C1BBFE9DF4C
+D0CED210AE014AF4133D77E4AA5691DE80A72A9F85EB669E3FED0BBB86760634588774E5AD44
+6A5BCB4E70E6D24D69290D26497C4B5A50AC666184D95F29F9C33F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0046 put
+dup 3 /C0051 put
+dup 4 /C0058 put
+dup 5 /C0066 put
+dup 6 /C0067 put
+dup 7 /C0068 put
+dup 8 /C0069 put
+dup 9 /C0078 put
+dup 10 /C0079 put
+dup 11 /C0080 put
+dup 12 /C0083 put
+dup 13 /C0084 put
+dup 14 /C0085 put
+dup 15 /C0097 put
+dup 16 /C0099 put
+dup 17 /C0101 put
+dup 18 /C0102 put
+dup 19 /C0103 put
+dup 20 /C0104 put
+dup 21 /C0105 put
+dup 22 /C0108 put
+dup 23 /C0110 put
+dup 24 /C0111 put
+dup 25 /C0112 put
+dup 26 /C0114 put
+dup 27 /C0115 put
+dup 28 /C0116 put
+dup 29 /C0122 put
+readonly def
+/FontBBox [0 -209 742 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684274DF5CA2235B505452EF82C19378A786E0B
+30288B05492EE4BB6123C04C
+3FB31E3DA5151DECA4
+238032FA
+D2FA7FB1824D5B65B72B33E7D9
+023B3B8C45A9D80B2FB65F9BEEA3CF7435B74F2AA261EE7A8B8E6CAF4F16A3
+77D2B03D
+67DB68A102A2187EEAEC40920F7E
+B24EC803FF899334D22407980DF11C03FBF457FF4915BBAD772428B153C571F8C15B58B3EEDA50F2F0FA7FFB9999ACDA28FDA294D77CA99CE146D611F92021BB1EE3799C8BB8E59A651C9D3FD4D40B3FAD73A53645C951DF91634C2D59E7F5B71DCCD9422EE27EE0C99C8D2F7218AC4A6E9C38
+7BE0D4C4
+E22E5581E26BBA3721462258D5
+DFBFD7DA400BC76880C1DEF24363BAB22C53F7B3A8B411454AA96722A51AE6B597954DA51D6ED154AB68C551FE9D247B6C0D42856999
+A8AB2D61
+E5C1246DA4DBEE2FC06F5A6750E1
+2464F7725AFB096B763B43E83C4C8C64ABF3B358C31CDE69A7B9EF14CD408393D766B8C3F8602AA6663961BDD7939A2B2DB938A16AC4D8E7DCA1F2EC4587D9A9F7883487C0EADA360C971503AF7C2E9E00F2BCFAD44D1BDE8CCF14AB82C52B2FD31B018D3E15589BA54AAEEFE899235A32E6D5AE8817899636E6
+D10F9433
+311D3AF9D071DA8D914DF64802A8
+2227ED890E40470CBD5B0DE74EBD9BC99DCEC14D47CC09983BE3B371BF504455FD489831EC465694CA4EC9C892701D842102DFE5DAD1C650276E5134A197FEDF984C9CE2DB482552A0968D441F2C5C194907411AC9A9360841D3C390B5C02D0B3CE98E48E5A67401
+5C83FB23
+FAB11A0D46F8C554251AFCF83E
+A09EC1FE7C84B0FB4EDD1D28028EE833C2586A1C1E9E6AA5579D8D7CF2027B7AD60EACAD8AB1A1043C78FF9FA4914D4E201759A47A5F09AB8A0C267BAEF567F3E80DF65779871C5FF7306DCF76E3C34DBDC7D8847A74B0
+DD16D64B
+212A534CB4BB034A1A200C17C02A
+844CD9F4817C3B32826A14F0096AFFC90D02846B0E5AFD777D99EA9534EB747377558C6AC5FB79769F115401F6DB68D155DD9190B0A1FAE40F9B351A9A207734FB3A983D3DF4F71B6C9FDFFA1C18D4DA9435BEA406EF2167B8AE6AB76244B56A52A0D1F0221ECC53B4B7A4951996
+C9FA6320
+FAB29B060DDF09B6184694442A
+ADDBB4DE0262762759280B5534DC23DA2C25E1586F3438D1391D7EDD955A9F5E714D423C6A4314E5905953F70FE6DF954A63CA4A746B9370283B1ED451AD54AF9B2B7B8EA8D8B909527D9D9E0865A766A76C7F6B01BA66E963BADB701C7387
+98D45D21
+BB40C5D00AD5C6DB6EAD6A5C182C
+775FD887325114B39801F543C7712243F7F6E9A911DE73760FDB1CC9D6350154D9552AD20116E0BC12528AE37A84060B1CF12DACC354F1CC89488A55DE044B3FEDDB34D442229008910468F4B078E5300D19BAC2AF053485AF09029E37952E105330399ED50E4DBAB0
+89DD0CA0
+489B77F1128856DD55E7633E3DC1
+86ABA08F793FC6C49EBA5369A1BB90BF85B05C7D204BBF46BB4A76FEE24A0033B873D80D23716FDCC4AFFF46C4BC2B36B3F98462FCA5A765499FDAA878B216F0F2D1D4D9232FBCEEF68AD5BC82C4B8D5555FA020A3396C1E666E976F30565C4A7BF15FF1
+0C37DABD
+3C3BB20583325637034B728049B1
+16F1096A198B135EB1EB818BE48E7CE6850091F548D963217710DE53674B112B48A401F0957F49CDD0B2B5F04FB5AF36E7560A10AA2B2A0B587B062FCFB90FB8B101E4D798A5A57994A76C79CE17E1F68304E9490BE2BFB56390C3ED3062909B025FB555F35EFC7A85C3A5648399966550DF44A1D172D13E4DFBBA3A8671
+0DA5
+265FD62D
+C54D11535A118AC1026ABD2F6E
+793C31EB657ABBF29915B4B8CD92DD8F6E244A841D45DFE2ECB6828D301B633658F291BDF2FE4DF0CA1FFBC98B8FDE38CD1B965F44972D513C51CAF6E310557EA84FA4DE9A0B94342F
+C907F7D5
+A3999AF4D3E5E5B4E18ACBE3F6B3
+06D1B8B9217D3277A7DC9174E76500C8F6815F1962CC1B3D0F219DC7F6DEE976467702B64E62F3778DA0BF047722383099477958D4F8EF9270D854AC5087D95C7E4B3FA7D739F6E7501F7653A7527CA62E095E2CBCDEBD7FB7624FF994F67F9CC644433F4F7D55
+1345A4C7
+9B97659E93891A07B8C00968AEFB
+7F45C8508C7E620B0F7CBED65A1E3AF18F5E3893CCCB56B1C6FC0CBB72CAE2C9542F3EDB527E9957B59D269336E0C204C53A51DED7ECB44159FF20F6A2F36C178753AAF4861F0D6214B73F7AE6C4FF7BC9494F49FC5E837689E738C6506D2C7356983DACE29F185290FE9AB2839DC62A93F6041FA60796227AA29234FDFD
+2CBF
+46F25922
+B688213D
+E9683E44AA2325D6BD428CD872
+25C7FF285E7EEC86CDC28E9801CE714653ECFD7F83757D3F0F7E3FC5511AB7283292633B9BF08A959AF3FD1AE5C741F085BFC97C1666BEDE34709794EB6B38A2E429E482F793A1E99640FA92457B5D28E6EB
+D6B2DE4F
+579A1165485B222C76E7D74C36
+412F614B604AAE105AEF7F9E1A61CD5521795967B26C38D0C62E1F1B7CD5C934F45A20096042C4A58C70D0FEBC92EC054204AA0325C676D4E91402C7BBD8B4A076489259052BCD494BD8AA858A03F89C593B38B51D4953FD33029C6E
+CD2662FC
+1428F1EFA376820C245B675738
+91636ABD489D9A812CD21F96D16FBC8515E89425D49996A6570D03253F17122BCC0D75185A99C20720BB709435C3AAC11469248835C8819C1E6DF6AB7C5AB69FB615C68C1344317F5FFB7ED206A5F050969B1D5C7A81192392AC253BCD
+41796E1F
+023CF263FF7351AD10D303CEEF0D
+9E89E666A6E55DEAAE8595DACBD8E6884288F414A27D8B23A9C9B784BF9E184A28F2680191A2ED1F1D86D3A60B1005FAF299F624A70489CF9DDFED8C5527F68EFC09B7BD7D369F3B0277B578444408DF4BFEE95FBD6478FCEB21AB0D72C6C7A663AD1C0857610091D819C55C5EB7E32591FA5FFE1963CF7448F424986623
+9A5C
+3AAAFC9525F09E0EA02D4B5625F4BC47F354850C8E3E0C9D3C2DAAA3122831D685262F5BEE
+F6ED0E37
+2A1EB37B88185C985839FB71E7AB
+E6EFEB2ACC3833BB9B9EEA8077CA42F77D5DCD9D02700718F430820F6E56605B459E372D1DB477A2B6D165948BBD48E3AD3D68E6F11E6291E11CF0E1A0D2A32D821D5E95D2B9D6550CE13C12122A48AC534DF625E06C99F913D72DC37D19B7D79B0B425F2995D3A2
+A281FC86
+EA32437AEC26006AEAC4F91333
+D6CD3899DAD73AF7865E47FA9CC63555B44161680E5FB8BBBD5D729D0CEC42F9CDEC8D492BF5E83BC439B0F2136C8D76D5A95ED7CDB21C5AC2DAA2F52E7DFBA030FCE708F4269D55D95F63DD6773
+976B459D
+8B67115C730FD9718A3A164A0A
+1FAEC299D0D380DD5C7C4D43D9C56024B974D4BD8210453F4E28BDEEEF3E18195C8CF9D1E6565FB09642C8DA42EA33937FA841C4
+C1EDED5D
+EFD87D740658B14843CB4A743DE6
+3B7A83955BABFA1A57E770F3382BDC5CD2E3C45594FFE96280DE5C06D9957CFD6FCC3B38B8DB21049029965E318700DB2153B0E362D7EE7494FC01A35ABF6BE7894A42C0DB6536F3F15DAF5E0AEBE5BE7DD4A1FA18BFD4DB0E86C063A4285E3E6BBD3A03378445
+712726EC
+94AD573FCE5D2ECDB1D2539696
+73DFF8AB6219E1C2E336F9AD9210DC8E35779A0BAC103860E3F379A4CCD460B543C343865C58FB0425801C528F29F3E600BB744E4FA8C1D65A8BFC8A50FB7256C280A43381B8
+026A2324
+D236DEFE60466DCBAE520110BAE0
+1E67A6F3F4170D77D76ABC5B2F6DC54848225F6A0874509ADC10FD4986EA82EBE8555F8A0B78D0BB4D3277D3C4776799D9D3F2ECE99A412D81CBE788639713E7A3FDAD7A459F19650020DBF46C1446F6D98993EF09F5717E44919C36E27F88C5D0E2780E50374378D5E3DD32AE583B18BE
+864B8C0F
+331296B32784FF821862384D0B
+6BCA5C7739A339D4B1582E81AC623F4B3A1F1159F6D11BC894B497A4EEAF42F6C9AED15F36B4A833E0A9AD7D2E324BE9DECCA12B08B929A3923A7FDBA6BD24BDBA795233BDF30E254C967FF8F09183F1B2ADE04AEF1F85E9C7
+F4BA1086
+DC49229C644E07BB556077A763C3
+178F38BBFD140088C7239510DAAB4685E936B859B92E9E020A9BCBBAA2FB64776D800264C1E5B31DD821957BB42E332657C71503E3004A96F8C554458EC744B8305E0548CD53B73C34020A349D9668C0903C2897278F8452E03FE9A9C23D0039CB5BD5C68D0004304950E87B5A7CDCBE067EAADDE6F3ACB512
+7CA6C6DE
+AA5FC279833F686249A201EED8
+B4E96B5CBB5458E62E7CB9555A47B9A23AF559DC8861C13BDC88F699ECC0A31B64F2E28EC8238C6600BB3AF7537D381F5DDC6C3E0A95BA60E8C3F4C4F6862592D5067321
+93EA3C8F
+CB7A87588519DE880081939745
+F9D5EEEC1D2244C905423357F56885F15976509825027874A1F4648CD665EF6BF8317B1394F97D0AB2974905A364DE883E2F7CB15AA131AB71E3F4A861
+D2C6D8D1
+E8AA4A67CDD53D8BAFF3ED1FCD70
+B4A6855EA1E490A4
+1C0B76E3
+F876612374BFB7FB171A76D76E47F8F8327D990733A3D361A3BEA6BB0CCD09BE735D
+810E7E0518C506E7741E9E4EB46FC380B70B3A1B96755B807636DA451E382EF3A7C50971C385
+424DC125D33973FEEDCAE43E50AA1B371DD8551155B6E291DE3036
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch14b 14.00 /PSOwstdutchb newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<1c2c3a362c382d0e011001112c342a2f33283831012d3538011b2c28393b3830342e011c2c3a3d353831011e> 2207 558 0 7384 -1 s
+<2c382d35383328342a2c> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0d> 9434 13300 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13280 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13280 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13280 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13280 3 7133 32 s
+wst:dutch14b SF
+<0c11101c151817> 1271 1458 0 2055 -1 s
+<000302000d14110007111b1513170018120009111c19111a12> 2055 1458 5 4703 0 s
+wst:dutch12b SF
+<07111b151317> 1271 2007 0 1899 -1 s
+<00050f1b15101b> 1899 2007 1 2539 0 s
+wst:dutch12 SF
+<1c2c3a362c382d> 1271 2353 0 1980 -1 s
+<003039002b2c39302e342c2b002838353b342b003a2f2c00292839302a002a32302c343a09392c383c2c380033352b2c320a00212f2c382c0028382c003a3d35002c3e2c2a3b3a2829322c39000900342c3a> 1980 2353 13 9461 0 s
+<42> 9461 2353 0 9531 -1 s
+<362c382d> 1271 2598 0 1643 -1 s
+<0028342b00342c3a392c383c2c380a00162c342c382832323f003f353b003d303232003534323f002c3e2c2a3b3a2c003a2f2c00342c3a362c382d003638352e3828330009003a2f2c00342c3a392c383c2c3800363835> 1643 2598 14 9461 0 s
+<42> 9461 2598 0 9531 -1 s
+<2e382833> 1271 2843 0 1734 -1 s
+<003d30323200292c0030343c35312c2b00293f003a2f2c00353a2f2c3800393f393a2c3304390030342c3a2b0a> 1734 2843 8 5651 0 s
+<242f2c34> 1271 3146 0 1817 -1 s
+<003f353b002c3e2c2a3b3a2c00342c3a362c382d08003a2f2c002d3038393a003a2f30342e003a2f283a003d303232002f2836362c34003039003a2f2c002c393a28293230392f332c343a00352d> 1817 3146 13 8288 0 s
+<0028002a35343a383532002a3534> 8288 3146 3 9461 0 s
+<42> 9461 3146 0 9531 -1 s
+<342c2a3a303534> 1271 3391 0 1944 -1 s
+<003a35003a2f2c00382c33353a2c00393f393a2c330a00212f3039002a3534342c2a3a303534003d30323200292c003b392c2b003a350036283939003a2c393a002a35342d302e3b38283a3035340030342d35383328> 1944 3391 14 9461 0 s
+<42> 9461 3391 0 9531 -1 s
+<3a303534> 1271 3635 0 1630 -1 s
+<0028342b00382c393b323a39003a350028342b002d383533003a2f2c00382c33353a2c00393f393a2c330a001f> 1630 3635 9 5759 0 s
+<2c2e28382b322c393900352d003a2f2c003a3f362c00352d003a2c393a00292c30342e00383b3408> 5751 3635 7 9189 0 s
+<003a2f2c> 9189 3635 1 9531 0 s
+<2a35343a383532002a3534342c2a3a303534003d30323200292c00280021121e002a3534342c2a3a303534003b3930342e001120130039352a312c3a390a> 1271 3880 9 7064 0 s
+<1d342a2c> 1271 4183 0 1757 -1 s
+<003a2f2c002a35343a383532002a3534342c2a3a303534003039003b360028342b003a2f2c002a35342d302e3b38283a3035340030342d353833283a303534002f283900292c2c3400362839392c2b08002800392c3628> 1757 4183 14 9461 0 s
+<42> 9461 4183 0 9531 -1 s
+<38283a2c> 1271 4428 0 1631 -1 s
+<002a3534342c2a3a303534003d30323200292c0035362c342c2b002d3538003a2f2c00332c28393b382c332c343a00303a392c322d003b3930342e003a2f2c00101e18390028342b003638353a352a353239002836> 1631 4428 14 9461 0 s
+<42> 9461 4428 0 9531 -1 s
+<363835363830283a2c> 1271 4673 0 2118 -1 s
+<002d3538003a2f2c003a2c393a0a00212f2c003a2c393a003d30323200292c00362c382d3538332c2b080028342b003a2f2c00382c393b323a39003d30323200292c002b30393632283f2c2b0a> 2118 4673 14 8686 0 s
+<1c2c3a362c382d> 1271 4976 0 1980 -1 s
+<003632282a2c39003435003a38282d2d302a003534003a2f2c002a35343a383532002a3534342c2a3a303534003d2f30322c0028> 1980 4976 9 6412 0 s
+<003a2c393a003039003034003638352e382c39390a00122c383a2830340021121e003536> 6412 4976 7 9461 0 s
+<42> 9461 4976 0 9531 -1 s
+<3a3035343908> 1271 5221 0 1764 -1 s
+<00393b2a2f> 1764 5221 1 2202 0 s
+<00283900201d271914141e> 2202 5221 2 3426 0 s
+<101a1823140800302d00392c3a002839003f353b3800393f393a2c330439002b2c2d283b323a080033283f00363b3a0036282a312c3a3900353b3a003534003a2f2c002a3534> 3399 5221 13 9461 0 s
+<42> 9461 5221 0 9531 -1 s
+<3a383532> 1271 5466 0 1595 -1 s
+<002a3534342c2a3a3035340a> 1595 5466 1 2699 0 s
+wst:dutch12b SF
+<060b0e000e1c1516151d0f1c151817> 1271 5848 1 2737 0 s
+wst:dutch12 SF
+<121e22> 1271 6194 0 1723 -1 s
+<003b3a30323040283a303534> 1723 6194 1 2687 0 s
+<0030390028002d382c373b2c343a323f00382c373b2c393a2c2b00332c3a38302a00352d00342c3a3d35383130342e00362c382d35383328342a2c0a0022342d35383a3b34283a2c323f08> 2687 6194 9 9531 0 s
+<303a> 1271 6439 0 1398 -1 s
+<002a2834002832393500292c0035342c00352d003a2f2c003335393a002b302d2d302a3b323a00332c3a38302a39003a3500332c28393b382c> 1398 6439 11 6458 0 s
+<00282a2a3b38283a2c323f0a001c2c3a362c382d003039002b2c39302e342c2b003a35> 6458 6439 5 9531 0 s
+<3b392c> 1271 6684 0 1573 -1 s
+<0035342c00352d00392c3c2c3828320005362c382f283639003632283a2d353833002b2c362c342b2c343a0600121e22003b3a30323040283a30353400332c28393b382c332c343a00392a2f2c332c390a> 1573 6684 10 9148 0 s
+<00132c> 9148 6684 1 9461 0 s
+<42> 9461 6684 0 9531 -1 s
+<362c342b30342e> 1271 6929 0 2001 -1 s
+<003534003a2f2c00121e22003b3a30323040283a30353400332c28393b382c332c343a003a2c2a2f3430373b2c003b392c2b080028003b3430373b2c003930342e322c09322c3a3a2c38002a352b2c> 2001 6929 11 9183 0 s
+<003d303232> 9183 6929 1 9531 0 s
+<292c> 1271 7174 0 1489 -1 s
+<0030342a323b2b2c2b003034003a2f2c00121e22003635383a30353400352d003a2f2c003a2c393a00292834342c38002d35380029353a2f003a2f2c0032352a28320028342b00382c33353a2c00393f393a2c33390a> 1489 7174 16 9266 0 s
+<212f2c> 1271 7477 0 1631 -1 s
+<002b2c2d283b323a00121e2200332c28393b382c332c343a> 1631 7477 3 4049 0 s
+<003a2c2a2f3430373b2c003039002928392c2b003534003a2f2c003b392c00352d0041323535362c383903003d2f302a2f003d3032320039303a003034003a302e2f3a> 4049 7477 13 9531 0 s
+<32303a3a322c003235353639002a3534393b3330342e0028343f00121e2200322c2d3a00353c2c3800293f003a2f2c00342c3a3d35383130342e0a00212f3039> 1271 7722 10 6898 0 s
+<00332c3a2f352b> 6898 7722 1 7627 0 s
+<0030390034353a003d303a2f353b3a00303a3900282b2b> 7627 7722 5 9461 0 s
+<42> 9461 7722 0 9531 -1 s
+<2c2b> 1271 7966 0 1492 -1 s
+<00353c2c382f2c282b0800293b3a003d2f2c382c3c2c3800363539393029322c08002a28382c002f283900292c2c34003a28312c34003a3500312c2c36003a2f283a00353c2c382f2c282b003a3500280033303430333b330a> 1492 7966 15 9531 0 s
+<182d> 1271 8211 0 1422 -1 s
+<003f353b003d353b322b003230312c003a35002e2c3a002834002c393a3033283a2c00352d003a2f2c00353c2c382f2c282b0800383b340035342c003a2c393a003d303a2f00121e22003b3a30323040283a303534080028342b0035342c> 1422 8211 18 9531 0 s
+<3a2c393a> 1271 8456 0 1595 -1 s
+<003d303a2f353b3a080028342b002a35333628382c003a2f2c003a2f38353b2e2f363b3a390a0022392c00352d00323535362c383900303400332c28393b3830342e00121e22003b3a30323040283a303534003039> 1595 8456 13 9249 0 s
+<003034> 9249 8456 1 9461 0 s
+<42> 9461 8456 0 9531 -1 s
+<2b302a283a2c2b> 1271 8701 0 1933 -1 s
+<00293f003a2f2c00322c3a3a2c38002a352b2c00411a0a03> 1933 8701 5 4000 0 s
+wst:dutch12b SF
+<090a0d08> 1271 9004 0 1866 -1 s
+<04> 1870 9004 0 1928 -1 s
+<00> 1928 9004 1 1966 0 s
+wst:dutch12 SF
+<0015> 1966 9004 1 2135 0 s
+<353800282a2a3b38283a2c00121e22003b3a30323040283a303534003534001b1e00393f393a2c33390800303a00303900072a383b2a30283207003a2f283a00342c3a362c382d0028342b00342c3a392c383c2c38> 2127 9004 13 9531 0 s
+<3134353d> 1271 9249 0 1756 -1 s
+<003a2f2c00343b33292c3800352d003638352a2c3939353839003534003a2f2c00393f393a2c330a0015> 1756 9249 8 5519 0 s
+<3538003935332c00393f393a2c33390005171e09222506003a2f3039002a283400292c002b2c3a2c38> 5511 9249 7 9461 0 s
+<42> 9461 9249 0 9531 -1 s
+<3330342c2b> 1271 9494 0 1840 -1 s
+<003638352e38283333283a302a2832323f0a001d3a2f2c3800393f393a2c333900382c373b30382c003a2f2c003b392c00352d003a2f2c0041093403002e3235292832002a35333328342b003230342c> 1840 9494 12 9233 0 s
+<002838> 9233 9494 1 9461 0 s
+<42> 9461 9494 0 9531 -1 s
+<2e3b332c343a0a> 1271 9739 0 2007 -1 s
+<171e092225> 1271 10041 0 2087 -1 s
+<000c0b0a2500352d2d2c3839002800402c383500282b2b303a303534283200353c2c382f2c282b08003c2c383f00282a2a3b38283a2c00121e22003b3a30323040283a30353400332c2a2f2834303933> 2087 10041 11 9531 0 s
+<2928392c2b> 1271 10286 0 1791 -1 s
+<003534003a2f2c0036393a283a050600393f393a2c33002a2832320a00182d003f353b0028382c002a353336303230342e00353400171e092225000c0b08003f353b00392f353b322b00382c3632282a2c003a2f2c> 1791 10286 16 9531 0 s
+<410913222014271a1d1d1e141f> 1271 10531 0 3181 -1 s
+<03> 3169 10531 0 3268 -1 s
+<003034003a2f2c003328312c2d30322c003d303a2f00410913222014271e2021> 3268 10531 5 6678 0 s
+<10> 6658 10531 0 6821 -1 s
+<21> 6801 10531 0 6940 -1 s
+<030028342b00382c2a35333630322c0a00242f2c34003a2f3039> 6944 10531 4 9531 0 s
+<332c3a2f352b> 1271 10776 0 1967 -1 s
+<00303900292c30342e003b392c2b08003a2f2c00322c3a3a2c38002a352b2c00411803003d30323200292c002b30393632283f2c2b0a> 1967 10776 10 6526 0 s
+<1d3a2f2c38002a352b2c390033283f00292c0030342a323b2b2c2b0030340032283a2c38003c2c38393035343900352d00342c3a362c382d0a00242f2c34003a2f2c00121e22003b3a30323040283a30353400332c2a2f28> 1271 11079 14 9461 0 s
+<42> 9461 11079 0 9531 -1 s
+<34303933003039003b343134353d3408002c303a2f2c38002800412203003538002800410f03003d30323200292c002b30393632283f2c2b0a> 1271 11324 11 6361 0 s
+<16382c283a> 1271 11627 0 1803 -1 s
+<002a28382c00392f353b322b00292c002c3e2c382a30392c2b003d2f2c34003235353130342e00283a00121e22003b3a30323040283a3035340a00112c002a2c383a283034003f353b0028382c002d28333032302838> 1803 11627 14 9531 0 s
+<3d303a2f> 1271 11871 0 1657 -1 s
+<003a2f2c003a2c2a2f3430373b2c00292c30342e003b392c2b080028342b00303a39000030333632302a283a303534390a0015> 1657 11871 9 6087 0 s
+<3538002c3e283336322c08002800332c2a2f2834303933003a2f283a003039002928392c2b> 6079 11871 6 9531 0 s
+<3935322c323f00353400121e22002a2f28382e2c2b003a35003a2f2c00342c3a362c382d0005342c3a392c383c2c3806003638352a2c393900283235342c003d303232003230312c323f003b342b2c3809382c3635383a003a2f2c> 1271 12116 13 9531 0 s
+<382c2832> 1271 12361 0 1620 -1 s
+<00121e22003b3a30323040283a303534> 1620 12361 2 3069 0 s
+<002018161c18151812101c211a> 3069 12361 1 4685 0 s
+<260a001b3b2a2f00342c3a3d353831003638352a2c393930342e003a28312c39003632282a2c00283d283f002d383533003a2f2c> 4650 12361 8 9531 0 s
+<3b392c38> 1271 12606 0 1654 -1 s
+<003638352a2c3939002a35343a2c3e3a0a0012283c2c283a00112c342a2f332838312c3802> 1654 12606 4 5184 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (9) 9
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0034 put
+dup 3 /C0039 put
+dup 4 /C0040 put
+dup 5 /C0041 put
+dup 6 /C0044 put
+dup 7 /C0045 put
+dup 8 /C0046 put
+dup 9 /C0047 put
+dup 10 /C0048 put
+dup 11 /C0049 put
+dup 12 /C0055 put
+dup 13 /C0057 put
+dup 14 /C0058 put
+dup 15 /C0060 put
+dup 16 /C0062 put
+dup 17 /C0065 put
+dup 18 /C0066 put
+dup 19 /C0067 put
+dup 20 /C0068 put
+dup 21 /C0069 put
+dup 22 /C0073 put
+dup 23 /C0076 put
+dup 24 /C0077 put
+dup 25 /C0078 put
+dup 26 /C0079 put
+dup 27 /C0080 put
+dup 28 /C0083 put
+dup 29 /C0084 put
+dup 30 /C0089 put
+dup 31 /C0091 put
+dup 32 /C0093 put
+dup 33 /C0095 put
+dup 34 /C0097 put
+dup 35 /C0098 put
+dup 36 /C0099 put
+dup 37 /C0100 put
+dup 38 /C0101 put
+dup 39 /C0102 put
+dup 40 /C0103 put
+dup 41 /C0104 put
+dup 42 /C0105 put
+dup 43 /C0106 put
+dup 44 /C0107 put
+dup 45 /C0108 put
+dup 46 /C0109 put
+dup 47 /C0110 put
+dup 48 /C0111 put
+dup 49 /C0112 put
+dup 50 /C0114 put
+dup 51 /C0115 put
+dup 52 /C0116 put
+dup 53 /C0117 put
+dup 54 /C0118 put
+dup 55 /C0119 put
+dup 56 /C0120 put
+dup 57 /C0121 put
+dup 58 /C0122 put
+dup 59 /C0124 put
+dup 60 /C0127 put
+dup 61 /C0262 put
+readonly def
+/FontBBox [-50 -256 920 764] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842247DA7FC91B9FEBA82925C7B7A9B0D22DD1
+7C0E9A7093608F1410546F00
+09F98531B5959B588C
+79CC3103
+04952A259B81E452111B161889F2
+3347D5B60BCBEE9DEA320EC36F8F8E4485C03CD6EEB3F882180086CE0471E1CA1A4F2EB1D79854FAEC9E095FE26CFBCA133E36124CDEBB7D8A85300AD1F0F916EE730CB9C210361B827FF637510A47A20B477D6788D0C4E48B1195C329378AA1D8574A6FD6BE84
+8C1C7C8C
+88054795FFE8E6D847339C2037
+CF6834EBF57E559A541BC41D4355A7B901BD6BEA1380E49F95F59E06C54029D7D3E25F5C79CF02BE50380609FBCEBA700B3412273EF8C1D0
+CB5F9C5B
+36DC4E45191E492F37AA19EA66
+4C06312CB899F76226E5CD4872619D8724B0A63B3939394AFD6507ECDEC8F809353F219F8B4C55B0A069B766C89A6901D401A3C7E212F85300D5E9A6BDCF98BF
+7F7DA7DB
+7ADD8C6F9571E1A31560B02B19
+15CF48CDED5418EAA6F218A1FC21EABCCD54C48C89D07C5C6C67F93556ADCA634F522BA59FC60378E8C6EC45D5B9FA2547EA85FCA6D36339578E5A9B1272B7
+5B6B00F6
+17DD865D766161250A6BE43727
+89A5E4A80650CC858C80B0F32234A2C14647404A779294A0AE08AD3B3597D8CE397B4F0E0B7E1B81E4A2F8A1445B49CEB3574C5021160280CF
+587626DF
+C5D71AFB150469E609AB750E41
+B77997BBAB288994BE952C462F1F8429CDC51CB2872916
+D43E776C
+36B4FFFDD06DC65B05462693C3
+2FE5B20EED8C90559B0F5E4A3571BCD6F232546FFA3E32CFEC7EFF5F695D08
+ACDD06BD
+C194ECA77A408D6E7A149F7CDD
+EFDF6AD4360051B32D0AB7EE2EC9D2BF22CBE0841DF26008A97D08C6
+4B872D6E
+F3836BA5C5A9AC32D1A365FAFC
+6638976156E445F5978B725A51BB4661EC1316811D3D4918B08BBE522412B6D273BE93C7C31B04DDFB9B3F5789C07A2681758C85C9647C7E6FDD45F297FFB1308893A293312ECC9751FD
+AEAB2131
+B5B2DEC8EE69E7D55464EE7B1D
+BF351FD92E0F573091ADBA308F279079E6E3F1A0E1D33730A46650AA0B8A1FAB249ED3370CE20B085CE2186086FC6885FCE89C9335EF9D17EED3352066BE0E
+DA054FF3
+F5E40A76F256788300FA3F81E2
+97E7AEA3FE1AA6A94EE8EFCB82EECD8CE1343D569C57BE299C95D9EC93B8B6B528CA67DFC382AE998AD814
+DAB52C53
+F1233D5727108E81936338BCB61B
+03E6DE12D8A07FF69703B47273DDE0543B667FEF9D934913A91D07E505D53ACB6B79C2110F6D38C90B6502C063AF70836F1F6E78DF85CBC82D3ACC093E02F47DA13A81E49F0D2DCC7BDC2682FB530E88C50BFAD605A7776E01C2520404FF0AA2BC841999F8
+7E95EF91
+9A01557F8893944FF8384AF056
+2C85694C266DE368DE784F3132021C8F7DF9AAAE105D2C1D92A11EAB27A05B7106A3073026C2DE8E8DE364C13976EDFA3A5D17E92996
+138EBA90
+70F90CE6416044C2D5E74709C7
+38989E932312981F6494FC4FBBBE4450085CA9119CBB63C21EEDC273463F3D4D68CFC1A6C086DF9351
+B81392B5
+4CD8EB8F8A4BD38E377029E6C5
+78F5239701896530EB4AE6A50E7D5EE67C695DB0BBF47763AD0EC76DEDC8B793DA9D57B9DB4E27
+11D40023
+D7BEA3CB314BFB9053DB2A31AAA7
+432D7D3BDFE39C2F3EFDFA4BCA22EE74A3815DD3CF243C97EDBD5FB94763C73A37268D7DA392E8C12FEAB0E4E8F130C58706816DC6F9C786A5998A117B0D8EEBA94A12F7D72F7A5FEBC52674C555B349916DD44CF35D5083BBFB9E890FA3C26517FCA1842F8398B158745E1FA8986751755F5E
+13B36106
+2C0D510EAF48D0FD7FCA39B43E07
+9AA71F5C9DB69DD99C72E4AAF8BA8D7918598298B969B36D607C7D4A9186C275F67F4B64F487CD13354400C389A30515F8E3DC8B7A19DD2A0281016F52269C5C2475FBAF061F2C7B563182E61381D6419B4F6FE4546818EE4D54A47AB7258472054FA6B4E5C7943BBBE930F3CD46093318A07A0F8C55A1BBA8119E050EB8
+0C48
+7A
+A5A10279
+5BB2B98C633FA9E6E8602B0D2C
+1E4F78F0714018263D0CC22DD21B9D62F4952AA50D33D66FF564BCFB33E5961C92F5003ACC3E60A4A38EAE59642F901EFC6A971A8610C92195FA31D67E66E9FF5F418E031809AE0E5F1147E3379E0DF90A2B21543447C0E32660CB02860CDBEFC6
+B049F89E
+FB02AC76DF566732A076124A59
+410EF51828E37ACC2C2603C21742FD2AD2F5F5E0D41F8CACC9A58641A78C95EB0B35E27FDCBC0E4895BD8B0D81783EE95D8E7D2E2C0403EF9468B0690FE23AF35775B29FC05E657C0193750F4E893AB665BCA243276BCAB16C7862ED9761071BC726AA
+A8884C88
+A32B8E140DE3AF8EE4842D158E88
+EE3F5909A5F83845761BC4AD9744142518E12B66B264460D6AE569BDF7536F080BDF84160F550076E091766C2E02852202C581A3AA644EF5124482CAFF0666E9F8746A24240151DD70DD05C222F4D3E875B0AEB113BCF40C5EC05F961081B693A1A6BA84F13A3825CB71A171620A8321CF76CC944B1E052FBEEFC8D7B462
+DBFCC725
+31BCC6CEFF22D48FCC3E3D6921
+2E49DF0503A9729952F5DB70286AB197D55F1120E47E9DCE3A27830C294A6A01767FA5C918872AD32D44A23ED1833C9F2E549A9710F589A1C1B748
+242EDBC0
+94A48B9B1F74BCE966E25A8AA3
+F115026A75458C637F9DD153D9E459C02D740EFD4D3C77AB3EAA42BE8E900B16C4E3545409BFD28032250F755077CB03D46B364AAF23EC81C19FB9073AC5E5B87E6EDF380BA446
+1F402EE0
+11C9389537EDC2E5ABF3FABDDB6C
+50DF24850CFB9ECC77379E05066A0C4857D04111DC81DD1922A9C80FDA90820793596B9C8935038D2D6A2BD33C3FED158B8D112B9AB4F44554941F8E1514736F53658C65474ABA82A344338767603B4593133E2D0BABB73C27A2AC5F93D733FB0E002A34968744A56EA457B9E6F9A9
+93128566
+CDA591ECBDD333C1DB4B61BD20
+023FF06ACB4B4F24292D387B14E8720F206F89E90E40D4AC574BE80ACA9256725C3609899F27B3AB3886529C9400CC27F98246484C2AD17E1A4FEBDDF829F44E608EF461828D055A1CB4AD2E2837C3304C09BEE362455140A8C5D2D4
+8A84FC85
+03699F53D24F88BD69CEB33E58
+A669E704A353A3210FBB8983A92D453EE1CBDAF27BDEE66ACE293AC98BEBA0D803A504807B6DD51F0882A42F5C79110C9AABC41115FAD71757617647D7FDECA699F0631A1445F94A470D2D775EE0F3B376CDF0
+822DD23C
+42E0CF2E0CC34CCAE4E2A5468249
+EBCC78274421B483478B6A9D64D3F015896E7C1683F4108A8C24CDCF02F09E35ADB409DFD861BCCD63CDD35A5AA7025761AD0B24501A230D829BAFFBC7CBDA7D7852D9B5CABFD051705D72C52CF77F9C99C3A445FA6C846735FBDD52A8140403360ECCD9B7AE26532B44
+3016A8AE
+FA58F8158DA94E8CDAEEE3FBE028
+D514C87AD35D07368848419528A5E00CEE0B2832C1506AD4E0BCE946592084E5D7C7A862D5EE4153CAF64A81A29B469DC8701BF5706C9DBA1783731F8DED1F78757EA1B424670745BF600554212A4E8923F1EF1B565A7DF233482B7CDDCDA54F8B62FACC2935442FD981729CC2583EC8B43FECABC5378E78A41068192007
+1394
+15703E
+E9006352
+7903994BBA6ED8E5C47FABD595
+9EB539EAF77E8524FC09D13E264FB84C7956083BD26C1721520368C5F223E4D8DB9265AC253E664A8D1946EB96141DC101D118DC61E2A19B69945ADA59EA1E40CA114C1846F680190146AB30BB71589D82
+16D11CFD
+48E1B4FF68A3585DB6A619EA936D
+0B6239F7B70C54C8B7682715E362EC34A83968B51ABEA0FCA473B692BB0F713C90B6922DCAC48EA2ECF489AC6107805A6CFF40DEBC92998748AB7A001130C26EE704A3EDDDC7CE4757A72B62B23491D2CA5BBEED4D71B5A0A24A969DE9B0DA9A00E95A1B381F730786DCCB66CC8EA57826A929
+83F93697
+9A02A8BA5AE7D88CAD559BAC06
+FE38E3D37E042854485D43916C3160FCD03D3CB337BEA57CC1ECE9591C78548DF5A66F7954F6034F4D79
+97B3BF7D
+3844B9F7B1AAAE0357D3371153
+69B5CFD2C245C629CE2A63CAFECD51FED4C14ED3FE71D766DEACB06FB71975DF0DF7208BF4F781DD695AAEF0
+930059A3
+0C61BAD93B223CDFBCD955C2F3
+34AC79C63DA8433F8D29EF294E2A86E3DDF399882B78
+F0481E47
+60F66AFEEB4ADD5993327642EEAE
+54372558431D3997DD320608A1C168AACDFEB75181D6D1112751043183948A217BBE40C98B49BC9E7E94DE21E0ABC1D745293381E28025F42D040E76C91FB8E5FE5CFB82708A59FEAB0FBCB76FB38782CC8DA07B6952CB78603206456E6CE3B2F55AEF913A12497B4CF9ECADA365BB165CA65FBCE7E2367C5E89669C86D2
+49E2
+AEC069
+2DFFEA6F
+3CF19D30DB5A6CBCF41C45816B
+9AC1146B9B0660CB689C5A7DE9CBD1C5FF8DF8B5FF006413182BF91E561B910D9F618B615939C2D6AD02D8EE69C734D62A33FE967DCE0A35FF387C1ECD36DDB23A33CDB030CC30715CE86379195762F24E60B74071D73FD7
+D71F2A97
+98CF93AF83BA415DF449157850
+C07ABAB328E66DB7501A5F4D2880B863DFDBDCB1282EAB69E571FFD2FD16F96B6FED35226AC070B9454097D037DA735661119EE27BA5DD1FE0356493EAECD6C8CAF408858142EC1B4E853F76E89B1D451B25
+B75CB111
+11D84500E4A4213F1FB0B88C188D
+46282036561B4E1CE0BAC3C55EFDB4301B3BFC94EA5E7C7538E2E31DCE67301437BE98ABA69C6AFDF5086E1CD9D080B4B34F09D41D794B7F94CE83C4C99B07E9582D8755E98B333DCAADA10B3CDFD3A25B04E7ED4E303FFEC24622EA3030C2F9F9FDA3F7A873CE144815DBC3FB7C
+4343AA1A
+B7D195E397475A052BDEE41869
+26592E09688504D70866FFC781943443FE1BFE5811101FE1FC18ED7FB99495D75DE243554B24B8593DBA3FBACCBF09FEF8A4E30251505CCAED042C5526BA6EF82243650DD454BEC4ECED397BAA4FD87FCD57068F9A5C4B99BE
+FAC8D2E3
+92DF721CE7053A5590C3636CC2
+8E812175AF2DC91E9054FEFFE2BFAD5D4BCF9720C5FE0B9ED3E791AA70AF0296B587E08291E123D63AA261FEBC4887922E7FBB983CB56ED7888031AF3E97C7AF6F4400CB59A11870CE2BCA9DAAAF08106F85BEA321A543403CBC6585
+AF282E55
+CBC5E7C82EB541558FEC8C4702F8
+9F660AD31EFE997BEC5EA7B72DA86882CF9CD454563F53FAFCA8017FDB2BD5D37041041F3A83456AD32039DA95773A482EE609C45377651497204E4EA7EFCA52DB1FE524E70F9710CA7C4B82100A3DFF6C99BAC0FB5F842765BCD03E85BD7E6DBC61D4AFEAC117235135BE5985D9F27D1CFD476C5FAF6485188CCA51E004
+8B4F
+138DB50C63CCC8ADCF362E10480AD276EB5F1E6D046CCA341A7A8EDFAB9668F120590BD753C9E4F6088D0376F96A52
+DCD67355
+FC4255D2BEDE75AF942D74B47309
+4763770144FDB29A0BD55AD622B27D59E9E2CEBEAA28B397BA172A294E19C2B537D2B3C7D2A2BF977903EA5A5935F39361C26BAFFC92E78BDB08BB9938DCE1521A8E885CF0804F079EEA4CD70452EEFC5116DD5A2AF646A06B31D84970897AFF2D283C583BF525B1550F6FE4F6
+2B575B15
+73848ABD2E8DF30CEAA5424D24
+3AA8BC7E289D09794556851E2DB804B57C5EE12FD25E81CF5C7B527F1EE72EA69AD24ED0F5569F1EF79E51CB46F29E2ED6A5E2B482AD74BC1599599ACFC4BEAC49CDB95EE829AF07FC2A6C4FF68FA428
+D4D9ECD7
+CC6CFFBD18D097B0840F4DA405
+3549A93001F255823F9BCECF781AB9AD2F8EBB62A486B7C0A37CAFEADD58F8E4C6565E0C31E1F5BDAFC794C38D6E89C9253A62E28A1EA829C67F5374A627CFADBC8D6F114E2C3E1962855C82176E7E07055039B6A40439351D4E008AAF9ED089FF9518
+69D8404B
+A43ED8B870DD4FDFD810581287CA
+52C91C95EDD469FAB9CA255C283859CCF1B5855F356D5FA4EFF00EC384B7C790F761E51DC35A52544302337FA83ABBF6ED49A87A4B655C644B287A8FE83E586EC01D0D443FE9EB9B9C63346580A063B6CCB37E044338C054DD4355BB5928FB68ECD01BA1C8EC9C41EF8667B851CBDB275C019DBE7160EDEFE33F2DA77F46
+3132
+4BC0F35BA670F189C20B047CACA211DB59EF4A7815FDEB53072BB7C59DC0BF6603981A
+85070EC3
+3A8C27F60E533F3048F64A0CA1
+C46310F4FFC6D16C435545FF57DDCCEAE8A8BC493CEA59AD8D29A89E856110AA47DD5219EE47CD8952ECC756F73B246DBFDD605EEB77
+3D754CF7
+CAA053979BE9B283172AE4860C36
+1B431507CF217E37BD98A774EBB5C44F1E75C7F55C667578112EC0C927054EE64CFE121F9ECC5010DEED0C9911692F3197B0416E8AE72677B43A61853E36D06A9F4713EAC5D4A82A23A5A6F4D8BB41D2D828D78D63D3EBC9F77B1D2AFB11E3A1729E081BF4A4F425981578DA9011FBCED8C63C3EE4669137DEF2E27CA40F
+EF64
+0166E072C09215C399826954CA6446F87CDD9681517C7A38FF8CA923F8B513
+73E9FF70
+4BF348BE87EFA22E964A440CF952
+3D3BF23FC06137ACAE096EB3566C5786BD198EF86DBB09A23459A335D398B5BDD4B0BB3BD392BFE6DF63F1E5AE07C1AAA58CA74A71639E2E618C0D04274DE0521B0D1103D019128F9F5523FCC6C97D6B101EA43B2B3A5DF0AD12675A9073E6D097D2397B7EC16E0AB6CA8A54
+26E37360
+B108615DE4AEDC823AAC62D205
+1CCCC0A32914AE049ABA95E72610F38941EED847F9A38019359B1F3EB9F24074765633EEE04B4EF3D45EEB6440BF8AC219FC094AA054A262C3113F70B70DAC6B3A56FC7F0D8E
+AF2A2878
+91ACD47BEB9962C1C6D6ED535A8E
+130B46D35727BECB94ECE8A0804FC1058C0C851FC13C20D28324F78470D82EEBB453B0851CA23267F150A0B50DA36BB9E61383A28F64B3CD068E1B825BA6AE8969D68504DF4C0C7438D9428874DB1D51DB2FF91902FEA0DCD75A8F4F68FDC31D95B443E85CD5D24A27AACF4EE9FBACC5FB502BF88663AE
+86C05CB8
+487ABFFB974F2ADF2058C75011
+0A03208A2BE754AB068961BA5964CA792DA44A29717676C4EC5838929C43F66AC9B181FA012DDAC6CD515AAAAD2CC12D3C6433707CC0E3715ECF2C423E65DC8CEBA99C508963FFD8DA896A1F4DB703FD802223C134E8BB
+7E41CEBA
+C9DB06D1F473C05AAC77A177E4C9
+6297767888F8F3AC6C5ABA02984F60695F789522183C8B57E2D3757069E7CDCA58DCC1E733CC6E05DFD1C06E15B84607F452541820C21550EA487BE7D470C8CF7EB78CC6F272409386136BF2F6C43D47F338DE0D4E891893916563FB5FF97766BA4355B86D0FF2FD6DA1DCF5BE18F8B36B9695EA4F902E378F4519D4
+3E0584A3
+9EE73DE08E77BC1A598FD8D9D5
+B7478A9AB2E4FD71B7BD3572CC071AA787DFC9C20B141A37B4CD787EDB6A139F9F388B9D196385F4663CFBD046B0BF83D762031B07588AAE598BAE76D631C549044A9D3F05
+054896B9
+487B20B917B7AF7219B228B69F
+BCB0E5DD3A2D1EDFD6BBCA8D741D5AC408B950650E2C3F96B94A5BE120E7080F75248067089A4C53C6500F6DA98CAFDEE1DF0A6E34938FB4C3B770E91698A6ED4183E023E02590B101A6E877FC05C88368881E96ACE0FD7B55FB5A1D80EDB3EAC94F
+5790A4B3
+7921B452857FEEAA782A7B748B
+AD4C7AC5A0DBE231514CAC285906565720FF6C3307E8A9C82FB28B49B7BC0BD186C55C415E66DD6B20B8509FBB3EDC66505EFD4D9B64214BBB6FB016789C840DFBD94FFC2CAF4CE8BC08262FEB99A4025624BC6150647CA151
+A2C9AB5C
+EFDF0F4004AB0E901C195CF85A18
+C47CC16DD89BA300FAA776C483C01BE9B645D70E035F243032B958A30AE86D1C5FB1088E80529FB1AD5824322B24DE1957A7BA8959A8452BF62517E9359C836D9AF153F32B337DF23CE167E4923C1850D4F5402B37D8E76C0F2769D297363CBBB7077C7560B534DB906F26F77584BB9C9294A8413B8A1E7B8DE991DD17EB
+4E20
+EBFC3ECF7420035195150EE61A80
+A9CCC312
+7793438A539834C711BDF55B076E
+157727BBF38FDE0E8B633D868F831B7BD38D0F98DA44E4E0DEAA57DFFAAA80EBFDBF97C815E0C0E32CBB688A1445F58E6703B1B9BEE7222685C82CEA16C5376CCE567FF123E4A5FC25D30C506E1A77B0C7FAD4790F7B566F98D2FCAB71BD7D2DD8048AC62BF201B9F0973E396454E88FAC0573604890487C4C8ABDADF43F
+F4EB
+38E05968636507D8E6DF64685DC4C98F1A2FD81E20C0C4AEC4
+E00FFBFB
+51E4F898B26FB73C6A917DF82323
+22B09B23FEFB35949C930FF52D6D1A12EC22E3FFE74C1D6B2E378C36C6935B1B22973FDC7C568FDDECFE432702A123166CDC00DF4D14501E41A1ED73E0B59AEB07490069EF40CC0CFA9C246E37B39907BEB0FC6DBF5C8A5E230D272CDDBCD06D2E2CBF4BCDD38E8B721FDA2809474A1AC7575C1F88B25DD8DDD9D4FDEC55
+1B5B
+32AB7916
+D45EAEF8A40E9FF3F1BF0A301E
+C9F7A07D7643CFDA4017CCF97CCAF479EA3AAB273B185A20CF09C54A3389017CBD042CB4C5D609555FD7044E5F0D48CC47C4316848752AAC32950ABBE6B8F5
+1309C64F
+40BF71B3C5602DE7D5D8330D96
+CD8F687E758B84B0B19B4E9BA78219DFB12ACBF178B242
+1460D86D
+2B031F1ACB67C102E95F8B28BE16
+2717CB62ABD4C309FC2926DE7A32F76E47AA3C5456E16A77277E34706EE9E67C67660FD4866E154B4DFD5C4D180CD1B360B4171CB4E2C7C40FD9952402FF05654C2FF4DA8D3C6073D37A34C5AF2CD5A87768179DE47AA2FC93FBF778F36F760A766CF55CA0A7BC9324
+A0B57A85
+2D1A264C6406FE1A78ACB98941
+6E6AA9FABA5DC1BFFBBA843D79F1E8941D3FFBBA434D
+FE98295D
+2C486EAA2550B21011B1957F62A6
+53018E98205E6092
+02FB0BF0
+16BB5961627279393BD6222B232185F0480017BD67106DFBC6D63500FC985F87B50E
+3687052DA428D23578FE8100C3F216EF1A54F8E59FEDF424096AA8FEDDB4A2EC052CCF07B663
+538895DD8E86333B66B21CDEAE927310DF9052CEF283720BC5CF7A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0045 put
+dup 3 /C0046 put
+dup 4 /C0047 put
+dup 5 /C0052 put
+dup 6 /C0067 put
+dup 7 /C0072 put
+dup 8 /C0078 put
+dup 9 /C0080 put
+dup 10 /C0083 put
+dup 11 /C0084 put
+dup 12 /C0085 put
+dup 13 /C0097 put
+dup 14 /C0098 put
+dup 15 /C0099 put
+dup 16 /C0100 put
+dup 17 /C0101 put
+dup 18 /C0102 put
+dup 19 /C0103 put
+dup 20 /C0105 put
+dup 21 /C0107 put
+dup 22 /C0108 put
+dup 23 /C0109 put
+dup 24 /C0110 put
+dup 25 /C0111 put
+dup 26 /C0112 put
+dup 27 /C0114 put
+dup 28 /C0115 put
+dup 29 /C0116 put
+dup 30 /C0117 put
+readonly def
+/FontBBox [-18 -209 798 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684274C264E5F45F0286BD1B23D26C34626E07A
+5B039DB36C18005EE32CFA64
+906B285CB8BD7F0968
+D47F5242
+22DA29BB63EA29AC1293D9F365
+FDD092686CF0D739DAE7B4EBECDFE21B8B5810B15B35D7
+8B1BDB66
+02B6ED886A783C9F2E2959DACA
+9F8C687CAC50F98DD3D99C91A3816894F5A2231814056F2805E451F66B5923
+79B434DB
+F70638B9F2044F3ABEA1123528
+14FB6FABE370F6494A54BD1740E96D8698DF36DD8313B05B556E
+E0432436
+DC00618FDC4E86C8E585E5476F
+A451BBD97D0D36A62950246F56EB06F7323604EE93D45BF63CD3686365E9D16FFD6DC0A2479C876438EC2DF6F826AC5D6F952BF2D089252FD914
+E817E4A6
+611A1EFA8321BB9E6FC214505BE9
+4706322F616F6998B99A09CE79F5E89861C1BF8B3BAFFD07B37BB10E7F9010D88D8311563A7559BDAAA47227BFFD61711213423EB4AFF5706B152D44058C6AEF8E07B1B5469E73E5CBDBA089F1ECD1EF940CC4FF5F36E1A05DC2C2B51D70030D53B162ABA378A506
+C242E8AB
+3A5D42595EF63C17836D3FA92BD4
+3CFFF6D00762818B8A58D405A0CA89F30107B58589373236005EEA99FF61F8B333DA73B493812328B7AA491A201D4444400A4EC40D21FD84BBB998BD070F42469709EE79963D13207BBE1170D31CE7525856CC356707944C6BE6F5FED8757F3792D300CED3DB92D64EA0C40B8F9CB1F75E2C7E791AE317
+38F37777
+45B72A2A485B66A8B7657E7B29
+1E803D14830190995B75101A72224242E42C1BE74BDE86C39755EBC2D27D18DAAFB31D642EAA1615CB4AA7FC1CC32A73DAF9096A8E98A8F93CACB28E1A174A9C5A5AF40CC23F9F691BD662F5390FD1E68EC560580358C3CC053AD58EDC15F2
+427849BB
+09DA1233C68202151A7DE81CF88E
+F1B4ABF13ACA44C4A13AD52B5DBA1E37AE3218D4DF272D3061DD3B262B06CC5116E5CF7D1149ED082CD390D9B3BC53E5B671995A7BB56B6ED250AD3C9C26FEFFFFBFD9B6FE6E9CE8EB87615365CA461A063B73365C99BB1FAE77E968734FEA40F983A948
+192CEF7A
+02B1DDEBBE0B571E2E94D39EF436
+CBA30F8E718767F96F10B974437AF8190CBB730BC86CE2F34E85BD646DA73C0454F24768C0E000070621D6EBCBD3C3853B465ABB7725A286A31F43B4E73A0E101998DDF4E8336D56745A04E8552848F48910CC719031383C2D4625A255A8FA48D29D1B28EE3C8C9A3CA7DD82BD94D8E5AF19A40D41F82C5E76F380C97327
+A142
+3A058624
+5FCE37B7B758A8A15541320F1B
+C615E42A809DB53D5F33D2289025613E3FE30E36D0C0A6DDA3F67B1E8B5F9ACD600157D16F64F423B42A412DC253DB8D632A6435E91BBD16C044D3F58F2CEA4D5D24BAC7AE510F2171
+4F6DD8B1
+1825B908842EC2711D95201FDE2D
+2E1EA73434ECAEDEB63E5A0DCFDA800911E0C5D7D397BE9A4896BCFE344292C107A0756D9D469073AF483CB9658FF575C6885B2FA424CFB0B19468876D4450076AD7F12CAC1744E6F20093741C1056E42049D317F074F558ADF3EDE432D5369EE2272CE07348F5
+1F8076B6
+92CBD41BC59A8E090D55A6E26D52
+BEC23C214EC2CDD29DAE852F0710B8AD76F67055CB56E53BA639322ED7FC372640A9645CD63BEE031BA3E1CD92FF3DE8D798B60C7118B0B6B55776B429BA7DE2E66125D634A63E9052908FFF958C3714F32EFE9C3F21A211C501FDAFCAE353A2248CEB4DFAEB60A06F9AD5512B1A561349AFE22107E96B7791BB0B790E16
+F402
+6D9BD35F
+9ECD20BB
+B2A4346B396533FBF2D11D7F08
+293CDEB5B0D2168EB02F3C8EAA2C8B6D2327156F746362DDA637D3AB53B1EBDF64212874BF2B873FDBAFADA29CD55EF5C6497860B6421DE06604EE4DF6F37CD2C4EC5457C42D50E8DF62A0700E70D0B1CE4A79228D19BB62C48510650121
+7CB42BFF
+09F5F31D44A2776204F6FDF3D9
+0D232B56DB2D5E1ED4185028E60BFE82E0A4316A93F4216EF296985EF5F72970081EAE5954353EAEB0A29EB723B48DFCC1B30ADA5DC4A5914319FADE438F659E859DAA18E84E48B07CF0504058EA64E05140
+E5608B5A
+7FBC36D86D001111FA616A01AF6C
+1A517F867166144D5BE1982F8F1CD2A1FA6B603496DA6E187E33201A4E1AE3E611DD882C6D75150096EAB897554035BD9CEE522D0776E8E2D2DAC7ACF54C1D2ECBACB2FFE3796E1E70C3017266819BE5029933C14A376B54848573C81994B99C003EFD2D2E170E30A4B7597D
+4DA69958
+850DDCD4D613C816147376364B
+AA5845DF3F9745F22AB1F2583F0D6E9BBD2916FF9AA73133B700C9BA292844EF768E6AADA0EC7029FF5A3B46F63CA7309AA0898739810607F1DE261D5E09E9BAB9B67A53640A092B05D0DADDDF139F838CC1CA44018FC10C8FA4B12B
+61B62ED5
+5C039EAEA7A0515AFC10C69AD5
+034FC985CBD0472CBFC3775B683E422DF030EA13E908EB8C43F1EF29E80F9F11FAD3A25F5123BEE7D7F51CFD4A58131FAF0920101BCE759D3E63AE20F38E6220B1751A34D1298467E9A5CE38FAC208F32EB7AB37733B2E0B9F010043D6
+D995CF00
+4B71D5E1ECDAB646A8521E7C994D
+1D49ECEC2107D49781F725EE7950BAEF322D2042F4376511FAE91E7AE0C98AB9849A63FD593AB5FEF0085946AE09F22A7AF167F3A2F4FEB99E89ABDDD6BD85E9D3F0CAE3825576B8CB044EBC93919920A109F94FA1A1080227C9585173CA9B5734DFCA3FADD6956687802A76838FBCB8111BA23992AC6346E58129C9615D
+739A
+D44CEA3942EBECF81D109FA12D334FF222AA3FC344BB56121D3272BC67D70136348EE3B701
+3C9A9A68
+B71B4AAEB99DEE834115A410AC
+5AC35FCB9AFFD315C7B0F5C7BFE80368C2BEC984F380ED084A3C87D87ABC4D4035D0CB292EEFA2C054E52B51A98F2B069101826219B0A11FDE7A942D5F08C106FAD22D2D3CA9D5D27EAAC9FA9F23
+8DC6C542
+F3F955F664D04570B01695ED67AD
+441581D70ACEB3BDA180F80158560DE563299392A62C0508D63343B902FDA4CA1042FC0BF6287F7349B304DAF009FF0DF6BE3E0A987BBDFD417033674B026357AFC0CFCE1629406EF9AEFB3BF7A4DCC07DF02D423124AA4C36F0CDBF390782DE81AF9871728071404335F4407C325EFBC4C1CAC499F2CA0602EEBFFFFA61
+ED89
+1176
+2CB8557E
+27A537CD8AA259BD0210E592C5
+67EF824533C2A8329B034047617E96E38E39D68F8B8940CCADB644EC11A3ECB6F40FDB73F34CE875B87F3910F01157B995B75D74
+EA362400
+2D921E72CB06807F194AF802FECA
+58D6E39ABD7D47423C6DD15028A4185BC1B0C2E9A8C4CA9B528AC90EB3B2FEC84D6F2367AD4E4F2680F2FB998B25A2A52EA7AE9DF453FB732BFD654F896D0CF9D39D41FCFD947814A8E52E70F286599E6FF182F4BC2BCCCDCD7694F1F63F269737875584A8185867E133A600FB99351A817F86053A6D5B0CD15C4B3B5424
+CACF
+A46EAD4C7A7575125DA0177FAE750226CBB3FAFD92C9A9EFFB2B0767
+58DB71D7
+475ACD5099D3E676D51BE6369D13
+F15D202F294433C34933EC35CF6F1B0663C6F28B1961E0F98D6757204A6DA781AA3385F9206328513755901173F9EC50C7395FE3FF4BBBD657D82C390A26E73531E61FDA8A1262EF7C1AB117DD0E9F4D3C1B7C66A29A0BB5C4D4F3B3A2605F55319DFFA8BEF216
+68D40AD2
+B640C20E563627FB8A1BF07FCE
+3AB280E399E92E96776DD31C307DDB2D71FA7C6E7ABB2A42B071F42057EE126556791CFC7A13DE0496C5523EA23324F02D17FA9331B72516ED3776D03CDD56357179E58C7E12
+885A093F
+5D7B8B432767960B418AE9656321
+9F82D9EE01A69BBB879F3741B42E832EAF11F372D753E5A033BFD6A0DAEBD58F3D9895B47EE6AEF114EED33746E642AD28A12927B6B423DBC91637E3442FAA6ECAF23B80B4208B85BD4ED71DB7C73F8D2B0433179FA23CF283C37377EF27C91D48C8BB1E2532234AD3C83F70AEEF516D32
+390554DA
+634C3E8A7073848FC1560B3DF5
+EE5FFD82C34F685E34CD6D98F24B2AED7793FDFB880DCEBB1BC110F154443E1E32E06A54DA368AB223D1D86A432E87ED587167FE33A5B3A0F430AA70465EA9C421165A196ABFBD2AC09733EC33AE03067DF1A9ACA3077E1E93
+CB520C74
+8CDE3648DFAF2373295346D5A01E
+478B28ED79782ECA41907AD6BA7AE3BA0238BB5577B55B4BDC08CDE4B711A2BBFC3DC0732980DC3D373852796B2288B74001A1501C651C4F54A299AE80DECEBB6BABD81EA047A6C4A5EB82B1CF7B6F9E8A88D17CFB4622F71890080BF02837D9B48CEDEEB5C67ED5E96A917E3B6A6A4AC1E6BFF6D3065F14A9
+C4F04104
+65C3C0D26E0147B80F31DE743A
+60BC0E0452D7BBADC347212A4BEF7CFFE7D18500EECB3EACCA2EE6538304FA8A0ABC34998CCD8358D1E40E0D48F058DEF2957509123C0268474505EB0CF052F46329CE18
+A49F8BD4
+05B61C43A5992E8B8F2B3F92EC
+CD38463326732E7746D2E289FA3493D3208FAB4D3060FD57DC9CB23D3C181B5C5F6D120760346564FC7615420031EF70E8D061CCDB32B5305BCD79C639383717809852DCBCF657C62318F9D66E0DBA4AEFD645058EB9EF54361A48
+30000760
+658BC6F9B0DAF79A3FBE82BC332F
+D121959302D9B794
+394040B0
+89A8CD1EFF20F28BAE5D6CF8107DBAE010A48FB1DA8D74D908ADB839D40031EE970D
+09EFB60C034C53B178C9A32148DE08DC9D92D4F62C5A215E13D8449D7FC31EF2BD24CD59F143
+29139B90180EC17A32A308DD64D34AD5ABC2F21A4522CE8C01178C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchi
+%!FontType1-1.0: PSOwstdutchi
+10 dict begin
+/FontName /PSOwstdutchi def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0084 put
+dup 3 /C0095 put
+dup 4 /C0097 put
+dup 5 /C0099 put
+dup 6 /C0101 put
+dup 7 /C0103 put
+dup 8 /C0104 put
+dup 9 /C0105 put
+dup 10 /C0108 put
+dup 11 /C0109 put
+dup 12 /C0110 put
+dup 13 /C0111 put
+dup 14 /C0112 put
+dup 15 /C0114 put
+dup 16 /C0115 put
+dup 17 /C0116 put
+dup 18 /C0117 put
+dup 19 /C0118 put
+dup 20 /C0122 put
+dup 21 /C0262 put
+readonly def
+/FontBBox [-144 -236 757 728] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684269D9C8B20E874214EF2F9A8F94F52343F51
+309DD617C1EAA0D4F0077664
+EC97FD2959FA884353
+65D72991
+687967341F5E8692E9A8818E4F0C
+865FCD7835DB7916CA3B97F908AEF1A50A6D8F48C640A0AF5EA89087C802A46236C73640A88F269B33A3D6A7C297058606F3650A03FE30640CB27769AEABB9BAEC1A167B2A8C80260E858D8FECBD03EC12AC2BF162B3EFE345D9C6A4C1C0E3C21395E589F61E686749944B1D6C1E4A2B69
+1A28B6BE
+5D23700A111B6EC800D742C3BC
+581F463BB9AEA71F551284D83DA7786BB7718C2607E9
+86E53871
+3D7EB5282F630F7E1AD5A68A0C34
+96BCA7687EC8CC7DF8DEE6C9572616DECF606591FDD20D5F54200F9840943A22C08F61CB79F4CB64092566DA8D5AFB1ED272BA0D110D81713483C7E6189D989C37FF1A0D262D33AFE31A093A7BF76B39BE0F19DCFD0A986540AD48937995E66F97B29D55C8DFAAA2FA1C7E425AF73903F78AC51D463AABD74A0CB00F7F36
+3216
+A33EB4D05231E0A72D70A22A4A
+3B93CF03
+1A71E3487D79E3F5F0214DC47D
+57754E554F475EB224D703049C41982A97095095093268515B57545FC804774DE39D82B4167440852E7BB02F26EB2FE67F33C75DC7A1C6C4D54024BE4CDC48B2667AABB2E629BA8B8FFF277679EE12AF4ED0EBA84F2FFA0FADCEE20C9775147D
+B73D63B4
+2052F48C509018C8BE70C6FCB236
+E69C385138790B45AD6AFA0824DDFD4279017104E2937F5551A69F4A0FF3862DFBE09D814233E2AE668B3521742FB1F471E3E025521857536352815969B156DCA2B3E0235217070FA5F5256D13849847E4975890A671EC9768D8B75AB059B04E3DA4EC6ED8
+4E4CB520
+3B30E43125929D518A92B4850BDD
+181EB8A95F5AC2CB786B2B16FD4B8722080AF7AC3E71B75BC230600F65F203611556F142B4498618CD0816ACDFA5ECA071F3A477A06AEABF095AB5918F63367DD0FC0F7525D2133309F221FA2D38A056963807F35F961B976E6CBA44E106F581FA840B3FF7D2337FF01BD93C6E0CF0A324005B65E6A6A3FFD8DE1E8A7E9B
+F801
+401070C474F333BD0D4944D4F4AD4CC4E3759D2B8EFE5AE92713B6D849F0EB29582E0C7A86F92EB146EA
+CF66A898
+5A64BB30F7367AFD5C7D46D286CE
+EFBB71E507D76FDB40EA74220E68953C74884D4AA57026E0943EBE4F0C76A413B3B312DEF8F2D87B384F649191C5A02E4FC06A39EA32FD58A675A64BA94BEBCC8BD58FB27331D409537B556C195E94AE5BD029F6FDEF0DC7F460DFD2ED1C5C20852259760229264D7E92593E7CFE9D0CC972605C9043868C231CC6FE7EB2
+C0C8
+A5139046AAE7A35E5AD537D4AA8B669F9E88F503462C6F1A42E9A1
+E5667982
+CFACA9A3BE160CAF739C47E91581
+D4CE0FB235CEB98DE32EB93E85B91D4F1CF69D345149CE5EF57D4978BD6B8815094735D8D4EB60A215D357B0BC106B94BD6CBBAFF2C88FCDE897A22003E63364664CA92F87F30534D67FFD9F332E22391F9967CA622A89AA5729DC2022687F173CA196746FDE139AF2C0DF51B4593545D339E1EC82D80F8494
+F65D8F0B
+714E2DF3CFED33DF4BDA2F6F2B8D
+BE85E4FF3FA2AA4991D31E9543D77D0822E77A120DC66E44F4ECF4FF083FB4D5B9B1B45BE9BE296B20F205E1A668C0EC5E27C91CCA59A8B0CD743726A8DCB11A168A532DB535A1D5A85A0876BC8E578EC9EB366AFD9773B02B84544C0DC6FBA82A88213343
+503E4BAD
+DF046CB7893DAA78CBDE778162E5
+5A8533C82794DFEE2A00E7DA058856B0232D5B14AD22DA60120C17AA3F5438ED46EF221DC8E06A2F4010EB45B7EDE2FAC46D5D9B5A46C3F8B26D32CE4BC34AADC722877B43715E610E62210A5F505EDDBFE6889B9351CDC5AA18EBE7EAA4202BCE60F24493FEBA25985FA058B694FBCB484225AAF2A1C3E0DDF93CA96823
+6A4F
+B35AF8D6B5436B05BEF53EE285EB94DCD4D35F236EA16BC2080787FEB6A7AFFE94E0104C9A3C6465861BD7EA0255ECA8DE2DBF26F87D9BFF3F45CC0724DEB6106DB3B04865A333EF4E55A6
+9AE159C1
+D01312DB2D43F4D7A31560C711A4
+0FE7FE50FEA4942C1F86B056EBC1DFA20F5A0B48E09AAFFCF6C2B5109E8E21587978A60EEC683648AFE4766139DFE9400EE45D3ECCA08840582490A8D6B0202EAE9F6083C79616C40F865582930D9D6DD31136AEFEDBC527F9599EF93DA2E35DDC49AF2B8556CEF9B3E9D122EE5A41A9A60612F28E33C48FD2B74153638D
+F2FD
+37B0972B237B1F6FF7BB5B24D3D89C1F7FA62BAF8D1B87070E
+B1BB41C4
+6604E17D89CB003104610E4F73
+0DAF2F2DD49C11C0E14FFB8260AB3EF56862650337A69F71ADD3D81E7F531FA5115316E5D959BCECCEA5EE7B34D64306EF89D260D540B44DCD93B0A6F9FC455CF76267824746C413BAC9364C3003C5C7AB14EA334F49F460F9453DC84C4D8E
+CDC5171E
+5B8E0DCF83C2B00371224A7CB5AC
+380B1B20F6DC42F7A9FCCC3D51584FF4CC41790E67BC10905ECDE102CF3E666269A7E82CFA5AFD3661217186AD26E30864F76463AA39FB506E81153A3EB6998AA7E282C09A3880DF589C4E561B94200BE22FEA24612DAC36F25A5E65577E7C362BD1A9891F27E7074908CF687CD1460664D601644473A4140145DE96F245
+48E6
+25D51E26E10D27727D990C6B63D290BB7BEBCDFA643DFB978E948B80B0566AFD7F2EC218B6F22F280C9E
+C9270013
+25336E5F871E9AAD0A1A40B44A
+D657AFF9180FDD23AB6AA4745DC9D0BE23FDE5D01FCDB96914C88E2DC8BAFD2C8EC8DEF8B91306C34DFC6E17987F07F07A42C1E93E852E4BD2B564EC9A4566025B33FDCDE550F72F0BD9A70B5AB1B470A67A6B066AEAB41956E8B2
+C19A656A
+29CCB36BBDCEE4FDDA1B86696A7A
+3DC4DBE072EA432077452920FB159913E9EF4C691C27760FC4D7A2A8F0E65377DA491B22F225299C0F2A24D015C42395697EE34E594BD1499A5101BA9A6E7B1F639F4F18E6D8CAC03E9259D2DD2EE722EE2B99B36B3346D6C62550A8C7BE1DB6B521D533A2EA3FE809518AD81D2EEA3D31908F8461B2
+16A6947D
+9A9FFB66871688F93A3DFB5DA7
+A5A97407765EF2E8D0752650A8EF8F967467CA5D2A041C660D2FDD40FD955FC98D9B2364EDF1621B6EBB5AB4921FBD7055DDE4882ECC44235157CDC5065CE18826F1259B7952901BF2B0617545890F3BBCB052650CCFC8
+317E442D
+99D01981FF20502C20AFCADD7621
+2A375956F76381F58980C56AC63D79A578CFBD1FB87B7BDE82CFA4AB2F57CE37D9AB2D39A58AA4247A30DC407217B916384F8E8E73C231B9F8622F89CA6FDD6B03E243569551707B55D520308BF2143FEC8DF53064F98479B5EBB87C51F84C1FBBCB38F8CFF84E89A12757B0257CC0A13355C90D9AA005431C58799FFF6B
+2507
+AC0EB2068A17B0394CBBB02683CEFAF6F8A8A3B3B74960
+67D965F8
+AD144E6A6D58D2A07DB440F45F
+C2E60732B0D2776ADFF802BAA5AF00950FD7CE1D49AB9DDC40E78654F78BB357232F1A85B1D05B0AD3C4D86BE06A8CF244D5954171C3F2F1336FC6505E2B5B1C2C6D854AB81F3F8D7D1B5486F020FFAAB6ADF1B0D6A7CEA91D20
+59C9D416
+5CBF0E491DCD738E2A88A5581957
+F2D88406D3D7116FCE5A7077FCA62650DAA71EAD71227EC5C7A68168B01BDF14E8D8C8DE5CFF56A32A8F17CA8A16C6F8EAC639405DC430B3D0BF5364A44CE07B04C638AFB8537170E6E509D08C505B0F5DE856EE0835BFE24CC736A6C0240DDDB3B7A988FEB6ADEB89251A7FD579855A2A5C13EA224FBDD714793E8FAFEC
+EAE4
+E8F5991C2EDA83777E
+835508CD
+139BD56E373FB3B9D12CBFF670
+18A565B9D59ED0E38D7EC2834ECFEBD4ACCBCB6F63AF24EB
+18E7BBF3
+54F6DD72D0F9AF61F421A75144E7
+0BEA368AB5517FE4
+1E132682
+F6D5208D287B74FD2A99F298EE4EAD8855E01AC938D225B01924D532EEEBC66EBA9A
+1619C6D87F7A02D9E3B324F2F8DF310AB8F16DB146EDCAE361E740A6D57F82B137BF0EB5922A
+B0FC86CD4927F977FB9AC95C137EA40E6E0A6E31028B82454B2CFD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch12i 12.00 /PSOwstdutchi newFont def
+/wst:dutch14b 14.00 /PSOwstdutchb newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<192634312632270e01110112262f24292e22322c01273032011826223335322a2f28011926343730322c011b> 2207 558 0 7384 -1 s
+<26322730322e222f2426> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0d> 9434 13385 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13267 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13267 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13267 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13267 3 7133 32 s
+wst:dutch14b SF
+<0a110f1d141918> 1271 1458 0 2055 -1 s
+<000503000c1c1418130008111d1a111b12001d190017110d1c1e1b11000e1e161500100d1d0d001d1b0d181c12111b001a111b12191b170d180f11> 2055 1458 9 8497 0 s
+wst:dutch12 SF
+<1d2926> 1271 2086 0 1631 -1 s
+<002e3033340024302e2e302f00353326003027> 1631 2086 4 3504 0 s
+<002f263431263227002a33002e26223335322a2f280023352d2c0025223422003432222f33272632003126322730322e222f242608001d292a33002a3300222d3330003226> 3504 2086 11 9461 0 s
+<3d> 9461 2086 0 9531 -1 s
+<272632322625> 1271 2330 0 1829 -1 s
+<003430002233003c33343226222e02003032003c352f2a252a322624342a302f222d0033343226222e02003126322730322e222f24260800153333262f342a222d2d390600342926332600342633343300372a2d2d> 1829 2330 11 9531 0 s
+<2e262233353226> 1271 2575 0 2038 -1 s
+<00293037002722333400302f260033393334262e0024222f0033262f25002522342200343000222f303429263200222f2509303200293037002722333400342922340030342926320033393334262e0024222f> 2038 2575 16 9531 0 s
+<322624262a3626> 1271 2820 0 1914 -1 s
+<002a3408> 1914 2820 1 2147 0 s
+wst:dutch12b SF
+<0b0609000a1d1b110d170009> 1271 3307 2 2588 0 s
+<111b12191b170d180f11> 2580 3307 0 3622 -1 s
+wst:dutch12 SF
+<1d2926> 1271 3729 0 1631 -1 s
+<001d131b0033343226222e003126322730322e222f24260034263334002a33003429260025262722352d34003426333400343931260027303200342926002f263431263227003132302832222e08001d292600332a2e312d263334> 1631 3729 15 9531 0 s
+<34263334> 1271 3974 0 1595 -1 s
+<002a33003126322730322e262500233900262f3426322a2f28003429260024302e2e222f250e> 1595 3974 6 5219 0 s
+wst:dutch12b SF
+<04191a1d0418111d1a111b120418111d1a111b1200020700> 1398 4321 2 3626 0 s
+wst:dutch12i SF
+<0f060b0d1106080d1011> 3626 4321 0 4585 -1 s
+wst:dutch12 SF
+<37292a2429> 1271 4667 0 1797 -1 s
+<00372a2d2d003126322730322e0022000b0a00332624302f250034263334002326343726262f00342926002d3024222d0033393334262e00222f25003429260033393334262e002a25262f342a272a262500233900> 1797 4667 16 9014 0 s
+wst:dutch12i SF
+<0f060b0d> 9014 4667 0 9461 -1 s
+<15> 9461 4667 0 9531 -1 s
+<1106080d1011> 1271 4912 0 1783 -1 s
+wst:dutch12 SF
+<08> 1783 4912 0 1836 -1 s
+<001d2926003330242c2634002335272726323300302f00262a3429263200262f2500372a2d2d00232600332a3a2625002224243032252a2f28003430003429260033393334262e33030025262722352d3400222f2500222d2d> 1836 4912 16 9531 0 s
+<1d131b> 1271 5157 0 1688 -1 s
+<003031342a302f33000426082808001d131b21191a14151711> 1688 5157 3 4390 0 s
+<1e0500372a2d2d002326002234003429262a320025262722352d3400332634342a2f283308> 4367 5157 6 7440 0 s
+<1d> 1271 5504 0 1410 -1 s
+<30> 1379 5504 0 1495 -1 s
+<002233332a3334002a2f002e26223335322a2f28001d131b0033343226222e003126322730322e222f24260600343730> 1495 5504 7 5945 0 s
+<003324322a313400272a2d26330022322600313230362a25262500372a342900342926002f263431263227> 5945 5504 7 9531 0 s
+<252a3334322a2335342a302f08> 1271 5748 0 2375 -1 s
+<001d292639> 2375 5748 1 2906 0 s
+<0022322600> 2906 5748 2 3348 0 s
+wst:dutch12i SF
+<11050e0310110f06040b0310050f090e11> 3348 5748 0 4866 -1 s
+wst:dutch12 SF
+<00222f2500> 4866 5748 2 5354 0 s
+wst:dutch12i SF
+<11050e030f040c07060310050f090e11> 5354 5748 0 6766 -1 s
+wst:dutch12 SF
+<0800> 6766 5748 1 6894 0 s
+wst:dutch12i SF
+<02> 6894 5748 0 7027 -1 s
+<050e0310110f06040b0310050f090e11> 7003 5748 0 8462 -1 s
+wst:dutch12 SF
+<00372a2d2d002a2f36302c26> 8462 5748 2 9531 0 s
+<2f263431263227> 1271 5993 0 1933 -1 s
+<002322332625> 1933 5993 1 2594 0 s
+<00302f0034292600332634342a2f28003027003324322a3134003622322a22232d26330024302f3432302d2d2a2f28003330242c263400222f250033262f2500332a3a263308> 2594 5993 11 9531 0 s
+wst:dutch12i SF
+<02> 1271 6238 0 1404 -1 s
+<050e030f040c07060310050f090e11> 1380 6238 0 2733 -1 s
+wst:dutch12 SF
+<00372a2d2d003126322730322e002200332a2e2a2d2232003326340030270034263334330600372a34290034292600252a27272632262f24260023262a2f280034292234003729263226> 2733 6238 13 9531 0 s
+wst:dutch12i SF
+<11050e0310110f06040b0310050f090e11> 1271 6483 0 2789 -1 s
+wst:dutch12 SF
+<00342633343300333126242a272a24002522342231302a2f34330600> 2789 6483 4 5068 0 s
+wst:dutch12i SF
+<11050e030f040c07060310050f090e11> 5068 6483 0 6480 -1 s
+wst:dutch12 SF
+<00372a2d2d003126322730322e0034263334330022340031302a2f343300372a34292a2f> 6480 6483 6 9531 0 s
+<22> 1271 6728 0 1376 -1 s
+<00333126242a272a26250032222f282608> 1376 6728 2 2847 0 s
+<1627> 1271 7075 0 1422 -1 s
+<00393035003730352d25002d2a2c26003430003126322730322e003426333433003034292632003429222f0034293033260025302f2600233900342926003324322a31343306003930350024222f002a2f36302c26002f263431263227> 1422 7075 17 9531 0 s
+<2e222f35222d2d3908> 1271 7319 0 2151 -1 s
+<001c302e2600302700342926003031342a302f330039303500372a2d2d002d2a2c262d390037222f340034300026383126322a2e262f3400372a3429002232260e> 2151 7319 12 7950 0 s
+<0733> 1589 7666 0 1847 -1 s
+wst:dutch12i SF
+<10091406100e0605> 2033 7666 0 2712 -1 s
+wst:dutch12 SF
+<37292a2429> 3177 7666 0 3703 -1 s
+<00372a2d2d0033263400342926002d3024222d0033262f2500222f2500322624262a3626003330242c26340023352727263200332a3a263300343000342926> 3703 7666 12 8895 0 s
+<36222d3526043305> 3177 7911 0 3900 -1 s
+<00333126242a272a262508001f14262722352d340e0033393334262e0025262722352d34003330242c26340023352727263200332a3a263320> 3900 7911 7 8806 0 s
+<071c> 1589 8257 0 1882 -1 s
+wst:dutch12i SF
+<10091406100e0605> 2033 8257 0 2712 -1 s
+wst:dutch12 SF
+<37292a24290023262922362633002b353334002d2a2c260007330023353400273032003429260032262e3034260033393334262e> 3177 8257 9 7923 0 s
+<072e> 1589 8604 0 1940 -1 s
+wst:dutch12i SF
+<13040a1206> 2033 8604 0 2495 -1 s
+wst:dutch12 SF
+<332634> 3177 8604 0 3432 -1 s
+<00342926002d3024222d> 3432 8604 2 4234 0 s
+<0033262f2500332a3a2600343000> 4234 8604 4 5335 0 s
+wst:dutch12i SF
+<13040a1206> 5335 8604 0 5797 -1 s
+wst:dutch12 SF
+<00233934263308001f14262722352d340e002d3024222d003330242c263400233527272632> 5797 8604 5 8895 0 s
+<332a3a2620> 3177 8849 0 3582 -1 s
+<0718> 1589 9195 0 1967 -1 s
+wst:dutch12i SF
+<13040a1206> 2033 9195 0 2495 -1 s
+wst:dutch12 SF
+<37292a2429> 3177 9195 0 3703 -1 s
+<0023262922362633002d2a2c2600072e0600332634342a2f280034292600322624262a362600332a3a260027303200342926> 3703 9195 9 8180 0 s
+<0032262e303426> 8180 9195 1 8895 0 s
+<33393334262e08> 3177 9440 0 3835 -1 s
+<001f14262722352d340e0032262e30342600322624262a3626003330242c26340023352727263200332a3a2620> 3835 9440 6 7801 0 s
+<072d> 1589 9787 0 1824 -1 s
+wst:dutch12i SF
+<13040a1206> 2033 9787 0 2495 -1 s
+wst:dutch12 SF
+<332634> 3177 9787 0 3432 -1 s
+<003429260034263334002d262f283429003430> 3432 9787 4 4966 0 s
+wst:dutch12i SF
+<0013040a1206> 4966 9787 1 5470 0 s
+wst:dutch12 SF
+<00332624302f2533003729262f0036222d3526002a330010000a00222f25003430003b> 5470 9787 9 8569 0 s
+wst:dutch12i SF
+<13040a> 8569 9787 0 8825 -1 s
+<15> 8825 9787 0 8895 -1 s
+<1206> 3177 10032 0 3383 -1 s
+wst:dutch12 SF
+<3b> 3383 10032 0 3489 -1 s
+<002339342633003729262f0036222d3526002a33000f000a> 3489 10032 6 5652 0 s
+<0714> 1589 10378 0 1937 -1 s
+<33263400342926001d131b21191a14151711> 3177 10378 2 5304 0 s
+<1e003031342a302f003430003432352600302f00233034290033393334262e33> 5281 10378 6 8240 0 s
+<1d292a33> 1271 10725 0 1665 -1 s
+<002a33002f303400220024302e312d263426002d2a3334003027003031342a302f3300342922340024222f00222727262434001d131b0033343226222e003126322730322e222f24260600233534002a340025302633002430362632> 1665 10725 17 9531 0 s
+<3429303326> 1271 10970 0 1758 -1 s
+<003031342a302f330034292234> 1758 10970 2 2867 0 s
+<002232260035332625002e30333400302734262f0800110024302e312d263426002d2a3334003027002f263431263227003031342a302f330024222f002326002730352f25002a2f001c2624> 2867 10970 15 9461 0 s
+<3d> 9461 10970 0 9531 -1 s
+<342a302f> 1271 11215 0 1630 -1 s
+<000c08> 1630 11215 1 1842 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (10) 10
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0034 put
+dup 3 /C0036 put
+dup 4 /C0039 put
+dup 5 /C0040 put
+dup 6 /C0041 put
+dup 7 /C0044 put
+dup 8 /C0045 put
+dup 9 /C0046 put
+dup 10 /C0047 put
+dup 11 /C0048 put
+dup 12 /C0049 put
+dup 13 /C0050 put
+dup 14 /C0052 put
+dup 15 /C0058 put
+dup 16 /C0065 put
+dup 17 /C0066 put
+dup 18 /C0067 put
+dup 19 /C0068 put
+dup 20 /C0069 put
+dup 21 /C0070 put
+dup 22 /C0071 put
+dup 23 /C0072 put
+dup 24 /C0073 put
+dup 25 /C0076 put
+dup 26 /C0077 put
+dup 27 /C0078 put
+dup 28 /C0079 put
+dup 29 /C0080 put
+dup 30 /C0082 put
+dup 31 /C0083 put
+dup 32 /C0084 put
+dup 33 /C0085 put
+dup 34 /C0086 put
+dup 35 /C0087 put
+dup 36 /C0088 put
+dup 37 /C0089 put
+dup 38 /C0095 put
+dup 39 /C0097 put
+dup 40 /C0098 put
+dup 41 /C0099 put
+dup 42 /C0100 put
+dup 43 /C0101 put
+dup 44 /C0102 put
+dup 45 /C0103 put
+dup 46 /C0104 put
+dup 47 /C0105 put
+dup 48 /C0107 put
+dup 49 /C0108 put
+dup 50 /C0109 put
+dup 51 /C0110 put
+dup 52 /C0111 put
+dup 53 /C0112 put
+dup 54 /C0113 put
+dup 55 /C0114 put
+dup 56 /C0115 put
+dup 57 /C0116 put
+dup 58 /C0117 put
+dup 59 /C0118 put
+dup 60 /C0119 put
+dup 61 /C0120 put
+dup 62 /C0121 put
+dup 63 /C0122 put
+dup 64 /C0127 put
+dup 65 /C0262 put
+readonly def
+/FontBBox [-25 -256 978 766] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842243E0EC59344CEF369650A037B4383B03D6
+24C306E87EFDD4775EC78742
+FEFCE44B765574466C
+D1AF7A82
+CFE19FEC07055171803BE35FB61F
+DFA5A4C739A4E3957EB7C66233844AC51A6A91B45B75E6AF1F76779A4EA39D554C671F039F6EA0902EEABC13363BDDA5101CA12BB8156EEC5AF0BF9E6FFD41E3E8297895E1554F57314DE5E5E70C32DA47FD30A8525D7EE9C60607EDB6FD9F816BBA9417276F85
+60F5DDB4
+A3948B33ECD70515EFB0F25E7766
+23F737A06578D2C501971D21A1AD0DFB46CF5287869182444F411FF11823026670B907FF382665F39F94C09E0E1E76DC0B02A4BF09FB8F2E5BE909CD4C41833EB22E0FEA75A40D35D7700DE134E6C556D6A7CE512D6327F1F175C4A19C0F64AE61E00DCA03F8F5E64A5A235E5D73BAC487E3CEF5CEE4A4CDE1A68DBB5C77
+212D
+08FBF8079BE5531B761799E3
+CAC71CE7
+915BC5DA0A2F9DE91351B1D86F
+85C68C372290A0645AAB57F9B173E2F99B0E90B2916AD1498AEAC13F6B99790AA057294D2C0592BA131F35E37806812E2EABA27598DAD6AC
+5EE52177
+55A0A46CA9D1C48CD503CD56EC
+5D3671C90C70AC95D20ACA2B81472736DFA5A57B6735BA52094C35A893354B3EE27EDCE2117276D4FFC3539577CB3855CF0F576C4B331331E41B5772A260A808
+38CEFA48
+7E622ED9B5E19C6135B06E3DF0
+CA28D962CFF8C6A4DE27BC43303A8E9E7CBAA8002BA67708868A065CFFDD1FCD389B9AE937F905CDE2CB74D7D8C6B5E38EBAFFCDE5CA74CD5F37CACDF99673
+AA4AE3C5
+6F745CCF6BB1672083B4631B33
+64AFA54E00330DC3A83349D8D8D8EA3823D57D16D9D3A49E0488D1A46EDDC3D1E050F97B6884BDFE362B3C11CCD565AB192F1B4005BC8CCF57
+701C5608
+8778759B9A0168846AA041375A
+2F3581805F1A9F503B2F895B8D60239B6B908E66F07DC9
+4C02FC6D
+2446D184958E59BEFCD85907DF
+F2849E4CFC4EF24387B04D098365E07CCD6F257B95BDDD1418D235050D067D
+15798C1F
+247CE56AB04CCAE9D3FA0040F7
+18517EB22B6A687796D8037C985D35EA284C02D42BBC344E758356BC
+09ACA463
+69E8F4DA1C7C8A9AAEE9D26BFF
+842E087583D169BC15B239D9E4D7F9C33D63F0449322FFFE87F2E3AC6FD22F1BC464936F5399E00B88509467675A8D6A285C298BCBD04831D7674130231E60F6ED4974489ECAAE3768B0
+EB33800B
+9FD9439E55D1FE26D8837B5516
+50E889288A043D5E05A51B71247ECE82EFDB99ED181EB516AECDEFC183CB2E41E800206FBD643C2B9EC4378E4244E8F71FA7FB6B1515167289FAAF3A0EBA71
+EC219689
+C8479DF709F8FB80B75832107B
+BECC4E11EFC5AD70E977E56A3798F4437DEEBE520BBCBE75C3A117E935D1695AA048AA9BC8B936D494FA770B0A5967D44DF79919936D9656B0C7511D2D9ECBD2AE62F55BCFCEA824D079D6983870CD66D249AA3E56CA77AB5C6D
+ECCAAB5D
+06E2A7A1917E53F9D242CD3B50
+2C8190F3198EABB139C2C7407782D9C09F3D972406F29C464C659A53DBEF0657D86DE8AA9838388D76B913997AA7C08EB20D3386AA94246A310F
+1AA689BA
+7F2CB750D4AB969DD5E9C9A6A5
+AE154E1F3AFCA25C2AE9270A68A82FFA44E22B3B8C4BACF4C8D0F1C3AF456F3B9D11C37F155AE20A8C5445140D81C127E429643F9BDA
+190A5300
+C71B7221665C3F62F1BD6AE19091
+2DAC612F433C55BA67262A9324FA0E79C32301DADDB81D34ECFB6CBCF71DC34C4DECDEDCB3D74280BE831AB880E67FE4C0962191306E1DE87D51BE33046C0F583F98D67B977340284BD7ECC5EE38E78677D3A462A0C7BC169370E6163C204A6DAAAB66F8EC83520F22C86B754A198B279D0D41
+0151F9BD
+37B1A6C0D8144583F041643758B7
+B210BC4EC4FD8F6AC14D1C2036189821A8987FD68E800D106189C782B8929F0CDFC178652E1CC76A4F11A84070EAFBD564F0214A38D66DA8BCE8A119235FA8A75930F252D37A2AF4D1288F1D09F531F0FAAE495C9A8D77DEA706F71AFDB8D27682E2BB50F6EC12A5D2F854BAC08767192EB3843346533D0BF012D8ED4426
+47C9
+96
+EEE7A625
+A028B677CDBA4CE51304741A6C
+9845338FBF5F8B92BE31C4DAA334CB7492C1ECC58F9C3A769ADBFE8AAF5DCA81751C6ED29FDA5A471CB0885CD065E3E717F7C492D7D74D62CE912C393A88B544914E656A5435A0A0DDEDB699437FF7269F907121FEEB7082C01B011BC339CBEA29
+E3BB51B7
+FC6500419E7E27BF51945DD019
+7A2B910B6872F3CDF7399FDF661D62252410FFDBE95CA6F9FA368E7D3269B644D784BC8EA0BECADF125210AA4BB36A33F5414AE24C6A2DDB730F121F10130CE81B732D5DFD6EE936E1ED7AC8A3834E8AEDB64FA5E0850BF5D63F123A882ADE0C9FDDB8
+7A662A30
+F1EA984CABBBFDE45B11D2896B73
+C164C32D11FC09F71753E131EEA87BD36F451E452E1F0F56F984433F14039B43097F00EECE957DD7BF52DC541440C664234741EC066E9D3196F255C4B85CA5E3AB21D5ADEF9BBEB23F44352BAFC43E1FB29156B194A6E2DB64FD08B55E82736FFCC94FA9C10EDB2B8B0C9D824755944782D400F6E2B1210F7ACF35E5A5AE
+1A490224
+BA3CD0F3A7BFAD1344AB01AF9AE5
+3F3EC9593AFD12C960F4FE5E75DDD86B177905891B95064AE6A9164FC49B522CA6E630220216BB07C28A9248342E0D070655325AE2D6868A96EFE22E08114BC216412C3C2F5FB5B596E8AAC921B41D2B77E6640B033766514BC43BC70D38ACC95CC06B32A5F5AFD441
+E6FAFB67
+D1EDA9439997E2FE0FAB6564A337
+1420EA9E1B505270768A0E97C65D246C3B6163A17E15777058166F44253B6F4EBCA64A9C741569790E751DFE75D41D91F6FF84B9BFEF2EF137C596C5D64C380DEB9765335721BFCD4B19A5A8FFBD70A46D4499726A1D303270DE0BA58F56820171A84927FF561E4965AFBB9AF6C7DE17AC8737F8C8994C71BA8D
+96E04040
+D1BAB6FA1D76F261958D0591B0C9
+2761BC2071FC811D793EB87D6681218BE575342F9C614BAFA6306B16CD503A6A2B754FAB2CA1C5C355B476F5DDEF2525B7E2D63D9012AF9B46CD6C7EEA7A39C7C8CA0F0822BCA40E1FDFEE213943E53E99E32C068A9003D8401FC92AC830E4284248E64BF3CE813C93746B1FD24AA4247997D46AA3CE11639644609BA288
+C6D7
+4D7405FAC133E258B4B7A1
+4792C3D0
+7B8E09A02F2920FD4A93001729
+7841A20A2DA978129DA790D48C6F6C2EA162C82595B645717E2C670F6DF57FF06325B2E438D02790D8E1315B1E3E8564285DEEE3C40B7210525534
+8FE33008
+E5F1A300C676B1228795130A44
+E89C39D21E8445733BE30FD3FBA07D9F5A143B240E459CEE267B39D9AAA8C7505181F27A69BE359286F60D60508397CE9F687E09BF4720E33C89B89417254BDCE572D3D5D27CA4
+BA1164C0
+BBA3E2784C1AD84DB0CA0C68DF3D
+CF39C650879BB559A34901F39CF4A5CC418910C321D27A64B86E9D4FC28627408EF398EB5CBEFF9A6EA6376CDE73F4E8A760232E91F3A939948BBA4B85F29579E9CA26E05C744AF09A1B4D25E49219BC8D7767421F79F813993C576C53CAF02AAB9A80427F90E595AEFA4E88FAB69F
+946EDB57
+88A098DD42B5FB7033E749426F
+A209CB1F255AA11EF0265B1F059CD6F5A37FC014CBC5045A9955912F7B5C84978EAB3D00234B220B212910D22F6267D03DEF9A781B8C4FC7696C80B0B91A75ACFD84CF92E9B2A54EFDF7519BB03CBC208223DF74DE599337B04B3886
+142CB8F8
+E05D381463B5AB02FF23002CEF
+A1CB9EDEF1103A06B8D0AA9A0353B573B3CE53CC8DFA9296FDCA142FC399E6518B2B2A0A714A105ADDE1B3A92AB341D756197706A1A35946A57A130EFCF1B7B64BF0A57B1DDEA938B018F7A41404C0E0041AE8
+E1259A4C
+5819200D8E8ECDD7617A54B51246
+3A86B16294B613BFD108264ACF21BF9AC78368ED15978CB6665CB3D641008A945A2A78AC9FFEEDE4AF62B82898FB4D64E292F0CDC1D9F6DC20F15862E137AB74EAFFEAB422A6A1172A7529E287DDC8C0F8CEB580525B80A926E36CC93CEC72F9E6D8AE43A165D2633E95
+6D720C3E
+88C325F7628648E3D935FA09D383
+749CE7FBDAFA57FAEA3142B20711132AAEBF6B24BCE197A6B47C9189601AE71AE9B4B96F587EE7F7EA976FBF8C3ECCA7BE1DECC4EF0395F5796BE2441CFA2C4508AB843204BB4A735E2B085CD5DFCF5F4C6C2FCD1FB64E7844282BBC6F5965EC973B4454CD542DF8FD525BEE05C853C644B9D4903BBBA76CF4CFBF8020BB
+EF71C2EA
+475B01002585E6D65881192393C6
+82B739EBF8F2AF1E3CB45DBBC2B40DEF8CEBE9438EF88793D518BC81C116485979EF5CA388DD5F8253F4077D2F0DB4CD8A9EC3E1614BF7A46DD7A22947657A3C7B255323C105774883517B88140F801D0BC73525B5C1B25766B07505731D33E9929D28C26380D59242E6A4ACEF83BFAB8A88A55F7CAB00401F5C3EB5F44A
+53E7
+3A69FD
+ECCD4971
+6946AD95083893B9CC43465430
+1BF2589713CA0B95AC8F283E12D24EFACF915D6948F490C66380BAB1416818EEE8DC44846B049D5FF194361266C9FFBE3B7294164D3C2DAB366507DE3EC9C07125A9B45E0368A31D678EE77BB1558AE20A
+0DCB6952
+2A20B9091DC1E14C700FDFB7D4AE
+2DE1288FAE2ED29062A8A717D7242EC8811AFF21B3CA603E9A306215C0665DE21143435D741BA61D9C50DAEE3D3DE80FCFD41AC714A60B6B382906A24866D12BD1D0EF6A5A5CF728CBCF28519386F46531CABBB24F129FAD23AC329A9A36FE59A829839B
+35E8A048
+9888D98B64B8AC3FC5DAF1AED8
+01D6239CE65A242CBB71FF323108A4EB20B15323D457A373042AA2438A3D8B59B349C3F89107D522B86EBD438FD6EAD9C1DDB3537BEEA0497E16B1E10ECC6058C198786117633A4EF03C8A6F75DB81808B7EEAC46501AFD531
+A7EA206C
+058A58F35CFB0B3D3F9088CA821F
+AB51B44488991E15BE16E1539DCD2357C288CF23C880F73F1AF65F98682F03D5A7C635ED87A8838F2607655EA75A4104FE5606482B56B25FBE44BA2CDAE012CC4F238E71CA14F077A8B7A8D95369DC21186BA8EAB0440D1AB3B05CD16E45BF1C2CC1492C431F2F4FEC6EBCF369B8CD0B35893B74B03EE3D0EF7D46525C67
+7A1F
+457FE3EBED6B36E6D030570C29C32A2F
+4BA50034
+18C8E8F4C67D42228B6DC7807A0C
+B53E4329C81D828606118EB665B34C3DD5374AF74E55AF44F4629F7BFBE5534725945C32E3B42236433364D269FFDF2428002542663409B2709D1C7F0CE04B532DB04203E402F3EC3B11196F7C294E7CA3D0F888FB01A10CE4988BAE4B12BAC809271B801DC6D8BF776046D4931F62C9BC84EFBF878D885F97BB97B1F5AC
+03E0
+50CB03E5B3CD7FC3A0717BDA4014C7523CA2FB3CFDAB466189B4A235A5BC6CB5F5D0864BDC0918
+AE354EE4
+F943A7859B4CA4E49693AD2B57A3
+5AA33B5B960AA0FA1C2EA737F1C5C8ECF93D34F7586040269C87109F42105B225517D08743392780283C969A97D4797931215A3D98A125404767021F96AA03C167B88E79B1A7B551FF5E2262B71C03F12134582B4E5FFA2732147BD31D44777B53D3E9905EA3DB7AA7D3C5AB683404595F8EB5
+34887BE0
+0697E084C1F035F82286B006A0
+1A109A8CA4418F86420301BDD45815890220388986C2
+75601633
+6B0C7C230D21E3865E3E5A3E7D8A
+11C02F599B67E235F5A5C95328C5B67A7BE095A1ACF10F43A42748AEEC196F23566EF5E057CDF69C9E0F4547BA1A556F9F71D3B7DF0960B2E2B77F7085954606BDBD551C380CC43C493423F32AFB9293A9EDF1671C156D8171E1B806D050F5E093902141CA592210A21724B8F6B3E178AA16D6A6B85B71F68D7528E2FB20
+810D
+9A8B86
+A3B7B5C0
+AE36F41BC1CA27F82D87A89E5F
+2534B32DBA0B78B6E11983A035D7AC17F729E2349AF0170A42CCA1D7BA8F58C43EACEC0BE644C78CD8838202833D571456F35183DFAE40DAAEEC41A3524911B8672635F62DF22C1FD7A4648B889B6888A87F666E0F7CD038
+F9D7DB83
+32B733AD9FE209DB52D046D0C8
+BBE8B77A92EFA12C7040B53126C86B5D750C3DAB730C12948F9E694DD9C5227D55A9D937EB5F59E9788017D736A5B28CC41F4324BA50C0CEA81E74041C882B14FF70A90BC51CCF31FF95C3E5F209EF4B77B0
+A66DE145
+4BDFFC3797B5C833C33FF121144C
+3038D3B44F673BA6E0214B7DA80CB0453190BE9CDED5DF52A59AF5247B69E248E756E47153DDE0E3E808988344234A08EF5903D27A90301FD4FC19E53A70C04FAB840221B5C3DCD8F2E08080665CA5BAFE5E0BE24F0E85059E7111B6398C7FDAF7F9B4212FDB262ED6B7AEFD31AD
+15C328DF
+B84B91A0B20C44A56CB3F7CEC1
+B38E56DAA15BF621990906FE0D3CE42E9469A7C399EA83353DE0FE95D603E4B909BE37B3F001055BDE05097A40D750EA1222565AB28F20CDBD3EF194836778A3046BE402CB8BCBA957312EC6D6D2623C31677C3468A01B38BE
+6B6DAC90
+7A9C153D6DD694014B4A1E09D4
+671353EA7E1E6086911DB85E4F66864E78B145F9D6DD2A498A0D368166064B3193B6AACE3479563BA2B64F0535C3F582842DFC3E083B6178360D7FC3CBE22E18B34FF4ACEBABC7E125AB6777A3AB9ED11752A2C844128803550CC31E
+A3FC4EA4
+474B727876432199F7E3C276E3A5
+117350E8E38E910A279E525900B3E7D32D0922F30C51C7780A5D97E1CDF955DF6F111EF552A90927AB5A650FF92803FA8BC2F033349FF64CC5A14013CF2F3E4B13E36DF6218EE9FDE85B0FDEDC3F8100B9EAAF69C2A8EC5B01D58A0820685DA463141F5757827FFFD3CCC92E072C78B7B8A8DD4D0E281E166DB66FDAA563
+FBB7
+36D18DEF5F073E4F3FC68AEA984EA01B904119CF6A5D83CC7F05EB22F327DADC90857DA166C1935B82CD6C098CCD9D
+DEC3EFDB
+BA4EEDF0BCC98460222CBF39D2C3
+956923C9760641DF11E73159B30634D60B743B375ACDB9B25512D7717D6C2A5E0E1443880952DE76BC87EE7E9DB636455010E7E516749D132205E7C174B3DCFB1860BACFB8F6B774155834AF2A178C520D2F915E02C3F7ECE6DDB503DB61C39517778F8E6389A5BA066CE50456
+21B553A9
+CE37863B6942D6299C29DDADA4
+13EE3589E5466BED40E9508493DDF9D77A3A153D7E5A59D5C4B38AEAA92A62C5A7472DBE061506137C719A0005AAA31E497D05D10AD0CB6AD726FB8BACA15F9C6A20DFB30191D59572BF08517F8F7114
+D03BDD5C
+D319A8A3EB25263FEB104A87AB4C
+ED4A8489813BE194DB96A9B908A0191D4F3982EF89FB477D3593195CDAD0951E4D2F894CB749401944C2E260BACDB248F76D5E525BBBEBB7D23B59EED9A7273227648EAA9373822670B3BAA2BA26E148F8113E24A713FE64BEA0078E6E5475ED40315B41C5D847CFC2AC88C665CD64D5F8F77E3FD227FBFD13F086223E94
+9350
+A2F3BF5A4878EC675B9CCC36A0BCDADF6337B0FF49E2D1CB4B21A7059DB4F568C798DE
+7B120839
+2DA4E72A9F3F90044A4F73CF06
+6C2B9C5D62BC127A68CA8C1330216968A62BC5BD2DBE22106D2297779213DC297B260639FC66A3DE53CBA1BF7C19CE60FE1A077305C3
+03151A50
+4E3D35994081CC2A8C9800C1A59C
+EF4C877047999687E87034B82358C5C23F9DE0744C3E01328B323FE2B78EE64E2F943E2A33352A7F81CA81CF47A511DFB06BD22F02723C53C4E757FC36A824A08D90EDBC8CFD3C564BE7E2F18877FE1D7BFBC404EF4BABE799348756640DE7A4A2D170AF96AD2A4437782AF9BEF1FB046C00479F6F77884270A70EE2686D
+C797
+B41B889826C2A2185A240BD66280F19018910386939950336E3317D5E7868B
+5C12F1F6
+2CE69113FCECCB57F272C3E93DD7
+3B6963AB5978C6F1BDAEEC3C30EFF58A42A649AF0E261BCE58F4298C1959FD882866E3BF9415D804F80B70879872083EB21A168BF3CBB8CF57B7BD94A05882D158746EAFB5326CAB2D64ED015920FA7F8C28A698F37AA50E36D8AC8455F3E51229F0314C28E450174DD68218
+7635BA74
+A52FF9364400F44C82DD7823FC
+10CC77242DB96396AB68C85707F60F9F60BC82044C760221E5B22C41FAF16C57971D4E755B258B5609ED5524506A1679CEFB997D56C8BFE29F32EF0D0A6885D969387945578B
+5C7851D6
+66E70DD9AFBBB382910B35CAD736
+32F8EE9793B926D2B94317C1B9AEBFC40BDA046772C6969D0FAF153560FC4984B862DD4E3F65AE030E9E9F4E8250C0B295832359E844E95E7946BFC36725E8E17CC2812E58BFF273F7F2033C8A398E8CA4BC86831A87F6D777A6E758ACA6DC9064E911476380F91490350095FBD02F1B7939CB5D4E5C4B
+3E553328
+76BFD9FDAFE3318B44B6F8AD8635
+0958A9E7C08C2C1FFDA92661154416D4A2C2A449EC74E2BDD24D57AAF08D7A384C35B3B55C86D975B0F107AF6C08E8BEC88B406E2A5754385BC6E2DBD19E806473243B73475D0DE7097CB2B7CA7C18EA5C6F5332CA54D1A18F246F3B75E5AAD5A7A555A91C65D707C2AA
+596A6E03
+3D82AAD93E90781B4470C92D72
+36CD1D193676C7E7EF38FAA27E720552F614AD56820B9696E19ABE5A1373CEC5289881130661BB9E3A2473C3520FE0F496587144FFCB3A794B9DEA3A0636BB81939F1A67FF2C74BAA075BD72647449822A742A821C5C50
+3804ECCD
+8000D781537FCFDE742683DCEA90
+AC383E44E27A23B1DA6CA7CC608147911F403F42DA286046F11CA3AEB5A2B9DB58D1F476059D415DF4560514B09F04ED6471A5C45F9FCF41641F4DC48A8E32603298322B3C290EEEDDC2B93C96D205316240E90595E09E7DD70D2628E3AA93ABA94230208A1F6D87EB338E1BD22FFC7EA8B8193F6D4ACC5A1555A6C0
+74FCBCB4
+D2EB1EEEEE216B677B84E9FB3C
+39EDD64DF27615C0A1E9ED8437D55A5C1A364A38B4AD268FEBAA7078056880CBD899F558EC05414B94736CACC5249C4F01E84BCAC6941053B61D6A78C472AD2C3AF7A20ADF
+54E2DF93
+73B2B018B918728FAF2F967BCB
+97046EA35745C06587AA69695E7E2772A60B4C76D1D113BAB15CEAFD2164F5C87E11811C8E3F895C93120C09091FB428DD49D89C264B64EBEFE21D3919D8690CA6E74E28B143E246EA2ADE36333F85BADE2E693720DCBFCE3FC5ED2C1363CE00FF81
+E1836375
+2653A6C4C6A72CEA24E33707E0
+68070B1F851B95C85E5C2A481D11DBACE64F348327675A133723995DF57FC7D099030115195804EB28125A35D6540CC0C495617FA47669B01A440ACF5369C09DCF48521CD023C80E524A07D11D7996699C178E839F3A211D4E
+BDD24B02
+DFFB1599170E05AA62E3648BBD1E
+BF369E76EF80B660FFDB0BC69C6D76604DAB67486AB676E07277F61F4B42BD61FA48720E8B89607C01F38AD738A869028CB4821EEDBDCC03D21FC7E1C6D0E9EF4948BD116F66DE483381361B05CBBF23E71F777745E8E14F1C025B765A4B379A3E19293BFFF545ED82B3180E935DDD191BDA90F51D0503482B76A6D5DBBE
+6BB2
+96D20547B7B6C258394C6E44EE79
+C04E66D4
+DF17B157C1D01E964373DCC36BCD
+73D1637A8FE43AADA930A87C173B9164BD8708276E87623265C6FED61AA8CA27A2FA98BE34445792B1A5D6D8ED6A382B117CA18C42A0F15238FAF8B095BD0D2AEC927D1871391F0F28F6C018269AC433CED843DE72240CC9A3CEAB92962069E253FF53C466B1DFF007C10C1D045B9C6B413C9A393578A4AD1149DDD73765
+756C
+5FE348F7DD7A8EAB2381DB2DB27780D661E4AB2534D8CC635B
+2A5764A4
+906A52C2CC1C4C881CA5B5A48059
+28907FDF35771381B5E1968022091EEFB86E7210A0C59BEE3061B7D16AE925073CF0177B00B9B1537C9BF69DCC0AA0926E68D9CDF97B7ABF05E73533EACF48545DBA5269B69651E8B592C837A140A68160EDB87A1E1F09FAEB2D572632162CF466B1291C2E6753DE0D6B2247DBE9238E842140C9B205181B2C358FA92A1B
+3E19
+AFC369B2
+2AC5BD98F02A0272D892FD4781
+BDCC4EDEC24B966C70D10CD1A3B6F5B54CC2538275A48AD4C62C333BFA705FC5E26CB80A8351C0B80960A9BCFB9791A152A81A669E083D1777BE66C96937E0
+A2853478
+9431A3475D5827AD395D18692597
+1163B3545EEA6F3CEA8FFEB6DA79258E76ABDD67761F265B64431FBA1F52E1F0B1043D570B0DC6D0E81401CA3DB9964755221598E173B28FBFA4DEEEBD22B09F5B70B622122271D8632F6AF9847CE3F16FB9EE944BCB51F764D20A68EADFB84086B9A41D599364A96E
+C9FE685A
+EC2A7AD0DFA88E1E956E779A09
+F2EE7F662A5B154514693467F67D6A93261C8DF000A7
+EFCEE0AF
+FA46F357BCAD57A679CF6F5AE4C4
+5D6027A522AB739B
+30C4E4B6
+58732273BFB3888C1CA3A71137C613A5C2A3B23F2E2AEBD6E1EB915E8B45EC32DAA5
+74CBE1D273205BAFED1A4844E8C341E18412AA78C53CD1B610539FF71780211211A5E5807507
+0521F32EF3DBEAD715D9D9D893A222F459B887FD95966AFFD7BA7F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0045 put
+dup 3 /C0047 put
+dup 4 /C0058 put
+dup 5 /C0067 put
+dup 6 /C0068 put
+dup 7 /C0069 put
+dup 8 /C0072 put
+dup 9 /C0073 put
+dup 10 /C0078 put
+dup 11 /C0079 put
+dup 12 /C0080 put
+dup 13 /C0083 put
+dup 14 /C0084 put
+dup 15 /C0085 put
+dup 16 /C0088 put
+dup 17 /C0097 put
+dup 18 /C0099 put
+dup 19 /C0101 put
+dup 20 /C0102 put
+dup 21 /C0103 put
+dup 22 /C0104 put
+dup 23 /C0108 put
+dup 24 /C0109 put
+dup 25 /C0110 put
+dup 26 /C0111 put
+dup 27 /C0112 put
+dup 28 /C0114 put
+dup 29 /C0115 put
+dup 30 /C0116 put
+dup 31 /C0119 put
+dup 32 /C0121 put
+readonly def
+/FontBBox [-18 -209 798 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684274E833863450411E9158CE660E3A7F7EF77
+1D72660BA976700535161A71
+4F070388D3B5FF24B4
+C644E8A8
+D81F97790092FDBAD6359C2701
+51A55191DF57F16AA13D92E0E6E6077B697DF86BD99ADB
+64AB09DF
+CFFB28E9501E86053F3FB19266
+1D2DD29E8BED032540BF8836D351C39239B69C2D2FE4852342CD
+2445C458
+175600262E6E851AC19A81BDB0
+82FA513410022E1236A2AD24B669007ED57D7798FD69AD75D19B8AE387CFB807311C5DE93C77C534613EB07D704BA8DA948023CA5577
+4719C416
+3723FB1F5477FD8644FB9C056045
+A0369FF72867CD351A48F33C336AF06DD61192A3DCEE32893D863F5566BA59861E0E770FCA23A92B2CCD145A189693FE0F55C236E513178FD44136F6D2827C5990772A0F1F7BFBE3E5E0932784F20F73238600D0958C816460FD0C1609FC24AC74301CB8446060C4
+3037DC3D
+FB5F8A61DC710C3B2A8B318E8D
+3296CFD6048B5D8319843165414E3DF89B9059BE62786B0472FB87A114DBDF85F985D07B30719906D91F0F404531B6F58F8E9FA249ED5D3C184C4DB32F6EA3B6D1A43040A819305F56337887C4E78BE6427AD9421F3233
+42A50EAF
+4D56757645BF168A9457D42C8B38
+06FA0618A420BAF4A53D699825DF326359DF9FDF67C48F04E1F58A66D365875AAC4304A631E55672EC7214DAEC9F409E847EF2AC3CB111F8FCE1805BB7500595822E5ADAFB9F0DD644D9317B146DAF8D58B7C9A80249A66975AFDC06CBBDFDBA7488C9FFB13C7CF81DF6887A26DF
+DB55850A
+B9AF86B33BD680BCD2C8E5DAEDBD
+08EDBCBC926B6A86119D555434C5B3067FD35694705597B65068DF4C770A8F4629B66ED35D1AF049DCF5DCC2A1503A244831152768E1B2711E7A011202E9DC3552E1688B21C3291DB71494E80AB4D6D4C98FCD914CFEDF67B41A16BD0C92BF6C2614C995DD33B4F040ED11275A1EC2865CFF2A59360493
+D31E1116
+9825805E981A18B705764D0020
+3C21F1D0C5635ABC0B8D68CF0AD9C526C98C4D564E00D9B1E100F3461508680FDDC2854FBE1BC333B4B65756120034F4492FBD9CE413867F5822FA4C691B
+0188AE55
+9255B5561594CF2985DFFD5EBE
+EF83D6966D4E5B9B7AFF1ABD6099EB680DC3EC6B7F362FE4BD78284702E124B170B5B68CA58B0B5279C850BFAEDBAEEE564BD302207F0B9F004B70E9BE30A9D07E53EBE7911DE6CA48ED2B3B223250A18CA16E7A20945FD5A43E9DD9AE642A
+48884165
+4913C34314B12CF9A7C029A71A1B
+F21301662FF081CD91409316895657C2EABD0F19768B00C8BE73257AFE337A7824B9B1EA273DC083AB76A7E46DA128758784A5EED4FADA6059018438E02C6FE1F5FD74BA9D6FD9931F04461D996C7DCA20E917137BA12766ECD60373315BC0360AD53D565C853D67F7
+C422309D
+0E3DA9248CE6D0BF5223AB90EE57
+BC17191EDDF94CB1EC548D66DE4FFE2B9D9EB7F6BD2FC0A338045CBE8B6BC327F77042797E91318269CCCCABC62AB5B595ABC2605C38896B6AD246133548C347717272C4784A65F7ECDCD1C5099AC3ABED727A4A867B3318434CE0A3AF698D435E706169
+6537E224
+988398B5DF72D8E41106983A7CFD
+19B9DB650BFD1226DC22178991AE0ABB2AE03891491124D11FFE46AF87DF9A796076D8E35A5546EC276F1234B0C317375481D1375FB118179C833873826404195BA0F579F12077C67D11B7AAB7B79D7899A69DE706841B2B8979B9FEB7C417307584EEDB644AC7A0A7B7CE223233E36BC8E304F6DA72819BC5A5A0DBD3D1
+F10E
+CD7A03F2
+54C8722F3057B42AECC896C9E5
+0A85C1E6B025390590A7542676C4872C792A165EBE73059335806984A90692B89E685F5226DB6EE61C9D75956859AD06F0F8CA4A53F5929484AF5D99F6547AE1AA7D501874B9136CAB
+835F35FD
+0D2E1A57F278BCBBD1E4212BCB11
+5345D433475C2F849A89B2AFE46B325BEDC6432A86B3965DC3CF802E838FA8124DCAD0CE288C15F86D9DB4840A0EDF49F265D686C852E011EC24277C1AF0E25F8FDFAE0D292DC83AB018B1C15478477331C032421D25B03DBD686E8001581A6DBEA85C9878F033
+F6FE9700
+506D002EAB1C6C2617D462FE5B24
+916FFEE9ADAB2933EA6921CA152BDE18A6C5C29BF4C42CCAA8510CC13366EF5E05AF8CDE821A182F0A3570691FA01F74FFE76F0528DD30969DEB68BB86931A0A80B247E128519265C426C9B9E46B6DEEBC488C97A5AEF5ADB9B3372D284AA90537DA674A2320056DC2016C4EA2F3E15393103C52A9B318D950FE8AFC5CA2
+FC87
+7A74931121F64CB0FDC5C057485DB912BB7BA7C27665B4C2DBE06358347DE35074AB5F
+077E4EDC
+78DA03701E3CD3C11D1958BC51E2
+5FDEDE60520B7EC8A379702EEA002913364A17F8843AFC672172E6DF253999821DC8E042B371F9AE58260AA814CC020D9C0098D067C58E2185BA56FAD05701607878420C3543A268A5535128BA78332266DA81A5A7AB3C279105B609FD5F655409E2756919B615EBFA38928558E2E955C4CDDAFAF01F67B303F46232DF9D
+1EE2
+5F73DE84
+D918D3FE
+4274FCD623F2A473A357F1244C
+6B5E423835D5486F6E7D9ACEAD698817666AE8087E400131D4104730512848F5EDBA5FCB3C93D3DF3A1272880D91FDA799DB7906ECFA1FB85EB583C5E117AD62FF5A4022DEB13C28E48B2F3F584407C19069
+EF9DA17B
+7BBE8900C106D08833B8E5E2BC
+EF8282AC137FC68E07FD556F3C481BBF01D06548800DBEAD093A5A942D2D1CD8B1D8E6999F79F19E1F68DFB899DA4610746D8DB8F3A7642CD0FA289F1E4307A61287AD0FB0A4457C42B00E1C8775A9E79AB2B817DEE989A030363A49
+3A63F7D3
+A9DBF6F94C6145FBBEC7C68077
+AEF5B994C3A2EB5F562CC5A26587EA255E0EBD60D60AF9430116D7CB17C29584D2B92F7F858BD0FBCA252A54663A8891BB6D05298CC59948512BCF28D9051A021A53CEC5B9049FB848CFC720968A2EAADDAE1DFFCF30DF1977273D7486
+F633660C
+90AF573E4E7208D6EC6D2412BFB5
+783DB3C05DD2B98490A6AE6D687256193D3A2ED6D338F908155E0BCEA0317AFB1708B5EF49A4CEF8566776EB6B7E8A7CCA9B10AF6E7666BC00511D1CB12CD4C29B5769E624CF74ECEA52E12606EA9EBF843C52939A663C546FDEFC437B38DA7A3AD4084D5B2A6062B7EF4CCE3FDDFF7F948967EE5672ABC9DE0770979F6D
+AE8B
+24F5BFCC2D736E4C31ED9616442E47E0AA1C8F5ED65675D02009BCCDECE969681595E6524F
+F8B3BA5C
+335B57412A77D8B7A9F666E7D0E4
+EA7556A98A89CA99D1AA996E10FFE354EBFE37365E7188C179FD04C90E9EE09CE90D8F5B24DF1846DFA168F39EFB815F1F8A62649B1C17145C29E15ECD27AA11FB54189BDDC69848CF4F394AB1AA49EEA8BC376D3C363D7FEB547D9B07E8EAD1C18015E0EEE10956
+2E9A7076
+628AFF8B388FECEC36BB07679E
+B2ABDE89F3FA778ACDCDF6C55680B418675FFEF7372392F5F196CEAC8E0DCBB4046099B4EE12A2E2B5882D615CB7F39C1A5C73AD
+1AD34EA9
+ABCFD1B875F83DA09940F2328C58
+DC3A2E27E417E6DC3D7F31B23A76D03147FEF942E817BEBD938236852453882405805F355C881150B684C6F76609DAB4F1D43075F38E2BD30C597695903F30B9B872178411801E70E35E2EACC27F6B6887F219FE51B9AA82BB1647A51997F142F95CDB92A0E66FDE66EB768E1E2A2B80CD622105ABED6C3DDB914392897A
+FAD8
+28BE4C5B567D8435E4ADF8EC9816217E64B2E053511477E670D3E9C0
+FBFFDA7C
+A6033508B122075DF047C7882C84
+30F9530AE4CBBA65B9E3BB38E7AB05FC5A7AB6FBEDDB644B5A05DC49F1D2110F012B4B97B894070D5268D73CEFBB95A919EC3378AAE78965F6D93AD3794829DA492A66DC312CE44CAD490B2EE6468372C2775BEEEE037B65D7C03D8CFD060887D192D8017F2CFF
+E192BF79
+8674B9E9A54E443FD54E84C65A
+F8E73FD34760CE6A5C529B5C077CF9A6A35F7D8FFABBF3E46CD2022E3C29CD01A3B5837C60CAA6F5C437EBF99308456FD4EF7A7B540A0C1C008B4A259E33029345DAEAF75B0A
+0AFCD2F7
+478CED3478EAD555065F9829376A
+B867F43B815C5DEC83F0642392F3DBE0FA74DCF10915D2687ABFE565AC491130A095137088546DBF5B8A45BE1750C8824743439AB2AAB0C999232FFE45A367B792F0EC108BE1A0BFCB3B2E6170D1A4FCED662FC390E5B1A42B6F0269FB085CB159281F02F8F9A0A1089B95E77ED0838858
+D1C74211
+B62C91525C9A59D99A29B0275A
+F422EB54DBF17F0148B7676622917B99B336FEC2B623EC31F2ED73A3F1498084CCA1E5640E41FE68A8CF9DAD1A5F0D8FD3347466374F8EBB549991A653E1C37A9D339657B14C9639A75FF46CA1710D40DE4D12771ED70FDEB5
+44351FEE
+3F815824C1D6B92B47989AE9523A
+A6DBBB52A2A379FD3F7CA9802EB51D47BA4062C9B2BEEC01A526D5954F4AFB84CD6395B99A047909DCE9B318145EEE2CD2BDABBA76655832E01D1E6EDE6EE9198502C8B81BEC104C9A4712759496C8167B23A37F8FE5B65C6F98B04ABA45039089C59AD13BCCDE2AEDA18394DCE034E008DCC660C26F692C9B
+44BFEE83
+E6F8BA26EDE571EF7E3811FE1F
+00D6221A9DFAF9C8B2817268EB110864529FA53F8CF7CBFBAD9ECB0D39484C1E00D4F305002F9E44E2579F78B73FA8330D8A1885F484952C5014D6BBA2C4FFA15370DBAC
+386D62D0
+1D15DB492A062A1AA0C95F6D7C5A
+DF691D4C66749962A47808D38783655A7B4E6E09D98DAE0012A5C141D6DD1771D07FD71A7C4E8B895CB44CEBE5D784B32D117BF08C5D6D14CF336ADD993BFAC50ABF41E50B2148A44D0C6A4C90CF24545CAD09CF6B719D1D44538E0801AFECA3C3C23FCF04FD918F6428227C37833E44C48C1F5404FDE20ED5AC7FDFE092
+0E6C
+AE5B73F8C02D593B6193A9
+B3CB089C
+8E18C1AB485C247BA34113EDB9EC
+511D2259010AE6EA4B3018B1FD672AB2DD17F5194B287665D988769C5310ABD968C61365257369BA8E927B7BD36C2B257A4AA1CDBD7BB50ACB3E7DEC2357CABFE64F0655DDF20BEDA2F1EA57A5E990FD86977F93F3F9142B847BA042B7A8659B54B36BA5D57CDF00FBBD62F52AFB6D5135DDA59C04B15165BBB3E43461E3
+372A
+9A
+3BCF9C16
+F4F44F3D3BB8B01A8D348224D50B
+111990D17497885D
+1EBB045F
+C3152258CDB5F6C604858B4A17EC96DA7F436B00EC016BEB0463821EA00F5959105E
+5A426C7860262B76E4CA53074E84D52866CCEAD469AD3B6F02EFAB1E30B7A5685FA683F8D8B7
+68E0F1972BB819F7112F0396EB8EF2BBD05FE8F19DAD2C4815EDEF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchi
+%!FontType1-1.0: PSOwstdutchi
+10 dict begin
+/FontName /PSOwstdutchi def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0095 put
+dup 2 /C0097 put
+dup 3 /C0099 put
+dup 4 /C0100 put
+dup 5 /C0101 put
+dup 6 /C0104 put
+dup 7 /C0105 put
+dup 8 /C0109 put
+dup 9 /C0110 put
+dup 10 /C0111 put
+dup 11 /C0112 put
+dup 12 /C0114 put
+dup 13 /C0115 put
+dup 14 /C0116 put
+dup 15 /C0117 put
+dup 16 /C0118 put
+dup 17 /C0262 put
+readonly def
+/FontBBox [-144 -236 757 723] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268425D895C799469DEE44BDFEEB38E2D389FF80
+DFCC1B0744CFCA300AF2A0805C
+9B140D8C6BE5F7BE997FFC18B5D8E74EB9B2E9E81099
+3C76AB87
+C136A269C772A44727E1D0C0F7D8
+416730AFC14B87CB156ACE565EA322DC7FCBF0BDC357B396C634FCD60F82EB6E10227389D02F08CE0008A82E6ABE731BAED40925B1C752EC5BD698F30975F441EF78F36AFADC4E2DB3DB31B9E3B8B50968DABF502E232B2ADD06DECABCD55FFC95CAB40166A0757F6CA2CEC5A5445E033D019FACCE77D698F563C2AEED0E
+BAB0
+F2D636695360F1EE0FB9E495B2
+184437C7
+C9DDDF7D327EE3FE0E6E0B528C
+C121CED14A7B19669020101AEB5E9FD5C166EEC344517F3D86AB6CF0B47A7D9A59C36AB1B2E7547F2D7A3193CED7B99AAAAD62AC6779A44ACE7D7ADE9E82C0B6E9E6D144315BC4933343026580CB587B5320A40F30AEBCC75B0C8BFF78CFA4E1
+CCA2BB1D
+395B5B1D8BF7C607F1A9B8C78E9E
+CFDDDE7F37293625199AFA716B461E44AD5444EA2428CFF40E831562761240F4C614BDE11E15B8235CE2FAC0E30D4E262005A2DDDA945EE361CD664965B7AF5C4FFA2AF470F1347B6743C2BBFB4C1996F4B3DC5A1525B2F9A62769AD1EB62323CAC6B5CBAC8172E101D8F0357BD55AFB4083D0871C0696A587DA5CFB07BA
+4DA9
+BF004AD54EB43D83FA4ED07B227CDF1379A4A60A7956383757D0B04D5FC87DC09ED74A6E84A442EA8DF3889419EE0CE2
+EF5EF316
+F71DDD9803AA92D65032CAFD866D
+00AD8F5EF2F49382FD8F57F2099D546D710B27C9BF087D2D2A417698B13478D0B11BD19AA1A12C2870C24ABDCE9A540A1968B353124AA4EC91FC6C7AFEE859AEA5DE9CFAB4D5F0C160D6CEBAE1AD91F5D8AA424495AD8832897FADBE18F6D068A3A4355421
+D8BB6790
+3DB767D81464F80A96768F80764D
+94FE8A7417A062A44CEAC156C4EBEC8E2B0279049AFFBBB2B925F93B3724A6034C54DB2A6278CA7A1734588AC83DF2CD568D9B361C6C60A7DB11E15A907F823E2100861204DC0C3632C3473CCA80A8D78AC0F72A005B7E020D468FC99B0D6928CDE6FB459B4489274B98C9E882C9339FCC17E203B5651E4DE24CA32A2B3E
+5753
+21367C2F24348866C8340E93168189E4EDDE1B1381AE311FDC3C75
+933014C1
+ED5707175CC7384F5D5AF46B077F
+00A027FFCECC13E674777ACB678F2F63822264065F5E5C00BF3F16084BA181274510C00E122B80ED295903D889823251A7BA5BC786AEBBD6AE44A3B7E52037821908997A036D09C1A888D2D9FAFC8A5881B203319AD4CF1717F59F9B0B71D4C6F16465DC81815C8887CC66B5530D5763F82FDE38100C96D321
+791447D7
+78D7C8575D4324C71FF68C5B690E
+DF00F3FE451D2F31757BC8F6C355EC2F93D7AAAA542531827AC609F0FF2BA3A4124CDCCD263D12EB9CE5BCF7A68696FF764EE63DFE7A72EA565F795F291B1F940E27379832A0057972951651546155FB48F2797A30BBDBE6FF6F549BDEC22ED40EA39102CFE90DC3AE3B3F2506F50DA39004C770FEB5A8BD91D64CF261CB
+7C47
+62DAEB29C560FD82FEC515BE98648A314E300AEBB5A22918A773D87304E842FFF041D96CF856585477F51E5C16C4A7E87FE0B0A18AE52146B0AC062B7323E9FB5FB752AF22E5BFA545464B
+8E65DE52
+FC459018BDDA3CBD75903C235A59
+BC191B84CB566B0C00071EC02AC640F8F3466549B17C3CCBA34EF8A6C4D65D17688C795EB7133641A5D9988BF442670ABBE77D4D2F92AA03033A4DCDA31ACAA4E912DE700A4FC0872913DF3DD9D798F5112D880876410963D57710B76D14AF4A3AC979EF0220BAA548AC26030875101A2D544847B042EFF9903DA698F5E2
+704F
+50A5D7B127406938C729E35DCA865ECD0F1D82499751DC923F
+6EC1FA94
+81224B594D3180AD0161092DB8
+C5BFD39E77B0A75C12ADA096206F4346E603606FBD9C2FC00FAFEBCBCBEC3AFC2AED6EB719AC7C9C08FF0BD2DD1D685EDCA60A27EF834E56241E850AB260A6591F0A78767FD97422C4D75246C6113FEDEB6D68F0D6C9479BA9BC4F87408234
+53F0CCBB
+7F622F348493476CBEA35F4894A7
+8BC7DCE5C9A19894F6F676EE28E0A2F02931FD3E37988EAD23A883325049CE17CD7950F9920637511B79026A562D2AB96F0A2601E46DA778C03BB021AB59DD288176D8275A264E49C80B7311DE5E0755DED53AA472D44350D866727D547E7A306C5CA5CE5D886D6DD89DFE6067F9194DFD6BEE5549C4BF16D11027BC0330
+6B4A
+51F7099EF5F9B10677C92369F4E17A63BF45783E27E7E2CA96F1D7DE04723ADB55769C18EAB3A4A8729A
+FED3D305
+B652A6C549FCF1322F8E51F67A
+14B5B2C68B980E43608C53B385C5D8966C4F7DD5BC7BCF4C89EDAA76527875826C7DB0EEE5C13A272269EF9885E593EC2EF526EDD182E1CF4640BD81BD97F01F65D94ACF01AE146FE7FBFBE27C573ADD3E0183E4FEBBCD0C90666F
+48A26CCF
+A445B616311D4AB46CB6CEBDBC0C
+99138A50847FBB379D694932146D252077CF668D5EDD10977FBAC43651C00A84148D22C497C3C526EE6ADC55861A588CDBE65E107D1F16713E03DB0A1318082D6F18AAAC4824AC8D8BFABD225EA1FD5FCCA4E24BB38CB2F466C303B0771B1A2931686F7526A041AFD84BD579FE87AC25D82ECB9C2161
+B1F20611
+27321BB1594F47C220A4362A89
+E46F7DC99E7B314FDA69FC46EAC02EAB6246C5B458966A765E535876488AA2F692B573787061716F5AECAE8E187265AB20743A3F591525EA01E045D97D28B14B64DBA4803805858DC9A1D33D3609B13285B605ACA51724
+935B262A
+2B9B1648954ABEE24D7D6451A79F
+4041BAF24ADAA1E3D5FB167B00AA55CCA63C3CEE71612EE6DC048E5D65766127BE526F36F6E2D0B1D72ADAA440399FA04BD7B4310EA924FADBB658668DBFE854D6F244947891E733BDBE450D2F3D9643F4EF3A4F8694C5E9FA119EF7DE49805941897E4A99EEBF61A95BA9CAE30B56CA37672A296CB9B84921046E399C2C
+6C83
+B8EE4CBCC5881568BA5F01C8AA94F04FD2BCD3FB522C1A
+27A4FFEC
+1FF55FF705B3CBA6A29B9F49B4
+B605A6BB22041F6A1D5DD2E91271B7D62A52BD0A52F4BF0C8834920689522F2E8C1DC17E422783B26C345DACF1481F79C915C214547A28038FF5417657EA45CC39B0861FBB2F698A79B7569FAFD0DC5E53D0946C7852912C1A6B
+D4B2DFA4
+C7A762848EE346342A897E24D2
+897D849A81559492B1B9F4053A075AA10A37A9DC9BBADDA4
+5FDE3B1E
+F94BD3138B8160146A64E4BC3EF4
+F26630E038065A17
+F60B5652
+29BC17D3A4202C2FDDCD8655B4F94D33A85FE666753E2A5DCFE9312AB022F9C73D74
+C796978468A1BA845E2A2DDACAC05D94EEEE3DDD476D7B82F14299907EA94784D7C6F2F2007A
+D3495ED1CCAFC209812ADB96C0FD089B5559F070954CF0C15ECA01
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch12i 12.00 /PSOwstdutchi newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<1b2b39352b372c0f011001112b33292e32273730012c3437011a2b27383a372f332d011b2b393c343730011d> 2207 558 0 7384 -1 s
+<2b372c3437322733292b> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0c0b> 9346 13300 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13280 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13280 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13280 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13280 3 7133 32 s
+wst:dutch12b SF
+<100e09> 1271 1431 0 1636 -1 s
+<000e050c000d1e1c131118000c> 1636 1431 3 3006 0 s
+<131c141a1c1811191213> 2998 1431 0 4040 -1 s
+wst:dutch12 SF
+<202e2b> 1271 1797 0 1631 -1 s
+<002420180020121d003839372b273200352b372c3437322733292b00392b383900363a2f392b00382f322f312737003934> 1631 1797 8 6099 0 s
+<00392e2b0020121d261f201e14101a00392b3839090024201800372b363a2f372b38> 6099 1797 5 9531 0 s
+<27> 1271 2042 0 1376 -1 s
+<002a2b3b2f292b002c2f312b00282b0034352b332b2a000800273800392e2b002a2b3b2f292b002c2f312b002f3800353127292b2a002f33002a2f2c2c2b372b33390031342927392f343338003433002a2f2c2c2b372b333900383e38392b323807> 1376 2042 17 9531 0 s
+<2f39> 1271 2287 0 1398 -1 s
+<002d2b332b372731313e00323a383900282b0038352b292f2c2f2b2a0900202e2b00382f3235312b3839002420180020121d003839372b273200392b383900343300171d082124002f3800352b372c3437322b2a> 1398 2287 14 9531 0 s
+<283e> 1271 2532 0 1479 -1 s
+<002b33392b372f332d00392e2b002934323227332a0f> 1479 2532 3 3633 0 s
+wst:dutch12b SF
+<031a1b1e0319131e1b131c140319131e1b131c1400020800> 1398 2845 2 3626 0 s
+wst:dutch12i SF
+<0c05080a0e05060a0d0e> 3626 2845 0 4585 -1 s
+wst:dutch12 SF
+<00> 4585 2845 1 4638 0 s
+wst:dutch12b SF
+<021e> 4638 2845 0 4887 -1 s
+wst:dutch12 SF
+<002420182620121d261f201e14101a00> 4887 2845 2 6935 0 s
+wst:dutch12b SF
+<0202000210> 6935 2845 1 7668 0 s
+wst:dutch12 SF
+<000a2a2b3b0a2f332b392629343938> 7668 2845 1 8967 0 s
+<3c2e2f292e> 1271 3159 0 1797 -1 s
+<003c2f313100352b372c3437320027000c0b00382b2934332a00392b383900282b393c2b2b3300392e2b00313429273100383e38392b320027332a00392e2b00383e38392b32002f2a2b33392f2c2f2b2a00283e00> 1797 3159 16 9014 0 s
+wst:dutch12i SF
+<0c05080a> 9014 3159 0 9461 -1 s
+<11> 9461 3159 0 9531 -1 s
+<0e05060a0d0e> 1271 3404 0 1783 -1 s
+wst:dutch12 SF
+<09> 1783 3404 0 1836 -1 s
+<00202e2b00383429302b3900283a2c2c2b3738003433002b2f392e2b37002b332a003c2f313100282b00382f3f2b2a0027292934372a2f332d00393400392e2b00383e38392b323804002a2b2c273a31390027332a00273131> 1836 3404 16 9531 0 s
+<20121d> 1271 3649 0 1688 -1 s
+<003435392f34333800052b092d090020121d261b1c13141910> 1688 3649 3 4390 0 s
+<2506003c2f313100282b00273900392e2b2f37002a2b2c273a313900382b39392f332d3809> 4367 3649 6 7440 0 s
+<202e2b> 1271 3963 0 1631 -1 s
+<00392b38390035273727322b392b3738002c3437002733002420182620121d261f201e14101a00392b38390027372b00392e2b003827322b002738002c343700270020121d261f201e14101a> 1631 3963 13 9178 0 s
+<00392b3839> 9178 3963 1 9531 0 s
+<3c2f392e> 1271 4208 0 1657 -1 s
+<00392e2b00272a2a2f392f343300342c0f> 1657 4208 3 3104 0 s
+<0824> 1589 4522 0 1929 -1 s
+wst:dutch12i SF
+<0405100d0b0503> 2033 4522 0 2700 -1 s
+wst:dutch12 SF
+<382b3900392e2b0031342927310a372b3234392b00242018002a2b3b2f292b002c2f312b003327322b002c3734320000> 3177 4522 9 7525 0 s
+wst:dutch12i SF
+<0405100d0b0503> 7525 4522 0 8192 -1 s
+wst:dutch12 SF
+<09> 8192 4522 0 8245 -1 s
+wst:dutch12b SF
+<0f060c000d1e1c131118000c> 1271 4930 2 2617 0 s
+<131c141a1c1811191213> 2609 4930 0 3651 -1 s
+wst:dutch12 SF
+<10> 1271 5296 0 1434 -1 s
+<0021131d003839372b273200352b372c3437322733292b00392b3839002f38003b2b373e00382f322f31273700393400270020121d003839372b273200392b383909001c332b002a2f2c2c2b372b33292b002f3800392e2739> 1434 5296 16 9531 0 s
+<392e2b> 1271 5541 0 1561 -1 s
+<00382b332a> 1561 5541 1 2042 0 s
+<00382f3f2b0029273333343900282b003127372d2b3700392e273300392e2b0038322731312b3700342c00392e2b0031342927310027332a00372b3234392b00383429302b3900283a2c2c2b3700382f3f2b3809> 2042 5541 15 9531 0 s
+<232e2739> 1271 5786 0 1770 -1 s
+<00392e2f3800322b273338002f3800392e2739003e343a00323a3839003227302b00292b3739272f3300392e2739003c2e2b33003e343a0038352b292f2c3e00392e2b000832003435392f343307003e343a003a382b> 1770 5786 17 9531 0 s
+<27> 1271 6031 0 1376 -1 s
+<003b27313a2b00392e2739002f3800312b383800392e2733003437002b363a273100393400392e2b00383429302b3900283a2c2c2b3700382f3f2b38000508380027332a00081f060900103138340700382f33292b00392e2b0021131d> 1376 6031 19 9531 0 s
+<1f39372b2732> 1271 6275 0 1921 -1 s
+<00392b3839002f380033343900392e2b002a2b2c273a313900392b38390700392e2b00083900> 1921 6275 9 4878 0 s
+wst:dutch12i SF
+<0e050d0e09020805> 4878 6275 0 5653 -1 s
+wst:dutch12 SF
+<003435392f343300323a383900282b0038352b292f2c2f2b2a07003c2f392e00392e2b00392b38393327322b> 5653 6275 7 9531 0 s
+<382b39> 1271 6520 0 1526 -1 s
+<0039340021131d261f201e14101a09001f3407002700382f3235312b0021131d003839372b273200392b3839002934323227332a00322f2d2e390031343430003834322b392e2f332d00312f302b> 1526 6520 13 9531 0 s
+<392e2f380f> 1271 6765 0 1653 -1 s
+<03> 1398 7079 0 1504 -1 s
+wst:dutch12b SF
+<00031a1b1e0319131e1b131c140319131e1b131c1400020800> 1504 7079 3 3785 0 s
+wst:dutch12i SF
+<0c05080a0e05060a0d0e> 3785 7079 0 4744 -1 s
+wst:dutch12b SF
+<00021e00> 4744 7079 2 5099 0 s
+wst:dutch12 SF
+<21131d261f201e14101a00080800> 5099 7079 2 7068 0 s
+wst:dutch12b SF
+<0218> 7068 7079 0 7420 -1 s
+wst:dutch12 SF
+<000c0b0d0e> 7420 7079 1 7897 0 s
+<202e2b372b> 1271 7393 0 1817 -1 s
+<002f380027003829372f3539003537343b2f2a2b2a00392e273900352b372c34373238003b27372f343a380021131d003839372b273200352b372c3437322733292b00392b38393809001839002f3800292731312b2a> 1817 7393 14 9531 0 s
+wst:dutch12i SF
+<0f040b010d0e0c050208010d030c070b0e> 1271 7638 0 2863 -1 s
+wst:dutch12 SF
+<09> 2863 7638 0 2916 -1 s
+<001038003c2f392e0020121d003839372b273200352b372c3437322733292b07003e343a> 2916 7638 6 6390 0 s
+<00292733003a382b00392e2b003829372f3539003537343b2f2a2b2a0700343700352b37> 6390 7638 7 9461 0 s
+<41> 9461 7638 0 9531 -1 s
+<2c343732> 1271 7883 0 1712 -1 s
+<00392b383938003e343a37382b312c003934002d2b39002a27392735342f333938003334390029343b2b372b2a00283e00392e2b003829372f353909> 1712 7883 10 6844 0 s
+wst:dutch12b SF
+<0a0b0e07> 1271 8197 0 1866 -1 s
+wst:dutch12 SF
+<0f0021131d002f38002733003a33372b312f2728312b00353734393429343109001839002f38002f323534373927333900392e2739003e343a002b3d27322f332b00392e2b00372b383a313938002927372b2c3a31313e> 1866 8197 14 9531 0 s
+<2738> 1271 8441 0 1457 -1 s
+<00392e2b00372b353437392b2a00382b332a003727392b0029273300282b00323a292e002e2f2d2e2b3700392e273300392e2b002729393a273100372b292b2f3b2b003727392b090016372b2739002927372b00382e343a312a> 1457 8441 16 9531 0 s
+<282b> 1271 8686 0 1489 -1 s
+<003927302b33003c2e2b33> 1489 8686 2 2586 0 s
+<00372b353437392f332d0021131d261f201e14101a00392b383900372b383a313938003934003227302b00383a372b00392e2b3e0027372b0033343900322f38312b272a2f332d09> 2586 8686 11 9531 0 s
+<15> 1271 8931 0 1402 -1 s
+<3437> 1394 8931 0 1591 -1 s
+<002b3d273235312b070034332b00382e343a312a00> 1591 8931 4 3845 0 s
+wst:dutch12b SF
+<11171f11201d> 3845 8931 0 4449 -1 s
+wst:dutch12 SF
+<00372b35343739002834392e00382b332a0027332a00372b292b2f3b2b003727392b3800> 4449 8931 7 8152 0 s
+wst:dutch12b SF
+<1e1a15131e16131c> 8152 8931 0 8906 -1 s
+wst:dutch12 SF
+<002c34370027> 8906 8931 2 9531 0 s
+<21131d261f201e14101a> 1271 9176 0 2780 -1 s
+<00392b38390900182c003e343a0027372b002d342f332d00393400372b35343739002700382f332d312b00333a32282b3707003e343a00382e343a312a00372b3534373900392e2b00372b292b2f3b2b> 2780 9176 15 9531 0 s
+<3727392b09> 1271 9421 0 1684 -1 s
+wst:dutch12b SF
+<0a0b0e07> 1271 9735 0 1866 -1 s
+<04> 1870 9735 0 1928 -1 s
+<00> 1928 9735 1 1981 0 s
+wst:dutch12 SF
+<00182c003e343a003c343a312a00312f302b00393400403527292b0200392e2b00382b332a003727392b00342c00392e2b0021131d261f201e14101a00392b38390700272a2a0027000813181b> 1981 9735 16 9461 0 s
+<41> 9461 9735 0 9531 -1 s
+<20141e> 1271 9980 0 1721 -1 s
+<22> 1698 9980 0 1860 -1 s
+<10191f> 1837 9980 0 2252 -1 s
+<003934> 2252 9980 1 2480 0 s
+<00392e2b003227302b2c2f312b07002a34002700403227302b0029312b2733020027332a00372b08293432352f312b090025> 2480 9980 9 7131 0 s
+<343a0029273300392e2b33003a382b00392e2b0008280027332a> 7105 9980 6 9531 0 s
+<083c> 1271 10225 0 1591 -1 s
+<00002d3134282731003435392f34333800393400382b3900392e2b00283a37383900382f3f2b0005382b332a38060027332a003c272f3900392f322b0005322f31312f382b2934332a380600372b38352b29392f3b2b313e09> 1591 10225 14 9254 0 s
+wst:dutch12b SF
+<100e09000f060c000d1e1c131118000c> 1271 10633 3 3035 0 s
+<131c141a1c1811191213> 3027 10633 0 4069 -1 s
+wst:dutch12 SF
+<202e2b> 1271 10999 0 1631 -1 s
+<002420180021131d003839372b273200352b372c3437322733292b00392b383900363a2f392b00382f322f31273700393400392e2b0021131d261f201e14101a00392b3839090024201800372b363a2f372b38> 1631 10999 13 9531 0 s
+<27> 1271 11244 0 1376 -1 s
+<002a2b3b2f292b002c2f312b00282b0034352b332b2a0900103800392e2b002a2b3b2f292b002c2f312b002f3800353127292b2a002f33002a2f2c2c2b372b33390031342927392f343338003433002a2f2c2c2b372b333900383e38392b323807> 1376 11244 16 9531 0 s
+<2f39> 1271 11489 0 1398 -1 s
+<002d2b332b372731313e00323a383900282b0038352b292f2c2f2b2a0900202e2b00382f3235312b3839002420180021131d003839372b273200392b383900343300171d082124002f3800352b372c3437322b2a> 1398 11489 14 9531 0 s
+<283e002b33392b372f332d00392e2b002934323227332a0f> 1271 11734 3 3633 0 s
+wst:dutch12b SF
+<031a1b1e0319131e1b131c140319131e1b131c1400020800> 1398 12047 2 3626 0 s
+wst:dutch12i SF
+<0c05080a0e05060a0d0e> 3626 12047 0 4585 -1 s
+wst:dutch12 SF
+<00> 4585 12047 1 4638 0 s
+wst:dutch12b SF
+<021e> 4638 12047 0 4887 -1 s
+wst:dutch12 SF
+<002420182621131d261f201e14101a00> 4887 12047 2 6991 0 s
+wst:dutch12b SF
+<0202000210> 6991 12047 1 7724 0 s
+wst:dutch12 SF
+<000a2a2b3b0a2f332b392629313938> 7724 12047 1 8965 0 s
+<202e2b> 1271 12361 0 1631 -1 s
+<00392b38390035273727322b392b3738> 1631 12361 2 3075 0 s
+<002c3437002733002420182621131d261f201e14101a00392b38390027372b00392e2b003827322b002738002c343700270021131d261f201e14101a> 3075 12361 11 9531 0 s
+<392b3839> 1271 12606 0 1595 -1 s
+<003c2f392e00392e2b00272a2a2f392f343300342c0f> 1595 12606 4 3481 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (11) 11
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0034 put
+dup 3 /C0036 put
+dup 4 /C0039 put
+dup 5 /C0040 put
+dup 6 /C0041 put
+dup 7 /C0044 put
+dup 8 /C0045 put
+dup 9 /C0046 put
+dup 10 /C0047 put
+dup 11 /C0048 put
+dup 12 /C0049 put
+dup 13 /C0050 put
+dup 14 /C0052 put
+dup 15 /C0056 put
+dup 16 /C0058 put
+dup 17 /C0061 put
+dup 18 /C0065 put
+dup 19 /C0066 put
+dup 20 /C0067 put
+dup 21 /C0068 put
+dup 22 /C0069 put
+dup 23 /C0070 put
+dup 24 /C0071 put
+dup 25 /C0072 put
+dup 26 /C0073 put
+dup 27 /C0076 put
+dup 28 /C0077 put
+dup 29 /C0078 put
+dup 30 /C0079 put
+dup 31 /C0080 put
+dup 32 /C0082 put
+dup 33 /C0083 put
+dup 34 /C0084 put
+dup 35 /C0085 put
+dup 36 /C0086 put
+dup 37 /C0087 put
+dup 38 /C0088 put
+dup 39 /C0089 put
+dup 40 /C0095 put
+dup 41 /C0096 put
+dup 42 /C0097 put
+dup 43 /C0098 put
+dup 44 /C0099 put
+dup 45 /C0100 put
+dup 46 /C0101 put
+dup 47 /C0102 put
+dup 48 /C0103 put
+dup 49 /C0104 put
+dup 50 /C0105 put
+dup 51 /C0107 put
+dup 52 /C0108 put
+dup 53 /C0109 put
+dup 54 /C0110 put
+dup 55 /C0111 put
+dup 56 /C0112 put
+dup 57 /C0113 put
+dup 58 /C0114 put
+dup 59 /C0115 put
+dup 60 /C0116 put
+dup 61 /C0117 put
+dup 62 /C0118 put
+dup 63 /C0119 put
+dup 64 /C0120 put
+dup 65 /C0121 put
+dup 66 /C0122 put
+dup 67 /C0127 put
+dup 68 /C0262 put
+readonly def
+/FontBBox [-25 -256 978 766] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684224C22A511BD5CA25D46542453920A678147
+AFC21FA7F4F5862CF1709F6C
+BF8C3ECCBFE4507DB5
+612E491F
+087A12D0ADB82F28DA93FC23F52C
+CEAF524940C77625947ABC17220384663B647815F94C97322EE3AA265BF180CAB3B718279AFE22F9CADE8CCD09858F70BA644F1412CDC6DAF6F810D2EA6C5020CD3D66D1E0DD45B76A301C06B1CF9602829F54913BF787A0A3F9310924D89F5C22CA6BB573DBEA
+572C228A
+9C7DD0944C14C69B096DD569B2BA
+9FD4066A6C3EB0C1DC25D95A6534151F8A9FD134EFEA26B8187C562806A410905E736B8D8019D1FB69B014CB890B9EB8AD38313ED6E9C10951DC8FD973948C19BE876D023A27B869E12812F6570E725A3CA2060EDD650C8D68726F2A70C462833BE6F7649F5630E2BB887C26449D9E5704EDB56B8B774621B1AF0382726A
+D913
+B78DADD91F8CECD2D5FFB19F
+10BA8311
+F1E6DDF465A68FC27C95210E59
+D0EEA9C3F7B9BE534F9794B23D61D32921CCF1BC1B29FEBA7372FD295EB78762B3CE7C3B2FC857C75BCD4E2B741B0D97F1B51E3B20ACC674
+F2D05F6A
+259BE50B405DF68AFBF6C2EA8F
+4349C9D418EAD702BF3DD3C53FC64ACEE14342BBC9927943B46C72946CB9B5F1D625576A7E47A9778599C125F09AC64C7E1B1C5D8AFD549DDBCE95E01CAFAF14
+633096D5
+6B983FF8F3388E9D5B571280B3
+333419C6D2C1B983BE9C4DCBB47D12B8D450B047019E1449992548D741111DAE828F3FBB0E607699FC3C95CD3C8600CF78A619DADE7BEE204FF69E30E0828F
+4E67A65C
+4D0FB79C01D059DB24FE20D669
+E65AD7D48E9D71B8D22DD78DC8C43B462F15ABD8C66A71A4AADFD797D7C8CD58CD236CEB89671E8630B972842CE58E65AB2084E504FDEA8AAE
+F1A6EB87
+AEFA15970876FFADE9A5424D24
+3AA8BC7E7B3D93AB90EB562AEBE477AE9B922190780DF7
+7FDFA0E0
+9A1B03E59B8488713805DA8960
+309A86FFB4A524FDED2544E268C129140108E8B536352C9B9E24A7A8A20537
+B146AFEC
+A04708040E80E4500F9011D852
+6850A860E02A9A4F98A1533AE6D5FFB7A39CE3AF5098519791441F8A
+97C66902
+DA3DB42B8C3E61700DD30285E1
+AB798394A9643DF575C93A1E4FA54AB50C92320777C16A8CEDD051E42C525A2F76D530263905794F79EAEC31F396AC731434484C111EBC74070049FB9D059E099B705ABF881C881B9F1C
+4C8A40AB
+A562EC813780CB87B0847516F9
+1852E1FA9A02DEB52E679702D335543ED1E3107A07D43B8C3DE3B96FF5263E145DEEDED8DB82C5E7B7DB8001A44C6495CB76559BB09275C1324E105EA437BF
+D9578140
+6C68065100CE16DE9A4E4A3C20
+2A378409571E4F64F877494B238F57659DB50422F18074BB30939D414952A6E4FA22364393595A1F3DE826957204AAA662077B2F50C8E1E6CC7523FA81832CAB414AF2EA82AD03B2E05BD8EC9919E1D68E091FC2C80EFDBF6EFC
+1F7141ED
+9DD380E035AC549BCDAF2AB276
+75CA5228632AA4C18CACD9D7B9D3186719931C8E6652F80B56E5FFF9178C4800207F776343A84717380879654B075A37C7A1B2FA361859053C63
+F53C3D9A
+D4DB70759D20505DBEE4D0134F6C
+1FC758396CAE272B48CCFD1E4301FDA24B9127B9A110051D96F94374F44CA7556475D1AC6FFEEBAF9DE8EE3671785E04C8D4742D85B66D00E956A167AC2BF65C1286C0ADED0FBB45EFCD721C96A2B56360C5D23F64CE694ADA706AB4D81068C12B23FA1CCF66DD0B0AC13872879212C28C07DAB99465A91F6E24
+D40AEA92
+6313087BD870E17653B9A0FC60
+05FF40970C0EF3CFD79F0CA40DFE510884ACE03A89993D908100106BB78EBB2565DF34B9468884CC5E93A509C06B1FB2571BB618060E
+A6CBAB5D
+F3550CCC9B4D49D2C7D89269E8
+88FBA1E2A89F742DC47F4E8AD4B520D00BB697A655B3E48F8F3842BAC7385BC6E4D5E2A9
+0B34C5E6
+2AD680FD1BB8FF378228D96F2191
+AEB4D4EDFD1A53A6026262E97DB62D80879C21E10E0D8535EAB43EB51751104B5DDC01914FEB029BB9BE2CA4BA7961BF24025E5222795DD3346FBC7E2E9AEB359774D153399060B2BBB4C726E3F0C41DC373290B5FF2D6D8BD5BFB9A0196927670DB335CF54AD22032EB8FAA9513B8F9EDAF85
+A3CCCF42
+A721A4B44413824F70E0A4A7C3C2
+1E322AE66AB737CBD49F7056EDB835AFDE2DB88FF761CD1E486E61DFE54159DAA3AB414D98A8449C968BACB436779C372450013C41FF970B9A072846DF7D953B8869369CD1740135036DFE78575474CA37155DC7E912C6B40B853B21EAD6E53C1BC112F3B06D42928B97720664D783EC85ACB07ECFA2780C71FD249B831F
+007D
+B3
+1BE9F709
+7CF12A9F3E18593EE343E39A8E
+59A9490D11AAC175567660FCCDBAB3E17A57BB1B36D6733D7C3299D0D7400751D0CE73C80F6507408E25F53821097BD3CF46BF0F437995A319B3A22B0248E9CAEC28033CD929D02F82807286C7C0B9430B308091416041B8D710E6256A1E0B19B4
+911B0AB7
+BD7B4165BB97313C464F81A557
+7BD4B25565736735F8977A153FF9FA79193A29BF97D137362B1E08D4A9E20FFCD5A470871BDB1AA41930523116C25261A91BD11BB8D6AEC58D4B96E3EEE188477E40581FB25C4D5CF4E73FA8F68D58C63A7C41280C8DFB514050B7DA693DB2A9F423DC
+4147E3C6
+F6577012B9D355D083AB62C1D10B
+EF7FE76C66A6C510711CDD6184F551886CFA21ED676F3EC981F06F10F64970785792BEBE3D21814881B6118083CE3C37D56EE3D7D5D9ED1163750762D0E442431DD922B46405E6E9627419879E720B6CBEBE227DE2D9B893010FD7AF9222EAF2FB73DA832D221EB70FBB938C65B32BC2989721FB5880D66A60FC3B7CA045
+DADEEC25
+FEE6A0D575CFDCE92050A47EBE4D
+D5C1A4A7E87024DD605669DCB2D640D06748158EAA5551F7B0D814B0078D7287F04F840A4F0F8E891E04F7B66436D725249241DC51A4B17044D116A185E7EAFAC7288B31D9C3EB5BE2C32310EA7EA7C1B034EF7C5248563F915FFC19B51EA7424D28C759E3B5A97521
+B9701A5F
+721731E630CD4DF5CC29655CE94E
+0768F4E95EDA4F8D6B53C1AD50CDB87924630C1B528FDBA676C88B2D31828ACC320D33C642FBE3210D3CCCA29CDEC13963D344C4A3E130E34A9F7F586F24B2018977FD0E1FE4652C7EF24DBDFC5FC0F83746F4D198984BB396DBC015E13F36B01BAD0612B981081A7E8F7C50BE3D4FB591DFE8F85393A9AEA1D3
+44C97C9E
+64C418DACB2AC03A08F023069DF8
+D162A2B4A853ED0593B0BC5191281C1EA6075F4D6FF6A2924F43B2950564952E9A2BF0CF4B8B41167FF29C7E7D128475D129BBABEA4BE39904D5BB9371266FEC47B4DD6F13C8F0DB1404F52A6DF4A4E402C3BF2B35B8A4B23D2742B9FE403DF7F196CAE9022C35E0FED8902B14D00100ED272E5681D3B1CFF387D1FFF928
+49EA
+3AF0082C752658EEE29674
+A0776F25
+865856639D698145287502747D
+6F4CA1BAD7A906A0DA2A11B77CD1E0B8397D294F743E47A28B0CBC5F67A765ACFDE0FB973665E8EEEDDF5926BA02B5792E9699BE3B993D6DF2596B
+7B898778
+AEF14A224F92E546D094682B8F
+F65D3F5920D163A66EBE93A75EF8C8E8A67A46C57DD41C82774473B3903D510D92F306D1CD4A9F0FE6F9069541AEE97478662CF5EFB25D15C78E2B3AF6DB8A269CA1207D8D178F
+E0C7EC3E
+E5361C7C6985905D779785A57F93
+83AA2357B07EE1AEE9BD3ED67EDF7D1907C6C0B994106DD916D72DB30FBCB3362AD147DEE232D22951FD3BF0C3B1E032B9008A1F6B2BA6F57EFC50B7C12B0CD22828A2AB2A0AAA36587CC221851F275D542E61FD52C2CEB6872CA89CDD78B3F530444A31A52D36C9A0FA232CABF350
+DCD515E1
+B0E1A004CB09BDD4E63458A43B
+D42366D5DD5FB5F757000D45868A546998C7D4D03920B0C25C9DE9CB88899AE58C71446777AEF648C2D1447D4E7D01FAC5C03A5E9A25BACBC8B03D5F27A0A5B4242CE75F791E6E4F3CD84634DEEE6B90920E73BDF551BEF3DC5F4F63
+30F9B671
+10C937B9F0DA50365835043900
+CF3BC8D61229C78BF6CBE3A2D98F01A41E19D9D0B4A869A5769DC0B2A8D4E02F253BD623246AB0B4AF8FCF56686DBEA40905191DEA0A11DF5F96C45BA94AD6BBCEBAC85F6CF7E56A4838AC0985092CFA1E7FC9
+98BF2B42
+AD5FC44F6D9ACE98D57C8876AD95
+40ED7DAF9C2EF563BB4BBCF82C5747603A3D5AB77F0CA89FD2FAC5A8C995B28561A963C63240AEED50BA95EB76F950CF37048E9B28AC046CC6F5E8901421ECB0274BCE41802E82E2D504C2B1C5A59CB5C1FEB1ED3C295B8F44CC166EC43733CD7BA04F61A8C324713E81
+86A92843
+C2CF810B366E455E037545355991
+B4511E397C0DC5EDBA1AC61FEA75761F77849F899466D4188C924FF8B1297481A26CCC07DB730AF6D8A5F01505EE0C2A343E3479B8154A132A00F2FFF4A0EA17822C815D56587354FB0916D54A464F2C3C33EDCEE832CBFAED7E7E82FAC6803E08C3E4F2453B1328C402A873E688F6D7F71DBBA49860AFB826C71CB98B3A
+CF150B8D
+E3C5B1467EC43672C1EF84C85718
+6645C46757D4C30B7F10549EA09ADDB65705C45CCB6F5052FE5A012410B5A4DEFC35E825152090F4832988B43145F1E886D692ACAC939764C3C6B371A2A970E4DF7469D527F090621F69E9EA4F7C8A7DF5C9BAE1F0F977273A06F7DFDE33160FD4C575A2F0E05F25C902035EEE4F8268EAE7523A30231B09319A69ED8EF3
+5F24
+3A0619
+A72D9976
+A52DF6834639C5BC9CF103318B
+37BD96C93C54B359D0F0F9B96C9954E742115BFB8A39E64D38E78BA2D78BE6EB1912AD0EBB5CCAAB03E95848B6EF8A367ACACA1CF5907477143D3D92D3957472CB839660CEF0D8037CE0F104A85463057B
+0D02B95B
+515B0BEF60B3A29AACF8DE1DA1C8
+62C9BDC30811332AC8B0A7445D41BD5190EDB9A053BCEA7B9C74EBA9B5339E48BD5F45CDC463B089619D9D219B8E14ECACF7505FA21DBF3F6234743D37430A4B656465B0E458CFE5961303E6C0703FD41E7B3C6BA0FB63505927B26CFFE7B2CD3E5DADBC
+B86AA534
+3989BE1FCB061817849B7D6498
+A0F0C3556801361B26F19AFD63D88978C89FB32A55BA113F360A1F6BB98EC67D0BB185D2DB1DD2D5371F7EDF65E3C7E8875721583E83A55300A0A99AA009AE445B1D5247BD05E8E9E48A15C0BEAF51985966E48D31A3110981
+52403DB7
+DC2BEC2990B0594D6E7E539FB780
+27C7FCD0624832900AD3A57517BC03ED75A78D4E9C3B2279EA51D19F4F24151025EFC332673D90CAA50E0069C9B68E03E212281E07B39E83E0E67ED2C672275F5D58CFF1F519036882C82815B775FC41A6B9AEBC19504B6273B95C073176F91917D925B891E3B23062FEB019B50ED511656BF3828638617F068E7A58AF39
+67C3
+2445354A6B249FFEFF0FB59B0DCF6A59
+3035A617
+7A474AE9EB118A97F38DD85221D5
+F92139BD6D3B0F23CB78B0AD1BEC334BA6B917F9CE933E2DFD122B2CD8E34B8E76CF6ADFC64DE61BF9FD68E47F3F0BB111D30AE85667481714D7BCA7DD940E5AE12AA87B95FACC2685FD2F460D87C9A2D013588B3901154BB335F5D70362151ACEC8DECD6175E6212F6B84158D83102601728F57B218B4627F08F485D299
+5E01
+D1D71FCAE5197BC8AE893B88293FD619313DAF2D8EF1BC7C807F9ECAA8457321D12A3905D85D20
+3A319385
+CC5A17314EAA3947C6F036B7A36F
+EBD489C076FFF58B58CCC16D4DB562761797E76326A66415BB7907B3CD176754D331A9C734B8F9EA2FB376544D9BF9F370B8DD4BBF0826B16159DB0F65177288D5F34F55A0E9C34F175AD85984E512F636814DE6373DDEF6BFD904C99BDF465EC87035A7535FF95A65A9B6116BE2DE2726BC1F
+6C0791F7
+FA9E30710BC4825DE36C02C72E
+13688BC58A86B886A2DD8CD8E35758288021D2E287C9
+E29F791B
+E54D5A54DD3107F4D88247DE6E
+D8D91F3255F1DC3EF0C2E9A529E7CCA047D7ACD40B48E527F67507009F73FEFCE76BA6D1C57CE0B4C4EF21BC5107DDD6D23C12E90D2CADBBE470
+77AF1919
+E4C8393D9DE22E27070C6E047F04
+3F4D780E29445A9B49FADD35821BC9D06A6310DBF7BA81D5FE7597D8B72C9084CDBB10B26003324268E9C07D16B2D41ED6E8E9A6963A35E90C1CA54CA28581ACC21C674550A92A6C873257029873A4DED8B6535A472BA2A12104CE042B2A73484EDECFF8597C249767A20BBAB523CBE089C8EE12BFA90BCEBA8E327ABF7A
+E401
+711E4D
+3E46657A
+87F8E5B34CF64501C6E05C9289
+D4A14E9971C43359E2FCFD3980E1848C653D1BB1365A96AFCF742EFA4E632207CC81710B0C6E34B74336AA53CC0823199DE7C8CBB96C4BDC9396D18B49E23001BF48827249ADD98112393091D238E64BA1F8955C7A9D0F14
+E9108D9C
+5375992B24E4FACE8C9D34331B
+FA9C9A0811A6F784E3DED27DC75A46DC26EADD20C2921A9E2CD292B23C1A4BCEA3B8355322FA9C5DF9AE05632572A96E185501637C79CCF68CA79E157F4635536D83952DCF5E1649DEB63EC61BF5C9DA0A0A
+1B78ECB1
+BBC7F4B7B9DEF904535DE93F2E2D
+3DDB352291B707952CB6F6CB026DBE03907B54CE78D2654F7FEB3B12B4A84D07F5A685779CD06C454E3FA7D003FDAEBA69666305C0C6885C42F428C24398B032B700E6C822FEE693FD90C9091CF8ABC72D471FE8578AEA7799D80E2802255AAA654DC3BEF28C5F89D5F738C098B5
+547C5BD0
+AB0F0C3BD2FC4FD1B121E3F9CB
+72B99D5BC9D383B06B8D5399ACCB62027BD689523D8270D19BF252DC5257A504D791EA2E6C5B7C783BC7386D36179BB908DCFEAB1BDE89B31925252CC3C21415E646CD4A5814266B5D56ED1AAD1C0E7B665CF520E63F4A7C77
+B6262708
+5F68A726099B497B9FF103318B
+37BD96C9393A21C79C74B04375BE601FC2BF63FF9688AFFBE5E2B0BEDCFA12D80D9C2F190819DEE8D37D001CEFA71F17F0F739B07D54F901759C61EF003451A9FD6F5EDA89237D389ACE4A23AE343A8C7AE3DE065D3011BBF2F47D3F
+75513A76
+3642FE6C977BA445B956BA0FDFF1
+E76B74CE667BE2B1079725B8679D397C17E7E4DE85B3CD0807CC1745CA2DC1CA5587594E7A132A54BFDDC6BF845DF689F0C4CE8F7663C664D724951F34CE5FD1C8AB4B202D311EE13FF4468BC2FB204380B46978EE899A2EC943BEFECB56F18A368688F4866915E5F84231A56ECBD86C19D93B79B31BB0A18249F609D420
+70A1
+D6DCC4DBB677F9688F4478D44B2CC68415EBB49FB211884FC33B3CDFDF48BA5D5BFA5B2FF3851F07FEA667CC70C27B
+C95CF8F8
+4D6FEFCCB7D76A17F509B0CDD5AE
+2CFCAF3A5AE671796DE4016EDB83A45FE468EEC0F8E804175C745F7F12D5372DA0EFB7BFD98072B7AD017D8999C5CE9F79C9018AAC55845FB4C7B355B784BA22F03379EE6D18BBC93A642600F618E10AA5654CE2B02EBD59EFE51B89AF2379369A33B056C7BF6D1512FBF3C8F0
+CBF2F282
+24F8C79EE2B0D40EF730A314B3
+E55EDA5ECED507F1672AA3C29D79C66DA8FCD30B5FD11DF79E28C663B1222EEE262D3372F742F3169E9C84CDD1A6AE1BD3319815359BF6BE06C56D5734569379A3EBB29F6CD6EA4C4839890CFA6C8413
+F5170E2E
+9850A9747EDD3908BDCB52CF9919
+C19E97817C187CDB1752BB20AFAA3C004481A9FA83A9ADE07E83071258DBCF081CE196AD4FD06798AE366C8B8E68E7F994D789A4041097CF58D73C93782A3D235ACC9D9292E18FAD1D60883132A968A41123FD293A03D79E47AF8A9EC70028D93697EA3092B3DC9E466B37F6EE6021E92814D783FA77F9A287C9811860F5
+42A3
+C5A06234D5E174372C668353C9E703A1774C1AD5321073AE21E2DA56506CC821C37499
+BF571519
+0F3511B0B8EDC6D5DDDF3F3316
+02FE0FC1AC22E3BDB562BD2FB650995B83D9AB4A94220CDC4EE5CBEFE480BC85E67C20A5BEF48BE803C99C85123E558204766F841D53
+57BD4461
+D5252AA6DEBA50DA84F315EED28A
+636809D153D23E318D75F845BBFEBF0E58331462AF77471A10603A7F5ADF393ACCACC68DCF5EC32C7DC85B461D0CB6FC35CE1A5FE4A0632FFA72B4A8DD45E27486F08D4C5884558AE739F5ECC805DF8BC730277BF49A48D5ADC54FC6166E700B5540447E3F90B77B0DA98BFC59C9325F85286236B4B3B7A8B4E68D445AA3
+FE1A
+A4B9C4079578907F36298FB6FF840593684C833CC273CB1DE34A5AAF9CCE34
+A7637627
+759A2C7A2896E3DA462DAE333DA3
+792EE6F902B7EC8B67E65EB4DFEC5C071F5F4874611DCCCE3176DEF28AFC415DB392A631B889CDB03CCED8804D8178E10954458167D3F69271131FCA9237DE888DD50A2DD2CB7C9F697C602424C83EBD03F61DF06714BF80FCB14B78370D0F5ECB669DC240AB1345D22097CC
+0C24D58A
+3B7467624EC90A324719E0EF17
+2C72ADE93EBB1BC4426B88776282A98DB08371A75ABB51EB0EA07F44183275CDE8940655302FD25F9972C5C887FD8BB8F474D98A11F34A5E16DAD8565FF647943640694BF4F1
+196E32BC
+BA4502C310BC29E633AE79C60649
+618BE2D92FBA92DB8F55FA402B81B9CCC93DB07C19A3E588881494BDD251ADCA0C23F0310F76D741CF356EF6007BB89966E66BE2952167D18C5CA20DC8496B4042AF845077C9E4126F5CA685DA7A1F7115138FA358675D9A907981EC056808C9D480481AC35B1617C132BAC3E0DCE26912537B50C2313E
+27ED1F9F
+E2EDE6C5D47420189F87E6656CFE
+6D2A1A687E0D1ADE2DEACB6E152794D7FE0C089980BB5B59CB0604611F34404ECD724CB90532A30117064E6763B311200E6998E770ECFFB7C08451709A3DDBFC81207AE9CAAEB157EC11DD2573A79F1569DE5028724EB14783C9630A2B5D2E3A67AA08F6A537931289E8
+0202DBB5
+8C4AFB5A77C088583D128456F9
+8B8120A1A33CC28B0A33AA16E6C3CA89A2707EA81D386322570380CB2A939245C8673CAF84CBF0C6C7ECB882FCFAEAE5ACD2328C5D467CEEE21BCFB7DB5D3F794981B3A89834D3E306B659A5BA4407CFCD1A930EEC8E53
+B6EC86A9
+32EDAE7B40D4CDABF8D2C2604EF5
+2210F343637473808EA6ACE2129233A2CCA029BDF54ABAB96EEE95F99B6F9C95BD76F71F142B132F2C6DD89AC4AAD6D8B523873E2E459C62EF02F89FF654C5064860BCA745945F2F1BB1A77947AB42560F11D02EB932F59B82258600453469BA003219CD340A1DFAFA9B9250ECCAFC47D815DC88C59F95FC7BE9AADD
+C7A00988
+D964812D849D361D900EF93504
+2D304986DC3EC8DB8DC74ECE47AF10E5B718867B719A262E077456EE7E4DF1594D6B8A92EB473215AEDEB6BABB5457E1A37196AB8EF55041C46D3718D94C7FF394319C5CE7
+F69F0C6C
+0B7504B9BCBB4E2AE3E5621069
+98F7FBFA6469BE8866DC9F34CEE9163C7129AEA946DEEB114FE2E655A942DF9282261506E11EA2B4AA88A3BE49C79668CD3D794EC72E3A0176EF6B9E833962E1A31D3D8049133DC44614E3CB1CF9D0D5C8BC1A2D87ACF36A678634924ED0D00AE609
+2983D43D
+08AD05B8693C6C598BA50DCA2E
+BEE2FB9367BBDD29CD626AC54AFEEDA062AA3628CE4B1AC3CDAA9A8332D3D0939F2A11868BBFDCA445F7F148AB31A914076D41AE4C250A47117E9957B9FA6B7F4EA33C0CFC0203690AE3F1389B24E025C7D0203BA45BBFB973
+9C5B862A
+08D480FA16502F550B4BEB512EAB
+95AC899D02E9D800D4780AFC24C7002026216286765040340D3B18D3E46DB7829F2B5788AE84F5729FADFF7D35E2E695ECE3DC8252A55C0F199007107AF5812C6859B5E4268A5E50A11067F71DE4750031E9089493B214C60F10FD7F5E55456CDE6AF36EAD6478206CD897248DDF29816FD160B4A98B44FB407E892935FE
+5380
+C8BA4F1066E898028F452B911CDC
+8A8045DE
+82E1DDF76ECD5FD8E0BE60E131ED
+9AE9AE51F6FD31557142CC33A0D1BCA2E1FE97BFAD85D32D913E8A1CC03FFADBF89AC15716F0BC37823D7FA6213A65774913E7B83AADF97D8A06C7C50267D1AB2A9620CC538D1590E03856C4FA64D297FBDF43DDF407E7180E63E2B91638AA381BB4A7190E180A0436EAF5F3330D9638F23577529F822A7574619078A73B
+C4EF
+11E53453685A42FD41E4401388761521D0249E7E5C6ECDFF27
+414492F2
+D225FBECB573D149258CF53CB3E5
+2794376921E9C5A75C66FA0FC1FE9D6FF496553A2947A50BA90A9AF5DA8631E4E6B5D095C2B664BB1C556CFDDAD38D659A8F6751C206167A4E210E173BA75A9490A8A590C23BEC048386E4B8E32C7E8E3005C5B45371FACF2B11F60C1F47F75F3CE8CC4C6515CA0FE7EF388C79F6028B8BC39DF7D685C851C6F80FC7F1DB
+5E62
+1E8271E0
+53B89C80161C3FA1A58E7D327F
+0F4C117FA8E34D75C6D74FF47F977725908FCF5A54A6CC3422B4AA6F2904219FB1E6E8DAB7F9C30857D0419A28833F1CB96EA43833FBF5CC1A97FDD1D1D660
+34751F7D
+A737C4738CE2E81301BA428CD872
+25C7FF2843D6D7D0BAE99CC80BB863680AD268E46017E1AEE468BA7D1C50A948BF56C1C097DE933B5A5F1FD20E172817E7FE584AA573F6B8544666C2DED9951041432B1F31ED15897C5766519FE2501DCC981D494E9714BFA002CAFAC40ED5C4E71A7C96FF26DB5B49
+7ABEA640
+66327AA26A3022765C63CF391A
+DA2DF440D8E20B980DC77E58144BF2AD7A54930AF9B3
+14EADA12
+4E3C09B357CF517FE4BBFCEBC579
+9B4807511B565FA5
+685D0CDB
+11D92138F4D648115128F1A59460A109E4376FF07C47D4C63095241C36CDCBDD58B7
+B9CBF2CC2260891638EF1BBF5B0DA6CCB4EE6F280CD206EAB5F8C2FB77DAAEF1DEFC6E740686
+36AB10F34CEBE87D2A6989C92221BD21A583C4D975F9345E64C23A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0045 put
+dup 3 /C0047 put
+dup 4 /C0058 put
+dup 5 /C0067 put
+dup 6 /C0068 put
+dup 7 /C0069 put
+dup 8 /C0072 put
+dup 9 /C0073 put
+dup 10 /C0076 put
+dup 11 /C0078 put
+dup 12 /C0079 put
+dup 13 /C0080 put
+dup 14 /C0083 put
+dup 15 /C0084 put
+dup 16 /C0097 put
+dup 17 /C0099 put
+dup 18 /C0100 put
+dup 19 /C0101 put
+dup 20 /C0102 put
+dup 21 /C0103 put
+dup 22 /C0104 put
+dup 23 /C0105 put
+dup 24 /C0108 put
+dup 25 /C0109 put
+dup 26 /C0110 put
+dup 27 /C0111 put
+dup 28 /C0112 put
+dup 29 /C0114 put
+dup 30 /C0115 put
+dup 31 /C0116 put
+dup 32 /C0119 put
+dup 33 /C0121 put
+readonly def
+/FontBBox [-18 -209 798 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842749BBE43AC12A7C13B47C299D89481C69DB
+94D526DD7141BCD67A20FF9A
+D7A658A8B872307EEA
+65FEDB9B
+E62B4ACAD05AF1A4D9DA1A5752
+B5222EDD6C9C89087396D6BB9E2F892B535D7CE1910669
+30693027
+E93C93721C30E33C31AAA97953
+60C83D530FDF663AF95CAC2777ADAAB0630CE180C3B153582C8D
+09DF6028
+BC94590CF7C8E2DC18AD1D5E5C
+5F47775AD47715893E2CB8B6528E6C7072CF7CB823526439F05CCABE5E595EA898BB27AF86E8C34611E1E2AF6F870B884072FA00A557
+6AF69B7D
+71C4B06A893A3FD0DDB5A1C147BB
+46821BA69020A7C9BF3AF5C5BCB320F23D71716018853214B15BBAA5B5953130224C5E09FD02D73291D61F78C1EFA300A6287F17119C47FBA8D746308A41C231A94DF82A9FB6EAC1796770BF2C6B01ABE66997EB55498E5DAF12571869F85AF7D9612369B14AE241
+9A6DF028
+E8DC87B8A072A3323F518F52A2
+3D605155D2D642E1BFC60DB45D659F36D75ADD604BD4F609B8B2AFD3DE09139C82F6DEDA7A117D1C503C83972BA8BE62606D46C8CE6D566C37B940A098D1B0EC9FFBA417F88F4D861D8DADF069D8D1CF63444F270F0D74
+75656166
+2DB1BBC3D459B6924C0BDF67D836
+92F9E18E9A1714B1F7BDE560937FFC025C9FB93D4FC7F476E06C23E30C50DE0D88CA846D4EC32F8DB5541DC222C90C70A6717CE936CB89B4FF046D3CA46BD6A7A0F91760132819F689822BC940C1677C48EE61DD064C1AE2EB1EE24D272C061A33FB77B638A4866B833CFFEA5C58
+E3A414EC
+4E4157570E4B3C3E574E2069E658
+09B7A1A5D63CD08D79862589FA067ADDFEFA8BF82E0AEB648371D63E60312A438D2E4EDD9167609182236958F8D7A8F6E1A3B3BE6AAF57A4C59EEDA475100792C5AACC6CC86C034D1DFCBC3CBB6454D2255F30C81F1F9491C18436D0D94AF009811E1B9A45972CCAE36E8926A579F097CC6B14380398FD
+9E2DD94E
+22D854C4D1456A6F891EA6472B
+994806D0BB906FF704B12DD1286821F7A9349943E789B407A19E8AEC04F56513A99DC4648B59877958DF421A275B7387893E8D5025798774119B6058CBB9
+4072E620
+D100CD47BCAE0C2EF50014FE1D
+C8921C0E0D9E61FFFCE44576B7D08D10EB914D0E4E8AED61F840692904454108B4D97A842929DFB3E0AF1BC6FDD7A34E347A5C494D608EA9EE2E00D1702621DE6AD95A543BC1CAF35C
+85355020
+54A90F0B73F9CDAFB7D5F265BE
+BDCA4C5872D39BA70029C02295BE1CDA9ED3982EB7D4825673264F5ABBAA23D2BDDDCA72B9FE231BCECFF1E3831A39432BD9C36F91C8F51DC8D464EB59F94B3CD0DCB58AB4FB52D72E8D4DC64A2215B4C773E1A297AF849F4CF478FB27AE67
+B9AAECFF
+CC7B08726D843DA5D99B501F212C
+04DDCF143D270973146B56D5E13F61570D5F75CCBD21F1506CDCF95FEFCA2099E3BBF80182A2C9BED3D31EF20228ACA7CFB5E360A21B7F311436A03368C0CD699A94C7F005423C7D7A9383F05E690034650EF6A427ED19C5B13338159C4B6AC96BD99BD252853F65A3
+1345A4C7
+9B97659E92DFD83F038CB209749C
+D859634631B04AC06D2188C04FA119D81B8CF072E17D0A9D3E2C82E2B15CE60539BB1B5FB5E8E17D32B20F9D94D820BC4CC9CCF854A7DF4A88487A5578407FE9006E2D3B2480C1203DA3B85C974E559B909E7F387615B841B96AEA9DE25D15B9F2B2A2CE
+794DF014
+5D6C34F37CBA71F1BB7080A903CC
+41926860E0AC72BC8FC92C37FD8EDC147F7385030F0D599FEE5D0491BA88C7A1CCEBC9A08C278890CE319AF97ECAB43132C1517D87168C94B5D0DC510AD3A8D96C7269D697476E6796E8EDA5027A05E52E7FAD640A11378D277F1FFEE2374A9D2937CF98D5A69EEAA6E8CA4B348146FC5BCFE3BA54019F7923B231A82E76
+CE13
+26C405AB
+68AA819E24F64BB64BC9937EA9
+FFAF8C07EA1B9FF98C7E421CAECF9D83291995153E0362F45D62E8656DBD8B38773F9554C7C5B0950532C426732F9CCFF01E5AE2F6E8A6F3AA42EADB2F9A8D52D1F204DB3F4A1156B6
+26D9F1B3
+DBAA081CE4016244916D90F5C92C
+686F122DFB3346D38C3FDE677AB18D94CFDBB50DF9AD63FB23D789DB64364E4A40ED35BD0E619B221B7956897ED8664086D772B774BEB4C62BAEEB8DC8B26D53CAB7B1F1A53493281C3A04594FBC10C90224573F1C68B87B3723452FD1FCE08B64D941125CE71C19694EEA7602E6122CB11F3A747BD4AE995A59D33742C8
+49B3
+3B981D77
+AE742D25
+4BA6CBFE5830495D468650AD20
+A77AB23CDCFD92DBEAA1DE697BF68EDE290186A8B44F1276F80A7D630E847438A4A8D1A3DE469CEB9CDF56AE59732EC7585B27FC47E694BE3489985E42CD16BA55A1816B90FFB24262DD68E3F4EB923EA903
+961F461E
+821FBE53D272B6DDFE3D0FD44C35
+250329D519791A774D60EB5BA31CDD79B14489349E4AD4CB38095B1386027EA7004CD49AA124F4F164EFE30A49BFDCDACBD7BBF7FDE0FB62EA8C5F050FD9621876FF3ACF3FDA47FD05541724D3BE9328123DEC8C58078D78AF53E48A3191671F514E53588B11A54C5CD435D9
+765DE1FE
+E54B81547C5B808988C5EC8F1C
+085D2EB9F9840FACA5340FC25B088364F7278DE1D49BF9DBCF72FD084C365DCF2B8366C3351DCBED0807D8B92DDF736B9E7C4747E1C51F45B0548A5AFE62A80E900CAC36F551D62D1FDE5109FDAEA157EEA00BE91F405CE0D8B9DB0F
+00596981
+C4B99BD2C6C53D68CD4D90B606
+8A5235A9EEC601B95C7FF582E68A82FD0A17F71171E9C71632F56CEFC802A828D58C7286F39E5C358950479E2153C287E170614604A26B9FD070332A6EDA80B5C3A2113FAE7ACD7F3B3391FB1F56851232ACE33B9E686E945DFEB7BF26
+BA75740F
+150AD672D0677B9F42B0F0D6DDDE
+2D630E6080E72D3DFB79AF9950DADB155187606F329659475ED5A5C5EB5FF42BAE524D77CDE488E477DE413D7D5E013F8D0307383EBA0D3E30F917336BB8FF72985C9F514671BA0BAC49BD0858DEBE7BF7561DF45D9703EC85319354E0D626A3583215C376ADD3A2A65EDB81DC4B4FBE1F7F90537257D6B613741F5D941E
+AA37
+482D7DB95D24E0B9AE907B7C103180E4A7E9303B6B15651E739EAC23F26C6CCCAEFDC51C45
+541885B7
+749A2B1E99598B1A5F7518DB062B
+540FD96A5E11D71A20669ED66980200CCE22F775D80530AEF23479935E4E0130E453D3E91C9CE4A1E71C93641D578A1565CAEEE8DD8608A34E4A1A0D6FE5BE3FA2047F8BE272722B84C21126A3C4CFE033ED01E655B080163A6F9865355CBA2AFCADE55735B2FD45
+462A4D76
+C4DDAEDE4F6C3176AD7DCCF0DE
+54B996C78537A3210E114E0AE7A3586FD21C5374C2B63C7F379A1F8F9C0F4AD4BC40D45F094BEA738E0454013FF874B5408C3FBD96FC801A5A2427C4EDA297B3E0FCFDA1FC8F4583B132C6805F9A
+A2D76D11
+2FA22FA99372FFAE1401D73911
+27468DD26490EC2462570D23F56D6B452B60BAECC6F7DEA2A9E1BB4B1AD7CE6210D5DC26A62D7E85C7A8663284CD8F023F16DAA2
+56B5D6C5
+C7D9021508D3DF5CB92D9414A86A
+C30CD7913589706C7DEF8DB4C53AD2FA195877F5FF996492375ACC9C094831147F0623200C20B5FFAFDF2A488B140265B1E1DBD9E5BDD4725A4BEA79F8EE88F92EC5843B67B8E67C1464DE81AE37270AEE018074DA5EBA4538ED82B7E422883611E20F439B817FE11BD5011874A50DEDB59C90C230C920A1CB2F26065809
+4A4A
+9908F6BA407ABBCC97EA744061E6FB1C7471604E23EEF3CAC4EE1EA9
+9C4AF3B4
+BF7940DA80A18C79A7FC1E1EA8D9
+3C4F30EAA4F51201C9E631E704FA9B3AD1C3A14C4B7E3CC5BA62BA90A4745C4EB37248A89090395CAD38A359B16777CEDCA43C8FECDA7AEE7D0A7312A2CDA863A1682AE97EF59EE0D40427175BFE43C66B564ED6251F73A69F3380B2610577F9746BAE8323C100
+01227538
+F03940947E6BEB7CDE4CAC9D33
+FC49E85E6B56A3293C2CBB48E739CC87675EE28B444030AB08D163FBE210A0B5B7256CE498E53DBD456ED0DBFE6F2FFA8E3E6461D52781CCB8A5FBA2036A07FE707FF49EB39E
+82B29139
+A7497352794C3581445D50B31650
+CB2FE423DAC31C43C20E82D2E08983B986C53514E3092C56EAFC79F67208B5F0515FEB77F6CC0D37E888C0E3ED677D913756EB6AE0A10DA700B7730D2A75C156EBB3146F998A97E485FEA04851EB8C6E50F1B56ADFDB8FE8CC022A9BA8792BE6F5218DDCB7905D055A6A1869A37D904EC0
+92E12B20
+C09010BB88D2A7CAB05928AE68
+403AC7D2BA788FD5B54F6F76C6DE3E1EF4AFD797B3DF87BD5D42C4BD815C8421631EE3329F5A6B7D66130DD2503C40804FA28211EB5CF44937BEA27DBBF63906B3352EA1C0F2B61FF19321D0E08997546922E1D1E48A380579
+1B88B5B1
+8125327DF8E52FB306DE907A1786
+8AACF322579C824A696C7E848DFEEC9A8B0F3D7C6688FA2E3F7C149263AE50F5A07BD8941F9E777AD2C1D28703B190B9B2D46011792E49870B788E1AA53A6092E24BA1347C140A2D295ACFA2E96AFA41B97AC999A1098D99423B1324964BC6FE6874AE2C00B5272BDDEED932AD010018B700ECE63CC863CDDB
+8FAD59D0
+AA88E9AB409F42D04D50DD4313
+E4E95EF7A0F5C8759E81D5BCC2D564C384F3C8F5D229F1BC8574AE800BEB05806E2B49D74DC73FCC5502744D5147E66340C896F49E0FD996BB579C7D7140F02525652EE9
+FC21690B
+AFF506D43156BE467FDB5A595F0D
+4A93B656C4B6B745FF66BA3A797DDFEAC142FAB98CBC9E54EBC1354819A5E354CB5B7790F512A1A6A15C407AAA07703CBD8BD4436D194F2E648E2738F3B26BBC7497DBEB142ED642927E9B1CED9B3A7EC41CF8F9A36666537D6DB92C67740E58A03EF5617EFC2E8BF63B16488F564BF7429933AEF4407284EC416EC250BB
+3F8A
+5B023EDA2ACD4011C9F591
+071D8F64
+A34C4B90C005CC74F48A02238917
+E270FF6B18821EF9E6F1D577E99810F657CD4AE1BED49A690A490A37E15B452E2E6821BC033DD702E02A5679CB313D4EBBDC9D9BD24E625493C633F886D5E07EAF01056A9E812B6F4D2FED47B4A27434975BEB655B3D76F9E2972A815C06214F1B2335ACC3E4FF7197062E0CC12043D59F37BB5FBD21874C4820570B7180
+8D5E
+4A
+F4E79A0A
+60B0196D4E25CD7D1DC33D1DD83D
+CED5B0D12E97E390
+56CD0E8D
+AAABA52A67F80E83764F67AA3E6425E3455A21246EDE5E71483A222EA665D5225B9C
+FF28B33E7155B0B4F709F6E985660B3DF0389B26F69B6D456EF3A80DA8EAAF6064DB67AC2D25
+D715E8BBF241D26DAB769C82AA670C843176204AE42E9CD3150C0B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchi
+%!FontType1-1.0: PSOwstdutchi
+10 dict begin
+/FontName /PSOwstdutchi def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0097 put
+dup 2 /C0099 put
+dup 3 /C0100 put
+dup 4 /C0101 put
+dup 5 /C0104 put
+dup 6 /C0105 put
+dup 7 /C0108 put
+dup 8 /C0109 put
+dup 9 /C0111 put
+dup 10 /C0112 put
+dup 11 /C0114 put
+dup 12 /C0115 put
+dup 13 /C0116 put
+dup 14 /C0117 put
+dup 15 /C0118 put
+dup 16 /C0122 put
+readonly def
+/FontBBox [-144 -227 757 728] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268425D7C73E0D9FBC2C51FC5D7A4C8466A0ACF3
+EF6A51E85881893F5F8BC8430208
+87F3103F7721E137FA1F5E0AA668B92FD52279E66C1F88E225F1D00525B03625600EEE9AA0F3BC774875C78C8DA3485F17675C49575996A73AFCDFC5C043FF15240F2766D360B295D9F35757882F20231CD23D4B1D44649FAC2F946C5244A22F62F98DC8900497DB880EE30BEC4BE3011C108BB1603FC9E45087B4C3F7B4
+380E
+DB7BEDDFD810BFE55A51FA92E7
+C5E02760
+2FEA6E1C7BC816B379B9BB690B
+3F1F8D5D13B2FA0CA13B32E231AD6701F85E724E73EE5CAB752A1F01924E57EC33256147A9D15C2BED13E5B9868E463D0CF97CF79520D198EF7E9A4E8433615D43ADB42E79570068860AF8163DFA32E1F1AA9D84A0589C316A75510753214517
+65B024EA
+2CAE33DEAFE2FCFEC055BCC6E807
+8A53B445D923820C0B3C3B775BFA1858B494A3E1ED579B4B7021B2747CA7DB9BA810D03C123860AF732D6CEC7A174E5ADB2DF2C48459B7DA91099B9EA4DFD27060070047B8FED57852BA56F0C75B09D95315841A1D637002612F731AF8EE4047DED5D8E53BA552BEEF5D79070B6CAC2B68F8C835BBE415D9474FE29393F9
+AFB7
+3168F8BACEE4F753E5374F9DD54F816F2FB16569CBDFFE6BEF28AFFBA96E6D1D41790B9AD5A71AC47EBBF08AFD654A41
+BBB9B934
+32CD3EA43C3D75650A026F94EE07
+8C9CD2519EF572156B2F34DEB76DC76BA9B2709A6DD78C558978CDC791BF43681BB7AE9328BAA7B284BEE5A7454C72A5CF2C9BDE94805A59FF843BE51CCDBFE69C9361EC6C491C18FA2616C75B772E614F13C38B3A7CAE3986D2B142CDDD1DA052556B0B80
+CD009F6A
+B2638750700D66D0AA5810213141
+AC008781F399DF1A8043DBAEBAFC2B4AB596DA1071F3D505655C8C9E80FD9A1E0FB5F70DB8A227FC5D87E25B5985462D2E4DD446F8872432FA4BF7889A6B81AAC9CB8B818141C4D237D7DB1FC5D51A559CD13C935BF1AE639E261B83427841B5641084F6F43D44CB7DD60A0FF47E94CA86D71FC6EEF3AC18930CE91B00C9
+BD70
+67198EF0F55953DD826A0C981C7193E5CB53591FD92D5E3EE4FA3E
+90B8AFD3
+BD7D1A65145E62B247484DBEFD7F
+9A354A8CB2B1916981F3B04C446E91F9D7890C99E768D9FC4EA626D698A0A3099937CE0E16D26D38BFC8AF24914C1CAE2967D79EFDE69EF86E23739B46BE7C837D9D30688FD3748649FBF68082FA4D71603F483B057FA6DE45EF31154B6259F3B633EFB3D6A3573B473EBA1F01DF2CEDB0267012DC453BA300
+C113799C
+D73D058FD325CCDFF91C7ECFC0ED
+F5C1A835FADD3A33F90C6D40BE35C4C44C1E74A06BA5C213AC3C32207333F41924B722B467C4A262257C21398E3C5E1ECA06D9A0009E669507070150690D999B4B9DED64DEA22AA62FCCB06D0CFFF30CD6A3F21685F8AF43382540C00024B76FB86C21BD8F
+14B44FEE
+D45309CB76638A360CC3C52C3768
+33CC9C07A2C94C292258711A2E2684BD770223EE87E8E51500E66C413C885DD8F7B591D616E035D0A4D2422B02A87ACA35910E20483353B8AED8FD027ED84DADC927F04AC5FE290B2411BABE9819A1B5455C4675C02D586FBC946DC0D8C0D4565D47A4BA1E01767AC01BC99D380E26EAEF2811140DA4BCB2B6CDC145E023
+5577
+40C8C53F6C1D23B66FB4C547785165511FE75EFF5DF08E3A890D269542C74E76DCDB27338F578F7749E1BC5649B49C35D6EB07D8B2206582EF4DA5C871AFF0DC73D364F571B9C1A55CAD69
+A3C897FF
+6AF3F0EFA51F761CEB5A096396
+CA62ADD641BBEB7F15BF71EE60A0769746359E6ED502D86221686F5387FAD1C99FC79EC3B67D26DE4791AB7C2E3A878F100DEDC77079DE9354CAEE593159DC4804840B346C0B63AF3042A8F55ED2CDD681AE02A5645E4271908645E64434C8
+6EC1FA94
+81224B594D324EEC22B18CF2FFEC
+C694D26DA4B01EAC17E81BD0A1201B0733F1A238069CE685B61AB7C0372DF527FE13E9C4F02FA4A2A7BE9F63068EBB5852C9FB7C0B0DC480699AE2B9577DC4353799D0287CD9A5E6A09A0A725F591EB131ACD72F98D79199B7B3B42CFA5E54F1E7DB1F92EA4D6055FCF627C4E2CE90046A8E4C38E997457959AF4C53165E
+AA0C
+1EEFE42B3AF218C199BF1B97FF9F9B6EB63253BC3554E8CA2B39F2CDD331E73CD77F84039348851032E7
+26E8CCA2
+F9D4AB9099648F165944AD02EE
+83A494FAD10601FCF54C0665F0B4787B56E8F0AD22D814EBB6554B622A30AC57E466AB4681F5678DC5E63C7C447C0ECD2B7078507E91BCF725CEF508D6C40E89FD8A2669DDAFC1EFD2A0D52434A82440516C391B57AB169A0D3527
+274A5949
+BECC37B7C4A95529BB33F2C0EA8E
+279DC6700EDE0CE850A9177C6E851D01D67B1FAA0EE446FE947B16A24B99C1C2E8D8141337D7056995F4BA9D1246551587AAEF5E8FEA8C8127BBDDA6294ABA6B37B4DB63D93BEDAA30FC12BD50129A0A83BF32440C7F4816C47972ADA35D3DCAC651190BA1931004E7771C93F43764148B1D6BA2FDA7
+8365AAC2
+164D07464A95C1C11288EC1863
+53B9C4B298E49C0950C8F52058CAEF1A34199F853B79DE7E0710E4B12497BF156F813B0521E72F699358CFBD14A9D56C8DC8CF5F56D6DA181E1FE4D6496D24297BEBA81CDF42F498C0228919A0DBC51C868639925F9E16
+013CD527
+52A6337053FC8E0C4D5869B29620
+BEBF01FDE1279BBAFBB9C95FF68EA78975E9CFCC5B55F1ABA4222C5F9F36DC17938A29C73B252193AF33E547898A38A6AD3BA1A61A56D7D853FE2DF429F84C3C67F96ABF21C9E897860BE9F978622A51B39B0B107EBBA0326E008170847B38B385B268AF5D03A11D589D4922948261BA452EC10963E2D51821EBA7D02BFA
+EF36
+2D3AA90B6951C967A9C9887E747B2531CFAB39692475A4
+E0E0F454
+CC4B89ED9F742F955470A0DB6B
+C7D12AE114BBE7B26E1A897C731703C2E46EF5BD927835056BAE681AEEDF072723394C9A1AC2F9CCDDA88B272880F39F9C7A940970AB9F77C713C4000BCF101E5AF761BFB9775DD76A4AC0E96712C684B25F90A64F68F8C92EF0
+67ED835E
+3E4E375067FCA6B11A129AB7631B
+321258285A91BA87CCB93A9829342162FCC2285E018016AD1A28294BFA357E8F71874312FD97EA3A42D1314BC9233A28F681BCE856D7B7749A11EEEF73B6FEF343AD2894E7E5050C32CF8DAF35DE551706C4E06564A939C3E67CE3B16E9B3B21A2290FE047B156F96428C8205B42A95C5F83B862637443F3E50B6BC49ACC
+F0A1
+42E8E1B688AD6CBC4F
+BA5D4B3E
+C7943FA2DDB74F93D3DDF6B53340
+8F3D7332672DE15B
+E7E183BB
+D8F2F7B41E4363FF42244CE829AA73CC4A79D33F2B9F0839F89E36E300DB4857F052
+1F35DD3F5FA2BD1EC4A1C8F4951F797EF2C0B2C82418278D87FBBF498D2D2FABF87CA6FDAC99
+58624E435E800292174BD0EA60CDB71B326C73EF7AAE32FDF27D51
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch12i 12.00 /PSOwstdutchi newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<1d2e3c382e3a2f10011201132e362c31352a3a33012f373a011c2e2a3b3d3a323630011d2e3c3f373a33011f> 2207 558 0 7384 -1 s
+<2e3a2f373a352a362c2e> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0c0c> 9346 13385 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13267 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13267 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13267 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13267 3 7133 32 s
+wst:dutch12 SF
+<0826> 1589 1431 0 1929 -1 s
+wst:dutch12i SF
+<03040f0c0a0402> 2033 1431 0 2700 -1 s
+wst:dutch12 SF
+<3b2e3c> 3177 1431 0 3432 -1 s
+<003c312e0034372c2a340a3a2e35373c2e0026221a002d2e3e322c2e002f32342e00362a352e002f3a37350000> 3432 1431 9 7525 0 s
+wst:dutch12i SF
+<03040f0c0a0402> 7525 1431 0 8192 -1 s
+wst:dutch12 SF
+<09> 8192 1431 0 8245 -1 s
+wst:dutch12b SF
+<0b0c0f07> 1271 1778 0 1866 -1 s
+wst:dutch12 SF
+<100023151f00323b002a36003d363a2e34322a2b342e00383a373c372c373409001a3c00323b00323538373a3c2a363c003c312a3c0041373d002e402a3532362e003c312e003a2e3b3d343c3b002c2a3a2e2f3d343441> 1866 1778 14 9531 0 s
+<2a3b> 1271 2023 0 1457 -1 s
+<003c312e003a2e38373a3c2e2d003b2e362d003a2a3c2e002c2a36002b2e00353d2c3100313230312e3a003c312a36003c312e002a2c3c3d2a34003a2e2c2e323e2e003a2a3c2e0900183a2e2a3c002c2a3a2e003b31373d342d> 1457 2023 16 9531 0 s
+<2b2e> 1271 2268 0 1489 -1 s
+<003c2a332e36003f312e36003a2e38373a3c3236300026221a2823151f2821222016121c003c2e3b3c003a2e3b3d343c3b003c3700352a332e003b3d3a2e003c312e41002a3a2e0036373c> 1489 2268 12 8727 0 s
+<0035323b342e2a2d> 8727 2268 1 9461 0 s
+<44> 9461 2268 0 9531 -1 s
+<32363009> 1271 2513 0 1601 -1 s
+<0017> 1601 2513 1 1826 0 s
+<373a> 1818 2513 0 2015 -1 s
+<002e402a3538342e070037362e003b31373d342d00> 2015 2513 4 4139 0 s
+wst:dutch12b SF
+<10182010211e> 4139 2513 0 4743 -1 s
+wst:dutch12 SF
+<003a2e38373a3c002b373c31003b2e362d002a362d003a2e2c2e323e2e003a2a3c2e3b00> 4743 2513 7 8218 0 s
+wst:dutch12b SF
+<1f1b15131f16131d> 8218 2513 0 8972 -1 s
+wst:dutch12 SF
+<002f373a002a> 8972 2513 2 9531 0 s
+<26221a2823151f2821222016121c> 1271 2757 0 3269 -1 s
+<003c2e3b3c09001a2f0041373d002a3a2e003037323630> 3269 2757 5 5161 0 s
+<003c37003a2e38373a3c002a003b323630342e00363d352b2e3a070041373d003b31373d342d003a2e38373a3c003c312e> 5161 2757 9 9531 0 s
+<3a2e2c2e323e2e> 1271 3002 0 1914 -1 s
+<003a2a3c2e09> 1914 3002 1 2380 0 s
+wst:dutch12b SF
+<0b0c0f07> 1271 3349 0 1866 -1 s
+<04> 1870 3349 0 1928 -1 s
+<00> 1928 3349 1 1996 0 s
+wst:dutch12 SF
+<001a2f0041373d003f373d342d003432332e> 1996 3349 4 3626 0 s
+<003c370043382a2c2e02003c312e003b2e362d003a2a3c2e00372f003c312e0026221a2823151f2821222016121c003c2e3b3c07002a2d2d002a> 3626 3349 11 9531 0 s
+<08151a1d221620> 1271 3594 0 2313 -1 s
+<24> 2290 3594 0 2452 -1 s
+<121b21> 2429 3594 0 2844 -1 s
+<003c37003c312e00352a332e2f32342e07002d37002a0043352a332e002c342e2a3602002a362d003a2e082c37353832342e090027> 2844 3594 10 7808 0 s
+<373d002c2a36003c312e36003d3b2e003c312e> 7782 3594 4 9531 0 s
+<082b> 1271 3839 0 1561 -1 s
+<002a362d00083f00003034372b2a340037383c3237363b003c37003b2e3c003c312e002b3d3a3b3c003b32422e00053b2e362d3b06002a362d003f2a323c003c32352e000535323434323b2e2c37362d3b06003a2e3b382e2c3c323e2e> 1561 3839 16 9461 0 s
+<44> 9461 3839 0 9531 -1 s
+<344109> 1271 4084 0 1477 -1 s
+wst:dutch12b SF
+<060a0d09> 1271 4570 0 1776 -1 s
+<00051b1a1a13111f171b1a000c1d17131a1f1312000e1f1d131019000d> 1776 4570 4 4647 0 s
+<131d141b1d19101a1113> 4639 4570 0 5681 -1 s
+<0b0c0f07> 1271 4993 0 1866 -1 s
+<04> 1870 4993 0 1928 -1 s
+<00> 1928 4993 1 1959 0 s
+wst:dutch12 SF
+<00151b1f1a003c2e3b3c3b002a3a2e0036373c002c37353832342e2d083236002b41002d2e2f2a3d343c003f323c3100362e3c382e3a2f09001a2f0041373d003f323b31003c3700352e2a3b3d3a2e00382e3a2f373a> 1959 4993 15 9461 0 s
+<44> 9461 4993 0 9531 -1 s
+<352a362c2e> 1271 5238 0 1864 -1 s
+<00373e2e3a00151b1f1a070041373d003f32343400362e2e2d003c37002a2d2d002a000815151e28151b1f1a003c37003c312e00352a332e2f32342e002a362d00382e3a312a383b002a2d2d003c37> 1864 5238 16 9531 0 s
+<3c312e0029291b1a13211102002a362d003a2e082c37353832342e00362e3c382e3a2f002a362d00362e3c3b2e3a3e2e3a09> 1271 5482 6 6050 0 s
+<12> 1271 5829 0 1434 -1 s
+<00151b1f1a00143736362e2c3c323736001e3a322e363c2e2d00213c3a2e2a35003c2e3b3c0005151b141e2821222016121c0600343737333b003e2e3a41003b323532342a3a003c37002a0022141f> 1434 5829 12 9531 0 s
+<213c3a2e2a35> 1271 6074 0 1921 -1 s
+<003c2e3b3c0008003c312e41002b373c31003d3b2e003a2e34322a2b342e07> 1921 6074 6 4643 0 s
+<002c3736362e2c3c32373600373a322e363c2e2d00383a373c372c37343b090022312e00151b1f1a003c2e3b3c002d322f2f2e3a3b> 4643 6074 7 9531 0 s
+<2f3a3735> 1271 6319 0 1712 -1 s
+<003c312e0022141f003c2e3b3c003236003c312a3c003c312e00352e3b3b2a302e003b32422e00353d3b3c002a343f2a413b002b2e00342e3b3b003c312a3600373a002e393d2a34003c37003c312e0034372c2a340032363c2e3a> 1712 6319 19 9461 0 s
+<44> 9461 6319 0 9531 -1 s
+<2f2a2c2e043b> 1271 6564 0 1778 -1 s
+<001c2223000800151b1f1a002d372e3b0036373c00383a373e322d2e0022141f083b3c41342e003b2e30352e363c2a3c323736002a362d003a2e2a3b3b2e352b344109> 1778 6564 10 8529 0 s
+<22312e003b323538342e3b3c00151b1f1a00143736362e2c3c323736001e3a322e363c2e2d00213c3a2e2a35003c2e3b3c003f373d342d0034373733003b37352e3c31323630003432332e003c31323b10> 1271 6910 11 8923 0 s
+<03> 1398 7257 0 1504 -1 s
+wst:dutch12b SF
+<00031b1c1f031a131f1c131d14031a131f1c131d1400020800> 1504 7257 3 3785 0 s
+wst:dutch12i SF
+<0b0408090d0405090c0d> 3785 7257 0 4744 -1 s
+wst:dutch12b SF
+<00021f00> 4744 7257 2 5099 0 s
+wst:dutch12 SF
+<151b141e2821222016121c00080800> 5099 7257 2 7224 0 s
+wst:dutch12b SF
+<021900> 7224 7257 1 7629 0 s
+wst:dutch12 SF
+<0c0b0d0e> 7629 7257 0 8053 -1 s
+wst:dutch12 SF
+<192e3a2e002a3a2e003b37352e00372f003c312e00151b1f1a083b382e2c322f322c002c3735352a362d003432362e0037383c3237363b10> 1271 7603 8 6731 0 s
+<0815> 1589 7950 0 1937 -1 s
+wst:dutch12i SF
+<03040f0c0a0402> 2033 7950 0 2700 -1 s
+wst:dutch12 SF
+<3b382e2c322f41> 3177 7950 0 3795 -1 s
+<003c312e0034372c2a34002a362d0a373a003a2e35373c2e00151b1f1a002d2e3e322c2e002f32342e00362a352e053b0600052f3d34344108> 3795 7950 9 8895 0 s
+<393d2a34322f322e2d0609> 3177 8195 0 4112 -1 s
+<002141363c2a4000323b003c312e003b2a352e002a3b003c312a3c00372f002a00> 4112 8195 9 6914 0 s
+wst:dutch12i SF
+<0c0610040c0a0402> 6914 8195 0 7593 -1 s
+wst:dutch12 SF
+<09> 7593 8195 0 7646 -1 s
+<0835> 1589 8541 0 1940 -1 s
+wst:dutch12i SF
+<0f01070e04> 2033 8541 0 2495 -1 s
+wst:dutch12 SF
+<3b382e2c322f41> 3177 8541 0 3795 -1 s
+<003c312e003b2e362d003b32422e07003236002b413c2e3b07002f373a003c312e0034372c2a34003b413b3c2e3509002231323b00353d3b3c002b2e> 3795 8541 12 8895 0 s
+<342e3b3b> 3177 8786 0 3502 -1 s
+<003c312a3600373a002e393d2a34003c37003c312e0034323633001c222309> 3502 8786 7 6359 0 s
+<081c> 1589 9133 0 1967 -1 s
+wst:dutch12i SF
+<0f01070e04> 2033 9133 0 2495 -1 s
+wst:dutch12 SF
+<3f31322c31> 3177 9133 0 3703 -1 s
+<002b2e312a3e2e3b003432332e00083507003b2e3c3c323630003c312e003a2e2c2e323e2e003b32422e002f373a003c312e> 3703 9133 9 8180 0 s
+<003a2e35373c2e> 8180 9133 1 8895 0 s
+<3b413b3c2e3509> 3177 9378 0 3835 -1 s
+<0838> 1589 9724 0 1882 -1 s
+wst:dutch12i SF
+<0a0a010c0a0402> 2033 9724 0 2725 -1 s
+wst:dutch12 SF
+<3b2e3c> 3177 9724 0 3432 -1 s
+<003c312e0034372c2a34> 3432 9724 2 4266 0 s
+<002a362d0a373a003a2e35373c2e00151b1f1a001f1f> 4266 9724 4 6506 0 s
+<12053b0609002141363c2a4000323b003c312e003b2a352e002a3b> 6479 9724 5 8895 0 s
+<3c312a3c> 3177 9969 0 3536 -1 s
+<00372f002a00> 3536 9969 3 3986 0 s
+wst:dutch12i SF
+<0c0610040c0a0402> 3986 9969 0 4665 -1 s
+wst:dutch12 SF
+<09> 4665 9969 0 4718 -1 s
+<083a> 1589 10315 0 1847 -1 s
+wst:dutch12i SF
+<0f01070e04> 2033 10315 0 2495 -1 s
+wst:dutch12 SF
+<3b382e2c322f41003c312e003a2e393d2e3b3c003b32422e07003236002b413c2e3b07002f373a003c312e003c2e3b3c09> 3177 10315 8 7194 0 s
+<0820> 1589 10662 0 1929 -1 s
+wst:dutch12i SF
+<0f01070e04> 2033 10662 0 2495 -1 s
+wst:dutch12 SF
+<3b382e2c322f41003c312e003a2e3b3837363b2e003b32422e07003236002b413c2e3b07002f373a003c312e003c2e3b3c09> 3177 10662 8 7323 0 s
+<083b> 1589 11009 0 1847 -1 s
+wst:dutch12i SF
+<0f01070e04> 2033 11009 0 2495 -1 s
+wst:dutch12 SF
+<3b382e2c322f41> 3177 11009 0 3795 -1 s
+<003c312e000f0b0d090d0021> 3795 11009 3 4852 0 s
+<121f002f373a003c312e003c2e3b3c09002231323b003b31373d342d0036373c002c37362f34322c3c003f323c31> 4846 11009 8 8895 0 s
+<2a3641> 3177 11253 0 3493 -1 s
+<002a3b3b3230362e2d0021> 3493 11253 2 4480 0 s
+<121f> 4474 11253 0 4765 -1 s
+<043b09> 4769 11253 0 4956 -1 s
+<083f> 1589 11600 0 1909 -1 s
+wst:dutch12i SF
+<0c0610040c0a0402> 2033 11600 0 2712 -1 s
+wst:dutch12 SF
+<3b382e2c322f41> 3177 11600 0 3795 -1 s
+<003c312e0034372c2a34003b2e362d0a3a2e2c3e003f32362d373f003b32422e3b003236002f3a2a352e3b00053f312e3a2e002a3e2a3234> 3795 11600 9 8825 0 s
+<44> 8825 11600 0 8895 -1 s
+<2a2b342e0609> 3177 11845 0 3692 -1 s
+<0825> 1589 12191 0 1975 -1 s
+wst:dutch12i SF
+<0c0610040c0a0402> 2033 12191 0 2712 -1 s
+wst:dutch12 SF
+<3b382e2c322f41> 3177 12191 0 3795 -1 s
+<003c312e003a2e35373c2e003b2e362d0a3a2e2c3e003f32362d373f003b32422e3b003236002f3a2a352e3b00053f312e3a2e> 3795 12191 8 8372 0 s
+<002a3e2a3234> 8372 12191 1 8825 0 s
+<44> 8825 12191 0 8895 -1 s
+<2a2b342e0609> 3177 12436 0 3692 -1 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (12) 12
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0034 put
+dup 3 /C0036 put
+dup 4 /C0039 put
+dup 5 /C0040 put
+dup 6 /C0041 put
+dup 7 /C0044 put
+dup 8 /C0045 put
+dup 9 /C0046 put
+dup 10 /C0047 put
+dup 11 /C0048 put
+dup 12 /C0049 put
+dup 13 /C0050 put
+dup 14 /C0052 put
+dup 15 /C0056 put
+dup 16 /C0058 put
+dup 17 /C0061 put
+dup 18 /C0065 put
+dup 19 /C0066 put
+dup 20 /C0067 put
+dup 21 /C0068 put
+dup 22 /C0069 put
+dup 23 /C0072 put
+dup 24 /C0073 put
+dup 25 /C0076 put
+dup 26 /C0077 put
+dup 27 /C0078 put
+dup 28 /C0079 put
+dup 29 /C0080 put
+dup 30 /C0082 put
+dup 31 /C0083 put
+dup 32 /C0084 put
+dup 33 /C0085 put
+dup 34 /C0087 put
+dup 35 /C0088 put
+dup 36 /C0095 put
+dup 37 /C0096 put
+dup 38 /C0097 put
+dup 39 /C0098 put
+dup 40 /C0099 put
+dup 41 /C0100 put
+dup 42 /C0101 put
+dup 43 /C0102 put
+dup 44 /C0103 put
+dup 45 /C0104 put
+dup 46 /C0105 put
+dup 47 /C0107 put
+dup 48 /C0108 put
+dup 49 /C0109 put
+dup 50 /C0110 put
+dup 51 /C0111 put
+dup 52 /C0112 put
+dup 53 /C0113 put
+dup 54 /C0114 put
+dup 55 /C0115 put
+dup 56 /C0116 put
+dup 57 /C0117 put
+dup 58 /C0118 put
+dup 59 /C0119 put
+dup 60 /C0120 put
+dup 61 /C0121 put
+dup 62 /C0122 put
+dup 63 /C0262 put
+readonly def
+/FontBBox [-25 -256 978 766] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268422410489591588B6E7823D3D74C2EA32FE93
+9EB88AAB3B591575462F2E96
+55B8435E1419699E83
+41112633
+B0FA1A4EC92787CD7A26A873D7BD
+1ECF175AD4EA48B87AEC3ACC8B38E3B38F1DDFC5780D2B090942E997D679A13082F0CF57FA7735299F5C2F7C05FFA5BE30F9B2BE51D6A4A2DE8DA7F543ADEC29BF50B705243FAFB502A8CCB53B9974BF5B4AF682BB3EFE56A659A712EFE75706728F3042834B1A
+FBCB223E
+715E8F189A7657ED770C7D8FF96C
+E8A5C8F9496C39E3C7F84A92EA62138CA35B573C7A2FD44E7F86BF250CDBBA6E2C2C4478AD81025A82215C00245599827C4BCB7D5C13A5EEC0B35F967C8624B5BFC39670C29D9FC3160AFE5BA6EF03D105CFEA7F724C686CF2883ECDC74C32C79560A40E2D1FE81E19E8A16E940BED2C8B6802FD676B18128573AB953910
+E183
+13B614BA3B1CA7BE20B91905
+47D1F16C
+DE190A1F1C218E61F78BA251E0
+0806A73DB4603E907929BF548A288C4B0356E1FA0AD5B33C07287C7467A17B6608EB43A2EFB0C52D070B7756A84429AC4B2E5D361ACEA55C
+AA526226
+BCC0E30F05FFAB61766B375C6F
+AE55DC2F2D18B9D78A20A25021E0E9AE8D11A81E43D44F8E6877A14FB21BAA25F19ADD90B999657ED156EA25035B6C7FACF646B4A4A37FEA427EC0DB57B9D191
+27EF549E
+B6A436D0AC658423A2BB8B2A51
+EC3649375FE82663F00130987E14C0E992132BBFE2EF9554EDC3987F315996C501337783A3BF55BF9A38677C4488421B5AFE394CCFD29217152A8F6E2DE5AB
+FFC92697
+75E7A86EB04DF012E87B61DABB
+252EF91E58733052EC9BF021C8769B210130DCD54AE252A067DFF45004C1F1AB967CC8F1F38F213F786A7F6FF4635AE6A0E1A568FD434A8778
+62B2214F
+4576E1C12772565D8E18E0E8FF
+AC59C2A48E1236E81B839E99C32E5410CFEEB6FBFA7155
+9C7A722E
+72001066D53432D5596AAE6208
+F189D8CBCEC3C49FC7B38470064177D8D99F7B19D550CE83722C9564988EFA
+B793F0B3
+DA2BECFB637C5283E9AEA452AA
+B51A8187C501369F1B7830CD4B94565E10C970866EA82BC927066F18
+054896B9
+487B20B86C483658704534463F
+25D7CB284267DFC26DE0CD20A17874E787A8DA1BC87C74501C9E371232AF55534B415A762F0AAE79D77C6FA1AD368481A479C5B7101174B5178F26CF80C0144E0ECA51541E99B1491033
+46AB464C
+055025CAF0402F89C6D7063F30
+CAEE917FD452579219349097F706C637E61828D00DC275102CD703DFA4D1507181CC5139AFAA675590AA3A3452D9F6D57906D8CAC54A77CB5CF672B59AAF8B
+AE92AFD8
+CB408DD92476913EA3886CC434
+55C6C44E3D96645E72BD9A78B2923B11661E6AFB8222D781CD2DFFB91A4A739D478F59AD047DF482BAD1E636786B29AC948C3C4BC0FE8E87B25B41D220EE546AC33445EC6447AB2ED2D80396628073300FFAC8F914D15F6A1EB0
+0CA0F292
+D53948FFC685905C7AFE83EB16
+0ECB4DDA6D181C76A18EEABD5F65ED4D0C5BE491261FCAE3AF9C7D285D73060C304EC064911E94B93CD845F506473AB2A41F70B3E63B5B0DA4B0
+8EB03A72
+847130882184E9B8B82F1B2437BB
+C4295CCD132916733090C02AFC98793AF3F79E3D40B37338456C42717021770A9B93E9427E5F8F80346FC8E481F9C1CE0F0B740404B900C0AF1E5B674CC55854171BFCE3DF4911C4DD43EDF4EC5386E3E02C3D4F6DF676F1D39B1017E5FF5A909904CD95503D5EA18C100D932DFD0285637B1773766CE8807F09
+D4DF5196
+0883444CE9812737D7544595D1
+EA95290120904283FAC63D4EE8F736EFFAC6D62C40E518274FF9F3ABD46A021755FDE144F4063D4A12E55E3A4DB1CE61137012D53F44
+4FCA3938
+D89DB237EA3D631E455EA9D63C
+064A8F59AB7394BCD5A4C4B68A2BF0083ED977A5B0D96994434E15EF199541954B905513
+AEBD4E10
+023FC89BD2763B03292ABDC14DAE
+A66002AA4C74B2A2242BCC4AB9EC30DF6AF2E2932293683C8D6C823A12F404257AC79516E1556BC296234044826F559A2E10A5225EB42A1578A42DE26BE594FA641224F3CF1F307212F5AAD36CBE771EC5BDB48F71A4CA83556A57CD3A05570B9BA154A8AA9399BEAAE5C56028D059CCDD02DD
+F1B8E5AF
+0A2C437CF01E0D860FA8F671E3A6
+0CBB746D9E5E4650E2D6916ED8427C6B4C6E0075E60E19D0C894757EA70B008753D7D04601091E6CAD4974278579C2CA94953D8AD65C0A5E21CA82E60DE65831A516938D840DF10599300C444AAD686A66B764CC9FF67DF4ADE103951236D373E5F9FDF869A6998E9DFD01448174F0F3014F4B49AD1AA31F860EDF23EBA5
+A890
+DD
+62B0EB9D
+F20DCBDB35EDC076C555DDF363
+79673B7F3EE89B9AC57AF5F15D4B99E39F9CAADF6AD4136A2D22FFE5C409F8303E829E32CC8032DDF7A2CF18C9AC97B98F8496115343E1845FBF15149EE2EF43698A50F92DA0E690ACEACC0E3E121F836343D85969A1C65EEC4BCFC5A909DB5F56
+D4BC843E
+FD62C683B953C590FC8D774693
+C4537361BAA94A7F8F99846C9CACDF8787C0D6C9D2A04333530B982432DCE3DFE3EC6A2CF71FCE86B283FE056B06348F9470412BD1F781FCE71E248A4A6F25F04D12C03EE753A89ED69DEEE55296EC753741302097CE0F7CEFF6E4AAABEACC42BE650F
+9E37951E
+60B56EC565F09D2356894CBEFE5B
+D31C5B141A45FF7065287159A5BD6DFE1EC4259402437080E3559BF8B0CF3C65EBB47FABC52222782C1EBC6054C6CE334800B435BED9E2E4F8841A189BDD5EA96247C23E04E20818A57289578C2BABBAACA5A0F4D8F3634EC6963D12DA7B5C6B8E80DAC571AAD3D3B35F21E5E2EC91107C1CCE85CF032F9625A077C1ADA5
+BBF980B5
+25BF12146B313E28757D104202FB
+3F677DC45B3E5D71186B905B867E105F6CC4FD794A6EF5E331E604C85D2FF09D8AB822F484339F00718B946AD698395809E56F21F0CF5D097D2CD188CE082C35FCB1A5674BC3929E836493E373E7C1F4CB1DCDE0CCB03AB20CB908C8111F89A7DDA41DA3A324A3CB8E2051E745C077C55CA686D823DD07F28AFAEAD1E981
+A55B
+D32E257465DFD4A65E9659
+B7A1E5FD
+AF4A27B55129E96F1683149BDB
+16A1AFE77036BF604C748CA1ACED488CA752253ABBF58CD2D2A40ADF75365A0AF38C3F8C6029A6034F465F4FC6F894E73A97691307C528E2FF8B82
+12EADB3E
+33F36D418CC9BDEB3A1DF278C4
+6A4F26DE811338DE15892A89C7F4787C949409800660D262D11D8966165C5740A2CD8BED226EDEBAF543FA079593A0CCFB5DD2E52A57B1D6227A7BE8BD2C31A6581070DE343699
+12055C4D
+B25B0FABE96F72FD5E335A901414
+67A71207FD500CBE6FB5989675E03B11DCC7CFF31932C6931D8EF3CA2D1E3225F169F473E87356BE69D28C92B8A1BC4139F8F8E22CB9F783B831054C2BE1C47C903AEC3285C7D272CF1AC180CA8F580A71445B290270BBCEDAE33D58DCF16EEC1DFB6A9460987C9069C7D77CE758AC
+3690FA6D
+968AADD808DCA6B2D15125D8A1
+89FBED432BE53141BC1EC9FFEE89A2094D8E7D3FEEFDE7C576C8E0E3BA58875C519CCA9557F018C40F50726A45119F8C32795C692A4E2C53A6C2BF665E0C3A7D0BF6BC3E50E4CF86C5D31D7652039C5A77260195707F8E8BB7F41682
+35963C99
+4DF85C133C7A9AA4CE274C24B6
+B3A684DD049585B0A4F58BF36FFE7D3C8B213AE45D6DF029A1E8D09A7345C59BB4E409E782443E212F7247F340B324A6DE05027774AB389C690408DD04C633D1025635F4C7D90185880E930BAB9B0CE187E1B1
+759DFECA
+C9B06199EDAC577E78609C7EFD39
+38553AEA1984A20373E914CCF702DD196DBE6E71F2BC61860C1698ED9CF85C337031A3CCEDBA4A7301C1B1EF348DBC99775171284C19DBDB976EE8A4AE6DAA0E7DBD1EE0A2DD7C8F07B1E0D1DCBDFBED127E870BCB6C239669B3D223683877484CDE61BDF0D4340A6AA1
+B933228D
+FA201A8BF198EC4D2D1F2B6EE7B3
+7D178BD4354045A5FBAAEE99933B132D88E3DBCF8378A3503D037B3DFFF0AE3706D92A86ADD02F077EDBBE2D565C7E1582D42A5F642693F10231AC96E9B5C6B79B2188E3F03075FCDA2CB13B34CD7F040AFA9469BF22F122598C6D5EE59A7C4DB803AE1F3EFD0BD516402E66CD886A9E31966989D76CBDB47B4B4D37D915
+8A812E25
+38AE6BC649239252F489036EE892
+512430539A20674D132AB7C79B2C202242B5E556B59964F3660A226E651B9105328DD7C26852E02B31128CBAFAF6E0D6F0F2F4EA2DBE7E85E6E97E3717C66ECC03DD43742BD167B691EFB8F077C10D560E3B3682B47B5592F9B4624293ECEE7E515099DE64E617BD391AFAB540609D74FC7DDFDF06A72A35ABC703C0ABA9
+22C8
+489BF1
+DBB20DE9
+4FC6055C76E8AADE13C87D7082
+371D3D4814F5CD4B40E305BB4177825D9629FB6A47EFB31983BDBF3C08479367A9F70460B44F5652123759C75DD66B687AA6B69D9CE9F0521BAAB73B6376FCFC9E688AE6289163E6951EB5235A4F5AAA16
+B649FC41
+2EFDB718D2BC0C8C4E1D349FC6ED
+24879F0203C255C3C383C2B2385AE2C08BF91082EEADA822511190008FC1811966A646182E71E517C000C75BFE956DFA4CAA25C33FDB4FFBD14F0EC6543F845BBEAB37C4B081D9A9984A4BEDB580AC31845E7D7648D293D78EB9799860E554C5595A9525
+A0A30989
+3DDEE21ABE796E81B4C2CA5680F6
+221172524C03D51AC631EE60B68EB0B44B57FCAD50C86A30A667BB11F0FD66E1F9086322E632DF39D1CDF6285CCD3AF06C0C351279BCBBC30F47B8518CCA88B7D75062053D67CE00FD7EFDE69F657734CAC7AD847B3D4ED6EFB1A75B948D033BC0729CEDE9F7809F66B6F4550699EADCBDB060A144A81E356F725328D154
+AFCB
+D4F4E206588AB9CCFB14DAA47FC3E2A8
+65917D2F
+5760FEF5830DCD6ED57ED9CC027E
+E23F3B3B5AD2738DB649B3C674A9C58CBD127074458E832FDADC2D8ED12649C0B2B8A35DE5178F07E7634D5A13C437205F9D2A06A43266964B3025896BFE4B512F7C49DF7F627909DF30B89E0556D30DA118758FF748D42EF7144B6145161910632D7681BF338DE26BBBF07C3B9EB919B569611F0B1F20DE132A7C52D899
+FD35
+118CC1708A82A8F7D6DAF43790A0F1D4A054F1799431EE6D2F5E9B3518ABC6A92053EBD82E3B20
+321BF9CF
+947BB79076020809AF6FB3AD6A
+C55575E6E7FFDDC08AAB28F78CC3BECFFCDDF1809301
+269E7A71
+786538B533E38EDC1874C3E020
+5E0BBE0320A3E02732AACD76A228C71D9EB1A563F5D1335781BE1F9E1B5B3BFD9EC68D8A20F9101B366E23DE69B0BC63C6D2ABACA9BC7F21E65A
+D414A66D
+42F7A3D26A4F30ED16ED5DFDB1DA
+E428DEA1A72955C9309D87295EA289D91EF5A8386014D71B5A69795A61583F35D0DB013C680B775C514F7C36C1C8605F9421EB20F1D6DB3A05DE834F45D9AE523140FF22204C05D99ABBB5E0C5EDF3D0AE7CB110AD3634FB2020B22E09988289C6402F99E6514197D9DEFE2E70B3B40FBD878EB5F866C1DC08A7DE718262
+0A75
+D2F30C
+14DAEBC2
+E4305DE7C85F5F81AE85CEC705
+A2EB89D77310C0A678E651C92DB92B41F144F4ECF49F6479698E042F35AC6B54C9BD1EF24455B6E5576C54441753E0456BBDB45CAD2AB17510DF773B35EE0ED115B92A84AC4DE886574090105016465F5ADACF83CF1AFD87
+0EE5154C
+6FF272B5F176BB5526CFB33D7C
+6D034EB8FF0AD42B75D89989A33ADC8F5CCF7F63A7852E5123AF2C04843DBA64AFC9539FCE21119962699D05807AC0A7296EEC53D62F194FBC2CB2F84315A86AF784044A336B797D4D820EEB4231A85FB67A
+7795B98C
+B3446F5D4FB1E86C9A061A30A0F8
+7D7BAF53F76D4DE2F6296ABA441EF3915B09DD2856CBF99BB9515C71D5224DDDD5BA950E8D656AE79E16900105EB1204BA86FB6E1205FB6098B57B01C921E6C4B5C50DDA15D43BC41C5CEA3837133C90683D2826AFFFAFC3CB91938DF31DB598B4A807876B34CE4B1A6FF4E1E86E
+FF680239
+296CB462A38EF3DAB9E24F51F3
+B7FC5C8709BAA1FB5574ACF24E033C4AF93E2241F6B65CD9ABCDE90A7A4E52F04F909F162E6E6A3FFD2DF5BB9B760ECB9F93A6503AA230E45F76CD4F4C9F2CCF5C14C26AE218A960FD1E0C6B4AF4839C56FAB362132F9241EA
+B30AC889
+516B1ACCDE6772222AC5B0B838
+3ACFEE3BFCE225A3519634D094EA94EAA18AC5A8EC359F6A4990E684A072C386E98CA795E0DC3574B3B3409F28F997F90D6C7C3A6A5AD9A3914B8A517D2A6B4E9E4124E46293F849B9D718F48A41056326509CCFACDF9767FCBD3B31
+8FAD59D0
+AA88E9AB4144BBE075939B8A1306
+AA744841837FAB63CB86C854F4651DBE24CF93578FE8FC0CA7B9878FC2E5EFE8047478FD54523E0859481ADB65F66A4FDE537A986112BF1D62854B3180CCB69F2CD63C9E644555351A7EFF8864C4B3B52D6F8492F0DD5374F567A6A98587F32919E4366EC6C33682F561E817E6EE9AE3D3CCFD7C0BF110D0899A12DE64FB
+A2DF
+5E4CBC772A23AC0E960FEE63389408B64FCB3BF5362AD6C1C899E081FAA315957CEA3150E64194C6283140062073D5
+C7E488D3
+F4FFE6ACF4758FE2E2D27E2CDA94
+DF2AC0F905518317CC4C482EBE9C62D79ED004D68A046F5D33E32D5C8CFC9E271C18A52D82FC2E2E03969523D0312D8F8778FE143261CAE5443866195B4CB681E9691A80A7F7C3199561510032E19B8055CDA7CC7893B775962D1BA7D4959C9341C835F231FE52BDE7F3167011
+C3FBD07D
+6944D83E66E1FCB874D9F3A906
+8D32ACDBE821610F617C3F7D2E5EC421E5B7EBF9E862580E3BCD4BD834180EDCB6BBF6C295B7E3640310E33C28D2EAF82000080ED3026EF41459C9E86C29E0441F365BBBA0F7F84B2D524AC683CF857E
+ECA40FCA
+47226F1F77B1AB0FFC9EF716E605
+799F380054AAD4BE27D10C1DF193AB01F422E4E8AA760F5299F4AFD20CF14A8931959F217131E5AB8711367A71B85C5572A0C0C38B4924BDBDB30B5D98CBC4230B58217338857652B4260CA960F4205EDFA620F9206827CB036BCA1BE92F0AA897A863F5436271B2AC8A2D4BD5718703535F4EB31A893A2179D94F017285
+0A3E
+C0A5FA0352A2D24824F8FA320BDE033D6ED7E4D8CAB1C5F6BD35FB5053BFFF326BF811
+544CDBAC
+27B5C660E91A11432058B7FF16
+6C507B493EB4528675C25BA0C34F19B2D133E776A7741115E33B198DFEC2F7083B37E8A1BD1D73C92E58BF2D2F3F00F4566FDD210CDC
+3E573D11
+3AD4395A32C2B2F68114C044731B
+6DB80077DD324BBB4BE735E0B93C94FDFEB0E5515B136ACF85337A8EBBC04CA5B609EF14B732B6BFED24471DF0F2290162EBCD08CCB0E45BC82264E0545DCD5E7E2568A75E826D33B3929C53485E35A0C5452BD7BE1438BB59B6EF146A606AFA934DED9B620471A19E8B724876A9FC2C67F20636BEAF0495A7ADEC6B6AF7
+072E
+D4F170DBC9ECB11D0CA3632E0AB4271427F585696912C01B1EC069AA597BEB
+80E589FE
+54982C78D338487B82D4B3D5003D
+79CDA61313C2EBDB3D85C15E5EF6B4A88B69122573644E286F3A622D1A79B0F85D1761AA9EB07212604BDC14CB34DBF9640FB377839C4E109E646D82B791FB7C62DFD7863D663D7F0AE4D1FCD43DA77CF2143AB786135694A3D7821751B6AE4617E7D0684D5C87ABCA45F1AF
+41AB4179
+27A564DD52B48F0AEB6E66D203
+97C46FEA3B7F7D0B6B2AAEC0F613FD014BCE1E4FA0EC3CEFE4E8941A24A42D622645276077A07A9C90B9121E49DE587496EF4E3C0F6B523BC4363B3FD3EB3D2A8869B0281430
+E28E766A
+3CF6DBAA7BF3E518C34A364D9C8E
+8A7E042A3D468991DEE447738B23A27262411670AB992EC78E90B467FD332279BCE9B9F14E64C7959BDCDAC8BCF70BB619EBE4CC5E36FA717A1AE5A42FC0B88B582FFCDCAB4AA3B679FF38E13A7E4A636E2A2CF104F0CC2C01CD679B12F7011978F897BA0D61718DDE0BE0E2B01A1833F03C1380821A45
+B5F2B74C
+E0D55EC5259B96316DB10F0D8EDE
+5E0BEC40B34A4146C2541D3317676D082DACA6C60C94C7AC9F5CBFC120A8E488503D8B7B36E9BD3F821958D82D70D6D52F78A8D11093B01D3CBFA62F02B6D8AD7D9E58DE275E304BE4BB51AE67667CE4439E072F2FBA32072EA0980D633A8A03DC7220AA11DDDD597E40
+BF0D4316
+C23A7ECB61630289D7E57FC502
+03EE6EC6C8CEEC10CE72304E5421F3763F2803FD09D7F1F4E77BAF6606425D680A904B01BE0BC986013711C4635932F8E60B06354C2FE1E3EA4F18119B94910E2D88DEA70D513CFFBB77CFC39A616172D09E379112C106
+8854A47C
+DABD24B7AE0687CE7F365D3328E0
+CBE8D4C55A40FC9F3D84E04CD78801DAF49D63781A232EACF32861158DFFBE3CF14FE52569B29BBC71ED22247A34BCD6CA98B6CCACC55102D6372066CDF56E7309D6B043A9C8E90CE10FAE59239BEE265AA264EA8E473B09C84D3970C569FB7175256EA3A504D9F06E3B1250C5AB7C823DE20228481CC29F6135D637
+1D21D9E5
+0B4913DB2A8D2A628FB6356A4F
+1B01317B09E24CF25128D77A879D254E3B456AC4F39C520BC40CE1CA7C1A53AFE017679749E5CD84B49F18E26125EE6AF4204272396728E4B131E081D4BE846DE341BAFF64
+C3129799
+A739CBCE232BA8F687BE6C6510
+4B2BC60D5ED635F9B9CE3BF8D9DE2A6FF23E449110195B06A7DD8FA3A4D53EDA5BFC9B921D9E5BBF87E8ABF735C20424C95DDBE13CE457DFA4F6E9E0B466423AD1E77D884A2C60E6FA19D1463D8A61EEEC95A944471BE37C2AECA3666E169F15E021
+BDEA294D
+3AE884A222F6D7D7A5ACE30573
+3BF769E794E86A6F6EE26821706B794AB7D610B5FF99F83F55D22784CBECCEF2F02D31350DD90AF5869C71A0CE403758B734B9B1034473A96786618F02AA059E522D1A99326358433681F0857867931CA5B1B3B4A689C3A1C6
+8655B94A
+5BA12994BDFF8D159B49B4749884
+F96854C20E172898659198D1D9A982C3E1A644831BB9335D75709F646328489F4ABD2D1652E1CF6DF3182478A996DC11BE6B7DA41822862CC8FB87E22C7CF89B00816487F42B98180EE39AF44A197E701BA9DFE952FC932BC5484ED49DACAE58DC9221FCB9009AE87756A8DAAA488FF375D348244803412EBF36BA13301F
+EC09
+5FBAB9F1478D7549D3010CF1CD01
+0772A02C
+BA911DE8DF40F32B0760103E6455
+B244B9BFEC0DE8F8E05853DBB320EB742F6AD3F9E865C691B886919B48A437F7BCB35DB06C27CDDFAFE0E0523725CA21A2C3190818A53F1F2B3EC717FAE067F8CB89EA43FCC6E4EE2610EE64A3EE44E08F3B76DD13E20F6BEDA7BB02C06882524988E7ED899E035DEAFD2BD2F2135010BE92D3E78AFBA3A05F40FCEB9927
+C6A4
+0ECA817530866ED377B86412E57F2E457F7DC04BA739698510
+0D21060E
+046442276787021394BE5717DFE8
+746921455D510E9BA0369170132375A1C5FBB7D3804D4CEADB932F9A21798109BBBA92D403872A26E00C823553D65430D926F09472D5E4888463CB072C60720F9303B97B1CF74E0036D7EFFF8C96FACB32BD88B3B9B8B0C664DB5ED38DB2379ADDCAEBF71AF9BBA2622679B95C75B21DD5FD5AF6941ADA38B2D845262873
+FAB3
+06D0A562
+F3FDE3CD99C525DD7E0932C8A8
+8AB1CAC05FC7C657621805A554B5B7A4FB42FCC2A14D8BB6C95F4118EDC24E8C5DAFE27CA4172A3FF2DAC3B1B8C4C2B5DF55E0985C6094C4597FC0474BC7EA
+29D3BDC5
+2918216A91470DB2B1413766DD
+E50E614E9D4A8324D35C0E3DC79AF42FD5D646C1ABF4
+EC560D96
+191E93C9A8D5693DB5E0DDDD7AE2
+A28CF1A28F2A0061
+774D4713
+F81934CA1C03259739EAB1009573B7D02116C52A25645EB0DDC4D1DFEF3B2942560E
+108D1A9FF7AA760618C674B64BCB4A4FC34EA68410D82E076B1BE186AC7CB82BABC2A1FF91E1
+BE5BD85804AC3500940BA02BBEBB1912DA7910694225CBF2866C5A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0045 put
+dup 3 /C0047 put
+dup 4 /C0058 put
+dup 5 /C0067 put
+dup 6 /C0068 put
+dup 7 /C0069 put
+dup 8 /C0072 put
+dup 9 /C0073 put
+dup 10 /C0076 put
+dup 11 /C0078 put
+dup 12 /C0079 put
+dup 13 /C0080 put
+dup 14 /C0083 put
+dup 15 /C0084 put
+dup 16 /C0085 put
+dup 17 /C0097 put
+dup 18 /C0099 put
+dup 19 /C0101 put
+dup 20 /C0102 put
+dup 21 /C0105 put
+dup 22 /C0107 put
+dup 23 /C0108 put
+dup 24 /C0109 put
+dup 25 /C0110 put
+dup 26 /C0111 put
+dup 27 /C0112 put
+dup 28 /C0114 put
+dup 29 /C0115 put
+dup 30 /C0116 put
+dup 31 /C0120 put
+readonly def
+/FontBBox [-18 -207 798 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684274F521011A4FAB2239CC4C91F3E8514A0B1
+D56D6AC921B6CB9A95B5862C
+96EA1243D6ADB73380
+FBA81AD5
+E671873831753B062D54870AC3
+7B86DA813713423C616B752F5B478535EA51AB336BF262
+0C12A9B7
+403688BEE1DF831990D942C145
+C2204CFCA477A2FAC1D6FFE48FB95A72E07E007A65A551329FB6
+E5CEBCA4
+21AA703D56FA9FAFC5608660AD
+B1585D757C69A9EE103F01E2132F3737A9D187F0AF5A534303F5DAF1811F42120ED37E37F991F2C317DD6B92A06AFA1799FE91B6647A
+427E8C13
+CF60AE48B5D903CCC2A571E90243
+3EFBF02E0CAF3725E0447BF9116C5E8796E814AB8CD1D60F5EAD1CB6DA3F72AD1453D6A3B7FC37AA9F3C1F673C557CF175AB19DFF8F452F21DB9C2391C109FFE647F7C72542C4EBE73286F582056F2ACA45770FDC609415CBADCD01BED4DBE47CA0C9E3EC29BF07B
+981F45F3
+0285EC0D9156FBAB8E4AEB40D6
+8457BC8DA71322B792B7BF4DF72AAD0C9345756144DBD263BEFC4B0459BC36FAC365B2CD2F6DBCA6D1FF1FE49440C52CB0B278480204707FDCD84B2EAED85852BCC34A45C21FE958A0E4AE303C55CB735D322CEFF5A9D3
+A150332B
+052343C0B15B7ADE5334A5217D77
+295DE5EADD586D73C511A9CEA8DC02ECFCEE966FF3D5738719490C6E1E636CE0D33E3D8481420CF1E07FBD6BCFE69F321B0320114C92FED2B69A83AD5C1E5C31D667EDB7E54112B35162235CFCED5CA6D5BB7140C151B873E3CA8E0BD78038A90AE89FA31532A8920E38A36BD94E
+201B2094
+1534C53E83D40769D38884D515C0
+D9BC826E558A2C9DE8BB6CC1A442524685E3FB5B5847273D8105A38FEFEC19B0A02707F9E4C433A8EF9A570EEE4B97429CD7064C51CAAC67A8D831708E1ADD02F1DA86DEE0CEACF2A84303A0AADB3C0CF91AA4852BCCF2D1CB645091946FA7F6172339B08B85F1EFA5734509AAF6F2AC352F1C3703FF6C
+B5E84E5A
+EFAED557567D0267EDE57C27B1
+DAB7F691C64104213BEF6884CF749D2A5D81697FAC66784BFDA32A6AEBEC2B1145B4E3410C705735B95FF488873A43A269877CD9A4B1BE4E6423AE16E4C3
+6702414E
+04D095B4FA98DEA2200FB1758B
+AC67E1429D4432F6C35E05B6A4A71C1ED8572C91510466D1A29EE19B40D69791E68852149629E2FA3E0D78D7BB6E9391211DFCA50049C534AB15ECDBC32BEDB04F9818F5DA86A43E2D
+F2D05F6A
+259BE50B43E0671E33C148B5A0
+52196AB02B9C9F419DB2656FDEBC17FFC788076895DFF67274E565091383104A257B9AC93C94636CEEAEDE3535B76CAAAE6DBBBD40D0566AD927B54066D980B0BB3C52675FD8DBF1D80B14DC2CB2303FCE51096CB03BEBF5024F18990D12B0
+BC221E67
+F07479593189ADE9A16B4B33575A
+0CE6AC3E83412C4B0B63DFF024434F447D14255F2C6192E1CB8190688E70EF481D9AEDBBD7DF6D8A81927B5F3B28A86F1A1968C5285FC1545E1119AE6D284FEC3B6F6D46B6983E96B0D46EF8F74E045FE35777ACC44B43353FE3E5E3EF249FA9660C6F6DC39F68D442
+2D0959A4
+EE9EC51DB6A0FC55D2715A2E1EE8
+BB1E27177438DD60E3E377A4D6431D9ED50A8A80BF3FD0993B955D5B58776EF2C396840E74E98EDE772C00B63FDE9DDA57A0DBF55CBCD5BE6B570336895F76F9644917DBD61ABDC3F77F5F0D02D3D744832FB984E09519AC3507F71FDCB645F72D1C2E5F
+C806DC2C
+E55AE10907EE80EE6E6A75EF2CBE
+D9F50511D03075DEF23C05C2C38D116AF653FBEE2E56C50749F2047788C4E09886FB3441588F2FCA8E148993329F4408B992215DBB883D67EED25600CA65F059F1C81A6E247F3490BA2D3A0403E6387E0469D35FA5EC6288C5D852FED3683A10371704925FA274C28B481804233BBF7B3F49A619191F8736D4273FC1A59A
+DD6C
+FE248CDD
+7B5FA42B2BA29971D5561EBCBF
+76153BDF2110F26CCF789F57FAD656C41FFD4E73FF4E5946B0A9449CA5D6E3D5C89F4640AF084C66706FB6C05A5C1C9A5A9D9EE69C121057B5394D7BC85795CD2105E3BFFE128D95FC
+E4804C3A
+1EDF8DFA0FF8DAA14815A8292504
+F21D932C0DAB2230AC5CED2F3EEC6BED0AFB45BEB9C5E3210B1F7CD61A0FA063358D8F6F1A174FF3CFF1053023F7FB1BB587F8FAE14FE0120B90D0E8E24969931D81EC20FFE56EED4AAE376D2BF4C96DCC3EED95DBCBD6BA9873FA7A1833CA1566C3E95926C53F
+64E47BEE
+2673173B1CF1657876E4A7C5FE24
+04D77480D7D26469114CAB950A0C00DA2F51281FC29CEAC5953776062F6A95D19AAAB00AD9A6DA6299877E4650B8450377497456A5B3F1A8AAAACCAC603C518B93F2E674FC1F6C72B26FE8B8FF054D60B0C1842468B1F01E42C4E40F7C52E8DE26211EDCB7D283C3AA9B741D1C3C0611F7599C0368C91CB5757C9660A970
+E23B
+1EA40D4E
+B5D18CEF
+D7D0A4A4ADB1AAEC4F97555E41
+856D173C4EB2D4AB007822B263E92E3D9E1886A03D46B8ABABD6925E2480097A7AF2C2902D0926A75D9ABDD895EB16AE4A195E248292AFD7917C95C6B59964E7F8DB71D093018DBFA16038E6DD703FFC7082
+94BDF830
+DB530D872972D0652F0866A0E6
+E9123448946D240AB15BC097045B06569D4ACCA01E0729300667C68EDC9A61936276AF4970811B728266BE4F9FC96D14DFF78A74D547E8D638F9F325818C67E4BC31263CB5C8BF728DBDDEA8A59760684F5C526D53FC58A17AF2D3F8
+BF2FDF88
+908A7CBB2ACFDE64758D19260E
+8053E9723009F86754C230BA777252DE21EB63E7DB19025527BF25B0EAA166B3E389A4569301BB104D5A7634068625F3F02880D9B0621A4996956FAF84E3E3897E616ED974A8B7A30BB197D41F217D7F2C3558C30C1F4BFB3356579C7F
+630DA61A
+143009FFDBC59AE1AFE54676F8
+26D7C8EF4DEC42B0C72FDAA7FB4435AB3FC20BDD5F8A431C2B0D5FBC15B20CADA36B53B8108E9C45E12BF3F0AAF07DB001A75BDFF66B66988579D80012EADFB3FA5EDB40E96EBAFEAA15E86C9214
+01F5A683
+A78DF7C361C01B21660936FD60FA
+010DE7B0A20242BFF0643B55CDCFEA5C1A0F7BAA8417A89AA5DC966CE4F49E416E4871465A25E67772E80CF90CF9F8317392DF7AFCCF6C61D5836574A36CFC3A07635E174EC9F209439654C2446F17D4F767FA7762C57C71BFB5567FA0E1AB79B754E7E70FD832B2B69A6105A9ACD6B2510151D0A116D1B040419F9D9E12
+77B8
+44BC
+5EC3968D
+8CBEFF4A5562B36189AEBE2A5C
+045F150136D7D0BC12F0B0DA14D420C08B4BA5B6925DC37E66A3EF4AFAB497038C135869C29A9700F142B59A07C9A2191333CC07
+CEC94F6D
+FE275C51985B7C42444B8A39B1B0
+F1EBFB46D8AED46B42DA4996742C748656FA973B65568182FDC374F09E18F3495A40149D06F92AA1D9D2DE8DC1AF152F58226B5A24FB5470798E60CFA880255CC4632594DC689A4A960ACEFB3399D748806625D241F0211F9C3405106778DE6A88F77BD69C5F2142B7D606BB96D5B87B6AB32D82D1E526E198DE1382AFEC
+0DFE
+CFF09A19522D8A2BD59F70198F47C46F4C65896EE3A2B1F3C927A520
+12BC389C
+9C0BA325B7AF22E7B8A92D6CDB42
+9757D2C2E17BF6080F4E021C90D3C12FC662633AFA78CF37CC315290093DFAC727B8C3BC84C5A0975AC1E15FF9EA5D9DDB8BB99DE8CE203AA2BF6AE196A4468B77D35D7074B0287EDE1327C3373A850E192CE8F83C27CF6D0D588D0519EB056236F1D3D06BB198
+1B949F38
+34A5506351DFB25D96AA8B50BB
+A0F69C640F0F9819336301154A484306EAF5076DF9B266543C749C2B99B62C9A408114A6BF33DECE7A2A6CCAE401DA1E84542EFFD2DE6B264579BFE23885DC0741AF7504FFF5
+C6B8E840
+147233689C8FE18C9FA6A5F41929
+D75D3B1EDFD19AFD2CDA1F69C418D5BFD2941A8745A2A6045757A79041E08C35FFD9502E00CE541A7BCD47F27795D629B280A38B7D6F494AE61C73E802A6B0A7F17010E0412C964A5BB7397A82842125805B93DA088D9D4AC582FBB54626968AD5D7E0665295FE08B2CB292F6B16C69281
+F4E83C89
+5C8E0D7AFF7183A53638D11BF9
+A3E8B0E5A561C225128BD9247A2A5979478F20894A8AF3EB38832C4758E4D919EB102EEC54AA34559E97C574769428459DFE0C98EDD5B1D5A1F21B210E18D6A8B68212F5D10DCA3011D871012D2AC4BABC0B14CC00C1D578DE
+BA686FDC
+228C2CDD9599F0D8AE2E8DB58351
+615E25ECB209EAD429DFDE573CB6FEB80AABAC22CBFDF59D1B3FA4533FFA53B27E3B279BDE26C662A3A0075893750ECB1BC773EBAB727D6CC7F056D945488281A4319ADD379EEB1A632ABC6CCE0E5A08BD0425166039CD8E9736BAE387E3449F1BB1DEC0164B4D6AA86C82048F35A6157A15DDDCB0D4015CB7
+35C2DDA6
+B07520E6813138E002C42E6D43
+38EE5895AE4743FD26BCDD579732EC528D246BC226F9800F021F8FE624FF89F70B6B854F212B9E171B0DA54B1814E8C124FBCE8BEBE41308BA468726ABCEFFF292957EB6
+1D0A518F
+3FDD627C6F0BDB4877FEE9DD3855
+05F1A58957324ADB27EDE6DFCC99C685E6BBCE3A6C8128BE911C08CBA3A0AD8FEB5248C881FAAD3ACC0B1E0C5DC551CF7BB27EFF648FDC8446B1027AC729492B50056E37FABCA4C58E737C3C03CDF79CF5EB7D43B2F982903021DBB4AED0E65684E53D99C6F8A396DF53A60C30DF78AA4FAB1CA3816E6EC5E925C62EBA62
+793C
+1668536F209D0C41BE95CF8C2AF2CE6B287DC6C757CD
+9E594FE3
+176BF3EC8E4A445F40099EACDB88
+F80734E7790E5F66
+BC05A365
+C82C725009BE481AC42E9FC33D4A9483EB589A4419F61B68FEC5572A7D8129CA5E08
+D50778A50C2882CA1CE136914408567390FAC1624E1F7C1B5D8E1D03F41B31F5FA113427D8AD
+7303E6D75AC639BD2BDE7BA81831129C0FBFA8DC30FC228B2637D6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchi
+%!FontType1-1.0: PSOwstdutchi
+10 dict begin
+/FontName /PSOwstdutchi def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0097 put
+dup 2 /C0099 put
+dup 3 /C0100 put
+dup 4 /C0101 put
+dup 5 /C0104 put
+dup 6 /C0105 put
+dup 7 /C0108 put
+dup 8 /C0109 put
+dup 9 /C0111 put
+dup 10 /C0112 put
+dup 11 /C0114 put
+dup 12 /C0115 put
+dup 13 /C0116 put
+dup 14 /C0117 put
+dup 15 /C0118 put
+dup 16 /C0122 put
+readonly def
+/FontBBox [-144 -227 757 728] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268425D7C73E0D9FBC2C51FC5D7A4C8466A0ACF3
+EF6A51E85881893F5F8BC8430208
+87F3103F7721E137FA1F5E0AA668B92FD52279E66C1F88E225F1D00525B03625600EEE9AA0F3BC774875C78C8DA3485F17675C49575996A73AFCDFC5C043FF15240F2766D360B295D9F35757882F20231CD23D4B1D44649FAC2F946C5244A22F62F98DC8900497DB880EE30BEC4BE3011C108BB1603FC9E45087B4C3F7B4
+380E
+DB7BEDDFD810BFE55A51FA92E7
+C5E02760
+2FEA6E1C7BC816B379B9BB690B
+3F1F8D5D13B2FA0CA13B32E231AD6701F85E724E73EE5CAB752A1F01924E57EC33256147A9D15C2BED13E5B9868E463D0CF97CF79520D198EF7E9A4E8433615D43ADB42E79570068860AF8163DFA32E1F1AA9D84A0589C316A75510753214517
+65B024EA
+2CAE33DEAFE2FCFEC055BCC6E807
+8A53B445D923820C0B3C3B775BFA1858B494A3E1ED579B4B7021B2747CA7DB9BA810D03C123860AF732D6CEC7A174E5ADB2DF2C48459B7DA91099B9EA4DFD27060070047B8FED57852BA56F0C75B09D95315841A1D637002612F731AF8EE4047DED5D8E53BA552BEEF5D79070B6CAC2B68F8C835BBE415D9474FE29393F9
+AFB7
+3168F8BACEE4F753E5374F9DD54F816F2FB16569CBDFFE6BEF28AFFBA96E6D1D41790B9AD5A71AC47EBBF08AFD654A41
+BBB9B934
+32CD3EA43C3D75650A026F94EE07
+8C9CD2519EF572156B2F34DEB76DC76BA9B2709A6DD78C558978CDC791BF43681BB7AE9328BAA7B284BEE5A7454C72A5CF2C9BDE94805A59FF843BE51CCDBFE69C9361EC6C491C18FA2616C75B772E614F13C38B3A7CAE3986D2B142CDDD1DA052556B0B80
+CD009F6A
+B2638750700D66D0AA5810213141
+AC008781F399DF1A8043DBAEBAFC2B4AB596DA1071F3D505655C8C9E80FD9A1E0FB5F70DB8A227FC5D87E25B5985462D2E4DD446F8872432FA4BF7889A6B81AAC9CB8B818141C4D237D7DB1FC5D51A559CD13C935BF1AE639E261B83427841B5641084F6F43D44CB7DD60A0FF47E94CA86D71FC6EEF3AC18930CE91B00C9
+BD70
+67198EF0F55953DD826A0C981C7193E5CB53591FD92D5E3EE4FA3E
+90B8AFD3
+BD7D1A65145E62B247484DBEFD7F
+9A354A8CB2B1916981F3B04C446E91F9D7890C99E768D9FC4EA626D698A0A3099937CE0E16D26D38BFC8AF24914C1CAE2967D79EFDE69EF86E23739B46BE7C837D9D30688FD3748649FBF68082FA4D71603F483B057FA6DE45EF31154B6259F3B633EFB3D6A3573B473EBA1F01DF2CEDB0267012DC453BA300
+C113799C
+D73D058FD325CCDFF91C7ECFC0ED
+F5C1A835FADD3A33F90C6D40BE35C4C44C1E74A06BA5C213AC3C32207333F41924B722B467C4A262257C21398E3C5E1ECA06D9A0009E669507070150690D999B4B9DED64DEA22AA62FCCB06D0CFFF30CD6A3F21685F8AF43382540C00024B76FB86C21BD8F
+14B44FEE
+D45309CB76638A360CC3C52C3768
+33CC9C07A2C94C292258711A2E2684BD770223EE87E8E51500E66C413C885DD8F7B591D616E035D0A4D2422B02A87ACA35910E20483353B8AED8FD027ED84DADC927F04AC5FE290B2411BABE9819A1B5455C4675C02D586FBC946DC0D8C0D4565D47A4BA1E01767AC01BC99D380E26EAEF2811140DA4BCB2B6CDC145E023
+5577
+40C8C53F6C1D23B66FB4C547785165511FE75EFF5DF08E3A890D269542C74E76DCDB27338F578F7749E1BC5649B49C35D6EB07D8B2206582EF4DA5C871AFF0DC73D364F571B9C1A55CAD69
+A3C897FF
+6AF3F0EFA51F761CEB5A096396
+CA62ADD641BBEB7F15BF71EE60A0769746359E6ED502D86221686F5387FAD1C99FC79EC3B67D26DE4791AB7C2E3A878F100DEDC77079DE9354CAEE593159DC4804840B346C0B63AF3042A8F55ED2CDD681AE02A5645E4271908645E64434C8
+6EC1FA94
+81224B594D324EEC22B18CF2FFEC
+C694D26DA4B01EAC17E81BD0A1201B0733F1A238069CE685B61AB7C0372DF527FE13E9C4F02FA4A2A7BE9F63068EBB5852C9FB7C0B0DC480699AE2B9577DC4353799D0287CD9A5E6A09A0A725F591EB131ACD72F98D79199B7B3B42CFA5E54F1E7DB1F92EA4D6055FCF627C4E2CE90046A8E4C38E997457959AF4C53165E
+AA0C
+1EEFE42B3AF218C199BF1B97FF9F9B6EB63253BC3554E8CA2B39F2CDD331E73CD77F84039348851032E7
+26E8CCA2
+F9D4AB9099648F165944AD02EE
+83A494FAD10601FCF54C0665F0B4787B56E8F0AD22D814EBB6554B622A30AC57E466AB4681F5678DC5E63C7C447C0ECD2B7078507E91BCF725CEF508D6C40E89FD8A2669DDAFC1EFD2A0D52434A82440516C391B57AB169A0D3527
+274A5949
+BECC37B7C4A95529BB33F2C0EA8E
+279DC6700EDE0CE850A9177C6E851D01D67B1FAA0EE446FE947B16A24B99C1C2E8D8141337D7056995F4BA9D1246551587AAEF5E8FEA8C8127BBDDA6294ABA6B37B4DB63D93BEDAA30FC12BD50129A0A83BF32440C7F4816C47972ADA35D3DCAC651190BA1931004E7771C93F43764148B1D6BA2FDA7
+8365AAC2
+164D07464A95C1C11288EC1863
+53B9C4B298E49C0950C8F52058CAEF1A34199F853B79DE7E0710E4B12497BF156F813B0521E72F699358CFBD14A9D56C8DC8CF5F56D6DA181E1FE4D6496D24297BEBA81CDF42F498C0228919A0DBC51C868639925F9E16
+013CD527
+52A6337053FC8E0C4D5869B29620
+BEBF01FDE1279BBAFBB9C95FF68EA78975E9CFCC5B55F1ABA4222C5F9F36DC17938A29C73B252193AF33E547898A38A6AD3BA1A61A56D7D853FE2DF429F84C3C67F96ABF21C9E897860BE9F978622A51B39B0B107EBBA0326E008170847B38B385B268AF5D03A11D589D4922948261BA452EC10963E2D51821EBA7D02BFA
+EF36
+2D3AA90B6951C967A9C9887E747B2531CFAB39692475A4
+E0E0F454
+CC4B89ED9F742F955470A0DB6B
+C7D12AE114BBE7B26E1A897C731703C2E46EF5BD927835056BAE681AEEDF072723394C9A1AC2F9CCDDA88B272880F39F9C7A940970AB9F77C713C4000BCF101E5AF761BFB9775DD76A4AC0E96712C684B25F90A64F68F8C92EF0
+67ED835E
+3E4E375067FCA6B11A129AB7631B
+321258285A91BA87CCB93A9829342162FCC2285E018016AD1A28294BFA357E8F71874312FD97EA3A42D1314BC9233A28F681BCE856D7B7749A11EEEF73B6FEF343AD2894E7E5050C32CF8DAF35DE551706C4E06564A939C3E67CE3B16E9B3B21A2290FE047B156F96428C8205B42A95C5F83B862637443F3E50B6BC49ACC
+F0A1
+42E8E1B688AD6CBC4F
+BA5D4B3E
+C7943FA2DDB74F93D3DDF6B53340
+8F3D7332672DE15B
+E7E183BB
+D8F2F7B41E4363FF42244CE829AA73CC4A79D33F2B9F0839F89E36E300DB4857F052
+1F35DD3F5FA2BD1EC4A1C8F4951F797EF2C0B2C82418278D87FBBF498D2D2FABF87CA6FDAC99
+58624E435E800292174BD0EA60CDB71B326C73EF7AAE32FDF27D51
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch12i 12.00 /PSOwstdutchi newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<1b2a38342a362b10011201132a32282d3126362f012b3336011a2a263739362e322c011b2a383b33362f011d> 2207 558 0 7384 -1 s
+<2a362b3336312632282a> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0c0d> 9346 13300 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13280 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13280 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13280 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13280 3 7133 32 s
+wst:dutch12b SF
+<060a0d09> 1271 1431 0 1776 -1 s
+<00051a191913121e151a1917131d1d000e1e1c131118> 1776 1431 2 3930 0 s
+<0b0c0f07> 1271 1826 0 1866 -1 s
+<04> 1870 1826 0 1928 -1 s
+<00> 1928 1826 1 1959 0 s
+wst:dutch12 SF
+<0015191d1800382a3738370026362a0032333800283331342e302a29082e3200273d00292a2b26393038003b2e382d00322a38342a362b0900182b003d3339003b2e372d00383300312a263739362a00342a362b3336> 1959 1826 15 9461 0 s
+<3f> 9461 1826 0 9531 -1 s
+<312632282a> 1271 2071 0 1864 -1 s
+<00333a2a360015191d1807003d3339003b2e303000322a2a29003833002629290026000815151c2415191d1800383300382d2a0031262f2a2b2e302a0026322900342a362d26343700262929003833> 1864 2071 16 9531 0 s
+<382d2a0025251918131f11020026322900362a08283331342e302a00322a38342a362b0026322900322a38372a363a2a3609> 1271 2316 6 6050 0 s
+<12> 1271 2646 0 1434 -1 s
+<0015191d1800143332322a28382e3332302a3737001f38362a263100382a3738000515191419241f201e16121a06002e370026322630332c33393700383300260021151d241f201e16121a> 1434 2646 10 9531 0 s
+<382a373809> 1271 2891 0 1648 -1 s
+<00202d2a3d002733382d0031262f2a0039372a00332b003932362a302e2627302a0700283332322a28382e3332302a373700383626323734333638370900202d2a0015191d1800382a373800292e2b2b2a3637002b363331> 1648 2891 13 9531 0 s
+<382d2a> 1271 3136 0 1561 -1 s
+<0021151d00382a3738002e3200382d263800382d2a00312a3737262c2a00372e3e2a00313937380026303b263d3700272a00302a373700382d2632003336002a35392630> 1561 3136 14 7741 0 s
+<00383300382d2a00302e322f001a20210008> 7741 3136 5 9531 0 s
+<15191d18> 1271 3381 0 1787 -1 s
+<0029332a3700323338003436333a2e292a00181d08302e2f2a00372a2c312a323826382e33320026322900362a2637372a3127303d002b393228382e333226302e383d070026322900382d2a00322a38342a362b> 1787 3381 11 9531 0 s
+<272a32282d3126362f0029332a37003233380034362a3739312a003833003436333a2e292a0033322a09> 1271 3625 6 5362 0 s
+<202d2a> 1271 3956 0 1631 -1 s
+<00372e3134302a37380015191d1800143332322a28382e3332302a3737001f38362a263100382a3738002833313126322900302e322a003b33393029003033332f003733312a382d2e322c00302e2f2a00382d2e3710> 1631 3956 12 9531 0 s
+<03> 1398 4286 0 1504 -1 s
+wst:dutch12b SF
+<00031a1b1e0319131e1b131c140319131e1b131c1400020800> 1504 4286 3 3785 0 s
+wst:dutch12i SF
+<0b0408090d0405090c0d> 3785 4286 0 4744 -1 s
+wst:dutch12b SF
+<00021e00> 4744 4286 2 5099 0 s
+wst:dutch12 SF
+<15191419241f201e16121a00080800> 5099 4286 2 7188 0 s
+wst:dutch12b SF
+<021800> 7188 4286 1 7593 0 s
+wst:dutch12 SF
+<0c0b0d0e> 7593 4286 0 8017 -1 s
+wst:dutch12 SF
+<172a362a0026362a003733312a00332b00382d2a0015191d180837342a282e2b2e28002833313126322900302e322a003334382e333237002b333600382d2a0015191419241f201e16121a00382a373810> 1271 4616 12 9453 0 s
+<0815> 1589 4947 0 1937 -1 s
+wst:dutch12i SF
+<03040f0c0a0402> 2033 4947 0 2700 -1 s
+wst:dutch12 SF
+<37342a282e2b3d> 3177 4947 0 3795 -1 s
+<00382d2a003033282630002632290a333600362a3133382a0015191d1800292a3a2e282a002b2e302a003226312a05370600052b3930303d08> 3795 4947 9 8895 0 s
+<353926302e2b2e2a290609> 3177 5192 0 4112 -1 s
+<001f3d3238263c002e3700382d2a003726312a00263700382d263800332b002600> 4112 5192 9 6914 0 s
+wst:dutch12i SF
+<0c0610040c0a0402> 6914 5192 0 7593 -1 s
+wst:dutch12 SF
+<09> 7593 5192 0 7646 -1 s
+<0831> 1589 5522 0 1940 -1 s
+wst:dutch12i SF
+<0f01070e04> 2033 5522 0 2495 -1 s
+wst:dutch12 SF
+<37342a282e2b3d> 3177 5522 0 3795 -1 s
+<00382d2a00372a322900372e3e2a07002e3200273d382a3707002b333600382d2a00303328263000373d37382a310900202d2e37003139373800272a> 3795 5522 12 8895 0 s
+<302a3737> 3177 5767 0 3502 -1 s
+<00382d2632003336002a3539263000383300382d2a00302e322f001a202109> 3502 5767 7 6359 0 s
+<081a> 1589 6097 0 1967 -1 s
+wst:dutch12i SF
+<0f01070e04> 2033 6097 0 2495 -1 s
+wst:dutch12 SF
+<3b2d2e282d> 3177 6097 0 3703 -1 s
+<00272a2d263a2a3700302e2f2a0008310700372a38382e322c00382d2a00362a282a2e3a2a00372e3e2a002b333600382d2a> 3703 6097 9 8180 0 s
+<00362a3133382a> 8180 6097 1 8895 0 s
+<373d37382a3109> 3177 6342 0 3835 -1 s
+<0834> 1589 6672 0 1882 -1 s
+wst:dutch12i SF
+<0a0a010c0a0402> 2033 6672 0 2725 -1 s
+wst:dutch12 SF
+<372a38> 3177 6672 0 3432 -1 s
+<00382d2a003033282630> 3432 6672 2 4266 0 s
+<002632290a333600362a3133382a0015191d18001d1d> 4266 6672 4 6506 0 s
+<1205370609001f3d3238263c002e3700382d2a003726312a002637> 6479 6672 5 8895 0 s
+<382d2638> 3177 6917 0 3536 -1 s
+<00332b002600> 3536 6917 3 3986 0 s
+wst:dutch12i SF
+<0c0610040c0a0402> 3986 6917 0 4665 -1 s
+wst:dutch12 SF
+<09> 4665 6917 0 4718 -1 s
+<0837> 1589 7248 0 1847 -1 s
+wst:dutch12i SF
+<0f01070e04> 2033 7248 0 2495 -1 s
+wst:dutch12 SF
+<37342a282e2b3d> 3177 7248 0 3795 -1 s
+<00382d2a000f0b0d090d001f> 3795 7248 3 4852 0 s
+<121d002b333600382d2a00382a37380900202d2e3700372d3339302900323338002833322b302e2838003b2e382d> 4846 7248 8 8895 0 s
+<26323d> 3177 7493 0 3493 -1 s
+<002637372e2c322a29001f> 3493 7493 2 4480 0 s
+<121d> 4474 7493 0 4765 -1 s
+<043709> 4769 7493 0 4956 -1 s
+<083b> 1589 7823 0 1909 -1 s
+wst:dutch12i SF
+<0c0610040c0a0402> 2033 7823 0 2712 -1 s
+wst:dutch12 SF
+<37342a282e2b3d> 3177 7823 0 3795 -1 s
+<00382d2a00303328263000372a32290a362a283a003b2e3229333b00372e3e2a37002e32002b3626312a3700053b2d2a362a00263a262e30> 3795 7823 9 8825 0 s
+<3f> 8825 7823 0 8895 -1 s
+<2627302a0609> 3177 8068 0 3692 -1 s
+<0822> 1589 8398 0 1975 -1 s
+wst:dutch12i SF
+<0c0610040c0a0402> 2033 8398 0 2712 -1 s
+wst:dutch12 SF
+<37342a282e2b3d> 3177 8398 0 3795 -1 s
+<00382d2a00362a3133382a00372a32290a362a283a003b2e3229333b00372e3e2a37002e32002b3626312a3700053b2d2a362a> 3795 8398 8 8372 0 s
+<00263a262e30> 8372 8398 1 8825 0 s
+<3f> 8825 8398 0 8895 -1 s
+<2627302a0609> 3177 8643 0 3692 -1 s
+wst:dutch12b SF
+<1019151f> 1271 9091 0 1710 -1 s
+<00061a18111519000e1e1c131118000e1a1216131e1d> 1710 9091 3 3956 0 s
+<0b0c0f07> 1271 9485 0 1866 -1 s
+<04> 1870 9485 0 1928 -1 s
+<00> 1928 9485 1 1960 0 s
+wst:dutch12 SF
+<0021322e3c00153331262e32001f33282f2a3800382a3738370026362a0032333800283331342e302a29002e32383300322a38342a362b00273d00292a2b263930380900182b003d3339003b2e372d003833> 1960 9485 15 9046 0 s
+<00312a26> 9046 9485 1 9461 0 s
+<3f> 9461 9485 0 9531 -1 s
+<3739362a00382d2a00342a362b3336312632282a00332b0021322e3c00153331262e32001f33282f2a383707003d3339003139373800362a283331342e302a00322a38342a362b00263229> 1271 9730 11 8241 0 s
+<00322a38372a363a2a36> 8241 9730 1 9113 0 s
+<003b2e382d> 9113 9730 1 9531 0 s
+<0815151c24211b1823> 1271 9975 0 2649 -1 s
+<002629292a2900383300382d2a0031262f2a2b2e302a09> 2649 9975 4 4732 0 s
+<12> 1271 10305 0 1434 -1 s
+<0021322e3c00153331262e32001f38362a2631001f33282f2a38001f38362a263100382a373800051f201e16121a241f201e16121a06002e37003a2a363d003139282d00302e2f2a> 1434 10305 11 9335 0 s
+<0026> 9335 10305 1 9531 0 s
+<20141d241f201e16121a> 1271 10550 0 2724 -1 s
+<00382a373809> 2724 10550 1 3154 0 s
+<202d2a> 1271 10880 0 1631 -1 s
+<001f2e3134302a37380021322e3c00153331262e32001f38362a2631001f33282f2a38001f38362a263100382a3738002833313126322900302e322a003b33393029003033332f003733312a382d2e322c> 1631 10880 12 9531 0 s
+<302e2f2a> 1271 11125 0 1602 -1 s
+<00382d2e3710> 1602 11125 1 2037 0 s
+<03> 1398 11456 0 1504 -1 s
+wst:dutch12b SF
+<00031a1b1e0319131e1b131c140319131e1b131c1400021e00> 1504 11456 3 3692 0 s
+wst:dutch12 SF
+<1f201e16121a241f201e16121a> 3692 11456 0 5658 -1 s
+<202d2a> 1271 11786 0 1631 -1 s
+<000817002c3033272630002833313126322900302e322a001c34382e3332002e3700323338003a26302e29002b333600260021322e3c00153331262e32001f33282f2a3800382a37380026322900372d33393029> 1631 11786 16 9531 0 s
+<323338> 1271 12031 0 1572 -1 s
+<00272a0037342a282e2b2e2a2909> 1572 12031 2 2751 0 s
+<172a362a> 1271 12361 0 1736 -1 s
+<0026362a003733312a00332b00382d2a0021322e3c00153331262e320837342a282e2b2e28002833313126322900302e322a003334382e333237002b333600382d2a> 1736 12361 11 9531 0 s
+<1f201e16121a241f201e16121a> 1271 12606 0 3237 -1 s
+<00382a373810> 3237 12606 1 3672 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (13) 13
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0036 put
+dup 3 /C0040 put
+dup 4 /C0041 put
+dup 5 /C0044 put
+dup 6 /C0045 put
+dup 7 /C0046 put
+dup 8 /C0049 put
+dup 9 /C0051 put
+dup 10 /C0058 put
+dup 11 /C0065 put
+dup 12 /C0066 put
+dup 13 /C0067 put
+dup 14 /C0068 put
+dup 15 /C0069 put
+dup 16 /C0070 put
+dup 17 /C0071 put
+dup 18 /C0072 put
+dup 19 /C0073 put
+dup 20 /C0077 put
+dup 21 /C0078 put
+dup 22 /C0079 put
+dup 23 /C0080 put
+dup 24 /C0082 put
+dup 25 /C0083 put
+dup 26 /C0084 put
+dup 27 /C0085 put
+dup 28 /C0088 put
+dup 29 /C0091 put
+dup 30 /C0093 put
+dup 31 /C0095 put
+dup 32 /C0097 put
+dup 33 /C0098 put
+dup 34 /C0099 put
+dup 35 /C0100 put
+dup 36 /C0101 put
+dup 37 /C0102 put
+dup 38 /C0103 put
+dup 39 /C0104 put
+dup 40 /C0105 put
+dup 41 /C0106 put
+dup 42 /C0107 put
+dup 43 /C0108 put
+dup 44 /C0109 put
+dup 45 /C0110 put
+dup 46 /C0111 put
+dup 47 /C0112 put
+dup 48 /C0114 put
+dup 49 /C0115 put
+dup 50 /C0116 put
+dup 51 /C0117 put
+dup 52 /C0118 put
+dup 53 /C0119 put
+dup 54 /C0120 put
+dup 55 /C0121 put
+dup 56 /C0122 put
+dup 57 /C0262 put
+readonly def
+/FontBBox [-50 -256 920 766] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684219F75E53AC2AB7524E61DD2942AD43C860C
+2E17ECF00C883B66A330B97B
+FB4A6AA6EA10AEC651
+C9333FCA
+568CDAB7BA8DF6B41FF5C0172F32
+136BC107DEA671D5A04DF05029CEFA6E4EAC0365F10CAC00B5A109CF563C99977597A81210462EEFE9C811501444827A70FFFB229296DC954930A207FFE9AD3BC7A16200A623E518941A374D6282D9F6CF62B36E4B6C952F540E8EB37F94F95AB2D2FBA809C735490684C22AC365F32A9F24967FEC10C744FFC8C65AD144
+FE84
+9A9A5AA6A99FDE09D96C86F8
+AD832244
+F32A62BC4BCE6F32E89F06F87D
+1352E5899AE01C9553B10FF0CF388DEB75429F1EAD1BC652C39A8B91E9F847C496C5E6B5DBA4FEE8D83590B1EFBBA1AE35EEF040E08456B290F4765F46C36A8E
+73BC750D
+183DC0D551C18B667AAD54D823
+50F8D5FED8FD4D5E6F5EB079A7DB81B12314F93F622145F160E91BB83917FE7157B146FADA85A6077F1115DFF71A4F55791F3C7A6A369A2368452A6F6EE253
+6ED55C05
+90D9B1FF66ACF1CF56EECBD736
+C596D6FC0F181AFFA796F2A82BE90136CD043C85E12C79FC2AA3D57853D111ACE9CC0E2FDA7A63819D3C90F134E149400F4A635147144117E7
+302BEA47
+3B98CEF2181CDD96E6DB0B0BF5
+8CE30E4602E28AB25061E145C191356E3FAB09A8ECBBF9
+F4F85E47
+CD6CE0EA517275530DC30DBBC1
+0E1086651BDE15047100F1AB07B9EE68CE13017CF3CDCB980A1FC4AD09AD71
+C054DBA5
+9B5F345A8C251DCC21A31944C1
+0E1086650517DF20780CDDC4AFEE4DB85CF2A5ACDA6F003769F5C60529F5625D03C5D62DFAC12ADB6EB37D4618181CEA056C0674B85F45428287D0FA39F799
+1D6FCA58
+CD9C9968D917807784F18A87186D
+E1B496C46AA4B2325E9B226C48B7D08D7EC2DCE3241CA2B8A0D4DE045872043C8A74A55A0E25B64830135EF041D8DA7F093C39390D6ECB855033ACFCF3D4E119F350E59FFB8A6C917A6438ABBE3BF4B048D032BDB3510D752A3B5DC0065B7A4B9A923321A51B3E06A92A43550D229E
+E1E389F9
+F7B9AF4D6C679F4F4C299F6716
+8AF7E61FC459CE66A4353BC21DF33A5E9223C3C6412B49CB63BABF7302F4FB8E91788B6014D723D0608F30A4F8463C542E08768F1119
+ABF40D21
+89175954D37140BE9C488E75BBF5
+97DB49E37909BB01A351A5F02DC0F7AB0C4449DA1C789D3B8751456AFB74BE08EF91D9568CED5E64218212FC78377016366D2D5ECFECFBE28026714CA0F58F37468431DA78D00AE6512DBF4B72E6B64A154DD28978AE34437EF1044D992834DF1BC1E2958C1FF314D1455E737895C852E16C29
+8A2E6F9E
+8E1E52335C600407B372E5FD1996
+F8AAE79157DB47276D40CE3EFB46C92B951A9A04E4D4301FA21411B48DB73D957CBFB7BDEF90AB6948449FCA7FC998E1158B23686068F0AE77BF10A194BA8C3B293B968F83BDD9871160AA7054610E6C21849333496B0A07F533D9CA0C98A6F0373B4CB1FFEFDF09EA21692D154C09C1B04B7A552B8EEBE712586978D1EB
+1832
+C4
+10A97BAA
+F0BAFFFB9B294624C18DD1D43E
+8C7B81DEF3755D8E482EDC4BC6F15AA09A327BDF229B54B39D1676789878CDAD49011CAC05DB52887152D84517B3FEDC770040E1438ADFAF2B0DECBBC616A929682B257E3899AB7CBF49ED23BE67618F01BBDE80338AFC88DC2AA166AE59E72518
+322291B8
+D38F75EF8153B676B2037BAFBC
+79F33E071BB3D8B853F5676561AF7E6CD18024B1860AA2B77C5ED18FB4935864E684CAC81B917122141824F7D0BDDA6246FEF5216281820BDEDDC47B60401D4C646B0DB0B8C33B872A3DB2308BC448B098BFEACC80531A1560B0AB4AE15FC0E15033BC
+754FFDB2
+A61D15032494C2427564078B0597
+5B4625D5152B86F8852193B3F742086F74A2C72F0CDC65689AEEE3C31FF5B0046DAC439CA62DB991DB959786FB48763411BA22ACA07AF6A336EAE0C9EEC42EB41341D880F2E57A404309D6F9F2C86F5162618D9373F74B6D1CEA91A8C0055CE4E3DA52ABAF77BC7C554358D184455A4F31B325603A7B97DCF5BEFE236921
+4DB36B02
+89AEED3AD846334C371941F0AAD3
+273533F04E631362D011A398DB2C35B69FB38D19CDFE20F66ECCC620B3418EEE569CC8250A5215DE14676787EC957B194518EBB533AC27681F0D241563B1E77563EE2C5E240E2F8CB391137573A6F8B73496D0EE57F41ABAFFCC9FE764B1010976D4A143C7616193E1
+D8BD9DBF
+FC3BF8A7C297FDB8A79344EF5548
+E7BA21E4113F55F3CD2897F566704E69D5D834C7FB1E3CEBD346DD0AB7BA86C677F1C93DA1E628401ADEBB759762EB2330FA9D99AC70829827F8B3AADDA320160E208F99B3453F313659BB04AC265B19A42AA6651BDA5EA0D6E3F013D6717D44154EE661CEDFDF1F184C22CC4E3FDED437A3651613AF64BD12D4
+BEEF04D7
+E9F4E1FA744577964D6D7D60C5F1
+E0C780128E9026EF034871ED0E5B456E5CF7CCEF0E0A1D2AD9CA50F0803F2463E77AFF5AD95E13D291F84274DCDBCD1514239008F683A5974D66562D7E6DBE30446ED7A98F8B51EA81A05B49B52522CD2C77EAB98315758856D5F686F7E16F76B7C4101BE4AC5BB3EF669E2DE1F8E16FB939851BB682AD9F6FC0B82F7E06
+599B
+A68E7B1FA5474287292290
+DFABA70D
+42D2F5CFE4046E9DFA56CAF198
+F1073B7B598830197E8592AFD4B441655EDFE0A7FA79E7169E419EEDE4BDE005E3DEA4DB78F3BE11FA0C4367B22155F4835DAC972219A2934B7018
+9108CA0C
+6FB4B1C3B47EA97AD7F250F767A5
+3A82F9D8907896CA51E6E185E9A3A31940BBF17D4935F2D08F2F23307B11566AF3AC6EBDE8B30E73621D745C45CCD01F4C5316BFACA3F79F82A82EF3A56C0909E3538DDA8859A19B6B4CFA2132CE7DC489E022149BA6091687484F063FC6B6C1AA8029E96B7266280C132FE6B36B1C
+CC7261CC
+932B2E345E9CE791BCFDD27F19
+E63578119E8DE71CD41224F4F1FF689648D2BAF01F7ABCDC2E29693989B28A6CA1AFB15B4D81AD75B08B59A6A4FCFD5FD989F662E79D132FA033DDD096F5F13175DF8481B2EF6D0CBC0601C47FBB389413F7C102089C8875E5E665B5
+665D0E03
+E6A1ED6F3E8D666064BE3CAECA
+B7F3FB4B2C107E791CAE90525CEDB395D765A4E9F6CD457F5E606BBE122E88D46E50CE2531CF9798C4F119F732354B2ACAB4E7CEE1502721C34A27811267B9B5D0DE1ACDADE23518EA251CF19DB76BAC171BAB
+9DE9CED5
+0635FEE972DD71D0CE4701CF5235
+CF67B5DB52C005DC3D2841FF4AE8EF9031C273F3E84F6100FE4F29BFD6B27596FF6B2E10C57C8C389EC25D134A051C95C6A1C3D9B5A5303A335506EA4B575FFD7F9F383E27DF1CF8BA624C8903DABB911409D5BD75D008A13CE8772199AEA9B0128BFD86B48219BFA87F
+AA72F377
+6F32AD4394845A9885A1E5957BCA
+0EE326B9A817209EF759655D5FD7EAADDE812C679051658B23D2B24BED71ACD44F40BB74C7FCE51ABB375F515CBEAAB3BEBF496DF7CE4EE540A01AA6F35E11264A2D95F95F87A690FFAF9EB66E2697CCE941FEABFF843C1F49DD42F32C11D2A0C42567CC2B28EFDC990C6D208DDE44D921B36C34681D7598765C3E0B5859
+8D941CBF
+81298FC18248516B00594228A594
+9744FF4008C4EDAABEFEA82CD72345D06CE116CFE96B1ABDD0949365CA0DEBBAC6B0B0FF049A9CE65A7149944C487917CB825175B46C5E9405B0099541358DB61EBE51042977A1ADF012A0DE20D4F87329485E1052F1D21E206BADA9FE89363708F1E6EA55D942A50EFD0687A7A88853EA260A3CA9035B41272663E4468E
+0A57
+1F57EC
+8F4B31EB
+5879596D6F187A1740FA7AF1CD
+28488C1FB0812C75C8FE9265BAFC1E56805A804E89F6F9135E94E350DD2AE405A2FC60A38D56B35D1BBBFB9E72A7E3CFAF0AA9840F159EBFBBE6757863327C0673850CBB1AF8F722FD18C37D6C6BBAA19E
+C75F9FF8
+3638CBCEFD0AEC9F94409AAFFBA7
+50A16A4933C3E46FFD0AD8E84836170C842EDA547FD30CAB152EA3D9F44B9FADF2708582131F9C4F657DF7474ADEF67748F76E728FB9A2ABD67DC2AEC2200660F694FEBCB2C24CE81E362A4D252545FE440A8FAD79BA7DF2156F29644D8389A7E0C2A11C
+72EE498B
+75DD5B31E71F9619FC937A093530
+3EC18238B9009ACD92307EACF1B9DC6615199B25173161FFAAAB4A6F4FE6BC7335964CD5ADEB99DE3E37EE496D6FCB08B4BFACED50F73A4E5FC310FE0A838D34B45927DDAA6B0C55F7B391E0C4221851FA21CB625A3005B65EDEBF3D44A801DCE6F0078043657FE70C33F56EDC9D7529B156414F8F667CD3ED45FE48F1B7
+C4D0
+784708BB88C5DABFEBBA248188BB0F20F20B0482E93D7E2E709A86C5EF463607CFDC5C8FE76326
+4842C682
+666FE7B5C0D5E5EA09A445684F
+4A27716580E7732FC49F39506432ABF6A6D0CA9F6826D7F176B21D8CF08C192355EEDDEFE15EF34A85CB
+E78EA633
+573F213E837C35A9F2AC9421A4
+6A3FA3F619B38ACAFC42BCA26CC0DA781934EF7F9EE755001728E07CDD33520F81233D946A9A6427147A5499
+424A075B
+C731C317A5799E378324E76D01
+937F9CFEBCC2BE8534A3346D3BE9DA66B399E82599E8
+D8BF9F31
+E8E41ED0C5A2358858ACD5F5B248
+E01621525266E3B7D9C0DB734078690A27A55B42A8D287AA7D4F907893FBF24862FAE46F05320EB9E72FD9F7524742A8E3C590BF2235D6FC86D3A6DD34D8A203031955FD7556988EEF5BCA71CCCFA0568AE0F2A11737F16AA6CED82AD9442173EF45A3200C764914A99E3412A3ED6F53E6F03ABBEE453AF6834EF24B57C8
+7638
+D6DDCC
+B72C8B18
+02C3086C135F1E16A5B5A48059
+28907FDFCB21076EC33D45D16513643C6734751FD8BB1C98A7E1EDF1A990A5A9444A9C764B2B5D1E34B75875C3004BFCB68A64AF9B4496ED31BA3663DAEC8088EC2E43F000952AD35C760E6350C16E92B13DFE357F2B1001
+66CC5845
+F1F05B3C931698347F8DABE303
+F21C10B6545DA965EA11692CE122BDBB92EE99A37890AF75B3244546346BCF255929598E05EB79378270FB816C0D70CC454ED1714F1914E4E74B269DABB7A79AEA707D359DF6D2A27E243E9952B8F5F48CB0
+9089CC1B
+CCB1B70611F6BDE0C5051879C9C3
+C80618377B83AB358FF6D7A890E26254FE21877F6EAE5D59394C6EE13115DC98228176CF9C7BAAB7E1A29BDFB83E1D17D4C7500CC34F8FA4F4D44218D04380777F3662AC4924B172CEA43227941318256AB50A25DBA659FD4DA260B9735532CDFD2AECC827756EF406AEC310B544
+01230884
+6C0412BB874CB41C752BA310AF
+FA57355AA72335C2AD2D9FA6F21B774FDAE14D9317CFF4F77ED5E168BB7183361DDACB95F1886CE8A4789B090FBBF6FD5A9DDAA611FB7E91DF843C686C728A4F5EE252B59772D96F193F0662EB5B3155A43CA86FE3B96BFDA1
+04DD363D
+0D64F501E0E8E8EBB30BF4ADAD
+86EF5BEE17769303B16346A906ABE52012CBFD7EE3B93254C4B757CF9C928BFFF5462C98C95A21F5588DA3C0C080EF04990EDCA56F5592629D83549562204CDD49B80132AF38422D831517C441D3AFD7C02473F56A40B4CC06128D75
+22485A54
+4C3AF983D10893D1975CC77C5D7D
+66DFE43159C54139C3529822B922023CD5F627EC6C3BE74F6ABE5EC23DAB0ED25CD43CEFCA54D5E67FE944A635A4778728BEF16730EE682070AA7BD61C61809A70B226E96C765355D0E43D15FBE7C5268E136F8DA5E98B848FB266ACEA993E5E6347AF40DB4E1E15173E6964E620E7A6E4C183EC03CE356653AD96A90581
+808D
+3E402CD5778BEF8315B615B345C81E6B1874B1BB1C177515E675720B025582E054CB703D43E5ADDD96E32FB9FBAF97
+7E28E2DF
+7B5E5020B7DACF1FF9A38347DD13
+37681126148DF8E0CE52D9EA57608CE93DD69A12720108F45935E32E5A33A4923C8643091A21E5690177219AF0DB5155B97A1D78032F17CF938714A7DE493E7A1493182BA5FF48F644756CB3CB8E2007A8A30F87531D71476372A392EB8CB0DA2F727BE285BA058CC621B8B8AA
+AD517922
+CEBD8B840B8B7813872DA479E4
+279465A664E633AE1452BCE7845EED9FA05D3F0E8B17E2B448B19FF5B9C26F51A64323E985F35C1F03D3848D99B2A7061E982A9C0271056AE4FE0760A72293852FD4FAA892E386185C9F1AB9970A0E08
+FBB52020
+BF4BC33A77E702114B77A5362A
+2A8AA3CACDA1FF1E811B558C2FBACDA8F9F17A92992A9F8EF9283F5D08218EC8BF0B3846567964A8D2D2A3BC22949B339A0AF90503902852973CE5746FF83798B6DFEE3220146AAF890546C5871C1006B9547999247DF781A09CFD2CD77D4024B6860F
+CBB78541
+8059A78CCF11F665699FAAD5D324
+BCC6F790FB1DB18C9044494CAEA8B383C9E2D22CB578AAED1200302EDF93DF350A46DE37BEC2CE6B5A1A220E5F14F9957F4B2B898CCA666A472ADAF978190FADFE6696F9AF4C73D951FD267B50E720A450FC7ED82E0370D3F25F477FC4828C6A5E5AF253628DF8B1C99CF0E4649ED7438F6E36AA5FC1A770DC688D1C90B0
+7B61
+68F2D9830EE3AD2EFC3FA74BF5A41AB50CE38EFC2D0832EEED42B6793BCF678ADAB813
+45638F02
+FC7DA712AFD9750A3598A8A37B
+F1F9C5C0E10DE9CCC3E252EFA11C2D1E83952A5E14F07CBC695BFB37C4F6D3AAA1242FC442A5C7491315E3F854FFD39404DDF49497D9
+995D8191
+9317424607AD4423086618DC9B42
+E3255D9FCFAE985DDA7E7F7CD81FEAA7FBB15E6FCB74B02C8424BC53BE1A4B5482DEE65A7A4436ABB0C862606BCAB5A4A3D6F11DB2876C49F5D68E3F71CAFDE39AE5DF32A5845697518DDE3808462A408D67515810FFCBE04F5ED584AA1471BAA36AFBBE88589A1E0AAB4252489A60D7BDD7815C2C05CD5DBC8CC785F483
+7DBC
+A4353BA5B70F9BF5B0E61A3EE82BE157289BC8CE3BAE54BCBF2DAADE8124A5
+A3A1D194
+D2030328AC1F6F24D85387EC197F
+07C4D191E1410F6EA3D394C8A29A66BA83BBF0BFBE52F2D65212D45782ACE21DFDBEF2D8FB66796DEE13589BE327494027560C5267C2F3E5E1DCFD6E784BD6F81B7D2A51008E77417D51C559E7BD27223BE187C2B0637642274F618F7EE9C14209C6F55561CBD4E8A7D45D6F
+9F54AE2F
+4DAC410D0F84330F04A7EE1865
+6AAC3D7318F702D357D9C6194CADD713B257E575CFBCF7CF0790A86E13C06730844F624257EA710B956839A036E4E3D3FAC98906D71BFA0C15EAE9BB38D39DAA3B45401C6265
+D42D18DB
+AF14B0CA1C5C1B0CCCC336A6E4AB
+567E41FE31A5FC668155934AFBBAA4A42FFB40665AEC8D1FF58B84B10D60564F0D5FEBD5A6F91647F5E263AAF26C2EE7519A85821E4DC22C6832AA28B7FB8307A32E06525C31B9FEB75BC4609E5F5C96C7C80BF2CA853BE75A3326B39F004C0EC6B7594A4261931C1810A3D93C1AEFF2BBA51E3CC790C5
+DA5349A3
+E7B1FDA9EDCC27572D8F3CD66B
+6B62484D728DE2D4CECE5B64A764745F3894DAD789C57779947D49B9527DFC21C11BDDDFF909B1B350D52D511656F4FFB0848CFFA1CA86ED1C14671E864007817B7688E9685A39A02782C9AF68ED324AA8B2455FE159B9
+06328B10
+5F7731E32B06F2C75E04E77FC5F4
+80C8F3032B4159FD3FB40EAA7B5133E6F9C3E501B651C8874F952E065BF9CA149367ABB5D22C8B08E13471DBF18DAC0B3EE942C60EAB2536FF9F8A17C26F4096467B1A708322797745D2113100AE4B64D271058F2380364E4922A24C0AAE8E8811F6B29EBBEBA43DC8E3561B016A3AB5DD44DF1573DC1F85FBD4258A
+B5168680
+2E68FB119BCDDAC6DDABFDDAE4
+49FE6818F8596D155C2CCC467AB372E9666B1AF4ED7D8B42EE28D5B49445A4F001D6EA22BCBC99E006B101302F01A1FC23FAADB163F6679C1801D8E18414397EE26FB5F338
+7C234D23
+143880F791BCDB79912708CB5A
+55F4ED9168E0DD77A95A300742B6768F91D5BE0B827CA923A16996013D08DBC6483FC5F1B6F68623A7436FE5BC224BB3E17401617F3C93C81E240E3AD6B57E0650E3CDBB2A0F2E26ED787D4A70AEC58DAA28C4F1708A3543C6A2660EBCA08479D6C1
+B2E1FDFB
+AD1B40C166253BB8C655BE5D1F
+91FFBA4A5D4D72FEB87571A94A1385DC22A1B168B1056862F3BFF6B949A31B2A651E79F15EB2B31AE861FEB5654980C86EB0A162E9DC6BB990D44CAB0C58CADA65EE64B89FA9091FBBE18AA571C9A2AAADC195FB8D8F7C068E
+9BA34D45
+FD992386075EEE78FF23E035D446
+8AE5C7304FD0373538E52739F0EAAFA2C638419CDE1ED81C27D6222DAC5DBAD56D3C40AA3154CAF73F545877D5AFFE724B46696227D7F93E7AF98088EAAFF290E1E70146C6854852CD8799E87D3E16AE197CDD57A3234D7F38CDA2E987A91689822FDA104E9223B1DD7B25AF145FE88F5DF9A7D3C8E363FD44C5CA8C6257
+0DAF
+CBB687C16E31BFE0833A3BBFE96F
+0164BF80
+90802FD0DF2EFA53CC193C144EC0
+BFA85297F739ED8D5B3230C86C3502CCFC42152CA3612A1D872882382612BD6BF205A69EF0364F06A8057BAC5BCF31A6B84609444FB69F87356804D9171B7703028941F01B5AA6CAEF91D8B1C012B0A46840CDBACF4FCE65BC13C47FB8018DB405A0F707EE2B55184F7B64112CEF3F9651C415E8CD5F71DD1207077000CB
+349B
+F1C6F3D59199C2E0F064E462AFED92B4F0FBC99C26AEFB0BD9
+CEBE57F6
+08731CD363DADA7952295BD5AA1A
+57DC0E95142643A3B260C19D5F783C39B8E0ACAEECFA12B79CEAB503F7170F9F781CBA8FA7E5AD8B4E1A9186421C4FBFA290AE129B9FF887D45010FEE909580314A573B0F2BFB1DF4CB3A04EFB264DFA9A822EAA851BEF3DA51F32EEBE5F0F348F08DA66B35141237B60FCAD88F282587B7F63163E438BC5B4AE6A608FB0
+9786
+18F6C1E5
+348B7066002E8A7F8F742286B3
+620DC94ACD9BA38CD08A079A4E63D9DBE16501587462ED21AAA668141BE36D22DBC20FC9EDBD3FBAFB352CF74E6F027575D30D4A486EA6F1F0FE6935D17EC8
+810EA9BC
+21D46B002C1747D548177EA0EB
+C1EADF96700D2DE2546DD084974F811EA34708B4789B
+E78C69CC
+46F2CF4169E962522E03E02F9B9B
+8774237E71C91A8F
+EF2FBD19
+384A32D1E18FC772917DA4E739D7E7D60C526AEC7D3E9DE0493B19C477719A6495F4
+719F2DB441D578C667321709AC63773E607A43E39DBA2C850240B3A12D65DB5E075E8B0D809B
+FDB9FFC301C9B0167E515207BD2D402715551840FAF1995E2EE327
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0045 put
+dup 3 /C0047 put
+dup 4 /C0058 put
+dup 5 /C0065 put
+dup 6 /C0068 put
+dup 7 /C0069 put
+dup 8 /C0070 put
+dup 9 /C0073 put
+dup 10 /C0077 put
+dup 11 /C0078 put
+dup 12 /C0079 put
+dup 13 /C0080 put
+dup 14 /C0083 put
+dup 15 /C0084 put
+dup 16 /C0085 put
+dup 17 /C0097 put
+dup 18 /C0099 put
+dup 19 /C0101 put
+dup 20 /C0102 put
+dup 21 /C0103 put
+dup 22 /C0104 put
+dup 23 /C0105 put
+dup 24 /C0107 put
+dup 25 /C0108 put
+dup 26 /C0109 put
+dup 27 /C0110 put
+dup 28 /C0111 put
+dup 29 /C0112 put
+dup 30 /C0114 put
+dup 31 /C0115 put
+dup 32 /C0116 put
+dup 33 /C0119 put
+dup 34 /C0120 put
+dup 35 /C0121 put
+dup 36 /C0262 put
+readonly def
+/FontBBox [-18 -209 919 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684274A4A9876BC4642DE5DECF943C06630BA10
+42DEC8514ACD3F0E57627ABE
+75639369AABE52E257
+3E1F97ED
+8DE2F2377C433C6C8D8A851E1B
+210C3AABA60D0EED97A80975BF65DADDFB8F4A2A23875A
+AA2209A0
+3855C9971CEE343544DDEFB609
+2A54D21380C6955ADF83F23180DC726C9481EB65E62953B52ED6
+2974D044
+C14B27E3449899901BE3ED3B06
+0EA6EEA504024DE250CBF1B007BE5F9C38AE699A713FE35B992F8001E8EF13E2EEFC7C9B854105715EB78E66B8023BE18EA8F4B2B7BA
+EA9851B3
+37B2274C5CFBE2021206C5B83051
+BC46076F74069655CCB7CF8240AB7CB31A688748F482711EF61C72D5436261071FBA3494EB6360A1BFA70C1E165AAA891FD8293968F4C9E76C4B35225F605A98EB4C53ED1EDD5FCB8AE688FB83BB154A5AB5CFFFB8529ACCC39B4C09830DCBA805A3F2BF11C44656852A0C
+1A14083F
+5CF4695358364C8D82CFEFD1AD
+0E56EEB3A65259DBFF31BEB89BAD909AFF1D3394640702A4DFA60C7B334CB616D8722BE919DCC359CEE3F37EB1793360C7B5F5149E1D79209765310DBB3FA0ECC2FB305D18FFC821F91C02027A2EA1CD70BCAFD19038AD
+AD2A2AA3
+C4F2FB98D27CFAF77E6D6F7A74D9
+85BEC53642D9E974CEC0A7D93743E0CD07D966205D4F3AB387FEFB68379E4EAE93A0300DD701A5F162D779D4E2C3A42A4612EE9700C79BA641A392A3D735188D3CCEC645AA29A84BB84459744A0DFB523BC244C4B9AE950555C99B4D79514BB9AAA943AAAD72BD624CE6D5D17987
+D5B84C9E
+C36508D90CAB0E7F80553CE425C1
+502DC3E1E1792E6463592C585F28611BBF58A68491B2C884E7109965A5B7062FB080A71A44C893440622EFBCDD63454F2CF29221E3EFD155288577CBB5B5122521269F0DB2294F0DF87E6DF3AEC2CBFC54E37C2821932B706E1DA153253551A55CC09E4A
+89B879CE
+568F5DA98E55359138B2230FB6
+89F0DB5E8BB9660329580E6680FE422B391FF0CC8280B1BFEECCC86A2397E71F709CBF23413EAD42CD24728FE0928572E8C176A477F5F4ACE2A4299870F6
+C31D24AE
+B2C91B0A2A5C8A6E1B1FA13E707E
+88CBC5B260146D3902E81B71ECF793972DE34CC6D3627D9AC2ADDE679DE766870623DE1288419120E9E1AC53283503A01FC4B97107B90C6C2D2279AC3E110890FA32AE73C1AA04C1EE370C8B4DE0FA38AE86FAF1D444B20C783D82C382CFFE5D364625D2F68B4F0AEDA61D5613
+E7FC30F5
+9FD8C2119D72FBE6936CBD583D
+A8259E1191E8A663233B08DD4D66DBE7439229972A19DD5EC206A342B6DB01F3DB74B4B6B960DA64E86FDB5EC6987EC5AF4F5F1C3BACBABEEFA20177C9BE4BF1AA138D29648E017355F09EC2106C7C1707B85D6CF23BAE4872B23F3F1B0A9A
+1378BF3F
+8484E0391E0A47A0F5CAEB8A21B1
+D95224B734B5E7A6F0C4B62A3BFA37FC95C47F47D8454840A37157FDF2FA7CE74B5429F6980FC4BFCB4BDA45490B0D1833F9AB3482EEC21E1C1C204DCD623628199D8E0F30CEE7E8287D092903743873DB90B4FB99F658ED7ABC6D34336E4EEED848CBBE6AB4296D25
+A8FA404C
+06042BCCCFEC6ED7F137B67C1619
+5DE9D59AA6FE9544C9E727BA08CF7F4512078F9791615062721F7C73AC331054F33701C353E9862EF8A37B1FD888C79FBF1AE1F215F2EBA19C5C7B763816E460EE9BCDEFEB33F7F771D6A599FBD073B845F2199ECEFCDE0749D9DEB75AD001669D900C35
+F184598F
+91047C55C3B29F1F8556C93058B9
+C90395986BC5776DD035E3E2AFFF8F4367B96462A0E7EA262D9614749CF85C81A6F5EB5986E3A2D108D8DCD727CB6F02161EB81378E304DEAC4E4DD6A6C8055294C12A8D011E3CB158B74CB76F525FF06EB6E6F86A680B373F8688E0A7E97A3E3FF4C7545F602A61839907E5C66E015CACA46AA5875C8190ED8DAB4F7EEC
+FD52
+96F78D02
+FA7F7BAD3649CC69725256DC9C
+88264BA95E6D0CCA16BB0A31DA67F2429763756D03C293C9F189CE916E700C021DE20384986A65336E644CC6E0873109FB0A58916475122D46A068F928272B610F3CCFD159D5B81DF9
+7E91B0A9
+0241689E9FB6EE7E8EFC8371D3C4
+FEA5ABADFAA8430B05CC675DE1354615C2BB5DA4A2C2D7FDE23C5169211C99DBF1B2AA37EA67256A46F3337F64A1DF7423211909D2693E20B50D1A3A8175C23C984C0E6E5565DCEFF50EC97A272E565F3E5652E609A0E1D42A17302A614A310480ADA273509F0B
+DF6CF029
+CC0F5014F3531968888F3EE21D9B
+D24B48E473F36B58E57EA0EDBF6F010ADE1204F631649B9B29A9B675AF569BD3A606249211C2F40A112471E6C68CB376EEFD63AB3458E260ECBB3A01F37F2BD1FD0D5F8093B35E967949860FFCBE295A5D277993AB47C8D843FDD9B080EFA0A9539B8AF5EBC8AC102973F4C02E52563944A0A9B335DE60D0BCCB511ACCCF
+DBBF
+8A13B5A2
+251CBED8
+A2ED2C06811635A2DF964E0ADE
+352E5C7E210DC2DE4ED54688089870C435C03E61BB2FB002D39B117DE94F73D7A057B4B654702CD54099A241776154CC6D2E85959BCB278894D0B596529D6820D15F573B3AB25C538A39A9A4233E4924F75A
+F4F58F34
+232DAEEFEEFB9BB598306B44A7
+BDD35F63DEB1B12099DEBB9FDF08AA954A6FE34EEC23DDF4523AC6242A85D3EA3872A7A923FF8F7F9315655EAF311CA4847ECF4DAA0AB46B05F07CB24708C8938213CC2E71EF1218C6979B5CBB4ECFCE74B1CF474864EE405D75A62E
+A6724258
+220627708BE0662914CA44A739
+2D8E791D74BF203C818C28ED5E70B4D989E2420EF9EC2C37F850FEFB277B3D8FA3F54F214ADB9E708ADF93E8A678D7F413E30B5B1F62506BEFBD3BA5725E752BAACA54FD3922CF3F7D207B6935B7BCF291CB74322DA59E9667059EFF97
+9DF53171
+38473CE9889C5B26B7B4C5E0A129
+5DFA75CC872DC6DF45C96036937D3CE2B9A7D25CB4706FBFB2571B947364960D80C5FCF417590570C60A04B205D3D341FA2EC795E082B461E98976001F9F196CDC215535092D1FB0F81DA8029CB1D109A1110ABBD970DE9EC769C8279CFEC0EC459D2DF50405F5D01F775C41F19C80C6AEB04FDE845F23098EE4C235DF40
+9B16
+64B89DF3B13E0D5C4935A5F0804846207FB493C2F7C64D79EB2AF8B4BAB959E204205719BD
+FA66D04B
+90E94087187D6794DBB962B9F111
+E663E753226CA8221C1A969F93361198F826C617E13857E96D73D7163AD9FA3E251A0E2B011D75D5D2E5B663086967FC9C2A17C5D47E802734CB5CAA44A3F4EAA49DD654DF9742B6C8770F3D93EF652A5ABC03C91AD7689DB11098DF663C949C8DD985D314075E38
+5EE8F0F3
+4C1B8AF1696B8CDC32F880A6B2
+1DE38CFF6F5611ACE1093110063D6A7377E151711B48B04C456725E3EDB015AB57A42558D8842FF6254F969BE12C36EBD8380152151049999CF9ACA60A49B94910D9D7B02401B837E76E294AC51A
+A6613ADD
+C1CD9E59BB5AE1C722377F01B283
+971E81896DDE849DDADD059184945A1413F00C99BE6ABB8E77D072BADB4AA4B7A6C36D94BB4A178FC8616C274F2610A0FA353E53246E94716368121CBBC6A44A85BD1AFBC688379B86FE7A68A1432C85DE7569C8429C1D495EC64EF3C37AFADFB44AE516DB875D8132562DB9CFEA0D2CD967666F77F787045E63324C6868
+089B
+5730
+3840FCF0
+DA611902C4B1DA13F17CC71FCB
+5081AF3DFC01C344CA0087B027C1B62A927AEFBE465E536C85931F6680849E025FA406EFBAC3E9728FB92FC2684BCB5E2FE4C836
+CA921B44
+01FFADBA50A8AAFF87FD65ABCDAA
+308258FC70AF079D8174488718EFA557AF6BAC3518B66C0525BD8BDE64D6CB173867D2E8B5FB1436E6BC03A1183028162D07402C7A41CFE1560677DE409A54853B8BA2FA42BD9FA04C144BDE7DBA3D55B7FECACD0E49F644F5747E3F8FF1DF6DAFEC596B227CCC37FD8C70882F531398DF2F1DAEDD5439A417F06B9E302F
+C724
+C1E722EF79BAD297B7542C383866264A3BB6235608B9D4B8B0F0FD35
+B9722447
+642F3E1FB157615B725985685735
+F0B0A47BD808394E6494E9F3A06D56B3A3DFC9BDBCC82AF0BBF87A52C886DC278B749BC73AB9C87BCF02026F319566786FAC402C3E3BB99EFBAB69C8542CB492909FA683E9481F1EC99A7E94D8AEBD5A7F5F69706DA6343BC5BE46E85DC0955C9B022C35AFAC14
+75798FBF
+065026241B43C328C2D9899A31
+07DA4861AC99C7774B80A4ACBBF30A3FCE02AEE805B396D5AB7D2A56ABF1A8260867C066141D24EC978E94CB7155F4239B82319BBA119E326AD5BF86A88D2C733C375F7DE470
+F5B344C0
+F19E9D53A93C84C86D0DEEB425D3
+760296EEBD2A677C2DD01BF51DD42AD9B47D387A22AEBB8B9BFC2EEA69BBBC8E21614D2EAAD97CCF8B8C56A3E794AAF9C4AA569EEAA1015DAA5D4A6308939387CEC2176D9ED01461AB18AC0FDD751FDB310D9E68EF363FCDBCC25A188B94D67499E32D77CADB0ED1B800FB2629189DE9A8
+BDFD3E6E
+19320EC532FA037E0B8192F374
+63DF15E750855B5BF0080E64D9E228AF33B9393E2E68C16C14F89B8A94F3268D4B095EEF907E17E3CE055117F9F447CD8214B3ADC2B7D8F98909794C2AB6875FC40B60A520E141C52075FBC371B1A7B45973480548884FD352
+3E99B270
+FB79EAB05D06B8F65161077533ED
+98A070186669D72E1FD6375085E99CA938F9FD742410F04939540D52D5CCCAA9F4680FA63BDC9F59C3A1DAD2291AD50950F36AB681C0DA2599239C2419110E2FF85DFC6B5D0E08702D3CB6A151A5FFA261F7E86DCDF727553572FF583CF4E0CA93A21D1770AA3824C9A285CA4D4A574CD019A81F1B0AEF5581
+F720269F
+E6258C909A64B439EEF7F57BC5
+8432C12D1873A424130BFDE43C240790F497B8DEE4A970D2DCCC089A381FF2DBF00601A8CD7EDD8491ED377B8475EDFB18509CEE727B8897F15446BDEDC224303F25EE25
+19196417
+3E0E0F6D96426144C39A44EEEC64
+39D7AD0860F9CD6C488B1F32C50ED2962BD727197370FCA9C8B0F8827BD435DBA6720A5B652FA2E31EEF503758836069C39DED4E2E7029F998A6E60CB1D4B6CE7E1E3654B3A5D2D7F9B915A9408DEC9FF4F80B52CFD4B13B94C7D7105E83DD12966576737CD67FC5AF78C5EF0229E4190A326B2EB55538A704A6A060E418
+63C9
+3BE193BC9087BDEF9A5412
+0BA90677
+EA565666A5EB2FD0A71F8430F7C7
+563E306B1F5A6FE5F879B9F0A9A076A41815B55F82DD35894926B2F0913656BA301499354BC19CD4065B3E8B08097894CC3129DF4A2C4E2C4EB463BB4553C5B398A6FA828DF69653D6C9A18FD2BE7CB998EE117121F9D7B8EB9F4C89D51AD6EEF18053988F7F86BFDDDFEF3D4ED0DBF59B37E3A55FDF070D99EC4F0E2B2B
+6608
+599E66DE6A92E337B61677E8C0BABB95E72D70C44071
+D3C8DA6B
+D346B4C19D64595D0B844860A45F
+F4F28683DB3A183686E73B1D29D45ED73AB1FC3D70FAB2940F322602B5F6B68337AED9716EBCCFBA7EEA207B281C138FDF13B9562762B69BFCC435F6F08EE7B290AEFAAB817070BECEAD9F4829690EA81D6FC7116A99B86E11786F6387BF3EE1044DC695CDD2B42FCE8441A68D61F115115BC9F8B0E9C89C44D60C28044E
+93E4
+96
+6510B60D
+53F70CE8A06F74CD8D49CF7407
+34665C583A5F25FBF57FE78CC2E99387A19A92255C36A44A
+63044DC8
+D5F24C109D91F8A20247D5A26906
+47943BF7A26C6336
+27F39DAD
+4AC678A2B9DD7E4AA91278EE45A5A4D837EB63B87C2D058898CFB5D04A69F2044A5F
+903AEB0234CDB5E2DECC5CF4472DA25E7227A9E3E9923774EA75D4EA04816061355A5F580DE4
+3E3A342E374BFE75F5251FEC1617669C214D575E917182F88F8DEB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchi
+%!FontType1-1.0: PSOwstdutchi
+10 dict begin
+/FontName /PSOwstdutchi def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0097 put
+dup 2 /C0099 put
+dup 3 /C0100 put
+dup 4 /C0101 put
+dup 5 /C0105 put
+dup 6 /C0108 put
+dup 7 /C0112 put
+dup 8 /C0114 put
+dup 9 /C0115 put
+dup 10 /C0117 put
+dup 11 /C0118 put
+dup 12 /C0122 put
+readonly def
+/FontBBox [-144 -227 513 728] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268425D38D48EC7466FFEBA5C7142506D78DF24F
+060B3D6F22F43C1605F7E610CEE0
+821C68FB13C01DCAB5D07ED3C9CA63CA4581AEE2EFDA66E4F9CBF723BB2C2673F2B11B7D38F02CC9F9A2C6025D8E959DFA89E9EA116A6AE1B47510D60570DEB71EE01F57DA8765EA6503F97F935E60A71E32AC94455B0EC0E65CA33F394477EDCB36A8E71070AB03C6DC21B89D580BBD51193BBBAE3DA6B767ADA66EF889
+A4B0
+F4D4CA8F7F808E66AE66AEB842
+06E2C14E
+2BCF8BDA455D135FA82C81845D
+E64C387FBB5DC0824E803571D4BAD4983C55C9B9C16EBB89BDA0CBEB648F02BFB0778CFABF59255975374030831E0055E4F8068875E953D8FAF8D32643FC8CAC16DA4F5DB515F675F1809B0B76C64C18F81417F8582E6B543D0A1BFE7A02B169
+00A88C47
+34AFEA5A92FECC14AC93C3B35853
+7D4D860FC0836A48D3770FDDC48D85F4DD624A95362F64A568EBBA4A127F9EB054F1759C4DC7256FCF470FCFE74B794CCF62359A11D5630E22D79AC4F98F34DD8FB549C504CA9E401891F3D95D7D5DCB4585E8450714A6A0CA2FE7B7728E9F125215E51E591F3A68A8889ACD1DA57F13FA466577873A009802BA7AB076AD
+8560
+FAE23309E6FF404FA1585DBF6AF8CD0E0CFE39E344D9255E016858FA654467B7D42D1DE4ECBFF98B8C717BDD5ABA7C59
+B475C574
+4D209E659E9B5E366D041A3144CA
+A1C4F19CB0023291FEA07365F07CF7738D0AC14DD6436FC6F663075C1CDFD5146A80F4D957DADA7EFF03136161F0A79B59CB4DFB02FAFB580788DAEB7EFBA0CC7F33981F9E13E0205DED63007C617D87AEC422BFE7085F18F8DD419EAF49E4F915F984D96B
+CDB93259
+DAD462AE15670BA4F64F891D65AB
+0E87927B961BABC2ECE37D681C6DF5C3E4B1F7386FD77B1090DD3588A6470303531F67608D92C8F7BB7BF16FE6E25BBA14B081F0C4912302770008ED3FE26D869D5718EA356031E6D37C4317FE704931F22401EE21E66F4BCD03B253DAF492F1E53EB5DC96CD54BBD9E141285A834D867E453DB9BE063FA3B1
+2D74D564
+E138D2A61EBDC31A1E861CEDEFB4
+941ACB640A72FB436C6D0210B0B491D1A083BF079DE47EEB82E3FC37B1F87168F13AB56BC4680FC5762C50B979B3DAE6C5CC91A2E5DB4F7366F09F510789D648FEEB6844E5EA7ABA57D7470E43D632B49DC47B2709B00A9A5911B2EE72D810F415DB25EFC5
+B35F5298
+F7C857DC0A9D01690311360B4D3E
+D785EC76C6F6D5B3C716E1060B8CD5283ABB1C437C5A3ABCD48B31D93F9426B01F9680D57054B179C5420FA65A53FA2CDD572E1F9F8B366DFB91D1A722EE31E49B54F7404DCD4E381D167B3C8F35ED9A38F1B2441968D7956339F35CAB79D9591CA038577D5A8437072B147E14DE4786D4AEDA03AE56EB5EEB65C5AF19AC
+71C0
+6A6980D6796C034FD5220781D694EEEFAEE2B52D5C362BA61548EF86D24D2F1F43C1489BF7249051DF5A
+DD44F25B
+4B0E35A6A7AC1BA699BE673E1D
+7C76577E47CFE52988087C8B909757CDBA53637740AFEEEC3EFD95CBB63DEF39239B53D245EC7443519F9807EE54C76E3B010EB49F5EBB64529EDAF433130ADA45A229E3B32162AF317B14E40CAEA319DC0B56467DBE0C5630FA6E
+4D8AF23C
+0CE4644E9B2AF0823F2FD580DFDF
+477821A9F078DFB8D17F61F80F4BE7658B9A6ABD0E198622FD862D0334F216BC7522AB29136EA62870E8F09AD786865DE2D309C113C453E8B51E5FFC50D560C80955F4C4A34DF47EA1CF5F5F88338EC0CE802B9ECAF81E70DA5DC48A9C62AE59C807A45637E12E4F398E011E670919AC8D3DFE37F03B
+38EDF238
+9A31D413DB2BF7F5F84F7668B9D7
+1129FCD5BD108EA1E835D7C1715061ACEB45BDA632C0CAF9E5FDF65F16015FAE4D7F78A76DCA2BF357BA802F9E8C00E0516C0B2FAA3133BA1E8749765C1CCDF061ACCC56B86DF5E0937F6428CC95EC555A43EB999B16CD10DC628485835A334251082A78D99C5FDE1E39D51A9797389B5AF4B06B282BA42E98F3FF8C645F
+F141
+B422667D981C65ADACB0E0355B51F759B3728A1E63068B
+0CA42B90
+F20E1FB9EC24F448BC16381A96
+F746C29080AEA0259522E6917CBEE0303885B82170F141A431BB19C043167DFA8FF6925248EB21A1DEC82159A1C720B2EDCB71A3ED5F98E4B6431C7375E3050C86B22E7323CEEF20E39AE02108C13D0E9A4B645D2D167B22B495
+2EC0729D
+9D8B405F22013D3E566CD037138B
+3294CD511AA7DA0A62618ADE291928190FACF84E4279A51D19E0C8706719F33A7B154EC9F36ABDA3336740BA2187DD329354D4EC65262F8059925C075ADD54F9262D033E212183BF2C02EC0541A06AE76815E22F9B161298C5569AB74031974F223294B589E58502D080EB3A06FAD1BAC9D6BD7AC3D9AC498AB63F7C0AC5
+4BB3
+58A47FC6D4A3695B5C
+E4E5C5F6
+DB7A68DEC5A750C70F5EF2579337
+B95BAC501DC9415A
+1B1CFFBC
+98ED8FAF7CA22B3F3E6760CC8FD2E7191702A30A8D64D30FC543F315604BE6760BD6
+01B4C2213CD7C9607CD048991841D11DABD216A2512CF4B0E43962CDEE9A1E31FE5A38712526
+CBED0843198973B3B25FB6DF65BD6344A2E8D20F440BF07B991114
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch12i 12.00 /PSOwstdutchi newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<1524322f2430250a010b010c242d22272c20302a01252e3001142420313330282d2601152432352e302a0117> 2207 558 0 7384 -1 s
+<2430252e302c202d2224> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0809> 9346 13385 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13267 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13267 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13267 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13267 3 7133 32 s
+wst:dutch12 SF
+<062c> 1589 1431 0 1940 -1 s
+wst:dutch12i SF
+<0b01060a04> 2033 1431 0 2495 -1 s
+wst:dutch12 SF
+<312432> 3177 1431 0 3432 -1 s
+<00322724002b2e22202b> 3432 1431 2 4234 0 s
+<0031242d23003128382400322e00> 4234 1431 4 5335 0 s
+wst:dutch12i SF
+<0b01060a04> 5335 1431 0 5797 -1 s
+wst:dutch12 SF
+<00213732243107001d0e242520332b320a002b2e22202b00312e222a243200213325252430> 5797 1431 5 8895 0 s
+<312838241e> 3177 1676 0 3582 -1 s
+<0614> 1589 1980 0 1967 -1 s
+wst:dutch12i SF
+<0b01060a04> 2033 1980 0 2495 -1 s
+wst:dutch12 SF
+<3527282227> 3177 1980 0 3703 -1 s
+<0021242720342431002b282a2400062c050031243232282d26003227240030242224283424003128382400252e3000322724> 3703 1980 9 8180 0 s
+<0030242c2e3224> 8180 1980 1 8895 0 s
+<31373132242c07> 3177 2225 0 3835 -1 s
+<001d0e242520332b320a0030242c2e3224003024222428342400312e222a24320021332525243000312838241e> 3835 2225 6 7801 0 s
+<062f> 1589 2530 0 1882 -1 s
+wst:dutch12i SF
+<03050809070402> 2033 2530 0 2642 -1 s
+wst:dutch12 SF
+<312432> 3177 2530 0 3432 -1 s
+<00322724002328302422322e3037003527243024002f282f24310035282b2b002124002230242032242307001d0e242520332b320a0031373132242c002324> 3432 2530 10 8825 0 s
+<39> 8825 2530 0 8895 -1 s
+<2520332b32> 3177 2774 0 3595 -1 s
+<00252e30003227240032242c2f2d202c03040022202b2b1e> 3595 2774 4 5768 0 s
+<0631> 1589 3079 0 1847 -1 s
+wst:dutch12i SF
+<09050c0409070402> 2033 3079 0 2712 -1 s
+wst:dutch12 SF
+<3527282227> 3177 3079 0 3703 -1 s
+<0035282b2b0031243200322724002b2e22202b0031242d2300202d23003024222428342400312e222a24320021332525243000312838243100322e00322724> 3703 3079 12 8895 0 s
+<34202b3324033104> 3177 3324 0 3900 -1 s
+<00312f2422282528242307001d0e242520332b320a0031373132242c0023242520332b3200312e222a2432002133252524300031283824311e> 3900 3324 7 8806 0 s
+<0619> 1589 3628 0 1882 -1 s
+wst:dutch12i SF
+<09050c0409070402> 2033 3628 0 2712 -1 s
+wst:dutch12 SF
+<352728222700212427203424310029333132002b282a240006310021333200252e30003227240030242c2e32240031373132242c> 3177 3628 9 7923 0 s
+wst:dutch12b SF
+<101b172200061c1a11171b0006112011151e111a000e1c121813201f> 1271 4014 3 4215 0 s
+<0b0c0f07> 1271 4362 0 1866 -1 s
+<04> 1870 4362 0 1928 -1 s
+<00> 1928 4362 1 1960 0 s
+wst:dutch12 SF
+<001b2d2836000e2e2c20282d00192e222a243200322431323100203024002d2e3200222e2c2f282b242300282d322e002d24322f2430250021370023242520332b320700132500372e33003528312700322e> 1960 4362 15 9046 0 s
+<002c2420> 9046 4362 1 9461 0 s
+<39> 9461 4362 0 9531 -1 s
+<3133302400322724002f2430252e302c202d2224002e25001b2d2836000e2e2c20282d00192e222a2432310500372e33002c333132003024222e2c2f282b24002d24322f24302500202d23> 1271 4607 11 8241 0 s
+<002d2432312430342430> 8241 4607 1 9113 0 s
+<0035283227> 9113 4607 1 9531 0 s
+<060e0e161f1b15131c> 1271 4852 0 2649 -1 s
+<00202323242300322e00322724002c202a2425282b2407> 2649 4852 4 4732 0 s
+<0b> 1271 5156 0 1434 -1 s
+<001b2d2836000e2e2c20282d000e2032202630202c00192e222a24320019323024202c003224313200030e111f191a180f0b14040028310034243037002c332227002b282a24> 1434 5156 11 9308 0 s
+<0020> 9308 5156 1 9531 0 s
+<1a0d171f191a180f0b14> 1271 5401 0 2724 -1 s
+<003224313200243622242f320032272032002c24313120262400212e332d23203028243100203024002f302431243034242307> 2724 5401 7 7351 0 s
+<1a2724> 1271 5705 0 1631 -1 s
+<0019282c2f2b243132001b2d2836000e2e2c20282d000e2032202630202c00192e222a24320019323024202c003224313200222e2c2c202d23002b282d2400352e332b23002b2e2e2a> 1631 5705 11 8926 0 s
+<00312e2c24> 8926 5705 1 9461 0 s
+<39> 9461 5705 0 9531 -1 s
+<3227282d26> 1271 5950 0 1733 -1 s
+<002b282a2400322728310a> 1733 5950 2 2552 0 s
+<02> 1398 6254 0 1504 -1 s
+wst:dutch12b SF
+<00031c1d20031b13201d131e14031b13201d131e1400022000> 1504 6254 3 3692 0 s
+wst:dutch12 SF
+<0e111f191a180f0b14> 3692 6254 0 5071 -1 s
+<1a2724> 1271 6559 0 1631 -1 s
+<00061200262b2e21202b00222e2c2c202d23002b282d24002e2f32282e2d> 1631 6559 5 4632 0 s
+<002831002d2e320034202b282300252e300020001b2d2836000e2e2c20282d00192e222a2432003224313200202d230031272e332b23> 4632 6559 11 9531 0 s
+<2d2e32> 1271 6804 0 1572 -1 s
+<00212400312f242228252824230700122430240020302400312e2c24002e25> 1572 6804 6 4543 0 s
+<00322724003224313200312f24222825282200222e2c2c202d23002b282d24002e2f32282e2d3100203420282b20212b2400282d0020> 4543 6804 9 9531 0 s
+<0e111f191a180f0b14> 1271 7048 0 2650 -1 s
+<003224313207> 2650 7048 1 3080 0 s
+<062c> 1589 7353 0 1940 -1 s
+wst:dutch12i SF
+<0b01060a04> 2033 7353 0 2495 -1 s
+wst:dutch12 SF
+<312432> 3177 7353 0 3432 -1 s
+<00322724002b2e22202b> 3432 7353 2 4234 0 s
+<0031242d23003128382400322e00> 4234 7353 4 5335 0 s
+wst:dutch12i SF
+<0b01060a04> 5335 7353 0 5797 -1 s
+wst:dutch12 SF
+<00213732243107001d0e242520332b320a002b2e22202b00312e222a243200213325252430> 5797 7353 5 8895 0 s
+<312838241e> 3177 7598 0 3582 -1 s
+<0614> 1589 7902 0 1967 -1 s
+wst:dutch12i SF
+<0b01060a04> 2033 7902 0 2495 -1 s
+wst:dutch12 SF
+<3527282227> 3177 7902 0 3703 -1 s
+<0021242720342431002b282a2400062c050031243232282d26003227240030242224283424003128382400252e3000322724> 3703 7902 9 8180 0 s
+<0030242c2e3224> 8180 7902 1 8895 0 s
+<31373132242c07> 3177 8147 0 3835 -1 s
+<001d0e242520332b320a0030242c2e3224003024222428342400312e222a24320021332525243000312838241e> 3835 8147 6 7801 0 s
+<062f> 1589 8451 0 1882 -1 s
+wst:dutch12i SF
+<03050809070402> 2033 8451 0 2642 -1 s
+wst:dutch12 SF
+<312432> 3177 8451 0 3432 -1 s
+<00322724002328302422322e3037003527243024002f282f24310035282b2b002124002230242032242307001d0e242520332b320a0031373132242c002324> 3432 8451 10 8825 0 s
+<39> 8825 8451 0 8895 -1 s
+<2520332b32> 3177 8696 0 3595 -1 s
+<00252e30003227240032242c2f2d202c03040022202b2b1e> 3595 8696 4 5768 0 s
+<0631> 1589 9000 0 1847 -1 s
+wst:dutch12i SF
+<09050c0409070402> 2033 9000 0 2712 -1 s
+wst:dutch12 SF
+<3527282227> 3177 9000 0 3703 -1 s
+<0035282b2b0031243200322724002b2e22202b0031242d2300202d23003024222428342400312e222a24320021332525243000312838243100322e00322724> 3703 9000 12 8895 0 s
+<34202b3324033104> 3177 9245 0 3900 -1 s
+<00312f2422282528242307001d0e242520332b320a0031373132242c0023242520332b3200312e222a2432002133252524300031283824311e> 3900 9245 7 8806 0 s
+<0619> 1589 9549 0 1882 -1 s
+wst:dutch12i SF
+<09050c0409070402> 2033 9549 0 2712 -1 s
+wst:dutch12 SF
+<352728222700212427203424310029333132002b282a240006310021333200252e30003227240030242c2e32240031373132242c> 3177 9549 9 7923 0 s
+wst:dutch12b SF
+<08> 1271 9935 0 1399 -1 s
+<1c1e130005> 1389 9935 1 1872 0 s
+<0f0a00050d09000e201e13111a> 1867 9935 2 3324 0 s
+<0b0c0f07> 1271 10284 0 1866 -1 s
+<04> 1870 10284 0 1928 -1 s
+<00> 1928 10284 1 1972 0 s
+wst:dutch12 SF
+<0010> 1972 10284 1 2147 0 s
+<2e3024000b> 2139 10284 1 2648 0 s
+<1a14000b1713> 2628 10284 1 3384 0 s
+<00322431323100203024002d2e3200222e2c2f282b242300282d322e002d24322f2430250021370023242520332b320700132500372e33003528312700322e002c242031333024> 3384 10284 13 9531 0 s
+<322724> 1271 10528 0 1561 -1 s
+<002f2430252e302c202d2224002e2500222e2d2d242232282e2d31002e342430003227240010> 1561 10528 6 5017 0 s
+<2e3024000b> 5009 10528 1 5509 0 s
+<1a14000b17130500372e33002c333132003024222e2c2f282b24002d24322f24302500202d23002d2432> 5489 10528 7 9461 0 s
+<39> 9461 10528 0 9531 -1 s
+<312430342430> 1271 10773 0 1820 -1 s
+<003528322700060e0e161f1016180f00202323242300322e00322724002c202a2425282b2407> 1820 10773 6 5806 0 s
+<0b0010> 1271 11078 1 1618 0 s
+<2e3024000b> 1610 11078 1 2128 0 s
+<1a14000b17130019323024202c003224313200031016180f1f191a180f0b14040028310034243037002c332227002b282a240020001b0e171f191a180f0b14003224313207> 2108 11078 11 9526 0 s
+wst:dutch12b SF
+<0b0c0f07> 1271 11382 0 1866 -1 s
+wst:dutch12 SF
+<0a> 1866 11382 0 1924 -1 s
+<001a27240010> 1924 11382 2 2517 0 s
+<2e3024000b> 2509 11382 1 3025 0 s
+<1a14000b17130024362f2e30323100202d00332d30242b2820212b24002f302e322e222e2b0700133200283100282c2f2e3032202d32003227203200372e33002436202c282d24> 3005 11382 11 9531 0 s
+<322724> 1271 11627 0 1561 -1 s
+<00302431332b3231002220302425332b2b37002031003227240030242f2e303224230031242d2300302032240022202d002124002c33222700272826272430003227202d003227240020223233202b0030242224283424003020322407> 1561 11627 16 9531 0 s
+<1130242032> 1271 11871 0 1803 -1 s
+<00222030240031272e332b230021240032202a242d003527242d0030242f2e3032282d26001016180f1f191a180f0b14003224313200302431332b323100322e002c202a2400313330240032272437> 1803 11871 13 9531 0 s
+<203024> 1271 12116 0 1562 -1 s
+<002d2e32002c28312b242023282d26070010> 1562 12116 3 3129 0 s
+<2e30002436202c2f2b2405002e2d240031272e332b2300> 3121 12116 4 5214 0 s
+wst:dutch12b SF
+<11192111231f> 5214 12116 0 5818 -1 s
+wst:dutch12 SF
+<0030242f2e303200212e32270031242d2300202d23003024222428342400302032243100> 5818 12116 7 8894 0 s
+wst:dutch12b SF
+<201c15132016> 8894 12116 0 9462 -1 s
+<24> 9462 12116 0 9531 -1 s
+<131e> 1271 12361 0 1457 -1 s
+wst:dutch12 SF
+<00252e300020001016180f1f191a180f0b1400322431320700132500372e330020302400262e282d2600322e0030242f2e303200200031282d262b24002d332c2124300500372e330031272e332b230030242f2e3032> 1457 12361 16 9531 0 s
+<322724> 1271 12606 0 1561 -1 s
+<0030242224283424003020322407> 1561 12606 2 2723 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (14) 14
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0036 put
+dup 3 /C0044 put
+dup 4 /C0045 put
+dup 5 /C0046 put
+dup 6 /C0047 put
+dup 7 /C0048 put
+dup 8 /C0049 put
+dup 9 /C0051 put
+dup 10 /C0052 put
+dup 11 /C0053 put
+dup 12 /C0058 put
+dup 13 /C0062 put
+dup 14 /C0065 put
+dup 15 /C0066 put
+dup 16 /C0068 put
+dup 17 /C0069 put
+dup 18 /C0070 put
+dup 19 /C0072 put
+dup 20 /C0073 put
+dup 21 /C0076 put
+dup 22 /C0077 put
+dup 23 /C0078 put
+dup 24 /C0079 put
+dup 25 /C0080 put
+dup 26 /C0082 put
+dup 27 /C0083 put
+dup 28 /C0084 put
+dup 29 /C0085 put
+dup 30 /C0091 put
+dup 31 /C0093 put
+dup 32 /C0095 put
+dup 33 /C0097 put
+dup 34 /C0098 put
+dup 35 /C0099 put
+dup 36 /C0100 put
+dup 37 /C0101 put
+dup 38 /C0102 put
+dup 39 /C0103 put
+dup 40 /C0104 put
+dup 41 /C0105 put
+dup 42 /C0107 put
+dup 43 /C0108 put
+dup 44 /C0109 put
+dup 45 /C0110 put
+dup 46 /C0111 put
+dup 47 /C0112 put
+dup 48 /C0114 put
+dup 49 /C0115 put
+dup 50 /C0116 put
+dup 51 /C0117 put
+dup 52 /C0118 put
+dup 53 /C0119 put
+dup 54 /C0121 put
+dup 55 /C0122 put
+dup 56 /C0262 put
+readonly def
+/FontBBox [-25 -238 920 766] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268421901DE48B643CFB857CFBB85E253EE2EA5A
+17559F68A849A879FFBD0B99
+CFDA88F0C12453164E
+1381B4F5
+F516C6F24D6DE7BE4AD031472249
+C8FDCE5D99A8876BE1E0B7DBCAA7A6A16B2C2B1442F344AFF480F183FD3CEA05D17301E5D412190BF8FF06F9ADA8C89133677A3F164413905FD9AB232FF3C6B152617DD5761B867378214F80AF7E62AEBAFBF0836DB16F3960A45518711600B2A7F0D4D3DBA8E6A434DB5F632A30635BFD7DE018796383481D79347B713A
+5962
+877DB4669C7582257ED3B462
+1976B18A
+1AEF6C96D49B30DC740E8BAB3C
+99BCA591DF2CE87D3A586BE404993C4DC7BAF2B70115880497E4415EB5BDB708F530BD1F3D5C2466494ED9AF30DFC02224510ECCFD60F89245
+E84148EE
+681035A39D4F4E3507B45966A9
+F6C2FDA06F52ED7EBCFAEAE063AA690A2A3BFE314FA254
+904F693E
+8FF817ED4FFC49C4FA62F4E106
+93029CE0458D8498685012CCEB60A35E91259AB2FFF5B5CD8D9BD2C1FC11FF
+CEFFB33A
+F92FA3F86485739A6DE0D67A43
+23F17D91F2FD682A1241B16EA1BA80DD92B2A33317D88D8E1F45589C
+EB961B94
+1130DA244FB2CAB32F84058A6B
+27BF3542D510A8C6A3D88A9A2CB1BBE59FB86AF11356826CB75B97B9E10037D29BB666F3EB48DB322065A462BD44EC61C22746546CDDF74CE1463570B985A710E4A6232727643017DDDF
+7E2F6BD6
+7FC059460A53F1D13DA9DCE374
+762E175D1DC9902BED3616E9AA88DCB1716B9994B3B4FF08EA5EC0A59516830495E3BA6F27E2EF06F2B3F269383556DEE76B3FE818ED5B80E2B3299EAE3C3B
+224A645D
+C2AA0D34159223DEAE327779008B
+D866C81AE4E7B60DC967A227C95BC85BC2BBF75316CCE0B973C32C39810055923FD68F2772DEAE34572ED7455BE063F45DACF129AFB104068FD14060C3EF05AC2FE417B6F7AA5B0934B9A4A7DF6CAFBD5B2DB90880893BD0716E6D0B9D356D8939A356A5DD2389D17D33C0143EA690
+C3377356
+41C4ECE026F123907087585797
+FBD853402A0710C0CB4ED296B0FCD096834E6B1EA7C41A80C2308E901CB8741DB77C7376E94C9E55500C278BB7F7AC8761A910CF60B8DAF6FFEC
+452145BA
+4F366D84FFA16E23DEAC2807EB
+52000FA916ADE759A97FA0226D1F9A6425C93C76DFFF249CBC269907545514508E9956ECF54F4575853DE8871F3BBDF82ED5B6503E379951F78348E7E4EC6FAE349C195589A52E7BC8FEF1D3BE4FE81E87B9A8BCCE27D0A62BC55B754226E8A14A
+561BD522
+89E08D480FD79AE287E59FFD88
+E0AAB56ACEA3F3BD00480802845FD214DDCB84B47740018D0EC86531DD09C1DC4DD46F83B1C245D96CD3F0BB625316A9912D8D85D0DF
+1577571C
+2ABB86D1DA496F1EE94A5D3FD3
+AB69E24750521F2EBFCE36C20D5FDB03259E2AC31C312B2B6CFF91F54E83A3064CE1A16435B8A9
+88215A71
+8E16DB48AC2B891D18F17B7ED3B1
+9BBC746D69E319DF8609EA7DFE97E75E00F07B9EC9958AAE0F34105B803A936891282709D3648E68553CBFDF029155B88854AEADB97B0DA0BE37210308365507FCB3658984E1F49F45DBE07CD6D17E054342C67DBA79A000BF10DD8E92FF3872BCEA27B8E267A7E43520B4F0B4D5EFB5348052
+BC82E2FE
+E6CA3DFAC9CF5410816CBD01F527
+175A702D092C5BBEA26C941CB7F525CBE6D6ED51D2E0BFC19E5E5F2EC8D0A0D85F4F7F7FBC5D9ECB3D78630701AA6E048F78A308BFA7DEE0F26106125013C7B8A38F3BB231ED9F29A8CC799AC42278DC63A04842FF782325879240F898867AF83EF329AB38087421426A3B2EF42957D91D146C210FB0BDC1282CD928A363
+6E37
+14
+A42B9855
+4FED3944A006133841DFA29EF3
+8C14A7D3B7A1A3C366F7C4474B5E9C2DB74CD41E975FC38CAB8A3FA4A1CDD92712697098213C71B189AA670AFB81F0165F008E0AA0D03B4D412BE1C1003A988D64B2FA717E61C783FEAA9B546EBADF8985C6470B6442F9A634B139D14491F59AE1AEA3
+E5DEA381
+ADC4D7FDDBB2219E03CBED0FEF53
+FFB91E2198C47E366D9A6F8EDD6D91595E909384A91B3A9F5953AA7CC87C6E039A139B35D5AB150FF0EA34141D4074423BE3BCF948F3F7AAD392CB420947CABCB0DD5869808E29822A88B1941D41C3F22CAD41CAE00CEB769C8F84F0EBCCE4FE03EAA16C61CC9D81E3BFE88A8597CFB4E2324F832A9F6BF2F3DAF922B9EB
+EB09F556
+B71F064245AAF225C383E6B58BC8
+79DC734D45CBFB9585C9CDD193AB398F4AE178C252F054EEC92D3FFA71EF841D6862A28E8BB986B4D5C161D0254CA6E1E9CB9F18631F5AD250CBB1759F400FAB5B1E33E461AC20B18ACBB3F4F056AEDF2176B2434E415005EF7F406A9AF6AA832B64CC7F36742697CA
+DB08E330
+C5258F71F179A69BFE7434649308
+0868F56AF2AAB58F0A963C75B4450EABCEFE79B2324883F4C6EFF630A0844D2F580F89CE2F0F42BE178D9DFCD5639F8B884F3F7F34AD227D10D207A94BA99DB9783E7581438452BBA8E8D6A28F8047E164948AE956284F529988685400DD2A048CAF7449CC8C778C8285DAECF2B0D42B48710E5301F3BA08DFD7658E38B1
+BC19
+03E5A28DC9D3D7033E9340
+3E40F0C0
+E91E25234347F01FA9DEC25650
+7EB05706FA6209D6E2369F24C48C5F8EC52021E621F509CADA1EC786D913EF014E53D79E58851DE7178D341F151749729159D885A11B070F2D14C1
+43C85962
+B6C670DCBEF1DF8F89E7532BD1
+9CFDD6922A308C89AE76052F7C19796A41C176EC0491CF1DF619D98A3D5B139A2F1DAC467B23EDCB65E0B3F77F59E9B153F02AF7A3686372F9014A7249C8FE4A4EE455BC4BB487
+0C2E4786
+F12C3A13DD8F41167C78D210AFD2
+C02131252A27CC86DD32EA41D422DC1C6A086F6345EC036935A7D0C26DD9319625196C6ECFEE10EDAF316370F30F1D8C3B42C0B59AE473BF9A6F4BBD2815982FD6228E1A36483B24FEA8D49479280106C1F3DEF7FB845B408B4BF328F7E8DB2AA301218E28D21A3536F586940D8BE1
+6EAE0339
+2AF2B5A4DC8C53A4D0902FC0E9
+67F6DECAE69AF376B49B123527B8BD71BF3EE792A440902F494EF02AE6D62F49F023EBEE6B18C276C53409637FCD490536B9ED9A2EA32EDA9F33EC976729746D82C7CCC9DB4B52FE87E5CE00DB276FF33A377621A37DBA97F955BD15
+63D0DDB3
+C1956D14FC78E8C9BFE8E93797
+1E94C01C00CD75EBAF34C4733DF8C7DC7828F624CA4DC102E8014FE9DF7E5C8563DE27C695A71C31507A29561F9A1ACAE063BEFE18B806F88AAF29FDDB447A08FD3B6DAC5FB00402A17808E9AA7F3548D9BFBA
+03C6BFF1
+E6740F613683B8DCA8F2D4A26A62
+D71FAF1F74FB29294C2D5ECC8EF7A89695287B626D6D6300C0E3F7D9C39187B84B04772A21BF493A63D2B611949DAE6DF8A07A846F5445EE46BD91E77760E1197E61C57060DFDFF0AF011948FC6F5E45A902A8D4F1DB8214BE836BF8832B536B66BDAFE7139D49D4BE70
+A932ABF2
+98BC149705173B1C401E96881C95
+C05D865475A327717B9D098B7489C9DA0E215AFAA3DBC93B24DE941042D0095271568AF9F92E4C0AAAFF16FACC0D27C8D7FBC6106D3A47A2C851896E611CC3C25BFF7ECF87CFC747C3CE7515010DD546CDC89E230EAAD5A1AEC6F725A2EB5847BE7AFDE6158A28C8C3BFF32BB5D3FF4DDD5DC92337FABB089F07591A8FD9
+0BD09A5E
+47D050BB87B3A402543DE8B0B205
+3E697EC9D0F579ADEE8FA501D42B072EB1BC1AE8CAB8029886548B7E76778FC006EAAFB2BAA87F9CCA5E77046E2BDB1E07FB77C4B81F87F15FBAD1E0806F4687FFDF55CD35C9E3EC8E6BEC0B4B5E433EEE6772F475EF43A12C750066BB6808CE397E85E429820488A1D2B5243272EDC612F3740D99514F3137E4265FAD7D
+1657
+B23415
+0FA5CCCF
+8186B35862A55070A8A5F6565B
+966BF6501389811EB9AA480738D33F22E512BB6679C4EE2CEC5151E1257C784B8AB00AB8740A3B592368FD2A2AEA2040EA0485911087EBA3BD658E2739802F6D68BC84405291DD9E3666CC547DBCF989CF
+A9B6C04A
+6687D53465F149789B9CC982B6A3
+84D354402A55BF947C0BD62DCEDAC75A09B76F8A00D8CD992CFDBCE7577BB6C6861A90FE16D880C0BA929B5C2A9B7079B16F09DCEFF22596BDC32AA2278242F06F69EDB8EEC045BAFE92E6D6E683E14D836D3D49B49A2BE53B16FE56DBBC39A3103CCF4D
+9903AE3E
+1AD773D8F242D05AD34FA65150
+7C6739FA556259D8C86796763A8DC2C2A4415446C77658A6850C3DA7D20A74BCAA01BA3298AE094461C0
+016DC2D0
+7A0FED1F850E523CE25CB6D949
+F4FD9B131393DD0C78B1B73301F887CB49CFC1D5138E0B60D1231E03F9D818ACCFE2F034FA301F11691EBA81
+A3D0172A
+87B0A6DF995708AFC41F9E8C66
+735C59EAB8324160A9909A265A5368017D408E1A4440
+8F353740
+E58F04881B7E47AA4704638DF7E3
+599F62B09BB75169BDE3ECD1C5DC21738376A2A76308B9E3EADC2F73D110265F8838B1C6FCC1FEA151971C72217F3B69EF01A43DB1225CF39A7AAAF54A11C7F649B03D3248423C234EB1AF9E0F1C8E6EF548C4ABC71B6AE21F7B7041CF3C6C38BBC832E748492169FC99CA94FC8001C9B422D4D5CF032ED680E920EEDAEF
+40D9
+4377A6
+31C4DB27
+F5F59B1B07DE2BE93AADBE66A5
+3BE748C467DA6420B7232709DA26FF96F3BF6914F58FCA8B2B3DE8416508125F1195CEB3207B4D291329D234E73A23A02EC693CD2EF5BAEBA1CA9BDB41B28A684E7DFEA6B0E2A254397D80472E3A38F1430F5579A97E384A
+E66EBC81
+F2E75F5C32752341799C9CAA75
+8C3C211FCA6F9D763A537B0DCEF74494EC0F04F1981DD57A829BA7DA6B3199F4770469F6AD5E6D3421734B093E2A9B98015C9723A43092FA5E259C3F3CBFA15925467962538798DF316D75557F8A79AC971E
+D7805385
+B271931A447B8A6B0F89BD26D38B
+CBF23B4C7AB895C924048A648695E6F770F6B94DBD35C882969EBC345B80A8623C116028AB976F714146042A4148165ACC7BF18685B69A903E453B52D4E0C858F0196FFB198EF916EC07C5143AB59D4C3DCB034B1A72021EF3082A4D2D45C1E959B4EB23F088853E6AFEEFC23AFC
+8D4D3D1B
+A8950F1E6DA8B05799A9938EF2
+36F4147C9EEE691463FDBC69E1E2C4FB606FC048AFFB9D8C9A77331842BD805122BEAA352596AE81677D1D83C8DDFCC9F2CF563C1CC2818CB700203E97D0251037B750A8A28C98A644FD0AB70EFADB2633F33E41C046D370A3
+7EE2008E
+9543EE4E4CBA55F951826B7786
+F35D21E39C76EBE51567680002B2366DA4C5FE5E53CEED09D86188572CC44E2E3BF88CADE21B1E8698BC1612E9E7246074AB1993E86D53C39A1C9E01E48BCE010A5ABE5C09885A8B2FD52E217839016636755374469821CC776D8C89
+25969416
+CF6290015A29599E9C793A259DAD
+2B970B9D3697C2D6D8E47A9C49F1DE6AD759EC65191C21106357E8AE2E72CDD82A160BBA28780E48330740A0726B97578617817118FEBB2DCE5191B7549365D8C9D6F48536D741E4504C32742EE76721857B875F8D5485B6303B986EF1106ABCCAC601A23FEA740D7AE9645423C1E65F1DB4682A07133AE4F454859D5FF9
+458D
+5BDEB2B01913B7A19390C63AD5F11BE7395C52F8B0ABE40449FF23D1B36A41F940CD2AD0AB7C5FFCA1850192079F47
+D314A789
+6EA87D3C70403C6EC618DF7F0434
+C9599D05F6F20B3FBC6D8B79955A201FD8A6B70D702D1A5C87BF335A1D98ECD9158FBA7B3522946D3F1792EE7AD780D3704D2ACC3B19A02E02FD9430CDF6EC1EF353158665E2E2D44E7F3FF89AF00F681A7525FC1DF823F60D107EC2060DD80D0DDCCB544C3C112E50E4B2B237
+BF8FDE83
+41ABA79D9CDD8313FFFC82D1B9
+423D48BA655790FD2875427B1E8B77F1F7A6E1CBF778AF9A244CEB1EF11D7E002CDD62C088CE16882B0A4748E8699D319ADEFB8CDBBD153CED4AE91A94FA9157BC0B4CA6D3B5A26570DB539103262952
+D5F421D3
+92CDAD1AF51A3020446F74529CD7
+8CADC41D0AAB87D3868671AC502647755F56C29888C0D03E78FD41D69BF8DD9AA5C75FF911226A5718CC14F9825A6DCB0514C23EE1D15E6FE6313E3951DB2452EF00B6D9C3B54CAC016D9039447C0F8E39BD25A1BA1C00A30621512382C286CF7A1097338F3759E8690B79622A1FDFFB77C14069452064D1D959BCB50628
+5656
+22D7871F4D1D2FDC8CBD0EE1E427546D7C7CBEECE0F2A80145BFFE8308C115AC32F7D3
+D3496E09
+E26DC9818C824D6DB1B8DC46F0
+BD3A5958A31509330EC2F5FC7FEB26DC4F3ED3F0573C2D45746EC64D530F9F0AA0871AE720EFCA9522D5283F67E52F63BDC164CEADBF
+2FF89345
+5BC876EDD5348E984D0ECB88228B
+DB94B48095C064C5267DB98736C292D1EED5CE889C5CAAD85DEAC1D0083A3DADA73DA2899DBD16925C401E3ADD7BCE40A778AD7FDB6DE82B77F6855D3DC3945F0796DA9E1D2519C8B6539F4EF42D5366687A8F20C9A749E59A6F1875FBF06B5756F946F1F1830691811DF8176828645DA8ACB0309E8C7AD34470B2D8D318
+94F4
+05238D72E5041C48FC89EE2F41658E11F4A0CEC192992257FA02EB93531A5B
+38640A50
+29A2FE6B94C8E14A8BE5A7AA9D45
+889CD4D61D670591504C23BA944BFD70D45024E76E905011BB6C5A88980D2BE786CD2EBF52F0663180F616B839E23B2B2C2E978792E298C33493F837AC42808D6265E965F6204BFC44E82EB39857E5B87C70096EF49BB8175287CD84ED6884446B8C06ACFFC9BD199E4E74F0
+C704D343
+61C618DB298612274E6005BEEF
+F3FA45A31004E015458E7FD1BA12CBC53C70186EB5760CD04550F5627D4078B775D13B5815EE064D9C40E407CA3474698BC4AA6CC667D65CB33411EFE73A7C82EDB3CEE72F7F
+8B55BE19
+72D81CCF66F5FB390B0E5D2261A9
+87048B8D32A5A2072234917F3DCFB10FFDDC9268086E3C93ADDE3AE4BDF5DF0206C5785EC481993C1FE5D5EC04B9A2358E94579A99AA67FB4BDCBFA0200EE09E3D5D72530D8CA8ECC78C91AF3ECF2967A77B02AA277190A75C7B3E1B99AD9FC98AB744000B18D193812E78794C6CE09356FC84ADC51027
+3771E506
+0310CF6649032C3ACACD0019B1
+0BF800040C1288908B6A53B236B0BCAFB60696A3CE07CBBA0F0F50E9A5E827188564053EB122CE4FAFD25145430A549C7053DABA43BD9D66FE842A88ED1915BE1D717046F4600DC4DCB2396FE8CE13679668282908907A
+7EED5B5D
+14CDF57FA3405DEF1B517ABF3F1E
+973E8B4F99D868710D6B5C4A6532CD9BA37824D2C618F15764707FC2B6E7BD2858F8A60DA38702E4551BA2AEADF55B87611FCBB18BCC94CE6371A97DEA56658214D337993DCE61647E356FECBA2BEB2894C44D4A8537DEF40D055BA35F3C71C504974EF6C7E3186F85D1653F5AFE31EC854FA6EEEC879585D4BE8C71
+8F396EC5
+388A3F5FDFD91E356A0E66A45D
+BC1BEE2AC7161E7642BE86635875DBE5AD4172F4786A4F282EA1E51623F5E96BE0899F1714F2936A7F9510A968529A1AA18E34BFD52012A49A2C6FC4A0A28E4B735BC9BC2D
+E8B07CCB
+057EBE9A7757398AD1D1515964
+B4D13ACD5BAF2E06AAC623B06A721A039BF717F290A4E3F37000EC7D947947914A494D50480D634FABAF3AC72559A56894F1277B3FC0A186F16E4EEB338CF3914661041263EB4EDC60FF18ADB2B5C9CA5481B80A32AAFE5187158245E638BA46ADC4
+AB1EC1D8
+EACF7DD8F49D75BACDC005CE38
+BD1FA73504A7AAC94C7E1DFC3A25EFDBB98FE0509CC4EBE15FE60D28FC0FA5C8B0DFE31917DBC754E9C73E57A3F9125D27646E1517B2CCF158AC0DA16F83A6963DBD56C55E73E91DC34D07AE15D237DE8D6D339CE5CFD3CF02
+53907499
+D40A49EB8C8EC4957FC65BD25D51
+283D153DFEB6F30D77707624319596B807DF66B0CFF00783C33E92F59000EED9BC6C209928BCCDDFF5B290F4EC1F3A405983E6A9BE766CEB9DF1A429FD1EE98542ECBFA7720E910FA90EDA6FAEE00B53B24ED4ED5ED16CD4C3879CAD8F909D4C5E41110F9C97395FC312A8866EB5A439A99AB860A7CEEC680068F2E352FA
+E748
+9333E06E5EEC3DDD6331887184CE
+D9228814
+547D12A1EF0440023348800DD13C
+04021FC95AF192B70DE52CB7487EAA6B53538894E836780D47DFD0286E1384972CADD6EC07E61904446C9757A6C95DA676D4F970D88FADD8168BC525A4CC29C06C1B36654D4C9476D7EECF185F302159F5B44E6753B83B9FE3906ED278286BC3599E97DF00FEE4AB27C7835E9C64DBFA9483B90ECF13AF3F1299816DDA36
+3D7B
+189ED8FF
+A913C7D0BBCC7EBC7172934E2A
+0C643BCF0F2335EC7D9DED6C2BBC8861AD513D45628FEADF89D8C4D6051B1CE9B050C00C85A0439472B7D51C4D76B9788AFACD196FBB3A96FC346D376F15A7
+789E161F
+BE6C384DF2DF38FCF8D5E8FC13
+3B2DD912A8D46C7E063ADE810E7700B3E1CCAC41188E
+A1429C5E
+9641FD389499D089DE39A527EE40
+BE9CDE2560C07632
+79018100
+47E5868AEF14B265D6BD41D8A198B9BC52ABB458E5961CCC4F498423226EDFC7DB93
+03AEF1A9257D006C04857721960CEA54EDF271F128AF2C52C06A1606E9B4D68B8E700035D917
+8803A499EF55D4D876B20BA0A9A9394DB687D24D3AF7E42841C8DC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0045 put
+dup 3 /C0047 put
+dup 4 /C0072 put
+dup 5 /C0101 put
+dup 6 /C0102 put
+dup 7 /C0110 put
+dup 8 /C0111 put
+dup 9 /C0112 put
+dup 10 /C0114 put
+dup 11 /C0116 put
+readonly def
+/FontBBox [-18 -207 755 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268425D2FF1A9D4C7BCF55FDC1F91B21773209FC
+8852C3885A612BA738EA66E3
+05A8046EA4F9161C30
+234E9362
+1F9FC67A2D9A6EE1A74DF4431D
+B3E8171FAC9BC11200E5AA53FE5CA210E8A7BF4545E8CE
+A4B05EBE
+0C8D97F646D72B10074625B586
+3BB09F2D5CC2175056BEA0A3CC52B8663B9CA1FD75C9EDC98D11
+168EEBD6
+5948852F001FB6D0575A506723A8
+F726BE1B5A9848A7543BF59367A1358E5FE8CB9DEBE43B7DE9D71575DD868ABB7A6BD17E119B5899FE102703AF10B1679DAA95D9CEF8BF827C936B6A8E1E9E2E7E7C64094AC562E5C1D6133680A384E32ABB8F6EA5F6CC76DBF1111B3F36A024CA1B6A6ED02EC50C4822AC52940F61474A0D64452B6395
+3A82C6C4
+5D59EBD6F30FA999718AFF1C80
+468551E88623360ECC2D2A7625BE31014FE4751EE134A0D199BBE788273943C1A1A1DB20474160ADEF0D02A14347EC3869322D2D964DE9232BB700B42803C2B7CC30089A2A8026521B6E67D2F9827FC25A367404E216B958BF959070
+2511ABF8
+5D8E0E5637116F529957FEA489
+603A9D2379814827638E307682290BBF549024534313DD3E1FEE98FE592BF9942C450FEF8295DFD3A87FD8DB242152DDC5E4F66CF7946C7B2CE27C018FC6EB7E2508007928567FAF9A9AB9DDCA177CF4A73685580139F5E5BEFE9302AA
+00C98A56
+B1E17450F2D88477820F67A99702
+382701CDCCCF0E1BC5CBD19C1748B524DD494141D1798B0D07D743AD19F8DE5CC52C6B0476EDECC3BCF642BF5B0B679884247F7801AFA2F325BB0DC455CA743B771BCA83A7EEC8DC504324D990C08C28EBD2A3C68217FE1FD2BEEDA772D33D928B8C0437C685D8
+8A0E0943
+1928F44FC7C20F1B5285DF8F0B
+1D342FA4B8D1D566AF978B127B1D2482D00926DA5757D393FFEC1627ABA8EB6B2D1C642B3F38A763C4B22343F13922C34A435C3D23123E337289E314A0CE78857BA08AA6AAA6
+A1BACA35
+44105C34FD97FF3F49FCA8E50F91
+A710D45B1E95B6E1E93EE3C23E639485467F0E48569C1490670F710E7A0A87470DC7D9D6D27F635DFB943E034ABF3F4111145F55B9AA565AD2F252DD600B603E68C4EFAD3CEFF58A82035B283A0CB9444175366FC63C44C984FC75214A35D318DDC270B93F34A9ED406D8C13F13F6471F6
+0889F70D
+21EFC85E529EA4AEDA7FCDC5BF
+FCC5CE9CD53E0D9B2329ECC82AB796865423778E2337A40857B9C38063D95E0A3CE1B8560668D89F6B3EE8B27F3AD46207923E6CE28D0A6CFAE8CCD03C9782A08447265D3EED11497E24A677ADF508FDCE30336408DCD13012
+C8EDE006
+F289FF887E8581D338343E2368
+69175728BD7ED8DAC0585031F1B5301A38EE3606AE39E17ACCB312F2F18D90D6B5846A1ED648D113FFB18658A3E62BD43CF3F08F354A5B6645B64F095184DE70FF976979
+F2BB3537
+99B30B0B7EFE15040AED558439D9
+7094864ED2E137D7
+7BB63603
+1E358B07DD6CB3C7DCBEAEA782755FECA0BF7075B50A2244DC8F2977F1A7F4C4E0A4
+89C3155C483EDC45BD7446F004CF9F7285EEAB1842C485C210B2C44603A5EE7BA6D6F45F4066
+0CC152D9DE264E35D8F5025AE3EEAF238D28174DAC2FF31554CD64
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchi
+%!FontType1-1.0: PSOwstdutchi
+10 dict begin
+/FontName /PSOwstdutchi def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0065 put
+dup 2 /C0076 put
+dup 3 /C0097 put
+dup 4 /C0099 put
+dup 5 /C0100 put
+dup 6 /C0101 put
+dup 7 /C0104 put
+dup 8 /C0105 put
+dup 9 /C0108 put
+dup 10 /C0109 put
+dup 11 /C0111 put
+dup 12 /C0112 put
+dup 13 /C0114 put
+dup 14 /C0115 put
+dup 15 /C0116 put
+dup 16 /C0117 put
+dup 17 /C0118 put
+dup 18 /C0122 put
+readonly def
+/FontBBox [-144 -227 757 728] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268425D9A4327DA39CB2DFD7488DC30A83BD6536
+5400151DA9825FFF379210637B99
+935074B545C1A5C13FFAEACC1348307F174F895D76BCBF7965B7DCB5B082F069DE386D78D069FB93DD5CD4BFA0DAADFC8682C02512A70DBDB31A49677C7A8FCC67E34E13C533B4253F276D65921EB10FF73890B81F03F8BDE79EB4D111EC23E565F37FD577368BDB8E58D365E9139B8E12A1
+A7A4A58A
+F384A30B3E3767B2431A9D769C
+699B9CDEA8198DAC008AC8228194C901A9BF02DD5DCC259E6353D113A9ADB64E95C8920E2FB3E0C5145EBF50C696BA2E53146DE6786A4701C3C3153B22F96EA72B58111C7D3132997ABB39486926AB0CAA568501136BEAE7D2F0441BA10980
+9A071058
+0B68B0AA1627A124CCF7270D22EF
+A230C26150698367032BC621F388E26D6407D18779A50BB1CC4CB9881CA10F85E186A71558B2C9AD692949FAF427CE3E035080592876220210940030FAC364ADE6B6E9F194633E7B89AFF9FE809C588E73CED5449BC52AC4A481EFCC906489BC53475AA53A1853ACA2505FD7068E7EA50EF30A2D5833A65BD03BFF153810
+8EC1
+ED69EF8547CD07B3EB7CFA6AB8
+BE09152D
+51F6892698ABDC3334091B05A3
+BAA49FCA67C1FA7DF8342862F613C53C4DA30E50AAA9309953FA4661E10FB8A7E875185732BFE1CAD4E365437F3713DD8E758CE8742A9F5276ED3737FD164341054A787D3CC02983BBE577C3DBF9CE397DA4B83F414862225667A325C4167DF4
+05C98E6B
+7173DB23F48C32FBFC4820BB0849
+0E8968CD77D45CBEB87BBA39A691A4F0DF172B1AF3451394F445D0C3F097C804FA59FA043627CF77E371621BBE34C843B3121F0EB4E9D57F91EA8B73235639615ACF10E80E995495A500BF377ECE8BCAD46727DCBEB42AAD8843AE7F1064CE8BA03AE5D78F22487ACC261250D2C9AD3852628843DF3888A20370E9D379C9
+0213
+716B253D1993EAB30DBF387300EA197B2A7C31946A0D08516617DBF1B8FE5935AEC8717F5CE24F441276B25748BD37C0
+ADFD96E7
+C71126B2517D1A882E286679AE5F
+800C4D68726E47342C573E4B699D8A82400660F64141364C55019273AA419880B5B2B971B4CC2563F957D7B684EE3ADE692F1AD119279CF7FAE23535FA212093F9EE286EAC8103F0786ABF1EF04C89B92DFF6262F47B7BE8427073FE3D604EEAAC626FFC35
+FC54E67F
+8AAD6D1CA08E26A9AE3E2B65D787
+32C40F1F33B70B4008DC7A9D82F67974F0EC755D759325DA9BA8147E61DB6EAD4616C0176591337F39CB3D7B57C9D8FEE578A19D7FA99B2C0286CF901E044E785690FC928E3FAD28F70A639406F37377AA12D47C82A1CAA16DF640695BEB6517013C9B71C9FD4D07D116825B371D139A726B4573CBD87DB562C340F75D21
+FC26
+30FF873A778EBA1A701FBA1816DDE2A8AFC0E2AB0DFD14E4751A2E
+E5B2CD31
+2E559238780E7CF35E5F33821162
+3CB5D6A537C056F50E06815E454C7AAC5F7BCFF028221857AEF47FA3E32F0253A44294F97E969C1C389AB0B0F9346F00F6994ED18888DD7B1A178D6038F2985939D28FCA87B92F3B3284494E46323221DD03EC50EB26595D47B9C12E6D620E36016654CDF20B2D6F6040196CA47F6B80EC5D07A03F9D0B59E8
+FA11C883
+3E5807138069DF0F759888C7611B
+6007BCEE4B2C3C269A2FB2185BFE14C9B7E7E417B7F4B7F40C483E72119D68314B5333E3F5AA0AB72C8035EF1E64AF3A6F6C323F300FC33E519784253137CF949CF855CD9D8D18EAA2C6952A0B928E57AA01F1AA0ACFE8B9DEAE5C7F353E5F830BEBEEF8C5
+CDCC1E7C
+424CF43A041F0FDD02DBFC8B9FC5
+64104A1295E2BC1EDF8576D0554B525ECCE57D1DB67AF07EBA89600BA5AB71A96B0A5A7E4F7799C070D2692C70347456ACB60A2889DCE7137A5CCDFF49DD716C87DFCF944E23D5ED87BAC6ED6B152FE726786182FF61A1A19D1FFC5B9154DADFE13CB6B599596AC96C724D170103B7AE9471CB868270CF55BB8ECF3C4C99
+FFD3
+4DE9C88E5F3B06DD7861371B0FB7C55F35D051F25918B04513998FB767A9E9FA0E28FEAF037832CF19FD99475F6C5394EF3405279A037F60DB6881209904AAA12C8C6DB35199B898DEABB4
+C4918D64
+A29845AF6BA2BF7F1C25AEF923
+E6760935651ADB3E8732997455AB32B84D7717C2D14A1E3955238BA4E07C71B7856EBFAE2726EE7ABEE2AFA28D9CC5E9A2D5211AEF3D0FC24E23CBA7C64966C6E1D77A4739F43746D9814B7E64F142FEFA5D75ECAC348C8D4650F845EC732A
+74C6FAFA
+4CE8FAECB66CAD236483227C6499
+DC4E6DE18A8E9A6F2F0D83D5AC82EED27C69C35A90EC5D54E5FBEB240F98DAC8F2644FB13F8313858196D6BB306DFDEB07598F8435C70FC69561828D74BC3A1A8667146CBB2C9F26AD9FDEAB2BB2BDDAB80B69052F7E0531C359F359E4F7C4DBBB8D668DECB0053F9E0B7A7F5C35138EC6D5AD5671289A9647BFC4963D2A
+E9BE
+F23B56FF202E085371B94DAC6DF5B22E3CC27BAAEBDBD4B79118AFCC83029D7C0182C843AA87F4FD5FE0
+19C528DC
+569A100938186474BC3C34AC97
+C66C21F4BDA0D79251AA09D6F83340B7C26E9852D6A7A497A8975B456DA2814CB5E9EE0506CAF09D84136C4E07C958115B5555F4EC89AB02BDA4127E38449B610794D9E5A2955FB39B9CCAB336F0FEEEBACF6488B100CAF76966DE
+58ED9DAA
+224DE5784839BB3268C3F6A0304C
+C43B7F5617912543AFE9CA0A7C234F58CFB31CE145628D0B21C4A97CC29CC8797AC8A3548163FF25B46E3FB749FC7083E6F74C9E1ABF7AAA13011E4C7B90D056725BCD7C280E26DCEEFDE5ADFE8B88BC379EACEB8E92A4A68EF1DAD55C9CF30DDEA2A6BFED92B943754D140A276E53A14330A76F0A2B
+660A3145
+7C8AFBCF05A1CDB98DFC2B984B
+99A6CA7E82E57948A7D03D45EE6853EE2D36536B298F035F9B271B76DC1E3731010B632E53D875C3A61EEEE65AD71560E97F929607D71DC5E0E092EFA963B0C1D5D0E685B661299F8B6A638F0F4C6B3095E8DE4C365BF0
+A0185B85
+D156428D2B1EAD61BF3598F9B314
+A48BBAFF188D0979EA77D1967D26C5347A82E402179E1E0DDC13172E6385FFEA98B2F469F48F6344A439F8714F45532458B250A8335D5CAEA07453E4562544DA7C35233BA04F2574C1FE5A1E12D324D07BF5AE0E3C315223086D88470F06B820165D066C80F44B308FDE4AD561E3BF22553F896E4B66A903A0BBFFCB59F2
+00F9
+26F28AC400E6431894A20A735327647A013E9A5DE55C3A
+4981F41E
+C9FA75E284A93D0A8CFF45E41F
+467519534D48916FFB23EF22E7D6CAD659D318A3E764C2C5E8A26EC233228CD21E0C017EDFABC58BEE2A395ABB3E31155951F568252546C38062F59A883BC9225A55738641F701178F78A7499317C8817F26112375AD2B5C2F8D
+5FE55C60
+C8BF5CBE396A8B10402F42E04AD6
+51074A7FFF252E893B4166D55A1AEED098F3D05BDF8634A48A8C43CAD5A657A3E6A98DCFDCD1A3DB1BC38D973C9B370FC5F5656011879481E81EDEB89A7E300D0C5FC9526773038F7B0FA18BF500BFE91CC0FB31265DFA576E1881810B1E744A75A796A9DC49545A6447FB34EB4EDEBB0C4DB17C966DC923EFAAC6D058A1
+4A12
+11EA9F5AB5A9A4BEE9
+B557E1A8
+66C8C225B79AAECE9CCB465AED57
+BC4ADF0601649337
+80CED7CA
+E762332340715F69F2B221646C5117BDA091E531BACB65BDA2C4D79B691C907FE5FC
+D81EF9A286D5BA4B9F4B532E412DA3D95DC8B82914596A8B7FC1D584B0BF7462F2A45F8DACA2
+23CA33D7958CC29198C216AAB0A1F8779C7320199C867EFD8E1802
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch12i 12.00 /PSOwstdutchi newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<1725322f2530260c010e010f252d23282c21302a01262e3001162521313330292d2701172532352e302a0119> 2207 558 0 7384 -1 s
+<2530262e302c212d2325> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<080a> 9346 13300 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13280 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13280 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13280 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13280 3 7133 32 s
+wst:dutch12 SF
+<1c2825> 1271 1431 0 1631 -1 s
+<0031292c2f2b2531320012> 1631 1431 2 2610 0 s
+<2e3025000e> 2602 1431 1 3120 0 s
+<1c16000e1914001b323025212c003225313200232e2c2c212d24002b292d2500352e332b24002b2e2e2a00312e2c253228292d27002b292a2500322829310c> 3100 1431 10 9147 0 s
+<02> 1398 1778 0 1504 -1 s
+wst:dutch12b SF
+<000308090b0307050b09050a060307050b09050a0600020b00> 1504 1778 3 3692 0 s
+wst:dutch12 SF
+<12181a11201b1c1a110e1600> 3692 1778 1 5395 0 s
+wst:dutch12b SF
+<0204> 5395 1778 0 5737 -1 s
+wst:dutch12 SF
+<00> 5737 1778 1 5790 0 s
+wst:dutch12i SF
+<0d060a0b0f06070b0e0f> 5790 1778 0 6749 -1 s
+wst:dutch12 SF
+<13253025> 1271 2124 0 1736 -1 s
+<0021302500312e2c25002e2600322825003225313200312f25232926292300232e2c2c212d24002b292d25002e2f32292e2d3100212f2f2b292321222b2500322e00210012181a11201b1c1a110e16> 1736 2124 13 9531 0 s
+<3225313205> 1271 2369 0 1648 -1 s
+<0421> 1589 2716 0 1871 -1 s
+wst:dutch12i SF
+<010102> 2033 2716 0 2467 -1 s
+wst:dutch12 SF
+<333125> 3177 2716 0 3479 -1 s
+<00322825000e> 3479 2716 2 4014 0 s
+<1c16000e> 3994 2716 1 4538 0 s
+<24212f322132292e2d0015> 4534 2716 1 5581 0 s
+<21362530002d332c2225300021212b> 5585 2716 2 7026 0 s
+<00322e00252d23212f31332b213225002f21232a> 7026 2716 3 8825 0 s
+<38> 8825 2716 0 8895 -1 s
+<25323105> 3177 2961 0 3485 -1 s
+<001b2f2523292636292d270009002e30000a0035292b2b003629252b24000e> 3485 2961 7 6163 0 s
+<0e1509060a0300212d24000b0035292b2b003629252b24000e> 6159 2961 5 8441 0 s
+<0e150b05> 8437 2961 0 8895 -1 s
+<1e10252621332b320c> 3177 3206 0 3998 -1 s
+<000b00040d000e> 3998 3206 3 4780 0 s
+<0e150b1f> 4776 3206 0 5250 -1 s
+<0422> 1589 3552 0 1879 -1 s
+wst:dutch12i SF
+<0e0812060e0c0604> 2033 3552 0 2712 -1 s
+wst:dutch12 SF
+<312532> 3177 3552 0 3432 -1 s
+<00322825002c25212d0022333031320032213027253200212d24062e30002c292d292c332c00292d00332d293231002e26002a292b2e222932002f21232a> 3432 3552 11 8825 0 s
+<38> 8825 3552 0 8895 -1 s
+<25323105> 3177 3797 0 3485 -1 s
+<001c28250026293031320034212b3325002931> 3485 3797 4 4971 0 s
+<0032213027253200212d2400322825003125232e2d24002931002c292d292c332c05001e10252621332b320c> 4971 3797 7 8895 0 s
+<0703071f> 3177 4042 0 3511 -1 s
+<0424> 1589 4388 0 1882 -1 s
+wst:dutch12i SF
+<0506110e0c0604> 2033 4388 0 2700 -1 s
+wst:dutch12 SF
+<312532> 3177 4388 0 3432 -1 s
+<00322825002d212c25002e2600322825000e> 3432 4388 5 5056 0 s
+<1c16002425342923250026292b2500322e002225> 5036 4388 4 6799 0 s
+<002e2f252d252405001e10252621332b320c000624253406> 6799 4388 3 8895 0 s
+<21322c1f> 3177 4633 0 3594 -1 s
+<042c> 1589 4980 0 1940 -1 s
+wst:dutch12i SF
+<1103091006> 2033 4980 0 2495 -1 s
+wst:dutch12 SF
+<312532> 3177 4980 0 3432 -1 s
+<00322825002b2e23212b0031252d24003129372500322e00> 3432 4980 6 5337 0 s
+wst:dutch12i SF
+<1103091006> 5337 4980 0 5799 -1 s
+wst:dutch12 SF
+<00223632253105001c282931002c333132002d2e32002225002b2130272530003228212d> 5799 4980 7 8895 0 s
+<322825> 3177 5225 0 3467 -1 s
+<000e> 3467 5225 1 3683 0 s
+<1c1600161c1d05001e10252621332b320c000e> 3663 5225 3 5713 0 s
+<1c1600161c1d1f> 5693 5225 1 6669 0 s
+<0416> 1589 5571 0 1967 -1 s
+wst:dutch12i SF
+<1103091006> 2033 5571 0 2495 -1 s
+wst:dutch12 SF
+<3528292328> 3177 5571 0 3703 -1 s
+<0022252821342531002b292a2500042c030031253232292d27003228250030252325293425003129372500262e3000322825> 3703 5571 9 8180 0 s
+<0030252c2e3225> 8180 5571 1 8895 0 s
+<31363132252c05> 3177 5816 0 3835 -1 s
+<001e10252621332b320c000e> 3835 5816 2 4925 0 s
+<1c1600161c1d1f> 4905 5816 1 5881 0 s
+<042f> 1589 6163 0 1882 -1 s
+wst:dutch12i SF
+<0e0812060e0c0604> 2033 6163 0 2712 -1 s
+wst:dutch12 SF
+<312532> 3177 6163 0 3432 -1 s
+<00322825002f25212a0022212d2435292432280032213027253200212d24062e30002c292d292c332c00292d00332d293231002e26> 3432 6163 9 8426 0 s
+<002a292b2e> 8426 6163 1 8825 0 s
+<38> 8825 6163 0 8895 -1 s
+<22293231063105> 3177 6408 0 3690 -1 s
+<001c28250026293031320034212b33250029310032213027253200212d2400322825003125232e2d24002932002c292d292c332c05001e1025> 3690 6408 11 8825 0 s
+<38> 8825 6408 0 8895 -1 s
+<2621332b320c> 3177 6653 0 3653 -1 s
+<0007030700040d002d2532352e302a0021313129272d25241f> 3653 6653 4 6058 0 s
+<0419> 1589 6999 0 1894 -1 s
+wst:dutch12i SF
+<0e0812060e0c0604> 2033 6999 0 2712 -1 s
+wst:dutch12 SF
+<312532> 3177 6999 0 3432 -1 s
+<00322825> 3432 6999 1 3774 0 s
+<002c25212d0022212d2435292432280032213027253200212d24062e30002c292d292c332c00292d00332d293231002e26002a292b2e> 3774 6999 9 8825 0 s
+<38> 8825 6999 0 8895 -1 s
+<22293231063105> 3177 7244 0 3690 -1 s
+<001c28250026293031320034212b33250029310032213027253200212d2400322825003125232e2d24002931002c292d292c332c05> 3690 7244 10 8426 0 s
+<001e1025> 8426 7244 1 8825 0 s
+<38> 8825 7244 0 8895 -1 s
+<2621332b320c> 3177 7489 0 3653 -1 s
+<0007030700040d002d2532352e302a0021313129272d25241f> 3653 7489 4 6058 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (15) 15
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0034 put
+dup 3 /C0036 put
+dup 4 /C0040 put
+dup 5 /C0041 put
+dup 6 /C0044 put
+dup 7 /C0045 put
+dup 8 /C0046 put
+dup 9 /C0047 put
+dup 10 /C0048 put
+dup 11 /C0049 put
+dup 12 /C0053 put
+dup 13 /C0058 put
+dup 14 /C0062 put
+dup 15 /C0065 put
+dup 16 /C0066 put
+dup 17 /C0067 put
+dup 18 /C0068 put
+dup 19 /C0069 put
+dup 20 /C0070 put
+dup 21 /C0071 put
+dup 22 /C0072 put
+dup 23 /C0073 put
+dup 24 /C0076 put
+dup 25 /C0077 put
+dup 26 /C0078 put
+dup 27 /C0079 put
+dup 28 /C0080 put
+dup 29 /C0082 put
+dup 30 /C0083 put
+dup 31 /C0084 put
+dup 32 /C0089 put
+dup 33 /C0091 put
+dup 34 /C0093 put
+dup 35 /C0095 put
+dup 36 /C0096 put
+dup 37 /C0097 put
+dup 38 /C0098 put
+dup 39 /C0099 put
+dup 40 /C0100 put
+dup 41 /C0101 put
+dup 42 /C0102 put
+dup 43 /C0103 put
+dup 44 /C0104 put
+dup 45 /C0105 put
+dup 46 /C0106 put
+dup 47 /C0107 put
+dup 48 /C0108 put
+dup 49 /C0109 put
+dup 50 /C0110 put
+dup 51 /C0111 put
+dup 52 /C0112 put
+dup 53 /C0113 put
+dup 54 /C0114 put
+dup 55 /C0115 put
+dup 56 /C0116 put
+dup 57 /C0117 put
+dup 58 /C0118 put
+dup 59 /C0119 put
+dup 60 /C0120 put
+dup 61 /C0121 put
+dup 62 /C0122 put
+dup 63 /C0124 put
+dup 64 /C0127 put
+dup 65 /C0262 put
+readonly def
+/FontBBox [-50 -256 920 766] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842243E0EC59344CEF369650A037B4383B03D6
+24C306E87EFDD4775EC78742
+FEFCE44B765574466C
+D1AF7A82
+CFE19FEC07055171803BE35FB61F
+DFA5A4C739A4E3957EB7C66233844AC51A6A91B45B75E6AF1F76779A4EA39D554C671F039F6EA0902EEABC13363BDDA5101CA12BB8156EEC5AF0BF9E6FFD41E3E8297895E1554F57314DE5E5E70C32DA47FD30A8525D7EE9C60607EDB6FD9F816BBA9417276F85
+60F5DDB4
+A3948B33ECD70515EFB0F25E7766
+23F737A06578D2C501971D21A1AD0DFB46CF5287869182444F411FF11823026670B907FF382665F39F94C09E0E1E76DC0B02A4BF09FB8F2E5BE909CD4C41833EB22E0FEA75A40D35D7700DE134E6C556D6A7CE512D6327F1F175C4A19C0F64AE61E00DCA03F8F5E64A5A235E5D73BAC487E3CEF5CEE4A4CDE1A68DBB5C77
+212D
+08FBF8079BE5531B761799E3
+CAC71CE7
+915BC5DA0DB17FFD4ABDE5111A
+09F2F70F6106F3F60ECC4242AE99DC465FD41841E9B7525D5C4B32CEA4DC6FDF1A2165BBFA8A4EF1128FB2FCCFEC878D74E59BD4A4F9B0BEDEFCA9DD265F1FA8
+BFB5B1CE
+705E8E3C5B602472007D2FF909
+3CBD678801F52A32B28EDE4923024E25A8795676CC594BC4EC8934E0A7DB874AE00DD507DE5313D4B2DC7A11633AC15E996999BC8CE501DE5DC11EB46F4396
+2F99DEEA
+EF2C357CCDDBA7677B622DF0B5
+5C12FD9287FD7D0AEF34BB5E58B5A57F45D645035A33B60E29D60FB936005178251AF10328711FC248E8350EAEA49338756BA4B6F67300F344
+1CB0441D
+E802C29EBC459C06C9DAF17C6D
+2EB1B8D6D9837F591570D694769A15C7A218595F44419A
+D40F8A4B
+512CD8EFA6575EDD9C81BB6CE7
+6FAFC31B159889FC2573141E82A128A89FEC2C30E4A733624538555D939E39
+1B20729F
+47BC6C5BA2195DF1EA231C3D0A
+CE7755A7DABA03394CCC8986CAD22433BC22879D8B7D8B338758833D
+0C154F5E
+540FBF13F4AD1704D92E4D6E2C
+479BC9C7C267F0FC6FD38775759159C985DBB92AB8C9C9B70EF26A2DE4631198EC95F709CAAC33F0FED24B28225B4B5C4D2A500C50776D871C48F0B523E2C7E0A0A46B063855CC30F435
+269CCD2C
+0E43CD69F85BE3B73B9062B80F
+9C42F94B950BA5B6D3B1D05D4ECA068476CD9BCC0F44297FD4C5FC61B2A3053842F9B013D649DF6EAC03D1A077E1AD203CC4E9BC105F8076F89611A39B1EEC
+D88F18FE
+D177B43236812372AA82A57957
+CF45F470BEE966D417C9728225810AED28BD3828A2A82F5C9AF368A2E4721E751C8101CDDD6233EE6E8698E6FBA02521C3E23CDDDBB158A9736C0810DA7A716DEEDBED2CF52086B4835A0BB0CA9E96922FE2F6EABFFB4119CE8F148BD8FB42C8BB
+D88EB74E
+AB5FC3537A8DDC39466A0E2F3C
+A21869CCC4836536D87BE8C58236E10A493D765FCB9B7DB08445FC8DBCB229685FA83A29010A409FE937FB3DE0654B376D75D1134790
+A8DC6D67
+E18AC5E413F17D82C1E73C0989
+2E3E65EBD4278F751249F75D98E34F4B25F99F991C88EBB3E0CE609194647AC3C82427B32103BC
+94E3678A
+BA052D04B65E485A42F897D3B64D
+079A3BA824A3C1717282B2F9663C697B005B9C5A2D74E3A62A60384B4ED203BBB3215C738AAB54B2BBCD5F97D472DD9A12353964A1E372942E578CE29BEEA882266905193680ED33E8E9C917B5FF5526BED264D167D3F0AF504E064396D430A3CF2F9ACFDF09C253754639C839B5945D473C10
+024C9D1B
+85D60D0F3763522127A0231126A1
+CCB9E7F5C4135367B06ACBB6121497A53C9670FCB0052805C6D0045FCEC6A23F76AE95F85070493E34D88C733356B82D9FCDE77F9DF4562CF2F611EE4A66ACF3BC9FDA53681AE597F3BCCD83DC4F21274CF28D9E0A040C5EFF50EF5B81DCFEC2726E2D22BAF4B3AD3B463840F713661C8DF810B118EE1217CEF95DCFF8B5
+D076
+2D
+B8591C7A
+9AA3B8C9126CA4F4E04E2B18FA
+0D5A7BAA0A5E42DAF07E0DF59CD102F27FC5ECC70A8B5C967493ED28F7ADF5E18560321B55F3BBC7CEEFB7E2A71A7A41C21DF4C2634B7BA5AB4EA7064433D716D3FD3024488C8CE5F3374607B09D3435DA139BD694396E9B21BE2F4B5996885339
+382CB1E9
+B4EECAC398894421851389ADBB
+5E2C2A3508EBBB5D6D4EB6C8F0742AB3665EBBF22A75B1FB5DD27BA8A11D5016FEC190EACD7A172AD2169E288F52BCF49ECB8D660073601616728C936FC4CA91C438BC3D261277280B0927140F6ADE87C862854E21C1EB87E3A5B07A43D083BE6CDB60
+AE070410
+146378753E59DB1DDD02A3527310
+A240490429C9A9C703CE34079AF81A378D3642A1FA3EB15F96714F58A62A929B65E54F62A79EABA0A80536A07FAE36B5092DB2A0525ABCD71F3875D9416524E5C7F4DACC4971CF32DFD01E41C62752780D0CBF9D0186A0DE7660B8DC55C683BC0D88C7867D52AAB86B502F15980FBCF8EE2541CC358F3F21970B8FF7BAD2
+1A588FF5
+5CB5F433BC2CA1F1AADD69E8740C
+589D604A4CC3C5C47ED0A0B0074D650087B386066E0FF9ABAFDF212AA40AE02C72D46608429DF3293E96DC375795A7DD61308A580556F5EC811FE02C332BCACD509DE6F0E9A8FA80BE7DF8C0F42D2AE199DDE2A6F79F5DB3F44AD83FEC4C85C23605B48CA8D498619A
+32C9357A
+9232F6551246017DFCEBC7FEEFA8
+41B22745C0FBF89C585364690C5E05F9506A4108B48449787EE2896CDABDB1C55E56C833204BA596A6AFA077BE72A5C0CF453994A570E21D7F401A2371F281000D17533C0EFAE56FE04F80010BF2F6EB3C53F55C1DC0AF88611022CA9B32B0CE96FF283BA6B3C24E10E412BC7D3B3EBC49275026EC98F4942A41
+CC11DD46
+8F876B764A4848F661DB09C03618
+8AF869E87FAD086F86257134A1732E505146F45EAE1652ECEFE77F5CBEFC03F27A0D5E3AA36BA5EB90249B880E142CE663E705CDCD7BA42743DD4DFB51399707D146637CDACF9F63A6CD5DE845A24B7253D50B4C669F9141CD862093985F235043711D9B228A8CBA7411A073288D444D2A649DD3FAA1186889C186B0EDAB
+A4BC
+43728142EB3FB622EBC6F1
+F3F157E1
+CCCF353372B37A93FD10BB19E1
+8B570DC8400F84A5B644CD2AC7AF5CA7BAC0AB385EEA9FC34B8BF4D14BBD6075D706DB15DD89E3EF313C57FF554CA6C437C20CC8173ABFDC218D96
+57DC8B2E
+1056A1FD4163CDFF863C9811B3
+B5ED20AD801A94FE93A52DBE870F3E2AB6EBF899061D3A0BD7FC4F1AD5C051B753CA9364C5E9FC3E63AB24AB713E3403C67ECDB039A8CC3DCB7050F74BA9358763A8A53736F1F6
+39EE0BFA
+B7CDDA2BBE1007F5D34E0D7F1783
+EAAB803190870FCCEAEE12EE496EB923F8654781735F3A2E2ED27F3CB98B3371E044C998E37EDBAECED3891A9F14A03D3EDAAC286023C908466CFE87217D28154B571AAD04944DDC567AA85D75D937703570E0ECFDA41442FEF1984C377B74DCD03B00D5EA837B7230DDE656B52C17
+B0A71BF3
+B00F73B13BDDFF42324FABA813
+FDA935FA122C9DEFD72653875F88A60D41454AE6B7084C0AC4B026BE17FF1B4FD9CAD9633942C7E1339F9817EC083AE939F1EA9E9789EFE53F9E07D42DBF4C97721226BBD4896645DD85AAB82AB3E00A74BC561A3447F2493A1A7446
+27C518ED
+07E6364584BF82D65DBB76C8EC
+67F713283428AD8166E4153F0CC0D0DAAC9183B83C8DCA0215F80E6B730DAE27A6FAC90268ECD6DEF7A726CCB8EB08C949F7E91F78540974C228622A711A10B610DE8F0FCCCF721D303048BF75F8C96516D988
+229CC80F
+82F06BDB1F52D5DB37CF02DE9C5B
+6A9ED25376D17DEF4B423A74C7F892FC435E803DE41C0DFE8407D6F802153BAAFEFF763CD37528F1EA3797F8A02B6CDFF4260997B86D955DA1AA1246A2FC1DD294AF017DA63E0B3C8A2CAAAA6310764E2C31678B5671220527097AECEB2CD439918C9C285BAA9ACBE4B5
+375D7380
+00B4177C9797088BF98EFBFE4423
+72B08A3170F63DC646D7998DF46F7512C0A3D00226A69D07F2F8786CD670F2E48EA165690AFA15BED3221640D1458821431019C38A44ABCCCA15F1D92A65CCABCA846185E5BA2EFC95168ADE3926AD3A0CC58CAC05AED9669A81C1CC36797B0587289AB82181B3834EF64E87985E81DF1AFC4B229D8C067B17D440BF376E
+8E069FBB
+3906F4FC25A5A40C50CC7FF582C8
+ACF9BF56B92C5F37DE88902B803B47DBE695C4DF3100955DA837418D26D76D9F9A4E36D9A1C2B23B4F8ACCB04A4B2ADA01C0BA93A1C94E800F142FF3EED2DBEA71B67E658F3F91143D51F7E486CAA74040DC68B5B42FFEFD80A13A8A8B2570FCACE5E3A30DA23DA6580CAE4E888438CAB231CA31F173410DED4E3AE26314
+A87B
+EE6BD5
+72B36D31
+F11850B09091829CB43B0237C8
+E67D174E1E58D79497981355B61E71F17F4FFF0D4F281457FC96A9D31D1920E027D891A99A39F6A79693FD107A58288E58DEEFBB592A6AB0C284DE9C64E19E60D68827F1187F772A4B83F8ACE94DD83EE9
+C98F4451
+24E4A94753E484AA015892D5BFDC
+37A921D1B143D4B6D5F77FC0C37D5899478C57D411972E96197230A3BC570686EF2CD5E1D7889D185C9E1940C50853867647B77CFFCB1255F11A275679F6121E73B9344128FFD12DD160C5C86AE1B8FB81B58DCDB605E0500BD08F16F5E1D945A771EBFEB373FF921493003556220DE7B9B724
+47173914
+4A49BF8871FEE5E7D6C14AE308
+A9DE8E06315C236C5D28366654730718A0B466A12A00C649BD356768EB5166CED0F42CC0BA6BB85FB530
+3A44F84E
+EBC83ED524FC346E4D4E5A1318
+F12E614A40E8103117A2D7CA8344610D8A9FBFAF0527609FEFA55D0537D9F65DC74AF4B210598103BDE0449C
+3047A416
+145C66D2DD1A428EBCC8AF9626
+B1DF061F7DC5B1DF5C56B14BFF8C5A09E559E913AD2E
+5F1C60BF
+C41FCC53C55AD2C30D8A038765
+88D352DB0999DCD2CF465F45F511156532BC7C4D2878FCEB1F8031E6E80F35FA4B6E1EEB6A61BF3F00CEC02EEE70199ADDCDF4E1BC7ABCF748D9
+55F0C3DF
+B2D8A8CE6EDA634794A90AB05C57
+6853FED04E85A35252AF1216EC4B6BA47C5F4002444D1E533C4A3BA82082E85BB2E5D1E069B28A169C40039CE5CAAF45C14CFB3A0E07AD62B3730D7EBE97850DC1815A39C2792F2E9F6E40801360B69EC06104A2C6C909A6AB05733BC207FED3738975EAF66893CFF9277BE9F42F2767CDC6816ADC0516F48E8D6ACD2FEE
+3B29
+4AFBB6
+5359B7B3
+9F71CD2CC7EE5CDC79CCF3D403
+C8992A078CD00D63607281F561401E2ECC36A14834ADED7329AAC4272E9D277767CF9885C7D8DFA769163AABB453145077A16723825C7E9212DFC6376FFF7C095FC882142AE3B990D13767F44E678E309D780E879238D1C1
+AABD4821
+19F0D1DDB8D570FE10E7831D03
+09FC06C662B3FED529F8968FD0574AB926E0C935BE3E279D083A482CFB2B6DB7EB630C4E5969FC276BB0BBEA3CC00B31206B98ABC2657B592988E9029D811AF82366C836C6AD0E51493B1E5E4D4B25E21F4F
+F0242F72
+7E6C7ED1FE6AF6524B29A7E70AFF
+5B14B02BCCD0F82AF84414EBB4527A8C336D5B0474EBDC4581E3EB471AB0B08F1873489A24EC7F54957321E4BF41D43101837CDCE41CBEDBA7FE97C1A13B8E7D6FBB0296318DE936D09C45E65F8049E25002352690193ABDE28D279270BA59F92F4117260F39A20C950F27243E13
+106413E7
+231A45F69F73755A420557D900
+85D8AFC057052C2E4D0D0BB662F75A1B82E13B50DC6ACB6BA985896247E44A222587EAF43C42849DB7A293EAA63C90CB0429D81FD376A10F80522E2ECB5929DCBCC43C7EE7F9BB7676FEE1B9BCBCC4531D4200749EA05F1639
+5DFD8004
+F104327693072E0340F399E09D
+4ED56A733B89B744BAC3C79CE84F8219D1F1DD340849872D71157F7E95150F570394E89169D90A93CAE5206BAE979DE7A6F0FD6D2D2A1F35D210D4A9E6CCBFF8BC0403DB0BFECF3275E3A08259A0CFBAF3FC98C1F5AEEA621F3E48D4
+093494A0
+C1392A93E549D8A24A766B378FE8
+6691BB121750C6406C4C6389CA1D3F96159DA9DFD51F1C8706F3D5F7510979051EAD2152016E5E052E551C56188EBBEDC1171EF7C3843E2E2B0689F54CFEC33CD385A8CD90216F197383304B2A3AF0EA544C5A68A089AFA79C47EFF69998524FDBFA4461D832F44AB24510AE329F0524F6F40784AAEC4ABADE7CEB1FAE8A
+25FD
+6D1FEE19F3F5739E20E7063F4E12B76AAAB0D252E771C2CFC878FA07E66DD3CB635C18C7DB6129BF08258DC0A6D090
+31B53602
+3D37F8AB2732989815C7A36D7147
+522078C9B649963AB9EBBF05F6CDDDC59A7209D59F408786C079EEAC0230AF5919ADBF441EA6379DC419D1EB3A51172C77F312B2766D4E7FB746175A4C244C61291A84DAAC8C9DE7B4340E5616DC7343E4A3288B10EAF0B6A43E2E39ADDECAC59D442276845B530A5BB018481D
+6C84D0C5
+C88D08175BE34BE2E2BA8E5424
+C8D0A8995968F329B3D54561E94FB6C1C663AF57FA981053756B59C40BAD690F98176D6D2FFD51A3697A21A44592F6A2B435517E89E9A79EB10122FCEAAB226051192CE2AFE0D128E790BA89476EAE12
+8B7EA591
+ECC2D72C710E595E019010C431
+E2D5BD26BF8EE7A6170BF91303DBC2010B5A13C449D18AE5BF9A18FB7B650C2055F7B543369A800F7FC83576FE17AA987BAD644E64AC199F190A5DB2035464A4ED3EF8CEEE0541C1855FF39F1FBBA7D3C84D90D3D382138D3D3C9AB4BB11A1F527D11E
+E4030C85
+81465E42FC6134D2F06B2F587530
+D12214A358961F7604A616A197E1CDB47975F93B6097DF2D15DB439E328CE68A785C8E77141D4BF31C65012BD7F2ACF07AF25D7BD99FEE2D9A19B52570A22EF3FA1BDF1E894DFC0368067A0ED614CD9C50F5C3186BF222634056E48F8DE0B04142374D850808531112B306F6F9E934F5AB26D9F514AAC57A05C0A23A6921
+08D7
+E7B5D0F771389442F9CC3A7D879C6618F8F447AD87B95D4BB21906DFBAFF20304820AD
+28D3BEE1
+F48A629E767A0A2B1FD4903EE1
+43F0FF847745BDF9EF8EB84EAFE691E764BACDAFC6CFBDE3A7E8F1A59D92208BFEC492938F021F60D4F79011F8785C0A4D49E3D09B3C
+A7B8CC7A
+E9AAE8072C848FCDC259CEDD6B1B
+DFD5E9AD7A244C2AE5B4C0FFEEE5EC8F30666240B4C34D3A67A72F34350C21A049A29221AEEB575B37B282A32CEDB1F0DF6D49C8BD7DD126D289D59CE15BC520D40441DBC571A5E5247B66F2E6557395B520B2C467B754A2090C5DB553A6DF380D137FF9FD19DE73BDB63E129EBA947611DAECE8688DAF258C6D698161F6
+2CA2
+8BDE781CA5D9892DEF79880A763ACA7D5E93388982DC22EEED0049F36BF0DF
+E4BABD4F
+B45FCCC72A5626E53197FAC453F0
+1520EAD199D15AB8C95625901EAC209050947829D650F4EE41DE478A3863210AAF72A23E177F39E718BA8F6DF7C3F125C44549DB5900C06F6C377ABC5D63360E79E3736CD0A2FCABACC089F02E17E417066B62031D3395243A3F2FFBFE8E5A727ABC43C5BEB1BE992E79DC9B
+6460B352
+6AC7CDD30F71731BF8A0C0AC39
+2A2F772A3E2E2727CCFC69034F783380414E7D65D195D4B93A8CFAB91235517983AB225B3B18307E5DDA987704D8E52135AAFB83456CF5072BBE655AF75F066F9BF815292B50
+BB2DAC0D
+328C4749DCA7E16BCBC5BC9164CB
+93BFFF5CCFF8924F8F07B7A90BAB8D984712D62F97497EE96F208FD35568C79050C21F4C4FACACD0E8C74B344E751F77E5E072942AF04DA1DE503722C1063E9A8BCFD35525A298B1E80B2CDEBB90F59E693F12B6B455C409F127D0E2890E8478D6C6852025F35C301D360D2C9A6FB0F4E78ACAEA39A223
+B62D7DF6
+F5E78EA28EE0B01D112C387D01E4
+F56E5EC15FF9A9F6C5608A35C51E2813706EA1C8B2645C7BF1855BC95947D9E04283121C3192BDD7A0A034AF9E3CAA2B472154971987D66C78D79EE2AAEC8FD7B9146DE3544EB25966F5E0D22291AA0E13CBCB378BC8C8C11774B1E5261783073543554A1441E38B26B2
+5546A06E
+2903D18EADDB3515E66C02C72E
+13688BC5A07F24EF779594928EE6EDF8EE67CD958CAD3BCAE71BAE82EE9834CCFDF45E3200495BF10AA68EEC35EC45B0F11E1D570D9E3B27766E48DE4530E3569F013A9733F9D093F127B34C39E33B8A34B67D07FBBB07
+38A7708D
+EA378029CBA4117348C377D22217
+312B0873FFF00A0F50274AD9CBCB87A4064C0682C4B2A008460A00BAEC2872DC4F325C77706BA681D4051BEB54633439D5E24C94C7E156E0DFCB15C7EEDEC14395C8FCF32100A93EE0945D8670516292D04DF827F5893F345A95A479E3C6ED80D6E0B1DF5650885EA9BEC846C896DCEE07E6D36B70B4CF5283E39AA8
+AA0DB95C
+45CC93AD04C2CA6524BC2B2B3D
+6ED4EC66A2A90DACEC1A1F2C0EBE2587AE1A7516FA291E884BDD9622D03F55F983959FFFC0B5B026F441D9A6ABA5A1A31156CEA586A81B2F4B8F0F7561CD90A9F4544548DD
+26C1E00B
+83C67C11B239C1F1F9E3A05F05
+F21E123C7CCD62DE538B71AA7C46F4AE5893B5CD85A6438F15496D2C6C37C3FE28FC1F4BEDE8F04F656C145E651F69145C7CD5D374398F9AFA61A9593DB2AB114A1BB6C517E3571D3ED50122BD5DFDB0892368E46C37AC57809E9A8126FD14E56A35
+2ED80313
+28B037689A006B3E4DFA8B6DF5
+F95734D80DBCB447916A4BD3409B24B1A8B5876655C62835CA599E0B99DEDEBE79C00E9AB0C0A572111CDAB83D1206A8E23B7ECEDC05EA120C5C4C32AA271D1ED84F322EE904F0670CAEC23AD2B9216451AFFCFD58B5984DDE
+68ABB938
+FF9414727E0006846CB1DE616809
+BB7CEBA63A4A18611EA29ABD7621DCE22DDF818AE90062C43CCB37BAF3EEE0FE99AE3A4307009A7E650D3237BCD301E2E0BBC8601F0575B91B61BE4965AB5D446851C612A7DEB2BD4C75596AC6439E55C68AB15C5585CBFACB31A1BB4AF12934ABC4B90845404AED8154BDF4ABA26CE4EB12DEC266DA5260886660ACFA34
+2343
+730251D7241F314FBABB6BBF1C8B
+3882C611
+EEE8DEBED1116E61E5AB0AB05C57
+6853FED08DEB7F64FB12030BB439AA163718837E52461D6E4A593C20B27B2510A766083785E6709D6157E887F7EFE986AEA3C59764561AB7627D543101DECBD641B68858E4D4B87815DBC6F69DD2EC0743E2EB94397F94552AF0E0B7AEF2415E3BC885A4BF1F029FBF0037182E16FD1C42F36BE928028E842DEF7225C039
+68D6
+204023CC360B31471854C89203691DD4CC6E7CB3D361164679
+8AEDAD85
+12DB9CECB08999CAD95FA3424F1B
+7995A9722DC6D8AD9A997DB7E8EC505DD008EBD2F55B540625C935454625D7FD36C9FACE3C3AF99498968DFA98EC22700712F60A0F690FCCB92357175164AAF42A333734FE4D65B4835ED4C5793792385E0982C99A7A0656FB70279090476881C5646EF83ACAEBA59F0BAF64AE4A761D12B60678048C7DA83EF19AFA53D5
+A20C
+9DD63981
+9CA9CE2F318217DA730956765D
+637B7CAB6B01B591C5804FCE798EAE043C39FDDD381FA7F48770B0EBA28C0E442B1E7EF5F00DA9B36D12DC9FD9239D4E1382700326C61CC0CD97D6E0675740
+8B8DCB43
+8E07FA3DDB43D98395F6281F11
+92BFFEDB192807D7B293D74413FFF4752F6E52FC260ED9
+3EF282F9
+050E770D1BBD23D61838734E691B
+C16C50358597A8F4D0C4481CF232A3D09001203F9E2B4353F5C6A83B6979E54B64C71F890FD113502396D4C94CB9678C90A5C745F7873E7EC4A59035DE60C8AE272454621D245F503FEC4C3A41B671BC6E6C7F297D216ADB9BBD48D7297FF93C7FA12A8BC90466AA48
+CA6F3E38
+D7E89D603A37E72A2D9B0044B0
+50747E7DEC8FBC6AA83CDE8DFF47971E571988B10CF9
+A33D8A5B
+4305ABEDE6EEC72735CC64DFEC11
+5BCDA35935D625FD
+DF3194AD
+50F54FA3360849A680BA54F003C35078E07C7C98D43A052256FC61F98DB0FE79FAA5
+3ED0299C04F9923429680E99FC5C4F80EE03E146173376E1FE52568FE2EF44259F4B959BC086
+75BD6C1587A9A8C018DC8256F81BBC5B0E49FE1FB79BFE1141083B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0045 put
+dup 3 /C0046 put
+dup 4 /C0047 put
+dup 5 /C0053 put
+dup 6 /C0067 put
+dup 7 /C0072 put
+dup 8 /C0078 put
+dup 9 /C0080 put
+dup 10 /C0082 put
+dup 11 /C0083 put
+dup 12 /C0084 put
+dup 13 /C0085 put
+dup 14 /C0097 put
+dup 15 /C0099 put
+dup 16 /C0101 put
+dup 17 /C0102 put
+dup 18 /C0103 put
+dup 19 /C0105 put
+dup 20 /C0109 put
+dup 21 /C0110 put
+dup 22 /C0111 put
+dup 23 /C0112 put
+dup 24 /C0113 put
+dup 25 /C0114 put
+dup 26 /C0115 put
+dup 27 /C0116 put
+dup 28 /C0117 put
+readonly def
+/FontBBox [-18 -209 798 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842696372152E316283F409A2BE3FB67B6CB2D
+6C35138848401FCF8D64411A
+41FB44D0E855AD39C2
+0BCE5C02
+B2E8B72CB0F5F3A6AD54FC694E
+E1CCDB927ED71226CBF0C1C0989CD2E164C8726791DE76
+3BAFE591
+27DBAEC30F85699F02EBB58868
+88D4A6C5798D6DE17DBA54B6F0FD1D2C9E5DC98847C3D87DDAAE43E6DF57ED
+8F353740
+E58F04881676CF7060E0D6B570
+6557B831E10C1B331DB194A735BE1B9619A4FC58B5D5069505F7
+070FD517
+A1D0F5CDA9109257631FA203AE
+3415AEEA9FB3604EA7447EE6166A50839AFC49A88666CA71D591B7CF9907546E26BFF94E305A75D2D5A2B60632C983835A0BF8B234781FE3F87FDB4416B91BC714389D1F4C07FF6A5027BBD620916A1BDE81E5688942
+A79982F0
+B00FC5CA3B9C9E19F51B59552460
+43C8659E3E94CBC526C91CB6D54CD5C5053B5AB8521757D66B098250613C76A203B47A0DAC2485009EFFFB5157B67C4530AB8E26D45532749DB1743AABE4FE99819A64CC0A2413A48EB444D298ED5FBC598B713192C8E79387D412F10B0AC43B2DB2039A5311CE5D
+00EF5DD0
+A7D6B8D08AFABDFEBBC870914CF1
+D522123ECBD0DCE34BB6CF12AB026644C44F1C2158F316A65AD92F9DAD7EE77946263DC8197917D927E0E17972C48BEC5D37FCC609278AAF03B2F7ACF0E4C56564ED5BE9EEE528FED157DB7270DBC56BF1535AE5CE2706BD476D68576E2C9DA7A6C469CD0B1EF09EB58603DAA7EC2BBDC9F27FCC40C56F
+8C47495B
+F529E22CABFC22B163B3F62A42
+66E23A13E8BC1707BF324E38CE32BEB9CECBE6D433004617FDFB8DD91DCB9942B918BC850A6ED6050B1416C900FB5780A1001B783EA27A7B5E22A4F5223ACD319A9BEF7A3CDFD3C89001305DE10502FA07E2E15864EB04A8FDCA59BA4D7703
+008671E7
+269E2025C4E5CF1761368F446210
+484C1AF945991A2BDF9C0FB4AD63D03436513E329277BED07B66C4FA654443DCE657646AEEDAA828B1C55546060BDEDAFB7876FE77269B1A5C1A7F3C3CF305904A5B2CA4ABDD28949B22AF705120F0DC38B583FA5E3E06E04C1D950F6523C624C6989A4C
+C54BC7FF
+5114B154D5D72447DD524C2A0691
+1A7FB36EF72F94382A6514AE4CE50AE0689CC4B288BB5B282894F1D75397BCE7A42145AC452DF0E22BA8056194AFD98AB0940F95B38AEF728521869D0EAE47044BFD91C130BA2943F7DBBF341368FC96460236F0364AFB6011267FEACA97D8EA9FC6557347465A3C3E0B2ED90F1976BC1D3C18990A
+BE5D48EB
+88FAE814CD8FAF8BA980A06584BE
+2E6A1DFA09BED16574F0F54F0841EE6CB52B9461D959CF4991E2C28211C5325B6F19641979413609FFE5BF9CE9CEE2ED9A87208401FB624824C6A20D3735E090D236B9A5D8C24D379373ACA052D7C9F62FA8A945795A4D2581091323769F5AAE84AEBA6D931CEB4F7C675C15D9BC0F01BFAC1E405AD6F98CE49B0135DF62
+4AD3
+0EC4E115
+1D83E2D0B0E7082DA626619E1E
+BB71D616C191D6E90752F4BADA51E39EE57B2C605222E084122D8A59056A1488449C99F0A30C2EE349C95117CBEA67E4085379C6F33CBDA2833E28ABD0A7CCD4DF383BEE57E854685B
+63D61778
+991D09F36A46DFC2ECAE2F21FB94
+C2D83DB87EC4A13D27196AC38866D5E62607DAAC402B51D2B7AADD85548D37E212BB729C58661596B689FD77A1332EE7884CFC950E130FBB501F36B12260E21543280CD412F0DBE2010012C923EF4E317465A32E10111958DA71F43E4666D3B5D9237812C56984
+CC438678
+AD722E74EE056B3BB8A2E8EA1D48
+018A4D4D89F06D8F942C3C2976A77C2029114D8F23823B9DC3EB3C17FDE7E200DEC5DC53153496C1DA0AD0CA70BE4F230578FF293BFDF4DDC7BA74F26D8C0D740617EC54BDE69741880468678E1017B6E1990F7C56113E32D8EF89F14798AEFB79D64111DB74DC35A1BDC413E61F89E3D3ED22D60CC0D4494DFC0C0C0D76
+5CB6
+C4AE53DB
+26F1603F
+207EE56B9909FD64711FB6A5F1
+038371D1B178E1BB011F6721FC990377ED6C35E3E5D2E94E88F8EBFEA32C93A1FD603485C023495336CA48B4163852D155863326617D9D3FD7DA0250ED67770A2E621B7C938011A2D36B450BFD17C78530C1
+6EF3B798
+5F1CACCC5A38A9E75260F2A9F9
+26A5855DE7596C99940036B9F8D119557DADF61900EA124FB931A01B90A38CF2F807BF5DE5DAE5A8EF1190240007B567FE8C4AEBB9C0E42A7C56D6A099477134E6F4CB53BB65771D10BB2169F66F05E28900A77FF89AB1B25C705E37
+5DF54CDC
+89CC23AF09023A875A2244A818
+019BBE819336CFC04E2914829741073AD8F6153D602B669631905588BB5FBE85006485C8C0E1239A9157686D9A0B7170494434493A8B66B969401BA24688E08FEC7465BBD4A4C8CC2A6743D73EA815D02629048ACACA5E5AB8C54AC032
+08C8246D
+67B41E99E3C17F79B643FB12A003
+8E1479E881D4854B266AD78E349E1B7382798E14C40EA8C5963B65F8549A82D0F0D4100A8614241C44D4CC9E7DCB63BB7379B8F6ACD6FB94544FB8EEC92C496BC6C5AF7FE8993A7E93C07962DA0C5F115E10976C0789BD05A4F845EEE6C121B6B17B31020D5DBABD0EFAB98D9EC440AF3884B6D001A4720ABDD919B0204F
+76A4
+A40E07B9360EA47EA685BEDDD7B746E834CC022BE9C1E586ABA9F01E76ECA00BC8E9CECEF0
+C878D1B3
+113A5315A635C1294C415B51E8
+9FC1E488D08AA17265F5938497037F21F96709CBE70ADBEF9332BBC475554C04FE22B1F56F2BFE94E6B59B61F22567E5277ECE3DCEDEDA7137684DDF27DF626B1F45578A3F71A25970361FEBC25D
+1B707D9C
+68C984EC006E6A901B4EFC5FBFA5
+69DB2DEE31A445619BD1EA189BE913EDDBD17B7CA3892735E4339CF6FEC9DACD0E3C158D2626D8CE184B2FE413A41EFE1D741179BEA303BAA2DDAFCA531660342CF531C1A9F800B6BF86424D73AB3C0D6E2F2956D4B7F08BDFA74F899F9D3EE2D8D669080DEF532CC542FB0FB974BFD44DDE26968270FE17F47AD41B0E34
+A8F6
+B841F3CC4C9B66BE13B06A34E634550AF37037A6FEDBA64BA1283DCD
+CC857B90
+E4233105795C79B1F8775EBA1C30
+63499F24C52DFDA920E03D8D14375C19F6C485385972AC5AA17ADA3D044EEB6CEB6D66D84BE6440286FD3D65AE928A712A8239272C433BB4CF38B44F5F9C50A2C610EE760C3030C9CFA6E21CFE48067EC560E3537AE62859D8561F924920048617674BA190E068
+CC500160
+D4A59A131D93C1CD10CF6D405E
+6CE9C7320697D03AC2667C832F47C2A6AAF2B29DBA7238F61EF5DC9FB295689ECC8AFF4C108B2E678A151A8154E093F2BE51CD2BCF4A1F0AC650C9F0B75DCA8DBFFF9A21B5F0
+E5A93472
+2E919EE36553F71C8B49D2016CC4
+3256A16E069404A33245244051332808BC2EB26C740D1A57BDB229F94D6289CFDD87B0B2ACBF5A779904B5803CF984F4A05BE90B1E654AF715CE24E899E87426DEC0077C1684DB049B8CD80C69125921D16043E33FC7A29C8C66C97BF547D54647F56C802784864719EFB12A2B7E8301A4
+6E53C105
+A3A855E91C348C448EB480EB5597
+29BAFB502382EB468E5D01270D57410537DC7B16FF144D5F2CA985A9BFBFB5E60729EE22543B580B83FEB8E1F41A3439ACD5B296812F6F8082BDB58A63D797C9106139910C2F403E8FFB34D87D82D92585B82682F5435009015539A686D7142B6579C475FDE9431D68
+FF2F43DE
+7473DD78FEF113B0A05EFFB312
+6DE50C70AB2B6A3CA29BD68A1549AC98E40625DA61C9D3EDBF02756C15329FE61F4590349C3AFA992F23040AA0C63F79031F583C9E2D1C9481B9B0E7537D84F0775460289791FA2AAE2F4B1AA145F29DA73C5F0D3043F9ED13
+97F4EEC3
+185399586A314C67F518D0068835
+D69B465129F1A6A13F6450AA87DCC7819BF91C29D81222E1F27818AE959557C36B171756F165305A263EA794E52D99DE89B7A81FD5FDD1B600E5848B001A88045BF3F8737BA8BBCE4E569A6F0B067148D0543187E607CFCED9ADBA0D3DC548D5D978BE7E0C2C146DF92C0FF46946190E7CD087C8C43B68F70C
+5F3A444E
+011ED67FA44E8C761F0725C03B
+4132B7BA87C1FE90C5288F9390BB12B316E9A27DC17B72794944C0DEB52302E035196E3BF77332765DE04E65803AA2FCB2A5CA34DA6F31175077493008A30950142A3AD2
+0C89F588
+39A58181641BE7444ABF6FB5C8
+C1B20D1A47CDCDBC814E21BB15FA8B4D6AA2DE1A3F776F3BB9410EA805526BA9A0C8D3E71AB04A561E8C79B92C88005F1DAB6D47C1943975D4987AB2A1169FB8C60E6A830F9B6276D1187CEB560F540CD782C18C4C15CFBAA9BDC1
+9DBB23C4
+44A908810147C28C1E3EEA39EF3D
+2AFE9349B152C0A2
+ED396B39
+998E65DBDECA3313CEAFDFF21969BC1752682CD02DF3ABD0CD61297D849C791992DF
+6A0D1E7488C58984433CFACC33C7B2121FCF320580AD97B019B953FA1CCE999F7BA1650D87E7
+F6F0244DDB0D039548D40C221E57EC300CCCC72A8F4F3E5D6D519B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchi
+%!FontType1-1.0: PSOwstdutchi
+10 dict begin
+/FontName /PSOwstdutchi def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0044 put
+dup 3 /C0095 put
+dup 4 /C0097 put
+dup 5 /C0099 put
+dup 6 /C0101 put
+dup 7 /C0104 put
+dup 8 /C0105 put
+dup 9 /C0108 put
+dup 10 /C0109 put
+dup 11 /C0110 put
+dup 12 /C0111 put
+dup 13 /C0112 put
+dup 14 /C0114 put
+dup 15 /C0115 put
+dup 16 /C0116 put
+dup 17 /C0117 put
+dup 18 /C0118 put
+dup 19 /C0120 put
+dup 20 /C0122 put
+readonly def
+/FontBBox [-144 -236 757 728] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684269EABC53FF7B263765296D35ED1BA4516BF
+4B2D2462FB62E875C5A3AA29
+57EDAE5594C94C6651
+2CC6E059
+28F13302C0A930BA6D76D18855
+CC16896F61CB60D6C777C40DF032DE13487500C191473E46BFC92C879B174A60A66152DC01D045BA252FA1605BCFABF0AD2CA0138B
+7C89865C
+830A53F63189319D8C82FF1925
+1B1D373536E1A3A31B787F40875F92797280679C2F19
+EF40AFE8
+FCC8874C7FF59101F0B6759825CC
+4836DD01D1E8019084355C07E69685A5A4D5455AE80FCE6D52C7B124581D7D27463E65DBA830155AD69E0CCD38597A01EB501580051685DF1F9F77E6658E4BBF41866583281864F1F83874D4F437ED2606C793C25A516CB5A09D0C42D2E1B564B0ABEFDC6BD5BEE9ABC5364AC9CA273BC78DCD8038A7E948A7F7EBEA9E70
+58A2
+1745A0EB9548277D2F2BA29C2B
+68F1CB46
+DB5EC0F3D23AB52F19D269BD41
+83F18D163F87632D16B55190A9284D7A2E24D56AA877FCD085CCDAEB019860F9BDD5D8C57BF0CB0B416EF27AAA50D71A2C6389D1816A669D9258409F8DC9D9232CCC6FE60E950EDC4028BF9D46F7871EDD62573AA4491480FCFF87B6DBA2489A
+3C4D0168
+988D16FCE9A91AB225495EAA684B
+8EADC5D1A3C289FDFD4A568070B98559DFB8CC0A11DDDC043BB0044A302D2AFDFC53BDE2B3B19E97DF43AB14CC91DFD67B7B5EC95C9BEF597347DDA9501DB4B7866D25C45BDBE60D3BBAD0531E68C89FC6577EAF2DE164BF7262A49A3E74E9DE07DB9B7976
+B1B1A580
+97F28BAC8DFD7507714046B29391
+2B31CAF98561A993324CF5873D2C60571079EFBC7F583B5F94DD13D5BFC25318128CFE0F9C4E9855C25D26819C743F2725BC3144FDB8153B5C823CF28C1C6D26F4203C49C326D61EE26ADDCE41AA19126EA550919119553BEAC8E74B40E7FCC799C734E66B70089571A4DF3C2E99C24EB6F2BC581C450B2C7E39A10192EA
+012A
+9C5BA31831281F6694DD239E30A35F8D48C8D8A089D5C52604534C
+294BADF4
+203EF0FE0E50B6914B0B94AEB1E3
+11381ACC017EB85C791972780EDB50A585E96F862F038D805A0D8F1E93C8297A609EB6EDBC615BD5F79BD2C369158D7963695D3D62006CD6991A30D7F9ED0A931B6D53EF654D91BF579693439105E7C2CFE1FED6783504204F88AB1094B208B498D4D2DBB02B163957CE74900A1E39D8969579F00A1C993BBF
+4A00402D
+9B0BA2C9B34FF3F9E8B182A02294
+4E02CB6D7FD9DEE1E8A72B48AD9ECD192FEF43A00FBE7ABB079528D2E28BEE878057D77E90237F861AFA8231897C3E4E5B33EABC557ABA6BE6967F2669F14E6FD689AC0B5E25300CE4C2B82352C8F9509C0EF07A10111ADF194387626E053321390A2168F8
+90F326A0
+405FAB46AAF63824456F24A2CED9
+1A65032FB98D41A87BF1F6F82E9F19B589D71BC0FC89E2A33B63F62D60FF4EC78A8001E6B164FB5DC7927640F6B37C0BC694D7426881B23C3CC99A19A2B5FEBDD796DFD3BBCFE4225A64683C75583B5A0443D5750CA339553CCE7D5C3F0C7EC67F8889F5546E82B963C11D42CFFC36EFD9F5EE69F98EA4BE97E5E6F02458
+AAF9
+E934093727AB31B6161BDA7F1A83DFCFAADD1B03E2A1E824D56BB7D3BA8967DE7735E15CF37F8EF0EA83FE6A43B2660F1ACBAC4FAC036986A92B73962EAABE8417513A3411453ED364FCF2
+13E50A38
+CAB1B5317D2878AEE6820594030B
+26907E5E3257C0C6DF1D897CAD802D533934C0E5F1B3F5C1B371FA57A06AB8E6EE17C0A7862197FA8BEEABFA7BED503F4D058B84388133D2F061D32D00DC26C1B8FE9B7722B833827E9E912754169D351D48FFF6F85E88835B7F1212AE092A86AF01DAD63B378351B6C32F57801F6266A5C0EF6A2AE7D8DD10AF8EA8FD69
+B719
+6C0BFF6CE84BCA7C235C3FE838373F2C799D0CB5B6F6D1743B
+216F9594
+954B39D86A1BFB10BD48225E11
+0640A81CF230AE47C823ADB32A0B9653EF76B7B51C58756B67F2A1EB0456294986174E21E0D872BADFE57D19DA0EF9E91E0B664C1E9A729A983CE2EDFC78010F333BCAC58A2F5521178F829589CF1C92F025A44119F9D2F360B4A94685780E
+91B1D33A
+9C35912145200D6E664FE80C99EC
+9B00946744BC62046D80C0254A6E14940BE2EC17E836465A32B5314E39A5CF30A85E7172008D38425A53861D3293291D3E51701DDA7B96810A8A58611FE270374CD802950CF090A09E306BC3AA3DCAC4CAAE08BDE5937BA8A58F9FD4AFB5AD122C372DE6282B7A37CCE40E8F444D65967D25A644E77A8C75898E714018E6
+DDD7
+0EA904A33803338AFF4C6767BD7A631BF02997EE0BC446EA114DC88AF2DF66B958238E5592C65FC0E1D1
+A772420E
+93671A31EB716F2612533BAE1B
+750318365833983400E90943934274FEDBA8C42AC777C1BF19D54B8BB06E081307BCA364CD9A5C71DD7F2DE62258D636A788919905208682789A541D8DC97CC42CEA13487005ACC273F6518924605D452140F0061114462F30D3A2
+818FDD67
+B5F7C3A37FFAA8868168C338DCAE
+28398846AAACF85BC7D4C10C06525DF642439705A57C0294E3F6B3E8ADBE6D5FD05E8138F95942B45C5D9EBD810CE1FBD96C3441319712E10D9C56C09BCE1B41C98619E3AAA494907075B44673BB7270AFC68956171456EF150EA223A6E892402B0E20407FFD3231B88C6788D41B911742E1DBB253CE
+25F04DFA
+00553207FD8089361EC2B831FA
+C8B35A706E25A585FD239F158A20EDCEA08CFC28FB55233BC9481BD49237DB709B0D0C9E2482D10A20C3907F911CC0D55F0EA164552FE8831D1B3B137FEACB3BE870012A11E5AF0DA2F7B98EE686C52553168026814F20
+C140BC3B
+11B178D5BF8FCE62576E316F2A64
+A8F46939E4F0552F5CBC4F3FF0E7C93674FAE17FFFA156469D26A6F5F4F957643C5FF0839F56A2A87C745A725E2B0FF5E14FF5B99BF1CAE746A105F29EF9E32829EEC3DEB8F3A5680A40D4D16FDCE2627A47EDE3F6C9E9B34D7C32417A55D4610AD609B3BF0751EFC7DE6742ED34584D86C1268FAEFC465A5725BE9F1E12
+E0ED
+546F339F1CF691331BAE76AFBA4F351C0C7A93A25E4F8B
+3FCAF16A
+C55AE59697FF2203F8FC70C3D5
+8DC484BEDA17A93085B51FB60AE483845697465E6DA81EF3F008AAE00217E5B35F6A7EA5932F2D89F7A60FA2A8DC22E4A37DF983CD58E0648DB9E6A724F5431F0B539534B0189B580CF0672515D1D7F1B4E945E21C9312C83DAC
+E7397768
+72F3F94088497797C97013FD9858
+C8219FE26F2A39D96074E319563CC275454B03EED63669732722D19EF5F8CA11B0519F104EF4EED95DBFC1B1782E16C8DB51C689C5093B275D134033B0EF8F89731D0D3598DBCF698499FB8152DB9683A0D65D423E4B22B63B640F1BEC94E4C4A6DD92A59669EAF2AA8EDB493762EE7014E02D3AC4C7FAD00CE1327A5986
+60D9
+7D08DC7C064698752D45EB74CF8BEDBF0EFB45A8A01A854DCE6C29BD336B34CAD7C6F561C020
+F9C7B9B4
+D6EE5B6CB55B31AD859727FF3A91
+D6EFF971218027792FC4245327BA1D4213A2AAE03C4F89663796924F2652AE379611ECAC648BE250DB5D43F95BEEA5875DF78CD128E4595D17CCF405878BD0175369D074752B341F7DD6D89886041D8A9427632BE87DDD8108506A99F7E74442CF528F6A356F3749A20ABD9057535AAEAB7CCB1782033AA126D9F0044C33
+B2E6
+17148E50617D58A3BB
+02F7D31E
+F1D8A2F44BB06661B3B7EA6C706C
+3433977E40EE6751
+CE1AAA21
+5419E604F28D9E19F89403E5DEE028749AAC82B63D2AB0582CD8F60E91C08D7DB082
+D13780ADBD61B74FD56F00B7A3B45AC68296AC2F3D8BBF6A0E0F79337862EEEF0C3C7F726773
+C50751300485350EBD0E928EC16C0FB1A5772444ACCF56C86D643A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch12i 12.00 /PSOwstdutchi newFont def
+/wst:dutch14b 14.00 /PSOwstdutchb newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<1a29383429362a0d010f01102932272c3125362f012a3336011929253739362d322b011a29383b33362f011c> 2207 558 0 7384 -1 s
+<29362a33363125322729> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0b0c> 9346 13385 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13267 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13267 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13267 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13267 3 7133 32 s
+wst:dutch14b SF
+<0b100f1b131615> 1271 1458 0 2055 -1 s
+<000503000d1a1315120008101b17101911001b160014100e1a1c1910001910181c101a1b0419101a1716151a1000171019111619140e150f10> 2055 1458 7 8364 0 s
+wst:dutch12 SF
+<1d> 1271 2086 0 1434 -1 s
+<293539293738093629373433323729> 1426 2086 0 2876 -1 s
+<003429362a33363125322729002d3700382c2900372927333228002536292500382c253800272532002629002d323a2937382d2b25382928003b2d382c003229383429362a0800152932> 2876 2086 12 9461 0 s
+<41> 9461 2086 0 9531 -1 s
+<29362530303d> 1271 2330 0 1773 -1 s
+<00373429252f2d322b06003229383429362a0036293539293738093629373433323729003429362a33363125322729002d3700353933382928002537004038362532372527382d333237093702> 1773 2330 8 8596 0 s
+<002a33360025002b2d3a2932> 8596 2330 3 9531 0 s
+<36293539293738> 1271 2575 0 1943 -1 s
+<0025322800362937343332372900372d3e2908> 1943 2575 3 3626 0 s
+<000f0038362532372527382d3332002d370028292a2d32292800253700382c2900293c272c25322b2900332a002500372d322b30290036293539293738002532280025> 3626 2575 13 9531 0 s
+<372d322b3029> 1271 2820 0 1792 -1 s
+<00362937343332372908> 1792 2820 1 2682 0 s
+<0014> 2682 2820 1 2848 0 s
+<36333100250038362532372527382d33320036253829060033322900272532002d322a293600333229003b253d002532280036333932280738362d3400253a2936252b29003025382932> 2840 2820 12 9461 0 s
+<41> 9461 2820 0 9531 -1 s
+<273d08> 1271 3065 0 1512 -1 s
+wst:dutch12b SF
+<0c0609> 1271 3551 0 1685 -1 s
+<000a> 1685 3551 1 1887 0 s
+<10181c101a1b040a> 1883 3551 0 2675 -1 s
+<101a1716151a100009> 2671 3551 1 3571 0 s
+<1019111619140e150f10> 3563 3551 0 4605 -1 s
+wst:dutch12 SF
+<1f2c29001f111c0036293539293738093629373433323729003829373800272532002629002d323a332f2928> 1271 3974 6 5470 0 s
+<003b2d382c003229383429362a00382c33392b2c00382c290039372900332a00382c29000738003334382d3332> 5470 3974 9 9531 0 s
+<3b2d382c> 1271 4219 0 1657 -1 s
+<0025320025362b393129323800332a001f111c231d1d08001e3306002500242428292a253930380200362935392937380936293734333237290027333131253228003b33393028003033332f0037333129> 1657 4219 12 9461 0 s
+<41> 9461 4219 0 9531 -1 s
+<382c2d322b> 1271 4464 0 1733 -1 s
+<00302d2f2900382c2d370d> 1733 4464 2 2552 0 s
+<03> 1398 4811 0 1504 -1 s
+wst:dutch12b SF
+<000416171b0415101b171019110415101b1710191100020700> 1504 4811 3 3785 0 s
+wst:dutch12i SF
+<0e060a0c1006070c0f10> 3785 4811 0 4744 -1 s
+wst:dutch12b SF
+<00021b00> 4744 4811 2 5099 0 s
+wst:dutch12 SF
+<1f111c231d1d> 5099 4811 0 5948 -1 s
+<253228> 1271 5157 0 1608 -1 s
+<003b2d30300039372900382c2900373d373829310028292a25393038003733272f29380026392a2a293600372d3e29370600250028292a25393038003629353929373800372d3e2900332a000b00263d382906002532280025> 1608 5157 17 8859 0 s
+<0028292a25393038> 8859 5157 1 9531 0 s
+<3629373433323729> 1271 5402 0 2072 -1 s
+<00372d3e2900332a000b00263d382908> 2072 5402 4 3347 0 s
+<0f37> 1271 5748 0 1515 -1 s
+<003b2d382c00382c2900373836292531003429362a33363125322729003829373837060025003727362d3438002d3700253a252d3025263029003833002537372d3738> 1515 5748 11 7159 0 s
+<003d3339002d32002b2932293625382d322b001f111c003629> 7159 5748 5 9461 0 s
+<41> 9461 5748 0 9531 -1 s
+<3539293738093629373433323729> 1271 5993 0 2616 -1 s
+<003429362a33363125322729003239312629363708001738002d3700272530302928> 2616 5993 5 5706 0 s
+wst:dutch12i SF
+<0010050d030e0e030f050e080d10> 5706 5993 1 6838 0 s
+wst:dutch12 SF
+<080016333b293a293606002d2a003d333900372c333930280032292928> 6838 5993 5 9531 0 s
+<3833> 1271 6238 0 1456 -1 s
+<002b2932293625382900323931262936370025380034332d32383700332a> 1456 6238 5 4127 0 s
+<003d333900333b3200272c3333372d322b0600382c293729002733313125322800302d3229003334382d333237003b2d303000262900332a003937290d> 4127 6238 11 9531 0 s
+<0736> 1589 6585 0 1847 -1 s
+wst:dutch12i SF
+<0f0814060f0d0605> 2033 6585 0 2712 -1 s
+wst:dutch12 SF
+<372938> 3177 6585 0 3432 -1 s
+<00382c2900362935392937380025322809333600362937343332372900372d3e293700262537292800333200> 3432 6585 8 7380 0 s
+wst:dutch12i SF
+<0f0814060f0d0605> 7380 6585 0 8059 -1 s
+wst:dutch12 SF
+<08> 8059 6585 0 8112 -1 s
+<0730> 1589 6931 0 1824 -1 s
+wst:dutch12i SF
+<1204091106> 2033 6931 0 2495 -1 s
+wst:dutch12 SF
+<372938> 3177 6931 0 3432 -1 s
+<00382c2900382937380028393625382d333200262537292800333200> 3432 6931 6 5869 0 s
+wst:dutch12i SF
+<1204091106> 5869 6931 0 6331 -1 s
+wst:dutch12 SF
+<080014> 6331 6931 1 6564 0 s
+<333600> 6556 6931 1 6802 0 s
+wst:dutch12i SF
+<1204091106> 6802 6931 0 7264 -1 s
+wst:dutch12 SF
+<000e> 7264 6931 1 7490 0 s
+<000a0600382937380028393625382d3332> 7490 6931 3 8895 0 s
+<3b2d3030> 3177 7176 0 3494 -1 s
+<00262900> 3494 7176 2 3860 0 s
+wst:dutch12i SF
+<1204091106> 3860 7176 0 4322 -1 s
+wst:dutch12 SF
+<003729273332283708001b382c29363b2d37290600382937380028393625382d3332003b2d3030002629003f> 4322 7176 7 8327 0 s
+wst:dutch12i SF
+<1204091106> 8327 7176 0 8789 -1 s
+wst:dutch12 SF
+<3f> 8789 7176 0 8895 -1 s
+<38362532372527382d33323708> 3177 7421 0 4320 -1 s
+<0737> 1589 7768 0 1847 -1 s
+wst:dutch12i SF
+<0f0814060f0d0605> 2033 7768 0 2712 -1 s
+wst:dutch12 SF
+<3b2c2d272c> 3177 7768 0 3703 -1 s
+<003b2d30300037293800382c2900303327253000372932280025322800362927292d3a29003733272f29380026392a2a293600372d3e293700383300382c29> 3703 7768 12 8895 0 s
+<3a25303929043705> 3177 8013 0 3900 -1 s
+<00373429272d2a2d292808002112292a253930380d00373d373829310028292a25393038003733272f29380026392a2a293600372d3e293722> 3900 8013 7 8806 0 s
+<071e> 1589 8359 0 1882 -1 s
+wst:dutch12i SF
+<0f0814060f0d0605> 2033 8359 0 2712 -1 s
+wst:dutch12 SF
+<3b2c2d272c0026292c253a2937002e39373800302d2f2900073700263938002a333600382c290036293133382900373d37382931> 3177 8359 9 7923 0 s
+<0712> 1589 8706 0 1937 -1 s
+<37293800382c29001f111c231a1b1213180f> 3177 8706 2 5304 0 s
+<20003334382d33320038330038363929003332002633382c00373d3738293137> 5281 8706 6 8240 0 s
+<1f2c29> 1271 9052 0 1631 -1 s
+<00362935392937380025322800362937343332372900372d3e2937003b2d3030002629> 1631 9052 6 4603 0 s
+<00382c290026392a2a293600372d3e29370034333738292800383300372932280025322800362927292d3a2908001f2c2900073100253228> 4603 9052 11 9531 0 s
+<0719> 1271 9297 0 1649 -1 s
+<003334382d333237002536290032333800312925322d322b2a3930002a33360025001f111c231d1d00382937380808000f37001f111c002d3700250037383629253100343633383327333000253228003233380025> 1649 9297 17 9531 0 s
+<31293737252b29> 1271 9542 0 2025 -1 s
+<00343633383327333006002d38002d370032292729373725363d003833003033333400333200362927292d3a2937> 2025 9542 8 5854 0 s
+<003932382d3000382c29002932382d36290031293737252b29002d37002829302d3a2936292808001f2c29> 5854 9542 7 9531 0 s
+<26392a2a2936> 1271 9787 0 1826 -1 s
+<0034332d323829360034253737292800383300382c29002a2d36373800362927292d3a29002a3336002532002d32282d3a2d283925300038362532372527382d3332003b2d30300026290025302d2b3229280025322800332a2a372938> 1826 9787 15 9531 0 s
+<2537> 1271 10032 0 1457 -1 s
+<0036293539293738292800263d00382c29003937293608> 1457 10032 4 3420 0 s
+<001738003b2d3030002629002d3227362931293238292800263d00382c290032393126293600332a00263d38293700362927292d3a2928002925272c00382d3129003932382d30> 3420 10032 13 9531 0 s
+<382c29> 1271 10277 0 1561 -1 s
+<002932382d36290036293539293738093629373433323729002d3700362927292d3a292808001f2c290026392a2a29360034332d32382936003b2d30300026290036290725302d2b3229280025322800332a2a372938002a3336> 1561 10277 13 9531 0 s
+<382c29> 1271 10521 0 1561 -1 s
+<0032293c380038362532372527382d333208> 1561 10521 2 3113 0 s
+wst:dutch12b SF
+<0c06090006161515100f1b040a> 1271 11008 1 2698 0 s
+<10181c101a1b040a> 2694 11008 0 3486 -1 s
+<101a1716151a10> 3482 11008 0 4197 -1 s
+wst:dutch12 SF
+<1f2c29> 1271 11431 0 1631 -1 s
+<001f111c23111d1d0038293738002d3700250038293738003b2c2d272c00312d312d273700382c29002c3838340034363338332733300039372928> 1631 11431 11 6969 0 s
+<00263d0031333738003b2926003729363a293637080017323738292528> 6969 11431 5 9531 0 s
+<332a> 1271 11675 0 1457 -1 s
+<00372d3134303d003129253739362d322b00382c29003429362a3336312532272900332a0036293539293738093629373433323729002d3200382c29003725312900273332322927382d333206002d38002937382526> 1457 11675 12 9461 0 s
+<41> 9461 11675 0 9531 -1 s
+<302d372c2937> 1271 11920 0 1770 -1 s
+<00250032293b00273332322927382d3332002a3336002925272c00362935392937380936293734333237290034252d3608001f2c29003829373807373429272d2a2d27> 1770 11920 9 7798 0 s
+<00342536253129382936370025362900382c29> 7798 11920 3 9531 0 s
+<37253129> 1271 12165 0 1736 -1 s
+<00253700382c29001f111c231d1d003829373806003b2d382c00333229002528282d382d33320d> 1736 12165 7 5344 0 s
+<0734> 1589 12512 0 1882 -1 s
+wst:dutch12i SF
+<0a0413> 2033 12512 0 2403 -1 s
+wst:dutch12 SF
+<21> 2403 12512 0 2472 -1 s
+wst:dutch12i SF
+<020a080b> 2472 12512 0 2870 -1 s
+wst:dutch12 SF
+<22> 2870 12512 0 2939 -1 s
+<37293800312d320931253c00343336380032393126293637003937292800263d00382c290027302d29323800372d282908> 3177 12512 8 7631 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (16) 16
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0034 put
+dup 3 /C0036 put
+dup 4 /C0044 put
+dup 5 /C0045 put
+dup 6 /C0046 put
+dup 7 /C0047 put
+dup 8 /C0048 put
+dup 9 /C0049 put
+dup 10 /C0050 put
+dup 11 /C0051 put
+dup 12 /C0052 put
+dup 13 /C0054 put
+dup 14 /C0058 put
+dup 15 /C0059 put
+dup 16 /C0065 put
+dup 17 /C0066 put
+dup 18 /C0067 put
+dup 19 /C0068 put
+dup 20 /C0069 put
+dup 21 /C0072 put
+dup 22 /C0073 put
+dup 23 /C0076 put
+dup 24 /C0077 put
+dup 25 /C0078 put
+dup 26 /C0079 put
+dup 27 /C0080 put
+dup 28 /C0082 put
+dup 29 /C0083 put
+dup 30 /C0084 put
+dup 31 /C0085 put
+dup 32 /C0088 put
+dup 33 /C0089 put
+dup 34 /C0095 put
+dup 35 /C0096 put
+dup 36 /C0097 put
+dup 37 /C0098 put
+dup 38 /C0099 put
+dup 39 /C0100 put
+dup 40 /C0101 put
+dup 41 /C0102 put
+dup 42 /C0103 put
+dup 43 /C0104 put
+dup 44 /C0105 put
+dup 45 /C0106 put
+dup 46 /C0107 put
+dup 47 /C0108 put
+dup 48 /C0109 put
+dup 49 /C0110 put
+dup 50 /C0111 put
+dup 51 /C0112 put
+dup 52 /C0113 put
+dup 53 /C0114 put
+dup 54 /C0115 put
+dup 55 /C0116 put
+dup 56 /C0117 put
+dup 57 /C0118 put
+dup 58 /C0119 put
+dup 59 /C0120 put
+dup 60 /C0121 put
+dup 61 /C0122 put
+dup 62 /C0262 put
+readonly def
+/FontBBox [-50 -238 920 766] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268422460C01E0C8156E6E2E0FACCEE618170848
+BF8730DB32B5D68060473C23
+9DBA701053746F2663
+395624ED
+0A9868CC80E7AA0866DA2F6FF94F
+9E1E6F3D751AA0FB2452C121655DB9282D64179923D7FD12CC5146ED4A5A5F72528C55004630933E43CA7E44BB6D3A0AA9524C74EF56E61D6A17504C64B12DF983C5DBB4F1ACEC71364A5337C2A69585CA84A2DE011E908420B5EF740FA88ADADF7A1F6AC91CF9
+06DF6250
+7A30C3EA2AF31619C5F426179525
+96187203D1338EAA4668AF99943F7D3CF80FDC803D1C4BB07099FAC10129F1B47128072044564872FB89B00E0D4E59DE215935EBA923E11974DD79FBA221E4987E2DA7C93CA8CC566BE380B4173029E79BD8FBD281C71E4CD2D35B64A2DEFB29AD860295F4A73441A84F9D5DE0E4E0D2DAABF95CE12B5CE146CEFAEE1CB7
+238A
+E33C2454C707147195F2B1CD
+2718B017
+9F17F8D4AC659C483DCB2BC115
+43731619F2F1C9F6961A94AA217607A9E63FDCD42E8FB86B538BCE1AE2FE2130E6BF6C67F285AAFE9918F9BE50845CE38BFD740F79675E7418
+DB49CF14
+2077A1E1504EF1C6305FCA2665
+39D77E9C4CE2F74633928D251FAC7AA975BEF31F4DA4D7
+FEF533F4
+BC60B778573680A76CCA71BB04
+D032344517DC08739FA97281A32861B2E94F1DD9276511E40D4F1AD97D8CC6
+D8228930
+60EBC52EE15D31A917FD0F429A
+3E06DC3EAA0A3D820369EEB0137D3A87E294DAC7D9F2A3C6D38CF082
+4E974DFD
+7E4A87950CC4AA78FFE0ACD951
+1EAF44E182495812FF02BC63642B7346DF0DED276EAD97FB532D3EE1C6682B5D0E68B95A36CAB7CF1BB21A5054B454F6E72E1D43DA44DC8755836D8EADBFE0A412B78201F60AF1ABD275
+39E9BA98
+E0EDB8D93741DEB13809A7514F
+41BB6502A81427D5DA993139395EB1F95C6E437707D66E2E96C9FD15CC15D47564767C2DCB0CF51CC142E350157B10A1997921D55A5CBD6CB454F626CF1480
+54E617C7
+1FBFB6F8C639FEFF432F43EF89
+7224867A837C710D521A7D52C369625AE022B9924A8507CF8FFBD677116E0D6B4AD3D0979CF7B7CC4E877D2B9C26CDD29F304A467FA1DA1ADDD141A5764EEDAC23C61AD0354D8CFF5C6CA2CD49189798BF8B34AC73290A80FC3D
+FC5B3C09
+B9A975D4F4456A6BFF90973CB642
+1043F7C78FE584415B5C1632E75BC390929E5ED6AEE1E994EBDD21E5881D4AC0C3D5BEA6A22A327C36B9B5991E3C7FA404CEC5A9DD2697B18A9127B80F72316BED9E7C6B34A3D135EAF77F601E1D402643A42B040C95C7662FAAFA32017C722D11F72F4E0EDBDA6D740C6E70A79268
+20A44990
+94957E2E7FE0E81116B6C11FCC
+B97085657272D02EF9ED9C0478D88E81F9D26274C4202B7EB7982ED6C764D65783661E8F0E202455EEEAD4059CE6F4AE0A9911F32FC686CC68EB
+E472308F
+1B9FC3C695E27E172DFB56143AC0
+3A0FD1802AB6DD2DFAA2D93C1BB2540522BE14E36E8FE56B6605B1290890CAE61A0CA337884782126BF02E80F1B452716B79DE3754901E7D2B235252D2BBC05FD1998977D39C79B88A5C0E851E0B3CD267F95CF186CF44091132958B8125857C85E3EC09
+0FA3C2C6
+0B163F70471FCA237363B9F036
+9B66BA6C392F559FDE9BC172566602C0EDC93E42E65123642F54816EE8465A6C3A8DDF9CE5663BF13D3120575E2AC5E82384FE3BE41B
+E9EBAFCF
+E0FEC8F9EC3F5803BFE98757D5
+32FCD5ADF392B3C1A865DE3E2637AD94303F68FEA1BC8383962B609F35F02A27EC6ACADD8BCB3CDE626A461084C1AE53C27AE02FC3CAA9C55CE3F570AAE326B127BD477A5852CE5FCF9694B9F3428627
+332A07CB
+F9DC23C9C1A1DC6779152D94C87A
+42A9148E34673AAF3CD9BEE72582504B7275A84EFBC62509053D0B75C40986B1672271EECD79350C2612D2733B47680DFEC69CD61B430CE79AEBF4167C5D6577F69A6F4401E621BB5894B97180A4395F67D8C0674C1CD6FE3ACBB3E90545175C39C21AB3EE05A7AF85083604717764E4EFD3BA
+D3DA06BD
+8E52741D6083BA12AFC01AA1F4E8
+7F1F184FC0395B5DF6DBA4746D0F8568EAA5FD01698A777698D53D22CBF2642956FACDD7B848949D9C37DA9CF7BF7FDA3B6CC7663B2451EE98230BF2CDF01A549E785800C5CCC1630626C33A3D58DC416F3AA899ECA056D8FE43E2545212F2D68611D1723CB8F0CBB68566373BC9D347396D36A84A3963F1FE48325E2F36
+D8D7
+32
+EBA75864
+7CC3ADFE0B574DDD83A2598C94
+22463D8BAFFEC947334E62F7B4B405440E004BF63BE70133FEFD8640FB800F7DB67E49971D2C5A0FC09EC916CFC0D49EB3C994B3638655729047F47C00FFA03610D6F0D67C8B8D119A9B65FFBC383DD54CE3008006DB3A9FE11703CE32E55F47DF
+4DC24BA7
+1A4F0BB1689C3B6C57B61F8E76
+41F58AC1B80EB79539C495ADA9CC84BFA01722635CA0C5AC612BCE06AC95E0D4509CFF5BC96ECBE8453CCC15208AFFB77F01EF5E42FC5B460988B69B5956DAF04C2D5D9914CE791428F414340963D3EDD0C30D53BA04FC2F3BD824C048784CE5E234CA
+B2A8B334
+4213DE597318350CA5E236DD0223
+6DF72F195B03449E9981C4983FF03869AA57BF2531D7DF32112D3B409539AC5396399C4E03B875622B01A27790CDC9BA8B6F3284555750814335BC3B6A0DA65D284CC097827F84F19BE803A2B908885AA22FB4885315843585C9CE16D5845887F33FEA37E2B2B5EFB2402A68DA1B67F18C9D3AB1C3836A668EF90B17A61B
+A1724E3E
+C3F6B66FA40B01EF3720386289EB
+D7CCB6313DBA95E993CADB81F52D42672F59F63DE48AFCCE8C48BC408171053EF9C9718F78B0B88E6FC8AFAB0BBE1234F516433C6774A24A1584C537045F0F83EF0147B564D7B3AD3D7FAB8C7C9F0F4A1CBE73D1DBC062C1E374571AE3396644E1398F94522295D6B321F43DCB4EA7BE8AFDBF0BD67DEB9AEE50050CE49D
+699B
+02333257470F45D1A3AE29
+6C7644DF
+E717E0BDF52A9C8B08342FE087
+6C068732B9A06028FF9082EC89AB71B379B848D3B9A6BF3BCC5E1507BB93056E001FFC0A6701A416571A184EEFA8977F8660FB22E6D8259684D88E
+FBBF92A9
+5A8D8B66F6EA83B7899B618529
+F7CD8EA0971010E5E58A836BF6BE3FFBD767B3C273E304ED9ED24493403E96E704753023ED02E7B7A4D90A92E699F79955361268F85EFD3639C47F717E0F2685C5F29A358ACFF9
+61044FF0
+933B8FAB33F5B340CB3422A7F459
+CF47F6F60B95DC8B61BA22DDF0DB8723563F7177B101B253494F8770C95C2856654537B3EC585743087F418A8DA44697E5CEB742873C7DC9BBBFFD1013456256B3765E621EE410E14C87F59E67588C91DAD6FD1A921368C2C6FFF71EC180DCB743D9C71FB9CFFC2AFF8C4B95839CB6
+DF2F4F08
+D5D5E0C81466C4DB9BD2E0064E
+5832E8606D49C100519AF39A71015D6EBC553ECD67BCE00B9ACC84A7FE47B31BC79C4FDDE6BE924EA59F1D6DC0BFEC2CCAEFE77E1F8A9E191C72700872F0AA429B88D1959C2AF7F81E1CD12F4EAFF3D767AE5D2BB822821716E33B01
+5EB9B341
+93CF90CE65E24443966AEA7645
+1DF62E972844DD5722A7DD702071E106E64C48980054B056AAB3864DFCC01E4B04563A54293F5BB2642E43C36CA9B3E3C04F9ECC07BB460DE9E055A863F69300741B5B8479C254E4A5E4556E4601728EB61533
+96352AF5
+2EE510461C77F99BA30359E4C22C
+DA8CF8B8949011F9577184D8A7A4F71D0E0AC293C6D656E40E9797D924CC631FA66160CFC5BBA197AF55B3F8DA0A09B4B34FE2FDB74E30201E160ABECCEDB5BCB0F4256B877BFE829EA1984C926C032EF8EAEF259153C435236C58CBFF910FFE4465294F106CA88D6BE1
+996263A9
+12E0DED1932844D96248F7B7687F
+1681D1037339244C5094598F3B5007EC9140F2BDBBCD0F5AFD189F62F0104E9143D336CE31F8655AAD4D94D4B3F56F421BBDA100358A5B38906CB1A0FA534DB3332CB8A590401D313404641E7CAE6ADF8AF2F5D3B7B63FD3AA679639DA1000D75B48A30A5E633922EBAEAA41E4371D10495D4C160B78C86B77EA3C059F45
+78A5AF24
+FCB29C62924EA7E76D40CCE1EB5F
+C3CB801426FECA4D321D08B89EE0A898E6078D76618C3EC2300CE50CAD6B5E7512288F0E2D5F911B8DA48E74AEEDE9D2E2D7CADDF1A46595D06F3185874FD585A91E0B7E976B778082572400591EF83360BEF24D2D22DD0F761D3D3D4BDB2D51BCA2F7ED4EEEBFD9EF49CDFABCE9E1DBC382739C4C329D6C7927BF654BA0
+810D
+D95FB7
+43068741
+81D8C3BAEE35BA046E8C6A322C
+7FB4E132C8EB9579B71C830DF08C0FB482659829C451B87896156D494504DE1C70FBF1B7E4E8F6B583444681DDD1F3205C565E15310B4775EEDE9C158C10D69B31684B4A9389F19F11DF654056065BA84C
+B107B599
+A2020404B18152B07FF26093F44A
+497312DD4A47E97436DE4D414EAEF11965D14727B7B400B000BE884CB567A0EC2084167A9869B3929116A1A0D7A86E1DD9A0284C9930E27024826AA48BC24E487F35D85C16B1E445E24E67E66A98BE6DD1DDB336904D4978270C9ACEFE59AA878CE97B7E
+6606F911
+50CA9848174ED38F4170DAE9C7FC
+A9F7EA5AAB2519076B77381BD4DF8E574490CED069F195C5C3E63F17E1B3B14F67AABACC6BAB4DDBD900F14C002987E33F1BD497DEAD18416E5E26B2A39F049379C79023DF98AF17F8B99C1E93B459443E5D0D3F485FC63B2F5A8FDFF6D0E06A1FF8A0A28F45F95F6400F0B2449B809FFEBCD44F0150688EE9CE06D9203D
+341F
+E61107104AFD881D91BD35EE39627AC612A6558860E22791865FE79946B6B942D80F1ED6D01E27
+25F79B7C
+6C7D532AA1F7BA1A2580E431C10B
+B4D94A38760FB1ABB1752C52632F4F4BB4F323BB3A5429949C4C99AE67A93B53DFCF5E439113BE89DAC1DBE36A30A0199FC15C74B9D4AF5A1C1B4FCBD849D3C050DB07EB08EBB17F882B626C138213C6DB4AD472D362AA2B95F65177FD5402FD16AA91436003E8873B80C2B66B0C344BF28C0E
+A5FD61F9
+B4160BAB17A5E24AE66C506CF0
+03828E7FD3008243A21993BF9A69DA4DE0C2658C0838
+E0CAD58C
+34E853D75FB3FF3FCE3D002B98
+69CBC177034A73AB7E2BEFEF631226C4C5103D8AA6052F3216809FDBEF55419E9429FCC888FA88875F8DC85CC1CF6F7DC8D12E6E67CD82C9E35A
+84B290C0
+5306A686F9F848BAAC7795916C42
+1D27476E033A6DAC7833968ABDC93047199A03A9583A874DA5F14E1A0F5D7572ED5196A06BE55179C3FEF9694EF159CA042CB31E6378A99F6BA34D50E6E3B5C5BA781E745F7AE376E484936BD7C1C7AF59DB7449C9F9C2F43A40C2691A8948D76215BC3B37DC4271AAA5D72962A9C7A676D7A3C64ABAC30F36B2A3E51C5D
+DD25
+8E7C57
+3E15EAE4
+4CEE0B20BEAC7DA7133FCA04C2
+E431EE3FE114FE5DFC7666C2DA316E3A3D3A7CDEF31BAE3C008AC57F54C9949305745AFF0A63E7EE798C8618DD7A0F5556473CDCB6019494B9846E0178EB8AE66F39DBC1CDB7AC8BC488FA89F99ED58848D7B214E84A2FCF
+3C620CD3
+2A7F6DC649FB18964C14DBD672
+99AE5B40239759751EB12ABD4A84655B005830E2231750BDE319735328EAC396E16B419E31555A4AA60A12118D2EA82FB727C66CA33A94980199D4AAC3BB3326FF659A04A3508B28930B6BD1FAB11AA9B944
+7AC0456D
+0AF7F6FF5E839BB2DC71F9FC08D9
+8CAFC92E19798F484A1D52761ED82356242E8CD7E8B4A86F73D13BA8B09CD6943549DDDA806834BBCE5C5DDD0D945ED582387FFA014AC840D729A975E4F688CB8BECB76D76541E60C36EC69D839A9F72C19E12180C2C515964D19957FD7B26A5ACC24921DE5591F1F832E4AACF28
+70F6CA88
+4EA2BE09B7913DE479858A4445
+ED454DF00B32A3EE19606B7DED20ECBE42B7F9873327E46BD732F7DCDE14C654D038EC6785FDF1CDF879044AB8CDE56FED655AA3B02D0AF9985004A15F3E1297F3CE37C63E5354954C65C21F26BE1701E6D728BD6165D1780D
+E0B2C862
+376966BCF938D908E2E31CFB6F
+594D326DDDAFF085911CA4FF56BBE47A6894A703126D7457A3A612BA9B26811D0EEF995FE4DAAA3DBC70EE6C83641E3B3EAE0664DEBBFFA15796E4AF4E485AF9B8D8C94796DD6F8831A38ED92A544F25A2ECDA1932A31890D0D3849A
+A8FF61FE
+DE9E377EFA588A6E1CC0CE5C7251
+2D196F8D8F12884276E4BC7D847207C905ED42B1E6A780E6E733C4CB7CBEFDA2968CDD54775D38F8633891816CD966631F4440A75C55C59CFB1809067A100AB9C5D826469142AE65C9E647F5284FDE5E67AAF7DC0922257CC5DD5D07C5EF4EE702C2EC21BE611A9829E17F16AF69C78B05FC837D230FC108E65422EBD8BF
+0AA0
+1C2C3250640E5624730C868EB15E9A8F00B0F168118A6D79603F569C677B60297C3D17938DBEDF1940E5F0AFF971FB
+DC37C89A
+7BF0D6F546847038B250A2A18E0F
+D974135F9310DF1C5510D234E61941E56FA909FD6CD7B1F674DF7CC91555F5F256D2231B282547A06012B2E1FE111A7C2768EC957B8176D8AC654F55C7CAE448D136C032026AC7C5468D0D89770FD4BE5046909418B6A16DBAB8BCFE24270BE621CD95F1A5EB91D92D12F97DDB
+884AE8AC
+9CE02A62F41D8E5A0D5C51E64C
+F72B4AD985D8A5E5784DA22DE800F7E92D0FF9E91135543012CEC43B494F974E39DC27BB1BE8F2362FAB761E9849D2F55B9CA26932A8EB6459D43C1F91E013A612828E65E12C9EC16CF9C045F7D765C7
+F49243F7
+C921363B118561BB531BDEA4D2
+626A0AD66D8CD39DDE64F54DE437D8E344ACEC15F27CE72465F37AD9B0EE5F3C75A4FC74467B825C3931E187C1DDCDA9F8336D61E6AAFBF24B5EE1B006F7491BE3636D757D3905757711BD653951B4FD1F2B9F5789A32298D209AF918BF3755C6524F6
+827680EF
+D453DC492AC6160DF8770D3D92EB
+644A1E86A9BFFDEAA819EE50521A0BDB53F66A0D2D3D0B012C19CB71AD8889976A4F88433D4269C0063E819566AD9C39622178B3106035D2E4984DFA92943A87337B9FB4A1E1E89C11E912C8F41742469730854A78A2970F8C66C38B8ED9E39765DD7F3AFF695C8B1EE4C3E272A25ABC2D09E418DD67183EB0FDF65D4692
+6D1D
+04C212834E825813727E53B4E506F5F313E8E31B325B1E00FF905C8F5478352FBC2DF2
+AFD0F409
+8DEB5E30F212983A6D40B5B910
+E41AF4F99BA3A8E7C3EAE1FA570C84F332AA03153F6862139C48BB55CB95D9D52D15F679B2F346318754334CD7E8C0C6B46CBA56EEEE
+2BA62A8A
+4EA0BC82945486657BE2479C6E65
+7A4D887489A162F3F48E2D495B1B5B39D3027AE176CFDBF08F54AB5E540E23BC509E3C150C7AEFAAD4FC77082A36F390E3202648A5E9D7E6871BBA560B26F752E2AA148CF6998A97C6ABD8649A9996EB85B34F0D0AE24743B6C099CCEC6AE591549471EAE7DAD871058EF3F27C8EF53E1EB3227BD914E4EF063C3FAD2EAB
+45F3
+77992D9C8D1BC9A9823B20DB25F10013F77082CD443C2613CA28789DA3A3EF
+D489E0CA
+F370BF2A769B8D2F0CCF6944439B
+59CDD0C3810E2EE651B487AC766DFB24C8255B658A32BBBC15F94EEED37F0A84477899CE4B43617387152E56765EBDA4E9AE989710520D59C7C99B298DB166768DD2745D5F684FB92EC41D2CBA15BB9E459F44E710A5CFECE8E605E81AC319524763BD8C33AC053890ACCC52
+681C20E7
+4781ED98BBBD2C4FC52DE32391
+7F5A2060E66B9699DD89EC562D21D33631393A13EC465628A1E09EB967253315D7EBA0CE064ECF84E018127B44192CE6CE7CC1E14E51B594C5829278B280C49590282F1CA919
+60ECBAE8
+03B3938E1F854E478DF232744056
+1593F32ABA3F2E3286B092B3FAB22C930822932F53C9878D0329F50C50E030570EEE29723D206F672C360850930D681954EE05666BC0E7FF69546B84CA3A3FFF998614CB69105D5055386A15D75929ED960EAA34D79E66EB22AB91209CE7060392E72B0B92813747225063C7144FCA59E59A6A565EC853
+2902D342
+CA0990A5F1C757F419F60EE635A4
+C8F7A3B63FCD08699926EC9A66939C924B10730821CB7822E5926D8B3BFF516CB9599DD5F44EEAE79AD52820B3033EF17AFC11B3DF1EA8D8E112E10E1E5F366AFAA1BB7A9B563891E592F99395CA89BD6949895FEA80A3C400C6FF4CDAA01C57B5E705D2CFCA53B2DDB7
+2D9282A0
+6D8C1AB91F9EE3D17B5231FB79
+555D037DF00119440BEFA13F3F2B729E3A8661041489351BDC206113AC7EEFAC9E94D02AFAA1C3075CF1AD272CD11B6D8DF9FF6DEA4F4CF0508DA0727EAF13BB2AC99B51AB18A9CDDEBD565469D641A0D63A7DDEB29F1E
+BA1EA558
+87407E4ECA1BCD55B88363E48108
+AE87023F02C622D2A99E34072FD37B0FDE4058E51F667C4390A43ABE1C64C923CA5F52D3D9A1083BA6739C3D7A33CBDF66B93DA0A62EB12F7A4E7680492C6EEC82015F3D2CCD5712360C6E2EF01E18D4712D7661DA9D3696D055E6422EB7CD5039C691655CFF67547EF809CE8916C1369E28A9B63E3013F72585D6B5
+3711BF93
+50F34EFEE2BE52297A333C22FE
+29D5C49274B8CBFA494C9FACD8C1465946540CD28B3E7A6150A434DCDCEE2BCDA2921A53A35739BA36A78557A1CBF7C46DEF22424254217C05BBFDCD84AE6B50821809D315
+F1A989BB
+430D01C0584249B82D1AFE3503
+31379CBF723BB1469F43A934B9586C5E6EA8E3A44FB76FE3FD33884021E938D60E3F075403651DE9D3E428207E964005F10A43D7FCE2A1FEE530CDA3D0F7F1C6D2B2DC04BB26AAA8DF826D195B2636C6F7FEE31BBAC50DC0E27EE9FDF43659B76FC9
+16303106
+E49E911E0054FDF48B26B90179
+0B3780CD3A104728B7FA2403F980D55884B7E19D86ADFACC79BD8A1E466EF65959EAF9185D0158814C2E89980E6A4FCA63EB08C98DE6D3051A3A15ACB22F9DABA7AAA51897D32CE210E1F4E39F9AC4CD1498CA19573C877F0B
+C63C904F
+C7562AE1AFB985A0B4C0EB28F470
+193CA13D7E26AA1E21E3E55DF8CF6C93775AD9C99EE61E9D52B8C5F1B3E06CCBBD8ABB32D40231083FF2C2DFE9EF78190550349475368D74B0D7FA7026C8F9D40ACD5D8F8EEDA0B96417EA72629F6323CF745FCA1CC5C259F743C61678DD8C07AC5C61CDF2510C557A9E2A5601DBBB709B8E4758F0E019F0D7F0A8B0AEEE
+39AE
+F9B81323A6B7FF10D0E29CB7C779
+64D2DF34
+D510DE2BDEF19639E0767A651E8B
+0FB5B886612F73A1C8FCAA9DE495F88F5C47D1035C355AB0D4461BEB2EB79D23D5A2187FF216FF7A18965A6BC8314F96609F93FD496780AC5DA1489A8BD7494580739A85B56F85E74D5BD2C25E4BB11D08E622490CBC6E1CD8C85D1D152C7CDDBFB485D1863DF91AC8A516D18409282F5ED26D6C7D09DC9C573F7555434E
+3129
+A6F39E2E293327AD055BDE2EFE60348E71C40154F5B746010A
+0626A1A9
+FE62C7FECCF6158FD1B92E008204
+127AADEDF71977C9D94D192A83599991505C0689BB122C933B6061343A4A4CB36C4BC556144CE26A1C1C831FA34B20030996BF358D772310CC4CF8C370FBBE8D00C4CEB05C7F1A0AEFD5E108C815D39FB2E8BF98D3FB5DAF5916D4CAE9EE301940350C5D2BA6A220844BCA9751D97AD1E6D917B86A33D03C2F3590283AE3
+118D
+716968C0
+1011E95E6CE0F30AC781032081
+C0686DA6BA8CCDC37CC23287CEEFF473778CC4F917A5973C469E84A638F9FFD6CEA91CB4B613459C0B63B16BBC0940E45C5D3E48D6A1E357689F735675208E
+742D89D0
+9203F78E9BF0E8FB255B675738
+91636ABD5FF694B1CE9D04017F943F5836FBF3A83193
+B1EC81DA
+1BDB0FFE965B47FFDAB945704A54
+6A9A1AEA7C55AAA5
+856ACF29
+A871A1E6270DC11B3B0D11019C659F7B7FD480BFDE23BBEA426DCBAB3BDACA4231D3
+636FB9D3AB12C409C9254C83361524A159FE1F0226DA12775347F64CA14C419FBA0D327CE9EB
+B05129B79230D7691C205F64C9EE49E04ED0BE415D501637AB4951
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0045 put
+dup 3 /C0047 put
+dup 4 /C0067 put
+dup 5 /C0068 put
+dup 6 /C0072 put
+dup 7 /C0073 put
+dup 8 /C0080 put
+dup 9 /C0082 put
+dup 10 /C0084 put
+dup 11 /C0085 put
+dup 12 /C0088 put
+dup 13 /C0097 put
+dup 14 /C0099 put
+dup 15 /C0101 put
+dup 16 /C0102 put
+dup 17 /C0108 put
+dup 18 /C0109 put
+dup 19 /C0110 put
+dup 20 /C0111 put
+dup 21 /C0112 put
+dup 22 /C0113 put
+dup 23 /C0114 put
+dup 24 /C0115 put
+dup 25 /C0116 put
+dup 26 /C0117 put
+readonly def
+/FontBBox [-18 -207 798 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268426989413EAC8C610B86B8D55587E5840300D
+B7D41E0748AB20D65BD1C45D
+2C572976F59A02FD4F
+76038E5C
+75CA71350C59C0E29D2580B2EA
+1F1F89CFA7357C39E63649165192B587111A55E3D218CE
+E1315149
+CC0C19768EDA438BDB13BEBF3C
+F60F475784C0196A5B044696D8AB60919984F94940258A768306
+62CBC1D5
+55471E35D658A4E853737ABAE056
+847D34338B1AC3A49D62D404FF1146CB7EDFB498F623E7F003BE7294FA692C8F2A4AB5BD314DCF31261B033BC2F56C70E1791C2329523E9FEC920798E894E831FCE1AEF851127BE985C5A9B830ADBFFA0F5A274E9A0E4ACAE13CCC83A579BCA4D2661A365A703156
+E45B2BF6
+B4F6414D714F386C47B7356973
+C2FBABFD0305082B4539840F3357946A939BDB7D1CBF9EEE02D144B36C0FD6DCA0097DEFAD0E89D690260F4BD02F083408386665CE23104D6F6753C233C03B1D594DA821A889CF435021BF39909D12634589F5E56133C3
+3DF080B1
+62C76C72F736B3EF02E28D2E2DBB
+374BA8B06AB1EC2F2D43A63055301FEEDA5F9CEAD01133089FCF26F4D89C1FBD741CC5BE325AAA2191565B70F2E7E00FB838E570FBC49A3948AA730A3A2B418848783F8496E48C6F04FC5545FD8AAF888467D1D1CFD2A7E1CC15F0AAC2AF962BD940BAC56399037CE4CA4CFB42B7E40DADA8FFB6EA8000
+0DC14DD4
+C7B50FD54C3F508925EFCF4530
+BFC8481CA2301D3E1824D39387DA27328C639F1DCA6BF0FB8DEAFA901E7BF094645F62727F07A79671EBC8F7AEDCD6490AFBAA0997FD4B9C08237C5FF690
+69ACA703
+D7B9664CEFF0B0E2FECD6996B95C
+59BA14D34C8012D92145A1B4911D9E37D53B32AE54E4FAEFE37043DE330D333D97114D7D48D49C36D93712167E4C52A89B8847C3ABD557A2BE6775077C8B1144F85DE50883DB1D7700B543E2E1223BAC45A6E42A353208EE84B34098AD629DDEC2D10051
+5F49EA23
+555DA2A5896ED2AA778FF4024EAD
+5CBF3F5E1DD7A43145E39C3A0F854B9992F33FC716DFEEBD0D97CAD8E2F6A6FCB29000C293124652CB5DFB2CDED5B4AED7215F844C8625C8B42E0EB52C7953E8C1915E5D6603E7A81E39ED70ED66B6F9FD74CC4B095BBE3BB737B8122C8365549E064A5F34E19042B284F0199463265D12638D963F
+B20F1BB6
+FFE9FBCA9316C444A6E9D6DA42
+978A983D3DFB71AEFDA84618BA464BC30F9D7811B8A51B1BA5FAC69C8D37F85EBD3008D367FA5FC42EFCC72F63B34AA2CECC6B52CCACBCA284BD8BBDFED97B33D16A15B25E0BB7C309
+D269FFAB
+5F4B0D8B1A4CC17814F3E5252507
+25A95D1545A94095CED51E71985E932283AC0453FD45DC061C3A0BB15068D691F4563617FB28224BB1389C463A3AC989C428554E1B93C3CA7B86CE33DC5BA37DA60FB0AE14CBE185BE841D39A74F837268E190938ECC89F0520CD8B1F063F8BA7835A6FE9F42C7
+012AA960
+AA0E8A521FE4CCB0F13730FC48E2
+B2AE43AACBDFC0B4DD9ADC38A9E2FB955067BC2419321C7977C13FCF692DECE05C37FE95D8EB34CC53F7F803EDB07D94FCB4FD8958683044732E9C0EB7AB44B1F818EAD2543DC6CED9864FFF301B30FD05DAA58CAE641856A3AE027143FA27425A50FAFDB4D23AB59D7F210E141457A0474CE1BE9F5B8FDAA64A8456BD01
+470B
+B2A1A466423207D001B1B9FCC8F2D61DFCB831B5FE4BE22FFCE71DAC02385D01AB20F1
+4570D8C8
+037960C6FCF3F6039C942AAE2881
+6D999955B3F720EC0563E8B773B60F3E57FF54814521ADD1E5853027CB1DB2319349F15E131B5A96D172F7546DE2E258963F4A6C1B71B9BF05AB9FB4E7637E053C0F93209D336508B906199A97C8EAC147BEC22DA2BB1D17A4CD4B12B4AD766D21BDCDA054ACEB67CD72FDAE63F5E9E971796AD6F194E8ECB0E356CD4C82
+35AA
+ED35B74A
+8B786239
+B302A023A741FEAAAE7C63E467
+0B9126190190383CF5BF11B4180ECE1E98148803E18818F275F7DEAD95FD5553FD8EA51739F52CF6D34542D5C3446C5F49F2D2C8879C70506BEDEDEDCA4DB2062F978615B8E3816950B8F87B3C504ACF6700
+6AF50142
+30C577794792E6B4E684BC32D3
+AEC992B68394021639CAB1FCCC8263EF292D55513A8730E5F843ACD9015EC5AB9EDA3512B44201225316C57F14D5F2C60BE09DD725082C723AE0BBDE974C7C9AFEEC916263EAEFF50830A32A0B4AF6A9C118A98A9E3755377384B658
+5631B919
+74DEDC9CC0C5014B9A8642FBC0
+85461C1FF62E3549039D05333628F48A2CA63C1A55EBD81E6B654F30604A3F56837F6309EA706075625ACEDE2B32A8B58A235BCEAF210819059C27025114F0506B748B3F98690D178A267A083EEFF765D239855ACA92493EF0A747FCAD
+3B00AA76
+CBCF34D9EFAABBBEA979C0C759
+6E61997BB1C94B124062C40EC98E8747772367A92E9C71F8869F94AC9140B653D55CC4FAD98558E7760F0ED1C98A997BC9D98AAA
+F4FFABB2
+B99250CB9BAF37DECDD430F9FE2F
+3B9316FCEC99EC2A21EADA49E1E4FBE0F69232F1D8977202A3E14FC73C4C87AB569BECF014B08A62526BFE337BCEF2E24DC97E81A214F3BC0F8285EEB1003F918437728A165B2C65E3EAA4484B6A7E1DEAD31C79380CC0D6AB56B84CF6BB727F9FE7F4EBED2F2594610A33DA607661BBB469B08F111A4EACE60FFEBB0E69
+63FA
+C9B83B4EF9B9740BF1B88C26BAB27B219E4DA9E6D41F3C45477E659D
+E5C5E64A
+2FD705F9CA775565C0B032ED0C2C
+1FB31D3ADF1FC553DB3E96D8265B90E1F489C988E0871C18A3277F350FAE9E8383BB2108AB74585D3EE3E436067F2027794DFAF1AFFB80AFE9E7FF71C31B1262AD87A17E004E321B4FB7CE15C321D00528488BE55E6C9996D2263F1EFBCBD9E350994AE2F20BB2
+90017F22
+1F61D7CB4E0788FBA6AA2CF780
+DADBD2FED0743767CE33522B3F427BCB931956D16FCB445C7CF9DD4145B320B7C4755D304EC1A461325203395F06B423DC78F5B691503D08C4E6DF08F94F041AC431BE5FCDA2
+4185FE19
+DF55774CF8A6D26B69C1C84F3D39
+7E25A739684E862BFDFE5591365F565D052D2F482F07CFCD5C57C457E8EA1A55F255614F6D1A17881F2B592A841CD0D629B0C94518EA505E99A34D9DA0569C2A4ABAB61E1F8D3442E93FBE98964EFF06748B51B4ED0284A43695E94B20A66F5975292C87A166F76BBF4FAF5A43EAC0160C
+E463AACC
+815110C67E12BDA3BA815137395B
+44EFCEFA8BC412D93B7DA437D148118E98FB81776EC1091A3AC0C28491F7F6FAF89042BCE02724FBC7FCC60BE5BCB959B12C863B1437053B44562DA2A7F47DFCE19113E153A16CAC60480A05F809E9DFAB0BC227631FE21268B9564E154D6FE1D499B8D2000CB0060C
+EB671091
+1003DD941BC0CF12F2FF21E9AE
+53A0E833E3E6572790E25D753F4AFAA605A2E62CBC0948EED47B6C7C56194FDDB2735DBA8ED6220C8524A557001DD01243F4F4162046F4723C55071E4884297CBB55844DBD74C810ED627A3821A87FF1953F916121FFA68C47
+98139EAA
+23CC0249B50E38D4C9007C31F0AF
+1C2FD75C83BD91698779E188D20A89BA4FB5EAE2FF1B59ACF140F1AC117ADA0AA492D3C600D66D1CA2F918C47A79A51580882F398C50324D672E6B7AD2F657ACB84B601B09EEBFCFBA9F26B02F43E24C48E82958670688C1977978E49E5478B8C8B871E17F94E5FCEAEBA087E228725CFF66A0BA273E159551
+327405D0
+162BC95FD5C405484CA484CF7B
+7D56968E3F2F21DC11EABE1593C76A38A4A0ED823D83F137CCFEC3C7C4C7E40420C578F9E92547B7E4D48E4624877843D7FD7BE60556BFDC458DE636FA28E97313DFDCC4
+FF46F779
+6E0058DF71BCABD705CFCAA4BE
+E49A6484CCB00123386E0A8FF20DACF86788CA78050B13A5D86EFAB022200E087A9C5B65BEFB49234B2A6FFA52F257262EC2C4B76A0C68398BA029B2685497C203201558BF008F342E8A28A8AF17FC006D5335C9132A6C9A4081CB
+FA6F2928
+8297DD096AD1160ABD65D2C86D3A
+D2DA8588B654687E
+D4C0A507
+D024C5CAE84699EFE73D860ED876D37939335180788572D040DD0B1918CC74865E1B
+155C720BE2D470574F248CDAE9BAA7929B1A235F12AF9F2E748D1FCD6857B17D3389FF5FAB5C
+0A7401CBAA49700771A4980CF0D77F48D10DA5F7B704C7F8148F9D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchi
+%!FontType1-1.0: PSOwstdutchi
+10 dict begin
+/FontName /PSOwstdutchi def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0095 put
+dup 2 /C0099 put
+dup 3 /C0100 put
+dup 4 /C0101 put
+dup 5 /C0104 put
+dup 6 /C0105 put
+dup 7 /C0109 put
+dup 8 /C0111 put
+dup 9 /C0112 put
+dup 10 /C0114 put
+dup 11 /C0115 put
+dup 12 /C0116 put
+dup 13 /C0117 put
+dup 14 /C0118 put
+readonly def
+/FontBBox [-144 -236 757 723] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268425D56A4C755D97B61FDB4F478C36521A1175
+50EAB5D68B380666C40618363E
+875234D5932CF95278CBF24640AC44955FE0C7424A5B
+E767E0E8
+44D02155079D14D788F53AB40E
+03103A5A98BE123D93B3B1C4E2D988CE39D871249BFC41B8FE5D351D4875786675A3CEBDC191E95C94252E9763A17490ECEBE82C007AB96BAC87CC0E61B226798CB2762535789973390220F55F935E9F42A2625FBC1045AD146020A342DE8A4A
+4DE4E6FD
+1D1F27A9C6EFCFE3F70E800126FC
+145DF78D8CA3751D0F2E5391BAC8739D569C65B3767C3A9B8893DC81FC6874884E32ECA8CE89FD12D974BA8705CD3A20971DF35FACD15684ADCD221AF8F79A68F2F7EEF978C2A13C21E48E7CBD1D465E6D4CB8942C3602D90BEF13F078809EC6722B58421F05B3D88579E6EEC933B940AAA84AC7DFEF54029714F9F98AF7
+982E
+D0266DBB3DF3D9FF0E151921C853706A43889EC70017685AEE05D05ABE839731349B172F73E57E4BECE5B278A2153A26
+125C9253
+84381E4E75241CD248AEAA7942D7
+ECAF59DD422679A828D40B461B3E4526CBBC3CF7AFFF31CDA1C6D7E62E984846948AF798DC640883AFE795D232F61498505FA6253DC661DFCA9B31BE645E7E63FAB9F3D7C26C20935BA212912650CF9BDF0C74CCD14F4ECDE9010F446165D108A255CFF274
+F2968427
+BFFAFF2035139C2B1CC556F99D6D
+0A7E6D0F0AE58859628F8A3A4835A63F2D0639C62AA5B8BA4B7E317C22FE5F20252D4D3EC33E589BDC0420D7CE07E9EB0459B3B16F7CE142CD4D9064E8BD57E25EA1892C3EB412F8A850389B3C4A7B86A59A60D886EA1404A6E551C9F09395E6585BE9CD208C4B995C58B1632DB22F7151F8AE870A276DB0F17204284057
+7EE4
+BF0B17F91A4E99D7CFD297D64CA4C020B34C18F26C75185822B95D
+DB86C508
+08A335F858F6F0C3CC4A57C8F6AA
+9362E8A841B069FECF8C4287E6784BC466D6018D6252DBFA3C6D69D2CB3B23EA6E382089FCF00BBD7E8BEC2556852004FDDF9FCCE52BA273CECB08AF713E8FCCAB6B1D8CCC0A2E58EF5DFED80F22C855B5F94E549C418309873F6EAB4BABFEE0189279225C0B5FF1F77A5BA194FA63E37CD33A08F689ED28A6
+B57C90D2
+0FFBB5C55B41EF8D444EE67AEE69
+EFC73CD1568AA2C3B12576BC71610E0D75DC7246DE6CA0D1748DC789829854A401AE40F81195ED13596CE1A74D5C5D2491EFF3BB7B3185AE8D5EC38B2B441B940D0EE63F53EF5785A1085AB5ABDB77A806BECCF49FA23C8B7A3D3F41E32F3BEA921B8FB1D9E9D47E2D380CE69E250F3685E99EEDD465AEF95C529BBDA647
+B892
+F5BD70CCEDD8967DFA70B1C6ACD2DB652B0D106B642DAD21C30836A78326B0B121045345F08520CC4F1B18CD75AD5703933609F221B028F7641046496EC03A20C13DDE6A1E1040643B8D17
+68752EF7
+28AE30AD6A222F99535061B2CC
+994D41EFE42B4ED3B1B9DE87EE528C3769BDC16D9DE07DC75991B7CB3C75B5867CBB58B64221A5A14A400C5249BA1F208D343DD93E6D6EA915B7E93971754EF40F6C795F098ACBC96CE2F94F7CF9C317BBAD12869469D0F9DCBFE4AB50DE77
+240C48FE
+C63C68BB49CB4686CCB948228918
+1D89CF7409F738B001393DD555BC695D475105890A66E7CAA0C965E65BCFA94FDD54BEFC4E7F2DD0AB1C3D87A96E8C4A1B9F2BA05E40931578DB956D374059BB205BC84E65C89BB45A18035F9F4A35883D2287E501B4AF3770ABB348A8316EC309AE821F2A37D518F3A1A5BDF8ABAA5B8C9A43017A53ECAF2A9FC8956B59
+7508
+5F10AF5414106DB1735F5F9BD49F3DB891DBDBBD2DCAD91AB9AF50D0A79DB3E03A97EA22250411D921D8
+1842354D
+3D6D538E44FE77556CA6510AD6
+BD87E9BD7C5042C25D66D524B62CEF7DF2D48DD13CC90A83EF48CCC704824B6EB4DA6924B78BEC4BC4417E60DA2372BF3ECC374529BA0DF655F108CE11D1251B8127B096F4D5CA06E9C50308F1AC22BABF13C6B6D14DAEE7050300
+65C626E0
+BF0DD48AEFD1A462D145722C0564
+4840865A833B770A831D4210268BC5D42480600D7C06F82842A481A3D644085D12BF87B3CE3CD3832DC111189FFC4EF7DD9CFEFC38F1F2F689480C0C831E1DF8D3F7C3066FB3E5833D54E6D14DBD7F7D1DA37DEF0EBCBBA35592663EF5F7316CA14885568950C29456A372F92D7C6BFABE333503D1DA
+34D3E173
+04170F66023002D2EDF7F7B0C5
+3F8780D8B9CA01B7F84ECB51F8B82EEA111A85D7E759F05F1BB6404D288F0C06E7B4080A78A893C6A211ED807F4D54E2026FEDCAB0E5ABE178113B6713D1D1B1A2E4D27D41A267144D1C945F1D3267C0460FC7524BCEC7
+58A08A70
+925E00F5BEFA2CD52B3E44D8C1AF
+EAB66655B3982EF50AFBBFBED70DCEAAC0B1356C9930E74DC4E01F3EFFE9E954F4D265006ED0CAA81BD02EF62AA2ADD4EDA9BCCD0A7E78A561CD6F978A585A41B11EB1F4342B02280C58EC33DBB97267E8DFF297B5CDA73830B479659B75FA149201AEE76C75D07C1BA60C9654F5375D1072EBA3547E0ED53D4918DDFC5F
+2D9E
+74C4AD1399DE67E03092630B8669B7A761DF31C8B8386D
+826E0111
+29372C494853FBAC5F302ECFB9
+B5F1F97278AF7D9EA8CAECDE645FF94AC4EB892945EEF0221F0A5A913B0B0733B3A4DFE2F8E049984D0EACFE1FC1A8B46040FAAEAAED6A8EDC1F599520EFB48C9026F812BB2DB10427D101F3EFCA03B33B7C1752A1EF396DF7F3
+DD46FC40
+C9548B2FD2EDF7880E2C79EF21F7
+3ABC121D0DE6B5D8
+83ED7FE7
+6071E0520ABC4341812D0B0B9CD9008F529C8B61712B650CD4EC5E8A32973B596D99
+95ABA05771C17A919E7880ACD012759BDB90DEF3380FED49C186A3AB77AB11364DCA1F55C39F
+FDE9C67D392ECF77E9095FB6BC980841E377DACC8488664E3E7FC3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch12i 12.00 /PSOwstdutchi newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<192837332835290e011001112831262b3024352e01293235011828243638352c312a011928373a32352e011b> 2207 558 0 7384 -1 s
+<28352932353024312628> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<090d> 9346 13300 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13280 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13280 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13280 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13280 3 7133 32 s
+wst:dutch12 SF
+<1637> 1271 1431 0 1421 -1 s
+<002c36002c303332353724313700372b243700372b2c360037283637003538310029323500240035282436323124252f28002f28312a372b003229> 1421 1431 11 6488 0 s
+<00372c30280005002437002f2824363700373a3200302c313837283606001e2b2c36> 6488 1431 7 9531 0 s
+<2c36> 1271 1676 0 1410 -1 s
+<0035282f2437282700373200372b280025282b24392c3235003229003924352c323836001e121b002c30332f283028313724372c32313606001629003c323800353831> 1410 1676 11 7374 0 s
+<00372b2800372836370029323500362b3235372835003328352c> 7374 1676 5 9461 0 s
+<3e> 9461 1676 0 9531 -1 s
+<322736> 1271 1921 0 1584 -1 s
+<00322900372c30280400372b2800352836382f3736002632382f27002528002b2c2a2b283500372b24310036282831002c3100240036372824273c05363724372800263231272c372c323106001d32040024002a323227> 1584 1921 16 9531 0 s
+<1e121b22121c1c> 1271 2166 0 2270 -1 s
+<0026323030243127002f2c312800373200362c30382f2437280024003a28250536283539283500302c2a2b37002f32322e002f2c2e280e> 2270 2166 9 7430 0 s
+<03> 1398 2505 0 1504 -1 s
+wst:dutch12b SF
+<000314151903130f19150f171003130f19150f171000021900> 1504 2505 3 3692 0 s
+wst:dutch12 SF
+<1e121b22121c1c> 3692 2505 0 4691 -1 s
+wst:dutch12b SF
+<00021100> 4691 2505 2 5037 0 s
+wst:dutch12 SF
+<090a08> 5037 2505 0 5355 -1 s
+wst:dutch12b SF
+<00020600> 5355 2505 2 5803 0 s
+wst:dutch12i SF
+<0a0407080c0405080b0c> 5803 2505 0 6762 -1 s
+wst:dutch12b SF
+<00020200021700> 6762 2505 3 7543 0 s
+wst:dutch12 SF
+<0b0a0409080a0c> 7543 2505 0 8232 -1 s
+wst:dutch12b SF
+<0c0a07000a04080009> 1271 2975 2 2305 0 s
+<0f161a0f18190309> 2301 2975 0 3093 -1 s
+<0f18151413180f0008> 3089 2975 1 3989 0 s
+<0f17101417120d130e0f> 3981 2975 0 5023 -1 s
+wst:dutch12 SF
+<1e2b28> 1271 3385 0 1631 -1 s
+<00201e16> 1631 3385 1 2058 0 s
+<001e121b0035283438283637073528363332313628003728363700262431002528002c3139322e2827003a2c372b003128373328352900372b32382a2b00372b280038362800322900372b28000537003233> 2058 3385 15 9461 0 s
+<3e> 9461 3385 0 9531 -1 s
+<372c3231> 1271 3630 0 1630 -1 s
+<003a2c372b0024310024352a383028313700322900201e16221e121b221c1c0600193237> 1630 3630 6 5355 0 s
+<00242f2f00363c36372830360033383700372b2800352834382c362c3728002728392c262800292c2f2836002c3100372b28> 5355 3630 9 9531 0 s
+<36243028> 1271 3875 0 1736 -1 s
+<002f322624372c32310400363204002400232327282924382f37020035283438283637073528363332313628002632303024312700323100151b051f20003a32382f27002f32322e0036323028372b2c312a> 1736 3875 11 9531 0 s
+<2f2c2e28> 1271 4120 0 1602 -1 s
+<00372b2c360e> 1602 4120 1 2037 0 s
+<03> 1398 4459 0 1504 -1 s
+wst:dutch12b SF
+<000314151903130f19150f171003130f19150f171000020600> 1504 4459 3 3785 0 s
+wst:dutch12i SF
+<0a0407080c0405080b0c> 3785 4459 0 4744 -1 s
+wst:dutch12b SF
+<00021900> 4744 4459 2 5099 0 s
+wst:dutch12 SF
+<201e16221e121b221c1c00050500> 5099 4459 2 6897 0 s
+wst:dutch12b SF
+<020c> 6897 4459 0 7223 -1 s
+wst:dutch12 SF
+<0007272839072c3128372226323736> 7223 4459 1 8522 0 s
+<243127> 1271 4798 0 1608 -1 s
+<003a2c2f2f0038362800372b2800363c363728300027282924382f37003632262e28370025382929283500362c3d28360400240027282924382f37003528343828363700362c3d28003229000900253c372804002431270024> 1608 4798 17 8859 0 s
+<0027282924382f37> 8859 4798 1 9531 0 s
+<3528363332313628> 1271 5043 0 2072 -1 s
+<00362c3d28003229000900253c372806> 2072 5043 4 3347 0 s
+<1e2b28> 1271 5383 0 1631 -1 s
+<0026323030243127052f2c3128003233372c3231360029323500372b2800201e16221e121b221c1c00372836370024352800372b28003624302800243600372b28001e121b221c1c003728363704003a2c372b> 1631 5383 14 9531 0 s
+<372b28> 1271 5627 0 1561 -1 s
+<0029322f2f323a2c312a002427272c372c3231360e> 1561 5627 2 3398 0 s
+<0520> 1589 5967 0 1929 -1 s
+wst:dutch12i SF
+<03040e0b090402> 2033 5967 0 2700 -1 s
+wst:dutch12 SF
+<36283700372b28002f3226242f0735283032372800201e16002728392c262800292c2f28003124302800293532300000> 3177 5967 9 7525 0 s
+wst:dutch12i SF
+<03040e0b090402> 7525 5967 0 8192 -1 s
+wst:dutch12 SF
+<06> 8192 5967 0 8245 -1 s
+<1e2b28> 1271 6306 0 1631 -1 s
+<00352834382836370024312700352836333231362800362c3d2836003a2c2f2f00252800372b280025382929283500362c3d28360033323637282700373200362831270024312700352826282c392806001036001e121b002c36> 1631 6306 17 9531 0 s
+<24> 1271 6551 0 1376 -1 s
+<0036373528243000333532373226322f002431270031323700240030283636242a2800333532373226322f04002c37002c360031282628363624353c003732002f32323300323100352826282c392836003831372c2f00372b28002831372c3528> 1376 6551 17 9531 0 s
+<30283636242a28> 1271 6796 0 2025 -1 s
+<002c360027282f2c392835282706001e2b28002538292928350033322c313728350033243636282700373200372b2800292c35363700352826282c392800293235002431002c31272c392c2738242f0037352431362426372c3231> 2025 6796 14 9531 0 s
+<3a2c2f2f> 1271 7041 0 1588 -1 s
+<00252800242f2c2a31282700243127003229293628370024360035283438283637282700253c00372b28003836283506001637003a2c2f2f002528002c3126352830283137282700253c00372b2800313830252835003229> 1588 7041 17 9531 0 s
+<253c372836> 1271 7286 0 1734 -1 s
+<00352826282c392827002824262b00372c3028003831372c2f00372b28002831372c35280035283438283637073528363332313628002c3600352826282c39282706001e2b28002538292928350033322c31372835> 1734 7286 12 9169 0 s
+<003a2c2f2f> 9169 7286 1 9531 0 s
+<2528> 1271 7531 0 1489 -1 s
+<00352805242f2c2a31282700243127003229293628370029323500372b280031283b370037352431362426372c323106> 1489 7531 7 5735 0 s
+wst:dutch12b SF
+<0b05080009> 1271 8000 1 1916 0 s
+<0f161a0f18190309> 1912 8000 0 2704 -1 s
+<0f18151413180f0008> 2700 8000 1 3600 0 s
+<0f17101417120d130e0f> 3592 8000 0 4634 -1 s
+wst:dutch12 SF
+<1f131b> 1271 8410 0 1744 -1 s
+<0035283438283637073528363332313628003328352932353024312628003a32352e36002d383637002f2c2e28001e121b003528343828363707352836333231362800332835293235302431262806> 1744 8410 8 9201 0 s
+<00102f2f> 9201 8410 1 9531 0 s
+<372b28> 1271 8655 0 1561 -1 s
+<003233372c323136002439242c2f24252f2800372b283528002435280033352836283137002b283528003a2c372b00372b2800283b262833372c323100322900372b28000513003233372c32310f> 1561 8655 13 8554 0 s
+<001e121b22191a> 8554 8655 1 9461 0 s
+<3e> 9461 8655 0 9531 -1 s
+<13141710> 1271 8900 0 1889 -1 s
+<21> 1866 8900 0 2028 -1 s
+<002b243600313200302824312c312a002932350024001f131b003728363706001e> 2028 8900 8 5029 0 s
+<32002c3139322e280024001f131b0035283438283637073528363332313628003728363704003836280024310024352a38> 4998 8900 8 9461 0 s
+<3e> 9461 8900 0 9531 -1 s
+<30283137> 1271 9145 0 1735 -1 s
+<003229001f131b221c1c003a2c372b00372b28000537003233372c3231003732003335322738262800240026323030243127002f2c2e280036323028372b2c312a002f2c2e2800372b2c360e> 1735 9145 14 8990 0 s
+<03> 1398 9484 0 1504 -1 s
+wst:dutch12b SF
+<000314151903130f19150f171003130f19150f171000020600> 1504 9484 3 3785 0 s
+wst:dutch12i SF
+<0a0407080c0405080b0c> 3785 9484 0 4744 -1 s
+wst:dutch12b SF
+<00021900> 4744 9484 2 5099 0 s
+wst:dutch12 SF
+<1f131b221c1c> 5099 9484 0 6004 -1 s
+<102a242c3104> 1271 9823 0 1869 -1 s
+<0024003626352c3337002c3600333532392c272827003a2b2c262b003a2c2f2f002a2831283524372800352836382f373600293235003632302800322900372b28003032352800263230303231> 1869 9823 14 9004 0 s
+<0027243724> 9004 9823 1 9461 0 s
+<3e> 9461 9823 0 9531 -1 s
+<33322c31373606> 1271 10068 0 1880 -1 s
+<001637002c3600312430282700> 1880 10068 4 2997 0 s
+wst:dutch12i SF
+<0d0309010a0a010b020a06090c> 2997 10068 0 4150 -1 s
+wst:dutch12 SF
+<06> 4150 10068 0 4203 -1 s
+wst:dutch12b SF
+<0c0a07000b05080009> 1271 10538 2 2334 0 s
+<0f161a0f18190309> 2330 10538 0 3122 -1 s
+<0f18151413180f0008> 3118 10538 1 4018 0 s
+<0f17101417120d130e0f> 4010 10538 0 5052 -1 s
+wst:dutch12 SF
+<1e2b28> 1271 10948 0 1631 -1 s
+<00201e16001f131b0035283438283637073528363332313628003728363700262431002528002c3139322e2827003a2c372b003128373328352900372b32382a2b00372b280038362800322900372b28000537003233> 1631 10948 16 9461 0 s
+<3e> 9461 10948 0 9531 -1 s
+<372c3231> 1271 11193 0 1630 -1 s
+<003a2c372b0024310024352a383028313700322900201e16221f131b221c1c060019323700242f2f00363c36372830360033383700372b2800352834382c362c3728002728392c262800292c2f2836002c31> 1630 11193 14 9192 0 s
+<00372b28> 9192 11193 1 9531 0 s
+<36243028> 1271 11438 0 1736 -1 s
+<002f322624372c32310400363204002400232327282924382f37020035283438283637073528363332313628002632303024312700323100151b051f20003a32382f27002f32322e0036323028372b2c312a> 1736 11438 11 9531 0 s
+<2f2c2e28> 1271 11683 0 1602 -1 s
+<00372b2c360e> 1602 11683 1 2037 0 s
+<03> 1398 12022 0 1504 -1 s
+wst:dutch12b SF
+<000314151903130f19150f171003130f19150f171000020600> 1504 12022 3 3785 0 s
+wst:dutch12i SF
+<0a0407080c0405080b0c> 3785 12022 0 4744 -1 s
+wst:dutch12b SF
+<00021900> 4744 12022 2 5099 0 s
+wst:dutch12 SF
+<201e16221f131b221c1c00050500> 5099 12022 2 6953 0 s
+wst:dutch12b SF
+<020c> 6953 12022 0 7279 -1 s
+wst:dutch12 SF
+<0007272839072c31283722262f3736> 7279 12022 1 8520 0 s
+<243127> 1271 12361 0 1608 -1 s
+<003a2c2f2f0038362800372b2800363c363728300027282924382f37003632262e28370025382929283500362c3d28360400240027282924382f37003528343828363700362c3d28003229000900253c372804002431270024> 1608 12361 17 8859 0 s
+<0027282924382f37> 8859 12361 1 9531 0 s
+<3528363332313628> 1271 12606 0 2072 -1 s
+<00362c3d28003229000900253c372806> 2072 12606 4 3347 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (17) 17
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0036 put
+dup 3 /C0039 put
+dup 4 /C0040 put
+dup 5 /C0041 put
+dup 6 /C0044 put
+dup 7 /C0045 put
+dup 8 /C0046 put
+dup 9 /C0047 put
+dup 10 /C0048 put
+dup 11 /C0049 put
+dup 12 /C0050 put
+dup 13 /C0055 put
+dup 14 /C0056 put
+dup 15 /C0058 put
+dup 16 /C0065 put
+dup 17 /C0066 put
+dup 18 /C0067 put
+dup 19 /C0068 put
+dup 20 /C0072 put
+dup 21 /C0073 put
+dup 22 /C0076 put
+dup 23 /C0077 put
+dup 24 /C0078 put
+dup 25 /C0079 put
+dup 26 /C0080 put
+dup 27 /C0082 put
+dup 28 /C0083 put
+dup 29 /C0084 put
+dup 30 /C0085 put
+dup 31 /C0087 put
+dup 32 /C0088 put
+dup 33 /C0095 put
+dup 34 /C0097 put
+dup 35 /C0098 put
+dup 36 /C0099 put
+dup 37 /C0100 put
+dup 38 /C0101 put
+dup 39 /C0102 put
+dup 40 /C0103 put
+dup 41 /C0104 put
+dup 42 /C0105 put
+dup 43 /C0107 put
+dup 44 /C0108 put
+dup 45 /C0109 put
+dup 46 /C0110 put
+dup 47 /C0111 put
+dup 48 /C0112 put
+dup 49 /C0113 put
+dup 50 /C0114 put
+dup 51 /C0115 put
+dup 52 /C0116 put
+dup 53 /C0117 put
+dup 54 /C0118 put
+dup 55 /C0119 put
+dup 56 /C0120 put
+dup 57 /C0121 put
+dup 58 /C0122 put
+dup 59 /C0262 put
+readonly def
+/FontBBox [-25 -256 978 766] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268422457D8CE35980429BB1D919A0AE8BD7E5C8
+FD15F7F61BF0D2836908BFBC
+D4CB39198644F31BBE
+D73A689F
+931B1FD60F630F7F9BED6F1CD559
+38E4C90669B494937A37596E6FD1BCFA08BE98FB22015564BFC01C8B6723955225AB49AFD5D909FA689D59C1E3E36126A47D22BD55B082A4299B1F2DEA251472CFCC06A546DDE5B5E27F36F39834BFEAB472D1CBECC52F0ABF8D2061CE9C369EDA16C0718A15DF6FA2637228C1DA266A6D8166F55802E7E013ACA275F9E5
+6594
+5A50EC478A99CB2F3DA2CFC7
+FA7910F2
+F7E949CC5A845909C956073465
+C3098121BE460783574E423C2319F9AC61BBFB9A3456677EFF25DB43A141E10B57793C3CD0B6A381C5043F5DA2E295F29695C955866F8CA8
+9C087E6A
+EE84EA885577B5496F436B3DF2
+4E7DC6ADF5A2D3A7272321494DF463826C6D8EB41EE690DC3256E25392B3FDD67F49B908945196B50A97FFED9C3F1B6083B7F78F112C378E65869AAFE959726D
+BE3B9675
+6BFBDBA9D55CF56520572EEE2E
+A522F9BB3FFC1C62A5B73A26FF2D748657BB9B26E7FD0EFC9E2A313950BA650F21FA35900041405257F7E1AC339E4E222D04B15F876814D79BD05EF9B46D54
+BEE82E13
+412934B16552FA49A707C675C2
+87908E156DDDE3DAA1E78404D99F9E05D1CFC3AE80098B3C71EBEC01FC372D8CB5CA93E7CD8AD7DC123EEF6A42248219A246589846D5C27B10
+A0724E8B
+86D78F640E8F30A6696A01DA72
+24B06AADEA2EB2074B361C9B97BA62A806AB5422EFB21F
+93AE23C9
+A84F32BA07284D4A6D453DD157
+B162EC918D80748EF9F3FF1C43A8A7C8158DE7EC997FEB100723F225C223E3
+D116A3C7
+4D3AFAFE6456651BBC37B048F0
+4954ABBB22D65B51CD8DDB371D94E8C678FC9A8706F074EF00E7054C
+77C046DA
+DFE9FF85568A48E3B2FD81E9DE
+850E1F7E54B0330D598C104C0D3A4EC92509BA86076DD1584A5575A2BFA3570BD2B422C70B8AD7A5060DD25F3D0BB11651FA12BE1DDF8CB30F42C1F564EFFD21454D12922A6FD074DB87
+DC3C992F
+2B96D92A5AABBF711F84E30EC7
+3AE00E9730B64260BCFAAA011D4425A05C2D4BA3B36C7CD8A635FD5AE8CA1DFD5D613E166D2B6C300B2493C6F2D307ACA7D9A82DE813076042FAA0C12845AF
+47F5BAE0
+92D87FFA5EB150D4458B75445A
+0099EA0644BEC495DF01E5EDE5F9FC0BD078292FFB8AE279CABD7E9A7D48F0B88BBA2B8717729AFAE72BE9A6DD47069AA71BAB12835711395ADADD119877F6CF4776991E994D73E4B84A8B1BB036BE76ABDF3DB074196B653EF4
+9B40D74E
+4E6403F447C8EE4DD9D523FE71
+0FF61D76C3E7309ABC4ED74BDD0587B201EEB4FD1A14C43CC507EBF559B850AFF044620F1EECE3E7EE7F70
+02F908AD
+71DAD1D6108403BC88037B15A4A9
+6B2772BA327FF9335762DFDA0B700ADB0443A71DBB686AC9F5C7C72AE5E71B805D76811BF7D798A767D86537CBF9F8CE0790301977C9BBB6269D0A12DBD3FEE8F76F9031F13A519A829537F886CC40B4EA5B0B46071BAC7B776008725874B1B55EC7EF70FFFEB983FE10A5E4FCD74258807A9097E49EBB693975
+8953BDA3
+40293403687938A186ACE9F2A8
+EC2DB98F585FEEF30F449ADAC56683CFAB45D477BB6F706552ABD04A1E84910DE82BEFD1793B16CA5FED8460375EFF06F0BE982D82C2
+EE623BFE
+4AE4F002BFCA7C34151001D41BF8
+5A2BADAA73D1584335DF3144C63B678BCF0F23AE77C480B276D681A1D2D14F4F01E03AAFA4B9E9405C3F720FCB9C636B9E928920A0E23F750D6FF26705F5F0102D46F620F8E616A2D05CD5BD8F0F43712825179265456A58957D2038BA33E0EC3260BC18A86EB937717A8040BC50555508AFB0
+E5C6CDB5
+B539650A04A86BE914E5288356FC
+2CB43FFCE1411A92D844C1E0A755EACAA3D52452BB3631173A41A8FB26D14A81DE1149BB59C5758A78719D648936D36EE7EE91162D50B92B1C64D56DA99E8CE770F04C0C3F80B6C4CA5F3E37295D84602E041A84EF1699D52E265CF7BB62E2BB3C633436F7B25BE73C077EB18A0E38A531963E6BF615421F4FDB084F3C49
+162B
+6B
+9564699D
+290CEE78EF7BE9815635A542C8
+389853B3519A49D99368A1B8D8B6AC3450D4F7894037697A607EDE776A1A021A155216008B0D7EA109DB2060C9A9334AAAE2F2F1A861DADD1AF513DB3527ADDB1572FA50440BDCA918869734F0A622FCCAC2F09AFCE40E8CF4C1F62A9C23BAFAFC
+C1A0DA3B
+E5878D1EDCADB96BABC624EA88
+5430175F201A7F260656F98CC15BB75D3D39E78502A50EE0B6A8EF656370055145A15AF306FEC8C7FA05B1EC6130D2516171C72AABF209E952459A5F2CF447152837BB553A786A50C0AA684BD89FE9824E8FE1AA9B0A60D5FE0E20FA341F9D8FA170F8
+CA368EB3
+D007DE8E9B46E0B8BC4AD47B9C7A
+7991D1BA0018BB8CEE1B6DBBC0D159D602CF5B06AEA7F8C2EB57EDDF3BC28DDC0965A9473A6B237DC51D3B3ED96263C9448E20B7EE922FD22EBF8DC1F40034B95A48575407ECFCBB51B22932AF15157DFDE213AFFC3D0744FF23F01CFE9D1B442051762F8965CD0F9BFED335584117FD80D81DBC39287708F78190922B80
+2EF4
+97E68B8BFD7D18C3FF7F79
+6BD95BF0
+3B21294F8BE82A3F320A0CBBC2
+2A3CDE08F10B7F4685DD7054C120D868ECF916510CBAD986B1A386FA9B7B1CD98CD462A97F8A4988815AA0C29E78992A02E7CCB8CDB8C78BE80E29
+66F26EE1
+C2596246031036611CC2C88A95
+5A6054DC3FECB3943CA776298DF7543EC3671A4289D36D9166731C889C09DC9A44BF808854AB01E243623E929F3AFEEF7AFD49724DD8978EB7DBAD6C7703AC24D575831C7D2051
+77F87A79
+E9A4576FEBAAF6B1C00090C6F31F
+4FE1B03451F93D5498F5F9433C2D27199ACF8C7897E46BA6AE315C92B51B4D28346845C11C261F415882D80D421F06EAE6C2988F990931B3D5EA6BB522878F9D2B89F0F6F09E9D7E942BD86913A9A9CFC13521D25EB0D5892FFC9DA81A618B4F6CC1B19C49D4D70062AD62FF51E5E7
+359F475C
+375E94DFCB2D36C2D86BA2E11F
+15D300A97308B5B8835ACDACA6DC7264EDB31430874378EF0E846A993CE0B752A694651BCE9FB475C3B0E4BB4D6801A06B10FBD7E7AB5F139D17C08847F461F5EF171E1FF24F1262F2BE29D480530F6A2B6BC9F2912F120A625AED2D
+A05870E2
+1D433A94D55FA93BBCBE7F94C0
+E09E6D9F0E7487EAAA6D1F1194E04328533781A0241D6135977FB47331851A4BB51F3264A73A25D3D67AD054EBC23B4C4AB004AC9C8DDC64AA891E34A7FE64B8D91367A9F79D3318EBCE306FCDCDA3F213A7BA
+3ADEE87D
+61DB37D6B3E5046C5C877C6E2E6A
+BE73AAE3949E35505D64787C1494DB68F7F4DDDFE01C7D3C14A39EB44BE449D51732E44BA4666404A9E81F3242FBEB7D171CE5A570061BC2B0C012FACBD6D98445221D1D7F2A4CD0BFA5E7F1395CF6EC33772C29F9F215630F0C6B7CF79D5B6AB20C40EFDE9FF6C84D28
+648F62B3
+5D4C44755283049B9EB1D8A2689D
+237E555843E3BCD1D9EE2268D8DDAA97FB01D112179DB7EC7CE050C516FA3EE478D3C3EF5268331C4914B4B7389224203BA6B1B2C8E9D64967E9BE3345A1E6C907A446FC8F405461B6CF4DC941CEEFB29BC0E022D5C32B2B2231CCCF37A78FEF2B4A8E2DB55AFC4C39DA4E6FD1776ABD7F465524DBFDCD99D4F0EDEF2778
+877EA72A
+F3154450B09FCDBA46698C6F0A94
+1885A6D4430E360F96F7D0BBFB1C7664517BEB8A88107D3A049EFD5054B6E88F9E536ECC594BE0DD3765DCF1E5E04394C7A1EF149A86591186BA937CAACEDE3D0E142E0B6FF12FDE09F6B46E1D79B35013011F3A19EB7DCFF4DBCB2844AA2CE263C5F5803442F2B753EB3B79AF8A31DA56D0F1137AD5DDE02EA76F0A5726
+3077
+1B93B0
+8B7FB824
+01452404EBDE9DFF3B94CF0C76
+69ED9E36CEFC3E86624548C9908378BEC9CD99B67A0D18040321F3A125C92FD9863D5E92DE72A7DE25DAD297BE5450EF9E3CCDAE6FB7D808AF68577B964AD4B0862BCE5BFFDD24A6020B8DDAE12C55EC36
+B4C90D62
+D4A4186A7226CD9BDB0CC79F2AE5
+A178E37FE5A799B8F1C19ABB6F8B2D068C42843B2A81946A70996265CB30E388F7AA035589D0E8075AD62FC0EBC72B3D6F9609D4583D8D95A9EEB7F02C8863971C32C755EE5CDF8567B4201253ACEDE4C482487E3056643CC119FBFA08FD4AA7299433D2
+AAE38412
+E67DDA63B88904651D047C364EB8
+747A414FC82DAF516FC1BD0820767436DBF198D0A279B4D249E07E79839D8370AEA39F5F42D179BBD36F87C991FAC011A4383433251869370FCAF12E525EC457F0B920C14930FC464343088F1DBA71B512AF46001E5DA1DD89FE7A61E04F3516E47FA4FEEA345DCEF36A73A357581E5B0604D93628A17B441F7107F0E78D
+7E3C
+85E38C859E8F824487C73717B8B72EB9
+8CB270EA
+C0FAC216B94153EE7FFD07008ABC
+73E686EE20B4CBB33A7018FA6D06299C0080D520A8E97CB4EF407145944EFA8567EAF227DD9D7F04E696A3022A968464FA1DC4F5AF8747EB1C290038CDD25257E6CAE8C42395FADF4705C76266B53D65F98C48DB80CCC8392835D9A79500E6ED9EC75693F17C52C912DEAEDD3726C4DBE8A01758D43977CC08106EDC88A8
+A0DB
+9D2D7FE3EE3994A68E1F9F4573B6CC10D21B4F714C8346CB0674016BCD5812ADAE4D08AAC2F7CA
+9D1A992A
+02699E779516114732E0922A3C
+733FB9D4DF1F45B0498DCE65E2A80EEA4406E3998F28
+D9EFF0F6
+2B6774B6DB009E9CA3CFE5B796DD
+F007696650C17FA6205FC83D91DB20BC7FEA9F642999395DF88FDA40EB5B673FB6C8321CC842D78559B972087410613C0F15467B2FAF6FA034FB25E4AEC8667B15AE1B7131519AC71137423B40445127D6AA7E188B9A6403FB6888C5C6CC21EAE26DA422E5961E752CFFC83C4DB7A9A3A8D95EA68D4D4281B758166C186E
+1504
+267245
+61A83A65
+F12A61136B5D4A794DC46BDA6A
+AC096894075643C8B19BA978542B8E1FB6B932D5939A2DEB27F025512811F067727200E716A360DF2CF227DAA7DD1271793AAAF4557038AFBFC6D33787D3BAF1D42B7400DC8EC48E7826E64DCB1BFB6268DADF92ADBFC10D
+77AC7BFA
+13784776BADFD5F9E5ECDD3E91
+D91C57D8F9E497B7ED5A945258FF68711542DFE758623072463C2D1BD31FE6B1D57E67421639FE970B33A558C04B21AEAB3063B2BF0A11C593FC0AC4E75EC4AA2DECC991EF0BE773BC0123A34AE69E5F5BBD
+169AA286
+09A53CE275BDD044EB3DB15409AB
+90833C95C22830B130BB85D74B08FE73B222B9336F0044321977225629734CAF1D628E9311AC3387652BA8AE541B91BD4AD3857D164DB9097051A1D5FACA7010C4B26E1CBDB708881E48427D957685BE35F965986ABCB296A3B575E6C9B7D8417407B7D0184CBDD24CFF69C263A5
+A89D8E21
+E4D743CE0E4609FC00813CAC93
+DCFD9043CB83921DF1C3B7208DA83F8E237A15EAF3133265D9D53E93C6DEB830C0F5E4E9C149D4710088C546831AC97A8444A6316A5A75222D3861E9CAD0CC3BB6981962CE0F2671951CA6BEEE8F35D2E48A94C677B133F92E
+30EB410C
+959B3DA3674B0173162FA95022
+8EFD70BF2757F0F451FABE2DBF6227CA7B27FB4C4C1666DF0AADA25B41A8D64B80553FFFE03B5053E0BEAAC802B2B65B1616A354BB1ABB0A0D96FD7C8E0189E657A958ECE89B910EA9EFC98C6225D23A7F093E569F9F1D0E8F5740CB
+2EB1F8EC
+0029A89148B2C86302C48065871D
+95F47905EE4FE48D0D12C8D5FDB5D08F96C1323F3E64263BB75641F25C0C7C59C6D45D3681876B3D0900C679A73B17FAE33667889C65B46C667509E5841AF6CE021A7F9897CFDA8F5F67386C4CB2522A09264DA34FC180BD6C9B7F6C5279A0E1B532406519AEB3BD737087D8256DECB668B935E169460A87463B922DFD65
+A4D0
+A3DB6139D22C2BB897E64C3FA9F5522B396BFF7161A1C6FF9F8BEF5175FDD148C8DF3006EA109B64A8A0EC267BFCB0
+879B3A68
+59D79FB10F5F38C7E5CA8065322D
+9AAE2D5531B152B1D7508864571A3D5EB2327B28CB067668F0811D12877C6EDCF80AE2D28A2167808ECD425FA8ACB1AC8452AA242B01F73956743CD364CACFEC6195F471EC7D4DF7C2DC01B60DE4E4D676136384F59797FB07BE9900641E228EF2888A170785613C46CAC6FD5E
+AD5E0F79
+5E64EB75DD978D86FDAA6FA28A
+2B5FB96594B710DD614C8B29FE4D56C15651CCE4C1A82A65B9F898ADB3C96DFF77317CA16D2E610514E94F7187FC04149A1544D8FCD598FD9A3A2966FB658FD857D92615E22C9FA53F444C6A7715609A
+334F0AFD
+94B8299C33B506FE279923CF5592
+0502D0BCEC9011A6402C8D41D886FCCDE479D1955F0555654AC3326674ED9E47739A4E7418E3D729B6254E46EA0BAEC9CD802A3A12DDE8CCC5203858135A8EF5E63C2498932951BA09EE13A7A6BBD7DA9709634903D2BB5569EBFCF22726838F3C36D87C9442A1358D704B160059AE123E8098B7BC1E5E4F39A6B2D0FAC7
+13D1
+42C5091EA9AD6D29A51FEEF5B9CA04333CDDE3B8BE61A8CD79EFC08E3A7FBFE99618C0
+0D21B14A
+3B3E8CC61DB4782F778AA9E226
+9D0AF9518FBBE789A41A3370E3EC7A3EFB7900560AF7C1F766423F24AB92D7DEB430AB42CFDCF856E145FB6955444BB48849A71961EF
+48E348C8
+D79C83088A30FEF735CBA4E23C0F
+133241F0F276311787667C0D3DA874396D58FEDACBF420CE857DDBEA00B9999BDC9EB9F01ECD1DBB75BDEC2A3E038B1A19AA3651AE420A8D009869F1F2E6F9E61D2CB2069E6475F30F78918F50146557767E9EF0BF4326CFAF4A22DE44915C8CF4076BF1EE0B5586501EAA638069FBFEE6B5F401C37527991A5BBD40A409
+111A
+6D130BDEC1CCE07458C87DC10B3F7A2CFC9BAFB44047E4C0671A5B901C5B22
+40B5CC2A
+4791FCF6158662AA3D1C57850F48
+A5E0F29976E6A99F661A036088F16780F5B33DB9D4ECA7DB0684CA466F567A88CE6F4DD6A90EB875E83842BE328099075A59F4FD19C0D2FD48A7DCE783FE7514AD9638CAD5C40D6E3EDDAA4519A4A6DEF087F4C3CF68B02AB12DCE4D810987C6FBEAD3E1E91B96EDCB996227
+FFE3C149
+802F1F0EE7751E4D3353373840
+5E9B7AB63DE45B9A633BD0F732D647EFADC8888FDF95D6F050115B19636E132F0BE35CCB13E191F0D6B732C3493B13EC3551DF0226E4E69AC35494F1292A1D88449D032A5E7D
+3464DAAB
+44370C5F33497AC946340FB5A961
+2F74AC68DCEBC0894898AA8410F41156C0035CE6CCD7521FE63D8F6277B31AE70B9DF546BF433BE7DE5972EAAA90F03E0CDA8B59C78531D2323D6B8E650995378F53CB3853813A949C90D6D123EB5F9E5EFDE705507FF52BEB60BC6A85C5BE125F6463846B9C60DD91EB954842F4FD4C048E94432BFAE3
+3E93CD8E
+0C2C448411923B664F41AD48691C
+2A47DF054F1F7A8340ACD34BAC6253C1833154FEF7CC0AA7C5CBE846DD1BCC5C655ACBB8C0C7781C42E14BC0D08835EC8879A696E50982E47CA2EC707D8609CE1982160ED38BFD89CE8925970B4024CE30225658E34877387A1574A78DD73491475A64D7B55AB58F7045
+EAD505F6
+A70ACC66F6C3006F47B6AC7F41
+EEDA416BA95018FC819D70E7119FAD63806A505537DC736E6EEE1D636C521CC4D916973DB7B34729FEBD994AB7F9C58D5195DC5370E1F3C92E274C179E11BFD18C6355D27D84CDA22BDD8FCA651151127460BEE98AEE54
+767F7CDA
+D1C2675DE0D6B56E13F35F89455E
+6E32D6DD0139389B2013F55740A0C0C93D257A70506639555E642262D3EF03C25EE6C960D0E23AB7222A04D79C8689073632032D0B6EF330202773D873BC04DDCC31C2E91881256698A8B99B3C152F2F5996C1E034D51C154BE8099058517F3E2402933B79AEDE49FF336CB15D37E9DBA36E6490A2236E5D938EC069
+E9FAFA0E
+7B730F95433B042A2DA0F85893
+CCA9C6D183B96665AC14EB10A649B082AF542E6294497159C44F9819C4E2701BF67120978E60EA381A8DCA51FB76D6F0658D8D801335BEE43AB38D1C0D7BD315BF693EBE6B
+AC934CD3
+64B3974A8567E59573D5B36C3A
+D33E1B3190816165169C8F26DAF574B2A6A6D95B824E634F8AAD18268D11233E9D8FA93580B3E962E39618F5B4BF30E14FE9B3705DFA6147177F75862531F30AF4B08EF588063487DB349E0E71B112DE1FB122696A3E5A74B63E5AEC9A70CAA10D4C
+224C91E8
+E66CF750D6A1507B919865887D
+4EF8AA7A98247B26CDD0112CC027D17F92FE12D01EC6D0985084D6B910C5BEC3A3603061B0E217404642683BDD9D1398721E16B74AF2B0C8FC592605425F430248C82A78956B31518F1F0E5EE361EE89A2686EE37C245321D4
+5444A764
+BAAF34691FA02B8BF11A61AE3D35
+108D69FE80811B185E8CEC76C682C267DE9A8A306DDB8799BBE0464DF3A3804528BBAD374A58A326063BE03F1B30BD9202C1B103AC1ACB0EE85167CBCB81B62E2DAFA8E17AD7268864A92BCFE0870C8C63922D8A176F48C56749744C547FA72924F8429BF1A11D23AEB28D389B739B57B629539692F5E08C0D676EDB5870
+B5A5
+BD73B0284A82594AF4B04A42C011
+91238A5F
+06E0A53A1001AFB2BEEC94DA0BC7
+3701373BCBC5690EBBE0626236FBAEEDB0777DCBCF9DAE34761D9BC5525259D0CFAFD1D19385DED5DF114BEE67F31726346C4BBF3F442C6300D0401E663C093735CAE27E11FE4A34785E09A8B00AA4C9E407D38D2B31BAA3B62CDE908FBBA933E2C3AF7878B7004B33A6250EE424CFBA0ECB919743B38ACD5C18D75196CC
+70A4
+8D90BA0F19DF50E91B500CA1ED6D9C65235AE3B411E4901011
+ED365546
+36B37A5BDDDE66F967D51C2D1749
+DC634574FC2C9A6CDFB6744EEE4510A5ED7F8B2EA6BD62C87E23EDFF25ABCF829561345F927729A7F39250ABDD5020AD9722DBBCC5BB69F030F469D5634BD7C4C8A47B20C6F98E3A2432B001C84371475ABB4C8EA51FE1B0AEBDFA964B8753001F876B81F75AAA3E819C8289960648009A007E68CA98F99748E0E8A55585
+71C9
+37731221
+7F0F1D60D43464AC6F9756F119
+7D8B120ED43ADAD5C7B8165DC399A631CB0DBEE6AA195B1C6909E7611BCD3BD1F71CC42D3E1E094A48211044AE2E30D43BD046D07C8FD6936476F6E385A5A6
+BE7FDBB2
+AE583201F6E84CC1BCD5193878
+AF0D3EE7E8A2FFB21E3E1E6AAD9706C7A0244964FC07
+02F7D31E
+F1D8A2F44BB06661B3B7EA6C706C
+3433977E40EE6751
+CE1AAA21
+5419E604F28D9E19F89403E5DEE028749AAC82B63D2AB0582CD8F60E91C08D7DB082
+D13780ADBD61B74FD56F00B7A3B45AC68296AC2F3D8BBF6A0E0F79337862EEEF0C3C7F726773
+C50751300485350EBD0E928EC16C0FB1A5772444ACCF56C86D643A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0045 put
+dup 3 /C0047 put
+dup 4 /C0058 put
+dup 5 /C0067 put
+dup 6 /C0068 put
+dup 7 /C0069 put
+dup 8 /C0072 put
+dup 9 /C0073 put
+dup 10 /C0076 put
+dup 11 /C0078 put
+dup 12 /C0079 put
+dup 13 /C0080 put
+dup 14 /C0082 put
+dup 15 /C0084 put
+dup 16 /C0097 put
+dup 17 /C0099 put
+dup 18 /C0100 put
+dup 19 /C0101 put
+dup 20 /C0102 put
+dup 21 /C0105 put
+dup 22 /C0108 put
+dup 23 /C0109 put
+dup 24 /C0110 put
+dup 25 /C0111 put
+dup 26 /C0112 put
+dup 27 /C0113 put
+dup 28 /C0114 put
+dup 29 /C0115 put
+dup 30 /C0116 put
+dup 31 /C0117 put
+readonly def
+/FontBBox [-18 -207 798 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684274F521011A4FAB2239CC4C91F3E8514A0B1
+D56D6AC921B6CB9A95B5862C
+96EA1243D6ADB73380
+FBA81AD5
+E671873831753B062D54870AC3
+7B86DA813713423C616B752F5B478535EA51AB336BF262
+0C12A9B7
+403688BEE1DF831990D942C145
+C2204CFCA477A2FAC1D6FFE48FB95A72E07E007A65A551329FB6
+E5CEBCA4
+21AA703D56FA9FAFC5608660AD
+B1585D757C69A9EE103F01E2132F3737A9D187F0AF5A534303F5DAF1811F42120ED37E37F991F2C317DD6B92A06AFA1799FE91B6647A
+427E8C13
+CF60AE48B5D903CCC2A571E90243
+3EFBF02E0CAF3725E0447BF9116C5E8796E814AB8CD1D60F5EAD1CB6DA3F72AD1453D6A3B7FC37AA9F3C1F673C557CF175AB19DFF8F452F21DB9C2391C109FFE647F7C72542C4EBE73286F582056F2ACA45770FDC609415CBADCD01BED4DBE47CA0C9E3EC29BF07B
+981F45F3
+0285EC0D9156FBAB8E4AEB40D6
+8457BC8DA71322B792B7BF4DF72AAD0C9345756144DBD263BEFC4B0459BC36FAC365B2CD2F6DBCA6D1FF1FE49440C52CB0B278480204707FDCD84B2EAED85852BCC34A45C21FE958A0E4AE303C55CB735D322CEFF5A9D3
+A150332B
+052343C0B15B7ADE5334A5217D77
+295DE5EADD586D73C511A9CEA8DC02ECFCEE966FF3D5738719490C6E1E636CE0D33E3D8481420CF1E07FBD6BCFE69F321B0320114C92FED2B69A83AD5C1E5C31D667EDB7E54112B35162235CFCED5CA6D5BB7140C151B873E3CA8E0BD78038A90AE89FA31532A8920E38A36BD94E
+201B2094
+1534C53E83D40769D38884D515C0
+D9BC826E558A2C9DE8BB6CC1A442524685E3FB5B5847273D8105A38FEFEC19B0A02707F9E4C433A8EF9A570EEE4B97429CD7064C51CAAC67A8D831708E1ADD02F1DA86DEE0CEACF2A84303A0AADB3C0CF91AA4852BCCF2D1CB645091946FA7F6172339B08B85F1EFA5734509AAF6F2AC352F1C3703FF6C
+B5E84E5A
+EFAED557567D0267EDE57C27B1
+DAB7F691C64104213BEF6884CF749D2A5D81697FAC66784BFDA32A6AEBEC2B1145B4E3410C705735B95FF488873A43A269877CD9A4B1BE4E6423AE16E4C3
+6702414E
+04D095B4FA98DEA2200FB1758B
+AC67E1429D4432F6C35E05B6A4A71C1ED8572C91510466D1A29EE19B40D69791E68852149629E2FA3E0D78D7BB6E9391211DFCA50049C534AB15ECDBC32BEDB04F9818F5DA86A43E2D
+F2D05F6A
+259BE50B43E0671E33C148B5A0
+52196AB02B9C9F419DB2656FDEBC17FFC788076895DFF67274E565091383104A257B9AC93C94636CEEAEDE3535B76CAAAE6DBBBD40D0566AD927B54066D980B0BB3C52675FD8DBF1D80B14DC2CB2303FCE51096CB03BEBF5024F18990D12B0
+BC221E67
+F07479593189ADE9A16B4B33575A
+0CE6AC3E83412C4B0B63DFF024434F447D14255F2C6192E1CB8190688E70EF481D9AEDBBD7DF6D8A81927B5F3B28A86F1A1968C5285FC1545E1119AE6D284FEC3B6F6D46B6983E96B0D46EF8F74E045FE35777ACC44B43353FE3E5E3EF249FA9660C6F6DC39F68D442
+2D0959A4
+EE9EC51DB6A0FC55D2715A2E1EE8
+BB1E27177438DD60E3E377A4D6431D9ED50A8A80BF3FD0993B955D5B58776EF2C396840E74E98EDE772C00B63FDE9DDA57A0DBF55CBCD5BE6B570336895F76F9644917DBD61ABDC3F77F5F0D02D3D744832FB984E09519AC3507F71FDCB645F72D1C2E5F
+C806DC2C
+E55AE10907EF4E1981F9AEAAC3B3
+A5CC1C97ED939AF65F2E7901837F50137410A2252134B1917D0A982C73A0B1BA01AC5DDB2CAE58C8FE3E21C63123C08217961688177D5F4FB9CD9E394A2A35F19B73CB93F374A414BE297D3B65C109FDE7D6324DE7C5E8CC8CFADFFC8C29DD2B1A6B2450F1E05E7517C58B2CEA5849E9EDD88258A6
+BA7CC75C
+DE0F396300BD31A8D10F801D02
+ED63B52C30F8950108F68D50FC6B61DA08091F8FAE3BB0EE5296E3440B83AB3FBE6206611088FFCA655C416B591B943552A0FF21B373D95A37467F2F710B7423E69E56F9863AB531AF
+57B3CBB0
+5ECC61E58A49E53DDFD7721D1A90
+B7633CB2B60D790C1DA7DC3CD3CE2E0C921A1D7BCD5DC115466B37FFFC5232258C32FC75399C7CF9F2BCB98CEA9CEE29EB9072DE0D5C1103065B8C8B7696F9BD454FA97868D380141B360C36CACAFAF7526FBB397280E4750AF1F622B15C849AAAFBC322D6EF679741B0E59E6F0CBC447CE0E6DE3F8D25BC5A533ED7B808
+FDD6
+06F59323
+B8048AE4
+35BECB1490B923B008857B543B
+C64BE31F6BD6DD83D137A2D2B9FFAD978C71E127FB1537BA9B1D8899A90D5368D436DBADBEB262878477721EC22C0A9586F1BD79FEC593BFE4A91A751A7E479D4C804807EE388BE1125C42168C9025122551
+794668CC
+4518D428B7D97024AA588D01FBDE
+FF342863578E237868D84B5D3D64FA22680EB15EDDEAF12A493F31C920F9796E69D60957D6D3A92B24EBE50E7F64641FC47A9ECBBA8971F09E7E4684279E66657D5E6CF9627DC42AC45660820A234CA4FB756F6A24C977291888B5DE984767268CE6147CD44D351F07CBE35C
+2EED4D3C
+18D3B6C894B6BFD179A87CECE1
+76E0CA07AB5CD238C929D028DE3DA48AE51062855D73CB821800EF36D9F1DC1723C9D666104C8415D4F372D459CDB6CEF15FCF3B6D0E4E9B6BD5A59AB56DBB65C84128418E0B5F4E3ECEB39778E716561EE8565E500EE8214848A29E
+D8B0D21F
+D5B3A2B33BA5E492A036700139
+BD2029D04CF4085E99326329602E7368051AD6DF7C7D7A49A592D2AC428C24402CE4763F31C343204F34287FCC1E80CCEC70CBD7AB62A874A772459FE8B4D95BE4DE530919EAF38C9AD0C25B44AE7BFAE7D9FC6707555A13E6A6D54439
+7BA1A056
+8872B3079471D4FD5A63A32415
+FDAB363111A88F1295647272DF78DF3925662852850D9B1736A56014A860D9E7EFC70B9F31B5DF7EE43CE6208AABF7EA1367130CA3E0F33E90E26B7BE015AB83E05933380C5F1D06F59A06C1B9C8
+B67ECD40
+FB6BDE86FF584E354F393E5301
+39BE17DBC7914E32634046FC2FDA354E080D71D82E307303B05AA60C557558C62CDEE3C7ECCACA2084B6DCBA67C4F12CAAD5C185
+53E812F0
+0EA8A76CABDA2E4269192D221E3D
+64D048CE9944E0E0982EAF136F5952C1AE12A867507FAD6A9598DD02DCE4F2DE4B58839F56F2429FA8881CA1B5741CA96035A508A5AB762E2E8A19FEAF3BFE451250AFF73866F8F5D9DB994157C32169F0B61FA310FA4A73FF7EFC38F5587BAC2633E40E47CF33EBB589888FCF347958EC6F9C77D909DDBFEAAC1288B1D9
+50EF
+63578D5009A6BE83A3E5030FDBA00566AB43757143557794C83B4FEA
+472CFA34
+80FFF3ED3CF2A86BB9BF8A957D3D
+AE33E425466FB6857D0901674B63A76D8BE1F45133B32B4FAF3B4AC5FEE5442BE5E90BA09F0FEFDB05CF6C89F65D0AC7EB838B7F83E89933C98D69534935BC13694FD4F1F913D13026FC5EFC55AB857A50543605F2D2F466DA12732F1869938FB8AC5793A58F2A
+AD0FF498
+971C86316C897445D2CAAB514D
+DC66C696C1A12CDB0D9BE0ED28CB1715116968084306B8ED49089D7E617227FD24A75C2EDAF9891FEB2339EE8551B325547BE71C855294CF728F5E90B3E3F408A5D62658F927
+8C66C64B
+497E7BACC3DD569DC6B65E061447
+87070E2C69C3D4B049BF15F5B97F3FC1054E70D1DE751435931E65D2301478C03897EA35A580AE40C99F9F785DF2F34D55AA0A83D5C754154B9AC858288B10D4F7B833E035CD6A5021246A3903262F5F7BCF35F5AF5D80FF1DA27BF36E1F7BB193E4C650AA7BA972BEBAE2D998D6214058
+12E8AEA2
+D794B8A8C3C2B86A532A967E4FD4
+1CDD60D646CB018472D5D7013E2784C29520695B82C0153FA9CC34BE2120556607D08BBAF356623DBB3F4FC8640748F39CF9DCD5B03A6F5B0A1D9FBD68A94E9A926F3CCDF5B62103554B8BB1022CB16CB6515C375200583C3BA1657AC45C61A0F455D7096E9AA0E823
+B22C5B33
+1B863C2F9C343BF088BD9484F2
+D6B94F12496CAE0996C48A7387B419BC8E5431F420A3ABE74963EA458EA7B0D06F71AAC8DA48634E5E8FD09E2DE39006D23A79829CA0C4BA7E9B200E26108B026B668C885F22AA536B1761702F2B173BD0E8B6B87CD9B3A33B
+D9074A2D
+3CB4100C726289DBC27EE08722DC
+E6A5762E10FFB511A0B39FC078257A7D2877952B8BE0DC5F5D7954BD17921BAC7F5422CD91384A5190AD104FC0F461F00E0DF9D3F2FE08844BE820AC3EC46360BCFFE524AEC8E9D25943C91C828D5DE9D7EE50F6B67ECF3BE09614FAD0A8EEE42D52C9429084D6D7DD289BBB8080878CD741D8985FD970B903
+64662081
+84C8636DCE03DA57A4A8A77C34
+3B645717B710DB9244221D6CDB1FAB33D7F203F50EEA2194274441CDB13E7A79F44BC9D676DA0ED2A4185D00ED06F045AE042C03E88352F44E9FB1F42ADEF00C7425FBFB
+4602F8BA
+D9C48012968A9D5E93BFF01FB5
+C81D72065353F4462E7FC31391866D12BBF96F7E336BD7241C7F86BABAA4CA275812C2DD21BDAD2610571050A56FB84E341391CB80978F8358F6105B775CD1963E056062AAF6E88BBB03FD264878162535C30413F544BD2B1948C2
+630DD042
+1B403A8CB5CC16A7C0ADCDD0A541
+C7C798C89207192B
+66111E05
+4E5F6D1A2ABE1761BAE99487FA6C4EFB6ECFA6BF69DAA56109D4BB8BEE44B059E0D2
+D09AC4B8C21214DFD92C47EFFA5E3BA6D7148A8C277809964F9F4B07E7F07303BA776D458E37
+8119142BB32E91C4F51C2297941BF9D275BF1A505A30D096ED664A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchi
+%!FontType1-1.0: PSOwstdutchi
+10 dict begin
+/FontName /PSOwstdutchi def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0097 put
+dup 2 /C0099 put
+dup 3 /C0100 put
+dup 4 /C0101 put
+dup 5 /C0104 put
+dup 6 /C0105 put
+dup 7 /C0108 put
+dup 8 /C0109 put
+dup 9 /C0111 put
+dup 10 /C0112 put
+dup 11 /C0114 put
+dup 12 /C0115 put
+dup 13 /C0116 put
+dup 14 /C0117 put
+dup 15 /C0118 put
+dup 16 /C0122 put
+readonly def
+/FontBBox [-144 -227 757 728] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268425D7C73E0D9FBC2C51FC5D7A4C8466A0ACF3
+EF6A51E85881893F5F8BC8430208
+87F3103F7721E137FA1F5E0AA668B92FD52279E66C1F88E225F1D00525B03625600EEE9AA0F3BC774875C78C8DA3485F17675C49575996A73AFCDFC5C043FF15240F2766D360B295D9F35757882F20231CD23D4B1D44649FAC2F946C5244A22F62F98DC8900497DB880EE30BEC4BE3011C108BB1603FC9E45087B4C3F7B4
+380E
+DB7BEDDFD810BFE55A51FA92E7
+C5E02760
+2FEA6E1C7BC816B379B9BB690B
+3F1F8D5D13B2FA0CA13B32E231AD6701F85E724E73EE5CAB752A1F01924E57EC33256147A9D15C2BED13E5B9868E463D0CF97CF79520D198EF7E9A4E8433615D43ADB42E79570068860AF8163DFA32E1F1AA9D84A0589C316A75510753214517
+65B024EA
+2CAE33DEAFE2FCFEC055BCC6E807
+8A53B445D923820C0B3C3B775BFA1858B494A3E1ED579B4B7021B2747CA7DB9BA810D03C123860AF732D6CEC7A174E5ADB2DF2C48459B7DA91099B9EA4DFD27060070047B8FED57852BA56F0C75B09D95315841A1D637002612F731AF8EE4047DED5D8E53BA552BEEF5D79070B6CAC2B68F8C835BBE415D9474FE29393F9
+AFB7
+3168F8BACEE4F753E5374F9DD54F816F2FB16569CBDFFE6BEF28AFFBA96E6D1D41790B9AD5A71AC47EBBF08AFD654A41
+BBB9B934
+32CD3EA43C3D75650A026F94EE07
+8C9CD2519EF572156B2F34DEB76DC76BA9B2709A6DD78C558978CDC791BF43681BB7AE9328BAA7B284BEE5A7454C72A5CF2C9BDE94805A59FF843BE51CCDBFE69C9361EC6C491C18FA2616C75B772E614F13C38B3A7CAE3986D2B142CDDD1DA052556B0B80
+CD009F6A
+B2638750700D66D0AA5810213141
+AC008781F399DF1A8043DBAEBAFC2B4AB596DA1071F3D505655C8C9E80FD9A1E0FB5F70DB8A227FC5D87E25B5985462D2E4DD446F8872432FA4BF7889A6B81AAC9CB8B818141C4D237D7DB1FC5D51A559CD13C935BF1AE639E261B83427841B5641084F6F43D44CB7DD60A0FF47E94CA86D71FC6EEF3AC18930CE91B00C9
+BD70
+67198EF0F55953DD826A0C981C7193E5CB53591FD92D5E3EE4FA3E
+90B8AFD3
+BD7D1A65145E62B247484DBEFD7F
+9A354A8CB2B1916981F3B04C446E91F9D7890C99E768D9FC4EA626D698A0A3099937CE0E16D26D38BFC8AF24914C1CAE2967D79EFDE69EF86E23739B46BE7C837D9D30688FD3748649FBF68082FA4D71603F483B057FA6DE45EF31154B6259F3B633EFB3D6A3573B473EBA1F01DF2CEDB0267012DC453BA300
+C113799C
+D73D058FD325CCDFF91C7ECFC0ED
+F5C1A835FADD3A33F90C6D40BE35C4C44C1E74A06BA5C213AC3C32207333F41924B722B467C4A262257C21398E3C5E1ECA06D9A0009E669507070150690D999B4B9DED64DEA22AA62FCCB06D0CFFF30CD6A3F21685F8AF43382540C00024B76FB86C21BD8F
+14B44FEE
+D45309CB76638A360CC3C52C3768
+33CC9C07A2C94C292258711A2E2684BD770223EE87E8E51500E66C413C885DD8F7B591D616E035D0A4D2422B02A87ACA35910E20483353B8AED8FD027ED84DADC927F04AC5FE290B2411BABE9819A1B5455C4675C02D586FBC946DC0D8C0D4565D47A4BA1E01767AC01BC99D380E26EAEF2811140DA4BCB2B6CDC145E023
+5577
+40C8C53F6C1D23B66FB4C547785165511FE75EFF5DF08E3A890D269542C74E76DCDB27338F578F7749E1BC5649B49C35D6EB07D8B2206582EF4DA5C871AFF0DC73D364F571B9C1A55CAD69
+A3C897FF
+6AF3F0EFA51F761CEB5A096396
+CA62ADD641BBEB7F15BF71EE60A0769746359E6ED502D86221686F5387FAD1C99FC79EC3B67D26DE4791AB7C2E3A878F100DEDC77079DE9354CAEE593159DC4804840B346C0B63AF3042A8F55ED2CDD681AE02A5645E4271908645E64434C8
+6EC1FA94
+81224B594D324EEC22B18CF2FFEC
+C694D26DA4B01EAC17E81BD0A1201B0733F1A238069CE685B61AB7C0372DF527FE13E9C4F02FA4A2A7BE9F63068EBB5852C9FB7C0B0DC480699AE2B9577DC4353799D0287CD9A5E6A09A0A725F591EB131ACD72F98D79199B7B3B42CFA5E54F1E7DB1F92EA4D6055FCF627C4E2CE90046A8E4C38E997457959AF4C53165E
+AA0C
+1EEFE42B3AF218C199BF1B97FF9F9B6EB63253BC3554E8CA2B39F2CDD331E73CD77F84039348851032E7
+26E8CCA2
+F9D4AB9099648F165944AD02EE
+83A494FAD10601FCF54C0665F0B4787B56E8F0AD22D814EBB6554B622A30AC57E466AB4681F5678DC5E63C7C447C0ECD2B7078507E91BCF725CEF508D6C40E89FD8A2669DDAFC1EFD2A0D52434A82440516C391B57AB169A0D3527
+274A5949
+BECC37B7C4A95529BB33F2C0EA8E
+279DC6700EDE0CE850A9177C6E851D01D67B1FAA0EE446FE947B16A24B99C1C2E8D8141337D7056995F4BA9D1246551587AAEF5E8FEA8C8127BBDDA6294ABA6B37B4DB63D93BEDAA30FC12BD50129A0A83BF32440C7F4816C47972ADA35D3DCAC651190BA1931004E7771C93F43764148B1D6BA2FDA7
+8365AAC2
+164D07464A95C1C11288EC1863
+53B9C4B298E49C0950C8F52058CAEF1A34199F853B79DE7E0710E4B12497BF156F813B0521E72F699358CFBD14A9D56C8DC8CF5F56D6DA181E1FE4D6496D24297BEBA81CDF42F498C0228919A0DBC51C868639925F9E16
+013CD527
+52A6337053FC8E0C4D5869B29620
+BEBF01FDE1279BBAFBB9C95FF68EA78975E9CFCC5B55F1ABA4222C5F9F36DC17938A29C73B252193AF33E547898A38A6AD3BA1A61A56D7D853FE2DF429F84C3C67F96ABF21C9E897860BE9F978622A51B39B0B107EBBA0326E008170847B38B385B268AF5D03A11D589D4922948261BA452EC10963E2D51821EBA7D02BFA
+EF36
+2D3AA90B6951C967A9C9887E747B2531CFAB39692475A4
+E0E0F454
+CC4B89ED9F742F955470A0DB6B
+C7D12AE114BBE7B26E1A897C731703C2E46EF5BD927835056BAE681AEEDF072723394C9A1AC2F9CCDDA88B272880F39F9C7A940970AB9F77C713C4000BCF101E5AF761BFB9775DD76A4AC0E96712C684B25F90A64F68F8C92EF0
+67ED835E
+3E4E375067FCA6B11A129AB7631B
+321258285A91BA87CCB93A9829342162FCC2285E018016AD1A28294BFA357E8F71874312FD97EA3A42D1314BC9233A28F681BCE856D7B7749A11EEEF73B6FEF343AD2894E7E5050C32CF8DAF35DE551706C4E06564A939C3E67CE3B16E9B3B21A2290FE047B156F96428C8205B42A95C5F83B862637443F3E50B6BC49ACC
+F0A1
+42E8E1B688AD6CBC4F
+BA5D4B3E
+C7943FA2DDB74F93D3DDF6B53340
+8F3D7332672DE15B
+E7E183BB
+D8F2F7B41E4363FF42244CE829AA73CC4A79D33F2B9F0839F89E36E300DB4857F052
+1F35DD3F5FA2BD1EC4A1C8F4951F797EF2C0B2C82418278D87FBBF498D2D2FABF87CA6FDAC99
+58624E435E800292174BD0EA60CDB71B326C73EF7AAE32FDF27D51
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch12i 12.00 /PSOwstdutchi newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<182634302632270f01100111262e24292d22322b01272f32011726223335322a2e2801182634372f322b011a> 2207 558 0 7384 -1 s
+<2632272f322d222e2426> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0b0d> 9346 13385 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13267 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13267 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13267 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13267 3 7133 32 s
+wst:dutch12 SF
+<1d2926> 1271 1431 0 1631 -1 s
+<00242f2d2d222e25072c2a2e26002f30342a2f2e3300272f320034292600201d15211e131a211b1b003426333400223226003429260033222d2600223300342926001e131a211b1b003426333406> 1631 1431 13 9531 0 s
+<372a3429> 1271 1676 0 1657 -1 s
+<0034292600272f2c2c2f372a2e28002225252a342a2f2e330f> 1657 1676 3 3837 0 s
+<0720> 1589 1998 0 1929 -1 s
+wst:dutch12i SF
+<03040f0c0a0402> 2033 1998 0 2700 -1 s
+wst:dutch12 SF
+<33263400342926002c2f24222c0932262d2f342600201d15002526362a242600272a2c26002e222d260027322f2d0000> 3177 1998 9 7525 0 s
+wst:dutch12i SF
+<03040f0c0a0402> 7525 1998 0 8192 -1 s
+wst:dutch12 SF
+<08> 8192 1998 0 8245 -1 s
+<1d2926003226313526333400222e2500322633302f2e332600332a3a263300372a2c2c002326003429260023352727263200332a3a263300302f3334262500342f0033262e2500222e2500322624262a362608> 1271 2320 14 8636 0 s
+wst:dutch12b SF
+<060a0d09000519181813111e151918000c1c1513181e1312000e> 1271 2748 3 3946 0 s
+<131b1f131d1e030e> 3942 2748 0 4734 -1 s
+<131d1a19181d13000d> 4730 2748 1 5630 0 s
+<131c14191c1710181113> 5622 2748 0 6664 -1 s
+<0b0c0f07> 1271 3128 0 1866 -1 s
+<04> 1870 3128 0 1928 -1 s
+<00> 1928 3128 1 1962 0 s
+wst:dutch12 SF
+<0013161a1500342633343300223226002e2f3400242f2d302a2c2625002a2e342f002e2634302632270023390025262722352c340800152700392f3500372a332900342f> 1962 3128 13 7735 0 s
+<002d2622333532260034292600302632272f32> 7735 3128 3 9461 0 s
+<3b> 9461 3128 0 9531 -1 s
+<2d222e2426> 1271 3373 0 1864 -1 s
+<002f270013161a150600392f35002d353334003226242f2d302a2c26002e26343026322700222e25002e263433263236263200372a342900071313192113161a1500222525262500342f00342926> 1864 3373 13 9531 0 s
+<2d222b26272a2c2608> 1271 3618 0 2109 -1 s
+<100013161a1500122f2e2e2624342a2f2e0019322a262e342625001b> 1271 3940 4 4194 0 s
+<263135263334091b> 4186 3940 0 4998 -1 s
+<2633302f2e3326> 4990 3940 0 5710 -1 s
+<0034263334000413161219211b1b05002c2f2f2b33002d352429003429260033222d26002233> 5710 3940 7 9531 0 s
+<222e39> 1271 4185 0 1587 -1 s
+<002f34292632> 1587 4185 1 2106 0 s
+<003226313526333409322633302f2e332600342633340800153400302632272f322d330022003226313526333409322633302f2e33260034263334002f36263200220032262c2a22232c2600242f2e2e2624342a2f2e08> 2106 4185 11 9531 0 s
+<1033> 1271 4429 0 1515 -1 s
+<00372a342900342926002f342926320013161a1500342633343306003429263226> 1515 4429 6 4428 0 s
+<002a33002e2f003326282d262e3422342a2f2e00222e25003226223333262d232c390600332f00222c2c003226313526333400222e25092f32> 4428 4429 9 9531 0 s
+<322633302f2e3326> 1271 4674 0 2072 -1 s
+<00332a3a2633002d353334002326002c263333003429222e002f3200263135222c00342f00342926002c2a2e2b00171d1e08> 2072 4674 11 6541 0 s
+<1000332a2d302c260013161219211b1b0034263334002a2e362f2422342a2f2e00372f352c25002c2f2f2b00332f2d2634292a2e28002c2a2b260034292a330f> 1271 4996 9 7431 0 s
+<02> 1398 5318 0 1504 -1 s
+wst:dutch12b SF
+<0003191a1e0318131e1a131c140318131e1a131c1400020800> 1504 5318 3 3785 0 s
+wst:dutch12i SF
+<0b0408090d0405090c0d> 3785 5318 0 4744 -1 s
+wst:dutch12b SF
+<00021e00> 4744 5318 2 5099 0 s
+wst:dutch12 SF
+<13161219211b1b> 5099 5318 0 6160 -1 s
+<142632260022322600332f2d26002f27003429260013161a1507333026242a272a2400242f2d2d222e25002c2a2e26002f30342a2f2e330f> 1271 5640 8 6731 0 s
+<0713> 1589 5962 0 1937 -1 s
+wst:dutch12i SF
+<03040f0c0a0402> 2033 5962 0 2700 -1 s
+wst:dutch12 SF
+<333026242a2739> 3177 5962 0 3795 -1 s
+<00342926002c2f24222c00222e25092f320032262d2f34260013161a15002526362a242600272a2c26002e222d26043305000427352c2c3907> 3795 5962 9 8895 0 s
+<3135222c2a272a26250508> 3177 6207 0 4112 -1 s
+<001c392e342238002a33003429260033222d260022330034292234002f27002200> 4112 6207 9 6914 0 s
+wst:dutch12i SF
+<0c0610040c0a0402> 6914 6207 0 7593 -1 s
+wst:dutch12 SF
+<08> 7593 6207 0 7646 -1 s
+<0730> 1589 6529 0 1882 -1 s
+wst:dutch12i SF
+<0a0a010c0a0402> 2033 6529 0 2725 -1 s
+wst:dutch12 SF
+<332634> 3177 6529 0 3432 -1 s
+<00342926002c2f24222c> 3432 6529 2 4266 0 s
+<00222e25092f320032262d2f34260013161a15001a1a> 4266 6529 4 6506 0 s
+<1004330508001c392e342238002a33003429260033222d26002233> 6479 6529 5 8895 0 s
+<34292234> 3177 6774 0 3536 -1 s
+<002f27002200> 3536 6774 3 3986 0 s
+wst:dutch12i SF
+<0c0610040c0a0402> 3986 6774 0 4665 -1 s
+wst:dutch12 SF
+<08> 4665 6774 0 4718 -1 s
+<0732> 1589 7096 0 1847 -1 s
+wst:dutch12i SF
+<0c0610040c0a0402> 2033 7096 0 2712 -1 s
+wst:dutch12 SF
+<333026242a273900342926003226313526333400222e25092f3200322633302f2e332600332a3a263306002a2e0023393426330600272f3200342926003426333408> 3177 7096 10 8774 0 s
+<0733> 1589 7418 0 1847 -1 s
+wst:dutch12i SF
+<0f01070e04> 2033 7418 0 2495 -1 s
+wst:dutch12 SF
+<333026242a2739> 3177 7418 0 3795 -1 s
+<00342926000e0a0c080c001c> 3795 7418 3 4852 0 s
+<101a00272f3200342926003426333408001d292a330033292f352c25002e2f3400242f2e272c2a243400372a3429> 4846 7418 8 8895 0 s
+<222e39> 3177 7663 0 3493 -1 s
+<002233332a282e2625001c> 3493 7663 2 4480 0 s
+<101a> 4474 7663 0 4765 -1 s
+<033308> 4769 7663 0 4956 -1 s
+<0737> 1589 7985 0 1909 -1 s
+wst:dutch12i SF
+<0c0610040c0a0402> 2033 7985 0 2712 -1 s
+wst:dutch12 SF
+<333026242a2739> 3177 7985 0 3795 -1 s
+<00342926002c2f24222c0033262e25093226243600372a2e252f3700332a3a2633002a2e002732222d263300043729263226002236222a2c> 3795 7985 9 8825 0 s
+<3b> 8825 7985 0 8895 -1 s
+<22232c260508> 3177 8230 0 3692 -1 s
+<071f> 1589 8551 0 1975 -1 s
+wst:dutch12i SF
+<0c0610040c0a0402> 2033 8551 0 2712 -1 s
+wst:dutch12 SF
+<333026242a2739> 3177 8551 0 3795 -1 s
+<003429260032262d2f34260033262e25093226243600372a2e252f3700332a3a2633002a2e002732222d263300043729263226> 3795 8551 8 8372 0 s
+<002236222a2c> 8372 8551 1 8825 0 s
+<3b> 8825 8551 0 8895 -1 s
+<22232c260508> 3177 8796 0 3692 -1 s
+wst:dutch12b SF
+<060a0d09> 1271 9224 0 1776 -1 s
+<000519181813111e15191816131d1d000e> 1776 9224 2 3414 0 s
+<131b1f131d1e030e> 3410 9224 0 4202 -1 s
+<131d1a19181d13000d> 4198 9224 1 5098 0 s
+<131c14191c1710181113> 5090 9224 0 6132 -1 s
+<0b0c0f07> 1271 9604 0 1866 -1 s
+<04> 1870 9604 0 1928 -1 s
+<00> 1928 9604 1 1962 0 s
+wst:dutch12 SF
+<0013161a1500342633343300223226002e2f3400242f2d302a2c2625002a2e342f002e2634302632270023390025262722352c340800152700392f3500372a332900342f> 1962 9604 13 7735 0 s
+<002d2622333532260034292600302632272f32> 7735 9604 3 9461 0 s
+<3b> 9461 9604 0 9531 -1 s
+<2d222e2426> 1271 9849 0 1864 -1 s
+<002f270013161a150600392f35002d353334003226242f2d302a2c26002e26343026322700222e25002e263433263236263200372a342900071313192113161a1500222525262500342f00342926> 1864 9849 13 9531 0 s
+<2d222b26272a2c2608> 1271 10094 0 2109 -1 s
+<10> 1271 10416 0 1434 -1 s
+<0013161a1500122f2e2e2624342a2f2e2c263333001b> 1434 10416 3 3595 0 s
+<263135263334091b> 3587 10416 0 4399 -1 s
+<2633302f2e3326> 4391 10416 0 5111 -1 s
+<0034263334000413161216211b1b05002c2f2f2b33002d352429003429260033222d2600223300222e39002f3429> 5111 10416 9 9461 0 s
+<3b> 9461 10416 0 9531 -1 s
+<2632> 1271 10661 0 1457 -1 s
+<003226313526333409322633302f2e332600342633340800153400302632272f322d330022003226313526333409322633302f2e33260034263334002f362632> 1457 10661 8 7169 0 s
+<00222e00352e32262c2a22232c2600242f2e2e2624342a2f2e08> 7169 10661 3 9531 0 s
+<142f372636263206> 1271 10906 0 2144 -1 s
+<002e263430263227> 2144 10906 1 2842 0 s
+<00252f2633002e2f34002922362600222e3900332f3234002f270032263432222e332d2a33332a2f2e002d262429222e2a332d0600332f003022242b2634002c2f333300372a34290034292a33> 2842 10906 13 9531 0 s
+<34263334> 1271 11150 0 1595 -1 s
+<00372a2c2c00322633352c34002a2e002532222d22342a24222c2c39002c2f372632262500302632272f322d222e242600322633352c34330800103300372a3429> 1595 11150 9 7152 0 s
+<00342926002f342926320013161a1500342633343306003429263226> 7152 11150 5 9531 0 s
+<2a33> 1271 11395 0 1410 -1 s
+<002e2f003326282d262e3422342a2f2e00222e25003226223333262d232c390600332f00222c2c003226313526333400222e25092f3200322633302f2e332600332a3a2633002d353334002326002c263333003429222e002f32> 1410 11395 15 9531 0 s
+<263135222c00342f00342926002c2a2e2b00171d1e08> 1271 11640 4 3366 0 s
+<1000332a2d302c260013161216211b1b0034263334002a2e362f2422342a2f2e00372f352c25002c2f2f2b00332f2d2634292a2e28002c2a2b260034292a330f> 1271 11962 9 7395 0 s
+<02> 1398 12284 0 1504 -1 s
+wst:dutch12b SF
+<0003191a1e0318131e1a131c140318131e1a131c1400020800> 1504 12284 3 3785 0 s
+wst:dutch12i SF
+<0b0408090d0405090c0d> 3785 12284 0 4744 -1 s
+wst:dutch12b SF
+<00021e00> 4744 12284 2 5099 0 s
+wst:dutch12 SF
+<13161216211b1b> 5099 12284 0 6124 -1 s
+<142632260022322600332f2d26002f27003429260013161a1507333026242a272a2400242f2d2d222e25002c2a2e26002f30342a2f2e330f> 1271 12606 8 6731 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (18) 18
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0036 put
+dup 3 /C0039 put
+dup 4 /C0040 put
+dup 5 /C0041 put
+dup 6 /C0044 put
+dup 7 /C0045 put
+dup 8 /C0046 put
+dup 9 /C0047 put
+dup 10 /C0048 put
+dup 11 /C0049 put
+dup 12 /C0050 put
+dup 13 /C0056 put
+dup 14 /C0058 put
+dup 15 /C0065 put
+dup 16 /C0066 put
+dup 17 /C0067 put
+dup 18 /C0068 put
+dup 19 /C0069 put
+dup 20 /C0071 put
+dup 21 /C0072 put
+dup 22 /C0073 put
+dup 23 /C0076 put
+dup 24 /C0077 put
+dup 25 /C0078 put
+dup 26 /C0079 put
+dup 27 /C0080 put
+dup 28 /C0082 put
+dup 29 /C0083 put
+dup 30 /C0084 put
+dup 31 /C0085 put
+dup 32 /C0087 put
+dup 33 /C0088 put
+dup 34 /C0091 put
+dup 35 /C0093 put
+dup 36 /C0095 put
+dup 37 /C0097 put
+dup 38 /C0098 put
+dup 39 /C0099 put
+dup 40 /C0100 put
+dup 41 /C0101 put
+dup 42 /C0102 put
+dup 43 /C0103 put
+dup 44 /C0104 put
+dup 45 /C0105 put
+dup 46 /C0107 put
+dup 47 /C0108 put
+dup 48 /C0109 put
+dup 49 /C0110 put
+dup 50 /C0111 put
+dup 51 /C0112 put
+dup 52 /C0113 put
+dup 53 /C0114 put
+dup 54 /C0115 put
+dup 55 /C0116 put
+dup 56 /C0117 put
+dup 57 /C0118 put
+dup 58 /C0119 put
+dup 59 /C0120 put
+dup 60 /C0121 put
+dup 61 /C0122 put
+dup 62 /C0262 put
+readonly def
+/FontBBox [-25 -256 978 766] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268422460C01E0C8156E6E2E0FACCEE618170848
+BF8730DB32B5D68060473C23
+9DBA701053746F2663
+395624ED
+0A9868CC80E5CE3D64E0B07CE7C9
+33BD984E0220EBABB6E4655834798CBF32C8490624606625BC058B6D324FC04CDD30A4350B9C0A246EF2309294F61BC9697CF64CD78C095FF8D28FD86F1E7636C3B5C422170552F247ABE40C98127E0D027ABD61BBD022E750339C9E2E06C4C0214ED65DB9BF61AA14F6501A52ABC49B980EB004A983C893B7097E08DDED
+2989
+304F43C68B3179C6CC5C73A5
+AD60541D
+5F75CF61671FC50AB5102F19D4
+C26C51B7C4F5699C33FEFDE36DA90FF31F8E7B8A3177601A1A9E070B6925BE44DE22F4793647A43484FE0235A5BCA9C6D07F1F52942699F0
+13C9631C
+715BB55532FE2DC9518A313AB9
+EB6E49113EFBA04665DE3EC5C7120491CA3D8B60C9389BCE3727310442448C5BDD706CDE7AA33D64F0DBE8A655162B16353ED0C1A761EF2E50B9543CB18224F5
+94A95225
+7D044E30E433BC441D2393058E
+A872F7D617FC24F3350733FDDBC51EB81B15788BE24E9A02DE08318175637F7A029098C0FD0AB7F043386B7B65FFFFD359F0D5EA60E1F800781F1F19935E00
+FBC29F11
+191B6971933D205B6E724A35D2
+B660BABC87EB5357A708B467D7B845A5CF32F0AC480FD2B8DACF61E3E57923EA0571A2EC9DDC91053EB657DDBDBAD20B12E434C21832A7CC02
+E60DFD29
+F05D5381EC851F83F1678220E8
+486A0597690456FB0048EA284F86FDB5D0E937A6C58122
+55A67911
+76438CFF3B061E5CD39BC73BE4
+B39410E9B3DFCC6872428F86D7A052CFEA5FC2B929BE275BD898EB00BFA422
+C87F2FB0
+914AB53A19685A067AF1642F97
+707FC865FD69B39B31A41F15FBEF86EE1A0A7E03B59507744B1EF03F
+F9FA8832
+7D0247C61E1FF02412DDF7E2AF
+A021A6B548FC509A01C12E90E921A2CE2A1DE308EC932FF2D6C05E91153953FE31C30E9FB021183C77CF73EF81209B81156F5A75D26CC2DF620A2CF928FDCA26E16E91E815568BA59E67
+0E62E7E0
+660ECE0FA7D7C1F23DF446C9FA
+F0EE7EE5C53F1F39ED93B2A8A6DBD83CF3AD50C3F3D16A3AF8F3DCE619A45C9BD22E24C81A281A73C329C61CC2BEE86A3EDE102549B828D46CEFEDD243844F
+F5D37305
+595F7980809322EA3C5A3CC04D
+886FE80BACCC4C8961C200ED6A026A13DAA3EC258264186FB4848650A1FE83178A829B241EF91E42FA2AB70BE5AEC7FFDBC897D40FAA270AAE738DD6765F4D97277B64CA1D5B225890D8EE43FB06BA99DFA94EE2FED4CEADFC4E
+18295483
+C6F37DAD8ACF9BAEC73D13F0CA0B
+4157121626A858AFEF3E8804C9989806C2A4E31C5AE8D62123C0A608EBF478144A171C1440CE6053DC8B1B0022A4BE6A0909009B320E6EB21B0C3A8A188765EA1D686E848154203F41445A85D5A599872DE9BDFAFA303F161CD1EAFBB4E49DAC6B25953985E9A293C971B08059CC7D63F0555B4EF2AFBFC606F9
+878FD134
+D1DF9D997DEBD6B6D062FC5890
+998A99BF3FA088A07F6F9161F14FF80DC97E4C25DC5975B3587D82F72B2F2806F3A15BD020C5A72A6C71FA2C9249925A597C7D8A878A
+A020DA53
+B1B2DC4343D19562C02894A5D3A3
+31145DE676E312BBB81A39918429D656FA89DB59702C80BB6605DDC333747E9BC6C1501A095EA1C055EF8B846032017B9EE48C098F4A7457B9790A8F50FC8C875A7D0889A9A11B3C8AEA9155E430C5BCED4C55C43A61249418718C6B100DE772DB4DEE56A5B27A05DFCD0B1A3D7A4D51D7D3E4
+FAA78132
+79CAA178F4D46FCF3E400A8CCB71
+7FCBA052A029ED4C01ED1F95AF38338B99CFCA1349B371E00CD9FEC082F0463444284C981287CA31CD50FFF0A28F3519E89E0117FEA29232503CA6409F3DD8516F1F3DECEE5F6BC5C9E57082F8BCFC915B26C3AEEE31C84574843F6DDADA3DC111EE80729D56C443BF3490D84875DB5F81A3C7A99399DC8B290A61BAB249
+AF9F
+10
+D714A5F4
+4DCADF72766FE1A786BEB0D0F8
+488FE185AC0CE0D695D0D9CF6899B9E887A18389ED07829C95760D6DF4529934D33BED0EF287538A730A186B48E7A1E38BA3B5461877DC0A624ABCD0CF793A03D95BD33BCFEF61B7D0DD44E530511DB3D3EA9AF3444EB1F536329CB03F36E80A03
+8919AFF6
+ECB261C71BD77CCE0981939745
+F9D5EEEC20CF6A1405DCF47906267F691F928DA67A1CE8D426DB5C9BC17DC90D602C4F14846E51BAB8FCBF05FFDD4EEB5A75605EDA8EDDDDA8DC7B1C7BCDE7DB5ADA79D4239558111A0D869144480DED3ADB410811519EAC580C9BB8E72EC9A2BDF26D
+13C73681
+27AC7BB6A718FF097CC7E5DAEDBD
+08EDBCBC9190E1608B8E3EC5C8BC20F47791128F39180ECF048E462C4DF86B8AF0E3FCDFA501B246E5D3C16CD746C85ADDE0CF1D9F4813AE852DD72F04401A456478D18216E8DB9E9939060FB0696317AB9BD42EC65E48B02399AED464966184A6FE3788CCAE61E5788AF3CC0197E7EAF99B030072424092FDF1157D3816
+A39EF056
+670F4F285F000AF5A1DF279178B9
+9FD3875B7EF4BFC529AA9A9B03181ADB19B5202F060C7FA9284C9173DEF49CB82D9780BE701243FD641E247B3412D98B4B0867E99A0ED579C249B8EEF5D3951410234C7F963416EE1C6FCE90B1A632FB681C23A0FEF022D9AC68B588A8788F971A3DE6DB1A35D46D3630987B9DE936DFAFBF3F2F5B4A7434F641
+44449185
+1D7EB9E43E1DA1FDFDB996CE9A76
+4D8FB1153FF29A15A0C871B4D052147002EED23C91CEC3982F490A83477F8F0E38573AEA568B347992142A9A1E215B40BC29AF1B0DC9DAD59383D705293464A109DEB8CD626594C0CAE9FCBCEA5AC7EBB34E461DE848E77B8E3167F88D72738C003B10538E5EF8876E5CCAE96C289CA69B8816D768D117AE5119353DB9D4
+3945
+E3A86FE10909BF38217C05
+E7EA9406
+10FD721FEB0C53179F92171DBF
+9964BBECA4663C86A07D826C1925A5C0023B12BE0E8B625DA72AC90A152D8CA37098628465A5C645BF3B7FF5944DB41C932379C6DAB9D45B325BC1
+A0115D64
+8CB667D8E1C1FFE24F24F711FF
+571E754092B55215209327A363F77BAEB3DE56D44B11C627C4AF4DD1FACB933D4D03A4292A6EA032078A63D87BA484132386C2FE7F888AF352FC76574B846391A729DED013913A
+245E3C59
+DB8868916E5551638A9D323D8B4F
+F8129A8E4BD6BA68D8DB30D5C9C590F6BAFFC197CA32D7F0CC874BD767E7158000AFC3B2B4876BA67B912808C959B1A957771A56105C1C4CEBB67F986E7BCE99DD89A558121713651952F461793B1690B9956E8BA330D7E534B51D0E92A75C745BD50ADCC2870EE7791A0BDC69DCBA
+0B2D2EA4
+F7D2A34A6C70AE1A57A2A7CDAD
+63A0DB6DC4C52645AB16D590BC31E33E4DB48D2B3567889CCEFB41CDC879B142D14DB11004B3BD273EC37C8E9E83CE80BBFF99630114B2F70B7CEC53BC989BE37F52521CDF98813686D0E9ACBFDC00995C83C60A9962052CC43AD747
+B27C9256
+648B6280550DFE100AF184E678
+3456BFC43EC111CA8DEE7DB085B4301D961F104F439A69C5DABFA07835BEF274399829AF891F86B0717836B7140BEFD33E7D6EE6CF11C9FD1E2A441C40C3654DA3C7C8A00C4216A2BDF6DDC70499C2BF5A18DA
+89879351
+87F3D10C0234012CCFA0E3C211A8
+9E16DE5BA3D6044CAFB24A8E4380FF54851DBDA545573CCD6841973C3F9E948E9FC53AB6C6DD0DEB72176DB54E4C7F21A9E7B44667629BCB6AFA8969BE98D0637CDCD9861BE57B731C949A2C31324696A3271D38ADEE04D1C3B7A4C34D8697124EC1D15E9BA04920DC29
+672F6127
+9FEC60136B8138202D6D76D7CF66
+B864BF281499901A80B27497F1DB8006E50A3099F6800F4A09B6E9BF63FF8D474D3798C3E182B8609B1EBEB8E536280865F1AE0ADB59A1424F24CFE13541B2A82E523FFE5E03F2B825C7BC4DCFEBCDA0C034E117F4E21CD09DEA56FBAAFBE9DFBB05D613B9EB50F953C8CC201C2D36122941D1CEC6E146A66013EBB56428
+CC595AB2
+86E240393E3BA76BB9E87F122A63
+5F3870491B8A4418A8A2CF9CD9244D0BBAB08DF804F7147203DCE4B3B325B76DEFF14EEDFB67AFFB489577F1D630570E62B5DFF2FC632851E4A31F91A775C7555349CAD28ED1420853424E8932A10D98D401D23DFF96A177C9336B10CCBD7E39459F54B1B33B07AE76D91E248F837127658800C941F4351D0BCD7880A6B4
+91B5
+3A85AC
+7710DE62
+5BD08E09DE68FC6DFFD1AE27A1
+CB55C2F524C757289B26B537922C546B6823D7716B2E6156EAFAC3F70E170BA7688E33607293B02B0F1BA5098D54414D8A0082D8D657D5CE3F64CAFD9B4993BE9655007E2AAAED24F0BF37EE4BCBDC11A6
+D5C9FD35
+34D3B0896D5204A06A58D74CF3E5
+DAA82DA4BDD6C1E1C0F9AC9D5565DA4C724D5ACAC989CB964B22D460633BEF753BED75217D3DE2EE1C093CB45FB5E907595B943CA8721E1CAE8580C45B7E91811EC49A010AD3749138B235CF6A355EC70070B5B2BB48102500770E2D0C8C97DCA60A6373
+C5129620
+3F6F298E36B6258FE5CA082ED099
+58E703F75B144AF32F2ECD59B6962739D4242D24112456E504A2B7F8B0B28A36DA57205D235BACDC5A5503A9D20C7CC88B460E29AFC0B5F10316D37314E86C26810593CA7BBBADF4A04C0655BD5441720AFFE527214311A0A2F25E3270249EC3F3FF7314B2E5B00A734A2C911E58DCBD44A4D9B9D11A7804D094C706CB05
+8F29
+7FC70DA926142133782A2FBD47FFEA15
+E796259C
+84740A4ADFDB87DBC7C571C29C58
+37FFFBADDE696AC79AF018C380252D0BCD385E9CFDA82BC82DEA0A06C7AB3AF8F068FC1065E8B9C22CA9F76D17A9BEBC393699E73F8F8D660408AF561BDCDA6CB7ACDF1F9467216DC01977A4CC03EE15F0E0E510357D5EE17C6FE1913B77552F83B9243199D7B1F164927E28136A4CC2DDF8205392DD865E175D9D19098A
+4090
+7175F4879445E8F9A1E058977371DB88584A2CF5DF9E794CE2F67B288553E6F5317BCDFD4D7101
+8B899C32
+9F19FEE205DD8886A56FB7E1C0
+9ED409A3A4EA890DB1628AF5155A56CAEC310978B34C7CDCD363FA202D76EEDC91CC59218C3250DF2E5C
+11AED49B
+0F13E837995868427AE25FB77A
+60D04DDEF4684941A8374A255983F53182420BE0F36D6DA4AE91B037CD44309B133DEB554DD2701ECD8CFEEA
+365F7E94
+F8F41BABEAD8EF088DB1BDC2EA
+8159A3D42B6AAA0A15A0D09BA4F99F9DCF418F3ED3DF
+ABD1580D
+03E0A3B6C152EAED88A5E71F9F41
+CB8BC1EADF9119A8352A7413481034C3359CF68610EC0F594592DBFEFF151C666F0C9EFBF6753ED48B4C86AFF32C0DE515741413E10590ADF71CC95F8649EB5AE3AAE7355AFECEDBE9785B510C6C6B455B1A5CFF761EFF1528D847810AA3F6C442B75A59EFDC02A9465E5AFA6072E5B468332C4F303C49222F3D7C6FA688
+C507
+7C51EA
+BCA0708E
+71A7FD0CDB27044F5BB913D069
+E4126743C7C419082EB3F5F31EF53A39A4E21B7F991E1408893511EAC0BD9B5C248C1F77EF7809FB1DADC628A271169BBDAD48C1E353B736E8A459C5930A1C9A32806AA642E2B24B7DA6749E46D78BE4FC24682CAFFBD4D8
+3D1C4725
+6A2CEB9CC3768CB7129C3EB567
+F2E9256799DEDBAEF5D32676011CC0F60E57904D018E37BF45633628C8462319C681C3E69F987DEE87FAFE5AEACD830AA980424F58CA6CFAA5C9E26F9A2DEC9C3E76F2C7E2D0849680B94B6C0A47F30A94D8
+FC50AE28
+FA00A99503DCFF18C802B57A0804
+C7B51094FF7A855A3668F52F143EA20D38F2DF6D0FA1BEECF21CE40480D0DA821504C5C807E66D045F8E4DCF736AEB07DE6EA78DDF5DD207CD15760FD3370C5A68173EB9508DCD455B0DD628E61DFC93B156DBA0323B54AE879F4C8D2BE2EA9FE7D5923025B3A687EF38F91C862C
+CC50D795
+47EF5C4B49DA7E09861EA327F5
+E48E1F443484184106E5607CD996DB2B45FE48A0165AC5CAAE784C5457A87C8EF23C594B596D62424D91FD7CB7DD390EAB4C9C0EC296ACFBF279F84DB5A5F7DBC8D2E468628AA8C3F8D1476106DB1CB9F90654DE66070CE12D
+A00A763D
+99E2FEDC694388B026883665C3
+1B5361DD1664C53F1908DAA8B89D951BED0FC95AF02EF90EF447CAC4D8CB340545B95E1C30910AB586B799112F0F755B533E4134E9B5C8BB4105D650EEC29800236044264EB3578589394C1CFA97F76840959949D53545FB584F078D
+B548D915
+18C42DAE549661E94DD63F2CA0FF
+6BE3B8CC9D1C5697A0618E21F70D78675F308EC8559DC92D1FBFA478587528F51A677BFA814420182872AE0F015B2B512004E31209795AEC58A8E98C846A4FAE59DB23E842086ED164F36885100BBC5C23C79B045AA7CFCB043835C4696BBB1061DB36109E9B2360DFC04EF6640701B4FA3724493A1BEC1AA7C8E445219B
+B244
+07C829CA3C7847C5DA364178300A134ADC97B45A0D6D8ECC181FD337EA3A384DA2A2BA72CEFCA71DC5A85023922601
+55D73BCB
+BD7604B83C5608ACBB17158F1DEE
+FC669CE63CCCF0D6BEFF5D074913DA79AB8A8183B4816EB098B2A6FCA799E69B848CF690DB3C6CC37749BDB47BB8788F9CFA22529C32C350F72F983DA8FBA3AFC594F37061BEEB7B0CF33DF898F2434CD4E97050B8E868FB209DB0DA80B363CC153285309E7CC829157AE769DE
+B953DA4E
+235EC9677B90420EA403DA58DE
+056B7B0F281B35602D7D3E07F060CCCC7E47C2786508E749F6CE1C248AD74864EFDE09490DE6994E7BA57B0EDD0A77810B76B9707B0C985871D63AD869C5037C4546205FA7972D32D3010630F8C97C82
+4C118408
+BA5CFA6B977C1A8BE1D78D8E2D9E
+ADF2632474A646C1B1AA217D6256BE1486EEDACD5D7F9D35FA3DAD97539354F7F73A52531CD9E18A235BDFBD4458C8FAA51F2F2E7E095F6DE1F7FFFDE7E68002D90D739B7F39F58C3AC38029C6D346D29DFFC0854E09D56F424B167BF4170ADE8CDA718D93B7D5F79DC7B7CE81CE9AECC33EC99DE2140C32EB7147C14BF2
+68FA
+97E46F2AEE85C90DA7101205C715793D2EC919894752FF3863EAE6D426D9A645C8A410
+6FA9B2DF
+337C4DD8E7F53F134394EA45E9
+8F210DEE0486F4D1FDF9873B619AB04C5D532147E6BDA7C903CEC01C0FA497CA9B737F8C55E3866A695BDF7F7D7AFE5D3C20FB775B57
+E1E0EBC5
+C2220537486D41621912F5BA8990
+633918F5366193F69982B4268709FA317990A016925907E455F58AEE856FD5324270AAFAA44C31B6ED203B77860AAC42430BB081AD8BD2D9C5121B249C76D3D7003174C2AE416F796F01497753C6FEA27A8F3E576F024C61435425EE5D69AF53E443548097398FEE2DD53149CF2FC4A381F150148510F88F560EDD063F76
+E787
+6C53DC41DEF43EC92C7BD51CEEBA84C44F4E0859A414E7B6F7353F84A5C99B
+70C010B1
+FF1EF1B0558C829FBF7CE8F3983B
+031C03D074C361D2A5184DDD73393273356EBE11A0D30D96BF04DD6E30F455463D12A92598218D5BEADA1C3CB97C529A4D87771A0F4B001DE1BABB1C439154EFDEA87280E814ABECC7A2CB81667F334DE57DBE9C3FF3980169ED684374751B3C7F6C540CF2EB5E71286C0C8A
+15271875
+37707C6825F9657F7F24C0489B
+E85952A6D72F6A20259C89633FE62183C8CFB98B25FBF11900D780AD424728AADDD4D2F6427AD49FD0EF289329CAFD754B45BA4560AB77E20D41C11C2762A0B1678ABFC1AECB
+09829993
+E85B91DD48D497E78D038B3BB3E8
+C7295B7709BCB90B3A67E5329C8CD4FECA2995361E246D9D3D2CF47B5153CD6F92FA8EA93E0633CEA1CBF313A5C626B4DBE55C35A73DBE3E8EDB29D701E70845BB91904F55523F78436FDAEC2C95B99D46E5B6155FBD6EA291F64B477BAE50234F5AE72CD74B1DAE536BB1A1999180E03B7C40C6128E69
+647935A3
+B47E3B4DBC1CA9751755DB8E3B0C
+01C6D75391D426E38C455E73C3092F3A7018597EC6D565E4FCDA4001AF92B6C757039968D01AF7439C27FDC27E7A95F7847EA2EC3C113A44BE338E40F74A48A56BDB6B22263E2AF5CA7D48E0DD063CA054CBADEC254EA3531332A5B7C363BAE9FFF53DFF7D1E1308195F
+4D07CF80
+DB9B4D290939EA21EC965DD763
+1276D516F81679EE067DFD92DEB345FDE54AEBDF2CD92F4F146D4E0DDFCF4396A3D52814330205559241AC7EC0473CC57F61D9CEA775F7841E1827901F950346B1395F9C258535094BF34E84F17C556AF92DD9C2B4CBDD
+32943C4F
+EC484F6E264F1BD6063B248BC9EF
+074637CBA33BE27E624E692345410B16EBE35A01D9A6DD8A48E7D4F813661C57CE603CD996D31D576BF139A7877E91D575AF3ADD2FAB8EDB6D997E79BEABCE5BCBFDA687D396C6C9829DC59E52A08EC7E3ED2A1940688DE23CFB2DC1E113D297CEF442FD66F99715FF5178E9FE5C0F1BA08B8C7A495372A37934391C
+875ADFBD
+4D2D526CEB814EF589010A0816
+EEBCF04F20FF0DDBE5B9B4C36B1408DE18D7C714749904B97FC754670D832BC1764F25FEAFED83CD171D6B5199A517E241D20C73AA14E0EDDAAA5FDAFCFCCAAF9813348DE2
+F4071F2B
+5E223D2808BC0A0E1A829F413D
+BF6B1AF53018F2A8B523853D4E279758DAB5EC54BC477D0FF7BFB37404570B3D8CD97873DB36F875473BD03DC35AC2D41AB489B815F9ECADA09384D3CD434C6AFEF2FE3AD2F41D3C1246C0883B13F35BD563B9897789A145958C35B9D66DBA01C67E
+104F10E0
+1BBFB4728E86079F966A452BDA
+7CE29D9E74D284B4AFE7D2A43AC9952E3D15211BD53D8EE8E2E1EDD4E0B3CCAF7E6DAC3F63E4236481EAB8ACD3B81F76B38AC5984690617B6095BBDFBA4E3A920813EE3AC07FF015F0C349F0BEB8F479D412371C254E4EE7B8
+F556B2EC
+C2289A7499131140ED20DF8321C3
+65A5104F638B0A17C8F33A40709943CC962FD5482C2E74353188FCE643C51D878BB2C9480D2BEAD2A9A766DBEDF031A2A9112E851C2D8E9B2A33464652EB2E7448FD1BF764271E5BA326F14CB82990D685FC63EEB0640C772C72C53374D1A2C095D9A7E05F7EE0195176B983A22825BCBBDC81010B0E0EAE58FDFCCF58DD
+C630
+51D4A3BDEEBB4141F9F3243BFE05
+A9177648
+AF61CC94E167138D55C43E3F6BA6
+E1C44B5145104225ED930617AF30CE5610349E6B860BF589E6D529536CBC3C518BD1D2F45301E6595AF41EED0749280D146221A44702CFF059AB3FCCA58243EE329975431C22A2FCEA53754EEFED1D309AE49C3021F8A412DAEA51457EA26039833DD836D8A4ECDEDCB5DB471CC805991A4D43CA93F545834DA56FBDD53E
+96F7
+B463C77892B2FF88D016CF6AA5CDF6890089E384A28DB33382
+6FEE1834
+A1B836DAD3A790826A0DEC532870
+FD72E53219D52D2B15F064785C79C6B256154A91F2362704CE8FF279F9CFD3C057B95C3317B39032570A4B5341220A9B9E3B8B5EF2F50D7E0F26701CD932CE5DDBD4C6F9027FDD94238EC5F5DE2B8341E34AC3F5D604595CB7F642E0F8AAC0450196A0A4A7F0854DE37F48E01D6FF8893F5E8B329157047F55FA54C76B9D
+0333
+467D9A8C
+CAF4E5B41E715BA0DF98F3C5BD
+A4BB1658078D67D110A1412DAEA06D4665C1CDBF11490E1F28AA48868C17AB3A35AE0F7C5D8EF200B3133503022BD812A3F9EB11DB6426BDD78CF2F9EF2466
+769102C0
+680FB0AF5DAD7E541355F0BD5F
+FC7BF430FA0DFF50B61148F0E481CC377D66B5F236C9
+CB2ED359
+8563997733C23571B836EE86E39D
+4C8DFA8F4DE38133
+FC3044FA
+AAFA388FE9548E2D7421F5B410BB852779A6975E979AEE1240602369DD993F939F9D
+FE862B2ACCD7289C72EE97CA2FF66F73F5A012DE956E44F4532C872B53544C2AAFC8B62D49AF
+39B2D87F011B64174DD47CBEFDEBFF65C4DDDF6F2EDF21D896D034
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0045 put
+dup 3 /C0047 put
+dup 4 /C0058 put
+dup 5 /C0068 put
+dup 6 /C0069 put
+dup 7 /C0078 put
+dup 8 /C0079 put
+dup 9 /C0080 put
+dup 10 /C0082 put
+dup 11 /C0083 put
+dup 12 /C0084 put
+dup 13 /C0085 put
+dup 14 /C0097 put
+dup 15 /C0099 put
+dup 16 /C0101 put
+dup 17 /C0102 put
+dup 18 /C0103 put
+dup 19 /C0105 put
+dup 20 /C0107 put
+dup 21 /C0109 put
+dup 22 /C0110 put
+dup 23 /C0111 put
+dup 24 /C0112 put
+dup 25 /C0113 put
+dup 26 /C0114 put
+dup 27 /C0115 put
+dup 28 /C0116 put
+dup 29 /C0117 put
+dup 30 /C0120 put
+readonly def
+/FontBBox [-18 -209 798 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684274C264E5F45F0286BD1B23D26C34626E07A
+5B039DB36C18005EE32CFA64
+906B285CB8BD7F0968
+D47F5242
+22DA29BB63EA29AC1293D9F365
+FDD092686CF0D739DAE7B4EBECDFE21B8B5810B15B35D7
+8B1BDB66
+02B6ED886A79CAF56DC024BBCB
+DDA25190FAFC3423DD681C3456E9771478F53A927D941FB6FF23
+3A389AFB
+19EB903569976D828D6FC92E4D
+81CB772312A082E95658CE400A5984BC94F3ECBA3EE65FEBFFF80B70E92F7B12DDA18F85A7AC9012DFDB1083E3382B57A6DBDC3EB44A
+46059E4D
+CDC2611CD3BDE911CA720511E9
+754F3D3EC252B5100BBEFE27ED66D78EFAC9E2F8EDD1B0004ADDB7B9636727A3CAC0EEA93419FED31A98BFFA489AEAAC363DEDF1B76F144A67EE75A5513CF2389C8FEF63FBA013FA4C0031F652F6E79FB3C3AC82DAA5D7
+C8C3E6FB
+56A3FB382750258490CCEC10C2B1
+21966B6802313BF57958F3823AA13B3DF98AADBA255BDAF1979987DFA0F0C26FA9020AE3641C98B121EF209E823946A97943BC6438EFA11D708E56A2D54B7A5C0DB9452839B276CFB3CE834E0AA4F0BEE722BBA93CA3C8E782C7243E4FA56CB2726865FCD3430DC933A2A5D6EB2A
+0DD1BC6F
+0204FB17DD8DFCF0A4006AB74F
+8BD0EC643F4B8E2F12F16EC08B8F88D61C6902946F11E294A9092249FFDAFD5B60E84FDF89B038FA957B4255F22095FEF3B9CBDABB4E425BE9F10BCF057D5C0790F5B67AFA3A834920120DFCB7DB66F76EBA2A4E71276EE2D8D0347176E1C9
+50BCADAF
+10AE8F2667DE928010E06E6A1613
+1CA22ABA488BC1757785A3B1E66E316F1327B6A29FE7F91CC6A16AA6EA9CF801C2EBAA7D5B6D947D74CD0A53D2E17DCEA20C45765C936F0649A06F358A7775F7CD2CE15B7091CEABF6A13BF3A66B36EF5CC0AEE6BD656B87BE285203E8575AA9A51E2A71A88283E78B
+E82FBA7D
+3A4A780BC80B5BADB50CE8A6CDAE
+9F7EB8AD51F214E5316434B068C490E240F849BDD5431CCFB12CDDC916E1EB2E45599D2258443CF8EDE115C14234E477860D4BA0F73F439A66FFC8385A4C6821C7D6B2E7A8CF0DF848BE1B4C5170E4D31DA48215D7E9F01549C4F23DB41D5312C9E51AD6
+1AD34EA9
+ABCFD1B92C4D4F11098C617DEDFC
+0E407756C44D3D86F46A1181DD96D7FCAB528ADE0AB35AD143D46B9C0AFB887C0F4612C60ECE4BD507ED9C09F8B9C90AE41FE3F7ADB32176CDBEA9D60C93D941AB90D53FE883AD4DF48073EB3396D6578680850E349E533C47A846C2A233CE6F952BE9313D1333DC836AB64152111145D370685FB3
+CFC74CCC
+98E17CE86F65F3F766EAA547A5C2
+9288C62820B3D2D41E187147903304C5CE9A1885AA8498AACBA3D991845493F71B438646E81D66340348AF5170CCB068AE34D98A607C53628E2C964DC72B3A41871D46E62831CECCCDA1B87A59665341F15038398AB8508045C79F75C6EF3E9D05BAB641587C59464AC6C5FA6FC80935AA1467A758AFD67644F83317F6C7
+3052
+E442B115
+D50C03181DAED59E84E96BDC5D
+82872E305A439B5BF8A0F8574BE5D847AF2CBE746878DAAE2E2BB6590B5B78BCDFD079A292AC3CDAD706055BEA0936476FDBDA2931A736BAB0C06C2D920F0F30BB28BAC9328B55EF95
+041EF03F
+BF244C4F123533616FE000F1D9DD
+0E0ACD847EB34B3155A21B829C16D6CA00DCACA9F1F0C3C56B45C69E5CBE596EBEA6549D66FCAAA59F752A12720B4E634B4E5E39D6A3A31F0AC62743FDE2493D76DE36AE3335122383D9214FAFD4BEB3F5B07F9ECB996A808E04DD3EDB00BACE472A54220507BB
+A8E5806B
+8032595AE15DE225ABA7DD76EAC1
+477D781D7DBE2A526C2F5C99EE1111D91C1728B3577706D883DE7DA4874CDD164F096D79CFF031E6907C6CDA7728BEE98A88CDFE4CA7F99F1ACBEE361F6770539493E105CDE632173FA38D13371D3B00FF7D338FCA4A6B691DE0417D9FC6E5BB4BE7A66E7764DDF16C240149DEF59CC3A486C1EE830FCB1630EA433A3FFA
+0C90
+85099C8D
+D7828885
+18111CA72E94B1DB028317B975
+E878DD5C3A799050F4FBCB89FF2950BBDD9E728BB997C99AF1C61A85056621604769CD3951EF110630BDD8037F6CA660CD63B82F331B5A9ECBA2F389E104C951617B730A18073DEFA3A81FE5000E758084AF
+FC73A2A0
+D7953914901F930F189D677552
+B91A9CF7EC6BE40BA5B86218AB21BF2107C1ECB608A9308B4240E1F7A24AB9B5371155B0B65C99D3DCDFBDE0237E5E91B61E1BFF5A5D0E3CBB502D14B5BA89041BA134E76ECE5EE3C4ADFD4C7C075D5914629C06D1B0668B2577E4BD
+93FDC1F8
+8C8FB3279F6A18AA6D271326A2
+E7B313EB922E8C66E13A37E8CC4D72B0FA6255D9115D4268D33865BBECD531CE6772D319007D51E18FDA17CDE31AF60223169F72D9076E2DBF5F0847141F8303B89BE0D1799EF9355D60845E5BE0091C1C9E59E0007EB6E50FDFB7269F
+F2845860
+B7FA1F673BB72AA5A657ED2C599B
+423AC51B8F5F8403CEDCC1F02FB75B7FF9A41DE2EA84E323E789B74AEA2EEFD592B0750B4C0B8DD715A7D200F84382227468E6A11C7F894785F92E2E416DA546A966A158BB18A0E744D923BB378909F1242B8CD3BE9AE307A936C4EDA52EE974D4040108B5AA81208AA04F581FC2A87BFB86C7D9447472F29391779FD76B
+EEC7
+47D06BBE7206F75697B2551E5824426E24F10F64CC5FAE888FAC56C7246B946A9F9EE51F91
+53683D72
+D4CCE7692A0FEA4E30F7EAF14E
+D4DE5B88E2BD62B671A62E4CB2D6232623B3110952895DEB26BA567B87102AD7761AAADCF9D45B7C010CBAA651DE4849ADD17F8B3B5B16FED5CB7D3FE3038CA89ADD4DB186169FFAA689B576D663
+FD7873FB
+841E3F91C229EF7A32C814E65B20
+68CC4034E3623715126F2AE86442445BFB8C0F6CF2C92EBAED993DD5D390B768E201F9FE663549E481822EC7408A7497B4781879B817FDD5BCB7D606412D99BD21B6643D69DFE093B54A4670655EE6532312868EA4B52AEA7FBD4AB8BC2F68BA3FB1FE77CEE0F4A09854EE881610F3C90940A2F578FA26867CDD9664B9D4
+DA60
+FADD
+C942EC53
+65DAB8EFE5D3B1603372C47A257E
+BC1FA6B4A3F6033F2FFBBBB974970079E9F50E0F491BED34489433402ECD32989C20C5D24C0DFEAC7CEB739C983FFE8EB03B7B430CF7A5599AD261A5589552A188ED8A8C7BD98A26882F711980DD7E9044285378CBA89C8B82305327296B75078603BB9A05E7C9CDA48B6B25896A4914A9DCC5A6D8F912D8FE819DD07D3D
+60B0
+3411A287359B6B6BE31FF4E531048A4AAF4C4CEDA4B313BD8AA168D1
+DD81A69F
+8D6BEEA782611D8D3DBE20176667
+500E58788C1FADB7A9DAEC99045DB89BBC362A9AF192B3252D5BD6388CEBE3A09F584996EDE85D51BAB86BDA2CC96E1A8DF4FB74E928A0A59B4135C1F4E58D154AA162F92C3E5E5D6122DB2B1E60F5C2F0CD17C4BD9CE358E3A7267DCB39F0A1E7AA99A38F1ADE
+939A8592
+8962D3C33A76700E5FBE25F472
+9E57EE064908481448037B5F3B99BABE0D4298A57687B5A001D8DEF3B12DE659654BA2C497A9C39C21343734E15BEA112E779E5A3C2F5E657E8573D87CFB3C87B8772C25C0E0
+5756C119
+CD31C7D23C4207EF82588199D0EE
+B9742EB0580970E03BB44BDCDFF0E89E394E29B28576509CDEEA3EDACCBFF830DEB01ED2F709573463CEB9A05C38A0D54FB91525768B1F169C0935C4A5D5E77EDBBBB61F3097011276811D9968622C04055536A03F5A0C5B301E14B76C3995DF02821A0EB26F2315706626855E31209FA7
+71F1AB1F
+407B8D9BBC7123FC1587AE6DA5D7
+599098211999D094434F800F922EB0B4B838A9AB5C1DA9EA06A4C8AC4C6182E4E8D87C564F8EDC8D49A99C7D3F020B2264129C25C3DBEFE89499B222AB9769CB85223CF5B83766EA464490E5B86C618857BED74DC593BC37C598314F01A5B14578AD10EFCC767BD565
+C1D1A4F4
+4C4BA3960B2029953A0743F0E8
+7CF2BAE8A5D6B5765FA67065C5848AC95C26C095919D7CF39CDF3BAF3F33A55C7EB62824E27A04D024B695BB396F67E52ABDF40179203E0780B9AF0375867786E6F3325569EC6BEFC4FB6D411B18ABEFD96B9B2AC892F833B8
+1B140F86
+69516074D97EB145D9D17FBC1E64
+70FBE00F342EA4017B437FC98A46A82E4F3EBE4BF7E9406776611BA1C5FE7D2D89C30291966AEE7E9144FBC734C383BEFC7FF9E31198E9703E5A3FD73B9CEAA840244F952FF4B41460DC39C78BB4DC1A3A5E36C589C8F6E7231B33F04E5819B43811AE3528E1A339BFB765911D27CA09552C584E64D00B5D57
+CAB1115E
+BAA63CE5CC1F764314F8DAF17D
+45D9824F4DE2409539C8B64EBCF3075AD791D625264061367077205E2276F865767394F415702A1B98CE669E7EFDA3BDF4EB5343EE70F8C3B8F356D446FB87EB2DEAFCAA
+0D0444E8
+F1A5941E1E358A7851B302DA74
+7B08208D77EA73FC565E99A1DB94D9F0E11A29F63680BD0948F12975D04B1CA6BD7B303F3C5B9354FC64BACDB1A5DD7D52E3B5E2D1D9A4DFE0A5637F152D722FE623200C6390523819DE49DF57FA283CB07AEBA1D1EBA0CB62E350
+732F94E5
+1BE8887F07799825D98DB2085054
+38142BBF85F1965A1CF7EF632EC17498C81B698AEC250A3EC98BB9106871AC58C6A689E1F135C278B6D96429ECDACAC8E4708B1652FDA85F8FE56788CB045B16F479C16A8C4D926FFB94059D54B144B6DA5B72CD9EDAB21C955B594B451A03780016000C1048991FA398D4EAD38676EE3CE1592A4551B93CBFC00EACFB18
+9414
+64A68AB058AE0759A9237532D897D5F0212B1678799C
+9252CE51
+BF37465B275CDD3BEEA504CD8096
+16BE434225556FB8
+5CF4A9EB
+C658C8C9B57CE5C91C50BCC657ABB2196A3F6F4524E065B2F2D2EC5106CDBC47A355
+07A06D716F499735BDD7256D2701ECED4A7E212E0E03DCC25D2A83E7BD00E0A8F71CDFC9B5B1
+F763E2FB1B5D927D0396B1864CE70D465FFFCDB8BEA057AA161A65
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchi
+%!FontType1-1.0: PSOwstdutchi
+10 dict begin
+/FontName /PSOwstdutchi def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0097 put
+dup 2 /C0099 put
+dup 3 /C0100 put
+dup 4 /C0101 put
+dup 5 /C0105 put
+dup 6 /C0108 put
+dup 7 /C0112 put
+dup 8 /C0114 put
+dup 9 /C0115 put
+dup 10 /C0117 put
+dup 11 /C0118 put
+dup 12 /C0122 put
+readonly def
+/FontBBox [-144 -227 513 728] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268425D38D48EC7466FFEBA5C7142506D78DF24F
+060B3D6F22F43C1605F7E610CEE0
+821C68FB13C01DCAB5D07ED3C9CA63CA4581AEE2EFDA66E4F9CBF723BB2C2673F2B11B7D38F02CC9F9A2C6025D8E959DFA89E9EA116A6AE1B47510D60570DEB71EE01F57DA8765EA6503F97F935E60A71E32AC94455B0EC0E65CA33F394477EDCB36A8E71070AB03C6DC21B89D580BBD51193BBBAE3DA6B767ADA66EF889
+A4B0
+F4D4CA8F7F808E66AE66AEB842
+06E2C14E
+2BCF8BDA455D135FA82C81845D
+E64C387FBB5DC0824E803571D4BAD4983C55C9B9C16EBB89BDA0CBEB648F02BFB0778CFABF59255975374030831E0055E4F8068875E953D8FAF8D32643FC8CAC16DA4F5DB515F675F1809B0B76C64C18F81417F8582E6B543D0A1BFE7A02B169
+00A88C47
+34AFEA5A92FECC14AC93C3B35853
+7D4D860FC0836A48D3770FDDC48D85F4DD624A95362F64A568EBBA4A127F9EB054F1759C4DC7256FCF470FCFE74B794CCF62359A11D5630E22D79AC4F98F34DD8FB549C504CA9E401891F3D95D7D5DCB4585E8450714A6A0CA2FE7B7728E9F125215E51E591F3A68A8889ACD1DA57F13FA466577873A009802BA7AB076AD
+8560
+FAE23309E6FF404FA1585DBF6AF8CD0E0CFE39E344D9255E016858FA654467B7D42D1DE4ECBFF98B8C717BDD5ABA7C59
+B475C574
+4D209E659E9B5E366D041A3144CA
+A1C4F19CB0023291FEA07365F07CF7738D0AC14DD6436FC6F663075C1CDFD5146A80F4D957DADA7EFF03136161F0A79B59CB4DFB02FAFB580788DAEB7EFBA0CC7F33981F9E13E0205DED63007C617D87AEC422BFE7085F18F8DD419EAF49E4F915F984D96B
+CDB93259
+DAD462AE15670BA4F64F891D65AB
+0E87927B961BABC2ECE37D681C6DF5C3E4B1F7386FD77B1090DD3588A6470303531F67608D92C8F7BB7BF16FE6E25BBA14B081F0C4912302770008ED3FE26D869D5718EA356031E6D37C4317FE704931F22401EE21E66F4BCD03B253DAF492F1E53EB5DC96CD54BBD9E141285A834D867E453DB9BE063FA3B1
+2D74D564
+E138D2A61EBDC31A1E861CEDEFB4
+941ACB640A72FB436C6D0210B0B491D1A083BF079DE47EEB82E3FC37B1F87168F13AB56BC4680FC5762C50B979B3DAE6C5CC91A2E5DB4F7366F09F510789D648FEEB6844E5EA7ABA57D7470E43D632B49DC47B2709B00A9A5911B2EE72D810F415DB25EFC5
+B35F5298
+F7C857DC0A9D01690311360B4D3E
+D785EC76C6F6D5B3C716E1060B8CD5283ABB1C437C5A3ABCD48B31D93F9426B01F9680D57054B179C5420FA65A53FA2CDD572E1F9F8B366DFB91D1A722EE31E49B54F7404DCD4E381D167B3C8F35ED9A38F1B2441968D7956339F35CAB79D9591CA038577D5A8437072B147E14DE4786D4AEDA03AE56EB5EEB65C5AF19AC
+71C0
+6A6980D6796C034FD5220781D694EEEFAEE2B52D5C362BA61548EF86D24D2F1F43C1489BF7249051DF5A
+DD44F25B
+4B0E35A6A7AC1BA699BE673E1D
+7C76577E47CFE52988087C8B909757CDBA53637740AFEEEC3EFD95CBB63DEF39239B53D245EC7443519F9807EE54C76E3B010EB49F5EBB64529EDAF433130ADA45A229E3B32162AF317B14E40CAEA319DC0B56467DBE0C5630FA6E
+4D8AF23C
+0CE4644E9B2AF0823F2FD580DFDF
+477821A9F078DFB8D17F61F80F4BE7658B9A6ABD0E198622FD862D0334F216BC7522AB29136EA62870E8F09AD786865DE2D309C113C453E8B51E5FFC50D560C80955F4C4A34DF47EA1CF5F5F88338EC0CE802B9ECAF81E70DA5DC48A9C62AE59C807A45637E12E4F398E011E670919AC8D3DFE37F03B
+38EDF238
+9A31D413DB2BF7F5F84F7668B9D7
+1129FCD5BD108EA1E835D7C1715061ACEB45BDA632C0CAF9E5FDF65F16015FAE4D7F78A76DCA2BF357BA802F9E8C00E0516C0B2FAA3133BA1E8749765C1CCDF061ACCC56B86DF5E0937F6428CC95EC555A43EB999B16CD10DC628485835A334251082A78D99C5FDE1E39D51A9797389B5AF4B06B282BA42E98F3FF8C645F
+F141
+B422667D981C65ADACB0E0355B51F759B3728A1E63068B
+0CA42B90
+F20E1FB9EC24F448BC16381A96
+F746C29080AEA0259522E6917CBEE0303885B82170F141A431BB19C043167DFA8FF6925248EB21A1DEC82159A1C720B2EDCB71A3ED5F98E4B6431C7375E3050C86B22E7323CEEF20E39AE02108C13D0E9A4B645D2D167B22B495
+2EC0729D
+9D8B405F22013D3E566CD037138B
+3294CD511AA7DA0A62618ADE291928190FACF84E4279A51D19E0C8706719F33A7B154EC9F36ABDA3336740BA2187DD329354D4EC65262F8059925C075ADD54F9262D033E212183BF2C02EC0541A06AE76815E22F9B161298C5569AB74031974F223294B589E58502D080EB3A06FAD1BAC9D6BD7AC3D9AC498AB63F7C0AC5
+4BB3
+58A47FC6D4A3695B5C
+E4E5C5F6
+DB7A68DEC5A750C70F5EF2579337
+B95BAC501DC9415A
+1B1CFFBC
+98ED8FAF7CA22B3F3E6760CC8FD2E7191702A30A8D64D30FC543F315604BE6760BD6
+01B4C2213CD7C9607CD048991841D11DABD216A2512CF4B0E43962CDEE9A1E31FE5A38712526
+CBED0843198973B3B25FB6DF65BD6344A2E8D20F440BF07B991114
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch12i 12.00 /PSOwstdutchi newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<1929373329352a0e010f01102931272c3025352e012a3235011829253638352d312b011929373a32352e011b> 2207 558 0 7384 -1 s
+<29352a32353025312729> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0b0d> 9346 13300 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13280 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13280 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13280 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13280 3 7133 32 s
+wst:dutch12 SF
+<0712> 1589 1431 0 1937 -1 s
+wst:dutch12i SF
+<03040b09070402> 2033 1431 0 2700 -1 s
+wst:dutch12 SF
+<363329272d2a3c> 3177 1431 0 3795 -1 s
+<00372c29002f3227252f00253128093235003529303237290012171b16002829392d2729002a2d2f29003125302904360500042a382f2f3c07> 3795 1431 9 8895 0 s
+<3438252f2d2a2d29280508> 3177 1676 0 4112 -1 s
+<001d3c3137253b002d3600372c29003625302900253600372c253700322a002500> 4112 1676 9 6914 0 s
+wst:dutch12i SF
+<09050c0409070402> 6914 1676 0 7593 -1 s
+wst:dutch12 SF
+<08> 7593 1676 0 7646 -1 s
+<0733> 1589 2023 0 1882 -1 s
+wst:dutch12i SF
+<07070109070402> 2033 2023 0 2725 -1 s
+wst:dutch12 SF
+<362937> 3177 2023 0 3432 -1 s
+<00372c29002f3227252f> 3432 2023 2 4266 0 s
+<00253128093235003529303237290012171b16001b1b> 4266 2023 4 6506 0 s
+<0f04360508001d3c3137253b002d3600372c290036253029002536> 6479 2023 5 8895 0 s
+<372c2537> 3177 2267 0 3536 -1 s
+<00322a002500> 3536 2267 3 3986 0 s
+wst:dutch12i SF
+<09050c0409070402> 3986 2267 0 4665 -1 s
+wst:dutch12 SF
+<08> 4665 2267 0 4718 -1 s
+<0735> 1589 2614 0 1847 -1 s
+wst:dutch12i SF
+<09050c0409070402> 2033 2614 0 2712 -1 s
+wst:dutch12 SF
+<363329272d2a3c00372c2900352934382936370025312809323500352936333231362900362d3d293606002d3100263c37293606002a323500372c29003729363708> 3177 2614 10 8774 0 s
+<0736> 1589 2960 0 1847 -1 s
+wst:dutch12i SF
+<0b01060a04> 2033 2960 0 2495 -1 s
+wst:dutch12 SF
+<363329272d2a3c> 3177 2960 0 3795 -1 s
+<00372c29000d0a0c080c001d> 3795 2960 3 4852 0 s
+<0f1b002a323500372c29003729363708001e2c2d3600362c32382f2800313237002732312a2f2d2737003a2d372c> 4846 2960 8 8895 0 s
+<25313c> 3177 3205 0 3493 -1 s
+<002536362d2b312928001d> 3493 3205 2 4480 0 s
+<0f1b> 4474 3205 0 4765 -1 s
+<033608> 4769 3205 0 4956 -1 s
+<073a> 1589 3551 0 1909 -1 s
+wst:dutch12i SF
+<09050c0409070402> 2033 3551 0 2712 -1 s
+wst:dutch12 SF
+<363329272d2a3c> 3177 3551 0 3795 -1 s
+<00372c29002f3227252f00362931280935292739003a2d3128323a00362d3d2936002d31002a352530293600043a2c293529002539252d2f> 3795 3551 9 8825 0 s
+<3e> 8825 3551 0 8895 -1 s
+<25262f290508> 3177 3796 0 3692 -1 s
+<0720> 1589 4143 0 1975 -1 s
+wst:dutch12i SF
+<09050c0409070402> 2033 4143 0 2712 -1 s
+wst:dutch12 SF
+<363329272d2a3c> 3177 4143 0 3795 -1 s
+<00372c290035293032372900362931280935292739003a2d3128323a00362d3d2936002d31002a352530293600043a2c293529> 3795 4143 8 8372 0 s
+<002539252d2f> 8372 4143 1 8825 0 s
+<3e> 8825 4143 0 8895 -1 s
+<25262f290508> 3177 4388 0 3692 -1 s
+wst:dutch12b SF
+<0d16131e> 1271 4873 0 1710 -1 s
+<000517150e1316000b1c1a100e15000b170f14101c000a> 1710 4873 4 4067 0 s
+<10191d101b1c030a> 4063 4873 0 4855 -1 s
+<101b1817161b100009> 4851 4873 1 5751 0 s
+<101a11171a150e160f10> 5743 4873 0 6785 -1 s
+<07080c06> 1271 5296 0 1866 -1 s
+<04> 1870 5296 0 1928 -1 s
+<00> 1928 5296 1 1960 0 s
+wst:dutch12 SF
+<001f312d3b00123230252d31001d32272e2937003729363736002535290031323700273230332d2f2928002d313732003129373329352a00263c0028292a25382f370800162a003c3238003a2d362c003732> 1960 5296 15 9046 0 s
+<00302925> 9046 5296 1 9461 0 s
+<3e> 9461 5296 0 9531 -1 s
+<3638352900372c29003329352a3235302531272900322a001f312d3b00123230252d31001d32272e29373606003c32380030383637003529273230332d2f29003129373329352a00253128> 1271 5541 11 8241 0 s
+<00312937362935392935> 8241 5541 1 9113 0 s
+<003a2d372c> 9113 5541 1 9531 0 s
+<0712121a241f191621> 1271 5786 0 2649 -1 s
+<00252828292800373200372c290030252e292a2d2f2908> 2649 5786 4 4732 0 s
+<0f> 1271 6132 0 1434 -1 s
+<001f312d3b> 1434 6132 1 1933 0 s
+<00123230252d31001d3735292530001d32272e2937001c> 1933 6132 4 4321 0 s
+<293438293637091c> 4313 6132 0 5125 -1 s
+<29363332313629003729363700041d1e1c130f18241c1c05002d36003929353c003038272c002f2d2e290025> 5117 6132 7 9531 0 s
+<1e111b241c1c> 1271 6377 0 2120 -1 s
+<003729363708> 2120 6377 1 2550 0 s
+<1e2c29001d1e1c130f18241c1c00372936370027323030253128002f2d3129003a32382f28002f32322e0036323029372c2d312b002f2d2e2900372c2d360e> 1271 6723 9 7625 0 s
+<02> 1398 7069 0 1504 -1 s
+wst:dutch12b SF
+<000317181c0316101c18101a110316101c18101a1100021c00> 1504 7069 3 3692 0 s
+wst:dutch12 SF
+<1d1e1c130f18241c1c> 3692 7069 0 5054 -1 s
+<1e2c29> 1271 7416 0 1631 -1 s
+<000715002b2f3226252f0027323030253128002f2d3129003233372d3231> 1631 7416 5 4632 0 s
+<002d36003132370039252f2d28002a32350025001f312d3b00123230252d31001d32272e293700372936370025312800362c32382f28> 4632 7416 11 9531 0 s
+<313237> 1271 7661 0 1572 -1 s
+<00262900363329272d2a2d292808> 1572 7661 2 2751 0 s
+<15293529> 1271 8007 0 1736 -1 s
+<00253529003632302900322a00372c29001f312d3b00123230252d3107363329272d2a2d270027323030253128002f2d3129003233372d323136002a323500372c29> 1736 8007 11 9531 0 s
+<1d1e1c130f18241d1e1c130f18> 1271 8252 0 3237 -1 s
+<00372936370e> 3237 8252 1 3672 0 s
+<0733> 1589 8598 0 1882 -1 s
+wst:dutch12i SF
+<03050809070402> 2033 8598 0 2642 -1 s
+wst:dutch12 SF
+<362937> 3177 8598 0 3432 -1 s
+<00372c2900282d3529273732353c003a2c29352900332d332936003a2d2f2f002629002735292537292808002212292a25382f370e00363c36372930002829> 3432 8598 10 8825 0 s
+<3e> 8825 8598 0 8895 -1 s
+<2a25382f37> 3177 8843 0 3595 -1 s
+<002a323500372c29003729303331253004050027252f2f23> 3595 8843 4 5768 0 s
+<0735> 1589 9190 0 1847 -1 s
+wst:dutch12i SF
+<09050c0409070402> 2033 9190 0 2712 -1 s
+wst:dutch12 SF
+<3a2c2d272c> 3177 9190 0 3703 -1 s
+<003a2d2f2f0036293700372c29003529343829363700253128003529363332313629> 3703 9190 6 6585 0 s
+<00362d3d293600373200372c290039252f382904360500363329272d> 6585 9190 5 8825 0 s
+<3e> 8825 9190 0 8895 -1 s
+<2a2d292808> 3177 9434 0 3579 -1 s
+<002212292a25382f370e000b00263c372923> 3579 9434 3 5116 0 s
+wst:dutch12b SF
+<0d16131e000517150e131600050e1c0e121a0e15000b170f14101c000a> 1271 9920 4 4326 0 s
+<10191d101b1c030a> 4322 9920 0 5114 -1 s
+<101b1817161b100009> 5110 9920 1 6010 0 s
+<101a11171a150e160f10> 6002 9920 0 7044 -1 s
+<07080c06> 1271 10343 0 1866 -1 s
+<04> 1870 10343 0 1928 -1 s
+<00> 1928 10343 1 1960 0 s
+wst:dutch12 SF
+<001f312d3b00123230252d31001d32272e2937003729363736002535290031323700273230332d2f2928002d313732003129373329352a00263c0028292a25382f370800162a003c3238003a2d362c003732> 1960 10343 15 9046 0 s
+<00302925> 9046 10343 1 9461 0 s
+<3e> 9461 10343 0 9531 -1 s
+<3638352900372c29003329352a3235302531272900322a001f312d3b00123230252d31001d32272e29373606003c32380030383637003529273230332d2f29003129373329352a00253128> 1271 10588 11 8241 0 s
+<00312937362935392935> 8241 10588 1 9113 0 s
+<003a2d372c> 9113 10588 1 9531 0 s
+<0712121a241f191621> 1271 10832 0 2649 -1 s
+<00252828292800373200372c290030252e292a2d2f2908> 2649 10832 4 4732 0 s
+<1e2c29> 1271 11179 0 1631 -1 s
+<001d2d30332f293637001f312d3b00123230252d3100122537252b352530001d32272e2937001c> 1631 11179 6 5665 0 s
+<293438293637091c> 5657 11179 0 6469 -1 s
+<2936333231362900041214241c1c0500372936370027323030253128> 6461 11179 3 9531 0 s
+<2f2d3129> 1271 11424 0 1608 -1 s
+<003a32382f28002f32322e0036323029372c2d312b002f2d2e2900372c2d360e> 1608 11424 5 4473 0 s
+<02> 1398 11770 0 1504 -1 s
+wst:dutch12b SF
+<000317181c0316101c18101a110316101c18101a1100021c00> 1504 11770 3 3692 0 s
+wst:dutch12 SF
+<1214241d1e1c130f18> 3692 11770 0 5071 -1 s
+<1e2c29> 1271 12116 0 1631 -1 s
+<000715002b2f3226252f0027323030253128002f2d3129003233372d3231> 1631 12116 5 4632 0 s
+<002d36003132370039252f2d28002a32350025001f312d3b00123230252d31001d32272e293700372936370025312800362c32382f28> 4632 12116 11 9531 0 s
+<313237> 1271 12361 0 1572 -1 s
+<00262900363329272d2a2d292808001529352900253529003632302900322a> 1572 12361 6 4543 0 s
+<00372c29003729363700363329272d2a2d270027323030253128002f2d3129003233372d323136002539252d2f25262f29002d310025> 4543 12361 9 9531 0 s
+<1214241d1e1c130f18> 1271 12606 0 2650 -1 s
+<003729363708> 2650 12606 1 3080 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (19) 19
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0036 put
+dup 3 /C0040 put
+dup 4 /C0041 put
+dup 5 /C0044 put
+dup 6 /C0045 put
+dup 7 /C0046 put
+dup 8 /C0047 put
+dup 9 /C0048 put
+dup 10 /C0049 put
+dup 11 /C0051 put
+dup 12 /C0052 put
+dup 13 /C0053 put
+dup 14 /C0057 put
+dup 15 /C0058 put
+dup 16 /C0062 put
+dup 17 /C0065 put
+dup 18 /C0066 put
+dup 19 /C0068 put
+dup 20 /C0069 put
+dup 21 /C0070 put
+dup 22 /C0072 put
+dup 23 /C0073 put
+dup 24 /C0076 put
+dup 25 /C0077 put
+dup 26 /C0078 put
+dup 27 /C0079 put
+dup 28 /C0080 put
+dup 29 /C0082 put
+dup 30 /C0083 put
+dup 31 /C0084 put
+dup 32 /C0085 put
+dup 33 /C0091 put
+dup 34 /C0093 put
+dup 35 /C0095 put
+dup 36 /C0097 put
+dup 37 /C0098 put
+dup 38 /C0099 put
+dup 39 /C0100 put
+dup 40 /C0101 put
+dup 41 /C0102 put
+dup 42 /C0103 put
+dup 43 /C0104 put
+dup 44 /C0105 put
+dup 45 /C0107 put
+dup 46 /C0108 put
+dup 47 /C0109 put
+dup 48 /C0110 put
+dup 49 /C0111 put
+dup 50 /C0112 put
+dup 51 /C0113 put
+dup 52 /C0114 put
+dup 53 /C0115 put
+dup 54 /C0116 put
+dup 55 /C0117 put
+dup 56 /C0118 put
+dup 57 /C0119 put
+dup 58 /C0121 put
+dup 59 /C0122 put
+dup 60 /C0262 put
+readonly def
+/FontBBox [-25 -256 920 766] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842244AFFB9E84298AD18DF926E5CD51DF0FDC
+343134D0D4E7A16E31DDD2B6
+A02530548D1476270C
+F530415F
+C733988D465EF59596F6557FFE14
+5590C9120B61E7A5C96A93C136A314AE84D3490E4B8AB72842667C775DDA28927183132A8B55692AF8246C7E09AA37FA45116E7E8AFBA6A6A42073B007038F7F4B673845ABC9E7C6B059AD15304C28FA50492F754373DAE154C84ECF780DA05046258E00B91E7245C36B0443A29AEDB2388A68A5A3FBB6B9CC6B36AE4413
+300E
+67974652BC06D58D7C59DB69
+433F893D
+B9E8E9D3E3D461A4D2031D08A9
+59102938C09484032B435E8BE23AAE746C87ABCF6E4C8577E79A210850495587311B5A94F9581BBEC07036BC09375D6ADB993A8DEA9F86257B5771A64C689085
+6DE3166A
+38BE7A24AAD26C6B31A3A2F5C5
+01AF422A94C6A9DD84E8982738DD402C60012280143C7DC826743705C7F0139848F715DB40B6A9A722ECCD5D8E91EABA4E0E2DC35DA1E69EEDC7424BB9D92E
+0C2E4786
+F12C3A13DEB21403948950DED5
+B9C221B0F037880032980F2BC5F1CAD8F9B454E9FA0ADCE10B8564B9045423A7102E2FAEEF337424FBA5D52FA3778EF8A62532BCB857F8FF7A
+0962B71B
+9E3795FDFB0596B5183E2F47B2
+65EC4F5C9193439ADB5A2F57E33582C96BEAEE167B18A3
+D51E100A
+E676C4B7027BA97ACF7D3DDEE3
+5065C08273A6D5B7F4239A050A397A99A5BD2C1C4D257C329810132572076B
+F7CF2AA4
+A7C2EC116668C014B2536B65A0
+444036463A3319E10A27F30829269C6EC54D5899BFF4110CE03A0856
+5C182B62
+4F18B5E0AA4030EBBCA2FB7C69
+92B79CD89D3373227928EDA874E90559B8DF5B18C7E84F1EF2B0417364EA44FA48CB58FE2D76D0188B8F11A65BD792960D40A9D978A3AE1E03592E87168AC18EF88FDA6B97887DE6F098
+ABB6C740
+0ABF18544D236B79ED5A5F9D9D
+0FDB96581C19948C0361C2046133CF56D9F879531AFFFFB52CAA898DA779D8FF901CD6B2478A5193C999071C87685E9BA2A7E8D9A8897191B8A8E55E0F677B
+C10742A5
+FC8A9446CF0A78624E9ABE614D4B
+FA8B7DAAA9C862E0AD55F4ABCE212874CC58CCEA7704072F3D8DD8B22EE3650EA4B1CBA53766CE6D3E7663B845FBD98D4E4E5EE54286601A09C5A6ABABBCD484BE053EC501E150B13B715412F6F7C97F786D11EB9DE8530D9AE737D36FB3FE9A9765858C616B672D769BB0BDAADB98
+5C8585E1
+328B0FE3E0B106FB600BC305BD
+5820C991EA98E470C2A4D7A0FE4307848409246D4289FE00CEE65405855CE21FCF3B53DD25B9847627F3CB1855590BAFDF8343DB71D11E70B126
+1D6B93C7
+7B2CB5EB8036154372DA5BB2AA
+B0A433C49F8AF8F6F5F9643EAC0B4DB751887D402E2667DA4C65765E2E1BB45896F1B266F4215A61841C2BCCC29444554E545C6B65E07B9C052901067A14E38124881769D18FFEC62A6CAA0EAD74F876154B48DF03F368A3C6F9CB77D60B10DC5F
+47C22469
+A3F26AE0BC46040CC328119B88B0
+6E588651C5CF7CB3C2F2277DD044A4D0D03ACBAC4D311830E1CFD680BED0F9330C491001676D1AA0070DA3EADCA0F9E20BC7D00DFFCE2257170CF1193C64011CE229B862731770904F48A343960F9D622992DE981B1AF4FD8C3DE8E9BC551260C8B99B9561
+AB978542
+663126B6FA7FA72059592675FF
+83CAF282133A8CDA4495410655FDB7EB5056F152EC80DBB4A04D4E2548FC2A10F289B9169C013E227BFDE88A2E666EFADC9303C09CE4
+C6EDE17F
+7A3A5C88A26C17401BC0EA5121
+25DC02C16705F3FD5B065E0118E0D659F62E9B1DF014D1BB4DBFEFAB1585E7573BB490E0F24061
+7E9D5E59
+AD397C4437237174D6A67CD65AA5
+3D6253DA40C61ACB6DE629B39640CA198C7E1246AC623BE22F45E5D465854E83C2A5071AA871F22AD74CAA2A1D21B55EC459486E5AC09EC27533DE1E4F3E8FA114BCD409F850168BF655EF0D3E8D9CC39B34FE205CAAF2CCA038A8412138DF19FE03B858E925B1A7BE358ADA194A199C87C162
+3FA455C3
+266A4B982AAB32F73D19A89EA5E8
+9014A1C0E8A2E098FE3D440D834DA041E2C58D5C775C1B773324F19F718CA780E38FB7AE59AF0F1A227AB4D4E1672C387E656B42B08802AD0BD819863BC7FAC90616A8DC84489504B8926D0E9D6579B637BE337408C4D2461BE18057DA78B176CE562503187CF0BBFF43F1BE38E2B69A8717F974F0D992D4EC3F9EF0238C
+F75C
+F7
+3A4EA464
+CBA1D4DD079DF64299C6807B68
+05524A6D8CF37930B4E1CFE737538E312B4A08B525684C374CC5EE5B4A5636D94D5BA71855BEF7A2CD2E102FE47759B295C13FC415BC05993C696CE886AFEA5740384B4BF25E755DB913EF8C2B598EEB40CCFE0F9ACA61EC6E33FDFD71961E3C8AA021
+9044DB5E
+828A0FE28FCB48718469EFE52109
+79A18FAA3C344DA83F258ECA5AC35DDF2561BCE6A4DFE3D536A4E3F44F71137389E160EACF444B3BA1DED5BBEB9E46A155AF353919271227694FF79C35929770FE68E1CB02FB85A91F46D94F5555B9015037A6B6F42E092BFFC13AD9F17ADBD0118AF8A6A9D8DD926A8E9133659E0E54239BB3AC778C2D46436F55C5ECF9
+D2EB0A8E
+49E43C569D84B3278DC04F1E0EE7
+251A03EEEDF294F59442F560513B1EBAF7340A5C0EE2C458804D402C54500B689F496DE5C14567FC377C8A96934B356BFDF4998A5F0CDEE58F499253292BB015BF8DCB56E969A4E7235DF354A22E1E5A670B059A28398EF9DF13A6BA693A5BD4B2F32A130D4D53BC52
+CB6511BF
+D389B688AC171FEE090FDF6A79C3
+01E0060003B7396A84F0A7A115AC3F17ED8A53FA69F2670DCD7ADB9497E997D2E928C64C0BBB78FC71DABCA5ED23E6F264F82412ACE1B05248DF978553AA6F90B2E9AD12442F5A8A9D0E0CF52577FD4E9C5EDE83EA9534B5996CF558C0E66CA48D0C34142CF7DB38175509DECE98CDADACDA1E5196D12068BD5834B5525C
+9E8D
+A5FBA803AF5CE65AB04E83
+6286D96E
+B25DC80A88BBDBBA6A92D29D19
+C4CAD31A367B437339856EF3925CED0844451C473198445E439517D687BEF0F50C2D411AA3993754CEF2F9CDDF527CA038CAE5CBD0E3E49CAEDF55
+7DB3C39A
+783E1712B0924E5DC27E7E0CAC
+FCD114B0E822BD783EF2611ED6A42D3E7C38360A1846B68195B1FEDD23B9448E4C5125FF5035E6030EC6673B7ED657CA99F9419A99B1FE9825C81EEF6924B73A91168764B8C6E1
+81F81C0A
+E8A966114AF0A6E3C14938019F7D
+AA35E82FE0D9D6A53A851BB0FC1F944D432AB0CFFFAA51A7B727EACC69D7790373C210A50849943158FF32E700C9EAEF300666FFC3681718BF6D7F3BA712276A974A2150132B8C2603A4827FF9D28DA6AFDE7FDD35CBFDC855639F8917234347BCCE2AF57F1F71D01790E6C7DFE499
+30C0AC11
+CEE38048EB9D7E2C854562A0E8
+6E19FB8DDDE1240DD5E338CE8458728EAD6588B8BC4CC87F3A8200C52584D0B64558E0E3AE6E0BB53E41420F4EB80E2E79BC143D3BCAAD20C6E57930C8C3C49F4567710183039EE2C645214DD084A65F6BED0726FEA847CF9C64C409
+82D83D4E
+76F27ACC614B4AA65E27B86DC2
+8D9CA467ED059F1AED28F822A7755552CF3E541920855437D800DC4A43005A4D14062861BE4D67BCF659498F24C8543614B5BDFBBD41CA2E495D1742D9BD02F9976976BD3608F5017AEF3F2E3EDCABC9F08483
+45CA9578
+F2AAD1CB25C5BAA165A730B69459
+8648D332AD1F50AB0F15AEE0690CC521ED215C10109A7F1FFB722781479B05FDDDAA7649FEE322CB0BE8F4F7021A3026B1808E703AAF172CD52AFA6B720C3ADA2B987B4F1BA641411CF10581D2E1AF41BCB0DC981E74A957FA1F3622CD3455EB79679D1E4B66EFDDFFC0
+DF0D33D9
+FE7155C4A12905D3906B58AC7236
+A130C5BA01733CBA8DF5B9A4BC0BFF2BC890A19A880DD9B2FC476470B73F9DA32CD10727B2A753F472379FC339B23E06520F14E7132AAF4707688CBC6C1C3EE8E265792D0ADC45F1DF02B08E6F46756D919A2DAE19021D180F62C824FD21E8548C277DED2BFE82F90973F27F5B2AA79D08ECB45ECFF3AA1C986A7B515456
+7200EA4E
+48FA5B38D6BDE7AF1305DFD581E9
+F3F68DC64F4ECB9AC47AB58271A1CFE3ACAF47FD03A0163B90545FD492ABCA3E57459AE3DB358BC8BB6A02786A988D7131290BD5F5727058F2B1DD69BABF37B002AD46115401B432F67A36DF9452ABF89E8A2220933FAA4D81DB4C26E2E84E17EBD07598F4F03ECEB8AF4928533774529DC4A103EA627A6B22006775ABF3
+E7F0
+14C259
+CB7306FE
+861DBE51CFC8299C66250E0BA6
+B7C6277384C20F87987D50D1EB48B2C03A2723F6053BACD09923186E22E773F4D1675379EE29631AB263B08E16EA660AFED38315F7C6F01BA51C508581480492C003E9447A0D0DD2064861D5EC2B10A005
+014ECBB3
+6D68074D0492ABC251FAE5840122
+72E23198965DFD6E8E49899EF97D5B1A73855AE0741275B7E953390E901FBAEA46F92CE8657F369448C0FA2A822190DFC4452923C82C147175AFBBEF34300CA867F452C325D37CE0C07807DAB1085A59E61968DD1B8E4E6F80D9EF7D9D7D386DF26FC7B3
+ED6AAB3F
+2FAB272C3FD24A2FD822BCACAC
+6B2846EEF1BB81462694D4FA681069DE82F6E7949C2B31A9B378FBBB773767F5283EAB58C823405792A8
+A7637627
+759A2C7BDE3175C12B97C78A25
+C5717BF384935104D8E3AD4D18B7DB26A903EBADC0CAAC5D74CD5947B2AC7F2F37F5560F87F1FBE65AB47933
+1EBA6049
+A3B9B830458E680F20004342D0
+B05283E66792036FCB82B84C0A97F599D980961CCC10
+211D5CFF
+80E1DBBEDD5ECE0CD67A78FC3779
+3E289C5BC0DEF4F0C44563FBC4382F2B4458D129A896FA91AAA3C679050FED2215E55A347D72E989387C0E2B1FC8DE63FFD30B5060CC429BAABE254E86ED463ED1547C8DE8454DF99F11C4D999A1C28AE66813528028799CDE37163EDCBAA39C2820C2E4250E2124F762D59FDC42E0652467B287DDD565193B2C55E26E6C
+7536
+56BCCB
+ED9A8CFE
+51E6FA1F5A5C7C4B5E1CAA8410
+28DCD2AC233B28B75575C115D23CC30BB7700C6EE4865D13D9A7050124C6E5AA0D3D359F9D86BADFA2DFFBEE7332140C51A33715F63686D42BCA65A51603756A9FA3F3CCBB4A9FE3330094C128950D5402963483CBD2282C
+9CFB6BAA
+FE61F3CB5FA81982A4B47E1194
+13DD955653613562B2D83642E8899F679C4A831F913FC5A3E3D1F887D8BDDD92DDA8D40BAD6B5CCBD69C31BD92D6A507D628A5F108BD4486A6B34B33E15EB5034BD166D5DB3E5EC1ACBA39D161E02993BC17
+B132D993
+75B741DA8073CFC205DCFE5CCAD9
+17381670E8B6B84014CEF3500AD88ECA23C8225F8BFFA2C8AC27B9DFFD813D4F0B66E06F1323C25589BE04D806AA756722B83079E1F245B871EE04C9BB620772D129CB853B8D1B29F72B96E7DA39BB5DD9A06828EA6562000093E68873AF4A3F55A47BF85097FC8AFDEC0BF0FA96
+19A8C734
+DD36A0E5E413AFE2BCBC1BF93B
+1F0A90C0841DD224B1FDF5F5338E6BF8CBB8E21E11857C8E41B4D8BE7480AC3B3B9D5EDC99024AF87FC78899461C8A4142EFDFFB85034D06471231AABC5699DD11955A83F4615B11D41294CE40F457E0D54F5C122F939708CD
+9E07164B
+7A297AA57AC5B5816098939F0A
+EF7E64F6B4656046A987BB0E1FD2963415C97BCBF0198D69BD8CFC1168F3D58AD4639376EE8AA6B5B5FBE652A40846FD27D79DB0F0930345705A2623A5B2FE3E22F16C8E389C018F76537C40EB105D7CA14201E29F1B8491B6EC6C56
+74A8CE47
+4F164F49ABAF058BFBDA85428419
+DC74E534BB0232553EB045BB24864D9FEDFD0D37DB2D82B70CD278784C17844298130A9D6D78B2D5CD7B317E570AF6CF2D242C65A26B21FAAE37A35E494D5D0FB2C19C6469C5B5C2FBCFB60B6F8880BBDBC690340072B815CB57D6140069886DA7D9F8CD5E604FC4D2B29077D51A0CECB3DB45A2C16935ED99BAE8525178
+BF8F
+80F04CCEEB85C4C8531B3C5DFD439D461374DE9BE18EEEC457D0D0F0C8615CE55239892B9CC21AC2A58756D395439F
+7B57A355
+91A080D56EA8E49933EA9EDEF3B1
+9FCE4C08607E6572A6384527B0CF6FC00F2ECC45E469967CAA851834E924CFDC4763BA7EAC23E4F712C7A8F54270A401383CD016540B8F63419A6E134775087E6584E1F139FFF2925C9586DD11EDA1860F881D0882DE22A4B87CEA6B1EA87C105101FD4A2ECC74C159A656EF15
+4CF5E9FF
+CF2DBA31799CC0067DF334C4E5
+AD44BF7F1AA099C4650FBAC1ED2F6847478EBA3FC15E6E4C82153A059872B0BC925E5C6DDEE9A34B3DD2A090175714412B1AD34DCBE3F44018675751282135D56E11160C90770AB818C62244702D4528
+8CFC2AB5
+BCF572B3C6E2F5126C0B35C693B9
+AD261C3C6476E0AF2EDC08A8FA37BCF478434EE86D4207D0119C57AC64A5C37692D3EAC641D1812529CACD4729EDF81397E671A3D286F3079DF1C1187BD6E01C8571F4F44B41753FF539B9BD8429CCC6C3A515CA851B17FC1F589A3214E06C83E262F2A8879D61365DEF459FED1181C6628B1E97D33C501333C5022C269E
+EBCB
+001199FFFA8EB66F0799E0A871738C07A4AA8EE9AE62973BC8F8AB5C25DE835C85D5DF
+4D7BCD4D
+35FC3E97D6502862D8790B301E
+9CE62B78AFA6258AD73EA78092E8A1665DCDC716D69B9E848F965D35D3B0C12DBFA336BD0D82D041ECE36883DDCE472541133BD2916F
+E74B3A7E
+F9CBDC92C3011411FD105CF828AC
+B0730F46650C1AD9AAEA0EE56C577E54B7A0ED037E384E22CFFC5922E3E8BA9460894DCAE86B5CB197A521EDFA08B5D75F12FFA2760E0EAAD4EFA3DBE8D97333FB47DAFF6EB3A21B478492279273AC401AFDC64880435308BC47CF0E06A5A3D7F34066BE0C0C43C73DEAAC10861E6A1848905834628E3DD279FEA3D4CB28
+8100
+8E1066ACB40EFD15A780D3D2C4FCC1503D2A1F0EF1462F252C8189489F5D79
+97670DFD
+91876F7FF1BBC23D94DA0148E8DD
+6A47962A84337F18020CF509FD313F775B831D24331D870E7257C89F8C1327AB3C80856C9CBB155C2CE6458016B9EFB7D79F1F65D0378BAAE76F25FBDB80724F3ECCAF8BAF18CBD357D3E1B48896370AF90ECE6E01CC41AC8C1E354B253D35BC65B175D1640EB980BFCFA31A
+2FFCCBE5
+E74D5CAD18BE8021A1EC26ED65
+81AFA8B675BE39CED50D60B77970B7993876AC44B29BD70D84C667BAA2F0148BB76453472636DDA72AC46C1EDD87CE458E553ECB743426A7A622E71597B13CE7543E979381EA
+D93EA67B
+79B9F85E35CD8461A279AB87E1A5
+11A616433820A6776EA563B287F775E7772DAB59EF6BCBDCA4B692D8167130D1EF1B65E7DACF98F7E5BC03E52C193C9890CD8CB8ADF4FDC54EF0D967E444A0029226F21590639113971E53322E92B032995B9D7325EB70FAA25E58F6E426B64544396CAD54DBBA0E5CF71126FD9C02643CC0ADE88A16F7
+D01274B1
+4673A7F7D407FF75DB2B504BD6F4
+8D79CBBA4B5B6D68690FA92171D233F32EF076943F516E2DC03CA8EC52751188F91BE1D1851E52B3DD1B4ED7F76376A707E7E0ABFAA856E16851216EB71BE9A5165924B4222DB05EA15C66B8AFF716FEF0FBF59CB478EFFC8D64FF1306E83D7BBFE7099DFB70796B7339
+53B39ACF
+5E7808C2AA71B45DE1F282ACF4
+715E5D272AF1FA295F4969A761D9D43375C70223FEE77F37E2F44039ED3E056F3B90B58807D900CE48F30C0A9DB8BEC69C0848F8351055EB8AA4250AE8B9FB90EDAEB4A00A389A84B7511881607E4A62BA7A9AA8D6C205
+31C2D9AD
+5C7782D3140ED50994E94867FDE6
+F40B8EF91A9F4679547CBDCD38703D5BE90BB427F18616511E4CCEAA9C5F717CFF985D7F80433C6F802DB08720547262F4E902B7861753A92E3A4B6C1D39B17D713109674887224915AC2338A479A8342D8292B1C05C3E981AA7EA9EB85DE45F8609E33604120E4A2BBD9DE91E70EBC345E967C98E6D827C6E7687FF
+029E0159
+CB6AF8B02245E4C1EA7FC31403
+7C7E13F37A7568CCF0625468CF801E833F456F879C4EFA3B9DA450DA45C42FE866C2C004CB721076BDB669E9E3BECF3312AADDCE0BF9F9BFFBB031E43C9486CD37DEF47B12
+31D7E8DD
+61F8513A2585B7EAD7C84D3300
+202FAB289F5390E12773DA7D3550A40AFBF16741825065A53BF425A7C0528B8B849AEBD2A9E35330B956DEF99B555C7A6B908FB328B7FD18F88A9BC27DD42E76B38BF43A22BE7498367D73AD3FDDB7BA7D749AB2D8837F1C83FB77E27ECB66623D1A
+A340C2C5
+A5778B442BF9AAE794F103318B
+37BD96C9D25A7DEBA985C8C60FF1915AA514B4F3FAD83C8E8185D95B8D161A2BE57C7FF7440A9CB12675BC3265B6684C8D421204CB476EB88A517ECF81B2F42F21A36698E349472BD31D3349FF5D1AB9D04A90488DA7656F30
+953A8453
+8EDC627DEEAE844E8B3D52A656B1
+A57D8BDB442C9C0894EB8538B75D1D5EE365F7E96D052A1EB549CAACFDE81D538E42CBCF7CCF0D3ACF4BB1A8F4FE908DE36273594D42D0514DEA6A038CF67ACFADC30BE158C4B6AEE78CA88672E86798AF20B514AED6B1D776A47C84FBBED11F3FF2BCB3633A0A9A20BE73CA44BA08226C0C8636CE93D76911D05BCA2B62
+AF91
+2BD1C8728C4D5610F55A7783CB1C
+3470CC81
+7052E98472AA2F44A084AFE8DD9E
+0B1844B1688F4E21172F8F8EE6698A11DC7E719BAEB5E66AEDD0DD4400CB24587F412CC84309AB4BC4F99EFE85310BD92EE1AC8255B350936F2975474916C75EA2D44F05FA00595C7B4634379723A9426591B97C5883EFB4A2572673B7E4E8D05CA7F820F3BD66EC41248D15812F5911393CCFA40A616232A33BC75CADA2
+F619
+5477C46E
+CA410E19ADC6D3D09B75D2F066
+48428B6B76A9747FD7C342CF317AD62DE491A478E5B8E992CDF587A3BEB0DB0CC3032AB3B163319FFDD8917FDBC450418CAB9F8E15A0AD08C869DAC21DEE10
+80D45492
+4081E9DF14812734C8EB7A1DC6
+A7028A0A609D9D53D4C1C9F5876AE7906A840573CD20
+20CB5E36
+F8BBB9523928C070D48FE0F489D7
+2EF60183582725CF
+F722532B
+62087128F5B0D1269B48EE361985B9632C8C75EF666D461941E2BDCBC6E25B979BE8
+B4E0C2805227D095A9DC8FBE5D8DC6BFD24A3A66AFAF112B5AB2847CE2FC94C70199E19A19AF
+0B3FAE4A691A81996F20079E61E21DA2D6457B293A2350AFD83030
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0045 put
+dup 3 /C0047 put
+dup 4 /C0058 put
+dup 5 /C0065 put
+dup 6 /C0069 put
+dup 7 /C0070 put
+dup 8 /C0072 put
+dup 9 /C0073 put
+dup 10 /C0077 put
+dup 11 /C0078 put
+dup 12 /C0079 put
+dup 13 /C0080 put
+dup 14 /C0082 put
+dup 15 /C0084 put
+dup 16 /C0097 put
+dup 17 /C0099 put
+dup 18 /C0101 put
+dup 19 /C0102 put
+dup 20 /C0109 put
+dup 21 /C0110 put
+dup 22 /C0111 put
+dup 23 /C0112 put
+dup 24 /C0113 put
+dup 25 /C0114 put
+dup 26 /C0115 put
+dup 27 /C0116 put
+dup 28 /C0117 put
+readonly def
+/FontBBox [-18 -207 919 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842696372152E316283F409A2BE3FB67B6CB2D
+6C35138848401FCF8D64411A
+41FB44D0E855AD39C2
+0BCE5C02
+B2E8B72CB0F5F3A6AD54FC694E
+E1CCDB927ED71226CBF0C1C0989CD2E164C8726791DE76
+3BAFE591
+27DBAEC30F845ACB53B8850958
+B3ABDF0ABF2C6482F1E51966C0FCA15946514BCEF9735B4E7007
+6EF6CB94
+603F9E3EAC39457C0087ACD1D9
+A52D5C7D156B374E83EC087F30BDE6BE850DDBF2E0F0E6B6418255651E4A5571DE4EACCC5E2ECD7C2F24C0C0D00C07D9A95DA34B30C9
+1450E91D
+2EEC5430FE77B6DDFE3271B8B14A
+6550AA385F69356FC6F9145134458B318DDE2A785AECBEF1004FBA35E4F26DBB8E61D9ABB11797189746F255A29EC2F6780E256058284429D31ADF56B030FFE1BC251FE2EF6E7B6EFAB11085831932169ABCB17DBB43FD2514E2668E867A3418C9733F85BCC4AB32F84F25
+A89957AD
+8F74EC8AD2A6C4AD659257ACC0CF
+4F29C33168B7F912FE47D781E76EBA5FDD7F611FC2918F378CC7BF2E81D9D7889F28A1F94462ED60396079ED98B4DA57B19DEF9E7DECEC2B68BB3BDFBDB69380DEA5F42D9F813E005E385FF8FA733D87A1E0CE80F1A61F477453BD01BAD9D3C464622F7722490DBD54D11B61A3E5
+2766B24B
+CDC63DFD973F78C3B5305E2D35E3
+3B794FD8E746100FCD75234F04328A0AEBD33E50AC0E6DE6BBDCC8B0BDEF490267C9888595DB0F4DE3641429C250175F375A6DBFB46F31C1810FDD0C8B38B1A96F7724BBF5C643EC080F80A1584EAB79F505489018240BCEDB2A54F91DCFAB4CE9CCCB3D
+BF8213C3
+5D2932CCD828A09753D2B38717C0
+D90AB4060BCC3C1A4985A3264AF282480A46C240371B183EA54D2DAA4AB30C931EBD7170AC9AA5B2D6137B3A4114501428EE9FEF22DC9267A956D279C7976DDECF30A5CECFED6E0A8764421AB3EDB24D266922309EB6FF569FD57FCC374845A11AF9DEA91CB8DFBF3B68180866C5EA3DBF5FD618024357
+8ADC9AFD
+C080015C6798CEC3D8BC3B09DA
+7A66E754B2AA6AEF279B0B69012D179AEA137D1C83E14470BFF64FDE8781D2EACC4356A8F2B1A278D0F7D5F40367504577E41EDE674D48C0ADE0E460E85B
+30A42CF5
+2AADFDD867E35D305B1A9101F88B
+511FF83861021BDF40273E6CB6F14A1D54C0B0569E45A6C5E018D638E3F2B94399FECA737C0C7168BE35841F185E0DA4A7D15410C99284665170BEFFEE39C9354ED4716CF1EC334A74CC9DFDD32D7192E2DC23B661BBE6A6B9E41CFD17837F38982E068BF83DC04D759DF8B382
+ED21956D
+3C20D6CD65E46E0A2FB01AB333
+B3FE8ECF051B05B1113B3BF50FC1EDF6735E20C8E1807D117CB84FC70616A2CB94D27AD6384488CA60FD8A4128A127DBA170D7D1BEF0EC9F07399C7E0F04B32E2F097D104E346F180A0EA795D4A782685D5BD9E0D1D04BFB5027582AFD219D
+D9386C41
+E2D6C00B4CBAD4B554ABE68C2A01
+8FAA8C576CF4D0112E764A51D7F75C8A544A04BDAFE55D54534C6985AC3976E9B509314D620FCC007417FDB49170A4B391B41F21C1C0994661B94BDE5442F3824DD1CB863FD3FC0E5050F302BADB373F810405BC6B746B6A88C829B8F5611E363ACEA72E9591D55069
+704EAA6F
+E18D009E7C4F3D17815AD2AAE351
+AA5C1A5E02BE3E2CEBDBB106D5CC26E9EFACC4F147658F7D03C9B4824C9E99E281CE404AAAFB96E3C9EB5FF1070FA60AE0A43E6384C62F8BED726F2AD220FEFBB414D8BB002116A23E31E99B941BD206AD54117A02D0137CBDE2F0C616946D32DED71342
+38ECDEDB
+14FBBC608411A4F029630E61CF5F
+7C8B15461EFD6C06C162FEF533F68064D02F3D40F0D76F0A8DD3B3E1577E14A2C5B10D696C5693588D3527D5BCCC24278680885289D88E3FE18852CE02DE9234BB92A59478B5C11D7BD0FB3017A3FA725393A8B804310E48921C07454C5AF7997E0BC4A1EDEFB026DC2B2CDFEAD8AE485225B7DD72
+13FDE8D4
+ECAF27FC08445860294D29ECF7
+85404270A9D6BAAE4301792A6A40C3B55045460EDC35A61DF7D09878296A5D28A26126F02F52001A78959C15DF44319C80B6DB6597BBF93FC1A7300E67C19D8040CA976B7856E732B1
+17D6B2B5
+35A8AB56157C31D5FDBB8471D2E9
+93F52957B13DF8F9B2A998171CB238DFE25F42438C9E985F3FED28ECDE6B96D5EF0EA21894193A298261DC440721BABDF7C30B46205B5EF8B7791D599D978DC3B240B9CADEDE57930BEEBDB7B0D446A86255AD316818299F1CAE2CCE98C3597584E07C0EDC637FACEF5AC71C505D3490AF986553740DEB847D472BFA6145
+2659
+7C18395C
+0962E21D
+8E77223FECD4B3EC1B992B3061
+D71E2CA99FC7477D857038A009F507E8DD8C53DBFC21AFE4FA87B3317A8D341B4AC8FE238ABA4863265E1FD51ED6A9F12D4C292199676A6DE1EB168C90BDE09147079994AD91B8A2B5C113C6FBB5FC253A4C
+A1E00786
+B6AF852B4B7D6246EFFB43AD7C
+EBAA1E8A6A400F60F49AD060D506866609241E6C4A8DC0F5DF5D9D2FB65C7EFABB61EA85D95889CD80581D728FE3CA52C83D64B1C9468DE82E81B78ED3BD4E5A46C23E8C96F171DB949633AB764E25B8A3208B3FBF1C6EDDE7D57CD9
+0F9439FC
+9E2E9C4A81D3F9B31970D0F141
+65FDEF1CBC7E7548474CF2C4EE3E64B2656EF0E063FB15DD74FBC507CEFC7055EC371918007E75282B2B43775B955E9F84FAD2BF59670403910CFF23C3B6942D6E87869D701A0D71AD198984B47C0CB7D9C9190EFFA38EE839CDF484BE
+BFBA0228
+67CD129409E7B95A03552991AA89
+0A8B6CB78DCE59274A6145BF6DF152856BC6B9267A970397E178B79FB337BD800CCD146AC76E6B5FFB5EC8B0373FBB7D360EB0D96E2243E3C3693F050DA7C2C37F76B7669893AB4FF4991057CBA7753CC8D8A8A61EAE802CB9295934D46FA8AA04F5AB4CAB4AAFE272C2424EEE016BE1DECB212B9E46FC9C3C71872EFD80
+C257
+7A8C05C0544C87A78F01DA77C8527571F1335DF19FF67074C5FE2A04
+7E4BEA20
+865D94DF9E15DA623D8E36D4F76E
+939EA1ADA93F3D509492783CE77BC7D0C9ED3002D0A8F46D266F3AA41245F6ADB028C97DC27FEDD98640D0BC7B3F29AA5F0B27292AAE44FB6EE799665A2FE948B88D32CA27F487604D76B1BF74447A56B912E6FEC8233628456380A779B70A16F50763AA986C25
+97AD8FE5
+ABE7CA7718FA738737CE3B50F0
+179B0131FC9F1CAF00E4E8B28080D2CB054225AE62923A45BF0BF93CF1BF2DF38DFE2262CBC5D39677ACAB4E77988B63BE05C22B3CE6E2474C9B28D089A507ED7A81ED897F97
+55569722
+3EBAA21E13621CDFEFC70F8DECD8
+B6327AE61AFF13D68DE5100CA53EC9EBE4242528D0BC8DD8BF77DF9C877D61E4C945E17685CEABF113E2B3F2255EA224465F5EFF22061DC3C66EFE2A34BF3D50F3CB38F2FA012D9E0214850DA8D54ADEE6C4999E6C3B02658A30AFEDC1CB717B0612D87A458F8BD55427E62E1A33B38F02
+02D07548
+AEE23C86B69F81DB736A011123C4
+CDFDCD5A6CE962B520BD38607A5E05424FF94009435C560D2A154E8EBF0339A2FF5FD1083F02BEAF34327E0A5BD4D0F2E9AD3CE4DEB3EF3F51A78FA563DD52ECCF5600322D1F885A1B56E3E00F4CD9167DAD4774485DACF88466088FEF1113F2C8B5D8F0F15D80BE24
+0BF2353B
+45692C6EC7DBF6AC1CB9D4931D
+81DC972C084CFF96622AFEAA9D54CA79C1DDCC2383F2FBAF279C4C5387153F4A1A1E54BBF092C5F7741D747972D23C97C229CC6047056AB812F7215F190EB27D185A79D4727F721FB5259F3B71D94261EA88F6AA54E7A36A52
+19BBD4E3
+EE0E476207A652FA5E2AB3B549BB
+128053BC9C318F8BA3046F728203A4C2AA2821106EBF3002E826251B6C57262A6B31A4690D4E00FCED479F319BE2ED0A3B5469C61833E6E7D95D077A7368291C9A4FF458ABB8F606C8BC0C636371CE98BB8FD5A989696872ECB8DE1B7EE7A6839A773248E2B9F872FA0780A8F4B22AC56A3DFCCF230D71FE22
+C8B11381
+61B2E69D28FE6A29AA28EBA6AA
+858A62BA962F11AA82C9B1327DE8E15B299D821CC83AAC7C3F5EF9C05343D90A2140CB5A51402063454E736C9059131818C372B6524F8084C854E9F713CB4AB60E38965A
+6637E119
+B700EEAC43269700C7ABEE1E14
+C643529001F426D7146A698634BE722A3B0E45761F31C99593050E64588A312507F3336E2B658035D3E1ED6888207CBF6F8C29DB9C9334B2EF7F5AB45578DF99D0E6C84443CBD79268276382A81D345D6C80DBE0CA85D7B822CC11
+93163DDC
+0C1884228E0B4214DFCC1AA4157F
+7CC1119159783D11
+E34FC103
+E300A926972AAEE4C9CD244C02301EB63A3E98DF2DF60FB0B288D165CD0A3798C412
+0A64C82915BF23E45EBAAA7DDDD97B67D6A64548E71A676C13C8572E282E95793C16703E6A22
+4139AFB0B755E0A3110411519839ABE79A35E059036E3B88F6FC02
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchi
+%!FontType1-1.0: PSOwstdutchi
+10 dict begin
+/FontName /PSOwstdutchi def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0097 put
+dup 2 /C0099 put
+dup 3 /C0100 put
+dup 4 /C0101 put
+dup 5 /C0104 put
+dup 6 /C0105 put
+dup 7 /C0108 put
+dup 8 /C0109 put
+dup 9 /C0111 put
+dup 10 /C0112 put
+dup 11 /C0114 put
+dup 12 /C0115 put
+dup 13 /C0116 put
+dup 14 /C0118 put
+dup 15 /C0122 put
+readonly def
+/FontBBox [-144 -227 757 728] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268425D63815BEF15AC9919F29F88A722E509700
+1EAA97FDB9800CE1CC6DACA5771B
+DD5AB3A11EDA665863BF16B0FE19CEC84057AA46E95913FF4E7C55B12F710257F2B76485C41958A723508E3D098D80B795DD08B01D0CABB23F1CB8563F685F91F682ED84659581592BE82BAD244D4A7C2B3207451BFB3A3F06762AE3C4BE49B6006C4FFFCC735BB60F502DC39C070408A3D4A576C987B7DDC703351ED35A
+DB38
+7C7D948512E73384984D099C08
+BDE35EAA
+565A3A9C634510F67C7101DDCE
+5EE69C1F06CF15239624505F6AE73440ED9BA2E1D64B06668DADC37FE075A64BAD7E45ABC9C43CCE5A85BBFD1CEF14672D5EC1D9598D7CA79FCFFC4F14F7268F4C08E09F143A2D9B6FDF99D077C7576AED42D0E993DFF79B0762C03FDAAB9C8F
+6CAED257
+D6C82CB0E8555F8B77969DFCD700
+263CC05F3CA3BD3B4AA188942C3E8031A9D3B1B42001DDB49928E114BD5D3EC001886D97D9A1C841E061853103DABF63E10611F36CA6AC494C9F4CB526619AB5C36142EA1F06E6C5A5E144F773802E641DA6894B60E2FB47389D246AC548DC9735E2D98A7AED5E10693DB9E53AEBE4E6F1053ADE159E0AFDF54AEC8015C1
+7F0C
+8E10D45B1A844E63E5D5E39C4C36582A804575EA260D78F7CBC515EE2EB51D7AF89A1374AB4C9850FC8CCBFAC9F31D02
+6E522E4C
+6702289C34AFB02FB4C907360D94
+4875E8BCAE6DBAA276909B7FD0DDE628EDA07664E10EA22B981ED586F81FCFCC8401B69321E7CDFA7F086B9F1C92D1F1B2D5F1938F5E62D9DD10E1ADD84377A9C79D9D0908E77F230A2D564B7D38AC0934269F163E05376A722B79612B834A0B3DD41BBCEC
+21B4BF72
+FCFF1922CEFA05FB1118B84A9EA4
+B7C4250DBB145BD25BBDC0AAC026973340A52E857FFBE7C26C143FFD535A1F93E3B4CD4D1DAD1DF20F9305F93CAFA062AC3AD6FBA23A84F94004CAD8D496C026E1AE9C308C18BBB055FDEDA1463B4DA096D419818F4A065B4DC1D9066A24DE0C76D08B32186B021FB2A3681897DBBBF2F321513C6AF127079EA9E1113ADE
+147A
+A4DB7CCF38943026F32F620484D724590F7DF6E25133980531B545
+12AECB08
+ABF29CD41C22112912A10B02C5AA
+368E0EA4DDAB05E76641A14FA10E65FA3F8996977FD0AEDE15A6CE2BFB9D092A64F81E5630EB814E7B8D397B0EE4E20732A7E0714C1CF067009D1A2B99026C0B3C396736D512C8DE63A725F9A20F2B88908FD0748E374D86A9753CF76087CD5115B23E361DDEDEF4B8E38CB1FA4122E4A0BA5E0651AD5BAB18
+80CFEA59
+9C68848B31905E38A5EF1227A012
+3488E56117CC6CB707B29A031AA2FEBD41E2B082FE63ADDFDAA461E88AAB7955A2278B62B44632EE744A67C97ED915EA3EFAE57992CA2205A6E3BE27115628B5854571BA72E3FEA568B362CACD26BE36EF60683DB51258A5C1EE9928DF56C40EB2EB552B9D
+AC3A194D
+96507A2EAA3544BE18D59F538634
+EEF10C25BA62E7299185920D9879AD288B0C42158BB5BE6B90E17BB2A6AC8B3E0270FFB306D369140048ED7405A7A52F37AAB56E68BD29BC82ECA1DE877A407A5A11EFC83202A6950E8A83C96B1F3B7F3AEAF762BB3CD163467809B9B0E938B029CEDD2A8585B66AF2A31EE75C5B64627C3F48F62E1C0BFA74323493BE1E
+B499
+81C8539BA89822BEABB993B70965DA01A2684A713D19823C30EDA9E43EBDEB22E6F5BADCDE03221112EE317C911AE2E300348AE224B9E9E4CE5A3CE0B83C0E64030F044FB9F678F6FCF30A
+B77BA8E5
+157D851F3A35FE2FA3181C7F09
+44360D3730264C394517D4522DB88EF766AAA2CEA9D1C2C8DE050C527DE114C88EA7F76F902798A3A01746C28DB9208F31964BF86EE13F1087008341E37687DB3899F1EAF58882657BEB5C72E7E208062852D794BFEB1E9378674E23DB17AC
+7E4505C2
+D0E35851C941A35C86BD9E23E9B0
+6A948F4626120FAE7420CA5144471BF55586CD13E8863A5F06F9AD34C72D97F71687DECCCDA606FB23D2B714282204A387EE1C7D255E5ADCC5E9BE1394900B455C3159F4CA84C8CEB89C99C8449B4BBF02C75235D79055213CD5CE5F1819B77D142F661F668CD6603D834E90A2F71A2A1B0FB108F5CA57DAA32853459087
+BFD2
+17293D2AB6DC7255898ECB5CA83E2854A9F8C95AAEEBFA068E1665E451B8F1D9714D26765B027E4550BB
+85E85DDC
+2F3588BCDA5C92E1B57E3209DF
+9F8156773430213BA000FDD41F0E4821021104EA0EDB4FF105C3B48E43EAF1E0A0F8BC95DA5A319CDBA3284071DA57E2539CA15C3C492B062A02258F52581C944F999627E05BC56DF05250FCB92361DCDBDA542E2E319262217344
+18F49469
+77D84D6D24701E489C4B5ADE0940
+2C8FFBF20F2B3AE4465E86D10FE1F804171608C7DA9F007BFDE365498CE46855CB56B626E5F17128378356A9A4B52DFC2CF3A040452D6FD1B1D7F3A2D167C8087A0DF5058EFB901A2E38CD31BE9421B6E50E67761417CA333AD3EA3F87AF4DF26DDFED371481A4D4A3CD24778FF17975B002FDAB7FF3
+5E5A7C12
+6DDF2735B8CCFC0B291CC3D8A8
+E589C4A440A08A0C4027F20C84B922C6CCBF022D505ECBFF766D3F427DB4DB5ABC491815E98850BFB42363701F2F250AE921234DB31D0499A7A88F84625F6C5CBF17E0BB254F88992C4DD53117335A5B6122C8D71B6605
+20F9D31C
+F3E9469888D22973FD7CA64CC2
+F7B1F429029D1521C0CEE5780EB70A0E0913C62558D685DB64A5F0DD6A9238CD95EEB16FD60CA24E754C2B92001DBDB1F6D8F8308A9D84EED47225A618426A86A0B7AC914155A4CE3F863CAEAFCF5772909EE824115A9DA1935D
+53B39ACF
+5E7808C2A94490CC461528BCD3F6
+C1BFD503925893AE086DD816EA5AD7E63E2512AC18DF719ED3329D01C237D2D8ADBC0E67C7BFE6C94A5786EA959AD4F8009E5C6E63077E17509AE622D2850CA6D70AE00501808BB467A4415AE977A733628FBB02B4D1D370864409A3AF25D1CE8D194686CDD930E8F3CA2B89305490C76E73BABEFBCC4E1415CAA28AD3DA
+1F77
+791EB50AD51126D17C
+A1EE2827
+374303F9202BC3AB42A2240C096E
+A124FDA5389C8566
+6EF17AD9
+A3F7708F17504F7E99883788B70AD405257FB348B54F5A42513D55C8DBAFDF6BE8F9
+A39CFD45E209DB2901D602E67837A30DEEDBF98C5326CAA3592CF46F8B03D7F4EDCFC78403D0
+24DBC72986913E267CB32BAB5608C59D3259177A2628C6748438CB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch12i 12.00 /PSOwstdutchi newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<1a2836322834290f011101122830262b2f24342d01293134011928243537342c302a011a28363931342d011c> 2207 558 0 7384 -1 s
+<28342931342f24302628> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0a0e> 9346 13385 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13267 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13267 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13267 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13267 3 7133 32 s
+wst:dutch12 SF
+<0632> 1589 1431 0 1882 -1 s
+wst:dutch12i SF
+<03060b0c0a0402> 2033 1431 0 2642 -1 s
+wst:dutch12 SF
+<352836> 3177 1431 0 3432 -1 s
+<00362b2800272c3428263631343a00392b28342800322c32283500392c2e2e002528002634282436282707002113282924372e360f00353a3536282f002728> 3432 1431 10 8825 0 s
+<3c> 8825 1431 0 8895 -1 s
+<2924372e36> 3177 1676 0 3595 -1 s
+<0029313400362b280036282f3230242f03040026242e2e22> 3595 1676 4 5768 0 s
+<0634> 1589 2023 0 1847 -1 s
+wst:dutch12i SF
+<0c060f040c0a0402> 2033 2023 0 2712 -1 s
+wst:dutch12 SF
+<352836> 3177 2023 0 3432 -1 s
+<00362b2800342833372835360024302708313400342835323130352800352c3b283500363100362b280038242e3728033504> 3432 2023 8 7970 0 s
+<00353228262c292c282707> 7970 2023 1 8895 0 s
+<2113282924372e360f> 3177 2268 0 3998 -1 s
+<000a00253a362822> 3998 2268 2 4661 0 s
+wst:dutch12b SF
+<07> 1271 2754 0 1399 -1 s
+<1619120005> 1389 2754 1 1872 0 s
+<0f0a00050d09000e> 1867 2754 2 2808 0 s
+<12181c121a1b030e> 2804 2754 0 3596 -1 s
+<121a1716151a12000d> 3592 2754 1 4492 0 s
+<12191316191410151112> 4484 2754 0 5526 -1 s
+<0b0c0f06> 1271 3177 0 1866 -1 s
+<04> 1870 3177 0 1928 -1 s
+<00> 1928 3177 1 1972 0 s
+wst:dutch12 SF
+<0015> 1972 3177 1 2147 0 s
+<3134280011> 2139 3177 1 2648 0 s
+<1f1900111c17> 2628 3177 1 3384 0 s
+<00362835363500243428003031360026312f322c2e2827002c303631003028363228342900253a0027282924372e3607001729003a313700392c352b003631002f282435373428> 3384 3177 13 9531 0 s
+<362b28> 1271 3422 0 1561 -1 s
+<003228342931342f2430262800312900263130302826362c313035003138283400362b280015> 1561 3422 6 5017 0 s
+<3134280011> 5009 3422 1 5509 0 s
+<1f1900111c1705003a3137002f37353600342826312f322c2e2800302836322834290024302700302836> 5489 3422 7 9461 0 s
+<3c> 9461 3422 0 9531 -1 s
+<352834382834> 1271 3667 0 1820 -1 s
+<00392c362b000613131b23151b1d1400242727282700363100362b28002f242d28292c2e2807> 1820 3667 6 5806 0 s
+<110015> 1271 4013 1 1618 0 s
+<3134280011> 1610 4013 1 2128 0 s
+<1f1900111c17001d> 2108 4013 2 3089 0 s
+<283337283536081d> 3081 4013 0 3893 -1 s
+<2835323130352800362835360003151b1d14231d1d04002c35003828343a002f37262b002e2c2d2800240020131c231d1d003628353607> 3885 4013 9 9347 0 s
+<1f2b2800352c2f322e28353600151b1d14231d1d00362835360026312f2f243027002e2c3028003931372e27002e31312d0035312f28362b2c302a002e2c2d2800362b2c350f> 1271 4360 10 8104 0 s
+<02> 1398 4706 0 1504 -1 s
+wst:dutch12b SF
+<000316171b0315121b171219130315121b1712191300021b00> 1504 4706 3 3692 0 s
+wst:dutch12 SF
+<151b1d14231d1d00> 3692 4706 1 4791 0 s
+wst:dutch12b SF
+<0208> 4791 4706 0 5133 -1 s
+wst:dutch12 SF
+<00> 5133 4706 1 5186 0 s
+wst:dutch12i SF
+<0b0408090d0405090c0d> 5186 4706 0 6145 -1 s
+wst:dutch12 SF
+<16283428> 1271 5053 0 1736 -1 s
+<002434280035312f2800312900362b28003628353600353228262c292c260026312f2f243027002e2c3028003132362c313035002432322e2c2624252e28003631002400151b1d14231e1f1d141119> 1736 5053 13 9531 0 s
+<3628353607> 1271 5298 0 1648 -1 s
+<0624> 1589 5644 0 1871 -1 s
+wst:dutch12i SF
+<010107> 2033 5644 0 2303 -1 s
+wst:dutch12 SF
+<373528> 3177 5644 0 3479 -1 s
+<00362b280011> 3479 5644 2 4014 0 s
+<1f190011> 3994 5644 1 4538 0 s
+<2724323624362c31300018> 4534 5644 1 5581 0 s
+<243a28340030372f2528340024242e> 5585 5644 2 7026 0 s
+<00363100283026243235372e243628003224262d> 7026 5644 3 8825 0 s
+<3c> 8825 5644 0 8895 -1 s
+<28363507> 3177 5889 0 3485 -1 s
+<001e3228262c293a2c302a000b003134000c00392c2e2e003a2c282e270011> 3485 5889 7 6163 0 s
+<11180b080c0500243027000d00392c2e2e003a2c282e270011> 6159 5889 5 8441 0 s
+<11180d07> 8437 5889 0 8895 -1 s
+<2113282924372e360f> 3177 6134 0 3998 -1 s
+<000d0006100011> 3998 6134 3 4780 0 s
+<11180d22> 4776 6134 0 5250 -1 s
+<0625> 1589 6480 0 1879 -1 s
+wst:dutch12i SF
+<0c060f040c0a0402> 2033 6480 0 2712 -1 s
+wst:dutch12 SF
+<352836> 3177 6480 0 3432 -1 s
+<00362b28002f282430002537343536003624342a283600243027083134002f2c302c2f372f002c300037302c3635003129002d2c2e31252c36003224262d> 3432 6480 11 8825 0 s
+<3c> 8825 6480 0 8895 -1 s
+<28363507> 3177 6725 0 3485 -1 s
+<001f2b2800292c3435360038242e3728002c35> 3485 6725 4 4971 0 s
+<003624342a28360024302700362b2800352826313027002c35002f2c302c2f372f07002113282924372e360f> 4971 6725 7 8895 0 s
+<09050922> 3177 6970 0 3511 -1 s
+<0627> 1589 7317 0 1882 -1 s
+wst:dutch12i SF
+<03040e0c0a0402> 2033 7317 0 2700 -1 s
+wst:dutch12 SF
+<352836> 3177 7317 0 3432 -1 s
+<00362b280030242f2800312900362b280011> 3432 7317 5 5056 0 s
+<1f19002728382c262800292c2e28003631002528> 5036 7317 4 6799 0 s
+<0031322830282707002113282924372e360f000827283808> 6799 7317 3 8895 0 s
+<24362f22> 3177 7562 0 3594 -1 s
+<0632> 1589 7908 0 1882 -1 s
+wst:dutch12i SF
+<0c060f040c0a0402> 2033 7908 0 2712 -1 s
+wst:dutch12 SF
+<352836> 3177 7908 0 3432 -1 s
+<00362b28003228242d0025243027392c27362b003624342a283600243027083134002f2c302c2f372f002c300037302c3635003129> 3432 7908 9 8426 0 s
+<002d2c2e31> 8426 7908 1 8825 0 s
+<3c> 8825 7908 0 8895 -1 s
+<252c3635083507> 3177 8153 0 3690 -1 s
+<001f2b2800292c3435360038242e3728002c35003624342a28360024302700362b2800352826313027002c36002f2c302c2f372f0700211328> 3690 8153 11 8825 0 s
+<3c> 8825 8153 0 8895 -1 s
+<2924372e360f> 3177 8398 0 3653 -1 s
+<00090509000610003028363931342d002435352c2a30282722> 3653 8398 4 6058 0 s
+<061c> 1589 8745 0 1894 -1 s
+wst:dutch12i SF
+<0c060f040c0a0402> 2033 8745 0 2712 -1 s
+wst:dutch12 SF
+<352836> 3177 8745 0 3432 -1 s
+<00362b28> 3432 8745 1 3774 0 s
+<002f2824300025243027392c27362b003624342a283600243027083134002f2c302c2f372f002c300037302c3635003129002d2c2e31> 3774 8745 9 8825 0 s
+<3c> 8825 8745 0 8895 -1 s
+<252c3635083507> 3177 8989 0 3690 -1 s
+<001f2b2800292c3435360038242e3728002c35003624342a28360024302700362b2800352826313027002c35002f2c302c2f372f07> 3690 8989 10 8426 0 s
+<00211328> 8426 8989 1 8825 0 s
+<3c> 8825 8989 0 8895 -1 s
+<2924372e360f> 3177 9234 0 3653 -1 s
+<00090509000610003028363931342d002435352c2a30282722> 3653 9234 4 6058 0 s
+<0634> 1589 9581 0 1847 -1 s
+wst:dutch12i SF
+<0c060f040c0a0402> 2033 9581 0 2712 -1 s
+wst:dutch12 SF
+<352836> 3177 9581 0 3432 -1 s
+<00362b2800342833372835360024302708313400342835323130352800352c3b283500363100362b28> 3432 9581 7 6987 0 s
+<0038242e37283500353228262c292c282700211328> 6987 9581 3 8825 0 s
+<3c> 8825 9581 0 8895 -1 s
+<2924372e360f> 3177 9826 0 3653 -1 s
+<000a00253a362822> 3653 9826 2 4316 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (20) 20
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0034 put
+dup 3 /C0036 put
+dup 4 /C0040 put
+dup 5 /C0041 put
+dup 6 /C0042 put
+dup 7 /C0044 put
+dup 8 /C0045 put
+dup 9 /C0046 put
+dup 10 /C0048 put
+dup 11 /C0049 put
+dup 12 /C0050 put
+dup 13 /C0052 put
+dup 14 /C0057 put
+dup 15 /C0058 put
+dup 16 /C0061 put
+dup 17 /C0065 put
+dup 18 /C0066 put
+dup 19 /C0067 put
+dup 20 /C0069 put
+dup 21 /C0070 put
+dup 22 /C0071 put
+dup 23 /C0072 put
+dup 24 /C0073 put
+dup 25 /C0076 put
+dup 26 /C0077 put
+dup 27 /C0078 put
+dup 28 /C0079 put
+dup 29 /C0080 put
+dup 30 /C0082 put
+dup 31 /C0083 put
+dup 32 /C0084 put
+dup 33 /C0085 put
+dup 34 /C0087 put
+dup 35 /C0088 put
+dup 36 /C0089 put
+dup 37 /C0095 put
+dup 38 /C0096 put
+dup 39 /C0097 put
+dup 40 /C0098 put
+dup 41 /C0099 put
+dup 42 /C0100 put
+dup 43 /C0101 put
+dup 44 /C0102 put
+dup 45 /C0103 put
+dup 46 /C0104 put
+dup 47 /C0105 put
+dup 48 /C0107 put
+dup 49 /C0108 put
+dup 50 /C0109 put
+dup 51 /C0110 put
+dup 52 /C0111 put
+dup 53 /C0112 put
+dup 54 /C0113 put
+dup 55 /C0114 put
+dup 56 /C0115 put
+dup 57 /C0116 put
+dup 58 /C0117 put
+dup 59 /C0118 put
+dup 60 /C0119 put
+dup 61 /C0120 put
+dup 62 /C0121 put
+dup 63 /C0122 put
+dup 64 /C0127 put
+dup 65 /C0262 put
+readonly def
+/FontBBox [-25 -256 978 766] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842243E0EC59344CEF369650A037B4383B03D6
+24C306E87EFDD4775EC78742
+FEFCE44B765574466C
+D1AF7A82
+CFE19FEC07055171803BE35FB61F
+DFA5A4C739A4E3957EB7C66233844AC51A6A91B45B75E6AF1F76779A4EA39D554C671F039F6EA0902EEABC13363BDDA5101CA12BB8156EEC5AF0BF9E6FFD41E3E8297895E1554F57314DE5E5E70C32DA47FD30A8525D7EE9C60607EDB6FD9F816BBA9417276F85
+60F5DDB4
+A3948B33ECD70515EFB0F25E7766
+23F737A06578D2C501971D21A1AD0DFB46CF5287869182444F411FF11823026670B907FF382665F39F94C09E0E1E76DC0B02A4BF09FB8F2E5BE909CD4C41833EB22E0FEA75A40D35D7700DE134E6C556D6A7CE512D6327F1F175C4A19C0F64AE61E00DCA03F8F5E64A5A235E5D73BAC487E3CEF5CEE4A4CDE1A68DBB5C77
+212D
+08FBF8079BE5531B761799E3
+CAC71CE7
+915BC5DA0DB17FFD4ABDE5111A
+09F2F70F6106F3F60ECC4242AE99DC465FD41841E9B7525D5C4B32CEA4DC6FDF1A2165BBFA8A4EF1128FB2FCCFEC878D74E59BD4A4F9B0BEDEFCA9DD265F1FA8
+BFB5B1CE
+705E8E3C5B602472007D2FF909
+3CBD678801F52A32B28EDE4923024E25A8795676CC594BC4EC8934E0A7DB874AE00DD507DE5313D4B2DC7A11633AC15E996999BC8CE501DE5DC11EB46F4396
+2F99DEEA
+EF2C357CCDDD0378B6012FF4A76D
+691AAD979E98DAEFE0EA34773FB3A8A0F99E66F7D23C2FAF079A800599152FBC9B2958DB033CF1652F776E70CFAD3DC83934C124CC198743E162526BC157439B951B466A295405F97F89E4671CDCDC66B88BBD45983BE0A7AA6757EDD5F52352B46C4D3662A742AE57439AED40E04DB6F4E8629AF77F0AD9E3D6F40648BE
+7C70
+9F970C57E256DC30909993D74CDBB72852A70FFD4EBCADF899B77E9693DF9D5E60AF02A5A4281A168A93C641C18564E8C85E829CB3A375E4DB445BEF408C00
+A63FC651
+CC1BA35F263228000C93B2E5BB
+2497BD9BD87835A2B5E1B2B69D56334D67B9E3CCF6FE096E390AF8B7196E39422491E55B085D6778F84F72028B5721073601C4F38494D0E8A5
+7115FA9A
+384C306167ECAC2DB743CE5C2E
+92F4A9C7702057B326B93E35D5C3A214DD84DDC66DF51F
+003AD4C9
+C579D45391B169AB64508A7BD6
+8F0D68963A879A991FC02521FFD47FD642AD5961871016FB5BBA7982D90270
+1D45C8CE
+6D9513EA4C408A8C8A430846E1
+37E6CA0BF74FEF805C6CDAC484A97489F7EFF21B6CA4032D5C8CAA0B6E95B472A38C07670E0D639624D6E6CC22747C2FE524AC7239C57DA96DA4682BB8990957CBD2222133E0B57223EE
+0C6E8F54
+C559649E9ED30E52B8254FC47E
+726FFAAEF25B0E00ABD346A53C875D2958B8A1567E8CF9E7D5D5DE18FD7A580F625B033381D679DFE013E62F4C4D99C0132365C615473AEFEABB03B1745D9E
+29CF3A97
+3DB1D64FCCD3AE3A400BC8DF60
+00D7A571CB55120BA1DC9AB207DD1F03AFF954183785DF8915A43B4DB0EBC0227522EC37E08D7C4C96CFB65E9F208F9A2D7845A5A45B752EBDB7F4AD6519047B9FF060BCD8C933070F6543F53457CE30940194F110470B46FEF2
+B90BE74A
+2F05098B106377C068DFDE675D
+073F4152DE59E0E06C1E44A07DD44C687D4494EEE04FD03798B4382F0BAA76B96042893B07B3411CBADF27BB70E47BAE8132CBCF482303DE2BB8
+6FFF5D88
+C9C5B8E2E6441B0BC96D1ED180DD
+93E65C3EF19787680DCCC1016CCDAC21FE29D34DFD71872D43C2FA22AA0117FE6B0B5104963D03507BCCD3F8DAFB4D4F10D91E872353EB6C3723A274BF8465F074E68E48AE8FD4D1475CB0209ED7AF9E190D0A95A065B1C51C9142342C45319CAC9D4259F1
+0291C032
+C5F6B74BF9DE601DE36E65F4C5
+01E2088521518AB14B5A342027B0E5CE5F41BFC36A5C98E63470E192076DD526DBF923F46390F9C432D2CC753004C30613BB1A34D69A
+A1ABFF3C
+0F9E2AF45CD9DE6016A7E23217
+6C51FAE6233DCD7A2EBE98C5BBCAB4C5510366C63AD2D3B13DEB091049D031D0947D3A92
+29FDBF54
+81B7B4A562BD5C2A0A3B924460D9
+FB6C2AC201B78E46ECD223ABD664CCD42AC4C191D0ECD91AB487B4BB343D4CABC33F1D6909114CD9B34CA1031E49395F6459AB8261755851252A1C175690EA7B3171AB79BE79384A5AE00C141354F44EA3B150F95FC65B271FA8A516A0A77A239F6D96BA6DDABD24E3D2FAAE773C1251B98E8B
+9F06711E
+407A0C806FBAB020AAF1881EFF28
+DFE535D6570641BEDAFDBF8B3C5716F0F97B641BF0418463136B0BDEF1F1D704553F0DBA3751631DD37F0F81BC36C265A8F684D05F13A2E2C8D33371F70EAA4D4F33D1ECA0012C68D4092C0F519A4C328D08B818BB0FD69AE1B9CEA473B34B58BD2E2FFEEAD06146C2DC5C3420729B2AE8933E6767E22C1804A8F4D9621A
+B27D
+75
+F3356366
+9BF10C19DBC8B2FC940BFB314E
+1BCD175935C1372C10ABE3700683ADD76D374FFE7C7C26D797796221778E42F1F21DAFE3C3890799298B946DBD2C5811363AD6511FDD4D910D73D6A9A18ABBEF9E5162B328A79AF5B115B0BB0DDA919E620591EDD8141A739DE1412743A03BE3E1
+D8D8795E
+A34BC69BD078F02A86986477A04A
+0A7893B24DB05CECBAE5F0FD237BE889B61E2D9792075DB2FA8B288C6D47DE7BBD094492F3A9440FC17A90050AA07179FF39FA82C1F081B84BA241A6BCF6A03BF4692E865128245BBD06C6A4293811227632220A5BBE37AB6014413A015C247AEBCD5E365DA5333C9B5ED9EEF4E6CD414FB81CD2A2A05B75F130EEE81755
+53B1984A
+916F62E19DB2651D38B49A5828DD
+1E2C9F43621FAC84BE35C2DAE94CCC3A24FE89513F255CADB973C43989E6787A870A23667C4605280DAEB082BFECD2180C0B8EA3F27A7A0B1E2701484E4DD983331E57F520E23C1D9CE8797D9D93A4112EF9F9EC5C08EDB428BC954BE42C9700EF88AA78C9453C82F2
+53A6C805
+14371B010A85B57CFAE083860170
+9849377AA723B558B7F6EEF593BF8623AA2607160DAB181541879804C3DAFBDA2088AC9A77034E8B0B5E2528423CA0C68B6CBF947C1D94064E03921289B7AA0315A06FEE6E2C4BDF1D2C28B392E47510E4A41075F20D34E8FFF369E6DC732909DD70C5534D8B2ECDE0B48FAE6532689E1728D3D0D8D29105B62D
+C137C25A
+18D43BDF2C354EBA7D0EF6FCDFB8
+87A83C426D2CACED0E3C030B31007FE19F45495C7CB5B89990845E1692D6AD40DDFA64BA61C75650987C6CFDAD57901A15432E32E5CE28186854A9169F16892D19A3DDCCB2D78623C142FA1BD9E863DF462D1CB6521E5C048412901C271F27234E35BB18D47FA415B90E5CEC194EB781639446B088503381255738110476
+E987
+5F8E41697F7A2215D7B952
+55758E43
+7164B211E91E72825064EEB60A
+467F7DDB1B04A030374C1AD59A43FA09C8F60715DD68258642F1ADA54646B4D252F3C76E73BE7ECFA69380E03064B899903712426C388000BCB392
+2819182F
+031846D14861B76878DFC36995
+ABA4380389D6805AC7C2394B01402975F843294A0DA920D8AB45ACA5BA923E57903E6F6F33B65320D5971FC9578B1CDA8B542B5149DD0CB43B3EDA5E6112F5EEC359569F4F7389
+E28F0A80
+A9C19A7E3DEFB1C6FDCAD702FA11
+B262ECE37354CE2AA04D43795D2927A85BD37830FBDA666279261A9A7F54BBECD389358E12335FDB86C6B658443535088BB9162B956E18EE16591901D3A105A5588A80014F1CE5AEC7285F1AD8F113F3CA235FD623527FF07424F1EC0158B929A940BAF3C2FC8ADD8A453E77C0F2A7
+68CA5C0F
+1E7AFE2CDB3F3E2F31950A8F3D
+2E43029030DA88C57C16234C6EFBFD7597BA9BB22A9B95A625D16F3FFECEAF6B58F109F6D135AEECBC6D61D9DB13C26916AE6173DCDC1992C97B237705E6928A051DDE166EBA17A3EAC4CE4A1087FE28965FB857FE2E24B07183ADDF
+17C20B9D
+949B8F8EAD6CB5E48A69FA557D
+D87D25E88D840731DFBFE2FFB4847E18028F2CD630CF9042F99A7E9A3755A2918FA1BB7EC5432C4FA4487AC40318BE9477F0D71BBC31DAC2DFFEF62087B4FE1DF5C4C01FE701F113B68D1EB6A1C45EB43D9190
+61AEAF88
+FBA4F46A12AA98EA999E2571426A
+9D9F41C26CA5683ED3394EC16C69F95CA3007988CEB27F00AA9B59B75F086D5EA5BF6D35394C2F2821E494B8802822BB9B1278F38BAF5CEC9051FEBA15A1837A2D33099428170216ED68B1FD00D1D47F39C0E66A0A52B1D097270BEDFD533131993AD784E0A74B837D6B
+DBB1F42F
+DEAD459BF891E30A7979FE7DC380
+7891D0390AD5E6AF55062F888565B3AF195929430BB4295779A1228FBA6C7F65F2D4541DE8BE704464348DE855A4E0CA9FE219FAAED8915782334EB5EDE6F54AB949382EEACA52DB0B0A31874B72021E3BDE6037D87F69E87E057E5FAF5D1481C8AEB0BF872153DA2E7E51F2E932F5BAFEA0CC42DD532F44D8738169505A
+30E8A3E9
+DEC0C83C1673B5E0A04A890380CE
+A0B0E0CD31F1CBB5B1BD707B80094BB16650D65EA3E4B46ADBD80CFF6821E34008CE27C7BDA6BD8B556F4A5C74D232E7B67829230F862A88B024DE39E1E0323422CFD2D3D9C85BD4944ED3BB17866826F1B0E4C0A922374B208A899E547C4C93CB32FDA41CE13BC6F8B3BD4C62195D7C0362A32C4F798655B1C816592FD3
+7FD0
+319526
+14562C1B
+0313059C57933C19B129297E4E
+8AEB9E340635728CE6EDE55F03B39A6A5004ADB4DBDEC2567D2AB8A8F2B5670452DEEB8C9BAE37CA0C6FB9058A228988920F29A77FF6B689E9CE6FB14E22C4ACA6277C71CE4A7FF4A9F56556A844801AE3
+56616753
+5A2A04A8D80B75556B139101F88B
+511FF8386002AECE496659FFAF399769FCCC7256F74A0C8A2AA4D4B538DA18FDAF7E8CBC13D1D5D533F3DC36F2546D3F671CC1092DBBCE3A3A7BDDC41355A1C782A7253C09776B0A8D0B9AD1ED3603195AF934D48156F9A5D59ED5DFD029A514E86EAC37
+CC694902
+104DD55A380FFBB7A73D87CFD96F
+84E221791BC984D6695ED130D60515E2A899AE182FC0AE865EE15236BCF60BE9ADBF87EE2880B2D2D788F6917C5A7F265D125278AD344B033F1D8CA2D2518F7D3909174B1E5C0B8FDF20FD2C67C302E1552C4D0FC98B2D27F4A6B63C3DAD171BBBA5CF2AB83FE64CDBF59B959E389490834577A1A5FD23FD4F61173E226F
+6E95
+D90E2D265CDECA3B2FD0AB5BC7FDB6BB
+200C4A73
+D401B0C1C7F9A3B21861160F3F2A
+F7CD4035B573284E897D2B238FF5AB50833AFD00AEFF53E87DD32BE7A2C295805E014D82663E5AE38953B5622F779AF733547D5BB2CC7916D35D4E6ED2C5EBA571A33EB6F872A7C33CD06EB87CCCE38C4F8B1E5CB039F3432C16F6924C0B6926CDA0AD0445C8F66CDAD3F5B09AD628DC3840ECFC9AE888B212CBC7E9571C
+2AF5
+AA9AC994840FC12D172CEC10353FD53EC64ED29EE59E9CB978466975FA06162BD3C00C58583346
+F86B2DD2
+7D92C6DB6C369227F3366557171F
+2F72AAE31EDB7F2415A312FD130A27593C761FAA8437F71B85C9AC3031A0F9C4313F1D2F050FD97B50849BB446D0AD3B35B4B8416D88A6E873A6DE1AC4FFBC54E14AD88BE807FB777553E61514AA7C9FD9B783FCAA820925FCFB73D8B025A00DA2442041AB51D8D712BE805D58D762875CECA1
+5209787A
+810DAC93C3972B55459D19F939
+C8C597C31A5612F2389378DBB8AD920547B45AB9CE2F
+DC0D3E90
+A6E4436812001D37C96BCC1E5C
+AB15FF19B44A4B39D85503DF02447A9ACB45BF8AC9DEE5F93B9705C3B29407DDCBE68BFA2280379E08B1DCA51085C04972A40ABF55AA3653C708
+67B18C02
+FACA5B9AC12E97A861B3727CACD9
+3ECB15809C064AE19422D373F3CF62C66B87B6A5DB38FA709CFE2DA40DAB7C7350109FEA44ACC5BB22E8232BBEEFEC13372866A5D7F0EC7D027CDAC2CC8E08C056C26924D4AABF9F05336E2FCB6FF171D94A0A3F92E443F096325516BE835D1961FCE0698A6FFE2352F0AE87580B0C126326094EBC302B897DF8746F059E
+4059
+7EC540
+61D813B1
+E1D1835FF17D820CF2D1AD8EAD
+CFEE7E92E35B18A436F80A04140ABC18590A787E449BE5919BB30A416B7E1475825AF83A2342719C8675E9522319BD428F252132A97B71BE03BD51A18B95506E2B3FF16CBD5536E69E02E884468F172354D835EB42205F3D
+061E2100
+D0480BB2409D83F922D896AC09
+9E3A80CFA083D47F4E9ADA805DBF8B6E65B10F595C96ED3F834CA8CDA98A7585169876D4B8E9B3132831681F15D9A28BBA65FD197C0795D324646A8A029D5198C980D136DE0AC87B80DB4602F302988635F0
+B3F6BD82
+EC364DC6431047065A254F03427D
+0C1ED063402ACBA889B597FF2980397AC6E05DE87ED8EC8C3229F681E6BA925DA77555DA0A423C718BB9C0324AA06A56C8B1DA1A71C364EFEBD807F5E7FFB6D4DCF210EEA01EC7396FFB55CFFE7712D36FAA51E97F3CFD5114B6CBDFCA6412D8A0D1CC089234B64CF25A6851319E
+97DF1ED8
+9EFAB5C52D8B3EC7EC65F785A5
+18971A3BEA057ED878CBEBA92E60701B94C75BA99C2A246EED1B17C786FA725DB11EBEE778565C98C9A9CCFE7CC2AC2949AF9F74272D3FA1484FB5E0944427BAF8712B1B612EB7211897590BD20249E667C244740FBF0AC4BD
+26957268
+215C726399E68A17DEECB58F80
+95D33B830345CD7438AE989A43F1357C31DE069C54653E77AEB31B09AB4D313B7C0C668FE9FB21D8AF789066B6B00384A758B1EA42580A9A0169B2832004DF486546892714FF07BDDC830B24A967B7DF48767169542025B59D8FEE44
+A7E78308
+BF14EB6776FD8BAAEAEC31351C18
+F0C93A1B59A8CBCEF9473EB701D9EAB4FD92A372EDD70B88E90C07ED557CC2BF9D4FB2ABF5E9E38BB083F63FE587719EDCC467FAB8CD0A606051CE7E2AB83F4666623C1A03054B38E20D93B64915486DCE181A38EA78C026C26B5033593B44D4D8FBEC504FB5D89B7F9C9D6E6B2A2F950E2C0FE55D86B70C4377698447F9
+EA46
+3DE84857E620A3F3F33D9CBBB93FE07E63FE0C618DBC3A98BE7DA75EBA44A34026F48D2924FC3BD679CCC1535B9D83
+77B167F3
+1F4C39A6A471C66ED8BD5ACB8BF1
+1769DABF81141B6853776AE9F1C34F6F6BD4EC50B55C1A8334A21FA522017C451F0FA6BC82B0D5A50C73E7EFD3957A0AAAC203573F3C56F60D84D6238EC72E7919D91CED7F0D07D21064FE42365168DD1B4BDE8B6EE2AA04ADFFAB26C5333FB1A5B470310AE128BA6E434161AC
+6E542852
+EFD9FE0F0403753CAB4EEF3435
+43AA94AB86CF53ADECF6CBB381EFE6214DBD1EF42949ABADA39DE8D3FF57E1DA3D1010713D5CB1465AA3830A31CA994BB3B4B583BEE6C1A963C9A67E17707ACA968F063F61472ACC4B5403EC07BB85D0
+3BAFE591
+27DBAEC25DCA9BADC7EF2A5B16F4
+212BA51329C152BA413C9F0546065D15025BB8A0F81C2A64CB2C81EE6F9BD2739A3C4FE274EE462C544462260B786FB6CD3A6AB4867E81FDBD1CB3A7B311E94A43C73C56E0820A7C92D54E49F3823C60E45D78B6B48978C9A2E976E6C4B38148653E88616EE96E8A58E2F9A16CDA114110F3625D3218E028696809A9C954
+4D45
+5FC50C5100EDACC7C871C4A6F2925782E10506AF2CDB90B8214E1C22A9AC2C113469D9
+96A6B2DE
+2F867A39378AD587490C41EB82
+41AB194C9C79F6C76CAE74DB8DDED99B37A17E8A4C25D83979AC8ACDB2BFB5EA144F23708C68FFFC6EACFD4EEDE5A9FED6B320909C2B
+8986FF3A
+4822504D62A16020E49099CD0635
+E33CB76EC98203C4223876FB7872C584112C6DBA6238E89D867B93A7141DF0BF3096FD8A406796983EA2BE1F0AAC496A042A09E5671B7DC970EEC531BD59419F8A7C8606E9A7B916E7403098DD426F936123884EB835484E3E827020FC5CA585B7A0D69D063F55BD7050E00E7131660F9DC8F40C368449EFD72B59949C25
+5C4C
+6823F621B3646F038375D5CFA802D8660743D00188D81371EE10583B273548
+CE5CFCFC
+427530876CAFBEE49EE854EC0AAC
+8B981AE89C7FC527D7D572A484D6F7785607992C5B16AAFA07BD917554BC9939C28C9A44F85CEED4967030A88595B149FEBB3D994F09F92F3CA220EB37D0A88CF0BAD52DBE98F633053644338401DA319B9EADF22BA360F596491D0EEF182519FEC48888D4B6939F0C6014A8
+39D94B01
+78EB65ABAAB217EFC1E19EE407
+FF50F4D284607BA55C702E491174451334ED1BA4D92F36450C7C6BE7165BDBA86135C421A2E078AE83AC194828DC1CE9108F1DC13EA0031B2FC1A70EAEB2FD08AF2BF6C62886
+91AD8B32
+2C213CCCD89D87195FCF2C1A64E1
+CFAD9C24F5C415DB64E5F7CFCE1C9777DAF54BCDFFBF1B09C4503066B15E1471DB4B345CE9354837AFC50F7CD2C64CD28EFB41CCECB2016BD4EA3AB33293C92D97D8529D66C60150CC7A266E79FFC429DCBDF713ADD640261D64D359D1A16D87D79A122B4F37F6F82A345FB0840A253F9BD99F287CD3EA
+04AA6A9D
+2A939EE2E20BAEF95F1660B46831
+3DDD88F27DF7AB5A839DFBFA6E8BCE7ED0A76A87B1C532F2057626DCEAAB6E623239D297211CF93D436EF399A169F7018FA40C813EEB7D9BA8A553F2D4C037A167A89F784ABE695B0317169C8437FDBC2371C18E3579A3BD0AC00F5B702843A832F588369D770A189BA8
+20C2CB36
+7DB2E41627082F6914F356294A
+FFB34491B7FF78CDF3F2C3F3F9E5ADC0006C21E2066257E644E2E87DB859E1C90F56431D1ED70A22509F9095A52CC664B525E0CE021CA731BC763C1A5CD9F2A42A319A124BB53FAA42729A9E40F76FD617738151A9505B
+70A02E39
+96F9817FB6EE3FE17FC509694225
+85DFBDDA141102793899E3D199B23DC95750B7C6F76485FC18228418F56978421DC49E44B37F9CFE95FC1993631AB4FF76C1D23952E953FFFDB3FB23588CE6112B2881E8D5D98F752DF1481469D6DCEB2137533A49D17D843D2BC114AF3976EE7646A2AB8A716844699A904D42F1DBFA88FEEC116BFBEE776A8E4A00
+9BF73CD6
+99393D5E5F27A846E13896DBCB
+BA53D12F3E358AA49793BCACB1809DF9DC92416B4DC550E5AAE6CFF8F20C25CB4415A6CA2B246C4788A8E5F711E43C8FD8A83B3702CA2A5BA8EFD961150DB08D2F19A0AAF8
+46A2331A
+3084CE879A9D3D0275901EF29C
+8C1E3662206D27ED6895590980D4955021A3929869A497F2907A55E96783E54710BF79CCDB13BD2B99DF20FFE3D2BCF8B742E91761B817CAF2FC57505398851F0BBF930391F9E04D37130E0046F101D1691F719C357F0C55263ADCF8863730C63719
+01BE604C
+CF75FA53AF3935BF66710C206B
+78D6B9EB1408D267B69826221B2A83619A2119643DAC53B3760790B1ABF566E2FEB172A6869CE5CC32CF13CC5FFB0EE0D0C411A87E921F2E29B01F2B1D7CE930CC65870AA718E27489587030EC57F1D4DAC6C46472D78AFA1A
+4B10E106
+F3088F0B2C3E8EC83C98A7641615
+5347AB0633CBAF38500C30B326838143C286922710B1CC8E613233F6F5AFEF295558EB6834D459225C34C32CB9FF3112A195EDFEFED6C0E7D8D03ACDAB4617F118E3C1E4A3BE184C64EEF689D6614AC8FDA5D0AF2ED24A9B92C2125054CF575B84EFA7B42B34C0034B3CB059E1C5AE8D3137284721DB267092D14721F6ED
+F500
+B4610E328F9F3DE64501B215A365
+3890F83A
+36A92D3FD4D954F704B4A7D3A467
+98F5F975D2E2F8A81C2809E8BA4D92700FF8DCE59FC96F6F1CFA44B14AAF265293228CEFC543634D60A3A05F1CDD362A32A21BE83B1B491751D8EB0422DF024D0AFD8459A59142DA1F0B3FAFA74F77F5A4206A1FFB283C4BEAF245148D9D9D3781A2CFCDA2CA5DCA5655BD309EFB2CC3AC6CBE5C95035AC3A551F06A7C0A
+884B
+BCA5956C5870BEDDD63CB3E7A95CEFE01509A64427C55C81C9
+A95E0A59
+BEA9A6737F5F7CE3729888C85593
+6EF155DCEECECDE71906092099CBC7FBCEAD4E7690CA49DC819EA56DB201DC1C2D196DCF5F6F8E68F9A06A4E75B4EABF16803D133AFBAC237CD87F7BEDEE0FDD60691C77D93814056488AC1A6C07978C6E39E193DE8555B19C019408453597031377C4B44277CEF26C040BDAF4D05A13BF0D410AEC03BC32CA67910F0FF3
+6B2D
+306343CE
+952FEAA3CB5C0BAD435805FD5C
+CE647F9992A472409724B5C4D4B5913DF96C002E6B753131797F61F3CCD0D0AA0A7F45AD855CFB76870671A55203C1B0182A045BF4C88053A515E6B9F5E302
+97702795
+789A5A9229E5512CF73D4934F65C
+216EB6C318A7A3E3C5CAD693DBF09383CBB1E2D9C4E070F1012E81C38F1306BD6884DDE3618B67E46DA934304D353FCA197D6E49CFEEB8E06126956414CAAA12B4C2FB1C6DE3D77E9F8B5B41171C9FBA72CF6A20973DB8022EC97E5625E53D19D070D6B6DAD71F305F
+4DA06795
+C5C5B67FE15621CFC442AF0EDE
+656CDF7EE464663C801E0FFB0BFEFFB27D4F8EE48E10
+4679630B
+FDEA5162F3FB2C1649BCA463F3F2
+DC46DD4CF826D332
+196D9F41
+D3D041F118C3F23CB4D04E5ABE086B6BACAE1CCED0E6D6AD6899F08F81FB6D7525F8
+F0748C75D6D73EF2B19BE2C4F4CC0E7FA6D270C65A5FEF379AFC1CB87A01A98191B1D2A19FCE
+0EF87C54B2515F3FB851BFFC1448B10E78069E35BE8F688F2ADC8F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0045 put
+dup 3 /C0046 put
+dup 4 /C0047 put
+dup 5 /C0054 put
+dup 6 /C0058 put
+dup 7 /C0067 put
+dup 8 /C0069 put
+dup 9 /C0072 put
+dup 10 /C0078 put
+dup 11 /C0079 put
+dup 12 /C0080 put
+dup 13 /C0083 put
+dup 14 /C0084 put
+dup 15 /C0085 put
+dup 16 /C0096 put
+dup 17 /C0097 put
+dup 18 /C0098 put
+dup 19 /C0099 put
+dup 20 /C0101 put
+dup 21 /C0102 put
+dup 22 /C0104 put
+dup 23 /C0105 put
+dup 24 /C0108 put
+dup 25 /C0110 put
+dup 26 /C0111 put
+dup 27 /C0112 put
+dup 28 /C0114 put
+dup 29 /C0115 put
+dup 30 /C0116 put
+readonly def
+/FontBBox [-18 -207 755 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684274C264E5F45F0286BD1B23D26C34626E07A
+5B039DB36C18005EE32CFA64
+906B285CB8BD7F0968
+D47F5242
+22DA29BB63EA29AC1293D9F365
+FDD092686CF0D739DAE7B4EBECDFE21B8B5810B15B35D7
+8B1BDB66
+02B6ED886A783C9F2E2959DACA
+9F8C687CAC50F98DD3D99C91A3816894F5A2231814056F2805E451F66B5923
+79B434DB
+F70638B9F2044F3ABEA1123528
+14FB6FABE370F6494A54BD1740E96D8698DF36DD8313B05B556E
+E0432436
+DC00618FDC48F0E9CCBC9B83BF35
+C8C3C0F09B05E08F79985D14864D913C5D7BC268B6BCBF77E21E34751DF20D7C13EDF71ECC5EA956A298A7447FC1E3CF353CB35AD64AAEAECC309B253DCD88C4DB567B417C8F6EE8BA379C4AB91748934824A3AE7275984BAF226F3FA23A7C733B0C4BEF
+2D084547
+F52FA0445FB3D8D8B6BCCB72D6
+E2DD788CF6F7B941D3AE3FD3B7FA3803847E8B480CBCF4C31FF87840EF0D6FF5F019B2E0302CF794BBE69EA40B0069420B9E0F4F8C9D
+50AEB93F
+850A541FA79CB4B5713DC1994503
+46ADEBEF55F0F7029EAB3A48EE4266A1A9E1BC82CAF17610D752C3E39FDA1CF7348169B5FDCE6CBF436FA494E4E3BA1982AE7EFA79B6A7A2DF1EF4F431B07F3FD8B8FB0184F4BA10A00137C67300230F8BE7853AA0FD42E9058DB2F90DA065755B36665724D47950
+32CC49C3
+767A023117E52C71A1D1A688023B
+F4933D7BEA814EE8A9700895739A780E5A18647A952A5846E4CC3F624EE60B6C0B36CA3FFC06EB5559D607684C30A53B83970CB0A5C708CAC8660001BE38614183298C530D30F10A4CAB0B634E3105BCF8E4EEF29B457D0E8E73C3E5E7F8A17CDE4FA595BA0410EB20C072EF5D33
+D987A82B
+8A6A6B5593B5F1AECF188C2FC26E
+7F7C2F3624EFE5353CE717F31A9268BC9C15E5E151CB6D941E9EB6832DD651A1F6F276B094B608CA1C9C9B837760CB64079AC86C5C955005D1432CD786D12B3814F0513F5020C3226E7BBA58638D288795BBB406285CCC964BB9F5CEE665F97DD7F9EF849D0119827EF13A7585AF8806540278BC766D37
+DBD5160D
+C262CD3F4A5530477B1E742187
+1F8648C12A6B67D45DA7F2A5FDE2997BE58F418520E9FB4FE1208B9786655984D515C4A8CBF5EE0200EC4BE05C75178B65AC2DE83856F6FCC5C9AC1D1354B53619B56A080CB8211C97720E5E1C7523C5F27B68F6C9120DD6542FD2AD96304C
+AF62815C
+71C73566EC1C94945CF91C45816B
+9AC1146BA4F99D95EBC71F91C934044D3B9AF0D8B42D7429FFDE780A27C31C9AED8D9EFB8D4DD57DE0C637C60A021DD833657476FFDB37E598E5BA1E69AF41F7AA462225006906CD2733A602EC38969B099ADD8FD89F406E449F66D16BC0C423B8CE425E1AB4187E05
+045A803B
+1F8CE1E330A9BA2FD3715A7D2C3B
+8999507CC9BD3FAACFA543F7C94B9F0B1021C27F41D973D6A04902ECE1101DFF258CB970E84F2B52589708B437A794F656F7F8A94BD36E2625876B955471268837DF8C0AE42459342D6A5D582741D9B6943CE9CE4E845A7993F6484EE1E397C756D3D094
+5855AF4A
+35525F0A01D9A88F9B077BF6EB03
+9F4D5DC118F8545E1B3291372BF5D61F2C590BC0A5DCD20ABC3E755126B26184191D81FAFDD47F563B4E33FCE3FA3B9C2676EFDFE52C717CE57948FCFDD565D8DA7FE668A77C55AE4345CF28E07B70AA108E6280FCB189B90BA2B856980C209A0412F2A3FF20BC6A33C688C948E0DD5504EA49CEA94DB7A69A348134025E
+21A1
+7AC35B44
+5C4E188FEB5B648FE6730E2148
+AD363D406C88B0B093B0A23594E293AEE49D63F321C9522D0BD62155725BE0322EA4A873F7599A5C289EC9ABEF96A24043CF202EEC3CB731ACFA2304E96764DE7D8960B7FFE8E161D4
+1C6DC9E2
+DA39F8A6B44319821C348DC3238D
+11C2E2B27DF4B8FAEDA5F4A8577DAC1B43E896B31B76DBB440ACDD8448BF494E58AE30B67BBC4E108B39EE82841806DA4C00DB9435DDCC0239310BE306BB658268661A52D009A64BA535D178E196C18451820241D90F9E786D4405A5FF72386FB854EAB9AD6CA4
+5E14F213
+A9463A646AC32B18A9DC0B4586
+C3992FC5991FF61434DFA74507E0553B35112797E1121EF388632655037ACCAB1327BE1B705B577E62ED287FC7240D51CDCC2AF33D7C7697DEDE1B
+952FB6BD
+F6FE67EC48B099DB7859BFB0D710
+C83BCF6A3AF7FD9D8C062223CD3F2B46BEB995C895B4B27DD661495226773B88437EE158A6D3ED12FA0534AD2E3D34F1411B8479BE6B59B7A8E63200051F998233A00766EE230DAF0AC56AD6DD099FB4B1BE3852090C9FC5F3A3FE9FE5C4D2C48E07149DF9BE8BA9EB108063634FF87E5546889C405BEC3C7871EF0AC757
+0F13
+C662F67D
+2C9C7CA7
+B733D1B318BB2138811972EB6C
+8B045A9C35C41706B818377465A41A5B4B15AEF69BA2FA65FE379D3C940A60B64D7761AA1321332EB9CD7D4A99419312105C18B936A929C0FEB0BEF3DF90911AFC0AE849881E499F6CC31348DAF4808F5585878A7E4E6FEDAA5E000B7C42
+2BE3A349
+FEF3743AF9DBD5FB69D605A56D
+D7F4307DC8165E611021F0655C9D2BDF3F20887F2DAE955A93EB06E7506275665868641E0845F56880D088CAA644B07EE8BF38314069FEE4412E14E333E440141635FD46518815B03BD58F47A8EF485AEE0B
+C8FBD476
+5DE253B9DC92D32682D08E9034
+1B411382064BB54CFCF73E79812474ABA75A3052DC7C874812FE5608C08F6D4DA8BEDD5FE495404D98A378D9C38AABC53801F89E7908E14D529FD184B3823655A026AF1BA74CE9D5B473DB42C6CEC411AF294565FEA1D3BA3029FFD5
+B93D9C79
+DB8DA4635F94BD220290C6F31F
+4FE1B0345C333165797E38CCB863F29B0D787090D6C249E9BE971327815B226CDF9E82CB12E12C61D77C583E6B5F333EEFA78AD3923C6A86A2D335412561C1CC2A305297A2B8DC6CDE0C3626CF66DFECCF161361E5886EE9D803F8755D
+44178818
+010EC7011D7F5B75FA38C0FF5C49
+D1AD996ACAFD649D25885CCE8B790C69E547395452D778F19DA62A8049204528AA0306CF03CC94C520F994963AB2E871045B33F2C0C3269540669014AC43038C899CCEED76B47385C422FE58C072143E85274A3D99CD4F855B88F0900FF9A89ECD75D02AA74B1136
+0D9EB441
+218BD4A9D63E033574F5CFB937
+1D3FF527683AA6B766DD6E9E0788752FAD87DCF60B5044A599EB77D91F8F4D2113A22D60ED4EDA1A9BD881C4EE41CFAC8B558A1972488D33A52FBEE99E649119A9857033C651401B48E555053F9D
+3BC1EBC1
+1DB924E7D285E0612E3180E51F
+1800FFB01C09A4E40458D209A7C90CF7A503729B5FC282E973C6DFA58C2A626A75FD507EB4B76DD140B5EB62440262CFF73CED83
+7C0DD984
+25A8703D270629533CCEA6C144DB
+AC1FC39D142CDB57D943D22994F4D98E2F7289A45E8725B77BFC860EFA7B42D731B2B8420D265A88D42C47A0610503795F4128DD9D1633175C7BB5869982ABA78865008316EDD5A57A118B33E4CE7199E6434AC4C2E32CE6C35BCF81A2706CD69328BAA0D0712D
+57898DB8
+B12619615BAF8FCF2280BFA07D
+77178F1050646FCD9BFD4D52E09B98611465F7BAC2F864157462D3878155093204C2341793A04B2387386CA922CC301005FB40431B9620A0ED1B0BD74DDBCBE032CE5975587A
+EBECC6B2
+E68E847974081A51A923361ECCC8
+11521394E9904C53E97587C0C45CF3958131E0E367DC63268C09B371C67281FA9AAF2C5EE3DC9AF37EB3090A4F2DE0A40ED7E6DA03C21F083F96496CEE9CF4328538B3FC1B61B2B71DCF5637A2E5C522CDE99C7EF2968B02B9841A78F693F8B03AFB0584B94E416929A70F4582DCAEC3E0
+B39F6F54
+22E0BFA8914C4E31ACA371A51F
+64CDC4E0C2C3605DFD769F0D841E2BCC61EFBE13E5B2EB2DB6E658AB8D3763DF22093F66DBB0F85C060013ED7CB2CC99E19A9AE41ADDAAEDD4754EEA2C383F32C383C56AF5179D014914EBEE5974F66ADCE04ECD3019DCAE79
+8F3E8DE5
+A9E10B54E30EC1EA68A7FC408EC6
+25E310DAF5E64B9DCEED17577F8CF140A29E2AB668243131E2787DD82078BB6A794ADD572C91CD75D07BA7046703B15726C32D47C5757CEA2F9927C81085CFFEB5DCD4CF14EC4E3405AEB9F7B9DC4561DFA2A2DAA909E3CBFC319AA8BA7B247C275EFD48397D44C8F2B168A1515BB0EB5FB9D47958A6AF49EA
+535172C6
+7342DB315A63612634E359701C
+F821383B1BAD4CEB98D10EC28477E764E72176DF92EAA41B6C2DCE062B3EA97F27EEC8C0918047D6F79718DEAED01F4AB8F25B033FC7AC5C189B98C63B69740332C7CFA5
+5FDFAC13
+B9DA09B829654189EA59FA9F874E
+31EC370C0D02EE4E
+EF52CBB4
+4843952CFD687F6C6E290390953F56B300866CC3343C4C26B5C35202FADF3B336870
+E21F3AD9B1C64E61E8041F751A6CED0EE6A26D79AE2934BC7848823E103BDFC6357B2587F848
+29A56BB3AB66F256141EA0C846628435A289006A2459AA1E07F142
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchi
+%!FontType1-1.0: PSOwstdutchi
+10 dict begin
+/FontName /PSOwstdutchi def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0101 put
+dup 3 /C0104 put
+dup 4 /C0109 put
+dup 5 /C0111 put
+dup 6 /C0115 put
+dup 7 /C0116 put
+readonly def
+/FontBBox [-33 -13 757 723] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842CA5AA11586DCFF47D870C5FEB929EC5C9
+8B7ACD2871E4A9F69E8E87EA
+EF22D1E6074F7A0124
+F1FC65A1
+3164253439099248199883229C55
+98E2574F3AA7520C24280259318C0A4A10B1DADC3B4C25E0F5C283812788F5568BBC7E18F7AFBD8C7931B3E2D2E9359092D53BC3CFF4DDF64992117FA05233D627D08C4CD635D0FAF4F3FDBC9FB8497AF559575E9C76078F067EA6C11608CACFC095060E3A
+1B1CFFBC
+D20B9B9C060DB9EE9BF11064986D
+DA53A77FC6D972F85714FFCACF3887F3E3C53FE200EE7A87C14AF3E5D7C43B581FEB570B88E34A06E1E682AC873C9AEC0CC537B80123285FB26CFB82DADF910C813DA72C9D5CDADDF455B2EC1BB3ADA3371A7715B1008D6AEF73B70B19130B85A7EF509372ABA718C4FE3F31279A095B0D9E5F9766E9946FB989FEDA709C
+6850
+631A5DD4E37856C52A9474F1D7CC43F7C4BFD34A562564975322BF
+09AA6F60
+6ED5DCCE8792CADF4D43E1F5AC04
+7A8204F417C4E7BD19F6FFFD7FD575D2742AF12857EFDA2EF5A082C32F58C18561B9BA71BCB02DB33677C74B15CC12638915CD5F661724B4AB042C2362F96DCB8CAC259FB216E2952DAFB9D3E74857B95A7B01D51B5257204517C1D891B01BA97AA60000F6DEEF278606AA2DBE7E8A0FFBD4C8AB8BFBC9C7E5132933655A
+9F31
+26E16072F7A90FCCCA5D9D3D2D991BFDE4383C4FFAEE1161809D765CBB8B622CDD629E6F180D773A6F265A5B26A32DD7A6A3D55171CA3A6C4D35F92574D067FE5E5F8C210868FB53D8AAE4
+ED50CAA8
+DDD5E6DAFE9117E7AF88BE6DC1
+91A3FB5A5039F93B94DE4DBEE44521D9539E3D53C7CC4656DD0D26E60B8434D62E1B0D8024CBB49385A1D71E16645760AF0B71B73E8BB1A876CA50E69202CE04FCCA4AB18C31E51ECE1A23739AB86647DB30FCA9CC17DF2371DB465DCCEE81
+894D38FB
+3BF6ADA1365F9FE9932438B39984
+8B8F0A692D519B6833DA45246FEF9D38493473B7C295E82307040A00C34DED6D5075E8355FDAB10505174F142509B22E755A40727B9D6F85B46C8D713F4C1AA9A7999559FC72FD8ADD71A81A2B430B9B7F7143E1D427D2B02C02DE5A1587372DE0A0D66D628B13204C1FDE0A5088EB24BB83A594ABCE
+20D71602
+747CDA34968E082C6A07D768CF
+FAB4CB96EE726431CF15227A6EE961AC1812ED7F3BC567EFFA72DB169C9CFF6875138092250EB1FF3186ABD0DF675ED93D35260C5E1D2B1C0D894F5CDDF1597988989E6C7BF139FA3F441FD99673FDB6D8156C20C6254B
+CF2CD5D8
+40E3A455537D18AEBBA0AA2EF193
+AD1E8F14B881D5DD
+C6FDD0CF
+3D2B6143A7BC893CF85DF208D92503B009FA469F423C82FF6B7E73AB155EEEF271BF
+51B3D1E198B4B1CB01F25C3ADCC0FE68A50CB2B1A43D2F3DC90A32B4C9F73AF809F743F9E66F
+676CFBC68C633A34954D78F8429C5559E7BB5B1DEF7555B0186F85
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch12i 12.00 /PSOwstdutchi newFont def
+/wst:dutch14b 14.00 /PSOwstdutchb newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<1b2b39352b372c0f011101122b33292e32273730012c3437011a2b27383a372f332d011b2b393c343730011d> 2207 558 0 7384 -1 s
+<2b372c3437322733292b> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0c0a> 9346 13300 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13280 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13280 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13280 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13280 3 7133 32 s
+wst:dutch14b SF
+<0d14131e171a19> 1271 1458 0 2055 -1 s
+<000503000b1e16141c000a141e1b141c15001e141d1e1d> 2055 1458 4 4424 0 s
+wst:dutch12 SF
+<1135273739> 1271 2086 0 1805 -1 s
+<002c37343200392e2b003a383a273100352b372c3437322733292b00392b3839380700332b39352b372c0029343339272f3338003834322b00392b38393800392e27390029273300282b003a382b2a003934> 1805 2086 14 9531 0 s
+<3839372b2732312f332b> 1271 2330 0 2223 -1 s
+<00322b27383a372b322b33393809> 2223 2330 1 3621 0 s
+<00202e2b382b00392b383938003727332d2b002c37343200131d21003727392b002927312f283727392f3433000435372b382b333905003934002e343839002f2a2b33> 3621 2330 11 9461 0 s
+<41> 9461 2330 0 9531 -1 s
+<392f2c2f2927392f3433> 1271 2575 0 2083 -1 s
+<00042c3a393a372b002b332e2733292b322b33390509> 2083 2575 2 4181 0 s
+wst:dutch12b SF
+<070c0f001c111e140013111817121c111e171a19> 1271 3062 2 3182 0 s
+<0a0b0e08> 1271 3484 0 1866 -1 s
+<06> 1870 3484 0 1928 -1 s
+<00> 1928 3484 1 1964 0 s
+wst:dutch12 SF
+<001d> 1964 3484 1 2128 0 s
+<372b3b2f343a3800372b3b2f382f34333800342c00392e2b003227333a27310032273e002e273b2b002a2f38293a38382b2a00392e2b00171d00302b37332b31002f2a312b0029343a33392b37090022> 2124 3484 13 9296 0 s
+<2f392e> 9288 3484 0 9531 -1 s
+<392e2b> 1271 3729 0 1561 -1 s
+<00372b312b27382b00342c00171d082123000b0a090a0700392e2f3800322b292e27332f3832002e273800282b2b3300372b353127292b2a003c2f392e002733002b363a2731313e002729293a3727392b0034332b> 1561 3729 14 9531 0 s
+<2827382b2a> 1271 3974 0 1791 -1 s
+<003433002f332c34373227392f343300372b393a37332b2a002c37343200392e2b003538392739040500383e38392b3200292731310900202e2f38002729293a3727392b003538392739082827382b2a00322b292e27> 1791 3974 12 9461 0 s
+<41> 9461 3974 0 9531 -1 s
+<332f3832> 1271 4219 0 1700 -1 s
+<002f3800063334390600273b272f312728312b002f3300171d082123000e09230700333437002f330033343308171d> 1700 4219 9 6185 0 s
+<0034352b3727392f332d00383e38392b3238090015> 6185 4219 3 8039 0 s
+<343700392e34382b00383e38392b323807> 8031 4219 2 9531 0 s
+<2700131d21003a392f312f3f27392f343300322b27383a372b322b3339002827382b2a00343300392e2b003a382b00342c> 1271 4464 8 5816 0 s
+<0040313434352b373802> 5816 4464 1 6727 0 s
+<002f38002b323531343e2b2a09001427292e00372b363a2f372b3800292731> 6727 4464 5 9461 0 s
+<41> 9461 4464 0 9531 -1 s
+<2f283727392f343309> 1271 4709 0 2040 -1 s
+<1833> 1271 5055 0 1468 -1 s
+<00392e2b00293433392b3d3900342c00332b39352b372c07002700131d21003727392b002f38002b3d35372b38382b2a00333439002f33002931342930002c372b363a2b33292f2b3807001a181d1f003437001a15191c1d1f07> 1468 5055 16 9531 0 s
+<283a39> 1271 5300 0 1569 -1 s
+<00382f3235313e002e343c002c27383900392e2b00383e38392b32002927330029343a33390900202e2b372b0027372b00393c3400131d21> 1569 5300 11 6724 0 s
+<003727392b002927312f283727392f34333800392b3839380900202e2b002c2f373839> 6724 5300 5 9531 0 s
+<322b27383a372b38> 1271 5545 0 2119 -1 s
+<0027332a002a2f383531273e3800392e2b00131d21003727392b002c343700392e2b00313429273100383e38392b3209001839002f3800292731312b2a00191c1325131d210900202e2b00382b2934332a> 2119 5545 15 9531 0 s
+<392b383907> 1271 5790 0 1648 -1 s
+<001e141a25131d2107002f38002b3d272939313e00392e2b003827322b07002b3d292b353900392e2739002f39003c3437303800343300392e2b00383e38392b320038352b292f2c2f2b2a003c2f392e00392e2b> 1648 5790 15 9141 0 s
+<000817> 9141 5790 1 9531 0 s
+<2934323227332a> 1271 6035 0 2165 -1 s
+<00312f332b003435392f343309> 2165 6035 2 3252 0 s
+<1833> 1271 6381 0 1468 -1 s
+<0027332a00342c00392e2b32382b313b2b380700392e2b382b00393c3400392b3839380027372b003433313e0027372927332b313e002f33392b372b38392f332d090017343c2b3b2b370700392e2b3e0029273300282b003a382b2a> 1468 6381 15 9531 0 s
+<3934> 1271 6626 0 1456 -1 s
+<002d372b2739313e0038352b2b2a083a3500392b3839003829372f35393809001e> 1456 6626 5 4433 0 s
+<2b322b32282b3700392e2739002c343700131d21> 4425 6626 3 6546 0 s
+<00322b27383a372b322b33393807002f39002f3800332b292b383827373e003934> 6546 6626 5 9531 0 s
+<26262927312f283727392b02> 1271 6871 0 2263 -1 s
+<00392e2b00131d21003437002a2b392b37322f332b002e343c> 2263 6871 5 4746 0 s
+<002c273839002f39002927330029343a33390900202e2f3800353734292b3838003927302b3800273900312b273839002c3437393e00040d0a05> 4746 6871 11 9531 0 s
+<382b2934332a38> 1271 7116 0 1979 -1 s
+<002c343700392e2b00313429273100383e38392b320027332a002c3437393e00040d0a0500382b2934332a38002c343700392e2b00372b3234392b> 1979 7116 11 7222 0 s
+<00383e38392b3209001c332b002927330038273b2b00392e2b> 7222 7116 5 9531 0 s
+<372b383a313938> 1271 7361 0 1862 -1 s
+<00342c00392e2b00131d2100392b383938002f3300382e2b3131003b27372f2728312b380027332a00392e2b33003a382b00392e2b320027380027372d3a322b33393800393400392e2b0008290027332a000813> 1862 7361 18 9531 0 s
+<2934323227332a> 1271 7606 0 2165 -1 s
+<00312f332b003435392f34333809001d> 2165 7606 3 3508 0 s
+<2738382f332d082f330027003727392b003c2f392e00392e2b> 3500 7606 4 5740 0 s
+<000829003437000813003435392f343300392b31313800332b39352b372c00392e2739003e343a002731> 5740 7606 9 9461 0 s
+<41> 9461 7606 0 9531 -1 s
+<372b272a3e> 1271 7851 0 1773 -1 s
+<003033343c> 1773 7851 1 2299 0 s
+<00392e2b00131d21003727392b07003834002f39002927330038302f3500392e2b002927312f283727392f34330038392b3538090015> 2299 7851 11 6800 0 s
+<3437002b3d273235312b0700392e2b002c343131343c2f332d0021332f3d> 6792 7851 4 9531 0 s
+<382e2b3131> 1271 8096 0 1689 -1 s
+<002c37272d322b3339003c2f3131002a2b392b37322f332b00392e2b00313429273100131d21003727392b0027332a003a382b00392e2739002c343700383a28382b363a2b333900392b3839380f> 1689 8096 13 8724 0 s
+<03> 1398 8442 0 1504 -1 s
+wst:dutch12b SF
+<00> 1504 8442 1 1557 0 s
+wst:dutch12 SF
+<191c13251e> 1557 8442 0 2284 -1 s
+<11> 2276 8442 0 2439 -1 s
+<201410> 2419 8442 0 2883 -1 s
+wst:dutch12b SF
+<10041a1b1e0419141e1b141c150419141e1b141c1500021e00> 2883 8442 2 5071 0 s
+wst:dutch12 SF
+<191c1325131d21> 5071 8442 0 6087 -1 s
+wst:dutch12b SF
+<10> 6087 8442 0 6140 -1 s
+wst:dutch12 SF
+<03> 1398 8789 0 1504 -1 s
+wst:dutch12b SF
+<00041a1b1e0419141e1b141c150419141e1b141c1500020900> 1504 8789 3 3785 0 s
+wst:dutch12i SF
+<060504020305060700> 3785 8789 1 4654 0 s
+wst:dutch12b SF
+<021300> 4654 8789 1 4977 0 s
+wst:dutch12 SF
+<03191c13251e> 4977 8789 0 5810 -1 s
+<11> 5802 8789 0 5965 -1 s
+<2014> 5945 8789 0 6232 -1 s
+<24> 1271 9135 0 1433 -1 s
+<343a> 1407 9135 0 1639 -1 s
+<00382e343a312a00372b322b32282b3700392e273900131d21003727392b38003c2f3131003b27373e002c37343200383e38392b3200393400383e38392b320900162b332b372731313e0700392e2b00282b3839> 1639 9135 14 9531 0 s
+<3937272a2b08342c2c> 1271 9380 0 2180 -1 s
+<00282b393c2b2b3300392f322b0027332a002729293a3727293e002f3800393400352b372c34373200392e2b002927312f283727392f343338003433292b002f33002b27292e003829372f353900343700382b38> 2180 9380 15 9461 0 s
+<41> 9461 9380 0 9531 -1 s
+<382f343309> 1271 9625 0 1695 -1 s
+<00202e2b002a2b2c273a3139003829372f353938003537343b2f2a2b2a003c2f3131003a382b00392e2b> 1695 9625 7 5301 0 s
+<00191c1325131d210027332a001e141a25131d2100392b38393800393400372b2a3a292b00392e2b> 5301 9625 7 9531 0 s
+<392f322b> 1271 9870 0 1677 -1 s
+<00343b2b372e2b272a00342c00131d21002927312f283727392f343309> 1677 9870 4 4392 0 s
+wst:dutch12b SF
+<0a0b0e08> 1271 10217 0 1866 -1 s
+<06> 1870 10217 0 1928 -1 s
+<00> 1928 10217 1 1966 0 s
+wst:dutch12 SF
+<0015> 1966 10217 1 2135 0 s
+<3437002729293a3727392b00131d21003a392f312f3f27392f3433003433001a1d00383e38392b323807002f39002f38000629373a292f27310600392e273900332b39352b372c0027332a00332b39382b373b2b37> 2127 10217 13 9531 0 s
+<3033343c> 1271 10461 0 1756 -1 s
+<00392e2b00333a32282b3700342c00353734292b383834373800343300392e2b00383e38392b32090015> 1756 10461 8 5519 0 s
+<3437003834322b00383e38392b32380004171d0821230500392e2f380029273300282b002a2b392b37> 5511 10461 7 9461 0 s
+<41> 9461 10461 0 9531 -1 s
+<322f332b2a> 1271 10706 0 1840 -1 s
+<003537342d3727323227392f292731313e09001c392e2b3700383e38392b323800372b363a2f372b00392e2b003a382b00342c00392e2b0040083302002d3134282731002934323227332a00312f332b> 1840 10706 12 9233 0 s
+<002737> 9233 10706 1 9461 0 s
+<41> 9461 10706 0 9531 -1 s
+<2d3a322b333909> 1271 10951 0 2007 -1 s
+<00202e2b00273a392e3437380027372b0027313c273e3800313434302f332d002c343700383a35353437392b2a002927313138003934002c2f332a00392e2b00333a32282b37> 2007 10951 12 8072 0 s
+<00342c002729392f3b2b00353734292b38> 8072 10951 3 9461 0 s
+<41> 9461 10951 0 9531 -1 s
+<38343738> 1271 11196 0 1630 -1 s
+<002f33002700383e38392b3209> 1630 11196 3 2726 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (21) 21
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0034 put
+dup 3 /C0040 put
+dup 4 /C0041 put
+dup 5 /C0044 put
+dup 6 /C0045 put
+dup 7 /C0046 put
+dup 8 /C0047 put
+dup 9 /C0048 put
+dup 10 /C0049 put
+dup 11 /C0050 put
+dup 12 /C0051 put
+dup 13 /C0052 put
+dup 14 /C0054 put
+dup 15 /C0056 put
+dup 16 /C0057 put
+dup 17 /C0058 put
+dup 18 /C0065 put
+dup 19 /C0066 put
+dup 20 /C0067 put
+dup 21 /C0068 put
+dup 22 /C0069 put
+dup 23 /C0070 put
+dup 24 /C0071 put
+dup 25 /C0073 put
+dup 26 /C0076 put
+dup 27 /C0077 put
+dup 28 /C0078 put
+dup 29 /C0080 put
+dup 30 /C0082 put
+dup 31 /C0083 put
+dup 32 /C0084 put
+dup 33 /C0085 put
+dup 34 /C0086 put
+dup 35 /C0091 put
+dup 36 /C0093 put
+dup 37 /C0095 put
+dup 38 /C0096 put
+dup 39 /C0097 put
+dup 40 /C0098 put
+dup 41 /C0099 put
+dup 42 /C0100 put
+dup 43 /C0101 put
+dup 44 /C0102 put
+dup 45 /C0103 put
+dup 46 /C0104 put
+dup 47 /C0105 put
+dup 48 /C0107 put
+dup 49 /C0108 put
+dup 50 /C0109 put
+dup 51 /C0110 put
+dup 52 /C0111 put
+dup 53 /C0112 put
+dup 54 /C0113 put
+dup 55 /C0114 put
+dup 56 /C0115 put
+dup 57 /C0116 put
+dup 58 /C0117 put
+dup 59 /C0118 put
+dup 60 /C0119 put
+dup 61 /C0120 put
+dup 62 /C0121 put
+dup 63 /C0122 put
+dup 64 /C0127 put
+dup 65 /C0262 put
+readonly def
+/FontBBox [-25 -256 920 739] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842243E0EC59344CEF369650A037B4383B03D6
+24C306E87EFDD4775EC78742
+FEFCE44B765574466C
+D1AF7A82
+CFE19FEC07055171803BE35FB61F
+DFA5A4C739A4E3957EB7C66233844AC51A6A91B45B75E6AF1F76779A4EA39D554C671F039F6EA0902EEABC13363BDDA5101CA12BB8156EEC5AF0BF9E6FFD41E3E8297895E1554F57314DE5E5E70C32DA47FD30A8525D7EE9C60607EDB6FD9F816BBA9417276F85
+60F5DDB4
+A3948B33EB22B827DF681DBB19
+2993B553C6D17076B4B9FB193A79C8A36EECD5D4EF0F532434292DEF98BC0B7ED78FD8401CBE88325807A34B9ECE7D312908B2BD6A5654090DB46D637406668C
+51FF586B
+0A455727C3D821E5379B18E7CF
+73A0BE843CB8405CC41A75A80486DF95591401AB247D9FBAAEE6F1EE55AFCAB16739F92C17F9DC431730A8479507AFD959AC919F6A16978CDD4C0D1467D6E1
+3962DC2A
+ECE603DBF7417C4A5C39407E71
+E8A81EDC1FC629A1B0D25B6B5E74F459D542FDA8D60FB0A351282C95F0CA5A93EBEA6A22E762D54555B05B1898BBF15D80F94A81DD2D08FD18
+A220D9FA
+4E2282C6D36A8D6146B91CEEDB
+54EB0838B4880ED0E6AC455D1AAE04C644F83CF84E3C51
+B9D53931
+8C70E1C37F8B46C93B56E6CF78
+0B37CE393631A096E624B5EF91388F69EEA2BE1409A2EBBCE55EB8A241F0ED
+1F29F915
+1513EF53C2D28912FCF980D05D
+8533158AF737601C7ACD032615A98076B1A4E8A29EB1F7533CD88AF1
+B91C68D5
+292A866F91B111A3916A3996F3
+FEB1422CA5EF938A5FC80E1B09943FC0D36E37D02739FE4E18FB91CA29427752844B6E48EDEDE3E39DAB96DD566CB9EF95D9349567B08F5676F679836F91EEA1167ED3B5A3BD0204EE92
+D93D0CFE
+8A568097F5ED772F9AC41AFF77
+00001FC8E6FF0CFC8FF996CE5DC390D39366E3E01530452CB5D977470E15F56A5C5DF67CB81F1D289F46DFC0A1831045E08AF7812B3645F735B2DADD3E2816
+CFAF7BFB
+775DEDFE9F116253FE0D10ED15
+17489C3E7BFBEA8020F822A8B7B9D43CE47881F4A6D5C3B973B5F021A421609247291CE7F849CFCE5722A93C15E40D1A86A8BB7A6EB263D8B1D24EFAF571F8CFABA4D089F409D2EA95D913B58EE8FF4BA0E65D834684020B5747
+22A1342C
+36C8E3DDE2F3B6F4D1CBF149F643
+EC607E699A6AD5FC3D443339268970EDB787EEEBD3BD9D9A1885F54671F19255B76DEFD231A010B6781E6185CFE41F7319AF4AAC65033AE1815164FCB0BD6EB43E6698958C58000415D4C74D84ED4D65B68CB0FC9E85A76F626A7BD2A118F58B7D7ADAA959DA82EDE19495F6EA78E4
+DE4E9E24
+E8BE05D5FA587AA82CF7319AB8
+13E2A1EA7360C2B4F577EFB827F11DFF0DEEDB0EB2C8C1E7A7F3C8AC23E426A0D57A2637FF274648659A9615206AAFE233D9426AF0B62D851802
+1AC24447
+F4A81ECD5917658D8AD0EE21179F
+DFFF655EF4A4DF0D143873C6B5B73C8DD498DCC4CC784BFF25A48D875D0B1ED5D487CD3E443FE06902D8B92449C5C9FFF1C8C6D1A60314D55F924C2FC81DF0E8090B8233A952C5362293E231B52A0313524FBB5045A72994A306C9BDE5C7806D73552A1F
+6D752211
+936DAF0F459516454A8CB5ABDAB0
+0E5722E2923F9E073562FC1A1A3CEB8103F99DF3EA907E9C5EC9FB7234356A7250EECBF1FE4F37B06F93B61E794BC942B5EF3D9544CE0C0016AB02453169469490356FC805E554297C9637F907583C2457FEE651DD387E62C1ADE04C10FB674DEC8A57ACC0FFE079871BA33300D73E6D404D9637E04118256E90
+3A463543
+C58133BDB0EF9AFC3B81E9D98442
+2D428200396FE10355A16C10412F697A98A211948D543C8E3A27014A62CC1BA9A770AFDFA4AF647BAD12BBA3043612CAEC858AFBA69DA0E9C23FC802DFFB619E7415056F3B106A44E884BF69436F8A098D5B64F26F9634798BF9ADE6910C335013209683B8
+152CE98B
+19693E459A4B5A0A818785ED46
+B2205D9B172532BD5ACA8D8AD4ABC3318A70DDE13D05A544D48E0E90EF4736251C5A8BD48EDD06229513769F871C82D93E5D196D7FB0
+C2B1ECA4
+698480ED7876CB06704400D0E077
+AA632858CC9DBB844F8E3621AF4DA56F2CCA0D122F69E121DD757FB1CBC113F23C25D2EEACF54162E96345A21919282F704CA8BE981F7D2E9360835E70AB99C7E2738C402DAE354216CC53F7056511CB97F5C647432D0B24EE86971B8FFC34C030D89AE057EEFFBECD56858C52A663954FC63A
+01041167
+1FC81A2EA1A0D34568FCC4521DA2
+8864D7351A0591723C6296645BC85A239ECEFB12BAC71A08188E9EB01C358438885BBC89B7D3CF0A620C6224EFB23300DF72200BCC2ED5C6F759871BE5DF24391679861334DEC631891C3DE252E2FB2316CDB0E55A953DFB60F8554B74063E486550B447E426F8615AA707C15EB8C03D75203208F998301A26EF939027FE
+83CC
+3B
+769E10D3
+4CE1E421E7238491ED4CA1856F
+591A0C69F87DC6B36F2E3B3CD338068AE41F686762451B73CF66EB96E68D68424EF85D256E947FA29251FC3F084DE0AE7F80A63C658C09BE6FEE8FB8B9884E792AF623ACF7115FBC4CEBEC9EF54E31628265BD946178AF92C744A92835D09E7844
+D5F97CAF
+7AC9215A5520CFA835976E9A13
+8108F567551F06C9392377830D94129F4E5B783C6BB215BC53938015E0F5F30AFB22EB1CCEB96BA56557E61E7AD4D7F4BE7BA1A1B3F666B9814190FBC1BDDCE07CE9616A680FA0267F67A2982854B99EA4C2F7A139424C1BE87E9D507C5F9651741CE0
+929D692B
+3EBEACBEF91F2EEF981265E9D8BD
+AC9197ECE06CC8F4FDED8E22280FAFD7AE2E8A9B33CF5658C667BC50BF199A3BE5E5950551C3A7F9A5053300EB14BC146AB6F3DE84528F5430A034B6329113D648D3A7B0141EB802C0F78D77910630C793D626B14FD12B5EA455AE3162D85A5907352208F29AD562B99230A442EEFBE9FC39FF9D5F06F4B9227ABB035D04
+58406C70
+1EF7134303460F35A2BB9862EE64
+378E0F257EC61C7C9F92FC5F22CA698B7A6453C4F559255BE9F66D66B230D4FC9F6C1590730F8CF41B8006ECD6AAC1A48B100F9C044EA13359A065966395F924A2157864C53729BB8A747B44F494144D329F3DC229E320007C68F80C088DF40635CD021864B35E2ED5
+4A491333
+DCD129A05501DC07FDD925DC9422
+24F8089B6D971F72A14D6E0ACF812519AD9B05D7AB47FB6A6AE3A0C3182B382B25BC250DD681986549330F219D6926636E3AE2BE70AB3CF2AF5A20B825050B4564D974A6746A23A433976C7A0E203E0FC0D2941936878D0C5279013C5E9F3C479B8569A1D6AA83A6343A2A4DF5A109C50DC67C84F7696B26322E
+4EA7BC74
+A1F6245CAF77001411534A63B8
+0CAEACF14407136F538BFE71F209CBB09E75F5834625FE705FE7EB585F906914E29EEFD8E03A87C9E8EB2700614BFA0711148E1C94965AD7DD2CB3
+2A968902
+AA6FA446A834798605A0FFB1DB
+0040AC58D968D4C22CEF8B4C7ED5C495D9C3C1BA39EB82AE9D2EF81D29B6F114FEDE7ED692D88649ABAF1A9ADACA5890E9E23153C53D24B96ABD130DFFECCE000E6E3DA59F0F9A
+7DDE8ECB
+71103F71EC2EDE55A63645AA60D4
+04B3187DA8BA80070A4C23AE80114430EA62A4428AD9CA05EEDA1BB31A61576B7504A0064192DBDAFB2A921725D88B1E94DC29AB5BE071722AEC395BB014CE10BFF89B8F07A716672C3454D08928F5F0308685C2C292B65E7BE3DF42CDEB17CAAF0D02DD79C8BA4072F29DA3610C89
+D2E23166
+E5C2A5666B2B701209BC62B5AA
+E1C61E6A1FFABD9893AD32C7493F8EF644B91365CF28AF4A3A430547AE5B030147065ECDE2AB60E7FE8610531D2C60AF725007579AF44D9A6E9124CD2D478D5F664301493D7F78864B7052584F5B43139FC73736D41B068AA7DA077D
+75E8159D
+430408AFD409661FBCFDFF21E9AE
+53A0E833E1A8DC81045E1CF091BC05B374FB9860B7EBC5B525D78345A31CB2DA02832C8CFEA60FD1607555D747AA086AAFB5586745996FBCBC3DB056642A702253A7070BB603E152C97236B54EF73503A00314860571D25514BE3BC6CF4389265B1E9B2E1B2196E9FD36
+4885F29C
+5F1E61F69681F91B31381AAC8C76
+42DA07EF8B524853ED2D5B3BDACDC78EA1AAE4297BDE2BDAB52B037550D555A6597DDF5DAB58C46B2B7E2CF26B32428C7C98EEE51A1FD99928555DFF79A122E51AAF1A65890E3F654B06846151F8B289BF981E9BE79CC21172296979170ED5EF389731B63B6DD1301B5835D100FC7A4101D6BF79925D56BE6DF1BB292C71
+22C205AA
+044525AD38C9CB2C0CEE1AB910FF
+575138105FF5F6EBF3C23D8CF02C1808F6E38B23A02FCDA72B600CD07A561F66AC6F2C14F693B02DF4E60BDFA9D18E1887DA5666CA173EE20752C49ABE5769FEC4097075DDFA098D30C75CBF08EAEF188526B8C488070DFABAC9D5073ABACBD5D24FD3CE1293075EC3BF5BFC0BDF5DE96D2A22353632A7A38AF1472B1113
+58A7
+128975
+A46A92B8
+6602FB1B9EA51AED2F801E4AF8
+9319F6B02506F0E5062DBDBDC9771BBBA1EF94EA460A1C9E33C74E90C53CD28D4472D34AED8FD98FEEE0C240FD3B0CF8FF105F0B4A75D79F3F57BBC2D34D34D0D435FD8A22009D357572EE78BC21E934C5
+848DD02B
+006440A2641EB373ACC834EC6F25
+EBEDE4E7BD92413B2371DC6FCA52B640D52163F16411B3753C5724C92DBB0169F2BC362C6BFE1689D2CF049548CD17DF22D0C786C31749A1B7899F34D5D1CF52A263EBCE80660FF1007BF5ACEC6F9EDCAAD8B265FC8C89F73693B19AF682CFC450F6C19E
+3D6FCF2C
+0FC1BB45B116677A108701545E
+CA6EF2169DF116E273D47C4FAEDF4C59460A22D126834540100F81224A767F4248A49481F259F8442A338F205DED1444982390845448E0B67F10A2DC74C72E4FCCFF7FD0B499647817DFB713F771E57276C1E0AA5E582376C5
+6FF293F7
+FB5236735C712403A33FE53F10
+0DE329F248A9269BCC84F3021FF90DB857B45603ED3C41617A35028F177E6F6EF4EA43C2CCAEE8E4DE5A
+D9E9BD71
+1580790BC98FFF230193B619E5
+1942C0298AFB9E5CD90A4D7BE89FF99899A892FCD5F75C7874902EA1776A87B639A5508D39DEA6110D8E4D74
+4F0629DE
+55E5A948BF06BF114C8FDD306B
+66B9355ED97067B96F2BB19E056538971E6CAA7886F0
+EAD461E1
+12489AE5116D23E0ADAF078126
+540BD2D48B61B5A40B26A794C9ED8829A8EAD9EE3CA2D18AD02FC0064D4D28376B954978F37841301C34D43C6052EEF74A268122ACA9E409232B
+5DC19517
+679D79C4D94885A30B138F4EDB8D
+D0AC194D47710F058CEFAEB65BAEB0F2333E21D672DA9032A6C8C61DDE5EEC5E510E17ADB288EB6D035AE3B54F7AFB1F5983438FFBA1D26BACA80F164D11B1BE5555A73F501E7514079724B0D9A93CDFC526D8CDF8B41F725A21FCC43CE71495CE8367126DE70F6EE1E2ECE7A27C446F1B080A2A7291D3517A67F17513AF
+35B4
+658CE9
+27D9F097
+0FEE2E5D5923B15B6B4D68434F
+B79C7068319EBAEACAA924BD86CE7587D0814A595847B1B07A0324E43A76B96DF1350B87DC49DF29961D0AF825323F7FDB98B65867AB8A33538AEE44FB8F30A9815582788C66F1111DEB702CE63F7FEE3A9D4970E5D68C47
+62CA2D42
+FCE878F99842B2D652BCC4EE35
+00EC9AF9BB3FBAD28851AA0EC661A0F56BAEB4AD6FFBA6E563B151339C63B1EFF250D1BE85693F869A52861E8BA0073241E9035FF06CDC583AEA0EC923E9F6DE328355D760DAB48BE09876F7DA194048020C
+67FADCFE
+43FBAC40976411E5524CA2ADBA75
+E7143885B3DAC6EE3C9F054123DEA0114FC0E116F8DE2A1AD099D53172DE9FE3315C18524E45E10DD0EFF967344C44CA898281A4046845EEBDE8E88C46CAE27790AA3F8F5E25C0BCCB6AD82AB9CB523192FFD33E03E84548BC902EFE5BDCB2C792068348A1092839CE245206B859
+C287D1E1
+271C4E38A5EF124DB1F387FB03
+FAA5AD1297F3A71E9354C93EB9505FEA492362FFDAD7BDED8D61A418DFC26C650429A6B6E9B5090A5B06EE97AA1F963631FB22B3C3099CC2C18C794CDB3E7A873D24B024C9BACB58521789A5C0A88E63F3A93773DF06B9A213
+863BC42B
+F953B6E25F4CE77AAF8F147851
+FCD850077C311A192030741733F1B3516DD6EEAA9C2BA97E24E3691AAC15925E879EBAC6D7AC30C66C4718D40CA71DAB4D9A40310E3776B44EA6EFAE2F78CD8555F4414B5D0C21B5122FE7C3DCE1B202280FCCA31C61C01527CA4420
+942E9381
+08F0B574C57837E66880FC9B4384
+EE6F9A15BC5560327B4F6743AD2727A4911552C1E0217F243CF1FC2551194D9B3BE06F9865D47336CDB17BA33D62A454B0424FBC593FDDC30E76B019A3B4B604388426FE93E451D96C8F58B3CE08826C6AA2D0422E28FDEA08E795F076D193C233E1A06DEDFE2EC5B3796C4A77AA6A65F7ACE47708DFA634621BE116F2A4
+A79C
+479A387B004F6FD79C6A0D5764A7080898BFA72CA0083B51F04A9C1570E6D1418CB6969CDF39E309EC4B1AB661D5D2
+94C5D177
+A4AF68678C71B734D18DC23D2B9D
+8D0304DBBC3407C4C92032CAAB38176962F3402CD76A51A1380A6BD24962936FDEFA581EC0F91CD7B259775F5D8880EE81A342DDB9174CCA1B1CF9561A21F9A2FC5D07BCAF8BE76CCD0D053A3A9A31EB4C9E94B38F44B7435FF3AEE3C72E651894F55DE3763972E7D95E2778C4
+84EFAB57
+404631F1F1976CC9817B7220B0
+71C88194A25679279B0BEFC8986DA7693F0F57007BA32AB1D24C7C97DD0AF52035AFF46A0CADF36D02655FE8475FA504983A78FB50B2A3A771F4322CB57D2B75E17CE341D8E371177287AB416E5AE1CF
+4C522BA0
+E3791CEA42C9CA83A126BF4C061D
+7029C0F857EC61342C0AA7107398AC77F8BD5236046BBD833F19B6B1E74F3A7D78C679193A760F56EAA823A9E822B51187F6DDF65E66E5DE061C2964F4A44E5575E4C82BE4C4DB31A0BF949C2793B455628F5F917129E169F3F1851EB7E861217B22FCEE0BCBF19BB0F63B562D838B1F6CB5E29B0659FD0FA8DD81FD782A
+0C4A
+3963441F08542FA781B86C8E044F9737F67F74CEDAF805422D754D8A1A7227B66E42CB
+D4383C78
+47DB3E703D884CA549562F814A
+74DA72CB01B69D8832D45CEBE899BDF4E95DADE97C7B660096E815231F20F95DB819E6367B1086A200EC33691AAE5609F82E6AD28109
+608109C1
+3E7AFB4CAF6CB15C3885A7C2DC60
+4FE2331DD30D15B8A1D2BFC69B160EC637B585AC39C155AB824B006966CC695C39D68E4D6C1FBDE51155435E71AD61405631A3B25E1A02788DD354A189EDBCC339E7A012867E9F31F7159A36CD1FDF823C249A12099B132569274974ADA8D191261E7948F6DFEAA658D7687D9B4796955F6054DA174B5F5675D31D4BEBEA
+9538
+61AD269B7AF244DC3E67538C858F9B101D442B160438569DF3923FE702F4F9
+441C5A7F
+E1359761A08BC7C5BC35279A4429
+B2939059FA1EB18F17EB7CC848F74973651E6179AA443B53EE59B14360B062E40F394DEA5868DA6E23B2E5FE5B9C9D04130FD4AFA54DC29BC24B32B6B1B6C9831B1A60F306BA238297ADD6026E8960206DC39227637DACCCC0B6212AC4F4AB613C2D158A387EB6CA2CC9300A
+93A6BC75
+85217AD6A12E232FD48D7BF944
+66B0F6E06F44DBE9B729F3AF13B275CF29CAE414309FA59A9E589C5E71D744C452290533C7314CB39E139B97600000541318FC08620A1D35DDCEAA1B17C25D5F82FEC2797CB2
+408813C7
+01A04D4754BDAEBA358E6D378DB1
+8B9B53B5353CF1E1432A3DFF8DC567DC925DB510CE0A6C7E53863B6A11ABC0EA90C9918255B344179C32C6ED21C4CBC41CCB73E5E59FDF3079CA2C22D9A0C567E0B6BA92AE1B18002D25282354C4BC0F995EE50E720E8D1285B2C62FCB61824C1D9C64E204C76594E11C50EC51F00250978C5DBEE39091
+92238933
+42E284D7D19C0C136212F0305001
+6897C740ED688175DB1DC3E7F97FB19E335CE4506FFF6AA474281AD9EB2F518F3B6C2D6A1A11CA392AFDEEDA707818B7FDE8C381F9C9F1903D043AD895EE3CB1B0A88D5F12092AE795FE3CF1CDEE918E49C9A386150DF21A5694966029AF9F840604D8FEF7751317DEF1
+C46F880C
+D45085FC3F2A843F33B10B777D
+6D0303D8CD397CCC7074134087528A27810A70A2811A257284F7C30E1A072E9388E492BB9128B17A7A3AAE51301B93A032FF878FE19046BE6CE6BB434FC457B156250DA74F351FB6B0396E554204C73BC0A601D067E516
+CD4B744F
+74ED3C25CFA9022A4956D49D8D33
+53FC7DF3D688D6DEDB00BB5A3CBB698532C15B469905C89678C86C046889A221592E77C99F1A1B4A70F392375DB75C75667D40DD9403C578A2F4D45870B573EEBED4CF5BFCB6684E558E8609F0E65B6DA35A7094D6B29B139EE3D62EAB053904DB412A59D44D6994F2C8C856DF27BC1856920DEE8C6BF8D998FE3881
+EAB1DBAD
+5E75CE0427AF3ABB07753618A3
+74051DF4A2FAFD7FE0864E95EE387AD27F418B355AF697EC782AD02DE8603AFF85AB1322366BE5C917ADF4959E3D899E78F540DE3C71D18BA9080A7511A48B21B530F0EA42
+E6204374
+C5921581E1F964E282514629E5
+A25C4FDEC2E9FC114BEE20C21DA06E3830CFDC2DB4F4FAF81EBEFFB18114DBC39719D27BFD1FDAF16438F6394D793C062D5F75DC21655A52FD7B0E78121BB0374412EA7512CB85F4B7799CC0188410345A6FC87E0437959276A8619660B4545079C5
+00A24ABE
+56678FE72CDF511F01D6F6D4F4
+FC37AE9584102A0B71E4A24EE5F223917726DF4AED4B101E3E825591C057FED1CC207F0AD82BBF122D098210559FC3373541623BD2C90AA667579EEE1E13FEEBEE3ADF3261562FB71163DB7563370BA98ECE6B8A6F008B9670
+8B168F61
+C407A5D951E8D915F25326761F4D
+258EAAC33772EC05F4672F6B45BBEDCA7E3BABB3743807A453D7ADD7AB9AB68DED08C1C0219C94FA9971E19475A3413DF70F0347A1EE219D51CA925D20C5C615EC2986D4EB904A8D27FBDE1A494C366401D49F9257DC275BD4868E59FB1F6C5B2A01BF894BDE483DA165A2C423CD587EF0574537CC544CF86C34AC202278
+601E
+D5D72885B02D17A9978231B4D067
+517BC345
+83D8C497EC1171C195144BF3FC0B
+A485E050AF1CE853FDB2FAD0795E29100F49ED0F4A74BA2D34C3755BF5466D18A51B25609A11938E4E4DAF3715172B3AAA23EAA09A8961EDC5C4BB71E5645209978DC016278227ECF32650A9C9228AC874126033B97EA2A3ADA23DB54C7555DCC49CBFE8D277D404749C07A78C6D53F36F5680507C95C14BD7C6360903D3
+5243
+816C2C51CF9B2D586E11E48A61BA5D1CEFB0F5E37D0C0D7031
+A0F0766B
+00D7A4A5275E49B5EDED7CA2BB35
+988541C9118923E973DC30536FEABB0CD8D62C7A9971AFC1DFCAB3C9D3C13A673CA973738ECC1A44032CA3BDF2BE9088D68E3BCBD3299AC48A8623FA84AADA62632FB7B4667ED97E61331093317CFD8CEC12B699401B299A7DC1BFA98F56EB2E49375D6C73A32A0AF68AFDA9471DBADDDDD6E839FDFBB7A1538BBBF55D20
+CC29
+C7C27DA7
+B760B499A5914036DC2470A8B6
+38AC7741BB8602E057CE0D971F4480056DE4115261D89F5541BE8DC8A01BFF698E7B201EB48E8F38CE30E8B0739FC22F6D6CBFA43B50851F645F1938FFBE4B
+AE381DF7
+83C47AAB0E8ACF2F989F9CA02930
+6E7E1E45D667CC05BFC29734BBE5F15C6277D78C1D1FB2AB56B2DADF26F0984984833C4D0E19E1D9571CF4FD61DB6C798D16021E291E26AF2B51029DCA982D30E569498DD1A526D4C210944626CCB2D13D4F491A4EDCD44263B133FC9C51BB0A359DDC4C9DD36FCF6F
+AE3C555A
+937F73149A442B61ABBCF38CC4
+A173A9ADEEF9B2F6BAB19CF6CA7652A4F2AD8B387F4E
+4C590164
+9803B5DAE39A0CB1496D7364D550
+859170B44A583C9C
+46DFD711
+79744D537275F2BBFA70C0B01E9578E82DE1CF1B8112448F61DB9ACAEA1BEE1F71F4
+AC51BA4EE00154A03B4A5613779348D371E77D7468DC8BF75861391AB6FD4083CCAF7A1BF685
+71B451B1157B9A50B7E7D5437444D5EE743C0F272CB7A2597FCF35
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0045 put
+dup 3 /C0046 put
+dup 4 /C0055 put
+dup 5 /C0067 put
+dup 6 /C0071 put
+dup 7 /C0078 put
+dup 8 /C0079 put
+dup 9 /C0082 put
+dup 10 /C0083 put
+dup 11 /C0097 put
+dup 12 /C0098 put
+dup 13 /C0099 put
+dup 14 /C0100 put
+dup 15 /C0101 put
+dup 16 /C0102 put
+dup 17 /C0105 put
+dup 18 /C0108 put
+dup 19 /C0109 put
+dup 20 /C0110 put
+dup 21 /C0111 put
+dup 22 /C0112 put
+dup 23 /C0114 put
+dup 24 /C0115 put
+dup 25 /C0116 put
+dup 26 /C0120 put
+dup 27 /C0121 put
+readonly def
+/FontBBox [-10 -209 798 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842697C64AA1341376544BC83CAB3F1D3DC53F
+CCE6DA147CD7539424E5308F
+85563A985DE93ADB17
+9A9AF889
+F2B5A459E50EC2C5F74D56DF7C
+21D7CDACAACFBAC6D3A5E4F02E0C6A5B6DD31793EE0464
+A8C48F24
+32C23E08D4D4272B6A1D3A4BD9
+F0B7E0B23A94EAE7B8DC531296C9D575D6B11CBC686CFE26F26E5E9581692B
+FF362FDF
+B7C40F292210E327D337569345
+F676ECF8BDC0D8F41FBA2ECD2A54B00C28775A7CCE7A11AB86F8BB778B8DC54B3B61EB3C5B481948D0DD24AE
+7007C12E
+0955652917D22BE349992820B11E
+A1FFAD64BFC10FB7B79E1A4452832D542E4AF445F2C03A0E0941A7860C47DF87DDC8A14726CA2F007E0A8456ADBE96CDAA727E5A50CB8FA3551FCD39B86EB0B3AB277AB49440A0CC2A86F0BCE3867DEB48C0372131DB05014059BF4C1C2B23B7CE53911B928B27B2
+8B24FC66
+1A109C4413374BDA30D3D24C4CD8
+D9B4A0217F654723ED1C1B589F110CAB1F55C688E9025572BCE5DC6B20BB1A875C3D9D83A258F892AB0ACE94D23CB4DCA80B94996A860EA73273EB6B679AF95FE413DB11EF2B57FAF0FA2A4E6E0AE838FBADC8CC3E11A00251FA0135884325419317F60ADF8F4DA77FA25F7656BE7407BAC3B94E7E6BE7
+36E26E9A
+CA27479A941DE32A67F1C389CD
+51E7B2BC41D079B4C3E73730DCBEA23A72AC15D90B11BE25038DD198663BCC3AA96AE63723AAC338C6EA6E52280506089797C0AAD9D2B89B3B29ED09AA4BCA21ECB076F45B02935476C73D7698EF2228CC727C3F9F0499C3A3CEC839C5AF8D
+64CBC07C
+E0B65B48437F35926717801BFF29
+280E8DF8686E35A5C28E566B21D707EF5929BD0D99411B7A1EDAC93801669B8D162A6E30CDE29896FF70C7343A9E5E3863AB6FCDE00362F5FD52B2DF9594DCA5D390EE0A89501A9B1801DF00E4EEC0620A72D0BB33759E5E00D49E871813E8AEB080CBFF20A7B87650
+B3F3184E
+8ED6A0BA8EB50B931E4A506E87CD
+85E84C544D42B61F3ECEC2097F1F8A597DB77CA4955B7EA20FCBEB122A2547BDF8D5E96DD71F49C08D651D4171CBA9101D0D01B0D95A3FB534B1879F89F4718BBD4ABC12643477CA56BC4BEC27C65A86B3866495870C2A630874052CE45A910140170C4D524FBCC2080BF643337C2B2334EEC144AC
+F0B6DBF0
+C2804F74C1A7F178FA199AB5368F
+F41481D6780E00E372D10513107EACFEBF21C1AAA76BBCB5AAD58E36FF6C70DC36AA3E877CAF78A7D1121B161A5A1D927B8979419698A2DF7323BB2E6989FC9F88AF30BBD7B2B23A4B4DB93211A3904143A397A3D6252925614BB8F52D1738F47D8C313D51F05C945FA8ED07B83516B057E00D505711CCF56AE74AEAA798
+0807
+BD5EE254
+18B73B2408EFD55504E204FC210E
+9E3DD63FA2F3CA2986D85DC36D1B79ADDA315DA9B00248A598D57A9B50338404805C8DFC39F1F756DA3D1FB38405839A163BFB2ABF2EBA1EE7F5E9CA3E4DE71054448257E9DFBF360699EDE5C0554BABCC4F799AF8DCE013FCED08B4D31E0E8D74EA079D523BD5CE53A64251A835C36F782BD2F42919E082D46797A4FD7C
+0218
+399DC764
+C685D48C
+336AE532F3C49C81303032C031
+B298E84E3A4AD8CD9B93F0BA6307E3BBABE21BB9D238F6516A2960F92BD93A9F6759890B6A4CBDD06908A45126CF3235D73215DD7E34D85E7FE478DFF0C9769AC04A71F397CCC3570D5B7F16F31814DC1C85BB475AE98D184CFEE58F79BC
+39F3766B
+536B1B56976695F300B89AC522
+0EDA163A861D2C40D9F70EFEB884C072B0D03B01C1387EB0594D99F2B7FB0C5532115567FAD04FA1F8865E51F5636B57DB1316C7EDED728E2B7B73B90A2701667941D3F13D23E9EB0081BA930D4D85C6915A
+F04E8373
+CF0505CEE1D4657F89C08674717E
+87E64817A266D2AE95A43AE7678B9CC73C32659467F6ECD6D345BEC2BEA013C12216EFAE2C3DEAB05616D18751A52892C1F2BB0E69A026167CF5047AA98306972665849FA8435671FA8566B9A5B9C146CEE4DD8560EFE0F1EB2848B8B8717D72D7216F6FAEF584D696BDC626
+AE46A8D6
+CA6D320EF2D4A30EA5F8048550
+B79DF3DE4817B83E9F07E9B7E929DA6A48667F110D30D607647C5BE5106296158879E56BADF5B6578A44136A55F2A4ACE14D1D87EBDF6CDEA1495B675EF38B39B09760CB9216EB962E7147FC39586998D05C850E0B7F19777311114F
+A49406D8
+879F5F1A8363F96F347C52C12A
+5656C7B3ACE757A10A5DC506DF3A361449B77423E5FD3AFEAC5DA620FD9F3515D59BA7286B1ADA6EA1F92926F20BD5CDCC3783407F168A03CDF44FEB85668D036D61117ADECA5553DCD988D416C0B02F3B8EC21753D302B5735982F5EE
+72DB8B2B
+C3EA62C9271F8B39ABE98111D3
+19AFF4276F42BF4F4F9DF2444F05E64DAB30000C739B01AB33F65E2F35145B07CFEE8ED7FF2010513053FB40DEF92DC8696E80086631FDAD04B7EDF38861FFAFC508E4F753F950CA41841170A36F
+D8B841C7
+480334E023321D948CD8AF3E5E
+B9BC7BE12237EAE79014B0DC1D32A84CD5CBFAB0C3F76D65841973045AD264E2B75E7047325557F7FF32E0E6ECF81A3852775D80
+7B96D026
+3CE4C91883998579DC3452CAFC5F
+902D6E00576D6EF361DDCA551CA2476352114B0A2D2958918BCBAF900181CBF7745EF0EA083B2F1C22B4C69746F5B6734E25CC3E5340CACF6189322E978C72CAF332115105A0BF8F381DF5DE5369818F7D01079F3F9CF0F38719D6BCA36AAB63D07CD907574DA3D1A5CDA04165D3E7ACC9A0B8671C439CF29E397D5CC643
+D851
+B5D485E2A06F2919BA85739720C48ADE3B64D1278B998E42DC8F7CEE
+EDA20C15
+EF9F47E47B4FEC2BB47BF09B1882
+9BE2523F24C0BBFBF18817A6AAAD4B098436539627644243DE9AE879E480107BB8B9A9A68558060AF21121CF7E8546F69527BD6FC1DC3E46E1583DB0F0F402F195D3E0D1B9FA2C7C572513631A7965D00C5A2D6F49390347DD9D9319D87614B7CDAFD62E2FC24C
+2EE3A106
+6640ED242C93A61728D876BA28
+29A4D55D9ACD054A9028F1D303411AC7B278029A98B6F3063A5CF0C577BBF2E74463DC9A9348517ECF1A0BEE75774E7B064BE1208D9BFA16508F85447DBD58E31C77125E1FBF
+1363FF5A
+D8A08CF87FBDA59B2A7D997EFF71
+C0B00B95B4BD53239E4DBC241BA7B4D6B552FA1A9DE22BCCB7A39047014D24B62C5402E3DEFF11C83D756301039C6D9C3C6D71183066B6CBC3E757321FF54580E0989577706C26B1E4A08D02A9FAEF2863243B6CC3C9AA7C6219E7EC65D30CCD0422F6BD1E9AD6F0B9D8FFDC65AA6F8D97
+FF5984ED
+6793281E9AE22906896C1CD7DE
+9E9C0848C4CF3B48BAE89B32848372CE8225792F846B3C5543E376C0A5472D603D97E7C3EBA582A6A90CD8F05CAC8F4A06A9AFBB88AE4ACC8869F1216A84E3395929105E976A0DDC19641A1C54F54A56B6468D6EE8DD80E152
+E1D63F70
+85F1ED7CD333580A06E4C0F28E3C
+C64BB493F64E1AB9A26018BF3DB445CCF7BF30DB8EE225A3D158FECF8B3E0B0D95797678C8E344C8430513C0254E42613FE03CA495C3C0123C2001A3C33EC40A54AE2B64CFFF9A924713890CE67154F3FB26DA040650BF8BCD5352F8EA4A9EA694952CDCB27713EAAFA2A23104352DDF669AEE9267FF06EFCF
+11AED49B
+0F13E836E026AD7ED02746DAB7
+6A6600D7D8313FC81E6E3F5DF94729668C3A962F3B645A4DDE91CF4DE35FA13CD586C4E1B871C754057EEEAD42B98C08D6FD7A61F29141936FBF976171463075445FEE4F
+4491B450
+BB210F85A1A230D223A8080F5B1C
+CDBA6786BA42181CD8393BE4FC2B97D791F62022B4DB2F56CA964B1D4E06F2B4096A53CDDFCA3D3E0FC0D5CEF9FE98A079E12E38253F6361EC07AD3970A8936FB31BD06054A78D33217546C95B521304504D3FD3E2CB729B79DC90B75C095B8474A32818C51DACD56502482A0214DCDC92BC053CCB28BCAF4373C903E95E
+1647
+738C4E6154E1A45273801F2F24DA057717FC8215FCC4
+D492FA63
+6B229CE12CB466C8D951F46905F9
+EB828410D68DBE14B11094379BD46503361A2B79ACB734ACB5FDE207F63F4C5672FFCA2641E383E81F31B584B2DD6BE8CFC141A882D9C3AA3D7EF33859BB6BE892B68B541C7C639ED1EEFE5572D0AE84545184DE4A6D314C5001DD65DDC1EE5B4C902B40261F38EBD761ED088DEA1AAF43503F207C4DEA520D04BC27BA91
+729C
+0A
+F1D37D0D
+CB3F326E1213082DE9818EB11C41
+14060FAD4E1DC8B7
+1DF4C436
+93F430C6DE222AFD666D549356677DB85465CDB5B31C2F4BEA9D1D8908B01AD4CEA4
+C4D7424DAB8BB0D1D062AEE68E0172085DF3D731B20C86915744EA5ACF93A3D9736B853035CE
+4AC8D778A0C94319DED046602D3DF67069AEC517DF85CCADC735CD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch14b 14.00 /PSOwstdutchb newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<1c2b39352b372c11011201132b33292e32273730012c3437011b2b27383a372f332d011c2b393c343730011d> 2207 558 0 7384 -1 s
+<2b372c3437322733292b> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0b0a> 9346 13385 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13267 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13267 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13267 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13267 3 7133 32 s
+wst:dutch14b SF
+<0a0f0d19111514> 1271 1458 0 2055 -1 s
+<00040300070f19160f171000051513130b140e021211140f00081619111514180009> 2055 1458 5 6101 0 s
+<0f100f170f140d0f> 6097 1458 0 6974 -1 s
+wst:dutch12 SF
+<202e2f38> 1271 2005 0 1665 -1 s
+<00382b29392f3433002a2b3829372f282b38002b27292e00342c00392e2b002d3134282731> 1665 2005 6 4842 0 s
+<002934323227332a06312f332b003435392f34333800273b272f312728312b002f3300392e2b00332b39352b372c00353734> 4842 2005 7 9461 0 s
+<41> 9461 2005 0 9531 -1 s
+<2d37273207> 1271 2249 0 1787 -1 s
+<001638382b33392f2731313e05002f39002f38002733002b3d3527332a2b2a003b2b37382f343300342c00392e2b003a38272d2b002f332c34373227392f3433002a2f383531273e2b2a00283e00332b39352b372c003c2e2b33> 1787 2249 14 9531 0 s
+<2f333b34302b2a> 1271 2494 0 1988 -1 s
+<003c2f392e00392e2b00062e003435392f3433002f33002d3134282731002934323227332a00312f332b003435392f34330027372b2707> 1988 2494 10 7076 0 s
+wst:dutch12b SF
+<051513130b140e021211140f0008161911151418000a1b14190b1a> 1271 2928 2 4200 0 s
+wst:dutch12 SF
+<1e> 1271 3311 0 1434 -1 s
+<2b3b2f382f3433> 1426 3311 0 2056 -1 s
+<000a070f00342c00332b39352b372c002f333937342a3a292b2a002b33343a2d2e> 2056 3311 5 5057 0 s
+<00332b3c002c3a3329392f343327312f393e00393400343b2b37373a3300392e2b0016332d312f382e002731352e27282b39> 5057 3311 7 9531 0 s
+<2c3437> 1271 3556 0 1538 -1 s
+<0032332b3234332f29002934323227332a00312f332b003435392f3433003327322b38070017> 1538 3556 6 5270 0 s
+<343700392e2f3800372b2738343305002934323227332a06312f332b003435392f343338003c2b372b003835312f39> 5262 3556 6 9531 0 s
+<2f33> 1271 3801 0 1445 -1 s
+<001e> 1445 3801 1 1660 0 s
+<2b3b2f382f3433000a070f0700202e2f38003835312f3900372b32272f3338002f33001e> 1652 3801 6 4745 0 s
+<2b3b2f382f3433000a07102731352e270700202e2b372b0027372b00393c3400393e352b38> 4737 3801 5 8076 0 s
+<00342c00332b39352b372c00293432> 8076 3801 3 9461 0 s
+<41> 9461 3801 0 9531 -1 s
+<3227332a06312f332b> 1271 4046 0 2296 -1 s
+<003435392f3433380700202e2b3e0027372b0026262d3134282731020027332a002626392b38390638352b292f2c2f290702001334392e00393e352b380027372b> 2296 4046 9 8110 0 s
+<002b33392b372b2a00343300392e2b> 8110 4046 3 9531 0 s
+<3827322b> 1271 4291 0 1736 -1 s
+<002934323227332a00312f332b0500283a3900392e2b3e00323a383900282b00382b35273727392b2a00283e0027002626060602002c343700293437372b293900352737382f332d070018313428273100293432> 1736 4291 15 9461 0 s
+<41> 9461 4291 0 9531 -1 s
+<3227332a> 1271 4536 0 1782 -1 s
+<00312f332b003435392f343338002934322b002c2f37383905002c343131343c2b2a00283e00392b38390638352b292f2c2f290700192c003433313e00392b38390638352b292f2c2f29003435392f3433380027372b003934> 1782 4536 13 9275 0 s
+<00282b> 9275 4536 1 9531 0 s
+<38352b292f2c2f2b2a05> 1271 4781 0 2126 -1 s
+<00392e2b3e00323a383900282b0035372b292b2a2b2a00283e00262606060200343700392e2b00372b383a313938003c2f313100282b003a332a2b2c2f332b2a07> 2126 4781 12 7993 0 s
+wst:dutch12b SF
+<0612150c0b120008161911151418> 1271 5214 1 2674 0 s
+wst:dutch12 SF
+<0627> 1589 5598 0 1871 -1 s
+<382f3f2b38352b29> 2033 5598 0 2764 -1 s
+<202e2f38> 3177 5598 0 3571 -1 s
+<003435392f343300273131343c38003e343a003934002731392b3700392e2b00382b332a0027332a00372b292b2f3b2b00283a2c2c2b370027312f2d33> 3571 5598 11 8825 0 s
+<41> 8825 5598 0 8895 -1 s
+<322b333938> 3177 5843 0 3722 -1 s
+<00343300392e2b00313429273100383e38392b320700142e27332d2f332d00392e2b0027312f2d33322b333900342c00392e2b00283a2c2c2b3738> 3722 5843 10 8895 0 s
+<292733> 3177 6087 0 3491 -1 s
+<002c3437292b00392e2b00383e38392b32003934003a382b002a2f2c2c2b372b3339002934353e2f332d0038292e2b322b3805003c2e2f292e00292733> 3491 6087 10 8895 0 s
+<2e273b2b> 3177 6332 0 3599 -1 s
+<002700322b27383a372728312b002f323527293900343300352b372c3437322733292b0700192c00392e2b0035272d2b00382f3f2b002c3437> 3599 6332 10 8895 0 s
+<392e2b> 3177 6577 0 3467 -1 s
+<00383e38392b32003c2738> 3467 6577 2 4507 0 s
+<000d09100e00283e392b38050027332a003e343a003c2733392b2a00393400352738380035272d2b0027312f2d332b2a> 4507 6577 9 8895 0 s
+<283a2c2c2b3738> 3177 6822 0 3813 -1 s
+<00282b2d2f33332f332d0034330035272d2b0028343a332a27372f2b3805003e343a0029343a312a003a382b0026260627000d09100e0207> 3813 6822 9 8895 0 s
+<202e2b> 3177 7067 0 3537 -1 s
+<003a332f3938002c343700392e2f38003435392f34330027372b003c2e34312b00283e392b38070023152b2c273a313911000f00283e392b3824> 3537 7067 10 8493 0 s
+<0612> 1589 7391 0 1929 -1 s
+<382f3f2b38352b29> 2033 7391 0 2764 -1 s
+<202e2f38> 3177 7391 0 3571 -1 s
+<003435392f3433002f38002f2a2b33392f29273100393400392e2b000627003435392f3433003c2f392e00392e2b002b3d292b35392f343300392e2739> 3571 7391 11 8895 0 s
+<392e2b> 3177 7636 0 3467 -1 s
+<0027312f2d33322b3339380027372b002731392b372b2a002c343700392e2b00372b3234392b00383e38392b3207> 3467 7636 7 7618 0 s
+<0628> 1589 7960 0 1879 -1 s
+<382f3f2b> 2033 7960 0 2369 -1 s
+<202e2f38> 3177 7960 0 3571 -1 s
+<003435392f343300030615191c20161e> 3571 7960 2 5381 0 s
+<22> 5358 7960 0 5520 -1 s
+<121a1f00293432352f3127392f3433003433313e0400382b393800392e2b00382f3f2b00342c> 5497 7960 6 8895 0 s
+<27> 3177 8205 0 3282 -1 s
+<00283a37383900342c00352729302b3938002f33> 3282 8205 4 4921 0 s
+<002700251f201e16121b00392b38390700202e2f380029273300282b003a382b2a00393400403527292b02> 4921 8205 9 8895 0 s
+<392e2b> 3177 8450 0 3467 -1 s
+<00382b332a003727392b003c2e2b3300392e2b372b> 3467 8450 4 5357 0 s
+<002f38003334002c31343c0629343339373431003537343b2f2a2b2a00283e00392e2b00353734> 5357 8450 7 8825 0 s
+<41> 8825 8450 0 8895 -1 s
+<3934293431> 3177 8695 0 3629 -1 s
+<00282b2f332d00322b27383a372b2a07> 3629 8695 2 5166 0 s
+<0629> 1589 9019 0 1859 -1 s
+<233727392b24> 2033 9019 0 2531 -1 s
+<202e2f38> 3177 9019 0 3571 -1 s
+<003435392f3433003c2f313100372b363a2b383900141d21003a392f312f3f27392f34330027332a00382b373b2f292b002a2b3227332a00292731> 3571 9019 9 8825 0 s
+<41> 8825 9019 0 8895 -1 s
+<293a3127392f343338> 3177 9264 0 3989 -1 s
+<002c343700392e2b003134292731> 3989 9264 3 5165 0 s
+<00383e38392b320700192c00392e2b003435392f34332731003727392b0035273727322b392b37002f38> 5165 9264 7 8895 0 s
+<38352b292f2c2f2b2a05> 3177 9509 0 4032 -1 s
+<00332b39352b372c003c2f3131003a382b> 4032 9509 3 5484 0 s
+<00392e2739002f3338392b272a00342c00292731293a3127392f332d00392e2b003727392b002f39> 5484 9509 7 8825 0 s
+<41> 8825 9509 0 8895 -1 s
+<382b312c07> 3177 9754 0 3544 -1 s
+<0017> 3544 9754 1 3756 0 s
+<3437003234372b002f332c34373227392f3433003433> 3748 9754 3 5975 0 s
+<00141d21003a392f312f3f27392f343300322b27383a372b322b333938> 5975 9754 3 8895 0 s
+<3c2f392e> 3177 9999 0 3563 -1 s
+<00332b39352b372c050035312b27382b00293433383a3139001f2b29392f3433000c070023152b2c273a31391100333400141d2100322b27> 3563 9999 9 8825 0 s
+<41> 8825 9999 0 8895 -1 s
+<383a372b322b33393824> 3177 10244 0 4174 -1 s
+<0614> 1589 10568 0 1916 -1 s
+<233727392b24> 2033 10568 0 2531 -1 s
+<202e2f38> 3177 10568 0 3571 -1 s
+<003435392f3433002f38002f2a2b33392f29273100393400392e2b000629003435392f3433003c2f392e00392e2b002b3d292b35392f343300392e2739> 3571 10568 11 8895 0 s
+<2f3900372b363a2b38393800141d21003a392f312f3f27392f3433002c343700392e2b00372b3234392b00383e38392b3207> 3177 10813 7 7660 0 s
+<062a> 1589 11137 0 1882 -1 s
+<202e2f38> 3177 11137 0 3571 -1 s
+<003435392f3433003c2f3131002f3329372b27382b00392e2b00363a2733392f393e00342c002a2b283a2d2d2f332d00343a39353a39> 3571 11137 8 8505 0 s
+<002a2f38> 8505 11137 1 8825 0 s
+<41> 8825 11137 0 8895 -1 s
+<3531273e2b2a> 3177 11382 0 3772 -1 s
+<002a3a372f332d002700392b38390700192c002a2b283a2d2d2f332d002f3800382b39002e2f2d2e002b33343a2d2e05002f390032273e002e273b2b> 3772 11382 12 8895 0 s
+<27> 3177 11627 0 3282 -1 s
+<00322b27383a372728312b> 3282 11627 1 4399 0 s
+<002f323527293900343300352b372c3437322733292b0700152b283a2d2d2f332d002f332c34373227392f3433> 4399 11627 5 8895 0 s
+<2c3437> 3177 11871 0 3444 -1 s
+<00392e2b00313429273100383e38392b320003392e2b0034332b00373a33332f332d00332b39352b372c04002f380035372f33392b2a0039340038392a343a3907> 3444 11871 11 8895 0 s
+<152b283a2d2d2f332d> 3177 12116 0 4165 -1 s
+<002f332c34373227392f3433002c343700392e2b00372b3234392b00383e38392b320003392e2b0034332b00373a33332f332d> 4165 12116 8 8895 0 s
+<332b39382b373b2b3704> 3177 12361 0 4097 -1 s
+<002f3800382b333900393400392e2b002c2f312b000839323508332b39352b372c072a2b283a2d0023152b2c273a313911003334002a2b> 4097 12361 9 8825 0 s
+<41> 8825 12361 0 8895 -1 s
+<283a2d2d2f332d24> 3177 12606 0 3958 -1 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (22) 22
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0034 put
+dup 3 /C0039 put
+dup 4 /C0040 put
+dup 5 /C0041 put
+dup 6 /C0044 put
+dup 7 /C0045 put
+dup 8 /C0046 put
+dup 9 /C0047 put
+dup 10 /C0048 put
+dup 11 /C0049 put
+dup 12 /C0050 put
+dup 13 /C0051 put
+dup 14 /C0052 put
+dup 15 /C0054 put
+dup 16 /C0057 put
+dup 17 /C0058 put
+dup 18 /C0065 put
+dup 19 /C0066 put
+dup 20 /C0067 put
+dup 21 /C0068 put
+dup 22 /C0071 put
+dup 23 /C0072 put
+dup 24 /C0073 put
+dup 25 /C0075 put
+dup 26 /C0077 put
+dup 27 /C0078 put
+dup 28 /C0079 put
+dup 29 /C0080 put
+dup 30 /C0083 put
+dup 31 /C0084 put
+dup 32 /C0085 put
+dup 33 /C0087 put
+dup 34 /C0088 put
+dup 35 /C0089 put
+dup 36 /C0091 put
+dup 37 /C0093 put
+dup 38 /C0096 put
+dup 39 /C0097 put
+dup 40 /C0098 put
+dup 41 /C0099 put
+dup 42 /C0100 put
+dup 43 /C0101 put
+dup 44 /C0102 put
+dup 45 /C0103 put
+dup 46 /C0104 put
+dup 47 /C0105 put
+dup 48 /C0106 put
+dup 49 /C0107 put
+dup 50 /C0108 put
+dup 51 /C0109 put
+dup 52 /C0110 put
+dup 53 /C0111 put
+dup 54 /C0112 put
+dup 55 /C0113 put
+dup 56 /C0114 put
+dup 57 /C0115 put
+dup 58 /C0116 put
+dup 59 /C0117 put
+dup 60 /C0118 put
+dup 61 /C0119 put
+dup 62 /C0120 put
+dup 63 /C0121 put
+dup 64 /C0122 put
+dup 65 /C0124 put
+dup 66 /C0262 put
+readonly def
+/FontBBox [-50 -256 978 764] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842242D2C7C52988A16D3AD63FA0A6A531F598
+82C7FDFCF9F77A295F11CFFB
+5B12FD403323523254
+4E86BA9F
+872D4E5538407B54B82E4D287BF3
+AC834D9BC0FD6BFC81BB715ABB4BBD607B01EC7BC65255207A5A1FEB4F62003E77C881F998D36FEAC8F869D9B0BA2345695CE363794847517F8684AF2969A272643B83A4D48A7A4C21A800388C7BA473EE8624FA022F342D4954637BDD0F96619BDC2394687B3C
+911BDF29
+075739A4F1B7FC51C345CC50FE
+6111CCB4582232183D658CB8E2CA78EF520D16202978DF7E19F6A23EE7A86010E4ED7555C0DCD97826F4DC8361AD8068AF2FA17B72AFBA70
+798278F3
+C43AAD10FD475C424242768A1B
+BDEB38414BD766779C2FD0C1C98CA4997E820D2A0EE39CECC13ADA3A7FC1E5CD7ED93960F65EDBA1DC4CBBA11465B99A6AA72328021CA48415F509E76F3DF42D
+29FDBF54
+81B7B4A560DA8A0E7A1865E2E3
+FBAD3BBCB6F93777B667359AA58239628EA9A29AAA38E90462DDCF2E3D2CBA1D5B1CD116C9CAED14717F0E2C4CE37126384C9CC571C2E2E90E39D657601A27
+E9804116
+C0356D31019D75B5339C3433A8
+52EB0B3EE7696889C59830C648CE51033B1A11DCBF77695133F3CFB252E44E5B84C03BB31D268E3A7F7B989A41573BA5D74A20A80E040623F8
+B27C9256
+648B6280563776221906080262
+C0D9BE2C0081DE170BA67BD08E6E47729DADEB3B3770F7
+FA0713F8
+6C2B95408D02E260808F038485
+EE701DFED5984C8F2E7CB896DEA448E16FEA8E5E9924CA93537C0C08624D8B
+5D048C2B
+11D4896EB3FC414DBE338A8928
+39466E317B3CFAD65BAA16AD3D5BCA55A6DBAA9F7E6203686F7F6CE5
+6861879A
+3B06F633BE54713E3EAB47D4BF
+85FFA62345E9D70266A11A63F5645E8BCA73B2DE7DD1B8FBF08986B7805CC6B57C45B3499ED1C59B1D21B384055E36220BEF137B5F140D574BDBFAFCB5B1982C338062C9C5577DA54384
+9D51D801
+F5422359CCB5389A29C4949E9D
+7C1D19CF49811A6234807A4354DB629C6478C1ABFF7C0B7E221284C96182F22C9222C4EDAE112D91A93F78F771AFA22D5A3A7AEEED8E93573474A4B65F53C3
+3C6758D1
+8E86E9AE6AA4A6FAF17356D0AD
+0FBAF2577D573C91E9C0D331A999B39EF5DF9DBAD6E5CA8F27C0BB8EE76C013596A7D67477F3F3762BEFDEBB8DF47700517D280FE93072014AC3AA020B553E63394C3153127CBEC1C9152719E8AC3ADF98B828AA0825C15FB45B
+EB376AC3
+202C2C4C2F9BDF30C422CFB01F22
+A944EF21597D2F37E98AF8365EFE798EE7AA5FD1F07161EB130BCA0247161C7AC7940706A4BFF010858F4756485E89975DA60687AAE37885D76E3D5775311A1ED1A1BF32E45C6FE3941B88361E4501F3278670297C3596EF28E8123CE2A1F05936CE649A193BFB87C2786A3BD1A2BE
+5888E959
+2E283327E3949BED13FD3262B7
+11994EE72E9FD292B11211CDFE8A3D47D0C606CE8FB0EA1ACE9A8C6BFD69825D6234FF44A5FB94B693291753BDD9143B4FC3FDDA8B38BF99F35B
+185C961A
+CF3584E201C8E6330D3CB7150B5C
+009A6DEF7A1798DD421DAEA117D88EA2622020CFB3366C171BC48CB6CD5244FBEFF18DFF9876C002CE86CF00AE0FB46081EBB947AE3A5E411BCBE01D56A43A63DE0E7288466E68C98DF9F5CC6D55E361E8BA69266DAA2A75353380B30E5C4087E8992EF8
+34F7A925
+C1476C2B61755F37A140DBD4BD58
+CD7D2FE4F7BE9FB4845EA407FE0977E559F684ACDB4D48338A7A7A78D0CA555C50C96358CA8BDE523C56C5733F94AC0C6B5866555857787B3D121B766EABAD936E3501347BDE7FCD6CE43575E86540C6D9DD9B0EB0F2009F5C636672315E980D482674189A
+9CD8C4DC
+FEA03AAE88F8DC5F2677D5CC84
+335A776E1C5F70A0E66DCFB5800FDB0274C5D41144EE73EA73606C53FAE3F22F3AE1508F49E53FAFA089B2682F57F52BBB0AF51114F2
+67AB0EFF
+90D2E8F0744BB8D1A8806C19B7E9
+E550F096A72E2D520B345B2460188F64C4F99B4EC8EC1D0735A2E22126471E710DD66BA8D88CFFF0035A109184C68AA65B99A2ECF8D3D634A14523164572B3E846C4DEE79EACF80EFAE7922143DD3B0CE0C8194FDD3C5ED98D16BF95D9889AD621B31FD91D5FE1DB37EE47BA4B55DC0E3A1306
+4F5ACB1B
+BF434B752E02C7118332481BEAB5
+4023EDD9132B6A22E40C671C0A492DBC33F02DBEB93EB6F371939EBEFE813FA4ADC1E5D2E82146176CDFA7049AF5F9373FBBF90E6DE5E0D2C74287EB5163E213B9076260758819ACF46900E8EFF0ECB8AC1914D23BE2B7784E77A2C58B862754869BD079C118A9475DDE6D055222F53F596C628096E562D981927616E1B4
+6970
+6B
+726887E9
+A5CFA0EDAE77BD707148574CCF
+9343ADDABA5DC42D6FF64F0384642BA89424811D21AF3E100A7BB2CD298CCA48FD54D0FF5CC6138458975124E4755DC9FE6C951BF3FECCD49BF83B31FC5B04FB56265FA93CD5856DAAC3299C9D15D1978525738F3748EA8D5BF3763CAD9AF26C01
+B5D85850
+D9801C5293EF04369946A7C7BA
+03C39E2BF1338B8F96B50FC0E9CEDE05A65D2B38A1CFF07D1243E4D1CD4683A724FB0C5CA02778BAB065F4DD627102BCF3E1DBD69E050CFF80181F0CE753A473574E896B8A4EA87C44220271B1D767AAF38CB3E167FBFF28902215F7DC4B79D26563FE
+C9458203
+DDF7864662E0FA7A9F4D70145D46
+7EDCC008E40681B82584FDEB18ADD74631019AB3ED519F8E124B7CE82C236ABEE86C12942B0D62B1A9F58B0CA6B4BDEC39492674FA67D947968768CF120C0A1DDA0D4B27137BE09F771C3A88DAFDEF22B915B760C197D00F16D5A88447379329D5C97BEC3808588F8CA285CB39BDD665722D7D3C685B60772C0A
+D2A6F765
+B03934EC9C9F8106E80D7673C78E
+33FB53B8A0DC2D2AC19565507F822B2FEA2840FBB6F164836C99411E5316BCE90DC7A83FAB5339E03ED2EC2C248E41556E1E280BF2DAA1318D73A4FAC6A6A76FC63956E11713AA7441CDAC2194EDA75D5AA852F3003BE0876C99DF7592D56D29522D9B27A434734E1BD3513FEA6628A5FF336562AA2FC77627F6904F5FBE
+98EE
+E11A277A39FF1A649249FF
+F503E7E4
+9810B3DBEFBF5228B46B2C0288
+64FE51368196762805F7BFDDBBDB7F28B603DB63C6F71119EDEDAC87B09CF30D1B6B8C2CCE1F463CC865BC934EB3DABBDBD2270B08359E8AE98C4C
+E5338C3B
+CF6F3755E8FCCFF9EABF24002360
+5ED2F848479B20954D8BF678CED1B72009CE58BC43B69A837DA686EBF60A0ED59278D6049200C9621BD6AC4280C87AAC345120854B364052100FAC4DDA6C1DFFBB8BA13A4D65B39C717DF8A8A6A20194E8F99E939334C0065E2CA380EC0337B09FD84BEF3F7D7350E360B8FFC83D40EE9026FF18D05B31413A1DB26E5CA9
+05E4
+A63C4F22E5AA6C056990EA53EA17C3760F09F9B2F6A2331394903B75AF10E5
+E9CD4B0A
+4F7D2B7F93071E5E4E8030B571D1
+DE58FC6F85C7381BBFF5C16FB8E905558832C67F41EFF91F2BAA70EB1A260339A128400EB5E4695FB72FF6D35514309A4EEDD868F70EC47525BCDB58CDB50548B04F114384B997DE739690C676A1C6B7CC353FAEFDC655B449173F336FE44CF9F6878D5398769F28149A0D7A01AA82
+3B1E4373
+62882A87851D3FD398A20DD499
+5A622BAF6A17F465A172F011004B308ECB6D050A24812186A0B48BE51942B3198E148DD0CB2A1000F972D426A2DD5F8B7D976DF0AA29D054E6EB0E886FAB365FFBECBA357D0677849588611CF82EAB4CBC9C9A9B7E8504DDA343C841
+781B9DDD
+80DDD32AF76AE31EA692B9C46D
+B5891C5BF988A1D9E9F54C26D18F0C17CB66E27DC60A8158BAC25E6A3188F6942D98C2E93B08E57127E8C728D743AB9402A7EAA1B223678ED65CA7E8D170170226BF711B298E585DD3A86CFEA60E52CC15605D
+584944CE
+91F616F508F21C5BA3FE5442EBD1
+557B0BBD4EDAB8FD6502F113091C39CB1A739A32991154AB215AD4B147E9C7AD0D1E59FEA4E24181CBC533D7B2B4BAF5CC7591AD55268908CB04F16F3582BE6B34E39443F22FB525EE0E7380CE3DC1F4C2664293E4F535CA8BB80AEA20670F7AD18C0866400C336D275E
+00E6C901
+51EC0FFB13B3724DC6E80EEEAC5B
+338AB828D8CDEA55BFFDC08874A3F9DF2AD19F599E238BC9553E67803AC576FE2D17205BA3D5AE930EF7898F41EC4C7D7C382E6D9FF37CEA3F92E49E05D7FD2F531C1339CA0E9FAF8841EE24551E53EA1108BA9DC7898C55825375C8A054BC4361AEF03CA5299A768E64B369252F4DE908727ED0293ACCB34DEA3C3D47F5
+651A
+6117E2
+BBBF2DC2
+9F981AD607237983841BF75188
+06C6D29505EE27B191ECADE6A26F8254E6C755CD6C17F406C00FCBDA9EC4C7713BE56861DFB46E77C2CABDBDACC0C358832AD4FBE35A425D7C490215DA1E87A85B6431AA71FE762173E748C29E7121D0B2
+41ECF0F6
+9972EF9CC0C9F818CEE97CF2B7AD
+52EE40313115EEA5A529CDE737BE4699D262C1F9BE07C2537A1FF2CDA84C53791F14B90160D11D30CAB3FF276672372D8E195C0ACC8121DCE5D68B012868020276F88B4BF12B0D4DFF583282E9BBA74DE176CF78748D8FBCE4134C33CA4E44B35DBE75B2
+C91089D7
+B8F6F1C6A817E44E41C6D6D521E9
+D0A70DB93F73BF560157D2D3EAFAF450EBCB990BF663D5E195BEDA0F71C2F5DBEBBE038650D75CCB62CA6569F6E37EC6F3BE08FD59E4245EB03809DC7244AC9820CF8F83849A242B57150891951EFC4F8F1BEEE5C55E6CD916C4F439CEBFAA8AB8125693350FBBAB2F5A95C3979C81F1FB41FE819D16FFFF553291AB869C
+98AA
+CAC049B9F4794617E39334E72454F6BE
+EEE9A04B
+FAB99233EF7097C85E9B90EF6C92
+7B65657FB9C159410C45DBC4F84E806D1F75190E58DFF35E456CCD744C4AD5C13D56AA476E19F8C2987F51E64755EB143514BD594B8198CA552DD32471B7D28F2CFF7604768D2EA09B8E3C0FD96E244380D449C005AC860BA1D0BED90CA401325C29259310A1CA633BC3BC4D95162849D9B55D01A446D145E573D61CA3FD
+5A38
+79C798037EF1E6FA873E45E37A84277ED45224DE9778358AC5D4EE0893E4D847AF11C2169C285C
+E5A3F241
+7F0CC62385BA40CD1EC77CFA2FC6
+D465F9F7044CB643DFDACC6A11F4878F10C7CC4C726B2EA92D5BCFC06D0361AF92C23234F5C83D5814CAA3C268881FF8297B499368B1B95C76EB12C555A2F0B9E0109BB40A5D7A2BF5BBA9750CC2F525541BA4F8B121C3BEF28D07C2BCCB46F0630938180A249E69877AD6ECFA4AE87A617852
+CE8FF460
+3968E62D8C2FC9AEB7FA618171
+6DAEF1BF5ABA3F17AAE8CD800C1FF37A1E83F6F9B4A7B979BBD3F36F5F54690CE36D261F3DFCC8160963
+94FA224C
+64FD903F32E9741C2090DC1D98
+7F2D63012A20EB3C57993DB422729059892DBA81F7A4EEB6E2C59AE3734DE8B5C3D77CAB7CD464DF3F2D69EC
+A194009C
+DB7666092F8B781EDB3141B1ED
+A0E6FFD166373217FB5AD4E6E23C7712D78E2886E4DF2ED7A43DE12314B790747F9EE699E9AFB4175664AFA073A4FD67E9B7B54DCC31E2711478
+C1CEF56D
+73A2A13BCA995F1021D9A97AAAE9
+56C340D405A59633F4387A7A16F48D562660A76CA92CB357077C8860FF77CFFBE980104FE5E1CF729F02AE6EDE8E955C5535FA234DEEE16DC6C72340D1E5DC3F7F3722947D274B121E9C8F69D4F96D49A3B8CFA1AC704034BF20DF073B74787B335D42AC7DA97025F12F540F6724FCD75DE0FBDFBA0AC1FD51D2856935DB
+900D
+AC9900
+AF4CE2BE
+876660AEE0CF08B9410670E527
+BC95332D9302518567D85B9890E0A8F80BE435D10646698BB8DC95C0EFEDA8105600585FA623285E9DA053BC141350CF9C0B277E974848F74660426F110D259746024037ACC9307718668E9D7BF249BB9421AC1F99B36806
+925091E2
+2065DE89EC10FAF9E2D7BC788E
+ABD2A745375D39D74694D693FC47D38E6661A7A0364C9EC629A7FB2DC084494FE6445DABB812AB18FE7E5E967AFF633F837D588E5A765D08B9D613715542E38832E599FA93F7F03D08AB249815CC69E39960
+7FB1C74C
+7F11047043093BB77C5C76B26B23
+63262545CAEB804F58F9CB2901453B3A9869B24D6957848BCB56A1AC730D7F17B0CC0CB782EB67E1DD76A5FDBFE1674F30793B349EFF23DDA0771B9A5AC8366A3BE0A9D88FB8E64C47A8493CDE8CB1C4A6F7349EE46883507057AFCB89D634600B60D33C63049593608A2C7CF91E
+47E982E2
+9C4D51E0B5CC34566566C4A23F
+3F497403DE753C3EC8B3831C4EAC3F886246C785D25CA028955879B18371F919E4FE74B85030E1483F607089A3D69F43FE6A5CF0576CA4E5A53492F6A97A247670493C09A2A002336A8A69BA61EA3A0803E74662D8BCB79373
+86F0DC59
+8543B314FA64A02C5E147D08F2
+5BBF3EDDAC1A101D781724190D155967B0498B678D3A9673E89B6514EBF12598C4E58DD441CA6C92FBE6A70F4E65D8F2104E1E692C85890904042D2180D3170AEDE0976CB51AFC1AF521F8F93BA70E87A926A623F7E2B74D5981415F
+FCA93D01
+094DEDF13DB9E3D4B4D9A8EF33DE
+988FD370E13A7237F88D87707061FEDF019AA4EA1063A460907324F7F5668ECE2BFBE0CB038B73CB230BBDBFB6E4CD7364D9AE20C62C54B724E0BB5C72356AD985B0CF4B4E116F0712FAD1498B94EDE92BF50535FC733F1B0261F056BD827A45B1E5C1038C32C453BBACFC43FF77B50AD0A0A70DF41B9D036EEFD0601BD9
+4223
+9A59BF3AB889268EE3763C4B952D37486DEA2A0A490FE8F9FE7E958573BA9CB9B848891D975FF38F029FFD80DFAF50
+C1AE83C8
+A15C2BA996A9DA4E06E007FFC5DB
+8427CF5628612FD59DEDFF8C7F7ED0901BAFF98B626DB68F3BB00B6B9083CE53DB9DEFE8B15F1A762E0841372F8B56420FB07B4CE3FAE5D772D1ADD91B4EFDE7B13754FA4A43B104CFB15C2FD49F323EC279948FF13258C21429387FD1BC38E900DE6F929C8593B2CDDAAD699E
+5855AF4A
+35525F0B38EB550EDD65A8FC80
+69D4D1F60B0919BB2DC20E0309726F9FF9500A42CBF812D004D1C952875D336A86A7A6F5132BB932555F24F45F93EED4DDB4BD754161FAEE7BED6FA924F717C30E1858FC05962B6406489BAF843220A1
+9F5BFB9A
+39D3E078F996B1012B6F42B859
+B9EB3AC67D816B9FAEE23CC3C51CF375EFFB14E1F7A7E7B3E9E896C95A31B14170A76625E3E945EA7E3C9FC478C83644F97FD062F64F8E31791BA6857D2ED4F0061C9D72436F085FCCCE82901FBA8BB84EC11773D7A3D7320BA369FB48511744359DAE
+BC7E7CDB
+36866283588DF430D7E850338773
+13FF557283CB22A5E05C92F4A51B43D163B50645C41D06D557A34D15B6ECE48B574239711FA605C8AAB699176C3F754D76B29E85B21D16CEA74A96617A72E96C6C6B7B40ECF220446495E96C68E6ACE570D02017D802E48446878DCEA892A7C090DA66A5A36D2814842C3BDADD9C833FF6A0121316EE197864A651EFB233
+B04D
+96B4AC212098DF2CEA152AE5A2AA78B5D4C01F65D2E43654F0F7CF40E451E42AD2BAFF
+4F6CC450
+39C11CC4456097611525C9DA4B
+0B2A389C8C7D5305FECDB17FF2F7C3D04370915BC40B66E61C236A299C65C14A4BC329645DDF578F9C4058D4762206EE1286711F8528
+CCC4AF06
+D7BB683088FC76650CBB2AC7033A
+D78319D017E36523096FB92DDC66F849E1105409327276D08BC6F44C6BE27BA5AB5BB8C38F532D7EBBC034FFFC6CE8C2CFF8B8F186B35C8E38AAAF4B023C004F260A10D95CCD5A08F838CB631CD61317096EA7EFA7F54A3F6BA9D66DDDD079F541CA9565ECEDC189A651BCCD9F9212302C60FD4FD731B3CBA3A8AC4B6919
+9DFD
+BB09BC6D593F47F606A8ABCD476736F7AB6DA3C1D4461539D152BE3E32FBD1
+11752560
+2E36DC7BB9D40B2404EAEF60BA44
+3FE0DFE368FC6F2EEE5293EA3EB11D6E0460A31B1B3F742C28A9AD3294DC9186CE3EE682697A1CED8471EBED33BCB4EF5A1DE7E6128D0CDB554D3A006FA85366C9D48C1EBA3E8919DFF7341681860B5A8F66BEF0D5E17F67C81B7501AB4BC71CA0B1B2CA7624BBB45BF7E5D6
+604ACA47
+72E5A3B4F1A9123B2DE33707E0
+68070B1F5B211BE59BA1EE59978390C9CF039ED585327D5C70F7208ABDBDCA36B548F41AC17C728AAA8D6A107D3B721144E2B97C0E2E2E29BC74FB2CD9952F2FB5053F180D6A
+CE31322D
+1EAC50CED4C19988C9D12E70DC54
+A2A26B1DE67FC581D40D2449B762A146717917B21E52DB7FCA62EBD25191E096C5A9CB260AE8DB603E42856C6BBDF89AF67A5ACA1AC86BAEC88C3D7750F20692FC629BA942E20203E4B1657DF601B978D3AE9A88398B0D5D6553B3148D31195B1F5D6E7BA7122310C65D08B88E03307011E49508C8A91B
+15F8CE31
+2FD4CE94B5AFEE66571D5024C51C
+A1FDABFFC73FBE06AE9C00C7048835CDAFA0AF74636CDB89FB65AFA600E94DA0A88B9B5B86DD1936593A9BEE486B6ED2FF5D26D231FBA397A3C9058DF68E12B38364E5EADC90FF250AEDCB4095C5441D45DC2E76FB3EAB6F844EBE718F300CF78ECF7F0FDB61D13BA8ED
+64E2CE85
+E37716DCFE66B8466320D581E9
+F3F68DC65E0D1A73479AD25E5446C1CE0B0B6906327503E7E2C2D559274FAF8900B02AD745F42CACECA406EB7D97C1016227E1E5833467F281899F0239E2722B4AFCC117716C63B0BECB28A73AF79EE49575E79764C77B
+A905CABF
+94CC5B697C39A76937EB31440CA2
+2DBF82503228696D06E1CED0C932BFF722208B9389276FCFE37EEC47F6A1C8481D17F1BB095E6B5B4642259FF2AD3BF8AB8151F41E5D97EF729911D4894CBF1175E9AEBF848B47FC338DF1347E2A829E09B129DC3CC07F6593505CD2E5B4861769628B0A3E5AFEB0D20C7B4EC6189C59888EDAB20FADC94E5F9F7897
+9D2132C6
+E666621386A75F2D61E46CC1E5
+7DD4B2A8293CDAAEB074552E7E07D39FDF505D84B89B834899E54A3052EF6ABEC82D782D3D4FE3C5D88AFAA1B366740DE4B6672E17DCB1A3EB4A99FDE01887B4F6FEE8F2BD
+06754600
+BEC7F7E8FF4DA4BD610EB176E7
+3C609F8D9D6A48036992D1A2C03F137098F63C775493551B195F56ACBD06027C754A23F7AB9DFF96DBE7B79C36ABF6A269B68A41C2D6BA2E1841AAC7AB52A153A5B0E1E3FE014C09FBD037D5133CD129A51E6B4C6FB3D84A3CFB0A54F18A13D5C5B9
+1810D233
+4F0AA8064A0EBCB9CA0882E920
+EB1C184DDE5CC71DF42EC5D15D0382B9591F410198D44437F38543890575DA02FA57B8DC35783CF2D5309C5947D8898CB699B1A5D0606410C6637766AE9302C925BABF1E382B5D6B32274F5638BE9386DEF7F9038EBCB49315
+467D9A8C
+CAF4E5B41D4C2B6514D891C6F3D2
+1FBBAAD07627DDC3F14237BB407D2859CD5C8050AE95A3E5BDE042B1FE4FE65F8C2EA13CEB8D637491C7DA65CC09863D9A05A8089FEFA5E7236F113D890298AC82C7F9BC106D7FE7C634F3ABF1C0D4230733533C6FD4D416A51E354B4B1F5B00C576A9BF5183A81D1948FF948899F7F87DAEFB937FFA55036046078CD553
+8A71
+B9D6A5EB2028DC1B7485A60764EF
+A80902E3
+8770FE119B5192ED357A58F79507
+103371193740C65611E612A4DA3B5C2FE099C453E74C620542521FDFB91197B72DE42412ECB4EEFD23F615393D987E27ABC52B02C09F07AAFC75B38F10668892BA1A8A352DF6E098883E6A102DFB574F96D2408B6076BA628EC44F0ABAD2244D438CA7AF8C8A7A91D6510C68114F847DE64755571BC64379AA76F5F09F34
+099B
+5B64541B67C46C1C4AC832015833A59724EFBC08285F443E9D
+BE768332
+797F41344E9C04CBDC307256D189
+48A1809D53BC96AEBE5BDB265DCC1516FE3F799CB62F815ADADAD07BB3C5E2E93AAB7F83399829E09428F16D3B584383E427C7ED66D142A59B9E15BDB0E043FA0F20CB1B7B9D4242472DA4B6A9AF56DEEFD1FD9604DEE0E7705BD9F3E6678580C2ABBB544329D730A375C130A23E3DF603FA8289E4F275A6A705C6D7094D
+3843
+2FD5EE18
+56D59B448D32F974B5350F8194
+910480F06E4FFCFA5A3EAAA96E371AE29657AD0BA992740B0FA3604F19FA80D6FC5420F4FF66B7C16EAF5301C65CC4DC6FA18AD8B60E05053242BA674E475F
+741D9A80
+95ECCC1880AE59BAF60014433A
+1D8E062DAE9AE11781E657E182E6C8ACD612EC1FFF4620
+D2C8DB76
+340F2F5AEED5D7CA16B6B5FA34
+108CE615A053C252F54A36E40C455E9E924CDB5283FA
+D3869002
+AF4AB03B5BF338CA186FE7C32A29
+313EAAB8C9D787C7
+CE6F3CA7
+3615E4BDD0A24BFD6228570303F4A352DDD2E93EB0C82F59225E7D4A61ACAE1CCEFA
+024038216BD6216B55C577FF830253810D869A188658DBA9EF87B6CFBA0BBCACD165E39107E5
+AD24431795E02389131C89FF7A0F7E2A4C0D2D45C166371D521FE1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+/wst:dutch9.5 9.50 /PSOwstdutch newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<1b2b3a362b382c11011201132b34292e33273831012c3538011a2b27393b382f342d011b2b3a3d353831011d> 2207 558 0 7384 -1 s
+<2b382c3538332734292b> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0c0c> 9346 13300 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13280 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13280 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13280 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13280 3 7133 32 s
+wst:dutch12 SF
+<072c> 1589 1431 0 1836 -1 s
+<161a192d3331> 2033 1431 0 2950 -1 s
+<1f2e2f39> 3177 1431 0 3571 -1 s
+<0035363a2f35340029273400282b003b392b2a003a3500292e27342d2b003a2e2b003b342f3a3900352c00332b27393b382b002c3538> 3571 1431 11 8248 0 s
+<00393a382b2733> 8248 1431 1 8895 0 s
+<3a2b393a3908> 3177 1676 0 3635 -1 s
+<001f2e2b0026261602060026261a02060027342a> 3635 1676 4 5389 0 s
+<00262619020027382d3b332b343a39003d2f323200392b3a003a2e2b00353b3a363b3a003b342f3a39> 5389 1676 7 8895 0 s
+<3a35000c> 3177 1921 1 3509 0 s
+wst:dutch9.5 SF
+<0d> 3509 1853 0 3593 -1 s
+<0a> 3593 1853 0 3677 -1 s
+wst:dutch12 SF
+<06000c> 3677 1921 1 3877 0 s
+wst:dutch9.5 SF
+<0c> 3877 1853 0 3961 -1 s
+<0a> 3961 1853 0 4045 -1 s
+wst:dutch12 SF
+<060027342a000c> 4045 1921 2 4623 0 s
+wst:dutch9.5 SF
+<0b> 4623 1853 0 4707 -1 s
+<0a> 4707 1853 0 4791 -1 s
+wst:dutch12 SF
+<00283f3a2b39093900382b39362b293a2f3c2b323f08001f2e2b0026262d0206002626330206> 4791 1921 5 7866 0 s
+<0027342a0026263102002738> 7866 1921 3 8825 0 s
+<42> 8825 1921 0 8895 -1 s
+<2d3b332b343a39> 3177 2166 0 3941 -1 s
+<003d2f323200392b3a003a2e2b00353b3a363b3a003b342f3a39003a35000b0a> 3941 2166 7 6488 0 s
+wst:dutch9.5 SF
+<10> 6488 2098 0 6572 -1 s
+wst:dutch12 SF
+<06000b0a> 6572 2166 1 6872 0 s
+wst:dutch9.5 SF
+<0f> 6872 2098 0 6956 -1 s
+wst:dutch12 SF
+<060027342a000b0a> 6956 2166 2 7629 0 s
+wst:dutch9.5 SF
+<0d> 7629 2098 0 7713 -1 s
+wst:dutch12 SF
+<00282f3a39093900382b39362b29> 7713 2166 2 8825 0 s
+<42> 8825 2166 0 8895 -1 s
+<3a2f3c2b323f08> 3177 2411 0 3711 -1 s
+<0024152b2c273b323a1100330007000b0a> 3711 2411 4 5307 0 s
+wst:dutch9.5 SF
+<0f> 5307 2343 0 5391 -1 s
+wst:dutch12 SF
+<00282f3a3909390525> 5391 2411 1 6054 0 s
+<072e> 1589 2757 0 1882 -1 s
+<1f2e2f390035363a2f35340029273b392b3900342b3a362b382c003a35002a2f393632273f002f3a39003b39272d2b00393a382f342d0027342a002b3e2f3a08> 3177 2757 10 8691 0 s
+<0717> 1589 3104 0 1940 -1 s
+<382b33353a2b2e35393a> 2033 3104 0 3065 -1 s
+<1f2e2f39> 3177 3104 0 3571 -1 s
+<0035363a2f3534> 3571 3104 1 4214 0 s
+<00392b3a39003a2e2b003427332b00352c003a2e2b00382b33353a2b00393f393a2b330800183a0029273400282b0039362b292f> 4214 3104 11 8825 0 s
+<42> 8825 3104 0 8895 -1 s
+<2c2f2b2a> 3177 3349 0 3526 -1 s
+<002739002b2f3a2e2b380027002e35393a3427332b00042b082d08002c353508282738082827400500353800273400181d00272a2a382b393900042b082d08> 3526 3349 11 8895 0 s
+<0b080c080d080e0508> 3177 3594 0 3894 -1 s
+<0024152b2c273b323a110032352927322e35393a25> 3894 3594 2 5702 0 s
+<0732> 1589 3940 0 1824 -1 s
+<3a2b393a322b34> 2033 3940 0 2636 -1 s
+<21> 3177 3940 0 3386 -1 s
+<2f3a2e> 3378 3940 0 3621 -1 s
+<003a2e2f390035363a2f3534003f353b00292734002935343a383532003a2e2b00322b342d3a2e00352c003a2e2b003a2b393a0800182c003f353b0039362b29> 3621 3940 13 8825 0 s
+<42> 8825 3940 0 8895 -1 s
+<2f2c3f> 3177 4185 0 3400 -1 s
+<0027003635392f3a2f3c2b003c27323b2b002c3538003a2b393a322b3406003a2e2b003a2b393a003d2f323200383b34002c353800003a2e273a003327343f00392b> 3400 4185 14 8825 0 s
+<42> 8825 4185 0 8895 -1 s
+<2935342a3908> 3177 4430 0 3752 -1 s
+<00182c003f353b0039362b292f2c3f002700342b2d273a2f3c2b003c27323b2b06003a2e2b003a2b393a003d2f323200383b34002c3538003a2e273a> 3752 4430 12 8895 0 s
+<3327343f> 3177 4675 0 3667 -1 s
+<003a3827343927293a2f353439002c3538002700382b373b2b393a09382b39363534392b003a2b393a06003538> 3667 4675 6 7468 0 s
+<003a2e273a003327343f00283f3a2b39> 7468 4675 3 8895 0 s
+<2c3538> 3177 4920 0 3444 -1 s
+<002700393a382b2733003a2b393a08001e35332b003a2b393a3900292734003534323f> 3444 4920 7 6541 0 s
+<00282b003a2f332b2a080024152b2c273b323a11000b0a00392b> 6541 4920 5 8825 0 s
+<42> 8825 4920 0 8895 -1 s
+<2935342a3925> 3177 5165 0 3768 -1 s
+<0734> 1589 5511 0 1882 -1 s
+<3c27323b2b> 2033 5511 0 2513 -1 s
+<1f2e2b> 3177 5511 0 3537 -1 s
+<003c27323b2b00362739392b2a072f34003d2f323200282b003b392b2a002739003a2e2b00343b33282b3800352c00141d200339002f34003a2e2b> 3537 5511 12 8895 0 s
+<393f393a2b33> 3177 5756 0 3782 -1 s
+<002c3538003a2e2b00363b383635392b3900352c00141d20003b3a2f322f40273a2f353408001f2e2f39002f3900382b373b2f382b2a002c3538> 3782 5756 10 8895 0 s
+<1a1d> 3177 6001 0 3506 -1 s
+<00393f393a2b3339003d2e2b382b00342b3a362b382c0029273434353a002a2b3a2b38332f342b003a2e2b00343b33282b3800352c0036383529> 3506 6001 9 8825 0 s
+<42> 8825 6001 0 8895 -1 s
+<2b3939353839> 3177 6246 0 3722 -1 s
+<003638352d38273333273a2f292732323f0800183a002f390034353a00342b2b2a2b2a00353400171d072022000b0a082208> 3722 6246 8 8444 0 s
+<0024152b> 8444 6246 1 8825 0 s
+<42> 8825 6246 0 8895 -1 s
+<2c273b323a11> 3177 6491 0 3653 -1 s
+<000b00363835292b3939353825> 3653 6491 2 4804 0 s
+<0735> 1589 6837 0 1882 -1 s
+<392f402b39362b29> 2033 6837 0 2764 -1 s
+<1f2e2b> 3177 6837 0 3537 -1 s
+<003c27323b2b00362739392b2a003d2f3a2e003a2e2f390035363a2f3534003d2f323200282b003b392b2a00273900273400352c2c392b3a002c383533> 3537 6837 12 8895 0 s
+<3a2e2b> 3177 7082 0 3467 -1 s
+<0027322f2d34332b343a0039362b292f2c2f2b2a003d2f3a2e003a2e2b0007270035363a2f3534080021> 3467 7082 7 7288 0 s
+<2f3a2e003a2e2f390035363a2f3534003f353b> 7280 7082 3 8895 0 s
+<29353b322a06> 3177 7327 0 3729 -1 s
+<002c3538002b3e273336322b06003627393900283b2c2c2b3839003a35003a2e2b00393f393a2b33003a2e273a00282b2d2734000d00283f3a2b39> 3729 7327 11 8895 0 s
+<272c3a2b38> 3177 7572 0 3607 -1 s
+<003a2e2b00282b2d2f34342f342d00352c0027000e19130036272d2b00040727000e0a100f000735000d050024152b2c273b323a11000a00283f> 3607 7572 13 8825 0 s
+<42> 8825 7572 0 8895 -1 s
+<3a2b3925> 3177 7817 0 3501 -1 s
+<071c> 1589 8163 0 1938 -1 s
+<392f402b39362b29> 2033 8163 0 2764 -1 s
+<1f2e2f39> 3177 8163 0 3571 -1 s
+<0035363a2f353400282b2e273c2b3900303b393a00322f312b003a2e2b0007350035363a2f353400283b3a003534003a2e2b00382b33353a2b00393f39> 3571 8163 12 8825 0 s
+<42> 8825 8163 0 8895 -1 s
+<3a2b3308> 3177 8408 0 3578 -1 s
+<00183a003d35383139002f3400293534303b34293a2f3534003d2f3a2e003a2e2b0007120035363a2f3534080024152b2c273b323a11000a00283f> 3578 8408 11 8825 0 s
+<42> 8825 8408 0 8895 -1 s
+<3a2b3925> 3177 8653 0 3501 -1 s
+<0736> 1589 9000 0 1882 -1 s
+<3635383a343b33> 2033 9000 0 2821 -1 s
+<23> 3177 9000 0 3339 -1 s
+<353b> 3313 9000 0 3545 -1 s
+<00392e353b322a003b392b003a2e2f390035363a2f3534003d2e2b34003a2e2b00342b3a392b383c2b38003638352d382733003d2f323200282b> 3545 9000 10 8895 0 s
+<3d272f3a2f342d> 3177 9245 0 3829 -1 s
+<00273a0027003635383a00353a2e2b38003a2e2734003a2e2b002a2b2c273b323a08001f2e2f3900332f2d2e3a00282b> 3829 9245 10 7957 0 s
+<003a2e2b002927392b002f2c> 7957 9245 3 8895 0 s
+<3f353b> 3177 9489 0 3504 -1 s
+<00383b3400342b3a392b383c2b38002739002700393a27342a273235342b00363835292b39390038273a2e2b38003a2e2734002700292e2f322a> 3504 9489 10 8656 0 s
+<00352c> 8656 9489 1 8895 0 s
+<2f342b3a2a08> 3177 9734 0 3694 -1 s
+<071d> 1589 10081 0 1894 -1 s
+<0a410b> 2033 10081 0 2351 -1 s
+<182c003f353b002a350034353a003d27343a003a2e2b003a2b393a00282734342b38003a35> 3177 10081 8 6480 0 s
+<00282b002a2f393632273f2b2a06003a2e2b34003b392b003a2e2f39> 6480 10081 5 8895 0 s
+<35363a2f3534> 3177 10326 0 3768 -1 s
+<003d2f3a2e0027340027382d3b332b343a00352c000a0800123400392f3a3b273a2f3534003d2e2b382b003a2e2f3900332f2d2e3a00282b> 3768 10326 11 8895 0 s
+<3b392b2c3b32> 3177 10571 0 3723 -1 s
+<003d353b322a00282b003d2e2b382b003f353b00382b362b273a003a2e2b003927332b003a2b393a002935342c2f2d3b38273a2f3534> 3723 10571 9 8514 0 s
+<00392b3c> 8514 10571 1 8825 0 s
+<42> 8825 10571 0 8895 -1 s
+<2b382732> 3177 10816 0 3526 -1 s
+<003a2f332b390027342a002a350034353a003d27343a003a2e2b00282734342b38390029323b3a3a2b382f342d003a2e2f342d39003b3608> 3526 10816 10 8439 0 s
+<0024152b> 8439 10816 1 8825 0 s
+<42> 8825 10816 0 8895 -1 s
+<2c273b323a11> 3177 11060 0 3653 -1 s
+<000b0007002a2f393632273f003a2b393a00282734342b383925> 3653 11060 5 5940 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (23) 23
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0040 put
+dup 3 /C0041 put
+dup 4 /C0044 put
+dup 5 /C0045 put
+dup 6 /C0046 put
+dup 7 /C0048 put
+dup 8 /C0050 put
+dup 9 /C0051 put
+dup 10 /C0057 put
+dup 11 /C0058 put
+dup 12 /C0065 put
+dup 13 /C0066 put
+dup 14 /C0067 put
+dup 15 /C0068 put
+dup 16 /C0069 put
+dup 17 /C0070 put
+dup 18 /C0071 put
+dup 19 /C0072 put
+dup 20 /C0073 put
+dup 21 /C0076 put
+dup 22 /C0077 put
+dup 23 /C0078 put
+dup 24 /C0079 put
+dup 25 /C0080 put
+dup 26 /C0082 put
+dup 27 /C0083 put
+dup 28 /C0084 put
+dup 29 /C0085 put
+dup 30 /C0086 put
+dup 31 /C0088 put
+dup 32 /C0089 put
+dup 33 /C0091 put
+dup 34 /C0093 put
+dup 35 /C0095 put
+dup 36 /C0097 put
+dup 37 /C0098 put
+dup 38 /C0099 put
+dup 39 /C0100 put
+dup 40 /C0101 put
+dup 41 /C0102 put
+dup 42 /C0103 put
+dup 43 /C0104 put
+dup 44 /C0105 put
+dup 45 /C0106 put
+dup 46 /C0107 put
+dup 47 /C0108 put
+dup 48 /C0109 put
+dup 49 /C0110 put
+dup 50 /C0111 put
+dup 51 /C0112 put
+dup 52 /C0113 put
+dup 53 /C0114 put
+dup 54 /C0115 put
+dup 55 /C0116 put
+dup 56 /C0117 put
+dup 57 /C0118 put
+dup 58 /C0119 put
+dup 59 /C0121 put
+dup 60 /C0122 put
+dup 61 /C0262 put
+readonly def
+/FontBBox [-50 -256 920 739] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842247DA7FC91B9FEBA82925C7B7A9B0D22DD1
+7C0E9A7093608F1410546F00
+09F98531B5959B588C
+79CC3103
+04952A259CB45E63AE73CD67F6
+B33A8D5710F1627447C7DE860FDEFDC1D34551BFA6450C8FBECCBCA61E141A1FBD259A822E4C27E18E14DA7FCF34A20FB6672B2B107496B2057534DC4057A7CD
+AD95F944
+7E8F394959AB8406438A5C88DA
+8147804BF5CCEE48E4E4A512E8183B630FBB7FA3DBA934ED801D2609D91DBFE30919D26B9A4A6F47E7DE341387F0DDCE6F4BA601D799EEB28DE637E597387C
+952226EE
+9128A8DD2E6CD1B75F6DCE4ABF
+6067377553CB68A82AF5ACBA95935472A2546864266626ED1A5BA4DF39BB4E7166903DA2A98ED83CBF6523ACB79810E956321A71D34E4DDF28
+07F7038B
+3771FD634E1C33863369911E10
+0A036EF56C70F4BF6F16F5376D3C192110822FDBEF8550
+6189F8D3
+AF11C71DB8A4DF99985B3A8E7D
+70F350CEFD5AA56CEF1D03502DFB01FDB4F24C02D0D64A66F3D2A9B68960C7
+5FA5149D
+951A9E973BF42FB279225DEF89
+BFE7329F88965675CAFFD846AD83DF8A8E0ABFFD33A826A11705A7908FE436BA070FF31F1491B758FC694DBE6B05BE97EF093C0240A340E224C1F6FD30DC4D0E04525A2792E3EDC03FEB
+81D83E55
+10C731AA60D8F824424ACC5591
+E9EAAE52C191ECA34C53B64775A44393C904DBC9E49517754A2FA95B893C1B204D5DDE3484CA7E52C85947B551294CD8FC1299A02C627E3D2D0372C7EE515C564C1D0D23F29162A2F363086423CC39FE23F65119CAC089C4F8EB
+13E10CBB
+B960B4C58D5ED6818C6577A0DEC6
+33BC4444CBABC3101EDF020E3DD9281E9E74A0FFBF12ECF1BF60F6BB45D61399B7A85985753179F4AFA96D26242E931171AC9B8086216C89C7FF4FE3903FFE2EB0892E30B2D75E3654906E4AE0CCDE5CEC49617384A0E28BBFD317C034131F819D86C9214B6F4AA190BB1FAE712EC3
+866A7AF9
+8B0904D12122AE50EC2F6ECD37DD
+AC21C503C57509A0EBE30A545E8D2F15AF98418983B90E70787DF18BF6747CCD6502A949E69C71C165166B435E836636D21B01FBDD37EB4BCBF57B3F0F9294CC22100BABDE5CCB472B51545C4CA759B1231B69839E0A5E4D7C1A7C533C4DB4751A3845679F
+F28A929A
+0F12673EE3C1E758A0890B785D
+302C38EF51DE4E3B744AC627CE166F1652519A87D068754FEFE8059315B5F400DC4E14D5DA8151BDDC61B13804DDA87B92CBCB2DDC78
+00AA39A8
+CA339B211629685173B9982C5712
+93D7F36770CD0FA00B040774F4AC44C8F40F6102AE02DC01B69A5D6B615CE613E4798B32F4E7032B47CD67E5773D3FFD9C3A18260D0FCDD67CA3D3A996DBD6B84B577AA468499EE415115D98EAE0F742F1031B8B2B4378CC970FE1CE156E79E399180DBF1762AD13551AA3DD59C582DB7705F9
+76B9D730
+BEA12E4C2E773265FD9B0F37562F
+B1B21A332F15FF053ECF96E537095BE8DF8DC2DEF12E473F75C01F534129DFBF3552CBEB5B2BF1A0C447B28FFB8F75B6E72FBDC0AA2DE84962691409980DA68F8799B402E6B3BEA1E090AEAB924D2999F87AD9DD1388B9750A1D02CE053A283A8CDB5FE35C5EC7542CD08A4AFE7DDCBEDEE706DE3E83E2FC022F9BEF200B
+9E42
+0B
+8C3A57D9
+9EFA07CFAB6F138203B01D5D33
+49B6F86884B57A3BE3AC16709BE639EE1F29B9A419189538641645170462E1EFD8DA51A33E8513198723C11D99B57877998B158A18D9548D9B442F2347E68436EAE31D8F4FF31BBBDE76B55FACB958F53DF3ADB431219037B929B0C3A31187CA7D
+318C0218
+76E26BEEC57CC8DA1C41A6FCD1
+E20CAC6012CCBA8DED5F4E27AAE357116C6FEFDB047CAB6BF54A02C9D0B31C2AF725BD9F5B239BBC081EA8474582C2C9E1B1A67D7C117448171CE31B189EFEE40C970F93146D67841F006CC060452E4471CAD9D02266AED8D2217A12EC18C18EA88FE4
+CD540EBD
+60C76CC40FF39C99642EFB9D84ED
+B11E86C8C6C72B4E9D67E23938E6C18D609F7005CC76112384816E9740F3508032B7D460BBCCCD42F8413C1039156C1083292397010A065EB261B94C72D1E7ABD6FFBB6BAE3A3FAD346B5E2688AA57E5F5CFE8F63BB0783EF68F22485EF39E0883FCA0ADC4EBA7AE87375A84B5B8332741DF91F34E954A8718A468154EF7
+F2123C61
+09729B936180406CEB67E4109D5E
+0A6DCDDC1A271B6F7E3E8B5EF13B33A124AFDBB85A71E698937E76DDE7B252516AA49933942F9364C584EC8C4D50ABDD112044A04FD0FB89CB74DF841637C76F56F36306A4D3954CBE3CA9226082B50C644FBB7480AA9B121DE639C77A9C347D92C1134250C133D910
+F9F187CE
+606DE17445B6AFC83660F02786B0
+C20CD610211E9CA141AA2C8753DDC6648568D95D45DBEB6547DCCFAEBCFBF5023D517325F5712B44D8567BE9330CDD87F18791C0FCF5018D846348E6386348A322A0C861EDD714859F0CC0A67E8D9E964562BDF9DEBA15577769F81033184013E56194E793B3A360D5B441900C2DACA541A48CF9D8E46A287407
+292E0A62
+851BE476C2A0B5A9E35BE07CF0A0
+966ECF945AAE5B7CCC24CA09A9B100F3C701562C5B3FD22C850BBE59B6B436D67C4CE7C02AB274AFE160E87705B853EFEA66C77194049598B480E517625490F6DADF4CA2E1AB42A1A799153747F411D06EF80AD153C88AF547B0BB1FDEDB3DC49247876FF0BFF22E5842FDAC4AFE0505CE3A4439A2A2E7F050F5445F6519
+DB6B
+52028C8A729C93C0C850BB
+8930B55E
+5B7987856E88509E45D77B928F
+1470EA70830F189629D3CDA6218226132E01E3AEE9AA5D1A142F7FB144128EFD7EB58B21B3BB8C56EA878E79E484CC809348CF96A9544192D38D2A
+A6927AD2
+12F2A2F7B4D1662D7D009C4B38
+93DF4E251809305D7B3A86D475C886FA10D5E76097C8D9AFCFD3D4CE49D6C4F0F6E3B0C775B491676DF538CF15BC3F2455EEECDA6D9979161854696A01E7445F22B625F9D6DE4A
+81A9F8D7
+C0F80DC1A25E06F759A269A78FDC
+06810D5EF312835570D2C28BE33A86FD54F4089070FE77594765233A67D55C84EAA6C6C135854EF199D0919BB5D6067B71D74EC8F9944B244911354639BBCEC2DDB2765C93B4B763CF28FE68CF444646BA1988C600A623DEDDC6304E03FC0ED1649BF56F877D7EC10592C3DE5FDFB6
+49A1CA48
+DCB2800FFD43E49CBAF8A8AE4E
+95E3D9D2299D8D050D43148AD1DF3129EE941987878ACDE983A3CF3316FD54E6BEB04C73E224D259043E585FEACE96310E137B034820EBBAFD8E76A54E88442AAABC5BD22C19EEBC1DD0BB1E3B427662AA11A44A14A41CA0C44C9515
+FF01DE06
+1EAB18691879985E961F57E05B
+A8B4D8296E1CEA10848053E9144847D334B58DEFF3768FE41ACD7D9E7C3109C1CD7C2DF53998A2B4B34FB07CFFB014770858A964C77D2AD6397C89E4D46DB844FACFA53A2C291A50356A6402AECE855EFEB2D5
+1823E682
+D07073F6693922C2BE73F486122E
+E08A4870EA41491263D0FAA8A867821711DA26F25D0E944F8A703444D9E63A96508286B8CA9258356FAC0B074107ABEC3CB0CA4A60A6059B7788BC34202E74675623681D03C2CD6DD5B943D70D4B6A9455E90BE1CCE2377D1582D8774E1D3A76B613AD5BCB47B83B38A5
+476338AB
+99FEDF61C0E4508087CC1E33F6EC
+39837B20EBADF13D5B1795A56E7CF4FE02A43C4FD2ADB5436CB28F5642282B86CC14EDF43D6633C317D0895A5C1EC16224B60A40EAC9A02C8D4D975A9436C8A1ECF0EC68C604E63105D0F98B14D8B84DAB894074B2934AE966ED78904E9EC233198DB3A0215EBF2C8C51B2A5C2D70D8A485199CB02D6F37A824D2B9F8CB8
+D6DF5039
+6C97E8EEF606818F57F92D03A1BA
+252D76A8FD5E930EE922A3B6335D3AABC8C98C6A4F446D54C29A2E977CFA7394701C32E2AE2AF95343B98AB1B68C23DB5436C5DA962EE75477B931CE0B76DE0005225BDBD009D42E54A346162512AB4B88960918A16B301C375551F0201222EEE2919F3D0EEF20644278EF0AF58FAD93AFA27657DD72CB49CB4BFEDCFA30
+1084
+FFD54E
+53604DB6
+2284C2B3439D518264F8B9A15A
+195A0ECD9A8018DFEF3DFF3C8BB1ECB147FEA9ABBD5CCD251D9D1FEB594C7DDF1F3C2AB391F48D7BE4DEF6FB78EFC9F190B28A2ABAD9DBD25B47FE2B3098838E6505FC148024A0E7BDF24DB33537A3064D
+54211940
+5C4C4319C29CEAC972DD8388082E
+54DEA065EE59E5C5974987E2DD3373607E18635451EF060DB84912FA319B61E21B3E86E05BA31FC5D0DC044302CED573DE301DE0C011F5B7E36F7AE0F51CD73BB1D9DCDC6B5CE50E49C792E5C03DF690E60AAD339D85D67BFD17FE55F63BA7BC4003E6ED
+7D86E71D
+8D43E68B3C58BE4FE2EA5A8D3E
+4AA152E552783EFCFC261E770F8D44EF011082D7830BF0FEBBBB89F93C92919C10365E7EE9075880011F8A7BAA65DA221D6C516A4345E3AB72ABDE8035264AEA9214C09F7DD6D326A945B911C4B531B85853ACFCBE1E2CABE0
+28B939A5
+2F5104E4AB335F77C9142CFBFA86
+0BEDBD70AD5204F4DE4C57B5DF11F28A943F4639FDCE2905367E19C03F9029A47C754E22D1BF609F695849D3F251F083556219FFB2AFB9CC24A8409873D176CF8496E9920964982E4E515CB0DD506C644DFF3E9E89B26F60B742AD4E7A0AE02CF5815F4E140C9F0E9DD33F42B237F5C2C24419C42650C033BE6FA2261A84
+7E8F
+DF99ECD5C1EE06B627B1329191458820D855C1C603B99AC7DB7E6844F48939DEEC058F50FD4511
+615E70E6
+C1A5CFB9215686627917B10C94D1
+EBF9CA1F2C67C219A4FA0D1FE135A7FB76BD5A2581F1CE656075E1B5832006FC09DD5008FC1409C14C07482DAA6F58EDFEA966B0C8673AA89AB26612E07D3041E06317786303DD2F9EAFA410F0C37F748FD847E5627505DF5C41239C512BD8C8725D454462A7305341D8615E1E2C44989F7530
+1338A262
+F6B7A84396B923016878580E7C
+0E668F000E21E3223A5C3F9E592AFECB80D07D4554D9D4B0028DB3E709A40318A4F2D503FF1DA95F1258
+41E1ECEC
+0C9DA6D4ECB8A26F209F339C39
+CF69081EB909784A6057ACDBCDA88CF5207A4EF60AF277EAB9B84494588C390D4993794CF8CE3FCC9D464396
+F46C17F2
+F66A2C502B869415A085B966F2
+F87215158518FD06C2BABCC78DB518B7DC26D4DDD897
+870ED87E
+A2C9E07D6DC891AE7BE64FC7238B
+6D3A663EE37D2137F95700B2C604CD0FF78E2CE51A35C50A962D3206F52CDF7E4051C15C54AA1FA081C4409412AC2781A2DC759F0823AAC03B8FCBDE7DE6C2873F3D9CDF49889E8081B69DF812268D46F65E108F0EF7577E4150867B43371961C7A5A9E1ED93E19748865CE8DE4EC5DEF3D5545B49E1FC1F8C77D01B6AC6
+DB8A
+B37904
+6A428E3D
+CAE21DF8468A4EFE1F8EE29FA1
+4441B9BC6BD480FF06040363C504C9D98C23750B7ECFB9A85DDBA811144D2F202A303B5E217C15202463FD6FD665DEEC5AE508762DCE1BCD7BB20DC7A045C855693C88CFCDD8CA79C4745DDCB1FCBC3E6F3802360D20B2AD
+B6163034
+B89B687B9AE108F2A1BCF7C05A
+89281F243E565275758752759FCFF7EEF3DAFB4F757C8CC768537D06C73802F8564954B8BC0509CDBC3D70DE58ADC1450C88150715C5A4AC88C1FB1616452EDD39CC01CC5C823E4EB4C7461F7534F41CCB48
+C2B953F9
+DE685F70001BE74F96006AA2B775
+5C4BCE15089D28BE91CFFA14A9CEEB30EE1A7D1D097F3A980C56193EF2E2ACF87A1B3748D20998910F0BF6C56ECC82B7EB48D958E3F247F1F89D244C3300D69693C7C3649314E72A0EB82E3449A6C007CF226F529F680FF4CF5AE1666691EC517269120B570547DB55C0B8D3DDE7
+56CEA7E2
+44CC65A088761C795B1E2D4018
+0A087B0AE5C9727267125C5A390C53BECD73F55DF939EC26C66C90BF488001AAC683D74E4D30E3FD0576C64F2E4FC819AFA3B6D40BF49D233082E26C4F8749E6473E1D0E5E731E6D0AD6622482923B182112CC5126191D782E
+185FB460
+AC0C3680A83ACBFEAE4A526B99
+38774C9F90C2E886A4CF9D86D3652C320FBFDE054285CA9BC7D8ACF5CE5741721104C0CAE1088F80AC64405C90E7D3EA7EAAB42E1FDC5C9183C1CA463E7534D8A9248D1B3BEAFDE6022EDB2CE8DBD4881000233408D6F8894E9FD3FE
+8B0F2C7F
+C79AAE9D6A1269483B0DCA22B640
+D87E79D2D894F208A651BE6AD4CC86DCF9663F86CE34FA75E947F1590121060EF981237E479785712636B01926F7CA4EC5C2BFEEC77FCEE9ACD31D9D9A510B82475B75F811132DD3CA086BEAB190F28381E53395E65CC156295D0D30FD92F893DAF29B5937BB8A4EA82066437D6CCB1FFE0A8737ABA813C7A778D4790290
+BD21
+ECB6908134C6C912447B70F4E527A1E7C4B311BD36CCBDD67E12DDE7D78F4716DF244B8A9A6412E7B4F3190799CD97
+3360DD31
+73C37ADA7BE2B98F861DA2D878FB
+2541B56105DE93EDAA9B31FCF3A5121C223C9416BF1574CF3A9D3D034EFFBA5EC2819FB33D192570E8E898E00D781C077035638AD8E3E8D4EC1D691195AD5651238F3AB26B5B82C4D181EB30DFD3569B08E43122861D61AB3E79F841B75D90CA9B327D76292C888C2E5A03A3C3
+CEF59690
+D182BFAF2456500DE58ECE7455
+EDEA610DA082BB7105963E70EF380BE0CCA7808C67249864A3E2627BC0CF88A4FDD081D67007201412514E645A94196F5F0CBEFA221528505F3F0B400838DDA5BA3869A6D58F2E2F5FEAFDE5E5559684
+0FC14339
+B7BA57884FAEEF4CA0068A62E2
+B9D20DFD87ED246817A6A4CE38C56BC41B471E32B9322FF42A89FDDA9859C205332328D6619506387E0ABFFDDF7BEC2D6CD4FA510AE4F12D9DFF00DB11ED7DAD8A4B89562D3A8E50C78610C013E555A6D31C924129026358B6D2C3A9EA9C6E4E24AB12
+F33BA4E3
+F9405117FFE8C51283B8EC2A214E
+ED19C0940BAE6AFE63315E14697544F92B435F9656E893DF0F6E62B6EB0855E362F528307B9BAF05AB24C51EFA4C1EE26B849F0B97B2CAC38C446AA7AE15B4019CFB4B3377EDD760A5963CF68FD301A36F0C5C99E627B0A55D0B6294DA8776E5B09EFD878BB2B21EA83CFBDA1A0638884D91749EF7DAA530BC2274749EA0
+7454
+317DC481AE802CEF99751E667BB7593B6B4C1751E5C8AE7FE6EDC5440BA5AF9329DE28
+84C49564
+14DB9E25BDE78BC0219BF77FCC
+B5ABDC057D369E498133C29F67B504EBEA966CB9EB36E2C6685DAD16D22A011C3951C7485E4A1770A3BD9F1CB0AEB774347CC02DE9F7
+8B4312C6
+3CC09D903285FC498AAA120EEB29
+9C276199C4CBD3EFE19F6AB2DB90E1800D38E4199443B4768D7B424FE2F88F80A4A6493A1896E18057472B2A812093445D4B23724DC41576C9107286E084D3B93BCC7EBA81A50E02A907C076E67D06E3FF0D1A273444A4D42EAE81952EECD1CD8133966AABE8D69FDC0C828AC23EFFA81DCEDADDC59BA1AC16AF39DA308D
+C635
+B2E351FA9B5EA72B08BBFBD965A84D45809266A74A66F8B164D461855EBC65
+C550A180
+47E23471A42C0E16BB3929013B86
+BE815AB3284602DFA74C17CAF77C010935289EF9D451D0675FF47864C9EB3AD7F0F1EAE025EDD95154F226806C5E6540E11ECE0F6E7C000EAC069F9956ED8D7A0EEAA44645BFF5BFDB2E61F07DC19E3E5D89969E41E6B70B7852E83D8ACE96091201710293C3B8669C6AC578
+AE20BFFF
+861E3FDF4F3DF2A65A1CFAF1E6
+F7EBF70ADBDED4B1F009D609518362681176B4D78E8E10B7D08359432CC4422DB6F00BF90AD9D28380B25D1BF9ECB31C39F0AD971C6C8F1DCBF07B2AF834CD560D6126CA8D91
+2DE08C4B
+E0A4F7CBF88E7F0A1D6479766508
+21E6960C3706FDBAF993410F3D4D43EAE217919698BAF680EE7D4E3C29914471E3EE9001F61EB3D0F298E87901861299D9FF8B934F0A430A7F38689290C6AC4C546E48680B140B9E61E540BBEBFC8C32374565533862051ECBE78F63CA02A63EEAEE17507F4EFA740C7DCE109BD2D3A30290209C1F7603
+BA6CA650
+17807B43A95ABCA1641E91512710
+D7F85D588C2C63BB0CD9E736F1540D7209EF8F5E03F7CB7269835C1D3179BC5B7C1BC8142C2525D33864BFE48ABD6E9B3B27188F2465BF106F8008D5775C0B57F1A08FA842944DB7230D425A2CBDE8C201C5DBBA4A5B83F3F734E8DF59E6181E32BDB15952288C736003
+06DF6250
+7A30C3EBD9483E7CCA78C5ECFD
+97E10345DC08D37CE9C5C6B9CA8E38074356FD8EB11A4F914263364A997892885042F8BF22DFB478F30AC384DBD2EE16742FC424E3F4E9724930E98EB9F6F2EE601C5994C8330F98594295BCEF83590EEA42E14252C70B
+1183B7E7
+C5DF91F3E457163671FCE2D74F96
+310471B905AA2BC1955B438667B89691BDF40F43C4069FF908117CD9674D9668322299A4E2B11AFA617E0CC9171C9F5B1DF661AA03CC0DD25352620E6F334EA7A2E809C3039C08393FCC666C2E8FD098E325B0371870BFF5E15BD3384C56FD3583815B8D38BE6854CA00197952E48CE36F61822E048AE4B5488D8359
+6664244B
+D10F565584F336D342DC533A57
+5B32E6A90EA77D9F79332EEA14C035A68D104FE0797B8BF3F4AA4F2910665776D044994179CA36CBA2EA4D465256DB7D5F6D548518EEECFB058268F835902A5AC366EC4B6C
+F2717C27
+2609643CDF482219E6E3F8C28E
+C36BA0E3A2A5AFCA579E57C1AAEB5ABB63BB8570E52BD8D011EC5EE99075E04D544E7F915EFD6FF0CFBD76E47460C0A07E9CAD1AC5A4F491D3E047CFB5D56531F1D55AA4483C10976E3B1542384EAF1443B7742FAB6722EDE49070E848C578F17678
+250B362B
+55FD8256E18C99C6A0D937150B
+85ACF42655934195BBA8259254035F2F05D96EB04BEF1A50738579680F0EB1834DF33FE1069672294161AC659A4EA2EEEE487C30A64D9C8A07DD5B6D94D5569758EB5BB581FF60FC3D874F0BBE3E3B5FBF0667B12E685BEFFC
+8BCF48A4
+4949BEADEFD95661B5901B19A226
+EA899562F6499E2E24FF276C00FC30EA8F7B737A01FDC863CF5ABD3BDE64310A203CF9C8C0DD55D1DE7EE33D16405E32453D6F2E4252BA0C45B2B72218F778436091E284ED871B940A7EC2DE902003186B2CA72E2E39237E31D0187BC479DC89FD9CAEB623715FFAD12F8AF2C31F39F2A6DB974A0ACF8DA6B392A6DE36FA
+14CD
+596C4F3A657845FB2E0C89441945
+6930C4C4
+5D24F5AC2E495911D6C028D96A02
+8BE7C67D62E1D3A5BFC1A89618EB69DB832B7138AB592672A59031C339111060EBA084B680F1690F41247CA5EEFE72DAB43122C6F678645CD7F4B09FDB6E8C5CE8E430A299590EA671E1DFFEE81A806C16D071E63A30E65C53B9B488A3B28F0ABF485B938809D21DF3737B4DF9DA6D92E3A52E184BB2E16C09F6829827E1
+26D9
+C24157BE
+07D6552541BB11A2E54B887B63
+2DF95672FC2F7449F38F98EF6BFA2ECED9205C32D7641B73667D680120348815FB702EA35142FA539BE4BEE2FAA08A317791375AACFD98EFF164E6ABE12CED
+EFC50AC0
+88F3D26A7123CA392AA9684942
+17E7F75A323484846282DF65DA2B3A665F8B2B6B4D6F
+CFDE0E3A
+C5943FEF6D3C8ACE02FDD4F06414
+757F9924EC3FED02
+FAEA98C6
+8DB967F39AAED87D71DCACEE7D5A417ABC01AFDAC13917F9F80A7C693E80DBC8CD93
+70DA9C9AF77A2F074E2E3EC1C29D3B1846613E0A9E98EB180162F509078EB85BFF13BA7818F8
+F36B77080FC89BFAA94B85CF56929C63F6FE8F2ACF974DC3F7900F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<172837332835290b010c010d2831262b3024352e01293235011628243638352c312a011728373a32352e0119> 2207 558 0 7384 -1 s
+<28352932353024312628> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0809> 9346 13385 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13267 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13267 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13267 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13267 3 7133 32 s
+wst:dutch12 SF
+<0537> 1589 1431 0 1835 -1 s
+<3728363731243028> 2033 1431 0 2857 -1 s
+<20> 3177 1431 0 3339 -1 s
+<3238> 3313 1431 0 3545 -1 s
+<00362b32382f270038362800372b2c36003233372c323100373200363328262c293b00372b280037283637003b3238003a2c362b003732> 3545 1431 11 8066 0 s
+<003328352932353006> 8066 1431 1 8895 0 s
+<0c36> 3177 1676 0 3421 -1 s
+<00322900372b2c36003a352c372c312a0400372b280039242f2c270037283637312430283600243528001c0e19231b1c1a100c1604> 3421 1676 8 8895 0 s
+<1c0e19231a1a04> 3177 1921 0 4079 -1 s
+<001d0f19231b1c1a100c1604001d0f19231a1a04> 4079 1921 2 6985 0 s
+<000f150e18231b1c1a100c1604> 6985 1921 1 8895 0 s
+<0f150e18231a1a04> 3177 2166 0 4291 -1 s
+<000f150e15231b1c1a100c1604000f150e15231a1a04> 4291 2166 2 8895 0 s
+<1b1c1a100c16231b1c1a100c1604> 3177 2411 0 5196 -1 s
+<001b1c1a100c16231a1a04000f12231b1c1a100c1604> 5196 2411 2 8895 0 s
+<0f12231a1a04> 3177 2656 0 4005 -1 s
+<0011181a10231b1c1a100c16040011181a10231a1a04> 4005 2656 2 7079 0 s
+<001314191914231b1c1a100c1604> 7079 2656 1 8895 0 s
+<1314191914231a1a> 3177 2901 0 4201 -1 s
+<0015180e230e191d0400243127001a1016230e191d0600210f282924382f370b> 4201 2901 4 8895 0 s
+<1c0e19231b1c1a100c1622> 3177 3146 0 4699 -1 s
+<0539> 1589 3492 0 1862 -1 s
+<3928352532362c373b> 2033 3492 0 2847 -1 s
+<1c2b2c36> 3177 3492 0 3571 -1 s
+<003233372c32310026243100252800383628270037320036283700372b28003928352532362c373b002f2839282f0029323500372b28003728363706001437> 3571 3492 13 8895 0 s
+<262431> 3177 3737 0 3491 -1 s
+<0025280038362827002c31002632312d383126372c3231003a2c372b00372b28000519003233372c32310600142900372b28003928352532362c373b002c36> 3491 3737 12 8895 0 s
+<362837> 3177 3982 0 3432 -1 s
+<00373200070400372b28310032312f3b00372b2800352836382f3700322900372b280037283637003a2c2f2f00252800272c36332f243b282706001429000e191d> 3432 3982 14 8895 0 s
+<38372c2f2c3c24372c3231> 3177 4227 0 4092 -1 s
+<003138302528353600243528003528343828363728270029323500372b28002f3226242f00363b363728300400372b2800352836382f37> 4092 4227 9 8895 0 s
+<3229> 3177 4472 0 3363 -1 s
+<00372b280037283637003a2c2f2f002528> 3363 4472 4 4652 0 s
+<002f3226242f00362835392c2628002728302431270600142900352830323728000e191d0038372c2f2c3c24372c3231> 4652 4472 7 8895 0 s
+<2c36> 3177 4717 0 3316 -1 s
+<003528343828363728270400372b283100372b2800352836382f37003a2c2f2f0025280035283032372800362835392c26280027283024312706> 3316 4717 9 8895 0 s
+<18372b28353a2c362804> 3177 4961 0 4160 -1 s
+<00372b2800352836382f37003a2c2f2f00252800372b2800302824363835282700372b353833383706> 4160 4961 7 7775 0 s
+<051e> 1589 5308 0 1928 -1 s
+<1c2b2c36> 3177 5308 0 3571 -1 s
+<003233372c3231003a2c2f2f002437372830333700373200283124252f2800372b28002632333b052439322c2724312628002928243738352836> 3571 5308 8 8895 0 s
+<3229> 3177 5553 0 3363 -1 s
+<001319051d1f000a0607003128373a32352e2c312a0600210f282924382f370b003132002632333b052439322c2724312628002437> 3363 5553 7 8825 0 s
+<3d> 8825 5553 0 8895 -1 s
+<3728303337282722> 3177 5798 0 4000 -1 s
+<053a> 1589 6144 0 1909 -1 s
+<372c3028> 2033 6144 0 2439 -1 s
+<1c2b2c36> 3177 6144 0 3571 -1 s
+<003233372c3231> 3571 6144 1 4216 0 s
+<0002050f14171c101a> 4216 6144 1 5392 0 s
+<1e> 5369 6144 0 5531 -1 s
+<0c151b00263230332c2f24372c32310032312f3b03003a2c2f2f0036283700372b28002c31> 5508 6144 6 8825 0 s
+<3d> 8825 6144 0 8895 -1 s
+<372835052538353637> 3177 6389 0 4069 -1 s
+<00372c30280000373200372c302800302c2f2f2c3628263231273606001c2b280024263738242f003a242c3700372c30280030243b> 4069 6389 10 8895 0 s
+<272c29292835> 3177 6634 0 3677 -1 s
+<002728332831272c312a00323100372b2800352836322f38372c323100322900372c3028353600323100372b2800363b363728300025282c312a> 3677 6634 10 8895 0 s
+<302824363835282706> 3177 6879 0 4113 -1 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (24) 24
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0044 put
+dup 3 /C0045 put
+dup 4 /C0046 put
+dup 5 /C0050 put
+dup 6 /C0052 put
+dup 7 /C0058 put
+dup 8 /C0065 put
+dup 9 /C0066 put
+dup 10 /C0067 put
+dup 11 /C0069 put
+dup 12 /C0070 put
+dup 13 /C0077 put
+dup 14 /C0078 put
+dup 15 /C0080 put
+dup 16 /C0082 put
+dup 17 /C0083 put
+dup 18 /C0084 put
+dup 19 /C0095 put
+dup 20 /C0097 put
+dup 21 /C0098 put
+dup 22 /C0099 put
+dup 23 /C0100 put
+dup 24 /C0101 put
+dup 25 /C0102 put
+dup 26 /C0103 put
+dup 27 /C0104 put
+dup 28 /C0105 put
+dup 29 /C0106 put
+dup 30 /C0107 put
+dup 31 /C0108 put
+dup 32 /C0109 put
+dup 33 /C0110 put
+dup 34 /C0111 put
+dup 35 /C0112 put
+dup 36 /C0114 put
+dup 37 /C0115 put
+dup 38 /C0116 put
+dup 39 /C0117 put
+dup 40 /C0118 put
+dup 41 /C0119 put
+dup 42 /C0120 put
+dup 43 /C0121 put
+dup 44 /C0122 put
+readonly def
+/FontBBox [-50 -238 920 722] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268420ED804BA1359DB1C4E9E9947D0F22B9D142
+B8C7F32D6FBDC19925279536
+814044F42EE104E6D1
+E21CCB75
+F53F4F1A475E9E89CF9C5A5BE5
+8B59C0200560DCBF7F6C260B6C83E9A9417ED3847B81998A6473292D24286137F35BAD54DBA892140B3BF048F3C1C70845D99D11851BFF4394
+5680B68E
+6F5DE40B41BDA0170B75E77A06
+A2EC0B716F418DDAE3AB73F1B9D06AA8531747ABB3C2B5
+DBA18595
+5454A8171C3610964E9E46C0D9
+4B3911FF6418BE188DAFD2D123110417283635961C4F694E6B15D9E19779E6
+7BCD0656
+36081E5EE2AB2D0446FC0EAF8C
+7F57EBFA474F5FD8D08259FBF71F1D94E36B1924618A9D3FAA07A59FDED9DCACDAFF5ED6EA1B9A653C9B968437B3EE0733F4C7EE4603727F27ABF4A7A3841900391360004CBEFB936DED3371E5F8D337DE66BBC89B92E6FE1305
+F4BD3650
+42490D8A32A12B3EEFD537102A
+9309D9661896677D4ECC5C81B20BE7749307F609150DCC878E3DE39D0B724BC7D658B7FF1FC36D724DFFE48765246F649EB858967DBDA0933481
+42F545C2
+BDA7BE06B422FD302492316FB2
+3745EE6E3D64F2A83C9D8F5ABC97C8A73FC7E5251807E35C7E2446494EACC7F841F8258611B97A356376D519F486C2A94DC40C424A03
+BE0CA890
+2A8C5E838D0C815F10300D51C912
+BE7CBA621A2ABF910F129A851AB2BD3C03015D8A6B3395E976267B0EA0711DEE5A53A860833ED418BB423ABA5BF4E0EE924E55B936270D068C1DF0E5AE806B10B46E8EA2BBDE9D86BBC18B18691D518BAFDF95A3EE363E10ED57216D5D85E33105E12157A73ECAFACF2E16B8EFA50D3C655256
+984D61B1
+914B36A67EA3DBDC5EE9F7ABF8CA
+57F2147AF48F41931F98D715A78FDC2DBE3C8BD783473B778875B213BB3FE2B7226F6A90D01AA66873252E7D9F6172A6C434518C51DF20651F1F66A7581CA7F58D8208A1D74315292E962B1503D69540E09898BB10F3A417705E80D84DA9F03C009A68B5DE8CEAE8BA9B61C1265B327FE505680DF109AD2646864985E8E0
+F8DD
+B0
+D9208D34
+22AE9FC5FBCD3484833E02672F
+EBF3700B5DA1ED44E254A3754D48E0562E8B57F33932A44703446CAB9DB7FC1D851D77FAA3935F138974A6A5F43CC362B730006EAC1C0546956E8B9AB2CCBC79CA68325FD6395B81EDD85EB46EB409BCF98BAD213B6DD6257E93559FB4F86C38E1
+7A065189
+7D4FC414CD1F02DFE51BCC1B963D
+FC1D7F5B356740F367F30393E6D1BF582066E5C97AECFF25B740E8CD1B1DA6DE53C19C1E82BE3D6F83FEAB3BA03F4B48AB032548B54A1CDAE344B28EE8A21C125AF3F3C4D0CA848EB8D533AE9201A4AB2E39F815B2427FB6A614F2B5B86EA1987CC5697A67A122C24EC5D3C80022BEF07F4CFEA419E06190271106C4A7A8
+EA3EC6A3
+D9CF6E16789A1F84220380F01E5A
+27AC93A9CA1D9027B53691A1F09D05B80CBF35943200A5673E6923943845B98D697B717F1674B852E936E20BE1B4851EB218D8B108FB8D0E10CFFA8E556B8E9B836D504B8FF166FF9E78999B2871FF8A1854BA83D380A724690AA32E29EED6587B9287534CE37DD01C
+9A146175
+244DE7B01551DA43B5BD7DA3233D
+0DEF0EFBFBF34D64CF0557789F5BE2B0B8034CF24724254163B13C09879BC8AF274101DD8C4E1EAE61B4DFB59F0768D4C0AE70403ABBC40C5ECD35125FA4B70749ED6017466185B85D32D4624C1FCF42A3E355DCC8F130F1DCE13F5F1F659093FA82ACFCD578B5334F1E73D78DD4FE
+83CBE3FF
+CBF4E6910432D3C8120CF2A6A2
+0E81D819971070D28A6A34031B5C1123B9CDD9B03F8BC03A6868280FBC152A9E0AA7D72B2B19124FE8D0B48F5CA7BA381A94B0E43578B71337CCCB8E89F25F0E99525556008355C6EADC2A9712939A81667C1B84EFF2F99266C72B79
+DAD1AC7C
+8CE08FCD98C0BAD02717C795B0C7
+A30B9E187719EA9EF9FA250DFB363BB00875C30D0DE0656C8C45BFBF50429B0F1749C12EBF457B017EE9B251E544323FCB528ED168343666E3A5823233ADE8922C17E3EE14C15034956F5CBFC965DEFF42F34B46E2333642361C1F824A570EEA6057896AA7FF5E00E4AD
+C5965DED
+92A81916796A985EC41AF49EE8C7
+89A9BC7FC7764DC3F8A6E88EF594C72BC0E8D3A65A46302445864370E2C6745EBD973EC9A8EF8BBCECD4CDB1542B1D21C4EB001CFBB54A77CC9C0CF726FD5CCDD16DFC672E192DDA0E54D69610A97AF1963CDF8553457FD2BC8CA1381A2E8BAE1D56265C5FD59893A7FFE4E77B9576BAD838B80FB3A90ABC0B4C12DEE83A
+EA0E1456
+59A66538DCF532183A8BE6C56C20
+62C0AAB9893E2A611388B44141B7D584B69B6884EE51A249DB62D85A53F481546CF0F6E608A7E7B1E95ED8EEF15F788CE5555F9477E09415523D5048A611C28A7B75FAD62A177D69450B99AB65109A91A6219CC6B3D36FFC34D5A3B0EB4A7369B1A2F6843FF2E6A707265A23515232244E6FFF0CEF55BCBAFDA23F6AF23E
+683A
+246ED6
+776E6816
+8FF10121CEF8D3BAE3D247EAA5
+BF1BEC534DB4CE1A1E7C1EED9E9F6CCCE5BB211B2C0B3BF9E7CEFD407B0D7911F85A52AFE3F703E31F6894B4A71C4F2740973E1C04363ED49DE023B84B32D8DD7B17075E808D5232301A8EA2D7C0AEA94B
+8B070290
+55AAF1894D256DE8C33006C79E
+D4C963C7201C9C028E2775D8D9C4E0E6094A203C910A
+5AAF563D
+D02FC6FC14DEB89FD03B4D72FAF2
+D79EC8F46709E23DB119E927F6570D55C0151A77B03F4EFFB4F89CE238C42AE028F35367E0FD65086B4ADEE587F2E1067CAAC7208FA041E108A7060D1BAFD2A7B81718893F39E1940A106AB8FE01CD631760C7D509C07F53F2B829315D655BAF5E5A3FB126A9EAD252E467B2F90A9817B4653D5024564DD31481552411BF
+5B5B
+20A70D
+5F55DDEB
+05B05E29107C89A94A797DF580
+DA0E0A4F93DA544ECFD7AB1F36526277B603396B3921000E8B67727086BABCD5CAD0F44506530BD1014D1FE967C93AC89365B7993F71968419AA0AFFBA6C4F47CDBE197D6593E5E3C3E809BE3A175473AA75F7332D6ACFB6
+8CE76AD0
+CF2BB422EE1A5F7763998F74B3
+2F2DC260EFC68B675D99545683BABAA75D0ACCCE5E4001E7A7345F8C428B6F19D7E61E4A3BC8AC0F7ABE3EB451A062178259F77E7B7141268B1A75489B5EAF9419DF45ED2DFE362E428922A944EDB7F6676C
+0199B048
+3D7290BA6E174B90D53206A4BC08
+DD6698ABC1165691B16BFEACB0A36CFC38E7D1B5E119094F1EF2556D3369F6F668861E6D006262208DA8B46B51CB9B327DE18C017E13F11F136C3E17B492F85615662D667651BE84223875BF3971B720243A610BD189D49533E47AFBAFFCB31969CFADEEE43A69197F4BF79D4478
+37F896E0
+747A00FBB2CDB7A6F76A9C3687
+7D0B777E545242FE8BA9EAF3A4819E21B564258E18C43CB071524787A99CE8A451F80108996A61CDACEFAD2739C9899F60E6FB716908713EF70422313924BD0D4C4ED2F7BD99D593288559A8A5C4062DFEF7C360240D36D770
+646C5A69
+41C1918A444DC0E59243F0A89C
+4DF01C433767F700AA3041EB64CF697C0359372321AEA1AF4B16CAD5D63D1E23EFC74439730BA13D0C61FB83AF1FB21FD926D59B07F4685457413B8C7B57ED03463F8FA982925CF29E8C6CD1D1A3F16A79365CB4CB3DFC00C42EF20D
+754232A1
+B96471A66388E18ED15DA4791C5C
+AD5D6C71BC76F4B2DC802D50A851C1DAD8B8D93C34FCE617053A82EEAB0A3F1AF40E0BB500915955E0ECA72457EF6D4837D64C7F2BDE1390DF9820D68A699F639BA0022D12A5FCE51056D9F5A06EA3EA9631B7AA96281F1329A1E97EBB516D4D84B7A3AD8E642670C186F6DEACC87A023D8408B654FC794C440E33653730
+A15C
+6D893C1E863C51063A4006AE06DF0B207131B43A1887DB68EE0A2A35120140214A23C48A72FEFF348FC68EC8878151
+D6174437
+16CABC0FF9C1BB9D6C9F0295F6BE
+F10FF79D8C6578CE9EF913DDB2701B43C9F05D693AFF46EA3D09B5EAEA8110933A3A2C3E6FBB7CF8F4104BC92AC799C523C1ADCE684BFA82E258B27E445E8F370B57DAEB0C9AA8D1D3628F92475E09EA62000777B4E5708B55994919D52CBCD20E2C26F45E080E476F2D146160
+4C840EE5
+7071D8404121B7CD08AA0822F3
+31CCCD4B223CC2127F6EFE5CED0644F7527982E505D601144722F51FA9C60B93107A6EB2AC776B7CFDB2C451363461B6DA857AF04FEB4572E1B185B67F0FE87AC0743168C10DE14D561A8536BDDDB4E6
+488D6144
+40B524E956DE2972A030C3CC71
+D1B6A8BBAFA732DD0454F43862FEFC9F53119103F26F5F8A11707F66597A81C1424BD35AFE05040152C84E5A93698DC608A4A9EA546D7DCF201B020AEAF0A3AAF9AB279D6D3D4F007F222DCEEAD2EBDD89A284331D2203D1A068903EF8B549F8BDDA93
+FE56E7D5
+1E974D594ACD6F36C87E15C6CAEE
+EAC922B8B7616D89AD88CA6C76DF9618DDCE5FCF296C3DB2B079C4273F6926CEEA49F54068347B7A4BC9FA63A897F56AA6F9629EC7F55F58437829FB0CE47482B6FCD7FC88E462F45C9E1F49C812C3E6D0D00F507E9DBACB34EEAA310CA13BB52BB2516C6B967E6720844CC015F573BEA9F420D6E9FA1D0D5C6B30D15348
+5902
+B54CE0D926386AC3FDEB0F70C6CDE07F1DDF28C49FBEB6DD4910358669917CEF29878D
+C90D6418
+89DA785E1BB956186AEAB2EF6A
+77F16BBBFAE0AC14981698DDD525CC961496896F4228D00D1D1E663F24E35810675583CD11895F74DDA1C657DB3D1F1033CCE2CE15ED
+DCA76972
+CC53D3D4DC2C1A9D0FC4F587351A
+0F3247030DF8D38FE0434E1C866B09397357CB009171B1DDA92B42211DB5A5E4BE0B5913A4C17FCF97318BF354781975E793ED3D3527DF47619B6AEAA4FC2669AA4C6C34EAD718F4F7506A0F39195245FCBBA5E63A79F19294CFC9AB69CF3BC4DC841457FFD5AF21C54599C8CD5F1137BD891DB9CC634791A6939C730DCD
+228C
+64B557F756AD2D1F057D3DB2816EA882E7D0ACAFF59514F44D242CC7CFF8F3
+D19C755B
+A11750E0B44B3B953C509B390B0F
+B0E5C3F460A30B9FBDD1F9CD4B4F2FA1C1A1825D7A65F8306D0DE5CCF3756443DDBDAA3F3A8240F5E496F09D1AA13E0BBAFDD18ECBDD17D94E868109937E21E596D07094F3D791628ED2D4B6500D19F656B3543D0E634B203102DF1F54F32A6E37C00BDE5DF49CE66B2CD19B
+61C0BD2C
+C29BFF27487873EF9AE57277BE
+17AB3EC8527E5C49220D837D91E8F0C77B444F7648CC2849E208774D77BCFF48C67B0DBB7CEE0E3E1760D19E964028C9C977CC8AF37EFAEA68391E95C5BC9DB6188970F49A16
+D5C10D1C
+E9359D75EA1C25C84E0F48F857B3
+2920AD49ABC1F74D6556B50353002A114C504B5059D120400CD87553079E5C3E7944F1DBFE229D40149920BD7AE822936D088F81198E5B8BE27E306057BBB201BAA92D403615803F2451FBF5DB50E71F4CB00DB20EEF9EEBBE55A4300A74B5CF915DEB3DAF37B90C96A8325745472C07D577A842F460D3
+04DF63C9
+E2824E1BA1BECF63030094DC21
+1CB2CB94085C4DAC90A2E0CCFD434518C5F539F1F1F88EE5C55EBE2BDB7BAB5DF34D2E849176A6E737C74B7D9DA88A22AFC58C8B4F551D115768873EC623DBD21A3F3146B116F20A91BCE718EFA2A5E34466C5D480AFF0
+E887C9CB
+C1C0761F0EE2A9FF817582D67DDF
+250E3AABAD61AC2C292AA712F7F04992525249C8D7B1434FC81E5C3A1F1D8F21BFA31AA50D1D82F209F63246B2A485026D770531BE351E08FE6C4705DAAC08A4451727867BF5038DE1EA247014D6924CE3C8DB97112866E2F2D1965035A6173C678C603D2FA2CB39BBA105B4CBB3EDC69055D7B473BB83889C88DCC6
+6D1B3F05
+CEB62293EB170A5FE1981AECE8
+D13DC6537EC1DA765E9CCC8A5802BE195E1FD23229B4790055DAC8154C2EDEDD836C26AF5825B8E2871C669256588BD7AE43A17DFB341E4AFDC8983A4480D583B643BE2681
+BEB7EF58
+C8B033AFA0B2058828073CFAC9
+39FDF750A29B44A26CC2536966A29633266CF5C7F7D6244276C5CA4BE9014DB5DA94EB007118B5089E064284B1973B3D1AA93CE130D285D06D03F86D706514283C3BC1FA82460D1969BD87A0EEBFA1BE69D9E05B5CB16EBE06DCDEECBE3773EF4A42
+CA8FF6E5
+53E96322508A969418C6F913E6
+66C27F0854C7042FBF81C752C2DF1A6C0290C31163286839716F0120C8AC34CBA5C3D18C01D49DB36CD0554CC87BFDC4DB128A9829468C9FA1856F26397A9CF25A0260EE78AB5A2DAC12517BF93211BC19A35C91194BD45F60
+AC94E602
+5F99C1F0A6408E474177264C5098
+160CC644E9E03B5FEF2B29855CD81725147C5581387804F03CA390A24AD395FCF0B1E87E958EABB5BC3BD45547938FBF5AE50EC2546834B01A00FB1A77ACB7FA1651F0868C94275540685DD6E05A30C04D5B934A754015B0148FC124DB0B8DFBA2893F80028A42B971DC003F0D0EE2553B72C9F990EA44AE9A87310EA70E
+DB21
+92FCD581C69BFE17C1FE84AFA78A
+52735304
+8BDDB4E00BEC9A4CA73DE4774F66
+DF77395F33D93405D440BA1872A87F93D2077DF3FF1A1E78BABC3CEB260F1816616BCFC8718EB60F39D284E3BA9FD679056EA48A4BDEAE9745CCC99158275FA618C98F1E049CBFD269053E63E61C293D41133B06ED4145202FD27FC7A69A7BA038DBF9FD4200B72B4181019DE70F01FD515A57CBB3372EA9DDCBD94188C1
+DC9F
+2654C057AC73BC43C7D4483B766DC212B42991751E520CEBD7
+DCE029AC
+D61BAD5A06D79A1BCD6F9AA70CEC
+4B9A451A6F07F31892264DA4788008A1E0367772950A9C90F44A9600A59F2E93007393AC038E5F06AAF5329B42450BCEB8982F40E30E7B74B238A761A204B545486A47013F6EDD6FCC68CA092C9A26F0E3CBD26E0535FE25E35CAE69B1850D83FCF1DFB027BEA0F04306376CD994EF92BB2BE5E2F3973AA35208EC6AED32
+9842
+4BBBE4D2
+3EA0F498FD54BEFF088B4909C3
+7CEBACEEEEBA2FE70DC9AC7AD3A34219CB43E2B658E5F030508C832E9D4A9582C4829E00A63FFF3ADF8B8466A0058E4D76418051C3C1AC42646798C64C9999
+BE657AE4
+CAA9FE95456491C0CDE56A783BD5
+E0935B9A6010A407
+B3663E99
+71A1DDFA2700071066AA9A2555CF3E3D1F932E6EE07A1F88948C47F079674899A1B5
+00D54F9D10B0C22E6CCDB95CB2584F826B89BBE578E1409C4FCE89882472B82753E2D87033D8
+CAF4CE536577FB0A5B8764093217681F0D1E9BA8D1A56E57D8E76B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0046 put
+dup 3 /C0056 put
+dup 4 /C0058 put
+dup 5 /C0069 put
+dup 6 /C0078 put
+dup 7 /C0079 put
+dup 8 /C0083 put
+dup 9 /C0084 put
+dup 10 /C0097 put
+dup 11 /C0099 put
+dup 12 /C0101 put
+dup 13 /C0102 put
+dup 14 /C0105 put
+dup 15 /C0108 put
+dup 16 /C0109 put
+dup 17 /C0110 put
+dup 18 /C0111 put
+dup 19 /C0112 put
+dup 20 /C0114 put
+dup 21 /C0115 put
+dup 22 /C0116 put
+dup 23 /C0120 put
+readonly def
+/FontBBox [0 -207 798 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684269B008BDEA74560252260FB40E310D1737A
+85450CDE23E8A2496758B49C
+4B75E970A67937FCDD
+BDD4550B
+55F974593DA407A0C2E2C88FA9
+336082C8D0820B4444FCC128F7AADC032BF8155F022E8721F027C2D7517B3F
+C4F12A63
+5396521E42A2D26B6AF2261558B2
+DB9CC40ABA525E48C5DB7F562A77428AD1819166647390256FB460A517FB479AA4E22133C926D905CF1D798CC8633B33F6495C9159D2C12E8B97B8DE71E14EB61F9D4EE91964531A8135FCEAB5226985F137CA97C9E9DAFD22F03281B8F43AFD4F9330F6130053F6A548FF3031EDCE57520A8502282920EF2728
+C10D84F1
+2340113500B3CB6480C5905A60
+24BD32084D87FE83B206F7B6BC6069C5A0286D2E446D29AF9F3BFF91F3A3E25EA55EB1172173F1F4C7D296D91E6038CFDCB5BBB1B7BA
+376842F1
+07F38BAE91E73843B8F7A80550E3
+A89AA8A125FB256E209233437A20B5B7668573629634303F3D3F690DFC77EE522379086FB7B59716C07BB84636F92703C0158374CE47F58C7FB3BFD40219004B9B14419706699F53644070248BA1568A83F783C0D5ADA2B1228FEDEB569239CC515FCCB296200CE6D28CD859B30E
+561B9A31
+EAE92FE9253FF1FFFD95C829BA
+1924733AC18839962752F1E4AB7E8C9D7586205EBDD1D60425CCDFDD24A144D52074A9A16EA676110702C2B5FA6C4E4B6941EB35E61C467797BF355BB823986189ECBB2D7ADDA329EB578EC354EB822CEBBA0D3BEC3D117C6CCA853C2C5F06
+E5E2265A
+AC0BB18BBBB96B11E1D2FDA7B851
+6FF32957DB9B25AFADC47C5EFDDBE059B43D0B688999FF9B01312DB96925D60CE612E9CB9B9F44CDC86B6BB2D52F4B8373154804A16FD6DCAAE554D96A475AFF201D62B249BE03F5A41A2C556EE6EE59D46ECC1AEDBCC218DC8770857E2F21DCD5B3637FE7F99BB69E
+797F722C
+74B40A3EE8D65D6D278916824E45
+E6541AACFBD4981985372A2A9A7DC1A571E599F90F88A674F7221DFE6A74DC95507753B80E591254257B690DF4BEC3487F3AADAEBCCAF346A2EE5C6889F8C0B248293CBD8DF0B0A84E1C21385643E19F1B72C5321191C103E74D4BC77978668C39BB09828D3191C8180BB350F551529372914F3EF2FB85B1291D581CC96C
+3462
+06D7F2D9
+11C2F4B87825ACE848F64B20C2
+4ADEAAB49D277F6AD0C65F62701454CD4969A4A2CA48BBCA5ACA55CA603469AC6A437CECCC9D026E5E4C5F6924D69315CD44104E62942ED78DE88A57BCF224C0E473E5D997C5AD0E57
+B5C431BD
+9FC2BEF8984B0178A2982DCB4533
+12073C7E039CB5A1A9AF63C4BFF4A5F36C8469E9E92A949FDA0FCEA69ECB713883FD91233291C5FACB44E652332C27CA08C1537D6167BF5C0DAB2A4BD00F41348B2070E7ECFC0D3DEF791B439EDFDC7BCD81EEC286DB19F97E5B77612365095979F46C712780561CFEB5A87FABA765BE31FA2D3944CAA63CEF955D6FD4EF
+180A
+BFCEF0B1
+D02704DA
+84B7B6FDF255F93791F94F94A5
+74D4E727CC7D1C9BA57276754008547F6513E21004CA37DB872C44103280B048FCB91DE15A6920FF0C531E1B6B2894BDD5795B7FF952B379A3FA51CF590CCB007C5425C74555937633F72607692FFF08E4B0
+8E17A269
+4DEAFD4F9373D752072255701F
+2BADE283F429EE336A3C3926D59BA2817F86395E5E93E37949AFFD4CC8DD9C90C865ABA14922F0BC1806A1596C62DF51B037BDE3448995CC56BE7DFF0D43635DBFBA2160E48D1A8A1DE5CEFED91E28212AE8F069E1108FD86E6AB455
+F7CADE10
+4E52E74F3266AFD08E426DC433
+391AB622FA77DCF19FA1128AEA3311CFF7D3ED2F4620E849E89B76C74C7EAFF256D549BCCD9CB766D62F71DCA553FA438134708EE0CA20CA5FD3DDE9CC3BCD55831A8504D2416BA28C2105558D7BD71AB8AC69014740DA959649131394
+457B9844
+27C2340D8EF666839D8ED9FE79
+59EE2EE584647B3F023845A6CD5913129445D917E2BF1EF3490C181E3991A4D74C10C7D643A0C7B916C4DE93049B23DBA38E5634AA16555891273CF558911EA03D544A7CC9A0A11FF2695C2E998D
+BD06C4CA
+0632D1FEC45F5DB4061D51718A
+417DAA97DE9ECDDFA269ACD6DE57621895171B678D5732312F82C34403588FE2DE7F9CF6E3F18E0B62FEB1D2DFF3EDC4E801D4E8
+D7C5F625
+1F5D1B8B4BE5A0DBB842F078106D
+54A33F9752D76D4C6CE5A1267D56EAD47405738C00C26D982DE60E8FC132E8BAB40E77BF45B392FB038F979A1E8BE0D488B7EFDC5DF4AC4329EC6A32345ED4A9A3AB5CB937C6AD751C0E505BCDA25FC697309B49AAD4EBBA3DCF7BC4FD44AB95664880E5423AE8DB2949902ED1EC0466D347CEF3CAD42404AE3312598BE1
+ABB4
+11EBDE9FEB7832FE485D932492C6C38E9089D1859645917D2A1F1567
+3E6AF37E
+BB5F7EB6EAD57AF719F3552D8020
+421EDE0DD2975C18EF8C094D87D129A8A9AC2EF23E2FE33E3C614C71CEC90BC4FA883A9B2FD1F8B47A1F1E50F6C286AC34F680AAC1380AE08FD28825806E96A95076A240A35D3EA19A232BDE93888C023E2C8556BBD39D3A1FCDEB203A287BB10FA7D59C232D4A
+756999B5
+7063CC963BCF822E703E86F8A3
+C4326C4CAAA69F36A1C0877D166E7D2373CBAB5D6D556A79DDE5ADDBE847B1F28F32B40D8C2A0EF0725D66AFEE7189A4D8EA95651DC40E2A582BDD9D3A3322B181D83279AF21
+25B5505A
+436FBCFC9A8610BFE12A3919755C
+48B4F711992E604D4F958199B4003384F0A940A459F80125DE2D07ECC2ABBD4A4600CD500BE10C43327169CC36766124D7301F2A6A76D1A64B159DD528D6388603993428841912371217ED7BA324056B3D5A701F2F400545CCEC47800E65D93AECACDD97E99D2E7D578192F79CAFBB64F0
+3156F7C4
+ADE7CC4CCC875761BDD8A06DFD
+70CDDB93C2D71DE1767141E5D60A8394E9FBD987DCB57E84CB668CE782B57E8EF7B3F8E85FB193B17BFDBB07C17D4B82A18C9CCC8112643E764636E76549370EAADF7F694EC82A15D2B17731B18491F16A7BFF55148CD76548
+23887604
+8420F80E35D8C098BBC3B676CB4C
+CA7B5AE8BA734E5C280AB396A5966543D297809ECBDECA40727940DFB24F5467F925E8ED926D6784B08FD393E9EF7644266877E56F686A9B72C8B9F8BE1C332E8C53E6E5D760B2151F6DA9701EF1D223627BD6485C586D88B45D19D3461F03D2C3522A8562350FE3AD9F8B082383C48766E017D86E9A42E036
+CC5D9137
+A6C198FB9FC513DE7FAFDF3784
+DC26B85B7F0ACA38824D9646DCD42B99B1BCF7F0DD2E7385B3BA60071DE73A59F932617542DF98CE113BB4E8BA026BA251780F32B8532631D4E72F52B4EDAA425D56FE0E
+563C4C00
+A22D4767419773CC31CA97B0D86F
+F2BC399B70A3DE18DD4AB1DBB8011DF1396B49030FB2774651B23D292E932E6689B53CF0D4003E5AF9C7DC6A002EDCB3D6F133A0A663D10002E6914F9612A47CD045A71AA28DC36D411C4C8D4313F94775036522A4606250E52F9FA862A4C2654515ADEC1349F168FCEB86AFC93EC43B5E6AE368D4020AAE9F4E8A0DF1AF
+51C0
+BE970BB23531E6F66EC29FB4125470458885CB670485
+E65E4D0E
+433A7E81C557605AA7523CE185C2
+DCEBF14AE5FAAB63
+8B7DBE16
+263781598BFF5063ADE5ED703E1D9C06E82E3D6B3994595CAC98C1A357BB7B4E4F63
+08D41B37F46C3D92867E9D71C6D378AAD22B01FEC49DFEDF0953FF059E3C70142145B1FBBEFE
+173F955AC3D038D929608321877736D5BA17EC0C3626DA761E04D1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch14b 14.00 /PSOwstdutchb newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+%%IncludeResource: font Courier
+/wst:courps10 10.00 /Courier /wst:courps ILEncoding 0 declareNFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<0e18262318241907010801091821161b2014241e01192224010d18142527241c211a010e18262922241e010f> 2207 558 0 7384 -1 s
+<18241922242014211618> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0506> 9346 13300 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13280 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13280 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13280 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13280 3 7133 32 s
+wst:dutch14b SF
+<080c0b160e1211> 1271 1458 0 2055 -1 s
+<00030200060c16130c140d000c170a10130f0c15> 2055 1458 3 4222 0 s
+wst:dutch12b SF
+<06070905> 1271 2086 0 1866 -1 s
+<04> 1870 2086 0 1928 -1 s
+<00> 1928 2086 1 1984 0 s
+wst:dutch12 SF
+<00121b18251800182a1420231f182500142418001924222000142100221f17182400281824251c2221002219002118262318241900142117001722002122260024182324182518212600261b180025231f1c26> 1984 2086 15 9531 0 s
+<15182629181821> 1271 2330 0 2027 -1 s
+<001a1f2215141f00142117002618252600252318161c191c160016222020142117001f1c2118002223261c22212504> 2027 2330 7 6242 0 s
+<121b18> 1271 2677 0 1631 -1 s
+<0021182a26001918290023141a18250016222126141c21001421212226142618170025162418182100172720232500221900182a1420231f18002118262318241900242721250400081926182400182a14201c211c211a> 1631 2677 13 9531 0 s
+<261b182518> 1271 2922 0 1747 -1 s
+<00182a1420231f182502002b222700251b22271f17001b14281800140019141c241f2b001a222217001c171814002219001b2229002622002418141700261b1800222726232726002219002118262318241900142117> 1747 2922 17 9531 0 s
+<291b1426001819191816260016182426141c21002223261c222125001b14281800222100261b14260022272623272604000c1c2425260200120a0f131112100b080d00261825262504> 1271 3167 10 8097 0 s
+GR
+GS
+1263 10477 9522 10477 9522 3370 1263 3370 clp
+wst:courps10 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<24> 1449 3504 0 1555 -1 s
+<206e65747065726620b174205443505f53545245414d20b1482068706973726471> 1555 3504 5 5053 32 s
+<5443502053545245414d205445535420746f2068706973726471> 1449 3680 4 4205 32 s
+<5265637620202053656e642020202053656e64> 1449 3856 7 3463 32 s
+<536f636b657420536f636b657420204d6573736167652020456c6170736564> 1449 4031 5 4735 32 s
+<53697a6520202053697a652020202053697a65202020202054696d6520202020205468726f756768707574> 1449 4207 17 6007 32 s
+<627974657320206279746573202020627974657320202020736563732e2020202031305e36626974732f736563> 1449 4383 13 6219 32 s
+<20203831393220202038313932202020383139322020202031302e303020202020202020372e3134> 1449 4735 19 5689 32 s
+<24206e65747065726620b174205443505f53545245414d20b148206870697372647120b1b120b17320313633383420b1532031364b20b16d20314b> 1449 6181 12 7703 32 s
+<5443502053545245414d205445535420746f2068706973726471> 1449 6357 4 4205 32 s
+<5265637620202053656e642020202053656e64> 1449 6533 7 3463 32 s
+<536f636b657420536f636b657420204d6573736167652020456c6170736564> 1449 6709 5 4735 32 s
+<53697a6520202053697a652020202053697a65202020202054696d6520202020205468726f756768707574> 1449 6885 17 6007 32 s
+<627974657320206279746573202020627974657320202020736563732e2020202031305e36626974732f736563> 1449 7061 13 6219 32 s
+<20313633383420203136333834202020313032342020202031302e303120202020202020372e3332> 1449 7412 17 5689 32 s
+<24206e65747065726620b174205443505f53545245414d20b148206870697372647120b1502030> 1449 9035 7 5583 32 s
+<20203831393220202038313932202020383139322020202031302e303020202020202020382e3037> 1449 9210 19 5689 32 s
+<24206e65747065726620b174205443505f53545245414d20b148206870697372647120b150203020b1762030> 1449 10072 9 6113 32 s
+<202020372e3035> 1449 10248 3 2191 32 s
+17 LW
+N
+1931 4886 M
+1931 5394 L
+dp
+N
+1984 5082 M
+1879 5082 L
+1879 5082 L
+1931 4886 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+1931 4886 M
+C
+wst:dutch12 SF
+<241816181c2818012522161e18260115271919182401251c2c1801222101261b180124182022261801252b25261820> 1856 5648 0 6112 -1 s
+17 LW
+N
+2532 4886 M
+2532 5140 L
+dp
+N
+2585 5082 M
+2480 5082 L
+2480 5082 L
+2532 4886 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+2532 4886 M
+C
+<25182117012522161e18260115271919182401251c2c1801222101261b18011f2216141f01252b25261820> 2457 5394 0 6268 -1 s
+17 LW
+N
+4438 3615 M
+6015 3615 L
+dp
+N
+4634 3562 M
+4634 3668 L
+4634 3668 L
+4438 3615 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+4438 3615 M
+C
+<261b18012618252601262b23180114211701171825261c2114261c2221> 6090 3666 0 8647 -1 s
+17 LW
+N
+5886 4716 M
+6862 4716 L
+dp
+N
+6082 4664 M
+6082 4769 L
+6082 4769 L
+5886 4716 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+5886 4716 M
+C
+<261b18012318241922242014211618> 6937 4767 0 8442 -1 s
+17 LW
+N
+1862 7512 M
+1862 8020 L
+dp
+N
+1914 7708 M
+1809 7708 L
+1809 7708 L
+1862 7512 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+1862 7512 M
+C
+<161b14211a181701152b010311> 1787 8291 0 3148 -1 s
+17 LW
+N
+2536 7512 M
+2536 7766 L
+dp
+N
+2588 7708 M
+2483 7708 L
+2483 7708 L
+2536 7512 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+2536 7512 M
+C
+<161b14211a181701152b010325> 2457 8020 0 3783 -1 s
+17 LW
+N
+3675 7512 M
+3988 7851 L
+dp
+N
+3851 7614 M
+3777 7688 L
+3777 7688 L
+3675 7512 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+3675 7512 M
+C
+<161b14211a181701152b010320> 4067 7936 0 5486 -1 s
+17 LW
+N
+5878 8901 M
+7305 8901 L
+dp
+N
+6075 8849 M
+6075 8954 L
+6075 8954 L
+5878 8901 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+5878 8901 M
+C
+<21220126182526011b181417182425> 7455 8952 0 8826 -1 s
+17 LW
+N
+6336 10003 M
+7387 10003 L
+dp
+N
+6532 9950 M
+6532 10055 L
+6532 10055 L
+6336 10003 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+6336 10003 M
+C
+<1d27252601251b222901261b1801241825271f26> 7612 10053 0 9350 -1 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Courier
+%%+ font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (25) 25
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0034 put
+dup 3 /C0040 put
+dup 4 /C0041 put
+dup 5 /C0044 put
+dup 6 /C0045 put
+dup 7 /C0046 put
+dup 8 /C0050 put
+dup 9 /C0053 put
+dup 10 /C0058 put
+dup 11 /C0065 put
+dup 12 /C0066 put
+dup 13 /C0068 put
+dup 14 /C0069 put
+dup 15 /C0070 put
+dup 16 /C0077 put
+dup 17 /C0078 put
+dup 18 /C0079 put
+dup 19 /C0080 put
+dup 20 /C0082 put
+dup 21 /C0083 put
+dup 22 /C0084 put
+dup 23 /C0085 put
+dup 24 /C0089 put
+dup 25 /C0095 put
+dup 26 /C0096 put
+dup 27 /C0097 put
+dup 28 /C0098 put
+dup 29 /C0099 put
+dup 30 /C0100 put
+dup 31 /C0101 put
+dup 32 /C0102 put
+dup 33 /C0103 put
+dup 34 /C0104 put
+dup 35 /C0105 put
+dup 36 /C0107 put
+dup 37 /C0108 put
+dup 38 /C0109 put
+dup 39 /C0110 put
+dup 40 /C0111 put
+dup 41 /C0112 put
+dup 42 /C0114 put
+dup 43 /C0115 put
+dup 44 /C0116 put
+dup 45 /C0117 put
+dup 46 /C0118 put
+dup 47 /C0119 put
+dup 48 /C0120 put
+dup 49 /C0121 put
+dup 50 /C0122 put
+readonly def
+/FontBBox [-25 -256 920 739] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684219633BFD75335C2975FAF42911E36B88625
+11B789B4EA32C03B98F900A4
+67910D503B3F7E49B1
+C357F8AA
+288B05E7D61F15EEBE0902AB660F
+2FCD056388F103A8C0E6481CF6F380EE9E185C00E47793AC00E782135F9DE46626A4E2CC2FAF36A80BF99B8AD9C40DCEF713276896B093498E3CD3A4D01E85F74FFA4E365F3E4E8DACF26B945730B3888DCF46A9278A13288AC8386D2A16A6772534CA3345BA48
+DCBD92AB
+570FA1EAC34A0F83DDBEF33E2B
+13994C10A272FA0B061F3EB088FD1D40860B96A870CD249CD2D7B0FD2C0D86D2014603E02402E3CC5B207ADE7BCBE652F82CE09A53560A462F68395F829A2745
+485F4586
+F0AD2A5B1F8C5E571512C29069
+BEA65011A0D30FE7832E8BC0C0418076789BDA1DB8C98A7E9ACA6BCE4FD7DF6CB09520192A6131D0F943734010063E8E394ED1C58B069575C2E28E6CE22A1D
+BDE82F3F
+0679AFDA41F488ABD4C9C2FE76
+B83BDDB273F197D3382428E3E3B7A41CB2DE8A95B62C074A510B580683C323386E229F9C63D746F820D368837D606E7690DC38FBC1D99252F4
+5659E082
+D0A56AEF3BBE4457DD854398BA
+98AFAEC9ADCF08D0E4AF38A1518842D34D868623534EC7
+F0B8E5F8
+87A3ED50905B6BFB93E1E54D62
+049C3E6445768EB8A33110E39E0B6C1A680B75EC04170C63255F22A60387C6
+695D0C8E
+98C71C970DF9665B0BD88BA505
+3465DD489DE5D3F38C3ED714EC7BCA725DFB40FB95A8946F3FB6B0B6693E6EAAE77061732D2227F508B97A1A96F16813C11041298219DF35237B2D28596E8A39C61CA18AC70F82311E6466C65F9570375112239842EA77571E87
+28D29AA9
+0C65768CDFB042B850C9349C36
+2FD595A418DC2E226859EE543A84E42B108EA3AB88FEC36EE363F99140893DDABEA879A3C287F3576F8B532FE58B6135030C94D9D2399881EF7F308DC728B62387C70ADC78C323664AC4B480E19CBBB2D94CAF81F1ADC28B9B3475F710B539A29C
+15291A0F
+6213DBF91B1219A9D422DD7FB5
+C5BC6F1F4CF24DB1E1022A57E829F26BB188035EBA3B90F178A4F5975A0F50FE33C83B03D825C49B1CAB88470E66B8B0BB7EE796CED5
+3506E926
+476C958172153056C4D02D5B14BC
+98B19001FE57C0B27A7E4135F9F6D9FAFC6A678AA8457AFD0D8F98391EC5745191C89A0888962B5E87677EC898C920A62014EBA353851327CB1F4846B8FB3EE227BEF00A909D907A11EC34B4A8DFFDD34308566EDBAC20FF0B07045DB5A9525832E4D15078EDF11609CCC80EB8E7798774CD5B
+0B987C57
+A7F96263A8367C6382C6A7FFE098
+97138C27DF14F1BE92714CAD3BA0233AFCDA37D1043AD9AA7CF8F507B77E1A2B168FAB3A3534509EB4823CB734047918007044CE4C4349EA6165589DCE0F39E6D0F06FFDD96DB379C8C1374B80B5C4F8A011D87D15975AE8C2038BEC6716B8862F699332EA38FC652E751217BD717EA5AE9A15EA591797D73033EE0C25D1
+5A2D
+B5
+73164D15
+2AE6AF88C7AD68E00ABF71A39E
+F59C9E97C46322F5615F144ADBCF14AF1E940B476D5CF91038FB40D7D1D1966F20ABACB521F42DF6B3A9AD61FAA3B7478F3DCF10993A9C6A08C74A0EC3906E273BA7B28FB17030AB32527593455711667B9A32492F254F1A769E6F2021BA7CBCD8AFB5
+CB9DDA21
+456DE8AFFEEBA196D22725A1B493
+6A5FC42D6C77BE7FEF79D7A4F8D1DAC4EC3C32921E50CC18562BC8AAC811C67ECB9D124F9C52873DF90523EE5D7CE0712A2698D5A2394036FE83B18F6ACA848B282CF8A836026E1A1BBB5E49C48A5B570F7AC54824B6D669C5B4B4C28C4D8C1E1B19FED9985420352235623AFF918E7588BADC6F895229C2ABE955BD0AB2
+FE6A0D4D
+81A8FDDB94EE2D6B50B5912A1A40
+87B40585594B350B3B7A97F062BF0A38D6ED06DC5C71E38ACB6E0468361B3D1D2D5E65A9A641DA6D6B59353F0F99F24751FE5963FE2144D206AFBB542CB155FBD8310C2F06B587D5C4182A620197128535227547D459EDCD34018B511215A2F861353689F4B0F17D2C
+23640709
+FACF98469CB903EBCBE4028B00C4
+38969C2E1F15B5A1744CDA69F94872F781B8C745EC8767ACED4B2F121FAE07E71B094A2638EF2D5B2F2BC7DCB92806867719AFA1EE7EDB8F5F30D41C60EB8FD002C479EC0E9ECD68D56B0D6BB4D2CF53AD4B8FA0053EA289A91B3D336C3FCEFC6C4ACA83D934C7CBD3DE1558B4D994
+F5F620B5
+C830437A75EA0B82B49F8C8409
+CD1231C13E9660CADBD7E9F77A31A76783C9B6FAD4934A97B37370590045E9C1FC261BC264D11A1E9CAA837ADAB9AD9C00176744C3E51F961E6E76A6A8EA01ADEDA48688AAA51C831FEF7350F0A4E6F81859CAB72A92AE9BDCB853A8
+6FEAE12D
+6C3513884C9513B83B911E2C01
+E031D3025983F526BB3B7909E382011370895A90EC4C5171DFC6F002C69512B9DC2B53BAACEB9402D6B2DB83941DAAA29108E2A44C90F59DEDACF430694F6BE0E7180A025199A5AF3C9C127DD0135454BC1197
+1EBB045F
+89F42B4ADB176181E73806017CA6
+40FF1CA7BF2EF1DB6D5FE1C9FAB82AFB7DAF24C00239896FA274D8A61444DF34342DA0CF39F2DD181EB6F47E95207C2E5DA19DC2F68F7D5D0D3A558700694481A21E35704AB66795B00522076BDE91E4D2A846B5AB8A5EBEB86A6B2EF5B17ED9EBF5995A2B7167BCABDD
+785DE73A
+3E1A42174E74C74B90BBE53AD1E9
+C1EA0ABCA658AD3D06861D99382056F41918D095A64509D358199565846EEFA045C313A4BEA59ED433694E621D7C5B0DC72735B16076488997A69A3B60B64413C932A97492412E7AB9D50EE2900BC88350DA08174D86CDF9BDFDAE82CF4A639C22950B874C5806286D053C9B47BB5FC0870AAF6A2D9DA724BCBFB7F56E75
+72D75C1A
+D3B2205D3BBAB75E737F9C2D6860
+81DE6A264179D71157A5501DE8F9A349080E2A4A0E44AA2747993814B749A2385C5D8D76022B2B7ACE9A9BB7967C22916AD6FAEB418238159C531F3CF69D0E2D18AB21D7E5BDF70AC6B5324939D71E4A87BA900AF17B12E983310EC192FBFAA8838D55D869D5FE03D4A02178756669872BB57246C61C25AE9A6B22F36EDF
+DECC
+4354CC
+D3ABC108
+0AD657A933198CE2BA3B1EC026
+9ADC9B695DF7EB46576B3F0A4905C7B3267CAB406572B56074EA17371F8F84378D36397AD0E80E46F7871F0A816A755B70EB6F3FAC93D5720679D7619DD4615BE327996EEEACF85A84766F0CC9FE3C9DF6
+395D7264
+75D10859943FC78C242AF180A3D7
+E8EA917D3C761DA34645B32D11CDDECD2D4F02AEC0864D3F6DA0892D5195B3648F194EF06E8228E5EFFAE9C77CB2B928249F32751B4CF58C363322B25764A52D78E080C09B5C59062B99F4A678183A4135CD5B5A9E831D817CE5DBA19FC12EC82977EE19
+3DB6F319
+DD22D5D3BA4E261FE29840FFB6EE
+0B0A7D70307075B9A6512393008E37B2F2855D4DD08101F16CB90C06CCE34DB26D03ED09E676809597C119CDE435F1E1FF2D459FB8B93848F6D91A5A1A01E0099BDACD29CB851C2E8C894550E7003A9FD5A9CAC7918FB9ED096C583B62E85549FE7878FD590E8551C66A1D9D67F09CE54A3200
+EDA95980
+5A3A13867A761FD69D8BC565D2
+CEB7E3B8168BBFC5C486AF2DDFF398978EBA70AB8BF0
+ED746055
+54E9641F0F6515A557CD4F6DD2
+9CFE584CEC7AF15B56F56924A5FA194DC0D0910D161F8852F19AF6A72C0EC980905D2A9CE48196D67A074866151C01FA8B34785E94DFA09D5396
+5CC42935
+2BCCB5A1A19B2E82F98C2E5CA986
+6BEE012420BBCF9D3C293DC93545D533118C5E6879AF92E6C0DCD616746672E8B968BF88E99793164248D4E966650E1224267DA49FFA88983F2860F56DEFB2222A6916491B197078E870C82321D528D7EEF3DB78C655A6933F2763AF09F22C9DDF74350A60AACDF586B1EBC6A93B620026C06A6F1BCD2C7A4831B2E667B2
+2241
+D68813
+6D4D1267
+007CB9B6C79D33E4D9E49663A5
+CA73CA34FEF610B5950EC4F5F4BA3BE22B1E0B6E36C769D294EF76E1574045EAB9B409E34FC17CF4CC27E48611B709FC0B9EBB870BFC6608F9402964256BDFFD0FDFF48BC3EEB29118889309409470712D131262349361A4
+643F5208
+77848C2143E6A3B0525DD496AC
+6209BFD5252576BCFCDACFCA6C3CB588D98CD818648366EE1DBA1BD2FB5F6EB0E4EFEAD44B00B8AB6B3CF58814DFECF9A864DF9E4109DF935C3A201F85960A2B3DB50692DB709F8AFD436AC79B1182401EAC
+A4EBC547
+2FB3BF81AF55E1CAA85E856A8C34
+BC6B1DFB0CBDA6970F40DB312106D17622DE69556F4D1C75719055D5607FB3E909FD13A46F048989828DB19789F6584778BFE2C7B9FD89E47AA1311032029EE8241E53234376C26D0A9D6E7E12F04F180065A5EFBD42C14DBBA272D511FEDA67F7ADCCD366735DED68C30D175F43
+09AD0D84
+6AD11D5D5EA30B77B2037BAFBC
+79F33E07087C5449D26C1AD40216B4DB494892B603B00BA8AA9A3138A0D8E64B980073DF3DCFC7ECA96ECD173FBE4CD4DD02FB5BF96962B311610DFDBBF2B61A1ABC1C521E910BFB28541F84A4A69103F746EB30D26B16D46B
+CDC07761
+2646D133C6CE0E49FD88A8C849
+9A8917CA2749C534F4AAF0A21BE542267152F53984DB5830305240134B40DCBEF02F92438E9C09A8A1604C30242189CB19ECF90E85607B47AF244EBDAAC5D8CDDC07BD10B6EE85F07D8481C4956474F1F3E42A6391011F0F0F8A81A2
+91A6BDE2
+5AA83F1228C6995B59BEA72D599A
+27C0EED6CD4DE0F71AF2576A3994AA61DF6FDABC153689630BC9E1533EAA2980654458C499101C3E2B2A9E6E4E1BE7981A40B80429EE70D90110DA8420F25C7BA9C9D3F842A5CE5F9894A200E82EC90CF61F873E014973C892CCF969B1C8904CC9170C14D0030AE72A875789C1766312812AE90D84F3DA344187F5B952F1
+6804
+51A33592EE26E65855E6099B28749A9595F00DEC295D3718DF12FF907CECC63CF8F0F6659E6C32C241FD5862F50C1A
+A9C57767
+54449938C69E248821F378DA9833
+8CA7B9A3F2293B8701905EB828439CB0E01BEF31C1AAC13FC3BDB4D6775406EF6ABB2CC40F0AE83F681B11B13616E297091BA7C393260522D627D6B373AA2F1B9F7866086B9D5E6D8DBE9B2875F59CBBD7DE4595F9DCB77816E97533F74F10B426B9AC29111FC2C87A785E056D
+22458A8A
+FFAE708CB998B4BB4D74E464AD
+B3D3F07F0DDFC8913D5A6BF43850574DEAF9DDDCFE591CCFE0820A942486FCD21CF7385E3AE55F80C1A0BCED72B60DE23F57BD73C0F1DF0DE6DBDF61BCFA75FA1C35BF5937272755A67385C07F0D3842
+9A85383B
+395CC0F0D564722DA400548D553D
+4A6EDB246A613951D41B7C26FFC681507171E3EE6880EBDA422949579046FC728C4730C183E70BABD04B18AE52ABB2D2F8E124F28CF63BCE41FAB81C4E5EE963E911B8293E57E0643924823724814A5C65C78E0789DE562385CE03AC8157B92AB66110692A6E1804BE9319E9900559A741519ED3ED8DB15FEA43B3A2BA92
+23A2
+0307A4BFC3D6FC056B52C7E48238D99D08A3A6E59D7A4EA2A1A7AC6E9ECDCE7AF4E4E9
+5BE20EE0
+A7B3265081E21B3F5E80E23A8F
+5206C8177382EA8AE1CA57D3F6C477607DEFCF5E6052C86B547CD8C7BFD773A87845A5D715450EF32CC0FF4B0C22966FCDDC12705C60
+245C8780
+2FEFAB9A9448E833DBDEB0652C35
+B5C82BB07E6A8238BAE4579370A3CC10A449F955AB80F93E71C169072CB504DF0AC35EAAD90212ACFF77F2DA1B95FF7581F19ADC78CF907F4E3F6B92C3A1AF466A557608D216C98692ED35A19DB835306AF32726D75EF25C56070D1BB55DC0FF0CBA94144AC7D6D181434CB3F08A2DF326B2876B77F96FFEA887BE5BACC9
+4139
+2C70AED672A1BFAD0006939289F181BF7D597C3E1B50C58CC31CAF924950D1
+4F3D31A4
+19C96A5DB3698398FD475DD8C926
+95818BA49EBCD473BFBF7DE8BA96219ABF12FAEB314EDAEE7C44C3CBD6F828D9FF7E0552BF093F49088D52FB6202849D55700A1ACC58AB7022AA012C8159E20CA02A6691F9109E7E1B451AA5A9F195B862686D4F4D7DA4BAA00328A16C66DAF5925456CAAB3D1F19B9FE33A5
+A144C9EA
+4B8CEFBB7DAF8A167AE939BD9F
+4A12191BB5E3625429478538D2D556784AABD96C2533C23198C553CDBBB81A14FB9E5A2C88202C02B4A1A9E0D3B261FEA65EC6EC11AFD2F07AAC567FA2B4C461193BDCC30300
+CCEEA92D
+72B740B366626B3EF4616DA61B84
+D00CBC9F30B43EDB6EC95A5EA74973C33CCFCC79BC0DD9BDA4E1E6BCEEB1F441C508DAB5D2418C04AC36D3A93EF41990C7E1090651E479C978D9F51EB7F1A726FC1AC8A671FFFF508A52959C78E3F8B94E26BA1A8AE18CD846B5B95548E34658E998C69AA5B97BC6BF7A00A03EE25ED3F4C427EA5A3E16
+F40806AB
+D6EB0155C581AEC83650462AC1
+FB753A41723B6EE926EB1F3998121E9BBAA706B5E93494911DF33201525FCBE0E0EA0056F34B4833F5722F767C51292A97CFE29C831D4288DCF58451AA8493E7302A35FE4965C7AE700729CD14F401DA182D22358BDA8E
+9A5B8667
+D2A25E8E11783407EB32DC86FE53
+5B622BE2DCE47FD3E766DF890956F4FB470FE053E9885E0A000475D55C7722BF4555DA8564A0506AF8252DF999A8235EBF182BA0C7838E67CE6C56466B7EC53081823C15FD1E45492B75103E0F5F5C47109826E249117E523EC8D2ED9F8B50023877F11B04262968589CBFF636B6DAE1A00E636620E20B6C70D336B9
+3D014C5C
+E76E4DEC40F0AE7D38A1E8AB45
+FFE334538423A2FE603F0C19A61F58B9ED8405385F6FDA8CD3D9D97042703BD46FA4EE439E8BD262A8EB78D67171D36A37CEFBBCCFEA6448157BDE5040D09CDEDB55B38EEF
+0EBEC440
+08B959C198D3337342A2527C9F
+05D84934DA7818D9E5892162A62F99C3E969D47403643CD8553F60F9970577F6AF67686D4B83DBCDA098A836F419A8669F1AC04EEA1F4A62769EB7074578ADD73773FC61B261F55316670495AE319B6E66CC93F8070AC80AAB7FE863631DDB4BA598
+8F1369AD
+880A8367D38B8A41B0229E49B5
+D231FE5E5869A0EB5A5FCECF63CA69963F7FFBB135F96EF2089A107838DC706E5E488DC445C8C46BD6CCAA321FAE73E81FC52D489B6227B988877BF192BA294673648C6846DF58E95EF0D1407F7A03ACD4D715C43AEC1F9720
+98218223
+FF690B08701A6F5A2AFBFC861589
+2C4304681DCD8476B5140B6B4C49DC7DF167D688BF505BD55DD0A18A091AB092BABC98F525335A5A1DB90EEF03E6FE2C64B4D36BCC1AE6C81785AE3224C74D88E29B8D4BCA4397EB5B838E673BDB4DF0E755AB4FB7E48167D66F3068BAA7885910BB9397805A2AC2A6554629C7A5A84E17EDDE8D9A7DD21041F8ABE7EFFA
+60F6
+C7AEA543FF828777260B5458FD73
+5FDA83A0
+A00BEF879510568CA2718F803BA0
+6826F2D73CCEDA351B37D7F5E75107FC6182DAF9489B829152B3FC18969944E57C18BEC29BF680138F9817839FAED7BDC818F8DA52A8C5B44B427FFF624F5BF08EBAD15871FFD7F045BD02D0DD9D2D8137C322B5504975D2C7BAE176B302E45CFF6BF32A738698923DE4AB4891E39157764FFA29F10F1E84AFCFAB89E240
+BE9A
+FF8F6A25284F03B80B92A4E23CFA6A65F25838D61318C2077C
+AD1FDB65
+6919CF3483609C4C717B67A58DE4
+AB7B8519BEE03A01DFEEAA3FDA360898D820C0CE306FEB3CD549FDAB3A2804B86C9FA7504C4BACDCFA00725E7CB05D5683EB21A77BC05945C264E972B148494E9D93D989BE438C5689D503E01835A0E36D0B58DD50ED8ED6F3CB512E09727C0E3E5C97929D8022D5DF0B422A5468053A9CD25A472A214DF9BE16D21C1ED9
+537B
+8F80F41F
+2D6CB6E618ABCC21C518ECD565
+2B7FA2CEB10FC110463D88D6719ED428192A3BD951041F70B04DCC1FAB5E5F92B9354F6875CD719EEBFEF7EE89F6B60FF9AA05852CDE234D831B2C0B0BA170
+7EFD84CC
+B35DCA52FF8440DEF2F3185C146C
+3B2548A3815A4325
+9203AB93
+B1FD4E9AF17EA3827E8AF12B0C5A2EFEAD04A40859BEB90195FD7DDAF3E82D59078A
+3AF8A963314CB015C226788C0FAA7AD0D1C863A3E39AFA65293A8DB68231DC184B01FD4A7227
+25606377F1B31955B476F75EFB9945F8F2724EB1C4167B13E4C748
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+%%IncludeResource: font Courier
+/wst:courps10 10.00 /Courier /wst:courps ILEncoding 0 declareNFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<111f2c291f2a200a010b010c1f271d22261b2a240120282a01101f1b2b2d2a23272101111f2c2f282a240113> 2207 558 0 7384 -1 s
+<1f2a20282a261b271d1f> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0809> 9346 13385 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13267 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13267 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13267 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13267 3 7133 32 s
+wst:dutch12 SF
+<1622232b> 1271 1431 0 1665 -1 s
+<00271f302c002b1f2c002820001f301b2629251f2b00232b002c1b241f2700202a2826002b28261f00170d13191516140e0b10002c1f2b2c2b070018> 1665 1431 11 7584 0 s
+<282d002b22282d251e0027282c231d1f002a2321222c> 7558 1431 3 9531 0 s
+<1b2f1b31> 1271 1676 0 1719 -1 s
+<002c221b2c002c221f00282d2c292d2c0020282a261b2c00232b002b252321222c2531001e2320201f2a1f272c001b2b002c221f2a1f001d1b27001c1f00170d13002b1f271e2b002c221b2c001a1a201b232502> 1719 1676 15 8803 0 s
+<002f232c22282d2c> 8803 1676 1 9531 0 s
+<2c221f2a1f> 1271 1921 0 1747 -1 s
+<001c1f232721001b001d2827271f1d2c2328270025282b2b07000b252b2805002b23271d1f001f2e1f2a3100170d13001e1b2c1b212a1b26002b1f272c00232b0027282c001b252f1b312b001a1a2b1f272c0200282a> 1747 1921 15 9531 0 s
+<2a1f1d1f232e1f1e05> 1271 2166 0 2083 -1 s
+<002c221f2a1f001b2a1f0026282a1f002b2c1b2c232b2c231d2b001e232b29251b311f1e00060028271f002523271f0020282a0025281d1b25002b2c1b2c232b2c231d2b001b271e001b> 2083 2166 13 8188 0 s
+<002b1f1d28271e002523271f0020282a> 8188 2166 3 9531 0 s
+<2a1f26282c1f> 1271 2411 0 1921 -1 s
+<002b2c1b2c232b2c231d2b07> 1921 2411 1 2791 0 s
+GR
+GS
+1263 10577 9522 10577 9522 2538 1263 2538 clp
+wst:courps10 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<24> 1449 2672 0 1555 -1 s
+<202e2f6e65747065726620b174205544505f53545245414d> 1555 2672 3 4099 32 s
+<55445020554e49444952454354494f4e414c2053454e44205445535420746f206c6f63616c686f7374> 1449 2848 5 5795 32 s
+<536f636b657420204d6573736167652020456c61707365642020202020204d65737361676573> 1449 3024 10 5477 32 s
+<53697a652020202053697a65202020202054696d652020202020202020204f6b6179204572726f72732020205468726f756768707574> 1449 3199 22 7173 32 s
+<627974657320202062797465732020202073656373202020202020202020202020232020202020202320202031305e36626974732f736563> 1449 3375 28 7385 32 s
+<2020393231362020202039323136202020392e3939202020202020202031303530302020202020203020202020202037372e3437> 1449 3727 29 6961 32 s
+<2020393336302020202020202020202020392e3939202020202020202031303331342020202020202020202020202037362e3130> 1449 3903 34 6961 32 s
+<24202e2f6e65747065726620b174205544505f53545245414d20b166204b> 1449 5701 5 4629 32 s
+<55445020554e49444952454354494f4e414c2053454e44205445535420746f206c6f63616c686f7374> 1449 5877 5 5795 32 s
+<536f636b657420204d6573736167652020456c61707365642020202020204d65737361676573> 1449 6053 10 5477 32 s
+<53697a652020202053697a65202020202054696d652020202020202020204f6b6179204572726f72732020205468726f756768707574> 1449 6229 22 7173 32 s
+<62797465732020206279746573202020207365637320202020202020202020202023202020202020232020204b42797465732f736563> 1449 6404 28 7173 32 s
+<202039323136202020203932313620202031302e30302020202020202020393832322020202020203020202020383833392e3036> 1449 6756 27 6961 32 s
+<202039333630202020202020202020202031302e30302020202020202020393533342020202020202020202020383537392e3838> 1449 6932 32 6961 32 s
+<24202e2f6e65747065726620b174205544505f53545245414d20b148206870696e64696f20b1b120b16d2031343732> 1449 8554 8 6431 32 s
+<55445020554e49444952454354494f4e414c2053454e44205445535420746f206870696e64696f> 1449 8730 5 5583 32 s
+<536f636b657420204d6573736167652020456c61707365642020202020204d65737361676573> 1449 8906 10 5477 32 s
+<53697a652020202053697a65202020202054696d652020202020202020204f6b6179204572726f72732020205468726f756768707574> 1449 9082 22 7173 32 s
+<627974657320202062797465732020202073656373202020202020202020202020232020202020202320202031305e36626974732f736563> 1449 9258 28 7385 32 s
+<202039323136202020203134373220202031302e30302020202020202020373633342020343535323520202020202020382e3939> 1449 9609 26 6961 32 s
+<202039333630202020202020202020202031302e30302020202020202020373537322020202020202020202020202020382e3932> 1449 9785 35 6961 32 s
+17 LW
+N
+6142 2817 M
+7719 2817 L
+dp
+N
+6338 2764 M
+6338 2870 L
+6338 2870 L
+6142 2817 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+6142 2817 M
+C
+wst:dutch12 SF
+<2c1f2b2c012c31291f011b271e011e1f2b2c> 7794 2868 0 9370 -1 s
+17 LW
+N
+2750 3857 M
+3135 4308 L
+dp
+N
+2926 3959 M
+2851 4033 L
+2851 4033 L
+2750 3857 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+2750 3857 M
+C
+<261f2b2b1b211f012b23321f> 2729 4562 0 3872 -1 s
+17 LW
+N
+6439 5324 M
+7260 5324 L
+dp
+N
+6635 5272 M
+6635 5377 L
+6635 5377 L
+6439 5324 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+6439 5324 M
+C
+<2b1f271e01291f2a20282a261b271d1f> 7710 4393 0 9343 -1 s
+17 LW
+N
+5209 3654 M
+5676 4138 L
+dp
+N
+5385 3755 M
+5310 3830 L
+5310 3830 L
+5209 3654 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+5209 3654 M
+C
+<2b2d1d1d1f2b2b202d25011d1b25252b012c28012b1f271e> 5442 4359 0 7493 -1 s
+17 LW
+N
+7201 3715 M
+7669 4200 L
+dp
+N
+7377 3817 M
+7303 3891 L
+7303 3891 L
+7201 3715 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+7201 3715 M
+C
+17 LW
+N
+1864 7104 M
+1864 7612 L
+dp
+N
+1917 7300 M
+1812 7300 L
+1812 7300 L
+1864 7104 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+1864 7104 M
+C
+<2a1f1d1f232e1f012b281d241f2c012b23321f012827012a1f26282c1f> 1796 7866 0 4443 -1 s
+17 LW
+N
+5592 9730 M
+5592 10238 L
+dp
+N
+5644 9926 M
+5539 9926 L
+5539 9926 L
+5592 9730 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+5592 9730 M
+C
+<201b23251f1e012b1f271e011d1b25252b01030e11120c170f1504> 5523 10492 0 8218 -1 s
+17 LW
+N
+7174 6883 M
+8065 6883 L
+dp
+N
+7370 6831 M
+7370 6936 L
+7370 6936 L
+7174 6883 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+7174 6883 M
+C
+<2a1f1d1f232e1f01291f2a20> 8133 6934 0 9201 -1 s
+17 LW
+N
+4999 7009 M
+5253 7273 L
+dp
+N
+5175 7110 M
+5101 7185 L
+5101 7185 L
+4999 7009 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+4999 7009 M
+C
+<2b2d1d1d1f2b2b202d25011d1b25252b012c28012a1f1d2e> 5253 7527 0 7261 -1 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Courier
+%%+ font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (26) 26
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0042 put
+dup 3 /C0044 put
+dup 4 /C0045 put
+dup 5 /C0046 put
+dup 6 /C0048 put
+dup 7 /C0049 put
+dup 8 /C0050 put
+dup 9 /C0052 put
+dup 10 /C0053 put
+dup 11 /C0054 put
+dup 12 /C0058 put
+dup 13 /C0065 put
+dup 14 /C0066 put
+dup 15 /C0068 put
+dup 16 /C0069 put
+dup 17 /C0077 put
+dup 18 /C0078 put
+dup 19 /C0080 put
+dup 20 /C0082 put
+dup 21 /C0083 put
+dup 22 /C0084 put
+dup 23 /C0085 put
+dup 24 /C0095 put
+dup 25 /C0097 put
+dup 26 /C0098 put
+dup 27 /C0099 put
+dup 28 /C0100 put
+dup 29 /C0101 put
+dup 30 /C0102 put
+dup 31 /C0103 put
+dup 32 /C0104 put
+dup 33 /C0105 put
+dup 34 /C0107 put
+dup 35 /C0108 put
+dup 36 /C0109 put
+dup 37 /C0110 put
+dup 38 /C0111 put
+dup 39 /C0112 put
+dup 40 /C0113 put
+dup 41 /C0114 put
+dup 42 /C0115 put
+dup 43 /C0116 put
+dup 44 /C0117 put
+dup 45 /C0118 put
+dup 46 /C0119 put
+dup 47 /C0120 put
+dup 48 /C0121 put
+dup 49 /C0122 put
+dup 50 /C0262 put
+readonly def
+/FontBBox [-25 -238 920 722] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684219633BFD75335C2975FAF42911E36B88625
+11B789B4EA32C03B98F900A4
+67910D503B3F7E49B1
+C357F8AA
+288B05E7D111C7F4CD7B15B1A449
+1290BFA0B8B7328DC5967954B83363C540B8FEE73653528D8AD5F9D471555383869FA9A995DDC29A03BDB2D160D21B0B2C285BE5C279010060370FCAD92162D8E20734DDBDB49EEE2EAD3452E65D820A8F1264C52710D6358DFABEB7CD20D6EBCC532CEF4073C336D2ABE51E0A97D89B7BE6B841427FDEA5E26FDE327D1D
+024C
+E5F912E7786A78AC5FFF93FBD021698604C9242154CF257CC5686485884D185CBC47DA8600BFD20AFAF18077374850A97F7267D244E9325932C56895BD2077
+CE2CD6E4
+727616DCB5FB3823901B1A3BDA
+D73A5E976C926279FEA2CEB27ECAD483926DE35490114E50517A81EE4DA5E264AD19192CC41A747D7C76FA67AE1F46B92C43C138E20ACFF5E2
+D45DC758
+195B113F0588D314D0A36B6B58
+8ED0ED383AEE745C837B21314B7658A83991E27D4151D9
+82570B62
+869A01455756716E2D1DA84FC4
+0DFB8532D1454BA2002467FE3226D2C85A317B431C35540DB192F596B731DB
+0716B13D
+D51BAC7FFDB1B7585EE08E8641
+C30244BCE05DF2E1037A771748E313DB53D7DB056B2C9CF916C7D5260AB6D76F17F802F6439ACE3B4B0A2B0B7125B906D0A2196248C350CEF5D491B082966C562787EF55428AE5A7A761
+682A4038
+50D1DB036045A1D5CC3FD626CC
+47D247CCBF1B8D49E9FFE203FCE5A416575D3D7952A09222FC589543DEEF14A6B7596B29D1D86C65D6EC90A4BD344438E3338F5D39B5F0759122390DC7A09E
+5D0CC053
+CB9B128E899B088FB2835E97EB
+66928F4548079559F5241598E410C7E2A9883923CBC56A403C7F344C30CDA339AF15B621DCB0EF0EF9D270C95D9ECEB0F01118BE99E0BDE4749316E69E12E4F1222345087A02568D76C49DBC199AC1E17015F6AF3FCD6537E191
+AFDF07DE
+37BBF24D3BE2E1225A2D2DB7F7
+BD8C205682EC872D510EC70CEE76CD9EE624BBE19F1C651AABA282E58059B6F7E7E9D2266EFDCF4DC0B4FFF31E4ACCC7D6780B8D03B088FBC1D4
+7AA08D1D
+27372B6D75A2DD4D1BEB6A3E1B
+F76F90C66BF0D3DFD5D5F0E3CAB977482B7A44B72ADD19E028C2616D17B8922C93F669DEC7A7E576FBD1A1C520BF3C03173282D2BA37B650D0514E553665472185F9A77727B3B0600F6794284581D9765FA84716F5779016564A394262823B1294
+DF8CA879
+2F15EB66F00D3BB77D0B800320CE
+9D1388EBB0A0DE5AC48C706706EB8C0F33A2ECF32D59AED5725BE5524E6FDE37D51559192F456FAA1FB8433D2F2C6A8B17E856A9B7204A3E571CA10472F6A44BBD2447B987F7835F8ACA4597FD65C66A548F29C7EBD26BE5D3922870378F9175D087E501
+294450A6
+39D5B97905D9AAA3802141083A
+67AE20012C6FC543F543EEF50136C7FD0A118C69331EA21495D314CFE3AF854463CBDAAEB2561B98279CFC73588FF4C6481D4EF8FE75
+11BC38E9
+5F656DDC77C89DE21E74DDFEF1E4
+7302C690D56416277B4518DB9395275E97CC7586B71B74314360C0F9C8CD48BF9C9F8E5DB070D56DDFE019CD45100BB489935D04AE9DE34803BFF933C826FD6736309439043A3B5B3BAA37DC9C151E3E22A7BC46A32AB6816FC1BB7D31C7D72AACD3A9F4568D836912094DD7998700DB4EDC52
+F759826D
+482D22FDABCD710C66C6343E2368
+69175728B7B6D7B3595E13B98BC449538B2CCC8B7157CF35F6F51CF23569930E741D17B8F07B81EA92058916129F4297087D43961D9B1AEB9248BB1B5FC02BE75E448536E9D74B3E13EA1CF6A97B311DA2C872516D5C74559E6E67E26477458D7B4C519F5C05E128D90B10FB8DD2D7AAC8779A6686CFADE0EF2EBA0F4E2E
+D0F0
+CE
+EAE21B36
+6EC03DFE8D7800489D630F9C4A
+607450E88D54F30065A1DF717F082E2BA49E4D95C3626ED95C2BD203A582FBADB744BA3FAE1CEBA6382730085D7EB54F758E91F7FCBA024A4830CC2F999A54B994BE15F900D75550D7A9F5CFCCC2DC38B6CD1C3A2F86CE44E85181EDDBB88A2AD11105
+C28CA28A
+F6BEBF3D4F786F5EEBF240E43A7E
+A1495801981280C4E1267E856DF114A6F8145C1EDA76BC37B73AED6BD002B3DCAC8D55B4AC90ABCC5EF4125E4BB758900FA1E046D7D40B6835C34255ED7D376DD7098FB01DE9A5F8AC58797BEEAD5EACBA97BE3F06F8684763D70D52A924622B169F7FF590C0747C4FC0EAE95F810DD9E7CCA8BEFECF0BCC4147D841AF81
+70851B4B
+D08833B7A5E7CD0E5B75502CBDEB
+3982F8578A3321E1786CE99BFEB06F453431D85273FCF0CF7954CC4A500B81EB04674BEB6049F60308CA51A9C5AE751C59CDC0DB123A28F07B5E8A316F4CFC773581AC9C9F76DD66ED1EB021CB95C48E583D6217FCCE115CD1CFD5C8BBE37BD9725A521FCAEAAA9FEE41DC96663749
+E2145B81
+A0D24A6D860A81F9F78E13E483
+D3EB22637CE5023582F9EBA2343D4240E0B933F47B44C76F1D09CCCD4E2FEC6BAB58DC37CA29EF37CA8E4543D1B1BE344A7530FBAF051BB0B27679E21DD23014F69CD8BE7B0D9B83360F2F5FECB8D3C95C6C9D452EDCEA3CAD0D5697
+7F0454DB
+47FF6BA87C454E69CDF98508290E
+2C6D80A601AB2818191C1033EC7ED0B7F820AC4817EDA9B8B0ABFBD4624711CBE33637C677E8DB12167ECE7D6D2FD9482623E51787AFF3F5DCBC2B57982C8523BC5A94A2E346EF4526D11B6457D4CF89C85407393DED5FFE2A7ADF7FFA7A2FB63B5B4B24EE83FE0CF4E0
+9AB4D733
+4D04E9F3D93B0080ADF129C7D109
+D80B8B7202BD7E8D4ADAC5A618EF47B3179F40EC88E591E945DBC51A5AD6B87E774A7224944D22452A5FC93D1C443B0EB3A9C4049BE52F1ABB6FEFE334BFA6E3FDE42C985578B032419817D77524DA0C2F2F852DD77421131436374D140627C92CD16D9AEC494ACBF037067125B678F86F17FB2D7F04BD1DB6BAAF3CB2EB
+0C1312EB
+EF635BEA7DCFE5D709D5115ADF2D
+E08AF7B3AF4BD66EB6192879A8781E8C8F355970419FBC4715A4C0F4F9E6F29696D3BDB480E19990ED9ACFA8F3F3E0D4FF9D32B4F1866DCC0E49E88D76A4EBDF3A5389948E640EAF5C097675FCC798FBBF523A210B34B6DCB493C27FF4E4122EE6970E54547AA665E6C53AFED4E20A2C60DD6015FA36074CFBD9938E9284
+617B
+CB4640
+65CE96D7
+6965CA2EBDBC9FE506B7FB07FD
+785518D605144E1BE93893C604CF2C6683E1CD59E7A810E64C07535F6639167BF5CDB8215FFE89C7C53C8A30F4CB0CEAEC875A0018528A3692DBFD11A5F3A9A5BE2043103AE58A42681A410A1F30C3893B
+620FDC21
+94496307D90DA788054B2679399D
+EAA3C4BCB302291F849E9594F81D023B5FD814586CA6ABD2C8272CAB00BF9541ECE42D17158479871DD94A599C720A97FCEE2B778A83DEB55F1581C73BD4DAEBDE526632C1DA494FB4932B8595CEB4DE2752C6803D5F84B23A96D0F9886DB7DF62275CAF
+6583BB6A
+7E9A5E6FB33515F82634253C04
+FCEE9CB2B36FA783AA49156B39ECF2C4FC7BF775EB93
+B0C04A48
+35812427096020B53CD773E578CE
+394EFFA17D9DDBC89189043727465863A6E29918C9F55695984F4C594CB41072D644D43F2DA9836DB9DE1284DBEADABA4D564ACA19C5B3C430499CEBC9291A7CB51E0B832E7FB02CED012FD6E96C61AAE749988311EEE4300EF58450B3C1C98B040D220273170240D8FF8457CF6DEB52A0C44501D4677C4A1B384E76A2BF
+4EAE
+C0A4B5
+7C298745
+46206CBC12CFCFE329D2D1E8ED
+86030B6F8F93976A5B033DF4007CA0871A597F29CAB207981C570404FA18FD09E345F558127D87EA7ADD3F4D677ED0648DF786FDEBE42A07D392603499766DE44C8E9375A840B268185D3BD2CDBD4C1A49D1C30C3E0C8F62
+0A849BDB
+8BA11AD2BAFC67F6377933FDFB
+4E9E1B6D43F5674B103E0B0CE76A606363BF0AB355A7EF09748266C6A219F968CFEC2A6DE5ABD75D389DCDFDB8AB7F13B2A56A9ED8BBD3D1CBF49D2419117C2BFC37B1619193B64596A14935FC2AAFD6FFE9
+A95FF311
+AC792316B4966446141071A3F8A9
+D704FDFC04C40BC91105AB7653BA7F2E927F0D74B3C98238D496810ACFF6ACA3AFBDA53DEECD6A2A57E3F7DFB43EBFFA84F537F0B5589003C0CFF130DEBE4576D265F78E8AACC5AA9AADB36430EA0BCE01E005AEF657DE9DCDECA6C79C1EA7F7B033C43045FB343173C58A0B5B1D
+2810C018
+3B283F7B0D1748777EC04F8876
+134E5B5DE699F46D6358FD135CB8CFB41AD87B6377C7D487D54366A09D59A136008951701D115CFD4CCA2A397A84E96F30745ADA79A630B498E3800904329241AE634545BD54B67CFE26A925EE6CD40F2D4E22FBA790415565
+75CFD2E6
+7275955157B9F1A5E73B34DF5E
+BB3885DDF6945A77758B2F4B1C99B1C27E5CEFA7A35696D175DEB9EAFBC40B5E573DA8427F72F8B4936871DF0AF417AE5EE29CA1DE9FF092112AB6A44457A926088BAB4E7619357E882AB153C87B29D4FF8403E9F4B502B8D17B174D
+5197FD5E
+9BEA76A2A4741990B179945BCA6A
+71E4329D23BCA9F2D0EB64ECFD66A0C35C5FA7741D4A82D0392DFD007387869BA2DF8161B6864DD167EB14609D143A6F4397A4038A9408DFB115910964F0E4653460E9271204D85C1BD686C5A07B18E292F21F56690C4988454AA948B5003C73DF1C7FD7C32A2727FB5BB5F9D1E16F1276B47FD04AA3E593F7E5B2691131
+0F19
+A134EF039625612C52B212516EBA40B41F2616B7FCAABB37E48E25351D152FCB509F9AC5EB1CB004555AF9383E7C91
+2C6D3FF5
+70CE9D7CE1CEC06235AA6E9F04D1
+6AF1561246549A7E934AB9A2D7363D38EEA77696FB72D48304E7CC6FB98A5424FDA89628555CA391C38040A207FF6A115E8B9AC144D09866D0292A66D3C770DE9098006FCA3D3D14980E793889B2C4629508C217CFF74BF299199793AD9A34A12972AACBFC6799884F17CFD3DA
+79E5F6EF
+8FB15973093F4AF5AE21E97643
+C5FF3296691D7FEA119D38B1277CA7C3D75762C3F50302D6EFEF377F411B29B2D788CAADD1EC54A860B22E8A61CA6ECF2E45364B8B190170A9062D1983229C270EAC269181FFA28E0A00C4DDB162136D
+9AC8A449
+0DC77855CD4E370660279537AC98
+E1666C769D82F239D08FC8516D6E8512BE1ECAF17C257213E446EFD60ABD8C483A70B210BF2E0779E9B171B79CC31FE5AE4204113416B7F0A917066E8FAD7B35CCC389D44D99E1C7BE5595CC97D5B197AAEF14968292409582AA1F315A9B4B05F0345DB5F0969D3EB0D799C85DC73D34B704F8BB671CE9A0DC50B62D6DEB
+9EC7
+7AD853C14E767AF01F0A273656137FAAF2BB66A76B33FBA92E4A018255FA576F969036
+50042EAC
+68A672A57FF7EFB7876ED15BCF
+2FBA48D1C73A3FCFE884032C9054D551771202B09ECD59A712C7A434A112FB4D4AB47F4A8DFB94F60B00EC351D94D7B0058E8982E855
+99D3759A
+BCE76689695A3340E1AF5AA12FDE
+3B3BF525DA27E2A9B0CC17A48AEDE99955C8D3AE8663C7033C40CC48C37F92321EA6C5DE951F076034A2B2445D3A81311C5A344567AA8637B2A56EC6D23DCB9BE4CBCC0D98C820274D36C7C7681A73A4CB71EA04C16249A6B4F670B9B836BF9CE502F7CFE91BF21BB48E715F7AE8632DC0C59D9857D686D0092C40ABFAE0
+384F
+CE15A245D1B0626604B6D8C40038734FD51FD402B9A371D7666585E1721B93
+E21DEEF2
+B447D308FA9E049A48D8A80DC8A9
+A5AB7918510FBBAF5783B7334E374C669F07F697EF1407CB435FA5CF44E2D2E50E246F66ED536188AF819856327133EB4043AFAF200514B7A3897917E40BAB5F609A1765D07667349B3AEAE5F4C9D95D603F9180EA44924B025D43F3A6079BCD554F36B4A6B8BD0AC39D0EA2
+825475B2
+2DFFB99CFF572AB823BE03212A
+80871108996353E9C323C67C266B90422FA5A9AFD5326E91CDFAEEE6E922FCE376A2D0DA7443355776F3922857AA0F1E8F16AB07831364909725D7A9120711607A96ABEF4D57
+CDE48C9B
+F0DEF238CFC288819679C35DE27F
+2042678B99EFA2C7CAAA349843E922D4C0241F8038516FC38802086B274F0A987B6F73D4D4A613FCC46EABC402B31073F1698CC6D13F37E2C2E10E3565A7795449065CD6FCF6E59E782037E55FD09DDD777997CBFC007CE88663BAE88C4157CD11CED8804FF23C6856C1462F2968CC511B51F20D90CE7D
+9A3FD418
+5DC7209195D1FF4CC86B1C19DCF7
+2A684B3742ECAEFAC0FA64F8A1B797083E341BEDA5232C0422309CA1F98949EDC210BABD163AD16D3D8269BF1A0C9A6BC403E32E4EEFFA70083A9DC353C1F5C30DF9CCDA13CE967678B3C9D9DD73CEF307E81912E4D56AA9E257370497591E38D1A9748CC022C34F3716
+9504C350
+EBA1D0033FC6F8F24A701570D9
+563168F0C6873EEC959FC0C1EA4646D57BB8FE583438C829119C8F0A34F879632ED5002C016252C95E139E58F29F940A27B55EC38FA8D442A3319F2F3904A16428F929368CC2232650C330AE4051453752D9BF5B843952
+46C7706E
+E2DE5853019A78B0A7C7E888F5FC
+DB35D70EA83E3DE57F825BD4449CB5CA016E95CCB5AF571090EC282378B3824B8A4B9BE5F37D523B62EEAFF7B80B249DA4DCE091EA0CE081AA75F9CA568116004EA02CB1793C9ACDE9257EE6A4E6ABAACA2A401C9146ED47001E2108F59304073057C0B43EC9CE08D13BE825BAE3C080A7A1A2B582FBBEF75123D1EE
+81A743AD
+6D92AB6EFE2A6E965EC9E6425D
+4FA67A18527B6720A9951C076E2F889C227689BA28D1BD0A9846BD0AE8FAD98DEDB442402EC5776ACDA67A25A9410942385FC78D25E3041A3B3B2B4DB9AE0CD6AEBCCE8E03
+85DA3E6A
+54E93771A2D2A7CAEFCC80A917
+B83F955C93C77AB939A840163AAAB2C73DC7818D41B0D64E3774B64F8B200A38A0765E785DBC1996A1D97A1674E5EA4D5C602BF8B6F5C17B98935177F71634BD3D2CC8FF4028F8FF9BAB06035860C54AE1E018DFA7EFD248F1CFCE5501F8F006AAB0
+D4BC494D
+DD6149449E95AF6688EE337093
+F5C8B64F32718AB2170168B91BFA4409569342C6EB6DEA174244F0BF8B5466C0D51663F0299720957BC5804D76A5C4790F5BB9CF18A2BD6C92FD1C21EC2754EFDE1C07E8ACEAFCA6326586EEB5D33F703121A87B590934A404
+E666CD96
+8D957696158A68A1BB6150887883
+B3C9AC239BDA0A2A3159F9C92AAC9F059014C84EF2F6C3420F5F2F633AAB661307DFF01678939C625881CBCD80F7F85B0AC703897B171F0B90E007BF21667DEF63447F3041362D34E8DCB9DEFB8BACF13F3D6EA7EAC25647DE5D56EAC4FBC0BBF693C67A07898C87E69AF129BA934F66FB2E605E4D37B9FFB8A55EA1B37A
+E061
+BEB26A5ED42988A9BB7BF9DA77ED
+0FF492E9
+CB1EFD5970FFC5F907BFC7C7A4BF
+4DF6D6E065B3DDA7562E2A730FB66E4973B9657A024CD08F58E0B7E958F3E730FD794DA7F9060E9A8D4BF803138CF1EED1C574DE20C9ADFC67D6BE1DD97DECE433B9790710F222824D3135B5F08847B1D1A83C1147913643AB8B909D2E77F044F1071706D76061A4826F447ECC66A3DF9A45F2004D1E13D0363894C8065C
+023F
+B7BB408DB8A0B9275EDAFA1007FFE25241B7D5AAB63C0F97E2
+E8509B9D
+C0E33DE59D61D2C09CD4C27C58AA
+432F30076A755479822A3628AC51445FF682C05CCDAA69C4E668C5CCF9B26DFD6481DF8CB6971EA49D53493F969F3EDC4C0C115A10DF3B9F92D20986E4C7CE34C8B26EC1447356D711EA94BDCFD27259EEC68D6072C88E2B35D70C7CB41C9A2734FDB0A1C305B7B3B972BBAC92C78B044A0BB442A2593BA35389F22CE6DB
+F8BB
+B6340B81
+8EF3D6257EC09D1136DF26FC38
+1D8D871D91D17CB7D564EACE1CA872A17BA2A95FF045DA2F5B41F3B770248B562FE8C7BCDB9E05D0F6480FB0541605FE03EEAC693FFC5096889A298C8E05CA
+E01CD451
+A340780D263F1CB1CA892B5DE3
+77790862E3FC50393298FD86BBC3D4C1F5690A910924
+076939CA
+577EFAEC743063CFB5991B1E7F57
+3D8C09649920842E
+903B69BA
+116FEF1D1C5D0EA2D7CAE7579F5F27FA5E25E9F575A03831AB7F4F2F235B834C8F38
+B5B3BDC9AA325441EC4B0D567AA6F1FEFB6C803608251F27B92023690BE24A3BE3FB86C1CFFC
+719292E60DEADA151AC13E2F0F0EC4EED96A635FC68AAAC789D75C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+%%IncludeResource: font Courier
+/wst:courps10 10.00 /Courier /wst:courps ILEncoding 0 declareNFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<121d2b271d291e0c010d010e1d251b2024192922011e262901111d192a2c2921251f01121d2b2e2629220113> 2207 558 0 7384 -1 s
+<1d291e26292419251b1d> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<080b> 9346 13300 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13280 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13280 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13280 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13280 3 7133 32 s
+wst:dutch12 SF
+<1620212a> 1271 1431 0 1665 -1 s
+<00002b2021291c002a1d2b00261e001d2f192427231d2a00212a002b19221d25001e292624002a26241d000002181414002b1d2a2b2a05000016201d2a1d002b1d2a2b2a002c2a1d0019002b2e26042321251d00291d2a2c232b2a> 1665 1431 19 9531 0 s
+<1e262924192b> 1271 1676 0 1886 -1 s
+<00242c1b20002321221d002b20192b00261e002b201d00170f1318151614100d11002b1d2a2b2a050016201d0026252330001d2f1b1d272b21262500212a002b20192b002b201d291d0019291d00252600272926> 1886 1676 16 9461 0 s
+<32> 9461 1676 0 9531 -1 s
+<2d212a2126252a> 1271 1921 0 1877 -1 s
+<0024191c1d001e2629001c212a2723193021251f0023262a2b0027191b221d2b2a0300192a002b201d291d0019291d0025262b002b26001a1d001925300500> 1877 1921 13 7321 0 s
+GR
+GS
+1263 7816 9522 7816 9522 2048 1263 2048 clp
+wst:courps10 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<24> 1449 2182 0 1555 -1 s
+<202e2f6e65747065726620b174205443505f5252> 1555 2182 3 3675 32 s
+<54435020524551554553542f524553504f4e5345205445535420746f206c6f63616c686f7374> 1449 2358 4 5477 32 s
+<4c6f63616c202f52656d6f7465> 1449 2534 1 2827 32 s
+<536f636b65742053697a65202020526571756573742020526573702e202020456c617073656420205472616e732e> 1449 2709 11 6325 32 s
+<53656e642020205265637620202053697a65202020202053697a652020202054696d65202020202052617465> 1449 2885 20 6113 32 s
+<62797465732020427974657320206279746573202020206279746573202020736563732e2020202070657220736563> 1449 3061 16 6431 32 s
+<3831393220202038313932202020312020202020202020312020202020202031302e303020202020313438302e3535> 1449 3413 25 6431 32 s
+<3831393220202038313932> 1449 3589 3 2615 32 s
+<24202e2f6e65747065726620b174205544505f525220b1b120b17220313032342c323536> 1449 5211 6 5265 32 s
+<55445020524551554553542f524553504f4e5345205445535420746f206c6f63616c686f7374> 1449 5387 4 5477 32 s
+<4c6f63616c202f52656d6f7465> 1449 5563 1 2827 32 s
+<536f636b65742053697a65202020526571756573742020526573702e202020456c617073656420205472616e732e> 1449 5739 11 6325 32 s
+<53656e642020205265637620202053697a65202020202053697a652020202054696d65202020202052617465> 1449 5914 20 6113 32 s
+<62797465732020427974657320206279746573202020206279746573202020736563732e2020202070657220736563> 1449 6090 16 6431 32 s
+<3932313620202039333630202020313032342020202020323536202020202031302e303020202020313432312e3335> 1449 6442 20 6431 32 s
+<3932313620202039333630> 1449 6618 3 2615 32 s
+17 LW
+N
+6720 3394 M
+7455 3394 L
+dp
+N
+6916 3342 M
+6916 3447 L
+6916 3447 L
+6720 3394 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+6720 3394 M
+C
+wst:dutch12 SF
+<2b201d01291d2a2c232b> 7512 3445 0 8365 -1 s
+17 LW
+N
+2705 3367 M
+3050 3818 L
+dp
+N
+2881 3469 M
+2807 3543 L
+2807 3543 L
+2705 3367 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+2705 3367 M
+C
+<23261b192301291d1b1d212d1d012a261b221d2b012a21311d> 2734 4072 0 4876 -1 s
+17 LW
+N
+1950 3360 M
+2560 4157 L
+dp
+N
+2126 3462 M
+2052 3537 L
+2052 3537 L
+1950 3360 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+1950 3360 M
+C
+<23261b1923012a1d251c012a261b221d2b011a2c1e1e1d29012a21311d> 2182 4411 0 4707 -1 s
+17 LW
+N
+1610 6783 M
+1610 7545 L
+dp
+N
+1663 6979 M
+1557 6979 L
+1557 6979 L
+1610 6783 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+1610 6783 M
+C
+<291d24262b1d012a1d251c012a261b221d2b012a21311d> 1544 7800 0 3681 -1 s
+17 LW
+N
+2480 6818 M
+2881 7269 L
+dp
+N
+2656 6920 M
+2582 6994 L
+2582 6994 L
+2480 6818 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+2480 6818 M
+C
+<291d24262b1d01291d1b1d212d1d012a261b221d2b012a21311d> 2830 7523 0 5192 -1 s
+<2c2a1d0107060809011a302b1d01291d282c1d2a2b2a0119251c> 6525 5004 0 8935 -1 s
+<080a0b011a302b1d2a01291d2a2726252a1d2a> 6525 5207 0 8294 -1 s
+17 LW
+N
+5592 5173 M
+6327 5173 L
+dp
+N
+5788 5121 M
+5788 5226 L
+5788 5226 L
+5592 5173 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+5592 5173 M
+C
+GR
+eop
+%%PageTrailer
+%%PageResources: font Courier
+%%+ font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (27) 27
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0034 put
+dup 3 /C0044 put
+dup 4 /C0045 put
+dup 5 /C0046 put
+dup 6 /C0047 put
+dup 7 /C0050 put
+dup 8 /C0055 put
+dup 9 /C0058 put
+dup 10 /C0065 put
+dup 11 /C0066 put
+dup 12 /C0068 put
+dup 13 /C0071 put
+dup 14 /C0072 put
+dup 15 /C0073 put
+dup 16 /C0077 put
+dup 17 /C0078 put
+dup 18 /C0079 put
+dup 19 /C0080 put
+dup 20 /C0082 put
+dup 21 /C0083 put
+dup 22 /C0084 put
+dup 23 /C0097 put
+dup 24 /C0098 put
+dup 25 /C0099 put
+dup 26 /C0100 put
+dup 27 /C0101 put
+dup 28 /C0102 put
+dup 29 /C0103 put
+dup 30 /C0104 put
+dup 31 /C0105 put
+dup 32 /C0107 put
+dup 33 /C0108 put
+dup 34 /C0109 put
+dup 35 /C0110 put
+dup 36 /C0111 put
+dup 37 /C0112 put
+dup 38 /C0113 put
+dup 39 /C0114 put
+dup 40 /C0115 put
+dup 41 /C0116 put
+dup 42 /C0117 put
+dup 43 /C0118 put
+dup 44 /C0119 put
+dup 45 /C0121 put
+dup 46 /C0127 put
+dup 47 /C0262 put
+readonly def
+/FontBBox [-25 -238 920 722] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268420E0054E87EC3C41CD6B9E50D89E086195FD
+DBE7F567E59D6EEAF6DCF9A3
+C3CED684AC8CD7B335
+847363F7
+B370137D29F4153E8B3C86621421
+E2B0DE3A8185BFBD6A0C5FED759015801F89835BC0751574978BA25769226CA2A392112B857A122C996819F1DA4B9B44EC6843C4A4DBAD6D529207B2A5B701E7C7B7873A546E05E0270EF7771EF5786A43265121652041AC02111D6E46DF9D5B31A06AA8E3A611
+0E31A7E3
+A831B48EE9453B70DAC96EAA02
+F137C213F762DCBD3039BFA81BBD79FFE4FB1A90611B68AAB86DB18CA02E78648CEF537FE8377EF70ABE9F4CCEACF21C8646EC9BD2D7CDA6A9
+ECF15CC9
+5E7F477553A2EB356BE9470F03
+7FDD15E6ED379EAC05D4EBBE0D3CCF16DE2F2F58758023
+B0759552
+BCDB135D3B39205908800002B4
+74ABB0AD98B6B855CD008419613DA7524592DEC462C6054E3504D734560E6E
+9AB9F712
+435C843E7C13D2EE038F851307
+C6204A77BAC6C05FDD05BE9CCE5CB2F7CFCC401B14148099A6F1A0FA
+68C739E8
+28A56537FD11661F0B1CC4C351
+14DEE607D13E86E91381AB38998A525A3F2D535E86B0EEF9476C73DDF24E6D9C811430FFFA417235CD1C85E7ADDD6E586796B67CBA028DAEA6DD446EAD5603E14A5145E239758EB2DF94951ACAF3094195520CFE372E2FC100B0
+C6B4B0A3
+EF2163CA4AC98C2239FF7C2F9B
+79EF6630A6B982C33699215710EA06708041BBCCA7DC404D6D93093F405E28169F0B7B8FB724AC8BC2D800
+74C56185
+D58EF58BC310622D8007A98B61
+2A4BC3C2356D4FD5BABA6211AE20EE9014B81914C842604B9BAD908E6AEBAFFEE14961E53B34B2ECFD0EF6B72B8511AD2BED0152CBD3
+2BA4FD6B
+2B07DC09700A851709828F520F38
+50EDC06E07F2A8E6D4A4A56C427A906F4F366B1184F3A72FFB2A85E0774245512D3A4E86D5449059EF3B818CCC0B23FA8B41D6A8B05F5B52514A9B25742EE8108D2872277E979E4C9D59B1B8D1B15309EB81E4E0EBE325D524E47552A16BE7EDC1901271BC94413A986FD11065E506B5500C01
+7950249C
+83F57BF8005FA33F37FFF83AAAA3
+F4F68A8E2139F40016380BA71BCBF54D1A36BF978DE087A5CD2D71BDF052F00B3D4641038D806D1665C93316AA432B74EF2B180E3B77C40ABBC5BD24F96D2EF67DE527D47A587219DA38A2B98D814C3B616214936F94191E377241740674663957A69948AACC81EEA66B6D4F8C96C0D503CFFCEE0F415194174EE8ADD5DC
+F0E4
+E0
+34FACD2B
+AC7567645C2554EF41BD5A2DF2
+13D85A56194FAA04DC14FF7F6352D4F582463754B95D859C13EC0F867362C94582FA16699321DA40483DB6AED49DBD846F910F9C08B12217789F43D91E7760C987EBD47BC77AD3F3D95808955A5CA80B13D6F2F183F8B210C2B8D4102CB18F01C99959
+3F957AD3
+76D7C77A52EF007F6136E6AF2EAF
+E4760B0CCA5F965980EA06AF6E664BFD6A479E6E9692ED23CBA51746C0A389F27263B46D2284D8DD1D527F90827CA62919D35198BCD00601BA756A28714340DE837581FC1283000B273980D196E7D84CD8F0BB7EABBF87D1896D8B5C3CB56C99C1ADF285590264B30ED2B234E54EB1BEDB76CD194792F5D72F0F
+0B91A00B
+4993E0864ACADAC352A03ADF0223
+DA6C5472CBE6B74547FA21A86987B4C6F7967397C051AFAA80AA80DEE1F2853BEA5908DCD2F7E8782B4486D9D227E7C92F68C1609A2BEAE917A8683A8726EC91FFD9A726A87040002FE42DC9337ECA54AF4F3982B497F040594DEDABD1D6E9CCC28BCE4F8052D5424BFF8FF479CD1DB113B6E2495897D76E6C81C0F86F36
+89C0
+FE0B5B5A253958EA5A7471
+5DE32019
+5557FFE20C77DB134C7DC950C0
+1E31D9156143F44047A3C77147EF3E00F43EA03701229AC73C5A9AE69EABD352CAEC30EF16B4BA3A95CC7132F63551C14875242AAA98C514D27550
+DEA76805
+37F6AA0C17C882282DE28060A81E
+14EE323027802C60C935947568A02865304F7C8CC08AF0174D9D8846D4191F8B0DADB030AFEA86CCD194411E986D04F5ECDAD626D418DB6CED0246099705764E5FB11BDC0322B3C5965113969ED11420274FB15A327D1661D2F9EF9AD84111D3034F5DC6534602860BAB9F7E494DB3
+489CEFE4
+4ABBE99D528A4752814E9788B3
+C1295FB315B351805FE9FF655F79EF864FE35C66365AC7745433196FBADCDF35BE888E8AABAB884EA1530CFDE97396863DA6945582E7684F409CCC2BFBCA706A63779B254574F5F6657181897048F5BF96DDB7F8A71F1074E6BF1F91
+A7EDC660
+99BE1778C47FCEED3618482C30
+DE54253803D1272727C855E7575FA66B8FB82B3F3063921FFB0B2186D5A9D7C8E99FB6F60108B5E0FF729EFCD12F2A4E287AF078FFDB22D4647C009A6681869F87B0982C81B9070FFDF9E9196FA4DEEA812631
+2E7E4654
+85EFE76E0773041B2B757A6AF4C4
+E67B407B8E5738C05FBC124740A2EB7237F359BA32718A00E98596E8F00929E2A12E72D433DBC459B2ED5254664D5441F4F50B0A47E8664DA3CED39501AEC6D96D9A173E884B79B38CF1D9296030550D05DAC04057E1936326F15315352297A097E2D2DC32FF94F6A336
+04EF5219
+4C23017A1CD731231B43EB00EC54
+4A2B74217FA817005C18DF8641EA8FCAD476DBF9C7654B8AAC041138CDBEFB990E065B18F1043C66D3A9AF3C371E9D397909410C510C64F3BD589D67D1A0E45768227DFD4EE3E461FF30722E046ACA3A47CACB114EF27C598D75B1D16CD7BC67117B5C97075D92EC562B6C6E283E824A519226EC3377968FD85EB09DE913
+EA049AD7
+8B038FECB7D7657F8AF7BA2F3D1C
+14EC30CB430485273DD035EEA068E10C9C3D936D9536036A0CD5AFA5BE204FDBE8AB39C8A89061F1F9EC7ED42D83D622FE45E0CA53C6BE6FEA97BA2E4B606659BF47B8477B7C74C867560CE4479E996A416FCFF76144E44D6AFE21356D4DFC286011679987104B875722F005CDA10E0105CF942733D482F827A9128EC83C
+E01D
+B42A7F
+2776A19B
+CA565A2225CB2FAD7CE81CF88E
+F1B4ABF103094802C1FC66111A500E220DE65031A28B82B7FB9D60B3C65BB5AC571CD4B35105A5321B5F76B1957BCD47A505B4BD796C89847748FB087F1D3B36B11A4B82CAAA0FFC01ACE8A734EE265BD1
+0F1C199B
+7102139AE7216C5C975EBE25F472
+9E57EE0656E78AE48550C6ACB6AF91E34AC0A0CA7E5E1D124E8317E78553F2FF9CF6E9FE614B5087FB49DEE5F1DFE1F5E6C0D7CB7376077B72F160A65ED494ED42AFF0403B5E501F29E91C3D113E77C1D58F0250EBB570AD9B034B27A59934C932C5D4397594C7462B4BE1A1F970A77103C71A8CE7EF90CC25F11B6FEE43
+0157
+2721D4
+AF72F0D7
+6E231FA44CE3C792C3BD8D3032
+A07CBB36386D7D95D680565BAF5F10D84BACFB4F7960DF6AEFEF86BFAB1C0F2E8B831F766DA0D12818C44DD06D82EA8220E762959ACE9F95871A1985FC5BD4660D1BBF169DB63DF8C398EC2A8157EB6BEB7F8AA6F7925A0B
+56F47A29
+99D6D74621F06EE22BB45644E6
+10A3C02DDA9292D70DA6311049573B52F9C1A4786A32C7D86C0558FC69A63A397FA576C6F04EFE13C7647134EDD1F9F0C55A6A339D258B50424953E8A029DF98E603F2316CF5FF2EBFC8F7F7FCD71DABB871
+82876D26
+BDF43F50327FBB5C881ECD36CFB0
+020B11D17500119AFB4CD3E5AA768EF330DECD9526F98E78783DD82C9DAFC45C39714AC0BE6DBB4E5D96D842B9678644B57732E4C81E5BD41C197FC110817C80B7C95EDD0C4E67FAB19582AE234DEB4F34B8DD40E76FDA345D6F51E27413B8F1D2F7AA5769F8CF4C07D834FA2C70
+BED36E3E
+8DFAECA2478DEA693FD1EE6F74
+FFBDD658EA5AE74E971966ACEF8F68867C4D0C259BB2280B4DC9FFDC6CB66167B72821D2ED7038074F307F7A526BE98ABD5516257995B81432DF2963BF7B6299558BB917208EC56FE1A141F597A9164117ABED91C1D1B0BDCC
+993C3797
+9B81C5164F54A9684C2FEE740B
+CF8F66A792F3154EDDBC7A65FBE671DA21C169F26B5EAC312BCC3436F32B6394EFF7BD4BDD6ED593D01A196D3626675CEE61D294654E307E61D4612E812CC3C79F58E0AA8957C9E2EDDC56A889CD463753EA8A63018648B02AD2C8BD
+8ADEA4FA
+E494188336E10DC346C1F89AA9AB
+1F8C02D048C53C15CA3D9E1F95DED6D1DC92D92490BBA4740D3ECCA5658DC23A6E8DFAA3712F220D23944B501ECF3185AF8B79DDD29A072E8B0786DEE21CC5C1E2B568B63A72013A86FE28E648AB4DB99EB79DCF2F88A3CC122A57244883053983B496E3DEEA397FDB9DD9233A827BB9F527DE58D3F6B99BF6610673E40F
+F1AC
+8460C0BFB1709DAA1AED076A824E174BED8BD8538F4918D3A488C7E9CF66A4F21C9F0AB6D376BD4F62B7405FE67894
+8F09EF63
+175D16D391EAF5E1B1B6821F31DB
+2754D497F086378237F50609AA279F06723B5513A259A39C9850EF66B56C6AE84513A41497717DBA45674E801A7DA5DFF3593804418F7EE4BAEED33A93873D8011A3F9F8C57CC242031281DF1A4C320CD75C5160F0594E92F0DC98A1ED11604A856BFDA97101B796A08D52D2C8
+5891BF78
+6F8687DC60EBFC14C67FAA3116
+71BCD21B86047ED6BCA77F93FCC54F04E1198B18BDABCF302D1ED0E2E53AD0AD08B70238D5BBD7BD61EBC15AEA7848DC4D63EBE3721A1284B6BC174D0F5BA3947CAFE62BA44EB091E20DB46B1353649F
+20F36EE0
+FE78989E8C3F7A4ADD4923DE906C
+129679CF4EE011243C40DF63276F9776ABBA418FB66D65FAD32E41B614D92F401055318036F28DA1AE3EE3F2B87027E7A103958E493B685D73F5CDFB2CA29DECED5532B7EEDA19D1258871EC8938D539FCB723BB36DCF36AAB8C7A135513E496FB8EC020251B711E1C3CB5185881776F28C2369C0F3833019A2D27079063
+694F
+1E5335B332CF1C9E54AC031F0A5FA78E74195AFF245060A439E7C7730EEC7C9C859397
+D1575C3D
+81D382641A66B2DC2FE4D03A6F
+CEC593873415822AB972D1AFDF2E23A06402C558202288319C10E8DC59C64FF8D44DD50CA793925B27D27A4003EDE5C54D7D0927B1C6
+F2A357F4
+5D3B96D68552E95E36B958376819
+8AF9E885F93B958FAE023AA4F253BDFFE628587893C2F2E04D68F8DD81969AF1897933BAAF97AA1CB300988C63AE8E4658B1304C0489758764930B49F83BA8BA016B302B92440651FC25513971D128892438D6B3E7AF8BE3172D47AA6C313A2797324BC8E68647837148AF5396EA0B4142C26878D165E255E6EA3AC2E44E
+447B
+56198281882A234FC6F665E54DFB514D11FAC8B98913D1104375028F2C6223
+1352F421
+EC47CA5BEB52FD5CE7C9166E4224
+6934DD006B66F165B7FA9A28C412678941CFA72AD1C86C44505824F5FED58F95CF7EDE8639C84B479CFDE4C506A3DFC07CC33CD7D536730FAE7C55D0AAA15DF9BDD6BF9551385B9BDB979CE908C24F207B3BD1F3875EFCCDB60480073155AFBD2F4D16098A7FB678F9A32E91
+E0E18883
+519421B3D7B3F0E41465E9D8BD
+AC9197ECEAB363F896BEEEA0FEC78D1C4F6FBDAA824722D27180696567E1C5599FC361EAEFBEC47ACBAFFDE24D67621B4EBF74E5960D1AF0BA649B42DCF9553097356ECEE8FE
+FC37CD6E
+BD803C2E1D91FF3EC69F700FC74B
+0439374FBB67B8721412BFB2B4716475BC56471B24C1DCB346E0C9E8A3488DCBC47C25386F70A456795B8FCB886C6AA888739149CF5A18A9F6106B14C87044826BFEB223E4CBDBC868F62AEE58ABEF899B7E24980F65848DD259FB415CF6D63498B525AD9AD648DF15C275B08FD2C73F6A32D3712ED8F0
+883B3B04
+5ADD14B4C5582DEE1AD5A97910BA
+A4B9435FC9D39E80B4F4162EE04AF8FB38923AEEEFE5D67450E7B19036A683523ABAA9A8F35EBE27564E18C1B4F5DF374460EB888EBF23189F09D4713D4FD9B085AE8AD0D0C9D168B3155D452BF6EC74B79684B3E11B56EE7B61C93F9BE5B36E8EBEAC7031B5765C4DCC
+4A621B69
+F5801610DAAF72BB68D047F410
+CD1709FFE01AC47F281B8667B10326D3FA2FDA5AEBEBA069FD2B58D946467911EBE87A16D78A22B87F486B492B66FFB4B433836EE59A30DEC2B1B731447746D60016BCDDE475AFF583B7ABA712EFF1B628FEB9D48233DE
+EA2C6830
+EFA09F79A4FC03A72EFEB505365B
+B9BA797CCCA8ACEF84B18F55C8F2BE6CE201683EB68900D648170D82E7E32630FC91F8740193F455EC1722EDCD11BD2CBAA4C155EAA29F27337E1A2D9F6B91BB8E1E6E647B38E670195C70C2B2A8DD67FC357633546A6DB4108C7CDFF7FD8CF40A4A8383C35FA124BDF0D0DFE330B78C290A4B2B5FFCA9CEB5925687
+545CCAFC
+24C48B0AAFABC9427B7853B47D
+D59CC846BEE65D90E308DB93AFF7CFD1D62C3D5152ACFEFB9A0D3092671BE49EA2615C62905BEE0C62DB89F88ACBCF0143634B9E0A6C22EA1AFE9E49F9474816F21987B3A3
+61AB0A34
+CB92471818253C04EA0E091803
+D9D140373F66F7061E01E3516F41385000ADD98F32A1A7ED094B2E1F6CED56896251A8B5701171B06444667D855FA568215EA45CD2E2EC44C6FA0B9ADB48448C8EA7C62B3ABDA2CD556E379FA621542A52B83253A48E917450D8A951492D72DFF4AD
+23E37D68
+239728EEE7EB597ECF7B6FC3DD
+D73B925333ECD3782AC79BF9A376B2EBB7F51F309317D74FB0B90E2CF72CFA7A34BA062CB9BE20AEAE62E8DD82FDCEE6D483BEAA690EAF62DE6459BECD198B26C4378A599B636867780E2875A4BD85ADC475D81964E44A6EA9
+764ED929
+F5493A321793170C78FEAEABB441
+23F0FAC8203C14E5A4AAEA9BC25103F4403115EF5C24A2AFA71D4D27F22116A29EFE984B0A5D368F4D88121D2699108E1B0AA943B8C4C3DD546D358242A98A6A80072C77E9CF957E697585F2F0C2D742DB8610CD4442BF6D8FB7B1F1FBA9987BE875E7E65FCF673C95C6C7F566BD234217D3F96A88D891C2C1A12EC81F46
+5DB1
+3450DE8C1C438A7AE2B4BCCD83E5
+7E28E2DF
+7B5E5020B5607AA59718CBD1BA0B
+0C2EF18672CAF4A8A3172285557F80B118864CFADFF93ECA670B4866B15D2AEAB0895804728BF0555EEDCD7E5B66E880FE913CC8B3CA1C6C9F494F7DC3EF8E79367087D34C151999A691C34C79E0D076A97452D692FB9AEF573B6CB7F7691BD4492BB182F8FABBA32E8688106DBA1A708C8F04DFCA028F132FEDA08FC327
+9AED
+5DD73D4B
+299A66F74BA89382665476D38BE9
+527F7087AD85E81F2EF6DC1F3CE145CEF740F6E56311A48C89DE65A62A7F8F45AFE4FD28F98A6F5A5C9C304122F592F394AC095E0FA32711966D58F54269EF30501B552DD451053901321B7CA58021B5B2860199003D329A91D2044314D93863E8AB504221087F39CF
+9B0B1D95
+84D40AAF66DFBC55988BB5520F
+841891A481641222E52D79C4FACD1716E7753249EE89
+40686406
+2864D98C96631C15C1A20BFD6BD2
+2B450926363F93BB
+1D2B8513
+5473FFC5DFA04D7C1A9DC7F4CFA79BA7B27F3FFA4ACAFFAFBD8F35402470E594724F
+22C2D72A67C3AF0E13F8FBE10B7AFDD3A7CD957D504DDA6202EBD4C054285611B5A82B545758
+A9CE05E281E10BC4C7F72125DC174ECE47DFE2E2AC7D73E73B2B5D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%IncludeResource: font Courier
+/wst:courps9 9.00 /Courier /wst:courps ILEncoding 0 declareNFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<111b29251b271c09010a010b1b23191e22172720011c242701101b17282a271f231d01111b292c2427200113> 2207 558 0 7384 -1 s
+<1b271c2427221723191b> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0708> 9346 13385 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13267 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13267 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13267 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13267 3 7133 32 s
+wst:dutch12 SF
+<0f1c> 1271 1431 0 1422 -1 s
+<002d242a001e172b1b00192422251f211b1a00231b29251b271c002c1f291e00040c0e0f1516120d14> 1422 1431 6 5672 0 s
+<0a1003001f29001f2800252428281f18211b002924001d1b290017001e1f2829241d27172200241c001f231a1f> 5664 1431 9 9461 0 s
+<2f> 9461 1431 0 9531 -1 s
+<2b1f1a2a1721> 1271 1676 0 1820 -1 s
+<00271b28252423281b00291f221b28001c2427001700271b262a1b282906271b28252423281b00291b2829050016> 1820 1676 7 5870 0 s
+<24001b231718211b00291e1b001e1f2829241d2717220019241a1b03002d242a00231b1b1a002924> 5839 1676 7 9531 0 s
+<28251b191f1c2d> 1271 1921 0 1889 -1 s
+<0017002b1b271824281f292d00211b2b1b2100241c00292c24002427002224271b002c1f291e00291e1b002e042b02001d2124181721001924222217231a0500> 1889 1921 13 7753 0 s
+wst:courps9 SF
+<24> 1140 2168 0 1235 -1 s
+<202e2f6e65747065726620b16c20363020b174205443505f525220b148206870696e64696f20b1762032> 1235 2168 9 5225 32 s
+<54435020524551554553542f524553504f4e5345205445535420746f206870696e64696f203a20686973746f6772616d> 1140 2326 6 5700 32 s
+<4c6f63616c202f52656d6f7465> 1140 2484 1 2375 32 s
+<536f636b65742053697a65202020526571756573742020526573702e202020456c617073656420205472616e732e> 1140 2642 11 5510 32 s
+<53656e642020205265637620202053697a65202020202053697a652020202054696d65202020202052617465> 1140 2801 20 5320 32 s
+<62797465732020427974657320206279746573202020206279746573202020736563732e2020202070657220736563> 1140 2959 16 5605 32 s
+<3831393220202038313932202020312020202020202020312020202020202036302e303020202020203737392e3535> 1140 3275 26 5605 32 s
+<3831393220202038313932> 1140 3434 3 2185 32 s
+<416c69676e6d656e742020202020204f6666736574> 1140 3592 6 3135 32 s
+<4c6f63616c202052656d6f746520204c6f63616c202052656d6f7465> 1140 3750 6 3800 32 s
+<53656e64202020526563762020202053656e6420202052656376> 1140 3908 10 3610 32 s
+<202020203820202020202030202020202020203020202020202030> 1140 4067 23 3705 32 s
+<486973746f6772616d206f6620726571756573742f726573706f6e73652074696d6573> 1140 4225 3 4465 32 s
+<54454e54485f4d534543202020203a20202020303a20202020303a20202020303a20202020303a20202020303a20202020303a20202020303a20202020303a202020303a2020202030> 1140 4383 43 8075 32 s
+<554e49545f4d534543> 1140 4541 0 1995 -1 s
+<20202020203a20202020303a2034353737313a20203538323a20203134313a20202034323a20202034383a20202034383a2020> 1995 4541 25 6790 32 s
+<2033383a20202032343a2020203130> 6790 4541 7 8197 32 s
+<54454e5f4d534543> 1140 4700 0 1900 -1 s
+<2020202020203a20202020303a20202035313a20202020383a20202020313a20202020313a20202020303a20202020303a20202020313a20202020313a2020202030> 1900 4700 45 8170 32 s
+<48554e445245445f4d53454320203a20202020303a20202020323a20202020303a20202020303a20202020303a20202020313a20202020303a20202020303a20202020303a2020202030> 1140 4858 42 8170 32 s
+<554e49545f5345432020202020203a20202020303a20202020303a20202020303a20202020303a20202020303a20202020303a20202020303a20202020303a20202020303a2020202030> 1140 5016 46 8170 32 s
+<54454e5f534543202020202020203a20202020303a20202020303a20202020303a20202020303a20202020303a20202020303a20202020303a20202020303a20202020303a2020202030> 1140 5174 47 8170 32 s
+<3e3130305f534543533a2030> 1140 5333 1 2280 32 s
+<484953545f544f54414c3a2020202020203436373730> 1140 5491 6 3230 32 s
+17 LW
+N
+6524 2327 M
+7259 2327 L
+dp
+N
+6720 2274 M
+6720 2380 L
+6720 2380 L
+6524 2327 L
+C
+{} -1.0 -1.0 solidFill
+dp
+0 LW
+N
+6524 2327 M
+C
+wst:dutch12 SF
+<192422251f211b1a> 7316 2378 0 8152 -1 s
+<040c0e0f1516120d14> 7316 2581 0 8681 -1 s
+<0a10> 8673 2581 0 9037 -1 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Courier
+%%+ font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (28) 28
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0034 put
+dup 3 /C0040 put
+dup 4 /C0041 put
+dup 5 /C0042 put
+dup 6 /C0044 put
+dup 7 /C0045 put
+dup 8 /C0046 put
+dup 9 /C0047 put
+dup 10 /C0049 put
+dup 11 /C0050 put
+dup 12 /C0051 put
+dup 13 /C0053 put
+dup 14 /C0054 put
+dup 15 /C0056 put
+dup 16 /C0057 put
+dup 17 /C0058 put
+dup 18 /C0065 put
+dup 19 /C0066 put
+dup 20 /C0067 put
+dup 21 /C0068 put
+dup 22 /C0069 put
+dup 23 /C0070 put
+dup 24 /C0072 put
+dup 25 /C0073 put
+dup 26 /C0076 put
+dup 27 /C0077 put
+dup 28 /C0078 put
+dup 29 /C0079 put
+dup 30 /C0080 put
+dup 31 /C0082 put
+dup 32 /C0083 put
+dup 33 /C0084 put
+dup 34 /C0085 put
+dup 35 /C0086 put
+dup 36 /C0087 put
+dup 37 /C0088 put
+dup 38 /C0095 put
+dup 39 /C0097 put
+dup 40 /C0098 put
+dup 41 /C0099 put
+dup 42 /C0100 put
+dup 43 /C0101 put
+dup 44 /C0102 put
+dup 45 /C0103 put
+dup 46 /C0104 put
+dup 47 /C0105 put
+dup 48 /C0107 put
+dup 49 /C0108 put
+dup 50 /C0109 put
+dup 51 /C0110 put
+dup 52 /C0111 put
+dup 53 /C0112 put
+dup 54 /C0113 put
+dup 55 /C0114 put
+dup 56 /C0115 put
+dup 57 /C0116 put
+dup 58 /C0117 put
+dup 59 /C0118 put
+dup 60 /C0119 put
+dup 61 /C0120 put
+dup 62 /C0121 put
+dup 63 /C0122 put
+dup 64 /C0127 put
+dup 65 /C0262 put
+readonly def
+/FontBBox [-25 -256 978 739] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842243E0EC59344CEF369650A037B4383B03D6
+24C306E87EFDD4775EC78742
+FEFCE44B765574466C
+D1AF7A82
+CFE19FEC07055171803BE35FB61F
+DFA5A4C739A4E3957EB7C66233844AC51A6A91B45B75E6AF1F76779A4EA39D554C671F039F6EA0902EEABC13363BDDA5101CA12BB8156EEC5AF0BF9E6FFD41E3E8297895E1554F57314DE5E5E70C32DA47FD30A8525D7EE9C60607EDB6FD9F816BBA9417276F85
+60F5DDB4
+A3948B33EB22B827DF681DBB19
+2993B553C6D17076B4B9FB193A79C8A36EECD5D4EF0F532434292DEF98BC0B7ED78FD8401CBE88325807A34B9ECE7D312908B2BD6A5654090DB46D637406668C
+51FF586B
+0A455727C3D821E5379B18E7CF
+73A0BE843CB8405CC41A75A80486DF95591401AB247D9FBAAEE6F1EE55AFCAB16739F92C17F9DC431730A8479507AFD959AC919F6A16978CDD4C0D1467D6E1
+3962DC2A
+ECE603DBF7471294ADD2CD198B29
+532908C4A5265A4F7463ECD59BDA55D34C6AA46EBBA99B417F5C4CD907F121DF03F7B4022701EF74B81B2976C86ACFF955A578ADD8B8A97FF7153E5024C1D16EEC46C49C8161E80908F674E4D982B7EE838816E34B470B4298AA950F91C73847AE513BD928E1AC3BB5B7EC545CAF8549F9A3D3C651CE098F8CBD3CA1DAC9
+B1EA
+D11F53F29E6836D3D5B28564CAE639322DFBC99C4E0935BDAE765952B70D50A54E0B2320B66020301960FC76B867FA85F1F91F3294F083E3684814E3217F04
+B35EBE6D
+59D242D66DC9B47E498861F1B9
+AAF83F392F47301340B2D0140EEA5DCE2DE473CDED42721C28ED10E828D7462071F4C869EADB5FDA241C9F6B88C7744E9D23B7F683955DCBF3
+2808157E
+5A2C0B65F9B55DBBEE9817433A
+4A9F9F198E614C01252236B914EF3FE167C3100A365ACD
+4E9D860B
+9E5A27D0C7D642C02589D2681F
+CADC8E04DBBC6A6D75BB48BE19C98FD7B13D35219F0ABF7ABC0CEE8171435A
+9A1ED3F2
+6DA67504D01AE8AA9681BB9F60
+DAFE125817E7CBEED49DFE97495620A55FABD9CED68A6C27523597E3
+86E2EF82
+831A62D458C63DC9F33229A3A1
+A11491A2672B640A71D002D9774D3DF90E77813907688E5B9FA24480B405C0764ACE7C5796CCF5AEC5FC93D2DA95819F4B572634A73D9FC9CB0C8EB2E9159A
+FC5F6B1E
+EEF3ACF4BA76ACD44AF08B39D7
+383D271340F68E0617D3F60E750C3862A683D25BFD8B51F4B80682CA4D20976CF415F3CABAA19AEB7240A4E20459CA6AA7539D36E32E07A3C5FCEED70B78FD24C528C5CCAC179AA5AFF7F6D5EC73B17529BDFD3CB2B12ACAA339
+9D4F9241
+29C6F0FADD6A0B734E610E649AA4
+B5498ED75C036DA814B85B968344FAF5BC7E09E0A5E8A8B5739D16C9D9A5D9119B2FF2658F266BFB6764291D639E04B6617F07AB3E8E9BD7D3E3BA420267C2D668435D31687279AA58126132AC59A1B696AA7E8271B8B2C58D78EE24D42180F73ADC48DCA47AC7A6E028CC09E2993D
+6845AEC3
+8B773FBABAE54E4333E0EFC7FA
+91D2E9ABFF0EF08E1225C8B6D4821808ACC7E6F2158D1A673078082B5093534288E0A164C72BC20E0E7D02A03568647401D40024A2D918D330267358FE7001FDAC5A9084A3C219051A79D1313218C6A33F7AD20C78BF720CC3BEE186A269FBC856
+F0FA2833
+D1DC4729E39195D621ED519A5898
+A31DA17324AEF776EF9AFD365B3903B4EEFC10B3E3F87ED9F27AF3C5F90915C401A59D4CDCAD781401D0CB59C73A2BD6751E6C5DC224A55EC6AA362906FE23295A2B9B9C7FBAA3513A2D67A1CF1C2D59F8558D354DE0896E93D2AADBF7A0CFBEE3916ED4
+273E7B2C
+79A152BB8AA8EE640212B985BB2D
+00197AEE85CE3FEE3B5192DBC8D119AD93F18C99DC31096F9EF504E8AA41F8B2097E76045004B8719117EF1DC0B9E821A1CA74F7BFDB94B8314E5ADC7F3DBC5E5504353710C9EB9AFFC4AD969FBF9AA7583607D6556482FE3B7526E68CF65BC7F144F7AFCD5F768F3EB3774AB8DA57F07591B1893495EDD3A9E3
+FAC8D2E3
+92DF721D909D4E29EC355E2E1C63
+5618BBFE52B2CB35CF5F9CBB77BD79D513C4AA76AD80E69F17F992683B97033A72A9E6DC45162A8E76320325E01E7DBF08EED796314CA12639BB3F828340D062714CF2369B22DB3491AF702A07E2FF4BB7E6F7C15AE0B7E9032EEE1C3790F84E93BC1738F0
+76FB19B8
+FFBD506A628A2A9219AB9B7BC8
+F7037F43E7F8F256A9F373B7277F62EF83FC03200A32DF64DEB6EB236D21667EC3C91FD8F45BC401F709764162833D98AAE1AE196685
+01BF7B46
+038314DCE6A7F4ACF4EEAD68F99F
+8E35E5A83775D299EB215CE703424FB94DF1832E390FA52C43D0BB486DDA7F4EE50EFD4C692834AD05B19BE96BBA0E1F265BBBA10DF5629E4E3A2EBD54A214FF4DB8238FF2AEBAB1215D9E23BB0236B7E9D4F4979E752C687ECB5C611D686FCC596ACCF362E818C55AD479CDB87014A7CAC6E3
+0EB21EAB
+2DF7F4A822FCB8C7C9B27E5CF1C6
+CDFE4C69713C7AD5CBB146C022AB8D6CF0E0BAC10B68973B6E1849A749491471209EDE8D0B183CEE215231211E138EBE1F2E2498CD94156D2F8D9E2E54E3D7F12C6FD88A95D836308388E2B919B2D5064F43A14DBEBC568B559822C1F6A10AE2588BCB15DF7828B09FB6F5AD1828AD866B5903C4D10E6245CB80D2EA25F3
+3730
+2F
+2B74D680
+8D3EC25A9DC98835F6552CECF6
+3C84F805E28742A762E1E989539A23296A86ACB4AFFAEB235A7C0C45F541536387BA70CDD80CD1DF87B145C039128E5AE364263E8B2D63A5B30A8BA08B452C61A1A54FE3A3E81A0AA39FFFAF2403907A72349D62D774340C9E44ED52DBF01FF083
+F3166B76
+7F23E8521A9B829FB2B9F7C291
+641E6625BB48E36F4E58F30022E71496264B543A25B26D51E59C49DD7120CF697524C3145C5A251D95FA02B751BA83687F9D4AACEB824C198AB80ED5F9D54D314DA5F34AE23047568776A1F8CAB3289DF4CE56ED186A48A43B0EB748F6E2EA0F86BB88
+45B13BEA
+287701D9BB145B0EDC1290BBC0B7
+63C1FEA3E825B8A70D1DCFF4E1659858795EFC9E0F445D0FB5B20F5832845C7D4D9457E45B49FC47448C2D0132E6EB9A51B4A4B8423F1A497A6699DBFFA9CF8DBE7F54409ADE32C953D7CC78C57CFAEF7D09042784D57BA5B64F1F8D27799A5E3E1661A14E7D7D33FFB0702736AF1BBB141EB1F0EA7044C5AD5556D4800E
+5FF315AA
+16E9D9888A28F6C990F8EAFEE102
+D755AB6AA597B39D62A572A8274B3E49436C82DC358D9C6BA0A9BB243BAD44C0F3BD8310D5EE6C65ACD8CCE0CA8353C1FFFE62C174D2E720CB1757D476AB7FCBC759E3A89424190F60CC311C0F8E033819299655186BED24A8D551EBD50EFF4A19E5CD0AF5A44ED5D2
+FE1F222F
+F748B9F40289F88D0A3A8C2AEBE2
+6D3157EE2F61637025F2B01DCAF7AA58A9353E321231E02B1E13A7F26BD813C76DBEF60ABBBE2462297910BDE018B4B2FC28C1F4DAC9187C2DB0A1F3A1592F5F197D167DF02BA9D5260612B37273AA231216D8F409AFFAB7C8DACE8F4304068FDABC196F053D7FCBD4B7E86B1BBE0479CF42BDD9BE8D76524FBCB76A3E81
+E7CB
+BA3E49D8DCDDA2A8FE0542
+BFF5F99D
+153F93745728B9EF940227CD94
+D475968AF7B8483FE408C987647EB2D397A6EC8DAD9AD9835126D897FC845BAE1ADF32843D5361E51457BB4A83BB124397307925860B9F96D6CBBD
+6E4F4ECE
+451F14FCB9EEB9582D6AB7EDE2
+DE6A51B6386C816982E8DE26A7AD48A5EB3CFAA3D0A24B0121F154BCACFDAA9337FE41FE190D0B645BE6D4779155CA5EDF453AE07C08252D75B3605FD4C12B7A80C6F8AEB54361
+CD7C0EB5
+02F91DE01E10986EE4706F7366B3
+855C49CB248B053B429D527D4E24A7663C1B9B9D232D3C2E2F53E2166C6E6F1991934C072A0F3155C4D538A56036F089C18EC30674CF8324D100F80B4FE8ABD1DF48049C2154AB838EBADB0CCB9C800E371C4DEC23F35B1AF5CBD44B12BE7845F7CF2778B5E0921D580DD2AE19DCF2
+02C11947
+637B39CA51ADE3A8990980EEF2
+7FF33ACBC09C415BB8AADF0BC5CC4151B9AE4628CDC95939366F46A0BF82FC8DE826060C881A9FDEB56C7657B97C9D89EB64CF3108174D79FACCB99497529B50C3A7E81D80637132ACD7FC31BB5315FD86BFE8A2CBB37773D417B42E
+6C947269
+058F68900A460E7048D3E9908B
+59DB3B35B7F433613CBE7C8D5695B9EE0EE6902B44ED84AEBF99448C47207A0DFCF5B4183F8DD070D45D8F7378E429AB4DD9C49130A3DF12D2787007BEE8BEFB36EBE512DF011564FCCD188CA27873AFCE2A62
+F205E33D
+1F8825A20E9540806AE64041F97A
+726D270842ED91FC2D52CF0143BCCC947F5320382B56E6846FDC2C94B851C6D7F64AD26609B458FDDD635B7AE8E5A4F09C0E407708EE69AA62DA548EA43FB95CD8EA8C6FF834D1470E65A16EA91F81D08946D8162C24F2E3E1C2ABFEF65CD076551DB6139DFB8AD4CAC0
+CCFA61F8
+AF4F6461218261B2F1B79B21BD4D
+D57414958486BB59E412201F65A456D3CB0FC0437FE2438A0CFF13782224C1561A0DA8932D1AD8A70B0AA6A6B811FC6D7A5A2EC9D9B0C26D5FFD24D3AB9DBAF50C28C2E4B9F82365FFFF9E179A0256DCDF9C102CA611152A16D0AD88DE9020F38C455988C75D0625CD0797B143A4B5EE365FE29FE88F747B2735B299AEAB
+3BCCFEF3
+3D54F84411B52DD4AF0FF72B68B2
+C84DB441DB61E190E89FE54B371E35724114EE539E82EF76D3EF37903EEF76E474226484A3C4465A7486B06273FB1F9E6133643D8D01E85B2E5A97073EC69FE26BDB9C3FD56BE2A9D5D2D0A4B78139FC6739ABD90C7FBEFDF34EA918CD66B0686E2AA6F37DB10755B6EDBDDEE17BDD54648DCFDE9DECADFDB89C92D4CA33
+649C
+8ED86D
+06F23054
+0811E19A2FE080472DD27C8018
+BECD829A5B4D65DA30B76E854FCDE8245EEDA84157E486132BDAC65366D4BF54D55F8FD59BD02AEE44CC04A13D73B19D2C6DCA8BA7FBE20399386CFF443DAE3102BAECADBE3D3AE01F59BA2540B86C6B65
+43586BC9
+E7B9C75A636B8BE1E2DD05D3FB30
+54DFF46F2931F0A265BBD8D2A9985A4E56A5F03AF18A2AC439F205EA594F97F627D9758CC6D85951062B4D0A241E7ACAFAA27842D5379DE07A488B20EEE5E06FF3358E2BD16B5516A189AE6118E1AFB116F1D314589113D1AD26E0B02FDD0482C6BBF8D2
+5D8D6B40
+4F157B9552178C457AA496FE37
+B34D462EE89C6BEF8D00A5AC389DCE596E022E32ECD827C8E26CE1E92201856368BF5D94B73355702A27F87054B64B8F52488DC46405D1170475E6537EE7FD618EB2E132DF6547DA4C9A8CF27BE4E181B5754B3DF36F6E2839
+7739F109
+7EF7E9A0CC59304C3DA949C5F2F5
+7D79D8807C1A1BE93F06DBFB3A9295F0BB75BAC8BDC1AE574DB4E15D5D7CA4272F5EF8EF656B58EBA3890A748E35E502B7620B656E2149F267A1573D41DD091C78F1A42F785DA45823F23A55A220D1BA24B79B8F19B68120CF2EC4ED030887A6E6360E5D30E84DD36B679D91C1AC1C9EAFF3420CA68200571186AAC35CE9
+16DE
+82B6D9B04BCE52FE92D56272C43FCEAA
+E41CCA69
+C356FBF940491579284F2220BD4E
+F12017FA5192EEB58003B9C0642605FF2BFFFB7AA4EDDEE3F512149175E9102FF8DEE5C347DAF670EF4641434450DFBEBE0118E716F653D5B01B4B3580B82593C3DA95A941C740336E5DDF3FEB879BAD21F599B1A096077890D8DC5895E62330DCCB0273BDE70C80950EEA2DBEDF75C6E1A7323BC00EB9CE76A67EF26296
+3CC5
+D0005513C858DB8AE0A1B1C0E55697697CDBCCE7CEA6C31FD011F270A222800162A03282D60D2C
+1751833A
+EABD321D01C729CA4D49B2CC47
+17EACDF3BAEF99940F4D7DF994BAD0F0D9B67F9E75EE
+BA5D4B3E
+C7F9F23F86BE94F555F033C70649
+34FB530B866FAA83B91DFF4BC53CE22560713B51085CFA837413E7C96D58E10FD9FA15078C4D256C8725F6572AFF76D980A271AA2D1BCD2C47E76D0DBCD25CBF25D5390A7EAEA53AEB550DF1F46B2AD335FD9799040FD3718C95079F622D4FB29370E97F7222BDC9826AE16B296AD734795A46CE3BADB8A064CF999C31C2
+A60F
+19F3E7
+AA378684
+402068E0B345AE0AD49A8A1C95
+0D8D2057968CD2AA67A66C2CAA0A88DC62FC36A9A818A207BD745D8C35898207E8379746FD3044810287C8C8D29BCA26AD106C0273FD88E944CF8C23A03B6E6A644D08D5793EC8F4F1CDECD8EF423E8DBC91FAE711C00F0B
+90A603EA
+D42323BDD996284985F85EA515
+D665F6BE5164AC067D3C3D5D71A4DCAF4B4FAC6EEDA40D168BBB28FA9B512089AA6CCED3BAEE70F49E05175C0099C2A5557C3C23E800E150EF4F43B6A2353DCB729012C071CF0F9B6913D778BE2A67B97CD4
+8BA40C64
+9BF30F4C2B3A7D2B89D942009DF9
+CD5B6E991221107099207F34F7C753169710C3014441D149C3B9A4520BAB0234FEA260311E896BDEF29D2DD98DFEEC01252D44EB22A9C20D74A5AF5DCBFE904CA2304F544D5F1B3AA4275E45899A6CAA4F81485B3A4FE739DB15CF306E6156222F655D58DD27BE687FC9E2EB0FEC
+525BEC0C
+684A686D9F4218A1BC1029A878
+2D21FC239D6D44003FA85FB6C0933179999E419F9EE36E9BAD197FE4F6EC704AA3F3D6AFCB3E64E47B8CA1E7E91A2E3DC88E9F786A43A3B7AC7B135764FDAC9445F74B03C1DD3337440905A1058E1F3641D61681031AFA6DEB
+BAD1334C
+8A9F40F68227075274A91F6451
+F6CA0AF35C5108800961BCC4306984EC8D28DFA2F7942754A3A4473095605479AC8EE6938AE7143919247251FA6D94A5002F5DE39471232CE991BF11F00DE8C70114B9BDF89BF4691897E66F3065040D90D34416536292C0C9FE91C5
+8FA0CA49
+212BD4444DC4F6738E963EFAB955
+2ABC4F1439138A5D713AC4229D273175CD42DA166B89CD79D98BD260BBE3D5E0C87BAF60063E76EA51FD50745522A904F46822A629CC637EC75F93499E7C43F5285295E365051C3D9E87CEC5B9FABF7FA27DF485AFB51EA406ADCD31BB113579C962B26F7C1DFCC2276F0A3A373AE5A8D20EF9B6BA9E9F1EC6570F3928D0
+C077
+E4F06D5A8B0BB9ACE77C2C35DE421CE687BB740F846E686CDC604CBC8C13B0804445291BEDBFECEABFACC8BABF9C47
+85CF1AB5
+17A19A4034D51C10C445308B73EB
+F4DC5A0606108C0FD64FC11FB972B24A55306DE69F5317A8B83B8171B44B64FEE99240768593A6BEEADC9D3843DE7C4D329F025B3A1360B9EB49F26A1237F419C5F9876C9639427ED2C18B7956FDD99BD14D1E37E4F6EA475FA3BEFA62174337E8319F3D670A81361D8EBD4C38
+A56A919D
+6CB786D292CCB7D5C44CA858E8
+2DA35191DB01739EB8A3C26E80187DB3B158DC1BD69597FE14120FD5FD588537FF66C4E2C10963B970B5CFCEB22BAACEC9FFDCD43DA1006B6193A49AA540405577BB2A65C1DC14C71CC979C1CE55832E
+A396BC2E
+8C9EC143E7961B7DE0CFD9D5522C
+EE519304B7A4668A5C0C6D131D879545BD05C8C6FD69D00E8249B9A2E1AB79D75DA908FBDE7D5ADA4FA6B1228CE3CF5C0D0315A30E54BE6DE5B2B426D853003C824C81D963B529FD8550E4B2E543CA5EB94FD24985E635E171B35D4B4C01B01B7768F8E2D60B685EDC8D94E215A0261B1065FD868FA614CA3862DCC676D1
+BDC4
+63A7809A043A5FE373163E103A6E1AA87D633422901B13A4DC85528235292F9D7FC73A
+4AFB2D06
+0EBA0B1990141A83D661C6AF98
+B2DACF65E7A1457D067B1F5AA90350E47FFD6674948E58953CA6A5908DA0B7582A6FFB0E50108E299F4B7CC98DEBE18535CCE33A2ECB
+AB3C2451
+54B91E6820070DF060754AB92226
+C4DA3F708040A0FD3555DF3677B33891CD80A644EBCA89752818EC2A799834CF0D8EB558D9B92829A3AD0AC3179DD11D2541FC83B25FEA08DF314A18A9274A86FE39DDD44C93E0BA1D0CFD9B4899860A3FB7D63B8457EB575E17707239F5C294202B318334F7C93E863B9AFF93EFD62C91ED4F269FC9E292FDDA33337E26
+5BC9
+B5B339535293C544286DAFBC4F8039BB0920E60198A9333B4F837AC90E7742
+9EA931D6
+96B51DBC2822299EEFEC61B8DECC
+065CAE2992D820C09C846AFD9484A844CBF7784DA277F497147146EC63BDB9A89696A63648D0048EA73CA018B72F7C39EF849977957E74EA8D0B93CEDF2C44976C68DCCC90CE6A3D9C695EB340BCE1D2E27BC553B2B45856DBB52BBE1FDB79FF676A1FFA684C9AB1435A4D3B
+E22A3FB2
+34F86234F49D9F7429E776E4CA
+9D43CA26B94E2E8B0DBFE631A57A17E38E431FB7E346A501A013CAF7D3A58CD3D0AA8A0023188BE48D2541995FDB629B6D698E4C913A1D2B888B8FB41863F40242D025962CD4
+C0CABEE9
+655D03262B62FDF479A62524F7D3
+3DE2C3F29C9260B5EF7AB8E029A7330751C7D914900A895EE2CD390D8CB6F721F3583DE6300BD5A9947FB8FE42AA9F4444CD4E72FE6CD7C5A9FD459E58944F8922F2F0E905DA133F687C11BC362086A763BCC530F0784EA8075B8018FF88347488E16B526422B5715267F1B22FFE93FF144744F9614190
+8C63A244
+2DAE61CB7E2CDA66F9CB8F3BE3CF
+03FE0C88151DD414F4FE9E5015E4870B1AEE4D648823735DEBB4F0BA4C936A6A6A9EE852E158585C0EFB9F235BC1970238D5B1D0369CDD8B6C565A8531CF9E7A5938DEA16AEE1A5E3C1B3D68A5E00DD69F01C416E8E18F54185B1B50C84066980CEC7F03EE66E155DC60
+2BF0FCEE
+1B0EC3456B049A7BF6A23A6E53
+060729851C1E7CD6ACDBAD696E3FED8B276BE3807B6274BA9E444FDDE127D09044C4B986D8B2769B68B42DB50E62E2D286752BEF97923977703B1402A3D569F6AAEACCE54ADCD9D37EA03FB4B260D9926C1906084F8744
+79624078
+C2AC736D66DEC21F5EDB2470A8B6
+38AC7741832D9F6EF06EE706D68DE2E9C7883A274C3C41E832B639B2731470A1D9D512ED5D29490CBB71612FBAE4477F66DA8940A8536B7FA2F17409B7DFC6E87E28C0E3576F3423DA8487F44DD09F452CCB921A86636067CDF9C349408EF54782A697A03D85E621748DAE47C7F5FF73D68AE406CCE152CB71198566
+31316E76
+8E175C344ED4C430320DE35AC5
+CE15B364AA16381D139E89CEED0B06A781C80184FE61136148D5559C3BC0F8D4AB336FE7B21A6A2A555F74E07FD51C7EF7C2C73642BCC383D5BB02DD0DEE0E9EDD7384585A
+6D7C2977
+07CB83F250DD53657B6F3C65AF
+CA94D0E8DF073860ED76D0F823DC0774A515F1F1C68F0315F2649489889339E4E8EAC5EAB50AE552E08F3222646A2D7E5B2DE85C3A326B77EE5D544DBD603FBC1357BD8B4864CF53296EA0F63FE5C5B42BFD3CAA4A197BB4A6433351C350884D308E
+B28BC146
+BA7400FD8B32E8DC351003DDCF
+A7A2678E1AEFBFE6EA53A71F8F328EF77D1C59CF5EF8FEC5D810548B2ED938105C45BB0152DF29F860B6E1047F2D57ED3E29AE0F6FC3B3619F0390B94345210E1C47108E724ED240A7EA4A3E42FB0F7D1801BFCE02F5B28801
+0A62E1F6
+7556A73C69E233AC0745DC03CE3C
+79CC277729954859F5BC89F15FC03E433D5D354D4DF51D3C23C96AD5179C66B459DEC578574360C53FAE3EE530DC1301891018716ED3F7BB6ECAD4F836AC708416797A558D3A5A40850C679C29B4474DE78B8A4C36FE972DCC35DBF37085F98E990B1B7F40D71735F0C93FCCD3F1DA7582BD6463B6A5BC718C9E5C3EE854
+E956
+69A3D373505C4CD69EC09818691C
+16F6C32C
+5FD172FFAA6D491A8236140CE83A
+F772E98EFC0CB1817A21046FB3A500CA7FEA1BAD0CA01E3CAA4E7D8BE5BD97C1BB9CD654A5C577A12B6A2E4ECF6E4EB00D80F8BB7A65AF441A759C79C470B37AA068B53DEB8587B32E800D74946EC0EF010C6F93E37367309522098EC5CCA02887EB3052CED59B69CDC9E31A7716D45603768C6E4168CED1C559979DFEEB
+6AA0
+C64387B1FE7D2B14B7E406FDC9466049BCC97019D55548A45F
+0DFFF699
+30DE1F7E1CB0C5315D7B89C00F6B
+704D3CBC6EA786F9069806D2F440FF3397B1D748B91CAB8D141735230FDBB093D7D0C76B68C1BC754239A6D59F9E470F7BDCDEDE75D2024B2D0E1DB72FB6FD5DC9A679748CE24A43906426871CC426471E446A1085A19A18293DE4D87BCCB9EFB3F553709E0F998A5C2E31D5A6394E09FFDF0978B518EC6197C8DC2A40E3
+268A
+4FD8F3FA
+9A45D83E961D4196F24D54A2CA
+B96E83FFB82B93ECE6172EE7593ECB1DA7068A2EBE0423320A64A22EC67FD972F2079583A52AA9651C5ECE70D6E204FB792E0FB85D32DDAEF748D7FDBA1331
+888793A2
+B07BFF0840E312F97A30FDA8DE67
+7CCA20E1FF1CB5BBE29461D0137E5C2DA7B1C54F43D0899CAC20937BA91C39685F757D1E1F62194320F8B97BBA262BF889A7354C934E96DD86B500D3AC6561F14A24A61DB7A604B7ECF61D32385E47050AB5AF24ACE2ECEC05CA22B6E2C40D3FBC0F4B6E6DDC858127
+B58F7FAF
+29BA04FEB0A03611CAA6B6B837
+1E23402A527C474925B1BC464C9C0C5100C230B2F028
+EB07EA9F
+BC7D6FBA861A286590B8109E5B29
+1B20B8571113A557
+B79CF9AB
+47D5A3FD5A398DD7847D7E686216DC3D909DF26F1D95696A36EBF17393992F727CA8
+0E3B3A614B794411632F75950BFBF486D0FF6B8BF18F49995EA30005FE4B5E573CCB4464E1B6
+8C96ADDD20CB675CDF04F6AC6BC38F9578580E16B15FEF08724ED0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0046 put
+dup 3 /C0057 put
+dup 4 /C0067 put
+dup 5 /C0070 put
+dup 6 /C0078 put
+dup 7 /C0082 put
+dup 8 /C0083 put
+dup 9 /C0097 put
+dup 10 /C0099 put
+dup 11 /C0100 put
+dup 12 /C0101 put
+dup 13 /C0102 put
+dup 14 /C0103 put
+dup 15 /C0104 put
+dup 16 /C0105 put
+dup 17 /C0108 put
+dup 18 /C0110 put
+dup 19 /C0111 put
+dup 20 /C0112 put
+dup 21 /C0114 put
+dup 22 /C0115 put
+dup 23 /C0116 put
+dup 24 /C0120 put
+readonly def
+/FontBBox [0 -209 715 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684269A711773B1F062EFDCE93198A765F8F55A
+6E9F60B43AD213B6F99675D4
+AE976E2319012DB96B
+33CB37FC
+2AB7CB1AA9E7C6D1A60ECC1036
+78173A5EDBFA71F1EBD0C032CCD138B6D4CE66801DCDFEB6BD820A11ED36DC
+8E4D3CFC
+9B74D73542067C526069B30732E5
+02C92D350773A0F13043F7E7F2FD2365C811B111DED6308425424425C85ED4ECF83DAD9A69D6DC0B326B66D5D60982C25F797415E5E04295D8B828016AC3492B7C9BE617E2746AF2E9524DCD33945DC65D94B2E03D0D7132593EDC67A4B202AC870EF1C6
+EA790287
+4ACB5F56FD4DA68D1640355195B9
+D19C7961DAA79000D46EC3F291DA2E2B19AC6CB630B105E3E139E919879E8148C655BF27873C24022B33089612C488CE90E254D1C75FC36BDA12D0337B32C607E50DA16554C04792537EC2195E8067DC19C334EBDA274F00D80EC09D7C5680830F0E24D8ED6CC9A2
+CDFB04E2
+F1D7FD17DD5859F41867D88DDEAE
+F972E7B75655A7EEA90B92DB316D0AB4FDD399BB32238B9E4688EE8C20691903DEE3D1451C039DD31C343F7682C59755FA7FA00427CC66B6562819461DFCD383676BA230FE8114C0F6365C8772EB875812A04739463F555EE16444668E4BC3F9E48F33F9
+84A5F175
+1078182F3769E7DA175252997B
+2568FB7D85FD2C70D74F49F31AC69728A7E7806320E4D2A2EED163FDE8C3C12EC79CCC641DBD1A0184767D1798755315ED1A73A0CACCD82BF33B046799C70F9961C8203B70A351C8CB598F46979CB8D30696E7567DA60991E086229D633F50
+AF9D3DB8
+F88199AF8EEDC512846E9B90F80A
+589C2C8EC2753CD984DD1BED6A124E9C30F029F74409D4B6E4D5516D1A212760A1D8EC8E0F523F3D7118D544ED5D2E7D065E4188522C6EF0543B93418A0C0CB8748797D2D93B833C6D8937BE7B8E6EE84798DF94C79ACD39D833C1F2950621E4ABD6C7B130A550E5B7FA15FAFC9B91FE1C4A587DFF
+C2216DB2
+7AD57432AE38A5E51AA5C686F4E4
+A3F2972342A4532DECBFFD348DDFE4DD94B83D8B240B3E175F74B71CDD392C03B790CD66EC1E9B41270145FCF3EDB18398C3DF34042C4A1874D1EAC6571F82E9A522DA7BC5ED67F00DE6EB58342A68E1F94A79FE2C28FD6F36A1816F44AE8F565C14EDD8C44C7CA3C88D99179B575BD9DC636C306EDF16D3B3AA371DDE8D
+1BB7
+ADEC51A3
+59BFDF8FFE0CC683D4F18112638E
+A01C20D513AE1F5580EE472FAAF1B03ACA13467A4C42B48B36236FE41ACE7C397D63E3529095128D2B06EA5A24485C1643041BCA34E8505BD643242D76047FEA68164AB94008A92B23F9649D8043B76C1835635F69BDA3E3B529AD98E536DBBE024F0B223CC3AF23894EEF424FFDD0F238451923FC4DFEF33EEF67D4A6AB
+5368
+2FB7B1BC
+540FEC10
+2478563963D6819A331C8A74C4
+C04BE75C535D087ACD08BA9929787CD850B28DB74E91EC44DA52C5C7FE35DE7A9481D6183EDE26B5F78E0565ACA86923C5EF1496E949C20D42583D072C7D507EF1F7A0FFBE53953926265B35FD57E6CF04CF
+39416408
+2ADC436C05380E2DEE010904CD90
+19197ED80F88FB77D5AD65074AD5CC7EE4952F5DBCE2D8C3B2F6F9A396A2BFB1FFAED18FD99CFA4F9BF584B0B03CD5B7F3EA9B9416F99A6A829E3D5E6E7AEB82D25A325F3C3BF4C1F2C36B186EEA532F1F1C92A14DAF091F30F726FB08DC3B26D674AE9F083BB524AAD6C6A9
+7DED5BAF
+2F25FA45C7A5A3497418D42CFE
+278CA686C81C9B31846D489A1386E187E0BDAA6B70CD4BB0FE4159F4C603242CA4B6FB84432A6DD3F03181467A42274EE0BC1CC0ECBE9874850EEBA57F73625743E0876519E58598867C2BFB7E099525EB32AE513C3BF144597D15FF
+30B2115C
+CFD2BF0EC93954424D6005BEEF
+F3FA45A31AD5D191B752E443EF4E49D73C4D2DA5965FB604FA420566800ACD1C23568A1DA699366F1BEFFBAA1B96BEE742615C35067A2993A8329B2195D98FA3C1AEE9C7AA682C807B905CCD0D9EDD74A47A044D257F66ABC668D433F0
+50FCBB53
+21316979E17843EF143F344A4039
+51D22E3EB801C487CB542C25982CF04DFB4822F43618099A5E71A1E64C89807F04487FF5BDF2868ABC0CA443E56725377B6CEB6483D051A77888771DA8F15E1777F456FD4739DD978267607649A9DFA277E1EFC211C4A6E3F3D7727C7F3C9295F7CC27310DF95B3677664F525D5661221B1B7308295FF9EEC6EFD9189063
+9E0D
+A509F0F2E3E48BCCA290A0FCB36D5B423EF1528A11019199167D0F71E25D84EB98A3C413B5
+9E2BA323
+A923A870A35109860F4D47A8648A
+567A8955A2FE005E0530B0AD0057623C914ADA537F2B932CD004DBC3E0F24B7EB2E5ED99A2806DC2B35817F5627B5F1FAC5585FEB3F96DB525C2224F93589283DFDB010743C9705681C54935D228D82A33AB5B474EB17582A3B44F5A142FDE139195DA134996B672
+5BA3D91D
+890A8440802C20FEB7F7DEFB9C
+EC1E1B34CED42F495E2B1059C5A1586CCF8695E90054214835D6ED160D8F16D5B1B72BFB78A50B7A0EE7B20CD11C169F5E44A839C5774146DD15750AC584D0BDF110DBFD46347D8246412F94B14D
+1911F49C
+EEC492B712CF628F8C6E7C7CF2
+E2432A65173F58D8CA845F26DD88A3EA3DB53ED5E8B831A0DF9869ABB9C809945D896590AFF7D0606B2196DA86C04E3736797006
+C052AE29
+DFFD1C5446BD6E2C5022049F99B8
+40F337BE2662887E0A9531433DF39F976CCB416754CEAF1DAFC0A8BD14708F7C39DBC04D0A9253EBB9F6F28ECB726946097B2F6428D57503238FF12E4C7096A26AB022A14F0540AC83820140F93017D23D19B5A583F83651FCE2114B049AD10CD310ED27C36D48
+ABD590A2
+8EF65DBE3B9694FE475C26A601
+78B8E8F8B06EC441260624A13D5593036331D8200EC3BFDFE252E6C65F2E6B9E1EEDC3DCF7512EFC5466A72CE365AACB07175CF8347BC1C24580918FBCFBE68CAFC95FE03D65
+8FA95D48
+EA14D9C336B98EE1FEAAD7B363AA
+EF5CA4DAA15A9140A65715254B8C55F9FBE3426796777A2A1374B48894AE3B3664AB4D857315902FE76017FCF277024F23CB82BFBE5963C66364F2B573E6530094858A4B6163CF23FE771B8E3B11DA085A8DB5F93E7C4FE85F50F690E0C6E4008476E12789EF4FB2408EE7E1EBADDE1D0A
+31CC4AEF
+3B49F8FB801CA6CD12E72C2ADE
+CBAC1F0DA0392BCE13FFE68E74C44483E55C11E5CFCEABE0AC5264CF452366B3F8066768993FD7117726514E086C6F1B898B075DCC02BB1AC6E5E3063FEF1BD2CB88E52B65265399E6AAF2321B26BF58CA59D11C9B63B8F845
+CB60C637
+EC1DA68F34A634AE58CDAE0B7073
+90C2CBC0092CFDB1727D8ED58DCF28049030F7F442F39DEA20DA53B0C3D0C503A0DBD8F7CB86119D2FF4A5F662D353EBC707307F0EF4BE68961CA19397C6D5BB0B7D1F910003B5784CD828F83FFCDF6B01AE52E0620F63AFD728A652674B3B28F43E4CF5D2AF9E151B98D1B6A77811DEFEC0CF4DE2B81930C1
+B2DB7833
+C3F179A2746456F88DF684DB64
+D969015B39C2C9E7F487F62E3FD9CCD4F8AFE44E581477434166D1362A539D749DC8315A289AD2AAB3455A25CCC901BBCBE6DE22DC914BFF13B9834608D2DBC11F656CAA
+8CF126A3
+A2089A73940C5E0A05B4731ACC17
+C5615AD087E001889B18814A0EF270A7811B7CB515DEF989B176645D69B21A81058FE40242ECF62506D9E609A50B6B653476249BA25E68CCAD7DB94E3EB1B60C84F2285AE70AA82B05496B137172829351358B3BB02476251625A959B48C6C87AC1823C645AF3BC31C5D9E283090C7E540BF76E6F08B3E81FBBF0A1D1BBC
+9D12
+59390D3857F901118DCC3899E91A165008B60FB2F0D8
+1D8E191B
+AEBEDEF371A43E2ABE37C603C44D
+8AEA1F98A14D29BF
+4C820C63
+720179C0DEF39969607D44D464D7ACCFDF2E727D9EF4FA89BDC5891EF0F5DADA689C
+EBC3315EC4165BD9AC8AE4EB6E474A319315A70AAC62A73D408563C0996C973082BAFFBB860A
+C813795005FB043A7FF2E24B1E5DD47858278B08DFE39A1DAA7F4E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+dup 2 /C0083 put
+readonly def
+/FontBBox [50 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684275DD89A8790EAD18EFC77D3FFAE84DA5D
+312074C4D542DD5BEC70968F75DC
+250C3954E8DFB8F4857BFEF092EBA49D248955A858C5A5F55F7B987EA06EC8428D939084C88F5B157D80AB2D706A7EB936C3429173588D2ABA6A27DC94C0B484F316663555797004CBFA79E7B8545C810BF9CA92F61ABD9E202ED9E95943DF7A5ABBF3C20BDE3B6EEC9C0B95A4C9C1D38AA7C6786ADBBB79EE183BDDF194
+1953
+6449DBB7AE47E9FC6F3ABF1DCD7A1E274E87DAE9
+A22737FA
+6404B215A27BFAF6D0B50E94D2
+07123A5BB380C86DB5033EE743181BBFCC0356571F7297A207C23F1E588257FDEF5DF229
+CABF3B3C
+9E0988C63B358ACA4B4FEB033DFB
+E2E387A06A23CACA
+8E104B90
+DFDBD41F063E8A8DFA0ABA4DD7443015526AE5255315597779E04D85849305EA4F31
+5CDAD06E5841E1B8074760C99702B8CF443D752174D996C94E690797A9587CF5017DEB11E5FE
+02576E9E08B39688BBE99A186AA8FC7E222F5E52B29A7FDF379EF5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/sym:clas12 12.00 /PSOsymclas newFont def
+/wst:dutch14b 14.00 /PSOwstdutchb newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<1c2b39352b372c11011201132b33292e32273730012c3437011b2b27383a372f332d011c2b393c343730011e> 2207 558 0 7384 -1 s
+<2b372c3437322733292b> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0b0f> 9346 13300 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13280 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13280 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13280 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13280 3 7133 32 s
+wst:dutch14b SF
+<080c0a17101312> 1271 1458 0 2055 -1 s
+<00030200040f09120e0c160009120b000510180c1600101200170f10160007> 2055 1458 7 5338 0 s
+<0c110c09160c00130d00060c17140c150d> 5334 1458 2 7109 0 s
+wst:dutch12 SF
+<1f> 1271 2086 0 1434 -1 s
+<2b3b2f382f3433> 1426 2086 0 2056 -1 s
+<000b080a00342c00332b39352b372c0029343339272f333800392e2b002c343131343c2f332d00292e27332d2b380027332a002c2f3d2b3811> 2056 2086 9 7050 0 s
+sym:clas12 SF
+<02> 1271 2432 0 1359 -1 s
+wst:dutch12 SF
+<1c2b39352b372c> 1589 2432 0 2298 -1 s
+<0033343c00383a35353437393800372b3b2f382f3433000c080d0a00342c> 2298 2432 5 5037 0 s
+<00392e2b0024> 5037 2432 2 5663 0 s
+<2f332a343c38001c210034352b3727392f332d00383e38392b32000321141e0027332a> 5655 2432 5 9213 0 s
+<22151e> 1589 2677 0 2062 -1 s
+<00383429302b3900392b383938003433313e040800212e2b003827322b0029342a2b09282f3327372f2b380032273e002729393a2731313e00373a33003a332a2b370024> 2062 2677 11 8326 0 s
+<2f332a343c38100d06> 8318 2677 0 9213 -1 s
+<283a39> 1589 2922 0 1887 -1 s
+<00392e2739002f38003a33392b38392b2a00273800342c00392e2f38003c372f392f332d08> 1887 2922 7 4910 0 s
+sym:clas12 SF
+<02> 1271 3268 0 1359 -1 s
+wst:dutch12 SF
+<212e2b> 1589 3268 0 1949 -1 s
+<0025211900392b383900383a2f392b002f380033343c0029343235312b392b0027332a00383a35353437392b2a0003273900312b27383900343300181e072225040800212e2f38002f38002c343700252119> 1949 3268 16 9213 0 s
+<23> 1589 3513 0 1751 -1 s
+<2b37382f3433> 1728 3513 0 2285 -1 s
+<000b0800030715151d2625211900293432352f3127392f3433003433313e04> 2285 3513 4 5462 0 s
+sym:clas12 SF
+<02> 1271 3860 0 1359 -1 s
+wst:dutch12 SF
+<172f3d2b3800392e27390029273300272c2c2b2939000715222016261a1d1d1e161f00141e22003a392f312f3f27392f343308> 1589 3860 6 6792 0 s
+sym:clas12 SF
+<02> 1271 4206 0 1359 -1 s
+wst:dutch12 SF
+<203a3535343739> 1589 4206 0 2319 -1 s
+<002c34370021141e0027332a0022151e00343b2b37> 2319 4206 5 4776 0 s
+<00191e3b0e0003191e> 4776 4206 2 5702 0 s
+<332d04003a382f332d00392e2b0013201500383429302b3938002f33392b372c27292b> 5698 4206 5 9213 0 s
+<030715151d26191e230e> 1589 4451 0 2944 -1 s
+<00293432352f3127392f3433003433313e04> 2944 4451 2 4595 0 s
+sym:clas12 SF
+<02> 1271 4798 0 1359 -1 s
+wst:dutch12 SF
+<143432352f312b37> 1589 4798 0 2447 -1 s
+<00383a3535343739002c3437002700403134332d003134332d02002a27392700393e352b002f38003433313e00372b363a2f372b2a002c3437000715222016261e2021> 2447 4798 12 8469 0 s
+<12> 8449 4798 0 8612 -1 s
+<2100293432> 8592 4798 1 9143 0 s
+<41> 9143 4798 0 9213 -1 s
+<352f3127392f3433> 1589 5043 0 2285 -1 s
+<00343300181e07222508> 2285 5043 2 3492 0 s
+sym:clas12 SF
+<02> 1271 5389 0 1359 -1 s
+wst:dutch12 SF
+<212e2b> 1589 5389 0 1949 -1 s
+<00273333343927392b2a> 1949 5389 1 2904 0 s
+<002b3d273235312b38002f3300392e2b003227333a27310027372b003334003134332d2b37002f3235312b322b33392b2a003c2f392e003829372b2b33002a3a32353806> 2904 5389 11 9213 0 s
+<3227302f332d> 1589 5634 0 2255 -1 s
+<00392e2b003227333a27310005323a292e050038322731312b3708> 2255 5634 4 4857 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (29) 29
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0034 put
+dup 3 /C0040 put
+dup 4 /C0041 put
+dup 5 /C0044 put
+dup 6 /C0045 put
+dup 7 /C0046 put
+dup 8 /C0049 put
+dup 9 /C0050 put
+dup 10 /C0051 put
+dup 11 /C0057 put
+dup 12 /C0058 put
+dup 13 /C0059 put
+dup 14 /C0065 put
+dup 15 /C0066 put
+dup 16 /C0067 put
+dup 17 /C0068 put
+dup 18 /C0069 put
+dup 19 /C0070 put
+dup 20 /C0071 put
+dup 21 /C0072 put
+dup 22 /C0073 put
+dup 23 /C0076 put
+dup 24 /C0077 put
+dup 25 /C0078 put
+dup 26 /C0079 put
+dup 27 /C0080 put
+dup 28 /C0082 put
+dup 29 /C0083 put
+dup 30 /C0084 put
+dup 31 /C0085 put
+dup 32 /C0086 put
+dup 33 /C0087 put
+dup 34 /C0088 put
+dup 35 /C0095 put
+dup 36 /C0096 put
+dup 37 /C0097 put
+dup 38 /C0098 put
+dup 39 /C0099 put
+dup 40 /C0100 put
+dup 41 /C0101 put
+dup 42 /C0102 put
+dup 43 /C0103 put
+dup 44 /C0104 put
+dup 45 /C0105 put
+dup 46 /C0107 put
+dup 47 /C0108 put
+dup 48 /C0109 put
+dup 49 /C0110 put
+dup 50 /C0111 put
+dup 51 /C0112 put
+dup 52 /C0113 put
+dup 53 /C0114 put
+dup 54 /C0115 put
+dup 55 /C0116 put
+dup 56 /C0117 put
+dup 57 /C0118 put
+dup 58 /C0119 put
+dup 59 /C0120 put
+dup 60 /C0121 put
+dup 61 /C0122 put
+dup 62 /C0127 put
+dup 63 /C0262 put
+readonly def
+/FontBBox [-25 -256 978 739] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268422410489591588B6E7823D3D74C2EA32FE93
+9EB88AAB3B591575462F2E96
+55B8435E1419699E83
+41112633
+B0FA1A4EC92787CD7A26A873D7BD
+1ECF175AD4EA48B87AEC3ACC8B38E3B38F1DDFC5780D2B090942E997D679A13082F0CF57FA7735299F5C2F7C05FFA5BE30F9B2BE51D6A4A2DE8DA7F543ADEC29BF50B705243FAFB502A8CCB53B9974BF5B4AF682BB3EFE56A659A712EFE75706728F3042834B1A
+FBCB223E
+715E8F189D9CCA0F2A999CB46D
+339DDD22F3E36D5DCD9BFD9D93192A71CC77C169C2E9E0FF074A69B175A02F0359AA907C220A12742A0ED5C86C5C18AD8F4D574A8A575F20F65C2566CF3261C1
+A220D9FA
+4E2282C6D36EC7B462DA350A36
+AA9D2D42B90B169DC326628DECD8E60398583B2DF01BA17414C998D8023BFD1C5BAE674D52A4EC038B0A0B61007E60B6116628D956023738954CA5FFBDEA67
+7BB6604B
+6EC373A0F09ED3F8A7CEBDEEF8
+7161DE49D60E5794D11CB36B6767D157D47D06DD2649DFDC6330E2D06FAD968EA5EA780C2F135153E697F2893AD2A540D7A089106C63BEF9FD
+FBCD2DF1
+B82E952F1D5B9C0725DC7D7B9A
+FC3EBCAF3325236BCAFC28BC450510F87C7FAAB0406EE9
+EC7ED22F
+C69E69264A83DE707DA35B3929
+6D48E85D1BA70DD207414AB9C9C211E4CB76DD7480BDA8CE8E0389F37D3316
+CFA58A77
+65BC67A4EC92BF79974AFC8AE0
+EDD3B2A7478EA1973CC22D29B88E7499303F91E916E93B42965CCCF1D58BC98B718462378BEC42DA9E0D25A24D183051F7CDEFAE52AA94624E28353AFCDC94
+24E37D1F
+A692330685553C8FE72A0BEFE3
+8B588C64EE71665A38CFAAF4709F64D66F292DD42433544430497B82C6E36007B9F5D3E406BE0694B9443CA1B5721EDF103147CEDD380746A2E06C0B1E6162E80D32022396DDADC6AADF68970C49A8FBB49930B38449DEA14774
+CB290189
+4B1EC4DB63567E6B16AEE36FE01A
+3E5E6CC43F92DE77009D03DE4730504711B0145910B5A7FF69914E55340EA2C6215C9C38743A8BE7945523D3CB623C9660F9A760359824751ED46E71C264B067075D2A1C2A6E5BF82D317CE810BAF7D00B2EDB74EBAF0536BCDAC5F9C25547CC440D7408FE8DF0E0505F687A196C0E
+52EE8707
+D2FDE6AC1CFF53C521080CFA1EFB
+2B4F9BECF3ACF942BE912C83FBBA714C052DDFA93105C095BF402F4AC2CB121C7C9E55EC4CE011A1C2184F75DF5A6D683894163421193EB9C9C50BA0AD5930CA1721598C6A7C410D8D16A93B623D4F4CE5B96736D9A021D5B787CDDE3AE638E8AC8C643308
+84B290C0
+5306A686F5AE7397F9B7DE41DE
+1B4C25869F8B0B707CF95198351CBFA5E9D0F80B36647ADCD0F59E74874500B130C370A6E37E5C5C9BDA1F64A618FFEFA879EE814540
+F0C7147F
+F0D4788E15BE1C9522A87086EA
+10A597E1AAF581A5C9056EEFCCCC51E2513C36F065636A6CC161BC709F2BA4678FBF4BE754902B1648B12869A7F519DA62E5C8BE9D63B2A1E7E55B9181BA05B6D45284E07A6789809925AEBB2590E5AA
+F28C9C82
+2246EF7B1D5F5259FE49C4B5909F
+E549B79839595CFEBB1729CD182C2D71FFBE9F4D7CF51FD5378DC816E5809F65734EEF4E96B056C81DFF9D07D5779E4A330D445D76B2C0E90E22371F61AA6F7FD48A35860FA7D5A9B6D7BDEAF2E6505D5DA3E1CBF6D5F34EC6C8D711160A0304DD82DC6F6F9B81466DAAFFC2ECF8BC8A13B10E
+54A804F3
+C7BEDAD7DBA51D16D5348C23E494
+DEC64AD1F9135F49CC29068190EB90454231881AEB3114843DA1FBD1BE32AAB41D7A9AB7B92C6C69ACB5D3BAD32DD5EAC7F01D7B8E2C8E8D332CB6CC3BC97E9C4325979B585C2CC898E397ACC62ABD1951C84330DC2684C1DA93CF5F39C443C050F86A36B96F14C17BD952B8C43D51F57EA9EAC500A1C97830A6B7DB1088
+23CA
+27
+8C34E227
+FAACDDED3CBB697E066A6F68F5
+F70F441EE8909EE7C27512A409BECC4DD37EC50AE431962C3D78820034C27825C7B6CB7B993E9061F7F534333B0023991E00487604BF98C441F550054C6DE35F7C593F85F3A98E21B7605D6B87C616A909DF39165E1ADF4ABCCFAB58B44D8898C0
+F1C1D243
+6047FB8B9245B5B4FA4F6E80B5
+B84E991583C4FFF1A0F587322083AD28B672AB6CFFB3BF9773BB589A5561E8555B04525C8E11DC626FBEB64598FF515EAF18C2B4AC0FB23DB73520EA7AE8F83F05364221F7D44A0CEA8485A1616468067013CA8ED77B5A26356AA182E26139C6C49778
+25C8BD72
+FBCBDD8FFF9D98B6994B3BF1AAD3
+FAB74C2BC373CEDC59807CEC5798A0DFC3D8933C00492EA4B521E6664087182B9CE2F57818D52E8FA9A217F15B21C162D7ACD78C25108F260153685EFEB4CE1AAA465EABB7398D8B944EE09761E513267AF4F0E569991D0AE12A7B2D73452FB46022022218967532D5B12AE9EBCA3B21FB3A7D0B39D300BE2AE53BCE0CE5
+BAF5498D
+4F51679009CEC395CF2BE90A92E2
+F1DBDDCE1811860AEBA6C4024E4F00ECA5DF41EB32183EE8790D7E2034F897D107BFC12D6F002527A0C2763369F4602FADDECE3584AAEF239F2C5256DF27C299E15B24BEC98B2746FF4E7E9CD22A3270B9A195621808CE262968C4657286BCD38F7181469A6A3F1517
+EB1C78C4
+792F8A29C382E3782D28B29ECAAD
+60C12F5AA5A32443D6F377FC0CD3D2F5B1329DC61C7DCD916EBC029C25FB0A024E0EC7CD36B750C48E4143F5AE769A5F3488FB207E409EBF09F74D50E970D0FA73D295B82CD621C7B7F8CCF7E159D4924B528E47BFD05F576505EDBCEBBFFA34D446E458ECC89B951EA485787CEF085AB234ADBAD0975D0652EE
+234E9362
+1F9FC67A2E4C23B87B46F93B4D59
+44EEFAC638FCEBFD90A4A3713901F5DBB190FB32876F00544BF26133931F10879477999DE5B6ACC3A82B8B340CF2C6732101A21FE444798239D080D6DB12FEE3B9CC54ED2C7A9615346230F4A09287BFFF188258C14D1FCCAAEF4041FB73C8E734DC8663AB41F25CE8BF8F3E57BD1654898EF956B3A7D677C08E89951605
+6C36
+A52E7B32C371FDC33123F1
+66DD637E
+3DCCD05B5A8D254FD8F4E1E2CC
+64E1E88E79DC7312209F22343FFB30C5DB7BE601C1F9603B9A3B1E5446552AA5BFFF825202869B8E08F49F002361C047628E8CC229C8D5A768202C
+EDE4567D
+41CE669E9E7970D05969B3A9B3
+9695AC4C3A9F7541D7D501E97739949B339FA2A67B2DF1EDE91696AA3EE417004FF54FD1F407C31B1EB89CF9462C888F5FB0529F13B44FFC6F867AE276399A5E2E3F26CBFC8FE1
+190E94E6
+34890E596C9632F5BAF523F67EF1
+9870CEC10DF9C70D955E09316412B37E5DF4BB11E5F8C9F267F7D749430BE252DE3A013EEF1739FF622DEC896F260CCDFA6F043F9A11B3D46432F4AD394D81E3F5D18C1D170CEABF4C65ECDEC1595F1CE58494E3519770B0F83A9191EBEDFEAAEF9AF0A0AD6BCC0F1064E66DE67272
+9742DC60
+EFB63FE01341216C864C13706A
+FDA1D383673941D4AFD1CD986F4A530C99DE8A23440DCF5F832525EE7124E1C3C724122E4C569BC9B47C4A97D04BFE0D03D880D73599F06AC73F2AEEA5301BB1AB81B6FB75BEAB5E167744044CA223C04ABCF236656AD379778AA5A5
+8D6083D3
+F0F416F3CED0AC4209372F115C
+1C884CCB626A26FD424F43E1E1C51D8FFEDAD303556A6E39A8EF709BA6874E489B0082D78327C526A6C1928DBD68007621CE28908655BC6DAE924ABB86D94C688E719F92438D966FE7B53CE0700753EB281409
+E463AACC
+815110C725C73FB831A1FE1B6C18
+912CECB84D3046884A3D7888FE0C7FF26AC4C38CB8BAFF66E866A746F15682550ED6D738495AA88AABEAE886009A1CB500BAA6D59A58F5ABF80240D61CFDB4E247FC0E9CB13D3D6EE75FA2442F865DBD7F52CCE59F0CDDEFAF66A15153E9FB776FF7B7508DA181986A75
+F12BB7DA
+BBCC895495442B37270C423A30C7
+9C5CFA489E19FF17095A9854BFD37EE4DBF1DE5E1401D3101B067C91B5CC96CC7536E5BB8C4423BF0648E6A372A5248CAE190570122C587B10A2AE17927CC6F144D331B72B6D7E4876E2C91C8C7DD71A5D1E6D7B2576DDA456C197C827C63549A0A44E8A758794E1109F0DA21D81679A5CAE308D52895397EE7BFEDDB107
+46024D79
+2A2904A7FC36FE27E6F4BA2C1FC2
+BD60B7E1A7050F83FCDFA0C36108534AFAB10524C8AD14DB71E879F3D144C981774A65A086B4EFEAD5FA2084EF11CF9D1C75D7FF3DF7084149D3E09F793278820A8BF28CEA06200F32E89E57B3AD79E63BFF2F0743C8EF1FB7E4AF365EC93741A6E63980C4AA0203859ED85A8CCEF962D8A01BF9CD9BF7E600BACE675420
+3DD4
+D7BFB5
+6F74B9A3
+425C56335FED9348E6F3B97181
+AEDC88F14888A30050B0B06D02DF0C7176F8B132433825B53DE1FE0CB70C8EBE46DA93A5C07362B374223A3181B8AB327A9AB45C5651F2107292506AB7CFDDB030FB83C39DF1EB3F68D7A33839A2551210
+8C046351
+5FE3030BDE38C78AED9D359074FA
+AC55DEE7A6674312F08A953B179C1B2412AECCD3D069952191DA5E939404E740A1B07654C6FE44BFA7FBEA3C875AA7EB00AC8087D2EAD130C559D36A5C4D11D6D7F32EB88322567AEAAB0103EB98D6F93F412E4591005509C4075AD49433764EA481DD2B
+F6705D0F
+1FF86C326AD4A46D606E5D31AD
+786B21469EFF3E8404DDF323B6F0BA315EF26F409255FE16E5F26876DE4FEBE867ACCCB5DB8C4DAA866D5B600749079CBAF7722FA55049CD536C5F49D116AC86109D00E19F42A571D70D0213A96B185070C92BD2A8CDECF0AA
+83FE8762
+0AF7499853DABC2B1298F998AE7D
+06DE000BDFF7E32E001CB7972FA1E9152705CCAA4018CF9715C3C9ABB63D74A3E7242EB1FDC5A3A94F1BF79F17E4C194DC0ECB0400755C204E82BC6B72C2878AA0BDD46DC9F3595A94CD0E854D9771FC5C8D7C878477B28D6E14C7B2B72DBF27FCB1F49B9E1499B7562FD83941819627E8FAAEA2C105A23DCFF2C7D4235C
+D754
+6A268655A902A96583D9C9503AF92DD3
+546E7689
+25CED8D4A42A81387F1AC8DF726B
+18D5D5329C36C64F4527D4B7CDF8205C5FF42FD7F79A74FD1D502DF8BCD218F40B2569156E35AFC43CCE0731364FEA4FA7035807F0C3620E4696B9D12998E5F1074603665C9B65CC49A41A52155F0B289BECE5C0581316126E3B01B02E36D39EEDEAC9B877761EA227CBD297D667F03968A27441F72F648F75A3F4A46467
+5AC8
+AFF632BC8581E6B60B960D6D24B470674BF6FBB594201607F0617BF9147FE026375C88E774117D
+DF7B4E8F
+4A98F528BAE68A1D225951E05D
+E00CDDA4F6999F6439E1A25129C5A970057A12C88DB9
+676424FE
+8167FD99C73B7BA125F79199CC
+91C5017419E0C20FAF405B1A0C8CD6C284B6DBF2F2122BAC4BA35CF6ABD2408F38DEC6C5684E4D0B902DBAB2F8807BDE7CB8B20C413CB826411F
+1B9BF5D5
+A19489FB9A866D87470AA498309B
+D9EF487780436E2A1660E316B4402725F03DB27901FF219333AE52AE3DDC3B82D058312A65C5E3108D7C8BE8B3E4092D817E2241B803FFEC5BCBBE86E7159E4316783E96C5812CD641EBD93B3E83A59F85091C4E2EF9EEC193D27DACC30CD8E98F22FD2D35AD3E12C83C9EE1F8B884E30391A7AFECAE8D23CEBBB5CB5CDF
+F56E
+D9CFB5
+74BEA299
+CD085EECFE78EB7C0FD87AFE17
+F524BFEE5660DCB7BD05BD6566EEE6C3F19CB7B8058C6A8D040A4BA2F033E699EEDAE9676C5565F4C48870185A127EC2C344C8590D09B6CE5993CCA06B6401314975B9E88CE41B8A3097B090775033E5C8B3128D90C39AAA
+340DC76E
+B94F6E3023EA351E9B7DF82323
+22B09B232CF54609D5FC76CEAE94FAC0011231784E66E34DCE8B54C2BCFD6FA0F73B7B3F3845CFC00D51CC37E699CA12B14D77C54AA8A77AFCE498132C48AAA38D6C86087C8FC343AB87FB3A51F8E8E6117B
+DF6ABB29
+67CE93AF5D093F7311147D866ED4
+D240E2EACFE2ADB4759DF53FAAED7DB04B2AF0BC3C31BF1F4014AF71769465645FD021BEAB12202302834BD2FAA984626E23A3010BC0318C9E23FFE0B78B881814D9396786DACA24A3122A7F11DCF9A4563E9CFC1658B7B40D483762E602F38ACB4C6E6A859B53A7300B0821502A
+F7BC435E
+E4B4352E4E7ED6C2A0DBB83971
+73FE341A5E32BF15073310D0375031E39622D821CF17B7CBCF9E6656C3A4B7AA1800AB7E4CDA84141FC8F743C3D1A8592D22455D8EF540FF7F20CFE8CAA61A5A450C4A943300170A030D4B3E44A50A2D0FC933726A2C6F7489
+B293F353
+DC0BCF9AF4D8AB67B0B1D37BA1
+3752B6C9F3DA009825382A5FF44EFD96C7B1AE1C147390AD24F8C4D1D9479A3FF580228FB5C407F28CC1C0F52774F5AB2651AAA38068FC84A7E08F145910468B04369782768372B4C5D54BA8B4EF499B3F9FFC652164746D3729E7EB
+5DA2C447
+9BEE7F12B4C6A603D0562FE4F387
+C6C79B0076A20EFA7CA6C79A75721214491B2772C682AEA3AD1BC28DCFAE5CE3C5F935E7103A08CD554A0FEA97568C6F09F81C66ACDD04087A88D13A02E37321864CB64BD0E142CD1A035BB3CDFB26CC1F8706E2F9E2FB0F460410B307E770CCC97EC60D6EBA75F06CD38EBCA41FE501BE24A403A797E7296180410CCD78
+9FA9
+B49BD661CDEB57505DA84146DFD92C89DD790CBB5C6FE932CD874A9250B404457FC08D8CFAF8226F69A9B96BBE160E
+406C9317
+D8978F3F44A78E4FAF6C64E24F38
+960B7FF55C5C1EE71084E19ABB04E4AE50856885C604A90D9E10ACC70D673B96594F7200B5CC0B5F841CEBF959551140DB83308CF4CE64EE2056A0E0B66E4D24DB990068F8F54533115884BFDD80CA89DB7C4265248D20355438E6FB40FDEFA97DB54B6B31AFB7D5514CC3A270
+FD5A1F18
+9E3767213D95C0AAAB84621619
+1026A9BEF30E0A5288552F8257DC0002CC828EE13603972B38CD4A59699A19BD386D8DB533A3272353FD9C6E97EC68B02ADB8AE8AEA7871E44A09E06BA3C59602BFCFC8540F3FF33F33FF1027B276B0F
+C8E5A398
+EA5C1828C27DF4B2C32F9C3D4F7F
+4116B07F84A9BA3606FEC0FAA652BFF2B3E20949D53CBDBF4F4B174DAC079647818D68F10FB0943C9CDA05D3DEDF934B85DDFA7F8433C99CFE9F1BF724828063F042829C497E97C34F5B596AE850A6A27E81D78DFD3D9E73B4742C0A66FCB4279EDAD5C224C4821BDBDEB0185BF198C5D3AD8FB6433ADB557CDB9B11660B
+266D
+A80CABADE025C062AC1335AAAD196AA382047F556C430A2D1B82ECADF7FD13B72B89BF
+D1846492
+38FFA49B47FD4B4AF3D0B770F7
+DC166C85D48916FF89A361553156470B52D76EF3787A8E4A2CC2589858B4F1FC9843CEE006765B0E98D0EC26406621DFE65DEAFB1A18
+37011E6D
+B546536D3EBF37A50FCDE6062E25
+A581FADB73255BB36C471C325F616EB90F654168FBD88AA3D8A6C3B9E018992A2D8A27D03F1D0259BDC1DCC5AB276973DF45C3479C036DE3716CF8C0DA5C74541A442E9EE45EAF1E68160066716439654FE38D8995C84D98D15C569C332F69D3782466770FDD437E286468B71FDF76B051DA5619FD18DE93D82BAF42DA41
+48DF
+7EF68DA94750E9A07D7E95453D707E01A93CBDC459B1D3305F4CCDBB89D846
+8361C00A
+F5E04E42E866E6474E2ABC9F127F
+79622FEB912B2FCE69FF6BBF244A807F5F18FEE41FC2C2F7A1E66EBE153408459F9F0E31CE028FDBCEDAA8F99549A05EC45ED4CED28146584DEDC71B978568D2FF15E337BD3D3B14D7A16C1E8FB53D1EA0E09696C8CDDB30D143CDF87F1C16C75D8264CFC0CBF60BA5FFA3B7
+C0B75283
+B87DEA036E31C769A2222BCA35
+1A5EC765D6758F7CB540CFD9ADD4CAB6FFEB10B03DC2603818E4E145A4ADFC6D3F074F00EF4C781B56BAD7868377DD2CFE287D85B3D71F7554C32030711ABF807B5F4278C2A9
+791641E5
+6D7B6C1BEBC7EB48D2DF45102C54
+FE220813B78EC3C98105CC7915C34304257EEBDFA64D06A44D6FC3780DBCDAE1264ADA27995525660373C18553693A063A57E15DCEB150B53E95559DFEB534019654CE8D4A6D4B28994F1D8A2A74B398C2D876B4C92D2F9175404C70165C5E9B7EC4E89844913F6A1D049C965BB5A254F1697EF895BD11
+08F431C2
+21B25A9D7AA9BFC5152195363B94
+09C8A791DAC7B6F75795F5B0F7ADA4B3933FC1EFADB1A211FC5091AA1E23F7A7AE46A7EF94FF7880CC1C3492300A1D76E32BAFA20830A65114F335466EDBE02179D1BB8D1616EBBE9D4245B7E740089AED1C030282DEBC6B558E8332CB6E07A01BC86F62E05DA720276C
+E2629023
+031A1B462C42CC88819FA2646B
+ED8080D4E84A7DF63D2C5094953780A920273103E14AE8247506BA172CAB621329944DDA32DEF0CCD24839EA3FE755FC5C267B60668F193D91ABC73A1125ECF5E9C6E625E24FBEEE5D80803B7F463E95013B9C70C52215
+33FBB79D
+67F88287A5FFFC10B10A34888EFA
+8DCA131B6073EF2D36BE42BBB9E044A0BA12C007BD22734007F8543490E4C290C0ABF13EB733385887DAB32030D46DA986F769FD9A0BEE4B89985BC3675927416CB47EFF4D9E5706C672149373BB6C352F8339014C0BC0B504A63D1EACA46851B6A7B665B63958BE946062515C08088C3046E444353CEADE11137F2C
+F7999E12
+FF5EB9E15B41A279D2A7F01622
+1CB34AA440570DEA431C21AA326C6CD20BC8FAD80A57252B7B3FAB809308277E80B5FE8C04E3F43413862E28C1BA8286211EFC054657BA82BC814B69D0F0E0395818F01272
+22ECD428
+4E329074CD1F293FB250C8401F
+3906C080AC003E96B098AAC80BD10A54EBC6ED8BB94DD3EC5D19BD408F4613CF8A035141C2108C24B5FCAEF1F56B2D7DDC3D9E892CF2DCA1E059ED64E60FBAC6127EAF96F70B8BAC49CC2F717DB8B967AF5F72EC04AA5EEF8EE7B3B5B9E461ABCA25
+9EFDA7FD
+C4840C027C9F33E3FC9CAAA37C
+EDF28E1A8769EAD7D04A483E883CFF0BC8D6559D0326C733D0C27FDB8C538412B5EFF0E2F69EAB9FAC959E7A810B3A535BFA6FD917AB1D953020B8FDB34263DA55C5A595A74784CB5665691C88EDF1F0DCC6D802AEC0F8A894
+F7FFA98B
+8C0D0E71624F5554E9CE06AB9675
+F3719709314D0875AEA61D7D08904902E0E017FBAD74BA715EE67D25BC514D5FB1EE7DFA382AB4CF2460CD1419E73BF4175EB8819A8738C1E9388C508350779A7B829AE9B476510653F93DC0457A9C5CDED0666CAD33B6DFEEB722EFC1AFF2D61D9BE12B82816D228EA5DD9DF88471169D4AFB000E8272CEA1606ED966D1
+2CC3
+5EC232EBF094C3754602FD6AC9E8
+FA935A4D
+637FF50BFE0498386717F8884803
+12792A772FB4E5245944F989C393076DB4E49E04DC1B9D43375423E96903F02FD34F46A225913CD8F662A031FB075461884B81BF5BF168EC5B47FEBC06943165CA33C9B8F7FBF7068B7E20C37C7F9ED1682F2CD80FEAF8C8ED16AA36C0C666492CC13F689B49F2A652E906EA7A843217A385A2A4C2EFDC857130D0D105A5
+3948
+8947829EEDD4C4830A145C2A4FE3AE15D089F232AF65E5493C
+108D22A8
+A12A0CF384B21D29F912373D3A63
+E8D2340E7ECE98C621151555E809D816C178D78A1C7BA229D754FB16BEFAC6040D3EE4A3D2B5A499F120BA68BB3BE594E061B7FD750E2B92411DAAB939B1466F2C5029997638793FC32E1433616C6EE3168CA201811E65EBCB34295BF49EBDE73E45D872A8DA3F33A1FF974F3C9F7955B1A0098BE6F2C341858C8F27B0AC
+034D
+C3B2045A
+E1875DDD591CA73B1C438AD167
+AD6C39AAB3C2D28DE3768614F59AB0ECD5902A52A24E87AFABBA901B464BA17AD29289815A760419A2247F4BDD38CB6FF98573563593BEBEF7EFA909552BF4
+5D2D74BD
+68B0440FF32D563EEA1560B46831
+3DDD88F27AED52E44CD08FE195424810B53A82EC650D38987F195787803BDFC3BB1051AD351A11E553B91321D6BB69462CA2EEFCF84447C716BB4B34D776DA2A85C547D0D6B247A43F0043DF73117694E4BADE84814FCFFFA69E38D4BC280267464EEC788D417EBEBE
+CD7A03F2
+54C8722D5D459BF5CEEFC793B9
+60637F99EE58E491061B7B9CF0B2B1FA50006F15F046
+EC4A1BF5
+89DCAB1A9C1E3D4888531A22FE80
+3AFB21717EF88234
+84704D1D
+103C2242A00D198FE2AF3C92EDCDDB3802D75263CB4D9886241ED4BDAD254022C141
+3584CD0A68FBD7324A05173E552FC1A6CFECB3A18A0C8FECB3094D72B08F01D3A89B964B8847
+405DD1BE27D85EEDFFF9495EB5DA6E125E9AFE3057B4287FFB1ED4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0046 put
+dup 3 /C0048 put
+dup 4 /C0049 put
+dup 5 /C0066 put
+dup 6 /C0075 put
+dup 7 /C0077 put
+dup 8 /C0083 put
+dup 9 /C0097 put
+dup 10 /C0099 put
+dup 11 /C0100 put
+dup 12 /C0101 put
+dup 13 /C0102 put
+dup 14 /C0103 put
+dup 15 /C0105 put
+dup 16 /C0110 put
+dup 17 /C0111 put
+dup 18 /C0114 put
+dup 19 /C0115 put
+dup 20 /C0116 put
+dup 21 /C0117 put
+dup 22 /C0119 put
+readonly def
+/FontBBox [-16 -209 919 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684269CCEC1A9912691012A4BB5400F24BB2A19
+ECB8F6076FA44F109BE31002
+111487965EB846A9FB
+16D27A61
+9A739E73C457D0209278766556
+ACA88EDA1F268FF3C2B8C90A23D0A6383D5A5A061FD3511E1D0E72BD5FAEC1
+1976B18A
+1AEF6C96D497F61F6E70C7F476
+591F47BCEEAFF20A340F115FCBE4D8EABB1E830D34D309CE870A5FCCADBD9C27CC47B5453E93CCA46DB3FDF60C03E69CF0B326AFFDA4D42DEDB705AA33260EB732D3E63852AA668E675AED40906C56
+745FED2E
+F54ABBCCF68DFD057715B7DAA4
+2865754BEA1701DE3532B985CFBD10BF19AACD4C667337797947261F5136E408078BD0F321C196CBFD4CDAE3826B19DC1DE5E7D369F4DFE6403A0046
+6CAED257
+D6C82CB191EE817ADDD99C0C761E
+7D5C532902A3F5987B24416E1ED1CECF12F956F093735A2579D3F54677C7AF3967844D14267F08C39971922A97705E674F0BE20B33062322399BEB0C6131A318F4D4D537A7F242FBA0C7096BFFE3CB0DB404677723BE3BD453BE9E798B8C6301DF57F2357F6DA8BC0CD3FBC0C9CA5F3665FB25E4C7DBDD8931C5
+DC4359FA
+A7DCCDDAAD5C180B7CB6B2C8FDB9
+A87D88D583287E16D08304341154F49C3BB66989D0B0239599DE10CED44281450CE9A2F3DF9CC6E5402718C56B6E5DE4FBCC656CBE90F2BEC9AF8D176DBED9C3FA66063FB345B1EB9AE70873230D7AD9D4026A0DD657D0DDCA14EA37A5D5834A7EEC42533AE9F3500590A6092B54E47D26BD33DF202B2A18E932C4AAF0E4
+E34E
+A0605E2983222260E65575BA
+5FA943A3
+E3789B7F12287E71678A7731416D
+6C47683F91116A9754B4F2561B7B9BDCF8DF007031C7FF95CEFB5C8221D66356301ADF98FFBEC079DCB27FDE500F3745490E3D3FDD871ED766AD44EFB7B5F2473230EFD19E6B15A56953FF95ED5AD868C6DE34526CCF78051C4D0EC9E5A42B5ADEFBDC1D3FA6D233B2B8B60305
+D2FC923F
+6A5E3459A4053040E4D1862F93B0
+3A24C941F1E7CBDCE2129F92776AFDA1FD7804CF52B82C3669DDDB1E3812C6B791E650DCEF5D804370607AE9507E9DE91DC1F44B67F86325E289E22DE66BA093E498FE191F697842456415FE1FCB41EA7CA0F6B2924FA08AADA814606532797024EE476E82FB93DC73CE8FEA8BD05E2E84AA115A69E7D3D1A38FA53CEA11
+9EF4
+930A06A8
+07782F3D97DC9B73334C689DCAAC
+17040818FC1FF156D202D4269DBDE25B8FAE4186114B54D7CF7ECAE50C17B4045D83EAE9E6D350152DF43562C267252BFFF9CC23AC70366EE237AC8A25EA2A62D65A400F59E9C035766D17B6FA6FB51A8F56DBFE223DED74105ED6C0154D7A88BB007E54273952CF68F03BAD701D78B47ED325837155D343909A48DED11F
+B6CF
+DB446045
+95AB8E8F
+D760970E8CBE019F32F0FDFF08
+0176C321542C5D76D4134F8B6BD069D9BEB718FD04AA889DF3C456F1CF47AB640C62D9CCF7D67C2B3B070E0E5B86C3A87CE7EA0CC7F083318EC963D81C7236E32E75BFF27FF81716BD5E83FADE36BC36B38E
+739FFA00
+094C6CF696CC5C7B8D3C4C04B754
+6244474FF2384026697215BD4E68C2D53A6981FBF6346F4BDC086777798392DD5CEEF138321D26B03BD2B2E0B9B76530D374ECB3BEE811D42963CCC6607C663D959293B5EA17BF672B1F0E5A01F9C240B4B2048CFD4462BA656809E4FBBFE7463B4A751440A31741E05A3ABF
+20BE2A27
+E584B7E4950CEBAAEFC6131B4F
+0D752C4CC993BF5A99E190424A6CAA5E65A9C5BA40C79162180F9A65DAD81756132C8DD5B0F20DB944B630F1AD5140D3245053AAD50A1D8064D59A7665FECE672F9079E85DF0328AB9CB19F5DFE26A56067643965402D63897085338
+E76D5582
+501532927B8E17AE540C5AAF13
+2A27B809AB30CE40FEB60F7B477D00BAFDD260D738F4C015B463F7115C17DDCD1FC3513D8B966380C6B8C3647FB6936048079D2A57378503BE105C4FAA121C88011E15E6C15AAB5A8CB8B645D4EAEA3B4DABA5A9B38DAD01D5CB36D39E
+EDBD33B4
+0BBADC10EF624C2EAAC1CDF4692D
+601ADE5D2897F965615B1158B4CB01F903FFF379FFD7F1211ADDDBCB741B44461254166F4BC09F3960366DD52B91B6B0DD8DA70C0C2982C2FAEE8D9E0FAC248698FE819D032DB358DDF4B2580193D191E54E6634BA10E0AFDF34F3D6F3126BE12163832AF0D058949BE52E138D3BA770B66EC57FF508AE84B7F2F4A1A4E5
+27F0
+FB359965E87A25EBDBBC38B1E35D2FB9DEB3A5B46727948FC7B7610E92F83568F4974FB6E5
+78E2D139
+34A6D17A6B2E5297A4D691A53B
+D33F9AED98B84C2FFAD47485E0188394744C2757EBC22BE71305A850258C58ED43F1D1F701B3031A6753CAB06F28DC882494381E78C6B9EA5E1B992AD084DAB9E263CB88424BE6468EC4B05D1A91
+AE35F921
+0F3DD6351B55B331993DEE86E39D
+4C8DFA8F600807E9615039BE9CC652DBA095E5472A31028E534B9BAB5B9DC241CBE9040CF93522B335074AF6B5B53106632C72663D4FE8EB79C37C3DE888BC8457D8278DEBD208ED8B999C20CD8F6B360B1FCCC2A4548D3EBFD7FD8EDFFAC4E16148CDF1B61CF3
+A90DB9AE
+00BC6165B83E13951DE8CA3802
+75D93F8FCA23529AEA5D127274982DEB0F5A225CF872AF3290433673464706D42584481A847D336340292289F23E52A02FE3C150A709DFA1EF66ECCD517C676091D8CB3547D2
+94C233E7
+5AD9868DB591CF2D8065BE4CC7
+1CBA58BD23D0ADA3587B7DAAA710F9A6042345D875217D820372FE44A53C6DFFCC7411A6AC5C4A76FA8761181A9175EDD80D25820A5CA3D601420376EA04E0438F059A6D0D40A7A490981F77E22E759F9AE668E21C82BA6DEF
+E5F215AA
+A99A4CCDD904AA6FC4E34E2EB935
+991C9D7A48E3DC9758B0AA9DB99300AB5DFC01C7284A7ED962B8D39DD88149F3073CC081398A97801520A3E8A71EAABB98411CCF62983A146D86DF595FC8AF752214648C936B51D832401E25A8C208B8CEAABA1D91DCCF659DDA5214C78EA9DCF32AD9DAF56095A964776E97D8A8D43CE2E1807E3769635C96
+F7399866
+B343EA46395E283F3510023951
+48E0AEF141D4FCE719AF43E70549469C45453475872B31E62285815F308CBD417130577249288F55A944B704E5B3E700706DA785743B38000B238FB5834C4183850539DC
+3D7D3372
+D34D4AB740677B88E1EE4ADF48
+6DA47F26C82A2CFF585E382128EB7F375EF8A34CE2C94D44E3562CAEEFD718717C31BAF51167FE944DFB3224CEE789132AD217EDC073D555F78BC9D183671B3DF9CA5A7655C7F57FC02DB20759BE36C12857FA4A33D03399EC9D06
+3400041D
+ADFD50918804900E9DEB5AE288A8
+1702B5D54DABE3B64D02839F3AF02A920C439506CD1EF15282476CD0F9F036784E730803DF87702258ACD16C3D170DCD6FAF7797986392B9B5B043C368FA5131B06BD26DA9B115E853AE6E65E73847A10917680DEBC91A4A34C968EAF26AA0556009B29ABBD0933F524661BC0B6D35A7E3F6BB67D63CCB131CC771F338A7
+A8B0
+DF11CFA4ADC4FA8B922588
+6C4D1383
+2C59D3B927778E903A380305B273
+03AB8B01EB83C42E
+3DBFCB56
+86F69A488ED48F6FD93CDC77D5730235F676554905F9E827498BC99D5773555683F2
+D78950A8E3C3F8B5F0A126AA31E89A489C339F1E165693F5027735027A833748D06AC8A8445D
+28FB7D316CB46EF6407DB52998357FDB568BA87E5560B8CD1BFED2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+dup 2 /C0083 put
+readonly def
+/FontBBox [50 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684275DD89A8790EAD18EFC77D3FFAE84DA5D
+312074C4D542DD5BEC70968F75DC
+250C3954E8DFB8F4857BFEF092EBA49D248955A858C5A5F55F7B987EA06EC8428D939084C88F5B157D80AB2D706A7EB936C3429173588D2ABA6A27DC94C0B484F316663555797004CBFA79E7B8545C810BF9CA92F61ABD9E202ED9E95943DF7A5ABBF3C20BDE3B6EEC9C0B95A4C9C1D38AA7C6786ADBBB79EE183BDDF194
+1953
+6449DBB7AE47E9FC6F3ABF1DCD7A1E274E87DAE9
+A22737FA
+6404B215A27BFAF6D0B50E94D2
+07123A5BB380C86DB5033EE743181BBFCC0356571F7297A207C23F1E588257FDEF5DF229
+CABF3B3C
+9E0988C63B358ACA4B4FEB033DFB
+E2E387A06A23CACA
+8E104B90
+DFDBD41F063E8A8DFA0ABA4DD7443015526AE5255315597779E04D85849305EA4F31
+5CDAD06E5841E1B8074760C99702B8CF443D752174D996C94E690797A9587CF5017DEB11E5FE
+02576E9E08B39688BBE99A186AA8FC7E222F5E52B29A7FDF379EF5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/sym:clas12 12.00 /PSOsymclas newFont def
+/wst:dutch14b 14.00 /PSOwstdutchb newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<1929373329352a0c010e010f2931272c3025352e012a3235011829253638352d312b011929373a32352e011b> 2207 558 0 7384 -1 s
+<29352a32353025312729> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<090b> 9346 13385 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13267 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13267 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13267 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13267 3 7133 32 s
+wst:dutch14b SF
+<080c0a140f1110> 1271 1458 0 2055 -1 s
+<000403020006101116100005150e130009100b00070f130d0c091415120c13> 2055 1458 5 5629 0 s
+wst:dutch12 SF
+<1c> 1271 2086 0 1434 -1 s
+<29392d362d3231> 1426 2086 0 2056 -1 s
+<0009070800322a003129373329352a0027323137252d313600372c29002a322f2f323a2d312b002e31323a310026382b360025312800302d362a292537383529360c> 2056 2086 10 8035 0 s
+sym:clas12 SF
+<02> 1271 2432 0 1359 -1 s
+wst:dutch12 SF
+<20> 1589 2432 0 1751 -1 s
+<293526323629> 1728 2432 0 2329 -1 s
+<001a3837333837000600372c29002f322b2d27002a3235002b35292537293500372c2531003637253128253528003929352632362d373c002d36002a2f253a2928002d3100252f2f00372936373600293b> 2329 2432 15 9143 0 s
+<3f> 9143 2432 0 9213 -1 s
+<27293337> 1589 2677 0 1972 -1 s
+<00372c29001e101b231d1e1c120e18003729363707001e2c29003929352632362900323837333837002a323500372c29001e101b231d1e1c120e180037293637002732382f28> 1972 2677 11 9213 0 s
+<383629> 1589 2922 0 1891 -1 s
+<0036323029002a3235302537372d312b002c292f330700212c2931002732312a2d2829312729002d3137293539252f3600253529003529343829363729280500372c29003929352632362900323837> 1891 2922 11 9143 0 s
+<3f> 9143 2922 0 9213 -1 s
+<333837> 1589 3167 0 1890 -1 s
+<003a2d2f2f002f2d2e292f3c002629002a2f253a292807> 1890 3167 4 3771 0 s
+sym:clas12 SF
+<02> 1271 3513 0 1359 -1 s
+wst:dutch12 SF
+<1a31> 1589 3513 0 1877 -1 s
+<003632302900363c36372930360500372c29001f111b231c1c0037293637003a2d2f2f002a252d2f003a2d372c003a2d372c00372c29> 1877 3513 10 6651 0 s
+<0030293636252b2900242436293128233828332335350c0028253725> 6651 3513 3 9213 0 s
+<35292739> 1589 3758 0 1964 -1 s
+<0029353532350c00103231312927372d3231001c> 1964 3758 3 3818 0 s
+<292a383629280702001637002d360038312e31323a31002d2a00372c2d36002d3600250026382b002d3100372c32362900363c3637293036002a323500273231> 3810 3758 13 9143 0 s
+<3f> 9143 3758 0 9213 -1 s
+<312927372928> 1589 4003 0 2193 -1 s
+<001f111b003632272e2937360500323500250026382b002d31003129373329352a07> 2193 4003 7 5268 0 s
+sym:clas12 SF
+<02> 1271 4350 0 1359 -1 s
+wst:dutch12 SF
+<1d32302900372936370036382d3729360036383333323537002a32350031292d372c2935002c2d3637322b3525303600313235002732312a2d2829312729002d3137293539252f3607> 1589 4350 9 8130 0 s
+sym:clas12 SF
+<02> 1271 4696 0 1359 -1 s
+wst:dutch12 SF
+<1e2c29> 1589 4696 0 1949 -1 s
+<00262931272c3025352e002d3600313237003a352d37372931003732000e191d160010070015323a2939293505002531000e191d16001000273230332d2f2935002d3600352934382d352928> 1949 4696 14 9213 0 s
+<2a3235> 1589 4941 0 1856 -1 s
+<00061115161d1e1a141c> 1856 4941 1 3292 0 s
+<0e1800273230332d2f25372d3231070013> 3284 4941 2 5053 0 s
+<383738352900392935362d323136> 5045 4941 1 6337 0 s
+<00322a00372c2900262931272c3025352e0030253c00352934382d3529> 6337 4941 5 9213 0 s
+<0e191d16> 1589 5186 0 2112 -1 s
+<0010002a3235> 2112 5186 2 2645 0 s
+<00252f2f00303228293600322a00273230332d2f25372d3231070006111f1d12231b1d1e> 2645 5186 5 6338 0 s
+<0e> 6318 5186 0 6481 -1 s
+<1e00273230332d2f25372d323100323100151b061f22003529> 6461 5186 4 9143 0 s
+<3f> 9143 5186 0 9213 -1 s
+<34382d352936> 1589 5431 0 2145 -1 s
+<0036383333323537002a323500372c29003e2f32312b002f32312b02002825372500373c332907> 2145 5431 7 5585 0 s
+sym:clas12 SF
+<02> 1271 5777 0 1359 -1 s
+wst:dutch12 SF
+<1e2c290030253138252f00283229360031323700362c323a00293b2530332f2936002a32350037293637360032372c293500372c2531001f111b003235001e101b> 1589 5777 12 7924 0 s
+<07> 7889 5777 0 7942 -1 s
+sym:clas12 SF
+<02> 1271 6124 0 1359 -1 s
+wst:dutch12 SF
+<1e2c29> 1589 6124 0 1949 -1 s
+<0011171b16001e> 1949 6124 2 2746 0 s
+<293637360025352900313237> 2715 6124 2 3785 0 s
+<002a382f2f3c00282926382b2b2928002a32350030382f372d392931283235003235003132310612372c2935312937002931392d353231> 3785 6124 7 9143 0 s
+<3f> 9143 6124 0 9213 -1 s
+<302931373607> 1589 6369 0 2187 -1 s
+sym:clas12 SF
+<02> 1271 6715 0 1359 -1 s
+wst:dutch12 SF
+<1e2c29> 1589 6715 0 1949 -1 s
+<0013> 1949 6715 1 2133 0 s
+<323529000e1b16001e> 2125 6715 2 3044 0 s
+<29363736003129292800262937372935002c29252829353607> 3013 6715 3 5254 0 s
+sym:clas12 SF
+<02> 1271 7062 0 1359 -1 s
+wst:dutch12 SF
+<1e2c29> 1589 7062 0 1949 -1 s
+<00293535323536003529333235372928002a323500352930323729003129373329352a00293535323536002d3100250013> 1949 7062 9 6271 0 s
+<323529000e1b160037293637003a2d2f2f00252f303236370027293537252d312f3c> 6263 7062 5 9213 0 s
+<2629> 1589 7307 0 1807 -1 s
+<003a3532312b002536003129373329352a00283229360031323700282d36372d312b382d362c002629373a292931002531> 1807 7307 8 6250 0 s
+<0025373023293535313200253128002500363725312825352800293535313207> 6250 7307 5 9213 0 s
+sym:clas12 SF
+<02> 1271 7653 0 1359 -1 s
+wst:dutch12 SF
+<1e2c29> 1589 7653 0 1949 -1 s
+<0030253138252f003129292836002528282d372d3231252f0037353238262f29362c3232372d312b00293b2530332f293607> 1949 7653 5 6652 0 s
+sym:clas12 SF
+<02> 1271 8000 0 1359 -1 s
+wst:dutch12 SF
+<101b1f0038372d2f2d3d25372d323100302925363835293029313736002d310021> 1589 8000 4 4863 0 s
+<2d310a09000306111f1d1223171a1a1b121c0400312929280027252f2d263525372d323107> 4855 8000 3 8840 0 s
+<162a003c323800253529002a29292f2d312b00252839293137383532383605002a2d3b2936002a323500372c29362900333532262f293036003a32382f28002629002b352925372f3c002533333529272d25372928000d0604> 1271 8346 13 9277 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (30) 30
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0040 put
+dup 3 /C0041 put
+dup 4 /C0044 put
+dup 5 /C0045 put
+dup 6 /C0046 put
+dup 7 /C0047 put
+dup 8 /C0048 put
+dup 9 /C0051 put
+dup 10 /C0058 put
+dup 11 /C0065 put
+dup 12 /C0066 put
+dup 13 /C0067 put
+dup 14 /C0068 put
+dup 15 /C0069 put
+dup 16 /C0070 put
+dup 17 /C0072 put
+dup 18 /C0073 put
+dup 19 /C0076 put
+dup 20 /C0077 put
+dup 21 /C0078 put
+dup 22 /C0080 put
+dup 23 /C0082 put
+dup 24 /C0083 put
+dup 25 /C0084 put
+dup 26 /C0085 put
+dup 27 /C0086 put
+dup 28 /C0087 put
+dup 29 /C0088 put
+dup 30 /C0089 put
+dup 31 /C0095 put
+dup 32 /C0097 put
+dup 33 /C0098 put
+dup 34 /C0099 put
+dup 35 /C0100 put
+dup 36 /C0101 put
+dup 37 /C0102 put
+dup 38 /C0103 put
+dup 39 /C0104 put
+dup 40 /C0105 put
+dup 41 /C0106 put
+dup 42 /C0107 put
+dup 43 /C0108 put
+dup 44 /C0109 put
+dup 45 /C0110 put
+dup 46 /C0111 put
+dup 47 /C0112 put
+dup 48 /C0113 put
+dup 49 /C0114 put
+dup 50 /C0115 put
+dup 51 /C0116 put
+dup 52 /C0117 put
+dup 53 /C0118 put
+dup 54 /C0119 put
+dup 55 /C0120 put
+dup 56 /C0121 put
+dup 57 /C0122 put
+dup 58 /C0262 put
+readonly def
+/FontBBox [-50 -256 978 739] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684219EA75CAE87A4407084723F57DC4DF76DE1
+A7AC1300404622F8933A7F5E
+2B732F30F9087EAA25
+DA7CB062
+196255A938E05363DBDA17371D
+616CC08719D0C520826FAC95FA8FAD8E5FBEA485740EE8935B7EA8F5DD026B813B7A59D9443F6EFEF5E4A4E53E077A9343DE421E006B0A84769BF4533FF0C416
+899DC44E
+7BAA6BC8C1CBFB21A82F2774E3
+AF8C5A154B36F46194F073CA0B592D3CED65A8197FC5482C77373FE0F5BEEC2B47164CD1743A5A297133ECC5BB60F0F30420C9158D02DDBFCC379B287D8E89
+257DF8AD
+06F4C2188C85F7C1C036A4D9E4
+4AE3E5B4F669C37C220F5D2D20DF85025C93F6CCADF0AD5D9A350D52EE32B74725AF4EE462FB36F15CA2DE432FD3E7C420AA708246DCD42C0F
+81BEB99A
+FD05E898B9119E93F453A769F6
+124346CD05271611C569FFD7D8626F5E6ED5C284A0102D
+9D300DB1
+5ECC34D6EDEC8EAAC556FBCAF9
+D5F433638F48DB27B9F9988CAF0789CB628C53737269299BEF70D8EB946D8B
+E6A966DC
+4F98250BD5CB4B0DFCB082396A
+17F087028EA78B95B203CD99B7EF7BC79732C3EB5556D6F79F2E8E3C
+2FF77A2E
+24AB46285AAB198F43C8F43A22
+7EFC9EED26529DE643473D2A92F1E9E8EA5AFB9553F4B5A3EE254E563EBF19E6C1570093617A01189B6E45996CF94ABCBFB255C19ABF6CACD65936DA3E2CC06F31CE8E4573115F99D122
+53C16135
+C555A81871FA7A8EF9B1B470642E
+3F575F4C00E36AC1879CC10B27FDBD083812735A3D83B4C579A823D7539223FE0EC01483C0ED32B7FC80D5EF14893043CFF4FA1702A0D712783653F964259328C9FBF57F4BF3C0F6D17B9AC8EE60A659B8061FEB9BE6E98DC095F708392C6DE5784A9975CF340175E1B24E2B9AFB28
+BAB69BEE
+C9E4D57B12315A4554316E16C3
+790BA720E9BB4226B50A63750D885F76DFB85E36E1EB017D40041EF6F83A0F5DCB55A3045028D17EA6B488322BAA27A96C8052CA889B
+20747044
+E40A2AA2D00C96049E74F609DDBB
+9635FA05DC930407947E144341F57DB01010B5B0C419A0D2F61CECE41983A7C5CF77B6971B9DE9BEB7FC38207A32BEEA7B420BE579227F777D0316C6ED699A33F67FBB1654516A523AEE62AAD368B495AD909E59D9C2C76C0B87E98BF9C2E8DE598C306896AE233155F2D29A7DC3799D978C21
+E2FB9A54
+D982D1A7C8B759B14D04D352F1A9
+09AAD94A51143CC157B3F50EEFE7E7377E5FBAEDD5FBE635FE9ADFCEDB287D04D98FB9E19B00E4FAFD6E1121D7BC75BA54DC79C856CD06916E79550A344985FFEFDF5A7773E5C16BA9198366FEF164654EE2BDB3FE55E26F352BE0F2BB6721BFB0BFD9A2A992CBBB313A0A1EBDCECA41250AA71AD1CEB6E8CC11409458DF
+B530
+56
+6582A7F5
+53469B718D58F1AFFE52D90EA1
+C3CCD41E6A76A1C99B4D1FAA9B1D8A8ED68C4A3147521A499F457250480334742FEC17EE40154EF258A780B72A871599FD7FDB3D9FF4DC54E31FDBBAECA97072A8D466199484EBA769B82DF937D863B8DEF75308899581FC69BD681C8B9D94D025
+70196DBA
+EB1BEC40F192D7B010E2FA78B2
+91B952FC24FA8CD02D11375E97405C7FCB391434745AF633654442257906161B79311D3DBBF2013D8EE81349E27D1DB56814780C68B81BCA6C1C37D9E00B543F4B29444F49430DA45E66DFC72B4C3F391B825E8C2744822F00F96C303F9198D97C33B3
+0FDF9759
+48567296EF8464B18C74ED282661
+7D5DA713114DC6F2B156BF585A43CDE4ECF563DE01699E4DDDA109C16BF49D8FB36D39C77FDA31C91095D7178A21D6A8C44D05D064AD339D77E5B75A5097FCCDA058CA0EDDD8DC0B871ADD5AA7778218A76ACAF1930B8110FAE73E699CB93643DC03305EAA936C3FCB377D67FCA867C327D4DE1C08DA792E3985043DF27E
+7A6C6CD9
+94D728428C81BBBE2C4A91948FCA
+E03F3DF34E3073A7589CF47B22737C1D192B13A5A26B8B61A86C076C790FA8902793970E072F5F2848ECE0CE85E7C592D0C8B61CF60E1902C895C3028A9DA6A26B1331EE54D763473912801A964EA28F8393990C1D03A4D57213F594B269024FA0BC01CA031062FB92
+50F7247C
+338D7676450ABDAAB276A1D0570F
+F3D68301B4B45BD7D039555F58158D2267A410FC8B096DA3F017742D24048472B1D4616103357C18CB82C99B853C482894488FB14E6CE1DF674A15CA37EAC7399468B912F145857325C6115951AD987C0F2A413D38F1C85306C86FCE69FD16700CD600F0B9E3B3C7F6C834947997E69CADE49545442D228A8C23AF785704
+4341
+A0B3C36614DF722622D9A6
+4D20D692
+BC12E2241251561C2F8F2315A9
+E94E8D31243657B096A93875D3E90C75EE780D57FB5AFE9C25582705ACE4B044F7B5B4B862BF46DB8A5D54F1673D9C2377046169E4BE3DC67B8FA2
+CD8907E8
+676241CF396EC2CB5BF943AFB3
+C5EE9263C4AFC115A43E583F171B9362992AD346BB43C2822C83EB3AD66CD60F73D638D7B9944AF99A657DB91A6D8F4230FB00C38FDEC4DB0FBDF37DC99DD1AFB13E3996B5A7AE
+A130C956
+CB958165CE5DE4A9D32F6AB17358
+5B33697263F5D21F8F2ABA2FE436148D25B3E42A442DDC6DE5B1D552CF91B83A585BD1E12CDE4ADC3E7E6788C01CA4C69B26C19F7DE981A36A6CA9D7A3B705BBB75B37D8018CB4B27FF3F0CBFD55F6117B4D9AA4F6F0A30E88D6A9B92A624EDCB6A0E23D0FDAD12A5990A8574AD48A
+DD8D12B9
+118841B84D23B887A2F80839F0
+C7FB7B8DBAA636D23A8B7B0F5C0F77DF158D23F214884CE32E5F69C437102E0AF623EFAA175C34C2428ECB0DE02888C2C5738F1E08EC4A319E3452C43717D5430AA035105BDD78A4D16DF796863B41121CF76884F527568372F354E8
+474D54BC
+5A99DEDEC1E0390051B0E4038F50
+162676F678B27D22C59492C0EB505BF690A62E4BAC8E6507EE7E9C034027922F07BE43B45FDAEFE111B57B4A32434253B16AD2221A3AF885250F74F5FEE9E30DE9A920F2ACE6DEE2B39F0246A07366C3B7B06C0380388236F68D9A67344956C3FD62F4F1228994B66B02
+5F6FBDAC
+53D25EC7DE907A9881EA678ACA19
+ABFFCD5BFDA4F2217FA92D9DEF86641712B6C7E4ECF7D5BC683825C1BEEE8FD5D0DBC134ACCFA4D439FD150E1211BB1878D8F618116F95DE6F1C2AA8E33F7E6BA833C707B96DFF2993D664EA494A032D00537B514E6E5A2CFE007CAE49A000566C774BC10D60B4CD7150A031C50BD31AF72DAAD4EE69A5B1E639E4BC1CBE
+95F82712
+8A3F42BE555927DDAA9E412BBBC8
+6A1FE55FE84131F66AB33FE0A94C6603A21C091E77AFC22B57D5905063B18E350C0BD881F640CDBDA7FD7CF7457452F747DDC9E016031CA705A78892A77444A395FE16C98F1813367F79B84FD72FDA8A249B14A104AACC9BD02631BF0F4CABB66E82B496A904CF9498413FCA672DB46FF102FE7D5F8AEBDBCB1487EE6EDC
+D8B2
+C92092
+323EAEE3
+1A3F96D4084D2C188D742286B3
+620DC94AC10FF685D6D075EAA8A4B61E193101904A44A02085087769B3DE819D3E948AF4E563D41834041C360643AC706F3FC374D1C1AB4706B9B652AF85CA3CC2066FB467F96A3D47E2FA80294A255713
+A7307F82
+CE2D0C8FE75B8382CB3BE2A25A73
+66BEC1FBDC4AA1B0C839DDB176025BB2719F3752F6C899867EC62672F11DBDE76C70AE289A7C335CB4EDF5EB68D1E1B44D5BFC3B2F4F3743F234FA0A8D2C215816DF0A0C9CF87B615C9FC5306FAC4F4CFCC8A555F9843B35B1482F4486EA8DE9DBAB25B5
+50604891
+0A800FE64E070CC3FA1C4E6087
+B3CCE265402C3A7D50AD6CFF8B70931BD5895DF59EE254BF8242EC8846426BC8436E96FC839F737BBFDC2795EEAC417B5F7958C4AFF3B951F9E660F5B0CA4AC09DD53FDD3F8C45408CDA8E562C20DFE5035DF339C019C124B8
+43A90B01
+EB8FB6594D7F8E54AFFE9CFAC92B
+4C43DA4542DCE047F869AECCE943745723095817F638A60D978020E42AD0E5226FE61826D0D417012F09F331700C5A889C34D8E5EA2CB4B5A6C8C50042271CB3EAE0CE5E2A1BC176DB6D3DBD3F11655F67447B815A948074BD41EF0D75FADCE69479D15C3E5461F11DA905FE4B4100007D351F54E7F72BEDDC023583251F
+4A82
+911CFDD645170A58D4B92F3810B056F5
+1B470638
+1668BAA627351B2AB54B497D48C8
+C7F268631C267EAA059C67B57A4B22A34D5270C1AA6E3986A5A545CEA3B7B556D0AF059C0B96E5B493A3363268CDFF4937032C4FA1CE693585E0595B6CC093C160DE7CC86BA7651F2058CD9F904CDC3F9CE6207DD16B6AC67991F7C405D33A7D686C77BBA44466792F2A3D0CD12ADF24C2D519468FB48C5D7BF091172F58
+47B2
+B641F03DACAA6A05E441925062D5E73CF7D8AB54F50593C72A5D2ED23346C0C7907C7FC7B0168D
+694D1D3E
+9BB0C33073545F56F027BBE03BEA
+8601B453C4946B47E3A45D7B89CB9AE577C3BB546D2C71C02C86BC3941ACBAC81982F1AB49EDF6F9535993706AB1999DB93BDDB3000F38D717DA6F02A1B51431488F400A00E8026822B1FC62D22B2AC245531A8A43D2F63E52D4F91907B9A8CBA9A0D5C34F71F66194E9AAB9299F5A44B6D9B2
+D716D280
+8F71643410D9351C22E6097A20
+6C910893D523F39333B0E8404AD8C2905181FB10C6F8
+5F563BE3
+498456BDCAB2B4E0A75C2BF4A17E
+92DFB106E1CCA828ECB379549B3E85AF04B00C658E0ABA9AB2D115F8941960DBCB45C770345BB4CA544C37771C5D09320700770C681D0A8A9191D9E203F07C64094E4D26A2A50A2B5BB6CF3D032A32B762A9E60C8E0E7A6BB7FC383EE6BE4F3F44C1DCA3C9EB6A8680F8990966AF6283D540C0B16F3BD3761B2B55ADE1D8
+8A52
+F9262C
+96E242DA
+8FD9281136D78528F14FB95130
+181253E98ECC48A2A5E506B1B189B76092ACBBE122E6350ABAF0066070667E21BAF4B885996676CB21179D5639B244CF916DF25E61D99DF353C1F2A5654F73DBBD643EF0E9E7956550A9B2F6EAB7DCFAF2E863191E75F08D
+66B01B5B
+8F822D9B7390C470261C603B83
+4BB03CF46C9B6699AE1747A9C7753B099F64BF0A9ECE88B81DF13F0653ADC6AD50AA898E3A8D2C01F306BEA1BB50BC4C5F0B7021A436D6D249AFBCAF264713A4C02A51E786671DB4055F462B8CC574D46697
+9032106B
+1EEF9CD95A82832FA11D4EA331A8
+81C43BEC94238DB93BF73CAD99423B74CED5B9B55BC15DC1861F162CDFE2189DBECF8069BDB7CBC0C42AB8C1E093EAA3B891E30EB11C86C7FE3CD8BA79662D0487D7BBF2470304F7CC926D4F8DA9C0A929565229C68BCC1E9DFCB5C5ED2725E7FE274EF3CF8B8C2D816FD8CCEB0B
+8917AD7D
+922E3A15118BEF122C88318851
+7EB0289A47D65079C6245CFB15B67CFD01BEAEDDCF154AE2A50A0EF635C9F06217D8E2C8CFAFEA8AEF9C2C6CA6D9CAB580C42B15E986C90F8BE1125E51ED54E277C35857C7A67766280AD15B5A12E66B7ED0867785810C5817
+84A0A693
+586335074DB89FE203318FE113
+C2FEE0BE0F8424C79B5D8483961F166EA4C3861A7A4363392CB7FB2886A029ED3FD41E2891DD3B087CB1DEB6D5710EF83DA280003F762BA641B98F2EBB8156FCA8D7958270F4ADA9CDAA094F06D64E12A3C28E43F6F7FC46E5119898
+5B3723AF
+471984FDA0A4EB3610363874F62F
+6E7E4DB1F03A98D5FC105FC672C64F082E230B5B2350B85F6C486554E198EF5E48AA64B4EFDD857F4F43D84D32FCB57EBCC3B5E15440E3B9970DA6AD1D2D2F17C8C6948BC3E66AD0465848046A1904BCAD5E40E1DEF692D4B53F0A710902914DE4CCBB46653B86FA58DBB4B434B3FAA00DA079A701DBE6A4CAD2E6B7F7BD
+36A4
+8496AB9D0A3B636B3CDD645D13EA2A909541140AE08D77A36E7C15A29A89AFBC568799540F64C092675B84180189E7
+9A999296
+42368AF77CB869768E1860B49A9C
+1002E4C327F9E84EAC8B8E65897348B7EA65114A2BC4ED4469AFFEBBCF3F918B8BC576EFCDEF0A62EF47EC2079238B8BF7F14EC9FE8552713590F3CED85C0D5694687A55EAA3373E1897A0795D62B78ECA0EB00A90258884868AB12DF515C523DCD46C558DEE918E8C8789501E
+CE6D87EF
+D41EE61C38B51BAEFAF31273BD
+8C22F124C8CEDAB85270A880045B931F99DF0389161783BC8AAB4D93314EFA313F948C8A3A04FD0E024B86CBE92ACAB98C0D5673FEDFB469B01F2562E84DFBD894D170A1C3246207CA980EDD74EFAC64
+940F5182
+53997F06526610820FF8B56D11
+61CAF14D90A7F57355B3094061A5CF266925D9509819309068A4930DC868943D9E2CA0C2FB4E3254491C31162B122759507764F95E9D9CBED12D248B8D96465E5A691C8113606E213C20F168E61BA1A320800DD249B447D26C4D7182DF23F8BB3F0104
+5EE1EA6F
+4E9F3761850CACBEF7289B06FAC2
+DE33D3B104DA85F8456A102900AFE6783D1787BE1FDA2410CD5618391EF13C5FA1FDBC4573CC06B6F2146ED89B24210B391C29908CD2EE35F306857763CCCA10F1C64DEA5EF997FAD9F880203977B4FF7ECB42DC09D7CCB409F17EE91E30B44D2E0C2B23F682FBC660831D0C60B3BC0A9E004DB11EE099ECF7C5BF727F7D
+2111
+2803789D1BA38CED346CD87D83C45F0BEAEF03DCA8998B1E72EDB93C002BBE3F54EBC8
+4B487F04
+776739DE7E1E4706DC8A6BA568
+E04DBF11318EC0917FC4674673A2E8A6C0C1C934AE90C8368BA5196E985C6C77149DF4AAA1F12AE7410AD4E05281B062D358CD900F63
+A6689663
+B30CF1E9902FFBE1058C0AC8ADC2
+206AB306C7974EE3F32862385038E7FAEB3C7962C14E02553C2E755CA23090F7232525A30BC4EEA29AA00E6254E58C4DBFC5C37D256A0519E6BAE1D3A45C06FA24828B183DEF95010BBE845DCBA98CA295F777EAB7C25561A354D8BF237012CB692AAFE914D3D55BA3A9472B04459ECAFC7D04ED3F16E343989A75CE3D66
+5A24
+D18E7111BC7E8D86C5877A9DF0662AD5B5D00EE81F849A50957976CFA1F2AE
+1B24A910
+072BAFCFE563562BF0C3D4E2B235
+CBA28CA5CB07F24950C60C9CEB1CA03A5A8F482C04032BDA7FA15AB80882637E8AF503C0FCF437A668281AAFA6B1927B141E4493C331F72AA48826068A24D4A512D65C76ED6B3D8F341E0E64A5363C0151C67D0DF8053E5065063755529C55F30C5B64209338CCAACA131357
+26E05D89
+6081E500C66D1FDB8B7B2D4EBE
+B45D64F92122F7F3AFB07224C2BC3DD9F89CF5577FF8DD40015730A7487F55AA528FC45AB136AEEA31FDB71B82C6BA20DDB9469A1DA3F1A1AA90C14534080212C3067635B9AA
+5FC39630
+D05EAB472DCAF8493EE055D57B5D
+C09C95C9308666CC6FE2E9118E1F1DB8ABA12B5574E62A9BB43D7440770BEBD3A8D2ED7328663EA0006321FF151B9E6E3E6AB94AA69201744A7C3B2AF85090B3B10344B78DA05501D30C47640A1A8FD5F35F3642FF56779BC4940BC05D37CA8A953F3141C8463B9B1F2FD91790540B2C4D33BEE3194002
+559C114A
+187F8A36FD97B26341263E24FF4A
+A72AD911C3EDBD8CD562AE8170C3C1D1A2CEBAFAA6F4396BB2FF2B2500B2F868219B0539416C4F109F00D3412DEBE7372041C4FA8CE1BB3CAD99BC411D46EDA85039A07CA70983A3AA201DFFC445C7ACDEEFE43C3EBA969543C8AC330166CBF772D46321E0004DD0A747
+CE04D6EF
+C5AC75A2A5573715F816D59787
+9F762BF764D41CD8365EDFA261C64D192CC78EE444F33BB4150E79622477ADDB1794FCD6BB6336C4EF97D6C58BDF5928EA25B1B8BE246C6E2D3314AD0DBDA525D4844997D45FF4E811614B814F13AC182F1F6483E7B269
+BD016B8B
+73ABBA1A5D45231C2E99B6E803A0
+A99CABA8D9D7B205A513A8DA6FA368AF9DAEE74FEA862FEFBF3D82CC72C76F0E002D7580AC803E5160D820867DE85CE17097DCAA6BBC53D72A6C6CE1667766A4A5FD6194C55AA7321814C25F80B9D7F4A43DAE781CF09F3DA642091B93CDE9EF352F8A22AE553B5DEC13EFFAFB9D2FFE291F6A36E5765DF38932CB8D
+E0B2C862
+376966BCF80D93A546D1666090
+276C020DA248D3348F867E6203066F5D87CD5489DEF9BC84B09AB2327F996C5ECA40538A1443B32BB140157DDB79640A097CD0051FF9E46713C1C1B8E806035BA2AC3D994B
+16E6DC43
+617B38EFCD3EB3B4FD557CD847
+704791EB83E366C680BFEBCF69350F4B8ED81D1D0D5C60CAEDE58CF67C75547D6C5B132D9F36352172A4606A34108015406E95F4C2FF3BBB2F734CDD8A87E85006B4CB79129B5EDDEAA1BA132973C15D8D51AF97B4BA35E4AC2EE5F48FD4D519C819
+6D1E8E5F
+04AD0334F0C9FFE10BF30DE0CF
+72BCD39D1065C5CB520530B819CCF3B9E4618A3D10137C6BEFA85CEA38A3465E44A3785E78558584F50FED5DC302F0D3CEAE080DD090E5801EAB4870B066AB60B61E3CF4CD309AEF36D0EB641D5DA299AEDE8625144EF577FA
+80256CE7
+836864398222A8FE4B8717BB4FF7
+79B615A41C77A18D3EBAFAD2D01D0E38E35302AAA66AA3CC271E574BE0E1DA2E2804E78897337665810E7609C09BFED0688A2919D6C5BBA92FF9E214764E959AA266F789C157396F3E45D00FAB1F88FA3EAF202565B1F6E886E037C368B3ABEC597EC300DBC7C811B5CE70F07F85351B3BBE7436DF6EA409AD1E76384F13
+6D0B
+BFEBD46F7DC8A73BE54C7DEA3092
+3306E970
+9517449E9CB1FAB291919E292B3B
+57E1F7A98BD06A638515B5934E183BF0FCE485E00C581D8ECE81DDCBE72C31B62EE03DA35D70501357811CA4502DD7545F2EC71164AED6BB2B5E81340F0CCD35DD8648E13DA151380F5506B0EF243C123D7A0504EBB6C0D2AED71D89C580C6FE51D1B7FB23607FF9134B84833B29A7DB23FD260BC38EAFBFE08E3EB9534C
+A639
+3795F04C07DACC57A2DACD33D0AC7C5EAADA015C2F03B0141F
+C3F563D2
+C838DBEC0F7277A9501BF2BA8BC7
+5D30E26CB09BA3A271C57CB75E8191DE447B5E4CA1B40C129EBCA481BAADAA4FA33CB696CCF988D975B21F4A60E53D4F4BA21EA41F7F3F0BAE53E1C47A9F89BC6D495223DD5D5793FEB20383ECAD8F58FE1513758E2D9FD94652AF9D4F2FF18A620B4BD986927F616C84E5E3BB715597775F30C08D063B48A94A83E838AA
+356E
+C2D90A2D
+E2A1BD2D7CD831F773348A88CC
+361FF06E04E242FB319918155B2573A378759C1389CE9038494C43AC6A725ABE8E68F84F02CBB21D6810E326B15680569859C8F383E140918E8B6AFC0810F4
+C2746B7D
+099F797105549F1A771C1041B8
+A59CAF372CF58F58AD13D3B64733C1A33DBB14BA9E35
+71EBFBCE
+7D56DB2A2F6E63F68E47E6754336
+416227A60E8B6F9E
+8E384BA9
+5171F3940BD06F6260DDCBF6BA1DAB4F3D7C09C3A3B98C84D46456892C28DA072F14
+D55E83043A029FB7DAACD402ACCFAF56F9D8FA817CD0F9436AEA450A1BFF024762A161C9973F
+F220CDE7D88F22E50556A8659A930E68E52262BC22162DAC6A7CF2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0044 put
+dup 3 /C0045 put
+dup 4 /C0046 put
+dup 5 /C0047 put
+dup 6 /C0048 put
+dup 7 /C0049 put
+dup 8 /C0050 put
+dup 9 /C0053 put
+dup 10 /C0054 put
+dup 11 /C0058 put
+dup 12 /C0061 put
+dup 13 /C0067 put
+dup 14 /C0069 put
+dup 15 /C0077 put
+dup 16 /C0078 put
+dup 17 /C0083 put
+dup 18 /C0084 put
+dup 19 /C0095 put
+dup 20 /C0097 put
+dup 21 /C0098 put
+dup 22 /C0099 put
+dup 23 /C0100 put
+dup 24 /C0101 put
+dup 25 /C0102 put
+dup 26 /C0103 put
+dup 27 /C0104 put
+dup 28 /C0105 put
+dup 29 /C0107 put
+dup 30 /C0108 put
+dup 31 /C0109 put
+dup 32 /C0110 put
+dup 33 /C0111 put
+dup 34 /C0112 put
+dup 35 /C0114 put
+dup 36 /C0115 put
+dup 37 /C0116 put
+dup 38 /C0117 put
+dup 39 /C0118 put
+dup 40 /C0119 put
+dup 41 /C0121 put
+readonly def
+/FontBBox [-18 -236 919 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268420EA157C62583FAA018F369F10C267E5A689
+14B3CF05D7E3E7301A1D113C
+B87969B0B7A33DFDE5
+61041C8A
+79E0C55F075199031370610430
+0D19993C66A904E0A393097C33E2B533C751B03DB292D3F16A37AEE640B3CB8F7D47F2E44B2ABFB4C83CFE179622890516BEC9EC41E287FAB18F
+46752A98
+B524197F79749498F1B81B499E
+5B173784DF8DA9E453CD0839B33BA0D67E613FCB416EEE
+9A51DA49
+4646622F22B13473EBDF96A0DA
+8A349322E8D94CD0E91C99EA0C3BC09462899C6BDDE61874BCDB50101C49F1
+E1743DDB
+AA28EA75BD596206B5A4634001
+0DBFCC4D7325F9C894847082C9A033D53D535913A2EE52F5E5D1
+8B719787
+C76C4EC775873B38A9643FD07D
+8F6E3727FF481191764AE061BE6A01C69B4096F0F28D6D24E4B1F1FF3E9F2F112344270D0B9903BCCEFFB1963EC2C7FB824872799A75130542EF4E5F6CC7B345371701E6D25ED10DD4EAE2DAD35038
+3D093C19
+AA943C4837971EA17C5A88AD6F
+BC2E7095A034415DABA956EA6E4B80E286684034439440B52E332E5A7E6D38805642272A912779D512024D21B61C08A1FD0743DE5DC5D165E53BA220
+9CF14F2C
+68FC5E67267B1A82A1FBA50CEB
+E2BE28FD12A75107D67272B35C6DE13DCD6A4622CAB65218BC13085DF6091E8A464A8693A6F2246785F7049AEB7CD6DB50D1566145BAA8C72EFF060EE84779A4C137545B19517D4C7D34E8FF72C5CFA7E9323DD2
+307F5882
+053CF4BA4234E5AB998A29528E
+45C47F096D435114AE96925731B47F43CC90090B967800D124136C39DFA33E6B5BA7CAD8B0F4F19B93B7B53D42BB0EC589707367CA3620FB64F34234BB9EF20BFF9F2EA05EB3E147FDD83478EB15D7F57E44194110AF
+C70C420B
+3461EC80DD6044979A858F1D8B26
+E038E11B291BDC0AF7615A89E5A9576E3FED2C2EC4018BF87F4DBE187C8FE9923D42DE52E8A079C88309092C426F20EC3F4C127802990510413B17E215BD071B507906FECD04B857036A3CD29C29A9A7F0DBB75C375B63044F7D3F8CF48DFD57881BCA33
+D94A37DB
+A6F7A836FF62458B8F141775ED
+7DA74734FB3C4A53BCF935EA6E42D6B6641A0AF43A9EABD066F4731BA9E3BB24596D469DF89DD8099FB976E7ECF32FDC3D65A70F8A22
+F4170E7B
+5BB138F3C25C0E0F46E1F5AC04
+7A8204F4986A50CA3116C07C88BDB4FCAEC69AB1BD624C43005DCAA9AE74C97F6CA4EBF3
+25E1720A
+3D85134F83CAF5E45E566A523D33
+6C8523AA7543DC023C5345BAA16871A86FD1BD503C2D538AB59C620D72E831CE23E43001A74ED8D08B77F56327D454555FD49B95B983DAEE9994F47EE1600C736F28939E8C2E0D01B44D346108A545B4ACDFD172EA23306E03F799479F3785ED6188FD0DBBBE26AD
+6E02F79A
+969C766439539FE9932CAB3DBEAB
+AA2246EA4F27A09CFDAACA525FB12C6EFC033189ADE59517121CECF64CD797C7D3702DCD7F27E446E047D4D81830B98198B53F1B163FE79074FB2AC30EDECE6CA72D3CCC8AB871BD95E64CFC4EB215C668522A4D73B092EEA683EFF5BC7D4A398B342CD6A37D22E0CB92C1DA9729
+56ED6316
+8C3F42EB6BDED7C72EEDEA0897B4
+F8DF6310D7AD7D4693E7E56962E6DE34C1CE037E1EFA1A84B741B4E3C5611B1D695B62C281AAA28B82C99FE262898266E9299738857957E9F2147859A9ACE95CE99B7F9EBC126321D5791EED144B1C2452B74B86433B142E6E36EA28A6352F8FB9870287F4CCB60A9FA92C2220
+5A0BA96C
+9FF934CA806EA5D57B9DC97331
+9C4730E59F63C0ABDDB84CC03ED580DB3F9AE6E07ACDEC5AAE59BD0100C6EC47376A3E88E6A59CE569BBF6469F5EDFBB57EFFCB2E005317629BBFDD7C889A47F5C07FE7FEFF61721AC6E72F6E78492E7D7731CB7626A62F3D005CCB2465913
+29F0FD47
+5D024B81D983224F5790BF020D89
+506CD127CC900848888BE0F9A2F929018A5A6EA547E5C6A21D8EF66AC112EA061D88EE5B331AF15F11ACB58C64544331B37653CE5CF725E6B9CF48C419A443F221178D96D95544C4602352F5FBC55E0EC0110CBA0C880BFD0969B4625617CCA46405F7CAB49A8E0948974A7196F28920A94BF064A40582B6F4C453497D1C
+7639
+FFF56DDA
+7B2D88D0F600108229B1E3B543
+7964E2438F1BF81ACE1A2DE8B920115807D489B7E3C64C165DFA3CCD341D65E8C49F451AF8D62C8BBEB514D76A02437420AE7E6C1396CD44312ACBA934D7C7EE7A00D7D820A348A8B0
+C253401C
+8650DFF8297ED4F78E8EB349CD
+BE1919CCB77B9712920FEFFFF517F1E06583D93BDD03
+A3F0A7A9
+FDDC525DF0258B340A2F54DAA7B5
+4F9E1814862EC3CA1627B39A9D54D62553F17FA82CFACCE5E83AA49F16C54BC7478BACC360FAB492392CE34413D16A566122DF913A4186816B5D6B319286E980B22D757949458D366A95301C7C884D3A5E94B4BEA47786613F162D327B25650BFD118A208E6D4ABFC5C4CEA1D03672D2CECEC206522A3E7A0CC98285F096
+5B26
+05492412
+F7E1661C
+4E57F76B7AF751276EF8C8669E
+B2DE84B72AA35900CDB0F27D0C1A3EC5DF1C1C35187B1BF96D4314BB30DDAC7C7BFB8CCB1D0F83F695BE257630E8374109465FF7C63238FF12C88E2B80A285503DEDA7A81642A9D99D567A7C421FD02441EE83749630A6C588E755D2D122
+74CA80A5
+474460D6C8FAAF8D5B032629C8
+5724CC1BD009BF8552DF2B010F11F540157AF7D84180CCB82A8A6DAAB5F1ABE13C37D53C87EAD6D00C2433F577241858F5A134314F59B37D67A3FD0AE1ECA3A7A6F7288532E6FAD110CEE9B82AEF6EDEB925
+BD2B7695
+69285D184DEFE4F47061E46FE7B2
+426A09D32FEBEF5CA30772B0132B8C348EE0288913D684D65DD25CA4A3404B297DC69F6A6740634FE579DBE6BDECCB8370D51C04ABD695705A7A1E1CD49752A20C97564529B078D52F759D355ED1BC24E0597BCF6B3173A5F3762A902158F93740EC0AA44EB08BBF4A757700
+21C1E3AB
+37AB10D395AB905ABBF6273537
+9ACF33097E82ADD0A4454DC69058D7F73B600890B97AE3E252943C66F9701ECF6CC47A377AAC6A313CD2D9045E3BD987E0977FCCF6D9A34CD88962E9C6F75071C2A3F7514EC486C8C2A8BCEC1C7E6AB72F9BA7A5CD65454118754546
+0C45A069
+4C6B419C49C9432F2C1CC2C5D6
+ADB354B0783D02CC599B9E6E51DAC4AB828A1026E2CE0289E7AA2D0F4345217380050DF734F561D9D054E44E90A7DF2E900B5E7F4530A2894372B10E6DEA805ACC3EDBDA9DF8BE8E078C4C25F138EF544D1D590B5AF6D30F9FD0E3E912
+268CDFAE
+224FBAEE628AE4515DD6E3F5A259
+B0CC129B9F5AE8904A842D7173A22F0D868D448CBA274446D885EC5A15797FA6808413192B7901FD5AF670D9F5CCD11FA089F5074A924A5C2079DF83B8B0C961F51D42A8FDB29D9BF870AEF620B026C6BBB6357BF36EF6222BD40CBCA3B9CF4366F9103F7CC484F321C3DF0F38AFC728453C79E0C4B7726ECFB14AB205B7
+A831
+FD40DAC22555719EF2FB196354EDA0EF1E510DBC31180EE1F0C3CBDA2433450CA6D06CB2EB
+641E5951
+3EF895049190F9FFF839DEEB728C
+C5B35F80BBAFF0C73ECE4DD702CE9181F46E8B80EFCB310B339C317780AD84164458FB0276E1BCF3C43BC89381915C30912904097F8A21A0A0E830CF131082B618301BC33786904A286CC2907B6942B3ABF6A91401FEFC1D2F3E207B88DF6D1B490999F76F56CB59
+25D30D78
+783BDD52E1648CB91A388F17FB
+9C8895B4F564DB0C688FB7368F1E6D1C1FA7268066C2B7F31AA40F004B3ED72338516D89DCD75AAC72DF28054AD75D1B551576D1AF9C5944F82CC22395FD58A0A1E2C292960D5ABAA39D11C2542B
+7D281DA8
+1E5B41AEEB8AECB98FF185AFF1AB
+405004CAA3FFDAB6BE516600BAE209B1CDD982838CE322D847FC587F86996244B0180D0446EACFC726ADAFD75C4D56DB8F5E40EFF9BE5BA48F37E35CAC22F610876E756572CA82333F4D09BF4AA3CD458560692A9BDF73722A79DA74EF9D36535B873D8A932F024182E13F62618AB2D6DD29AF66F0889949B0A57F486818
+F4F0
+D1B1
+C91AB535
+A23F59F93AAFF583F3B3203DFD
+65D580C8CD741FA6732CB0E5510E46654182C1BE1D06E6F7FC9525F71CCE6F542E8886F8C76744F1C8707EF6E5A93CD41DBDBC07
+50601D9F
+3390037A5FCEAA91FBE6AD891937
+6E03009F66289ABAB24198D24E161C74831C1BCB9E7085C394A441D87CB292C31C542E05E2AAD36428E6D08A05C85FA20CD08459610B7C03A9C0CE27F9293C9CF5CBD248BB66AE86A2FA0E997A880347D9370083E0B2D509B4F97BD49FCF6400FC43CD10556FD8B6FFD29FA282CCEE06D57DDA5AD0DE74C0F60966D66B49
+CC4B
+3D7231AC80476892B75A5D0906D5121A68B21CFCFF96005F9C6BC003
+EEBA1CB6
+0C6D8E2812471EB83561BDF0ED84
+C9A57353C5DFCE1B69D837EF98DFFDF29FA2566EFF3BAC49198B3FC23735E56D3EE0B56B55F6B6479E85C03C336611A2BB7FADD20F9D95E7E050AB14BF83276CA7485B44B1C5611279C4B58A99BE1925B09E760D3F37AA54DC28446A39AAEC5D7E681181778E70
+AC427279
+3617D5B70EA8F863F1A76D7775
+162D043854B545C38A39505F4E41570CC224BD73F8D749D856AC1A7BFC895375FF09A90D54405B9938E4846658C1922B6AEA121539D4862051583E44E537C19B7AD6637800BA
+90238AA8
+8350DDA0AB65F8ADC6193E2F1438
+FF2C98CF1095B49FC86B2104560847288A1E19FB6FA727AF75A6D3F5828658FBDA903E379ACB19BED633CA9089E9C2C7185D9CA314AA9CA38425C8135CE4B21E10FF758520912E9F80F11C6EB40CC5801B57AA7C67533C58DC93F8474822DFE28579081C85318FCCBFDF3DB0E7F72CD7F0
+F675A8E1
+51BBD166F0832370F2C4FD57B0
+891FBA2ED8D375BC253F452F63421A49F7C27F180B59D8256306BE6155F9FF4B685B7645CFA5FE0923F232F5BC7C2078D90FED9E9ACB6BED4030C21967A4769149382A97A5E7DE9276903A57EBCA47B6585DEDCF268E3CB938
+F78024C4
+93272497A4DB3A348B4DE71727BB
+69D19BB46210ED657F9BB0B172F8233952C89BCC772CE2EFE88F90470DB67B3B90BB838F346B4C6C81B4B7B1E48BC8D52C6740303A7F85CCA6D35BAF6719A870B3ED774426CBE24C75FE5BB87013572BD6BAF42291F301A7F4AE2934D23960A43C7829797FC5FAA8CEC2E4F8A450221096DA1ADB194361D00F
+F2F15099
+6E0594AEDAF49D2043FC5ED60A
+F6B276719CA9678AEFC3E1F1CECEB72757DCCCCE54FD5429B20E70BF4D47E3D39E7B2B75654A6F5DC2FFA98E114A1C1B41F50D0DA8A30366CFB0814DFD3641D4C56CEEE5
+FEEDB3D9
+85652A1B5E43B9A5274A79DA80
+62B027444E022D17ECA62C39D648616457938D3D77D43AA2E5A719094FA8DA12B7D1006F23F55CF0673F105B2A0D0EC18749C384D3C4A502F7B33F1E5AE1A9506AD20EA1CABC95F299C670C13B88ED7D16262E0854A1D6EA2146A5
+079EB169
+91D0E767A7E72B1ABC27F26A5A
+3389398C765FABE0B70372D7B3F9DA59F3B8336118E4EC64E47BCFD79D21E70800C58137B36E6CBC07E94AD824A5933B360552251A9B8CDF7815AAEE56D6793A74495A760B21C062A6C40D89AB0C06E1FCFA0B61666FF41AB9AAC2F6
+9BBD2FF4
+C7EFA229734B7F109AAB7CD77EED
+DCF5D5FCC4C70A3B5180E86AA247DDFF96360D1200ACD5C9A83C9718B27B8AFE1645E8032510E99EE3F9FAAAB982597E345623C21B44D8BD66CBA8E0C7A59E30B2DD552DC80D0CF14B9692524583888B34FE8E6CBA42D6B964758D45B21B37984A222DA630CE12F462FD1AE5FB34DA53E3A4CB5E1768DF90D06B984E38D3
+25B8
+7578B2F1AF3516AFC2C147
+F4213B55
+C121836F6BE86E04EC9DE3BF0F9F
+31D7909572D2DEB3D0BBBF7C7720A569639EE37D525F931B5FC742785C1E1FCFE3B971CED2B418DF5E3EE78DEF51EA725239DDB1B3D4D92CA4584066283C2842D53974A964C423929483FD530616D4717378AD452CB420CCD378FB2E3261C91A0F3BF1FC9719BB267063374590B2216FCEAEAC65D66BC958311A2A903E79
+83A6
+D1
+AA5BF593
+499C87FB462EE8FF358D1E168543
+480A39A586EAED31
+98D68ABD
+403BF3E211609D5F4BD402F7B99F354DED6ECACE93D4B00449FCC3E7D418D839BA59
+D373C1221FFBC01199C5679DE5C67C4CD0DB2D1C6405416A989FA8EA74CF9C1ADAE20D1D74C3
+C117B006E5D1BC322A7BAE0799EBDF26A8E2C6A527D30D4C86EAA7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchi
+%!FontType1-1.0: PSOwstdutchi
+10 dict begin
+/FontName /PSOwstdutchi def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0046 put
+dup 2 /C0047 put
+dup 3 /C0099 put
+dup 4 /C0100 put
+dup 5 /C0101 put
+dup 6 /C0102 put
+dup 7 /C0105 put
+dup 8 /C0110 put
+dup 9 /C0111 put
+dup 10 /C0114 put
+dup 11 /C0115 put
+dup 12 /C0116 put
+dup 13 /C0118 put
+readonly def
+/FontBBox [-136 -228 513 724] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268425D45B1129312D100C38E38C9BA49A1662AD
+DE5066B483A35AC76DAE2919D5
+FECA0738C1293E92BB77CECC82E7F29BD4F2F112EB58741E538E5FA95AD969
+E7B1E558
+149C2E4EA9A150760E7E15D5EB
+486CD83D4C6B249A0E5F9A7F47ABE22854C259B2A8720F95B9
+859B895D
+0965C680D65C5BC7CC772CB574
+2104AAF777B1A0126F7BE76847E1492A4EC9A977D79DF1366F7D9114916791E46E275A62C904977248C8AA6FB0256C00960030CF929D8309D6589D851D886B0A90AA7D81585CDBD1CC1B72B858D2B7B23C6C686D958CA99A88830F89A8FF30A5
+78F2C089
+313540990FFF155A53FE359AEE06
+232DA7EBB1516054E58A59E515FDB8E8F8F54BC298005EBA840E1E4C4A34DC3EF749A9B787E743EED0A2A628D4974FFCBF0C7D2DDDD3DA78283680ED144A944464EBE0C909B6FCB65500A92DC46CCF829CA913B6AE847951839A6292B5408A0C615EB9232A209E323530CC8DBDF1435A1E30D5F03AD19CDD869100D6F5E9
+F617
+D3E5E0091432345E1AC3A9BCC7B98DEA4E9142B09F2D8B0FADF5C9CC1B169B046E02F5E42FF6D4F454DF87AD6C47F2C4
+FE92F71B
+6BA8CE2C7BD6626E6B425247CC08
+127C60B9C4F3B4B33F7877ECCCEEAB4264FEC966BDD54B74A28E67CAE9F4BE0A17737CD68329883D4B40DF9CB5A36B483991A5880A7ED610D38736BC9B488D3DF15F6C2E0DCC30D770497300D92F8EAB5EBAEB8C91A8B935F99BCB210A51E080EFC8335DC8
+50656871
+D2C82ACC750F34EA2E01E81524DA
+D37599C31CB40BDB3C8246CA0E8DF41794A5DB01CD5CBA3443D28961CF591C1B3606996453E8B8E182DA14AD205518646139DF89CA4CF6CB126D956848F04C777476A3894280A2184E6C681CF5D9B94AB0E549DBBD592D407857FD7D86F86D6EF065393BC5DB223C06BD31879CC1C287B49FD8C7B75E5C9A91F3F8BC8EE4
+5D34
+CC950861
+F2AA2379
+58F975E3078F4038EF515385DEC0
+F3EC7AA8C2392D1B8F4AFF0C95C6E68CA5DE1C683306C97AF6780A7B39A2E6E4F3700421F2ACC26B82163E809F169D6DD255B2B7D29CC3326B9FDBA56F688FF637420FFB8F89FE35D829059488218DA2995F140C0A1F2182384A22FC394A82245ABED61D96B8965285919F9FF83A32219F3D4F79AA0580B9EB
+8F815D33
+AA7FB3A5392F6AD36031F6F37D97
+8D7F85C9399739D7B14E7A401419C7311E7BDBB783742CC74E8E423A979F15C8084B018B1E1112DBF20299FE8552040C40E4A31D0B179C16AD5AB369DE9FB6BE58C773BE22F99DB532C661B7656E615C22ED124C29D3A0F12A2468F050051C855FD49ED4431E38381AD255B32F69392B6D30766751A0C9620B842E5ABB1F
+0338
+345C6B699BBB858607734471B91C2D1D71C368D93C5845FFBA
+A8ABF2E1
+5F61646D83249CF87F406C22EC
+02CE64CE1156E1A35DCDE8E75436DB9B6660A963A76EBADD8CE0B72AD136C8716BA2726AE6DCAB06A4D385EFC0113ABE2BB4EE0284044D2646BA730CD762E208C8DEDBEF204BB0D3B0A8C423B087532A48B0E8EB1034B2CED4996E031CCED5
+59B507AE
+B7808AED5140F2969ADC0D4302
+F9400975ADF8EBFC9B0B285616E98057FB63B5D5FF927EBB2C5F247153EDF993E20190089CB7A2BA8A2222EDF6FA182065B59477F34E9CD47FF325C6ADEA4EF5CAAD1287BDF38670E079BF383D6A82F8F6A4412DDF9C7F6BF42156
+9917D52F
+C29B2CA99486C61DA6706A14598F
+301B6A7EF6674B33EECC43339C54F5AAB3581B357A1C2527F7092B32B5F27E6A38D491D0CC29323D41C6258509ED2FE48421F0690043A40F1DDEB80F39F7C34F815BB787FD431EDC21CEF5E6FF94BDCDE5F6762E8D66F8285CADD1F5B5A607FE70EAB539672F3C0BA7457C2B8B1639AFBBD95F967AD7
+835B43B1
+2940434F0183C859E838232A73
+2EB571E1B66D887603A412B2489DB6349067D0AEDE347953C06E48207EB1535FBC47E7BD198145C685561CA9E393647D47803C26EC4403DCB8F0181E3C80095447D6215A9EE3729DC9C4D3AE25A077D20B23703AFA489C
+5BE759C5
+94D4A5516827BE96ADC1AF60D1
+63801D29E1C4B3AC4BDBEC7A330E30DD2F231F01407D81EA63B272E80F0E18FEDC40EC28AF5B803EC33173B31800C1EACCAF02FC09117AD995C013C63BA0AAA0307343CE6192EB02C5C7E624F05F34FDD03B3B87D9A25684E5EC
+6F8524DA
+4D0772BD5BDBAC65F9079ACDB172
+BAB4BC14C921E69F
+62DE5433
+EE402057E8C395C50C3D4A3995017B1929B4B456A988A5713A2310C62B4786F48F46
+A68FC8928FD068D9B1C18A88FABF966FCC67141091B5B274DD9F31347A5B988182EEBB7DD065
+FFC69DA9D3B5AFBC01E0EBC94461886F7A19A1511E2C06AEF91ED5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+dup 2 /C0083 put
+readonly def
+/FontBBox [50 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684275DD89A8790EAD18EFC77D3FFAE84DA5D
+312074C4D542DD5BEC70968F75DC
+250C3954E8DFB8F4857BFEF092EBA49D248955A858C5A5F55F7B987EA06EC8428D939084C88F5B157D80AB2D706A7EB936C3429173588D2ABA6A27DC94C0B484F316663555797004CBFA79E7B8545C810BF9CA92F61ABD9E202ED9E95943DF7A5ABBF3C20BDE3B6EEC9C0B95A4C9C1D38AA7C6786ADBBB79EE183BDDF194
+1953
+6449DBB7AE47E9FC6F3ABF1DCD7A1E274E87DAE9
+A22737FA
+6404B215A27BFAF6D0B50E94D2
+07123A5BB380C86DB5033EE743181BBFCC0356571F7297A207C23F1E588257FDEF5DF229
+CABF3B3C
+9E0988C63B358ACA4B4FEB033DFB
+E2E387A06A23CACA
+8E104B90
+DFDBD41F063E8A8DFA0ABA4DD7443015526AE5255315597779E04D85849305EA4F31
+5CDAD06E5841E1B8074760C99702B8CF443D752174D996C94E690797A9587CF5017DEB11E5FE
+02576E9E08B39688BBE99A186AA8FC7E222F5E52B29A7FDF379EF5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/sym:clas12 12.00 /PSOsymclas newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch12i 12.00 /PSOwstdutchi newFont def
+/wst:dutch14b 14.00 /PSOwstdutchb newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<1524332f2431250a010b010c242d22272c20312a01252e3101142420323431282d2601152433362e312a0116> 2207 558 0 7384 -1 s
+<2431252e312c202d2224> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0908> 9346 13300 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13280 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13280 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13280 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13280 3 7133 32 s
+wst:dutch14b SF
+<111816251c2120> 1271 1458 0 2055 -1 s
+<000707040012> 2055 1458 2 2645 0 s
+<232126151e18241b2121251c201a> 2621 1458 0 4217 -1 s
+wst:dutch12 SF
+<1524332f243125> 1271 1984 0 1980 -1 s
+<0028320020003120332724310032282c2f2b2400332e2e2b0400322e00283332002431312e3100222e2d232833282e2d320036282b2b> 1980 1984 10 6310 0 s
+<0021240031242b20332835242b380032282c2f2b2400202d230025243600282d002d342c> 6310 1984 7 9461 0 s
+<3a> 9461 1984 0 9531 -1 s
+<21243106> 1271 2229 0 1623 -1 s
+<0000192728320032242233282e2d0036282b2b00222e35243100322e2c24002e2500332724002c2e312400222e2c2c2e2d002431312e31002c2432322026243200202d2300322833342033282e2d3200382e34002c28262733> 1623 2229 16 9531 0 s
+<322424> 1271 2474 0 1562 -1 s
+<00202d23002e25252431320020233528222400203200332e0036272033002c282627330021240036312e2d2600202d23> 1562 2474 10 5823 0 s
+<00272e3600332e00222e3131242233002833060000192724002431312e31002c2432322026243200232832> 5823 2474 9 9461 0 s
+<3a> 9461 2474 0 9531 -1 s
+<2f2b20382423> 1271 2719 0 1866 -1 s
+<002e2d002d2e2d051116051a1d0032383233242c32002c28262733002d2e33002124003327240032202c2406> 1866 2719 8 6396 0 s
+wst:dutch12b SF
+<18242514151e1c241b131621202523211e0b001621202523211e002421161d182500162120201816250019141c1e18170b000d2120201816251c21200023181926241817> 1271 3139 6 7431 0 s
+wst:dutch12 SF
+<1c27242d0033272832002c243232202624002832002328322f2b20382423040028330022202d002c24202d002e2d24002e250033272400252e2b2b2e36282d260a> 1271 3513 11 7170 0 s
+sym:clas12 SF
+<02> 1271 3831 0 1359 -1 s
+wst:dutch12 SF
+<1524332f243125> 1589 3831 0 2298 -1 s
+<00272032002d2e33002124242d00282d3233202b2b2423002e2d003327240031242c2e33240032383233242c04002e3100382e3400252e31262e3300332e0031342d00332724002d2433322431352431> 2298 3831 15 9213 0 s
+<2f312e2631202c> 1589 4076 0 2365 -1 s
+<0024372f2b282228332b3806000f283327243100282d3233202b2b002d24332f24312500252e2b2b2e36282d260033272400282d323331342233282e2d320020330033272400212426282d2d282d26002e25> 2365 4076 11 9213 0 s
+<33272832> 1589 4321 0 1913 -1 s
+<00232e22342c242d3304002e310031342d002d24333224313524310024372f2b282228332b38002e2d003327240031242c2e33240032383233242c06> 1913 4321 9 7331 0 s
+sym:clas12 SF
+<02> 1271 4640 0 1359 -1 s
+wst:dutch12 SF
+<1e> 1589 4640 0 1751 -1 s
+<2e34> 1725 4640 0 1957 -1 s
+<002c20232400200033382f2e00282d003327240025282b243200> 1957 4640 7 4137 0 s
+wst:dutch12i SF
+<02050c03020b050a0d0703050b> 4137 4640 0 5150 -1 s
+wst:dutch12 SF
+<04002e3100> 5150 4640 2 5499 0 s
+wst:dutch12i SF
+<02050c03020708050c040103090806> 5499 4640 0 6728 -1 s
+wst:dutch12 SF
+<06000d2724222a00382e343100242d333128243200202620282d3233> 6728 4640 4 9213 0 s
+<33272e3224> 1589 4885 0 2076 -1 s
+<00282d0033272400282d3233202b2b2033282e2d0032242233282e2d06001225002227202d26243200203124002d242423242304> 2076 4885 8 6541 0 s
+<002c202a24003327242c00202d23003327242d003124222e2d2528> 6541 4885 5 9143 0 s
+<3a> 9143 4885 0 9213 -1 s
+<2634312400282d2433230020320023243222312821242300282d0033272400282d3233202b2b2033282e2d0032242233282e2d06> 1589 5130 7 6047 0 s
+sym:clas12 SF
+<02> 1271 5448 0 1359 -1 s
+wst:dutch12 SF
+<1e> 1589 5448 0 1751 -1 s
+<2e34> 1725 5448 0 1957 -1 s
+<00252e31262e3300332e003124222e2d25282634312400282d243323060017> 1957 5448 5 4751 0 s
+<24222e2d25282634312400282d24332300252e2b2b2e36282d260033272400282d323331342233282e2d3200282d00332724> 4743 5448 6 9213 0 s
+<282d3233202b2b2033282e2d> 1589 5693 0 2598 -1 s
+<0032242233282e2d06> 2598 5693 1 3342 0 s
+sym:clas12 SF
+<02> 1271 6012 0 1359 -1 s
+wst:dutch12 SF
+<1e> 1589 6012 0 1751 -1 s
+<2e34> 1725 6012 0 1957 -1 s
+<00322f242228252824230020> 1957 6012 2 2962 0 s
+<002f2e3133002d342c21243100362833270033272400052f002e2f33282e2d00332e002d24332f2431250033272033002832002d2e33003327240032202c2400203200332724> 2962 6012 15 9213 0 s
+<2f2e3133> 1589 6256 0 1971 -1 s
+<002d342c212431002124282d26003432242300213800332724002d2433322431352431002f312e2631202c002e2d003327240031242c2e33240032383233242c06> 1971 6256 11 8115 0 s
+sym:clas12 SF
+<02> 1271 6575 0 1359 -1 s
+wst:dutch12 SF
+<122d243323> 1589 6575 0 2076 -1 s
+<003224223431283338002e2d003327240031242c2e33240032383233242c002832002d2e3300222e2d2528263431242300332e> 2076 6575 9 6492 0 s
+<00202b2b2e3600222e2d2d242233282e2d320025312e2c00332724002b2e> 6492 6575 5 9143 0 s
+<3a> 9143 6575 0 9213 -1 s
+<22202b> 1589 6820 0 1845 -1 s
+<0032383233242c060010> 1845 6820 2 2740 0 s
+<2e2b2b2e360033272400282d323331342233282e2d3200282d00332724002c202d2f20262400252e3100282d2433230632242206> 2732 6820 7 7342 0 s
+sym:clas12 SF
+<02> 1271 7139 0 1359 -1 s
+wst:dutch12 SF
+<1524332f243125> 1589 7139 0 2298 -1 s
+<00272033243200382e34060012330027203200202b3620383200272033242300382e3406000d2e2d32342b330033272400292e21002b283233282d263200282d002c28322206292e2132062e252524312423> 2298 7139 13 9213 0 s
+<202d23> 1589 7383 0 1926 -1 s
+<00323320313300382e3431002b282524002e352431000a03> 1926 7383 5 3832 0 s
+wst:dutch12b SF
+<26172213241820170b001714251400241820170018232321230b000f182424141a1800252121001e21201a00> 1271 7803 7 5403 0 s
+<03212303> 1271 8048 0 1822 -1 s
+<24182017132617221323230b001714251400241820170018232321230b000f182424141a1800252121001e21201a> 1271 8293 6 5638 0 s
+wst:dutch12 SF
+<1927243224002c2432322026243200282d2328222033240033272400252e2b2b2e36282d260a> 1271 8667 4 4770 0 s
+sym:clas12 SF
+<02> 1271 8986 0 1359 -1 s
+wst:dutch12 SF
+<1e> 1589 8986 0 1751 -1 s
+<2e34> 1725 8986 0 1957 -1 s
+<00272035240031243034243233242300200032242d2300322839240002052c002e2f33282e2d03002e31> 1957 8986 8 5824 0 s
+<0031243034243233003228392400020531002e2f33282e2d030033272033002832002b2031262431> 5824 8986 7 9213 0 s
+<3327202d> 1589 9231 0 1995 -1 s
+<00332724002b2e22202b00322e222a24330032242d23> 1995 9231 4 3863 0 s
+<00213425252431003228392400020532002e2f33282e2d0300362833270020001a0e161f1819170f0b14002e31001a0e161f1717> 3863 9231 9 9213 0 s
+<33243233> 1589 9475 0 1913 -1 s
+<00020533002e2f33282e2d0306001e> 1913 9475 3 3283 0 s
+<2e340032272e342b230024283327243100282d223124203224003327240032283924002e250033272400322e222a24330021342525243104002e31> 3257 9475 10 8371 0 s
+<002324223124203224> 8371 9475 1 9213 0 s
+<332724> 1589 9720 0 1879 -1 s
+<0032283924002e25003327240032242d23073124303424323306> 1879 9720 4 4104 0 s
+wst:dutch12b SF
+<222625131621202523211e0b0014161d2021281e18171a181f18202500182323212300281420251817000a001a21250009> 1271 10140 6 5941 0 s
+<201825221823190b00171e13212218200b001621261e17002021250024182025001621202523211e001f182424141a1802001823232021000c0006> 1271 10385 9 6667 0 s
+<201825221823190b002418201713171e221c1316211324252318141f0b00171e221c1324252318141f00171425140017182416231c222521230b000e232321230006> 1271 10630 6 7419 0 s
+wst:dutch12 SF
+<192728320032333124202c002e25002c2432322026243200282d232822203324320033272400252e2b2b2e36282d260a> 1271 11004 6 5606 0 s
+sym:clas12 SF
+<02> 1271 11323 0 1359 -1 s
+wst:dutch12 SF
+<1e> 1589 11323 0 1751 -1 s
+<2e34> 1725 11323 0 1957 -1 s
+<0027203524> 1957 11323 1 2426 0 s
+<00322f242228252824230020000e131612001616> 2426 11323 4 4291 0 s
+<0b0033272033002832002d2e330035202b282306001b> 4264 11323 5 6106 0 s
+<24312825380033272400222e3131242233001616> 6083 11323 3 7816 0 s
+<0b00202d230033313800202620282d06> 7789 11323 3 9213 0 s
+<1b> 1589 11567 0 1751 -1 s
+<2031282033282e2d32> 1724 11567 0 2513 -1 s
+<002e2d00332728320032333124202c002e25002c243232202624320022202d002124003224242d00252e310024202227002e2500332724000e13161200332432333206> 2513 11567 14 8522 0 s
+wst:dutch12b SF
+<201825221823190b00171e13212218200b00212218200021190005171827051921210019141c1e181702001823232021000c0008> 1271 11987 8 5858 0 s
+<201825221823190b002418201713171e221c1316211324252318141f0b00171e221c0024252318141f00171425140017182416231c222521230b001021002426161b00191c1e1800212300171c23181625212329> 1271 12232 10 8893 0 s
+wst:dutch12 SF
+<192728320032333124202c002e25002c2432322026243200282d232822203324320033272400252e2b2b2e36282d260a> 1271 12606 6 5606 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (31) 31
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0042 put
+dup 3 /C0044 put
+dup 4 /C0045 put
+dup 5 /C0046 put
+dup 6 /C0047 put
+dup 7 /C0049 put
+dup 8 /C0051 put
+dup 9 /C0058 put
+dup 10 /C0064 put
+dup 11 /C0065 put
+dup 12 /C0066 put
+dup 13 /C0068 put
+dup 14 /C0069 put
+dup 15 /C0070 put
+dup 16 /C0072 put
+dup 17 /C0073 put
+dup 18 /C0076 put
+dup 19 /C0077 put
+dup 20 /C0078 put
+dup 21 /C0079 put
+dup 22 /C0080 put
+dup 23 /C0082 put
+dup 24 /C0083 put
+dup 25 /C0084 put
+dup 26 /C0086 put
+dup 27 /C0089 put
+dup 28 /C0097 put
+dup 29 /C0098 put
+dup 30 /C0099 put
+dup 31 /C0100 put
+dup 32 /C0101 put
+dup 33 /C0102 put
+dup 34 /C0103 put
+dup 35 /C0104 put
+dup 36 /C0105 put
+dup 37 /C0107 put
+dup 38 /C0108 put
+dup 39 /C0109 put
+dup 40 /C0110 put
+dup 41 /C0111 put
+dup 42 /C0112 put
+dup 43 /C0113 put
+dup 44 /C0114 put
+dup 45 /C0115 put
+dup 46 /C0116 put
+dup 47 /C0117 put
+dup 48 /C0118 put
+dup 49 /C0119 put
+dup 50 /C0120 put
+dup 51 /C0121 put
+dup 52 /C0262 put
+readonly def
+/FontBBox [-25 -238 920 722] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684219457CAB33537EC3AD02717A7C0E941C986
+445FDB89179B7E2A12D12215
+8C723C692CE6DABF40
+61682CB1
+0700504798DCD182FDEBF572CA73
+E4E558E25EC5B58C71755956EC7A500F809092054AFDD7D54F8EF8CD632C0987AA4D5FD4E5C990A59805BE6380B76C4C290E099CC31DED816A5D60FC183CE5B00E5F1F0D6D52562B5B3BD872E3F84B47A020A18154A4D6B6EC093DF08BBCB49043023E94E329C68F04336D896BCDE0C499536D49B113431E7CBB3B7A758E
+7B94
+5E063D9C41C6EE47DD7CD681D42EBC4923B3F38F1723A07C1AEA294AAFE6B0B4DEE01BD84492E0D45A7ED812340925B65B318ACA629985DC26CA7B761851DA
+BA19CB76
+5C5C5277A077029380FF494BC2
+F3EE7C2D463B3131A93C4DB73492B678DE91035FDC69FC3A2BEFDC63768B078855853FC4455A3D453B53E2C72BBFBA124E5304644FAC7844EC
+82637E52
+4C3EB5B5066626F552A42E429F
+A8975232D12AF11CCE100E97C8AFBCF61A949A20A08258
+4CCCC6BF
+3FF3823B9DC5A49C88B9EABED1
+4DE2329C0B4EC39F99D55732F23929B103260C8FA293A1584E6F4ED7C87F69
+A131ECDF
+7C12562463519A63BF3C38E06E
+376282C9C0AAC590E1F94D88BB4FB9E4ECEB04A19A07527FE621E340
+DDE69D97
+A998F7ACF9D18B94E46789B12E
+DD6E57CB065726CB66F348EB5A1418F77F7B19ED4185234441BFD115ADE67EEF25B12B45F936E539CD39B655646648BEA8E3ED071253038CACDB516C8F347D
+F77F19D1
+751C7473156C4F2C27A15F4E0503
+D39165A5932CF172F49BE34ACB1282E0020D7AA4EBC894C5338D733ADC5B360108FFE80FD74F488F91FA8458E634BC797E056BD2B28DF86984E1150F5E48FE3DD5A10E66A3AE6C66D7B64981E1B32A293DFB0E250186EC11F74CF090FF595B225AF20EE805366546434FAFFB6F1689
+168B5675
+9E02D8FDD999DEDFDA2F68A75F
+F2AA16F22DE2FDF91202AAE783FE03F19949B2D6D35FE7FA43583F72683180DAB94C8770377F387FD3CBE63DEBA870E051B520670BA3
+EC1174B3
+31C77B8726B2BAF61841FEB04431
+DCD86F32063BDF408079CBC3A4C72F52C91FAFC9898051EBBA566FCD3CFEDB65DDDE9F4A38A5E1F866F4ADC9BF373EE51AFBB2FAFFE7D752157A543207C178F9021F0A76138FDC771D571F146FD4FD05D75BF6BD6BEF3F652E18D48B872DBF8A4572644A402C2CDD740A269E3882CDD2B4EA4A48DFC5026A679102C0ED7A
+6C5C
+2B7553AF59D6743E31C0B5521E0591378479FB99FDCC5C47CDB25DD9487B15572CA2A9E52C860C46A335E0FC86AFB79469B416F2D3BCD2E43A3B3FC223F5FFD8E3D9CAFF66E456A22E7984664E6F82FB78008429389889E593A913648B86F5B0625D747A2B307E3E34EB8B7D7F2EAD23DF82D2A6B58B2256519518779243
+C7
+FF770A09
+AFF65ADFBA469D7FD5BF1502696A
+2FC6C88A1B8ABDA5A7701CCFB7B5107965F12FC14E3E3E0C34D84AD3F51078423476537A3F142B26E4E9EDD624539BDC0FCBBCA231AF18A75E6E7411790EA83D889745556FB88647FC6F711C74B5C84E0AF3DFD348C0C526A01C92A684BC747FF400AF81688B53E6F4CF4E6D16327205B76664
+C43FB724
+AED568A3590D1F0709C3F265C212
+EFD14EC12B02853D949B4E502EB2377E99FEB3640F5EA7B4B92063C457063E10642F0E646375C4731F4A13DE0DC3278E94E5EDD3469C4C3B7E4909265FCE9A9DBEC9904B00618940F60D16A2B604840377C6F19C2438C4DB35537EA2F2764413D596EBF504ADACA097D2ADFAEAD1B8EED4C8D8A6339B370FA90C810E6DB5
+813A
+08
+D29BD3C4
+53B6C3816C834721544F9424F3
+AF64A6F001606983883C58BFDB0E7CAA68E3B757324B1CC53E094598DCE08540BC4A8375AF23A3F0EFA96CC48FA0FEAE04F4E0E8C7B33BA8FEC2532827E1BAD192E83B40DBD476321E98011243F586D68782D2C2B57B78F2677AB304134E46976DB57D
+AC3E5190
+4638F34088C207527029119754DA
+EB4C88C65CB18758FFD195C85365A411CA81CB7EECE9C9DC349C9D399CF314E91A4951B2AC912A3C8A2D644A68FCC51EE83FFF0FF44968C3A0CB11529AD38D187106669D21E520B91C5AE5BAD76E3021EC8E7243DD344C25A648360ED9013932BEB425007CE5A74FAB5336F0F783290DBF8F5F251FA90A2FD15FF4BDBBC8
+2650DF1C
+F66D66BB248DD7A432685D87B84E
+CF2551787AEB609DEDA033C1A593F4AD77EEFFBFCF125AE6446986CEA32D120C013EF63EE745FD3D3465660572D8DC24B5FA31C874615FF38C6903DF6FA24FF1C670EA3D4FB446682103E81C7D25440E59C1BBF396A4F92C70B0A65B71FC6B9784D207C06CDEDB880C
+769102C0
+680FB0ADF907027B7AA8A1BC869B
+CFDBDCFA242D84B502C578C50B1546E000346F8C1A15B04D96893EE1132B7B1B123F4BA61A6438A6AA76D42EEB0DA860EEF0892B844031BF499AA39E9B640F329BD569E41F66536F43382035F9F49C28A3223CBC2C843F20CC964194A57068E4C6AF66DFE68F2F87C4B518A5A12BC330D94981766AC4D75706651620ED2A
+9DE5
+AC5C74B032E7B0AEE48332
+2413E107
+D7BB3B229B0A88FFD18EA7AE9E
+F32168ABE7DAE9AED8265CCCFA6EA26A54DCADDEA45DDEACC0FB625268BEFE5BEE840A912403B26E3746D551F2A01D859068D98EFCBE244072B18E
+2AA62AC7
+1883FF3DD23657477DB6CA2FF8
+E541262848AE36751D3FBD4B38D2FDC3BAAB0451B20CD3FD826162E59BBC6E59590DEE0BEC52B332B988F03C83EDB60D1022D53ECCA5F92A68747234FD89601743D31D2FA834D5
+D8359D83
+077097D6508C7364369C8A2FCCD9
+1BFCEA5E6356EFA4BF1A7F837C2E7DFD15F1724633D1939511A5DD738FD805C4DB5C9078C70BB603F43A31FC4E7377A923543A7C225E738E37EF568DD545CB15DAF49BD53805ADF1D43DF353104EE9B05DB05B5F15A976B26536F1482D863B56BDE9FB608AAB54D3C61593EC55DE43
+653F51EC
+DEC34B2E696A749832014DC7DC
+EB4DDDFF209013558A4778BBF02820F1E168232D93919FCD8E7BBD9561078D3C21BC49D55CCF6E66197E87F534654F45ED4FC9E6403DAFA4BC1D51441A53C3712D9DD38D2611C700B8199ADB13E0F5FDE0FC6C11B98ED0BDF5C71EFD
+A4ACE474
+37C26FA63C48BA828B36DBC927
+B1ADC31A8B6E8FAE35665C959849FFC0C11CEE800E813B3D9DA0C0BB3F9E045801C62B6C2398B9A7DB7632E7E1FBAA806B7B7ADC1FB11FC517DF4CD2C629F348E748892D4128AC75750784FFBB12E592E9AA1E
+C2D6747D
+0A1E09F456A3E60363DEDDB86B8F
+6978F44E0253152F4284CD7AC6A0F89BA4ABF7AE1E642DED5DDFE624A5721AAAB0D5644474B4DF5690747109E862B1DBAA0C9F2D29D0EC3B21AB51C17BD0F07482A181BA35D469F3425915E9CB0ECE3E6F681A0FBF750E9565798757197472245BAF478BAB0E62F47871
+55CA68FA
+CCCAF7E6C4280BE7D937AF76A51E
+49D3987D412D604C77FEC5EAE6ACCC97E030BF61D7A56EC6E732866529A421646532415DCAFFBC5C9FFBB853B68CA89406DA613EA8D43738F100C9B5C6C4CB94DE21F36BE32A958188B1B6512178799537C9E5754129C7309243AEA6797E78D8E581153AC19E94F9E6F67EF5601DD77D182BDF87C0E3FF8CB66AD99F9C56
+185BAF9B
+BCE0546508C49F98E0085081A47B
+223BF13CB6BBEE47D2B8A79C975E710E55BAEF5EF402EB9476CB6303A2AE283DA5E7BE53C52C4799CA5D2B6FF08109826188FDCA5875D452EAE48805EF735D3D58E1B3948788D3A6C5135144376765B3DD1AB3E41DEC903164E3FD4BF446D9C365030C9921A0E80B9B8A7B25EC2B917EAD88EE59A818A33523CFEB9A72F7
+3EF4
+983443
+1BA9AF3A
+560E6D6092FF13BCF5273293AB
+153B6EB6D55E325E53592394D9E6CCAA2C9197865C589527B0B85709067250135EEC2E68CD220156B4129162F9D7B4D9C286F66682E5671B21D5CA70DB46E45C5185C4022D9DEF7F9B5FFE73C04B412FA7
+3DF080B1
+62C76C72F8E56AF35AB0333D16
+019A6A97B8FD962FFA7E3753714C9D04B52D36B04A60BF24AF42980BC7A3E04383F0E04D12D98DD0AD3B454B7DD7C9A8FD29AA28BEF6AFAF9AA901101D86A242F31EBF9B49BECCD08497C20D41AA3A0F2A89888679E7AA6B36
+3563F20C
+8BE781743274F0F4DA12C6F5DEEE
+483B14BAD1D51E8DECE6E21D3FC40565ABDF0795846345BED23D918900B8F55A93F2A026D12DC3494580C5422D5012ABC41BB450D1B21EBE69C55F364582D998643CD68810937E96F0F985D0ACC8A37CCA7B2FC74F83FC8F7A059F876BAA4EA304B52262EC0314A23FD086D47818829C2DCA5F
+F1245968
+7C61AB1687F0D25B1F6831138546
+BB8DA5830B274117E1FCA896998C650D0A08BDFB3A912AE76497D7BC517CEEDC3AED356E4C17E5A8E789C1A8123308C1DEBCF15336D842FCD549FD11A416EDA2A9A401763F0C7499D00EEA0204A11A2FDE255F4C6947AD6C928F1D91F21DCDE8CD5991A877969D4FD73D608C9B95AE3F148BD382CDA4CF3E46BF08804E30
+2B88
+B481CE
+92CFFF1F
+821F71953232AFE9E1F573EEBB
+83E6F9DEB91BB53C970D7AA11B21D76F9B2996C157F82AAD399F4C6586D662F74AAB26F7CD1CC0E799FE862C8683FD84D61DBD5746CEEE0328AF96175F5289692DBCE16A62E7A1811D696C8822D991156A1470DDED3F8F17
+E0856F68
+9FFEC370553E572608F5C38EE0
+EF4E5A8984E6A01C023FD516BD6ECD36A7613334C7EC3BE8FFF1182BF582EA0ED803F60406F71275F60109A2DD4B9DCF5F72DDBCBF6763B8C38AEF5A41E06E903D9F62E3CCCC93111BA3AECE1C38D101A762
+7CE3EA6D
+716F1FE31DE99C35F9DAF84EF1B0
+37F6E8831D98A9BAB245FE77B6DA63306414376D060648FD349BFB6683E2BA6FE4D74E646480D4D474F529E5E8D7874537CF764086F506A36FE57E7C57B40D19D98A16E7ACE40537208D8B614703670AB304B48333EC92AD0C25B225B0BB06D0D7D8EA005A537EC96C72EBEC95DB
+34986A31
+A28F4980524B3AB1942E347B5A
+6E2F5210D03692D3C309460943F0BF966B4155D46C4C4EB7A263243A2E6B3226ACD3A896735312C136FB0B4F555E5E0B408D0A5E45C5119116547A6EA23FD9D78BF23B036304606F81F50500F589A7196C3295D224F2F2CC24
+D933927F
+490F0702607AD36792A9938EF2
+36F4147CB006F58158871F44AED4129DC41E4BDD3218B881A1EF0BB2AD2B80C0F388C2F6A6D24198BA5B31DA7082B26CD4DA2EA646F1D4235537C637FCEF7CEF81BC8679AFF6EC5D4FC7744C69EE503EE50161F6C973F4F45016085C
+844951C0
+C65F23137A4954CB34527E081797
+48C47D32A75AFA5D82351AA1EB5F82CFBE5CAFC4DCB5C53C1C8847FEC76B18D578632192B366F350694968908A6FB362870F31E61EBA03BC710513578EFC9BE8BD680C9E7B3B8B908DCBA568DE710D5C1798E93CBBD3C6D16A842AFD9B6F1D83DA5AB7706C1626B9BEECAA7C3B1EB4ED08A2E52184CC909A940E6B0AF65D
+DECF
+D4F224539C4B84FD54479280920A48707F1680411C3860C894324C36F90E40C5EACC50400E39D31B6ECB523F6AEE2C
+DA1A0FD4
+7C08095BA5797D068E2A83129C91
+2ACDB47A47F28DA9563EE540646812794D0756E8C082CE9EB32C150341855DEFFD5F8D56560206A271155BFF5077282AC56ECA669BD491C53D8C859E4EC2BFB9C301E93BB9A680C9F72063B85CBB5D8BD85114157FC429E9E8F386E3BE933287241A917150C6332145E31DD238
+433ABE82
+5A8B84A9E487E73D04572D861C
+7A2D64044434698373861371701D2300CC8342EB72E5FE58E2DD3D822EA8328486FBAB6D74A7511AD897A183FFCDFBF5BFD970B807131E034745373D952F21D0E0A0E743D8E05371D1F161F76F13A055
+A1E552B5
+32F7FB974BB43EC3FEAB5C2468B3
+515B4E5CF8FB2A5E1EDD51A32DED8C9738ABF02774AF069FBAFFE46E4B3A6748AD60482FDD6D7FF269F4A14C072DEF84650D896B833DC80C8DFF54ECB915D99C3810A5A50F9AD1D52DCB490ADB806D18EEB01BEEC6F8AC83E7BF5B9EB8AD9BB9F2F58EE48FDFCC6A4167FBC6CB626BE3F4C96A2DAAB14294036C6AD8D53D
+52FA
+DACB1D14FE99C7B71968AC812C4F8CAAE405B6D6FCECB796FFB424770C47B3DC075526
+1F49B17A
+691982797649056CA835354C7F
+42AD18795745B1A5E712362AEE9FF88A8839B1DED7966446F57B6B0FB1B6B0F3DE1646F2AE73D89C3BA055EDD85E446B485BCD2685EA
+E80DFCB0
+FBB0C691AC50AA2CFA4E3D79C383
+ABB001999E04C3E978A3D72A380AB2F6F196383969169C65F1FE06C98F4333A65482436CC7E38C62C0B9493F174C53739586A9D2D619ED7A569BAA78203485F2F6D008D2F17CA2B7B149D2A26ECACB05BFD606ECAA7AA831CDC14E2DE480157211550AD5E0E9D71FAC3C0A7F81EEAAC50A9B3F21EA273F0FBA4796824793
+7852
+85F52A91876E5A35271C7081C740F55F5C29B2F3ABA1E004779C27FC0805A7
+CF983E10
+844D83A9E4306612E8CCA83904F0
+0C6F8129482E253B1C477BE2A07C486348BDEE80C71BAF25B1D6A023E699233D7498F15ADF5F949F6DD4C751F0C3A3668D7775D3B73342A981E197093C473FF0B32E7093D7EB0D215F269340EDFB42C0EE22D499F57F63D8DAA34C85A8CF14C75C016D903413E1865BC74977
+03F43DA0
+563B650AFCD5433B1E9364F00E
+4602A8702B430A4E4B2CAB7996B5653C9CD37416053C110658FE6FDB71FEB3579BAF289E692A12835FD00D335A60193712D36382208E4893FAEA8DC295D71C4B50A94A4361FD
+1A7787E5
+F83D4FEA09AC13150639D7522163
+B2871DDBE8011A200EDCEC7F6FD310F19163F7FFF506A3C9E3CE832C4DA60C64D2E2457B5D0DF417E0F816BB213D1F3753CFA21D14BE54BB321B56718F6161455EA7CC2585BB08DF9760E029FABC6FD21A2F871DDAD00CE4FF9BF8F24F88788C21AD90C52D9EA0C3D10CDDDE958EE7B9078A5A9833C2C9
+878443FA
+526B48395674F8BF69783F1F1427
+F5826F5DB9080FC622C028B0D3D2AC46AB6282B377B7F264C86B43C2B4D75595A27C30A0BC9BFEC521FE5E5B6A6696B8691150BE14BACCE34EFD63FDBA1F2B53FF2FEB6BA61BA1712CB4291B871433C2C2041CF7F9D1F00C1841BDBF6AD2123141F9A0CCD5EF7C1FE014
+6733E455
+8B5BDE6DEE0B82BE4D3D785A31
+C1CF5B247BDAEB615860126AC1332440EDE22E6FB89C3E631BDAEB0FCDEDD9C131AED6E784FF673C75E74FEBC73B6009697B9FB996AE1ADB008C34A78F7CB28D6F935DE4AF990621E033E48E4FB309565AFC216CF6E593
+0AC14F1F
+5989CFB3E851D80D210832F6D281
+F0F9C45F3D7DBB2D73D1F4A93C54E244EE367E6D4C07E56F5B58692626511F2B861225DD88D2EC69F483A7A014074FEA457F84F59A7D9EA28F16993991BAE3A3AA917F2FF66A101A489CA8CEF4B9B9D1212B62DDA448DABD85E71ACBB5EABBB8C2106F69F8F35F10E7B811902AF52FA4A7FD1B8CEC65CD46B4E195A7
+BA7BAE21
+AED414B8805960CAF918E225C5
+ECBBBFCBD608F6B6DA34A6104F20E464A142FD8FC021D3A880A977BC8D2FA0680F8FE9A1001DD83BEC15FC804D43F892B612AB9D432782AB4A7DA833D0841D17FC496D3766
+07544C4D
+6DED34ACE603688F008961F05D
+5B83CE0E20BBD124B074EE741540536C2681D6A0223263EC1278F78319D5E0DDD5D8B609D4B8EEBF035F7906AB3C8D6944A594F704711A0DED9B8B77D11476AFE8CCE25EB75CCB93488C672090D888A1F955B60A86E6107ABA343EDC90623C750336
+A75B442A
+CD8DB8DD4057C95A948A2FCCD9
+1BFCEA5EBA6FBFBCF41382D120A3F3138933C8BE50EBA2A13A68D611A8253B0A2ACA597452B4D2A0202FA108664C1D22E18EFC3D1D9EF65940D45FB60CEC1EE384B6C3C0E9D85AB0B0B36BA38301C81BFD3F674D930266B5B4
+C584312E
+E4A5A8F8AB5DCAE3F75FA8B1E1C2
+D6AB9227067C8FCD1FC84B5514AADB1D848E89513961228C81104D97ADC1382FA9A5A2C6B797632FE986F2653ADA6F07E04461F0AC9E02AE6319EB316F84644092966B860A06C09A598D010AD3A3ABD6C4F32B4FDED7D59AF196B80A424700CE2D476E5A6E4685CD77EF53F85A39B25599490776DE221731B6B67C2719C4
+0954
+0E2FFEFA9AF87AD3DAFA52720AEA
+066557B3
+492B6A86AC3DF5014D8D9161510B
+36B230EF4E76D550B6B9294C4FBF47E0FE1528BF365108FDB5808196F9691B5455E7FC290C85F881C842CDEDD06EE07CFBED57BB535DA29A03E05CD929B33CD6663A68BE5058AEFD09D5226903A522D85523ACF9E8802AD0444F4E1DBA65FB0229D99B7908CF22AD18C25C45C7CE74D2CEF2C1EAADB8D505360F94BC72E7
+2E8C
+D32936C1AD01DA899D299C9D337C0763ECA70227AD486F64B2
+3B8EE3B8
+C6509956E40CFCAF19CEF3F02E3B
+8751E0782F77CF29E82A95016145AB4912A1D56FBFC5E392519E454D2DA0498D6BF1EB65934D54A290E24EF69DD1ACC4E40BE206449C3880D1F6E8941D1B78A2F3E768920C3AEECE3D703E4B589366DDFDFA6378682C111B556025AA39D12A2EDAB54EF1A6A691892D582D5555DA9FDEB4143E529BAE88BA009B566CFB10
+A10A
+295765C0
+BC22F100DD9C1D1C159D6424BF
+2615C9FCE2BE1A161F35A45162010645C3F369833B5E
+0E9CA93D
+63CFEE1079E4B52477A11C55B507
+A6B130EED272C7E0
+2D433C5F
+0070E8CB34DC1EB8907DA758134918AACE7C687D363EB7E503A824299A0419CDF3D1
+148AC9EA8FAD1779049BDEACD7D0BD7A108A0667FBAA6BE89BBFA2FBADB3E02BB13207271A8D
+BE788F7E942AABE130F00D1F851AD4BD5844D70FF50DB9881EC38B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0046 put
+dup 3 /C0058 put
+dup 4 /C0064 put
+dup 5 /C0095 put
+dup 6 /C0097 put
+dup 7 /C0099 put
+dup 8 /C0100 put
+dup 9 /C0101 put
+dup 10 /C0102 put
+dup 11 /C0104 put
+dup 12 /C0105 put
+dup 13 /C0106 put
+dup 14 /C0109 put
+dup 15 /C0110 put
+dup 16 /C0111 put
+dup 17 /C0112 put
+dup 18 /C0114 put
+dup 19 /C0115 put
+dup 20 /C0116 put
+dup 21 /C0117 put
+dup 22 /C0118 put
+readonly def
+/FontBBox [-83 -236 922 712] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684269CCEC1A9912691012A4BB5400F24BB2A19
+ECB8F6076FA44F109BE31002
+111487965EB846A9FB
+16D27A61
+9A739E73C457D0209278766556
+ACA88EDA1F268FF3C2B8C90A23D0A6383D5A5A061FD3511E1D0E72BD5FAEC1
+1976B18A
+1AEF6C96D545724B7458AA398E
+37BF984F200CE51C4E17D1386334C937E894B524B7B2EB5F03E89CEFA81176A2F077837B540B69E45D4243CF6CFF2358CBE192751D56
+20014775
+7A66E7B983683984CEE9D9800F98
+038B815C9A0972844BA2BF14DC01AF42E56668F350AB470CEE3589920B086CE2C21F87A3A5653AAA046998735D60DD958900802E2B1F15E5D29E31E8EC0F922D4B820160F90128070D8FD1DCDF8FC3C3F956F600823B93CBB7702A38777678E1EBB183CDC55CE8DF67454184E31A384F0CFC0BBCBB12B165097409DAFFEE
+495E
+23780330A1C88EE49BD56ACB59D371909210715A1D3418880FFADA0ACB6B149E9F28D7218CF0CD29F3D6F3E5CDD2E96B919FB60E207AB1364B886548B465EDBAED98ABA2B24C4545F7812C86AB0E2A5CF019977127A78406A148305FE7F1091788A178943EDE2FD6604686620C3FCA4D5E105E
+B46432BA
+A204DD91051C86D8B5CD8A2335
+B62CA1D8B86B43A23BF73C9A8277058CE131C9D46F2C
+0CED4A90
+95140DE1A6EFE1F5F02C0861CBE8
+A9827B3F3CBF45A88EA6099BD26D30EF42836C6000263BFDABDC7B25F23AD0B1AB01D02C1E8190BDC2ADF4E3668AED3AB04C3BCBB657A367C3D52D6E0901A2628DBB5126BB8CBF2755ABABC12E849E2FDAA65D975E2F95BAFA2E926CCD40CA06F6A902534B749043D3EF8916B47BDBF24DE12390304FB7F74B079942A5FB
+0947
+CF005141
+2CCC1BD0
+DE953ECD8FEB55E075048904BB
+D47D276DE4DEC0E0FEB495B24907605779C0DBA461581B72E5CE7E92B4B8249212EC3A636C9919F167EA709CA4A9F7B1131BA8B552CD0310357C75B7080F6F43C09ECAFC12A02764A6B8BD57B99CC21ECC74
+7F0A39CC
+1E8F36E8B956F310E7E2BFFCCAF6
+34AE7A1D8207FA9FFAB4A24964CAC96448B4EA201A4795FD69A646D2B4C9599BFA69BFF08D9EC6F8B6D6999ACEB9F2B5CE793B1BA2A71FFB466134A352B46878F114D89F44AF20EB3CAF00BFDCBC0930F411CDEECFFCF330A7E1DD4F82E75C04343FA7D0BAE9B0DF6DCABC0A
+424492A1
+29EBBE4B1D55D7194D3AD4F4DA
+C719BDB5EEDA76D8E9F039B644B7D419D92668DE372F27079E4E75FE106667E989C321FF93117175EC9486403FF89D23C1956C1EC1B2782129EDAC88FC3CA120EB431FC038FCF5E651FDDC4A2DF858FA882BF09F9E95720042EAA744
+9E420221
+DAA64C681660A50510AF8B554E
+270A35179947B29FDB4AA199F22531D9A128D30A7DB4168233C8E93314A29DAE8FACF14356EDF7BFC6B9E6ED909244AB10C4E89581D99A96C2EA35F2337B36E52BB7393CF2C47BBD6D38794E642A8D9974B4CE050491FF876B211F07AB
+CC2504DA
+71BFD61DA723EEB0F237344E84B6
+03738B27DBC0BCFE8EB61B0DB9317FFF62BE75CD37F27B95FE1C524347500CD829CBC388644F307EC825ECB11D197DD96CEE2556AA1742F3D3FB6CBE4E3973320F600F534DED67C884C700325605E9CF92EE3844015FA67B9AA46313669505AB6215A5DF807E03E1
+6E6B751C
+25FC83B3F1D2A2FA97EAA6C3C3
+3ADEBB5493BE8CCCFD1CC2D016BB5CF9FEE05CDC9AE23D9F687790C3582CC8A16B7D92A7202F5C48CB819D199480FC97431E3ABB8F91B67F8CA4DBFDFC063F5CFF2BB76E52AB419FF2B304D61F92
+875DFD1B
+DCA37382BBB006F5D20D18649F
+1C1EB75364A22C6B00CB39B719E31CF368FE23E08707FD4C3CA7DF57210FD64D2CDB9570F0A5F2DE87034887293AB02CD4441EC4AAE292AD05F18A493AE2B2E261A3FE5188FD532667D2E8C709BE8428588C8AB87E0549C0BB8D630B535BA6
+3481AF7F
+91AF576D3A2E09901ECBF14BF056
+FF0804DEDB7B909D7F6E2E961764EE18AF1397A119BC580D5FA5352DB6BD9A5C6EDD94812AEBF5ABB9D55872A4CE5844B157A36FF066A02150D696E7E0B28BB8E0077A057B0C436811A320D54FA723F2E8F0352EC0D254F7638ECFF7D0B7C0B4E495F2F6EBB2FB3086CE66EB1AECB761D41665BB856B4FDE2A646D85ECB8
+8DAC
+789B02E85E2E6B40FE63583DAA9CCAEE32287579DC5AB8D1D9883A37
+1FDA1FE1
+64098FB96F74630B964A3A856187
+457294048EB2678D3524C00ABF806519CD7B165EBBB28CB17E3004780C1A9C991783E5D862EC9B9BCA521429E24EFF72D87BF74867FA6CDB247373E18E3C670B5DC2C0736381C70EE4E9674510B39FF71DFB85E80D4F0D973243589F60A66E5AA6C8D7221F6027
+B96AA428
+072141896EE46101534DC7F2F6
+9873047610FD13CA6D216A5F8C869602092A0D5610702856D5BF206087A42D8E287D68C40E2178EF9A16AC41A00F6F369DD4F297D45AF13F6FA2CA1141570A24E9445DA7514E
+23843E64
+EA2F0911491808EF83DF51766E9C
+DC1DA90BDC5D22004E1532264F7B09CABD151BE2DF07FD46149BE1629C655E58B26FB4B6A76E7E0237FFA96CF15AAA6D33F16BD582268F6467B3EA03AA69A3CE5FD8B2B425B31E33E12BED0F4F3C0B20F27ECE56365B7A7FC80F999C57B07F9BA799BA81EAA0ED8397185C5B7912D0DD35
+3BCE2B12
+2D6EB91A8B4F36F5E076FE3383
+700A594A734426DDF968BDCC1CB7532EB52937BF4788946C0419AB4AFBCE98D46C93DFCFE627FD984121805FF01CED9B61FC1417A311B52C0FE7277A99E448EB7DE48EB22DAD81E20F957896206340CE03D8B6AAE7F5B5E3A2
+836BEC6B
+869D5CBBE15CD808E779DAE8237E
+4A34D9C4D8EBCF8FA103908244EF2E2328E36C883655E842F053470999A3C6677CE86734181F13CB1D144636F366584C2EEC890E31C52813AA57ADA650770613F3DC405B3E31C8E0C8206188EA95987E25DE8296464790CFEC2034FC2D4475E7FAC48061D839CEBCCAA1DCA48F172C83535B52F1AEE920EE33
+934A4E7F
+59AEFCFC55E5054C14F5B53CCF
+11576A5B9F326A785FF000CE176793632589C63E52A253966CDB6ED5F7127F507728EC38A2F75CD19ECAF8D176FC7EFDAD80C97FD554CA17CA6269C682EF8E47DA751A3C
+9E25695B
+BF2EC6FA72ED6CC7AB05EE7FD5
+9641A99DA247458FA7B47B425DB0C5EF7F495EAA49A48B506B900BF0B06C606942A686E39C4281E18FE35E776023A054FA9A7D3297F56C754B86637BCDC31B0E09C97F05FFF563EB6F4BC090F3DBA72736AD2DEBB8DEC5AC62725B
+36A85865
+93B0910851A1C9FDA8DBBBDF75
+C60D2808671365CA6DBA5410E5F2D8F2F2E14DDA75F46EE14E52069704CA390B784532D02C1940F527061FC2FCCFB0ED7FE082085BD6CA55F5855D4E6962277BCE159A2AA52807E0E7E7686AE936C3BCB43FBC0E14A0B9AA83216B6B
+9F9A28E5
+4E804A7204E05F7D9DE0418F2926
+916FB3093346B62B
+978019B1
+183858DE7DA2348E61C46E9483DE63C23B2E7BC036E5EAFF89465E5AD63FB316B4BE
+0645A187BFA2E7B27E8BD0C397EE7CB652FEA94F7951483FC34C1F33591DF32A72474016C2ED
+860FCAA063A2B300C94ADD95EAA55BA2A5D4FB38E346B91EA8F67D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+dup 2 /C0083 put
+readonly def
+/FontBBox [50 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684275DD89A8790EAD18EFC77D3FFAE84DA5D
+312074C4D542DD5BEC70968F75DC
+250C3954E8DFB8F4857BFEF092EBA49D248955A858C5A5F55F7B987EA06EC8428D939084C88F5B157D80AB2D706A7EB936C3429173588D2ABA6A27DC94C0B484F316663555797004CBFA79E7B8545C810BF9CA92F61ABD9E202ED9E95943DF7A5ABBF3C20BDE3B6EEC9C0B95A4C9C1D38AA7C6786ADBBB79EE183BDDF194
+1953
+6449DBB7AE47E9FC6F3ABF1DCD7A1E274E87DAE9
+A22737FA
+6404B215A27BFAF6D0B50E94D2
+07123A5BB380C86DB5033EE743181BBFCC0356571F7297A207C23F1E588257FDEF5DF229
+CABF3B3C
+9E0988C63B358ACA4B4FEB033DFB
+E2E387A06A23CACA
+8E104B90
+DFDBD41F063E8A8DFA0ABA4DD7443015526AE5255315597779E04D85849305EA4F31
+5CDAD06E5841E1B8074760C99702B8CF443D752174D996C94E690797A9587CF5017DEB11E5FE
+02576E9E08B39688BBE99A186AA8FC7E222F5E52B29A7FDF379EF5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/sym:clas12 12.00 /PSOsymclas newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<14202e2a202c2109010b010c20281e23271c2c250121292c0113201c2d2f2c2428220114202e31292c250116> 2207 558 0 7384 -1 s
+<202c21292c271c281e20> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0807> 9346 13385 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13267 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13267 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13267 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13267 3 7133 32 s
+sym:clas12 SF
+<02> 1271 1431 0 1359 -1 s
+wst:dutch12 SF
+<1b> 1589 1431 0 1751 -1 s
+<292f> 1725 1431 0 1957 -1 s
+<00231c3020002d2a201e242124201f> 1957 1431 2 3267 0 s
+<001c000d121611001f2030241e200021242620002e231c2e00242d0028292e00301c26241f05001a> 3267 1431 9 6581 0 s
+<202c242133002e2320001f2030241e20002124262000281c272000001c281f> 6558 1431 6 9213 0 s
+<2e2c33> 1589 1676 0 1834 -1 s
+<001c221c242805000d20211c2f262e2d0021292c000d121611001f2030241e2000212426202d003124262600301c2c3300212c2927001518002e2900151805001a> 1834 1676 13 7774 0 s
+<1c2c241c2e2429282d002928002e23242d> 7747 1676 2 9213 0 s
+<2d2e2c201c27> 1589 1921 0 2204 -1 s
+<0029210027202d2d1c22202d001e1c28001d20002d2020280021292c00201c1e23002921002e2320000d121611002e202d2e2d05> 2204 1921 11 6883 0 s
+wst:dutch12b SF
+<0f09141109120a0300120907090c16090512091311100f130903000f100012091311100f130900120907090c160908> 1271 2407 4 5575 0 s
+wst:dutch12 SF
+<1923242d> 1271 2830 0 1665 -1 s
+<0027202d2d1c22200024281f241e1c2e202d002e231c2e0028202e2a202c2100311c2d0020322a201e2e242822002e29> 1665 2830 7 5901 0 s
+<002c201e20243020001c002c202d2a29282d2000292800242e2d001e29282e2c2926001e292828201e> 5901 2830 7 9461 0 s
+<34> 9461 2830 0 9531 -1 s
+<2e24292803> 1271 3075 0 1683 -1 s
+<001d2f2e002829282000311c2d002c201e202430201f> 1683 3075 4 3706 0 s
+<0031242e232428002e2320002e242720292f2e002a202c24291f0500112800002d292720001e1c2d202d03002e23242d001e292f261f001d20002e2320002c202d2f262e> 3706 3075 13 9531 0 s
+<2921> 1271 3320 0 1457 -1 s
+<002e232000292a202c1c2e242822002d332d2e2027002c202d2e1c2c2e242822002d332d2e2027001e1c26262d002e231c2e0028202e2a202c210628202e2d202c30202c0020322a201e2e2d002e29002032242e0031242e23001c28> 1457 3320 13 9531 0 s
+<202c2c2829> 1271 3565 0 1770 -1 s
+<002921000e1114191705> 1770 3565 2 2809 0 s
+<1521> 1271 3911 0 1513 -1 s
+<001e292f2c2d2003002e23202c2000271c33001d2000292e23202c002a2c291d2620272d002e231c2e> 1513 3911 7 5245 0 s
+<001c2c200028292e001e2930202c201f001d33002e23242d002d201e2e24292805000f> 5245 3911 7 8228 0 s
+<292c00212f2c2e23202c002d2f2a> 8220 3911 2 9461 0 s
+<34> 9461 3911 0 9531 -1 s
+<2a292c2e03> 1271 4156 0 1706 -1 s
+<0033292f001e1c28001f242c201e2e0020271c2426002b2f202d2e2429282d002e29002e2320001c2f2e23292c09> 1706 4156 8 5786 0 s
+wst:dutch12b SF
+<12060d04071511020b110207100e> 1906 4643 0 3426 -1 s
+wst:dutch12 SF
+<1923202c20> 1271 5129 0 1817 -1 s
+<00242d001c262d29001c280011282e202c28202e00271c24262428220026242d2e001f2030292e201f002e29002e2320> 1817 5129 9 5775 0 s
+<001f242d1e2f2d2d2429280029210028202e2a202c210500112e00242d001e1c2626201f0028202e2a202c2104> 5775 5129 7 9531 0 s
+<2e1c2625> 1271 5374 0 1613 -1 s
+<001c281f00242d0023292d2e201f0029280028202e2a202c21051e2f2a05232a051e2927050019> 1613 5374 6 5226 0 s
+<29002d2f1d2d1e2c241d2003002d20281f001c280020271c24260027202d2d1c2220002e290028202e2a202c2104> 5195 5374 7 9531 0 s
+<2e1c2625042c202b2f202d2e0a28202e2a202c21051e2f2a05232a051e292705> 1271 5619 0 4485 -1 s
+<001626201c2d20001f29000228292e02002d20281f002d2f1d2d1e2c242a2e242928002c202b2f202d2e2d002e290028202e2a202c2104> 4485 5619 8 9531 0 s
+<2e1c262500242e2d20262105> 1271 5864 1 2160 0 s
+<0b262e202c281c2e243020263303> 1271 6210 0 2502 -1 s
+<002e2320001c2f2e23292c2d0029210028202e2a202c21001f29002e2c33002e29002c201c1f002e2320> 2502 6210 9 6241 0 s
+<0011282e202c28202e002820312d222c292f2a2d001e29272a052d332d05232a050203> 6241 6210 3 9531 0 s
+<1e29272a052a2c292e291e29262d052e1e2a04242a03> 1271 6455 0 3404 -1 s
+<001e29272a051d20281e23271c2c252d001c281f002e23200010160024282e202c281c26002820312d222c292f2a2d002a202c2e1c2428242822002e29> 3404 6455 8 9137 0 s
+<0028202e> 9137 6455 1 9461 0 s
+<34> 9461 6455 0 9531 -1 s
+<31292c25242822> 1271 6700 0 1998 -1 s
+<001c281f002a202c21292c271c281e2005000b2d00262425202633001c2d0028292e03002e2320330031242626001c262d29002d2020002a292d2e2d001c1d292f2e0028202e2a202c2100242800292e23202c> 1998 6700 15 9531 0 s
+<222c292f2a2d> 1271 6945 0 1884 -1 s
+<001c2d003120262605> 1884 6945 2 2593 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (32) 32
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0034 put
+dup 3 /C0040 put
+dup 4 /C0041 put
+dup 5 /C0044 put
+dup 6 /C0045 put
+dup 7 /C0046 put
+dup 8 /C0047 put
+dup 9 /C0048 put
+dup 10 /C0050 put
+dup 11 /C0051 put
+dup 12 /C0052 put
+dup 13 /C0058 put
+dup 14 /C0065 put
+dup 15 /C0066 put
+dup 16 /C0067 put
+dup 17 /C0068 put
+dup 18 /C0070 put
+dup 19 /C0073 put
+dup 20 /C0076 put
+dup 21 /C0077 put
+dup 22 /C0078 put
+dup 23 /C0079 put
+dup 24 /C0080 put
+dup 25 /C0082 put
+dup 26 /C0083 put
+dup 27 /C0084 put
+dup 28 /C0085 put
+dup 29 /C0086 put
+dup 30 /C0088 put
+dup 31 /C0096 put
+dup 32 /C0097 put
+dup 33 /C0098 put
+dup 34 /C0099 put
+dup 35 /C0100 put
+dup 36 /C0101 put
+dup 37 /C0102 put
+dup 38 /C0103 put
+dup 39 /C0104 put
+dup 40 /C0105 put
+dup 41 /C0106 put
+dup 42 /C0107 put
+dup 43 /C0108 put
+dup 44 /C0109 put
+dup 45 /C0110 put
+dup 46 /C0111 put
+dup 47 /C0112 put
+dup 48 /C0114 put
+dup 49 /C0115 put
+dup 50 /C0116 put
+dup 51 /C0117 put
+dup 52 /C0118 put
+dup 53 /C0119 put
+dup 54 /C0120 put
+dup 55 /C0121 put
+dup 56 /C0122 put
+dup 57 /C0262 put
+readonly def
+/FontBBox [-50 -256 920 739] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684219F75E53AC2AB7524E61DD2942AD43C860C
+2E17ECF00C883B66A330B97B
+FB4A6AA6EA10AEC651
+C9333FCA
+568CDAB7BA8F537B6DAC13715DDF
+6F7034D05DC13534AFFFEF22F0C3B2BDD22A183609277BA43594134A9AD3C8199EF4C0F06EA0B85EE68814F7CF36A61ADDEF33144615E547935B6419D8485DC837E72588946BEC5C48E0E434ED2345C12CED1CB70BD5F7639308478960119EA9E05D32008EF694
+14098B01
+C51634191A4F3470B8BA924CF3
+EC150BB5D59E93C478A54D38D4146AF9EC898AB29D702C5F8B8FFA7EE3A10703B7714A1291BB1B5AA5307877544E91FB3E41F1B8C71E8ACB1D74A25B58DCDED5
+0D0B9263
+6233F9358BD4A6BC955285DFDC
+A777CE73B8F4BEBEC01A058B9BA409695D1C9A2E30C78C1B6E91A43D7C7EAC29E40B88704505DF14AB3C5535D729C921EB4CE4158B3E2E9BBBE5FB5A5453A6
+46F745C3
+8180F53F8A1C10626773D5CE09
+0C2DBDCA2EA00D0EDCE1455AB5B2DB1A8E93DFEA31D1C0AAEBCB7728AB9125E85FB22B75410761FC5E51515BF9E54B9DA794D0518E0875149C
+93D9ABBB
+0E91819459CE2D5260B0540A87
+A937BE61076C2A9BA04B0A6D057AA7E614EBC85E31BDD4
+CC945683
+C8F0FB97FCD539B8DD50E9BACA
+EFEC61BC3F79368796AD692065243732DC86F77243DD663B8D5C21C9763F84
+4756337B
+A805F03F3AB5A40045393E5301
+39BE17DBE0CAD8372CD7489C140442ABC310D89B1D88F3CD664B3C31
+2EBC8CA1
+86071A34F29265749676BF8F6E
+C91CF0BF7E08A94EC3875CE1050AD5265539BC4F8BFA036281823D3BE0C1B7422025A07F1CD861211B2D6BFF7A56CAB7B67961B32635A7C5949B266552B39375D2036D9A2324D259EEE6
+597382C6
+BE5694BE4948EE9A9FFBAD3625
+73965B495268A9F3C9A9BD5918907B98C12971A88021BF904850FD2D53BEAF61BA325AD833E3BBDA8CCDF1CA1C5BB70147AF151A40CAC50CBC4654BBB8F709371B26FD17F1B7B2D5CE713401EB33A85697C34777DACDF1F8EEE1
+4C6EC1CA
+F7A81F566B674B820DC7A83B0675
+726AD125E78B40DEC55D006066AEC40446A9403CA61FB2FEAB7D6EE4BFC38B4204331005C9A4CE327076A4C7C7D1FE78A1C8F7F7A39FBB7590B3E6E30F8900152C2F0D5674208932EAF2BCFDDFC8C3953518C51A6D301A922B848EDDB91075068BBE49766DB93A3D4A235B6A870AA2
+6C0791F7
+FA9E307107854B164F914AD121
+4B8BFB43BACD2A3E79D5ECFE10ECE2287DD9D19DDBBE71B58773A5A6469D9F82462FB64F4CA01F631704059E9E3A6D7079BED762CDF87B615D0F
+4B9F3E17
+AAC72B88F8EBEBF6C4A83FBA02
+2CCA3181AF178A2E8D5226BE8E85CA9F8D88C202258C2675D6ED0DE14B1B9D0FCAC66DEBAABB99FE6360B2F3A230E8DEA9103E50809B
+7281E2F8
+775DBF207D13AA31CD8A4A3A66DC
+9C5296DF5342043E57AE813533BE92494EAC422F35CAF0514D72C74E2A6EC24256051130472424E27FEBC99DEAB760E98878DDB049FF8E946FC98F1605E3D38FD34114BBC1F8DA753194B1CE59E9DE45D06CCB1F3C8DB78901C68294C0B8129D0F533DE1BFED3ADE40C73C2A7238DC0206F4B2
+C0EBB0EF
+2269C8A7316BB81B78B25406E7BC
+10B8386B8D7EB419D2F9E693BC802A724BAFD2E4EF12E7CC29E0D4B29B4B5361991B8F6E1F008DB577D6C290721F1CCA617DDE04B32F0AD4D9B1908594760804D782C46859787B7EA445B34F12DCAFB3368EC61E6FA1B02780CE8C6CD6A20AE000028B7071E1086625700BFB871A5476EC74610830482B4F811384131300
+24A6
+68
+3A35CBE8
+4FC584D0E4D26294C446E9169D
+885AF04AD0E503EE027C02E782E52DD1D4413E018F35F9FDFB23F0A346FC4180DA0F6AB5BD84B7467954819166D9284DE9FCEC69A27E2572A3EFF9E943FC5DDE36374589E80AA5CBC3E2C26F19960142DB6BE83C47D304D286DB4199A30435070B
+F1E68174
+E39AA85C58839FD5320568A928
+CFC41192D804E71C6B2FD7221C2BFBEEBB524B1B67835DC766EF1CC57D03B7A97D9EBF3CFE1661EEFE381EA78497ABE9AB0E622A8E0F6FE6AB02621B6172220FEBEA9D14066A2B3F785C683ABB059A3241C3801AB03E5FAA9DF70C36ED5018689AA2C1
+82A7FDA5
+931C844B1AC8B5863DE899339842
+E65247934ACD970C83D4D9EAAEE4A53CC1C003AD93F6019DE41FE25D45AAC50B0F8A4AC96507C7B714D6A83340775BCDD8888CF44C93883CEB10BC31E5EFB7D547B45A12B1C51A21C042FE4E7BD72F91D39BC17854D7E41C4EBD142AA51C47AB71065AC2F7986EA870
+BAD88FD2
+EEB12FC32369032DC40057AA35
+3E9112BFCD54BA42A47CA3D8676FF73ABAA9239CEF8A7B7DEE2A51A8FDCC3A6B976711F86108A10D12C7B6AF2898C9CBAF03639A28F3749BC66BEF
+FFC6D411
+31E51659659CFAD15FAA486A85
+DBC2F455C9D9EFC5916818EEEFD679A8F021B0632AAC0D93942346A5689C28E8F2E999CE470AB95EC6560C58C1443EB019F24C38C34F212D258F1B1408D6A5478F86184BAD3BB4
+2F131468
+3973E1720C270C74B00DB9C2B636
+562C5C7C1A0E5BFA7CBEBE489E2B513A604F24C9BF6EEC8D96EF6DE57C4F6CC418FE2282404FBF858E66FB11FBE299E4BFC90C5F76B5625616D384BAB0DDB6820D7BC0583262A0A843E05871E085AE8956B9FFC7B326C94E9306F03B13A1C9CE6AAAAF2C28F0F6BD95DD1559D1A429
+95F4EFEF
+DC3C34BB7A47776C18E1D956E1
+254970C7923C825CD524181FF09C853F03FE9FC13C93E6E5631854F5918BE1910E1F14DFA40845929C432FB3BD745E8FCEC14D0B11E12E125592A014100FF3AB6A45D164175182015F2A1A130EC9D32DBD4E6DC235B9251059C1EF27
+66DA4D87
+D990FECD7E8ADB9CC957932BA4
+C9DB0F154B96D4A4099CE406823EDCFE68C4B0EEA189BC70D45268F926EF5F4C36C099A9CE8702A23247E3D2236E72EB185EC73384728B8D9B6A214838D3245CDC9D6E2401DBB2F385FA68C507FEAB9E0D88AC
+04D9FE0E
+79385926E10FC041758F4FC2D4E9
+C449E147F2CD4C393E1E0EF38842290111D09718165D6D57F7FD958F0B0B9EAE2652F4F08219331A362ECD63F8679EDD18A16DAC018560BE5E72B5E013E13858BA0058F781DC009CE2987638AAB933658DE7E1B9F73C911D7356EA94DDC2B8E080907EDBAC0072D1E581
+937BB6A9
+01C259F5A372B3AB6459A04FEDEF
+DF24B580A58BC2583F9C2E6EF0377A200B6CCA8740E98E4C2DF24506D64FE37654901C8C8BBEE11AB9E8D4D9D4D86105E442D855CCCDA1C261968B97202AC533E403FB93BFA116DD7114CD34E8AD3A002B3E9734E1705DFA73E1F3698F13BB51AB6D8028E29620E02930283C666B5ED698C6AD78F48DC415CE199758E37A
+BB043BF0
+1862268F41D2DE94B7087ADED394
+31033CCE0E04ED1FE22DB8E0F184A8F901EBC1AC167EFFBE48468F4BF62040791AFFFE77C7E1F7918680A444255721BEE5825B29161EE22821FC0C6E719A6461FB2E822CFC0E381B2165E9E8CA45013708BABF99F85F4DB98216CCDF8817B8B9FE8D9B8056B6C5DE52AB6CF66CADD4039C3C231768B6A2A861E7ECED547F
+E08E
+0FA60C
+52144F5F
+B86C873A0573881EED0F845199
+31D3DB4462F1945AADE2EBCFBE5DB1D7C1FEC6283A1A42A217F9FA3D50002A0A8366B447522378A60CD7E337E075B44743A4B82D168F329D6C1F2397FF569D9951C6E9D197C5FC1A10884395B5A26D838D
+99213CCE
+185043E91DB6D7E698BE5A17DE7F
+C301C20103CD79931E4393A0C881694DC063E7F4982D1F6AFDC14034D23D30AF25E07C8FCA6A880679A141A9005C821F1A1EC4C586ED10879BEA15211F3F347C7E82AF78CA9371D17A4B1E0D858B77005FAC839A22201EB6166E15960B7EBC240C10E1A3
+D3FBAB63
+7A8D355FB7528D3BCCA59BD583
+78602CE4DE34318A5D09E8B5AD0A96BCE8856E29C3C3496C20D2426CA9F2E8C3A051B7BF23D03E5A2EE1BAA1BAFBC83EF589DDA8849B2527ABF27E188C9844C644D0FA991BDA4106E9C79F014D2284835C52C04E10F4A2B476
+BD8654F2
+94B9AA96A3B1A5CDA3D4A97910BA
+A4B9435FECBCEA8A8B9DB9A37FCA35C460F03154B51141372CD2D040EFDED6AB4D445F8B0778E60DC0F1AF87536F6EB8E74E083B5182080C122C8E315A99E41AD72FB69460146628C9DBFC5062564F51705C95834DF0BFFDFFBD11795BBF3304353D32E0D6A5537167F2D61940F57C048FE2565478E5E0AEA30FF0B6D22E
+A37C
+00EC9C5454C44A3E78511DF2F37FCE1A5DEABD0C1A5464D43387B3039E1DE004760BF1E1FD9EAC
+B2F51BEF
+07E66402303C8169B72B5CAB0B
+6342F1B41D3BCC1E8DDA7EEDFFB374B6A9F0463C3B3776600299F2EC649635A543F8BD8110C440C223450772237FB92ABFDD0349384CFC7F65AB
+E8C7E756
+14C8B8B14CB5833D046BE2EA1990
+E5255A4623909D5C2DC26B15ACD866D9BE142B7CB1771684AD6A4E92272FAF85C481B4775F12C7DFFD2E87A428AFDB67A6AC5C9FBB7AE433AFB9D6677B9DE5064D4B6C69CE5334CE3AD11B03F451AD1D4542F15B4979B48653768A3178DD4209E1B48B32B915B590421EA4FA23ACDEF7E9669854C10E47B0396FD4E56A62
+55EB
+80383A
+0EB56EAC
+A2D98F32F85E25806864E63E44
+48BD86AA76EAAAEDC55B90AE94C95E226CE6FEEE2C89ABEC7FA4C14D4ABEC56CBE7218CED843924974A3B6CEA24ADB78C4A062FB5F6A9975F4EE4D1D51D5543EBDF6B82A27BEC936892CD2BA1D5792C93941993FE7513CAA
+62C58F27
+143A556C07CE5A2DBE40FBC00A
+9912B63D04BC738C40CB2C4C1B9F43F13F5227979E1EDE0C86932D81D9537AD9CB6C770890B4D393BFC7B2E62FB9D3ECF4628296403D5BCF40D5157E064D0A8991E17E8C64B775295BF39351000C3CA2521A
+EBBB878F
+D2A9548C0D93AAEAA603AF66467C
+135210AEDA96FDB90D3A6D173973AFDC4B207A8A5E29874220081EAD38E0274A8DA54F082CA0C3FF4E0FF4DA4FB529E956E77DB4280605DB7438FF19787D8208449D1B17B5F6DDF34A324640E3065D242631F6621A9148A90A96F7D89558B1E6FD3FD38F5B948FC29A5AE75776B1
+7AAEB7F0
+9C2B407AEE7B0C3A3B00E456F6
+ECE4D25EA888FF21247CA9D956E026E33C362233B14D474932C7139F0F108F6D47572633A78A5A874E5A6989F12B99FA7C89AED17D62166F0D35E17B388F3C81062FF6A058B38DF98A6E46C8CDAAF87356F23A9E2ECA0CA547
+F8B2D1F1
+85C9E540559C48EF29B451EFDF
+A251E9C42DD0E3EBF9BE30B449045F7147C46C0D0C972A8AEEA6BDDB2BE2ABC4869D1C581FC1C557242021E2AAB22D50A715923E27995A55CDA11BCA95156F4D71B91EEC2A3EDFB5F8FE2D057EAA767E073872D25E76C7CBF12FE22D
+AE9B32E1
+2B542EBB37BAB5DA219CF06A6E34
+DF084EBB276D4CDD96A9D8D1C474589112B6A97358DD1489B924DC13BB9A2CA1D0788324ABDE9512A6C374849E6E70CA855AE1BF278F614F38F0C7FFFABC85737DF494EBEE4C72D448C52D4D05FBD701CC476E67ABAF0989B706E60EFA9A7F3941EE6E6FBF1B1A01ECE475F7EBCEA8C39DC40A2749DEE162D4B987123FA4
+DFFB
+0D3191E93BC025F9BA6B12CEBA96EB1C818416CA3D109AFB16CC383B5ADFE80EA5559B90532C53D710F84C5F8462B9
+DD6403F5
+7F7B89DF379D633D24097991478C
+D587D085DD98C9941DDA702E6CBBA2ABDBD821CCA092DCD79DABAEAA1C9F5C5E21D24F12E0E169D848E0CC7007B6617B028AD88F174FCC7228EFD171C92D05B98FBCB8FD6DF2793EF249E6C18580772E7CDD22898B160FC061D0CDF04DE31250CF980272162180A1F80B07AF4A
+9AE35B5B
+1B8D322DFA6E8D6EE823AF9D42
+E7E92E355C2BA87E68BDE2F2FCE89EFBC3CDAB8796DA2CF3B68DEC0D4ED47616AFBCDBB16D4BC40E636F28061A6E46F7E70E538656BDA83DE4EF4091DE57B20BBFED3F438972302ED9CCAC5E68A8335E
+E12486EF
+D39FD647D74466D4285E8BF37C
+FB4BED1C44F95BEA7640135680D9A8E81A546A24EB16A7A0BA54FF199B74EC77C7483279AD54CEF3969F24A927B420B8DF229D331BD1AB50A95070C1E5CB010702C3E4F960F4661D996837DD3D2A41A0A00ED19FF99665E120EB18FCA95829B391D1CD
+DD2D13A6
+1BCD276A0DF8638E88F742BF6DC0
+75F7F924208DE9D8400B4F10053B4125566135582C65728069D471F4A2805027D9E660D057F905A33265343BDAFBE33CB185A77A254B384301E4B1664FB1B86578ED897264163EA599B38ADD944FECFD59058C69F38055A226DB72943D55D9EDD816A867A009312B7C4E0CFA881E41DB8A776AFCA81E875E7141304E28C5
+D619
+F1B872D298F33C6C081D9FCC8B41CB584D19526CF74127DE45EB99DE6DC4AF775B1A02
+44F8D8E4
+269FA13F52D5C6DCEB78C1E449
+853FA9B640C1E2E670B36295F840B3ABF1862DE1E957105937D68B0227BCE9D2628CBBAF0C751CDB1417BC954AA9226B699A1CB51C6C
+B79D62CF
+A391B014FD909CC21029518B4804
+0D40CBF9DA1112C6C2F896E82955022CCA1948C0CA7D6F17A8FFAB297EDA12619E38140FAE736CA32B8CA53D875C2CC432C9467CE2AE62AF6A1193064E3AE509B8C06CB8A35B2B532A26EEE82CDEF1660EBF5F5F6DFF089E085D4B727F9ADC795EA651BBF500854653F64F03E3AB4032472684E850EAF3E44E6F0F5F2B4E
+070C
+215D0B46599D3D71BF45EA114A2EA1079BBAF4F2EBD4A5ED4AB04EBB7ECFA8
+160F7EBA
+3194DEC14EB96087FAB292DF6C74
+2EB6F09D7DA6958211AC62A7882E8AB945F133C7BBC65520D9D5AA4DFBC31E43250829E47C5E9F1D056683C84273D50719FAC8D5B22B8A5A90F56FC9B1390C47405832ACF91C0A5C5C9D76644B126E50D5883DAA4F960830977D6BB6FB2360BC7641DBE2B6AB79840E54B357
+C34C5AA7
+F167EED7C43DDE8D87AF596196
+38A93EC68A10FB926A7ADE4D3D2B50EFC2D8E59E33AC7275AA6BB8B0D7F568FF4A20B896AE38D14CB377281A8FA3FE263A5C7A05C77F3FAB4CAD0A699586CAE9D50D1C0FA48E
+716213E6
+8C5E19070028CC0C027594044948
+57CA9A4E2AB219A29ACB03BD82EFEFDDF924F1A16725798B929831C1AA17915B67D5A46459AEC9F103F55343C56DD494CD786EB78CB06D4D2BCA1C05A38703B970870E571E73D9C50741DA3ECAA9EB4FA51DAE965D03782DEAE642F3D5BEFD8146BC53AA966C46FD3FC698BE158E1DAEF040891E694EBF
+1A4ED33A
+9C35912145262383C6E569A1AF
+7B997F72C264C1CBC2E89200F7640B8F394463DB62BA57264B8E257B2D8DBF7DCB06CCD68A3A5349BCBD544A936140F150574C44F98A3F89F7051C9A26119D13A7B570226D2A0230CA029171646A4114E697E488A91354
+2AC11182
+1815D8E67D81245421AB6C1226A2
+5547A8CEDE7DC36CD60DCD0B4590012556DF8BCF1BF0F23E937F769CEA783AB3CE331F67FFD180A3057ABB0F7B5BC42F90E8431118EA6FC0481705B561FC4CC6C26B02731AF31DE8F9ABDE63DD626DE54E85A6DB64912DAE9F1D714F08D9922137A791D2FB928A488A45D0AE4F3E34BED06AC5DE1DBF8C3142236AB6
+1F8076B6
+92CBD41A1CFB993090E8937288
+DBC4F966CAD8C58FC633D9F4B37406A08F2E5479161B50988DF34A9DC9ED41064B92CA2DA44D9F63BDD4E891789CC49E3EFB9DCE9EF789A9EF8FEEB4D1895B0EEBE6ADCDEF
+E2883C30
+A4C16A8EF9B74B2FF5F92DA0B1
+B3A34E9B2AADCB9FAB6BDE1E4BAA1AC57E25C89430FEB3306239CAFF2E54D88C3C78FF5E2518565D9B9D47D22CA518A3F634870265F67AF5B38B41EDCDBF5023E6FE9C420065E2EEF810DE2887441C6D123811C6C3649239AF88E8A6BE76C46F1C5B
+A2764AC6
+84B47F0DE77E3AF08B76A96ACE
+6FCBDD6918F1527C49E4D12A998F4B0DB0AE6950F3F9FD45BE3BD53E55A11B2BE25E196631268A017553E4775AF86871215676CA456D9909D56405D8967E249A5C3393C46DF4BF8A1C2C5E87C9A28650519C474D9F7AB32A54
+172CE812
+913939543EF5FD0A67B0C69F2BC1
+FA11191A50EB6DE2DA9D76FD9E9E39239DFEC70CFAB782E937F475377D1842937EB38B842CDF796671D2BEBCDDBD1684C00342F952BC3291DC21B2D780C1E70967F6E0D0545FFB3BFA33FEC7714A9F38C92C8533384BE297F017FAC03472AD4AF63DF5940485FB59FC50CAB3691FD600D9E2BD64696CFC2CD961A5FDD267
+662B
+673D71455CF807D75D895F0CFF8E
+4F0396C4
+16494B951D51A72CE4665E119D5D
+EED4875CDA0E03D809E3E3C45DE0D456FC69BB6C66764CA96C746A473A25E6D6DCF7AAABFA66D700196714393CB73DB4433DE48B9C37B8BA6888388A423A0EF3AF294659623BC7750B6474A4BA77BD82104E6FDB1F3CA69C0BBE5A61D2E7E02049CB8C54749A7F19B1875B795BB031AFA30FC1A9D2D038BC9A9C059E9BB5
+0CDD
+8848199382C370C02C16354C465CA583076AAC30F2B382666D
+190A5300
+C71B7220B04BF0E849CEBBF97AE7
+C6C44258FD14FFA104FA33846A97A49F0D79BF68E5E425DA2A6F8587C77BF06BBAF3D2014F47DBF2AAF8DB4CBE68CD635CD780E1EBD944F8F9104115B3361146A7AF249EC4E391E34F8809BE9994D5BBB0F4254AF1571301BB56FABA36ED445C784AE760295A3216D9AC60410C8259E331DCD2610EE8EED801212FC0FF22
+12F7
+48685E12
+A48FF771149F394BD4226F568B
+A8A3E67E2F028B9FE3C91DD6ED710EBE9DFF01D28E40512FD27429005661E0D12BCB2BCE519E8EFCB07A6F6CA2EAA483003BBB06E201787AEC5F61E99B6BEB
+2B6C244C
+B3D92A94EE90911FF3E000B8C4
+D09F4E99FF6232B50AE19E3E428264A7E2DA79C10A10
+AF0DBD51
+73AA3885A6F7C788A9E072A0DAC2
+08D1B93A87F5568F
+1E62BA62
+87AA9BC693B820942965B93D83A33B707886AD74392D220EC5432C3906BE03B6E76A
+513A78A3C38DDD1D66D1905E01CAB5C9E3710F2DD4EEA60203573AE2468761FA639873A63A60
+958536A597AD8110DF145776A6905631B10DCB2BF393D0B2A381AC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0046 put
+dup 3 /C0049 put
+dup 4 /C0050 put
+dup 5 /C0067 put
+dup 6 /C0068 put
+dup 7 /C0071 put
+dup 8 /C0073 put
+dup 9 /C0076 put
+dup 10 /C0080 put
+dup 11 /C0083 put
+dup 12 /C0084 put
+dup 13 /C0085 put
+dup 14 /C0097 put
+dup 15 /C0099 put
+dup 16 /C0101 put
+dup 17 /C0105 put
+dup 18 /C0108 put
+dup 19 /C0110 put
+dup 20 /C0111 put
+dup 21 /C0114 put
+dup 22 /C0115 put
+dup 23 /C0116 put
+dup 24 /C0121 put
+readonly def
+/FontBBox [-10 -209 745 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684269A711773B1F062EFDCE93198A765F8F55A
+6E9F60B43AD213B6F99675D4
+AE976E2319012DB96B
+33CB37FC
+2AB7CB1AA9E7C6D1A60ECC1036
+78173A5EDBFA71F1EBD0C032CCD138B6D4CE66801DCDFEB6BD820A11ED36DC
+8E4D3CFC
+9B74D73543C6E8B2D45B77B6DA
+54B7C3CD189D2206A152D6ECD0CF40754F73DACD28C6FED9BC298E40C5C21DEA25561B44FA9D29ED7AFB7A4EBCE93BC13969B8205D22AE36295387DF
+A8F1B869
+9688D8625397D56BAB98854725
+87284CAEDAC3E4733F404DAEAB8300A9ADA01E1749C87ADFABE436B08C24AD5A8C3435AEF552FFF7862186A022A2A12AE3A5AD77B865BF5EE3E16127E5E42CABF39E7EBE07B3FB360442D199345600253FC5957C
+0460B0B3
+4D63CA5F0656AF76E9F73B59B384
+B2E592B0A6787F934266671963A6773092FFBB489635FE81CF5B90A2C3D107A0235576C7D150B3AB5BBD57E424D91476D215CE436DBBFC07F34395D3534EBC603835508DFDFBD1C8F315D82A11CB35E62377A6E727DB5FF586388856FF448325DFB62EA39A7F3ABD
+CE627223
+6042BF3BC39CDED13D98F57EEF
+40E66F95C46525258D63D195B4AA909B9BB3B7010ED7CBBDD9BC73D62B790D2A968B1097164111A49944D602A8DCA142B2B6B6442761F29D5D85B8754E7634D10476CB66646EF5A4FD31E01A22EEB86F7D362699BDCF4D
+E9C91355
+A5F5A55523E641EC8914B0F3594F
+A089BAFF6DBF59328EA1CB855CB41EB02CC487F042B1FE080D68BEC34882189FC4BD7DB2A17CB3F1EBBE1FF7BA6268A6E51E60C75AAF8AEF3BBBF124290D9C069FB80E07270D6AF58B6ACE591E5A54AD097B5F5AD7A273C349F6B28961D7847A861078E686A1F3E0FBE6A5762DB7565E0AF57108755E41
+9644DF01
+F4C314B0DB14A2B1D078C3E6CE
+58D9397D2D169E741FCC5A1405578D48A5205CB8D9D264E52C8AA8596328A3C74EC2CB0E24FCF8850D8F4DF650FEAA40E804717FE2647F4914C33B879963
+ACFB5A9C
+6EBB15240F02BDA9DB7C1B1429
+79D80DAF3F849838243322158FA125535B2F7EAA5029B963E5B8CEF04DBD3177C95F989E31136C8A9F81361C1FC11A9945DCACE165DC96D131313CE24D36DFDDBA66CEFAE93A65D6B8
+9BA4B52B
+8E6DA725E8A3C7A15CF0E1E9809C
+E9BEF6436B9765B6AE14898B1636D940C35A57E51AA0646148DE3E72353FC929244B2CA0AAAB739846533CAB7F789777D80301CD31B4E994DB533DCDA5D96A3DB33F24DBBAA3D58EE9176167BA2782C9713B60512565CC64330D0BD7D22F50CB9AE70CC3
+45D3283A
+7D05CFC9A691E2E2ECBA5ABA1EB5
+C901DEF3211E75755886FD0E8BC3FEB5177595E4500A308CE30A02E00973A0A32EA78340F7690A0E409D4998BB4BBE6F03598D91DFB4D3B1F9496AF98336B18CC4A60390729419EA27079234BE58A0969F7D947B81DE51BB230CBF930C9EB9D7B05D2BE36388EDCD175FBC5394AC5B56AD67236C2FF0C1E19C41D78A9CD5
+BCBD
+B0EC82E1
+368E4C6145E40A96324E8EBFE1
+3BAA70CBD3BB21F46F137F3E8010D97E97F076BC571B497658CF6B6DF08CD415FB003C6AA453B7FC4BE4D6333EC833AE2D8354FE77B201680B9125B4FDF468ED4DE3D1FDEC7564EACB
+29A99E79
+8A7E88B29A7F897112BC752A7C18
+39B5075C29D4AA75755B84F7F4E6CFCC6A8B533C85EF2B6B0E99A8E81B335D337D95764D2108DC5C4BD25DA052D07263F719CCF9F0DFDB35DD12B7EBB746824E91EC3C9730B78009BE083341EC9C836DC2CE6F97840252E3E24367D2B6E50E76E53296814F4661
+97E12883
+7454D219FFBBFEDA1CC96A7D12A1
+6E34AD907640570CFA111B801C3DBCE298D2434108D45BCDE4DFF60AD7E2227B7058C09E17A9E814FF6A412A531E2F4A92253EC7F5676D4EB5E04C2323B6D9FC53F5570FB9E815B0F4EB156836342513553FC5B0EAAB7D688DE60CF3CC7B8B6DBB068840206E49955B1892CB7D827C38D3A94B30F9B1904AAA5F9700D2EB
+515A
+044618DF
+AD124B96
+044A6308C5612C8FFB9D963D76
+9A957C8AB2092D0308D0E183D841939B523F575B4F14829AEF05C4977FB8D31408CD6D798522812A07A769945797894885E8DAEC2056119D0BADD5A1CBCBEED3AE1ADDC4B6AFCF4F956F407C1930EDD18694
+87B08BFB
+F5BAE2AF4FA03BC2A89B2935E6
+6E18A783A824394D0475BA2FA3FEEC442685E10C12E4A93132A4D425F24AAC48E8351B0F467319AA2B003EE33D6A8487215383F57274DCCABCB20461C51C95CE97E8C990C80FA5E64AB32202A1080F19159C71096769B10CBD29ACAB
+EA0C0A69
+AF9B319CCAC639D1E4A0B810C0
+D8253B24E3412D8154DA5F4D1CA8E010B913DF314F10391BF31A8267A2D09F1349656BD23538706BB11AE4F5A1F60039396BF817F2685CD1C02BBC15D17577113F994EFE21C3BBC92ECE1ED22522
+56B4325A
+F32BB6A70D0652324B2C720ADB
+C23EE202E296FF398C3031C1DD6A5DDDD9851F4AC1C5725CA09FCF6029F71D0B771D3190BCC8DAC1A0C728370B869EE2D47FC26D
+8B5D2E93
+63416D09464A760DB4CEDE0FF82A
+43D64F4621A9940EA8DAEC465BE9CB0F37E7C17FD8768B12A83129804977C2904CFA4E3D0FFD2EE0987F38B73CBC81352C469B0F9C89F2B9E164325C8625D8EA63405E12D56F1F1A92511751F81A4F26346BDD408AD0DFD7DAD9C912CE7BDDF738795337F54CF2
+C8C2C2A3
+DC530EE3B8D8A18729B403FDA0
+26198186CFAF468665D44086F2CF7AC6E704FD8572BA00435AD8A23B10623B3A2963DE9DF01E4B7F2FC4339F788989BAC1C4AD3CB491AC6161EE8603143C8F7C30B0DD7D0D02
+A71427AF
+987A66D8431D15D8520BCF31E3
+CBE9282288BD9B41336CEC85F6B7F060300E52F8CDCAE4D18ACF45331DAE09DD0043B688C2BC148E05F32610508FCF2FA7FE4F18E8CF7576C0E4B026699977ECCC94513EC3236E64DFDF5D22D096189AB92E487CCD4F8DD03B
+80177877
+38F52A6EC68E51222A0675E46460
+F6DBAAB3B94C5586E99724057DEA774136625BA8D0CA772452757B1488E1DBA9588EFE2726D1F159F09024A92ABB8770D4DAB1216608BE7B08BC0CE9F111CBA9C6540D2C6E45B46AA2C272055A07D70E55EAB7E570B2D275BAEE61D074D16F64E78C36FCAE33996EF550BA30E9F319759BED895E7990479F1A
+39346366
+2E304A94CAA4EB3C0A43870527
+9946B3AD08CB9E9BEB67ABE30B8BA459F1F7343DD1476AAB3C1FEDBCFE1C5DE687E3131AA8CC36F3A1A16E4174B52BB7BDDFF7702FA69015449E2EE62172AA224B1F73F2
+DDC80FAA
+A5616B86AF1AE577550A0219D48D
+74707A3F6A7D47C14A173051604E936CBBC2BBE32D6C461041A4128E0B28E78CED92C2DF61E540DDC6E513A5C662A19993792ADA4995E0A2875A8DED055487744B0A38329CAA7FC74842DB0DA7AEF5EDE003E8523525C8581E01F2C631CD0467FB9A150B08D3B42EEA37568005B787C2DC4F9647A91466794830B671C0C4
+FB20
+57
+E3B3E20F
+48D122D7E519A447041076243E89
+8F2442AF05D10770
+FAC107DC
+731E7EDF1BAB23D9ED197FC926986C248AC53F138CF6513F1BE3B4B290E80F2C01F8
+2CEEAFFFE3BD13034B8F162173CB43513108FDC71A06D9354F7B09BF8C3506AB9B0A2845CC8A
+1A78F851A03F8E6A0E0E589945EA8A0E25D61FC1E93E817B664E8B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch14b 14.00 /PSOwstdutchb newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<1624322f2430250d010e010f242d22272c20302a01252e3001152420313330282d2601162432352e302a0118> 2207 558 0 7384 -1 s
+<2430252e302c202d2224> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0b0a> 9346 13300 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13280 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13280 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13280 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13280 3 7133 32 s
+wst:dutch14b SF
+<0b100f17111413> 1271 1458 0 2055 -1 s
+<000304020007121416160e1518> 2055 1458 2 3427 0 s
+wst:dutch12 SF
+<11141813> 1589 2086 0 2105 -1 s
+wst:dutch12b SF
+<06> 3177 2086 0 3333 -1 s
+wst:dutch12 SF
+<203220> 3333 2086 0 3612 -1 s
+<00> 3612 2086 1 3650 0 s
+wst:dutch12b SF
+<09> 3650 2086 0 3785 -1 s
+wst:dutch12 SF
+<282d2a00> 3785 2086 1 4107 0 s
+wst:dutch12b SF
+<0a> 4107 2086 0 4239 -1 s
+wst:dutch12 SF
+<302e342823243000> 4235 2086 1 4926 0 s
+wst:dutch12b SF
+<08> 4926 2086 0 5008 -1 s
+wst:dutch12 SF
+<2d3224302520222407001b2728310028310020003132202d23203023283824230014282d2a0614> 5008 2086 5 8527 0 s
+<2434242b> 8531 2086 0 8895 -1 s
+<0e> 3177 2330 0 3340 -1 s
+<2222243131> 3336 2330 0 3789 -1 s
+<000314> 3789 2330 1 4040 0 s
+<2434242b000a002e250032272400171a13> 4044 2330 4 5495 0 s
+<0019> 5495 2330 1 5691 0 s
+<24252430242d222400152e23242b04000e181307001b27283100282d32243025202224> 5683 2330 4 8895 0 s
+<2831> 3177 2575 0 3316 -1 s
+<0023283122333131242300282d002c202d3700212e2e2a31002e2d001a323024202c31002f302e2630202c2c282d2607001b2724> 3316 2575 8 8334 0 s
+<0011141813> 8334 2575 1 8895 0 s
+<1d> 3177 2820 0 3339 -1 s
+<243031282e2d> 3316 2820 0 3873 -1 s
+<000a0019> 3873 2820 2 4254 0 s
+<24252430242d2224> 4246 2820 0 5026 -1 s
+<0022202d002124003024323028243424230034282000202d2e2d372c2e333100121b180025302e2c> 5026 2820 7 8895 0 s
+<222e2b07272f07222e2c07> 3177 3065 0 4218 -1 s
+<1b1018> 1589 3412 0 2006 -1 s
+wst:dutch12b SF
+<0c> 3177 3412 0 3311 -1 s
+wst:dutch12 SF
+<30202d312c283131282e2d> 3284 3412 0 4351 -1 s
+<00> 4351 3412 1 4432 0 s
+wst:dutch12b SF
+<05> 4432 3412 0 4580 -1 s
+wst:dutch12 SF
+<2e2d32302e2b00> 4580 3412 1 5217 0 s
+wst:dutch12b SF
+<0a> 5217 3412 0 5349 -1 s
+wst:dutch12 SF
+<302e322e222e2b07001b27283100232425282d2431> 5345 3412 2 7254 0 s
+<00200030242b2820212b2405002137322406> 7254 3412 3 8895 0 s
+<31323024202c> 3177 3657 0 3792 -1 s
+<002f302e322e222e2b00252e300024362227202d26282d2600282d252e302c2032282e2d002124323524242d0032352e00272e31323107> 3792 3657 7 8883 0 s
+<1c1118> 1589 4003 0 2062 -1 s
+wst:dutch12b SF
+<0d> 3177 4003 0 3332 -1 s
+wst:dutch12 SF
+<312430> 3332 4003 0 3599 -1 s
+<00> 3599 4003 1 3657 0 s
+wst:dutch12b SF
+<06> 3657 4003 0 3813 -1 s
+wst:dutch12 SF
+<2032202630202c00> 3813 4003 1 4613 0 s
+wst:dutch12b SF
+<0a> 4613 4003 0 4745 -1 s
+wst:dutch12 SF
+<302e322e222e2b07> 4741 4003 0 5443 -1 s
+<001b27283100232425282d243100202d00332d30242b2820212b2405002c24313120262406> 5443 4003 5 8895 0 s
+<2e3028242d322423> 3177 4248 0 3943 -1 s
+<002f302e322e222e2b00252e300024362227202d26282d2600282d252e302c2032282e2d002124323524242d0032352e00272e31323107> 3943 4248 7 8895 0 s
+<1b1413> 1589 4595 0 1945 -1 s
+wst:dutch12b SF
+<0c> 3177 4595 0 3311 -1 s
+wst:dutch12 SF
+<30202d312f2e3032> 3284 4595 0 4049 -1 s
+<00> 4049 4595 1 4092 0 s
+wst:dutch12b SF
+<09> 4092 4595 0 4227 -1 s
+wst:dutch12 SF
+<2037243000> 4231 4595 1 4660 0 s
+wst:dutch12b SF
+<08> 4660 4595 0 4742 -1 s
+wst:dutch12 SF
+<2d3224302520222407001b2728310028310020003132202d2320302328382423001b> 4742 4595 5 7692 0 s
+<30202d312f2e3032002b2434242b> 7665 4595 1 8895 0 s
+<0314> 3177 4839 0 3394 -1 s
+<2434242b> 3398 4839 0 3762 -1 s
+<000c002e250032272400171a130019> 3762 4839 5 5066 0 s
+<24252430242d222400152e23242b04000e181307001b27283100282d322430252022240022202d> 5058 4839 5 8640 0 s
+<002124> 8640 4839 1 8895 0 s
+<33312423> 3177 5084 0 3595 -1 s
+<00282d00222e2d29332d2232282e2d0035283227002c202d3700232825252430242d32003230202d312f2e3032002f302e322e222e2b310500282d> 3595 5084 8 8825 0 s
+<39> 8825 5084 0 8895 -1 s
+<222b3323282d26> 3177 5329 0 3837 -1 s
+<001b1018> 3837 5329 1 4305 0 s
+<0500202d230032272400171a13001b> 4270 5329 4 5662 0 s
+<30202d312f2e30323100031b1809003227302e332627001b180c040700172532242d> 5635 5329 4 8895 0 s
+<252e332d23> 3177 5574 0 3711 -1 s
+<00282d001a323024202c3100282c2f2b242c242d322032282e2d3107> 3711 5574 3 6348 0 s
+<1e1b13> 1589 5921 0 1972 -1 s
+<1e08172f242d> 3177 5921 0 3907 -1 s
+<001b> 3907 5921 1 4097 0 s
+<30202d312f2e303200132d3224302520222407001b2728310028310020001b1413062b282a24000334243037001b1413062b282a24> 4070 5921 7 8895 0 s
+<20223233202b2b3704> 3177 6165 0 3957 -1 s
+<001b> 3957 6165 1 4178 0 s
+<30202d312f2e3032002b2434242b000e181307001b272400232425282d2832282e2d002e25001e1b13002831002c20282d> 4151 6165 8 8825 0 s
+<39> 8825 6165 0 8895 -1 s
+<3220282d2423> 3177 6410 0 3746 -1 s
+<002137001e08172f242d07> 3746 6410 2 4843 0 s
+<1318> 1589 6757 0 1798 -1 s
+wst:dutch12b SF
+<08> 3177 6757 0 3259 -1 s
+wst:dutch12 SF
+<2d3224302d2432> 3259 6757 0 3920 -1 s
+<00> 3920 6757 1 3953 0 s
+wst:dutch12b SF
+<0a> 3953 6757 0 4085 -1 s
+wst:dutch12 SF
+<302e322e222e2b07001b272831002f302e322e222e2b00283100322724001f1f262b332402002124323524242d001b1018081c1118> 4081 6757 7 8895 0 s
+<202d23> 3177 7002 0 3514 -1 s
+<003227240014282d2a0614> 3514 7002 2 4607 0 s
+<2434242b07001332002f302e342823243100322724003124303428222431002e2500302e3332282d2600202d23002f20222a> 4611 7002 8 8825 0 s
+<39> 8825 7002 0 8895 -1 s
+<2432> 3177 7247 0 3351 -1 s
+<003124262c242d322032282e2d00202d23003024203131242c212b3700322e0024362f2e30320032272400282b2b3331282e2d002e2500200031282d262b24> 3351 7247 10 8895 0 s
+<272e2c2e26242d2e3331> 3177 7492 0 4336 -1 s
+<002d2432352e302a00322e0032272400272826272430002f302e322e222e2b3107> 4336 7492 5 7294 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (33) 33
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0033 put
+dup 3 /C0044 put
+dup 4 /C0045 put
+dup 5 /C0046 put
+dup 6 /C0051 put
+dup 7 /C0058 put
+dup 8 /C0065 put
+dup 9 /C0066 put
+dup 10 /C0070 put
+dup 11 /C0073 put
+dup 12 /C0076 put
+dup 13 /C0077 put
+dup 14 /C0078 put
+dup 15 /C0080 put
+dup 16 /C0082 put
+dup 17 /C0084 put
+dup 18 /C0085 put
+dup 19 /C0087 put
+dup 20 /C0097 put
+dup 21 /C0098 put
+dup 22 /C0099 put
+dup 23 /C0100 put
+dup 24 /C0101 put
+dup 25 /C0102 put
+dup 26 /C0103 put
+dup 27 /C0104 put
+dup 28 /C0105 put
+dup 29 /C0107 put
+dup 30 /C0108 put
+dup 31 /C0109 put
+dup 32 /C0110 put
+dup 33 /C0111 put
+dup 34 /C0112 put
+dup 35 /C0114 put
+dup 36 /C0115 put
+dup 37 /C0116 put
+dup 38 /C0117 put
+dup 39 /C0118 put
+dup 40 /C0119 put
+dup 41 /C0121 put
+readonly def
+/FontBBox [-25 -238 978 722] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268420EA157C62583FAA018F369F10C267E5A689
+14B3CF05D7E3E7301A1D113C
+B87969B0B7A33DFDE5
+61041C8A
+79E0C55F00F30185782D9B5C02
+540547A3473460ABFFA0E495F53E7584BF4DD5BFCFF260A149BC1644FF5736DF562588F2A791747A0B4FEAA38E7C4D6A2179B1324CA331C3A1DA1841FFDFAF1C9C77B2C236
+51AF2134
+C26D9F515482584653E3D2772F
+46B84E9031A9CC791F2E91337D622AAC657612E451E5E44D6EA140E8709732DE64357AB97F38BB27AC2ACB5C2751A030EEF06CCF2B99C5551D
+A55ED9C1
+F70AF4F9FEFA44E2B6394B8BD9
+364298FE11022982702C831136924FD659F12F86D0E94D
+4234054D
+2E833FF15FD994D037911F9592
+B816C726DAC7A8548982824253A4C3385022D702E6C5B77E21D5E47724A9B2
+22867483
+B0C20463AF12BD72F6AF00B028B9
+FEF09C60C4E0993F1B777DBDE12E2103A76F3E40944EB67DD1E3F09BE8377387788C9B4CC9E69446334251EE0BB9CC37CCC4023E9A680E5EED18A3EEA7B58DDA41B1E96A807F30313B56802FBAC427DF4D0A70620313BF488A4B02E1846B433EA76A5E573FA43FACCAD463A913979C
+052C169C
+7F5943E52ED20BF16D684EC5E7
+511AECA56B362A903CDC23C5C2D74EA9039EB35B16D24FFF402C16C2478EC3821F95B664AB1C81D5DEE963F652385B81DF77866201F4
+2CB0E6B6
+14ED6654BADACB8E79C50DF812D8
+CF9F07F4E931E27D104A9DCF92BB3AA27A9E4BE29D795C4154E8987CEC0FE5A65FD171A60DC12512FB267ACD6707BED422779B2DA97CA8667974EFABB4C25F6A196883C1F9A8DDEDED1343012C2E971A1D2FE9AABEFBE58F94835B62AFDFB31DB354F205FC6FC28AA17B3D8DCEBC601FE837B2
+56E40B96
+CA82B7168414D54F88EFC1E93F0E
+88DC65E58E51D9717CAA1C9F289A545A5047B06B679A79D4513AD9FE0A341FC765C8D13A99AAF91F7CBC1E503556B4615178E78CCE9A1262A0A4586677A73079D19FC5E51145DF7D80B11888C9DF3192401C2FE358AF2E281DA5F6EBBED2C689C722719F2A423733C1D8044A43BD9DEA1FD31F717098CB1A83684C958B91
+BF86
+D5
+4CBAC048
+BB4F6F59270EF29085373CB0F8C0
+88F35F2C1E3062071BC2E9D3E43311E010F55E5C48B2B1BA4131978F31795ABE5F1AB33A7E8FC3067C726497CC5CB3F412A0F3094A1242791E28E365A674AE7462C38C15D977499F2D7B73CD62388F7BF45BF7A64311D7C92778176D8AC6B154DB3197E110CDB94664
+D1F221D2
+8D0678C7B74E04AEA9E8EA1D48
+018A4D4D8CF0270573259439303C90FA49A1A73A839A1C1C4EA16BC32B88DDB9D0E91B7AFEC18A14B1500FE483E7608D411ED20169E38704E136F9
+E1CBE8C6
+A6F45246B8D662879D942B3C03
+C01091F26265C43020C7DFA30DA1DE62DC75F8678803994F729C9A84B0BF56AE9D6D29848220D202992E41422F9E744BFA6D229DDB44FBF5AADB9E02003A021B5E776D8B7BA93F
+85B2C153
+CC1A2197065A6E56810A60BF304F
+643C6EB786EBE97C8043BE396F58E909B7F9EDD4A9B2D91219F593200E18ECB1DB06FCB6D0604DC46764CF5E6767A8C5303CBF0DF2AA19B739D1FEA29D48508FCCED092AD223A9D1E83E4C54A88A415889C07F8506CA020459CDE3D0DB48B193B1274D5109D1790E15732963874382
+97297308
+206D5573E15211E7AC9FB5659A
+F715D3083C8D0B4391A050949D435A66397F1D1E5767EAF49837C19EAE1949C6248D2B141962005BB9206C1D37EEA794434157FF71A21F0E6E16625FF32DB40C296D407F60B8C3F5950E821D7DD2EF5BE0C32A80F67660A802530C88
+78A08F44
+D46EBDD7F18D0B52700E59E6CC25
+7CB562199CA8D06AA3488B98817D0D5C34294153D673BD808CC89BF2BED30AE5BFB19F02386B21F6ECFE21D62C6A930F80513B06529B84CDE64875075E499EBEA776B99D150CFA6696C3D8F1DE3C9B05DEB7039E03963A999D84C380816A583E6396B48FB9F8C4B172BB
+23223DEB
+5BFEB4E6A9E1DF27EA05B7F9CAF7
+9D1D1A0591689B02AC7C782A33BB66AE349657F35E3A4E63F37F727610443A5AB6EDAC93FC920BE63600013F62CD1D40793625B5C07B423CC057537ABC804FFEC37F2CFE4AA5F090D13894BE8AD896A04A5715383D22D9BD6335F7EA99699DA06ADB4800CDAA37D3C71B86FA1E423AB0F272B4D911414B66D43C5782075E
+C18D1439
+D02D71CFC4FFDAA9B7E7A25F06
+EE17DFDD635D2D77C6E190392A18DB777A2ED979E7AD8F6D9129824032AE05579F0AC4AAB7916B35293037D6023713A261333AEE952F6CE355A00D7036CC61E69B172A8F50776EA86626176039CD5A821E
+8198F6F0
+681D5DFDFB9FE2FC88330E4DA561
+84BE96777997F67462AD43B5E17DF6C1709F3636DB4D3E87A6706237EF49FC60077A75712E22B6F2F83EDF472F0B3694E591EC7328D9A7C7A797D336066B4C2B4A3D8A61D17253C65348ED8E1543347C82748873E5E81FB64B7BFB98B838309F776AC861
+BFBC0C11
+2B6A4E788E2B35BFFDC22482BDFF
+964A0D659D96F19A196A240F742B35698D76628D5873E59ADA0A3E26C624E0A4925BB5EF15743331A0EAAF2A1514D0C75237EA85430118790C0D11799E51F53EF06979CC9539B799D7D75790271AC7A7BB023D006CDD21D18196C94E400B5283A5216AAE2DE4109155634BCC1D152AFC6CD284384DCBB7876B403DA636F9
+FE20
+917BB81CE24581221004E5CB0622F3BE
+EC6D856B
+9DF8B262AD5D850B259DA7BAF325
+6EDDFCE543CEF0507D7DB8604280C508E5FD686952037C3CD55F5067326715108F67ECA91FE410935B58A305513C8EE231584DC6ED3A703F4228A3A07AEA5010753726DF90562903E5C659C6C1412DD136DAD1B5E2E74DE9E669A9DC48C162521AF667B9D17E298A571D99E9177962CF7FDC04FE03EAA6603D955E4BDB8C
+50CB
+8F3C2C
+286C26C1
+34579C8953C3112ABD0ADA8E33
+534A2FD4F03786EDB18582D7BF2A3AE1AA391170B2AB0461D3590C78D900550612223DF9B71F8276C018C4A5FA2D8667B3FBC132D3CF319022EE8E25ACEBA2CF85558C7758D99A5045CA88FD05C65FAEB8551EF74B9C2611
+B27C9256
+648B62805B330088F415EDB95F
+F9CEC0A5FDD0FD461B1D327EC9D411ED11C7F6F1D33066A387E756CB8DD65C36E24D4B365CD6A0249DA1620CC7EB8A8584DCC39A0DDF1DAD9B2FAB0DDF2278F79DFB47962DC5143D029C10DB53E717D57E49
+E8BB819C
+E3A26DB3CD0109991582A7B6BF4F
+EBD03132403827498D06031247C6F6EA880D865C4D21F50020F3E9E552D2EE5E676BAD9F832344B3DC45E9D15930FDAFDC7EF5FF013A20B3E5AF0FEFD80E138384F87F676B41AC42BC262911BF116DAD0626C84085610190901AE2AE211E8A5B4193B8719A23BED852F56F55EF59
+635C74A8
+E1C90C4648E0AECECA83DB5579
+1D218D0C19223C050B4E171F7B1DC985559B13A2843400AFB733AFA05D91459EFB1A9E07CA25C69D78329D343CF27BD509C7251C0EE8B59E46DEBE059574CFE1BCF40325C88947F7CA48371643D1749945572ADC6787EE7BBF
+A47BA476
+A76019D466169ADC78016B4990
+CFB9B733CFA4FEF6463B2F037AC285F04DD4B1C4492D9262DDE87E70B123AD5FAEC35BA90FE9269CEAD8E33E8A656471E6BEDA5D18889371EE5552AA516C43A4461BFB5290AB84BF811C755425C40F18F83ACF4843B3E35EF15D61AE
+0E5BC87A
+597D150171778A9C0085444BA37F
+8C8FDC0B3D52133617FE0D325507D36F04062E750228169DC0AD101B0232400DF73E4F9027279B97633789299870F04BE9BBC319B95E026CEACEF0D694C45D898EFBDEF654463496F152733623A6C3BA06CB94A03081697DB80FA7515AF43ACB76F59C4E4526CC9BC937C89E363ED3E2583636EDBC7CE095709FF02D9A92
+C3DA
+7B75DABBF418860F980A293A60BED3A479A9311504BD9729EC11DFB138D5E1BD158EAF16E57B8287C7DD2434B64B47
+0E795E79
+4FF9DF629FF2C60675978A2E285A
+CE63FCB01A10589E6C078B5447D44E94F063008D04F3F2B9BD87343581EAD29B78FBBED89EFACB506B284B6D33D77BE3D287AA3EA174C92A76A7D7BFFF03FDB8932B262FAE77AFADD5013E7BF1AEE32A4641FADD10FFFF2425A07D517D8E7B9132263CF91FDA41DF44581F1F9C
+F52FECDA
+543626093F0EBDA19444E9162A
+946DFAAD3A6ECBB608FF9F476062053F5F913E6DDA5F1788314E01FC88FE6CE7115DCF503E3881B2E8AC32383C0450AE583D2E597E5553A6E0C46912C48D2137CA116AF66D7250404A3F85F1407A7138
+1517FF6E
+8D54CC7696E11ECB756466B49E54
+0D79100A9C86049D3E682AF067940AC87E41340A3CAC432C6D5937A060B522AB359197D8D4D3E9AE2A44AFCD1EC437885714F85C91B98DA383B850CE45DBFC214CB58351699F06CD5E5A9E3399FF8883E24598483481D28F85514CE4984FCA99950687E674D22C820014948E6F0856D5E8100AF2AB99200F1C1840C76AB3
+384A
+FB8D8385F3BDD91A5E00CF1D356F356C7B95D9B2A8FFD2E77254C97BD83B48CD36F1EF
+E361A956
+7BB161C6226C54A0C5B1ADE33F
+D14670C6FB7F7D7E03CA31CAAB87C97C1D1411A1DDDED0E69CB046EF5B6D0C97D488808B4932B6764FA9D5CF58F29353CCEBE4F69FEC
+6F5A9C5A
+9F20F4E116F20F4ABC947B713930
+C957C6326822A1C88003C07A95FC2BD314FA05F04BEFD248F275A75CD3B785A069603B9C7AD1D94726B29158AEE1AE91CA4CAE3911769C00BB76901EF696EFEECFD3EBBD1F26C9E837FD252D87EA07E8BFCD0D597AC49C87339DCD24CEDB93E45CF0B2F5CB1E912BCA8FD5EDF3CF218A898FEF6A8F30CBF9B866F0C5C78D
+427D
+1D7A3A2A56B24B79EA459C17CB1EBD27B81781833079245879883CBBB40FD0
+85AA1783
+7CC4E545648D420ED543EAB78BC9
+94D6BFFDA01FD799C69EDA389360FDDCF58B3D801DA5656187C5F38EB6711F151405FE8FCDEBA4EB82A6E1E9466F92BEAD93F4BC1514CDCFE95E1269CF4E3A61AF29CE2581915BAABDA1F853ED124DB6E33823C565E2B4DB4C58946D57109381ED64A6FB0E8887E61C66B008
+F78024C4
+93272497A4DF73520E692CD097
+005D15001F34226AE8107207E7CEE7D1B4B5944F18EBEF00DA8F340FA7E71FFC2A34E224F84970A88F96E334C5E467F01E2A09B430BA1A99126C4D67CD2A552AD9FB84BD3A04
+D2AD7F50
+823B531425355276106AC6E93CAE
+2558AFA7010AEAF17EEE6692A7AD40C1E6E66537E20DBBDC916D2B730F5F375911B5055B8D9C58C50C3809D5449C47E4BA6C12EBFBAD29897874F26B42DD7B6760939CB56523850FFCA0830EB9FC78961FC9EDD6F11D37AC47609CB70C0C93363998D772FE5D415100ECE9B7DC91172DD3C55EBEE2CC8C
+F8AB3AB7
+DFDDAB7F4C427DA263262BC8B0
+012694C34586F9FCDB8149F374B0277833A0183ADAAA2E771DC8BEAD79757482D118645032F5480319B64AB710A4644E35563A254614F3FFBC6095FD30FFEFD537610827622018584BED3C027080BA0B6E6F56935A4B5B
+834AEB4D
+AF91E5BD15CC4F7B52F6A808F1DD
+37AAA08E50F394C75306915FB8D65D8AB1CB2E7C4831A92EA4FC74C9B64710EB998D2137B2F0E0EDC54DB6DC19CC53A2D87312C00F9636324D8C7217C910BE2ED0CDB28363E7EBE77355AB561405F2F0E6644BD01029E08C7795AE55C0A39AAB09A9819D2D35B780FD92EFD2F3B243316E1DB5331003C4AC82B29AC8
+2F54F66E
+DAB2512881457545DBFF2FD101
+409F3089E6E5FA0A5069F2C7021A02C719F9A18FD0826AB46CBFC53EEBE86DEDA0123EE06BC7EC45EF5D3B62BAF7290D9FFD426522ED8C2138F5C5D7F4A8A624BF5B8BD08E
+E2A610E8
+8CFD2504114D6B4B870C2CCBC0
+94031C71AAD48A8BF29C7D933FB9A8A2B14F2A017158FF93C1176BD8309D13642AD206E9CB25ED44B7D14030942A76580990EAE12E4B31C8C27A5832083E109AE41F8831334DB7FDF95FE35B2E44E2ED4B20DF8F46273CFA65FF3ADB9213867AD4DA
+CAA244B7
+E708565405511BB52732BE0179
+DEBACAC5D8D2B656BAFDC3EFC6A613794AD761A48F9D1F257B1BD574BFEE3AB9624D3A557919CD00CB292D57450F63694FAF03CA358B802CB0BBF262DFF28C8CF2EDE708FF32EDCD4A8F65B90B8F5CDB233F60DD6C918D5F4A
+5659E082
+D0A56AEE70978C31CA091A0D3251
+BA7D3E82827E2FF9509F23C4B7EB1C16C45CD37A905DECD8606FC39B31788F5151BFA1BEC8A3C6F754BE9D0710913E6B872156574A8FEF27D2528D9BE1C934AB7CD9ADBF3344DB7D99B45E2834247ECBD51A147DF49352B417FB7C15619177EB3AF4E4C61AE2969ED20060447B77691DE1D1482691AD91F4461AF66B6B71
+F7FC
+33B7DF41307909F61583D6FE2950
+1F929292
+D1813E959C13097D4987053D9F36
+2D8D2513EEB18960489E03248E58F5E21031228BAB2290721853DA9EFC461BC24CE62148365BAABC3600E4CF4DCFBC390A72F59FB8AB8F2E9ADF4B3EE698541305FEE70FF7E6DE5C2C9E6519A25DEB2C1CE152E48F8B4AC45A393A16FC31C19C6A2E616EF1DB471DDD050BD977916D2252C40BF720E60B583856DFD90B1A
+9879
+35747A40
+9420AB13D9305AB7E095C99D2E5C
+078B519928E8FF49
+789E161F
+F4D4131232F5F7B5E581868AE0F53D55FB575B9D5BBB841904C4941B841036F5302E
+DECFA2686832A233C654ED2F7D1689B279D54303FFCC1DAB4930688FA953D63AD9D05B9A3AC6
+05E6EAB6CCE2BE155338EEDC8BCA76FE454A4CC0D3DC9F3EE56C24
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0046 put
+dup 3 /C0047 put
+dup 4 /C0049 put
+dup 5 /C0051 put
+dup 6 /C0058 put
+dup 7 /C0068 put
+dup 8 /C0078 put
+dup 9 /C0080 put
+dup 10 /C0083 put
+dup 11 /C0084 put
+dup 12 /C0097 put
+dup 13 /C0098 put
+dup 14 /C0099 put
+dup 15 /C0101 put
+dup 16 /C0102 put
+dup 17 /C0103 put
+dup 18 /C0104 put
+dup 19 /C0105 put
+dup 20 /C0108 put
+dup 21 /C0109 put
+dup 22 /C0110 put
+dup 23 /C0111 put
+dup 24 /C0112 put
+dup 25 /C0114 put
+dup 26 /C0115 put
+dup 27 /C0116 put
+dup 28 /C0117 put
+dup 29 /C0119 put
+readonly def
+/FontBBox [-18 -209 798 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684274DF5CA2235B505452EF82C19378A786E0B
+30288B05492EE4BB6123C04C
+3FB31E3DA5151DECA4
+238032FA
+D2FA7FB1824D5B65B72B33E7D9
+023B3B8C45A9D80B2FB65F9BEEA3CF7435B74F2AA261EE7A8B8E6CAF4F16A3
+77D2B03D
+67DB68A103559B8E347FF6243E
+9B38814FEEBEF65BD5D0B4C9119755511780E62A6B7CE2E4F529
+164F4646
+924961305B9F5B817BE7668528
+DB216195DCBA07F1FA0F4B764DC9A734C83AD0A50FAEA9E002E44159FA086816114E50D6C4F6E3A23943DE14922257ECD64140D2D45C90DEE714A268
+75545F83
+BB37AF98FACD8D037A456D189245
+F75ABB8B707AD5E1FECB4A3A89FBFBC2BC910909639C3A9E6700F23CE30C872B41AE11666A7B111466314CC518994552BF9C52A9F387D7FDFAE381679A6D46DDA147639A5A0E49239338A45B9212FA1FF6CBFC7DB9E352725D4768099900EA31A5DB8CFB394C9BEE7B7DEDBF14A438A05DB0A0
+59D93BC8
+5B454C3F909E4E292505647551
+9E20504792492C276D9014162A50FBFCAF7F9FE5F54FBEFF8A0CD68FC04A18C63731EA300E0C4AA6B72F53807286BADCE255582CFDEA
+BA0B11B7
+A2E08530EB41C56AEC543B7320
+DE2F49D8EA8435B2C18CC73A48F900E502CEFB76E9EF834B3F570D1462588E9838967B20612BF0022CAD79C2217DBE736AC5B22F1FA87A7998E26BEBD77E1C9829E69520346E80571E30021DD6430C96F7F5E5125C8DCD
+32BB9A12
+E1461466E85511E5528CCA877F
+264F9CD0043BF1E02C4BF6EA550B8F547DDF9464125F5DE8DA5759348F60D4C1C9AD924657E27515F1C2365DD0CEE1CB04023F1DDE106DBB0C7ECB4424B829DAD58D71FCD3FE76E354A64074C9FA61523B15B2E44BE64AA94D684D0DE520EE
+7AFCB084
+E2F1A2F70DA8FF55D03A801263DB
+7DC7EBCD70304E7B96CC5E70B9BA6266787AA1AE992F14D65D0357CF4CDA8D71102B35AD35F408B1DD888DBB7B927089306FB8689BF06B30A92E9B6C1CC15DC5935BC1C0F726CA6816F12E17ED21FF17F678E236DA85FAEBA121524796DD420ED0BF50D0
+28313989
+0C3357D6C36ACA14DBF47C119297
+6B4797ABF6BFC0C62D674E01418FB5CCCCC50CA4FD6B4AA9B86589776451A5FAFD04A905DF7ECCAC94FAAF4B839CA0429B3DDDBB4E4159A94C7DD832112CD6C3F75B909764CD4AB278C22DC7828541CCDA05935F5B317977E1F0C77FAC09D616D028927B2FC08C0AF0F6D62F8E550281DE744B16C47DFC29E8F9CA032FB8
+BBBB
+FC0CE380
+D55EDCE440FB9933492B51619B
+1001652719CE363AD0D3F29BB81B41EE3C49A122356632A3A3ABBAF6F014CC602979DCDD6F6671A6AA0C348E18A4DA892FD429DBF1E9537C4E3ADAC4C48490CF7F6BEFC56E98200CAA
+F84CFB3C
+326DF1128D798E25BE9CEC7E5041
+89315DE04BADAC0D43DC63F0ED98DC943E1A90407B096D82AA8484BD843451115CAB601B4128892E60A49094CE50D0F24126DEA26B0C38EC4BE1CC447DA8A0F840363B6287F5351F8DB5DFE290020FF4A1C4AC3D85BF1F5CB55382C7F840A6BDBA6562CA859DAE5326F066BF278464F52568C83A4C43E4FF55F73CA7AF72
+75E4
+0414990C
+6FE74CC3
+86B83C1B5988125BD6E9C8821D
+945DAED767D0F5B25D892AA31DDA997BF29D4327540DDD500D72922DBA76200DC4E5FD8326E8257F71DD1EAC3F622E934795FC7466EBA646EA6C99C660A70396517D0018F1D60C6C61CB53A28F34B2A0D664BAF3DF1995E2DBDC12DDFF44
+CD9A88E4
+46B19AFC5A7B91322983697425
+E75CD601FF5F6F12FD6CF9D903DFBFCE98DFD6D89F2AC4BF087A2409588DFF74396CF533983FAAC04EC07B08F24A316E1077B33CA1ED1C7523775DAC498C0044BA864495C721FE0C7B585C44FF512B98BA58
+AE1568D0
+CFF6EA9A2111341B8E01E76B80
+E3B89A016C7593B1547C16989CCEE749A3BC300D8C3E4E7017189EC09DFEB963FCF95915F48D73F7784F50A55C5045EF8BD458E1B3B11CF7E3987E670521E8DAF19A5461C22054AB9133F0135906697AA3DD5D5DFC63BFCDC1A1D6DF
+9D9DCF56
+1D38334301972077EF5DFDB1DA
+E428DEA1BE5C34E41B66D326B7D190BEAB2D76EDF8305720ACBC2432B183CA38183AE58698BE181867DAF34F1EEA6FF84E9FA9DE120E85C313ED370F79834346BC9F9B0ED8223FBF140B5F4B70D71B332C26BB428F08E8AD57B77D297A
+1D28E7FC
+39212852D72A036E923F19B70A1E
+36D8E39C73F6A94EBA98039F65EC912E15D476982A99E01F7CA1BF17861F9CAF12B955A87EC71C69C9EC18B7CE95D5A714D99C40E85C982FF8A13467BE271C98F08B39700394FDA71FE64327F04326426075BF5EA44A039F012AD14A31CDAE6DEDC4A0E05F53964A32F078114F03711AF87BAC31455AA43E25403FD9FC0E
+A486
+8CDFFF981B8EAA893C59D2E46C833626A9C21CEEA1D5266415261D35FF70039C4C4A0BFA57
+070E3194
+BABE4282DAFAEDCF044FAE60D6FC
+05A0F71CB2012074F137D79A5A403224362FB405B153F32A3B10918191410D4E9D13CCD86A73EEC7E3765DD5FE097DC7D2C8B84D82CD96989C4F27F46C421160261ABF629F52F1D65C6B9A46951B418DC26CD2ADA731804ECB7031ED489275D222C0A9FF7BC0021B
+C6263CC2
+23B0860070128B27923107DA23
+2FE1FB9290A56C8E33F0E4F35AE9928D94DB168BA78CAE14913FC57340892079E664296010BA97E658EEF778DBC33CA2CCA1719A37433DE67D8543987AE803B8372FF3CE9F94B8BB400EFFB3A461
+DC11B0C0
+1C3907741D6DC400E76A9B977F
+81A7EC2150127925BCCDBF9AEA4C6C4193DA0FBE8F15DC829CE756CC2A94FE8B3AA1DF579D295556775DB4B5A3614A597138B12A
+C1703C6C
+1960527471A573AF901E58A242CD
+10719D1C8A08199DF5F3DAB1D90F81F93E695AC0B274FA9A306E24B0AF8D7DB14F91F0868E43D9F97221C38472DC1B9EF4C803B2325CBD9987AA339FB3F50E93926125935B61A6AB6B92D9AC937D86E04E35FFF13BB058EBF291EAB1364413630022E1D08B702CA0CC0FB8552DD8F6746DDFC7DD022801E7973A44232181
+0B50
+D510FE461BE6C132853F4E0C556B2B2A1A0152CDF06F15C221363B0B
+7EFD84CC
+B3306B4E68E7B941EDD1CAAB514D
+DC66C696C003EC458953A2FE4724EA003C61FD8B4384ECD47895158920B6A80B26FCF9B8BDDDA399C021D6C5236362D426B69FF63A85D44A9E86C298E70D6C5C896B36C99E12CB79C848EBBE2E922DCE4C9B6938B2997E87BEB9D4768EF30E4249F9FB045BF188
+E9560F2B
+3987E5011AC8C42758FF018B97
+90210993F8A36EAB659D641BBAE52F708A61D120D877B06626FF3C8D9586A3152EC860F1EC1F7415930085DEFD4E597FEE671BE1AE4FEAFC075DCC3914262BD9F0D61D7C729D
+FAC09EBB
+3887E425C082FC2BA387D69EEA4B
+6603E088D031DA7CC72BCED6C972EEF3DA1682E0EB2F56762F3285CD64AE03EF79AB23D75E070529C0614529AFB5CC83CB9F225F2126FDBD8BDBB948AB7AA92B84E30AF372080B0F8D0A6D460CA5F02FB4A2864A23218E6472753832C06171F761CD86ABEE87A768F1FB4287A956A23235
+1CDF74C3
+2232EB6C341754BC09F74E474F
+B917184AED2DC4F37247F4D68850568B3CAA8C60211B50D496DB2C538AB5DE8E8AAC8BD63DBE13305A87F0D6B39D74504704EA21BEF07C02EBA5CD70E91DC6DCA895F71F42D4640B05CB9BDD8C2013A2F94443AAD0DBF0D0A2
+242032C7
+CA91C5B3EE90B4B9CF4C8FC2B871
+9A92261A44A80C34BD76CC2890A32A086AF8DBB7862C43692D4DEE77A29CF235861EC7D76F13AFF6934EFEC18A6BB2E9D3955040843EC6B4EF327EA0A9AB3620ECCFBDFD913D6ECFADB5D116D8CB87D66269B54686C7DE9F9C9B3FC5F379BA79EF4FFA68DA60AAB6C7A05F413A8E10963C28892B862118D324
+474B1FBD
+86E1DF7A8674F100F1F4F8A5E5
+3DF6E447083F5DCB85571D166E7C7FF081FAC028C606F148A0FEE2D77CA77C50C725B24EC8B06013B0FD14D4F29BF294950E587631D1178064A785B9980EFFBC4C966B27
+C65CF951
+8F63580B6B443015E59393688B
+1DDB7F1F3481F3D5E4AB05762389E489213F841F0F4CF94E72993497B31D645518F629E2502919C25538AB3965D2D3089EA20F200839C0F3ED69BE0FDFA15C6B23F3B60B67D402182D06B47001A2F588122B4A02CF575646BD63B0
+0B60ABEB
+8E37CC8B2A93ABC3A69B527506CA
+0C9A886431167A8D4782E5C5BD85747D5955C2A5618E2AAD495299099E8B8BF7D28B99084D78FBA6EDC24D5790860651D85970C6C3214E13F3CB8F1846F82440F3818508FFAE304139EC82B9925481AA2F7BFABBEBEDA0960CAFE6849321AE682F9360D71BE051A808006EB3D865FB5088CACFD8A48A9DE4579FC8A547C3
+C8CB
+A9A9B788974DF36248D731
+FC4E60E5
+D6909A124AD06BF7579B2894CBDA
+32FF2B7032BFB3A7
+F8DF4B56
+6FE81227FD67E677209FB25289BDD03A760CFC3C924CBF80C03C1C9B2FC53DB65AF1
+E843C3B7FDB28D71A453CA5D2055320F27D84A178073CADC12D4056FBB7405B6C9C87FAF96DE
+C83CE268A6EC5F00FDB188E1BEFB5107F236A52C1AEE59ABC9B479
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch14b 14.00 /PSOwstdutchb newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<0e18252218231907010801091820161b1f14231d01192123010d18142426231c201a010e18252821231d010f> 2207 558 0 7384 -1 s
+<18231921231f14201618> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0606> 9346 13385 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13267 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13267 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13267 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13267 3 7133 32 s
+wst:dutch14b SF
+<0a0f0e1b131716> 1271 1458 0 2055 -1 s
+<00040502000b120f00080f1b180f191000070c1b0c0d0c1a0f> 2055 1458 4 4824 0 s
+wst:dutch12 SF
+<0820> 1271 2086 0 1550 -1 s
+<0021201e1c2018001714251415142418002119002018252218231900231824261e2524001c24001427141c1e14151e180025210014202921201800281c251b> 1550 2086 10 7203 0 s
+<0014001921231f240416142214151e1800131313> 7203 2086 3 9531 0 s
+<15232128241823> 1271 2330 0 1991 -1 s
+<001420170014161618242400252100251b18000b202518232018250500111b180012100c0025210019211e1e2128001c2407> 1991 2330 10 6462 0 s
+wst:dutch12b SF
+<121b1b180603031d1d1d> 1398 2677 0 2362 -1 s
+<020e1c18021218020e171503160f1b180f191003080f1b180f191009> 2345 2677 0 5039 -1 s
+<0c110f02121b1514> 5031 2677 0 5821 -1 s
+wst:dutch12 SF
+<0a> 1271 3024 0 1402 -1 s
+<23211f> 1394 3024 0 1765 -1 s
+<00251b18231800292126001614200024181423161b0021230015232128241800251b1800171425141514241803> 1765 3024 8 5801 0 s
+<002123001518252518230024251c1e1e03002426151f1c250020261f151823240200111b18231800142318> 5801 3024 7 9531 0 s
+<1417171c251c2120141e> 1271 3268 0 2188 -1 s
+<001e1c201d2400281b1c161b00281c1e1e00141e1e21280029212600252100172128201e211417001621221c182400211900251b1800151820161b1f14231d00212300191c20170021251b1823> 2188 3268 14 9531 0 s
+<24212623161824> 1271 3513 0 1944 -1 s
+<002119002018252821231d002218231921231f14201618001c201921231f14251c212005> 1944 3513 4 5376 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (34) 34
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0044 put
+dup 3 /C0045 put
+dup 4 /C0046 put
+dup 5 /C0049 put
+dup 6 /C0050 put
+dup 7 /C0051 put
+dup 8 /C0052 put
+dup 9 /C0058 put
+dup 10 /C0065 put
+dup 11 /C0066 put
+dup 12 /C0068 put
+dup 13 /C0070 put
+dup 14 /C0072 put
+dup 15 /C0073 put
+dup 16 /C0076 put
+dup 17 /C0077 put
+dup 18 /C0078 put
+dup 19 /C0080 put
+dup 20 /C0083 put
+dup 21 /C0084 put
+dup 22 /C0085 put
+dup 23 /C0097 put
+dup 24 /C0098 put
+dup 25 /C0099 put
+dup 26 /C0100 put
+dup 27 /C0101 put
+dup 28 /C0102 put
+dup 29 /C0103 put
+dup 30 /C0104 put
+dup 31 /C0105 put
+dup 32 /C0107 put
+dup 33 /C0108 put
+dup 34 /C0109 put
+dup 35 /C0110 put
+dup 36 /C0111 put
+dup 37 /C0112 put
+dup 38 /C0114 put
+dup 39 /C0115 put
+dup 40 /C0116 put
+dup 41 /C0117 put
+dup 42 /C0118 put
+dup 43 /C0119 put
+dup 44 /C0120 put
+dup 45 /C0121 put
+dup 46 /C0262 put
+readonly def
+/FontBBox [-25 -238 920 722] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268420EF1DF4B83663DE01034AA39E98F862619B
+68CD13F14451A96BA472830F
+DBEF494BE4CB5E803F
+DB46FE8B
+CE31C8CFD69C06B48875D86D9F
+7C1E986C904A8C416558A61886C547F5FE9923178C5CBCBF307D6D475FF14B13A085EBB779643F8E1CFD299FF3D9B1DECE5A29D2794CA285AE
+033AC9F7
+42A71947D91EE74C0FA560A1C2
+900D93C7248959F70CC0A8C8656E28BFF8EDF77498E6F7
+27F2F99C
+318CF461A3751662D323FB557C
+BC51ED00E73BBD40CB5E0D728A2C80BF0007F3E3629C1437A659F851F6DBFE
+182F8EA5
+3885E2BEE87D40B99682F6530C
+501595FE3FEB27D1664A603789B519FF00173467276799F6C8F1BAAF042126F44B7773F42ADEBBC70E996CDC33EC0669D0FDD16697E0CAA7B44640C6135AD3
+7D155F49
+BD4D9BDEE9050FA1BB5E02D7DC
+4613C87A1805295626DAF6F3FE8142B150DBD9B4748EC0B7CA60C6C898AD231FE5C9B7483BF5131480E9870A6EAAF54F8320115B0BD7CF5325BD9B6C20DCF2657386A0C41BC53B602372E574F3859C2D8F32AC2568D03A977974
+B7785F85
+6261DCE1E2382930C1BA062ED102
+7C7D902A8076DFD1999BB2EE7C6521C3D84728EB9CF4B5E24DE677F51110F82CBEE9C46EEC71BF1D9EF5E5F0CDD41E06E72D0BD985AB04D19AAA397F60D1B64E3418F252DB08A3B52D0DC4D7C1813338B7B88752E49C556B9912C2A3DBA0C8EE529AE5BA51306AE91982DE89101D02
+1745D4F9
+452D20A6C08FFC42F5DC950822
+00446434AAFF0CC7A7135FBF026DB0554DA88F9366FF26EDD04BFF9D622A4DA425A2E0CA836477CBF104B8B46B12ADF942B16630EC4B9E28E660
+D52495B2
+BE49C059A4C539A7DA6D77D612
+4D75B84C456613D410B6B49DAB219B662AB9CC2A545CC5BC2A7900DD6A8D9FC7FB868ED9F65636A2C1018E5ED573B3475086C9D13B11
+2CD6D71C
+04C3094855F7742E77E9D8E6EB5E
+A71F7208005C68DED641AD4ECBAF7CA7CDC7D2A2606191B6D667E7D4D4BBE6F3030F281EED8DD8D06ADD5F3C3AB85AE8E73E0CA904CFC5AD72F06D32D5FFD79AA7625FD776315B81B757D0D6087BF6BD0E75A3A4345F7E0E5A55B3BA2FD955F349D4E155FC5A5D7F429F368E4B44FF117F1D40
+6549E027
+F8AF40E4798784086CFD36B48D49
+E89F0F8BA45FC72803119295284BE0B2CC2E17277F3E2FFF8D2CD1A367D9775155168E435E202ED8FD6B7D03A8B4C2BD14F27314AD72A7CB6FED88D0B8E1F465A92D6AB1C611E9D817763AD261C7AA9A1FE1C5CE24524A269A57893D0AF16D0C330368C5A87FEFD29CAA4AB3F3CFC95F9DB187B660A98F08C147B74ADDB8
+126E
+6B
+D7534BEB
+77807E222163C6511D992E5164
+53EC5F7B8A11E9ECB297674BBDC39176B1C2472F626FBA3AC2D6ED29B0D4A84FB8277E46F3436A46097F23CF9C019F06CFC9839D3D2C2515312BA9262CA2614F26FE529F76959C4B12EEC4BAB89E46910B2BAAA2FBC6638E60AEEDA352F4760BA31133
+2AD06CA4
+428D3E32BE2F020E491B35BA7E1B
+6B3DEDD19A038AE6FDEB205EA0940F2FE8EDBE47337EB1D34D597FDF821EB57B65F9CB7AAEC23EB4338E2EDFCD333E4CBADAD0BFEFEFCCB4601F9C425ED88DF9CFB0813E8B1CEDA0DF4AA67134FB07B779ADE1E37345FDE45C00C351E85B02581A7D8ACEFDD26E69DD
+6F079733
+3323F99A5E025988BF82D6285646
+AFB0D1631F2998222FBD0DFE355492D919AECAD178AB7EE4F698B7C88FAC4CE781D1D30294B0999E19CEEA0A6B32D38C3A1A5D6108A59130EB921DC37325F5C584E94D20F448CC041AF037C93F2ED3AA215A544F21D954665025EF13A2526071B1810534AE41FF973D08CAF1D0BFB80A9E823C9876B33BE9D58A78E9D52A
+D89D
+DD109BBB02E23815C90E8D
+670E6F21
+C29750C7BE40C8C3B00A6BFF8E
+F29877FAB454F994082863CBA3C5E680EE80A5BAE152D28E9A68024A1C11E68CB527C0E5EE66590E998E8906EBF598D94C12B3AFDB02B4984D0667
+05402784
+63E70B535E23011D8ADB00FEBB
+FEF05180C4E3C7C77CF2F54477CF1DC752E564AF7D105A5981A14215B9419E47EBA9D9E3BE06357821F09573CC040E5976CDAFCE2629795FB793887A4A05DFA123E4A633CC54A3
+2C249F6D
+5D0A95898C2E689EAB3EAE3772C8
+2AC0ED80E50DF695A2E68E1D109280CA12F6B32688B75B1B0F5CAB9F26BC56DE1C9A932DB53E3DB3518B18DE8978FE01B80B0522C70868B8C74FD68C02F7CD11D0686470C63BF6DFAC99B86D76E42CEE06D15C14214B8F0AD20242D1EAFBEA59605979128CAB8538716D4E086AE9F9
+4D3B869A
+3BD12C1F40CECB19E7D3B01D5D
+350745ED61F551C3D3FC031573B0073F2B742D596980BEFD986ADE52D6D1EBB77FE7F45D5C4696FAB6CEF54FDEA79D79838EB8984AA7B98F7F613CC095B27113770DE465ED70A8EB98475AD7AD8CBDCC501ABE07E4697F283919F7FE
+3513BBE8
+0432A34784B8B2A92F48E55ECC5B
+A2A7A3C514667A467020FA4D80FC97B8C3836A3647F8F7184FF217D43DEFF9B97C8E3EEC9C086298595D6525C19207DC422CD5B6A08A5DBAC840E1BD697DE783860131B99841A9960CD98134B2D63B43EB7738FC7B59C376AE567CAF0202C52C25C978E4F14ECCD18BBD
+1E24AF5C
+EDA459D44C900B6D7C953B557896
+224771487CC634B0427BF1391C125BBDE5E72CD0325791D2DB3258F8E9574F41C0AFF6A89566FC35C8C6E039798ED7FDAC6E1E1502F4DEEDFBD90F26B7D1D21B686BE802E855D46FF2796346EE6E808E7ED746FDA813D912A28065040A0ECC80F7A237EFF2872A84B2E2097AEFC4BFE91E0669C494E6A09D69AE9674E9AB
+D584
+6F101E
+BC96446F
+F4B7A7674E63A74844222126B2
+F695F1A7720D3B6383A62B8531FACEC52F6E72C54921DFF45C42C496A456214E7E435419ECC1B9CECD2D7FECAA34192FC23F4BE9ECEDA377D33CE21B538D07DDFC0277D1A429C33826C9BA7A64034D3252
+F415D166
+AFC6DBB935634AA95FF1FC740725
+418AD8CC40170F2902F168EF3B17026C813B6380DA4FC0CB58E0BBC1053022B23391044091AFD51C6D9FA066A6BD4FBAB766463C9FA1D8861F01B856C669FCF0B038A1D5C512DFC3AD142D3636B7A1DE9AF44B088E2C10D8F03965106DD0C1978575AB29
+B109B713
+DB19089A0F4B808C9F9F1BA41463
+88D15056D17A75D851C0279476FC1B870BF5F10129227A3FBED6211E30580E6367CC4DDC6FD12B7754A37B2B5A59F40D3F51D0D9B452336080FFD25AB025F8ABDFE429DDCB573DA55E5E56C1CD1AD6E26A643E42A9B5EF0576958E78DA72340CED62CCA2B3803FE1457B9AC6B65191DC0F691C34C7B7C8C0CBE75F50D094
+6E9B
+3BE5CC
+AE8003D2
+C507D3C39D238DD26605AD9E0E
+1972EBF28B08374BA90C4E14CC2F4C03D305A4A1ADF27952DF6B7C2D2A8C46EB8EE143C86FD5933C16D77CBCBFAAA9901BFF9232B3F91A2EFEF2ACA29F3CAC88F8C4142AEAAEA92E5EACBFADD190BBFD345A8DE011C18954
+E3C491BC
+98D72BF5EBE9D6EA214CE02983
+116E19A1AF45B55DFF8F8BF6D5E788ABFEE63DC9A480E9139B971D53CE6C520DEBEBDB29775A1B975E409499A7FA85746BE7B0CAAE16E739D84E51E92166AE2C1E7C7A4BF36892B3F7E2EC4C7A4161E4A99C
+F3BB3428
+720750476F08879E8C65844638B9
+EC5214EB326966229EAD150AC5F99E92E7B536FFC1FC91C11C4DD09BB9E24B168009CA93DE69E265DE067B6F590A0A8D43D697885793B0F2BA824727DAAA5E83ED15D9AFC10557023B9F50D5A89054AD7C31486378C449B0FE52C6B7CE36E35A4A9C9FF86F6D2EDAE840B2F4E23A
+C96CEFBC
+7AA6AF14E1A7751E2CD821F125
+DD9B4396492D1A44EDC7F9E9155D8DF8D07A6DAFDB628B710A8D58154E9E523BB8A22889F1846D8561E9271EEAFA3526B3B0C37B025C1E890375C11405E64F4ECB455426DE1BB1EE375787DACD4DA6314E0CF26B1CEA6DC2B2
+3B081A08
+EE16DE29854EC53AD41D68B15F
+2B74914B6D733400C79F8A3F3E3AB72073D5265485BB9ADCE0DC6E4F403C03CD7FC24CAA1D535C61C7BFF57C066245881ED732A25694762140FADD0D476A9A1F4F8529B3CC5E4F329C9F7E8200F24D362D60AEF32753E68AC4F3D1E7
+8FE881C7
+D5CB62729F58D1EA8261508B1E19
+EAFA4C67F1425A7E1DAF6FADA334B9CE9AC3070CEC6605C87017CA1F2668ED9141258215410484EFE9F3ED9C2CA94D94D9A0C340BEE3971B50D884CF9092EC556F18C50721BE3A456F6F4DB76F6925334A377980EEBA6449FD3790FF914112BE8BCB93C986ABA247E4C4ADA92EE3C08FFB0CF443683A3C3687AD823F3949
+5B2F
+12E2799D1A2AB36EA405DFAD87CCC9F4CE3588815A5664F1562EE6C2CA8CF7B4720E5D0ADEC76D58C9D356967E502B
+2CE7DAC2
+5EAF61CAFE55BE2B1497D4CBBDF2
+276A4F747586004F1716D7220EA44CE408B787D8D29F528DA03831AF743F17A683A465297D6A95F2CCE9D562E2396B2977424C7B55E613C7522BF6F9077ED3073F89153B5AFCC6A55CFFF9BA412D52DFD46C6CC644D85A3AE9D0B19718FCB2D8F5AF0547143713CF6BBD5AB0B3
+E6CD1AB7
+156DF72424A59A8B766019D131
+ED8B94E25330901AB894882DB758249576E85494ED649790A726BECCC12A75C614DA0C3DFD254C6C07068138BBC7747B2B6F3AF6C1BA96A15C89E6A9BD34E6B747B6AA570171100E1A067F4A04F93524
+9FA2DA39
+E73B5A052867C68C23AA33605FFF
+98C7D01148026EABED2757FBBFA1F9567E9284F4A928C6D24F771B38CB95A3530E7BB4A6EEC3481A3DAB65AA9A9EEB57CA071B9F8502056E58477B343D816D260DEA6829CBDECECDB1439B56EC5C549EAE00E589E98F11884B05453F0D498203E6402D8043A29248E8DC57185F0D1B3237962DEF470176630B5FEA580265
+B406
+5DB5F720A39C4868BDD24CE4081FD73741DA42D964796A8DD3392E114014E82FCA38D8
+697A43B5
+EE74A1B06388F58B0D0091B3AA
+B0710DC099706D9CB7701B171C47CB4DC8392581C2B6B748ED1A769E0B58EEC719E841672EDE987BCEAA97D1E7B3EB3379D474EB2140
+A7975459
+FAE2E18E71FFB5681B677EFF0576
+6E9640AD2B520ED855EEF211A443BEBEF664EF652BCF3F179E6DC26689E79210B0CAD4053BB5BFEF040E2A53E8BCA9B03B22F8ED5AFA995E0FA2907C5B12022F83356AFE150528E4292711A90A0E7DA90F1FC5BB092ED058320416E05A9B894C25D86480FB8F227CD675C9497A53C9F5C0AFB70F8250B7CDEA7210B46B75
+5EC8
+F9552E689E01C7920CFA4D228F73993BC2299263240251454F56234B19327D
+EFAE2AD8
+93570BD39DF4CAC50D885EE5DA52
+3977FB143E6A7E36DF9E917D8ACF41F3B53027023B278480061D079F154FFEFBFF70F431A8AAB85417CF178F06D568630709C97878DAFDE8DCFFAE17A3B9413A88DB4EDE043715B6995DDBDC380C0E83B173AE5E73DD4667689C743F8ACFC2567F3CF0F04199C074EA20C56A
+44BE05CB
+F828907889CACC0FE0A7C9320D
+907438DB836BEC2E50D2FB1C14F2FF78AD45DE2596D71395E62A5F63C2D37D7E4F3BB710AA88BC8444CE6D8F42D0E38E3C295704BACB4C474D850B5FF6DBE6474DED60C97DB1
+65E60481
+D8E2091FD37D6841276FE46DE52C
+C01A232CBA3E4AE1607E894FCFB31DDF143FEAA902198645290CED42DCC86F0E70D9E49127274441131B1F491A40D6BA83C109D185F9BFB668A9316E9F0EB70B47B1C4CB21854649B1D1E62C9B59180A35E92990783436E00B67D5888017ABB8E84E434E8E157C33CB727AC1D160A8E129D7D60CB8BB6D
+866C04BC
+A821D2BEB4F7769B3350435FFC
+F92A77796C481DF41855617FBD9933FEDFD41AB6FED150DE3395DB33172DCF652A6C9082EF79533A4341CB2527BC519D42B721BD1F1316413D78C6A9D9F3403C21196D8E36CC4BA45B34ED84CEE65DE6CF022B8E9BE5C8
+34217EC9
+09B08E6DB0702B73FA12C56D1365
+DA81125AB46D13EBA6EBCC817DD58652C642C4C9080DBA2D312BB47755B94532BF06C8AB73D778AD004E494E69AF42E1236E638C2BFC2EEBEE0A8B0835696F66BA842AB52363ED311814B12C7C45FAD8EA434CA40EF075560BECDEC0EC6DBF76099794117A1FCA7D3C8C34E737F60237B40AABB4B9D2E6F619933DB9
+52D2EA07
+8A5D96433D10925AE0C7FEEFA8
+41B22745DB0E44657AA65C9A2E5D3324BDCD5C341EEAFC4252EE77FFC23EA88AF8BCC40EB3AB457DCF045B782A37A61EC63431F04C446FE6D742A7C00CC723068F9C72760D
+F6225364
+8C013A3E686FE92CBD085676EA
+DB90FCF6694822CB456502CA150A361FD5997EDB826093D0B9DF5673CD3A6406B466586D64D0F5B00FDAC3B424CD44FFFEABBFB65B596DA2EB5CB2E1FE8674779926A63BEBDC4EB84437231EA8DB754D39E15405F1AB6074F360876459FCFB2CDDE6
+9B335FF2
+36696543C62D47B42FF0EA43B6
+3EEC52D3506DE1C879E5E74E1378B76037EFB46F0284C19E76019DD11F169DDF7B53DA720EDBDEEC29923DF9DF85C33DAE2D654A7E97566449B1E8B1583E6C6F8FB1E3B1881955DF2BF4583BD671BFE2FF7D91098B7E9C5710
+660E3DC7
+CD1693EE6BC6E351581AEDED6F24
+CFC1AC710B488E3D44393440A6D592408FC6953B8B2E346BA606903645B24C490243938758A0EBD6626FE8D6EC1BD170BEA15ABC63A013CBCBC1CE5BE4D168F69E32A1925422F82F6A63A3773C9B6086707471E8953C7C228FEE5625CAB21D677672B4D94FA45F58F261FF9C19679A81F726714C8F60B262CDAE7EE1881A
+5AB0
+B67CE2DF3F035ECDC90504914B9F
+C9C0C771
+EF0C44CE0FC8D072B98430C4611B
+33767D2973E880BF046C1452CE3B357DE6958038F17DDD83D2EF44162D6BFA7495D091A432E2114768EE174CBADBC6D424F2126AC2F50EF36A6480F5169BC05E1E8AFEDFA1247CAF9900EFED234BE53387B33E43AB3856DABFD7B56C6DD1F546A84005CE4CA0ACFC2D95CF37F4AF1C46C70E948DE63365737CE59ACA0C1E
+609F
+BB5DC95A9ECEB1662DC3268B727C931AA4A47F7542F500EB7B
+4F450BB5
+F377B18171343CA203CFBD7D5FC1
+3534168DA57B98FF4137CD775F7747CFE0E06B24F4E80BE7ACB0E157D046E71A2413855E7147619E81C920EC75076E1073680951520051A946D35F09468BEA89BDF71894FA82654DA9432D301F8BC2CE53D9AEC4E48E2699B8705ADC381D03DD48A157A9A1400B60E3729FF96650AA7422999C79BEB9A67637F2831D71D3
+E8EC
+7B516933
+BF2730FA3E04304373BAFA9CA1
+468929A07232E5CB54655B62F0E870AA1ABC93900BA0
+6BAA9BD3
+C7D7B1CE641E6CB4C133676A125C
+AE42E92D436D14A8
+A6E78C9B
+49F40608F8BDC6AC12F7EAD2336051F53DF30C132CA80F84F0343C8BB46EAC5CA5EF
+C166DFD52EBFE2C0A70ED13423FEE5420979BFF44E2848323F983724BB1F4255E1BDB085D12D
+FEDE7A806D10B1574F9CAD52B6F53B9D6BFACE2E74C58317E8326A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0046 put
+dup 3 /C0049 put
+dup 4 /C0052 put
+dup 5 /C0070 put
+dup 6 /C0078 put
+dup 7 /C0083 put
+dup 8 /C0099 put
+dup 9 /C0101 put
+dup 10 /C0102 put
+dup 11 /C0105 put
+dup 12 /C0110 put
+dup 13 /C0111 put
+dup 14 /C0112 put
+dup 15 /C0114 put
+dup 16 /C0115 put
+dup 17 /C0116 put
+dup 18 /C0117 put
+readonly def
+/FontBBox [0 -207 714 694] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C268425D9A4327DA39CB2DFD7488DC30A83BD6536
+5400151DAC104266BE4EBCAE
+4B08321016E28AB4C8
+D564DD37
+35505D841146976EDFB4BD729A
+2F49DCCD6B4ECE1DAC32EA5679613B7894EE61C72050B6DCA08334000C4A16
+680A3781
+2832EF2992B04206872A04965B
+DC89A31C159AF7876EFDE9C566C038C68F3700C676CF6C0A355B73E0D91F6B9800797107DF57C0102E29B3333E99D6A3ABEA7D4404EA3C1F37246A8C
+76B86EA3
+AE31E559BF3EDE8F6CDE73497A
+3B48229E41D2A19CB431FC70509621E4F35C13A3465D70DFAD019F6D512BDE6EE14E2AA9D7ECE836C960C05A2F580BD2E58E9590281D0CBEF193
+3B8F5440
+739F67D06852217A6FE60CD562DB
+316843A0F8A150F56117A49EF131AE85F32010C16B29F4FE2AA5F4811F24F233EE45B6594B8FAA3909681993A5E34C3E0D12FC12053AE4FB8F739E9A5F6974E510F71F22463E40693D64C047B703BBC8A7A486DFDD38C656F396B8CDB0CC8ED9EF3DDEFA
+CCCCEC8F
+6CD996ABCB775949AE7B9B6AFD
+4DBB80962CAA21ABBB8E263390C78DF6E3880EACCF2FB4053CD794C07E5A1439F4F1822AB2A0F353DEC423027E7C5665896C49F8BF690970A254155E93AAFC2B6E4AA4B76CE65F1EC7F33B4BC932DD14BE25AAF01A445FA4CB118A25B5A90F
+4BFC463C
+A6C554ADF0E48B79A5B8FBCDB3F5
+36F6EBDCAF7B0290F985627BD389297FE08B571E27831EDD31EE7079AAD7FE057B908FAD87501D527BDD07ABB4B85702A8CE3456F12745BA71F287A605C74C42C9F3457D754FFFBDD1E308C6B6659E1B384478DEBDB319C9C8D3C8D331A723FD99DE47D127A8638DE89E69B54B231391917168DFE6FBEDF53CCDFC8A67EF
+0B42
+CAD3061C
+4A1F175CC8A06EF1EEF820D2B1
+C9B1598B0DCD0CC1CC06476E687971CDFAFEECC5C76DD1BD85A0BCF25E4DC5660031BD9AB6858CDA1DEE2BCBE66BF455A74B1F9474DB65B4115535611638A039B80BAE4386F39754CC339F0B7154B0276398
+D1825AAA
+064A63B4644DD4EFAC31F8140B
+F306B6DBEFE1871E5E8C799C82E1C51CD65C1130386C6283C2F6BDE83CC5A161496654B3E646A4792A9173AEF23227EAC36F819F4EB8091C4858E05CCEB00BAB47F9618467E859446DC90A4BAAD36877E5E3751996C9B9151BC9E309
+4ACDAF57
+5E5DA78B7973C93B24994D21D9
+B4EAEAF8B63393FD858A23852C07DD58B6ADFB5FF9FD26581FDCCC99FC7EB85FA5B877406C89A04D2A8A34C07140D68A4C50EB9EAC6064F7FE0A2D4287CF2CC6392CF31D6052A1726BF9F16343C9E50A75DA3207290889A56A013C5BCE
+E6E65DDF
+FFF172B54BFB3DD9694C3FBC75
+583A79434084FAA0F85413F66EB3376E0A96FFD08BCD62B070DEA3F8C80B123A78DD8594FBBBFEC9518714C8BF6C18AA42CB9E82D4DBA15595E96E6F635C5E0FC7D3140854807BB2D43489A6E515
+491A5CFE
+BC8780EE34CBA548F8A52B5B1598
+D198A1A9153CE89BE19ED7CA13228E4689A3DDD965075677C4155318ECCE58F6F511B0F58D88418F638CECEF0B0A301AC54BD5FE8B0BC27656D05B4986880E22CE4107A14265BEBF48FEE7300D359B336A93298F9416C6B71CAC98184998EC31530E475E42E602
+2FAE9ECF
+5BF46879E304947AD2171BAF72
+5B98274CB1F972D1AFAAC69024636815B780CC213E07108E7844FA96C75F4180EE4B8CEA450548E46FFACAAF53000AE9CC2AABF80A3C5B5C524FE57033E39F37F86442856278
+3A6759FC
+A1A313B64B4DAE01219996AD4984
+EAAB559FA3F1B1CB9755BAAA5729851D7D11CAC03D5301BE0DDA1DB7D33DC9E960576375E38192B00B8E7AFFDDFA20EBBBDC8B58E2FCF37B9A380E23631B70A1975FB78247EAA06877296BBAE4964D4E269E8778DDBF86F2A4F8E77BAF4FF9ABAB473DA127CD5D939226F8CF5E2710337B
+7FF4A3E4
+0D83472C47C1F51F6EBD000C1F
+8359A11D15723C44A5FB25677860602E110D6BA694038175CD2C91D4ECCFBDA28E7C3E417366AE10E0668B95E52574E81C64586EB2E57BDC02B21E4E6E30DCBDC9969AB4F35C4CD571F8713D9B7B95829F0B69607E5227270C
+31A0F4C1
+1E3834BF5F204565D07985D710E0
+C35F5B50676AEC0CABD666380CA4C63AB2A40741C78C362C5EE61BF5502396A07027388EC36175F6B8CD7AA0574E72AD5AFA293C0BEABEC96BDCD42B3615CBB768A07C6DCB1639F34CACF71EBF75D2C71D82139B03120B2808C393C3F227CCBD9AD84EFB2ACCA7B3EBD04430DFD3A2ACFFB167C943F425CEA4
+8114590D
+03150C872B1B8486C775A4130B
+81E97C2A39D4965C59EF24C2EA49001BAF5A6D42F4E42071EE7EE6F567FF3A461427C9819E20E55C7B79E7C06337E5FFB63F8486E8F8A84E52C3DCAAF654C6CF4BFCAD0F
+29433ED3
+3A69958583E048001FC2C8C582
+E13D3963DC178FED6AC98005B9B42A8010648E5405A0AD1DFBC13255B1D5320597AB2E508CB1F897BE6B33F956B82B060443DA088A2D17DAB38F1A17F93F575DF4EBAA3021BFE3AD87773E35625DB1219759A87E32B0A199386EF5
+4B45DA3D
+AC6E3F39DDC3E86DB49F5BE5E43D
+9E9731AA509F3EFF
+AA1DAF46
+031927C881C0F23BD92FB5D2AC8386FA2E208C424564CD90527F9F60EE4B6B3EC378
+B10EC2C53F879EEEAE758BCC7A850821C5D67E5978C53161C70DA5A1FB710E1602E562B0AB84
+A88B5585D4307822E5194D0D75DD4B78D689F6FC98BAE1D558A9F1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+dup 2 /C0083 put
+readonly def
+/FontBBox [50 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684275DD89A8790EAD18EFC77D3FFAE84DA5D
+312074C4D542DD5BEC70968F75DC
+250C3954E8DFB8F4857BFEF092EBA49D248955A858C5A5F55F7B987EA06EC8428D939084C88F5B157D80AB2D706A7EB936C3429173588D2ABA6A27DC94C0B484F316663555797004CBFA79E7B8545C810BF9CA92F61ABD9E202ED9E95943DF7A5ABBF3C20BDE3B6EEC9C0B95A4C9C1D38AA7C6786ADBBB79EE183BDDF194
+1953
+6449DBB7AE47E9FC6F3ABF1DCD7A1E274E87DAE9
+A22737FA
+6404B215A27BFAF6D0B50E94D2
+07123A5BB380C86DB5033EE743181BBFCC0356571F7297A207C23F1E588257FDEF5DF229
+CABF3B3C
+9E0988C63B358ACA4B4FEB033DFB
+E2E387A06A23CACA
+8E104B90
+DFDBD41F063E8A8DFA0ABA4DD7443015526AE5255315597779E04D85849305EA4F31
+5CDAD06E5841E1B8074760C99702B8CF443D752174D996C94E690797A9587CF5017DEB11E5FE
+02576E9E08B39688BBE99A186AA8FC7E222F5E52B29A7FDF379EF5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/sym:clas12 12.00 /PSOsymclas newFont def
+/wst:dutch14b 14.00 /PSOwstdutchb newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<121b28251b261c09010a010b1b23191e22172620011c242601111b172729261f231d01121b282b2426200113> 2207 558 0 7384 -1 s
+<1b261c2426221723191b> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0708> 9346 13300 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13280 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13280 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13280 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13280 3 7133 32 s
+wst:dutch14b SF
+<070908110b0d0c> 1271 1458 0 2055 -1 s
+<00030402000609110e090f0a0005> 2055 1458 3 3510 0 s
+<1211120f0910> 3506 1458 0 4189 -1 s
+wst:dutch12 SF
+<151e1b> 1271 2086 0 1631 -1 s
+<00231b28251b261c00181b23191e22172620001f2700181b1924221f231d002a1b262d002117261d1b04000f23001c17192802001f28001f2700172122242728002117261d1b001b2324291d1e00282400181b> 1631 2086 15 8893 0 s
+<002923281b23> 8893 2086 1 9461 0 s
+<2e> 9461 2086 0 9531 -1 s
+<1718211b> 1271 2330 0 1652 -1 s
+<0003001f2800191b2628171f23212d001725251b172627001a172923281f231d0028240017232d24231b002b1f271e1f231d0028240025242628001f2800282400231b2b> 1652 2330 13 7624 0 s
+<00252117281c242622270400142402002923211b2727> 7624 2330 3 9531 0 s
+<242a1b262b1e1b21221f231d> 1271 2575 0 2542 -1 s
+<00261b27252423271b001f2700261b191b1f2a1b1a001f230027292525242628> 2542 2575 5 5365 0 s
+<00241c00281e1b001c242121242b1f231d00281b27280027291f281b270200261b2a1f271f242300060405002b1f212100181b> 5365 2575 9 9531 0 s
+<281e1b> 1271 2820 0 1561 -1 s
+<002117272800261b211b17271b00241c00231b28251b261c002b1f281e00281e1b001c242121242b1f231d00281b27282709> 1561 2820 8 5763 0 s
+sym:clas12 SF
+<02> 1271 3167 0 1359 -1 s
+wst:dutch12 SF
+<16231f2c000c2422171f2300142419201b2827> 1589 3167 2 3567 0 s
+sym:clas12 SF
+<02> 1271 3513 0 1359 -1 s
+wst:dutch12 SF
+<0e13000e1f13130f0010100a> 1589 3513 2 3001 0 s
+<0d> 1271 3860 0 1402 -1 s
+<2926281e1b260200281e1b001c242121242b1f231d0017261b001721272400221f211a212d0029231a1b2600192423271f1a1b2617281f2423001c242600261b22242a1721001f2300281e1b001c292829261b09> 1394 3860 12 8834 0 s
+sym:clas12 SF
+<02> 1271 4206 0 1359 -1 s
+wst:dutch12 SF
+<0d> 1589 4206 0 1720 -1 s
+<24261b000a> 1712 4206 1 2230 0 s
+<1511000a130f> 2210 4206 1 2975 0 s
+<0a> 1271 4553 0 1434 -1 s
+<001d24241a002b172d00282400271e242b00242a1b262b1e1b21221f231d0027292525242628001c24260017232d00241c00281e1b> 1434 4553 10 6384 0 s
+<00281b27280027291f281b2700211f27281b1a001718242a1b002b2429211a00181b002824> 6384 4553 7 9531 0 s
+<272918221f28> 1271 4798 0 1882 -1 s
+<00261b27292128270029271f231d00281e24271b0027291f281b2700282400281e1b00231b28251b261c00261b2729212827001a1728171817271b04> 1882 4798 9 7001 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Page: (35) 35
+%%PageResources: (atend)
+%%PageProcessColors: (atend)
+%%PageCustomColors: (atend)
+%%BeginPageSetup
+bop
+%Defining font PSOwstdutch
+%!FontType1-1.0: PSOwstdutch
+10 dict begin
+/FontName /PSOwstdutch def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0034 put
+dup 3 /C0036 put
+dup 4 /C0040 put
+dup 5 /C0041 put
+dup 6 /C0044 put
+dup 7 /C0045 put
+dup 8 /C0046 put
+dup 9 /C0049 put
+dup 10 /C0050 put
+dup 11 /C0051 put
+dup 12 /C0053 put
+dup 13 /C0058 put
+dup 14 /C0059 put
+dup 15 /C0065 put
+dup 16 /C0066 put
+dup 17 /C0068 put
+dup 18 /C0069 put
+dup 19 /C0070 put
+dup 20 /C0073 put
+dup 21 /C0077 put
+dup 22 /C0078 put
+dup 23 /C0079 put
+dup 24 /C0080 put
+dup 25 /C0083 put
+dup 26 /C0084 put
+dup 27 /C0085 put
+dup 28 /C0089 put
+dup 29 /C0097 put
+dup 30 /C0098 put
+dup 31 /C0099 put
+dup 32 /C0100 put
+dup 33 /C0101 put
+dup 34 /C0102 put
+dup 35 /C0103 put
+dup 36 /C0104 put
+dup 37 /C0105 put
+dup 38 /C0107 put
+dup 39 /C0108 put
+dup 40 /C0109 put
+dup 41 /C0110 put
+dup 42 /C0111 put
+dup 43 /C0112 put
+dup 44 /C0113 put
+dup 45 /C0114 put
+dup 46 /C0115 put
+dup 47 /C0116 put
+dup 48 /C0117 put
+dup 49 /C0118 put
+dup 50 /C0119 put
+dup 51 /C0120 put
+dup 52 /C0121 put
+dup 53 /C0127 put
+dup 54 /C0262 put
+readonly def
+/FontBBox [-25 -256 920 766] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C26842192FA8DE8926C9A5E7B70CD3387DC965ED3
+80DE5496E8CDADD459C9885E
+7F6A0CAD41BF0F8AF1
+6074E51A
+AD53F15B5A08F66F3EB729796ADF
+C7E958E483684D19788095B6BD8E53B909A6914E1A75A165232666D4B51EBEDBC793630C75EE310100F2DA622ACB36C07BAD9A6A67AF796AD1377B57C6C25C761910271EA51B0E4C5533A7CD0ACE4AF699B940769661A7B24692A217C17376AE01E9313B898C16
+410137E3
+269C6B7C8EE76F95F9A6A930E838
+72D8BFACAEAD728A819C659F159819B873B6C4C46E489EAA54A650DDCEB193529695DE801934C02C3823B8AECEB751F0A933CFDC02D14BA5CDCA9E7035445BEF74766235BB3232521CC2CC07E7F7DBD738E1B586B4C90F50CC6E04129F27A31C859DC898F0C60A6E84C4D2946A5B275F05C7351EE2D295A16BD0788A4743
+FF2B
+FD3DB9F8C8656BAB3ECF236B
+DF6ABB29
+67CE93AEAA857114B2D4677A6D
+2AED7340FED5A11EEF13B80D9085FCAA9E876D273EF6665E07279240838FAA17F46A7063D8A1AF55123A7BA41D4698FB9E77BB0E3B1A02CFD22BF223248508D0
+8ACF49C0
+14494AB813A2FD06D2C5714622
+E75955FF9B63C89BADC0B9C43B6466A810143FD1C8F61983603755258329F6783EB3017BCA3CDBDFFD02C7BD57FB5EDE3A34788026C2022D2FFD7BC2A55791
+59773910
+850189AB3CB327C7CF5DE7E5A6
+7D422015B4B4DC54C6CEF7A3342D44CBB81BEEDB225EFEE63684E68CEE9E79D70A4B50683B2A07850D02AF226A815B4FFDAAE50A21D6B6C5E3
+4BEC2466
+EFE584D345FF085F9A89E3BED6
+25BB7CE4C2C05F00FDE3AFAFC353592640990F8451DB02
+A3EA22E1
+86F22208A4A9F7D447C622B160
+945F93BAAFAFCD8CB7F106C06F5AA1FE3F203F2E13C097482C27D17C141A08
+D4205E39
+DEDBA47430AD743A30A894F1EB
+AEAC18CB95E1D9B0EB1C6902CECC7CD89AA6238FD8AA9024CEF7F890A4C3FE81189790FBE1AA01FA228081E91714E473A821465C5D81E94E4D09A0AEDDA228
+3C0819ED
+07143B066BC8861F9BD7DAFE7A
+A2AAF8B3B09FE3A9301D9A09282BBC62781C72D4E73BAE1CB300F2AB52F9F5B3D0163F4039A50E1B692F009E8E427D3E67008B3F0A2F7D077D096A877184E9F1964CC0B80338D1D279CD77BE02FE52F90307DFDB15B199011906
+2F9C73DA
+D18D7112BB0B9FF6F91C8C88BD1E
+7273E1A48CDD042B2B87E1FC483126ADB6D11B82CF59785E1B9A6CAE1C8F78B386A1F103B9E99B0F11303ABBA424C8AE132206AF8637C456EC35AC8DBD3C1131D9DCF824A4B127BA7B4877A5FF5B7AA20D3B33A5189A10ACCEE7F2533CD0F6E31484E636E1F09A2ABF9BA9E1A915C3
+4430CCF2
+C8720D5BEA52AD368AFB09D2A8
+E94D0ADB8749A2EBC4541DB88EB241CAA29BD7F3A57CE582EC7D840F89B631A2D64EA99DB90BB30244AC2DF25C9096C366B941183222809A263630A81639C1938A1DB0659C4EF8BA73E381D10F27DB822958309BD90A7F17EB73C52F6B072DF31D
+A9E61A2E
+ED944AF624AA8CCFC82869148D
+BAC1EA484F648682D24D187294DA73876198CDCDCF520D0BBDABB88283EA9DAE482ADF1265515720D356A79E1545EA9A2F42D201B901
+62E1B5BB
+0F4587975A5BBE21F72AACF2D3
+3AB5D9FEB3DBA51DD0DF22C72E7AEDF4240DAEB1F667334181C479AE33834EDBA7D2F8A4DAA764F993A7A7583148904F4842523C94490CBA8895B2B4F6F09D8419A39B6D07F39CB9A4395CFA99C9137A
+AC0190D7
+6A19302CCB406BF3209D7561B43F
+3859F3829F2700584D1554F6AB94AD677421E0BE0AED032715CA26D291C91A32D00A1BF8D202D665290B75E0C3F1941A221C8BA569460F8944763CD697F52A512B8C9374014DB918D5B12745AA422261BEFE20F5DC5784794ABBD7067250DD75B8405C694CD2FBE15EDF8927B078FFAC7066A3
+D662A728
+08D5D4E5D0959021E2F9F7024C75
+B312709B80B7E8B968EB83F113661AE84BC86F24676F509CC341890E66AB066492E40B697D4E13CECF76F2F073B486E87D459CB0AFE72936862A48FAE9F0A17CF610F7F8B19AC04C11A17B3C3619DDF2DF2051F4C5FEE823393DA2E24764A6F3D79731C8329C0FC3E0D7D09607C53AEA7EA315879F2E99D0E11223808728
+D2BB
+29
+E508A25D
+01F54024350694944989A02570
+51C547167A78593EDC1FF27AF97861073E62B0257A354E5CB10444D3160CA72129A3D4EF87FF61E70493C90934381C89BEF3898250B73756695CC0E8D875A0B3E1622A9B6FDBC706558C76AF3A98586A8FE7B7387761F9DEF128BB96E04DD66355D656
+7FEB5F51
+3D797958AB103BEF3A31FB261682
+CFE36CAE5A1A6AC3EBAA62EFD3BB0ACDC0220D5926A286DCD370B19CBD79FC1DEA52C8B1C6025294E735BC682811595047C5C7D8796A7CA3B1A291E8AC9E37FD04396146EBDEB1AD0A61B256F681DA5A88D8E817822C37294070BB57E448E38835B47EC86FE4820291DF49054C00579B188C98121DDF1872E78189D9A34E
+CC37A0E8
+0A9DA5F95CD5AF5ABA361965E187
+6B223B74FD83B134DE98D6D31D8DBB595B2D8FD149434673894A333DE5DDA8E0E432F9EDBEE766BE2D16E8486766154921CAE004622EE856BFCBEB332B16FA14C58181923344D19BA1DA934A43A1774114D068E7B17B22BEB064248C14856632BD6C0A4CBB2B61D18D
+E46F52E7
+7D6B2610C21E7C50A26E95576C
+7F7A2A25258AB3A888F4D15CC00969D8FFA7A3A37424E7545A19208C7E79ABE20AC8699BF74CF788C9DE71D98CE13AC8D11A189831C518F0BA97E0
+FE3F00CC
+5C7B5D57027EE0170E183D30681A
+1387AD17F24807E8C1718F31BA1A0705826D0F823F77BE7AAABC3A8F02173795A061CBCA398FAA1DB4891C643B3430D0677AED0E1F02B6DFF8BC2956DE075377A6FBCEC85FA6CEAC3E1357AEC49C542D4E08AC7B3FE9E63400714EC1A7E371A506C08545F2CEFE9C7B3705BDCB16A7
+9C0B1C89
+928929ACA34B522CF0C6D5F9A8
+BB59A81352C053A5819FF7D03C6B65A862B39D8BE79FB95D22F07DAB7138916E513CCB8E33E9E63F306DE54C7C5B3C4497A47A0C6C63F4E8F07AE76796DC1716EC04F43C060527CB76AFFD306E1C9986159574F9FCDEF1107172A790
+D5F18DBD
+591A755321ECBC290BDCB63267
+A9A7701D64F9749A0464CE019097425D6498EF12D6D1B22B68435C4F4552A6059914E98E773142907BF1CF06C6FB67CB6437ACB37FBBFB3D224E7A4519623675F73EBCBF96FF4F0BF98445D87664A58EDD0968
+F768DD87
+056D5C62059E81D80D32A3BD98C5
+361B6622C17C082B52E05A1F1DB6A6CF0F82A7C63CA6465426C82FF8FC795122DA838F336508C7327F6DD9675F7A900414994C1D1E536F501766BB4971F3DF4D1FF9F69385D0ED4A4F0492E671AF41C536BEFED4B78A43B1278D8F3DBDD31216FC290019202E418B19BC
+AD089E9D
+10D303D0C11541C2CC4BD8C13852
+D265FBCEA3AED2A0BB03382662D6F898AE1C0C9BCF71D715FA86408CA0F9A7B5623DF676B9E10480B98E84D0B803FC44147FBDC47A585F19F47EA53E6E9F7A9F56ACA884EB18142B6403875908F277D9652F9DA5F56E15B272F02E5625C5E6FF5FD82FE4D2C34CDC81E44CAC97843059F49B65BD9F89232412F772A8751A
+54B6
+A7B73E
+16DAEA55
+2F0816C68856225FEB4332B860
+6F8473AA2E53EEC1D16FA2DB6FC81553EE833DCA527807A6AD3A9F14F4A4F16FC00822824B713F51B61F425886AB923885F588B0C1D5E8585AEBAD7DB018F9387E4974BC46697C1FA99E43AAB6DD5468FF
+61F50FA5
+DFB65E28F845E8330BE57CA2BB35
+988541C9C545952571041E014C509C277794EA1B4FBBF20446C4517279046EA9543DCCE23DBA0D9775BFA115DC6BF2FA17B4B4586D07A775BC686C7105F3B3970DFD90765AE34E696BB4752500DE0384A56F8DA85B9FFE07B33E40F09C7744E103057E67
+E58A3D5C
+BCA5BBA53AE8A7ABC904B89BD943
+B49ABF541C8EE1686EDAB1A76644E924390B82A952BC3FA85FD0BB5E1370FF31131C44EF57A61D318B84F906C2CF60439737DF5133ECE1786770CBCB52BA864C6BF0BA7916AE6DC390C9F5ED816C54ED070C343DF638B5B5E4E41CE34CC2E0402605115DAB535CBC52538AF39CCC09845E5096
+58D2EECE
+68DEA3E84B75A39BFC7A211127BD
+A0F71F4D43B55BBC435C4B12B8F00026779A20699395EB172B58FB131DC19E894078AF0F17AD8F531DE0FDA17C04F7D8E9932453574C74E75AF02DC7145FCAE9EC05DBB1CCF29CA684A9191BD3D8593708DB3D8CE6D83A4A69EF66705ACFA1647740AE05F6F8D7CCB48E8315A92EA34C52439AE58AD3F094B4DF290995BE
+C9ED
+396C1C
+648D3527
+E80857B14BF410DB36C6CD1111
+9603EE13228E25ECF3D1D5D2304D261AB95F016870EFCF3B595FC211BB291B9DD3394FD56586B3733B1D869AB23E38F5B8F6F86AB238EED48F0F11763CF284C9788E49766DE3740DFFA0DB66A30F75553069B3FE7CDC97F3
+EDE9A157
+EDD6752F809D7DC28A94854212
+C9219CAA40D028CA94ADE9781EA42010CB8EE691F1C29D9D6C9BEBEE1E528976BB0EF8EF884873EB12C37AE57AEFB70DBA384BAE6E92750E21DEFD562827D09E23D79FE0A24C8885161086F665FE8558769B
+E31893D4
+0A6D5FC3ECAE7DCF876EA9F1280C
+A84AA8CFAC6C507958A34C560354E0882E5A438C75E36E5227A62178FD12905B9974094BEB73581F94EF0E631C2EFE35B122A64BFBF128353D8E43E89A7F6F8CE8C25E6F332626BA36977C2E7FFEE1061456BAE7F5E27A11F09DEB595E89732C16822E8A823F6640BEE5AD0EFC6E
+AABF4B75
+2E3C9E3DD3D6511F01D6F6D4F4
+FC37AE9541A45BD1B34F7B62295E95D67FB66BC987AD6169368F121AC3B527CFFD6D5ED24A9CEF8B07538EAD5FD0DDDF6EFF49F1BC74E3423099D5B7D042C3D02738E1B5CCB0D050942442C156F22915E576317704B075D527
+48ADF1DB
+DBB11EC953CCD9BC61E413B344
+914CBF1163E60681D9DA80A29903863BF926B4EF39028D902B2F85D87C149691580A97CF4EF102216C6592626D47994E37EE3F434E0F4EFE6B2187ED1013974408336778CB7AF4F1656D627C1A978B84A3138B1F800FA4C62B6C43AC
+543816AB
+8E443E3FBAEE9718A243C622B160
+945F93BAFB6D02B29386AC8BADBF4189767899D9F620311DBC7A393CD36C7698795F6CB1FADB3F77071BF6002AEE04ADC8A9D858643CF47905F12C6004D6BBE70D31ED3FF6E803CAE8F0A4A8177173F1C96950D1CC6432093A3C9515DCA0994DBB8060A3CDCE4F53618131E959A2AC506A028BA2D7F420ED432137062956
+A420
+799A3F3BFA2E6B46C86DE9DA79A0B6A21AEA241F83B062DCFC28580BC8ED93BA7438C335322A55EDF8D615E10F8B4D
+A591E1EE
+07E5E2E99D5111D07782AC3A9319
+C5612F3D9DCE571A5DBD3520B0C83AD1CD38CF39E7803BE2EDD76C5DB323382B173E20C6D2A19BDFFF52742ADB8410EF81A2C1A94CF5D5234729078415F78D15303149F65E173ED84051A798C11559CFE4299633B3D39D954D29FD3A7DA160C9614E1EADEA70D778DEFD4CE094
+AD67A367
+4C963DA43D1DE8A30E769FA91A
+58C18B300938BB4A49E80A4008596F77AE39524B4CCC0E238165A6D560252434CF296E86F4F8C391034EFC66EBD1593EE82E6E6C122724F0662C7C2DA6E8B77A7EB718D1BDA94F3D300ABB8AAD3148B7
+E06EB8DE
+80AEBBC76190D9F37D3C0885C659
+DC3B91507D8406EB0AE39CB1AC26A46320E5AA3C2050E4E5E450306677D7784D204D6E224AB9DDAB27C6C058C27AD6C7CB570B76A37F5EA5E90125A1D13F7D3301325BF57255DEA5C42AE982F4DB1AE7F5A12EC5F04FBB20D9F9D7DF1036D0303DF853A1098831028A3F533180C11D777B01439E357C192ED1E5E38A11C0
+61A4
+75E28DFF9DAB9317A68B97DB109620638E68F75415B4CD453860C414D26AABECF5EAD9
+AD2E6124
+BDF5A16A85DF735C2AEA26EE8E
+974027A896C0B62B8355E9A1ABD687198CB1946D17EFEE353A0842211CF07643B2C79F641AC9B94B6E75B8CB6CCCD6238B35EFE683A7
+5C3CF381
+5E7375CE1CE8CAAE33624F3E9E69
+4D6D56496115936F5170C719D257BE63EA9EC0B1886DBBDDADE702FE0EFE887DB663B646AA24E483467A39A969D49CDD816BC3B9556A6E8B1E8CED03D30319B063E9C61055C7840D91B0A7AD3F8F202B9EBFA2CA83B508A83804FA1BD1BCDDAF76F4C53862E618D04754512E08B84A83220D17CB0F30222D4B9345A21E1C
+16AB
+78DE68C2206531599CBB7F35435E8490E38C40AECD3FE86C98CE59F8C4C59D
+224D7A37
+886EF84E142B6774B821504F45CA
+A0E02507A83EDC23066BA9405507A4653C3744B097A6DA72492F8B207220F4E4B23BF98B01B2C4C5489EE0C2D35EDC47565F6A535C0BD942CAE7EB5175B3C3102D057B05FF62EA157857672C071CE0DA6BC6839C3223B0651634F95595F0BF8E6D4885651153F0B2EDF7C81C
+D57A064C
+CABE0A8D6A265D5A282ED00D99
+3F9C24F63273FCA080381F14653B2852872B7AFCC3BB7449B8D11E619AED4710E195B101D52F1BF67DD1876C276EE93321EAD82D65DF24E1C3FA319D53BAD915C63C6F3B0A6A
+CE822885
+3BD0AB921D48803AFFB2DD974478
+86FE244E7AC9B7AA4770374456E1BE17A244F38FDA54BEA3E795375C1AE8479323F3AB983C8A91A9241EF117DB9FB8D479BAA95617CFAAC416920A3F647A395070F46CECB39CE2BD9D827ED8153FA1A5E25B95FC50F44C59675F36B16D9F4B3687F898DB104E914143A8F77D8DC399BB9BF25099AE679F
+FFAD6BB9
+F64FF8F89D5C8FD7D3B79FB32C71
+4816D0B12F7FB340C102347299FB60F6749043E3D0B2372B8D49E017FA0B33F206F5DB8822AC3DAD3654606E9C0D705E184CCE0BB3E6DA9257B7B77168EF834109546CDD00427434504466EA748C82BABA5822DA3DFF2EA218D0BBBC0B4A25BC3ABD6435835F49FF159B
+E94586CB
+9FA3E8B95614D6A3661CF27920
+6DF52D94914FE374C01CFC8B8AB304ACFAB9269AE7461A5E3931CAF0150DEF0D91BC52A63C6B85AF3A8FE6BE639C9ACD2A31880173815CC68365E799F1E591232EA0A0B7A1BF722FD6671D1CDAFD4E46DD1A3F7E04FA2D
+24CF8BC3
+B12CAEA137DE3B5E2A681A46E94A
+4BBB826EE5ADE4F69E8D1D9B3F94C1D92F4BB4FD201C20151D8ADF04209460E862FDF3D9846EFC28220F3B1676052DC38B208FB63DC404442AB863C1F556380C699697BF80115A83BE8C167B916E57E14CD6D85F1F3400F08064403C10123BFF7B80886E342CDD8D2DA149DA29F52FF7521E410293CA2218EE8A7454
+14F691C2
+510014F5D4031FB141A7743A09
+AFECA6DC2B8033E389333DA9F6C7A0EE83414748A8FB9D72F3CBAB2019BDE20981B93A60D46E313EB320E3C54EA3F9FEBB9EA48874F943810C2D600D6F67030182E0F14BC2
+12F17C59
+A802B6D578E26E01901EC954B8
+03C19DD466A6254E87EE1F48C8EB0F662C43274A00FF45A7BDB2F263261E8D91094599444A7B273D79E0A0113C350B2E46854830F38ADA973C3F62740FD6663CA57C9EE1760BAC8E52FE25B0BDD024AE61A4E8AD620109E127A0E699D2BE0483F8A7
+E0137EBD
+DC2FA98B79CB18878298C38155
+6B32D9C306253D126FBB30357647ED2A197C8322DBDFEB10B9B4412D935B42233DE1BE9C783311602068EDF86CDB725B8D29E92AA860D79A78662C02CBB80BBBF9D8807EC3AC0F695448011E93AEF388D95B877E1BF271441E
+6F9AAA0E
+49C2451BD2E97119C3A2B6E6CAA4
+CDA0371D3CE16B0D04B9A523E1B6F00D80B94BC7CA9854732C5B78301FAF0037054117A2E5DC198549E2EB34235D8B51487CDF261D8C6A76B41049E7AD00AD75A019875BF2AD5049C40CF0827F561A2A0B8BDDA3AF09CAF1B5224EE71B79A1C9EA59C0414E0B8105FF20D30702ED2DE13C09259BBD9DD128739EFFE1B2AB
+1CDD
+9B6DC4937F5A2F13BA6C04048E68
+9C8DD9BE
+D4BD20FBFE865FFEB07001D85E19
+50B7C532DD1EA037EAEC75B8134E3A8AC7DA207782FF3B90FD66B287F64B9E0D335FDCDFB1829109806CAC467A9B8A1B9D06D48761E88BA584D4D6F37BD55B4AEBC8A330F485E37C0FF8330ADE0E0600967B5237A10B608187DCF987C4F506B0F59997ECD9D6424A75018DBA7564A9A375BA9A11AFC0B0A9E8A83FD87979
+A5BB
+2AC1C5CD057C550DF00E057DE42A07A7B6F98228EFA7AEF603
+3D8CB5B7
+42692BC7E12FCE405FFA4CCFA549
+11ACD0FF687E0BFAE507060721DBAA4829B1F251688A8A55CEEEEED2D4811ED6F3A6B9B7700AF63B310AD91B5A9D5C269B16E562834649FCD2AF1CBD6F01FA3364790BBCEED864CBC2FD61CE6A1CE350FD0129B637C3DBE937CF9370B4AC379DDB4CC99174A63FBA3CC6AC301A62FA2146A246DDEC6F5B7105A0BE6705BD
+52B7
+E0F96E31
+F29F1F3BB6BD558F7F4B62DDE381
+2AA8D9488FA7F375553E1F781384CA1250928E5A1722E24B99E2F6FD84F82AE5AABC3598867CF973E91B0730733712086A4A0D5C4484EE62C2637F034ECD4938E087E1A0041DB88C3F09D0E8FBA875A403ACBCF42192A5D0394E03091D1073351E11E30D8B9980AFE6
+78761BC8
+5E7EC68B296C9DC4C494C0B30C
+2D821084D70EB1B375B8F20B275F4BEAAB9569F1D40C
+0C2C4432
+3BFE3FB87119EEFE8E15DF8A379C
+22193172B167DC5A
+3ABA3428
+CE743BF82F891D1D1F7DF913138A4EB3378E962EECDACECF27967CED957067FDDDBC
+C79AD6DB681BEC2FA5755C13A4F38612BC16434C5894A5A1801FB5A399682F67792533A472B3
+6129F4FA2ECEDC3CA19C9A99DE7A4560AF42679FBEA8CFE0ABE8CB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOwstdutchb
+%!FontType1-1.0: PSOwstdutchb
+10 dict begin
+/FontName /PSOwstdutchb def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0032 put
+dup 2 /C0037 put
+dup 3 /C0040 put
+dup 4 /C0041 put
+dup 5 /C0043 put
+dup 6 /C0045 put
+dup 7 /C0046 put
+dup 8 /C0047 put
+dup 9 /C0048 put
+dup 10 /C0049 put
+dup 11 /C0050 put
+dup 12 /C0051 put
+dup 13 /C0052 put
+dup 14 /C0053 put
+dup 15 /C0054 put
+dup 16 /C0056 put
+dup 17 /C0065 put
+dup 18 /C0066 put
+dup 19 /C0078 put
+dup 20 /C0080 put
+dup 21 /C0084 put
+dup 22 /C0097 put
+dup 23 /C0100 put
+dup 24 /C0101 put
+dup 25 /C0102 put
+dup 26 /C0105 put
+dup 27 /C0108 put
+dup 28 /C0110 put
+dup 29 /C0111 put
+dup 30 /C0112 put
+dup 31 /C0114 put
+dup 32 /C0115 put
+dup 33 /C0116 put
+dup 34 /C0118 put
+dup 35 /C0120 put
+readonly def
+/FontBBox [-18 -207 764 696] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684274B1821568DCA2EA47D261DDBD89B39A938
+20CF56E0D448A4BD79DA98E6
+5C015DD211D962A529
+48947FF0
+35E4C52FC29C24372BCF678DF44F
+20E71854CCEF80E34AC29C9A96F7378677269E299707A863180C0B254B63BD83A32E922005F5510E88FA75DF971BD03DEFBC7C416C37C8121D91DAC8F73C98EEEFDCB27DC32C79736FC0156782ECF7874649500F24BFFDE29AAE9EF340EB0D97E42253DAD3A0EECC1EBB6230DE1DD10BD78B6E641BCB9812941ED4F56C60
+2E5C
+2A8005CE5C9D21014EF58C5F4B94DE3A374EB90AE62FBC0606A4649C3F43ECBD94E71F036E851D54D5272EC589F3D24E4DD327FF3471C16EAE4D62EF46D4DC4112916DFF6C63CB1B69F9A4D89040C0B07AAC38455A25D90E1D8E3381F73856F2CDBD12F4D1
+BDC466BA
+3A84AF5E600A1332E44907573C
+2C7A684FB737EB8FF2ADA51CB14FB38D174185AA6DB43AFD1F00A33DC13B1137767EDAAD038264B134A42C5B0F82A70BD16CFE891570140526C79DDC90293C
+C7F5608F
+30B732B194BCB5DE5969C1D5C2
+AADF0E96A31863A7FC90A481EE5140956747A792F40205AD1C010084C0C4F5693D3FC72DCF19F7FE33E491B8B16F37B4139EF70680DA1C47C60AF8728F
+19711220
+C80145409CC41844118130F18B
+83D8AE0CA7A0460A99F0A7C0072386B3AC7C680FC1AA496DB674BA8B3FDC67AD5D65314438BFF8677C9ED2693679B5
+C97300B2
+2056B0A0B4C6CF198E3B0F301B
+2962F17E44F27029686C19D62C129C17A90B5CEC5F913E
+C4F04104
+65C3C0D31A23440A700391B201
+63EEB322EB00B651B31E02E5D25795679173D1C1171E53FF3064068FDF9836
+E8993B25
+40B169114F02758A1EF12E9489
+05E2D850A4253EAB6835F9FE65A9D5A87B112E27E8636B736838
+AFA6D5AD
+E8361D85B37AB6DB0854B314CB
+F25CBEF57AFE07680713008CD5C29D30D50685305A431C375173A2C7F8FD9919E99B040DC715EC1119AF198351531C181AF231B4E2F7D0DB6AC572E6E6B4F60E87112A8A0370CA2A4C00DD116E21D3
+E2BCF476
+06168FD7B810E046A71324819C
+E85AD51CDA6ADC818817A9E1A35A0498B05BC3630CD26B793F550D7E4EF72B901E80CBB7CE037B63CC4E28766143B45B8EB9EE004AC7B26390B37988
+6751669F
+20EDC4CF077B1E4D0733327021
+FB716289AD0210CA67AAF2AE10A021FBD27A27312542A9C40E2A17E4DFC85F3D03435E1D857C5A22B90E9A0237E7B4857C7CA462909D3265DC55E01D65B6396E22ECA942839CAE8057EEC8ED26EEA7E7827A2082
+976AA18C
+BCB47699430ED14AFCABB511D068
+C9183BC0984DB8E27112DDE85164AF7C443B5808811284DFF28402D24E7D9B9F619689CC5A4ED0330A010193F856F92C4D71D07B299DFA90E7A78A8C03D9A9F2BD77CD0247E68BD3B2CEC4881DF04D65E13F12E3FDE41EB2BC6DDFA95056EE1F5349C603283A31BE0E4F1E35A867B713E9822D
+BE2BA725
+6E644CF5C1AFC7DA94FFEE5B7F
+B9F34A319295BE7674A94264B36EA4B05C7999FADB2C68D206380FBBC5FC67FFA4D80095F7206EC514C9BB7BC8BA7D765A6F93A5577A1221067E
+8DDED60A
+ABBC2591DBF7E068C7E569A1AF
+7B997F72C064D899F76FF6E262747FB9028E166FDC39233666EB31C5EE24BC507849F05FD5A02B16EC9287AC7F1354C17B4DC278986F87BFE6220D04BE319E3B1C153854EFD7A765131FAC840CC44226F3CC6DBA3BE0
+F3A4EF4E
+46F49CA47A203446248130B571D1
+DE58FC6F84489C9BABDFA3304A35C12988C99DD11D7D2E249796B2A0692163E201B6BD8406400F0BF96C840C23D0ABC2D8867DE98FDF3ACC8BDF533466C964154A45B92407BB9E3EA68656C244A3A93F787C756C8A02E5F4620648BDBD632FE5CA986488
+8EA720DA
+3DF75D73024BCC6F2A30B9806C9E
+41A58AEF06CFF618D0135AA98B2AD5ED48BF4AC2981EB82EB6336D66A60A746336CA47F163D3C3E02291DF9DFD20B0C096E7D07F4707DB9B10889FC0A8C7D761FFBD49EDA77E70D4B4DA1031303A2B1D23FABD83A426B44A16B6EE0FEFA6D87D9E6EF701911F2F0D7B4EB8275FA44D42A542CC032A70AD71092A
+6607624A
+F786A85160F19BA13C38A26341AA
+5AC2DCE293096AF212CD373D351017F845B5EF867A4FD6B5957AC44FA1E5AEBE9C5DB2C9E531078A03B35C16737E9744E7471F4F1AB17087E5830BAED74AA360FE178E77DAF38C2889EE3E1D1A73DE298EFA629B47AC78EB6B184179DC1C0BAFC08AA993D2399215BD66D2
+0551297B
+F4DCF238870D8B2A7CD90DA8F409
+92ED9BCE8E86BC59278C2040866EB5F1340AA89ED92825106DB5732E89588652B4CCC4818B364F62465375E3DECEF5BD0521EA670ADB1D33E197D3D10AA0EAAAB49375053B59BC3C4C49897864C6AD03007FC7BD8A491BD89F65FDE1C9AF53160CAE89AE50816AE02A22F5F3454A62DF2C5828A1CBDF326C5D76
+30FED591
+82724F213B5FA68953EC402B6B
+D68E2A538B0E3771287A55B2801F9244CC8CAE302A8592210ABD05563BEF69AF7590EB6E3A70C746DE66401BA5C45215EDC89B4865D0A9278B90D5277F0D40E164D40FB107F80447EDC43C2D1FB097C58A587DF8A06B49CF9E49236E9D88D7
+5C517446
+FF9C7FD736A7322681F1DAB7A5A3
+2ADF28C10B09FAE3D5EAB9232089CCC8D745F4A159D1483FFA64A2D214D65EC8AC4E787C7012ECEB1A1C701F8A67EE25377601718DF14138E0BE283F424FC3F596BA469E0CEBBFE0247E33A62E7FAD905B88EF367004CFCA81CD6D33D74954CC84581F1D
+B9CA9BBC
+4B2EA57B67561BE855E80422F5
+B5B56F6DBEAAE762CA5DAFB08DB8B32AC32487E7653BC90AFEEE53401FFC341F6C4C80CAF6E0E1CE7FCEA0C634E2F040B0EBD5E753D10744983C330B92C4D1919B2BA481AF9EAA0AFE
+807BDDE3
+41488B22DD7614FFDCC69BBDACAB
+70E1FF20D741AA33611C3496BFE72ABF82D9AC4D3FD12790C7B2B30846DBFB0CEBA2C2AB92CA2E734F2A180F245EE9CC98029CDE7A384199323D8792099F4B65B18BC56EB07A49B6F73744C15D11744FB42EBC7AD37BA4888027941313D7B1FC0F6C053CD3B39C912AAB62124774B2DDA62A8CB895AA04725251928A96D4
+ADB5
+1313627E
+54E14632
+3C12C954565C7E66D90735A7F819
+0B6D9FD1311C23B62410B28E6EAAECEE40A19362722B5456DAC83D0D6BD79A8FA0B3844F0952A21EEA27F66E7D2D826FBC6DA29456B1D798994C238AE5FAAFECCB00E0F0252A7E4A0EC69FFDC28EEB19DA473C403657BA7D3F038315DC3F71C5FC89ED15FE7815F95D703C15
+CB933DA6
+C626C4A8F0E44446A0484F1768
+7D2F39001AF51A055542DB58936EB219910047824C91C5A9DD3E8B63F6F08FD35B074F0C74DF3BF9395A314AAB405C627B5A65EAC0B74A27FFCA64B12B3075CF617B76013F7A340D50E1187FBB141D1CC735D22CBF42CDFDE153D74C
+01D109B3
+0BBF19B187E3466A7CD744042B
+565746C2BB9CDE033473CF4C737AE618D625F0F9F91B00C93AF9F39F0B0850434786B330D9EBFDF8138BA56A55DEBD0D32F43E5585F432ED638E121F33230109970F249393C86609377319688958D622644967846B39503D328104A8B5
+8A8DD4D2
+2C7C1785BB0DE35B3972074E1C
+95F4A4B7CCB48A366BC3728F908BDB638320059C8C0931AAA3A971E413ADE9DDAF99D5BACBA3524E6265AB1A0EC17A92846E8B3643AD8B69DEDCDAB5C229A1EFB4FAC041CA564402C0D834DF84B2
+38011D41
+F1403E2043104B94E2616B55B1
+147525E3B9CEACE8C540D95470071B1C7D6E425E7B993E3C56003ABBA793882AAFF7B875E43E3154078F799026AAB795CF3D3CDD
+6A114F0E
+44D6FF9A54AEC3B0FC33242F0D9C
+C02F1BEDF26B3DB13CD943E89808A002567979855F5A34F0C5A909E2AF93FC1F9D3914224B819E504A0D794BD6085B81BB34A9A838E1E462575BF36AEF7CE16034B104DE3F638E04F2AE1AE957DC037A6B8E3DB28C90F676E586AF55BFFA0A55CF1D19C9542090
+209778A9
+BB3814E17BB384101FF5B44B01
+6B77A1183FC2D49D94D88CF9F095B10E991BF3A4BCA3280C9178057E9A5CFE3722AE51C3C2AC713A9673CA245696FB16AE80D5F3100FD02576E11513FEE4D2E4E61703BFA594
+FCF18535
+E6E1951CC69968D36772E46654E6
+4BC9B2F3CF24B2A5394AF3B215ED17785DA3028BF98AC8B6907CED663A83B6E650C2505D7F5420AAB9A55D054D2A7BCCB8B48A37142E7B7150F8CC766171CFD7FCFF076BEE5FE3E90927183AF4CF3CD9B08674211FB66550643A0442A687588009E80964833C522972C14C1EC538EF4005
+82657860
+61ADD7DAED8B14CD5D8B2CF2ED
+E51F8138897E61C12520D749C9FD8A7243BCA8B965238DB3E02156634FE2F8A8FCDFB4018CF5DFF8E0EB66E88D387C769CDC4A2052F2047754B596873592ABC87E7AC1392CE896CA36E6661179386D0EAB3758889390EB0482
+A1E00786
+B6AF852B4A4B760B32325A932A3B
+571361319EBE7D548857A5A3681A90749FD5695F3464D727A5908DFCFA0BE08435D79F30013FDA46D15E24993B683567CE64286853AB4FE39FF13C672F8E58D60BB12DF9188E33542A3D93744FF492D5BB9074793FFF5D1F64044F8E667E1BE485BC202AD322FA8890D8C86E44B8D779705EF935C211D0B5B0
+52EF9B64
+CB6CFE41DA8716E69408E4FB3F
+DA3303E61EFFFFF36BFE825373C81DFB7FC3B91263FA066978FFF9BDC6EE6B2A8AC29A6DD68504FAF59ABA4C88D4CD67550F4A9A491E12C40F97DD0728B758215DFF422D
+1647D79E
+91E0F645C8739F180D8B4B4675
+E598639F9248299E78C8C923B213BD7FE6BAC81D5F505D0F9711DF03560659DD4B2FC8E5F02AC79E45201974BF1B4B59B243498CD05E7981F35C7B7B0F0EC8BF06C00AFC08329E4BFF72C07FF12BA41362B140E4F2863197F76DC4F7
+CB8FF5D9
+A0E8EE8AD057906598B7EEAD5218
+376B67958A4A00C5E516EAC3782BA1A55B27567F817B8DFF9CE536295FFCF361F2D48FE9D653697AE1A2F5043D7E4C25095F7B068BDF701E25B6BC2D4F0CFC6C5DAF33BAFD1CF8D7F2C5A93D46BB9408B556E1E619596889CF5C7D0FA91E4215C5B14A5F6EFDDAD794C412B70B34C75697D412B42A2CCD0DBFF13679289F
+09E4
+4BECCEF5B37875C11A10FFD4797F0AAFCF44192BD332
+A47F0E04
+4882BB262EFB8C255A43DC533A57
+5B32E6A925C2E4A5
+437FA609
+D735CAF3ED36815A7B8E282A4337B71F1FE85348261ED03634896EFB118D2278EAC5
+F7D1E8667E599B00380C47A14E3302352B917545BD035912CEB922DAADBFD2475EF10A41C9D7
+53043C02AF9644F19581C1C6872ABACE6F5D9E9AAA8724D826243E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%Defining font PSOsymclas
+%!FontType1-1.0: PSOsymclas
+10 dict begin
+/FontName /PSOsymclas def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001000 0 0 0.001000 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 1 /C0069 put
+readonly def
+/FontBBox [106 45 775 713] readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A989B9974B0179FC6CC445BC7C8A959A39A32E9DCE7FAEF17EE3BEC9F
+50E1A6FCA651FC4B3769A0A91041557502E25A5D6180FE25A3D11BF079E1DF66E54EE9B7C229AF891739707A2A0EC140306B5E43E52B79BFB89E459E50
+6EC6F610A70775A31C460976C4F79449D86E57ACE491E5C6BF20CC4307B1DAF7630252
+E9AF8CFB69B50EDAE9D36A6104AFEF8832F920FD2346B2C7104CD11E3BEE999CFA9F5A
+49DB3173EE48D1C82994237F360407B022E0B4
+502E94EA8B493651EF2D03F0B513D655047568325B512AE6
+6AC6F53F3848CF70DE25481CC65D8B1A5793AA
+3C4282D111112BEE28AFCA7A3808D4444C4669CA
+84EAAAF989219F51AB3476A1B0B5F2246BC306E6
+625C6679C417ED2A8E9BD010DE37D40265074C2684268F16195489648993B9C4D3B534FA887C
+DEF605FA87B991F4D20A8F78DACE
+5A54C070E03D5C59D9D2D3E06B09CEE028D68B62AB3AEC43C1DD20BA70D288597D9BD8E06818FF764EBAB436723988E8D7CA59E16D39032516BFC5D552ACDEEC6BE938BEF2F43CFFBC811C3626C4DF5F8CF080676520B51C60CEDAD1FE6C92D1431C702174CE517A8FA9377D075A0B6833DAB101DB65397F1419EF5F0016
+004F
+6F0824F9657BB4F1C8F981709956865F6855EFAE
+9242AD55
+91BBBEE163D844DDA894E13190C9
+2480439E4C71CADA
+BD043A9B
+A315CAF72652AA7FE6DB2E84D82A6111CE4DE90C02DA0AFFE2620922262A45AB4ED0
+EEC9F4520DD12703442F7D028D4526BD8B771E09FBE11B2749E2D3906894E8D4BFD3F379F14C
+3C874F550606965E22FE487B247B5C2D06728490C8F2A3B588CDFC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/DPIx 1270 def /DPIy 1270 def
+72 DPIx div 72 DPIy div neg scale
+0 -13970 translate
+1.00 1.00 scale
+/wst:dutch12 12.00 /PSOwstdutch newFont def
+/wst:dutch12b 12.00 /PSOwstdutchb newFont def
+/wst:dutch14b 14.00 /PSOwstdutchb newFont def
+/wst:dutch10 10.00 /PSOwstdutch newFont def
+/wst:dutch14 14.00 /PSOwstdutch newFont def
+%%IncludeResource: font Helvetica
+/wst:helvps10 10.00 /Helvetica /wst:helvps ILEncoding 0 declareNFont def
+/sym:clas10 10.00 /PSOsymclas newFont def
+%%EndPageSetup
+GS
+0 13978 10801 13978 10801 0 0 0 clp
+wst:dutch14 SF
+0.00 0.00 0.00 1.00 setcmykcolor
+<16212f2b212d220d010f011021291f24281d2d2601222a2d0115211d2e302d2529230116212f322a2d260118> 2207 558 0 7384 -1 s
+<212d222a2d281d291f21> 7375 558 0 8593 -1 s
+wst:dutch10 SF
+<0b0c> 9346 13385 0 9522 -1 s
+wst:helvps10 SF
+<4e6574706572663a> 1322 13267 0 1949 -1 s
+<205265766973696f6e20322e313b20436f7079726967687420> 1949 13267 4 3868 32 s
+sym:clas10 SF
+<01> 3868 13267 0 4019 -1 s
+wst:helvps10 SF
+<2031393933b131393935204865776c657474b15061636b61726420436f6d70616e79> 4019 13267 3 7133 32 s
+wst:dutch14b SF
+<111e1e181c171a23> 1271 1458 0 2283 -1 s
+<0011> 2283 1458 1 2506 0 s
+<07001318211e181f19001d1c001315> 2515 1458 3 4175 0 s
+wst:dutch12 SF
+<16212f2b212d22> 1271 2086 0 1980 -1 s
+<00252e00292a2f002d3029002c30252f21002f2421002e1d2821002a2900161a001d2e00252f00252e00302920212d001b29253308001a24212e210020252222212d21291f212e002e2f212800222d2a28001d> 1980 2086 18 9531 0 s
+<042b212d1f212531212005> 1271 2330 0 2308 -1 s
+<00271d1f26002a22001f212d2f1d2529002e212d31251f212e002a22001b292533000700291d28212734002f2421002529212f2008001a242100271d1f26002a22002529212f20002e302b2b2a2d2f> 2308 2330 15 9531 0 s
+<28211d292e> 1271 2575 0 1852 -1 s
+<002f241d2f0029212f2e212d31212d0028302e2f001e21002d30290021332b27251f252f273400222a2d> 1852 2575 7 5358 0 s
+<00211d1f24002529312a1f1d2f252a29002a220029212f2b212d220800172921002e25282b27210028211f241d> 5358 2575 7 9461 0 s
+<36> 9461 2575 0 9531 -1 s
+<29252e28> 1271 2820 0 1700 -1 s
+<002f2a002e1d3121002f25282100252e002f2a00302e21002f24210035222a2d02002230291f2f252a291d27252f34002a22002f242100151907111719001f2a28281d2920002e242127270d> 1700 2820 14 8739 0 s
+<03> 1398 3167 0 1504 -1 s
+wst:dutch12b SF
+<00191d1f00021a001a1c00030a000b000c0007070700130400171d001c182120181f22181f00061e000a0b100f0e> 1504 3167 12 5506 0 s
+wst:dutch12 SF
+<3224251f24> 1271 3513 0 1797 -1 s
+<0032252727002d302900160029212f2e212d31212d2e002529002e301f1f212e2e252a2906002a2921001d222f212d002f2421002a2f24212d08001c> 1797 3513 11 6975 0 s
+<2a30001f1d29002f242129002d30290016002e301f1f212e2e253121> 6949 3513 5 9531 0 s
+<25292e2f1d291f212e> 1271 3758 0 2095 -1 s
+<002a220029212f2b212d22002a29002a2f24212d002e342e2f21282e001e21222a2d2100241d31252923002f2a002d21072d30290029212f2e212d31212d00281d29301d2727340800142200342a30001d2d21> 2095 3758 14 9531 0 s
+<302e252923> 1271 4003 0 1745 -1 s
+<002e1f2d252b2f2e0600342a3000281d340032252e24002f2a0025292f2d2a20301f21> 1745 4003 6 4711 0 s
+<002e2a2821002021271d342e001e212f322121290025292025312520301d27002529312a1f1d2f252a292e002a220029212f2b212d2208> 4711 4003 7 9531 0 s
+<12332b212d252821292f1d2f252a29> 1271 4248 0 2801 -1 s
+<00241d2e002e242a3229002f241d2f00161a00281d3400292a2f001e21001d1e2721002f2a0023212f002f2421002921332f0029212f2e212d31212d002d302929252923001e21222a2d21> 2801 4248 15 9531 0 s
+<2f2421> 1271 4493 0 1561 -1 s
+<002921332f0029212f2b212d22001f2a28212e001d272a292308000f002b1d302e21002a22002f322a002e211f2a29202e002a2d002e2a002e242a302720001e21002e302222251f2521292f08> 1561 4493 14 8481 0 s
+<1422> 1271 4839 0 1422 -1 s
+<00342a300032252e24002f2a002d3029001f2a291f302d2d21292f0025292e2f1d291f212e002a220029212f2b212d220600252f00252e0029211f212e2e1d2d34002f2a001f2a281e252921002f24210035222a2d02001d2920> 1422 4839 16 9531 0 s
+<352e2f1d2d2f02> 1271 5084 0 1874 -1 s
+<001f2a28281d29202e002a22002f242100151907111719001f2a28281d2920002e2421272708001729002f2421002e342e2f2128002d3029292529230029212f2e212d31212d00342a30> 1874 5084 12 9531 0 s
+<322a302720> 1271 5329 0 1820 -1 s
+<0021292f212d0e> 1820 5329 1 2407 0 s
+<03> 1398 5676 0 1504 -1 s
+wst:dutch12b SF
+<00191d1f00021a001a1c00030a0b100f0e000a0b100f0f00070707000a0b100f0e05130400171d002021161f21000812001c182120181f22181f00061e00021a> 1504 5676 13 7340 0 s
+wst:dutch12 SF
+<3224251f24> 1271 6022 0 1797 -1 s
+<0032252727002d30290016002b1d2d1d272721270025292e2f1d291f212e002a22002f24210029212f2e212d31212d0600211d1f2400321d252f252923001d2f002f2421252d002a3229002b2a2d2f002930281e212d08001a2421> 1797 6022 16 9531 0 s
+<2b2a2d2f> 1271 6267 0 1653 -1 s
+<002930281e212d2e00342a3000302e21001d2d2100302b002f2a00342a3006001e302f002f2421340028302e2f00281d2f1f24> 1653 6267 11 6441 0 s
+<002f242a2e2100342a3000302e21002529002f2421002529312a1f1d2f252a29002a22> 6441 6267 7 9531 0 s
+<29212f2b212d2208> 1271 6512 0 1986 -1 s
+<0013> 1986 6512 1 2153 0 s
+<2a2d0021331d282b27210600252200342a30001d272e2a00321d292f2120002f2a002d3029> 2145 6512 7 5371 0 s
+<0016002b1d2d1d272721270029212f2b212d222e00042b212d241d2b2e002f2a0028211d2e302d21001d23232d21> 5371 6512 7 9461 0 s
+<36> 9461 6512 0 9531 -1 s
+<231d2f2100272a2a2b1e1d1f26002b212d222a2d281d291f210500342a3000322a302720002133211f302f21002f242100222a27272a32252923002529001d292a2f24212d00151907111719001f2a28281d2920> 1271 6757 11 9531 0 s
+<2e242127270d> 1271 7002 0 1747 -1 s
+<03> 1398 7348 0 1504 -1 s
+wst:dutch12b SF
+<00191d1f00021a001a1c00030a0b100f0e000a0b100f0f00070707000a0b100f0e05130400171d002021161f21000812001c18211e181f1900061e00021a000006140009000622000900061b000b0d09> 1504 7348 20 8874 0 s
+wst:dutch12 SF
+<1d2920> 1271 7695 0 1608 -1 s
+<002f24212900281d29301d272734002f1d1e30271d2f21002f2421002d212e30272f2e0007001d222f212d001e21252923001f212d2f1d2529002f241d2f001d2727002f212e2f2e00222529252e242120001f272a2e212734002f2a> 1608 7695 15 9531 0 s
+<2a2921> 1271 7940 0 1608 -1 s
+<001d292a2f24212d08> 1608 7940 1 2422 0 s
+<162a2921> 1271 8286 0 1771 -1 s
+<002a22002f2421002e1f2d252b2f2e002b2d2a31252021200032252f240029212f2b212d2200241d3121001e212129002b2a2d2f2120002f2a00151907111719001f2a28281d292000222527212e00222a2d> 1771 8286 14 9531 0 s
+<2f2421> 1271 8531 0 1561 -1 s
+<000a0809002d2127211d2e2108000f2934001d2e2e252e2f1d291f21> 1561 8531 4 3911 0 s
+<00342a3000282523242f001e21001d1e2721002f2a002b2d2a31252021002529002f241d2f001d2d211d00322a302720001e2100232d211d2f2734001d2b2b2d21> 3911 8531 13 9461 0 s
+<36> 9461 8531 0 9531 -1 s
+<1f251d2f2120> 1271 8776 0 1817 -1 s
+<001e34002f2421001d302f242a2d2e08> 1817 8776 3 3211 0 s
+GR
+eop
+%%PageTrailer
+%%PageResources: font Helvetica
+%%PageProcessColors: Black
+%%PageCustomColors:
+%%Trailer
+Ileaf_6.0.0 /terminate get exec
+%%Pages: 35
+%%DocumentNeededResources: font Courier
+%%+ font Helvetica
+%%DocumentSuppliedResources:
+%%DocumentProcessColors: Black
+%%DocumentCustomColors:
+%%EOF
diff --git a/netperf-2.4.4/doc/netserver.man b/netperf-2.4.4/doc/netserver.man
new file mode 100644
index 0000000..8695c2b
--- /dev/null
+++ b/netperf-2.4.4/doc/netserver.man
@@ -0,0 +1,56 @@
+.TH netserver 1 ""
+.SH NAME
+
+netserver \- a network performance benchmark server
+
+.SH SYNOPSIS
+
+.B netserver
+[-P portnum]
+[-n numcpus]
+
+.SH DESCRIPTION
+.B Netserver
+listens for connections from a
+.C netperf
+benchmark, and responds accordingly.
+It can either be run from
+.C inetd
+or as a standalone daemon (with the -p flag). If run from
+.C inetd
+the -p option should not be used.
+
+.SS OPTIONS
+.TP
+.B \-h
+Display a usage string, and exit.
+.TP
+.B \-n numcpus
+Specify the number of CPU's in the system on those systems for which
+netperf has no way to find the number of CPU's programatically.
+.TP
+.B \-p portnum
+Listen on the specified port.
+This is used when running as a standalone daemon.
+
+.SH BUGS
+No known bugs at this time. If you think you have found a bug, please send email to Rick Jones <raj@cup.hp.com>.
+
+.SH SEE ALSO
+.C netperf
+.br
+.I
+Netperf: A Network Performance Benchmark
+.br
+http://www.netperf.org/
+
+.SH AUTHORS
+HP Information Networks Division - Networking Performance Team.
+.br
+Rick Jones <raj@cup.hp.com>
+.br
+Karen Choy HP IND
+.br
+Dave Shield <daves@csc.liv.ac.uk> (man pages)
+.br
+Others too numerous to mention here - see the ACKNWLDGMNTS file
diff --git a/netperf-2.4.4/doc/texinfo.tex b/netperf-2.4.4/doc/texinfo.tex
new file mode 100644
index 0000000..d5c8121
--- /dev/null
+++ b/netperf-2.4.4/doc/texinfo.tex
@@ -0,0 +1,6744 @@
+% texinfo.tex -- TeX macros to handle Texinfo files.
+%
+% Load plain if necessary, i.e., if running under initex.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2003-10-06.08}
+%
+% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+%
+% This texinfo.tex 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 2, or (at
+% your option) any later version.
+%
+% This texinfo.tex file 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 texinfo.tex file; see the file COPYING. If not, write
+% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+% Boston, MA 02111-1307, USA.
+%
+% In other words, you are welcome to use, share and improve this program.
+% You are forbidden to forbid anyone else to use, share and improve
+% what you give them. Help stamp out software-hoarding!
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+% ftp://ftp.gnu.org/gnu/texinfo/texinfo.tex
+% (and all GNU mirrors, see http://www.gnu.org/order/ftp.html)
+% ftp://tug.org/tex/texinfo.tex
+% (and all CTAN mirrors, see http://www.ctan.org),
+% and /home/gd/gnu/doc/texinfo.tex on the GNU machines.
+%
+% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
+%
+% The texinfo.tex in any given Texinfo distribution could well be out
+% of date, so if that's what you're using, please check.
+%
+% Send bug reports to bug-texinfo@gnu.org. Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem. Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution. For a simple
+% manual foo.texi, however, you can get away with this:
+% tex foo.texi
+% texindex foo.??
+% tex foo.texi
+% tex foo.texi
+% dvips foo.dvi -o # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+%
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent. You can get the existing language-specific files from the
+% full Texinfo distribution.
+
+\message{Loading texinfo [version \texinfoversion]:}
+
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}%
+ \catcode`+=\active \catcode`\_=\active}
+
+\message{Basics,}
+\chardef\other=12
+
+% We never want plain's \outer definition of \+ in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some plain tex macros whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexgtr=>
+\let\ptexhat=^
+\let\ptexi=\i
+\let\ptexindent=\indent
+\let\ptexnoindent=\noindent
+\let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexplus=+
+\let\ptexrbrace=\}
+\let\ptexslash=\/
+\let\ptexstar=\*
+\let\ptext=\t
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi
+\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeftypevar\undefined\gdef\putwordDeftypevar{Variable}\fi
+\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi
+\ifx\putwordDeftypefun\undefined\gdef\putwordDeftypefun{Function}\fi
+
+% In some macros, we cannot use the `\? notation---the left quote is
+% in some cases the escape char.
+\chardef\colonChar = `\:
+\chardef\commaChar = `\,
+\chardef\dotChar = `\.
+\chardef\equalChar = `\=
+\chardef\exclamChar= `\!
+\chardef\questChar = `\?
+\chardef\semiChar = `\;
+\chardef\spaceChar = `\ %
+\chardef\underChar = `\_
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+% True if #1 is the empty string, i.e., called like `\ifempty{}'.
+%
+\def\ifempty#1{\ifemptyx #1\emptymarkA\emptymarkB}%
+\def\ifemptyx#1#2\emptymarkB{\ifx #1\emptymarkA}%
+
+% Hyphenation fixes.
+\hyphenation{ap-pen-dix}
+\hyphenation{eshell}
+\hyphenation{mini-buf-fer mini-buf-fers}
+\hyphenation{time-stamp}
+\hyphenation{white-space}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\pagewidth \newdimen\pageheight
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal. We don't just call \tracingall here,
+% since that produces some useless output on the terminal. We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{%
+ \tracingstats2
+ \tracingpages1
+ \tracinglostchars2 % 2 gives us more in etex
+ \tracingparagraphs1
+ \tracingoutput1
+ \tracingmacros2
+ \tracingrestores1
+ \showboxbreadth\maxdimen \showboxdepth\maxdimen
+ \ifx\eTeXversion\undefined\else % etex gives us more logging
+ \tracingscantokens1
+ \tracingifs1
+ \tracinggroups1
+ \tracingnesting2
+ \tracingassigns1
+ \fi
+ \tracingcommands3 % 3 gives us more in etex
+ \errorcontextlines\maxdimen
+}%
+
+% add check for \lastpenalty to plain's definitions. If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+%
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+ \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+ \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+ \removelastskip\penalty-200\bigskip\fi\fi}
+
+% For @cropmarks command.
+% Do @cropmarks to get crop marks.
+%
+\newif\ifcropmarks
+\let\cropmarks = \cropmarkstrue
+%
+% Dimensions to add cropmarks at corners.
+% Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\cornerlong \cornerlong=1pc
+\newdimen\cornerthick \cornerthick=.3pt
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Main output routine.
+\chardef\PAGE = 255
+\output = {\onepageout{\pagecontents\PAGE}}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% \onepageout takes a vbox as an argument. Note that \pagecontents
+% does insertions, but you have to call it yourself.
+\def\onepageout#1{%
+ \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
+ %
+ \ifodd\pageno \advance\hoffset by \bindingoffset
+ \else \advance\hoffset by -\bindingoffset\fi
+ %
+ % Do this outside of the \shipout so @code etc. will be expanded in
+ % the headline as they should be, not taken literally (outputting ''code).
+ \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
+ \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
+ %
+ {%
+ % Have to do this stuff outside the \shipout because we want it to
+ % take effect in \write's, yet the group defined by the \vbox ends
+ % before the \shipout runs.
+ %
+ \escapechar = `\\ % use backslash in output files.
+ \indexdummies % don't expand commands in the output.
+ \normalturnoffactive % \ in index entries must not stay \, e.g., if
+ % the page break happens to be in the middle of an example.
+ \shipout\vbox{%
+ % Do this early so pdf references go to the beginning of the page.
+ \ifpdfmakepagedest \pdfmkdest{\the\pageno}\fi
+ %
+ \ifcropmarks \vbox to \outervsize\bgroup
+ \hsize = \outerhsize
+ \vskip-\topandbottommargin
+ \vtop to0pt{%
+ \line{\ewtop\hfil\ewtop}%
+ \nointerlineskip
+ \line{%
+ \vbox{\moveleft\cornerthick\nstop}%
+ \hfill
+ \vbox{\moveright\cornerthick\nstop}%
+ }%
+ \vss}%
+ \vskip\topandbottommargin
+ \line\bgroup
+ \hfil % center the page within the outer (page) hsize.
+ \ifodd\pageno\hskip\bindingoffset\fi
+ \vbox\bgroup
+ \fi
+ %
+ \unvbox\headlinebox
+ \pagebody{#1}%
+ \ifdim\ht\footlinebox > 0pt
+ % Only leave this space if the footline is nonempty.
+ % (We lessened \vsize for it in \oddfootingxxx.)
+ % The \baselineskip=24pt in plain's \makefootline has no effect.
+ \vskip 2\baselineskip
+ \unvbox\footlinebox
+ \fi
+ %
+ \ifcropmarks
+ \egroup % end of \vbox\bgroup
+ \hfil\egroup % end of (centering) \line\bgroup
+ \vskip\topandbottommargin plus1fill minus1fill
+ \boxmaxdepth = \cornerthick
+ \vbox to0pt{\vss
+ \line{%
+ \vbox{\moveleft\cornerthick\nsbot}%
+ \hfill
+ \vbox{\moveright\cornerthick\nsbot}%
+ }%
+ \nointerlineskip
+ \line{\ewbot\hfil\ewbot}%
+ }%
+ \egroup % \vbox from first cropmarks clause
+ \fi
+ }% end of \shipout\vbox
+ }% end of group with \normalturnoffactive
+ \advancepageno
+ \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+ \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1 \unvbox#1
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+% Here are the rules for the cropmarks. Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+ {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+ {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1. The argument is the rest of
+% the input line (except we remove a trailing comment). #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+%
+\def\parsearg#1{%
+ \let\next = #1%
+ \begingroup
+ \obeylines
+ \futurelet\temp\parseargx
+}
+
+% If the next token is an obeyed space (from an @example environment or
+% the like), remove it and recurse. Otherwise, we're done.
+\def\parseargx{%
+ % \obeyedspace is defined far below, after the definition of \sepspaces.
+ \ifx\obeyedspace\temp
+ \expandafter\parseargdiscardspace
+ \else
+ \expandafter\parseargline
+ \fi
+}
+
+% Remove a single space (as the delimiter token to the macro call).
+{\obeyspaces %
+ \gdef\parseargdiscardspace {\futurelet\temp\parseargx}}
+
+{\obeylines %
+ \gdef\parseargline#1^^M{%
+ \endgroup % End of the group started in \parsearg.
+ %
+ % First remove any @c comment, then any @comment.
+ % Result of each macro is put in \toks0.
+ \argremovec #1\c\relax %
+ \expandafter\argremovecomment \the\toks0 \comment\relax %
+ %
+ % Call the caller's macro, saved as \next in \parsearg.
+ \expandafter\next\expandafter{\the\toks0}%
+ }%
+}
+
+% Since all \c{,omment} does is throw away the argument, we can let TeX
+% do that for us. The \relax here is matched by the \relax in the call
+% in \parseargline; it could be more or less anything, its purpose is
+% just to delimit the argument to the \c.
+\def\argremovec#1\c#2\relax{\toks0 = {#1}}
+\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}}
+
+% \argremovec{,omment} might leave us with trailing spaces, though; e.g.,
+% @end itemize @c foo
+% will have two active spaces as part of the argument with the
+% `itemize'. Here we remove all active spaces from #1, and assign the
+% result to \toks0.
+%
+% This loses if there are any *other* active characters besides spaces
+% in the argument -- _ ^ +, for example -- since they get expanded.
+% Fortunately, Texinfo does not define any such commands. (If it ever
+% does, the catcode of the characters in questionwill have to be changed
+% here.) But this means we cannot call \removeactivespaces as part of
+% \argremovec{,omment}, since @c uses \parsearg, and thus the argument
+% that \parsearg gets might well have any character at all in it.
+%
+\def\removeactivespaces#1{%
+ \begingroup
+ \ignoreactivespaces
+ \edef\temp{#1}%
+ \global\toks0 = \expandafter{\temp}%
+ \endgroup
+}
+
+% Change the active space to expand to nothing.
+%
+\begingroup
+ \obeyspaces
+ \gdef\ignoreactivespaces{\obeyspaces\let =\empty}
+\endgroup
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+%% These are used to keep @begin/@end levels from running away
+%% Call \inENV within environments (after a \begingroup)
+\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
+\def\ENVcheck{%
+\ifENV\errmessage{Still within an environment; press RETURN to continue}
+\endgroup\fi} % This is not perfect, but it should reduce lossage
+
+% @begin foo is the same as @foo, for now.
+\newhelp\EMsimple{Press RETURN to continue.}
+
+\outer\def\begin{\parsearg\beginxxx}
+
+\def\beginxxx #1{%
+\expandafter\ifx\csname #1\endcsname\relax
+{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else
+\csname #1\endcsname\fi}
+
+% @end foo executes the definition of \Efoo.
+%
+\def\end{\parsearg\endxxx}
+\def\endxxx #1{%
+ \removeactivespaces{#1}%
+ \edef\endthing{\the\toks0}%
+ %
+ \expandafter\ifx\csname E\endthing\endcsname\relax
+ \expandafter\ifx\csname \endthing\endcsname\relax
+ % There's no \foo, i.e., no ``environment'' foo.
+ \errhelp = \EMsimple
+ \errmessage{Undefined command `@end \endthing'}%
+ \else
+ \unmatchedenderror\endthing
+ \fi
+ \else
+ % Everything's ok; the right environment has been started.
+ \csname E\endthing\endcsname
+ \fi
+}
+
+% There is an environment #1, but it hasn't been started. Give an error.
+%
+\def\unmatchedenderror#1{%
+ \errhelp = \EMsimple
+ \errmessage{This `@end #1' doesn't have a matching `@#1'}%
+}
+
+% Define the control sequence \E#1 to give an unmatched @end error.
+%
+\def\defineunmatchedend#1{%
+ \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}%
+}
+
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt\char64}}
+
+% This is turned off because it was never documented
+% and you can use @w{...} around a quote to suppress ligatures.
+%% Define @` and @' to be the same as ` and '
+%% but suppressing ligatures.
+%\def\`{{`}}
+%\def\'{{'}}
+
+% Used to generate quoted braces.
+\def\mylbrace {{\tt\char123}}
+\def\myrbrace {{\tt\char125}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+\begingroup
+ % Definitions to produce \{ and \} commands for indices,
+ % and @{ and @} for the aux file.
+ \catcode`\{ = \other \catcode`\} = \other
+ \catcode`\[ = 1 \catcode`\] = 2
+ \catcode`\! = 0 \catcode`\\ = \other
+ !gdef!lbracecmd[\{]%
+ !gdef!rbracecmd[\}]%
+ !gdef!lbraceatcmd[@{]%
+ !gdef!rbraceatcmd[@}]%
+!endgroup
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \c
+\let\dotaccent = \.
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \t
+\let\ubaraccent = \b
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+ \def\temp{#1}%
+ \ifx\temp\imacro \ptexi
+ \else\ifx\temp\jmacro \j
+ \else \errmessage{@dotless can be used only with i or j}%
+ \fi\fi
+}
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @/ allows a line break.
+\let\/=\allowbreak
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=3000 }
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=3000 }
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=3000 }
+
+% @w prevents a word break. Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox. We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line. According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0). If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+% Another complication is that the group might be very large. This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material. In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom. The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\def\group{\begingroup
+ \ifnum\catcode13=\active \else
+ \errhelp = \groupinvalidhelp
+ \errmessage{@group invalid in context where filling is enabled}%
+ \fi
+ %
+ % The \vtop we start below produces a box with normal height and large
+ % depth; thus, TeX puts \baselineskip glue before it, and (when the
+ % next line of text is done) \lineskip glue after it. (See p.82 of
+ % the TeXbook.) Thus, space below is not quite equal to space
+ % above. But it's pretty close.
+ \def\Egroup{%
+ \egroup % End the \vtop.
+ % \dimen0 is the vertical size of the group's box.
+ \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox
+ % \dimen2 is how much space is left on the page (more or less).
+ \dimen2 = \pageheight \advance\dimen2 by -\pagetotal
+ % if the group doesn't fit on the current page, and it's a big big
+ % group, force a page break.
+ \ifdim \dimen0 > \dimen2
+ \ifdim \pagetotal < \vfilllimit\pageheight
+ \page
+ \fi
+ \fi
+ \copy\groupbox
+ \endgroup % End the \group.
+ }%
+ %
+ \setbox\groupbox = \vtop\bgroup
+ % We have to put a strut on the last line in case the @group is in
+ % the midst of an example, rather than completely enclosing it.
+ % Otherwise, the interline space between the last line of the group
+ % and the first line afterwards is too small. But we can't put the
+ % strut in \Egroup, since there it would be on a line by itself.
+ % Hence this just inserts a strut at the beginning of each line.
+ \everypar = {\strut}%
+ %
+ % Since we have a strut on every line, we don't need any of TeX's
+ % normal interline spacing.
+ \offinterlineskip
+ %
+ % OK, but now we have to do something about blank
+ % lines in the input in @example-like environments, which normally
+ % just turn into \lisppar, which will insert no space now that we've
+ % turned off the interline space. Simplest is to make them be an
+ % empty paragraph.
+ \ifx\par\lisppar
+ \edef\par{\leavevmode \par}%
+ %
+ % Reset ^^M's definition to new definition of \par.
+ \obeylines
+ \fi
+ %
+ % Do @comment since we are called inside an environment such as
+ % @example, where each end-of-line in the input causes an
+ % end-of-line in the output. We don't want the end-of-line after
+ % the `@group' to put extra space in the output. Since @group
+ % should appear on a line by itself (according to the Texinfo
+ % manual), we don't worry about eating any user text.
+ \comment
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil \mil=0.001in
+
+\def\need{\parsearg\needx}
+
+% Old definition--didn't work.
+%\def\needx #1{\par %
+%% This method tries to make TeX break the page naturally
+%% if the depth of the box does not fit.
+%{\baselineskip=0pt%
+%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
+%\prevdepth=-1000pt
+%}}
+
+\def\needx#1{%
+ % Ensure vertical mode, so we don't make a big box in the middle of a
+ % paragraph.
+ \par
+ %
+ % If the @need value is less than one line space, it's useless.
+ \dimen0 = #1\mil
+ \dimen2 = \ht\strutbox
+ \advance\dimen2 by \dp\strutbox
+ \ifdim\dimen0 > \dimen2
+ %
+ % Do a \strut just to make the height of this box be normal, so the
+ % normal leading is inserted relative to the preceding line.
+ % And a page break here is fine.
+ \vtop to #1\mil{\strut\vfil}%
+ %
+ % TeX does not even consider page breaks if a penalty added to the
+ % main vertical list is 10000 or more. But in order to see if the
+ % empty box we just added fits on the page, we must make it consider
+ % page breaks. On the other hand, we don't want to actually break the
+ % page after the empty box. So we use a penalty of 9999.
+ %
+ % There is an extremely small chance that TeX will actually break the
+ % page at this \penalty, if there are no other feasible breakpoints in
+ % sight. (If the user is using lots of big @group commands, which
+ % almost-but-not-quite fill up a page, TeX will have a hard time doing
+ % good page breaking, for example.) However, I could not construct an
+ % example where a page broke at this \penalty; if it happens in a real
+ % document, then we can reconsider our strategy.
+ \penalty9999
+ %
+ % Back up by the size of the box, whether we did a page break or not.
+ \kern -#1\mil
+ %
+ % Do not allow a page break right after this kern.
+ \nobreak
+ \fi
+}
+
+% @br forces paragraph break
+
+\let\br = \par
+
+% @dots{} output an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in a typewriter
+% font as three actual period characters.
+%
+\def\dots{%
+ \leavevmode
+ \hbox to 1.5em{%
+ \hskip 0pt plus 0.25fil minus 0.25fil
+ .\hss.\hss.%
+ \hskip 0pt plus 0.5fil minus 0.5fil
+ }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+ \leavevmode
+ \hbox to 2em{%
+ \hskip 0pt plus 0.25fil minus 0.25fil
+ .\hss.\hss.\hss.%
+ \hskip 0pt plus 0.5fil minus 0.5fil
+ }%
+ \spacefactor=3000
+}
+
+% @page forces the start of a new page.
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\def\exdent{\parsearg\exdentyyy}
+\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}}
+
+% This defn is used inside nofill environments such as @example.
+\def\nofillexdent{\parsearg\nofillexdentyyy}
+\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount
+\leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph. For more general purposes, use the \margin insertion
+% class. WHICH is `l' or `r'.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+ \nobreak
+ \kern-\strutdepth
+ \vtop to \strutdepth{%
+ \baselineskip=\strutdepth
+ \vss
+ % if you have multiple lines of stuff to put here, you'll need to
+ % make the vbox yourself of the appropriate size.
+ \ifx#1l%
+ \llap{\ignorespaces #2\hskip\inmarginspacing}%
+ \else
+ \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+ \fi
+ \null
+ }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+%
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \def\lefttext{#1}% have both texts
+ \def\righttext{#2}%
+ \else
+ \def\lefttext{#1}% have only one text
+ \def\righttext{#1}%
+ \fi
+ %
+ \ifodd\pageno
+ \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+ \else
+ \def\temp{\inleftmargin\lefttext}%
+ \fi
+ \temp
+}
+
+% @include file insert text of that file as input.
+% Allow normal characters that we make active in the argument (a file name).
+\def\include{\begingroup
+ \catcode`\\=\other
+ \catcode`~=\other
+ \catcode`^=\other
+ \catcode`_=\other
+ \catcode`|=\other
+ \catcode`<=\other
+ \catcode`>=\other
+ \catcode`+=\other
+ \parsearg\includezzz}
+% Restore active chars for included file.
+\def\includezzz#1{\endgroup\begingroup
+ % Read the included file in a group so nested @include's work.
+ \def\thisfile{#1}%
+ \let\value=\expandablevalue
+ \input\thisfile
+\endgroup}
+
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\def\center{\parsearg\docenter}
+\def\docenter#1{{%
+ \ifhmode \hfil\break \fi
+ \advance\hsize by -\leftskip
+ \advance\hsize by -\rightskip
+ \line{\hfil \ignorespaces#1\unskip \hfil}%
+ \ifhmode \break \fi
+}}
+
+% @sp n outputs n lines of vertical space
+
+\def\sp{\parsearg\spxxx}
+\def\spxxx #1{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore is another way to write a comment
+
+\def\comment{\begingroup \catcode`\^^M=\other%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\commentxxx}
+{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
+
+\let\c=\comment
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% NCHARS can also be the word `asis' or `none'.
+% We cannot feasibly implement @paragraphindent asis, though.
+%
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\def\paragraphindent{\parsearg\doparagraphindent}
+\def\doparagraphindent#1{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \defaultparindent = 0pt
+ \else
+ \defaultparindent = #1em
+ \fi
+ \fi
+ \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\def\exampleindent{\parsearg\doexampleindent}
+\def\doexampleindent#1{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \lispnarrowing = 0pt
+ \else
+ \lispnarrowing = #1em
+ \fi
+ \fi
+}
+
+% @firstparagraphindent WORD
+% If WORD is `none', then suppress indentation of the first paragraph
+% after a section heading. If WORD is `insert', then do indent at such
+% paragraphs.
+%
+% The paragraph indentation is suppressed or not by calling
+% \suppressfirstparagraphindent, which the sectioning commands do.
+% We switch the definition of this back and forth according to WORD.
+% By default, we suppress indentation.
+%
+\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
+\newdimen\currentparindent
+%
+\def\insertword{insert}
+%
+\def\firstparagraphindent{\parsearg\dofirstparagraphindent}
+\def\dofirstparagraphindent#1{%
+ \def\temp{#1}%
+ \ifx\temp\noneword
+ \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
+ \else\ifx\temp\insertword
+ \let\suppressfirstparagraphindent = \relax
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @firstparagraphindent option `\temp'}%
+ \fi\fi
+}
+
+% Here is how we actually suppress indentation. Redefine \everypar to
+% \kern backwards by \parindent, and then reset itself to empty.
+%
+% We also make \indent itself not actually do anything until the next
+% paragraph.
+%
+\gdef\dosuppressfirstparagraphindent{%
+ \gdef\indent{%
+ \restorefirstparagraphindent
+ \indent
+ }%
+ \gdef\noindent{%
+ \restorefirstparagraphindent
+ \noindent
+ }%
+ \global\everypar = {%
+ \kern -\parindent
+ \restorefirstparagraphindent
+ }%
+}
+
+\gdef\restorefirstparagraphindent{%
+ \global \let \indent = \ptexindent
+ \global \let \noindent = \ptexnoindent
+ \global \everypar = {}%
+}
+
+
+% @asis just yields its argument. Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+% We don't use $'s directly in the definition of \math because we need
+% to set catcodes according to plain TeX first, to allow for subscripts,
+% superscripts, special math chars, etc.
+%
+\let\implicitmath = $%$ font-lock fix
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}. So make
+% _ within @math be active (mathcode "8000), and distinguish by seeing
+% if the current family is \slfam, which is what @var uses.
+%
+{\catcode\underChar = \active
+\gdef\mathunderscore{%
+ \catcode\underChar=\active
+ \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+}}
+%
+% Another complication: we want \\ (and @\) to output a \ character.
+% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
+% this is not advertised and we don't care. Texinfo does not
+% otherwise define @\.
+%
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+ \tex
+ \mathcode`\_="8000 \mathunderscore
+ \let\\ = \mathbackslash
+ \mathactive
+ \implicitmath\finishmath}
+\def\finishmath#1{#1\implicitmath\Etex}
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an
+% argument to a command which set the catcodes (such as @item or @section).
+%
+{
+ \catcode`^ = \active
+ \catcode`< = \active
+ \catcode`> = \active
+ \catcode`+ = \active
+ \gdef\mathactive{%
+ \let^ = \ptexhat
+ \let< = \ptexless
+ \let> = \ptexgtr
+ \let+ = \ptexplus
+ }
+}
+
+% @bullet and @minus need the same treatment as @math, just above.
+\def\bullet{\implicitmath\ptexbullet\implicitmath}
+\def\minus{\implicitmath-\implicitmath}
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate (before @setfilename).
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+ \iflinks
+ \readauxfile
+ \fi % \openindices needs to do some work in any case.
+ \openindices
+ \fixbackslash % Turn off hack to swallow `\input texinfo'.
+ \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
+ %
+ % If texinfo.cnf is present on the system, read it.
+ % Useful for site-wide @afourpaper, etc.
+ % Just to be on the safe side, close the input stream before the \input.
+ \openin 1 texinfo.cnf
+ \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi
+ \closein1
+ \temp
+ %
+ \comment % Ignore the actual filename.
+}
+
+% Called from \setfilename.
+%
+\def\openindices{%
+ \newindex{cp}%
+ \newcodeindex{fn}%
+ \newcodeindex{vr}%
+ \newcodeindex{tp}%
+ \newcodeindex{ky}%
+ \newcodeindex{pg}%
+}
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+\ifx\pdfoutput\undefined
+ \pdffalse
+ \let\pdfmkdest = \gobble
+ \let\pdfurl = \gobble
+ \let\endlink = \relax
+ \let\linkcolor = \relax
+ \let\pdfmakeoutlines = \relax
+\else
+ \pdftrue
+ \pdfoutput = 1
+ \input pdfcolor
+ \pdfcatalog{/PageMode /UseOutlines}%
+ \def\dopdfimage#1#2#3{%
+ \def\imagewidth{#2}%
+ \def\imageheight{#3}%
+ % without \immediate, pdftex seg faults when the same image is
+ % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.)
+ \ifnum\pdftexversion < 14
+ \immediate\pdfimage
+ \else
+ \immediate\pdfximage
+ \fi
+ \ifx\empty\imagewidth\else width \imagewidth \fi
+ \ifx\empty\imageheight\else height \imageheight \fi
+ \ifnum\pdftexversion<13
+ #1.pdf%
+ \else
+ {#1.pdf}%
+ \fi
+ \ifnum\pdftexversion < 14 \else
+ \pdfrefximage \pdflastximage
+ \fi}
+ \def\pdfmkdest#1{{\normalturnoffactive \pdfdest name{#1} xyz}}
+ \def\pdfmkpgn#1{#1}
+ \let\linkcolor = \Blue % was Cyan, but that seems light?
+ \def\endlink{\Black\pdfendlink}
+ % Adding outlines to PDF; macros for calculating structure of outlines
+ % come from Petr Olsak
+ \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+ \else \csname#1\endcsname \fi}
+ \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+ \advance\tempnum by 1
+ \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+ %
+ % #1 is the section text. #2 is the pdf expression for the number
+ % of subentries (or empty, for subsubsections). #3 is the node
+ % text, which might be empty if this toc entry had no
+ % corresponding node. #4 is the page number.
+ %
+ \def\dopdfoutline#1#2#3#4{%
+ % Generate a link to the node text if that exists; else, use the
+ % page number. We could generate a destination for the section
+ % text in the case where a section has no node, but it doesn't
+ % seem worthwhile, since most documents are normally structured.
+ \def\pdfoutlinedest{#3}%
+ \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}\fi
+ %
+ \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{#1}%
+ }
+ %
+ \def\pdfmakeoutlines{%
+ \openin 1 \jobname.toc
+ \ifeof 1\else\begingroup
+ \closein 1
+ % Thanh's hack / proper braces in bookmarks
+ \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
+ \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
+ %
+ % Read toc silently, to get counts of subentries for \pdfoutline.
+ \def\numchapentry##1##2##3##4{\def\thischapnum{##2}}%
+ \def\numsecentry##1##2##3##4{%
+ \def\thissecnum{##2}%
+ \advancenumber{chap\thischapnum}}%
+ \def\numsubsecentry##1##2##3##4{%
+ \def\thissubsecnum{##2}%
+ \advancenumber{sec\thissecnum}}%
+ \def\numsubsubsecentry##1##2##3##4{\advancenumber{subsec\thissubsecnum}}%
+ %
+ % use \def rather than \let here because we redefine \chapentry et
+ % al. a second time, below.
+ \def\appentry{\numchapentry}%
+ \def\appsecentry{\numsecentry}%
+ \def\appsubsecentry{\numsubsecentry}%
+ \def\appsubsubsecentry{\numsubsubsecentry}%
+ \def\unnchapentry{\numchapentry}%
+ \def\unnsecentry{\numsecentry}%
+ \def\unnsubsecentry{\numsubsecentry}%
+ \def\unnsubsubsecentry{\numsubsubsecentry}%
+ \input \jobname.toc
+ %
+ % Read toc second time, this time actually producing the outlines.
+ % The `-' means take the \expnumber as the absolute number of
+ % subentries, which we calculated on our first read of the .toc above.
+ %
+ % We use the node names as the destinations.
+ \def\numchapentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
+ \def\numsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
+ \def\numsubsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
+ \def\numsubsubsecentry##1##2##3##4{% count is always zero
+ \dopdfoutline{##1}{}{##3}{##4}}%
+ %
+ % Make special characters normal for writing to the pdf file.
+ \indexnofonts
+ \turnoffactive
+ \input \jobname.toc
+ \endgroup\fi
+ }
+ %
+ \def\makelinks #1,{%
+ \def\params{#1}\def\E{END}%
+ \ifx\params\E
+ \let\nextmakelinks=\relax
+ \else
+ \let\nextmakelinks=\makelinks
+ \ifnum\lnkcount>0,\fi
+ \picknum{#1}%
+ \startlink attr{/Border [0 0 0]}
+ goto name{\pdfmkpgn{\the\pgn}}%
+ \linkcolor #1%
+ \advance\lnkcount by 1%
+ \endlink
+ \fi
+ \nextmakelinks
+ }
+ \def\picknum#1{\expandafter\pn#1}
+ \def\pn#1{%
+ \def\p{#1}%
+ \ifx\p\lbrace
+ \let\nextpn=\ppn
+ \else
+ \let\nextpn=\ppnn
+ \def\first{#1}
+ \fi
+ \nextpn
+ }
+ \def\ppn#1{\pgn=#1\gobble}
+ \def\ppnn{\pgn=\first}
+ \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,}
+ \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+ \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+ \ifx\PP\D\let\nextsp\relax
+ \else\let\nextsp\skipspaces
+ \ifx\p\space\else\addtokens{\filename}{\PP}%
+ \advance\filenamelength by 1
+ \fi
+ \fi
+ \nextsp}
+ \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
+ \ifnum\pdftexversion < 14
+ \let \startlink \pdfannotlink
+ \else
+ \let \startlink \pdfstartlink
+ \fi
+ \def\pdfurl#1{%
+ \begingroup
+ \normalturnoffactive\def\@{@}%
+ \let\value=\expandablevalue
+ \leavevmode\Red
+ \startlink attr{/Border [0 0 0]}%
+ user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+ % #1
+ \endgroup}
+ \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+ \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+ \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+ \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+ \def\maketoks{%
+ \expandafter\poptoks\the\toksA|ENDTOKS|
+ \ifx\first0\adn0
+ \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+ \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+ \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+ \else
+ \ifnum0=\countA\else\makelink\fi
+ \ifx\first.\let\next=\done\else
+ \let\next=\maketoks
+ \addtokens{\toksB}{\the\toksD}
+ \ifx\first,\addtokens{\toksB}{\space}\fi
+ \fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \next}
+ \def\makelink{\addtokens{\toksB}%
+ {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+ \def\pdflink#1{%
+ \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+ \linkcolor #1\endlink}
+ \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\fi % \ifx\pdfoutput
+
+
+\message{fonts,}
+% Font-change commands.
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf analogous to plain's \rm, etc.
+\newfam\sffam
+\def\sf{\fam=\sffam \tensf}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+% We don't need math for this one.
+\def\ttsl{\tenttsl}
+
+% Default leading.
+\newdimen\textleading \textleading = 13.2pt
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly. There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+\def\setleading#1{%
+ \normalbaselineskip = #1\relax
+ \normallineskip = \lineskipfactor\normalbaselineskip
+ \normalbaselines
+ \setbox\strutbox =\hbox{%
+ \vrule width0pt height\strutheightpercent\baselineskip
+ depth \strutdepthpercent \baselineskip
+ }%
+}
+
+% Set the font macro #1 to the font named #2, adding on the
+% specified font prefix (normally `cm').
+% #3 is the font's design size, #4 is a scale factor
+\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4}
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\undefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx} %where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+\newcount\mainmagstep
+\ifx\bigger\relax
+ % not really supported.
+ \mainmagstep=\magstep1
+ \setfont\textrm\rmshape{12}{1000}
+ \setfont\texttt\ttshape{12}{1000}
+\else
+ \mainmagstep=\magstephalf
+ \setfont\textrm\rmshape{10}{\mainmagstep}
+ \setfont\texttt\ttshape{10}{\mainmagstep}
+\fi
+% Instead of cmb10, you may want to use cmbx10.
+% cmbx10 is a prettier font on its own, but cmb10
+% looks better when embedded in a line with cmr10
+% (in Bob's opinion).
+\setfont\textbf\bfshape{10}{\mainmagstep}
+\setfont\textit\itshape{10}{\mainmagstep}
+\setfont\textsl\slshape{10}{\mainmagstep}
+\setfont\textsf\sfshape{10}{\mainmagstep}
+\setfont\textsc\scshape{10}{\mainmagstep}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun, etc.
+\setfont\defbf\bxshape{10}{\magstep1} %was 1314
+\setfont\deftt\ttshape{10}{\magstep1}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\setfont\smallrm\rmshape{9}{1000}
+\setfont\smalltt\ttshape{9}{1000}
+\setfont\smallbf\bfshape{10}{900}
+\setfont\smallit\itshape{9}{1000}
+\setfont\smallsl\slshape{9}{1000}
+\setfont\smallsf\sfshape{9}{1000}
+\setfont\smallsc\scshape{10}{900}
+\setfont\smallttsl\ttslshape{10}{900}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+
+% Fonts for small examples (8pt).
+\setfont\smallerrm\rmshape{8}{1000}
+\setfont\smallertt\ttshape{8}{1000}
+\setfont\smallerbf\bfshape{10}{800}
+\setfont\smallerit\itshape{8}{1000}
+\setfont\smallersl\slshape{8}{1000}
+\setfont\smallersf\sfshape{8}{1000}
+\setfont\smallersc\scshape{10}{800}
+\setfont\smallerttsl\ttslshape{10}{800}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+
+% Fonts for title page:
+\setfont\titlerm\rmbshape{12}{\magstep3}
+\setfont\titleit\itbshape{10}{\magstep4}
+\setfont\titlesl\slbshape{10}{\magstep4}
+\setfont\titlett\ttbshape{12}{\magstep3}
+\setfont\titlettsl\ttslshape{10}{\magstep4}
+\setfont\titlesf\sfbshape{17}{\magstep1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+\def\authortt{\sectt}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\setfont\chaprm\rmbshape{12}{\magstep2}
+\setfont\chapit\itbshape{10}{\magstep3}
+\setfont\chapsl\slbshape{10}{\magstep3}
+\setfont\chaptt\ttbshape{12}{\magstep2}
+\setfont\chapttsl\ttslshape{10}{\magstep3}
+\setfont\chapsf\sfbshape{17}{1000}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+
+% Section fonts (14.4pt).
+\setfont\secrm\rmbshape{12}{\magstep1}
+\setfont\secit\itbshape{10}{\magstep2}
+\setfont\secsl\slbshape{10}{\magstep2}
+\setfont\sectt\ttbshape{12}{\magstep1}
+\setfont\secttsl\ttslshape{10}{\magstep2}
+\setfont\secsf\sfbshape{12}{\magstep1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+
+% Subsection fonts (13.15pt).
+\setfont\ssecrm\rmbshape{12}{\magstephalf}
+\setfont\ssecit\itbshape{10}{1315}
+\setfont\ssecsl\slbshape{10}{1315}
+\setfont\ssectt\ttbshape{12}{\magstephalf}
+\setfont\ssecttsl\ttslshape{10}{1315}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{\magstep1}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+% The smallcaps and symbol fonts should actually be scaled \magstep1.5,
+% but that is not a standard magnification.
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families. Since
+% texinfo doesn't allow for producing subscripts and superscripts except
+% in the main text, we don't bother to reset \scriptfont and
+% \scriptscriptfont (which would also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+ \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
+ \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
+ \textfont\ttfam=\tentt \textfont\sffam=\tensf
+}
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE. We do this so that font changes will continue to work
+% in math mode, where it is the current \fam that is relevant in most
+% cases, not the current font. Plain TeX does \def\bf{\fam=\bffam
+% \tenbf}, for example. By redefining \tenbf, we obviate the need to
+% redefine \bf itself.
+\def\textfonts{%
+ \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+ \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+ \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl
+ \resetmathfonts \setleading{\textleading}}
+\def\titlefonts{%
+ \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
+ \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
+ \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+ \let\tenttsl=\titlettsl
+ \resetmathfonts \setleading{25pt}}
+\def\titlefont#1{{\titlefonts\rm #1}}
+\def\chapfonts{%
+ \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+ \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+ \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl
+ \resetmathfonts \setleading{19pt}}
+\def\secfonts{%
+ \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+ \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+ \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl
+ \resetmathfonts \setleading{16pt}}
+\def\subsecfonts{%
+ \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+ \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+ \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl
+ \resetmathfonts \setleading{15pt}}
+\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf?
+\def\smallfonts{%
+ \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
+ \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
+ \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
+ \let\tenttsl=\smallttsl
+ \resetmathfonts \setleading{10.5pt}}
+\def\smallerfonts{%
+ \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
+ \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
+ \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
+ \let\tenttsl=\smallerttsl
+ \resetmathfonts \setleading{9.5pt}}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+% 8.5x11=86 smallbook=72 a4=90 a5=69
+% If we use \smallerfonts (8pt), then we can fit this many characters:
+% 8.5x11=90+ smallbook=80 a4=90+ a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt. So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+% 8.5x11=71 smallbook=60 a4=75 a5=58
+%
+% I wish we used A4 paper on this side of the Atlantic.
+%
+% --karl, 24jan03.
+
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\textfonts
+
+% Define these so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}
+\setfont\shortcontbf\bxshape{12}{1000}
+\setfont\shortcontsl\slshape{12}{1000}
+\setfont\shortconttt\ttshape{12}{1000}
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
+ \ptexslash\fi\fi\fi}
+\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
+\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\var=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+\let\cite=\smartslanted
+
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph. Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\catcode`@=11
+ \def\frenchspacing{%
+ \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
+ \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
+ }
+\catcode`@=\other
+
+\def\t#1{%
+ {\tt \rawbackslash \frenchspacing #1}%
+ \null
+}
+\let\ttfont=\t
+\def\samp#1{`\tclose{#1}'\null}
+\setfont\keyrm\rmshape{8}{1000}
+\font\keysy=cmsy9
+\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+ \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+ \vbox{\hrule\kern-0.4pt
+ \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+ \kern-0.4pt\hrule}%
+ \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+% The old definition, with no lozenge:
+%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+% @file, @option are the same as @samp.
+\let\file=\samp
+\let\option=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\def\tclose#1{%
+ {%
+ % Change normal interword space to be same as for the current font.
+ \spaceskip = \fontdimen2\font
+ %
+ % Switch to typewriter.
+ \tt
+ %
+ % But `\ ' produces the large typewriter interword space.
+ \def\ {{\spaceskip = 0pt{} }}%
+ %
+ % Turn off hyphenation.
+ \nohyphenation
+ %
+ \rawbackslash
+ \frenchspacing
+ #1%
+ }%
+ \null
+}
+
+% We *must* turn on hyphenation at `-' and `_' in \code.
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash.
+% -- rms.
+{
+ \catcode`\-=\active
+ \catcode`\_=\active
+ %
+ \global\def\code{\begingroup
+ \catcode`\-=\active \let-\codedash
+ \catcode`\_=\active \let_\codeunder
+ \codex
+ }
+ %
+ % If we end up with any active - characters when handling the index,
+ % just treat them as a normal -.
+ \global\def\indexbreaks{\catcode`\-=\active \let-\realdash}
+}
+
+\def\realdash{-}
+\def\codedash{-\discretionary{}{}{}}
+\def\codeunder{%
+ % this is all so @math{@code{var_name}+1} can work. In math mode, _
+ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+ % will therefore expand the active definition of _, which is us
+ % (inside @code that is), therefore an endless loop.
+ \ifusingtt{\ifmmode
+ \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+ \else\normalunderscore \fi
+ \discretionary{}{}{}}%
+ {\_}%
+}
+\def\codex #1{\tclose{#1}\endgroup}
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+% `example' (@kbd uses ttsl only inside of @example and friends),
+% or `code' (@kbd uses normal tty font always).
+\def\kbdinputstyle{\parsearg\kbdinputstylexxx}
+\def\kbdinputstylexxx#1{%
+ \def\arg{#1}%
+ \ifx\arg\worddistinct
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+ \else\ifx\arg\wordexample
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+ \else\ifx\arg\wordcode
+ \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @kbdinputstyle option `\arg'}%
+ \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct.'
+\kbdinputstyle distinct
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else{\tclose{\kbdfont\look}}\fi
+\else{\tclose{\kbdfont\look}}\fi}
+
+% For @url, @env, @command quotes seem unnecessary, so use \code.
+\let\url=\code
+\let\env=\code
+\let\command=\code
+
+% @uref (abbreviation for `urlref') takes an optional (comma-separated)
+% second argument specifying the text to display and an optional third
+% arg as text to display instead of (rather than in addition to) the url
+% itself. First (mandatory) arg is the url. Perhaps eventually put in
+% a hypertex \special here.
+%
+\def\uref#1{\douref #1,,,\finish}
+\def\douref#1,#2,#3,#4\finish{\begingroup
+ \unsepspaces
+ \pdfurl{#1}%
+ \setbox0 = \hbox{\ignorespaces #3}%
+ \ifdim\wd0 > 0pt
+ \unhbox0 % third arg given, show only that
+ \else
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \ifpdf
+ \unhbox0 % PDF: 2nd arg given, show only it
+ \else
+ \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
+ \fi
+ \else
+ \code{#1}% only url given, so show it
+ \fi
+ \fi
+ \endlink
+\endgroup}
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+%
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+ \def\email#1{\doemail#1,,\finish}
+ \def\doemail#1,#2,#3\finish{\begingroup
+ \unsepspaces
+ \pdfurl{mailto:#1}%
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+ \endlink
+ \endgroup}
+\else
+ \let\email=\uref
+\fi
+
+% Check if we are currently using a typewriter font. Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Typeset a dimension, e.g., `in' or `pt'. The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
+
+% @l was never documented to mean ``switch to the Lisp font'',
+% and it is not used as such in any manual I can find. We need it for
+% Polish suppressed-l. --karl, 22sep96.
+%\def\l#1{{\li #1}\null}
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}} % roman font
+\def\sc#1{{\smallcaps#1}} % smallcaps font
+\def\ii#1{{\it #1}} % italic font
+
+% @acronym downcases the argument and prints in smallcaps.
+\def\acronym#1{{\smallcaps \lowercase{#1}}}
+
+% @pounds{} is a sterling sign.
+\def\pounds{{\it\$}}
+
+% @registeredsymbol - R in a circle. For now, only works in text size;
+% we'd have to redo the font mechanism to change the \scriptstyle and
+% \scriptscriptstyle font sizes to make it look right in headings.
+% Adapted from the plain.tex definition of \copyright.
+%
+\def\registeredsymbol{%
+ $^{{\ooalign{\hfil\raise.07ex\hbox{$\scriptstyle\rm R$}\hfil\crcr\Orb}}%
+ }$%
+}
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page. Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% Do an implicit @contents or @shortcontents after @end titlepage if the
+% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
+%
+\newif\ifsetcontentsaftertitlepage
+ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
+\newif\ifsetshortcontentsaftertitlepage
+ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
+
+\def\shorttitlepage{\parsearg\shorttitlepagezzz}
+\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+ \endgroup\page\hbox{}\page}
+
+\def\titlepage{\begingroup \parindent=0pt \textfonts
+ \let\subtitlerm=\tenrm
+ \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
+ %
+ \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
+ \let\tt=\authortt}%
+ %
+ % Leave some space at the very top of the page.
+ \vglue\titlepagetopglue
+ %
+ % Now you can print the title using @title.
+ \def\title{\parsearg\titlezzz}%
+ \def\titlezzz##1{\leftline{\titlefonts\rm ##1}
+ % print a rule at the page bottom also.
+ \finishedtitlepagefalse
+ \vskip4pt \hrule height 4pt width \hsize \vskip4pt}%
+ % No rule at page bottom unless we print one at the top with @title.
+ \finishedtitlepagetrue
+ %
+ % Now you can put text using @subtitle.
+ \def\subtitle{\parsearg\subtitlezzz}%
+ \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}%
+ %
+ % @author should come last, but may come many times.
+ \def\author{\parsearg\authorzzz}%
+ \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
+ {\authorfont \leftline{##1}}}%
+ %
+ % Most title ``pages'' are actually two pages long, with space
+ % at the top of the second. We don't want the ragged left on the second.
+ \let\oldpage = \page
+ \def\page{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ \oldpage
+ \let\page = \oldpage
+ \hbox{}}%
+% \def\page{\oldpage \hbox{}}
+}
+
+\def\Etitlepage{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ % It is important to do the page break before ending the group,
+ % because the headline and footline are only empty inside the group.
+ % If we use the new definition of \page, we always get a blank page
+ % after the title page, which we certainly don't want.
+ \oldpage
+ \endgroup
+ %
+ % Need this before the \...aftertitlepage checks so that if they are
+ % in effect the toc pages will come out with page numbers.
+ \HEADINGSon
+ %
+ % If they want short, they certainly want long too.
+ \ifsetshortcontentsaftertitlepage
+ \shortcontents
+ \contents
+ \global\let\shortcontents = \relax
+ \global\let\contents = \relax
+ \fi
+ %
+ \ifsetcontentsaftertitlepage
+ \contents
+ \global\let\contents = \relax
+ \global\let\shortcontents = \relax
+ \fi
+}
+
+\def\finishtitlepage{%
+ \vskip4pt \hrule height 2pt width \hsize
+ \vskip\titlepagebottomglue
+ \finishedtitlepagetrue
+}
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline % headline on even pages
+\newtoks\oddheadline % headline on odd pages
+\newtoks\evenfootline % footline on even pages
+\newtoks\oddfootline % footline on odd pages
+
+% Now make Tex use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+ \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+ \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what @headings on does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\everyheading{\parsearg\everyheadingxxx}
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\everyfooting{\parsearg\everyfootingxxx}
+
+{\catcode`\@=0 %
+
+\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish}
+\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish}
+\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
+\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
+\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
+ \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+ %
+ % Leave some space for the footline. Hopefully ok to assume
+ % @evenfooting will not be used by itself.
+ \global\advance\pageheight by -\baselineskip
+ \global\advance\vsize by -\baselineskip
+}
+
+\gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+%
+}% unbind the catcode of @.
+
+% @headings double turns headings on for double-sided printing.
+% @headings single turns headings on for single-sided printing.
+% @headings off turns them off.
+% @headings on same as @headings double, retained for compatibility.
+% @headings after turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\undefined
+\def\today{%
+ \number\day\space
+ \ifcase\month
+ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+ \fi
+ \space\number\year}
+\fi
+
+% @settitle line... specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg\settitlezzz}
+\def\settitlezzz #1{\gdef\thistitle{#1}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @vtable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
+\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz}
+
+\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
+\def\internalBkitemx{\itemxpar \parsearg\kitemzzz}
+
+\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}%
+ \itemzzz {#1}}
+
+\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}%
+ \itemzzz {#1}}
+
+\def\itemzzz #1{\begingroup %
+ \advance\hsize by -\rightskip
+ \advance\hsize by -\tableindent
+ \setbox0=\hbox{\itemfont{#1}}%
+ \itemindex{#1}%
+ \nobreak % This prevents a break before @itemx.
+ %
+ % If the item text does not fit in the space we have, put it on a line
+ % by itself, and do not allow a page break either before or after that
+ % line. We do not start a paragraph here because then if the next
+ % command is, e.g., @kindex, the whatsit would get put into the
+ % horizontal list on a line by itself, resulting in extra blank space.
+ \ifdim \wd0>\itemmax
+ %
+ % Make this a paragraph so we get the \parskip glue and wrapping,
+ % but leave it ragged-right.
+ \begingroup
+ \advance\leftskip by-\tableindent
+ \advance\hsize by\tableindent
+ \advance\rightskip by0pt plus1fil
+ \leavevmode\unhbox0\par
+ \endgroup
+ %
+ % We're going to be starting a paragraph, but we don't want the
+ % \parskip glue -- logically it's part of the @item we just started.
+ \nobreak \vskip-\parskip
+ %
+ % Stop a page break at the \parskip glue coming up. (Unfortunately
+ % we can't prevent a possible page break at the following
+ % \baselineskip glue.) However, if what follows is an environment
+ % such as @example, there will be no \parskip glue; then
+ % the negative vskip we just would cause the example and the item to
+ % crash together. So we use this bizarre value of 10001 as a signal
+ % to \aboveenvbreak to insert \parskip glue after all.
+ % (Possibly there are other commands that could be followed by
+ % @example which need the same treatment, but not section titles; or
+ % maybe section titles are the only special case and they should be
+ % penalty 10001...)
+ \penalty 10001
+ \endgroup
+ \itemxneedsnegativevskipfalse
+ \else
+ % The item text fits into the space. Start a paragraph, so that the
+ % following text (if any) will end up on the same line.
+ \noindent
+ % Do this with kerns and \unhbox so that if there is a footnote in
+ % the item text, it can migrate to the main vertical list and
+ % eventually be printed.
+ \nobreak\kern-\tableindent
+ \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+ \unhbox0
+ \nobreak\kern\dimen0
+ \endgroup
+ \itemxneedsnegativevskiptrue
+ \fi
+}
+
+\def\item{\errmessage{@item while not in a table}}
+\def\itemx{\errmessage{@itemx while not in a table}}
+\def\kitem{\errmessage{@kitem while not in a table}}
+\def\kitemx{\errmessage{@kitemx while not in a table}}
+\def\xitem{\errmessage{@xitem while not in a table}}
+\def\xitemx{\errmessage{@xitemx while not in a table}}
+
+% Contains a kludge to get @end[description] to work.
+\def\description{\tablez{\dontindex}{1}{}{}{}{}}
+
+% @table, @ftable, @vtable.
+\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
+{\obeylines\obeyspaces%
+\gdef\tablex #1^^M{%
+\tabley\dontindex#1 \endtabley}}
+
+\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}
+{\obeylines\obeyspaces%
+\gdef\ftablex #1^^M{%
+\tabley\fnitemindex#1 \endtabley
+\def\Eftable{\endgraf\afterenvbreak\endgroup}%
+\let\Etable=\relax}}
+
+\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex}
+{\obeylines\obeyspaces%
+\gdef\vtablex #1^^M{%
+\tabley\vritemindex#1 \endtabley
+\def\Evtable{\endgraf\afterenvbreak\endgroup}%
+\let\Etable=\relax}}
+
+\def\dontindex #1{}
+\def\fnitemindex #1{\doind {fn}{\code{#1}}}%
+\def\vritemindex #1{\doind {vr}{\code{#1}}}%
+
+{\obeyspaces %
+\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup%
+\tablez{#1}{#2}{#3}{#4}{#5}{#6}}}
+
+\def\tablez #1#2#3#4#5#6{%
+\aboveenvbreak %
+\begingroup %
+\def\Edescription{\Etable}% Necessary kludge.
+\let\itemindex=#1%
+\ifnum 0#3>0 \advance \leftskip by #3\mil \fi %
+\ifnum 0#4>0 \tableindent=#4\mil \fi %
+\ifnum 0#5>0 \advance \rightskip by #5\mil \fi %
+\def\itemfont{#2}%
+\itemmax=\tableindent %
+\advance \itemmax by -\itemmargin %
+\advance \leftskip by \tableindent %
+\exdentamount=\tableindent
+\parindent = 0pt
+\parskip = \smallskipamount
+\ifdim \parskip=0pt \parskip=2pt \fi%
+\def\Etable{\endgraf\afterenvbreak\endgroup}%
+\let\item = \internalBitem %
+\let\itemx = \internalBitemx %
+\let\kitem = \internalBkitem %
+\let\kitemx = \internalBkitemx %
+\let\xitem = \internalBxitem %
+\let\xitemx = \internalBxitemx %
+}
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\def\itemize{\parsearg\itemizezzz}
+
+\def\itemizezzz #1{%
+ \begingroup % ended by the @end itemize
+ \itemizey {#1}{\Eitemize}
+}
+
+\def\itemizey#1#2{%
+ \aboveenvbreak
+ \itemmax=\itemindent
+ \advance\itemmax by -\itemmargin
+ \advance\leftskip by \itemindent
+ \exdentamount=\itemindent
+ \parindent=0pt
+ \parskip=\smallskipamount
+ \ifdim\parskip=0pt \parskip=2pt \fi
+ \def#2{\endgraf\afterenvbreak\endgroup}%
+ \def\itemcontents{#1}%
+ % @itemize with no arg is equivalent to @itemize @bullet.
+ \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
+ \let\item=\itemizeitem
+}
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list. No
+% argument is the same as `1'.
+%
+\def\enumerate{\parsearg\enumeratezzz}
+\def\enumeratezzz #1{\enumeratey #1 \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+ \begingroup % ended by the @end enumerate
+ %
+ % If we were given no argument, pretend we were given `1'.
+ \def\thearg{#1}%
+ \ifx\thearg\empty \def\thearg{1}\fi
+ %
+ % Detect if the argument is a single token. If so, it might be a
+ % letter. Otherwise, the only valid thing it can be is a number.
+ % (We will always have one token, because of the test we just made.
+ % This is a good thing, since \splitoff doesn't work given nothing at
+ % all -- the first parameter is undelimited.)
+ \expandafter\splitoff\thearg\endmark
+ \ifx\rest\empty
+ % Only one token in the argument. It could still be anything.
+ % A ``lowercase letter'' is one whose \lccode is nonzero.
+ % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+ % not equal to itself.
+ % Otherwise, we assume it's a number.
+ %
+ % We need the \relax at the end of the \ifnum lines to stop TeX from
+ % continuing to look for a <number>.
+ %
+ \ifnum\lccode\expandafter`\thearg=0\relax
+ \numericenumerate % a number (we hope)
+ \else
+ % It's a letter.
+ \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+ \lowercaseenumerate % lowercase letter
+ \else
+ \uppercaseenumerate % uppercase letter
+ \fi
+ \fi
+ \else
+ % Multiple tokens in the argument. We hope it's a number.
+ \numericenumerate
+ \fi
+}
+
+% An @enumerate whose labels are integers. The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+ \itemno = \thearg
+ \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more lowercase letters in @enumerate; get a bigger
+ alphabet}%
+ \fi
+ \char\lccode\itemno
+ }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more uppercase letters in @enumerate; get a bigger
+ alphabet}
+ \fi
+ \char\uccode\itemno
+ }%
+}
+
+% Call itemizey, adding a period to the first argument and supplying the
+% common last two arguments. Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+ \advance\itemno by -1
+ \itemizey{#1.}\Eenumerate\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+% Definition of @item while inside @itemize.
+
+\def\itemizeitem{%
+\advance\itemno by 1
+{\let\par=\endgraf \smallbreak}%
+\ifhmode \errmessage{In hmode at itemizeitem}\fi
+{\parskip=0in \hskip 0pt
+\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
+\vadjust{\penalty 1200}}%
+\flushcr}
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble. Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+% @multitable @columnfractions .25 .3 .45
+% @item ...
+%
+% Numbers following @columnfractions are the percent of the total
+% current hsize to be used for each column. You may use as many
+% columns as desired.
+
+
+% Or use a template:
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item ...
+% using the widest term desired in each column.
+%
+% For those who want to use more than one line's worth of words in
+% the preamble, break the line within one argument and it
+% will parse correctly, i.e.,
+%
+% @multitable {Column 1 template} {Column 2 template} {Column 3
+% template}
+% Not:
+% @multitable {Column 1 template} {Column 2 template}
+% {Column 3 template}
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab, @multitable or @end multitable do not need to be on their
+% own lines, but it will not hurt if they are.
+
+% Sample multitable:
+
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item first col stuff @tab second col stuff @tab third col
+% @item
+% first col stuff
+% @tab
+% second col stuff
+% @tab
+% third col
+% @item first col stuff @tab second col stuff
+% @tab Many paragraphs of text may be used in any column.
+%
+% They will wrap at the width determined by the template.
+% @item@tab@tab This will be in third column.
+% @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+% to baseline.
+% 0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the part of the @columnfraction before the decimal point, which
+% is presumably either 0 or the empty string (but we don't check, we
+% just throw it away). #2 is the decimal part, which we use as the
+% percent of \hsize for this column.
+\def\pickupwholefraction#1.#2 {%
+ \global\advance\colcount by 1
+ \expandafter\xdef\csname col\the\colcount\endcsname{.#2\hsize}%
+ \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+ \def\firstarg{#1}%
+ \ifx\firstarg\xendsetuptable
+ \let\go = \relax
+ \else
+ \ifx\firstarg\xcolumnfractions
+ \global\setpercenttrue
+ \else
+ \ifsetpercent
+ \let\go\pickupwholefraction
+ \else
+ \global\advance\colcount by 1
+ \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+ % separator; typically that is always in the input, anyway.
+ \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+ \fi
+ \fi
+ \ifx\go\pickupwholefraction
+ % Put the argument back for the \pickupwholefraction call, so
+ % we'll always have a period there to be parsed.
+ \def\go{\pickupwholefraction#1}%
+ \else
+ \let\go = \setuptable
+ \fi%
+ \fi
+ \go
+}
+
+% @multitable ... @end multitable definitions:
+%
+\def\multitable{\parsearg\dotable}
+\def\dotable#1{\bgroup
+ \vskip\parskip
+ \let\item=\crcrwithfootnotes
+ % A \tab used to include \hskip1sp. But then the space in a template
+ % line is not enough. That is bad. So let's go back to just & until
+ % we encounter the problem it was intended to solve again. --karl,
+ % nathan@acm.org, 20apr99.
+ \let\tab=&%
+ \let\startfootins=\startsavedfootnote
+ \tolerance=9500
+ \hbadness=9500
+ \setmultitablespacing
+ \parskip=\multitableparskip
+ \parindent=\multitableparindent
+ \overfullrule=0pt
+ \global\colcount=0
+ \def\Emultitable{%
+ \global\setpercentfalse
+ \crcrwithfootnotes\crcr
+ \egroup\egroup
+ }%
+ %
+ % To parse everything between @multitable and @item:
+ \setuptable#1 \endsetuptable
+ %
+ % \everycr will reset column counter, \colcount, at the end of
+ % each line. Every column entry will cause \colcount to advance by one.
+ % The table preamble
+ % looks at the current \colcount to find the correct column width.
+ \everycr{\noalign{%
+ %
+ % \filbreak%% keeps underfull box messages off when table breaks over pages.
+ % Maybe so, but it also creates really weird page breaks when the table
+ % breaks over pages. Wouldn't \vfil be better? Wait until the problem
+ % manifests itself, so it can be fixed for real --karl.
+ \global\colcount=0\relax}}%
+ %
+ % This preamble sets up a generic column definition, which will
+ % be used as many times as user calls for columns.
+ % \vtop will set a single line and will also let text wrap and
+ % continue for many paragraphs if desired.
+ \halign\bgroup&\global\advance\colcount by 1\relax
+ \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
+ %
+ % In order to keep entries from bumping into each other
+ % we will add a \leftskip of \multitablecolspace to all columns after
+ % the first one.
+ %
+ % If a template has been used, we will add \multitablecolspace
+ % to the width of each template entry.
+ %
+ % If the user has set preamble in terms of percent of \hsize we will
+ % use that dimension as the width of the column, and the \leftskip
+ % will keep entries from bumping into each other. Table will start at
+ % left margin and final column will justify at right margin.
+ %
+ % Make sure we don't inherit \rightskip from the outer environment.
+ \rightskip=0pt
+ \ifnum\colcount=1
+ % The first column will be indented with the surrounding text.
+ \advance\hsize by\leftskip
+ \else
+ \ifsetpercent \else
+ % If user has not set preamble in terms of percent of \hsize
+ % we will advance \hsize by \multitablecolspace.
+ \advance\hsize by \multitablecolspace
+ \fi
+ % In either case we will make \leftskip=\multitablecolspace:
+ \leftskip=\multitablecolspace
+ \fi
+ % Ignoring space at the beginning and end avoids an occasional spurious
+ % blank line, when TeX decides to break the line at the space before the
+ % box from the multistrut, so the strut ends up on a line by itself.
+ % For example:
+ % @multitable @columnfractions .11 .89
+ % @item @code{#}
+ % @tab Legal holiday which is valid in major parts of the whole country.
+ % Is automatically provided with highlighting sequences respectively marking
+ % characters.
+ \noindent\ignorespaces##\unskip\multistrut}\cr
+}
+
+\def\setmultitablespacing{% test to see if user has set \multitablelinespace.
+% If so, do nothing. If not, give it an appropriate dimension based on
+% current baselineskip.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+%% strut to put in table in case some entry doesn't have descenders,
+%% to keep lines equally spaced
+\let\multistrut = \strut
+\else
+%% FIXME: what is \box0 supposed to be?
+\gdef\multistrut{\vrule height\multitablelinespace depth\dp0
+width0pt\relax} \fi
+%% Test to see if parskip is larger than space between lines of
+%% table. If not, do nothing.
+%% If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi}
+
+% In case a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is
+% finished. Otherwise, the insertion is lost, it never migrates to the
+% main vertical list. --kasal, 22jan03.
+%
+\newbox\savedfootnotes
+%
+% \dotable \let's \startfootins to this, so that \dofootnote will call
+% it instead of starting the insertion right away.
+\def\startsavedfootnote{%
+ \global\setbox\savedfootnotes = \vbox\bgroup
+ \unvbox\savedfootnotes
+}
+\def\crcrwithfootnotes{%
+ \crcr
+ \ifvoid\savedfootnotes \else
+ \noalign{\insert\footins{\box\savedfootnotes}}%
+ \fi
+}
+
+\message{conditionals,}
+% Prevent errors for section commands.
+% Used in @ignore and in failing conditionals.
+\def\ignoresections{%
+ \let\appendix=\relax
+ \let\appendixsec=\relax
+ \let\appendixsection=\relax
+ \let\appendixsubsec=\relax
+ \let\appendixsubsection=\relax
+ \let\appendixsubsubsec=\relax
+ \let\appendixsubsubsection=\relax
+ %\let\begin=\relax
+ %\let\bye=\relax
+ \let\centerchap=\relax
+ \let\chapter=\relax
+ \let\contents=\relax
+ \let\section=\relax
+ \let\smallbook=\relax
+ \let\subsec=\relax
+ \let\subsection=\relax
+ \let\subsubsec=\relax
+ \let\subsubsection=\relax
+ \let\titlepage=\relax
+ \let\top=\relax
+ \let\unnumbered=\relax
+ \let\unnumberedsec=\relax
+ \let\unnumberedsection=\relax
+ \let\unnumberedsubsec=\relax
+ \let\unnumberedsubsection=\relax
+ \let\unnumberedsubsubsec=\relax
+ \let\unnumberedsubsubsection=\relax
+}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescriptionword{documentdescription}
+\def\documentdescription{\doignore{documentdescription}}
+\def\html{\doignore{html}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% @dircategory CATEGORY -- specify a category of the dir file
+% which this file should belong to. Ignore this in TeX.
+\let\dircategory = \comment
+
+% Ignore text until a line `@end #1', keeping track of nested conditionals.
+%
+% A count to remember the depth of nesting.
+\newcount\doignorecount
+
+\def\doignore#1{\begingroup
+ % Don't complain about control sequences we have declared \outer.
+ \ignoresections
+ %
+ % Make sure that spaces turn into tokens that match what \doignoretext wants.
+ \catcode\spaceChar = 10
+ %
+ % Ignore braces, so mismatched braces don't cause trouble.
+ \catcode`\{ = 9
+ \catcode`\} = 9
+ %
+ % Count number of #1's that we've seen.
+ \doignorecount = 0
+ %
+ % Swallow text until we reach the matching `@end #1'.
+ \expandafter \dodoignore \csname#1\endcsname {#1}%
+}
+
+{ \catcode`@=11 % We want to use \ST@P which cannot appear in texinfo source.
+ \obeylines %
+ %
+ \gdef\dodoignore#1#2{%
+ % #1 contains, e.g., \ifinfo, a.k.a. @ifinfo.
+ % #2 contains the string `ifinfo'.
+ %
+ % Define a command to find the next `@end #2', which must be on a line
+ % by itself.
+ \long\def\doignoretext##1^^M\end #2{\doignoretextyyy##1^^M#1\ST@P}%
+ % And this command to find another #1 command, at the beginning of a
+ % line. (Otherwise, we would consider a line `@c @ifset', for
+ % example, to count as an @ifset for nesting.)
+ \long\def\doignoretextyyy##1^^M#1##2\ST@P{\doignoreyyy{##2}\ST@P}%
+ %
+ % And now expand that command.
+ \obeylines %
+ \doignoretext ^^M%
+ }%
+}
+
+\def\doignoreyyy#1{%
+ \def\temp{#1}%
+ \ifx\temp\empty % Nothing found.
+ \let\next\doignoretextzzz
+ \else % Found a nested condition, ...
+ \advance\doignorecount by 1
+ \let\next\doignoretextyyy % ..., look for another.
+ % If we're here, #1 ends with ^^M\ifinfo (for example).
+ \fi
+ \next #1% the token \ST@P is present just after this macro.
+}
+
+% We have to swallow the remaining "\ST@P".
+%
+\def\doignoretextzzz#1{%
+ \ifnum\doignorecount = 0 % We have just found the outermost @end.
+ \let\next\enddoignore
+ \else % Still inside a nested condition.
+ \advance\doignorecount by -1
+ \let\next\doignoretext % Look for the next @end.
+ \fi
+ \next
+}
+
+% Finish off ignored text.
+\def\enddoignore{\endgroup\ignorespaces}
+
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it. Make sure the catcode of space is correct to avoid
+% losing inside @example, for instance.
+%
+\def\set{\begingroup\catcode` =10
+ \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
+ \parsearg\setxxx}
+\def\setxxx#1{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+ \def\temp{#2}%
+ \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty
+ \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted.
+ \fi
+ \endgroup
+}
+% Can't use \xdef to pre-expand #2 and save some time, since \temp or
+% \next or other control sequences that we've defined might get us into
+% an infinite loop. Consider `@set foo @cite{bar}'.
+\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\def\clear{\parsearg\clearxxx}
+\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax}
+
+% @value{foo} gets the text saved in variable foo.
+{
+ \catcode`\_ = \active
+ %
+ % We might end up with active _ or - characters in the argument if
+ % we're called from @code, as @code{@value{foo-bar_}}. So \let any
+ % such active characters to their normal equivalents.
+ \gdef\value{\begingroup
+ \catcode`\-=\other \catcode`\_=\other
+ \indexbreaks \let_\normalunderscore
+ \valuexxx}
+}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we \let\value to this in \indexdummies). Ones
+% whose names contain - or _ still won't work, but we can't do anything
+% about that. The command has to be fully expandable (if the variable
+% is set), since the result winds up in the index file. This means that
+% if the variable's value contains other Texinfo commands, it's almost
+% certain it will fail (although perhaps we could fix that with
+% sufficient work to do a one-level expansion on the result, instead of
+% complete).
+%
+\def\expandablevalue#1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ {[No value for ``#1'']}%
+ \message{Variable `#1', used in @value, is not set.}%
+ \else
+ \csname SET#1\endcsname
+ \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+\def\ifset{\parsearg\doifset}
+\def\doifset#1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ \let\next=\ifsetfail
+ \else
+ \let\next=\ifsetsucceed
+ \fi
+ \next
+}
+\def\ifsetsucceed{\conditionalsucceed{ifset}}
+\def\ifsetfail{\doignore{ifset}}
+\defineunmatchedend{ifset}
+
+% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+\def\ifclear{\parsearg\doifclear}
+\def\doifclear#1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ \let\next=\ifclearsucceed
+ \else
+ \let\next=\ifclearfail
+ \fi
+ \next
+}
+\def\ifclearsucceed{\conditionalsucceed{ifclear}}
+\def\ifclearfail{\doignore{ifclear}}
+\defineunmatchedend{ifclear}
+
+% @iftex, @ifnothtml, @ifnotinfo, @ifnotplaintext always succeed; we
+% read the text following, through the first @end iftex (etc.). Make
+% `@end iftex' (etc.) valid only after an @iftex.
+%
+\def\iftex{\conditionalsucceed{iftex}}
+\def\ifnothtml{\conditionalsucceed{ifnothtml}}
+\def\ifnotinfo{\conditionalsucceed{ifnotinfo}}
+\def\ifnotplaintext{\conditionalsucceed{ifnotplaintext}}
+\defineunmatchedend{iftex}
+\defineunmatchedend{ifnothtml}
+\defineunmatchedend{ifnotinfo}
+\defineunmatchedend{ifnotplaintext}
+
+% True conditional. Since \set globally defines its variables, we can
+% just start and end a group (to keep the @end definition undefined at
+% the outer level).
+%
+\def\conditionalsucceed#1{\begingroup
+ \expandafter\def\csname E#1\endcsname{\endgroup}%
+}
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within \newindex.
+{\catcode`\@=11
+\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that accumulates this index. The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{% % Define @#1index
+ \noexpand\doindex{#1}}
+}
+
+% @defindex foo == \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{%
+ \noexpand\docodeindex{#1}}%
+}
+
+
+% @synindex foo bar makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+%
+% @syncodeindex foo bar similar, but put all entries made for index foo
+% inside @code.
+%
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+ % Only do \closeout if we haven't already done it, else we'll end up
+ % closing the target index.
+ \expandafter \ifx\csname donesynindex#2\endcsname \undefined
+ % The \closeout helps reduce unnecessary open files; the limit on the
+ % Acorn RISC OS is a mere 16 files.
+ \expandafter\closeout\csname#2indfile\endcsname
+ \expandafter\let\csname\donesynindex#2\endcsname = 1
+ \fi
+ % redefine \fooindfile:
+ \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+ \expandafter\let\csname#2indfile\endcsname=\temp
+ % redefine \fooindex:
+ \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+% and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+% Take care of Texinfo commands that can appear in an index entry.
+% Since there are some commands we want to expand, and others we don't,
+% we have to laboriously prevent expansion for those that we don't.
+%
+\def\indexdummies{%
+ \def\@{@}% change to @@ when we switch to @ as escape char in index files.
+ \def\ {\realbackslash\space }%
+ % Need these in case \tex is in effect and \{ is a \delimiter again.
+ % But can't use \lbracecmd and \rbracecmd because texindex assumes
+ % braces and backslashes are used only as delimiters.
+ \let\{ = \mylbrace
+ \let\} = \myrbrace
+ %
+ % \definedummyword defines \#1 as \realbackslash #1\space, thus
+ % effectively preventing its expansion. This is used only for control
+ % words, not control letters, because the \space would be incorrect
+ % for control characters, but is needed to separate the control word
+ % from whatever follows.
+ %
+ % For control letters, we have \definedummyletter, which omits the
+ % space.
+ %
+ % These can be used both for control words that take an argument and
+ % those that do not. If it is followed by {arg} in the input, then
+ % that will dutifully get written to the index (or wherever).
+ %
+ \def\definedummyword##1{%
+ \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}%
+ }%
+ \def\definedummyletter##1{%
+ \expandafter\def\csname ##1\endcsname{\realbackslash ##1}%
+ }%
+ %
+ % Do the redefinitions.
+ \commondummies
+}
+
+% For the aux file, @ is the escape character. So we want to redefine
+% everything using @ instead of \realbackslash. When everything uses
+% @, this will be simpler.
+%
+\def\atdummies{%
+ \def\@{@@}%
+ \def\ {@ }%
+ \let\{ = \lbraceatcmd
+ \let\} = \rbraceatcmd
+ %
+ % (See comments in \indexdummies.)
+ \def\definedummyword##1{%
+ \expandafter\def\csname ##1\endcsname{@##1\space}%
+ }%
+ \def\definedummyletter##1{%
+ \expandafter\def\csname ##1\endcsname{@##1}%
+ }%
+ %
+ % Do the redefinitions.
+ \commondummies
+}
+
+% Called from \indexdummies and \atdummies. \definedummyword and
+% \definedummyletter must be defined first.
+%
+\def\commondummies{%
+ %
+ \normalturnoffactive
+ %
+ % Control letters and accents.
+ \definedummyletter{_}%
+ \definedummyletter{,}%
+ \definedummyletter{"}%
+ \definedummyletter{`}%
+ \definedummyletter{'}%
+ \definedummyletter{^}%
+ \definedummyletter{~}%
+ \definedummyletter{=}%
+ \definedummyword{u}%
+ \definedummyword{v}%
+ \definedummyword{H}%
+ \definedummyword{dotaccent}%
+ \definedummyword{ringaccent}%
+ \definedummyword{tieaccent}%
+ \definedummyword{ubaraccent}%
+ \definedummyword{udotaccent}%
+ \definedummyword{dotless}%
+ %
+ % Other non-English letters.
+ \definedummyword{AA}%
+ \definedummyword{AE}%
+ \definedummyword{L}%
+ \definedummyword{OE}%
+ \definedummyword{O}%
+ \definedummyword{aa}%
+ \definedummyword{ae}%
+ \definedummyword{l}%
+ \definedummyword{oe}%
+ \definedummyword{o}%
+ \definedummyword{ss}%
+ %
+ % Although these internal commands shouldn't show up, sometimes they do.
+ \definedummyword{bf}%
+ \definedummyword{gtr}%
+ \definedummyword{hat}%
+ \definedummyword{less}%
+ \definedummyword{sf}%
+ \definedummyword{sl}%
+ \definedummyword{tclose}%
+ \definedummyword{tt}%
+ %
+ % Texinfo font commands.
+ \definedummyword{b}%
+ \definedummyword{i}%
+ \definedummyword{r}%
+ \definedummyword{sc}%
+ \definedummyword{t}%
+ %
+ \definedummyword{TeX}%
+ \definedummyword{acronym}%
+ \definedummyword{cite}%
+ \definedummyword{code}%
+ \definedummyword{command}%
+ \definedummyword{dfn}%
+ \definedummyword{dots}%
+ \definedummyword{emph}%
+ \definedummyword{env}%
+ \definedummyword{file}%
+ \definedummyword{kbd}%
+ \definedummyword{key}%
+ \definedummyword{math}%
+ \definedummyword{option}%
+ \definedummyword{samp}%
+ \definedummyword{strong}%
+ \definedummyword{uref}%
+ \definedummyword{url}%
+ \definedummyword{var}%
+ \definedummyword{verb}%
+ \definedummyword{w}%
+ %
+ % Assorted special characters.
+ \definedummyword{bullet}%
+ \definedummyword{copyright}%
+ \definedummyword{dots}%
+ \definedummyword{enddots}%
+ \definedummyword{equiv}%
+ \definedummyword{error}%
+ \definedummyword{expansion}%
+ \definedummyword{minus}%
+ \definedummyword{pounds}%
+ \definedummyword{point}%
+ \definedummyword{print}%
+ \definedummyword{result}%
+ %
+ % Handle some cases of @value -- where the variable name does not
+ % contain - or _, and the value does not contain any
+ % (non-fully-expandable) commands.
+ \let\value = \expandablevalue
+ %
+ % Normal spaces, not active ones.
+ \unsepspaces
+ %
+ % No macro expansion.
+ \turnoffmacros
+}
+
+% If an index command is used in an @example environment, any spaces
+% therein should become regular spaces in the raw index file, not the
+% expansion of \tie (\leavevmode \penalty \@M \ ).
+{\obeyspaces
+ \gdef\unsepspaces{\obeyspaces\let =\space}}
+
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names. It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexdummytex{TeX}
+\def\indexdummydots{...}
+%
+\def\indexnofonts{%
+ \def\ { }%
+ \def\@{@}%
+ % how to handle braces?
+ \def\_{\normalunderscore}%
+ %
+ \let\,=\asis
+ \let\"=\asis
+ \let\`=\asis
+ \let\'=\asis
+ \let\^=\asis
+ \let\~=\asis
+ \let\==\asis
+ \let\u=\asis
+ \let\v=\asis
+ \let\H=\asis
+ \let\dotaccent=\asis
+ \let\ringaccent=\asis
+ \let\tieaccent=\asis
+ \let\ubaraccent=\asis
+ \let\udotaccent=\asis
+ \let\dotless=\asis
+ %
+ % Other non-English letters.
+ \def\AA{AA}%
+ \def\AE{AE}%
+ \def\L{L}%
+ \def\OE{OE}%
+ \def\O{O}%
+ \def\aa{aa}%
+ \def\ae{ae}%
+ \def\l{l}%
+ \def\oe{oe}%
+ \def\o{o}%
+ \def\ss{ss}%
+ \def\exclamdown{!}%
+ \def\questiondown{?}%
+ %
+ % Don't no-op \tt, since it isn't a user-level command
+ % and is used in the definitions of the active chars like <, >, |, etc.
+ % Likewise with the other plain tex font commands.
+ %\let\tt=\asis
+ %
+ % Texinfo font commands.
+ \let\b=\asis
+ \let\i=\asis
+ \let\r=\asis
+ \let\sc=\asis
+ \let\t=\asis
+ %
+ \let\TeX=\indexdummytex
+ \let\acronym=\asis
+ \let\cite=\asis
+ \let\code=\asis
+ \let\command=\asis
+ \let\dfn=\asis
+ \let\dots=\indexdummydots
+ \let\emph=\asis
+ \let\env=\asis
+ \let\file=\asis
+ \let\kbd=\asis
+ \let\key=\asis
+ \let\math=\asis
+ \let\option=\asis
+ \let\samp=\asis
+ \let\strong=\asis
+ \let\uref=\asis
+ \let\url=\asis
+ \let\var=\asis
+ \let\verb=\asis
+ \let\w=\asis
+}
+
+\let\indexbackslash=0 %overridden during \printindex.
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% Most index entries go through here, but \dosubind is the general case.
+%
+\def\doind#1#2{\dosubind{#1}{#2}{}}
+
+% Workhorse for all \fooindexes.
+% #1 is name of index, #2 is stuff to put there, #3 is subentry --
+% \empty if called from \doind, as we usually are. The main exception
+% is with defuns, which call us directly.
+%
+\def\dosubind#1#2#3{%
+ \iflinks
+ {%
+ % Store the main index entry text (including the third arg).
+ \toks0 = {#2}%
+ % If third arg is present, precede it with space.
+ \def\thirdarg{#3}%
+ \ifx\thirdarg\empty \else
+ \toks0 = \expandafter{\the\toks0 \space #3}%
+ \fi
+ %
+ \edef\writeto{\csname#1indfile\endcsname}%
+ %
+ \ifvmode
+ \dosubindsanitize
+ \else
+ \dosubindwrite
+ \fi
+ }%
+ \fi
+}
+
+% Write the entry to the index file:
+%
+\def\dosubindwrite{%
+ % Put the index entry in the margin if desired.
+ \ifx\SETmarginindex\relax\else
+ \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
+ \fi
+ %
+ % Remember, we are within a group.
+ \indexdummies % Must do this here, since \bf, etc expand at this stage
+ \escapechar=`\\
+ \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
+ % so it will be output as is; and it will print as backslash.
+ %
+ % Process the index entry with all font commands turned off, to
+ % get the string to sort by.
+ {\indexnofonts
+ \edef\temp{\the\toks0}% need full expansion
+ \xdef\indexsorttmp{\temp}%
+ }%
+ %
+ % Set up the complete index entry, with both the sort key and
+ % the original text, including any font commands. We write
+ % three arguments to \entry to the .?? file (four in the
+ % subentry case), texindex reduces to two when writing the .??s
+ % sorted result.
+ \edef\temp{%
+ \write\writeto{%
+ \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
+ }%
+ \temp
+}
+
+% Take care of unwanted page breaks:
+%
+% If a skip is the last thing on the list now, preserve it
+% by backing up by \lastskip, doing the \write, then inserting
+% the skip again. Otherwise, the whatsit generated by the
+% \write will make \lastskip zero. The result is that sequences
+% like this:
+% @end defun
+% @tindex whatever
+% @defun ...
+% will have extra space inserted, because the \medbreak in the
+% start of the @defun won't see the skip inserted by the @end of
+% the previous defun.
+%
+% But don't do any of this if we're not in vertical mode. We
+% don't want to do a \vskip and prematurely end a paragraph.
+%
+% Avoid page breaks due to these extra skips, too.
+%
+\def\dosubindsanitize{%
+ % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
+ \skip0 = \lastskip
+ \count255 = \lastpenalty
+ %
+ % If \lastskip is nonzero, that means the last item was a
+ % skip. And since a skip is discardable, that means this
+ % -\skip0 glue we're inserting is preceded by a
+ % non-discardable item, therefore it is not a potential
+ % breakpoint, therefore no \nobreak needed.
+ \ifdim\lastskip = 0pt \else \vskip-\skip0 \fi
+ %
+ \dosubindwrite
+ %
+ \ifdim\skip0 = 0pt
+ % if \lastskip was zero, perhaps the last item was a
+ % penalty, and perhaps it was >=10000, e.g., a \nobreak.
+ % In that case, we want to re-insert the penalty; since we
+ % just inserted a non-discardable item, any following glue
+ % (such as a \parskip) would be a breakpoint. For example:
+ % @deffn deffn-whatever
+ % @vindex index-whatever
+ % Description.
+ % would allow a break between the index-whatever whatsit
+ % and the "Description." paragraph.
+ \ifnum\count255>9999 \nobreak \fi
+ \else
+ % On the other hand, if we had a nonzero \lastskip,
+ % this make-up glue would be preceded by a non-discardable item
+ % (the whatsit from the \write), so we must insert a \nobreak.
+ \nobreak\vskip\skip0
+ \fi
+}
+
+% The index entry written in the file actually looks like
+% \entry {sortstring}{page}{topic}
+% or
+% \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+% \initial {c}
+% before the first topic whose initial is c
+% \entry {topic}{pagelist}
+% for a topic that is used without subtopics
+% \primary {topic}
+% for the beginning of a topic that is used with subtopics
+% \secondary {subtopic}{pagelist}
+% for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\def\printindex{\parsearg\doprintindex}
+\def\doprintindex#1{\begingroup
+ \dobreak \chapheadingskip{10000}%
+ %
+ \smallfonts \rm
+ \tolerance = 9500
+ \everypar = {}% don't want the \kern\-parindent from indentation suppression.
+ \indexbreaks
+ %
+ % See if the index file exists and is nonempty.
+ % Change catcode of @ here so that if the index file contains
+ % \initial {@}
+ % as its first line, TeX doesn't complain about mismatched braces
+ % (because it thinks @} is a control sequence).
+ \catcode`\@ = 11
+ \openin 1 \jobname.#1s
+ \ifeof 1
+ % \enddoublecolumns gets confused if there is no text in the index,
+ % and it loses the chapter title and the aux file entries for the
+ % index. The easiest way to prevent this problem is to make sure
+ % there is some text.
+ \putwordIndexNonexistent
+ \else
+ %
+ % If the index file exists but is empty, then \openin leaves \ifeof
+ % false. We have to make TeX try to read something from the file, so
+ % it can discover if there is anything in it.
+ \read 1 to \temp
+ \ifeof 1
+ \putwordIndexIsEmpty
+ \else
+ % Index files are almost Texinfo source, but we use \ as the escape
+ % character. It would be better to use @, but that's too big a change
+ % to make right now.
+ \def\indexbackslash{\rawbackslashxx}%
+ \catcode`\\ = 0
+ \escapechar = `\\
+ \begindoublecolumns
+ \input \jobname.#1s
+ \enddoublecolumns
+ \fi
+ \fi
+ \closein 1
+\endgroup}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+\def\initial#1{{%
+ % Some minor font changes for the special characters.
+ \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+ %
+ % Remove any glue we may have, we'll be inserting our own.
+ \removelastskip
+ %
+ % We like breaks before the index initials, so insert a bonus.
+ \penalty -300
+ %
+ % Typeset the initial. Making this add up to a whole number of
+ % baselineskips increases the chance of the dots lining up from column
+ % to column. It still won't often be perfect, because of the stretch
+ % we need before each entry, but it's better.
+ %
+ % No shrink because it confuses \balancecolumns.
+ \vskip 1.67\baselineskip plus .5\baselineskip
+ \leftline{\secbf #1}%
+ \vskip .33\baselineskip plus .1\baselineskip
+ %
+ % Do our best not to break after the initial.
+ \nobreak
+}}
+
+% This typesets a paragraph consisting of #1, dot leaders, and then #2
+% flush to the right margin. It is used for index and table of contents
+% entries. The paragraph is indented by \leftskip.
+%
+\def\entry#1#2{\begingroup
+ %
+ % Start a new paragraph if necessary, so our assignments below can't
+ % affect previous text.
+ \par
+ %
+ % Do not fill out the last line with white space.
+ \parfillskip = 0in
+ %
+ % No extra space above this paragraph.
+ \parskip = 0in
+ %
+ % Do not prefer a separate line ending with a hyphen to fewer lines.
+ \finalhyphendemerits = 0
+ %
+ % \hangindent is only relevant when the entry text and page number
+ % don't both fit on one line. In that case, bob suggests starting the
+ % dots pretty far over on the line. Unfortunately, a large
+ % indentation looks wrong when the entry text itself is broken across
+ % lines. So we use a small indentation and put up with long leaders.
+ %
+ % \hangafter is reset to 1 (which is the value we want) at the start
+ % of each paragraph, so we need not do anything with that.
+ \hangindent = 2em
+ %
+ % When the entry text needs to be broken, just fill out the first line
+ % with blank space.
+ \rightskip = 0pt plus1fil
+ %
+ % A bit of stretch before each entry for the benefit of balancing columns.
+ \vskip 0pt plus1pt
+ %
+ % Start a ``paragraph'' for the index entry so the line breaking
+ % parameters we've set above will have an effect.
+ \noindent
+ %
+ % Insert the text of the index entry. TeX will do line-breaking on it.
+ #1%
+ % The following is kludged to not output a line of dots in the index if
+ % there are no page numbers. The next person who breaks this will be
+ % cursed by a Unix daemon.
+ \def\tempa{{\rm }}%
+ \def\tempb{#2}%
+ \edef\tempc{\tempa}%
+ \edef\tempd{\tempb}%
+ \ifx\tempc\tempd\ \else%
+ %
+ % If we must, put the page number on a line of its own, and fill out
+ % this line with blank space. (The \hfil is overwhelmed with the
+ % fill leaders glue in \indexdotfill if the page number does fit.)
+ \hfil\penalty50
+ \null\nobreak\indexdotfill % Have leaders before the page number.
+ %
+ % The `\ ' here is removed by the implicit \unskip that TeX does as
+ % part of (the primitive) \par. Without it, a spurious underfull
+ % \hbox ensues.
+ \ifpdf
+ \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+ \else
+ \ #2% The page number ends the paragraph.
+ \fi
+ \fi%
+ \par
+\endgroup}
+
+% Like \dotfill except takes at least 1 em.
+\def\indexdotfill{\cleaders
+ \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+\def\secondary#1#2{{%
+ \parfillskip=0in
+ \parskip=0in
+ \hangindent=1in
+ \hangafter=1
+ \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+ \ifpdf
+ \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+ \else
+ #2
+ \fi
+ \par
+}}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+ % Grab any single-column material above us.
+ \output = {%
+ %
+ % Here is a possibility not foreseen in manmac: if we accumulate a
+ % whole lot of material, we might end up calling this \output
+ % routine twice in a row (see the doublecol-lose test, which is
+ % essentially a couple of indexes with @setchapternewpage off). In
+ % that case we just ship out what is in \partialpage with the normal
+ % output routine. Generally, \partialpage will be empty when this
+ % runs and this will be a no-op. See the indexspread.tex test case.
+ \ifvoid\partialpage \else
+ \onepageout{\pagecontents\partialpage}%
+ \fi
+ %
+ \global\setbox\partialpage = \vbox{%
+ % Unvbox the main output page.
+ \unvbox\PAGE
+ \kern-\topskip \kern\baselineskip
+ }%
+ }%
+ \eject % run that output routine to set \partialpage
+ %
+ % Use the double-column output routine for subsequent pages.
+ \output = {\doublecolumnout}%
+ %
+ % Change the page size parameters. We could do this once outside this
+ % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+ % format, but then we repeat the same computation. Repeating a couple
+ % of assignments once per index is clearly meaningless for the
+ % execution time, so we may as well do it in one place.
+ %
+ % First we halve the line length, less a little for the gutter between
+ % the columns. We compute the gutter based on the line length, so it
+ % changes automatically with the paper format. The magic constant
+ % below is chosen so that the gutter has the same value (well, +-<1pt)
+ % as it did when we hard-coded it.
+ %
+ % We put the result in a separate register, \doublecolumhsize, so we
+ % can restore it in \pagesofar, after \hsize itself has (potentially)
+ % been clobbered.
+ %
+ \doublecolumnhsize = \hsize
+ \advance\doublecolumnhsize by -.04154\hsize
+ \divide\doublecolumnhsize by 2
+ \hsize = \doublecolumnhsize
+ %
+ % Double the \vsize as well. (We don't need a separate register here,
+ % since nobody clobbers \vsize.)
+ \vsize = 2\vsize
+}
+
+% The double-column output routine for all double-column pages except
+% the last.
+%
+\def\doublecolumnout{%
+ \splittopskip=\topskip \splitmaxdepth=\maxdepth
+ % Get the available space for the double columns -- the normal
+ % (undoubled) page height minus any material left over from the
+ % previous page.
+ \dimen@ = \vsize
+ \divide\dimen@ by 2
+ \advance\dimen@ by -\ht\partialpage
+ %
+ % box0 will be the left-hand column, box2 the right.
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ \onepageout\pagesofar
+ \unvbox255
+ \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+ \unvbox\partialpage
+ %
+ \hsize = \doublecolumnhsize
+ \wd0=\hsize \wd2=\hsize
+ \hbox to\pagewidth{\box0\hfil\box2}%
+}
+%
+% All done with double columns.
+\def\enddoublecolumns{%
+ \output = {%
+ % Split the last of the double-column material. Leave it on the
+ % current page, no automatic page break.
+ \balancecolumns
+ %
+ % If we end up splitting too much material for the current page,
+ % though, there will be another page break right after this \output
+ % invocation ends. Having called \balancecolumns once, we do not
+ % want to call it again. Therefore, reset \output to its normal
+ % definition right away. (We hope \balancecolumns will never be
+ % called on to balance too much material, but if it is, this makes
+ % the output somewhat more palatable.)
+ \global\output = {\onepageout{\pagecontents\PAGE}}%
+ }%
+ \eject
+ \endgroup % started in \begindoublecolumns
+ %
+ % \pagegoal was set to the doubled \vsize above, since we restarted
+ % the current page. We're now back to normal single-column
+ % typesetting, so reset \pagegoal to the normal \vsize (after the
+ % \endgroup where \vsize got restored).
+ \pagegoal = \vsize
+}
+%
+% Called at the end of the double column material.
+\def\balancecolumns{%
+ \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
+ \dimen@ = \ht0
+ \advance\dimen@ by \topskip
+ \advance\dimen@ by-\baselineskip
+ \divide\dimen@ by 2 % target to split to
+ %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
+ \splittopskip = \topskip
+ % Loop until we get a decent breakpoint.
+ {%
+ \vbadness = 10000
+ \loop
+ \global\setbox3 = \copy0
+ \global\setbox1 = \vsplit3 to \dimen@
+ \ifdim\ht3>\dimen@
+ \global\advance\dimen@ by 1pt
+ \repeat
+ }%
+ %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
+ \setbox0=\vbox to\dimen@{\unvbox1}%
+ \setbox2=\vbox to\dimen@{\unvbox3}%
+ %
+ \pagesofar
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+% \unnumberedno is an oxymoron, of course. But we count the unnumbered
+% sections so that we can refer to them unambiguously in the pdf
+% outlines by their "section number". We avoid collisions with chapter
+% numbers by starting them at 10000. (If a document ever has 10000
+% chapters, we're in trouble anyway, I'm sure.)
+\newcount\unnumberedno \unnumberedno = 10000
+\newcount\chapno
+\newcount\secno \secno=0
+\newcount\subsecno \subsecno=0
+\newcount\subsubsecno \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno \appendixno = `\@
+%
+% \def\appendixletter{\char\the\appendixno}
+% We do the following ugly conditional instead of the above simple
+% construct for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+%
+\def\appendixletter{%
+ \ifnum\appendixno=`A A%
+ \else\ifnum\appendixno=`B B%
+ \else\ifnum\appendixno=`C C%
+ \else\ifnum\appendixno=`D D%
+ \else\ifnum\appendixno=`E E%
+ \else\ifnum\appendixno=`F F%
+ \else\ifnum\appendixno=`G G%
+ \else\ifnum\appendixno=`H H%
+ \else\ifnum\appendixno=`I I%
+ \else\ifnum\appendixno=`J J%
+ \else\ifnum\appendixno=`K K%
+ \else\ifnum\appendixno=`L L%
+ \else\ifnum\appendixno=`M M%
+ \else\ifnum\appendixno=`N N%
+ \else\ifnum\appendixno=`O O%
+ \else\ifnum\appendixno=`P P%
+ \else\ifnum\appendixno=`Q Q%
+ \else\ifnum\appendixno=`R R%
+ \else\ifnum\appendixno=`S S%
+ \else\ifnum\appendixno=`T T%
+ \else\ifnum\appendixno=`U U%
+ \else\ifnum\appendixno=`V V%
+ \else\ifnum\appendixno=`W W%
+ \else\ifnum\appendixno=`X X%
+ \else\ifnum\appendixno=`Y Y%
+ \else\ifnum\appendixno=`Z Z%
+ % The \the is necessary, despite appearances, because \appendixletter is
+ % expanded while writing the .toc file. \char\appendixno is not
+ % expandable, thus it is written literally, thus all appendixes come out
+ % with the same letter (or @) in the toc without it.
+ \else\char\the\appendixno
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines this as the name of the chapter.
+% page headings and footings can use it. @section does likewise.
+% However, they are not reliable, because we don't use marks.
+\def\thischapter{}
+\def\thissection{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% Choose a numbered-heading macro
+% #1 is heading level if unmodified by @raisesections or @lowersections
+% #2 is text for heading
+\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+ \chapterzzz{#2}%
+ \or \seczzz{#2}%
+ \or \numberedsubseczzz{#2}%
+ \or \numberedsubsubseczzz{#2}%
+ \else
+ \ifnum \absseclevel<0 \chapterzzz{#2}%
+ \else \numberedsubsubseczzz{#2}%
+ \fi
+ \fi
+ \suppressfirstparagraphindent
+}
+
+% like \numhead, but chooses appendix heading levels
+\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+ \appendixzzz{#2}%
+ \or \appendixsectionzzz{#2}%
+ \or \appendixsubseczzz{#2}%
+ \or \appendixsubsubseczzz{#2}%
+ \else
+ \ifnum \absseclevel<0 \appendixzzz{#2}%
+ \else \appendixsubsubseczzz{#2}%
+ \fi
+ \fi
+ \suppressfirstparagraphindent
+}
+
+% like \numhead, but chooses numberless heading levels
+\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+ \ifcase\absseclevel
+ \unnumberedzzz{#2}%
+ \or \unnumberedseczzz{#2}%
+ \or \unnumberedsubseczzz{#2}%
+ \or \unnumberedsubsubseczzz{#2}%
+ \else
+ \ifnum \absseclevel<0 \unnumberedzzz{#2}%
+ \else \unnumberedsubsubseczzz{#2}%
+ \fi
+ \fi
+ \suppressfirstparagraphindent
+}
+
+% @chapter, @appendix, @unnumbered.
+%
+\outer\def\chapter{\parsearg\chapteryyy}
+\def\chapteryyy#1{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz#1{%
+ \secno=0 \subsecno=0 \subsubsecno=0 \advance\chapno by 1
+ \message{\putwordChapter\space \the\chapno}%
+ %
+ % Write the actual heading.
+ \chapmacro{#1}{Ynumbered}{\the\chapno}%
+ %
+ % So @section and the like are numbered underneath this chapter.
+ \global\let\section = \numberedsec
+ \global\let\subsection = \numberedsubsec
+ \global\let\subsubsection = \numberedsubsubsec
+}
+
+\outer\def\appendix{\parsearg\appendixyyy}
+\def\appendixyyy#1{\apphead0{#1}} % normally apphead0 calls appendixzzz
+\def\appendixzzz#1{%
+ \secno=0 \subsecno=0 \subsubsecno=0 \advance\appendixno by 1
+ \def\appendixnum{\putwordAppendix\space \appendixletter}%
+ \message{\appendixnum}%
+ \chapmacro{#1}{Yappendix}{\appendixletter}%
+ \global\let\section = \appendixsec
+ \global\let\subsection = \appendixsubsec
+ \global\let\subsubsection = \appendixsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\def\centerchap{\parsearg\centerchapyyy}
+\def\centerchapyyy#1{{\unnumberedyyy{#1}}}
+
+% @top is like @unnumbered.
+\outer\def\top{\parsearg\unnumberedyyy}
+
+\outer\def\unnumbered{\parsearg\unnumberedyyy}
+\def\unnumberedyyy#1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz#1{%
+ \secno=0 \subsecno=0 \subsubsecno=0 \advance\unnumberedno by 1
+ %
+ % This used to be simply \message{#1}, but TeX fully expands the
+ % argument to \message. Therefore, if #1 contained @-commands, TeX
+ % expanded them. For example, in `@unnumbered The @cite{Book}', TeX
+ % expanded @cite (which turns out to cause errors because \cite is meant
+ % to be executed, not expanded).
+ %
+ % Anyway, we don't want the fully-expanded definition of @cite to appear
+ % as a result of the \message, we just want `@cite' itself. We use
+ % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+ % simply yielding the contents of <toks register>. (We also do this for
+ % the toc entries.)
+ \toks0 = {#1}\message{(\the\toks0)}%
+ %
+ \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
+ %
+ \global\let\section = \unnumberedsec
+ \global\let\subsection = \unnumberedsubsec
+ \global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% Sections.
+\outer\def\numberedsec{\parsearg\secyyy}
+\def\secyyy#1{\numhead1{#1}} % normally calls seczzz
+\def\seczzz#1{%
+ \subsecno=0 \subsubsecno=0 \advance\secno by 1
+ \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
+}
+
+\outer\def\appendixsection{\parsearg\appendixsecyyy}
+\outer\def\appendixsec{\parsearg\appendixsecyyy}
+\def\appendixsecyyy#1{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz#1{%
+ \subsecno=0 \subsubsecno=0 \advance\secno by 1
+ \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
+}
+
+\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy}
+\def\unnumberedsecyyy#1{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz#1{%
+ \subsecno=0 \subsubsecno=0 \advance\secno by 1
+ \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
+}
+
+% Subsections.
+\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy}
+\def\numberedsubsecyyy#1{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz#1{%
+ \subsubsecno=0 \advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
+}
+
+\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy}
+\def\appendixsubsecyyy#1{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz#1{%
+ \subsubsecno=0 \advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Yappendix}%
+ {\appendixletter.\the\secno.\the\subsecno}%
+}
+
+\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}
+\def\unnumberedsubsecyyy#1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz#1{%
+ \subsubsecno=0 \advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Ynothing}%
+ {\the\unnumberedno.\the\secno.\the\subsecno}%
+}
+
+% Subsubsections.
+\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy}
+\def\numberedsubsubsecyyy#1{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz#1{%
+ \advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Ynumbered}%
+ {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy}
+\def\appendixsubsubsecyyy#1{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz#1{%
+ \advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Yappendix}%
+ {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
+\def\unnumberedsubsubsecyyy#1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz#1{%
+ \advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Ynothing}%
+ {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% These are variants which are not "outer", so they can appear in @ifinfo.
+% Actually, they are now be obsolete; ordinary section commands should work.
+\def\infotop{\parsearg\unnumberedzzz}
+\def\infounnumbered{\parsearg\unnumberedzzz}
+\def\infounnumberedsec{\parsearg\unnumberedseczzz}
+\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
+\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
+
+\def\infoappendix{\parsearg\appendixzzz}
+\def\infoappendixsec{\parsearg\appendixseczzz}
+\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
+\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
+
+\def\infochapter{\parsearg\chapterzzz}
+\def\infosection{\parsearg\sectionzzz}
+\def\infosubsection{\parsearg\subsectionzzz}
+\def\infosubsubsection{\parsearg\subsubsectionzzz}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\let\section = \numberedsec
+\let\subsection = \numberedsubsec
+\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and such:
+% 1) We use \vbox rather than the earlier \line to permit
+% overlong headings to fold.
+% 2) \hyphenpenalty is set to 10000 because hyphenation in a
+% heading is obnoxious; this forbids it.
+% 3) Likewise, headings look best if no \parindent is used, and
+% if justification is not attempted. Hence \raggedright.
+
+
+\def\majorheading{%
+ {\advance\chapheadingskip by 10pt \chapbreak }%
+ \parsearg\chapheadingzzz
+}
+
+\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
+\def\chapheadingzzz#1{%
+ {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}%
+ \bigskip \par\penalty 200\relax
+ \suppressfirstparagraphindent
+}
+
+% @heading, @subheading, @subsubheading.
+\def\heading{\parsearg\doheading}
+\def\subheading{\parsearg\dosubheading}
+\def\subsubheading{\parsearg\dosubsubheading}
+\def\doheading#1{\sectionheading{#1}{sec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+\def\dosubheading#1{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+\def\dosubsubheading#1{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip\chapheadingskip
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{%
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+\def\CHAPFplain{%
+\global\let\chapmacro=\chfplain
+\global\let\centerchapmacro=\centerchfplain}
+
+% Normal chapter opening.
+%
+% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
+% Yappendix, Yomitfromtoc), #3 the chapter number.
+%
+% To test against our argument.
+\def\Ynothingkeyword{Ynothing}
+\def\Yomitfromtockeyword{Yomitfromtoc}
+\def\Yappendixkeyword{Yappendix}
+%
+\def\chfplain#1#2#3{%
+ \pchapsepmacro
+ {%
+ \chapfonts \rm
+ %
+ % Have to define \thissection before calling \donoderef, because the
+ % xref code eventually uses it, as \Ytitle. On the other hand, it
+ % has to be called after \pchapsepmacro, or the headline will change
+ % too soon.
+ \gdef\thissection{#1}%
+ \gdef\thischaptername{#1}%
+ %
+ % Only insert the separating space if we have a chapter/appendix
+ % number, and don't print the unnumbered ``number''.
+ \def\temptype{#2}%
+ \ifx\temptype\Ynothingkeyword
+ \setbox0 = \hbox{}%
+ \def\toctype{unnchap}%
+ \def\thischapter{#1}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
+ \def\toctype{omit}%
+ \xdef\thischapter{}%
+ \else\ifx\temptype\Yappendixkeyword
+ \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
+ \def\toctype{app}%
+ % We don't substitute the actual chapter name into \thischapter
+ % because we don't want its macros evaluated now. And we don't
+ % use \thissection because that changes with each section.
+ %
+ \xdef\thischapter{\putwordAppendix{} \appendixletter:
+ \noexpand\thischaptername}%
+ \else
+ \setbox0 = \hbox{#3\enspace}%
+ \def\toctype{numchap}%
+ \xdef\thischapter{\putwordChapter{} \the\chapno:
+ \noexpand\thischaptername}%
+ \fi\fi\fi
+ %
+ % Write the toc entry for this chapter. Must come before the
+ % \donoderef, because we include the current node name in the toc
+ % entry, and \donoderef resets it to empty.
+ \writetocentry{\toctype}{#1}{#3}%
+ %
+ % For pdftex, we have to write out the node definition (aka, make
+ % the pdfdest) after any page break, but before the actual text has
+ % been typeset. If the destination for the pdf outline is after the
+ % text, then jumping from the outline may wind up with the text not
+ % being visible, for instance under high magnification.
+ \donoderef{#2}%
+ %
+ % Typeset the actual heading.
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+ \hangindent=\wd0 \centerparametersmaybe
+ \unhbox0 #1\par}%
+ }%
+ \nobreak\bigskip % no page break after a chapter title
+ \nobreak
+}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerchfplain#1{{%
+ \def\centerparametersmaybe{%
+ \advance\rightskip by 3\rightskip
+ \leftskip = \rightskip
+ \parfillskip = 0pt
+ }%
+ \chfplain{#1}{Ynothing}{}%
+}}
+
+\CHAPFplain % The default
+
+% I don't think this chapter style is supported any more, so I'm not
+% updating it with the new noderef stuff. We'll see. --karl, 11aug03.
+%
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\nobreak
+}
+
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+
+\def\centerchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt
+ \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
+}
+
+\def\CHAPFopen{%
+\global\let\chapmacro=\chfopen
+\global\let\centerchapmacro=\centerchfopen}
+
+
+% Section titles. These macros combine the section number parts and
+% call the generic \sectionheading to do the printing.
+%
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
+
+% Subsection titles.
+\newskip\subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
+
+% Subsubsection titles.
+\def\subsubsecheadingskip{\subsecheadingskip}
+\def\subsubsecheadingbreak{\subsecheadingbreak}
+
+
+% Print any size, any type, section title.
+%
+% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
+% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
+% section number.
+%
+\def\sectionheading#1#2#3#4{%
+ {%
+ % Switch to the right set of fonts.
+ \csname #2fonts\endcsname \rm
+ %
+ % Insert space above the heading.
+ \csname #2headingbreak\endcsname
+ %
+ % Only insert the space after the number if we have a section number.
+ \def\sectionlevel{#2}%
+ \def\temptype{#3}%
+ %
+ \ifx\temptype\Ynothingkeyword
+ \setbox0 = \hbox{}%
+ \def\toctype{unn}%
+ \gdef\thissection{#1}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ % for @headings -- no section number, don't include in toc,
+ % and don't redefine \thissection.
+ \setbox0 = \hbox{}%
+ \def\toctype{omit}%
+ \let\sectionlevel=\empty
+ \else\ifx\temptype\Yappendixkeyword
+ \setbox0 = \hbox{#4\enspace}%
+ \def\toctype{app}%
+ \gdef\thissection{#1}%
+ \else
+ \setbox0 = \hbox{#4\enspace}%
+ \def\toctype{num}%
+ \gdef\thissection{#1}%
+ \fi\fi\fi
+ %
+ % Write the toc entry (before \donoderef). See comments in \chfplain.
+ \writetocentry{\toctype\sectionlevel}{#1}{#4}%
+ %
+ % Write the node reference (= pdf destination for pdftex).
+ % Again, see comments in \chfplain.
+ \donoderef{#3}%
+ %
+ % Output the actual section heading.
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+ \hangindent=\wd0 % zero if no section number
+ \unhbox0 #1}%
+ }%
+ % Add extra space after the heading -- half of whatever came above it.
+ % Don't allow stretch, though.
+ \kern .5 \csname #2headingskip\endcsname
+ %
+ % Do not let the kern be a potential breakpoint, as it would be if it
+ % was followed by glue.
+ \nobreak
+ %
+ % We'll almost certainly start a paragraph next, so don't let that
+ % glue accumulate. (Not a breakpoint because it's preceded by a
+ % discardable item.)
+ \vskip-\parskip
+ %
+ % This \nobreak is purely so the last item on the list is a \penalty
+ % of 10000. This is so other code, for instance \parsebodycommon, can
+ % check for and avoid allowing breakpoints. Otherwise, it would
+ % insert a valid breakpoint between:
+ % @section sec-whatever
+ % @deffn def-whatever
+ \nobreak
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc.
+%
+% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
+% We append the current node name (if any) and page number as additional
+% arguments for the \{chap,sec,...}entry macros which will eventually
+% read this. The node name is used in the pdf outlines as the
+% destination to jump to.
+%
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+% But if #1 is `omit', then we don't do anything. This is used for the
+% table of contents chapter openings themselves.
+%
+\newif\iftocfileopened
+\def\omitkeyword{omit}%
+%
+\def\writetocentry#1#2#3{%
+ \edef\writetoctype{#1}%
+ \ifx\writetoctype\omitkeyword \else
+ \iftocfileopened\else
+ \immediate\openout\tocfile = \jobname.toc
+ \global\tocfileopenedtrue
+ \fi
+ %
+ \iflinks
+ \toks0 = {#2}%
+ \toks2 = \expandafter{\lastnode}%
+ \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}{#3}%
+ {\the\toks2}{\noexpand\folio}}}%
+ \temp
+ \fi
+ \fi
+ %
+ % Tell \shipout to create a pdf destination on each page, if we're
+ % writing pdf. These are used in the table of contents. We can't
+ % just write one on every page because the title pages are numbered
+ % 1 and 2 (the page numbers aren't printed), and so are the first
+ % two pages of the document. Thus, we'd have two destinations named
+ % `1', and two named `2'.
+ \ifpdf \global\pdfmakepagedesttrue \fi
+}
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Prepare to read what we've written to \tocfile.
+%
+\def\startcontents#1{%
+ % If @setchapternewpage on, and @headings double, the contents should
+ % start on an odd page, unlike chapters. Thus, we maintain
+ % \contentsalignmacro in parallel with \pagealignmacro.
+ % From: Torbjorn Granlund <tege@matematik.su.se>
+ \contentsalignmacro
+ \immediate\closeout\tocfile
+ %
+ % Don't need to put `Contents' or `Short Contents' in the headline.
+ % It is abundantly clear what they are.
+ \def\thischapter{}%
+ \chapmacro{#1}{Yomitfromtoc}{}%
+ %
+ \savepageno = \pageno
+ \begingroup % Set up to handle contents files properly.
+ \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11
+ % We can't do this, because then an actual ^ in a section
+ % title fails, e.g., @chapter ^ -- exponentiation. --karl, 9jul97.
+ %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
+ \raggedbottom % Worry more about breakpoints than the bottom.
+ \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+ %
+ % Roman numerals for page numbers.
+ \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+
+% Normal (long) toc.
+\def\contents{%
+ \startcontents{\putwordTOC}%
+ \openin 1 \jobname.toc
+ \ifeof 1 \else
+ \closein 1
+ \input \jobname.toc
+ \fi
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \pdfmakeoutlines
+ \endgroup
+ \lastnegativepageno = \pageno
+ \global\pageno = \savepageno
+}
+
+% And just the chapters.
+\def\summarycontents{%
+ \startcontents{\putwordShortTOC}%
+ %
+ \let\numchapentry = \shortchapentry
+ \let\appentry = \shortchapentry
+ \let\unnchapentry = \shortunnchapentry
+ % We want a true roman here for the page numbers.
+ \secfonts
+ \let\rm=\shortcontrm \let\bf=\shortcontbf
+ \let\sl=\shortcontsl \let\tt=\shortconttt
+ \rm
+ \hyphenpenalty = 10000
+ \advance\baselineskip by 1pt % Open it up a little.
+ \def\numsecentry##1##2##3##4{}
+ \let\appsecentry = \numsecentry
+ \let\unnsecentry = \numsecentry
+ \let\numsubsecentry = \numsecentry
+ \let\appsubsecentry = \numsecentry
+ \let\unnsubsecentry = \numsecentry
+ \let\numsubsubsecentry = \numsecentry
+ \let\appsubsubsecentry = \numsecentry
+ \let\unnsubsubsecentry = \numsecentry
+ \openin 1 \jobname.toc
+ \ifeof 1 \else
+ \closein 1
+ \input \jobname.toc
+ \fi
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \endgroup
+ \lastnegativepageno = \pageno
+ \global\pageno = \savepageno
+}
+\let\shortcontents = \summarycontents
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
+%
+\def\shortchaplabel#1{%
+ % This space should be enough, since a single number is .5em, and the
+ % widest letter (M) is 1em, at least in the Computer Modern fonts.
+ % But use \hss just in case.
+ % (This space doesn't include the extra space that gets added after
+ % the label; that gets put in by \shortchapentry above.)
+ %
+ % We'd like to right-justify chapter numbers, but that looks strange
+ % with appendix letters. And right-justifying numbers and
+ % left-justifying letters looks strange when there is less than 10
+ % chapters. Have to read the whole toc once to know how many chapters
+ % there are before deciding ...
+ \hbox to 1em{#1\hss}%
+}
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Chapters, in the main contents.
+\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
+%
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3#4{%
+ \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
+}
+
+% Appendices, in the main contents.
+% Need the word Appendix, and a fixed-size box.
+%
+\def\appendixbox#1{%
+ % We use M since it's probably the widest letter.
+ \setbox0 = \hbox{\putwordAppendix{} M}%
+ \hbox to \wd0{\putwordAppendix{} #1\hss}}
+%
+\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
+
+% Unnumbered chapters.
+\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
+\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
+
+% Sections.
+\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
+\let\appsecentry=\numsecentry
+\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
+
+% Subsections.
+\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsecentry=\numsubsecentry
+\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
+
+% And subsubsections.
+\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsubsecentry=\numsubsubsecentry
+\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
+
+% This parameter controls the indentation of the various levels.
+\newdimen\tocindent \tocindent = 2pc
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+ \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+ \begingroup
+ \chapentryfonts
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+ \endgroup
+ \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+ \secentryfonts \leftskip=\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+ \subsecentryfonts \leftskip=2\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+ \subsubsecentryfonts \leftskip=3\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% Final typesetting of a toc entry; we use the same \entry macro as for
+% the index entries, but we want to suppress hyphenation here. (We
+% can't do that in the \entry macro, since index entries might consist
+% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.)
+\def\tocentry#1#2{\begingroup
+ \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks
+ % Do not use \turnoffactive in these arguments. Since the toc is
+ % typeset in cmr, characters such as _ would come out wrong; we
+ % have to do the usual translation tricks.
+ \entry{#1}{#2}%
+\endgroup}
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\def\subsecentryfonts{\textfonts}
+\def\subsubsecentryfonts{\textfonts}
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
+% Since these characters are used in examples, it should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+%
+\newbox\errorbox
+%
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
+%
+\global\setbox\errorbox=\hbox to \dimen0{\hfil
+ \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+ \advance\hsize by -2\dimen2 % Rules.
+ \vbox{
+ \hrule height\dimen2
+ \hbox{\vrule width\dimen2 \kern3pt % Space to left of text.
+ \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+ \kern3pt\vrule width\dimen2}% Space to right.
+ \hrule height\dimen2}
+ \hfil}
+%
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @tex ... @end tex escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\def\tex{\begingroup
+ \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+ \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+ \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+ \catcode `\%=14
+ \catcode `\+=\other
+ \catcode `\"=\other
+ \catcode `\==\other
+ \catcode `\|=\other
+ \catcode `\<=\other
+ \catcode `\>=\other
+ \escapechar=`\\
+ %
+ \let\b=\ptexb
+ \let\bullet=\ptexbullet
+ \let\c=\ptexc
+ \let\,=\ptexcomma
+ \let\.=\ptexdot
+ \let\dots=\ptexdots
+ \let\equiv=\ptexequiv
+ \let\!=\ptexexclam
+ \let\i=\ptexi
+ \let\indent=\ptexindent
+ \let\noindent=\ptexnoindent
+ \let\{=\ptexlbrace
+ \let\+=\tabalign
+ \let\}=\ptexrbrace
+ \let\/=\ptexslash
+ \let\*=\ptexstar
+ \let\t=\ptext
+ %
+ \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+ \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+ \def\@{@}%
+\let\Etex=\endgroup}
+
+% Define @lisp ... @end lisp.
+% @lisp does a \begingroup so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments. \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% Make each space character in the input produce a normal interword
+% space in the output. Don't allow a line break at this space, as this
+% is used only in environments like @example, where each line of input
+% should produce a line of output anyway.
+%
+{\obeyspaces %
+\gdef\sepspaces{\obeyspaces\let =\tie}}
+
+% Define \obeyedspace to be our active space, whatever it is. This is
+% for use in \parsearg.
+{\sepspaces%
+\global\let\obeyedspace= }
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical. We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip.
+%
+\def\aboveenvbreak{{%
+ % =10000 instead of <10000 because of a special case in \itemzzz, q.v.
+ \ifnum \lastpenalty=10000 \else
+ \advance\envskipamount by \parskip
+ \endgraf
+ \ifdim\lastskip<\envskipamount
+ \removelastskip
+ % it's not a good place to break if the last penalty was \nobreak
+ % or better ...
+ \ifnum\lastpenalty>10000 \else \penalty-50 \fi
+ \vskip\envskipamount
+ \fi
+ \fi
+}}
+
+\let\afterenvbreak = \aboveenvbreak
+
+% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+ \ctl\leaders\hrule height\circthick\hfil\ctr
+ \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+ \cbl\leaders\hrule height\circthick\hfil\cbr
+ \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\def\cartouche{%
+\par % can't be in the midst of a paragraph.
+\begingroup
+ \lskip=\leftskip \rskip=\rightskip
+ \leftskip=0pt\rightskip=0pt %we want these *outside*.
+ \cartinner=\hsize \advance\cartinner by-\lskip
+ \advance\cartinner by-\rskip
+ \cartouter=\hsize
+ \advance\cartouter by 18.4pt % allow for 3pt kerns on either
+% side, and for 6pt waste from
+% each corner char, and rule thickness
+ \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+ % Flag to tell @lisp, etc., not to narrow margin.
+ \let\nonarrowing=\comment
+ \vbox\bgroup
+ \baselineskip=0pt\parskip=0pt\lineskip=0pt
+ \carttop
+ \hbox\bgroup
+ \hskip\lskip
+ \vrule\kern3pt
+ \vbox\bgroup
+ \hsize=\cartinner
+ \kern3pt
+ \begingroup
+ \baselineskip=\normbskip
+ \lineskip=\normlskip
+ \parskip=\normpskip
+ \vskip -\parskip
+\def\Ecartouche{%
+ \endgroup
+ \kern3pt
+ \egroup
+ \kern3pt\vrule
+ \hskip\rskip
+ \egroup
+ \cartbot
+ \egroup
+\endgroup
+}}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\def\nonfillstart{%
+ \aboveenvbreak
+ \inENV % This group ends at the end of the body
+ \hfuzz = 12pt % Don't be fussy
+ \sepspaces % Make spaces be word-separators rather than space tokens.
+ \let\par = \lisppar % don't ignore blank lines
+ \obeylines % each line of input is a line of output
+ \parskip = 0pt
+ \parindent = 0pt
+ \emergencystretch = 0pt % don't try to avoid overfull boxes
+ % @cartouche defines \nonarrowing to inhibit narrowing
+ % at next level down.
+ \ifx\nonarrowing\relax
+ \advance \leftskip by \lispnarrowing
+ \exdentamount=\lispnarrowing
+ \let\exdent=\nofillexdent
+ \let\nonarrowing=\relax
+ \fi
+}
+
+% Define the \E... control sequence only if we are inside the particular
+% environment, so the error checking in \end will work.
+%
+% To end an @example-like environment, we first end the paragraph (via
+% \afterenvbreak's vertical glue), and then the group. That way we keep
+% the zero \parskip that the environments set -- \parskip glue will be
+% inserted at the beginning of the next paragraph in the document, after
+% the environment.
+%
+\def\nonfillfinish{\afterenvbreak\endgroup}
+
+% @lisp: indented, narrowed, typewriter font.
+\def\lisp{\begingroup
+ \nonfillstart
+ \let\Elisp = \nonfillfinish
+ \tt
+ \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+ \gobble % eat return
+}
+
+% @example: Same as @lisp.
+\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}
+
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+\def\smalllisp{\begingroup
+ \def\Esmalllisp{\nonfillfinish\endgroup}%
+ \def\Esmallexample{\nonfillfinish\endgroup}%
+ \smallexamplefonts
+ \lisp
+}
+\let\smallexample = \smalllisp
+
+
+% @display: same as @lisp except keep current font.
+%
+\def\display{\begingroup
+ \nonfillstart
+ \let\Edisplay = \nonfillfinish
+ \gobble
+}
+%
+% @smalldisplay: @display plus smaller fonts.
+%
+\def\smalldisplay{\begingroup
+ \def\Esmalldisplay{\nonfillfinish\endgroup}%
+ \smallexamplefonts \rm
+ \display
+}
+
+% @format: same as @display except don't narrow margins.
+%
+\def\format{\begingroup
+ \let\nonarrowing = t
+ \nonfillstart
+ \let\Eformat = \nonfillfinish
+ \gobble
+}
+%
+% @smallformat: @format plus smaller fonts.
+%
+\def\smallformat{\begingroup
+ \def\Esmallformat{\nonfillfinish\endgroup}%
+ \smallexamplefonts \rm
+ \format
+}
+
+% @flushleft (same as @format).
+%
+\def\flushleft{\begingroup \def\Eflushleft{\nonfillfinish\endgroup}\format}
+
+% @flushright.
+%
+\def\flushright{\begingroup
+ \let\nonarrowing = t
+ \nonfillstart
+ \let\Eflushright = \nonfillfinish
+ \advance\leftskip by 0pt plus 1fill
+ \gobble
+}
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins.
+%
+\def\quotation{%
+ \begingroup\inENV %This group ends at the end of the @quotation body
+ {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+ \parindent=0pt
+ % We have retained a nonzero parskip for the environment, since we're
+ % doing normal filling. So to avoid extra space below the environment...
+ \def\Equotation{\parskip = 0pt \nonfillfinish}%
+ %
+ % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+ \ifx\nonarrowing\relax
+ \advance\leftskip by \lispnarrowing
+ \advance\rightskip by \lispnarrowing
+ \exdentamount = \lispnarrowing
+ \let\nonarrowing = \relax
+ \fi
+}
+
+
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter,
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too. Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+ \do\ \do\\\do\{\do\}\do\$\do\&%
+ \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+ \do\<\do\>\do\|\do\@\do+\do\"%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+ \def\do##1{\catcode`##1=12}\dospecials}
+%
+% [Knuth] pp. 380,381,391
+% Disable Spanish ligatures ?` and !` of \tt font
+\begingroup
+ \catcode`\`=\active\gdef`{\relax\lq}
+\endgroup
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+ \tt % easiest (and conventionally used) font for verbatim
+ \def\par{\leavevmode\endgraf}%
+ \catcode`\`=\active
+ \tabeightspaces
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+\def\starttabbox{\setbox0=\hbox\bgroup}
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabexpand{%
+ \catcode`\^^I=\active
+ \def^^I{\leavevmode\egroup
+ \dimen0=\wd0 % the width so far, or since the previous tab
+ \divide\dimen0 by\tabw
+ \multiply\dimen0 by\tabw % compute previous multiple of \tabw
+ \advance\dimen0 by\tabw % advance to next multiple of \tabw
+ \wd0=\dimen0 \box0 \starttabbox
+ }%
+ }
+\endgroup
+\def\setupverbatim{%
+ % Easiest (and conventionally used) font for verbatim
+ \tt
+ \def\par{\leavevmode\egroup\box0\endgraf}%
+ \catcode`\`=\active
+ \tabexpand
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+ \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique
+% delimiter characters. Before first delimiter expect a
+% right brace, after last delimiter expect closing brace:
+%
+% \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+ \catcode`[=1\catcode`]=2\catcode`\{=12\catcode`\}=12
+ \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+% \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX,
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%% Include LaTeX hack for completeness -- never know
+%% \begingroup
+%% \catcode`|=0 \catcode`[=1
+%% \catcode`]=2\catcode`\{=12\catcode`\}=12\catcode`\ =\active
+%% \catcode`\\=12|gdef|doverbatim#1@end verbatim[
+%% #1|endgroup|def|Everbatim[]|end[verbatim]]
+%% |endgroup
+%
+\begingroup
+ \catcode`\ =\active
+ \obeylines %
+ % ignore everything up to the first ^^M, that's the newline at the end
+ % of the @verbatim input line itself. Otherwise we get an extra blank
+ % line in the output.
+ \gdef\doverbatim#1^^M#2@end verbatim{#2\end{verbatim}}%
+\endgroup
+%
+\def\verbatim{%
+ \def\Everbatim{\nonfillfinish\endgroup}%
+ \begingroup
+ \nonfillstart
+ \advance\leftskip by -\defbodyindent
+ \begingroup\setupverbatim\doverbatim
+}
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+% Allow normal characters that we make active in the argument (a file name).
+\def\verbatiminclude{%
+ \begingroup
+ \catcode`\\=\other
+ \catcode`~=\other
+ \catcode`^=\other
+ \catcode`_=\other
+ \catcode`|=\other
+ \catcode`<=\other
+ \catcode`>=\other
+ \catcode`+=\other
+ \parsearg\doverbatiminclude
+}
+\def\setupverbatiminclude{%
+ \begingroup
+ \nonfillstart
+ \advance\leftskip by -\defbodyindent
+ \begingroup\setupverbatim
+}
+%
+\def\doverbatiminclude#1{%
+ % Restore active chars for included file.
+ \endgroup
+ \begingroup
+ \let\value=\expandablevalue
+ \def\thisfile{#1}%
+ \expandafter\expandafter\setupverbatiminclude\input\thisfile
+ \endgroup
+ \nonfillfinish
+ \endgroup
+}
+
+% @copying ... @end copying.
+% Save the text away for @insertcopying later. Many commands won't be
+% allowed in this context, but that's ok.
+%
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is very desirable.
+%
+\def\copying{\begingroup
+ % Define a command to swallow text until we reach `@end copying'.
+ % \ is the escape char in this texinfo.tex file, so it is the
+ % delimiter for the command; @ will be the escape char when we read
+ % it, but that doesn't matter.
+ \long\def\docopying##1\end copying{\gdef\copyingtext{##1}\enddocopying}%
+ %
+ % We must preserve ^^M's in the input file; see \insertcopying below.
+ \catcode`\^^M = \active
+ \docopying
+}
+
+% What we do to finish off the copying text.
+%
+\def\enddocopying{\endgroup\ignorespaces}
+
+% @insertcopying. Here we must play games with ^^M's. On the one hand,
+% we need them to delimit commands such as `@end quotation', so they
+% must be active. On the other hand, we certainly don't want every
+% end-of-line to be a \par, as would happen with the normal active
+% definition of ^^M. On the third hand, two ^^M's in a row should still
+% generate a \par.
+%
+% Our approach is to make ^^M insert a space and a penalty1 normally;
+% then it can also check if \lastpenalty=1. If it does, then manually
+% do \par.
+%
+% This messes up the normal definitions of @c[omment], so we redefine
+% it. Similarly for @ignore. (These commands are used in the gcc
+% manual for man page generation.)
+%
+% Seems pretty fragile, most line-oriented commands will presumably
+% fail, but for the limited use of getting the copying text (which
+% should be quite simple) inserted, we can hope it's ok.
+%
+{\catcode`\^^M=\active %
+\gdef\insertcopying{\begingroup %
+ \parindent = 0pt % looks wrong on title page
+ \def^^M{%
+ \ifnum \lastpenalty=1 %
+ \par %
+ \else %
+ \space \penalty 1 %
+ \fi %
+ }%
+ %
+ % Fix @c[omment] for catcode 13 ^^M's.
+ \def\c##1^^M{\ignorespaces}%
+ \let\comment = \c %
+ %
+ % Don't bother jumping through all the hoops that \doignore does, it
+ % would be very hard since the catcodes are already set.
+ \long\def\ignore##1\end ignore{\ignorespaces}%
+ %
+ \copyingtext %
+\endgroup}%
+}
+
+\message{defuns,}
+% @defun etc.
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+
+\newcount\parencount
+
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+ \catcode`\(=\active \catcode`\)=\active
+ \catcode`\&=\active
+ \catcode`\[=\active \catcode`\]=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+{\activeparens % Now, smart parens don't turn on until &foo (see \amprm)
+
+% Be sure that we always have a definition for `(', etc. For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+\global\let(=\lparen \global\let)=\rparen
+\global\let[=\lbrack \global\let]=\rbrack
+
+\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
+\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+% This is used to turn on special parens
+% but make & act ordinary (given that it's active).
+\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr}
+
+% Definitions of (, ) and & used in args for functions.
+% This is the definition of ( outside of all parentheses.
+\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested
+ \global\advance\parencount by 1
+}
+%
+% This is the definition of ( when already inside a level of parens.
+\gdef\opnested{\char`\(\global\advance\parencount by 1 }
+%
+\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0.
+ % also in that case restore the outer-level definition of (.
+ \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi
+ \global\advance \parencount by -1 }
+% If we encounter &foo, then turn on ()-hacking afterwards
+\gdef\amprm#1 {{\rm\&#1}\let(=\oprm \let)=\clrm\ }
+%
+\gdef\normalparens{\boldbrax\let&=\ampnr}
+} % End of definition inside \activeparens
+%% These parens (in \boldbrax) actually are a little bolder than the
+%% contained text. This is especially needed for [ and ]
+\def\opnr{{\sf\char`\(}\global\advance\parencount by 1 }
+\def\clnr{{\sf\char`\)}\global\advance\parencount by -1 }
+\let\ampnr = \&
+\def\lbrb{{\bf\char`\[}}
+\def\rbrb{{\bf\char`\]}}
+
+% Active &'s sneak into the index arguments, so make sure it's defined.
+{
+ \catcode`& = \active
+ \global\let& = \ampnr
+}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the function name.
+% #2 is the type of definition, such as "Function".
+%
+\def\defname#1#2{%
+ % How we'll output the type name. Putting it in brackets helps
+ % distinguish it from the body text that may end up on the next line
+ % just below it.
+ \ifempty{#2}%
+ \def\defnametype{}%
+ \else
+ \def\defnametype{[\rm #2]}%
+ \fi
+ %
+ % Get the values of \leftskip and \rightskip as they were outside the @def...
+ \dimen2=\leftskip
+ \advance\dimen2 by -\defbodyindent
+ %
+ % Figure out values for the paragraph shape.
+ \setbox0=\hbox{\hskip \deflastargmargin{\defnametype}}%
+ \dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line
+ \dimen1=\hsize \advance \dimen1 by -\defargsindent % size for continuations
+ \parshape 2 0in \dimen0 \defargsindent \dimen1
+ %
+ % Output arg 2 ("Function" or some such) but stuck inside a box of
+ % width 0 so it does not interfere with linebreaking.
+ \noindent
+ %
+ {% Adjust \hsize to exclude the ambient margins,
+ % so that \rightline will obey them.
+ \advance \hsize by -\dimen2
+ \dimen3 = 0pt % was -1.25pc
+ \rlap{\rightline{\defnametype\kern\dimen3}}%
+ }%
+ %
+ % Allow all lines to be underfull without complaint:
+ \tolerance=10000 \hbadness=10000
+ \advance\leftskip by -\defbodyindent
+ \exdentamount=\defbodyindent
+ {\df #1}\enskip % output function name
+ % \defunargs will be called next to output the arguments, if any.
+}
+
+% Common pieces to start any @def...
+% #1 is the \E... control sequence to end the definition (which we define).
+% #2 is the \...x control sequence (which our caller defines).
+% #3 is the control sequence to process the header, such as \defunheader.
+%
+\def\parsebodycommon#1#2#3{%
+ \begingroup\inENV
+ % If there are two @def commands in a row, we'll have a \nobreak,
+ % which is there to keep the function description together with its
+ % header. But if there's nothing but headers, we need to allow a
+ % break somewhere. Check for penalty 10002 (inserted by
+ % \defargscommonending) instead of 10000, since the sectioning
+ % commands insert a \penalty10000, and we don't want to allow a break
+ % between a section heading and a defun.
+ \ifnum\lastpenalty=10002 \penalty2000 \fi
+ %
+ % Similarly, after a section heading, do not allow a break.
+ % But do insert the glue.
+ \ifnum\lastpenalty<10000 \medbreak
+ \else \medskip % preceded by discardable penalty, so not a breakpoint
+ \fi
+ %
+ % Define the \E... end token that this defining construct specifies
+ % so that it will exit this group.
+ \def#1{\endgraf\endgroup\medbreak}%
+ %
+ \parindent=0in
+ \advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+}
+
+% Common part of the \...x definitions.
+%
+\def\defxbodycommon{%
+ % As with \parsebodycommon above, allow line break if we have multiple
+ % x headers in a row. It's not a great place, though.
+ \ifnum\lastpenalty=10002 \penalty2000 \fi
+ %
+ \begingroup\obeylines
+}
+
+% Process body of @defun, @deffn, @defmac, etc.
+%
+\def\defparsebody#1#2#3{%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2{\defxbodycommon \activeparens \spacesplit#3}%
+ \catcode\equalChar=\active
+ \begingroup\obeylines\activeparens
+ \spacesplit#3%
+}
+
+% #1, #2, #3 are the common arguments (see \parsebodycommon above).
+% #4, delimited by the space, is the class name.
+%
+\def\defmethparsebody#1#2#3#4 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2##1 {\defxbodycommon \activeparens \spacesplit{#3{##1}}}%
+ \begingroup\obeylines\activeparens
+ % The \empty here prevents misinterpretation of a construct such as
+ % @deffn {whatever} {Enharmonic comma}
+ % See comments at \deftpparsebody, although in our case we don't have
+ % to remove the \empty afterwards, since it is empty.
+ \spacesplit{#3{#4}}\empty
+}
+
+% Used for @deftypemethod and @deftypeivar.
+% #1, #2, #3 are the common arguments (see \defparsebody).
+% #4, delimited by a space, is the class name.
+% #5 is the method's return type.
+%
+\def\deftypemethparsebody#1#2#3#4 #5 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2##1 ##2 {\defxbodycommon \activeparens \spacesplit{#3{##1}{##2}}}%
+ \begingroup\obeylines\activeparens
+ \spacesplit{#3{#4}{#5}}%
+}
+
+% Used for @deftypeop. The change from \deftypemethparsebody is an
+% extra argument at the beginning which is the `category', instead of it
+% being the hardwired string `Method' or `Instance Variable'. We have
+% to account for this both in the \...x definition and in parsing the
+% input at hand. Thus also need a control sequence (passed as #5) for
+% the \E... definition to assign the category name to.
+%
+\def\deftypeopparsebody#1#2#3#4#5 #6 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2##1 ##2 ##3 {\def#4{##1}%
+ \defxbodycommon \activeparens \spacesplit{#3{##2}{##3}}}%
+ \begingroup\obeylines\activeparens
+ \spacesplit{#3{#5}{#6}}%
+}
+
+% For @defop.
+\def\defopparsebody #1#2#3#4#5 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2##1 ##2 {\def#4{##1}%
+ \defxbodycommon \activeparens \spacesplit{#3{##2}}}%
+ \begingroup\obeylines\activeparens
+ \spacesplit{#3{#5}}%
+}
+
+% These parsing functions are similar to the preceding ones
+% except that they do not make parens into active characters.
+% These are used for "variables" since they have no arguments.
+%
+\def\defvarparsebody #1#2#3{%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2{\defxbodycommon \spacesplit#3}%
+ \catcode\equalChar=\active
+ \begingroup\obeylines
+ \spacesplit#3%
+}
+
+% @defopvar.
+\def\defopvarparsebody #1#2#3#4#5 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2##1 ##2 {\def#4{##1}%
+ \defxbodycommon \spacesplit{#3{##2}}}%
+ \begingroup\obeylines
+ \spacesplit{#3{#5}}%
+}
+
+\def\defvrparsebody#1#2#3#4 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2##1 {\defxbodycommon \spacesplit{#3{##1}}}%
+ \begingroup\obeylines
+ \spacesplit{#3{#4}}%
+}
+
+% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the
+% type is just `struct', because we lose the braces in `{struct
+% termios}' when \spacesplit reads its undelimited argument. Sigh.
+% \let\deftpparsebody=\defvrparsebody
+%
+% So, to get around this, we put \empty in with the type name. That
+% way, TeX won't find exactly `{...}' as an undelimited argument, and
+% won't strip off the braces.
+%
+\def\deftpparsebody #1#2#3#4 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2##1 {\defxbodycommon \spacesplit{#3{##1}}}%
+ \begingroup\obeylines
+ \spacesplit{\parsetpheaderline{#3{#4}}}\empty
+}
+
+% Fine, but then we have to eventually remove the \empty *and* the
+% braces (if any). That's what this does.
+%
+\def\removeemptybraces\empty#1\relax{#1}
+
+% After \spacesplit has done its work, this is called -- #1 is the final
+% thing to call, #2 the type name (which starts with \empty), and #3
+% (which might be empty) the arguments.
+%
+\def\parsetpheaderline#1#2#3{%
+ #1{\removeemptybraces#2\relax}{#3}%
+}%
+
+% Split up #2 (the rest of the input line) at the first space token.
+% call #1 with two arguments:
+% the first is all of #2 before the space token,
+% the second is all of #2 after that space token.
+% If #2 contains no space token, all of it is passed as the first arg
+% and the second is passed as empty.
+%
+{\obeylines %
+ \gdef\spacesplit#1#2^^M{\endgroup\spacesplitx{#1}#2 \relax\spacesplitx}%
+ \long\gdef\spacesplitx#1#2 #3#4\spacesplitx{%
+ \ifx\relax #3%
+ #1{#2}{}%
+ \else %
+ #1{#2}{#3#4}%
+ \fi}%
+}
+
+% Define @defun.
+
+% This is called to end the arguments processing for all the @def... commands.
+%
+\def\defargscommonending{%
+ \interlinepenalty = 10000
+ \advance\rightskip by 0pt plus 1fil
+ \endgraf
+ \nobreak\vskip -\parskip
+ \penalty 10002 % signal to \parsebodycommon and \defxbodycommon.
+}
+
+% This expands the args and terminates the paragraph they comprise.
+%
+\def\defunargs#1{\functionparens \sl
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+% Set the font temporarily and use \font in case \setfont made \tensl a macro.
+{\tensl\hyphenchar\font=0}%
+#1%
+{\tensl\hyphenchar\font=45}%
+\ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi%
+ \defargscommonending
+}
+
+\def\deftypefunargs #1{%
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+% Use \boldbraxnoamp, not \functionparens, so that & is not special.
+\boldbraxnoamp
+\tclose{#1}% avoid \code because of side effects on active chars
+ \defargscommonending
+}
+
+% Do complete processing of one @defun or @defunx line already parsed.
+
+% @deffn Command forward-char nchars
+
+\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}
+
+\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defun == @deffn Function
+
+\def\defun{\defparsebody\Edefun\defunx\defunheader}
+
+\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{\putwordDeffunc}%
+\defunargs {#2}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefun int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader}
+
+% #1 is the data type. #2 is the name and args.
+\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax}
+% #1 is the data type, #2 the name, #3 the args.
+\def\deftypefunheaderx #1#2 #3\relax{%
+\doind {fn}{\code{#2}}% Make entry in function index
+\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypefun}%
+\deftypefunargs {#3}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}
+
+% \defheaderxcond#1\relax$.$
+% puts #1 in @code, followed by a space, but does nothing if #1 is null.
+\def\defheaderxcond#1#2$.${\ifx#1\relax\else\code{#1#2} \fi}
+
+% #1 is the classification. #2 is the data type. #3 is the name and args.
+\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax}
+% #1 is the classification, #2 the data type, #3 the name, #4 the args.
+\def\deftypefnheaderx #1#2#3 #4\relax{%
+\doind {fn}{\code{#3}}% Make entry in function index
+\begingroup
+\normalparens % notably, turn off `&' magic, which prevents
+% at least some C++ text from working
+\defname {\defheaderxcond#2\relax$.$#3}{#1}%
+\deftypefunargs {#4}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defmac == @deffn Macro
+
+\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
+
+\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{\putwordDefmac}%
+\defunargs {#2}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defspec == @deffn Special Form
+
+\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
+
+\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{\putwordDefspec}%
+\defunargs {#2}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defop CATEGORY CLASS OPERATION ARG...
+%
+\def\defop #1 {\def\defoptype{#1}%
+\defopparsebody\Edefop\defopx\defopheader\defoptype}
+%
+\def\defopheader#1#2#3{%
+ \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% function index entry
+ \begingroup
+ \defname{#2}{\defoptype\ \putwordon\ #1}%
+ \defunargs{#3}%
+ \endgroup
+}
+
+% @deftypeop CATEGORY CLASS TYPE OPERATION ARG...
+%
+\def\deftypeop #1 {\def\deftypeopcategory{#1}%
+ \deftypeopparsebody\Edeftypeop\deftypeopx\deftypeopheader
+ \deftypeopcategory}
+%
+% #1 is the class name, #2 the data type, #3 the operation name, #4 the args.
+\def\deftypeopheader#1#2#3#4{%
+ \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
+ \begingroup
+ \defname{\defheaderxcond#2\relax$.$#3}
+ {\deftypeopcategory\ \putwordon\ \code{#1}}%
+ \deftypefunargs{#4}%
+ \endgroup
+}
+
+% @deftypemethod CLASS TYPE METHOD ARG...
+%
+\def\deftypemethod{%
+ \deftypemethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader}
+%
+% #1 is the class name, #2 the data type, #3 the method name, #4 the args.
+\def\deftypemethodheader#1#2#3#4{%
+ \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
+ \begingroup
+ \defname{\defheaderxcond#2\relax$.$#3}{\putwordMethodon\ \code{#1}}%
+ \deftypefunargs{#4}%
+ \endgroup
+}
+
+% @deftypeivar CLASS TYPE VARNAME
+%
+\def\deftypeivar{%
+ \deftypemethparsebody\Edeftypeivar\deftypeivarx\deftypeivarheader}
+%
+% #1 is the class name, #2 the data type, #3 the variable name.
+\def\deftypeivarheader#1#2#3{%
+ \dosubind{vr}{\code{#3}}{\putwordof\ \code{#1}}% entry in variable index
+ \begingroup
+ \defname{\defheaderxcond#2\relax$.$#3}
+ {\putwordInstanceVariableof\ \code{#1}}%
+ \defvarargs{#3}%
+ \endgroup
+}
+
+% @defmethod == @defop Method
+%
+\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
+%
+% #1 is the class name, #2 the method name, #3 the args.
+\def\defmethodheader#1#2#3{%
+ \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% entry in function index
+ \begingroup
+ \defname{#2}{\putwordMethodon\ \code{#1}}%
+ \defunargs{#3}%
+ \endgroup
+}
+
+% @defcv {Class Option} foo-class foo-flag
+
+\def\defcv #1 {\def\defcvtype{#1}%
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}
+
+\def\defcvarheader #1#2#3{%
+ \dosubind{vr}{\code{#2}}{\putwordof\ \code{#1}}% variable index entry
+ \begingroup
+ \defname{#2}{\defcvtype\ \putwordof\ #1}%
+ \defvarargs{#3}%
+ \endgroup
+}
+
+% @defivar CLASS VARNAME == @defcv {Instance Variable} CLASS VARNAME
+%
+\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader}
+%
+\def\defivarheader#1#2#3{%
+ \dosubind{vr}{\code{#2}}{\putwordof\ \code{#1}}% entry in var index
+ \begingroup
+ \defname{#2}{\putwordInstanceVariableof\ #1}%
+ \defvarargs{#3}%
+ \endgroup
+}
+
+% @defvar
+% First, define the processing that is wanted for arguments of @defvar.
+% This is actually simple: just print them in roman.
+% This must expand the args and terminate the paragraph they make up
+\def\defvarargs #1{\normalparens #1%
+ \defargscommonending
+}
+
+% @defvr Counter foo-count
+
+\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}
+
+\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}
+
+% @defvar == @defvr Variable
+
+\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}
+
+\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{\putwordDefvar}%
+\defvarargs {#2}\endgroup %
+}
+
+% @defopt == @defvr {User Option}
+
+\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader}
+
+\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{\putwordDefopt}%
+\defvarargs {#2}\endgroup %
+}
+
+% @deftypevar int foobar
+
+\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader}
+
+% #1 is the data type. #2 is the name, perhaps followed by text that
+% is actually part of the data type, which should not be put into the index.
+\def\deftypevarheader #1#2{%
+\dovarind#2 \relax% Make entry in variables index
+\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypevar}%
+ \defargscommonending
+\endgroup}
+\def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}}
+
+% @deftypevr {Global Flag} int enable
+
+\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
+
+\def\deftypevrheader #1#2#3{\dovarind#3 \relax%
+\begingroup\defname {\defheaderxcond#2\relax$.$#3}{#1}
+ \defargscommonending
+\endgroup}
+
+% Now define @deftp
+% Args are printed in bold, a slight difference from @defvar.
+
+\def\deftpargs #1{\bf \defvarargs{#1}}
+
+% @deftp Class window height width ...
+
+\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader}
+
+\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
+\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
+
+% These definitions are used if you use @defunx (etc.)
+% anywhere other than immediately after a @defun or @defunx.
+%
+\def\defcvx#1 {\errmessage{@defcvx in invalid context}}
+\def\deffnx#1 {\errmessage{@deffnx in invalid context}}
+\def\defivarx#1 {\errmessage{@defivarx in invalid context}}
+\def\defmacx#1 {\errmessage{@defmacx in invalid context}}
+\def\defmethodx#1 {\errmessage{@defmethodx in invalid context}}
+\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
+\def\defopx#1 {\errmessage{@defopx in invalid context}}
+\def\defspecx#1 {\errmessage{@defspecx in invalid context}}
+\def\deftpx#1 {\errmessage{@deftpx in invalid context}}
+\def\deftypefnx#1 {\errmessage{@deftypefnx in invalid context}}
+\def\deftypefunx#1 {\errmessage{@deftypefunx in invalid context}}
+\def\deftypeivarx#1 {\errmessage{@deftypeivarx in invalid context}}
+\def\deftypemethodx#1 {\errmessage{@deftypemethodx in invalid context}}
+\def\deftypeopx#1 {\errmessage{@deftypeopx in invalid context}}
+\def\deftypevarx#1 {\errmessage{@deftypevarx in invalid context}}
+\def\deftypevrx#1 {\errmessage{@deftypevrx in invalid context}}
+\def\defunx#1 {\errmessage{@defunx in invalid context}}
+\def\defvarx#1 {\errmessage{@defvarx in invalid context}}
+\def\defvrx#1 {\errmessage{@defvrx in invalid context}}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\undefined
+ \newwrite\macscribble
+ \def\scanmacro#1{%
+ \begingroup \newlinechar`\^^M
+ % Undo catcode changes of \startcontents and \doprintindex
+ \catcode`\@=0 \catcode`\\=\other \escapechar=`\@
+ % Append \endinput to make sure that TeX does not see the ending newline.
+ \toks0={#1\endinput}%
+ \immediate\openout\macscribble=\jobname.tmp
+ \immediate\write\macscribble{\the\toks0}%
+ \immediate\closeout\macscribble
+ \let\xeatspaces\eatspaces
+ \input \jobname.tmp
+ \endgroup
+}
+\else
+\def\scanmacro#1{%
+\begingroup \newlinechar`\^^M
+% Undo catcode changes of \startcontents and \doprintindex
+\catcode`\@=0 \catcode`\\=\other \escapechar=`\@
+\let\xeatspaces\eatspaces\scantokens{#1\endinput}\endgroup}
+\fi
+
+\newcount\paramno % Count of parameters
+\newtoks\macname % Macro name
+\newif\ifrecursive % Is it recursive?
+\def\macrolist{} % List of all defined macros in the form
+ % \do\macro1\do\macro2...
+
+% Utility routines.
+% Thisdoes \let #1 = #2, except with \csnames.
+\def\cslet#1#2{%
+\expandafter\expandafter
+\expandafter\let
+\expandafter\expandafter
+\csname#1\endcsname
+\csname#2\endcsname}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \.
+
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+
+\def\macrobodyctxt{%
+ \catcode`\~=\other
+ \catcode`\^=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\+=\other
+ \catcode`\{=\other
+ \catcode`\}=\other
+ \catcode`\@=\other
+ \catcode`\^^M=\other
+ \usembodybackslash}
+
+\def\macroargctxt{%
+ \catcode`\~=\other
+ \catcode`\^=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\+=\other
+ \catcode`\@=\other
+ \catcode`\\=\other}
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+ \getargs{#1}% now \macname is the macname and \argl the arglist
+ \ifx\argl\empty % no arguments
+ \paramno=0%
+ \else
+ \expandafter\parsemargdef \argl;%
+ \fi
+ \if1\csname ismacro.\the\macname\endcsname
+ \message{Warning: redefining \the\macname}%
+ \else
+ \expandafter\ifx\csname \the\macname\endcsname \relax
+ \else \errmessage{Macro name \the\macname\space already defined}\fi
+ \global\cslet{macsave.\the\macname}{\the\macname}%
+ \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+ % Add the macroname to \macrolist
+ \toks0 = \expandafter{\macrolist\do}%
+ \xdef\macrolist{\the\toks0
+ \expandafter\noexpand\csname\the\macname\endcsname}%
+ \fi
+ \begingroup \macrobodyctxt
+ \ifrecursive \expandafter\parsermacbody
+ \else \expandafter\parsemacbody
+ \fi}
+
+\def\unmacro{\parsearg\dounmacro}
+\def\dounmacro#1{%
+ \if1\csname ismacro.#1\endcsname
+ \global\cslet{#1}{macsave.#1}%
+ \global\expandafter\let \csname ismacro.#1\endcsname=0%
+ % Remove the macro name from \macrolist:
+ \begingroup
+ \expandafter\let\csname#1\endcsname \relax
+ \let\do\unmacrodo
+ \xdef\macrolist{\macrolist}%
+ \endgroup
+ \else
+ \errmessage{Macro #1 not defined}%
+ \fi
+}
+
+% Called by \do from \dounmacro on each macro. The idea is to omit any
+% macro definitions that have been changed to \relax.
+%
+\def\unmacrodo#1{%
+ \ifx#1\relax
+ % remove this
+ \else
+ \noexpand\do \noexpand #1%
+ \fi
+}
+
+% This makes use of the obscure feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname #1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+
+% Parse the optional {params} list. Set up \paramno and \paramlist
+% so \defmacro knows what to do. Define \macarg.blah for each blah
+% in the params list, to be ##N where N is the position in that list.
+% That gets used by \mbodybackslash (above).
+
+% We need to get `macro parameter char #' into several definitions.
+% The technique used is stolen from LaTeX: let \hash be something
+% unexpandable, insert that wherever you need a #, and then redefine
+% it to # just before using the token list produced.
+%
+% The same technique is used to protect \eatspaces till just before
+% the macro is used.
+
+\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
+ \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
+\def\parsemargdefxxx#1,{%
+ \if#1;\let\next=\relax
+ \else \let\next=\parsemargdefxxx
+ \advance\paramno by 1%
+ \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+ {\xeatspaces{\hash\the\paramno}}%
+ \edef\paramlist{\paramlist\hash\the\paramno,}%
+ \fi\next}
+
+% These two commands read recursive and nonrecursive macro bodies.
+% (They're different since rec and nonrec macros end differently.)
+
+\long\def\parsemacbody#1@end macro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+\long\def\parsermacbody#1@end rmacro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+
+% This defines the macro itself. There are six cases: recursive and
+% nonrecursive macros of zero, one, and many arguments.
+% Much magic with \expandafter here.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in; @include reads the file inside a group.
+\def\defmacro{%
+ \let\hash=##% convert placeholders to macro parameter chars
+ \ifrecursive
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\scanmacro{\temp}}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup\noexpand\scanmacro{\temp}}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{\egroup\noexpand\scanmacro{\temp}}%
+ \fi
+ \else
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \expandafter\noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \fi
+ \fi}
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+% \braceorline decides whether the next nonwhitespace character is a
+% {. If so it reads up to the closing }, if not, it reads the whole
+% line. Whatever was read is then fed to the next control sequence
+% as an argument (by \parsebrace or \parsearg)
+\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+ \ifx\nchar\bgroup\else
+ \expandafter\parsearg
+ \fi \next}
+
+% We mant to disable all macros during \shipout so that they are not
+% expanded by \write.
+\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}%
+ \edef\next{\macrolist}\expandafter\endgroup\next}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign. Just make them active and then expand them all to nothing.
+\def\alias{\begingroup\obeyspaces\parsearg\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{\ignoreactivespaces
+\edef\next{\global\let\expandafter\noexpand\csname#1\endcsname=%
+ \expandafter\noexpand\csname#2\endcsname}%
+\expandafter\endgroup\next}
+
+
+\message{cross references,}
+
+\newwrite\auxfile
+
+\newif\ifhavexrefs % True if xref values are known.
+\newif\ifwarnedxrefs % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+ node \samp{\ignorespaces#1{}}}
+
+% @node's only job in TeX is to define \lastnode, which is used in
+% cross-references.
+\def\node{\ENVcheck\parsearg\nodezzz}
+\def\nodezzz#1{\nodexxx #1,\finishnodeparse}
+\def\nodexxx#1,#2\finishnodeparse{\gdef\lastnode{#1}}
+\let\nwnode=\node
+\let\lastnode=\empty
+
+% Write a cross-reference definition for the current node. #1 is the
+% type (Ynumbered, Yappendix, Ynothing).
+%
+\def\donoderef#1{%
+ \ifx\lastnode\empty\else
+ \expandafter\expandafter\expandafter\setref{\lastnode}{#1}%
+ \global\let\lastnode=\empty
+ \fi
+}
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+%
+\gdef\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\gdef\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\gdef\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), namely NAME-title (the corresponding @chapter/etc. name),
+% NAME-pg (the page number), and NAME-snt (section number and type).
+% Called from \foonoderef.
+%
+% We have to set dummies so commands such as @code in a section title
+% aren't expanded. It would be nicer not to expand the titles in the
+% first place, but that is hard to do.
+%
+% Likewise, use \turnoffactive so that punctuation chars such as underscore
+% and backslash work in node names.
+%
+\def\setref#1#2{{%
+ \atdummies
+ \pdfmkdest{#1}%
+ %
+ \iflinks
+ \turnoffactive
+ \dosetq{#1-title}{Ytitle}%
+ \dosetq{#1-pg}{Ypagenumber}%
+ \dosetq{#1-snt}{#2}%
+ \fi
+}}
+
+% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual. All but the node name can be omitted.
+%
+\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
+\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+ \unsepspaces
+ \def\printedmanual{\ignorespaces #5}%
+ \def\printednodename{\ignorespaces #3}%
+ \setbox1=\hbox{\printedmanual}%
+ \setbox0=\hbox{\printednodename}%
+ \ifdim \wd0 = 0pt
+ % No printed node name was explicitly given.
+ \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
+ % Use the node name inside the square brackets.
+ \def\printednodename{\ignorespaces #1}%
+ \else
+ % Use the actual chapter/section title appear inside
+ % the square brackets. Use the real section title if we have it.
+ \ifdim \wd1 > 0pt
+ % It is in another manual, so we don't have it.
+ \def\printednodename{\ignorespaces #1}%
+ \else
+ \ifhavexrefs
+ % We know the real title if we have the xref values.
+ \def\printednodename{\refx{#1-title}{}}%
+ \else
+ % Otherwise just copy the Info node name.
+ \def\printednodename{\ignorespaces #1}%
+ \fi%
+ \fi
+ \fi
+ \fi
+ %
+ % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+ % insert empty discretionaries after hyphens, which means that it will
+ % not find a line break at a hyphen in a node names. Since some manuals
+ % are best written with fairly long node names, containing hyphens, this
+ % is a loss. Therefore, we give the text of the node name again, so it
+ % is as if TeX is seeing it for the first time.
+ \ifpdf
+ \leavevmode
+ \getfilename{#4}%
+ {\turnoffactive \otherbackslash
+ \ifnum\filenamelength>0
+ \startlink attr{/Border [0 0 0]}%
+ goto file{\the\filename.pdf} name{#1}%
+ \else
+ \startlink attr{/Border [0 0 0]}%
+ goto name{\pdfmkpgn{#1}}%
+ \fi
+ }%
+ \linkcolor
+ \fi
+ %
+ \ifdim \wd1 > 0pt
+ \putwordsection{} ``\printednodename'' \putwordin{} \cite{\printedmanual}%
+ \else
+ % _ (for example) has to be the character _ for the purposes of the
+ % control sequence corresponding to the node, but it has to expand
+ % into the usual \leavevmode...\vrule stuff for purposes of
+ % printing. So we \turnoffactive for the \refx-snt, back on for the
+ % printing, back off for the \refx-pg.
+ {\turnoffactive \otherbackslash
+ % Only output a following space if the -snt ref is nonempty; for
+ % @unnumbered and @anchor, it won't be.
+ \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+ \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+ }%
+ % output the `[mynode]' via a macro.
+ \xrefprintnodename\printednodename
+ %
+ % But we always want a comma and a space:
+ ,\space
+ %
+ % output the `page 3'.
+ \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}%
+ \fi
+ \endlink
+\endgroup}
+
+% This macro is called from \xrefX for the `[nodename]' part of xref
+% output. It's a separate macro only so it can be changed more easily,
+% since not square brackets don't work in some documents. Particularly
+% one that Bob is working on :).
+%
+\def\xrefprintnodename#1{[#1]}
+
+% \dosetq is called from \setref to do the actual \write (\iflinks).
+%
+\def\dosetq#1#2{%
+ \edef\next{\write\auxfile{\internalsetq{#1}{#2}}}%
+ \next
+}
+
+% \internalsetq{foo}{page} expands into
+% CHARACTERS @xrdef{foo}{...expansion of \page...}
+\def\internalsetq#1#2{@xrdef{#1}{\csname #2\endcsname}}
+
+% Things to be expanded by \internalsetq.
+%
+\def\Ypagenumber{\noexpand\folio}
+\def\Ytitle{\thissection}
+\def\Ynothing{}
+\def\Yomitfromtoc{}
+\def\Ynumbered{%
+ \ifnum\secno=0
+ \putwordChapter@tie \the\chapno
+ \else \ifnum\subsecno=0
+ \putwordSection@tie \the\chapno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+\def\Yappendix{%
+ \ifnum\secno=0
+ \putwordAppendix@tie @char\the\appendixno{}%
+ \else \ifnum\subsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie
+ @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+ \let\linenumber = \empty % Pre-3.0.
+\else
+ \def\linenumber{\the\inputlineno:\space}
+\fi
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+%
+\def\refx#1#2{%
+ {%
+ \indexnofonts
+ \otherbackslash
+ \expandafter\global\expandafter\let\expandafter\thisrefX
+ \csname X#1\endcsname
+ }%
+ \ifx\thisrefX\relax
+ % If not defined, say something at least.
+ \angleleft un\-de\-fined\angleright
+ \iflinks
+ \ifhavexrefs
+ \message{\linenumber Undefined cross reference `#1'.}%
+ \else
+ \ifwarnedxrefs\else
+ \global\warnedxrefstrue
+ \message{Cross reference values unknown; you must run TeX again.}%
+ \fi
+ \fi
+ \fi
+ \else
+ % It's defined, so just use it.
+ \thisrefX
+ \fi
+ #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file.
+%
+\def\xrdef#1{\expandafter\gdef\csname X#1\endcsname}
+
+% Read the last existing aux file, if any. No error if none exists.
+\def\readauxfile{\begingroup
+ \catcode`\^^@=\other
+ \catcode`\^^A=\other
+ \catcode`\^^B=\other
+ \catcode`\^^C=\other
+ \catcode`\^^D=\other
+ \catcode`\^^E=\other
+ \catcode`\^^F=\other
+ \catcode`\^^G=\other
+ \catcode`\^^H=\other
+ \catcode`\^^K=\other
+ \catcode`\^^L=\other
+ \catcode`\^^N=\other
+ \catcode`\^^P=\other
+ \catcode`\^^Q=\other
+ \catcode`\^^R=\other
+ \catcode`\^^S=\other
+ \catcode`\^^T=\other
+ \catcode`\^^U=\other
+ \catcode`\^^V=\other
+ \catcode`\^^W=\other
+ \catcode`\^^X=\other
+ \catcode`\^^Z=\other
+ \catcode`\^^[=\other
+ \catcode`\^^\=\other
+ \catcode`\^^]=\other
+ \catcode`\^^^=\other
+ \catcode`\^^_=\other
+ % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
+ % in xref tags, i.e., node names. But since ^^e4 notation isn't
+ % supported in the main text, it doesn't seem desirable. Furthermore,
+ % that is not enough: for node names that actually contain a ^
+ % character, we would end up writing a line like this: 'xrdef {'hat
+ % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
+ % argument, and \hat is not an expandable control sequence. It could
+ % all be worked out, but why? Either we support ^^ or we don't.
+ %
+ % The other change necessary for this was to define \auxhat:
+ % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
+ % and then to call \auxhat in \setq.
+ %
+ \catcode`\^=\other
+ %
+ % Special characters. Should be turned off anyway, but...
+ \catcode`\~=\other
+ \catcode`\[=\other
+ \catcode`\]=\other
+ \catcode`\"=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\$=\other
+ \catcode`\#=\other
+ \catcode`\&=\other
+ \catcode`\%=\other
+ \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+ %
+ % Make the characters 128-255 be printing characters
+ {%
+ \count 1=128
+ \def\loop{%
+ \catcode\count 1=\other
+ \advance\count 1 by 1
+ \ifnum \count 1<256 \loop \fi
+ }%
+ }%
+ %
+ % Turn off \ as an escape so we do not lose on
+ % entries which were dumped with control sequences in their names.
+ % For example, @xrdef{$\leq $-fun}{page ...} made by @defun ^^
+ % Reference to such entries still does not work the way one would wish,
+ % but at least they do not bomb out when the aux file is read in.
+ \catcode`\\=\other
+ %
+ % @ is our escape character in .aux files.
+ \catcode`\{=1
+ \catcode`\}=2
+ \catcode`\@=0
+ %
+ \openin 1 \jobname.aux
+ \ifeof 1 \else
+ \closein 1
+ \input \jobname.aux
+ \global\havexrefstrue
+ \fi
+ % Open the new aux file. TeX will close it automatically at exit.
+ \openout\auxfile=\jobname.aux
+\endgroup}
+
+
+% Footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only.
+\let\footnotestyle=\comment
+
+\let\ptexfootnote=\footnote
+
+{\catcode `\@=11
+%
+% Auto-number footnotes. Otherwise like plain.
+\gdef\footnote{%
+ \let\indent=\ptexindent
+ \let\noindent=\ptexnoindent
+ \global\advance\footnoteno by \@ne
+ \edef\thisfootno{$^{\the\footnoteno}$}%
+ %
+ % In case the footnote comes at the end of a sentence, preserve the
+ % extra spacing after we do the footnote number.
+ \let\@sf\empty
+ \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
+ %
+ % Remove inadvertent blank space before typesetting the footnote number.
+ \unskip
+ \thisfootno\@sf
+ \dofootnote
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter. Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset and anything else that uses
+% \parseargline fail inside footnotes because the tokens are fixed when
+% the footnote is read. --karl, 16nov96.
+%
+% The start of the footnote looks usually like this:
+\gdef\startfootins{\insert\footins\bgroup}
+%
+% ... but this macro is redefined inside @multitable.
+%
+\gdef\dofootnote{%
+ \startfootins
+ % We want to typeset this text as a normal paragraph, even if the
+ % footnote reference occurs in (for example) a display environment.
+ % So reset some parameters.
+ \hsize=\pagewidth
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\ht\strutbox % top baseline for broken footnotes
+ \splitmaxdepth\dp\strutbox
+ \floatingpenalty\@MM
+ \leftskip\z@skip
+ \rightskip\z@skip
+ \spaceskip\z@skip
+ \xspaceskip\z@skip
+ \parindent\defaultparindent
+ %
+ \smallfonts \rm
+ %
+ % Because we use hanging indentation in footnotes, a @noindent appears
+ % to exdent this text, so make it be a no-op. makeinfo does not use
+ % hanging indentation so @noindent can still be needed within footnote
+ % text after an @example or the like (not that this is good style).
+ \let\noindent = \relax
+ %
+ % Hang the footnote text off the number. Use \everypar in case the
+ % footnote extends for more than one paragraph.
+ \everypar = {\hang}%
+ \textindent{\thisfootno}%
+ %
+ % Don't crash into the line above the footnote text. Since this
+ % expands into a box, it must come within the paragraph, lest it
+ % provide a place where TeX can split the footnote.
+ \footstrut
+ \futurelet\next\fo@t
+}
+}%end \catcode `\@=11
+
+% @| inserts a changebar to the left of the current line. It should
+% surround any changed text. This approach does *not* work if the
+% change spans more than two lines of output. To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change).
+%
+\def\|{%
+ % \vadjust can only be used in horizontal mode.
+ \leavevmode
+ %
+ % Append this vertical mode material after the current line in the output.
+ \vadjust{%
+ % We want to insert a rule with the height and depth of the current
+ % leading; that is exactly what \strutbox is supposed to record.
+ \vskip-\baselineskip
+ %
+ % \vadjust-items are inserted at the left edge of the type. So
+ % the \llap here moves out into the left-hand margin.
+ \llap{%
+ %
+ % For a thicker or thinner bar, change the `1pt'.
+ \vrule height\baselineskip width1pt
+ %
+ % This is the space between the bar and the text.
+ \hskip 12pt
+ }%
+ }%
+}
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt}
+
+% @image. We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front. If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+ \closein 1
+ % Do not bother showing banner with epsf.tex v2.7k (available in
+ % doc/epsf.tex and on ctan).
+ \def\epsfannounce{\toks0 = }%
+ \input epsf.tex
+\fi
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+ work. It is also included in the Texinfo distribution, or you can get
+ it from ftp://tug.org/tex/epsf.tex.}
+%
+\def\image#1{%
+ \ifx\epsfbox\undefined
+ \ifwarnednoepsf \else
+ \errhelp = \noepsfhelp
+ \errmessage{epsf.tex not found, images will be ignored}%
+ \global\warnednoepsftrue
+ \fi
+ \else
+ \imagexxx #1,,,,,\finish
+ \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing this stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+ \catcode`\^^M = 5 % in case we're inside an example
+ \normalturnoffactive % allow _ et al. in names
+ % If the image is by itself, center it.
+ \ifvmode
+ \imagevmodetrue
+ \nobreak\bigskip
+ % Usually we'll have text after the image which will insert
+ % \parskip glue, so insert it here too to equalize the space
+ % above and below.
+ \nobreak\vskip\parskip
+ \nobreak
+ \line\bgroup\hss
+ \fi
+ %
+ % Output the image.
+ \ifpdf
+ \dopdfimage{#1}{#2}{#3}%
+ \else
+ % \epsfbox itself resets \epsf?size at each figure.
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+ \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+ \epsfbox{#1.eps}%
+ \fi
+ %
+ \ifimagevmode \hss \egroup \bigbreak \fi % space after the image
+\endgroup}
+
+
+\message{localization,}
+% and i18n.
+
+% @documentlanguage is usually given very early, just after
+% @setfilename. If done too late, it may not override everything
+% properly. Single argument is the language abbreviation.
+% It would be nice if we could set up a hyphenation file here.
+%
+\def\documentlanguage{\parsearg\dodocumentlanguage}
+\def\dodocumentlanguage#1{%
+ \tex % read txi-??.tex file in plain TeX.
+ % Read the file if it exists.
+ \openin 1 txi-#1.tex
+ \ifeof1
+ \errhelp = \nolanghelp
+ \errmessage{Cannot read language file txi-#1.tex}%
+ \let\temp = \relax
+ \else
+ \def\temp{\input txi-#1.tex }%
+ \fi
+ \temp
+ \endgroup
+}
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty. Maybe you need to install it? In the current directory
+should work if nowhere else does.}
+
+
+% @documentencoding should change something in TeX eventually, most
+% likely, but for now just recognize it.
+\let\documentencoding = \comment
+
+
+% Page size parameters.
+%
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be so finicky about underfull hboxes, either.
+\hbadness = 2000
+
+% Following George Bush, just get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything. We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize. We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+ \ifx\emergencystretch\thisisundefined
+ % Allow us to assign to \emergencystretch anyway.
+ \def\emergencystretch{\dimen0}%
+ \else
+ \emergencystretch = .15\hsize
+ \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
+% 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8)
+% physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading. The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+ \voffset = #3\relax
+ \topskip = #6\relax
+ \splittopskip = \topskip
+ %
+ \vsize = #1\relax
+ \advance\vsize by \topskip
+ \outervsize = \vsize
+ \advance\outervsize by 2\topandbottommargin
+ \pageheight = \vsize
+ %
+ \hsize = #2\relax
+ \outerhsize = \hsize
+ \advance\outerhsize by 0.5in
+ \pagewidth = \hsize
+ %
+ \normaloffset = #4\relax
+ \bindingoffset = #5\relax
+ %
+ \ifpdf
+ \pdfpageheight #7\relax
+ \pdfpagewidth #8\relax
+ \fi
+ %
+ \setleading{\textleading}
+ %
+ \parindent = \defaultparindent
+ \setemergencystretch
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % If page is nothing but text, make it come out even.
+ \internalpagesizes{46\baselineskip}{6in}%
+ {\voffset}{.25in}%
+ {\bindingoffset}{36pt}%
+ {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.5 (or so) format.
+\def\smallbook{{\globaldefs = 1
+ \parskip = 2pt plus 1pt
+ \textleading = 12pt
+ %
+ \internalpagesizes{7.5in}{5in}%
+ {\voffset}{.25in}%
+ {\bindingoffset}{16pt}%
+ {9.25in}{7in}%
+ %
+ \lispnarrowing = 0.3in
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = .5cm
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % Double-side printing via postscript on Laserjet 4050
+ % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+ % To change the settings for a different printer or situation, adjust
+ % \normaloffset until the front-side and back-side texts align. Then
+ % do the same for \bindingoffset. You can set these for testing in
+ % your texinfo source file like this:
+ % @tex
+ % \global\normaloffset = -6mm
+ % \global\bindingoffset = 10mm
+ % @end tex
+ \internalpagesizes{51\baselineskip}{160mm}
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{44pt}%
+ {297mm}{210mm}%
+ %
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+ \parskip = 2pt plus 1pt minus 0.1pt
+ \textleading = 12.5pt
+ %
+ \internalpagesizes{160mm}{120mm}%
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{8pt}%
+ {210mm}{148mm}%
+ %
+ \lispnarrowing = 0.2in
+ \tolerance = 800
+ \hfuzz = 1.2pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 2mm
+ \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.
+\def\afourlatex{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{237mm}{150mm}%
+ {\voffset}{4.6mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ %
+ % Must explicitly reset to 0 because we call \afourpaper.
+ \globaldefs = 0
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{241mm}{165mm}%
+ {\voffset}{-2.95mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\def\pagesizes{\parsearg\pagesizesxxx}
+\def\pagesizesxxx#1{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+ \globaldefs = 1
+ %
+ \parskip = 3pt plus 2pt minus 1pt
+ \setleading{\textleading}%
+ %
+ \dimen0 = #1
+ \advance\dimen0 by \voffset
+ %
+ \dimen2 = \hsize
+ \advance\dimen2 by \normaloffset
+ %
+ \internalpagesizes{#1}{\hsize}%
+ {\voffset}{\normaloffset}%
+ {\bindingoffset}{44pt}%
+ {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+
+\message{and turning on texinfo input format.}
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\catcode`\$=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+\def\normaldollar{$}%$ font-lock fix
+
+% This macro is used to make a character print one way in ttfont
+% where it can probably just be output, and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise. Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font. Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts. But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt\char126}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+% Subroutine for the previous macro.
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+
+\catcode`\|=\active
+\def|{{\tt\char124}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+\catcode`\$=\active
+\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+
+% Set up an active definition for =, but don't enable it most of the time.
+{\catcode`\==\active
+\global\def={{\tt \char 61}}}
+
+\catcode`+=\active
+\catcode`\_=\active
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have \everyjob (or @setfilename) turn them on.
+% \otherifyactive is called near the end of this file.
+\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
+
+\catcode`\@=0
+
+% \rawbackslashxx outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\rawbackslashxx=`\\
+
+% \rawbackslash defines an active \ to do \rawbackslashxx.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.
+{\catcode`\\=\active
+ @gdef@rawbackslash{@let\=@rawbackslashxx}
+ @gdef@otherbackslash{@let\=@realbackslash}
+}
+
+% \realbackslash is an actual character `\' with catcode other.
+{\catcode`\\=\other @gdef@realbackslash{\}}
+
+% \normalbackslash outputs one backslash in fixed width font.
+\def\normalbackslash{{\tt\rawbackslashxx}}
+
+\catcode`\\=\active
+
+% Used sometimes to turn off (effectively) the active characters
+% even after parsing them.
+@def@turnoffactive{%
+ @let"=@normaldoublequote
+ @let\=@realbackslash
+ @let~=@normaltilde
+ @let^=@normalcaret
+ @let_=@normalunderscore
+ @let|=@normalverticalbar
+ @let<=@normalless
+ @let>=@normalgreater
+ @let+=@normalplus
+ @let$=@normaldollar %$ font-lock fix
+}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'. (Thus, \ is not expandable when this is in
+% effect.)
+%
+@def@normalturnoffactive{@turnoffactive @let\=@normalbackslash}
+
+% Make _ and + \other characters, temporarily.
+% This is canceled by @fixbackslash.
+@otherifyactive
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+@gdef@eatinput input texinfo{@fixbackslash}
+@global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\{ in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+% Also back turn on active characters that might appear in the input
+% file name, in case not using a pre-dumped format.
+%
+@gdef@fixbackslash{%
+ @ifx\@eatinput @let\ = @normalbackslash @fi
+ @catcode`+=@active
+ @catcode`@_=@active
+}
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These look ok in all fonts, so just make them not special.
+@catcode`@& = @other
+@catcode`@# = @other
+@catcode`@% = @other
+
+@c Set initial fonts.
+@textfonts
+@rm
+
+
+@c Local variables:
+@c eval: (add-hook 'write-file-hooks 'time-stamp)
+@c page-delimiter: "^\\\\message"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End:
diff --git a/netperf-2.4.4/inet_ntop.c b/netperf-2.4.4/inet_ntop.c
new file mode 100644
index 0000000..1fe542d
--- /dev/null
+++ b/netperf-2.4.4/inet_ntop.c
@@ -0,0 +1 @@
+#include "missing\inet_ntop.c" \ No newline at end of file
diff --git a/netperf-2.4.4/install-sh b/netperf-2.4.4/install-sh
new file mode 100755
index 0000000..6ce63b9
--- /dev/null
+++ b/netperf-2.4.4/install-sh
@@ -0,0 +1,294 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+#
+# 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. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd=$cpprog
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd=$stripprog
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "$0: no input file specified" >&2
+ exit 1
+else
+ :
+fi
+
+if [ x"$dir_arg" != x ]; then
+ dst=$src
+ src=""
+
+ if [ -d "$dst" ]; then
+ instcmd=:
+ chmodcmd=""
+ else
+ instcmd=$mkdirprog
+ fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f "$src" ] || [ -d "$src" ]
+ then
+ :
+ else
+ echo "$0: $src does not exist" >&2
+ exit 1
+ fi
+
+ if [ x"$dst" = x ]
+ then
+ echo "$0: no destination specified" >&2
+ exit 1
+ else
+ :
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d "$dst" ]
+ then
+ dst=$dst/`basename "$src"`
+ else
+ :
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+ '
+IFS="${IFS-$defaultIFS}"
+
+oIFS=$IFS
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS=$oIFS
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp=$pathcomp$1
+ shift
+
+ if [ ! -d "$pathcomp" ] ;
+ then
+ $mkdirprog "$pathcomp"
+ else
+ :
+ fi
+
+ pathcomp=$pathcomp/
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+ $doit $instcmd "$dst" &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+ if [ x"$transformarg" = x ]
+ then
+ dstfile=`basename "$dst"`
+ else
+ dstfile=`basename "$dst" $transformbasename |
+ sed $transformarg`$transformbasename
+ fi
+
+# don't allow the sed command to completely eliminate the filename
+
+ if [ x"$dstfile" = x ]
+ then
+ dstfile=`basename "$dst"`
+ else
+ :
+ fi
+
+# Make a couple of temp file names in the proper directory.
+
+ dsttmp=$dstdir/_inst.$$_
+ rmtmp=$dstdir/_rm.$$_
+
+# Trap to clean up temp files at exit.
+
+ trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
+ trap '(exit $?); exit' 1 2 13 15
+
+# Move or copy the file name to the temp name
+
+ $doit $instcmd "$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 $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi &&
+
+# 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.
+
+{
+ if [ -f "$dstdir/$dstfile" ]
+ then
+ $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null ||
+ $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null ||
+ {
+ echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+ (exit 1); exit
+ }
+ else
+ :
+ fi
+} &&
+
+# Now rename the file to the real destination.
+
+ $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+
+fi &&
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+
+{
+ (exit 0); exit
+}
diff --git a/netperf-2.4.4/missing b/netperf-2.4.4/missing
new file mode 100755
index 0000000..fc54c64
--- /dev/null
+++ b/netperf-2.4.4/missing
@@ -0,0 +1,336 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 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, 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.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+fi
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+ configure_ac=configure.ac
+else
+ configure_ac=configure.in
+fi
+
+case "$1" in
+--run)
+ # Try to run requested program, and just exit if it succeeds.
+ run=
+ shift
+ "$@" && exit 0
+ ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+ --run try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+ aclocal touch file \`aclocal.m4'
+ autoconf touch file \`configure'
+ autoheader touch file \`config.h.in'
+ automake touch all \`Makefile.in' files
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
+ flex create \`lex.yy.c', if possible, from existing .c
+ help2man touch the output file
+ lex create \`lex.yy.c', if possible, from existing .c
+ makeinfo touch the output file
+ tar try tar, gnutar, gtar, then tar without non-portable flags
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]"
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing 0.4 - GNU automake"
+ ;;
+
+ -*)
+ echo 1>&2 "$0: Unknown \`$1' option"
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+ ;;
+
+ aclocal*)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`acinclude.m4' or \`${configure_ac}'. You might want
+ to install the \`Automake' and \`Perl' packages. Grab them from
+ any GNU archive site."
+ touch aclocal.m4
+ ;;
+
+ autoconf)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`${configure_ac}'. You might want to install the
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
+ archive site."
+ touch configure
+ ;;
+
+ autoheader)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`acconfig.h' or \`${configure_ac}'. You might want
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
+ from any GNU archive site."
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+ test -z "$files" && files="config.h"
+ touch_files=
+ for f in $files; do
+ case "$f" in
+ *:*) touch_files="$touch_files "`echo "$f" |
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+ *) touch_files="$touch_files $f.in";;
+ esac
+ done
+ touch $touch_files
+ ;;
+
+ automake*)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+ You might want to install the \`Automake' and \`Perl' packages.
+ Grab them from any GNU archive site."
+ find . -type f -name Makefile.am -print |
+ sed 's/\.am$/.in/' |
+ while read f; do touch "$f"; done
+ ;;
+
+ autom4te)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+ system. You might have modified some files without having the
+ proper tools for further handling them.
+ You can get \`$1' as part of \`Autoconf' from any GNU
+ archive site."
+
+ file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
+ test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+ if test -f "$file"; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo "#! /bin/sh"
+ echo "# Created by GNU Automake missing as a replacement of"
+ echo "# $ $@"
+ echo "exit 0"
+ chmod +x $file
+ exit 1
+ fi
+ ;;
+
+ bison|yacc)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a \`.y' file. You may need the \`Bison' package
+ in order for those modifications to take effect. You can get
+ \`Bison' from any GNU archive site."
+ rm -f y.tab.c y.tab.h
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.y)
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.c
+ fi
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.h
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f y.tab.h ]; then
+ echo >y.tab.h
+ fi
+ if [ ! -f y.tab.c ]; then
+ echo 'main() { return 0; }' >y.tab.c
+ fi
+ ;;
+
+ lex|flex)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a \`.l' file. You may need the \`Flex' package
+ in order for those modifications to take effect. You can get
+ \`Flex' from any GNU archive site."
+ rm -f lex.yy.c
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.l)
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" lex.yy.c
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f lex.yy.c ]; then
+ echo 'main() { return 0; }' >lex.yy.c
+ fi
+ ;;
+
+ help2man)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a dependency of a manual page. You may need the
+ \`Help2man' package in order for those modifications to take
+ effect. You can get \`Help2man' from any GNU archive site."
+
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+ fi
+ if [ -f "$file" ]; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo ".ab help2man is required to generate this page"
+ exit 1
+ fi
+ ;;
+
+ makeinfo)
+ if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then
+ # We have makeinfo, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a \`.texi' or \`.texinfo' file, or any other file
+ indirectly affecting the aspect of the manual. The spurious
+ call might also be the consequence of using a buggy \`make' (AIX,
+ DU, IRIX). You might want to install the \`Texinfo' package or
+ the \`GNU make' package. Grab either from any GNU archive site."
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+ file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+ fi
+ touch $file
+ ;;
+
+ tar)
+ shift
+ if test -n "$run"; then
+ echo 1>&2 "ERROR: \`tar' requires --run"
+ exit 1
+ fi
+
+ # We have already tried tar in the generic part.
+ # Look for gnutar/gtar before invocation to avoid ugly error
+ # messages.
+ if (gnutar --version > /dev/null 2>&1); then
+ gnutar "$@" && exit 0
+ fi
+ if (gtar --version > /dev/null 2>&1); then
+ gtar "$@" && exit 0
+ fi
+ firstarg="$1"
+ if shift; then
+ case "$firstarg" in
+ *o*)
+ firstarg=`echo "$firstarg" | sed s/o//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ case "$firstarg" in
+ *h*)
+ firstarg=`echo "$firstarg" | sed s/h//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ fi
+
+ echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+ You may want to install GNU tar or Free paxutils, or check the
+ command line arguments."
+ exit 1
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+ system. You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequisites for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
diff --git a/netperf-2.4.4/mkinstalldirs b/netperf-2.4.4/mkinstalldirs
new file mode 100755
index 0000000..d2d5f21
--- /dev/null
+++ b/netperf-2.4.4/mkinstalldirs
@@ -0,0 +1,111 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+errstatus=0
+dirmode=""
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..."
+
+# process command line arguments
+while test $# -gt 0 ; do
+ case $1 in
+ -h | --help | --h*) # -h for help
+ echo "$usage" 1>&2
+ exit 0
+ ;;
+ -m) # -m PERM arg
+ shift
+ test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
+ dirmode=$1
+ shift
+ ;;
+ --) # stop option processing
+ shift
+ break
+ ;;
+ -*) # unknown option
+ echo "$usage" 1>&2
+ exit 1
+ ;;
+ *) # first non-opt arg
+ break
+ ;;
+ esac
+done
+
+for file
+do
+ if test -d "$file"; then
+ shift
+ else
+ break
+ fi
+done
+
+case $# in
+ 0) exit 0 ;;
+esac
+
+case $dirmode in
+ '')
+ if mkdir -p -- . 2>/dev/null; then
+ echo "mkdir -p -- $*"
+ exec mkdir -p -- "$@"
+ fi
+ ;;
+ *)
+ if mkdir -m "$dirmode" -p -- . 2>/dev/null; then
+ echo "mkdir -m $dirmode -p -- $*"
+ exec mkdir -m "$dirmode" -p -- "$@"
+ fi
+ ;;
+esac
+
+for file
+do
+ set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+ shift
+
+ pathcomp=
+ for d
+ do
+ pathcomp="$pathcomp$d"
+ case $pathcomp in
+ -*) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp"
+
+ mkdir "$pathcomp" || lasterr=$?
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ else
+ if test ! -z "$dirmode"; then
+ echo "chmod $dirmode $pathcomp"
+ lasterr=""
+ chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+ if test ! -z "$lasterr"; then
+ errstatus=$lasterr
+ fi
+ fi
+ fi
+ fi
+
+ pathcomp="$pathcomp/"
+ done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# End:
+# mkinstalldirs ends here
diff --git a/netperf-2.4.4/netperf.spec.in b/netperf-2.4.4/netperf.spec.in
new file mode 100644
index 0000000..9f8639a
--- /dev/null
+++ b/netperf-2.4.4/netperf.spec.in
@@ -0,0 +1,55 @@
+Summary: Network Performance Testing Tool
+Name: netperf
+Version: @VERSION@
+Release: 1
+Copyright: Unknown
+Group: System Environment/Base
+URL: http://www.netperf.org/
+Packager: Martin A. Brown
+Source: ftp://ftp.netperf.org/netperf/%{name}-%{version}.tar.gz
+BuildRoot: %{_tmppath}/%{name}-root
+Prefix: /usr
+
+%description
+Many different network benchmarking tools are collected in this package,
+maintained by Rick Jones of HP.
+
+%prep
+%setup
+
+%build
+#%patch0 -p1
+./configure \
+ --prefix=%{_prefix} \
+ --mandir=%{_mandir} \
+ --infodir=%{_infodir}
+make
+
+%install
+test "$RPM_BUILD_ROOT" = "/" || rm -rf $RPM_BUILD_ROOT
+make DESTDIR=${RPM_BUILD_ROOT} install
+
+# -- .svn directory only needed by developers; blowing it away
+# in our BUILD/ directory, so that we do not package it
+#
+rm -rf doc/examples/.svn
+
+%clean
+test "$RPM_BUILD_ROOT" = "/" || rm -rf $RPM_BUILD_ROOT
+
+# %post
+
+%files
+%defattr(-,root,root)
+%doc README AUTHORS ChangeLog INSTALL COPYING
+%doc README.* Release_Notes
+%doc doc/examples
+%{_mandir}/man1/*
+%{_infodir}/*
+%{_bindir}/netperf
+%{_bindir}/netserver
+
+
+%changelog
+* Sat Jun 17 2006 Martin A. Brown <martin@linux-ip.net>
+- initial contributed specfile for netperf package (v2.4.2)
diff --git a/netperf.c b/netperf.c
new file mode 100644
index 0000000..84717ac
--- /dev/null
+++ b/netperf.c
@@ -0,0 +1,284 @@
+/*
+
+ Copyright (C) 1993-2007 Hewlett-Packard Company
+ ALL RIGHTS RESERVED.
+
+ The enclosed software and documentation includes copyrighted works
+ of Hewlett-Packard Co. For as long as you comply with the following
+ limitations, you are hereby authorized to (i) use, reproduce, and
+ modify the software and documentation, and to (ii) distribute the
+ software and documentation, including modifications, for
+ non-commercial purposes only.
+
+ 1. The enclosed software and documentation is made available at no
+ charge in order to advance the general development of
+ high-performance networking products.
+
+ 2. You may not delete any copyright notices contained in the
+ software or documentation. All hard copies, and copies in
+ source code or object code form, of the software or
+ documentation (including modifications) must contain at least
+ one of the copyright notices.
+
+ 3. The enclosed software and documentation has not been subjected
+ to testing and quality control and is not a Hewlett-Packard Co.
+ product. At a future time, Hewlett-Packard Co. may or may not
+ offer a version of the software and documentation as a product.
+
+ 4. THE SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS".
+ HEWLETT-PACKARD COMPANY DOES NOT WARRANT THAT THE USE,
+ REPRODUCTION, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR
+ DOCUMENTATION WILL NOT INFRINGE A THIRD PARTY'S INTELLECTUAL
+ PROPERTY RIGHTS. HP DOES NOT WARRANT THAT THE SOFTWARE OR
+ DOCUMENTATION IS ERROR FREE. HP DISCLAIMS ALL WARRANTIES,
+ EXPRESS AND IMPLIED, WITH REGARD TO THE SOFTWARE AND THE
+ DOCUMENTATION. HP SPECIFICALLY DISCLAIMS ALL WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+ 5. HEWLETT-PACKARD COMPANY WILL NOT IN ANY EVENT BE LIABLE FOR ANY
+ DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
+ (INCLUDING LOST PROFITS) RELATED TO ANY USE, REPRODUCTION,
+ MODIFICATION, OR DISTRIBUTION OF THE SOFTWARE OR DOCUMENTATION.
+
+*/
+char netperf_id[]="\
+@(#)netperf.c (c) Copyright 1993-2007 Hewlett-Packard Company. Version 2.4.3";
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+/* FreeBSD doesn't like socket.h before types are set. */
+#if __FreeBSD__
+# include <sys/types.h>
+#endif
+
+#ifndef WIN32
+/* this should only be temporary */
+#include <sys/socket.h>
+#endif
+
+#ifdef WIN32
+#include <winsock2.h>
+#include <windows.h>
+#endif /* WIN32 */
+
+#include "netsh.h"
+#include "netlib.h"
+#include "nettest_bsd.h"
+
+#ifdef WANT_UNIX
+#include "nettest_unix.h"
+#endif /* WANT_UNIX */
+
+#ifdef WANT_XTI
+#include "nettest_xti.h"
+#endif /* WANT_XTI */
+
+#ifdef WANT_DLPI
+#include "nettest_dlpi.h"
+#endif /* WANT_DLPI */
+
+#ifdef WANT_SDP
+#include "nettest_sdp.h"
+#endif
+
+/* The DNS tests have been removed from netperf2. Those wanting to do
+ DNS_RR tests should use netperf4 instead. */
+
+#ifdef DO_DNS
+#error DNS tests have been removed from netperf. Use netperf4 instead
+#endif /* DO_DNS */
+
+#ifdef WANT_SCTP
+#include "nettest_sctp.h"
+#endif
+
+ /* this file contains the main for the netperf program. all the other */
+ /* routines can be found in the file netsh.c */
+
+
+int _cdecl
+main(int argc, char *argv[])
+{
+
+#ifdef WIN32
+ WSADATA wsa_data ;
+
+ /* Initialize the winsock lib ( version 2.2 ) */
+ if ( WSAStartup(MAKEWORD(2,2), &wsa_data) == SOCKET_ERROR ){
+ printf("WSAStartup() failed : %d\n", GetLastError()) ;
+ return 1 ;
+ }
+#endif /* WIN32 */
+
+ netlib_init();
+ set_defaults();
+ scan_cmd_line(argc,argv);
+
+ if (debug) {
+ dump_globals();
+ install_signal_catchers();
+ }
+
+ if (debug) {
+ printf("remotehost is %s and port %s\n",host_name,test_port);
+ fflush(stdout);
+ }
+
+
+ if (!no_control) {
+ establish_control(host_name,test_port,address_family,
+ local_host_name,local_test_port,local_address_family);
+ }
+
+ if (strcasecmp(test_name,"TCP_STREAM") == 0) {
+ send_tcp_stream(host_name);
+ }
+ else if (strcasecmp(test_name,"TCP_MAERTS") == 0) {
+ send_tcp_maerts(host_name);
+ }
+#ifdef HAVE_ICSC_EXS
+ else if (strcasecmp(test_name,"EXS_TCP_STREAM") == 0) {
+ send_exs_tcp_stream(host_name);
+ }
+#endif /* HAVE_ICSC_EXS */
+#ifdef HAVE_SENDFILE
+ else if (strcasecmp(test_name,"TCP_SENDFILE") == 0) {
+ sendfile_tcp_stream(host_name);
+ }
+#endif /* HAVE_SENDFILE */
+ else if (strcasecmp(test_name,"TCP_RR") == 0) {
+ send_tcp_rr(host_name);
+ }
+ else if (strcasecmp(test_name,"TCP_CRR") == 0) {
+ send_tcp_conn_rr(host_name);
+ }
+ else if (strcasecmp(test_name,"TCP_CC") == 0) {
+ send_tcp_cc(host_name);
+ }
+#ifdef DO_1644
+ else if (strcasecmp(test_name,"TCP_TRR") == 0) {
+ send_tcp_tran_rr(host_name);
+ }
+#endif /* DO_1644 */
+#ifdef DO_NBRR
+ else if (strcasecmp(test_name,"TCP_NBRR") == 0) {
+ send_tcp_nbrr(host_name);
+ }
+#endif /* DO_NBRR */
+ else if (strcasecmp(test_name,"UDP_STREAM") == 0) {
+ send_udp_stream(host_name);
+ }
+ else if (strcasecmp(test_name,"UDP_RR") == 0) {
+ send_udp_rr(host_name);
+ }
+ else if (strcasecmp(test_name,"LOC_CPU") == 0) {
+ loc_cpu_rate();
+ }
+ else if (strcasecmp(test_name,"REM_CPU") == 0) {
+ rem_cpu_rate();
+ }
+#ifdef WANT_DLPI
+ else if (strcasecmp(test_name,"DLCO_RR") == 0) {
+ send_dlpi_co_rr(host_name);
+ }
+ else if (strcasecmp(test_name,"DLCL_RR") == 0) {
+ send_dlpi_cl_rr(host_name);
+ }
+ else if (strcasecmp(test_name,"DLCO_STREAM") == 0) {
+ send_dlpi_co_stream(host_name);
+ }
+ else if (strcasecmp(test_name,"DLCL_STREAM") == 0) {
+ send_dlpi_cl_stream(host_name);
+ }
+#endif /* WANT_DLPI */
+#ifdef WANT_UNIX
+ else if (strcasecmp(test_name,"STREAM_RR") == 0) {
+ send_stream_rr(host_name);
+ }
+ else if (strcasecmp(test_name,"DG_RR") == 0) {
+ send_dg_rr(host_name);
+ }
+ else if (strcasecmp(test_name,"STREAM_STREAM") == 0) {
+ send_stream_stream(host_name);
+ }
+ else if (strcasecmp(test_name,"DG_STREAM") == 0) {
+ send_dg_stream(host_name);
+ }
+#endif /* WANT_UNIX */
+#ifdef WANT_XTI
+ else if (strcasecmp(test_name,"XTI_TCP_STREAM") == 0) {
+ send_xti_tcp_stream(host_name);
+ }
+ else if (strcasecmp(test_name,"XTI_TCP_RR") == 0) {
+ send_xti_tcp_rr(host_name);
+ }
+ else if (strcasecmp(test_name,"XTI_UDP_STREAM") == 0) {
+ send_xti_udp_stream(host_name);
+ }
+ else if (strcasecmp(test_name,"XTI_UDP_RR") == 0) {
+ send_xti_udp_rr(host_name);
+ }
+#endif /* WANT_XTI */
+
+#ifdef WANT_SCTP
+ else if (strcasecmp(test_name, "SCTP_STREAM") == 0) {
+ send_sctp_stream(host_name);
+ }
+ else if (strcasecmp(test_name, "SCTP_RR") == 0) {
+ send_sctp_rr(host_name);
+ }
+ else if (strcasecmp(test_name, "SCTP_STREAM_MANY") == 0) {
+ send_sctp_stream_1toMany(host_name);
+ }
+ else if (strcasecmp(test_name, "SCTP_RR_MANY") == 0) {
+ send_sctp_stream_1toMany(host_name);
+ }
+#endif
+
+#ifdef DO_DNS
+ else if (strcasecmp(test_name,"DNS_RR") == 0) {
+ fprintf(stderr,
+ "DNS tests can now be found in netperf4.\n");
+ fflush(stderr);
+ exit(-1);
+ }
+#endif /* DO_DNS */
+#ifdef WANT_SDP
+ else if (strcasecmp(test_name,"SDP_STREAM") == 0) {
+ send_sdp_stream(host_name);
+ }
+ else if (strcasecmp(test_name,"SDP_MAERTS") == 0) {
+ send_sdp_maerts(host_name);
+ }
+ else if (strcasecmp(test_name,"SDP_RR") == 0) {
+ send_sdp_rr(host_name);
+ }
+#endif /* WANT_SDP */
+ else {
+ printf("The test you requested is unknown to this netperf.\n");
+ printf("Please verify that you have the correct test name, \n");
+ printf("and that test family has been compiled into this netperf.\n");
+ exit(1);
+ }
+
+ if (!no_control) {
+ shutdown_control();
+ }
+
+#ifdef WIN32
+ /* Cleanup the winsock lib */
+ WSACleanup();
+#endif
+
+ return(0);
+}
+
+
diff --git a/netperf_version.h b/netperf_version.h
new file mode 100644
index 0000000..b2b9fdc
--- /dev/null
+++ b/netperf_version.h
@@ -0,0 +1 @@
+#define NETPERF_VERSION "2.4.4"
diff --git a/netperf_version.h.in b/netperf_version.h.in
new file mode 100644
index 0000000..8ebd452
--- /dev/null
+++ b/netperf_version.h.in
@@ -0,0 +1 @@
+#define NETPERF_VERSION "@VERSION@"
diff --git a/netserver.c b/netserver.c
new file mode 100644
index 0000000..02be3ce
--- /dev/null
+++ b/netserver.c
@@ -0,0 +1,1022 @@
+/*
+
+ Copyright (C) 1993-2007 Hewlett-Packard Company
+ ALL RIGHTS RESERVED.
+
+ The enclosed software and documentation includes copyrighted works
+ of Hewlett-Packard Co. For as long as you comply with the following
+ limitations, you are hereby authorized to (i) use, reproduce, and
+ modify the software and documentation, and to (ii) distribute the
+ software and documentation, including modifications, for
+ non-commercial purposes only.
+
+ 1. The enclosed software and documentation is made available at no
+ charge in order to advance the general development of
+ high-performance networking products.
+
+ 2. You may not delete any copyright notices contained in the
+ software or documentation. All hard copies, and copies in
+ source code or object code form, of the software or
+ documentation (including modifications) must contain at least
+ one of the copyright notices.
+
+ 3. The enclosed software and documentation has not been subjected
+ to testing and quality control and is not a Hewlett-Packard Co.
+ product. At a future time, Hewlett-Packard Co. may or may not
+ offer a version of the software and documentation as a product.
+
+ 4. THE SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS".
+ HEWLETT-PACKARD COMPANY DOES NOT WARRANT THAT THE USE,
+ REPRODUCTION, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR
+ DOCUMENTATION WILL NOT INFRINGE A THIRD PARTY'S INTELLECTUAL
+ PROPERTY RIGHTS. HP DOES NOT WARRANT THAT THE SOFTWARE OR
+ DOCUMENTATION IS ERROR FREE. HP DISCLAIMS ALL WARRANTIES,
+ EXPRESS AND IMPLIED, WITH REGARD TO THE SOFTWARE AND THE
+ DOCUMENTATION. HP SPECIFICALLY DISCLAIMS ALL WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+ 5. HEWLETT-PACKARD COMPANY WILL NOT IN ANY EVENT BE LIABLE FOR ANY
+ DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
+ (INCLUDING LOST PROFITS) RELATED TO ANY USE, REPRODUCTION,
+ MODIFICATION, OR DISTRIBUTION OF THE SOFTWARE OR DOCUMENTATION.
+
+*/
+
+#include "netperf_version.h"
+
+char netserver_id[]="\
+@(#)netserver.c (c) Copyright 1993-2007 Hewlett-Packard Co. Version 2.4.3";
+
+ /***********************************************************************/
+ /* */
+ /* netserver.c */
+ /* */
+ /* This is the server side code for the netperf test package. It */
+ /* will operate either stand-alone, or as a child of inetd. In this */
+ /* way, we insure that it can be installed on systems with or without */
+ /* root permissions (editing inetd.conf). Essentially, this code is */
+ /* the analog to the netsh.c code. */
+ /* */
+ /***********************************************************************/
+
+
+/************************************************************************/
+/* */
+/* Global include files */
+/* */
+/************************************************************************/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_LIMITS_H
+# include <limits.h>
+#endif
+#include <sys/types.h>
+#include <stdio.h>
+#ifndef WIN32
+#include <errno.h>
+#include <signal.h>
+#endif
+#if !defined(WIN32) && !defined(__VMS)
+#include <sys/ipc.h>
+#endif /* !defined(WIN32) && !defined(__VMS) */
+#include <fcntl.h>
+#ifdef WIN32
+#include <time.h>
+#include <winsock2.h>
+#define netperf_socklen_t socklen_t
+/* we need to find some other way to decide to include ws2 */
+/* if you are trying to compile on Windows 2000 or NT 4 you will */
+/* probably have to define DONT_IPV6 */
+#ifndef DONT_IPV6
+#include <ws2tcpip.h>
+#endif /* DONT_IPV6 */
+#include <windows.h>
+#define sleep(x) Sleep((x)*1000)
+#else
+#ifndef MPE
+#include <sys/time.h>
+#endif /* MPE */
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <unistd.h>
+#ifndef DONT_WAIT
+#include <sys/wait.h>
+#endif /* DONT_WAIT */
+#endif /* WIN32 */
+#include <stdlib.h>
+#ifdef __VMS
+#include <tcpip$inetdef.h>
+#include <unixio.h>
+#endif /* __VMS */
+#include "netlib.h"
+#include "nettest_bsd.h"
+
+#ifdef WANT_UNIX
+#include "nettest_unix.h"
+#endif /* WANT_UNIX */
+
+#ifdef WANT_DLPI
+#include "nettest_dlpi.h"
+#endif /* WANT_DLPI */
+
+#ifdef WANT_SCTP
+#include "nettest_sctp.h"
+#endif
+
+#include "netsh.h"
+
+#ifndef DEBUG_LOG_FILE
+#ifndef WIN32
+#define DEBUG_LOG_FILE "/tmp/netperf.debug"
+#else
+#define DEBUG_LOG_FILE "c:\\temp\\netperf.debug"
+#endif /* WIN32 */
+#endif /* DEBUG_LOG_FILE */
+
+ /* some global variables */
+
+FILE *afp;
+char listen_port[10];
+extern char *optarg;
+extern int optind, opterr;
+
+#ifndef WIN32
+#define SERVER_ARGS "dL:n:p:v:V46"
+#else
+#define SERVER_ARGS "dL:n:p:v:V46I:i:"
+#endif
+
+/* perhaps one day we will use this as part of only opening a debug
+ log file if debug is set, of course we have to be wary of the base
+ use of "where" and so probably always need "where" pointing
+ "somewhere" or other. */
+void
+open_debug_file()
+{
+#ifndef WIN32
+#ifndef PATH_MAX
+#define PATH_MAX MAX_PATH
+#endif
+ char FileName[PATH_MAX]; /* for opening the debug log file */
+ strcpy(FileName, DEBUG_LOG_FILE);
+
+ if (where != NULL) fflush(where);
+
+ snprintf(&FileName[strlen(FileName)], sizeof(FileName) - strlen(FileName), "_%d", getpid());
+ if ((where = fopen(FileName, "w")) == NULL) {
+ perror("netserver: debug file");
+ exit(1);
+ }
+
+ chmod(FileName,0644);
+#endif
+
+}
+ /* This routine implements the "main event loop" of the netperf */
+ /* server code. Code above it will have set-up the control connection */
+ /* so it can just merrily go about its business, which is to */
+ /* "schedule" performance tests on the server. */
+
+void
+process_requests()
+{
+
+ float temp_rate;
+
+ if (debug) open_debug_file();
+
+
+ while (1) {
+ recv_request();
+
+ switch (netperf_request.content.request_type) {
+
+ case DEBUG_ON:
+ netperf_response.content.response_type = DEBUG_OK;
+ /* dump_request already present in recv_request; redundant? */
+ if (!debug) {
+ debug++;
+ open_debug_file();
+ dump_request();
+ }
+ send_response();
+ break;
+
+ case DEBUG_OFF:
+ if (debug)
+ debug--;
+ netperf_response.content.response_type = DEBUG_OK;
+ send_response();
+ /* +SAF why??? */
+ if (!debug)
+ {
+ fclose(where);
+#if !defined(WIN32) && !defined(MPE) && !defined(__VMS)
+ /* For Unix: reopen the debug write file descriptor to "/dev/null" */
+ /* and redirect stdout to it. */
+ fflush (stdout);
+ where = fopen ("/dev/null", "w");
+ if (where == NULL)
+ {
+ perror ("netserver: reopening debug fp for writing: /dev/null");
+ exit (1);
+ }
+ if (close (STDOUT_FILENO) == -1)
+ {
+ perror ("netserver: closing stdout file descriptor");
+ exit (1);
+ }
+ if (dup (fileno (where)) == -1)
+ {
+ perror ("netserver: duplicate /dev/null write file descr. to stdout");
+ exit (1);
+ }
+#endif /* !WIN32 !MPE !__VMS */
+ }
+ break;
+
+ case CPU_CALIBRATE:
+ netperf_response.content.response_type = CPU_CALIBRATE;
+ temp_rate = calibrate_local_cpu(0.0);
+ bcopy((char *)&temp_rate,
+ (char *)netperf_response.content.test_specific_data,
+ sizeof(temp_rate));
+ bcopy((char *)&lib_num_loc_cpus,
+ (char *)netperf_response.content.test_specific_data + sizeof(temp_rate),
+ sizeof(lib_num_loc_cpus));
+ if (debug) {
+ fprintf(where,"netserver: sending CPU information:");
+ fprintf(where,"rate is %g num cpu %d\n",temp_rate,lib_num_loc_cpus);
+ fflush(where);
+ }
+
+ /* we need the cpu_start, cpu_stop in the looper case to kill the */
+ /* child proceses raj 7/95 */
+
+#ifdef USE_LOOPER
+ cpu_start(1);
+ cpu_stop(1,&temp_rate);
+#endif /* USE_LOOPER */
+
+ send_response();
+ break;
+
+ case DO_TCP_STREAM:
+ recv_tcp_stream();
+ break;
+
+ case DO_TCP_MAERTS:
+ recv_tcp_maerts();
+ break;
+
+ case DO_TCP_RR:
+ recv_tcp_rr();
+ break;
+
+ case DO_TCP_CRR:
+ recv_tcp_conn_rr();
+ break;
+
+ case DO_TCP_CC:
+ recv_tcp_cc();
+ break;
+
+#ifdef DO_1644
+ case DO_TCP_TRR:
+ recv_tcp_tran_rr();
+ break;
+#endif /* DO_1644 */
+
+#ifdef DO_NBRR
+ case DO_TCP_NBRR:
+ recv_tcp_nbrr();
+ break;
+#endif /* DO_NBRR */
+
+ case DO_UDP_STREAM:
+ recv_udp_stream();
+ break;
+
+ case DO_UDP_RR:
+ recv_udp_rr();
+ break;
+
+#ifdef WANT_DLPI
+
+ case DO_DLPI_CO_RR:
+ recv_dlpi_co_rr();
+ break;
+
+ case DO_DLPI_CL_RR:
+ recv_dlpi_cl_rr();
+ break;
+
+ case DO_DLPI_CO_STREAM:
+ recv_dlpi_co_stream();
+ break;
+
+ case DO_DLPI_CL_STREAM:
+ recv_dlpi_cl_stream();
+ break;
+
+#endif /* WANT_DLPI */
+
+#ifdef WANT_UNIX
+
+ case DO_STREAM_STREAM:
+ recv_stream_stream();
+ break;
+
+ case DO_STREAM_RR:
+ recv_stream_rr();
+ break;
+
+ case DO_DG_STREAM:
+ recv_dg_stream();
+ break;
+
+ case DO_DG_RR:
+ recv_dg_rr();
+ break;
+
+#endif /* WANT_UNIX */
+
+#ifdef WANT_XTI
+ case DO_XTI_TCP_STREAM:
+ recv_xti_tcp_stream();
+ break;
+
+ case DO_XTI_TCP_RR:
+ recv_xti_tcp_rr();
+ break;
+
+ case DO_XTI_UDP_STREAM:
+ recv_xti_udp_stream();
+ break;
+
+ case DO_XTI_UDP_RR:
+ recv_xti_udp_rr();
+ break;
+
+#endif /* WANT_XTI */
+
+#ifdef WANT_SCTP
+ case DO_SCTP_STREAM:
+ recv_sctp_stream();
+ break;
+
+ case DO_SCTP_STREAM_MANY:
+ recv_sctp_stream_1toMany();
+ break;
+
+ case DO_SCTP_RR:
+ recv_sctp_rr();
+ break;
+
+ case DO_SCTP_RR_MANY:
+ recv_sctp_rr_1toMany();
+ break;
+#endif
+
+#ifdef WANT_SDP
+ case DO_SDP_STREAM:
+ recv_sdp_stream();
+ break;
+
+ case DO_SDP_MAERTS:
+ recv_sdp_maerts();
+ break;
+
+ case DO_SDP_RR:
+ recv_sdp_rr();
+ break;
+#endif
+
+ default:
+ fprintf(where,"unknown test number %d\n",
+ netperf_request.content.request_type);
+ fflush(where);
+ netperf_response.content.serv_errno=998;
+ send_response();
+ break;
+
+ }
+ }
+}
+
+/*
+ set_up_server()
+
+ set-up the server listen socket. we only call this routine if the
+ user has specified a port number on the command line or we believe we
+ are not a child of inetd or its platform-specific equivalent */
+
+/*KC*/
+
+void
+set_up_server(char hostname[], char port[], int af)
+{
+
+ struct addrinfo hints;
+ struct addrinfo *local_res;
+ struct addrinfo *local_res_temp;
+
+ struct sockaddr_storage peeraddr;
+ netperf_socklen_t peeraddr_len = sizeof(peeraddr);
+
+ SOCKET server_control;
+ int on=1;
+ int count;
+ int error;
+ int not_listening;
+
+#if !defined(WIN32) && !defined(MPE) && !defined(__VMS)
+ FILE *rd_null_fp; /* Used to redirect from "/dev/null". */
+ FILE *wr_null_fp; /* Used to redirect to "/dev/null". */
+#endif /* !WIN32 !MPE !__VMS */
+
+ if (debug) {
+ fprintf(stderr,
+ "set_up_server called with host '%s' port '%s' remfam %d\n",
+ hostname,
+ port,
+ af);
+ fflush(stderr);
+ }
+
+ memset(&hints,0,sizeof(hints));
+ hints.ai_family = af;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_protocol = IPPROTO_TCP;
+ hints.ai_flags = AI_PASSIVE;
+
+ count = 0;
+ do {
+ error = getaddrinfo((char *)hostname,
+ (char *)port,
+ &hints,
+ &local_res);
+ count += 1;
+ if (error == EAI_AGAIN) {
+ if (debug) {
+ fprintf(stderr,"Sleeping on getaddrinfo EAI_AGAIN\n");
+ fflush(stderr);
+ }
+ sleep(1);
+ }
+ } while ((error == EAI_AGAIN) && (count <= 5));
+
+ if (error) {
+ fprintf(stderr,
+ "set_up_server: could not resolve remote '%s' port '%s' af %d",
+ hostname,
+ port,
+ af);
+ fprintf(stderr,"\n\tgetaddrinfo returned %d %s\n",
+ error,
+ gai_strerror(error));
+ exit(-1);
+ }
+
+ if (debug) {
+ dump_addrinfo(stderr, local_res, hostname, port, af);
+ }
+
+ not_listening = 1;
+ local_res_temp = local_res;
+
+ while((local_res_temp != NULL) && (not_listening)) {
+
+ fprintf(stderr,
+ "Starting netserver at port %s\n",
+ port);
+
+ server_control = socket(local_res_temp->ai_family,SOCK_STREAM,0);
+
+ if (server_control == INVALID_SOCKET) {
+ perror("set_up_server could not allocate a socket");
+ exit(-1);
+ }
+
+ /* happiness and joy, keep going */
+ if (setsockopt(server_control,
+ SOL_SOCKET,
+ SO_REUSEADDR,
+ (char *)&on ,
+ sizeof(on)) == SOCKET_ERROR) {
+ if (debug) {
+ perror("warning: set_up_server could not set SO_REUSEADDR");
+ }
+ }
+ /* still happy and joyful */
+
+ if ((bind (server_control,
+ local_res_temp->ai_addr,
+ local_res_temp->ai_addrlen) != SOCKET_ERROR) &&
+ (listen (server_control,5) != SOCKET_ERROR)) {
+ not_listening = 0;
+ break;
+ }
+ else {
+ /* we consider a bind() or listen() failure a transient and try
+ the next address */
+ if (debug) {
+ perror("warning: set_up_server failed a bind or listen call\n");
+ }
+ local_res_temp = local_res_temp->ai_next;
+ continue;
+ }
+ }
+
+ if (not_listening) {
+ fprintf(stderr,
+ "set_up_server could not establish a listen endpoint for %s port %s with family %s\n",
+ host_name,
+ port,
+ inet_ftos(af));
+ fflush(stderr);
+ exit(-1);
+ }
+ else {
+ printf("Starting netserver at hostname %s port %s and family %s\n",
+ hostname,
+ port,
+ inet_ftos(af));
+ }
+
+ /*
+ setpgrp();
+ */
+
+#if !defined(WIN32) && !defined(MPE) && !defined(__VMS)
+ /* Flush the standard I/O file descriptors before forking. */
+ fflush (stdin);
+ fflush (stdout);
+ fflush (stderr);
+ switch (fork())
+ {
+ case -1:
+ perror("netperf server error");
+ exit(1);
+
+ case 0:
+ /* Redirect stdin from "/dev/null". */
+ rd_null_fp = fopen ("/dev/null", "r");
+ if (rd_null_fp == NULL)
+ {
+ perror ("netserver: opening for reading: /dev/null");
+ exit (1);
+ }
+ if (close (STDIN_FILENO) == -1)
+ {
+ perror ("netserver: closing stdin file descriptor");
+ exit (1);
+ }
+ if (dup (fileno (rd_null_fp)) == -1)
+ {
+ perror ("netserver: duplicate /dev/null read file descr. to stdin");
+ exit (1);
+ }
+
+ /* Redirect stdout to the debug write file descriptor. */
+ if (close (STDOUT_FILENO) == -1)
+ {
+ perror ("netserver: closing stdout file descriptor");
+ exit (1);
+ }
+ if (dup (fileno (where)) == -1)
+ {
+ perror ("netserver: duplicate the debug write file descr. to stdout");
+ exit (1);
+ }
+
+ /* Redirect stderr to "/dev/null". */
+ wr_null_fp = fopen ("/dev/null", "w");
+ if (wr_null_fp == NULL)
+ {
+ perror ("netserver: opening for writing: /dev/null");
+ exit (1);
+ }
+ if (close (STDERR_FILENO) == -1)
+ {
+ perror ("netserver: closing stderr file descriptor");
+ exit (1);
+ }
+ if (dup (fileno (wr_null_fp)) == -1)
+ {
+ perror ("netserver: dupicate /dev/null write file descr. to stderr");
+ exit (1);
+ }
+
+#ifndef NO_SETSID
+ setsid();
+#else
+ setpgrp();
+#endif /* NO_SETSID */
+
+ /* some OS's have SIGCLD defined as SIGCHLD */
+#ifndef SIGCLD
+#define SIGCLD SIGCHLD
+#endif /* SIGCLD */
+
+ signal(SIGCLD, SIG_IGN);
+
+#endif /* !WIN32 !MPE !__VMS */
+
+ for (;;)
+ {
+ if ((server_sock=accept(server_control,
+ (struct sockaddr *)&peeraddr,
+ &peeraddr_len)) == INVALID_SOCKET)
+ {
+ printf("server_control: accept failed errno %d\n",errno);
+ exit(1);
+ }
+#if defined(MPE) || defined(__VMS)
+ /*
+ * Since we cannot fork this process , we cant fire any threads
+ * as they all share the same global data . So we better allow
+ * one request at at time
+ */
+ process_requests() ;
+#elif WIN32
+ {
+ BOOL b;
+ char cmdline[80];
+ PROCESS_INFORMATION pi;
+ STARTUPINFO si;
+ int i;
+
+ memset(&si, 0 , sizeof(STARTUPINFO));
+ si.cb = sizeof(STARTUPINFO);
+
+ /* Pass the server_sock as stdin for the new process. */
+ /* Hopefully this will continue to be created with the OBJ_INHERIT attribute. */
+ si.hStdInput = (HANDLE)server_sock;
+ si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
+ si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
+ si.dwFlags = STARTF_USESTDHANDLES;
+
+ /* Build cmdline for child process */
+ strcpy(cmdline, program);
+ if (verbosity > 1) {
+ snprintf(&cmdline[strlen(cmdline)], sizeof(cmdline) - strlen(cmdline), " -v %d", verbosity);
+ }
+ for (i=0; i < debug; i++) {
+ snprintf(&cmdline[strlen(cmdline)], sizeof(cmdline) - strlen(cmdline), " -d");
+ }
+ snprintf(&cmdline[strlen(cmdline)], sizeof(cmdline) - strlen(cmdline), " -I %x", (int)(UINT_PTR)server_sock);
+ snprintf(&cmdline[strlen(cmdline)], sizeof(cmdline) - strlen(cmdline), " -i %x", (int)(UINT_PTR)server_control);
+ snprintf(&cmdline[strlen(cmdline)], sizeof(cmdline) - strlen(cmdline), " -i %x", (int)(UINT_PTR)where);
+
+ b = CreateProcess(NULL, /* Application Name */
+ cmdline,
+ NULL, /* Process security attributes */
+ NULL, /* Thread security attributes */
+ TRUE, /* Inherit handles */
+ 0, /* Creation flags PROCESS_QUERY_INFORMATION, */
+ NULL, /* Enviornment */
+ NULL, /* Current directory */
+ &si, /* StartupInfo */
+ &pi);
+ if (!b)
+ {
+ perror("CreateProcessfailure: ");
+ exit(1);
+ }
+
+ /* We don't need the thread or process handles any more; let them */
+ /* go away on their own timeframe. */
+
+ CloseHandle(pi.hThread);
+ CloseHandle(pi.hProcess);
+
+ /* And close the server_sock since the child will own it. */
+
+ close(server_sock);
+ }
+#else
+ signal(SIGCLD, SIG_IGN);
+
+ switch (fork())
+ {
+ case -1:
+ /* something went wrong */
+ exit(1);
+ case 0:
+ /* we are the child process */
+ close(server_control);
+ process_requests();
+ exit(0);
+ break;
+ default:
+ /* we are the parent process */
+ close(server_sock);
+ /* we should try to "reap" some of our children. on some */
+ /* systems they are being left as defunct processes. we */
+ /* will call waitpid, looking for any child process, */
+ /* with the WNOHANG feature. when waitpid return a zero, */
+ /* we have reaped all the children there are to reap at */
+ /* the moment, so it is time to move on. raj 12/94 */
+#ifndef DONT_WAIT
+#ifdef NO_SETSID
+ /* Only call "waitpid()" if "setsid()" is not used. */
+ while(waitpid(-1, NULL, WNOHANG) > 0) { }
+#endif /* NO_SETSID */
+#endif /* DONT_WAIT */
+ break;
+ }
+#endif /* !WIN32 !MPE !__VMS */
+ } /*for*/
+#if !defined(WIN32) && !defined(MPE) && !defined(__VMS)
+ break; /*case 0*/
+
+ default:
+ exit (0);
+
+ }
+#endif /* !WIN32 !MPE !__VMS */
+}
+
+#ifdef WIN32
+
+ /* With Win2003, WinNT's POSIX subsystem is gone and hence so is */
+ /* fork. */
+
+ /* But hopefully the kernel support will continue to exist for some */
+ /* time. */
+
+ /* We are not counting on the child address space copy_on_write */
+ /* support, since it isn't exposed except through the NT native APIs */
+ /* (which is not public). */
+
+ /* We will try to use the InheritHandles flag in CreateProcess. It */
+ /* is in the public API, though it is documented as "must be FALSE". */
+
+ /* So where we would have forked, we will now create a new process. */
+ /* I have added a set of command line switches to specify a list of */
+ /* handles that the child should close since they shouldn't have */
+ /* been inherited ("-i#"), and a single switch to specify the handle */
+ /* for the server_sock ("I#"). */
+
+ /* A better alternative would be to re-write NetPerf to be */
+ /* multi-threaded; i.e., move all of the various NetPerf global */
+ /* variables in to thread specific structures. But this is a bigger */
+ /* effort than I want to tackle at this time. (And I doubt that the */
+ /* HP-UX author sees value in this effort). */
+
+#endif
+
+int _cdecl
+main(int argc, char *argv[])
+{
+
+ int c;
+ int not_inetd = 0;
+#ifdef WIN32
+ BOOL child = FALSE;
+#endif
+ char arg1[BUFSIZ], arg2[BUFSIZ];
+#ifndef PATH_MAX
+#define PATH_MAX MAX_PATH
+#endif
+ char FileName[PATH_MAX]; /* for opening the debug log file */
+
+ struct sockaddr name;
+ netperf_socklen_t namelen = sizeof(name);
+
+
+#ifdef WIN32
+ WSADATA wsa_data ;
+
+ /* Initialize the winsock lib ( version 2.2 ) */
+ if ( WSAStartup(MAKEWORD(2,2), &wsa_data) == SOCKET_ERROR ){
+ printf("WSAStartup() failed : %d\n", GetLastError()) ;
+ return 1 ;
+ }
+#endif /* WIN32 */
+
+ /* Save away the program name */
+ program = (char *)malloc(strlen(argv[0]) + 1);
+ if (program == NULL) {
+ printf("malloc(%d) failed!\n", strlen(argv[0]) + 1);
+ return 1 ;
+ }
+ strcpy(program, argv[0]);
+
+ netlib_init();
+
+ /* Scan the command line to see if we are supposed to set-up our own */
+ /* listen socket instead of relying on inetd. */
+
+ /* first set a copy of initial values */
+ strncpy(local_host_name,"0.0.0.0",sizeof(local_host_name));
+ local_address_family = AF_UNSPEC;
+ strncpy(listen_port,TEST_PORT,sizeof(listen_port));
+
+ while ((c = getopt(argc, argv, SERVER_ARGS)) != EOF) {
+ switch (c) {
+ case '?':
+ case 'h':
+ print_netserver_usage();
+ exit(1);
+ case 'd':
+ /* we want to set the debug file name sometime */
+ debug++;
+ break;
+ case 'L':
+ not_inetd = 1;
+ break_args_explicit(optarg,arg1,arg2);
+ if (arg1[0]) {
+ strncpy(local_host_name,arg1,sizeof(local_host_name));
+ }
+ if (arg2[0]) {
+ local_address_family = parse_address_family(arg2);
+ /* if only the address family was set, we may need to set the
+ local_host_name accordingly. since our defaults are IPv4
+ this should only be necessary if we have IPv6 support raj
+ 2005-02-07 */
+#if defined (AF_INET6)
+ if (!arg1[0]) {
+ strncpy(local_host_name,"::0",sizeof(local_host_name));
+ }
+#endif
+ }
+ break;
+ case 'n':
+ shell_num_cpus = atoi(optarg);
+ if (shell_num_cpus > MAXCPUS) {
+ fprintf(stderr,
+ "netserver: This version can only support %d CPUs. Please",
+ MAXCPUS);
+ fprintf(stderr,
+ " increase MAXCPUS in netlib.h and recompile.\n");
+ fflush(stderr);
+ exit(1);
+ }
+ break;
+ case 'p':
+ /* we want to open a listen socket at a */
+ /* specified port number */
+ strncpy(listen_port,optarg,sizeof(listen_port));
+ not_inetd = 1;
+ break;
+ case '4':
+ local_address_family = AF_INET;
+ break;
+ case '6':
+#if defined(AF_INET6)
+ local_address_family = AF_INET6;
+ strncpy(local_host_name,"::0",sizeof(local_host_name));
+#else
+ local_address_family = AF_UNSPEC;
+#endif
+ break;
+ case 'v':
+ /* say how much to say */
+ verbosity = atoi(optarg);
+ break;
+ case 'V':
+ printf("Netperf version %s\n",NETPERF_VERSION);
+ exit(0);
+ break;
+#ifdef WIN32
+/*+*+SAF */
+ case 'I':
+ child = TRUE;
+ /* This is the handle we expect to inherit. */
+ /*+*+SAF server_sock = (HANDLE)atoi(optarg); */
+ break;
+ case 'i':
+ /* This is a handle we should NOT inherit. */
+ /*+*+SAF CloseHandle((HANDLE)atoi(optarg)); */
+ break;
+#endif
+
+ }
+ }
+
+ /* +*+SAF I need a better way to find inherited handles I should close! */
+ /* +*+SAF Use DuplicateHandle to force inheritable attribute (or reset it)? */
+
+/* unlink(DEBUG_LOG_FILE); */
+
+ strcpy(FileName, DEBUG_LOG_FILE);
+
+#ifndef WIN32
+ snprintf(&FileName[strlen(FileName)], sizeof(FileName) - strlen(FileName), "_%d", getpid());
+ if ((where = fopen(FileName, "w")) == NULL) {
+ perror("netserver: debug file");
+ exit(1);
+ }
+#else
+ {
+
+ if (child) {
+ snprintf(&FileName[strlen(FileName)], sizeof(FileName) - strlen(FileName), "_%x", getpid());
+ }
+
+ /* Hopefully, by closing stdout & stderr, the subsequent
+ fopen calls will get mapped to the correct std handles. */
+ fclose(stdout);
+
+ if ((where = fopen(FileName, "w")) == NULL) {
+ perror("netserver: fopen of debug file as new stdout failed!");
+ exit(1);
+ }
+
+ fclose(stderr);
+
+ if ((where = fopen(FileName, "w")) == NULL) {
+ fprintf(stdout, "fopen of debug file as new stderr failed!\n");
+ exit(1);
+ }
+ }
+#endif
+
+#ifndef WIN32
+ chmod(DEBUG_LOG_FILE,0644);
+#endif
+
+#if WIN32
+ if (child) {
+ server_sock = (SOCKET)GetStdHandle(STD_INPUT_HANDLE);
+ }
+#endif
+
+ /* if we are not a child of an inetd or the like, then we should
+ open a socket and hang listens off of it. otherwise, we should go
+ straight into processing requests. the do_listen() routine will sit
+ in an infinite loop accepting connections and forking child
+ processes. the child processes will call process_requests */
+
+ /* If fd 0 is not a socket then assume we're not being called */
+ /* from inetd and start server socket on the default port. */
+ /* this enhancement comes from vwelch@ncsa.uiuc.edu (Von Welch) */
+ if (not_inetd) {
+ /* the user specified a port number on the command line */
+ set_up_server(local_host_name,listen_port,local_address_family);
+ }
+#ifdef WIN32
+ /* OK, with Win2003 WinNT's POSIX subsystem is gone, and hence so is */
+ /* fork. But hopefully the kernel support will continue to exist */
+ /* for some time. We are not counting on the address space */
+ /* copy_on_write support, since it isn't exposed except through the */
+ /* NT native APIs (which are not public). We will try to use the */
+ /* InheritHandles flag in CreateProcess though since this is public */
+ /* and is used for more than just POSIX so hopefully it won't go */
+ /* away. */
+ else if (TRUE) {
+ if (child) {
+ process_requests();
+ } else {
+ strncpy(listen_port,TEST_PORT,sizeof(listen_port));
+ set_up_server(local_host_name,listen_port,local_address_family);
+ }
+ }
+#endif
+#if !defined(__VMS)
+ else if (getsockname(0, &name, &namelen) == SOCKET_ERROR) {
+ /* we may not be a child of inetd */
+ if (errno == ENOTSOCK) {
+ strncpy(listen_port,TEST_PORT,sizeof(listen_port));
+ set_up_server(local_host_name,listen_port,local_address_family);
+ }
+ }
+#endif /* !defined(__VMS) */
+ else {
+ /* we are probably a child of inetd, or are being invoked via the
+ VMS auxilliarly server mechanism */
+#if !defined(__VMS)
+ server_sock = 0;
+#else
+ if ( (server_sock = socket(TCPIP$C_AUXS, SOCK_STREAM, 0)) == INVALID_SOCKET )
+ {
+ perror("Failed to grab aux server socket" );
+ exit(1);
+ }
+
+#endif /* !defined(__VMS) */
+ process_requests();
+ }
+#ifdef WIN32
+ /* Cleanup the winsock lib */
+ WSACleanup();
+#endif
+
+ return(0);
+}
diff --git a/netsh.c b/netsh.c
new file mode 100644
index 0000000..7659679
--- /dev/null
+++ b/netsh.c
@@ -0,0 +1,1002 @@
+#include "netperf_version.h"
+
+char netsh_id[]="\
+@(#)netsh.c (c) Copyright 1993-2007 Hewlett-Packard Company. Version 2.4.3pre";
+
+
+/****************************************************************/
+/* */
+/* Global include files */
+/* */
+/****************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+#ifndef WIN32
+#include <unistd.h>
+#ifndef __VMS
+#include <sys/ipc.h>
+#endif /* __VMS */
+#endif /* WIN32 */
+#include <fcntl.h>
+#ifndef WIN32
+#include <errno.h>
+#include <signal.h>
+#endif /* !WIN32 */
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+ /* the following four includes should not be needed ?*/
+#ifndef WIN32
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#else
+#include <time.h>
+#include <winsock2.h>
+#define netperf_socklen_t socklen_t
+#endif
+
+#ifndef STRINGS
+#include <string.h>
+#else /* STRINGS */
+#include <strings.h>
+#endif /* STRINGS */
+
+#ifdef WIN32
+extern int getopt(int , char **, char *) ;
+#else
+double atof(const char *);
+#endif /* WIN32 */
+
+/**********************************************************************/
+/* */
+/* Local Include Files */
+/* */
+/**********************************************************************/
+
+#define NETSH
+#include "netsh.h"
+#include "netlib.h"
+#include "nettest_bsd.h"
+
+#ifdef WANT_UNIX
+#include "nettest_unix.h"
+#ifndef WIN32
+#include "sys/socket.h"
+#endif /* !WIN32 */
+#endif /* WANT_UNIX */
+
+#ifdef WANT_XTI
+#include "nettest_xti.h"
+#endif /* WANT_XTI */
+
+#ifdef WANT_DLPI
+#include "nettest_dlpi.h"
+#endif /* WANT_DLPI */
+
+#ifdef WANT_SCTP
+#include "nettest_sctp.h"
+#endif
+
+
+/************************************************************************/
+/* */
+/* Global constants and macros */
+/* */
+/************************************************************************/
+
+ /* Some of the args take optional parameters. Since we are using */
+ /* getopt to parse the command line, we will tell getopt that they do */
+ /* not take parms, and then look for them ourselves */
+#define GLOBAL_CMD_LINE_ARGS "A:a:b:B:CcdDf:F:H:hi:I:k:K:l:L:n:NO:o:P:p:rt:T:v:VW:w:46"
+
+/************************************************************************/
+/* */
+/* Extern variables */
+/* */
+/************************************************************************/
+
+/*
+extern int errno;
+extern char *sys_errlist[ ];
+extern int sys_nerr;
+*/
+
+/************************************************************************/
+/* */
+/* Global variables */
+/* */
+/************************************************************************/
+
+/* some names and such */
+char *program; /* program invocation name */
+char username[BUFSIZ]; /* login name of user */
+char cmd_file[BUFSIZ]; /* name of the commands file */
+
+/* stuff to say where this test is going */
+char host_name[HOSTNAMESIZE]; /* remote host name or ip addr */
+char local_host_name[HOSTNAMESIZE]; /* local hostname or ip */
+char test_name[BUFSIZ]; /* which test to run */
+char test_port[PORTBUFSIZE]; /* where is the test waiting */
+char local_test_port[PORTBUFSIZE]; /* from whence we should start */
+int address_family; /* which address family remote */
+int local_address_family; /* which address family local */
+
+/* the source of data for filling the buffers */
+char fill_file[BUFSIZ];
+
+/* output controlling variables */
+int
+ debug, /* debugging level */
+ print_headers, /* do/don't display headers */
+ verbosity; /* verbosity level */
+
+/* When specified with -B, this will be displayed at the end of the line
+ for output that does not include the test header. mostly this is
+ to help identify a specific netperf result when concurrent netperfs
+ are run. raj 2006-02-01 */
+char *result_brand = NULL;
+
+/* cpu variables */
+int
+ local_cpu_usage, /* you guessed it */
+ remote_cpu_usage; /* still right ! */
+
+float
+ local_cpu_rate,
+ remote_cpu_rate;
+
+int
+ shell_num_cpus=1;
+
+/* the end-test conditions for the tests - either transactions, bytes, */
+/* or time. different vars used for clarity - space is cheap ;-) */
+int
+ test_time, /* test ends by time */
+ test_len_ticks, /* how many times will the timer go off before */
+ /* the test is over? */
+ test_bytes, /* test ends on byte count */
+ test_trans; /* test ends on tran count */
+
+/* the alignment conditions for the tests */
+int
+ local_recv_align, /* alignment for local receives */
+ local_send_align, /* alignment for local sends */
+ local_send_offset = 0,
+ local_recv_offset = 0,
+ remote_recv_align, /* alignment for remote receives */
+ remote_send_align, /* alignment for remote sends */
+ remote_send_offset = 0,
+ remote_recv_offset = 0;
+
+#if defined(WANT_INTERVALS) || defined(WANT_DEMO)
+int
+ interval_usecs,
+ interval_wate,
+ interval_burst;
+
+int demo_mode; /* are we actually in demo mode? */
+double demo_interval = 1000000.0; /* what is the desired interval to
+ display interval results. default
+ is one second in units of
+ microseconds */
+double demo_units = 0.0; /* what is our current best guess as
+ to how many work units must be
+ done to be near the desired
+ reporting interval? */
+
+double units_this_tick;
+#endif
+
+#ifdef DIRTY
+int loc_dirty_count;
+int loc_clean_count;
+int rem_dirty_count;
+int rem_clean_count;
+#endif /* DIRTY */
+
+ /* some of the vairables for confidence intervals... */
+
+int confidence_level;
+int iteration_min;
+int iteration_max;
+int result_confidence_only = 0;
+
+double interval;
+
+ /* stuff to control the "width" of the buffer rings for sending and */
+ /* receiving data */
+int send_width;
+int recv_width;
+
+/* address family */
+int af = AF_INET;
+
+/* did someone request processor affinity? */
+int cpu_binding_requested = 0;
+
+/* are we not establishing a control connection? */
+int no_control = 0;
+
+char netserver_usage[] = "\n\
+Usage: netserver [options] \n\
+\n\
+Options:\n\
+ -h Display this text\n\
+ -d Increase debugging output\n\
+ -L name,family Use name to pick listen address and family for family\n\
+ -p portnum Listen for connect requests on portnum.\n\
+ -4 Do IPv4\n\
+ -6 Do IPv6\n\
+ -v verbosity Specify the verbosity level\n\
+ -V Display version information and exit\n\
+\n";
+
+/* netperf_usage done as two concatenated strings to make the MS
+ compiler happy when compiling for x86_32. fix from Spencer
+ Frink. */
+
+char netperf_usage1[] = "\n\
+Usage: netperf [global options] -- [test options] \n\
+\n\
+Global options:\n\
+ -a send,recv Set the local send,recv buffer alignment\n\
+ -A send,recv Set the remote send,recv buffer alignment\n\
+ -B brandstr Specify a string to be emitted with brief output\n\
+ -c [cpu_rate] Report local CPU usage\n\
+ -C [cpu_rate] Report remote CPU usage\n\
+ -d Increase debugging output\n\
+ -D [secs,units] * Display interim results at least every secs seconds\n\
+ using units as the initial guess for units per second\n\
+ -f G|M|K|g|m|k Set the output units\n\
+ -F fill_file Pre-fill buffers with data from fill_file\n\
+ -h Display this text\n\
+ -H name|ip,fam * Specify the target machine and/or local ip and family\n\
+ -i max,min Specify the max and min number of iterations (15,1)\n\
+ -I lvl[,intvl] Specify confidence level (95 or 99) (99) \n\
+ and confidence interval in percentage (10)\n\
+ -l testlen Specify test duration (>0 secs) (<0 bytes|trans)\n\
+ -L name|ip,fam * Specify the local ip|name and address family\n\
+ -o send,recv Set the local send,recv buffer offsets\n\
+ -O send,recv Set the remote send,recv buffer offset\n\
+ -n numcpu Set the number of processors for CPU util\n\
+ -N Establish no control connection, do 'send' side only\n\
+ -p port,lport* Specify netserver port number and/or local port\n\
+ -P 0|1 Don't/Do display test headers\n\
+ -r Allow confidence to be hit on result only\n\
+ -t testname Specify test to perform\n\
+ -T lcpu,rcpu Request netperf/netserver be bound to local/remote cpu\n\
+ -v verbosity Specify the verbosity level\n\
+ -W send,recv Set the number of send,recv buffers\n\
+ -v level Set the verbosity level (default 1, min 0)\n\
+ -V Display the netperf version and exit\n";
+
+char netperf_usage2[] = "\n\
+For those options taking two parms, at least one must be specified;\n\
+specifying one value without a comma will set both parms to that\n\
+value, specifying a value with a leading comma will set just the second\n\
+parm, a value with a trailing comma will set just the first. To set\n\
+each parm to unique values, specify both and separate them with a\n\
+comma.\n\
+\n"
+"* For these options taking two parms, specifying one value with no comma\n\
+will only set the first parms and will leave the second at the default\n\
+value. To set the second value it must be preceded with a comma or be a\n\
+comma-separated pair. This is to retain previous netperf behaviour.\n";
+
+
+/* This routine will return the two arguments to the calling routine. */
+/* If the second argument is not specified, and there is no comma, */
+/* then the value of the second argument will be the same as the */
+/* value of the first. If there is a comma, then the value of the */
+/* second argument will be the value of the second argument ;-) */
+void
+break_args(char *s, char *arg1, char *arg2)
+
+{
+ char *ns;
+ ns = strchr(s,',');
+ if (ns) {
+ /* there was a comma arg2 should be the second arg*/
+ *ns++ = '\0';
+ while ((*arg2++ = *ns++) != '\0');
+ }
+ else {
+ /* there was not a comma, we can use ns as a temp s */
+ /* and arg2 should be the same value as arg1 */
+ ns = s;
+ while ((*arg2++ = *ns++) != '\0');
+ };
+ while ((*arg1++ = *s++) != '\0');
+}
+
+/* break_args_explicit
+
+ this routine is somewhat like break_args in that it will separate a
+ pair of comma-separated values. however, if there is no comma,
+ this version will not ass-u-me that arg2 should be the same as
+ arg1. raj 2005-02-04 */
+void
+break_args_explicit(char *s, char *arg1, char *arg2)
+
+{
+ char *ns;
+ ns = strchr(s,',');
+ if (ns) {
+ /* there was a comma arg2 should be the second arg*/
+ *ns++ = '\0';
+ while ((*arg2++ = *ns++) != '\0');
+ }
+ else {
+ /* there was not a comma, so we should make sure that arg2 is \0
+ lest something become confused. raj 2005-02-04 */
+ *arg2 = '\0';
+ };
+ while ((*arg1++ = *s++) != '\0');
+
+}
+
+/* given a string with possible values for setting an address family,
+ convert that into one of the AF_mumble values - AF_INET, AF_INET6,
+ AF_UNSPEC as apropriate. the family_string is compared in a
+ case-insensitive manner */
+
+int
+parse_address_family(char family_string[])
+{
+
+ char temp[10]; /* gotta love magic constants :) */
+
+ strncpy(temp,family_string,10);
+
+ if (debug) {
+ fprintf(where,
+ "Attempting to parse address family from %s derived from %s\n",
+ temp,
+ family_string);
+ }
+#if defined(AF_INET6)
+ if (strstr(temp,"6")) {
+ return(AF_INET6);
+ }
+#endif
+ if (strstr(temp,"inet") ||
+ strstr(temp,"4")) {
+ return(AF_INET);
+ }
+ if (strstr(temp,"unspec") ||
+ strstr(temp,"0")) {
+ return(AF_UNSPEC);
+ }
+ fprintf(where,
+ "WARNING! %s not recognized as an address family, using AF_UNPSEC\n",
+ family_string);
+ fprintf(where,
+ "Are you sure netperf was configured for that address family?\n");
+ fflush(where);
+ return(AF_UNSPEC);
+}
+
+
+void
+set_defaults()
+{
+
+ /* stuff to say where this test is going */
+ strcpy(host_name,""); /* remote host name or ip addr */
+ strcpy(local_host_name,""); /* we want it to be INADDR_ANY */
+ strcpy(test_name,"TCP_STREAM"); /* which test to run */
+ strncpy(test_port,"12865",PORTBUFSIZE); /* where is the test waiting */
+ strncpy(local_test_port,"0",PORTBUFSIZE);/* INPORT_ANY as it were */
+ address_family = AF_UNSPEC;
+ local_address_family = AF_UNSPEC;
+
+ /* output controlling variables */
+ debug = 0;/* debugging level */
+ print_headers = 1;/* do print test headers */
+ verbosity = 1;/* verbosity level */
+ /* cpu variables */
+ local_cpu_usage = 0;/* measure local cpu */
+ remote_cpu_usage = 0;/* what do you think ;-) */
+
+ local_cpu_rate = (float)0.0;
+ remote_cpu_rate = (float)0.0;
+
+ /* the end-test conditions for the tests - either transactions, bytes, */
+ /* or time. different vars used for clarity - space is cheap ;-) */
+ test_time = 10; /* test ends by time */
+ test_bytes = 0; /* test ends on byte count */
+ test_trans = 0; /* test ends on tran count */
+
+ /* the alignment conditions for the tests */
+ local_recv_align = 8; /* alignment for local receives */
+ local_send_align = 8; /* alignment for local sends */
+ remote_recv_align = 8; /* alignment for remote receives*/
+ remote_send_align = 8; /* alignment for remote sends */
+
+#ifdef WANT_INTERVALS
+ /* rate controlling stuff */
+ interval_usecs = 0;
+ interval_wate = 1;
+ interval_burst = 0;
+#endif /* WANT_INTERVALS */
+
+#ifdef DIRTY
+ /* dirty and clean cache stuff */
+ loc_dirty_count = 0;
+ loc_clean_count = 0;
+ rem_dirty_count = 0;
+ rem_clean_count = 0;
+#endif /* DIRTY */
+
+ /* some of the vairables for confidence intervals... */
+
+ confidence_level = 99;
+ iteration_min = 1;
+ iteration_max = 1;
+ interval = 0.05; /* five percent? */
+
+ no_control = 0;
+ strcpy(fill_file,"");
+}
+
+
+void
+print_netserver_usage()
+{
+ fwrite(netserver_usage, sizeof(char), strlen(netserver_usage), stderr);
+}
+
+
+void
+print_netperf_usage()
+{
+ fwrite(netperf_usage1, sizeof(char), strlen(netperf_usage1), stderr);
+ fwrite(netperf_usage2, sizeof(char), strlen(netperf_usage2), stderr);
+}
+
+void
+scan_cmd_line(int argc, char *argv[])
+{
+ extern int optind; /* index of first unused arg */
+ extern char *optarg; /* pointer to option string */
+
+ int c;
+
+ char arg1[BUFSIZ], /* argument holders */
+ arg2[BUFSIZ];
+
+ program = (char *)malloc(strlen(argv[0]) + 1);
+ if (program == NULL) {
+ printf("malloc(%d) failed!\n", strlen(argv[0]) + 1);
+ exit(1);
+ }
+ strcpy(program, argv[0]);
+
+ /* Go through all the command line arguments and break them */
+ /* out. For those options that take two parms, specifying only */
+ /* the first will set both to that value. Specifying only the */
+ /* second will leave the first untouched. To change only the */
+ /* first, use the form first, (see the routine break_args.. */
+
+ while ((c= getopt(argc, argv, GLOBAL_CMD_LINE_ARGS)) != EOF) {
+ switch (c) {
+ case '?':
+ case 'h':
+ print_netperf_usage();
+ exit(1);
+ case 'a':
+ /* set local alignments */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0]) {
+ local_send_align = convert(arg1);
+ }
+ if (arg2[0])
+ local_recv_align = convert(arg2);
+ break;
+ case 'A':
+ /* set remote alignments */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0]) {
+ remote_send_align = convert(arg1);
+ }
+ if (arg2[0])
+ remote_recv_align = convert(arg2);
+ break;
+ case 'c':
+ /* measure local cpu usage please. the user */
+ /* may have specified the cpu rate as an */
+ /* optional parm */
+ if (argv[optind] && isdigit((unsigned char)argv[optind][0])){
+ /* there was an optional parm */
+ local_cpu_rate = (float)atof(argv[optind]);
+ optind++;
+ }
+ local_cpu_usage++;
+ break;
+ case 'C':
+ /* measure remote cpu usage please */
+ if (argv[optind] && isdigit((unsigned char)argv[optind][0])){
+ /* there was an optional parm */
+ remote_cpu_rate = (float)atof(argv[optind]);
+ optind++;
+ }
+ remote_cpu_usage++;
+ break;
+ case 'd':
+ debug++;
+ break;
+ case 'D':
+#if (defined WANT_DEMO)
+ demo_mode++;
+ if (argv[optind] && isdigit((unsigned char)argv[optind][0])){
+ /* there was an optional parm */
+ break_args_explicit(argv[optind],arg1,arg2);
+ optind++;
+ if (arg1[0]) {
+ demo_interval = atof(arg1) * 1000000.0;
+ }
+ if (arg2[0]) {
+ demo_units = convert(arg2);
+ }
+ }
+#else
+ printf("Sorry, Demo Mode not configured into this netperf.\n");
+ printf("please consider reconfiguring netperf with\n");
+ printf("--enable-demo=yes and recompiling\n");
+#endif
+ break;
+ case 'f':
+ /* set the thruput formatting */
+ libfmt = *optarg;
+ break;
+ case 'F':
+ /* set the fill_file variable for pre-filling buffers */
+ strcpy(fill_file,optarg);
+ break;
+ case 'i':
+ /* set the iterations min and max for confidence intervals */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0]) {
+ iteration_max = convert(arg1);
+ }
+ if (arg2[0] ) {
+ iteration_min = convert(arg2);
+ }
+ /* if the iteration_max is < iteration_min make iteration_max
+ equal iteration_min */
+ if (iteration_max < iteration_min) iteration_max = iteration_min;
+ /* limit minimum to 3 iterations */
+ if (iteration_max < 3) iteration_max = 3;
+ if (iteration_min < 3) iteration_min = 3;
+ /* limit maximum to 30 iterations */
+ if (iteration_max > 30) iteration_max = 30;
+ if (iteration_min > 30) iteration_min = 30;
+ break;
+ case 'I':
+ /* set the confidence level (95 or 99) and width */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0]) {
+ confidence_level = convert(arg1);
+ }
+ if((confidence_level != 95) && (confidence_level != 99)){
+ printf("Only 95%% and 99%% confidence level is supported\n");
+ exit(1);
+ }
+ if (arg2[0] ) {
+ interval = (double) convert(arg2)/100;
+ }
+ /* make sure that iteration_min and iteration_max are at least
+ at a reasonable default value. if a -i option has previously
+ been parsed, these will no longer be 1, so we can check
+ against 1 */
+ if (iteration_min == 1) iteration_min = 3;
+ if (iteration_max == 1) iteration_max = 10;
+
+ break;
+ case 'k':
+ /* local dirty and clean counts */
+#ifdef DIRTY
+ break_args(optarg,arg1,arg2);
+ if (arg1[0]) {
+ loc_dirty_count = convert(arg1);
+ }
+ if (arg2[0] ) {
+ loc_clean_count = convert(arg2);
+ }
+#else
+ printf("I don't know how to get dirty.\n");
+#endif /* DIRTY */
+ break;
+ case 'K':
+ /* remote dirty and clean counts */
+#ifdef DIRTY
+ break_args(optarg,arg1,arg2);
+ if (arg1[0]) {
+ rem_dirty_count = convert(arg1);
+ }
+ if (arg2[0] ) {
+ rem_clean_count = convert(arg2);
+ }
+#else
+ printf("I don't know how to get dirty.\n");
+#endif /* DIRTY */
+ break;
+ case 'n':
+ shell_num_cpus = atoi(optarg);
+ break;
+ case 'N':
+ no_control = 1;
+ break;
+ case 'o':
+ /* set the local offsets */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ local_send_offset = convert(arg1);
+ if (arg2[0])
+ local_recv_offset = convert(arg2);
+ break;
+ case 'O':
+ /* set the remote offsets */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ remote_send_offset = convert(arg1);
+ if (arg2[0])
+ remote_recv_offset = convert(arg2);
+ break;
+ case 'P':
+ /* to print or not to print, that is */
+ /* the header question */
+ print_headers = convert(optarg);
+ break;
+ case 'r':
+ /* the user wishes that we declare confidence when hit on the
+ result even if not yet reached on CPU utilization. only
+ meaningful if cpu util is enabled */
+ result_confidence_only = 1;
+ break;
+ case 't':
+ /* set the test name */
+ strcpy(test_name,optarg);
+ break;
+ case 'T':
+ /* We want to set the processor on which netserver or netperf */
+ /* will run */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0]) {
+ local_proc_affinity = convert(arg1);
+ bind_to_specific_processor(local_proc_affinity,0);
+ }
+ if (arg2[0]) {
+ remote_proc_affinity = convert(arg2);
+ }
+ cpu_binding_requested = 1;
+ break;
+ case 'W':
+ /* set the "width" of the user space data buffer ring. This will */
+ /* be the number of send_size buffers malloc'd in the tests */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ send_width = convert(arg1);
+ if (arg2[0])
+ recv_width = convert(arg2);
+ break;
+ case 'l':
+ /* determine test end conditions */
+ /* assume a timed test */
+ test_time = convert(optarg);
+ test_bytes = test_trans = 0;
+ if (test_time < 0) {
+ test_bytes = -1 * test_time;
+ test_trans = test_bytes;
+ test_time = 0;
+ }
+ break;
+ case 'v':
+ /* say how much to say */
+ verbosity = convert(optarg);
+ break;
+ case 'p':
+ /* specify an alternate port number we use break_args_explicit
+ here to maintain backwards compatibility with previous
+ generations of netperf where having a single value did not
+ set both remote _and_ local port number. raj 2005-02-04 */
+ break_args_explicit(optarg,arg1,arg2);
+ if (arg1[0])
+ strncpy(test_port,arg1,PORTBUFSIZE);
+ if (arg2[0])
+ strncpy(local_test_port,arg2,PORTBUFSIZE);
+ break;
+ case 'H':
+ /* save-off the host identifying information, use
+ break_args_explicit since passing just one value should not
+ set both */
+ break_args_explicit(optarg,arg1,arg2);
+ if (arg1[0])
+ strncpy(host_name,arg1,sizeof(host_name));
+ if (arg2[0])
+ address_family = parse_address_family(arg2);
+ break;
+ case 'L':
+ /* save-off the local control socket addressing information. use
+ break_args_explicit since passing just one value should not
+ set both */
+ break_args_explicit(optarg,arg1,arg2);
+ if (arg1[0])
+ strncpy(local_host_name,arg1,sizeof(local_host_name));
+ if (arg2[0])
+ local_address_family = parse_address_family(arg2);
+ break;
+ case 'w':
+ /* We want to send requests at a certain wate. */
+ /* Remember that there are 1000000 usecs in a */
+ /* second, and that the packet rate is */
+ /* expressed in packets per millisecond. */
+#ifdef WANT_INTERVALS
+ interval_usecs = convert_timespec(optarg);
+ interval_wate = interval_usecs / 1000;
+#else
+ fprintf(where,
+ "Packet rate control is not compiled in.\n");
+#endif
+ break;
+ case 'b':
+ /* we want to have a burst so many packets per */
+ /* interval. */
+#ifdef WANT_INTERVALS
+ interval_burst = convert(optarg);
+#else
+ fprintf(where,
+ "Packet burst size is not compiled in. \n");
+#endif /* WANT_INTERVALS */
+ break;
+ case 'B':
+ result_brand = malloc(strlen(optarg)+1);
+ if (NULL != result_brand) {
+ strcpy(result_brand,optarg);
+ }
+ else {
+ fprintf(where,
+ "Unable to malloc space for result brand\n");
+ }
+ break;
+ case '4':
+ address_family = AF_INET;
+ local_address_family = AF_INET;
+ break;
+ case '6':
+#if defined(AF_INET6)
+ address_family = AF_INET6;
+ local_address_family = AF_INET6;
+#else
+ printf("This netperf was not compiled on an IPv6 capable system!\n");
+ exit(-1);
+#endif
+ break;
+ case 'V':
+ printf("Netperf version %s\n",NETPERF_VERSION);
+ exit(0);
+ break;
+ };
+ }
+ /* ok, what should our default hostname and local binding info be?
+ */
+ if ('\0' == host_name[0]) {
+ /* host_name was not set */
+ switch (address_family) {
+ case AF_INET:
+ strcpy(host_name,"localhost");
+ break;
+ case AF_UNSPEC:
+ /* what to do here? case it off the local_address_family I
+ suppose */
+ switch (local_address_family) {
+ case AF_INET:
+ case AF_UNSPEC:
+ strcpy(host_name,"localhost");
+ break;
+#if defined(AF_INET6)
+ case AF_INET6:
+ strcpy(host_name,"::1");
+ break;
+#endif
+ default:
+ printf("Netperf does not understand %d as an address family\n",
+ address_family);
+ exit(-1);
+ }
+ break;
+#if defined(AF_INET6)
+ case AF_INET6:
+ strcpy(host_name,"::1");
+ break;
+#endif
+ default:
+ printf("Netperf does not understand %d as an address family\n",
+ address_family);
+ exit(-1);
+ }
+ }
+
+ /* now, having established the name to which the control will
+ connect, from what should it come? */
+ if ('\0' == local_host_name[0]) {
+ switch (local_address_family) {
+ case AF_INET:
+ strcpy(local_host_name,"0.0.0.0");
+ break;
+ case AF_UNSPEC:
+ switch (address_family) {
+ case AF_INET:
+ case AF_UNSPEC:
+ strcpy(local_host_name,"0.0.0.0");
+ break;
+#if defined(AF_INET6)
+ case AF_INET6:
+ strcpy(local_host_name,"::0");
+ break;
+#endif
+ default:
+ printf("Netperf does not understand %d as an address family\n",
+ address_family);
+ exit(-1);
+ }
+ break;
+#if defined(AF_INET6)
+ case AF_INET6:
+ strcpy(local_host_name,"::0");
+ break;
+#endif
+ default:
+ printf("Netperf does not understand %d as an address family\n",
+ address_family);
+ exit(-1);
+ }
+ }
+
+ /* so, if we aren't even going to establish a control connection we
+ should set certain "remote" settings to reflect this, regardless
+ of what else may have been set on the command line */
+ if (no_control) {
+ remote_recv_align = -1;
+ remote_send_align = -1;
+ remote_send_offset = -1;
+ remote_recv_offset = -1;
+ remote_cpu_rate = (float)-1.0;
+ remote_cpu_usage = 0;
+ }
+
+ /* parsing test-specific options used to be conditional on there
+ being a "--" in the option stream. however, some of the tests
+ have other initialization happening in their "scan" routines so we
+ want to call them regardless. raj 2005-02-08 */
+ if ((strcasecmp(test_name,"TCP_STREAM") == 0) ||
+#ifdef HAVE_ICSC_EXS
+ (strcasecmp(test_name,"EXS_TCP_STREAM") == 0) ||
+#endif /* HAVE_ICSC_EXS */
+#ifdef HAVE_SENDFILE
+ (strcasecmp(test_name,"TCP_SENDFILE") == 0) ||
+#endif /* HAVE_SENDFILE */
+ (strcasecmp(test_name,"TCP_MAERTS") == 0) ||
+ (strcasecmp(test_name,"TCP_RR") == 0) ||
+ (strcasecmp(test_name,"TCP_CRR") == 0) ||
+ (strcasecmp(test_name,"TCP_CC") == 0) ||
+#ifdef DO_1644
+ (strcasecmp(test_name,"TCP_TRR") == 0) ||
+#endif /* DO_1644 */
+#ifdef DO_NBRR
+ (strcasecmp(test_name,"TCP_TRR") == 0) ||
+#endif /* DO_NBRR */
+ (strcasecmp(test_name,"UDP_STREAM") == 0) ||
+ (strcasecmp(test_name,"UDP_RR") == 0))
+ {
+ scan_sockets_args(argc, argv);
+ }
+
+#ifdef WANT_DLPI
+ else if ((strcasecmp(test_name,"DLCO_RR") == 0) ||
+ (strcasecmp(test_name,"DLCL_RR") == 0) ||
+ (strcasecmp(test_name,"DLCO_STREAM") == 0) ||
+ (strcasecmp(test_name,"DLCL_STREAM") == 0))
+ {
+ scan_dlpi_args(argc, argv);
+ }
+#endif /* WANT_DLPI */
+
+#ifdef WANT_UNIX
+ else if ((strcasecmp(test_name,"STREAM_RR") == 0) ||
+ (strcasecmp(test_name,"DG_RR") == 0) ||
+ (strcasecmp(test_name,"STREAM_STREAM") == 0) ||
+ (strcasecmp(test_name,"DG_STREAM") == 0))
+ {
+ scan_unix_args(argc, argv);
+ }
+#endif /* WANT_UNIX */
+
+#ifdef WANT_XTI
+ else if ((strcasecmp(test_name,"XTI_TCP_RR") == 0) ||
+ (strcasecmp(test_name,"XTI_TCP_STREAM") == 0) ||
+ (strcasecmp(test_name,"XTI_UDP_RR") == 0) ||
+ (strcasecmp(test_name,"XTI_UDP_STREAM") == 0))
+ {
+ scan_xti_args(argc, argv);
+ }
+#endif /* WANT_XTI */
+
+#ifdef WANT_SCTP
+ else if ((strcasecmp(test_name,"SCTP_STREAM") == 0) ||
+ (strcasecmp(test_name,"SCTP_RR") == 0) ||
+ (strcasecmp(test_name,"SCTP_STREAM_MANY") == 0) ||
+ (strcasecmp(test_name,"SCTP_RR_MANY") == 0))
+ {
+ scan_sctp_args(argc, argv);
+ }
+#endif
+
+#ifdef WANT_SDP
+ else if((strcasecmp(test_name,"SDP_STREAM") == 0) ||
+ (strcasecmp(test_name,"SDP_MAERTS") == 0) ||
+ (strcasecmp(test_name,"SDP_RR") == 0))
+ {
+ scan_sdp_args(argc, argv);
+ }
+#endif
+
+ /* what is our default value for the output units? if the test
+ name contains "RR" or "rr" or "Rr" or "rR" then the default is
+ 'x' for transactions. otherwise it is 'm' for megabits
+ (10^6) */
+
+ if ('?' == libfmt) {
+ /* we use a series of strstr's here because not everyone has
+ strcasestr and I don't feel like up or downshifting text */
+ if ((strstr(test_name,"RR")) ||
+ (strstr(test_name,"rr")) ||
+ (strstr(test_name,"Rr")) ||
+ (strstr(test_name,"rR"))) {
+ libfmt = 'x';
+ }
+ else {
+ libfmt = 'm';
+ }
+ }
+ else if ('x' == libfmt) {
+ /* now, a format of 'x' makes no sense for anything other than
+ an RR test. if someone has been silly enough to try to set
+ that, we will reset it silently to default - namely 'm' */
+ if ((strstr(test_name,"RR") == NULL) &&
+ (strstr(test_name,"rr") == NULL) &&
+ (strstr(test_name,"Rr") == NULL) &&
+ (strstr(test_name,"rR") == NULL)) {
+ libfmt = 'm';
+ }
+ }
+}
+
+
+void
+dump_globals()
+{
+ printf("Program name: %s\n", program);
+ printf("Local send alignment: %d\n",local_send_align);
+ printf("Local recv alignment: %d\n",local_recv_align);
+ printf("Remote send alignment: %d\n",remote_send_align);
+ printf("Remote recv alignment: %d\n",remote_recv_align);
+ printf("Report local CPU %d\n",local_cpu_usage);
+ printf("Report remote CPU %d\n",remote_cpu_usage);
+ printf("Verbosity: %d\n",verbosity);
+ printf("Debug: %d\n",debug);
+ printf("Port: %s\n",test_port);
+ printf("Test name: %s\n",test_name);
+ printf("Test bytes: %d Test time: %d Test trans: %d\n",
+ test_bytes,
+ test_time,
+ test_trans);
+ printf("Host name: %s\n",host_name);
+ printf("\n");
+}
diff --git a/netsh.h b/netsh.h
new file mode 100644
index 0000000..e99883b
--- /dev/null
+++ b/netsh.h
@@ -0,0 +1,149 @@
+/*
+ Copyright (C) 1993,1995 Hewlett-Packard Company
+*/
+
+/* libraried performance include file */
+/* the define NOPERFEXTERN tels us not to re-define all the */
+
+/* defines and defaults */
+#define HOSTNAMESIZE 255
+#define PORTBUFSIZE 10
+#define DEFAULT_SIZE 32768
+#define HOST_NAME "127.0.0.1"
+#define TEST_PORT "12865"
+
+/* output controlling variables */
+#define DEBUG 0 /* debugging level */
+#define VERBOSITY 0 /* verbosity level */
+
+/* the end-test conditions for the tests - either transactions, bytes, */
+/* or time. different vars used for clarity - space is cheap ;-) */
+#define TEST_TIME 10 /* test ends by time */
+#define TEST_BYTES 0 /* test ends on byte count */
+#define TEST_TRANS 0 /* test ends on tran count */
+
+/* the alignment conditions for the tests */
+#define LOC_RECV_ALIGN 4 /* alignment for local receives */
+#define LOC_SEND_ALIGN 4 /* alignment for local sends */
+#define REM_RECV_ALIGN 4 /* alignment for remote receive */
+#define REM_SEND_ALIGN 4 /* alignment for remote sends */
+
+/* misc defines for the hell of it */
+#ifndef MAXLONG
+#define MAXLONG 4294967295UL
+#endif /* MAXLONG */
+
+#ifndef NETSH
+extern char *program; /* program invocation name */
+
+/* stuff to say where this test is going */
+extern char host_name[HOSTNAMESIZE];/* remote host name or ip addr */
+extern char local_host_name[HOSTNAMESIZE];
+extern char test_port[PORTBUFSIZE]; /* where is the test waiting */
+extern char local_test_port[PORTBUFSIZE];
+extern int address_family;
+extern int local_address_family;
+extern int parse_address_family(char family_string[]);
+extern void set_defaults();
+extern void scan_cmd_line(int argc, char *argv[]);
+extern void dump_globals();
+extern void break_args(char *s, char *arg1, char *arg2);
+extern void break_args_explicit(char *s, char *arg1, char *arg2);
+extern void print_netserver_usage();
+
+/* output controlling variables */
+extern int
+ debug, /* debugging level */
+ print_headers, /* do/don't print test headers */
+ verbosity; /* verbosity level */
+
+/* the end-test conditions for the tests - either transactions, bytes, */
+/* or time. different vars used for clarity - space is cheap ;-) */
+extern int
+ test_time, /* test ends by time */
+ test_len_ticks,
+ test_bytes, /* test ends on byte count */
+ test_trans; /* test ends on tran count */
+
+/* the alignment conditions for the tests */
+extern int
+ local_recv_align, /* alignment for local receives */
+ local_send_align, /* alignment for local sends */
+ remote_recv_align, /* alignment for remote receives */
+ remote_send_align, /* alignment for remote sends */
+ local_send_offset,
+ local_recv_offset,
+ remote_send_offset,
+ remote_recv_offset;
+
+#if defined(WANT_INTERVALS) || defined(WANT_DEMO)
+extern int interval_usecs;
+extern int interval_wate;
+extern int interval_burst;
+
+extern int demo_mode;
+extern double demo_interval;
+extern double demo_units;
+extern double units_this_tick;
+#endif
+
+#ifdef DIRTY
+extern int rem_dirty_count;
+extern int rem_clean_count;
+extern int loc_dirty_count;
+extern int loc_clean_count;
+#endif /* DIRTY */
+
+/* stuff for confidence intervals */
+
+extern int confidence_level;
+extern int iteration_min;
+extern int iteration_max;
+extern int result_confidence_only;
+extern double interval;
+
+extern int cpu_binding_requested;
+
+/* stuff to controll the bufferspace "width" */
+extern int send_width;
+extern int recv_width;
+
+/* address family */
+extern int af;
+
+/* different options for other things */
+extern int
+ local_cpu_usage,
+ remote_cpu_usage;
+
+extern float
+ local_cpu_rate,
+ remote_cpu_rate;
+
+extern int
+ shell_num_cpus;
+
+extern char
+ test_name[BUFSIZ];
+
+extern char
+ fill_file[BUFSIZ];
+
+extern char *
+ result_brand;
+
+extern int
+ no_control;
+
+#ifdef WANT_DLPI
+
+extern int
+ loc_ppa,
+ rem_ppa;
+
+extern int
+ dlpi_sap;
+
+#endif /* WANT_DLPI */
+
+#endif
diff --git a/nettest_bsd.c b/nettest_bsd.c
new file mode 100644
index 0000000..27092f3
--- /dev/null
+++ b/nettest_bsd.c
@@ -0,0 +1,12333 @@
+#ifndef lint
+char nettest_id[]="\
+@(#)nettest_bsd.c (c) Copyright 1993-2004 Hewlett-Packard Co. Version 2.4.3";
+#endif /* lint */
+
+
+/****************************************************************/
+/* */
+/* nettest_bsd.c */
+/* */
+/* the BSD sockets parsing routine... */
+/* ...with the addition of Windows NT, this is now also */
+/* a Winsock test... sigh :) */
+/* */
+/* scan_sockets_args() */
+/* */
+/* the actual test routines... */
+/* */
+/* send_tcp_stream() perform a tcp stream test */
+/* recv_tcp_stream() */
+/* send_tcp_maerts() perform a tcp stream test */
+/* recv_tcp_maerts() in the other direction */
+/* send_tcp_rr() perform a tcp request/response */
+/* recv_tcp_rr() */
+/* send_tcp_conn_rr() an RR test including connect */
+/* recv_tcp_conn_rr() */
+/* send_tcp_cc() a connect/disconnect test with */
+/* recv_tcp_cc() no RR */
+/* send_udp_stream() perform a udp stream test */
+/* recv_udp_stream() */
+/* send_udp_rr() perform a udp request/response */
+/* recv_udp_rr() */
+/* loc_cpu_rate() determine the local cpu maxrate */
+/* rem_cpu_rate() find the remote cpu maxrate */
+/* */
+/****************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <fcntl.h>
+#ifndef WIN32
+#include <errno.h>
+#include <signal.h>
+#endif
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+
+#ifdef NOSTDLIBH
+#include <malloc.h>
+#endif /* NOSTDLIBH */
+
+#ifndef WIN32
+#if !defined(__VMS)
+#include <sys/ipc.h>
+#endif /* !defined(__VMS) */
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#else /* WIN32 */
+#include <process.h>
+#define netperf_socklen_t socklen_t
+#include <winsock2.h>
+
+/* while it is unlikely that anyone running Windows 2000 or NT 4 is
+ going to be trying to compile this, if they are they will want to
+ define DONT_IPV6 in the sources file */
+#ifndef DONT_IPV6
+#include <ws2tcpip.h>
+#endif
+#include <windows.h>
+
+#define sleep(x) Sleep((x)*1000)
+
+#define __func__ __FUNCTION__
+#endif /* WIN32 */
+
+/* We don't want to use bare constants in the shutdown() call. In the
+ extremely unlikely event that SHUT_WR isn't defined, we will define
+ it to the value we used to be passing to shutdown() anyway. raj
+ 2007-02-08 */
+#if !defined(SHUT_WR)
+#define SHUT_WR 1
+#endif
+
+#if !defined(HAVE_GETADDRINFO) || !defined(HAVE_GETNAMEINFO)
+# include "missing/getaddrinfo.h"
+#endif
+
+#include "netlib.h"
+#include "netsh.h"
+#include "nettest_bsd.h"
+
+#if defined(WANT_HISTOGRAM) || defined(WANT_DEMO)
+#include "hist.h"
+#endif /* WANT_HISTOGRAM */
+
+/* make first_burst_size unconditional so we can use it easily enough
+ when calculating transaction latency for the TCP_RR test. raj
+ 2007-06-08 */
+int first_burst_size=0;
+
+#if defined(HAVE_SENDFILE) && (defined(__linux) || defined(__sun__))
+#include <sys/sendfile.h>
+#endif /* HAVE_SENDFILE && (__linux || __sun__) */
+
+
+
+/* these variables are specific to the BSD sockets tests, but can
+ * be used elsewhere if needed. They are externed through nettest_bsd.h
+ */
+
+int
+ rss_size_req = -1, /* requested remote socket send buffer size */
+ rsr_size_req = -1, /* requested remote socket recv buffer size */
+ rss_size, /* remote socket send buffer size */
+ rsr_size, /* remote socket recv buffer size */
+ lss_size_req = -1, /* requested local socket send buffer size */
+ lsr_size_req = -1, /* requested local socket recv buffer size */
+ lss_size, /* local socket send buffer size */
+ lsr_size, /* local socket recv buffer size */
+ req_size = 1, /* request size */
+ rsp_size = 1, /* response size */
+ send_size, /* how big are individual sends */
+ recv_size; /* how big are individual receives */
+
+static int confidence_iteration;
+static char local_cpu_method;
+static char remote_cpu_method;
+
+/* these will control the width of port numbers we try to use in the */
+/* TCP_CRR and/or TCP_TRR tests. raj 3/95 */
+static int client_port_min = 5000;
+static int client_port_max = 65535;
+
+ /* different options for the sockets */
+
+int
+ loc_nodelay, /* don't/do use NODELAY locally */
+ rem_nodelay, /* don't/do use NODELAY remotely */
+#ifdef TCP_CORK
+ loc_tcpcork=0, /* don't/do use TCP_CORK locally */
+ rem_tcpcork=0, /* don't/do use TCP_CORK remotely */
+#endif /* TCP_CORK */
+ loc_sndavoid, /* avoid send copies locally */
+ loc_rcvavoid, /* avoid recv copies locally */
+ rem_sndavoid, /* avoid send copies remotely */
+ rem_rcvavoid, /* avoid recv_copies remotely */
+ local_connected = 0, /* local socket type, connected/non-connected */
+ remote_connected = 0; /* remote socket type, connected/non-connected */
+
+#ifdef WANT_HISTOGRAM
+#ifdef HAVE_GETHRTIME
+static hrtime_t time_one;
+static hrtime_t time_two;
+#elif HAVE_GET_HRT
+#include "hrt.h"
+static hrt_t time_one;
+static hrt_t time_two;
+#elif defined(WIN32)
+static LARGE_INTEGER time_one;
+static LARGE_INTEGER time_two;
+#else
+static struct timeval time_one;
+static struct timeval time_two;
+#endif /* HAVE_GETHRTIME */
+static HIST time_hist;
+#endif /* WANT_HISTOGRAM */
+
+#ifdef WANT_INTERVALS
+int interval_count;
+#ifndef WANT_SPIN
+sigset_t signal_set;
+#define INTERVALS_INIT() \
+ if (interval_burst) { \
+ /* zero means that we never pause, so we never should need the \
+ interval timer. we used to use it for demo mode, but we deal \
+ with that with a variant on watching the clock rather than \
+ waiting for a timer. raj 2006-02-06 */ \
+ start_itimer(interval_wate); \
+ } \
+ interval_count = interval_burst; \
+ /* get the signal set for the call to sigsuspend */ \
+ if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &signal_set) != 0) { \
+ fprintf(where, \
+ "%s: unable to get sigmask errno %d\n", \
+ __func__, \
+ errno); \
+ fflush(where); \
+ exit(1); \
+ }
+
+#define INTERVALS_WAIT() \
+ /* in this case, the interval count is the count-down couter \
+ to decide to sleep for a little bit */ \
+ if ((interval_burst) && (--interval_count == 0)) { \
+ /* call sigsuspend and wait for the interval timer to get us \
+ out */ \
+ if (debug > 1) { \
+ fprintf(where,"about to suspend\n"); \
+ fflush(where); \
+ } \
+ if (sigsuspend(&signal_set) == EFAULT) { \
+ fprintf(where, \
+ "%s: fault with sigsuspend.\n", \
+ __func__); \
+ fflush(where); \
+ exit(1); \
+ } \
+ interval_count = interval_burst; \
+ }
+#else
+/* first out timestamp */
+#ifdef HAVE_GETHRTIME
+static hrtime_t intvl_one;
+static hrtime_t intvl_two;
+static hrtime_t *intvl_one_ptr = &intvl_one;
+static hrtime_t *intvl_two_ptr = &intvl_two;
+static hrtime_t *temp_intvl_ptr = &intvl_one;
+#elif defined(WIN32)
+static LARGE_INTEGER intvl_one;
+static LARGE_INTEGER intvl_two;
+static LARGE_INTEGER *intvl_one_ptr = &intvl_one;
+static LARGE_INTEGER *intvl_two_ptr = &intvl_two;
+static LARGE_INTEGER *temp_intvl_ptr = &intvl_one;
+#else
+static struct timeval intvl_one;
+static struct timeval intvl_two;
+static struct timeval *intvl_one_ptr = &intvl_one;
+static struct timeval *intvl_two_ptr = &intvl_two;
+static struct timeval *temp_intvl_ptr = &intvl_one;
+#endif
+
+#define INTERVALS_INIT() \
+ if (interval_burst) { \
+ HIST_timestamp(intvl_one_ptr); \
+ } \
+ interval_count = interval_burst; \
+
+#define INTERVALS_WAIT() \
+ /* in this case, the interval count is the count-down couter \
+ to decide to sleep for a little bit */ \
+ if ((interval_burst) && (--interval_count == 0)) { \
+ /* call sigsuspend and wait for the interval timer to get us \
+ out */ \
+ if (debug > 1) { \
+ fprintf(where,"about to spin suspend\n"); \
+ fflush(where); \
+ } \
+ HIST_timestamp(intvl_two_ptr); \
+ while(delta_micro(intvl_one_ptr,intvl_two_ptr) < interval_usecs) { \
+ HIST_timestamp(intvl_two_ptr); \
+ } \
+ temp_intvl_ptr = intvl_one_ptr; \
+ intvl_one_ptr = intvl_two_ptr; \
+ intvl_two_ptr = temp_intvl_ptr; \
+ interval_count = interval_burst; \
+ }
+#endif
+#endif
+
+#ifdef WANT_DEMO
+#ifdef HAVE_GETHRTIME
+static hrtime_t demo_one;
+static hrtime_t demo_two;
+static hrtime_t *demo_one_ptr = &demo_one;
+static hrtime_t *demo_two_ptr = &demo_two;
+static hrtime_t *temp_demo_ptr = &demo_one;
+#elif defined(WIN32)
+static LARGE_INTEGER demo_one;
+static LARGE_INTEGER demo_two;
+static LARGE_INTEGER *demo_one_ptr = &demo_one;
+static LARGE_INTEGER *demo_two_ptr = &demo_two;
+static LARGE_INTEGER *temp_demo_ptr = &demo_one;
+#else
+static struct timeval demo_one;
+static struct timeval demo_two;
+static struct timeval *demo_one_ptr = &demo_one;
+static struct timeval *demo_two_ptr = &demo_two;
+static struct timeval *temp_demo_ptr = &demo_one;
+#endif
+
+/* for a _STREAM test, "a" should be lss_size and "b" should be
+ rsr_size. for a _MAERTS test, "a" should be lsr_size and "b" should
+ be rss_size. raj 2005-04-06 */
+#define DEMO_STREAM_SETUP(a,b) \
+ if ((demo_mode) && (demo_units == 0)) { \
+ /* take our default value of demo_units to be the larger of \
+ twice the remote's SO_RCVBUF or twice our SO_SNDBUF */ \
+ if (a > b) { \
+ demo_units = 2*a; \
+ } \
+ else { \
+ demo_units = 2*b; \
+ } \
+ }
+
+#define DEMO_STREAM_INTERVAL(units) \
+ if (demo_mode) { \
+ double actual_interval; \
+ units_this_tick += units; \
+ if (units_this_tick >= demo_units) { \
+ /* time to possibly update demo_units and maybe output an \
+ interim result */ \
+ HIST_timestamp(demo_two_ptr); \
+ actual_interval = delta_micro(demo_one_ptr,demo_two_ptr); \
+ /* we always want to fine-tune demo_units here whether we \
+ emit an interim result or not. if we are short, this \
+ will lengthen demo_units. if we are long, this will \
+ shorten it */ \
+ demo_units = demo_units * (demo_interval / actual_interval); \
+ if (actual_interval >= demo_interval) { \
+ /* time to emit an interim result */ \
+ fprintf(where, \
+ "Interim result: %7.2f %s/s over %.2f seconds\n", \
+ calc_thruput_interval(units_this_tick, \
+ actual_interval/1000000.0), \
+ format_units(), \
+ actual_interval/1000000.0); \
+ fflush(where); \
+ units_this_tick = 0.0; \
+ /* now get a new starting timestamp. we could be clever \
+ and swap pointers - the math we do probably does not \
+ take all that long, but for now this will suffice */ \
+ temp_demo_ptr = demo_one_ptr; \
+ demo_one_ptr = demo_two_ptr; \
+ demo_two_ptr = temp_demo_ptr; \
+ } \
+ } \
+ }
+
+#define DEMO_RR_SETUP(a) \
+ if ((demo_mode) && (demo_units == 0)) { \
+ /* take whatever we are given */ \
+ demo_units = a; \
+ }
+
+#define DEMO_RR_INTERVAL(units) \
+ if (demo_mode) { \
+ double actual_interval; \
+ units_this_tick += units; \
+ if (units_this_tick >= demo_units) { \
+ /* time to possibly update demo_units and maybe output an \
+ interim result */ \
+ HIST_timestamp(demo_two_ptr); \
+ actual_interval = delta_micro(demo_one_ptr,demo_two_ptr); \
+ /* we always want to fine-tune demo_units here whether we \
+ emit an interim result or not. if we are short, this \
+ will lengthen demo_units. if we are long, this will \
+ shorten it */ \
+ demo_units = demo_units * (demo_interval / actual_interval); \
+ if (actual_interval >= demo_interval) { \
+ /* time to emit an interim result */ \
+ fprintf(where, \
+ "Interim result: %.2f %s/s over %.2f seconds\n", \
+ units_this_tick / (actual_interval/1000000.0), \
+ "Trans", \
+ actual_interval/1000000.0); \
+ units_this_tick = 0.0; \
+ /* now get a new starting timestamp. we could be clever \
+ and swap pointers - the math we do probably does not \
+ take all that long, but for now this will suffice */ \
+ temp_demo_ptr = demo_one_ptr; \
+ demo_one_ptr = demo_two_ptr; \
+ demo_two_ptr = temp_demo_ptr; \
+ } \
+ } \
+ }
+#endif
+
+char sockets_usage[] = "\n\
+Usage: netperf [global options] -- [test options] \n\
+\n\
+TCP/UDP BSD Sockets Test Options:\n\
+ -b number Send number requests at start of _RR tests\n\
+ -C Set TCP_CORK when available\n\
+ -D [L][,R] Set TCP_NODELAY locally and/or remotely (TCP_*)\n\
+ -h Display this text\n\
+ -H name,fam Use name (or IP) and family as target of data connection\n\
+ -L name,fam Use name (or IP) and family as source of data connection\n\
+ -m bytes Set the send size (TCP_STREAM, UDP_STREAM)\n\
+ -M bytes Set the recv size (TCP_STREAM, UDP_STREAM)\n\
+ -n Use the connected socket for UDP locally\n\
+ -N Use the connected socket for UDP remotely\n\
+ -p min[,max] Set the min/max port numbers for TCP_CRR, TCP_TRR\n\
+ -P local[,remote] Set the local/remote port for the data socket\n\
+ -r req,[rsp] Set request/response sizes (TCP_RR, UDP_RR)\n\
+ -s send[,recv] Set local socket send/recv buffer sizes\n\
+ -S send[,recv] Set remote socket send/recv buffer sizes\n\
+ -4 Use AF_INET (eg IPv4) on both ends of the data conn\n\
+ -6 Use AF_INET6 (eg IPv6) on both ends of the data conn\n\
+\n\
+For those options taking two parms, at least one must be specified;\n\
+specifying one value without a comma will set both parms to that\n\
+value, specifying a value with a leading comma will set just the second\n\
+parm, a value with a trailing comma will set just the first. To set\n\
+each parm to unique values, specify both and separate them with a\n\
+comma.\n";
+
+
+
+/* these routines convert between the AF address space and the NF
+ address space since the numeric values of AF_mumble are not the
+ same across the platforms. raj 2005-02-08 */
+
+int
+nf_to_af(int nf) {
+ switch(nf) {
+ case NF_INET:
+ return AF_INET;
+ break;
+ case NF_UNSPEC:
+ return AF_UNSPEC;
+ break;
+ case NF_INET6:
+#if defined(AF_INET6)
+ return AF_INET6;
+#else
+ return AF_UNSPEC;
+#endif
+ break;
+ default:
+ return AF_UNSPEC;
+ break;
+ }
+}
+
+int
+af_to_nf(int af) {
+
+ switch(af) {
+ case AF_INET:
+ return NF_INET;
+ break;
+ case AF_UNSPEC:
+ return NF_UNSPEC;
+ break;
+#if defined(AF_INET6)
+ case AF_INET6:
+ return NF_INET6;
+ break;
+#endif
+ default:
+ return NF_UNSPEC;
+ break;
+ }
+}
+
+
+ /* This routine is intended to retrieve interesting aspects of tcp */
+ /* for the data connection. at first, it attempts to retrieve the */
+ /* maximum segment size. later, it might be modified to retrieve */
+ /* other information, but it must be information that can be */
+ /* retrieved quickly as it is called during the timing of the test. */
+ /* for that reason, a second routine may be created that can be */
+ /* called outside of the timing loop */
+static
+void
+get_tcp_info(SOCKET socket, int *mss)
+{
+
+#ifdef TCP_MAXSEG
+ netperf_socklen_t sock_opt_len;
+
+ sock_opt_len = sizeof(netperf_socklen_t);
+ if (getsockopt(socket,
+ getprotobyname("tcp")->p_proto,
+ TCP_MAXSEG,
+ (char *)mss,
+ &sock_opt_len) == SOCKET_ERROR) {
+ fprintf(where,
+ "netperf: get_tcp_info: getsockopt TCP_MAXSEG: errno %d\n",
+ errno);
+ fflush(where);
+ *mss = -1;
+ }
+#else
+ *mss = -1;
+#endif /* TCP_MAXSEG */
+}
+
+
+/* return a pointer to a completed addrinfo chain - prefer
+ data_address to controlhost and utilize the specified address
+ family */
+
+struct addrinfo *
+complete_addrinfo(char *controlhost, char *data_address, char *port, int family, int type, int protocol, int flags)
+{
+ struct addrinfo hints;
+ struct addrinfo *res;
+ struct addrinfo *temp_res;
+
+#define CHANGED_SOCK_TYPE 0x1
+#define CHANGED_PROTOCOL 0x2
+#define CHANGED_SCTP 0x4
+ int change_info = 0;
+ static int change_warning_displayed = 0;
+
+ int count = 0;
+ int error = 0;
+
+ char *hostname;
+
+ /* take data-address over controlhost */
+ if (data_address)
+ hostname = data_address;
+ else
+ hostname = controlhost;
+
+ if (debug) {
+ fprintf(where,
+ "complete_addrinfo using hostname %s port %s family %s type %s prot %s flags 0x%x\n",
+ hostname,
+ port,
+ inet_ftos(family),
+ inet_ttos(type),
+ inet_ptos(protocol),
+ flags);
+ fflush(where);
+ }
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = family;
+ hints.ai_socktype = type;
+ hints.ai_protocol = protocol;
+ hints.ai_flags = flags|AI_CANONNAME;
+
+ count = 0;
+ do {
+ error = getaddrinfo((char *)hostname,
+ (char *)port,
+ &hints,
+ &res);
+ count += 1;
+ if (error == EAI_AGAIN) {
+ if (debug) {
+ fprintf(where,"Sleeping on getaddrinfo EAI_AGAIN\n");
+ fflush(where);
+ }
+ sleep(1);
+ }
+ /* while you see this kludge first, it is actually the second, the
+ first being the one for Solaris below. The need for this kludge
+ came after implementing the Solaris broken getaddrinfo kludge -
+ now we see a kludge in Linux getaddrinfo where if it is given
+ SOCK_STREAM and IPPROTO_SCTP it barfs with a -7
+ EAI_SOCKTYPE. so, we check if the error was EAI_SOCKTYPE and if
+ we were asking for IPPROTO_SCTP and if so, kludge, again... raj
+ 2008-10-13 */
+#ifdef WANT_SCTP
+ if (EAI_SOCKTYPE == error
+#ifdef EAI_BADHINTS
+ || EAI_BADHINTS == error
+#endif
+ ) {
+ /* we ass-u-me this is the Linux getaddrinfo bug, clear the
+ hints.ai_protocol field, and set some state "remembering"
+ that we did this so the code for the Solaris kludge can do
+ the fix-up for us. also flip error over to EAI_AGAIN and
+ make sure we don't "count" this time around the loop. */
+ hints.ai_protocol = 0;
+ error = EAI_AGAIN;
+ count -= 1;
+ change_info |= CHANGED_SCTP;
+ }
+#endif
+ } while ((error == EAI_AGAIN) && (count <= 5));
+
+ if (error) {
+ fprintf(where,
+ "complete_addrinfo: could not resolve '%s' port '%s' af %d",
+ hostname,
+ port,
+ family);
+ fprintf(where,
+ "\n\tgetaddrinfo returned %d %s\n",
+ error,
+ gai_strerror(error));
+ fflush(where);
+ exit(-1);
+ }
+
+ /* there exists at least one platform - Solaris 10 - that does not
+ seem to completely honor the ai_protocol and/or ai_socktype one
+ sets in the hints parm to the getaddrinfo call. so, we need to
+ walk the list of entries returned and if either of those do not
+ match what we asked for, we need to go ahead and set them
+ "correctly" this is based in part on some earlier SCTP-only code
+ from previous revisions. raj 2006-10-09 */
+
+ temp_res = res;
+
+ while (temp_res) {
+
+ if ((type) &&
+ (temp_res->ai_socktype != type)) {
+ change_info |= CHANGED_SOCK_TYPE;
+ if (debug) {
+ fprintf(where,
+ "WARNING! Changed bogus getaddrinfo socket type %d to %d\n",
+ temp_res->ai_socktype,
+ type);
+ fflush(where);
+ }
+ temp_res->ai_socktype = type;
+ }
+
+ if ((protocol) &&
+ (temp_res->ai_protocol != protocol)) {
+ change_info |= CHANGED_PROTOCOL;
+ if (debug) {
+ fprintf(where,
+ "WARNING! Changed bogus getaddrinfo protocol %d to %d\n",
+ temp_res->ai_protocol,
+ protocol);
+ fflush(where);
+ }
+ temp_res->ai_protocol = protocol;
+ }
+ temp_res = temp_res->ai_next;
+ }
+
+ if ((change_info & CHANGED_SOCK_TYPE) &&
+ !(change_warning_displayed & CHANGED_SOCK_TYPE)) {
+ change_warning_displayed |= CHANGED_SOCK_TYPE;
+ fprintf(where,
+ "WARNING! getaddrinfo returned a socket type which did not\n");
+ fprintf(where,
+ "match the requested type. Please contact your vendor for\n");
+ fprintf(where,
+ "a fix to this bug in getaddrinfo()\n");
+ fflush(where);
+ }
+
+ /* if we dropped the protocol hint, it would be for a protocol that
+ getaddrinfo() wasn't supporting yet, not for the bug that it took
+ our hint and still returned zero. raj 2006-10-16 */
+ if ((change_info & CHANGED_PROTOCOL) &&
+ !(change_warning_displayed & CHANGED_PROTOCOL) &&
+ (hints.ai_protocol != 0)) {
+ change_warning_displayed |= CHANGED_PROTOCOL;
+ fprintf(where,
+ "WARNING! getaddrinfo returned a protocol other than the\n");
+ fprintf(where,
+ "requested protocol. Please contact your vendor for\n");
+ fprintf(where,
+ "a fix to this bug in getaddrinfo()\n");
+ fflush(where);
+ }
+
+ if ((change_info & CHANGED_SCTP) &&
+ !(change_warning_displayed & CHANGED_SCTP)) {
+ change_warning_displayed |= CHANGED_SCTP;
+ fprintf(where,
+ "WARNING! getaddrinfo on this platform does not accept IPPROTO_SCTP!\n");
+ fprintf(where,
+ "Please contact your vendor for a fix to this bug in getaddrinfo().\n");
+ fflush(where);
+ }
+
+
+ if (debug) {
+ dump_addrinfo(where, res, hostname, port, family);
+ }
+
+ return(res);
+}
+
+void
+complete_addrinfos(struct addrinfo **remote,struct addrinfo **local, char remote_host[], int type, int protocol, int flags) {
+
+ *remote = complete_addrinfo(remote_host,
+ remote_data_address,
+ remote_data_port,
+ remote_data_family,
+ type,
+ protocol,
+ flags);
+
+ /* OK, if the user has not specified a local data endpoint address
+ (test-specific -L), pick the local data endpoint address based on
+ the remote data family info (test-specific -H or -4 or -6
+ option). if the user has not specified remote data addressing
+ info (test-specific -H, -4 -6) pick something based on the local
+ control connection address (ie the global -L option). */
+
+ if (NULL == local_data_address) {
+ local_data_address = malloc(HOSTNAMESIZE);
+ if (NULL == remote_data_address) {
+ if (debug) {
+ fprintf(where,
+ "local_data_address not set, using local_host_name of '%s'\n",
+ local_host_name);
+ fflush(where);
+ }
+ strcpy(local_data_address,local_host_name);
+ }
+ else {
+ if (debug) {
+ fprintf(where,
+ "local_data_address not set, using address family info\n");
+ fflush(where);
+ }
+ /* by default, use 0.0.0.0 - assume IPv4 */
+ strcpy(local_data_address,"0.0.0.0");
+#if defined(AF_INET6)
+ if ((AF_INET6 == local_data_family) ||
+ ((AF_UNSPEC == local_data_family) &&
+ (AF_INET6 == remote_data_family)) ||
+ ((AF_UNSPEC == local_data_family) &&
+ (AF_INET6 == (*remote)->ai_family))) {
+ strcpy(local_data_address,"::0");
+ }
+#endif
+ }
+ }
+
+ *local = complete_addrinfo("what to put here?",
+ local_data_address,
+ local_data_port,
+ local_data_family,
+ type,
+ protocol,
+ flags|AI_PASSIVE);
+
+}
+
+void
+set_hostname_and_port(char *hostname, char *portstr, int family, int port)
+{
+ strcpy(hostname,"0.0.0.0");
+#if defined AF_INET6
+ if (AF_INET6 == family) {
+ strcpy(hostname,"::0");
+ }
+#endif
+
+ sprintf(portstr, "%u", port);
+
+}
+
+static unsigned short
+get_port_number(struct addrinfo *res)
+{
+ switch(res->ai_family) {
+ case AF_INET: {
+ struct sockaddr_in *foo = (struct sockaddr_in *)res->ai_addr;
+ return(ntohs(foo->sin_port));
+ break;
+ }
+#if defined(AF_INET6)
+ case AF_INET6: {
+ struct sockaddr_in6 *foo = (struct sockaddr_in6 *)res->ai_addr;
+ return(ntohs(foo->sin6_port));
+ break;
+ }
+#endif
+ default:
+ fprintf(where,
+ "Unexpected Address Family of %u\n",res->ai_family);
+ fflush(where);
+ exit(-1);
+ }
+}
+
+/* this routine will set the port number of the sockaddr in the
+ addrinfo to the specified value, based on the address family */
+void
+set_port_number(struct addrinfo *res, unsigned short port)
+{
+ switch(res->ai_family) {
+ case AF_INET: {
+ struct sockaddr_in *foo = (struct sockaddr_in *)res->ai_addr;
+ foo->sin_port = htons(port);
+ break;
+ }
+#if defined(AF_INET6)
+ case AF_INET6: {
+ struct sockaddr_in6 *foo = (struct sockaddr_in6 *)res->ai_addr;
+ foo->sin6_port = htons(port);
+ break;
+ }
+#endif
+ default:
+ fprintf(where,
+ "Unexpected Address Family of %u\n",res->ai_family);
+ fflush(where);
+ exit(-1);
+ }
+}
+
+
+
+ /* This routine will create a data (listen) socket with the
+ apropriate options set and return it to the caller. this replaces
+ all the duplicate code in each of the test routines and should help
+ make things a little easier to understand. since this routine can be
+ called by either the netperf or netserver programs, all output
+ should be directed towards "where." family is generally AF_INET and
+ type will be either SOCK_STREAM or SOCK_DGRAM. This routine will
+ also be used by the "SCTP" tests, hence the slightly strange-looking
+ SCTP stuff in the classic bsd sockets test file... vlad/raj
+ 2005-03-15 */
+
+SOCKET
+create_data_socket(struct addrinfo *res)
+{
+
+ SOCKET temp_socket;
+ int one;
+ int on = 1;
+
+
+ /*set up the data socket */
+ temp_socket = socket(res->ai_family,
+ res->ai_socktype,
+ res->ai_protocol);
+
+ if (temp_socket == INVALID_SOCKET){
+ fprintf(where,
+ "netperf: create_data_socket: socket: errno %d fam %s type %s prot %s errmsg %s\n",
+ errno,
+ inet_ftos(res->ai_family),
+ inet_ttos(res->ai_socktype),
+ inet_ptos(res->ai_protocol),
+ strerror(errno));
+ fflush(where);
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"create_data_socket: socket %d obtained...\n",temp_socket);
+ fflush(where);
+ }
+
+ /* Modify the local socket size. The reason we alter the send buffer
+ size here rather than when the connection is made is to take care
+ of decreases in buffer size. Decreasing the window size after
+ connection establishment is a TCP no-no. Also, by setting the
+ buffer (window) size before the connection is established, we can
+ control the TCP MSS (segment size). The MSS is never (well, should
+ never be) more that 1/2 the minimum receive buffer size at each
+ half of the connection. This is why we are altering the receive
+ buffer size on the sending size of a unidirectional transfer. If
+ the user has not requested that the socket buffers be altered, we
+ will try to find-out what their values are. If we cannot touch the
+ socket buffer in any way, we will set the values to -1 to indicate
+ that. */
+
+ /* all the oogy nitty gritty stuff moved from here into the routine
+ being called below, per patches from davidm to workaround the bug
+ in Linux getsockopt(). raj 2004-06-15 */
+ set_sock_buffer (temp_socket, SEND_BUFFER, lss_size_req, &lss_size);
+ set_sock_buffer (temp_socket, RECV_BUFFER, lsr_size_req, &lsr_size);
+
+ /* now, we may wish to enable the copy avoidance features on the */
+ /* local system. of course, this may not be possible... */
+
+#ifdef SO_RCV_COPYAVOID
+ if (loc_rcvavoid) {
+ if (setsockopt(temp_socket,
+ SOL_SOCKET,
+ SO_RCV_COPYAVOID,
+ (const char *)&loc_rcvavoid,
+ sizeof(int)) == SOCKET_ERROR) {
+ fprintf(where,
+ "netperf: create_data_socket: Could not enable receive copy avoidance");
+ fflush(where);
+ loc_rcvavoid = 0;
+ }
+ }
+#else
+ /* it wasn't compiled in... */
+ loc_rcvavoid = 0;
+#endif /* SO_RCV_COPYAVOID */
+
+#ifdef SO_SND_COPYAVOID
+ if (loc_sndavoid) {
+ if (setsockopt(temp_socket,
+ SOL_SOCKET,
+ SO_SND_COPYAVOID,
+ (const char *)&loc_sndavoid,
+ sizeof(int)) == SOCKET_ERROR) {
+ fprintf(where,
+ "netperf: create_data_socket: Could not enable send copy avoidance");
+ fflush(where);
+ loc_sndavoid = 0;
+ }
+ }
+#else
+ /* it was not compiled in... */
+ loc_sndavoid = 0;
+#endif
+
+ /* Now, we will see about setting the TCP_NODELAY flag on the local */
+ /* socket. We will only do this for those systems that actually */
+ /* support the option. If it fails, note the fact, but keep going. */
+ /* If the user tries to enable TCP_NODELAY on a UDP socket, this */
+ /* will cause an error to be displayed */
+
+ /* well..... long ago and far away that would have happened, in
+ particular because we would always use IPPROTO_TCP here.
+ however, now we are using res->ai_protocol, which will be
+ IPPROT_UDP, and while HP-UX, and I suspect no-one else on the
+ planet has a UDP_mumble option that overlaps with TCP_NODELAY,
+ sure as knuth made little green programs, linux has a UDP_CORK
+ option that is defined as a value of 1, which is the same a
+ TCP_NODELAY under Linux. So, when asking for -D and
+ "TCP_NODELAY" under Linux, we are actually setting UDP_CORK
+ instead of getting an error like every other OS on the
+ planet. joy and rupture. this stops a UDP_RR test cold sooo we
+ have to make sure that res->ai_protocol actually makes sense for
+ a _NODELAY setsockopt() or a UDP_RR test on Linux where someone
+ mistakenly sets -D will hang. raj 2005-04-21 */
+
+#if defined(TCP_NODELAY) || defined(SCTP_NODELAY)
+ if ((loc_nodelay) && (res->ai_protocol != IPPROTO_UDP)) {
+
+ /* strictly speaking, since the if defined above is an OR, we
+ should probably check against TCP_NODELAY being defined here.
+ however, the likelihood of SCTP_NODELAY being defined and
+ TCP_NODELAY _NOT_ being defined is, probably :), epsilon. raj
+ 2005-03-15 */
+
+ int option = TCP_NODELAY;
+
+ /* I suspect that WANT_SCTP would suffice here since that is the
+ only time we would have called getaddrinfo with a hints asking
+ for SCTP, but just in case there is an SCTP implementation out
+ there _without_ SCTP_NODELAY... raj 2005-03-15 */
+
+#if defined(WANT_SCTP) && defined(SCTP_NODELAY)
+ if (IPPROTO_SCTP == res->ai_protocol) {
+ option = SCTP_NODELAY;
+ }
+#endif
+
+ one = 1;
+ if(setsockopt(temp_socket,
+ res->ai_protocol,
+ option,
+ (char *)&one,
+ sizeof(one)) == SOCKET_ERROR) {
+ fprintf(where,
+ "netperf: create_data_socket: nodelay: errno %d\n",
+ errno);
+ fflush(where);
+ }
+
+ if (debug > 1) {
+ fprintf(where,
+ "netperf: create_data_socket: [TCP|SCTP]_NODELAY requested...\n");
+ fflush(where);
+ }
+ }
+#else /* TCP_NODELAY */
+
+ loc_nodelay = 0;
+
+#endif /* TCP_NODELAY */
+
+#if defined(TCP_CORK)
+
+ if (loc_tcpcork != 0) {
+ /* the user wishes for us to set TCP_CORK on the socket */
+ int one = 1;
+ if (setsockopt(temp_socket,
+ getprotobyname("tcp")->p_proto,
+ TCP_CORK,
+ (char *)&one,
+ sizeof(one)) == SOCKET_ERROR) {
+ perror("netperf: sendfile_tcp_stream: tcp_cork");
+ exit(1);
+ }
+ if (debug) {
+ fprintf(where,"sendfile_tcp_stream: tcp_cork...\n");
+ }
+ }
+
+#endif /* TCP_CORK */
+
+ /* since some of the UDP tests do not do anything to cause an
+ implicit bind() call, we need to be rather explicit about our
+ bind() call here. even if the address and/or the port are zero
+ (INADDR_ANY etc). raj 2004-07-20 */
+
+ if (setsockopt(temp_socket,
+ SOL_SOCKET,
+ SO_REUSEADDR,
+ (const char *)&on,
+ sizeof(on)) < 0) {
+ fprintf(where,
+ "netperf: create_data_socket: SO_REUSEADDR failed %d\n",
+ errno);
+ fflush(where);
+ }
+
+ if (bind(temp_socket,
+ res->ai_addr,
+ res->ai_addrlen) < 0) {
+ if (debug) {
+ fprintf(where,
+ "netperf: create_data_socket: data socket bind failed errno %d\n",
+ errno);
+ fprintf(where," port: %d\n",get_port_number(res));
+ fflush(where);
+ }
+ }
+
+
+ return(temp_socket);
+
+}
+
+#ifdef KLUDGE_SOCKET_OPTIONS
+
+
+ /* This routine is for those BROKEN systems which do not correctly */
+ /* pass socket attributes through calls such as accept(). It should */
+ /* only be called for those broken systems. I *really* don't want to */
+ /* have this, but even broken systems must be measured. raj 11/95 */
+void
+kludge_socket_options(int temp_socket)
+{
+
+ set_sock_buffer(temp_socket, SEND_BUFFER, lss_size_req, &lss_size);
+ set_sock_buffer(temp_socket, RECV_BUFFER, lsr_size_req, &lsr_size);
+
+ /* now, we may wish to enable the copy avoidance features on the */
+ /* local system. of course, this may not be possible... */
+ /* those calls were only valid for HP-UX, and I know that HP-UX is */
+ /* written correctly, and so we do not need to include those calls */
+ /* in this kludgy routine. raj 11/95 */
+
+
+ /* Now, we will see about setting the TCP_NODELAY flag on the local */
+ /* socket. We will only do this for those systems that actually */
+ /* support the option. If it fails, note the fact, but keep going. */
+ /* If the user tries to enable TCP_NODELAY on a UDP socket, this */
+ /* will cause an error to be displayed */
+
+#ifdef TCP_NODELAY
+ if (loc_nodelay) {
+ one = 1;
+ if(setsockopt(temp_socket,
+ getprotobyname("tcp")->p_proto,
+ TCP_NODELAY,
+ (char *)&one,
+ sizeof(one)) == SOCKET_ERROR) {
+ fprintf(where,"netperf: kludge_socket_options: nodelay: errno %d\n",
+ errno);
+ fflush(where);
+ }
+
+ if (debug > 1) {
+ fprintf(where,
+ "netperf: kludge_socket_options: TCP_NODELAY requested...\n");
+ fflush(where);
+ }
+ }
+#else /* TCP_NODELAY */
+
+ loc_nodelay = 0;
+
+#endif /* TCP_NODELAY */
+
+ }
+
+#endif /* KLUDGE_SOCKET_OPTIONS */
+
+
+static void *
+get_address_address(struct addrinfo *info)
+{
+ struct sockaddr_in *sin;
+#if defined(AF_INET6)
+ struct sockaddr_in6 *sin6;
+#endif
+
+ switch(info->ai_family) {
+ case AF_INET:
+ sin = (struct sockaddr_in *)info->ai_addr;
+ return(&(sin->sin_addr));
+ break;
+#if defined(AF_INET6)
+ case AF_INET6:
+ sin6 = (struct sockaddr_in6 *)info->ai_addr;
+ return(&(sin6->sin6_addr));
+ break;
+#endif
+ default:
+ fprintf(stderr,"we never expected to get here in get_address_address\n");
+ fflush(stderr);
+ exit(-1);
+ }
+}
+
+#if defined(WIN32)
+/* +*+ Why isn't this in the winsock headers yet? */
+const char *
+inet_ntop(int af, const void *src, char *dst, size_t size);
+#endif
+
+/* This routine is a generic test header printer for the topmost header */
+void
+print_top_test_header(char test_name[], struct addrinfo *source, struct addrinfo *destination)
+{
+
+#if defined(AF_INET6)
+ char address_buf[INET6_ADDRSTRLEN];
+#else
+ char address_buf[16]; /* magic constant */
+#endif
+
+ /* we want to have some additional, interesting information in */
+ /* the headers. we know some of it here, but not all, so we will */
+ /* only print the test title here and will print the results */
+ /* titles after the test is finished */
+ fprintf(where,test_name);
+ address_buf[0] = '\0';
+ inet_ntop(source->ai_family,get_address_address(source),address_buf,sizeof(address_buf));
+ fprintf(where,
+ " from %s (%s) port %u %s",
+ source->ai_canonname,
+ address_buf,
+ get_port_number(source),
+ inet_ftos(source->ai_family));
+ address_buf[0] = '\0';
+ inet_ntop(destination->ai_family,get_address_address(destination),address_buf,sizeof(address_buf));
+ fprintf(where,
+ " to %s (%s) port %u %s",
+ destination->ai_canonname,
+ address_buf,
+ get_port_number(destination),
+ inet_ftos(destination->ai_family));
+
+ if (iteration_max > 1) {
+ fprintf(where,
+ " : +/-%3.1f%% @ %2d%% conf. %s",
+ interval/0.02,
+ confidence_level,
+ result_confidence_only ? " on result only" : "");
+ }
+ if ((loc_nodelay > 0) || (rem_nodelay > 0)) {
+ fprintf(where," : nodelay");
+ }
+ if ((loc_sndavoid > 0) ||
+ (loc_rcvavoid > 0) ||
+ (rem_sndavoid > 0) ||
+ (rem_rcvavoid > 0)) {
+ fprintf(where," : copy avoidance");
+ }
+
+ if (no_control) {
+ fprintf(where," : no control");
+ }
+
+#ifdef WANT_HISTOGRAM
+ fprintf(where," : histogram");
+#endif /* WANT_HISTOGRAM */
+
+#ifdef WANT_INTERVALS
+#ifndef WANT_SPIN
+ fprintf(where," : interval");
+#else
+ fprintf(where," : spin interval");
+#endif
+#endif /* WANT_INTERVALS */
+
+#ifdef DIRTY
+ fprintf(where," : dirty data");
+#endif /* DIRTY */
+#ifdef WANT_DEMO
+ fprintf(where," : demo");
+#endif
+#ifdef WANT_FIRST_BURST
+ /* a little hokey perhaps, but we really only want this to be
+ emitted for tests where it actually is used, which means a
+ "REQUEST/RESPONSE" test. raj 2005-11-10 */
+ if (strstr(test_name,"REQUEST/RESPONSE")) {
+ fprintf(where," : first burst %d",first_burst_size);
+ }
+#endif
+ if (cpu_binding_requested) {
+ fprintf(where," : cpu bind");
+ }
+ fprintf(where,"\n");
+
+}
+
+
+/* This routine implements the TCP unidirectional data transfer test */
+/* (a.k.a. stream) for the sockets interface. It receives its */
+/* parameters via global variables from the shell and writes its */
+/* output to the standard output. */
+
+
+void
+send_tcp_stream(char remote_host[])
+{
+
+ char *tput_title = "\
+Recv Send Send \n\
+Socket Socket Message Elapsed \n\
+Size Size Size Time Throughput \n\
+bytes bytes bytes secs. %s/sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f %s\n";
+
+ char *tput_fmt_1 =
+ "%6d %6d %6d %-6.2f %7.2f %s\n";
+
+ char *cpu_title = "\
+Recv Send Send Utilization Service Demand\n\
+Socket Socket Message Elapsed Send Recv Send Recv\n\
+Size Size Size Time Throughput local remote local remote\n\
+bytes bytes bytes secs. %-8.8s/s %% %c %% %c us/KB us/KB\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f %c %s\n";
+
+ char *cpu_fmt_1 =
+ "%6d %6d %6d %-6.2f %7.2f %-6.2f %-6.2f %-6.3f %-6.3f %s\n";
+
+ char *ksink_fmt = "\n\
+Alignment Offset %-8.8s %-8.8s Sends %-8.8s Recvs\n\
+Local Remote Local Remote Xfered Per Per\n\
+Send Recv Send Recv Send (avg) Recv (avg)\n\
+%5d %5d %5d %5d %6.4g %6.2f %6d %6.2f %6d\n";
+
+ char *ksink_fmt2 = "\n\
+Maximum\n\
+Segment\n\
+Size (bytes)\n\
+%6d\n";
+
+
+ float elapsed_time;
+
+ /* what we want is to have a buffer space that is at least one */
+ /* send-size greater than our send window. this will insure that we */
+ /* are never trying to re-use a buffer that may still be in the hands */
+ /* of the transport. This buffer will be malloc'd after we have found */
+ /* the size of the local senc socket buffer. We will want to deal */
+ /* with alignment and offset concerns as well. */
+
+ struct ring_elt *send_ring;
+
+ int len;
+ unsigned int nummessages = 0;
+ SOCKET send_socket;
+ int bytes_remaining;
+ int tcp_mss = -1; /* possibly uninitialized on printf far below */
+
+ /* with links like fddi, one can send > 32 bits worth of bytes */
+ /* during a test... ;-) at some point, this should probably become a */
+ /* 64bit integral type, but those are not entirely common yet */
+
+ unsigned long long local_bytes_sent = 0;
+ double bytes_sent = 0.0;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+
+ double thruput;
+
+ struct addrinfo *remote_res;
+ struct addrinfo *local_res;
+
+ struct tcp_stream_request_struct *tcp_stream_request;
+ struct tcp_stream_response_struct *tcp_stream_response;
+ struct tcp_stream_results_struct *tcp_stream_result;
+
+ tcp_stream_request =
+ (struct tcp_stream_request_struct *)netperf_request.content.test_specific_data;
+ tcp_stream_response =
+ (struct tcp_stream_response_struct *)netperf_response.content.test_specific_data;
+ tcp_stream_result =
+ (struct tcp_stream_results_struct *)netperf_response.content.test_specific_data;
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ time_hist = HIST_new();
+ }
+#endif /* WANT_HISTOGRAM */
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ /* complete_addrinfos will either succede or exit the process */
+ complete_addrinfos(&remote_res,
+ &local_res,
+ remote_host,
+ SOCK_STREAM,
+ IPPROTO_TCP,
+ 0);
+
+ if ( print_headers ) {
+ print_top_test_header("TCP STREAM TEST",local_res,remote_res);
+ }
+
+ send_ring = NULL;
+ confidence_iteration = 1;
+ init_stat();
+
+ /* we have a great-big while loop which controls the number of times */
+ /* we run a particular test. this is for the calculation of a */
+ /* confidence interval (I really should have stayed awake during */
+ /* probstats :). If the user did not request confidence measurement */
+ /* (no confidence is the default) then we will only go though the */
+ /* loop once. the confidence stuff originates from the folks at IBM */
+
+ while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
+ (confidence_iteration <= iteration_min)) {
+
+ /* initialize a few counters. we have to remember that we might be */
+ /* going through the loop more than once. */
+
+ nummessages = 0;
+ bytes_sent = 0.0;
+ times_up = 0;
+
+ /*set up the data socket */
+ send_socket = create_data_socket(local_res);
+
+ if (send_socket == INVALID_SOCKET){
+ perror("netperf: send_tcp_stream: tcp stream data socket");
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"send_tcp_stream: send_socket obtained...\n");
+ }
+
+ /* at this point, we have either retrieved the socket buffer sizes, */
+ /* or have tried to set them, so now, we may want to set the send */
+ /* size based on that (because the user either did not use a -m */
+ /* option, or used one with an argument of 0). If the socket buffer */
+ /* size is not available, we will set the send size to 4KB - no */
+ /* particular reason, just arbitrary... */
+ if (send_size == 0) {
+ if (lss_size > 0) {
+ send_size = lss_size;
+ }
+ else {
+ send_size = 4096;
+ }
+ }
+
+ /* set-up the data buffer ring with the requested alignment and offset. */
+ /* note also that we have allocated a quantity */
+ /* of memory that is at least one send-size greater than our socket */
+ /* buffer size. We want to be sure that there are at least two */
+ /* buffers allocated - this can be a bit of a problem when the */
+ /* send_size is bigger than the socket size, so we must check... the */
+ /* user may have wanted to explicitly set the "width" of our send */
+ /* buffers, we should respect that wish... */
+ if (send_width == 0) {
+ send_width = (lss_size/send_size) + 1;
+ if (send_width == 1) send_width++;
+ }
+
+ if (send_ring == NULL) {
+ /* only allocate the send ring once. this is a networking test, */
+ /* not a memory allocation test. this way, we do not need a */
+ /* deallocate_buffer_ring() routine, and I don't feel like */
+ /* writing one anyway :) raj 11/94 */
+ send_ring = allocate_buffer_ring(send_width,
+ send_size,
+ local_send_align,
+ local_send_offset);
+ }
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back. */
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ if (!no_control) {
+ /* Tell the remote end to do a listen. The server alters the
+ socket paramters on the other side at this point, hence the
+ reason for all the values being passed in the setup
+ message. If the user did not specify any of the parameters,
+ they will be passed as 0, which will indicate to the remote
+ that no changes beyond the system's default should be
+ used. Alignment is the exception, it will default to 1, which
+ will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_TCP_STREAM;
+ tcp_stream_request->send_buf_size = rss_size_req;
+ tcp_stream_request->recv_buf_size = rsr_size_req;
+ tcp_stream_request->receive_size = recv_size;
+ tcp_stream_request->no_delay = rem_nodelay;
+ tcp_stream_request->recv_alignment = remote_recv_align;
+ tcp_stream_request->recv_offset = remote_recv_offset;
+ tcp_stream_request->measure_cpu = remote_cpu_usage;
+ tcp_stream_request->cpu_rate = remote_cpu_rate;
+ if (test_time) {
+ tcp_stream_request->test_length = test_time;
+ }
+ else {
+ tcp_stream_request->test_length = test_bytes;
+ }
+ tcp_stream_request->so_rcvavoid = rem_rcvavoid;
+ tcp_stream_request->so_sndavoid = rem_sndavoid;
+#ifdef DIRTY
+ tcp_stream_request->dirty_count = rem_dirty_count;
+ tcp_stream_request->clean_count = rem_clean_count;
+#endif /* DIRTY */
+ tcp_stream_request->port = atoi(remote_data_port);
+ tcp_stream_request->ipfamily = af_to_nf(remote_res->ai_family);
+ if (debug > 1) {
+ fprintf(where,
+ "netperf: send_tcp_stream: requesting TCP stream test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant
+ socket parameters for this test type. We will put them back
+ into the variables here so they can be displayed if desired.
+ The remote will have calibrated CPU if necessary, and will
+ have done all the needed set-up we will have calibrated the
+ cpu locally before sending the request, and will grab the
+ counter value right after the connect returns. The remote
+ will grab the counter right after the accept call. This saves
+ the hassle of extra messages being sent for the TCP
+ tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote listen done.\n");
+ rsr_size = tcp_stream_response->recv_buf_size;
+ rss_size = tcp_stream_response->send_buf_size;
+ rem_nodelay = tcp_stream_response->no_delay;
+ remote_cpu_usage= tcp_stream_response->measure_cpu;
+ remote_cpu_rate = tcp_stream_response->cpu_rate;
+
+ /* we have to make sure that the server port number is in
+ network order */
+ set_port_number(remote_res,
+ (short)tcp_stream_response->data_port_number);
+
+ rem_rcvavoid = tcp_stream_response->so_rcvavoid;
+ rem_sndavoid = tcp_stream_response->so_sndavoid;
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+ }
+
+#ifdef WANT_DEMO
+ DEMO_STREAM_SETUP(lss_size,rsr_size)
+#endif
+
+ /*Connect up to the remote port on the data socket */
+ if (connect(send_socket,
+ remote_res->ai_addr,
+ remote_res->ai_addrlen) == INVALID_SOCKET){
+ perror("netperf: send_tcp_stream: data socket connect failed");
+ exit(1);
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either */
+ /* the connect would have failed, or the previous response would */
+ /* have indicated a problem. I failed to see the value of the */
+ /* extra message after the accept on the remote. If it failed, */
+ /* we'll see it here. If it didn't, we might as well start pumping */
+ /* data. */
+
+ /* Set-up the test end conditions. For a stream test, they can be */
+ /* either time or byte-count based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ bytes_remaining = 0;
+ /* in previous revisions, we had the same code repeated throught */
+ /* all the test suites. this was unnecessary, and meant more */
+ /* work for me when I wanted to switch to POSIX signals, so I */
+ /* have abstracted this out into a routine in netlib.c. if you */
+ /* are experiencing signal problems, you might want to look */
+ /* there. raj 11/94 */
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ bytes_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+ /* we only start the interval timer if we are using the
+ timer-timed intervals rather than the sit and spin ones. raj
+ 2006-02-06 */
+#if defined(WANT_INTERVALS)
+ INTERVALS_INIT();
+#endif /* WANT_INTERVALS */
+
+ /* before we start, initialize a few variables */
+
+#ifdef WANT_DEMO
+ if (demo_mode) {
+ HIST_timestamp(demo_one_ptr);
+ }
+#endif
+
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return false. */
+ /* When the test is controlled by byte count, the time test will */
+ /* always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. */
+
+ while ((!times_up) || (bytes_remaining > 0)) {
+
+#ifdef DIRTY
+ access_buffer(send_ring->buffer_ptr,
+ send_size,
+ loc_dirty_count,
+ loc_clean_count);
+#endif /* DIRTY */
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ /* timestamp just before we go into send and then again just
+ after we come out raj 8/94 */
+ /* but lets only do this if there is going to be a histogram
+ displayed */
+ HIST_timestamp(&time_one);
+ }
+#endif /* WANT_HISTOGRAM */
+
+ if((len=send(send_socket,
+ send_ring->buffer_ptr,
+ send_size,
+ 0)) != send_size) {
+ if ((len >=0) || SOCKET_EINTR(len)) {
+ /* the test was interrupted, must be the end of test */
+ break;
+ }
+ perror("netperf: data send error");
+ printf("len was %d\n",len);
+ exit(1);
+ }
+
+ local_bytes_sent += send_size;
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ /* timestamp the exit from the send call and update the histogram */
+ HIST_timestamp(&time_two);
+ HIST_add(time_hist,delta_micro(&time_one,&time_two));
+ }
+#endif /* WANT_HISTOGRAM */
+
+#ifdef WANT_DEMO
+ DEMO_STREAM_INTERVAL(send_size)
+#endif
+
+#if defined(WANT_INTERVALS)
+ INTERVALS_WAIT();
+#endif /* WANT_INTERVALS */
+
+ /* now we want to move our pointer to the next position in the */
+ /* data buffer...we may also want to wrap back to the "beginning" */
+ /* of the bufferspace, so we will mod the number of messages sent */
+ /* by the send width, and use that to calculate the offset to add */
+ /* to the base pointer. */
+ nummessages++;
+ send_ring = send_ring->next;
+ if (bytes_remaining) {
+ bytes_remaining -= send_size;
+ }
+ }
+
+ /* The test is over. Flush the buffers to the remote end. We do a */
+ /* graceful release to insure that all data has been taken by the */
+ /* remote. */
+
+ /* but first, if the verbosity is greater than 1, find-out what */
+ /* the TCP maximum segment_size was (if possible) */
+ if (verbosity > 1) {
+ tcp_mss = -1;
+ get_tcp_info(send_socket,&tcp_mss);
+ }
+
+ if (shutdown(send_socket,SHUT_WR) == SOCKET_ERROR) {
+ perror("netperf: cannot shutdown tcp stream socket");
+ exit(1);
+ }
+
+ /* hang a recv() off the socket to block until the remote has */
+ /* brought all the data up into the application. it will do a */
+ /* shutdown to cause a FIN to be sent our way. We will assume that */
+ /* any exit from the recv() call is good... raj 4/93 */
+
+ recv(send_socket, send_ring->buffer_ptr, send_size, 0);
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being */
+ /* measured and how */
+ /* long did we really */
+ /* run? */
+
+ /* we are finished with the socket, so close it to prevent hitting */
+ /* the limit on maximum open files. */
+
+ close(send_socket);
+
+ if (!no_control) {
+ /* Get the statistics from the remote end. The remote will have
+ calculated service demand and all those interesting
+ things. If it wasn't supposed to care, it will return obvious
+ values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+
+ /* We now calculate what our thruput was for the test. In the
+ future, we may want to include a calculation of the thruput
+ measured by the remote, but it should be the case that for a
+ TCP stream test, that the two numbers should be *very*
+ close... We calculate bytes_sent regardless of the way the
+ test length was controlled. If it was time, we needed to,
+ and if it was by bytes, the user may have specified a number
+ of bytes that wasn't a multiple of the send_size, so we
+ really didn't send what he asked for ;-) */
+
+ bytes_sent = ntohd(tcp_stream_result->bytes_received);
+ }
+ else {
+ bytes_sent = (double)local_bytes_sent;
+ }
+
+ thruput = calc_thruput(bytes_sent);
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+
+ local_cpu_utilization = calc_cpu_util(0.0);
+ local_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ }
+
+ if (remote_cpu_usage) {
+
+ remote_cpu_utilization = tcp_stream_result->cpu_util;
+ remote_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ remote_cpu_utilization,
+ tcp_stream_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+ }
+ else {
+ /* we were not measuring cpu, for the confidence stuff, we */
+ /* should make it -1.0 */
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ /* at this point, we want to calculate the confidence information. */
+ /* if debugging is on, calculate_confidence will print-out the */
+ /* parameters we pass it */
+
+ calculate_confidence(confidence_iteration,
+ elapsed_time,
+ thruput,
+ local_cpu_utilization,
+ remote_cpu_utilization,
+ local_service_demand,
+ remote_service_demand);
+
+
+ confidence_iteration++;
+ }
+
+ /* at this point, we have finished making all the runs that we */
+ /* will be making. so, we should extract what the calcuated values */
+ /* are for all the confidence stuff. we could make the values */
+ /* global, but that seemed a little messy, and it did not seem worth */
+ /* all the mucking with header files. so, we create a routine much */
+ /* like calcualte_confidence, which just returns the mean values. */
+ /* raj 11/94 */
+
+ retrieve_confident_values(&elapsed_time,
+ &thruput,
+ &local_cpu_utilization,
+ &remote_cpu_utilization,
+ &local_service_demand,
+ &remote_service_demand);
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ if (confidence < 0) {
+ /* we did not hit confidence, but were we asked to look for it? */
+ if (iteration_max > 1) {
+ display_confidence();
+ }
+ }
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ local_cpu_method = format_cpu_method(cpu_method);
+ remote_cpu_method = format_cpu_method(tcp_stream_result->cpu_method);
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand,
+ local_cpu_method,
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand,
+ remote_cpu_method,
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ }
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,
+ cpu_title,
+ format_units(),
+ local_cpu_method,
+ remote_cpu_method);
+ }
+
+ fprintf(where,
+ cpu_fmt_1, /* the format string */
+ rsr_size, /* remote recvbuf size */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long was the test */
+ thruput, /* what was the xfer rate */
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand, /* remote service demand */
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ thruput,
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,tput_title,format_units());
+ }
+ fprintf(where,
+ tput_fmt_1, /* the format string */
+ rsr_size, /* remote recvbuf size */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long did it take */
+ thruput, /* how fast did it go */
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* TCP statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ /* this stuff needs to be worked-out in the presence of confidence */
+ /* intervals and multiple iterations of the test... raj 11/94 */
+
+ fprintf(where,
+ ksink_fmt,
+ "Bytes",
+ "Bytes",
+ "Bytes",
+ local_send_align,
+ remote_recv_align,
+ local_send_offset,
+ remote_recv_offset,
+ bytes_sent,
+ bytes_sent / (double)nummessages,
+ nummessages,
+ bytes_sent / (double)tcp_stream_result->recv_calls,
+ tcp_stream_result->recv_calls);
+ fprintf(where,
+ ksink_fmt2,
+ tcp_mss);
+ fflush(where);
+#ifdef WANT_HISTOGRAM
+ fprintf(where,"\n\nHistogram of time spent in send() call.\n");
+ fflush(where);
+ HIST_report(time_hist);
+#endif /* WANT_HISTOGRAM */
+ }
+
+}
+
+
+
+/* This routine implements the netperf-side TCP unidirectional data
+ transfer test (a.k.a. stream) for the sockets interface where the
+ data flow is from the netserver to the netperf. It receives its
+ parameters via global variables from the shell and writes its
+ output to the standard output. */
+
+
+void
+send_tcp_maerts(char remote_host[])
+{
+
+ char *tput_title = "\
+Recv Send Send \n\
+Socket Socket Message Elapsed \n\
+Size Size Size Time Throughput \n\
+bytes bytes bytes secs. %s/sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f %s\n";
+
+ char *tput_fmt_1 =
+ "%6d %6d %6d %-6.2f %7.2f %s \n";
+
+ char *cpu_title = "\
+Recv Send Send Utilization Service Demand\n\
+Socket Socket Message Elapsed Send Recv Send Recv\n\
+Size Size Size Time Throughput local remote local remote\n\
+bytes bytes bytes secs. %-8.8s/s %% %c %% %c us/KB us/KB\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f %c %s\n";
+
+ char *cpu_fmt_1 =
+ "%6d %6d %6d %-6.2f %7.2f %-6.2f %-6.2f %-6.3f %-6.3f %s\n";
+
+ char *ksink_fmt = "\n\
+Alignment Offset %-8.8s %-8.8s Recvs %-8.8s Sends\n\
+Local Remote Local Remote Xfered Per Per\n\
+Recv Send Recv Send Recv (avg) Send (avg)\n\
+%5d %5d %5d %5d %6.4g %6.2f %6d %6.2f %6d\n";
+
+ char *ksink_fmt2 = "\n\
+Maximum\n\
+Segment\n\
+Size (bytes)\n\
+%6d\n";
+
+
+ float elapsed_time;
+
+ /* what we want is to have a buffer space that is at least one */
+ /* recv-size greater than our recv window. this will insure that we */
+ /* are never trying to re-use a buffer that may still be in the hands */
+ /* of the transport. This buffer will be malloc'd after we have found */
+ /* the size of the local senc socket buffer. We will want to deal */
+ /* with alignment and offset concerns as well. */
+
+ struct ring_elt *recv_ring;
+
+ int len;
+ unsigned int nummessages = 0;
+ SOCKET recv_socket;
+ int bytes_remaining;
+ int tcp_mss = -1; /* possibly uninitialized on printf far below */
+
+ /* with links like fddi, one can recv > 32 bits worth of bytes */
+ /* during a test... ;-) at some point, this should probably become a */
+ /* 64bit integral type, but those are not entirely common yet */
+ double bytes_sent = 0.0;
+ unsigned long long local_bytes_recvd = 0;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+
+ double thruput;
+
+ struct addrinfo *remote_res;
+ struct addrinfo *local_res;
+
+ struct tcp_maerts_request_struct *tcp_maerts_request;
+ struct tcp_maerts_response_struct *tcp_maerts_response;
+ struct tcp_maerts_results_struct *tcp_maerts_result;
+
+ tcp_maerts_request =
+ (struct tcp_maerts_request_struct *)netperf_request.content.test_specific_data;
+ tcp_maerts_response =
+ (struct tcp_maerts_response_struct *)netperf_response.content.test_specific_data;
+ tcp_maerts_result =
+ (struct tcp_maerts_results_struct *)netperf_response.content.test_specific_data;
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ time_hist = HIST_new();
+ }
+#endif /* WANT_HISTOGRAM */
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ complete_addrinfos(&remote_res,
+ &local_res,
+ remote_host,
+ SOCK_STREAM,
+ IPPROTO_TCP,
+ 0);
+
+ if ( print_headers ) {
+ print_top_test_header("TCP MAERTS TEST",local_res,remote_res);
+ }
+
+ recv_ring = NULL;
+ confidence_iteration = 1;
+ init_stat();
+
+ /* we have a great-big while loop which controls the number of times */
+ /* we run a particular test. this is for the calculation of a */
+ /* confidence interval (I really should have stayed awake during */
+ /* probstats :). If the user did not request confidence measurement */
+ /* (no confidence is the default) then we will only go though the */
+ /* loop once. the confidence stuff originates from the folks at IBM */
+
+ while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
+ (confidence_iteration <= iteration_min)) {
+
+ /* initialize a few counters. we have to remember that we might be */
+ /* going through the loop more than once. */
+
+ nummessages = 0;
+ bytes_sent = 0.0;
+ times_up = 0;
+
+ /*set up the data socket */
+ recv_socket = create_data_socket(local_res);
+
+ if (recv_socket == INVALID_SOCKET){
+ perror("netperf: send_tcp_maerts: tcp stream data socket");
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"send_tcp_maerts: recv_socket obtained...\n");
+ }
+
+ /* at this point, we have either retrieved the socket buffer sizes, */
+ /* or have tried to set them, so now, we may want to set the recv */
+ /* size based on that (because the user either did not use a -m */
+ /* option, or used one with an argument of 0). If the socket buffer */
+ /* size is not available, we will set the recv size to 4KB - no */
+ /* particular reason, just arbitrary... */
+ if (recv_size == 0) {
+ if (lsr_size > 0) {
+ recv_size = lsr_size;
+ }
+ else {
+ recv_size = 4096;
+ }
+ }
+
+ /* set-up the data buffer ring with the requested alignment and offset. */
+ /* note also that we have allocated a quantity */
+ /* of memory that is at least one recv-size greater than our socket */
+ /* buffer size. We want to be sure that there are at least two */
+ /* buffers allocated - this can be a bit of a problem when the */
+ /* recv_size is bigger than the socket size, so we must check... the */
+ /* user may have wanted to explicitly set the "width" of our recv */
+ /* buffers, we should respect that wish... */
+ if (recv_width == 0) {
+ recv_width = (lsr_size/recv_size) + 1;
+ if (recv_width == 1) recv_width++;
+ }
+
+ if (recv_ring == NULL) {
+ /* only allocate the recv ring once. this is a networking test, */
+ /* not a memory allocation test. this way, we do not need a */
+ /* deallocate_buffer_ring() routine, and I don't feel like */
+ /* writing one anyway :) raj 11/94 */
+ recv_ring = allocate_buffer_ring(recv_width,
+ recv_size,
+ local_recv_align,
+ local_recv_offset);
+ }
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back. */
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ if (!no_control) {
+ /* Tell the remote end to do a listen. The server alters the
+ socket paramters on the other side at this point, hence the
+ reason for all the values being passed in the setup
+ message. If the user did not specify any of the parameters,
+ they will be passed as 0, which will indicate to the remote
+ that no changes beyond the system's default should be
+ used. Alignment is the exception, it will default to 1, which
+ will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_TCP_MAERTS;
+ tcp_maerts_request->send_buf_size = rss_size_req;
+ tcp_maerts_request->recv_buf_size = rsr_size_req;
+ tcp_maerts_request->send_size = send_size;
+ tcp_maerts_request->no_delay = rem_nodelay;
+ tcp_maerts_request->send_alignment = remote_send_align;
+ tcp_maerts_request->send_offset = remote_send_offset;
+ tcp_maerts_request->measure_cpu = remote_cpu_usage;
+ tcp_maerts_request->cpu_rate = remote_cpu_rate;
+ if (test_time) {
+ tcp_maerts_request->test_length = test_time;
+ }
+ else {
+ tcp_maerts_request->test_length = test_bytes;
+ }
+ tcp_maerts_request->so_rcvavoid = rem_rcvavoid;
+ tcp_maerts_request->so_sndavoid = rem_sndavoid;
+#ifdef DIRTY
+ tcp_maerts_request->dirty_count = rem_dirty_count;
+ tcp_maerts_request->clean_count = rem_clean_count;
+#endif /* DIRTY */
+ tcp_maerts_request->port = atoi(remote_data_port);
+ tcp_maerts_request->ipfamily = af_to_nf(remote_res->ai_family);
+ if (debug > 1) {
+ fprintf(where,
+ "netperf: send_tcp_maerts: requesting TCP maerts test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant
+ socket parameters for this test type. We will put them back
+ into the variables here so they can be displayed if desired.
+ The remote will have calibrated CPU if necessary, and will
+ have done all the needed set-up we will have calibrated the
+ cpu locally before sending the request, and will grab the
+ counter value right after the connect returns. The remote
+ will grab the counter right after the accept call. This saves
+ the hassle of extra messages being sent for the TCP
+ tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote listen done.\n");
+ rsr_size = tcp_maerts_response->recv_buf_size;
+ rss_size = tcp_maerts_response->send_buf_size;
+ rem_nodelay = tcp_maerts_response->no_delay;
+ remote_cpu_usage= tcp_maerts_response->measure_cpu;
+ remote_cpu_rate = tcp_maerts_response->cpu_rate;
+ send_size = tcp_maerts_response->send_size;
+
+ /* we have to make sure that the server port number is in
+ network order */
+ set_port_number(remote_res,
+ (short)tcp_maerts_response->data_port_number);
+ rem_rcvavoid = tcp_maerts_response->so_rcvavoid;
+ rem_sndavoid = tcp_maerts_response->so_sndavoid;
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+ }
+
+#ifdef WANT_DEMO
+ DEMO_STREAM_SETUP(lsr_size,rss_size)
+#endif
+
+ /*Connect up to the remote port on the data socket */
+ if (connect(recv_socket,
+ remote_res->ai_addr,
+ remote_res->ai_addrlen) == INVALID_SOCKET){
+ perror("netperf: send_tcp_maerts: data socket connect failed");
+ exit(1);
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either */
+ /* the connect would have failed, or the previous response would */
+ /* have indicated a problem. I failed to see the value of the */
+ /* extra message after the accept on the remote. If it failed, */
+ /* we'll see it here. If it didn't, we might as well start pumping */
+ /* data. */
+
+ /* Set-up the test end conditions. For a maerts test, they can be */
+ /* either time or byte-count based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ bytes_remaining = 0;
+ /* in previous revisions, we had the same code repeated throught */
+ /* all the test suites. this was unnecessary, and meant more */
+ /* work for me when I wanted to switch to POSIX signals, so I */
+ /* have abstracted this out into a routine in netlib.c. if you */
+ /* are experiencing signal problems, you might want to look */
+ /* there. raj 11/94 */
+ if (!no_control) {
+ /* this is a netperf to netserver test, netserver will close
+ to tell us the test is over, so use PAD_TIME to avoid
+ causing the netserver fits. */
+ start_timer(test_time + PAD_TIME);
+ }
+ else {
+ /* this is a netperf to data source test, no PAD_TIME */
+ start_timer(test_time);
+ }
+ }
+ else {
+ /* The tester wanted to recv a number of bytes. we don't do that
+ in a TCP_MAERTS test. sorry. raj 2002-06-21 */
+ printf("netperf: send_tcp_maerts: test must be timed\n");
+ exit(1);
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+#ifdef WANT_INTERVALS
+ INTERVALS_INIT();
+#endif /* WANT_INTERVALS */
+
+ /* before we start, initialize a few variables */
+
+#ifdef WANT_DEMO
+ if (demo_mode) {
+ HIST_timestamp(demo_one_ptr);
+ }
+#endif
+
+ /* the test will continue until we either get a zero-byte recv()
+ on the socket or our failsafe timer expires. most of the time
+ we trust that we get a zero-byte recieve from the socket. raj
+ 2002-06-21 */
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ /* timestamp just before we go into recv and then again just
+ after we come out raj 8/94 */
+ /* but only if we are actually going to display a histogram. raj
+ 2006-02-07 */
+ HIST_timestamp(&time_one);
+ }
+#endif /* WANT_HISTOGRAM */
+
+ while ((!times_up) && (len=recv(recv_socket,
+ recv_ring->buffer_ptr,
+ recv_size,
+ 0)) > 0 ) {
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ /* timestamp the exit from the recv call and update the histogram */
+ HIST_timestamp(&time_two);
+ HIST_add(time_hist,delta_micro(&time_one,&time_two));
+ }
+#endif /* WANT_HISTOGRAM */
+
+#ifdef DIRTY
+ access_buffer(recv_ring->buffer_ptr,
+ recv_size,
+ loc_dirty_count,
+ loc_clean_count);
+#endif /* DIRTY */
+
+#ifdef WANT_DEMO
+ DEMO_STREAM_INTERVAL(len);
+#endif
+
+#ifdef WANT_INTERVALS
+ INTERVALS_WAIT();
+#endif /* WANT_INTERVALS */
+
+ /* now we want to move our pointer to the next position in the */
+ /* data buffer...we may also want to wrap back to the "beginning" */
+ /* of the bufferspace, so we will mod the number of messages sent */
+ /* by the recv width, and use that to calculate the offset to add */
+ /* to the base pointer. */
+ nummessages++;
+ recv_ring = recv_ring->next;
+ if (bytes_remaining) {
+ bytes_remaining -= len;
+ }
+
+ local_bytes_recvd += len;
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ /* make sure we timestamp just before we go into recv */
+ /* raj 2004-06-15 */
+ HIST_timestamp(&time_one);
+ }
+#endif /* WANT_HISTOGRAM */
+
+ }
+
+ /* an EINTR is to be expected when this is a no_control test */
+ if (((len < 0) || SOCKET_EINTR(len)) && (!no_control)) {
+ perror("send_tcp_maerts: data recv error");
+ printf("len was %d\n",len);
+ exit(1);
+ }
+
+ /* if we get here, it must mean we had a recv return of 0 before
+ the watchdog timer expired, or the watchdog timer expired and
+ this was a no_control test */
+
+ /* The test is over. Flush the buffers to the remote end. We do a
+ graceful release to tell the remote we have all the data. */
+
+ /* but first, if the verbosity is greater than 1, find-out what */
+ /* the TCP maximum segment_size was (if possible) */
+ if (verbosity > 1) {
+ tcp_mss = -1;
+ get_tcp_info(recv_socket,&tcp_mss);
+ }
+
+ if (shutdown(recv_socket,SHUT_WR) == SOCKET_ERROR) {
+ perror("netperf: cannot shutdown tcp maerts socket");
+ exit(1);
+ }
+
+ stop_timer();
+
+ /* this call will always give us the local elapsed time for the
+ test, and will also store-away the necessaries for cpu
+ utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being */
+ /* measured and how */
+ /* long did we really */
+ /* run? */
+
+ /* we are finished with the socket, so close it to prevent hitting */
+ /* the limit on maximum open files. */
+
+ close(recv_socket);
+
+ if (!no_control) {
+ /* Get the statistics from the remote end. The remote will have
+ calculated service demand and all those interesting
+ things. If it wasn't supposed to care, it will return obvious
+ values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+
+ /* We now calculate what our thruput was for the test. In the
+ future, we may want to include a calculation of the thruput
+ measured by the remote, but it should be the case that for a
+ TCP maerts test, that the two numbers should be *very*
+ close... We calculate bytes_sent regardless of the way the
+ test length was controlled. If it was time, we needed to,
+ and if it was by bytes, the user may have specified a number
+ of bytes that wasn't a multiple of the recv_size, so we
+ really didn't recv what he asked for ;-) */
+
+ bytes_sent = ntohd(tcp_maerts_result->bytes_sent);
+ }
+ else {
+ bytes_sent = (double)local_bytes_recvd;
+ }
+
+
+ thruput = calc_thruput(bytes_sent);
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+
+ local_cpu_utilization = calc_cpu_util(0.0);
+ local_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ }
+
+ if (remote_cpu_usage) {
+
+ remote_cpu_utilization = tcp_maerts_result->cpu_util;
+ remote_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ remote_cpu_utilization,
+ tcp_maerts_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+ }
+ else {
+ /* we were not measuring cpu, for the confidence stuff, we */
+ /* should make it -1.0 */
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ /* at this point, we want to calculate the confidence information. */
+ /* if debugging is on, calculate_confidence will print-out the */
+ /* parameters we pass it */
+
+ calculate_confidence(confidence_iteration,
+ elapsed_time,
+ thruput,
+ local_cpu_utilization,
+ remote_cpu_utilization,
+ local_service_demand,
+ remote_service_demand);
+
+
+ confidence_iteration++;
+ }
+
+ /* at this point, we have finished making all the runs that we */
+ /* will be making. so, we should extract what the calcuated values */
+ /* are for all the confidence stuff. we could make the values */
+ /* global, but that seemed a little messy, and it did not seem worth */
+ /* all the mucking with header files. so, we create a routine much */
+ /* like calcualte_confidence, which just returns the mean values. */
+ /* raj 11/94 */
+
+ retrieve_confident_values(&elapsed_time,
+ &thruput,
+ &local_cpu_utilization,
+ &remote_cpu_utilization,
+ &local_service_demand,
+ &remote_service_demand);
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ if (confidence < 0) {
+ /* we did not hit confidence, but were we asked to look for it? */
+ if (iteration_max > 1) {
+ display_confidence();
+ }
+ }
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ local_cpu_method = format_cpu_method(cpu_method);
+ remote_cpu_method = format_cpu_method(tcp_maerts_result->cpu_method);
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand,
+ local_cpu_method,
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand,
+ remote_cpu_method,
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ }
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,
+ cpu_title,
+ format_units(),
+ local_cpu_method,
+ remote_cpu_method);
+ }
+
+ fprintf(where,
+ cpu_fmt_1, /* the format string */
+ rsr_size, /* remote recvbuf size */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the recvs */
+ elapsed_time, /* how long was the test */
+ thruput, /* what was the xfer rate */
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand, /* remote service demand */
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ thruput,
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,tput_title,format_units());
+ }
+ fprintf(where,
+ tput_fmt_1, /* the format string */
+ lsr_size, /* local recvbuf size */
+ rss_size, /* remot sendbuf size */
+ send_size, /* how large were the recvs */
+ elapsed_time, /* how long did it take */
+ thruput, /* how fast did it go */
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* TCP statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ /* this stuff needs to be worked-out in the presence of confidence */
+ /* intervals and multiple iterations of the test... raj 11/94 */
+
+ fprintf(where,
+ ksink_fmt,
+ "Bytes",
+ "Bytes",
+ "Bytes",
+ local_recv_align,
+ remote_recv_align,
+ local_recv_offset,
+ remote_recv_offset,
+ bytes_sent,
+ bytes_sent / (double)nummessages,
+ nummessages,
+ bytes_sent / (double)tcp_maerts_result->send_calls,
+ tcp_maerts_result->send_calls);
+ fprintf(where,
+ ksink_fmt2,
+ tcp_mss);
+ fflush(where);
+#ifdef WANT_HISTOGRAM
+ fprintf(where,"\n\nHistogram of time spent in recv() call.\n");
+ fflush(where);
+ HIST_report(time_hist);
+#endif /* WANT_HISTOGRAM */
+ }
+
+}
+
+
+
+#ifdef HAVE_ICSC_EXS
+
+#include <sys/exs.h>
+
+
+/* This routine implements the TCP unidirectional data transfer test */
+/* (a.k.a. stream) for the sockets interface. It receives its */
+/* parameters via global variables from the shell and writes its */
+/* output to the standard output. */
+
+void
+send_exs_tcp_stream(char remote_host[])
+{
+
+ char *tput_title = "\
+Recv Send Send \n\
+Socket Socket Message Elapsed \n\
+Size Size Size Time Throughput \n\
+bytes bytes bytes secs. %s/sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1 =
+ "%6d %6d %6d %-6.2f %7.2f \n";
+
+ char *cpu_title = "\
+Recv Send Send Utilization Service Demand\n\
+Socket Socket Message Elapsed Send Recv Send Recv\n\
+Size Size Size Time Throughput local remote local remote\n\
+bytes bytes bytes secs. %-8.8s/s %% %c %% %c us/KB us/KB\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f %c\n";
+
+ char *cpu_fmt_1 =
+ "%6d %6d %6d %-6.2f %7.2f %-6.2f %-6.2f %-6.3f %-6.3f\n";
+
+ char *ksink_fmt = "\n\
+Alignment Offset %-8.8s %-8.8s Sends %-8.8s Recvs\n\
+Local Remote Local Remote Xfered Per Per\n\
+Send Recv Send Recv Send (avg) Recv (avg)\n\
+%5d %5d %5d %5d %6.4g %6.2f %6d %6.2f %6d\n";
+
+ char *ksink_fmt2 = "\n\
+Maximum\n\
+Segment\n\
+Size (bytes)\n\
+%6d\n";
+
+
+ float elapsed_time;
+
+ /* what we want is to have a buffer space that is at least one */
+ /* send-size greater than our send window. this will insure that we */
+ /* are never trying to re-use a buffer that may still be in the hands */
+ /* of the transport. This buffer will be malloc'd after we have found */
+ /* the size of the local senc socket buffer. We will want to deal */
+ /* with alignment and offset concerns as well. */
+
+ struct ring_elt *send_ring;
+
+ int len;
+ unsigned int nummessages = 0;
+ SOCKET send_socket;
+ int bytes_remaining;
+ int tcp_mss = -1; /* possibly uninitialized on printf far below */
+
+ exs_mhandle_t exs_mhandle;
+ exs_qhandle_t exs_qhandle;
+#define NETPERF_EXS_PENDING 16
+ int exs_aio_pending;
+ int exs_aio_eagain;
+ int exs_aio_dequeued;
+ int exs_aio_dequeuecnt;
+ int exs_evtcnt;
+#define NETPERF_EXS_QSIZE 128
+ exs_event_t exs_evtvec[NETPERF_EXS_QSIZE];
+
+ /* with links like fddi, one can send > 32 bits worth of bytes */
+ /* during a test... ;-) at some point, this should probably become a */
+ /* 64bit integral type, but those are not entirely common yet */
+
+ double bytes_sent = 0.0;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+
+ double thruput;
+
+ struct addrinfo *remote_res;
+ struct addrinfo *local_res;
+
+ struct tcp_stream_request_struct *tcp_stream_request;
+ struct tcp_stream_response_struct *tcp_stream_response;
+ struct tcp_stream_results_struct *tcp_stream_result;
+
+ tcp_stream_request =
+ (struct tcp_stream_request_struct *)netperf_request.content.test_specific_data;
+ tcp_stream_response =
+ (struct tcp_stream_response_struct *)netperf_response.content.test_specific_data;
+ tcp_stream_result =
+ (struct tcp_stream_results_struct *)netperf_response.content.test_specific_data;
+
+#if 0 /* def WANT_HISTOGRAM */
+ time_hist = HIST_new();
+#endif /* WANT_HISTOGRAM */
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ /* complete_addrinfos will either succede or exit the process */
+ complete_addrinfos(&remote_res,
+ &local_res,
+ remote_host,
+ SOCK_STREAM,
+ IPPROTO_TCP,
+ 0);
+
+ if ( print_headers ) {
+ print_top_test_header("EXS TCP STREAM TEST",local_res,remote_res);
+ }
+
+ send_ring = NULL;
+ confidence_iteration = 1;
+ init_stat();
+
+ /* initialize EXS API and create event queue */
+ if (exs_init (EXS_VERSION) == -1) {
+ perror ("netperf: send_exs_tcp_stream: exs_init failed");
+ exit (1);
+ }
+
+ if ((exs_qhandle = exs_qcreate (NETPERF_EXS_QSIZE)) == EXS_QHANDLE_INVALID) {
+ perror ("netperf: send_exs_tcp_stream: exs_qcreate failed");
+ exit (1);
+ }
+ if (debug) {
+ fprintf (where, "send_exs_tcp_stream: qhandle=%d\n", exs_qhandle);
+ }
+
+ /* we have a great-big while loop which controls the number of times */
+ /* we run a particular test. this is for the calculation of a */
+ /* confidence interval (I really should have stayed awake during */
+ /* probstats :). If the user did not request confidence measurement */
+ /* (no confidence is the default) then we will only go though the */
+ /* loop once. the confidence stuff originates from the folks at IBM */
+
+ while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
+ (confidence_iteration <= iteration_min)) {
+
+ /* initialize a few counters. we have to remember that we might be */
+ /* going through the loop more than once. */
+
+ nummessages = 0;
+ bytes_sent = 0.0;
+ times_up = 0;
+
+ /*set up the data socket */
+ send_socket = create_data_socket(local_res);
+
+ if (send_socket == INVALID_SOCKET){
+ perror("netperf: send_tcp_stream: tcp stream data socket");
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"send_tcp_stream: send_socket obtained...\n");
+ }
+
+ /* at this point, we have either retrieved the socket buffer sizes, */
+ /* or have tried to set them, so now, we may want to set the send */
+ /* size based on that (because the user either did not use a -m */
+ /* option, or used one with an argument of 0). If the socket buffer */
+ /* size is not available, we will set the send size to 4KB - no */
+ /* particular reason, just arbitrary... */
+ if (send_size == 0) {
+ if (lss_size > 0) {
+ send_size = lss_size;
+ }
+ else {
+ send_size = 4096;
+ }
+ }
+
+ /* set-up the data buffer ring with the requested alignment and offset. */
+ /* note also that we have allocated a quantity */
+ /* of memory that is at least one send-size greater than our socket */
+ /* buffer size. We want to be sure that there are at least two */
+ /* buffers allocated - this can be a bit of a problem when the */
+ /* send_size is bigger than the socket size, so we must check... the */
+ /* user may have wanted to explicitly set the "width" of our send */
+ /* buffers, we should respect that wish... */
+ if (send_width == 0) {
+ send_width = (lss_size/send_size) + 1;
+ if (send_width == 1) send_width++;
+ }
+
+ if (send_ring == NULL) {
+ /* only allocate the send ring once. this is a networking test, */
+ /* not a memory allocation test. this way, we do not need a */
+ /* deallocate_buffer_ring() routine, and I don't feel like */
+ /* writing one anyway :) raj 11/94 */
+ send_ring = allocate_exs_buffer_ring(send_width,
+ send_size,
+ local_send_align,
+ local_send_offset,
+ &exs_mhandle);
+ }
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back. */
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ /* Tell the remote end to do a listen. The server alters the socket */
+ /* paramters on the other side at this point, hence the reason for */
+ /* all the values being passed in the setup message. If the user did */
+ /* not specify any of the parameters, they will be passed as 0, which */
+ /* will indicate to the remote that no changes beyond the system's */
+ /* default should be used. Alignment is the exception, it will */
+ /* default to 1, which will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_TCP_STREAM;
+ tcp_stream_request->send_buf_size = rss_size_req;
+ tcp_stream_request->recv_buf_size = rsr_size_req;
+ tcp_stream_request->receive_size = recv_size;
+ tcp_stream_request->no_delay = rem_nodelay;
+ tcp_stream_request->recv_alignment = remote_recv_align;
+ tcp_stream_request->recv_offset = remote_recv_offset;
+ tcp_stream_request->measure_cpu = remote_cpu_usage;
+ tcp_stream_request->cpu_rate = remote_cpu_rate;
+ if (test_time) {
+ tcp_stream_request->test_length = test_time;
+ }
+ else {
+ tcp_stream_request->test_length = test_bytes;
+ }
+ tcp_stream_request->so_rcvavoid = rem_rcvavoid;
+ tcp_stream_request->so_sndavoid = rem_sndavoid;
+#ifdef DIRTY
+ tcp_stream_request->dirty_count = rem_dirty_count;
+ tcp_stream_request->clean_count = rem_clean_count;
+#endif /* DIRTY */
+ tcp_stream_request->port = atoi(remote_data_port);
+ tcp_stream_request->ipfamily = af_to_nf(remote_res->ai_family);
+ if (debug > 1) {
+ fprintf(where,
+ "netperf: send_tcp_stream: requesting TCP stream test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant */
+ /* socket parameters for this test type. We will put them back into */
+ /* the variables here so they can be displayed if desired. The */
+ /* remote will have calibrated CPU if necessary, and will have done */
+ /* all the needed set-up we will have calibrated the cpu locally */
+ /* before sending the request, and will grab the counter value right*/
+ /* after the connect returns. The remote will grab the counter right*/
+ /* after the accept call. This saves the hassle of extra messages */
+ /* being sent for the TCP tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote listen done.\n");
+ rsr_size = tcp_stream_response->recv_buf_size;
+ rss_size = tcp_stream_response->send_buf_size;
+ rem_nodelay = tcp_stream_response->no_delay;
+ remote_cpu_usage= tcp_stream_response->measure_cpu;
+ remote_cpu_rate = tcp_stream_response->cpu_rate;
+
+ /* we have to make sure that the server port number is in */
+ /* network order */
+ set_port_number(remote_res,(short)tcp_stream_response->data_port_number);
+
+ rem_rcvavoid = tcp_stream_response->so_rcvavoid;
+ rem_sndavoid = tcp_stream_response->so_sndavoid;
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+
+#if 0 /* def WANT_DEMO */
+ DEMO_STREAM_SETUP(lss_size,rsr_size)
+#endif
+
+ /*Connect up to the remote port on the data socket */
+ if (connect(send_socket,
+ remote_res->ai_addr,
+ remote_res->ai_addrlen) == INVALID_SOCKET){
+ perror("netperf: send_tcp_stream: data socket connect failed");
+ exit(1);
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either */
+ /* the connect would have failed, or the previous response would */
+ /* have indicated a problem. I failed to see the value of the */
+ /* extra message after the accept on the remote. If it failed, */
+ /* we'll see it here. If it didn't, we might as well start pumping */
+ /* data. */
+
+ /* Set-up the test end conditions. For a stream test, they can be */
+ /* either time or byte-count based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ bytes_remaining = 0;
+ /* in previous revisions, we had the same code repeated throught */
+ /* all the test suites. this was unnecessary, and meant more */
+ /* work for me when I wanted to switch to POSIX signals, so I */
+ /* have abstracted this out into a routine in netlib.c. if you */
+ /* are experiencing signal problems, you might want to look */
+ /* there. raj 11/94 */
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ bytes_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+#if 0 /* def WANT_INTERVALS */
+ INTERVALS_INIT();
+#endif /* WANT_INTERVALS */
+
+ /* before we start, initialize a few variables */
+
+#if 0 /* def WANT_DEMO */
+ if (demo_mode) {
+ HIST_timestamp(demo_one_ptr);
+ }
+#endif
+
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return false. */
+ /* When the test is controlled by byte count, the time test will */
+ /* always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. */
+
+ exs_aio_pending = 0;
+ exs_aio_eagain = 0;
+ exs_aio_dequeuecnt = 0;
+
+ while ((!times_up) || (bytes_remaining > 0)) {
+
+#ifdef DIRTY
+ access_buffer(send_ring->buffer_ptr,
+ send_size,
+ loc_dirty_count,
+ loc_clean_count);
+#endif /* DIRTY */
+
+#if 0 /* def WANT_HISTOGRAM */
+ /* timestamp just before we go into send and then again just after */
+ /* we come out raj 8/94 */
+ HIST_timestamp(&time_one);
+#endif /* WANT_HISTOGRAM */
+
+
+ /* post up to NETPERF_EXS_PENDING I/Os */
+ while ((exs_aio_pending < NETPERF_EXS_PENDING) &&
+ (exs_send (send_socket, send_ring->buffer_ptr, send_size,
+ 0, exs_qhandle, (exs_ahandle_t)-1, exs_mhandle) == 0)) {
+ exs_aio_pending++;
+
+ /* now we want to move our pointer to the next
+ position in the data buffer...we may also want to
+ wrap back to the "beginning" of the bufferspace, so
+ we will mod the number of messages sent by the send
+ width, and use that to calculate the offset to add
+ to the base pointer. */
+
+ nummessages++;
+ send_ring = send_ring->next;
+ if (bytes_remaining) {
+ bytes_remaining -= send_size;
+ }
+ }
+
+ /* check exs_send result */
+ if (exs_aio_pending < NETPERF_EXS_PENDING) {
+ /* standard flow control case */
+ if (errno == EAGAIN)
+ exs_aio_eagain++;
+ /* case of times_up */
+ else if (errno == EINTR)
+ break;
+ /* strange, let's stop */
+ else {
+ perror ("netperf: exs_send error");
+ exit (1);
+ }
+ }
+
+ /* dequeue events with "threshold" on 1/2 posted */
+ exs_aio_dequeued =
+ exs_qdequeue (exs_qhandle, exs_evtvec,
+ -(exs_aio_pending>>1), NULL);
+ exs_aio_dequeuecnt++;
+
+ /* check exs_dequeue result */
+ if (exs_aio_dequeued < 0) {
+ /* case of times_up */
+ if (errno == EINTR)
+ break;
+ /* strange, let's stop */
+ else {
+ perror ("netperf: exs_send error");
+ exit (1);
+ }
+ }
+ /* update number of pending I/Os */
+ else {
+ exs_aio_pending -= exs_aio_dequeued;
+ }
+
+
+#if 0 /* def WANT_HISTOGRAM */
+ /* timestamp the exit from the send call and update the histogram */
+ HIST_timestamp(&time_two);
+ HIST_add(time_hist,delta_micro(&time_one,&time_two));
+#endif /* WANT_HISTOGRAM */
+
+#if 0 /* def WANT_DEMO */
+ DEMO_STREAM_INTERVAL(send_size);
+#endif
+
+#if 0 /* def WANT_INTERVALS */
+ INTERVALS_WAIT();
+#endif /* WANT_INTERVALS */
+
+ }
+
+ /* Collect the last completion events */
+ exs_aio_dequeued =
+ exs_qdequeue (exs_qhandle, exs_evtvec, -exs_aio_pending, NULL);
+ exs_aio_dequeuecnt++;
+ /* check exs_dequeue result and update number of pending I/Os */
+ if (exs_aio_dequeued < 0) {
+ perror ("netperf: exs_send error");
+ exit (1);
+ }
+ exs_aio_pending -= exs_aio_dequeued;
+
+ /* Display some async I/O debug info */
+ if (debug) {
+ fprintf (where, "send_exs_tcp_stream: "
+ "aio sent=%d eagain=%d dequeue=%d pending=%d\n",
+ nummessages, exs_aio_eagain, exs_aio_dequeuecnt, exs_aio_pending);
+ }
+
+ /* The test is over. Flush the buffers to the remote end. We do a */
+ /* graceful release to insure that all data has been taken by the */
+ /* remote. */
+
+ /* but first, if the verbosity is greater than 1, find-out what */
+ /* the TCP maximum segment_size was (if possible) */
+ if (verbosity > 1) {
+ tcp_mss = -1;
+ get_tcp_info(send_socket,&tcp_mss);
+ }
+
+ if (shutdown(send_socket,SHUT_WR) == SOCKET_ERROR) {
+ perror("netperf: cannot shutdown tcp stream socket");
+ exit(1);
+ }
+
+ /* hang a recv() off the socket to block until the remote has */
+ /* brought all the data up into the application. it will do a */
+ /* shutdown to cause a FIN to be sent our way. We will assume that */
+ /* any exit from the recv() call is good... raj 4/93 */
+
+ recv(send_socket, send_ring->buffer_ptr, send_size, 0);
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being */
+ /* measured and how */
+ /* long did we really */
+ /* run? */
+
+ /* we are finished with the socket, so close it to prevent hitting */
+ /* the limit on maximum open files. */
+
+ close(send_socket);
+
+ /* Get the statistics from the remote end. The remote will have */
+ /* calculated service demand and all those interesting things. If it */
+ /* wasn't supposed to care, it will return obvious values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+
+ /* We now calculate what our thruput was for the test. In the future, */
+ /* we may want to include a calculation of the thruput measured by */
+ /* the remote, but it should be the case that for a TCP stream test, */
+ /* that the two numbers should be *very* close... We calculate */
+ /* bytes_sent regardless of the way the test length was controlled. */
+ /* If it was time, we needed to, and if it was by bytes, the user may */
+ /* have specified a number of bytes that wasn't a multiple of the */
+ /* send_size, so we really didn't send what he asked for ;-) */
+
+ bytes_sent = ntohd(tcp_stream_result->bytes_received);
+
+ thruput = calc_thruput(bytes_sent);
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+
+ local_cpu_utilization = calc_cpu_util(0.0);
+ local_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ }
+
+ if (remote_cpu_usage) {
+
+ remote_cpu_utilization = tcp_stream_result->cpu_util;
+ remote_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ remote_cpu_utilization,
+ tcp_stream_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+ }
+ else {
+ /* we were not measuring cpu, for the confidence stuff, we */
+ /* should make it -1.0 */
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ /* at this point, we want to calculate the confidence information. */
+ /* if debugging is on, calculate_confidence will print-out the */
+ /* parameters we pass it */
+
+ calculate_confidence(confidence_iteration,
+ elapsed_time,
+ thruput,
+ local_cpu_utilization,
+ remote_cpu_utilization,
+ local_service_demand,
+ remote_service_demand);
+
+
+ confidence_iteration++;
+ }
+
+ /* at this point, we have finished making all the runs that we */
+ /* will be making. so, we should extract what the calcuated values */
+ /* are for all the confidence stuff. we could make the values */
+ /* global, but that seemed a little messy, and it did not seem worth */
+ /* all the mucking with header files. so, we create a routine much */
+ /* like calcualte_confidence, which just returns the mean values. */
+ /* raj 11/94 */
+
+ retrieve_confident_values(&elapsed_time,
+ &thruput,
+ &local_cpu_utilization,
+ &remote_cpu_utilization,
+ &local_service_demand,
+ &remote_service_demand);
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ if (confidence < 0) {
+ /* we did not hit confidence, but were we asked to look for it? */
+ if (iteration_max > 1) {
+ display_confidence();
+ }
+ }
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ local_cpu_method = format_cpu_method(cpu_method);
+ remote_cpu_method = format_cpu_method(tcp_stream_result->cpu_method);
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand,
+ local_cpu_method);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand,
+ remote_cpu_method);
+ }
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,
+ cpu_title,
+ format_units(),
+ local_cpu_method,
+ remote_cpu_method);
+ }
+
+ fprintf(where,
+ cpu_fmt_1, /* the format string */
+ rsr_size, /* remote recvbuf size */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long was the test */
+ thruput, /* what was the xfer rate */
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand); /* remote service demand */
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ thruput);
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,tput_title,format_units());
+ }
+ fprintf(where,
+ tput_fmt_1, /* the format string */
+ rsr_size, /* remote recvbuf size */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long did it take */
+ thruput);/* how fast did it go */
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* TCP statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ /* this stuff needs to be worked-out in the presence of confidence */
+ /* intervals and multiple iterations of the test... raj 11/94 */
+
+ fprintf(where,
+ ksink_fmt,
+ "Bytes",
+ "Bytes",
+ "Bytes",
+ local_send_align,
+ remote_recv_align,
+ local_send_offset,
+ remote_recv_offset,
+ bytes_sent,
+ bytes_sent / (double)nummessages,
+ nummessages,
+ bytes_sent / (double)tcp_stream_result->recv_calls,
+ tcp_stream_result->recv_calls);
+ fprintf(where,
+ ksink_fmt2,
+ tcp_mss);
+ fflush(where);
+#if 0 /* def WANT_HISTOGRAM */
+ fprintf(where,"\n\nHistogram of time spent in send() call.\n");
+ fflush(where);
+ HIST_report(time_hist);
+#endif /* WANT_HISTOGRAM */
+ }
+
+}
+
+#endif /* HAVE_ICSC_EXS */
+
+
+
+#if defined(HAVE_SENDFILE)
+
+#if defined(QUICK_SENDPATH)
+
+/*
+ * a temporary stub for the sendpath() system call
+ * which is defined & implemented in the kernel
+ * but which has no libc stub.
+ */
+#include <sys/types.h>
+#include <sys/scall_define.h>
+#include <sys/uio.h>
+
+ssize_t
+sendpath(int s, char *path, off_t offset, size_t nbytes,
+ const struct iovec *hdtrl, int flags)
+ {
+ return syscall(SYS_sendpath, s, path, offset, nbytes, hdtrl, flags);
+ }
+#endif /* QUICK_SENDPATH */
+
+/* This routine implements the TCP unidirectional data transfer test
+ (a.k.a. stream) for the sockets interface using the sendfile()
+ system call - TCP_SENDFILE. It receives its parameters via global
+ variables from the shell and writes its output to the standard
+ output. Basically, this is the same test as the send_tcp_stream()
+ logic and we even tell the remote to do a TCP_STREAM test since for
+ all it knows, nothig is different. */
+
+void
+sendfile_tcp_stream(remote_host)
+ char remote_host[];
+{
+
+ char *tput_title = "\
+Recv Send Send \n\
+Socket Socket Message Elapsed \n\
+Size Size Size Time Throughput \n\
+bytes bytes bytes secs. %s/sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1 =
+ "%6d %6d %6d %-6.2f %7.2f \n";
+
+ char *cpu_title = "\
+Recv Send Send Utilization Service Demand\n\
+Socket Socket Message Elapsed Send Recv Send Recv\n\
+Size Size Size Time Throughput local remote local remote\n\
+bytes bytes bytes secs. %-8.8s/s %% %c %% %c us/KB us/KB\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f %c\n";
+ char *cpu_fmt_1 =
+ "%6d %6d %6d %-6.2f %7.2f %-6.2f %-6.2f %-6.3f %-6.3f\n";
+
+ char *ksink_fmt = "\n\
+Alignment Offset %-8.8s %-8.8s Sends %-8.8s Recvs\n\
+Local Remote Local Remote Xfered Per Per\n\
+Send Recv Send Recv Send (avg) Recv (avg)\n\
+%5d %5d %5d %5d %6.4g %6.2f %6d %6.2f %6d\n";
+
+char *ksink_fmt2 = "\n\
+Maximum\n\
+Segment\n\
+Size (bytes)\n\
+%6d\n";
+
+ float elapsed_time;
+
+ /* what we want is to have a buffer space that is at least one */
+ /* send-size greater than our send window. this will insure that we */
+ /* are never trying to re-use a buffer that may still be in the hands */
+ /* of the transport. This buffer will be malloc'd after we have found */
+ /* the size of the local senc socket buffer. We will want to deal */
+ /* with alignment and offset concerns as well. */
+
+ struct sendfile_ring_elt *send_ring;
+
+ int len;
+ unsigned int nummessages = 0;
+ SOCKET send_socket;
+ int bytes_remaining;
+ int tcp_mss = -1; /* possibly uninitialized on printf far below */
+
+ /* with links like fddi, one can send > 32 bits worth of bytes */
+ /* during a test... ;-) at some point, this should probably become a */
+ /* 64bit integral type, but those are not entirely common yet */
+ double bytes_sent = 0.0;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+
+ double thruput;
+
+ struct addrinfo *remote_res;
+ struct addrinfo *local_res;
+ struct sockaddr_in server;
+
+#if defined(__linux) || defined(__sun__)
+ off_t scratch_offset; /* the linux sendfile() call will update
+ the offset variable, which is
+ something we do _not_ want to happen
+ to the value in the send_ring! so, we
+ have to use a scratch variable. */
+#endif /* __linux || defined(__sun__) */
+#if defined (USE_OSX)
+ off_t scratch_len; /* Darwin 9.x need a value-result parameter */
+#endif
+#if defined (__sun__)
+ size_t scratch_len; /* the sun sendfilev() needs a place to
+ tell us how many bytes were written,
+ even though it also returns the value */
+ sendfilevec_t sv;
+#endif /* __sun__ */
+
+ struct tcp_stream_request_struct *tcp_stream_request;
+ struct tcp_stream_response_struct *tcp_stream_response;
+ struct tcp_stream_results_struct *tcp_stream_result;
+
+ tcp_stream_request =
+ (struct tcp_stream_request_struct *)netperf_request.content.test_specific_data;
+ tcp_stream_response =
+ (struct tcp_stream_response_struct *)netperf_response.content.test_specific_data;
+ tcp_stream_result =
+ (struct tcp_stream_results_struct *)netperf_response.content.test_specific_data;
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ time_hist = HIST_new();
+ }
+#endif /* WANT_HISTOGRAM */
+
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ bzero((char *)&server,
+ sizeof(server));
+
+ complete_addrinfos(&remote_res,
+ &local_res,
+ remote_host,
+ SOCK_STREAM,
+ IPPROTO_TCP,
+ 0);
+
+ if ( print_headers ) {
+ /* we want to have some additional, interesting information in */
+ /* the headers. we know some of it here, but not all, so we will */
+ /* only print the test title here and will print the results */
+ /* titles after the test is finished */
+#ifdef QUICK_SENDPATH
+ print_top_test_header("TCP SENDPATH TEST",local_res,remote_res);
+#else
+ print_top_test_header("TCP SENDFILE TEST",local_res,remote_res);
+#endif /* QUICK_SENDPATH */
+ }
+ send_ring = NULL;
+ confidence_iteration = 1;
+ init_stat();
+
+ /* we have a great-big while loop which controls the number of times */
+ /* we run a particular test. this is for the calculation of a */
+ /* confidence interval (I really should have stayed awake during */
+ /* probstats :). If the user did not request confidence measurement */
+ /* (no confidence is the default) then we will only go though the */
+ /* loop once. the confidence stuff originates from the folks at IBM */
+
+ while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
+ (confidence_iteration <= iteration_min)) {
+
+ /* initialize a few counters. we have to remember that we might be */
+ /* going through the loop more than once. */
+
+ nummessages = 0;
+ bytes_sent = 0.0;
+ times_up = 0;
+
+ /* set up the data socket */
+ send_socket = create_data_socket(local_res);
+
+ if (send_socket == INVALID_SOCKET){
+ perror("netperf: sendfile_tcp_stream: tcp stream data socket");
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"sendfile_tcp_stream: send_socket obtained...\n");
+ }
+
+#if defined(TCP_CORK)
+ /* should this even be here?!? */
+ if (loc_tcpcork != 0) {
+ /* the user wishes for us to set TCP_CORK on the socket */
+ int one = 1;
+ if (setsockopt(send_socket,
+ getprotobyname("tcp")->p_proto,
+ TCP_CORK,
+ (char *)&one,
+ sizeof(one)) == SOCKET_ERROR) {
+ perror("netperf: sendfile_tcp_stream: tcp_cork");
+ exit(1);
+ }
+ if (debug) {
+ fprintf(where,"sendfile_tcp_stream: tcp_cork...\n");
+ }
+ }
+
+#endif /* TCP_CORK */
+
+ /* at this point, we have either retrieved the socket buffer sizes, */
+ /* or have tried to set them, so now, we may want to set the send */
+ /* size based on that (because the user either did not use a -m */
+ /* option, or used one with an argument of 0). If the socket buffer */
+ /* size is not available, we will set the send size to 4KB - no */
+ /* particular reason, just arbitrary... */
+
+ /*check for file size/ min file size here? create file here/ back out???*/
+
+ if (send_size == 0) {
+ if (lss_size > 0) {
+ send_size = lss_size;
+ }
+ else {
+ send_size = 4096;
+ }
+ }
+
+ /* set-up the data buffer ring with the requested alignment and
+ offset. note also that we have allocated a quantity of memory
+ that is at least one send-size greater than our socket buffer
+ size. We want to be sure that there are at least two buffers
+ allocated - this can be a bit of a problem when the send_size
+ is bigger than the socket size, so we must check... the user
+ may have wanted to explicitly set the "width" of our send
+ buffers, we should respect that wish... */
+
+ /*sendring -> an offset index that will shift the starting point of the*/
+ /*section of the file sent throughout the file*/
+
+ if (send_width == 0) {
+ send_width = (lss_size/send_size) + 1;
+ if (send_width == 1) send_width++;
+ }
+
+ if (send_ring == NULL) {
+
+ /* only allocate the send ring once. this is a networking test,
+ not a memory allocation test. this way, we do not need a
+ deallocate_buffer_ring() routine, and I don't feel like
+ writing one anyway :) raj 11/94 */
+
+ send_ring = alloc_sendfile_buf_ring(send_width,
+ send_size,
+ local_send_align,
+ local_send_offset);
+ }
+
+ /* If the user has requested cpu utilization measurements, we must
+ calibrate the cpu(s). We will perform this task within the
+ tests themselves. If the user has specified the cpu rate, then
+ calibrate_local_cpu will return rather quickly as it will have
+ nothing to do. If local_cpu_rate is zero, then we will go
+ through all the "normal" calibration stuff and return the rate
+ back. */
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ /* Tell the remote end to do a listen. The server alters the
+ socket paramters on the other side at this point, hence the
+ reason for all the values being passed in the setup
+ message. If the user did not specify any of the parameters,
+ they will be passed as 0, which will indicate to the remote
+ that no changes beyond the system's default should be
+ used. Alignment is the exception, it will default to 1, which
+ will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_TCP_STREAM;
+ tcp_stream_request->send_buf_size = rss_size_req;
+ tcp_stream_request->recv_buf_size = rsr_size_req;
+ tcp_stream_request->receive_size = recv_size;
+ tcp_stream_request->no_delay = rem_nodelay;
+ tcp_stream_request->recv_alignment = remote_recv_align;
+ tcp_stream_request->recv_offset = remote_recv_offset;
+ tcp_stream_request->measure_cpu = remote_cpu_usage;
+ tcp_stream_request->cpu_rate = remote_cpu_rate;
+
+ if (test_time) {
+ tcp_stream_request->test_length = test_time;
+ }
+ else {
+ tcp_stream_request->test_length = test_bytes;
+ }
+
+ tcp_stream_request->so_rcvavoid = rem_rcvavoid;
+ tcp_stream_request->so_sndavoid = rem_sndavoid;
+
+#ifdef DIRTY
+ tcp_stream_request->dirty_count = rem_dirty_count;
+ tcp_stream_request->clean_count = rem_clean_count;
+#endif /* DIRTY */
+ tcp_stream_request->port = atoi(remote_data_port);
+ tcp_stream_request->ipfamily = af_to_nf(remote_res->ai_family);
+
+ if (debug > 1) {
+ fprintf(where,
+ "netperf: send_tcp_stream: requesting TCP stream test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant
+ socket parameters for this test type. We will put them back
+ into the variables here so they can be displayed if desired.
+ The remote will have calibrated CPU if necessary, and will have
+ done all the needed set-up we will have calibrated the cpu
+ locally before sending the request, and will grab the counter
+ value right after the connect returns. The remote will grab the
+ counter right after the accept call. This saves the hassle of
+ extra messages being sent for the TCP tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote listen done.\n");
+ rsr_size = tcp_stream_response->recv_buf_size;
+ rss_size = tcp_stream_response->send_buf_size;
+ rem_nodelay = tcp_stream_response->no_delay;
+ remote_cpu_usage= tcp_stream_response->measure_cpu;
+ remote_cpu_rate = tcp_stream_response->cpu_rate;
+
+ /* we have to make sure that the server port number is in */
+ /* network order */
+ set_port_number(remote_res,(short)tcp_stream_response->data_port_number);
+ rem_rcvavoid = tcp_stream_response->so_rcvavoid;
+ rem_sndavoid = tcp_stream_response->so_sndavoid;
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+
+#ifdef WANT_DEMO
+ DEMO_STREAM_SETUP(lss_size,rsr_size)
+#endif
+
+ /*Connect up to the remote port on the data socket */
+ if (connect(send_socket,
+ remote_res->ai_addr,
+ remote_res->ai_addrlen) == INVALID_SOCKET){
+ perror("netperf: send_tcp_stream: data socket connect failed");
+ printf(" port: %d\n",ntohs(server.sin_port));
+ exit(1);
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either
+ the connect would have failed, or the previous response would
+ have indicated a problem. I failed to see the value of the
+ extra message after the accept on the remote. If it failed,
+ we'll see it here. If it didn't, we might as well start pumping
+ data. */
+
+ /* Set-up the test end conditions. For a stream test, they can be */
+ /* either time or byte-count based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ bytes_remaining = 0;
+
+ /* in previous revisions, we had the same code repeated throught
+ all the test suites. this was unnecessary, and meant more
+ work for me when I wanted to switch to POSIX signals, so I
+ have abstracted this out into a routine in netlib.c. if you
+ are experiencing signal problems, you might want to look
+ there. raj 11/94 */
+
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ bytes_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+#ifdef WANT_INTERVALS
+ INTERVALS_INIT();
+#endif /* WANT_INTERVALS */
+
+
+ /* before we start, initialize a few variables */
+
+#ifdef WANT_DEMO
+ if (demo_mode) {
+ HIST_timestamp(demo_one_ptr);
+ }
+#endif
+
+ /* We use an "OR" to control test execution. When the test is
+ controlled by time, the byte count check will always return
+ false. When the test is controlled by byte count, the time test
+ will always return false. When the test is finished, the whole
+ expression will go false and we will stop sending data. */
+
+ while ((!times_up) || (bytes_remaining > 0)) {
+
+ /* the sendfile_tcp_stream test does not support making the buffers
+ dirty. 08/2000 */
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ /* timestamp just before we go into sendfile() and then again
+ just after we come out raj 08/2000 */
+ /* but only if we are actually going to display a histogram */
+ HIST_timestamp(&time_one);
+ }
+#endif /* WANT_HISTOGRAM */
+
+ /* you can look at netlib.h for a description of the fields we
+ are passing to sendfile(). 08/2000 */
+#ifdef QUICK_SENDPATH
+ if ((len=sendpath(send_socket,
+ fill_file,
+ send_ring->offset,
+ send_ring->length,
+ send_ring->hdtrl,
+ send_ring->flags)) != send_size)
+#elif defined(__linux)
+ scratch_offset = send_ring->offset;
+ if ((len=sendfile(send_socket,
+ send_ring->fildes,
+ &scratch_offset, /* modified after the call! */
+ send_ring->length)) != send_size)
+#elif defined (__sun__)
+ /* We must call with SFV_NOWAIT and a large file size (>= 16MB) to
+ get zero-copy, as well as compiling with -D_LARGEFILE_SOURCE
+ -D_FILE_OFFSET_BITS=64 */
+ sv.sfv_fd = send_ring->fildes;
+ sv.sfv_flag = SFV_NOWAIT;
+ sv.sfv_off = send_ring->offset;
+ sv.sfv_len = send_ring->length;
+ if ((len = sendfilev(send_socket, &sv, 1, &scratch_len)) != send_size)
+#elif defined(__FreeBSD__)
+ /* so close to HP-UX and yet so far away... :) */
+ if ((sendfile(send_ring->fildes,
+ send_socket,
+ send_ring->offset,
+ send_ring->length,
+ NULL,
+ (off_t *)&len,
+ send_ring->flags) != 0) ||
+ (len != send_size))
+#elif defined(USE_OSX)
+ scratch_len = send_ring->length;
+ if ((sendfile(send_ring->fildes,
+ send_socket,
+ send_ring->offset,
+ (off_t *)&scratch_len,
+ NULL,
+ send_ring->flags) != 0) ||
+ (scratch_len != send_size))
+#else /* original sendile HP-UX */
+ if ((len=sendfile(send_socket,
+ send_ring->fildes,
+ send_ring->offset,
+ send_ring->length,
+ send_ring->hdtrl,
+ send_ring->flags)) != send_size)
+#endif /* QUICK_SENDPATH */
+ {
+ /* the test was interrupted, must be the end of test. the
+ send_tcp_stream code has some WIN32 ifdefs that we do not
+ need here. */
+ if ((len >=0) || SOCKET_EINTR(len)) {
+ break;
+ }
+ perror("netperf: data send error: sendfile");
+ fprintf(stderr,
+ "len was %d send_size was %d\n",
+ len,
+ send_size);
+ fflush(stderr);
+ exit(1);
+ }
+
+ /* offset += len;*/
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ /* timestamp the exit from the send call and update the
+ histogram */
+
+ HIST_timestamp(&time_two);
+ HIST_add(time_hist,delta_micro(&time_one,&time_two));
+ }
+#endif /* WANT_HISTOGRAM */
+
+#ifdef WANT_DEMO
+ DEMO_STREAM_INTERVAL(send_size);
+#endif
+
+#ifdef WANT_INTERVALS
+ INTERVALS_WAIT();
+#endif /* WANT_INTERVALS */
+
+ /* now we want to move our pointer to the next position in the */
+ /* data buffer...we may also want to wrap back to the "beginning" */
+ /* of the bufferspace, so we will mod the number of messages sent */
+ /* by the send width, and use that to calculate the offset to add */
+ /* to the base pointer. */
+
+ nummessages++;
+ send_ring = send_ring->next;
+ if (bytes_remaining) {
+ bytes_remaining -= send_size;
+ }
+ }
+
+ /* The test is over. Flush the buffers to the remote end. We do a
+ graceful release to insure that all data has been taken by the
+ remote. */
+
+ /* but first, if the verbosity is greater than 1, find-out what */
+ /* the TCP maximum segment_size was (if possible) */
+ if (verbosity > 1) {
+ tcp_mss = -1;
+ get_tcp_info(send_socket,&tcp_mss);
+ }
+
+ if (shutdown(send_socket,SHUT_WR) == SOCKET_ERROR) {
+ perror("netperf: cannot shutdown tcp stream socket");
+ exit(1);
+ }
+
+ /* hang a recv() off the socket to block until the remote has */
+ /* brought all the data up into the application. it will do a */
+ /* shutdown to cause a FIN to be sent our way. We will assume that */
+ /* any exit from the recv() call is good... raj 4/93 */
+
+ /* since we are using sendfile() instead of send, we have no
+ scratch buffer from the send_ring to use for the
+ receive. however, since we "know" that the recv should be
+ returning zero bytes (not that we are making the checks we
+ should) we can pass the address of the flags field. raj 08/2000
+ */
+
+ recv(send_socket,
+ &(send_ring->flags),
+ sizeof(send_ring->flags),
+ 0);
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being */
+ /* measured and how */
+ /* long did we really */
+ /* run? */
+
+ /* we are finished with the socket, so close it to prevent hitting */
+ /* the limit on maximum open files. */
+
+ close(send_socket);
+
+ /* Get the statistics from the remote end. The remote will have */
+ /* calculated service demand and all those interesting things. If it */
+ /* wasn't supposed to care, it will return obvious values. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+
+ /* We now calculate what our thruput was for the test. In the future, */
+ /* we may want to include a calculation of the thruput measured by */
+ /* the remote, but it should be the case that for a TCP stream test, */
+ /* that the two numbers should be *very* close... We calculate */
+ /* bytes_sent regardless of the way the test length was controlled. */
+ /* If it was time, we needed to, and if it was by bytes, the user may */
+ /* have specified a number of bytes that wasn't a multiple of the */
+ /* send_size, so we really didn't send what he asked for ;-) */
+
+ bytes_sent = ntohd(tcp_stream_result->bytes_received);
+
+ thruput = calc_thruput(bytes_sent);
+
+ if (local_cpu_usage || remote_cpu_usage) {
+
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+
+ local_cpu_utilization = calc_cpu_util(0.0);
+ local_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ }
+
+ if (remote_cpu_usage) {
+
+ remote_cpu_utilization = tcp_stream_result->cpu_util;
+ remote_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ remote_cpu_utilization,
+ tcp_stream_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+ }
+ else {
+ /* we were not measuring cpu, for the confidence stuff, we */
+ /* should make it -1.0 */
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ /* at this point, we want to calculate the confidence information. */
+ /* if debugging is on, calculate_confidence will print-out the */
+ /* parameters we pass it */
+
+ calculate_confidence(confidence_iteration,
+ elapsed_time,
+ thruput,
+ local_cpu_utilization,
+ remote_cpu_utilization,
+ local_service_demand,
+ remote_service_demand);
+
+ confidence_iteration++;
+ }
+
+ /* at this point, we have finished making all the runs that we */
+ /* will be making. so, we should extract what the calcuated values */
+ /* are for all the confidence stuff. we could make the values */
+ /* global, but that seemed a little messy, and it did not seem worth */
+ /* all the mucking with header files. so, we create a routine much */
+ /* like calcualte_confidence, which just returns the mean values. */
+ /* raj 11/94 */
+
+ retrieve_confident_values(&elapsed_time,
+ &thruput,
+ &local_cpu_utilization,
+ &remote_cpu_utilization,
+ &local_service_demand,
+ &remote_service_demand);
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ if (confidence < 0) {
+ /* we did not hit confidence, but were we asked to look for it? */
+ if (iteration_max > 1) {
+ display_confidence();
+ }
+ }
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ local_cpu_method = format_cpu_method(cpu_method);
+ remote_cpu_method = format_cpu_method(tcp_stream_result->cpu_method);
+
+ switch (verbosity) {
+ case 0:
+
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand,
+ local_cpu_method);
+ }
+
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand,
+ remote_cpu_method);
+ }
+
+ break;
+
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,
+ cpu_title,
+ format_units(),
+ local_cpu_method,
+ remote_cpu_method);
+ }
+
+ fprintf(where,
+ cpu_fmt_1, /* the format string */
+ rsr_size, /* remote recvbuf size */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long was the test */
+ thruput, /* what was the xfer rate */
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand); /* remote service demand */
+ break;
+ }
+
+ }
+
+ else {
+ /* The tester did not wish to measure service demand. */
+
+ switch (verbosity) {
+
+ case 0:
+
+ fprintf(where,
+ tput_fmt_0,
+ thruput);
+ break;
+
+ case 1:
+ case 2:
+
+ if (print_headers) {
+ fprintf(where,tput_title,format_units());
+ }
+
+ fprintf(where,
+ tput_fmt_1, /* the format string */
+ rsr_size, /* remote recvbuf size */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long did it take */
+ thruput);/* how fast did it go */
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ if (verbosity > 1) {
+
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* TCP statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ /* this stuff needs to be worked-out in the presence of confidence */
+ /* intervals and multiple iterations of the test... raj 11/94 */
+
+ fprintf(where,
+ ksink_fmt,
+ "Bytes",
+ "Bytes",
+ "Bytes",
+ local_send_align,
+ remote_recv_align,
+ local_send_offset,
+ remote_recv_offset,
+ bytes_sent,
+ bytes_sent / (double)nummessages,
+ nummessages,
+ bytes_sent / (double)tcp_stream_result->recv_calls,
+ tcp_stream_result->recv_calls);
+
+ fprintf(where,
+ ksink_fmt2,
+ tcp_mss);
+
+ fflush(where);
+
+#ifdef WANT_HISTOGRAM
+
+ fprintf(where,"\n\nHistogram of time spent in send() call.\n");
+ fflush(where);
+ HIST_report(time_hist);
+#endif /* WANT_HISTOGRAM */
+ }
+}
+
+#endif /* HAVE_SENDFILE */
+
+/* This is the server-side routine for the tcp stream test. It is */
+/* implemented as one routine. I could break things-out somewhat, but */
+/* didn't feel it was necessary. */
+
+void
+recv_tcp_stream()
+{
+
+ struct sockaddr_storage myaddr_in, peeraddr_in;
+ SOCKET s_listen,s_data;
+ netperf_socklen_t addrlen;
+ int len;
+ unsigned int receive_calls;
+ float elapsed_time;
+ double bytes_received;
+
+ struct ring_elt *recv_ring;
+
+ struct addrinfo *local_res;
+ char local_name[BUFSIZ];
+ char port_buffer[PORTBUFSIZE];
+
+#ifdef DO_SELECT
+ fd_set readfds;
+ struct timeval timeout;
+#endif /* DO_SELECT */
+
+ struct tcp_stream_request_struct *tcp_stream_request;
+ struct tcp_stream_response_struct *tcp_stream_response;
+ struct tcp_stream_results_struct *tcp_stream_results;
+
+#ifdef DO_SELECT
+ FD_ZERO(&readfds);
+ timeout.tv_sec = 1;
+ timeout.tv_usec = 0;
+#endif /* DO_SELECT */
+
+ tcp_stream_request =
+ (struct tcp_stream_request_struct *)netperf_request.content.test_specific_data;
+ tcp_stream_response =
+ (struct tcp_stream_response_struct *)netperf_response.content.test_specific_data;
+ tcp_stream_results =
+ (struct tcp_stream_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_tcp_stream: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_tcp_stream: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = TCP_STREAM_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_tcp_stream: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* We now alter the message_ptr variable to be at the desired */
+ /* alignment with the desired offset. */
+
+ if (debug) {
+ fprintf(where,"recv_tcp_stream: requested alignment of %d\n",
+ tcp_stream_request->recv_alignment);
+ fflush(where);
+ }
+
+ /* create_data_socket expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lss_size_req = tcp_stream_request->send_buf_size;
+ lsr_size_req = tcp_stream_request->recv_buf_size;
+ loc_nodelay = tcp_stream_request->no_delay;
+ loc_rcvavoid = tcp_stream_request->so_rcvavoid;
+ loc_sndavoid = tcp_stream_request->so_sndavoid;
+
+ set_hostname_and_port(local_name,
+ port_buffer,
+ nf_to_af(tcp_stream_request->ipfamily),
+ tcp_stream_request->port);
+
+ local_res = complete_addrinfo(local_name,
+ local_name,
+ port_buffer,
+ nf_to_af(tcp_stream_request->ipfamily),
+ SOCK_STREAM,
+ IPPROTO_TCP,
+ 0);
+
+ s_listen = create_data_socket(local_res);
+
+ if (s_listen == INVALID_SOCKET) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+#ifdef WIN32
+ /* The test timer can fire during operations on the listening socket,
+ so to make the start_timer below work we have to move
+ it to close s_listen while we are blocked on accept. */
+ win_kludge_socket2 = s_listen;
+#endif
+
+ /* what sort of sizes did we end-up with? */
+ if (tcp_stream_request->receive_size == 0) {
+ if (lsr_size > 0) {
+ recv_size = lsr_size;
+ }
+ else {
+ recv_size = 4096;
+ }
+ }
+ else {
+ recv_size = tcp_stream_request->receive_size;
+ }
+
+ /* we want to set-up our recv_ring in a manner analagous to what we */
+ /* do on the sending side. this is more for the sake of symmetry */
+ /* than for the needs of say copy avoidance, but it might also be */
+ /* more realistic - this way one could conceivably go with a */
+ /* double-buffering scheme when taking the data an putting it into */
+ /* the filesystem or something like that. raj 7/94 */
+
+ if (recv_width == 0) {
+ recv_width = (lsr_size/recv_size) + 1;
+ if (recv_width == 1) recv_width++;
+ }
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ recv_size,
+ tcp_stream_request->recv_alignment,
+ tcp_stream_request->recv_offset);
+
+ if (debug) {
+ fprintf(where,"recv_tcp_stream: receive alignment and offset set...\n");
+ fflush(where);
+ }
+
+ /* Now, let's set-up the socket to listen for connections */
+ if (listen(s_listen, 5) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+
+ /* now get the port number assigned by the system */
+ addrlen = sizeof(myaddr_in);
+ if (getsockname(s_listen,
+ (struct sockaddr *)&myaddr_in,
+ &addrlen) == SOCKET_ERROR){
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+ /* Now myaddr_in contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ tcp_stream_response->data_port_number =
+ (int) ntohs(((struct sockaddr_in *)&myaddr_in)->sin_port);
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a -1 to */
+ /* the initiator. */
+
+ tcp_stream_response->cpu_rate = (float)0.0; /* assume no cpu */
+ if (tcp_stream_request->measure_cpu) {
+ tcp_stream_response->measure_cpu = 1;
+ tcp_stream_response->cpu_rate =
+ calibrate_local_cpu(tcp_stream_request->cpu_rate);
+ }
+ else {
+ tcp_stream_response->measure_cpu = 0;
+ }
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ tcp_stream_response->send_buf_size = lss_size;
+ tcp_stream_response->recv_buf_size = lsr_size;
+ tcp_stream_response->no_delay = loc_nodelay;
+ tcp_stream_response->so_rcvavoid = loc_rcvavoid;
+ tcp_stream_response->so_sndavoid = loc_sndavoid;
+ tcp_stream_response->receive_size = recv_size;
+
+ send_response();
+
+ addrlen = sizeof(peeraddr_in);
+
+ if ((s_data=accept(s_listen,
+ (struct sockaddr *)&peeraddr_in,
+ &addrlen)) == INVALID_SOCKET) {
+ /* Let's just punt. The remote will be given some information */
+ close(s_listen);
+ exit(1);
+ }
+
+#ifdef KLUDGE_SOCKET_OPTIONS
+ /* this is for those systems which *INCORRECTLY* fail to pass */
+ /* attributes across an accept() call. Including this goes against */
+ /* my better judgement :( raj 11/95 */
+
+ kludge_socket_options(s_data);
+
+#endif /* KLUDGE_SOCKET_OPTIONS */
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(tcp_stream_request->measure_cpu);
+
+ /* The loop will exit when the sender does a shutdown, which will */
+ /* return a length of zero */
+
+ /* there used to be an #ifdef DIRTY call to access_buffer() here,
+ but we have switched from accessing the buffer before the recv()
+ call to accessing the buffer after the recv() call. The
+ accessing before was, IIRC, related to having dirty data when
+ doing page-flipping copy avoidance. */
+
+ bytes_received = 0;
+ receive_calls = 0;
+
+ while ((len = recv(s_data, recv_ring->buffer_ptr, recv_size, 0)) != 0) {
+ if (len == SOCKET_ERROR )
+ {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+ bytes_received += len;
+ receive_calls++;
+
+#ifdef DIRTY
+ /* we access the buffer after the recv() call now, rather than before */
+ access_buffer(recv_ring->buffer_ptr,
+ recv_size,
+ tcp_stream_request->dirty_count,
+ tcp_stream_request->clean_count);
+#endif /* DIRTY */
+
+
+ /* move to the next buffer in the recv_ring */
+ recv_ring = recv_ring->next;
+
+#ifdef PAUSE
+ sleep(1);
+#endif /* PAUSE */
+
+#ifdef DO_SELECT
+ FD_SET(s_data,&readfds);
+ select(s_data+1,&readfds,NULL,NULL,&timeout);
+#endif /* DO_SELECT */
+
+ }
+
+ /* perform a shutdown to signal the sender that */
+ /* we have received all the data sent. raj 4/93 */
+
+ if (shutdown(s_data,SHUT_WR) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ cpu_stop(tcp_stream_request->measure_cpu,&elapsed_time);
+
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_tcp_stream: got %g bytes\n",
+ bytes_received);
+ fprintf(where,
+ "recv_tcp_stream: got %d recvs\n",
+ receive_calls);
+ fflush(where);
+ }
+
+ tcp_stream_results->bytes_received = htond(bytes_received);
+ tcp_stream_results->elapsed_time = elapsed_time;
+ tcp_stream_results->recv_calls = receive_calls;
+
+ tcp_stream_results->cpu_method = cpu_method;
+ tcp_stream_results->num_cpus = lib_num_loc_cpus;
+
+ if (tcp_stream_request->measure_cpu) {
+ tcp_stream_results->cpu_util = calc_cpu_util(0.0);
+ };
+
+ if (debug) {
+ fprintf(where,
+ "recv_tcp_stream: test complete, sending results.\n");
+ fprintf(where,
+ " bytes_received %g receive_calls %d\n",
+ bytes_received,
+ receive_calls);
+ fprintf(where,
+ " len %d\n",
+ len);
+ fflush(where);
+ }
+
+ send_response();
+
+ /* we are now done with the sockets */
+ close(s_data);
+ close(s_listen);
+
+ }
+
+/* This is the server-side routine for the tcp maerts test. It is
+ implemented as one routine. I could break things-out somewhat, but
+ didn't feel it was necessary. */
+
+void
+recv_tcp_maerts()
+{
+
+ struct sockaddr_storage myaddr_in, peeraddr_in;
+ struct addrinfo *local_res;
+ char local_name[BUFSIZ];
+ char port_buffer[PORTBUFSIZE];
+
+ SOCKET s_listen,s_data;
+ netperf_socklen_t addrlen;
+ int len;
+ unsigned int send_calls;
+ float elapsed_time;
+ double bytes_sent = 0.0 ;
+
+ struct ring_elt *send_ring;
+
+ struct tcp_maerts_request_struct *tcp_maerts_request;
+ struct tcp_maerts_response_struct *tcp_maerts_response;
+ struct tcp_maerts_results_struct *tcp_maerts_results;
+
+ tcp_maerts_request =
+ (struct tcp_maerts_request_struct *)netperf_request.content.test_specific_data;
+ tcp_maerts_response =
+ (struct tcp_maerts_response_struct *)netperf_response.content.test_specific_data;
+ tcp_maerts_results =
+ (struct tcp_maerts_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_tcp_maerts: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired
+ parameters and then let the initiator know that all is ready. If
+ socket size defaults are to be used, then the initiator will have
+ sent us 0's. If the socket sizes cannot be changed, then we will
+ send-back what they are. If that information cannot be
+ determined, then we send-back -1's for the sizes. If things go
+ wrong for any reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It
+ would be best if the error that the remote reports to the user is
+ the actual error we encountered, rather than some bogus
+ unexpected response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_tcp_maerts: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = TCP_MAERTS_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_tcp_maerts: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* We now alter the message_ptr variable to be at the desired */
+ /* alignment with the desired offset. */
+
+ if (debug) {
+ fprintf(where,"recv_tcp_maerts: requested alignment of %d\n",
+ tcp_maerts_request->send_alignment);
+ fflush(where);
+ }
+
+ /* Grab a socket to listen on, and then listen on it. */
+
+ if (debug) {
+ fprintf(where,"recv_tcp_maerts: grabbing a socket...\n");
+ fflush(where);
+ }
+
+ /* create_data_socket expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lss_size_req = tcp_maerts_request->send_buf_size;
+ lsr_size_req = tcp_maerts_request->recv_buf_size;
+ loc_nodelay = tcp_maerts_request->no_delay;
+ loc_rcvavoid = tcp_maerts_request->so_rcvavoid;
+ loc_sndavoid = tcp_maerts_request->so_sndavoid;
+
+ set_hostname_and_port(local_name,
+ port_buffer,
+ nf_to_af(tcp_maerts_request->ipfamily),
+ tcp_maerts_request->port);
+
+ local_res = complete_addrinfo(local_name,
+ local_name,
+ port_buffer,
+ nf_to_af(tcp_maerts_request->ipfamily),
+ SOCK_STREAM,
+ IPPROTO_TCP,
+ 0);
+
+ s_listen = create_data_socket(local_res);
+
+ if (s_listen == INVALID_SOCKET) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+#ifdef WIN32
+ /* The test timer can fire during operations on the listening socket,
+ so to make the start_timer below work we have to move
+ it to close s_listen while we are blocked on accept. */
+ win_kludge_socket2 = s_listen;
+#endif
+
+
+ /* what sort of sizes did we end-up with? */
+ if (tcp_maerts_request->send_size == 0) {
+ if (lss_size > 0) {
+ send_size = lss_size;
+ }
+ else {
+ send_size = 4096;
+ }
+ }
+ else {
+ send_size = tcp_maerts_request->send_size;
+ }
+
+ /* we want to set-up our recv_ring in a manner analagous to what we */
+ /* do on the recving side. this is more for the sake of symmetry */
+ /* than for the needs of say copy avoidance, but it might also be */
+ /* more realistic - this way one could conceivably go with a */
+ /* double-buffering scheme when taking the data an putting it into */
+ /* the filesystem or something like that. raj 7/94 */
+
+ if (send_width == 0) {
+ send_width = (lsr_size/send_size) + 1;
+ if (send_width == 1) send_width++;
+ }
+
+ send_ring = allocate_buffer_ring(send_width,
+ send_size,
+ tcp_maerts_request->send_alignment,
+ tcp_maerts_request->send_offset);
+
+ if (debug) {
+ fprintf(where,"recv_tcp_maerts: receive alignment and offset set...\n");
+ fflush(where);
+ }
+
+ /* Now, let's set-up the socket to listen for connections */
+ if (listen(s_listen, 5) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+
+ /* now get the port number assigned by the system */
+ addrlen = sizeof(myaddr_in);
+ if (getsockname(s_listen,
+ (struct sockaddr *)&myaddr_in,
+ &addrlen) == SOCKET_ERROR){
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+ /* Now myaddr_in contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ tcp_maerts_response->data_port_number =
+ (int) ntohs(((struct sockaddr_in *)&myaddr_in)->sin_port);
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a -1 to */
+ /* the initiator. */
+
+ tcp_maerts_response->cpu_rate = (float)0.0; /* assume no cpu */
+ if (tcp_maerts_request->measure_cpu) {
+ tcp_maerts_response->measure_cpu = 1;
+ tcp_maerts_response->cpu_rate =
+ calibrate_local_cpu(tcp_maerts_request->cpu_rate);
+ }
+ else {
+ tcp_maerts_response->measure_cpu = 0;
+ }
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ tcp_maerts_response->send_buf_size = lss_size;
+ tcp_maerts_response->recv_buf_size = lsr_size;
+ tcp_maerts_response->no_delay = loc_nodelay;
+ tcp_maerts_response->so_rcvavoid = loc_rcvavoid;
+ tcp_maerts_response->so_sndavoid = loc_sndavoid;
+ tcp_maerts_response->send_size = send_size;
+
+ send_response();
+
+ addrlen = sizeof(peeraddr_in);
+
+ /* we will start the timer before the accept() to be somewhat
+ analagous to the starting of the timer before the connect() call
+ in the TCP_STREAM test. raj 2002-06-21 */
+
+ start_timer(tcp_maerts_request->test_length);
+
+ /* Now it's time to start receiving data on the connection. We will
+ first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(tcp_maerts_request->measure_cpu);
+
+
+ if ((s_data=accept(s_listen,
+ (struct sockaddr *)&peeraddr_in,
+ &addrlen)) == INVALID_SOCKET) {
+ /* Let's just punt. The remote will be given some information */
+ close(s_listen);
+ exit(1);
+ }
+
+#ifdef KLUDGE_SOCKET_OPTIONS
+
+ /* this is for those systems which *INCORRECTLY* fail to pass
+ attributes across an accept() call. Including this goes against
+ my better judgement :( raj 11/95 */
+
+ kludge_socket_options(s_data);
+
+#endif /* KLUDGE_SOCKET_OPTIONS */
+
+ /* The loop will exit when the sender does a shutdown, which will */
+ /* return a length of zero */
+
+ bytes_sent = 0.0;
+ send_calls = 0;
+
+ len = 0; /* nt-lint; len is not initialized (printf far below) if
+ times_up initially true.*/
+ times_up = 0; /* must remember to initialize this little beauty */
+ while (!times_up) {
+
+#ifdef DIRTY
+ /* we want to dirty some number of consecutive integers in the buffer */
+ /* we are about to send. we may also want to bring some number of */
+ /* them cleanly into the cache. The clean ones will follow any dirty */
+ /* ones into the cache. */
+
+ access_buffer(send_ring->buffer_ptr,
+ send_size,
+ tcp_maerts_request->dirty_count,
+ tcp_maerts_request->clean_count);
+
+#endif /* DIRTY */
+
+ if((len=send(s_data,
+ send_ring->buffer_ptr,
+ send_size,
+ 0)) != send_size) {
+ if ((len >=0) || SOCKET_EINTR(len)) {
+ /* the test was interrupted, must be the end of test */
+ break;
+ }
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ bytes_sent += len;
+ send_calls++;
+
+ /* more to the next buffer in the send_ring */
+ send_ring = send_ring->next;
+
+ }
+
+ /* perform a shutdown to signal the sender that */
+ /* we have received all the data sent. raj 4/93 */
+
+ if (shutdown(s_data,SHUT_WR) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ /* hang a recv() off the socket to block until the remote has
+ brought all the data up into the application. it will do a
+ shutdown to cause a FIN to be sent our way. We will assume that
+ any exit from the recv() call is good... raj 4/93 */
+
+ recv(s_data, send_ring->buffer_ptr, send_size, 0);
+
+
+ cpu_stop(tcp_maerts_request->measure_cpu,&elapsed_time);
+
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_tcp_maerts: got %g bytes\n",
+ bytes_sent);
+ fprintf(where,
+ "recv_tcp_maerts: got %d sends\n",
+ send_calls);
+ fflush(where);
+ }
+
+ tcp_maerts_results->bytes_sent = htond(bytes_sent);
+ tcp_maerts_results->elapsed_time = elapsed_time;
+ tcp_maerts_results->send_calls = send_calls;
+
+ if (tcp_maerts_request->measure_cpu) {
+ tcp_maerts_results->cpu_util = calc_cpu_util(0.0);
+ };
+
+ if (debug) {
+ fprintf(where,
+ "recv_tcp_maerts: test complete, sending results.\n");
+ fprintf(where,
+ " bytes_sent %g send_calls %d\n",
+ bytes_sent,
+ send_calls);
+ fprintf(where,
+ " len %d\n",
+ len);
+ fflush(where);
+ }
+
+ tcp_maerts_results->cpu_method = cpu_method;
+ tcp_maerts_results->num_cpus = lib_num_loc_cpus;
+ send_response();
+
+ /* we are now done with the sockets */
+ close(s_data);
+ close(s_listen);
+
+ }
+
+
+ /* this routine implements the sending (netperf) side of the TCP_RR */
+ /* test. */
+
+void
+send_tcp_rr(char remote_host[])
+{
+
+ char *tput_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans.\n\
+Send Recv Size Size Time Rate \n\
+bytes Bytes bytes bytes secs. per sec \n\n";
+
+ char *tput_title_band = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed \n\
+Send Recv Size Size Time Throughput \n\
+bytes Bytes bytes bytes secs. %s/sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f %s\n";
+
+ char *tput_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %7.2f %s\n";
+ char *tput_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *cpu_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem\n\
+Send Recv Size Size Time Rate local remote local remote\n\
+bytes bytes bytes bytes secs. per sec %% %c %% %c us/Tr us/Tr\n\n";
+
+ char *cpu_title_tput = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Tput CPU CPU S.dem S.dem\n\
+Send Recv Size Size Time %-8.8s local remote local remote\n\
+bytes bytes bytes bytes secs. per sec %% %c %% %c us/Tr us/Tr\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f %c %s\n";
+
+ char *cpu_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %-6.2f %-6.2f %-6.2f %-6.3f %-6.3f %s\n";
+
+ char *cpu_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *ksink_fmt = "\
+Alignment Offset RoundTrip Trans Throughput\n\
+Local Remote Local Remote Latency Rate %-8.8s/s\n\
+Send Recv Send Recv usec/Tran per sec Outbound Inbound\n\
+%5d %5d %5d %5d %-6.3f %-6.3f %-6.3f %-6.3f\n";
+
+
+ int timed_out = 0;
+ float elapsed_time;
+
+ int len;
+ char *temp_message_ptr;
+ int nummessages;
+ SOCKET send_socket;
+ int trans_remaining;
+ double bytes_xferd;
+
+ struct ring_elt *send_ring;
+ struct ring_elt *recv_ring;
+
+ int rsp_bytes_left;
+ int rsp_bytes_recvd;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+ double thruput;
+
+ struct addrinfo *local_res;
+ struct addrinfo *remote_res;
+
+ struct tcp_rr_request_struct *tcp_rr_request;
+ struct tcp_rr_response_struct *tcp_rr_response;
+ struct tcp_rr_results_struct *tcp_rr_result;
+
+#ifdef WANT_FIRST_BURST
+#define REQUEST_CWND_INITIAL 2
+ /* "in the beginning..." the WANT_FIRST_BURST stuff was like both
+ Unix and the state of New Jersey - both were simple an unspoiled.
+ then it was realized that some stacks are quite picky about
+ initial congestion windows and a non-trivial initial burst of
+ requests would not be individual segments even with TCP_NODELAY
+ set. so, we have to start tracking a poor-man's congestion window
+ up here in window space because we want to try to make something
+ happen that frankly, we cannot guarantee with the specification
+ of TCP. ain't that grand?-) raj 2006-01-30 */
+ int requests_outstanding = 0;
+ int request_cwnd = REQUEST_CWND_INITIAL; /* we ass-u-me that having
+ three requests
+ outstanding at the
+ beginning of the test
+ is ok with TCP stacks
+ of interest. the first
+ two will come from our
+ first_burst loop, and
+ the third from our
+ regularly scheduled
+ send */
+#endif
+
+ tcp_rr_request =
+ (struct tcp_rr_request_struct *)netperf_request.content.test_specific_data;
+ tcp_rr_response=
+ (struct tcp_rr_response_struct *)netperf_response.content.test_specific_data;
+ tcp_rr_result =
+ (struct tcp_rr_results_struct *)netperf_response.content.test_specific_data;
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ time_hist = HIST_new();
+ }
+#endif /* WANT_HISTOGRAM */
+
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ complete_addrinfos(&remote_res,
+ &local_res,
+ remote_host,
+ SOCK_STREAM,
+ IPPROTO_TCP,
+ 0);
+
+ if ( print_headers ) {
+ print_top_test_header("TCP REQUEST/RESPONSE TEST",local_res,remote_res);
+ }
+
+ /* initialize a few counters */
+
+ send_ring = NULL;
+ recv_ring = NULL;
+ confidence_iteration = 1;
+ init_stat();
+
+ /* we have a great-big while loop which controls the number of times */
+ /* we run a particular test. this is for the calculation of a */
+ /* confidence interval (I really should have stayed awake during */
+ /* probstats :). If the user did not request confidence measurement */
+ /* (no confidence is the default) then we will only go though the */
+ /* loop once. the confidence stuff originates from the folks at IBM */
+
+ while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
+ (confidence_iteration <= iteration_min)) {
+
+ /* initialize a few counters. we have to remember that we might be */
+ /* going through the loop more than once. */
+
+ nummessages = 0;
+ bytes_xferd = 0.0;
+ times_up = 0;
+ timed_out = 0;
+ trans_remaining = 0;
+
+#ifdef WANT_FIRST_BURST
+ /* we have to remember to reset the number of transactions
+ outstanding and the "congestion window for each new
+ iteration. raj 2006-01-31 */
+ requests_outstanding = 0;
+ request_cwnd = REQUEST_CWND_INITIAL;
+#endif
+
+
+ /* set-up the data buffers with the requested alignment and offset. */
+ /* since this is a request/response test, default the send_width and */
+ /* recv_width to 1 and not two raj 7/94 */
+
+ if (send_width == 0) send_width = 1;
+ if (recv_width == 0) recv_width = 1;
+
+ if (send_ring == NULL) {
+ send_ring = allocate_buffer_ring(send_width,
+ req_size,
+ local_send_align,
+ local_send_offset);
+ }
+
+ if (recv_ring == NULL) {
+ recv_ring = allocate_buffer_ring(recv_width,
+ rsp_size,
+ local_recv_align,
+ local_recv_offset);
+ }
+
+ /*set up the data socket */
+ send_socket = create_data_socket(local_res);
+
+ if (send_socket == INVALID_SOCKET){
+ perror("netperf: send_tcp_rr: tcp stream data socket");
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"send_tcp_rr: send_socket obtained...\n");
+ }
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back.*/
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ if (!no_control) {
+ /* Tell the remote end to do a listen. The server alters the
+ socket paramters on the other side at this point, hence the
+ reason for all the values being passed in the setup
+ message. If the user did not specify any of the parameters,
+ they will be passed as 0, which will indicate to the remote
+ that no changes beyond the system's default should be
+ used. Alignment is the exception, it will default to 8, which
+ will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_TCP_RR;
+ tcp_rr_request->recv_buf_size = rsr_size_req;
+ tcp_rr_request->send_buf_size = rss_size_req;
+ tcp_rr_request->recv_alignment = remote_recv_align;
+ tcp_rr_request->recv_offset = remote_recv_offset;
+ tcp_rr_request->send_alignment = remote_send_align;
+ tcp_rr_request->send_offset = remote_send_offset;
+ tcp_rr_request->request_size = req_size;
+ tcp_rr_request->response_size = rsp_size;
+ tcp_rr_request->no_delay = rem_nodelay;
+ tcp_rr_request->measure_cpu = remote_cpu_usage;
+ tcp_rr_request->cpu_rate = remote_cpu_rate;
+ tcp_rr_request->so_rcvavoid = rem_rcvavoid;
+ tcp_rr_request->so_sndavoid = rem_sndavoid;
+ if (test_time) {
+ tcp_rr_request->test_length = test_time;
+ }
+ else {
+ tcp_rr_request->test_length = test_trans * -1;
+ }
+ tcp_rr_request->port = atoi(remote_data_port);
+ tcp_rr_request->ipfamily = af_to_nf(remote_res->ai_family);
+
+ if (debug > 1) {
+ fprintf(where,"netperf: send_tcp_rr: requesting TCP rr test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant
+ socket parameters for this test type. We will put them back
+ into the variables here so they can be displayed if desired.
+ The remote will have calibrated CPU if necessary, and will
+ have done all the needed set-up we will have calibrated the
+ cpu locally before sending the request, and will grab the
+ counter value right after the connect returns. The remote
+ will grab the counter right after the accept call. This saves
+ the hassle of extra messages being sent for the TCP
+ tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote listen done.\n");
+ rsr_size = tcp_rr_response->recv_buf_size;
+ rss_size = tcp_rr_response->send_buf_size;
+ rem_nodelay = tcp_rr_response->no_delay;
+ remote_cpu_usage = tcp_rr_response->measure_cpu;
+ remote_cpu_rate = tcp_rr_response->cpu_rate;
+ /* make sure that port numbers are in network order */
+ set_port_number(remote_res,(short)tcp_rr_response->data_port_number);
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+ }
+
+#ifdef WANT_DEMO
+ DEMO_RR_SETUP(1000)
+#endif
+
+ /*Connect up to the remote port on the data socket */
+ if (connect(send_socket,
+ remote_res->ai_addr,
+ remote_res->ai_addrlen) == INVALID_SOCKET){
+ perror("netperf: data socket connect failed");
+
+ exit(1);
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either the */
+ /* connect would have failed, or the previous response would have */
+ /* indicated a problem. I failed to see the value of the extra */
+ /* message after the accept on the remote. If it failed, we'll see it */
+ /* here. If it didn't, we might as well start pumping data. */
+
+ /* Set-up the test end conditions. For a request/response test, they */
+ /* can be either time or transaction based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ trans_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+#ifdef WANT_INTERVALS
+ INTERVALS_INIT();
+#endif /* WANT_INTERVALS */
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return false. */
+ /* When the test is controlled by byte count, the time test will */
+ /* always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. I think I */
+ /* just arbitrarily decrement trans_remaining for the timed test, but */
+ /* will not do that just yet... One other question is whether or not */
+ /* the send buffer and the receive buffer should be the same buffer. */
+
+#ifdef WANT_DEMO
+ if (demo_mode) {
+ HIST_timestamp(demo_one_ptr);
+ }
+#endif
+
+ while ((!times_up) || (trans_remaining > 0)) {
+ /* send the request. we assume that if we use a blocking socket, */
+ /* the request will be sent at one shot. */
+
+#ifdef WANT_FIRST_BURST
+ /* we can inject no more than request_cwnd, which will grow with
+ time, and no more than first_burst_size. we don't use <= to
+ account for the "regularly scheduled" send call. of course
+ that makes it more a "max_outstanding_ than a
+ "first_burst_size" but for now we won't fix the names. also,
+ I suspect the extra check against < first_burst_size is
+ redundant since later I expect to make sure that request_cwnd
+ can never get larger than first_burst_size, but just at the
+ moment I'm feeling like a belt and suspenders kind of
+ programmer. raj 2006-01-30 */
+ while ((first_burst_size > 0) &&
+ (requests_outstanding < request_cwnd) &&
+ (requests_outstanding < first_burst_size)) {
+ if (debug) {
+ fprintf(where,
+ "injecting, req_outstndng %d req_cwnd %d burst %d\n",
+ requests_outstanding,
+ request_cwnd,
+ first_burst_size);
+ }
+ if ((len = send(send_socket,
+ send_ring->buffer_ptr,
+ req_size,
+ 0)) != req_size) {
+ /* we should never hit the end of the test in the first burst */
+ perror("send_tcp_rr: initial burst data send error");
+ exit(-1);
+ }
+ requests_outstanding += 1;
+ }
+
+#endif /* WANT_FIRST_BURST */
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ /* timestamp just before our call to send, and then again just
+ after the receive raj 8/94 */
+ /* but only if we are actually going to display one. raj
+ 2007-02-07 */
+
+ HIST_timestamp(&time_one);
+ }
+#endif /* WANT_HISTOGRAM */
+
+ if ((len = send(send_socket,
+ send_ring->buffer_ptr,
+ req_size,
+ 0)) != req_size) {
+ if (SOCKET_EINTR(len) || (errno == 0)) {
+ /* we hit the end of a */
+ /* timed test. */
+ timed_out = 1;
+ break;
+ }
+ perror("send_tcp_rr: data send error");
+ exit(1);
+ }
+ send_ring = send_ring->next;
+
+#ifdef WANT_FIRST_BURST
+ requests_outstanding += 1;
+#endif
+
+ /* receive the response */
+ rsp_bytes_left = rsp_size;
+ temp_message_ptr = recv_ring->buffer_ptr;
+ while(rsp_bytes_left > 0) {
+ if((rsp_bytes_recvd=recv(send_socket,
+ temp_message_ptr,
+ rsp_bytes_left,
+ 0)) == SOCKET_ERROR) {
+ if ( SOCKET_EINTR(rsp_bytes_recvd) ) {
+ /* We hit the end of a timed test. */
+ timed_out = 1;
+ break;
+ }
+ perror("send_tcp_rr: data recv error");
+ exit(1);
+ }
+ rsp_bytes_left -= rsp_bytes_recvd;
+ temp_message_ptr += rsp_bytes_recvd;
+ }
+ recv_ring = recv_ring->next;
+
+#ifdef WANT_FIRST_BURST
+ /* so, since we've gotten a response back, update the
+ bookkeeping accordingly. there is one less request
+ outstanding and we can put one more out there than before. */
+ requests_outstanding -= 1;
+ if (request_cwnd < first_burst_size) {
+ request_cwnd += 1;
+ if (debug) {
+ fprintf(where,
+ "incr req_cwnd to %d first_burst %d reqs_outstndng %d\n",
+ request_cwnd,
+ first_burst_size,
+ requests_outstanding);
+ }
+ }
+#endif
+ if (timed_out) {
+ /* we may have been in a nested while loop - we need */
+ /* another call to break. */
+ break;
+ }
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ HIST_timestamp(&time_two);
+ HIST_add(time_hist,delta_micro(&time_one,&time_two));
+ }
+#endif /* WANT_HISTOGRAM */
+
+#ifdef WANT_DEMO
+ DEMO_RR_INTERVAL(1);
+#endif
+
+#ifdef WANT_INTERVALS
+ INTERVALS_WAIT();
+#endif /* WANT_INTERVALS */
+
+ nummessages++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug > 3) {
+ if ((nummessages % 100) == 0) {
+ fprintf(where,
+ "Transaction %d completed\n",
+ nummessages);
+ fflush(where);
+ }
+ }
+ }
+
+ /* At this point we used to call shutdown on the data socket to be
+ sure all the data was delivered, but this was not germane in a
+ request/response test, and it was causing the tests to "hang"
+ when they were being controlled by time. So, I have replaced
+ this shutdown call with a call to close that can be found later
+ in the procedure. */
+
+ /* this call will always give us the elapsed time for the test,
+ and will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being */
+ /* measured? how long */
+ /* did we really run? */
+
+ if (!no_control) {
+ /* Get the statistics from the remote end. The remote will have
+ calculated CPU utilization. If it wasn't supposed to care, it
+ will return obvious values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,"netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+ exit(1);
+ }
+ }
+
+ /* We now calculate what our "throughput" was for the test. */
+
+ bytes_xferd = (req_size * nummessages) + (rsp_size * nummessages);
+ thruput = nummessages/elapsed_time;
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu
+ utilization for the system(s) Of course, some of the
+ information might be bogus because there was no idle counter in
+ the kernel(s). We need to make a note of this for the user's
+ benefit... */
+ if (local_cpu_usage) {
+ local_cpu_utilization = calc_cpu_util(0.0);
+ /* since calc_service demand is doing ms/Kunit we will
+ multiply the number of transaction by 1024 to get "good"
+ numbers */
+ local_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ }
+
+ if (remote_cpu_usage) {
+ remote_cpu_utilization = tcp_rr_result->cpu_util;
+ /* since calc_service demand is doing ms/Kunit we will
+ multiply the number of transaction by 1024 to get "good"
+ numbers */
+ remote_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ remote_cpu_utilization,
+ tcp_rr_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ }
+ else {
+ /* we were not measuring cpu, for the confidence stuff, we */
+ /* should make it -1.0 */
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ /* at this point, we want to calculate the confidence information.
+ if debugging is on, calculate_confidence will print-out the
+ parameters we pass it */
+
+ calculate_confidence(confidence_iteration,
+ elapsed_time,
+ thruput,
+ local_cpu_utilization,
+ remote_cpu_utilization,
+ local_service_demand,
+ remote_service_demand);
+
+
+ confidence_iteration++;
+
+ /* we are now done with the socket, so close it */
+ close(send_socket);
+
+ }
+
+ retrieve_confident_values(&elapsed_time,
+ &thruput,
+ &local_cpu_utilization,
+ &remote_cpu_utilization,
+ &local_service_demand,
+ &remote_service_demand);
+
+ /* We are now ready to print all the information. If the user has
+ specified zero-level verbosity, we will just print the local
+ service demand, or the remote service demand. If the user has
+ requested verbosity level 1, he will get the basic "streamperf"
+ numbers. If the user has specified a verbosity of greater than 1,
+ we will display a veritable plethora of background information
+ from outside of this block as it it not cpu_measurement
+ specific... */
+
+ if (confidence < 0) {
+ /* we did not hit confidence, but were we asked to look for it? */
+ if (iteration_max > 1) {
+ display_confidence();
+ }
+ }
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ local_cpu_method = format_cpu_method(cpu_method);
+ remote_cpu_method = format_cpu_method(tcp_rr_result->cpu_method);
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand,
+ local_cpu_method,
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand,
+ remote_cpu_method,
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ }
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ if ('x' == libfmt) {
+ fprintf(where,
+ cpu_title,
+ local_cpu_method,
+ remote_cpu_method);
+ }
+ else {
+ fprintf(where,
+ cpu_title_tput,
+ format_units(),
+ local_cpu_method,
+ remote_cpu_method);
+ }
+ }
+
+ fprintf(where,
+ cpu_fmt_1_line_1, /* the format string */
+ lss_size, /* local sendbuf size */
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* guess */
+ elapsed_time, /* how long was the test */
+ ('x' == libfmt) ? thruput :
+ calc_thruput_interval_omni(thruput * (req_size+rsp_size),
+ 1.0),
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand, /* remote service demand */
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ fprintf(where,
+ cpu_fmt_1_line_2,
+ rss_size,
+ rsr_size);
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ ('x' == libfmt) ? thruput :
+ calc_thruput_interval_omni(thruput * (req_size+rsp_size),
+ 1.0),
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,
+ ('x' == libfmt) ? tput_title : tput_title_band,
+ format_units());
+ }
+
+ fprintf(where,
+ tput_fmt_1_line_1, /* the format string */
+ lss_size,
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* how large were the responses */
+ elapsed_time, /* how long did it take */
+ /* are we trans or do we need to convert to bytes then
+ bits? at this point, thruput is in our "confident"
+ transactions per second. we can convert to a
+ bidirectional bitrate by multiplying that by the sum
+ of the req_size and rsp_size. we pass that to
+ calc_thruput_interval_omni with an elapsed time of
+ 1.0 s to get it converted to [kmg]bits/s or
+ [KMG]Bytes/s */
+ ('x' == libfmt) ? thruput :
+ calc_thruput_interval_omni(thruput * (req_size+rsp_size),
+ 1.0),
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ fprintf(where,
+ tput_fmt_1_line_2,
+ rss_size, /* remote recvbuf size */
+ rsr_size);
+
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ /* how to handle the verbose information in the presence of */
+ /* confidence intervals is yet to be determined... raj 11/94 */
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* TCP statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ /* normally, you might think that if we were messing about with
+ the value of libfmt we would need to put it back again, but
+ since this is basically the last thing we are going to do with
+ it, it does not matter. so there :) raj 2007-06-08 */
+ /* if the user was asking for transactions, then we report
+ megabits per sedcond for the unidirectional throughput,
+ otherwise we use the desired units. */
+ if ('x' == libfmt) {
+ libfmt = 'm';
+ }
+
+ fprintf(where,
+ ksink_fmt,
+ format_units(),
+ local_send_align,
+ remote_recv_offset,
+ local_send_offset,
+ remote_recv_offset,
+ /* if the user has enable burst mode, we have to remember
+ to account for that in the number of transactions
+ outstanding at any one time. otherwise we will
+ underreport the latency of individual
+ transactions. learned from saf by raj 2007-06-08 */
+ (((double)1.0/thruput)*(double)1000000.0) *
+ (double) (1+first_burst_size),
+ thruput,
+ calc_thruput_interval_omni(thruput * (double)req_size,1.0),
+ calc_thruput_interval_omni(thruput * (double)rsp_size,1.0));
+
+#ifdef WANT_HISTOGRAM
+ fprintf(where,"\nHistogram of request/response times\n");
+ fflush(where);
+ HIST_report(time_hist);
+#endif /* WANT_HISTOGRAM */
+
+ }
+
+}
+
+void
+send_udp_stream(char remote_host[])
+{
+ /**********************************************************************/
+ /* */
+ /* UDP Unidirectional Send Test */
+ /* */
+ /**********************************************************************/
+
+#define UDP_LENGTH_MAX 0XFFFF - 28
+
+ char *tput_title = "\
+Socket Message Elapsed Messages \n\
+Size Size Time Okay Errors Throughput\n\
+bytes bytes secs # # %s/sec\n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1 = "\
+%6d %6d %-7.2f %7d %6d %7.2f\n\
+%6d %-7.2f %7d %7.2f\n\n";
+
+
+ char *cpu_title = "\
+Socket Message Elapsed Messages CPU Service\n\
+Size Size Time Okay Errors Throughput Util Demand\n\
+bytes bytes secs # # %s/sec %% %c%c us/KB\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.2f %c\n";
+
+ char *cpu_fmt_1 = "\
+%6d %6d %-7.2f %7d %6d %7.1f %-6.2f %-6.3f\n\
+%6d %-7.2f %7d %7.1f %-6.2f %-6.3f\n\n";
+
+ unsigned int messages_recvd;
+ unsigned int messages_sent;
+ unsigned int failed_sends;
+
+ float elapsed_time,
+ local_cpu_utilization,
+ remote_cpu_utilization;
+
+ float local_service_demand, remote_service_demand;
+ double local_thruput, remote_thruput;
+ double bytes_sent;
+ double bytes_recvd;
+
+
+ int len;
+ struct ring_elt *send_ring;
+ SOCKET data_socket;
+
+ unsigned int sum_messages_sent;
+ unsigned int sum_messages_recvd;
+ unsigned int sum_failed_sends;
+ double sum_local_thruput;
+
+ struct addrinfo *local_res;
+ struct addrinfo *remote_res;
+
+ struct udp_stream_request_struct *udp_stream_request;
+ struct udp_stream_response_struct *udp_stream_response;
+ struct udp_stream_results_struct *udp_stream_results;
+
+ udp_stream_request =
+ (struct udp_stream_request_struct *)netperf_request.content.test_specific_data;
+ udp_stream_response =
+ (struct udp_stream_response_struct *)netperf_response.content.test_specific_data;
+ udp_stream_results =
+ (struct udp_stream_results_struct *)netperf_response.content.test_specific_data;
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ time_hist = HIST_new();
+ }
+#endif /* WANT_HISTOGRAM */
+
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ complete_addrinfos(&remote_res,
+ &local_res,
+ remote_host,
+ SOCK_DGRAM,
+ IPPROTO_UDP,
+ 0);
+
+ if ( print_headers ) {
+ print_top_test_header("UDP UNIDIRECTIONAL SEND TEST",local_res,remote_res);
+ }
+
+ send_ring = NULL;
+ confidence_iteration = 1;
+ init_stat();
+ sum_messages_sent = 0;
+ sum_messages_recvd = 0;
+ sum_failed_sends = 0;
+ sum_local_thruput = 0.0;
+
+ /* we have a great-big while loop which controls the number of times */
+ /* we run a particular test. this is for the calculation of a */
+ /* confidence interval (I really should have stayed awake during */
+ /* probstats :). If the user did not request confidence measurement */
+ /* (no confidence is the default) then we will only go though the */
+ /* loop once. the confidence stuff originates from the folks at IBM */
+
+ while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
+ (confidence_iteration <= iteration_min)) {
+
+ /* initialize a few counters. we have to remember that we might be */
+ /* going through the loop more than once. */
+ messages_sent = 0;
+ messages_recvd = 0;
+ failed_sends = 0;
+ times_up = 0;
+
+ /*set up the data socket */
+ data_socket = create_data_socket(local_res);
+
+ if (data_socket == INVALID_SOCKET){
+ perror("udp_send: data socket");
+ exit(1);
+ }
+
+ /* now, we want to see if we need to set the send_size */
+ if (send_size == 0) {
+ if (lss_size > 0) {
+ send_size = (lss_size < UDP_LENGTH_MAX ? lss_size : UDP_LENGTH_MAX);
+ }
+ else {
+ send_size = 4096;
+ }
+ }
+
+
+ /* set-up the data buffer with the requested alignment and offset, */
+ /* most of the numbers here are just a hack to pick something nice */
+ /* and big in an attempt to never try to send a buffer a second time */
+ /* before it leaves the node...unless the user set the width */
+ /* explicitly. */
+ if (send_width == 0) send_width = 32;
+
+ if (send_ring == NULL ) {
+ send_ring = allocate_buffer_ring(send_width,
+ send_size,
+ local_send_align,
+ local_send_offset);
+ }
+
+
+ /* if the user supplied a cpu rate, this call will complete rather */
+ /* quickly, otherwise, the cpu rate will be retured to us for */
+ /* possible display. The Library will keep it's own copy of this data */
+ /* for use elsewhere. We will only display it. (Does that make it */
+ /* "opaque" to us?) */
+
+ if (local_cpu_usage)
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+
+ if (!no_control) {
+ /* Tell the remote end to set up the data connection. The server
+ sends back the port number and alters the socket parameters
+ there. Of course this is a datagram service so no connection
+ is actually set up, the server just sets up the socket and
+ binds it. */
+
+ netperf_request.content.request_type = DO_UDP_STREAM;
+ udp_stream_request->recv_buf_size = rsr_size_req;
+ udp_stream_request->message_size = send_size;
+ udp_stream_request->recv_connected = remote_connected;
+ udp_stream_request->recv_alignment = remote_recv_align;
+ udp_stream_request->recv_offset = remote_recv_offset;
+ udp_stream_request->measure_cpu = remote_cpu_usage;
+ udp_stream_request->cpu_rate = remote_cpu_rate;
+ udp_stream_request->test_length = test_time;
+ udp_stream_request->so_rcvavoid = rem_rcvavoid;
+ udp_stream_request->so_sndavoid = rem_sndavoid;
+ udp_stream_request->port = atoi(remote_data_port);
+ udp_stream_request->ipfamily = af_to_nf(remote_res->ai_family);
+
+ send_request();
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"send_udp_stream: remote data connection done.\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("send_udp_stream: error on remote");
+ exit(1);
+ }
+
+ /* Place the port number returned by the remote into the sockaddr */
+ /* structure so our sends can be sent to the correct place. Also get */
+ /* some of the returned socket buffer information for user display. */
+
+ /* make sure that port numbers are in the proper order */
+ set_port_number(remote_res,(short)udp_stream_response->data_port_number);
+
+ rsr_size = udp_stream_response->recv_buf_size;
+ rss_size = udp_stream_response->send_buf_size;
+ remote_cpu_rate = udp_stream_response->cpu_rate;
+ }
+
+#ifdef WANT_DEMO
+ DEMO_STREAM_SETUP(lss_size,rsr_size)
+#endif
+
+ /* We "connect" up to the remote post to allow is to use the send */
+ /* call instead of the sendto call. Presumeably, this is a little */
+ /* simpler, and a little more efficient. I think that it also means */
+ /* that we can be informed of certain things, but am not sure */
+ /* yet...also, this is the way I would expect a client to behave */
+ /* when talking to a server */
+ if (local_connected) {
+ if (connect(data_socket,
+ remote_res->ai_addr,
+ remote_res->ai_addrlen) == INVALID_SOCKET){
+ perror("send_udp_stream: data socket connect failed");
+ exit(1);
+ } else if (debug) {
+ fprintf(where,"send_udp_stream: connected data socket.\n");
+ fflush(where);
+ }
+ }
+
+ /* set up the timer to call us after test_time. one of these days, */
+ /* it might be nice to figure-out a nice reliable way to have the */
+ /* test controlled by a byte count as well, but since UDP is not */
+ /* reliable, that could prove difficult. so, in the meantime, we */
+ /* only allow a UDP_STREAM test to be a timed test. */
+
+ if (test_time) {
+ times_up = 0;
+ start_timer(test_time);
+ }
+ else {
+ fprintf(where,"Sorry, UDP_STREAM tests must be timed.\n");
+ fflush(where);
+ }
+
+ /* Get the start count for the idle counter and the start time */
+
+ cpu_start(local_cpu_usage);
+
+#ifdef WANT_INTERVALS
+ INTERVALS_INIT();
+#endif /* WANT_INTERVALS */
+
+#ifdef WANT_DEMO
+ if (demo_mode) {
+ HIST_timestamp(demo_one_ptr);
+ }
+#endif
+
+ /* Send datagrams like there was no tomorrow. at somepoint it might */
+ /* be nice to set this up so that a quantity of bytes could be sent, */
+ /* but we still need some sort of end of test trigger on the receive */
+ /* side. that could be a select with a one second timeout, but then */
+ /* if there is a test where none of the data arrives for awile and */
+ /* then starts again, we would end the test too soon. something to */
+ /* think about... */
+ while (!times_up) {
+
+#ifdef DIRTY
+ /* we want to dirty some number of consecutive integers in the buffer */
+ /* we are about to send. we may also want to bring some number of */
+ /* them cleanly into the cache. The clean ones will follow any dirty */
+ /* ones into the cache. */
+
+ access_buffer(send_ring->buffer_ptr,
+ send_size,
+ loc_dirty_count,
+ loc_clean_count);
+#endif /* DIRTY */
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ HIST_timestamp(&time_one);
+ }
+#endif /* WANT_HISTOGRAM */
+
+ if (local_connected) {
+ len = send(data_socket,
+ send_ring->buffer_ptr,
+ send_size,
+ 0);
+ } else {
+ len = sendto(data_socket,
+ send_ring->buffer_ptr,
+ send_size,
+ 0,
+ remote_res->ai_addr,
+ remote_res->ai_addrlen);
+ }
+
+ if (len != send_size) {
+ if ((len >= 0) ||
+ SOCKET_EINTR(len))
+ break;
+ if (errno == ENOBUFS) {
+ failed_sends++;
+ continue;
+ }
+ perror("udp_send: data send error");
+ exit(1);
+ }
+ messages_sent++;
+
+ /* now we want to move our pointer to the next position in the */
+ /* data buffer... */
+
+ send_ring = send_ring->next;
+
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ /* get the second timestamp */
+ HIST_timestamp(&time_two);
+ HIST_add(time_hist,delta_micro(&time_one,&time_two));
+ }
+#endif /* WANT_HISTOGRAM */
+
+#ifdef WANT_DEMO
+ DEMO_STREAM_INTERVAL(send_size)
+#endif
+
+#ifdef WANT_INTERVALS
+ INTERVALS_WAIT();
+#endif /* WANT_INTERVALS */
+
+ }
+
+ /* This is a timed test, so the remote will be returning to us after */
+ /* a time. We should not need to send any "strange" messages to tell */
+ /* the remote that the test is completed, unless we decide to add a */
+ /* number of messages to the test. */
+
+ /* the test is over, so get stats and stuff */
+ cpu_stop(local_cpu_usage,
+ &elapsed_time);
+
+ if (!no_control) {
+ /* Get the statistics from the remote end */
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"send_udp_stream: remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("send_udp_stream: error on remote");
+ exit(1);
+ }
+ messages_recvd = udp_stream_results->messages_recvd;
+ bytes_recvd = (double) send_size * (double) messages_recvd;
+ }
+ else {
+ /* since there was no control connection, we've no idea what was
+ actually received. raj 2007-02-08 */
+ messages_recvd = -1;
+ bytes_recvd = -1.0;
+ }
+
+ bytes_sent = (double) send_size * (double) messages_sent;
+ local_thruput = calc_thruput(bytes_sent);
+
+
+ /* we asume that the remote ran for as long as we did */
+
+ remote_thruput = calc_thruput(bytes_recvd);
+
+ /* print the results for this socket and message size */
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) We pass zeros for the local */
+ /* cpu utilization and elapsed time to tell the routine to use */
+ /* the libraries own values for those. */
+ if (local_cpu_usage) {
+ local_cpu_utilization = calc_cpu_util(0.0);
+ /* shouldn't this really be based on bytes_recvd, since that is */
+ /* the effective throughput of the test? I think that it should, */
+ /* so will make the change raj 11/94 */
+ local_service_demand = calc_service_demand(bytes_recvd,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ }
+
+ /* The local calculations could use variables being kept by */
+ /* the local netlib routines. The remote calcuations need to */
+ /* have a few things passed to them. */
+ if (remote_cpu_usage) {
+ remote_cpu_utilization = udp_stream_results->cpu_util;
+ remote_service_demand = calc_service_demand(bytes_recvd,
+ 0.0,
+ remote_cpu_utilization,
+ udp_stream_results->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+ }
+ else {
+ /* we were not measuring cpu, for the confidence stuff, we */
+ /* should make it -1.0 */
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ /* at this point, we want to calculate the confidence information. */
+ /* if debugging is on, calculate_confidence will print-out the */
+ /* parameters we pass it */
+
+ calculate_confidence(confidence_iteration,
+ elapsed_time,
+ remote_thruput,
+ local_cpu_utilization,
+ remote_cpu_utilization,
+ local_service_demand,
+ remote_service_demand);
+
+ /* since the routine calculate_confidence is rather generic, and */
+ /* we have a few other parms of interest, we will do a little work */
+ /* here to caclulate their average. */
+ sum_messages_sent += messages_sent;
+ sum_messages_recvd += messages_recvd;
+ sum_failed_sends += failed_sends;
+ sum_local_thruput += local_thruput;
+
+ confidence_iteration++;
+
+ /* this datapoint is done, so we don't need the socket any longer */
+ close(data_socket);
+
+ }
+
+ /* we should reach this point once the test is finished */
+
+ retrieve_confident_values(&elapsed_time,
+ &remote_thruput,
+ &local_cpu_utilization,
+ &remote_cpu_utilization,
+ &local_service_demand,
+ &remote_service_demand);
+
+ /* some of the interesting values aren't covered by the generic */
+ /* confidence routine */
+ messages_sent = sum_messages_sent / (confidence_iteration -1);
+ messages_recvd = sum_messages_recvd / (confidence_iteration -1);
+ failed_sends = sum_failed_sends / (confidence_iteration -1);
+ local_thruput = sum_local_thruput / (confidence_iteration -1);
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+
+ if (confidence < 0) {
+ /* we did not hit confidence, but were we asked to look for it? */
+ if (iteration_max > 1) {
+ display_confidence();
+ }
+ }
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ local_cpu_method = format_cpu_method(cpu_method);
+ remote_cpu_method = format_cpu_method(udp_stream_results->cpu_method);
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand,
+ local_cpu_method);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand,
+ local_cpu_method);
+ }
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,
+ cpu_title,
+ format_units(),
+ local_cpu_method,
+ remote_cpu_method);
+ }
+
+ fprintf(where,
+ cpu_fmt_1, /* the format string */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long was the test */
+ messages_sent,
+ failed_sends,
+ local_thruput, /* what was the xfer rate */
+ local_cpu_utilization, /* local cpu */
+ local_service_demand, /* local service demand */
+ rsr_size,
+ elapsed_time,
+ messages_recvd,
+ remote_thruput,
+ remote_cpu_utilization, /* remote cpu */
+ remote_service_demand); /* remote service demand */
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ local_thruput);
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,tput_title,format_units());
+ }
+ fprintf(where,
+ tput_fmt_1, /* the format string */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long did it take */
+ messages_sent,
+ failed_sends,
+ local_thruput,
+ rsr_size, /* remote recvbuf size */
+ elapsed_time,
+ messages_recvd,
+ remote_thruput);
+ break;
+ }
+ }
+
+ fflush(where);
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ fprintf(where,"\nHistogram of time spent in send() call\n");
+ fflush(where);
+ HIST_report(time_hist);
+ }
+#endif /* WANT_HISTOGRAM */
+
+}
+
+
+ /* this routine implements the receive side (netserver) of the */
+ /* UDP_STREAM performance test. */
+
+void
+recv_udp_stream()
+{
+ struct ring_elt *recv_ring;
+ struct addrinfo *local_res;
+ char local_name[BUFSIZ];
+ char port_buffer[PORTBUFSIZE];
+
+ struct sockaddr_storage myaddr_in;
+ SOCKET s_data;
+ netperf_socklen_t addrlen;
+ struct sockaddr_storage remote_addr;
+ netperf_socklen_t remote_addrlen;
+
+ int len = 0;
+ unsigned int bytes_received = 0;
+ float elapsed_time;
+
+ int message_size;
+ unsigned int messages_recvd = 0;
+
+ struct udp_stream_request_struct *udp_stream_request;
+ struct udp_stream_response_struct *udp_stream_response;
+ struct udp_stream_results_struct *udp_stream_results;
+
+ udp_stream_request =
+ (struct udp_stream_request_struct *)netperf_request.content.test_specific_data;
+ udp_stream_response =
+ (struct udp_stream_response_struct *)netperf_response.content.test_specific_data;
+ udp_stream_results =
+ (struct udp_stream_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_udp_stream: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug > 1) {
+ fprintf(where,"recv_udp_stream: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = UDP_STREAM_RESPONSE;
+
+ if (debug > 2) {
+ fprintf(where,"recv_udp_stream: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* We now alter the message_ptr variable to be at the desired */
+ /* alignment with the desired offset. */
+
+ if (debug > 1) {
+ fprintf(where,"recv_udp_stream: requested alignment of %d\n",
+ udp_stream_request->recv_alignment);
+ fflush(where);
+ }
+
+ if (recv_width == 0) recv_width = 1;
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ udp_stream_request->message_size,
+ udp_stream_request->recv_alignment,
+ udp_stream_request->recv_offset);
+
+ if (debug > 1) {
+ fprintf(where,"recv_udp_stream: receive alignment and offset set...\n");
+ fflush(where);
+ }
+
+ /* Grab a socket to listen on, and then listen on it. */
+
+ if (debug > 1) {
+ fprintf(where,"recv_udp_stream: grabbing a socket...\n");
+ fflush(where);
+ }
+
+ /* create_data_socket expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lsr_size_req = udp_stream_request->recv_buf_size;
+ loc_rcvavoid = udp_stream_request->so_rcvavoid;
+ loc_sndavoid = udp_stream_request->so_sndavoid;
+ local_connected = udp_stream_request->recv_connected;
+
+ set_hostname_and_port(local_name,
+ port_buffer,
+ nf_to_af(udp_stream_request->ipfamily),
+ udp_stream_request->port);
+
+ local_res = complete_addrinfo(local_name,
+ local_name,
+ port_buffer,
+ nf_to_af(udp_stream_request->ipfamily),
+ SOCK_DGRAM,
+ IPPROTO_UDP,
+ 0);
+
+ s_data = create_data_socket(local_res);
+
+ if (s_data == INVALID_SOCKET) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ udp_stream_response->test_length = udp_stream_request->test_length;
+
+ /* now get the port number assigned by the system */
+ addrlen = sizeof(myaddr_in);
+ if (getsockname(s_data,
+ (struct sockaddr *)&myaddr_in,
+ &addrlen) == SOCKET_ERROR){
+ netperf_response.content.serv_errno = errno;
+ close(s_data);
+ send_response();
+
+ exit(1);
+ }
+
+ /* Now myaddr_in contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ udp_stream_response->data_port_number =
+ (int) ntohs(((struct sockaddr_in *)&myaddr_in)->sin_port);
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a -1 to */
+ /* the initiator. */
+
+ udp_stream_response->cpu_rate = (float)0.0; /* assume no cpu */
+ udp_stream_response->measure_cpu = 0;
+ if (udp_stream_request->measure_cpu) {
+ /* We will pass the rate into the calibration routine. If the */
+ /* user did not specify one, it will be 0.0, and we will do a */
+ /* "real" calibration. Otherwise, all it will really do is */
+ /* store it away... */
+ udp_stream_response->measure_cpu = 1;
+ udp_stream_response->cpu_rate =
+ calibrate_local_cpu(udp_stream_request->cpu_rate);
+ }
+
+ message_size = udp_stream_request->message_size;
+ test_time = udp_stream_request->test_length;
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ udp_stream_response->send_buf_size = lss_size;
+ udp_stream_response->recv_buf_size = lsr_size;
+ udp_stream_response->so_rcvavoid = loc_rcvavoid;
+ udp_stream_response->so_sndavoid = loc_sndavoid;
+
+ send_response();
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(udp_stream_request->measure_cpu);
+
+#ifdef WIN32
+ /* this is used so the timer thread can close the socket out from */
+ /* under us, which to date is the easiest/cleanest/least */
+ /* Windows-specific way I can find to force the winsock calls to */
+ /* return WSAEINTR with the test is over. anything that will run on */
+ /* 95 and NT and is closer to what netperf expects from Unix signals */
+ /* and such would be appreciated raj 1/96 */
+ win_kludge_socket = s_data;
+#endif /* WIN32 */
+
+ /* The loop will exit when the timer pops, or if we happen to recv a */
+ /* message of less than send_size bytes... */
+
+ times_up = 0;
+
+ start_timer(test_time + PAD_TIME);
+
+ if (debug) {
+ fprintf(where,"recv_udp_stream: about to enter inner sanctum.\n");
+ fflush(where);
+ }
+
+ /* We "connect" up to the remote post to allow us to use the recv */
+ /* call instead of the recvfrom call. Presumeably, this is a little */
+ /* simpler, and a little more efficient. */
+
+ if (local_connected) {
+
+ /* Receive the first message using recvfrom to find the remote address */
+ remote_addrlen = sizeof(remote_addr);
+ len = recvfrom(s_data, recv_ring->buffer_ptr,
+ message_size, 0,
+ (struct sockaddr*)&remote_addr, &remote_addrlen);
+ if (len != message_size) {
+ if ((len == SOCKET_ERROR) && !SOCKET_EINTR(len)) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+ }
+ messages_recvd++;
+ recv_ring = recv_ring->next;
+
+
+ /* Now connect with the remote socket address */
+ if (connect(s_data,
+ (struct sockaddr*)&remote_addr,
+ remote_addrlen )== INVALID_SOCKET) {
+ netperf_response.content.serv_errno = errno;
+ close(s_data);
+ send_response();
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"recv_udp_stream: connected data socket\n");
+ fflush(where);
+ }
+ }
+
+ while (!times_up) {
+ if(local_connected) {
+ len = recv(s_data,
+ recv_ring->buffer_ptr,
+ message_size,
+ 0);
+ } else {
+ len = recvfrom(s_data,
+ recv_ring->buffer_ptr,
+ message_size,
+ 0,0,0);
+ }
+
+ if (len != message_size) {
+ if ((len == SOCKET_ERROR) && !SOCKET_EINTR(len)) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+ break;
+ }
+ messages_recvd++;
+ recv_ring = recv_ring->next;
+ }
+
+ if (debug) {
+ fprintf(where,"recv_udp_stream: got %d messages.\n",messages_recvd);
+ fflush(where);
+ }
+
+
+ /* The loop now exits due timer or < send_size bytes received. in */
+ /* reality, we only really support a timed UDP_STREAM test. raj */
+ /* 12/95 */
+
+ cpu_stop(udp_stream_request->measure_cpu,&elapsed_time);
+
+ if (times_up) {
+ /* we ended on a timer, subtract the PAD_TIME */
+ elapsed_time -= (float)PAD_TIME;
+ }
+ else {
+ stop_timer();
+ }
+
+ if (debug) {
+ fprintf(where,"recv_udp_stream: test ended in %f seconds.\n",elapsed_time);
+ fflush(where);
+ }
+
+
+ /* We will count the "off" message that got us out of the loop */
+ bytes_received = (messages_recvd * message_size) + len;
+
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_udp_stream: got %d bytes\n",
+ bytes_received);
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = UDP_STREAM_RESULTS;
+ udp_stream_results->bytes_received = htonl(bytes_received);
+ udp_stream_results->messages_recvd = messages_recvd;
+ udp_stream_results->elapsed_time = elapsed_time;
+ udp_stream_results->cpu_method = cpu_method;
+ udp_stream_results->num_cpus = lib_num_loc_cpus;
+ if (udp_stream_request->measure_cpu) {
+ udp_stream_results->cpu_util = calc_cpu_util(elapsed_time);
+ }
+ else {
+ udp_stream_results->cpu_util = (float) -1.0;
+ }
+
+ if (debug > 1) {
+ fprintf(where,
+ "recv_udp_stream: test complete, sending results.\n");
+ fflush(where);
+ }
+
+ send_response();
+
+ close(s_data);
+
+}
+
+void
+send_udp_rr(char remote_host[])
+{
+
+ char *tput_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans.\n\
+Send Recv Size Size Time Rate \n\
+bytes Bytes bytes bytes secs. per sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %7.2f \n";
+ char *tput_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *cpu_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem\n\
+Send Recv Size Size Time Rate local remote local remote\n\
+bytes bytes bytes bytes secs. per sec %% %c %% %c us/Tr us/Tr\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f %c\n";
+
+ char *cpu_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %-6.2f %-6.2f %-6.2f %-6.3f %-6.3f\n";
+
+ char *cpu_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ float elapsed_time;
+
+ struct ring_elt *send_ring;
+ struct ring_elt *recv_ring;
+
+ int len;
+ int nummessages;
+ SOCKET send_socket;
+ int trans_remaining;
+ int bytes_xferd;
+
+ int rsp_bytes_recvd;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+ double thruput;
+
+ struct addrinfo *local_res;
+ struct addrinfo *remote_res;
+
+ struct udp_rr_request_struct *udp_rr_request;
+ struct udp_rr_response_struct *udp_rr_response;
+ struct udp_rr_results_struct *udp_rr_result;
+
+ udp_rr_request =
+ (struct udp_rr_request_struct *)netperf_request.content.test_specific_data;
+ udp_rr_response =
+ (struct udp_rr_response_struct *)netperf_response.content.test_specific_data;
+ udp_rr_result =
+ (struct udp_rr_results_struct *)netperf_response.content.test_specific_data;
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ time_hist = HIST_new();
+ }
+#endif
+
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ complete_addrinfos(&remote_res,
+ &local_res,
+ remote_host,
+ SOCK_DGRAM,
+ IPPROTO_UDP,
+ 0);
+
+ if ( print_headers ) {
+ print_top_test_header("UDP REQUEST/RESPONSE TEST",local_res,remote_res);
+ }
+
+ /* initialize a few counters */
+
+ send_ring = NULL;
+ recv_ring = NULL;
+ nummessages = 0;
+ bytes_xferd = 0;
+ times_up = 0;
+ confidence_iteration = 1;
+ init_stat();
+
+ /* we have a great-big while loop which controls the number of times */
+ /* we run a particular test. this is for the calculation of a */
+ /* confidence interval (I really should have stayed awake during */
+ /* probstats :). If the user did not request confidence measurement */
+ /* (no confidence is the default) then we will only go though the */
+ /* loop once. the confidence stuff originates from the folks at IBM */
+
+ while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
+ (confidence_iteration <= iteration_min)) {
+
+ nummessages = 0;
+ bytes_xferd = 0;
+ times_up = 0;
+ trans_remaining = 0;
+
+ /* set-up the data buffers with the requested alignment and offset */
+
+ if (send_width == 0) send_width = 1;
+ if (recv_width == 0) recv_width = 1;
+
+ if (send_ring == NULL) {
+ send_ring = allocate_buffer_ring(send_width,
+ req_size,
+ local_send_align,
+ local_send_offset);
+ }
+
+ if (recv_ring == NULL) {
+ recv_ring = allocate_buffer_ring(recv_width,
+ rsp_size,
+ local_recv_align,
+ local_recv_offset);
+ }
+
+ /*set up the data socket */
+ send_socket = create_data_socket(local_res);
+
+ if (send_socket == INVALID_SOCKET){
+ perror("netperf: send_udp_rr: udp rr data socket");
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"send_udp_rr: send_socket obtained...\n");
+ }
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back. If */
+ /* there is no idle counter in the kernel idle loop, the */
+ /* local_cpu_rate will be set to -1. */
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ if (!no_control) {
+ /* Tell the remote end to do a listen. The server alters the
+ socket paramters on the other side at this point, hence the
+ reason for all the values being passed in the setup
+ message. If the user did not specify any of the parameters,
+ they will be passed as 0, which will indicate to the remote
+ that no changes beyond the system's default should be
+ used. Alignment is the exception, it will default to 8, which
+ will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_UDP_RR;
+ udp_rr_request->recv_buf_size = rsr_size_req;
+ udp_rr_request->send_buf_size = rss_size_req;
+ udp_rr_request->recv_alignment = remote_recv_align;
+ udp_rr_request->recv_offset = remote_recv_offset;
+ udp_rr_request->send_alignment = remote_send_align;
+ udp_rr_request->send_offset = remote_send_offset;
+ udp_rr_request->request_size = req_size;
+ udp_rr_request->response_size = rsp_size;
+ udp_rr_request->measure_cpu = remote_cpu_usage;
+ udp_rr_request->cpu_rate = remote_cpu_rate;
+ udp_rr_request->so_rcvavoid = rem_rcvavoid;
+ udp_rr_request->so_sndavoid = rem_sndavoid;
+ if (test_time) {
+ udp_rr_request->test_length = test_time;
+ }
+ else {
+ udp_rr_request->test_length = test_trans * -1;
+ }
+ udp_rr_request->port = atoi(remote_data_port);
+ udp_rr_request->ipfamily = af_to_nf(remote_res->ai_family);
+
+ if (debug > 1) {
+ fprintf(where,"netperf: send_udp_rr: requesting UDP r/r test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant
+ socket parameters for this test type. We will put them back
+ into the variables here so they can be displayed if desired.
+ The remote will have calibrated CPU if necessary, and will
+ have done all the needed set-up we will have calibrated the
+ cpu locally before sending the request, and will grab the
+ counter value right after the connect returns. The remote
+ will grab the counter right after the accept call. This saves
+ the hassle of extra messages being sent for the UDP
+ tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote listen done.\n");
+ rsr_size = udp_rr_response->recv_buf_size;
+ rss_size = udp_rr_response->send_buf_size;
+ remote_cpu_usage = udp_rr_response->measure_cpu;
+ remote_cpu_rate = udp_rr_response->cpu_rate;
+ /* port numbers in proper order */
+ set_port_number(remote_res,(short)udp_rr_response->data_port_number);
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+ exit(1);
+ }
+ }
+
+#ifdef WANT_DEMO
+ DEMO_RR_SETUP(100)
+#endif
+
+ /* Connect up to the remote port on the data socket. This will set */
+ /* the default destination address on this socket. With UDP, this */
+ /* does make a performance difference as we may not have to do as */
+ /* many routing lookups, however, I expect that a client would */
+ /* behave this way. raj 1/94 */
+
+ if ( connect(send_socket,
+ remote_res->ai_addr,
+ remote_res->ai_addrlen) == INVALID_SOCKET ) {
+ perror("netperf: data socket connect failed");
+ exit(1);
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either the */
+ /* connect would have failed, or the previous response would have */
+ /* indicated a problem. I failed to see the value of the extra */
+ /* message after the accept on the remote. If it failed, we'll see it */
+ /* here. If it didn't, we might as well start pumping data. */
+
+ /* Set-up the test end conditions. For a request/response test, they */
+ /* can be either time or transaction based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ trans_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+#ifdef WANT_DEMO
+ if (demo_mode) {
+ HIST_timestamp(demo_one_ptr);
+ }
+#endif
+
+#ifdef WANT_INTERVALS
+ INTERVALS_INIT();
+#endif /* WANT_INTERVALS */
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return */
+ /* false. When the test is controlled by byte count, the time test */
+ /* will always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. I think */
+ /* I just arbitrarily decrement trans_remaining for the timed */
+ /* test, but will not do that just yet... One other question is */
+ /* whether or not the send buffer and the receive buffer should be */
+ /* the same buffer. */
+
+#ifdef WANT_FIRST_BURST
+ {
+ int i;
+ for (i = 0; i < first_burst_size; i++) {
+ if((len=send(send_socket,
+ send_ring->buffer_ptr,
+ req_size,
+ 0)) != req_size) {
+ /* we should never hit the end of the test in the first burst */
+ perror("send_udp_rr: initial burst data send error");
+ exit(-1);
+ }
+ }
+ }
+#endif /* WANT_FIRST_BURST */
+
+ while ((!times_up) || (trans_remaining > 0)) {
+ /* send the request */
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ HIST_timestamp(&time_one);
+ }
+#endif
+ if((len=send(send_socket,
+ send_ring->buffer_ptr,
+ req_size,
+ 0)) != req_size) {
+ if (SOCKET_EINTR(len)) {
+ /* We likely hit */
+ /* test-end time. */
+ break;
+ }
+ perror("send_udp_rr: data send error");
+ exit(1);
+ }
+ send_ring = send_ring->next;
+
+ /* receive the response. with UDP we will get it all, or nothing */
+
+ if((rsp_bytes_recvd=recv(send_socket,
+ recv_ring->buffer_ptr,
+ rsp_size,
+ 0)) != rsp_size) {
+ if (SOCKET_EINTR(rsp_bytes_recvd))
+ {
+ /* Again, we have likely hit test-end time */
+ break;
+ }
+ perror("send_udp_rr: data recv error");
+ exit(1);
+ }
+ recv_ring = recv_ring->next;
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ HIST_timestamp(&time_two);
+ HIST_add(time_hist,delta_micro(&time_one,&time_two));
+ }
+
+#endif
+
+ /* at this point, we may wish to sleep for some period of */
+ /* time, so we see how long that last transaction just took, */
+ /* and sleep for the difference of that and the interval. We */
+ /* will not sleep if the time would be less than a */
+ /* millisecond. */
+
+#ifdef WANT_DEMO
+ DEMO_RR_INTERVAL(1);
+#endif
+
+#ifdef WANT_INTERVALS
+ INTERVALS_WAIT();
+#endif /* WANT_INTERVALS */
+
+ nummessages++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug > 3) {
+ if ((nummessages % 100) == 0) {
+ fprintf(where,"Transaction %d completed\n",nummessages);
+ fflush(where);
+ }
+ }
+
+ }
+
+ /* for some strange reason, I used to call shutdown on the UDP */
+ /* data socket here. I'm not sure why, because it would not have */
+ /* any effect... raj 11/94 */
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being */
+ /* measured? how long */
+ /* did we really run? */
+
+ if (!no_control) {
+ /* Get the statistics from the remote end. The remote will have
+ calculated service demand and all those interesting
+ things. If it wasn't supposed to care, it will return obvious
+ values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+ exit(1);
+ }
+ }
+
+ /* We now calculate what our thruput was for the test. In the */
+ /* future, we may want to include a calculation of the thruput */
+ /* measured by the remote, but it should be the case that for a */
+ /* UDP rr test, that the two numbers should be *very* close... */
+ /* We calculate bytes_sent regardless of the way the test length */
+ /* was controlled. */
+
+ bytes_xferd = (req_size * nummessages) + (rsp_size * nummessages);
+ thruput = nummessages / elapsed_time;
+
+ if (local_cpu_usage || remote_cpu_usage) {
+
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) Of course, some of the */
+ /* information might be bogus because there was no idle counter */
+ /* in the kernel(s). We need to make a note of this for the */
+ /* user's benefit by placing a code for the metod used in the */
+ /* test banner */
+
+ if (local_cpu_usage) {
+ local_cpu_utilization = calc_cpu_util(0.0);
+
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+
+ local_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ }
+
+ if (remote_cpu_usage) {
+ remote_cpu_utilization = udp_rr_result->cpu_util;
+
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+
+ remote_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ remote_cpu_utilization,
+ udp_rr_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+ }
+ else {
+ /* we were not measuring cpu, for the confidence stuff, we */
+ /* should make it -1.0 */
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ /* at this point, we want to calculate the confidence information. */
+ /* if debugging is on, calculate_confidence will print-out the */
+ /* parameters we pass it */
+
+ calculate_confidence(confidence_iteration,
+ elapsed_time,
+ thruput,
+ local_cpu_utilization,
+ remote_cpu_utilization,
+ local_service_demand,
+ remote_service_demand);
+
+
+ confidence_iteration++;
+
+ /* we are done with the socket */
+ close(send_socket);
+ }
+
+ /* at this point, we have made all the iterations we are going to */
+ /* make. */
+ retrieve_confident_values(&elapsed_time,
+ &thruput,
+ &local_cpu_utilization,
+ &remote_cpu_utilization,
+ &local_service_demand,
+ &remote_service_demand);
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ if (confidence < 0) {
+ /* we did not hit confidence, but were we asked to look for it? */
+ if (iteration_max > 1) {
+ display_confidence();
+ }
+ }
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ local_cpu_method = format_cpu_method(cpu_method);
+ remote_cpu_method = format_cpu_method(udp_rr_result->cpu_method);
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand,
+ local_cpu_method);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand,
+ remote_cpu_method);
+ }
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,
+ cpu_title,
+ local_cpu_method,
+ remote_cpu_method);
+ }
+
+ fprintf(where,
+ cpu_fmt_1_line_1, /* the format string */
+ lss_size, /* local sendbuf size */
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* guess */
+ elapsed_time, /* how long was the test */
+ nummessages/elapsed_time,
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand); /* remote service demand */
+ fprintf(where,
+ cpu_fmt_1_line_2,
+ rss_size,
+ rsr_size);
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ nummessages/elapsed_time);
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,tput_title,format_units());
+ }
+
+ fprintf(where,
+ tput_fmt_1_line_1, /* the format string */
+ lss_size,
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* how large were the responses */
+ elapsed_time, /* how long did it take */
+ nummessages/elapsed_time);
+ fprintf(where,
+ tput_fmt_1_line_2,
+ rss_size, /* remote recvbuf size */
+ rsr_size);
+
+ break;
+ }
+ }
+ fflush(where);
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ /* how to handle the verbose information in the presence of */
+ /* confidence intervals is yet to be determined... raj 11/94 */
+
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* UDP statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+#ifdef WANT_HISTOGRAM
+ fprintf(where,"\nHistogram of request/reponse times.\n");
+ fflush(where);
+ HIST_report(time_hist);
+#endif /* WANT_HISTOGRAM */
+ }
+}
+
+ /* this routine implements the receive side (netserver) of a UDP_RR */
+ /* test. */
+void
+recv_udp_rr()
+{
+
+ struct ring_elt *recv_ring;
+ struct ring_elt *send_ring;
+
+ struct addrinfo *local_res;
+ char local_name[BUFSIZ];
+ char port_buffer[PORTBUFSIZE];
+
+ struct sockaddr_storage myaddr_in;
+ struct sockaddr_storage peeraddr;
+ SOCKET s_data;
+ netperf_socklen_t addrlen;
+ int trans_received;
+ int trans_remaining;
+ int request_bytes_recvd;
+ int response_bytes_sent;
+ float elapsed_time;
+
+ struct udp_rr_request_struct *udp_rr_request;
+ struct udp_rr_response_struct *udp_rr_response;
+ struct udp_rr_results_struct *udp_rr_results;
+
+ udp_rr_request =
+ (struct udp_rr_request_struct *)netperf_request.content.test_specific_data;
+ udp_rr_response =
+ (struct udp_rr_response_struct *)netperf_response.content.test_specific_data;
+ udp_rr_results =
+ (struct udp_rr_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_udp_rr: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_udp_rr: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = UDP_RR_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_udp_rr: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* We now alter the message_ptr variables to be at the desired */
+ /* alignments with the desired offsets. */
+
+ if (debug) {
+ fprintf(where,"recv_udp_rr: requested recv alignment of %d offset %d\n",
+ udp_rr_request->recv_alignment,
+ udp_rr_request->recv_offset);
+ fprintf(where,"recv_udp_rr: requested send alignment of %d offset %d\n",
+ udp_rr_request->send_alignment,
+ udp_rr_request->send_offset);
+ fflush(where);
+ }
+
+ if (send_width == 0) send_width = 1;
+ if (recv_width == 0) recv_width = 1;
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ udp_rr_request->request_size,
+ udp_rr_request->recv_alignment,
+ udp_rr_request->recv_offset);
+
+ send_ring = allocate_buffer_ring(send_width,
+ udp_rr_request->response_size,
+ udp_rr_request->send_alignment,
+ udp_rr_request->send_offset);
+
+ if (debug) {
+ fprintf(where,"recv_udp_rr: receive alignment and offset set...\n");
+ fflush(where);
+ }
+
+ /* Grab a socket to listen on, and then listen on it. */
+
+ if (debug) {
+ fprintf(where,"recv_udp_rr: grabbing a socket...\n");
+ fflush(where);
+ }
+
+
+ /* create_data_socket expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lss_size_req = udp_rr_request->send_buf_size;
+ lsr_size_req = udp_rr_request->recv_buf_size;
+ loc_rcvavoid = udp_rr_request->so_rcvavoid;
+ loc_sndavoid = udp_rr_request->so_sndavoid;
+
+ set_hostname_and_port(local_name,
+ port_buffer,
+ nf_to_af(udp_rr_request->ipfamily),
+ udp_rr_request->port);
+
+ local_res = complete_addrinfo(local_name,
+ local_name,
+ port_buffer,
+ nf_to_af(udp_rr_request->ipfamily),
+ SOCK_DGRAM,
+ IPPROTO_UDP,
+ 0);
+
+ s_data = create_data_socket(local_res);
+
+ if (s_data == INVALID_SOCKET) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+
+ exit(1);
+ }
+
+ /* now get the port number assigned by the system */
+ addrlen = sizeof(myaddr_in);
+ if (getsockname(s_data,
+ (struct sockaddr *)&myaddr_in,
+ &addrlen) == SOCKET_ERROR){
+ netperf_response.content.serv_errno = errno;
+ close(s_data);
+ send_response();
+
+ exit(1);
+ }
+
+ /* Now myaddr_in contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ udp_rr_response->data_port_number =
+ (int) ntohs(((struct sockaddr_in *)&myaddr_in)->sin_port);
+ netperf_response.content.serv_errno = 0;
+
+ if (debug) {
+ fprintf(where,
+ "recv port number %d\n",
+ ((struct sockaddr_in *)&myaddr_in)->sin_port);
+ fflush(where);
+ }
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a 0.0 to */
+ /* the initiator. */
+
+ udp_rr_response->cpu_rate = (float)0.0; /* assume no cpu */
+ udp_rr_response->measure_cpu = 0;
+ if (udp_rr_request->measure_cpu) {
+ udp_rr_response->measure_cpu = 1;
+ udp_rr_response->cpu_rate = calibrate_local_cpu(udp_rr_request->cpu_rate);
+ }
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ udp_rr_response->send_buf_size = lss_size;
+ udp_rr_response->recv_buf_size = lsr_size;
+ udp_rr_response->so_rcvavoid = loc_rcvavoid;
+ udp_rr_response->so_sndavoid = loc_sndavoid;
+
+ send_response();
+
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(udp_rr_request->measure_cpu);
+
+#ifdef WIN32
+ /* this is used so the timer thread can close the socket out from */
+ /* under us, which to date is the easiest/cleanest/least */
+ /* Windows-specific way I can find to force the winsock calls to */
+ /* return WSAEINTR with the test is over. anything that will run on */
+ /* 95 and NT and is closer to what netperf expects from Unix signals */
+ /* and such would be appreciated raj 1/96 */
+ win_kludge_socket = s_data;
+#endif /* WIN32 */
+
+ if (udp_rr_request->test_length > 0) {
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(udp_rr_request->test_length + PAD_TIME);
+ }
+ else {
+ times_up = 1;
+ trans_remaining = udp_rr_request->test_length * -1;
+ }
+
+ addrlen = sizeof(peeraddr);
+ bzero((char *)&peeraddr, addrlen);
+
+ trans_received = 0;
+
+ while ((!times_up) || (trans_remaining > 0)) {
+
+ /* receive the request from the other side */
+ if ((request_bytes_recvd = recvfrom(s_data,
+ recv_ring->buffer_ptr,
+ udp_rr_request->request_size,
+ 0,
+ (struct sockaddr *)&peeraddr,
+ &addrlen)) != udp_rr_request->request_size) {
+ if ( SOCKET_EINTR(request_bytes_recvd) )
+ {
+ /* we must have hit the end of test time. */
+ break;
+ }
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+ recv_ring = recv_ring->next;
+
+ /* Now, send the response to the remote */
+ if ((response_bytes_sent = sendto(s_data,
+ send_ring->buffer_ptr,
+ udp_rr_request->response_size,
+ 0,
+ (struct sockaddr *)&peeraddr,
+ addrlen)) !=
+ udp_rr_request->response_size) {
+ if ( SOCKET_EINTR(response_bytes_sent) )
+ {
+ /* we have hit end of test time. */
+ break;
+ }
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+ send_ring = send_ring->next;
+
+ trans_received++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_udp_rr: Transaction %d complete.\n",
+ trans_received);
+ fflush(where);
+ }
+
+ }
+
+
+ /* The loop now exits due to timeout or transaction count being */
+ /* reached */
+
+ cpu_stop(udp_rr_request->measure_cpu,&elapsed_time);
+
+ if (times_up) {
+ /* we ended the test by time, which was at least 2 seconds */
+ /* longer than we wanted to run. so, we want to subtract */
+ /* PAD_TIME from the elapsed_time. */
+ elapsed_time -= PAD_TIME;
+ }
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_udp_rr: got %d transactions\n",
+ trans_received);
+ fflush(where);
+ }
+
+ udp_rr_results->bytes_received = (trans_received *
+ (udp_rr_request->request_size +
+ udp_rr_request->response_size));
+ udp_rr_results->trans_received = trans_received;
+ udp_rr_results->elapsed_time = elapsed_time;
+ udp_rr_results->cpu_method = cpu_method;
+ udp_rr_results->num_cpus = lib_num_loc_cpus;
+ if (udp_rr_request->measure_cpu) {
+ udp_rr_results->cpu_util = calc_cpu_util(elapsed_time);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_udp_rr: test complete, sending results.\n");
+ fflush(where);
+ }
+
+ send_response();
+
+ /* we are done with the socket now */
+ close(s_data);
+
+ }
+
+
+ /* this routine implements the receive (netserver) side of a TCP_RR */
+ /* test */
+void
+recv_tcp_rr()
+{
+
+ struct ring_elt *send_ring;
+ struct ring_elt *recv_ring;
+
+ struct addrinfo *local_res;
+ char local_name[BUFSIZ];
+ char port_buffer[PORTBUFSIZE];
+
+ struct sockaddr_storage myaddr_in,
+ peeraddr_in;
+ SOCKET s_listen,s_data;
+ netperf_socklen_t addrlen;
+ char *temp_message_ptr;
+ int trans_received;
+ int trans_remaining;
+ int bytes_sent;
+ int request_bytes_recvd;
+ int request_bytes_remaining;
+ int timed_out = 0;
+ int sock_closed = 0;
+ float elapsed_time;
+
+ struct tcp_rr_request_struct *tcp_rr_request;
+ struct tcp_rr_response_struct *tcp_rr_response;
+ struct tcp_rr_results_struct *tcp_rr_results;
+
+ tcp_rr_request =
+ (struct tcp_rr_request_struct *)netperf_request.content.test_specific_data;
+ tcp_rr_response =
+ (struct tcp_rr_response_struct *)netperf_response.content.test_specific_data;
+ tcp_rr_results =
+ (struct tcp_rr_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_tcp_rr: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_tcp_rr: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = TCP_RR_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_tcp_rr: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* allocate the recv and send rings with the requested alignments */
+ /* and offsets. raj 7/94 */
+ if (debug) {
+ fprintf(where,"recv_tcp_rr: requested recv alignment of %d offset %d\n",
+ tcp_rr_request->recv_alignment,
+ tcp_rr_request->recv_offset);
+ fprintf(where,"recv_tcp_rr: requested send alignment of %d offset %d\n",
+ tcp_rr_request->send_alignment,
+ tcp_rr_request->send_offset);
+ fflush(where);
+ }
+
+ /* at some point, these need to come to us from the remote system */
+ if (send_width == 0) send_width = 1;
+ if (recv_width == 0) recv_width = 1;
+
+ send_ring = allocate_buffer_ring(send_width,
+ tcp_rr_request->response_size,
+ tcp_rr_request->send_alignment,
+ tcp_rr_request->send_offset);
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ tcp_rr_request->request_size,
+ tcp_rr_request->recv_alignment,
+ tcp_rr_request->recv_offset);
+
+
+ /* Grab a socket to listen on, and then listen on it. */
+
+ if (debug) {
+ fprintf(where,"recv_tcp_rr: grabbing a socket...\n");
+ fflush(where);
+ }
+
+ /* create_data_socket expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lss_size_req = tcp_rr_request->send_buf_size;
+ lsr_size_req = tcp_rr_request->recv_buf_size;
+ loc_nodelay = tcp_rr_request->no_delay;
+ loc_rcvavoid = tcp_rr_request->so_rcvavoid;
+ loc_sndavoid = tcp_rr_request->so_sndavoid;
+
+ set_hostname_and_port(local_name,
+ port_buffer,
+ nf_to_af(tcp_rr_request->ipfamily),
+ tcp_rr_request->port);
+
+ local_res = complete_addrinfo(local_name,
+ local_name,
+ port_buffer,
+ nf_to_af(tcp_rr_request->ipfamily),
+ SOCK_STREAM,
+ IPPROTO_TCP,
+ 0);
+
+ s_listen = create_data_socket(local_res);
+
+ if (s_listen == INVALID_SOCKET) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+
+ exit(1);
+ }
+
+
+#ifdef WIN32
+ /* The test timer can fire during operations on the listening socket,
+ so to make the start_timer below work we have to move
+ it to close s_listen while we are blocked on accept. */
+ win_kludge_socket2 = s_listen;
+#endif
+
+
+ /* Now, let's set-up the socket to listen for connections */
+ if (listen(s_listen, 5) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+
+ /* now get the port number assigned by the system */
+ addrlen = sizeof(myaddr_in);
+ if (getsockname(s_listen,
+ (struct sockaddr *)&myaddr_in,
+ &addrlen) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+ /* Now myaddr_in contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ tcp_rr_response->data_port_number =
+ (int) ntohs(((struct sockaddr_in *)&myaddr_in)->sin_port);
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a 0.0 to */
+ /* the initiator. */
+
+ tcp_rr_response->cpu_rate = (float)0.0; /* assume no cpu */
+ tcp_rr_response->measure_cpu = 0;
+
+ if (tcp_rr_request->measure_cpu) {
+ tcp_rr_response->measure_cpu = 1;
+ tcp_rr_response->cpu_rate = calibrate_local_cpu(tcp_rr_request->cpu_rate);
+ }
+
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ tcp_rr_response->send_buf_size = lss_size;
+ tcp_rr_response->recv_buf_size = lsr_size;
+ tcp_rr_response->no_delay = loc_nodelay;
+ tcp_rr_response->so_rcvavoid = loc_rcvavoid;
+ tcp_rr_response->so_sndavoid = loc_sndavoid;
+ tcp_rr_response->test_length = tcp_rr_request->test_length;
+ send_response();
+
+ addrlen = sizeof(peeraddr_in);
+
+ if ((s_data = accept(s_listen,
+ (struct sockaddr *)&peeraddr_in,
+ &addrlen)) == INVALID_SOCKET) {
+ /* Let's just punt. The remote will be given some information */
+ close(s_listen);
+
+ exit(1);
+ }
+
+#ifdef KLUDGE_SOCKET_OPTIONS
+ /* this is for those systems which *INCORRECTLY* fail to pass */
+ /* attributes across an accept() call. Including this goes against */
+ /* my better judgement :( raj 11/95 */
+
+ kludge_socket_options(s_data);
+
+#endif /* KLUDGE_SOCKET_OPTIONS */
+
+#ifdef WIN32
+ /* this is used so the timer thread can close the socket out from */
+ /* under us, which to date is the easiest/cleanest/least */
+ /* Windows-specific way I can find to force the winsock calls to */
+ /* return WSAEINTR with the test is over. anything that will run on */
+ /* 95 and NT and is closer to what netperf expects from Unix signals */
+ /* and such would be appreciated raj 1/96 */
+ win_kludge_socket = s_data;
+#endif /* WIN32 */
+
+ if (debug) {
+ fprintf(where,"recv_tcp_rr: accept completes on the data connection.\n");
+ fflush(where);
+ }
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(tcp_rr_request->measure_cpu);
+
+ /* The loop will exit when we hit the end of the test time, or when */
+ /* we have exchanged the requested number of transactions. */
+
+ if (tcp_rr_request->test_length > 0) {
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(tcp_rr_request->test_length + PAD_TIME);
+ }
+ else {
+ times_up = 1;
+ trans_remaining = tcp_rr_request->test_length * -1;
+ }
+
+ trans_received = 0;
+
+ while ((!times_up) || (trans_remaining > 0)) {
+ temp_message_ptr = recv_ring->buffer_ptr;
+ request_bytes_remaining = tcp_rr_request->request_size;
+ while(request_bytes_remaining > 0) {
+ if((request_bytes_recvd=recv(s_data,
+ temp_message_ptr,
+ request_bytes_remaining,
+ 0)) == SOCKET_ERROR) {
+ if (SOCKET_EINTR(request_bytes_recvd))
+ {
+ timed_out = 1;
+ break;
+ }
+
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+ else if( request_bytes_recvd == 0 ) {
+ if (debug) {
+ fprintf(where,"zero is my hero\n");
+ fflush(where);
+ }
+ sock_closed = 1;
+ break;
+ }
+ else {
+ request_bytes_remaining -= request_bytes_recvd;
+ temp_message_ptr += request_bytes_recvd;
+ }
+ }
+
+ recv_ring = recv_ring->next;
+
+ if ((timed_out) || (sock_closed)) {
+ /* we hit the end of the test based on time - or the socket
+ closed on us along the way. bail out of here now... */
+ if (debug) {
+ fprintf(where,"yo5\n");
+ fflush(where);
+ }
+ break;
+ }
+
+ /* Now, send the response to the remote */
+ if((bytes_sent=send(s_data,
+ send_ring->buffer_ptr,
+ tcp_rr_request->response_size,
+ 0)) == SOCKET_ERROR) {
+ if (SOCKET_EINTR(bytes_sent)) {
+ /* the test timer has popped */
+ timed_out = 1;
+ fprintf(where,"yo6\n");
+ fflush(where);
+ break;
+ }
+ netperf_response.content.serv_errno = 992;
+ send_response();
+ exit(1);
+ }
+
+ send_ring = send_ring->next;
+
+ trans_received++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+ }
+
+
+ /* The loop now exits due to timeout or transaction count being */
+ /* reached */
+
+ cpu_stop(tcp_rr_request->measure_cpu,&elapsed_time);
+
+ stop_timer();
+
+ if (timed_out) {
+ /* we ended the test by time, which was at least 2 seconds */
+ /* longer than we wanted to run. so, we want to subtract */
+ /* PAD_TIME from the elapsed_time. */
+ elapsed_time -= PAD_TIME;
+ }
+
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_tcp_rr: got %d transactions\n",
+ trans_received);
+ fflush(where);
+ }
+
+ tcp_rr_results->bytes_received = (trans_received *
+ (tcp_rr_request->request_size +
+ tcp_rr_request->response_size));
+ tcp_rr_results->trans_received = trans_received;
+ tcp_rr_results->elapsed_time = elapsed_time;
+ tcp_rr_results->cpu_method = cpu_method;
+ tcp_rr_results->num_cpus = lib_num_loc_cpus;
+ if (tcp_rr_request->measure_cpu) {
+ tcp_rr_results->cpu_util = calc_cpu_util(elapsed_time);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_tcp_rr: test complete, sending results.\n");
+ fflush(where);
+ }
+
+ /* we are now done with the sockets */
+ close(s_data);
+ close(s_listen);
+
+ send_response();
+
+}
+
+
+void
+loc_cpu_rate()
+{
+#if defined(USE_LOOPER)
+ float dummy;
+#endif
+
+ /* a rather simple little test - it merely calibrates the local cpu */
+ /* and prints the results. There are no headers to allow someone to */
+ /* find a rate and use it in other tests automagically by setting a */
+ /* variable equal to the output of this test. We ignore any rates */
+ /* that may have been specified. In fact, we ignore all of the */
+ /* command line args! */
+
+ fprintf(where,
+ "%g",
+ calibrate_local_cpu(0.0));
+
+ if (verbosity > 1)
+ fprintf(where,
+ "\nThere %s %d local %s\n",
+ (lib_num_loc_cpus > 1) ? "are" : "is",
+ lib_num_loc_cpus,
+ (lib_num_loc_cpus > 1) ? "cpus" : "cpu");
+
+ /* we need the cpu_start, cpu_stop in the looper case to kill the */
+ /* child proceses raj 4/95 */
+
+#ifdef USE_LOOPER
+ cpu_start(1);
+ cpu_stop(1,&dummy);
+#endif /* USE_LOOPER */
+
+}
+
+void
+rem_cpu_rate()
+{
+ /* this test is much like the local variant, except that it works for */
+ /* the remote system, so in this case, we do pay attention to the */
+ /* value of the '-H' command line argument. */
+
+ fprintf(where,
+ "%g",
+ calibrate_remote_cpu());
+
+ if (verbosity > 1)
+ fprintf(where,
+ "\nThere %s %d remote %s\n",
+ (lib_num_rem_cpus > 1) ? "are" : "is",
+ lib_num_rem_cpus,
+ (lib_num_rem_cpus > 1) ? "cpus" : "cpu");
+
+}
+
+
+ /* this test is intended to test the performance of establishing a
+ connection, exchanging a request/response pair, and repeating. it
+ is expected that this would be a good starting-point for
+ comparision of T/TCP with classic TCP for transactional workloads.
+ it will also look (can look) much like the communication pattern
+ of http for www access. */
+
+void
+send_tcp_conn_rr(char remote_host[])
+{
+
+ char *tput_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans.\n\
+Send Recv Size Size Time Rate \n\
+bytes Bytes bytes bytes secs. per sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %7.2f \n";
+ char *tput_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *cpu_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem\n\
+Send Recv Size Size Time Rate local remote local remote\n\
+bytes bytes bytes bytes secs. per sec %% %% us/Tr us/Tr\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f\n";
+
+ char *cpu_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %-6.2f %-6.2f %-6.2f %-6.3f %-6.3f\n";
+
+ char *cpu_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *ksink_fmt = "\n\
+Alignment Offset\n\
+Local Remote Local Remote\n\
+Send Recv Send Recv\n\
+%5d %5d %5d %5d\n";
+
+
+ int timed_out = 0;
+ float elapsed_time;
+
+ int len;
+ struct ring_elt *send_ring;
+ struct ring_elt *recv_ring;
+ char *temp_message_ptr;
+ int nummessages;
+ SOCKET send_socket;
+ int trans_remaining;
+ double bytes_xferd;
+ int rsp_bytes_left;
+ int rsp_bytes_recvd;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+ double thruput;
+
+ struct addrinfo *local_res;
+ struct addrinfo *remote_res;
+
+ int myport;
+ int ret;
+
+ struct tcp_conn_rr_request_struct *tcp_conn_rr_request;
+ struct tcp_conn_rr_response_struct *tcp_conn_rr_response;
+ struct tcp_conn_rr_results_struct *tcp_conn_rr_result;
+
+ tcp_conn_rr_request =
+ (struct tcp_conn_rr_request_struct *)netperf_request.content.test_specific_data;
+ tcp_conn_rr_response =
+ (struct tcp_conn_rr_response_struct *)netperf_response.content.test_specific_data;
+ tcp_conn_rr_result =
+ (struct tcp_conn_rr_results_struct *)netperf_response.content.test_specific_data;
+
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ time_hist = HIST_new();
+ }
+#endif /* WANT_HISTOGRAM */
+
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ complete_addrinfos(&remote_res,
+ &local_res,
+ remote_host,
+ SOCK_STREAM,
+ IPPROTO_TCP,
+ 0);
+
+ if ( print_headers ) {
+ print_top_test_header("TCP Connect/Request/Response TEST",local_res,remote_res);
+ }
+
+ /* initialize a few counters */
+
+ nummessages = 0;
+ bytes_xferd = 0.0;
+ times_up = 0;
+
+ /* set-up the data buffers with the requested alignment and offset */
+ if (send_width == 0) send_width = 1;
+ if (recv_width == 0) recv_width = 1;
+
+ send_ring = allocate_buffer_ring(send_width,
+ req_size,
+ local_send_align,
+ local_send_offset);
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ rsp_size,
+ local_recv_align,
+ local_recv_offset);
+
+
+ if (debug) {
+ fprintf(where,"send_tcp_conn_rr: send_socket obtained...\n");
+ }
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back.*/
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ if (!no_control) {
+
+ /* Tell the remote end to do a listen. The server alters the
+ socket paramters on the other side at this point, hence the
+ reason for all the values being passed in the setup message. If
+ the user did not specify any of the parameters, they will be
+ passed as 0, which will indicate to the remote that no changes
+ beyond the system's default should be used. Alignment is the
+ exception, it will default to 8, which will be no alignment
+ alterations. */
+
+ netperf_request.content.request_type = DO_TCP_CRR;
+ tcp_conn_rr_request->recv_buf_size = rsr_size_req;
+ tcp_conn_rr_request->send_buf_size = rss_size_req;
+ tcp_conn_rr_request->recv_alignment = remote_recv_align;
+ tcp_conn_rr_request->recv_offset = remote_recv_offset;
+ tcp_conn_rr_request->send_alignment = remote_send_align;
+ tcp_conn_rr_request->send_offset = remote_send_offset;
+ tcp_conn_rr_request->request_size = req_size;
+ tcp_conn_rr_request->response_size = rsp_size;
+ tcp_conn_rr_request->no_delay = rem_nodelay;
+ tcp_conn_rr_request->measure_cpu = remote_cpu_usage;
+ tcp_conn_rr_request->cpu_rate = remote_cpu_rate;
+ tcp_conn_rr_request->so_rcvavoid = rem_rcvavoid;
+ tcp_conn_rr_request->so_sndavoid = rem_sndavoid;
+ if (test_time) {
+ tcp_conn_rr_request->test_length = test_time;
+ }
+ else {
+ tcp_conn_rr_request->test_length = test_trans * -1;
+ }
+ tcp_conn_rr_request->port = atoi(remote_data_port);
+ tcp_conn_rr_request->ipfamily = af_to_nf(remote_res->ai_family);
+
+ if (debug > 1) {
+ fprintf(where,"netperf: send_tcp_conn_rr: requesting TCP crr test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant
+ socket parameters for this test type. We will put them back
+ into the variables here so they can be displayed if desired.
+ The remote will have calibrated CPU if necessary, and will have
+ done all the needed set-up we will have calibrated the cpu
+ locally before sending the request, and will grab the counter
+ value right after the connect returns. The remote will grab the
+ counter right after the accept call. This saves the hassle of
+ extra messages being sent for the TCP tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ rsr_size = tcp_conn_rr_response->recv_buf_size;
+ rss_size = tcp_conn_rr_response->send_buf_size;
+ rem_nodelay = tcp_conn_rr_response->no_delay;
+ remote_cpu_usage = tcp_conn_rr_response->measure_cpu;
+ remote_cpu_rate = tcp_conn_rr_response->cpu_rate;
+ /* make sure that port numbers are in network order */
+ set_port_number(remote_res,
+ (unsigned short)tcp_conn_rr_response->data_port_number);
+
+ if (debug) {
+ fprintf(where,"remote listen done.\n");
+ fprintf(where,"remote port is %u\n",get_port_number(remote_res));
+ fflush(where);
+ }
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+ exit(1);
+ }
+ }
+#ifdef WANT_DEMO
+ DEMO_RR_SETUP(100)
+#endif
+
+ /* pick a nice random spot between client_port_min and */
+ /* client_port_max for our initial port number */
+ srand(getpid());
+ if (client_port_max - client_port_min) {
+ myport = client_port_min +
+ (rand() % (client_port_max - client_port_min));
+ }
+ else {
+ myport = client_port_min;
+ }
+ /* there will be a ++ before the first call to bind, so subtract one */
+ myport--;
+ /* Set-up the test end conditions. For a request/response test, they */
+ /* can be either time or transaction based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ trans_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+
+ cpu_start(local_cpu_usage);
+
+#ifdef WANT_DEMO
+ if (demo_mode) {
+ HIST_timestamp(demo_one_ptr);
+ }
+#endif
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return false. */
+ /* When the test is controlled by byte count, the time test will */
+ /* always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. I think I */
+ /* just arbitrarily decrement trans_remaining for the timed test, but */
+ /* will not do that just yet... One other question is whether or not */
+ /* the send buffer and the receive buffer should be the same buffer. */
+
+ while ((!times_up) || (trans_remaining > 0)) {
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ /* timestamp just before our call to create the socket, and then */
+ /* again just after the receive raj 3/95 */
+ HIST_timestamp(&time_one);
+ }
+#endif /* WANT_HISTOGRAM */
+
+newport:
+ /* pick a new port number */
+ myport++;
+
+ /* wrap the port number when we get to client_port_max. NOTE, some */
+ /* broken TCP's might treat the port number as a signed 16 bit */
+ /* quantity. we aren't interested in testing such broken */
+ /* implementations :) so we won't make sure that it is below 32767 */
+ /* raj 8/94 */
+ if (myport >= client_port_max) {
+ myport = client_port_min;
+ }
+
+ /* we do not want to use the port number that the server is */
+ /* sitting at - this would cause us to fail in a loopback test. we */
+ /* could just rely on the failure of the bind to get us past this, */
+ /* but I'm guessing that in this one case at least, it is much */
+ /* faster, given that we *know* that port number is already in use */
+ /* (or rather would be in a loopback test) */
+
+ if (myport == get_port_number(remote_res)) myport++;
+
+ if (debug) {
+ if ((nummessages % 100) == 0) {
+ printf("port %d\n",myport);
+ }
+ }
+
+ /* set up the data socket */
+ set_port_number(local_res, (unsigned short)myport);
+ send_socket = create_data_socket(local_res);
+
+ if (send_socket == INVALID_SOCKET) {
+ perror("netperf: send_tcp_conn_rr: tcp stream data socket");
+ exit(1);
+ }
+
+
+ /* we used to call bind here, but that is now taken-care-of by the
+ create_data_socket routine. */
+
+ /* Connect up to the remote port on the data socket */
+ if ((ret = connect(send_socket,
+ remote_res->ai_addr,
+ remote_res->ai_addrlen)) == INVALID_SOCKET){
+ if (SOCKET_EINTR(ret))
+ {
+ /* we hit the end of a */
+ /* timed test. */
+ timed_out = 1;
+ break;
+ }
+ if ((SOCKET_EADDRINUSE(ret)) || SOCKET_EADDRNOTAVAIL(ret)) {
+ /* likely something our explicit bind() would have caught in
+ the past, so go get another port, via create_data_socket.
+ yes, this is a bit more overhead than before, but the
+ condition should be rather rare. raj 2005-02-08 */
+ close(send_socket);
+ goto newport;
+ }
+ perror("netperf: data socket connect failed");
+ printf("\tattempted to connect on socket %d to port %d",
+ send_socket,
+ get_port_number(remote_res));
+ printf(" from port %d \n",get_port_number(local_res));
+ exit(1);
+ }
+
+
+ /* send the request */
+ if((len=send(send_socket,
+ send_ring->buffer_ptr,
+ req_size,
+ 0)) != req_size) {
+ if (SOCKET_EINTR(len))
+ {
+ /* we hit the end of a */
+ /* timed test. */
+ timed_out = 1;
+ break;
+ }
+ perror("send_tcp_conn_rr: data send error");
+ exit(1);
+ }
+ send_ring = send_ring->next;
+
+ /* receive the response */
+ rsp_bytes_left = rsp_size;
+ temp_message_ptr = recv_ring->buffer_ptr;
+
+
+ do {
+ rsp_bytes_recvd = recv(send_socket,
+ temp_message_ptr,
+ rsp_bytes_left,
+ 0);
+ if (rsp_bytes_recvd > 0) {
+ rsp_bytes_left -= rsp_bytes_recvd;
+ temp_message_ptr += rsp_bytes_recvd;
+ }
+ else {
+ break;
+ }
+ } while (rsp_bytes_left);
+
+
+ /* OK, we are out of the loop - now what? */
+ if (rsp_bytes_recvd < 0) {
+ /* did the timer hit, or was there an error? */
+ if (SOCKET_EINTR(rsp_bytes_recvd))
+ {
+ /* We hit the end of a timed test. */
+ timed_out = 1;
+ break;
+ }
+ perror("send_tcp_conn_rr: data recv error");
+ exit(1);
+ }
+
+ /* if this is a no_control test, we initiate connection close,
+ otherwise the remote netserver does it to remain just like
+ previous behaviour. raj 2007-27-08 */
+ if (!no_control) {
+ shutdown(send_socket,SHUT_WR);
+ }
+
+ /* we are expecting to get either a return of zero indicating
+ connection close, or an error. */
+ rsp_bytes_recvd = recv(send_socket,
+ temp_message_ptr,
+ 1,
+ 0);
+
+ /* our exit from the while loop should generally be when */
+ /* tmp_bytes_recvd is equal to zero, which implies the connection */
+ /* has been closed by the server side. By waiting until we get the */
+ /* zero return we can avoid race conditions that stick us with the */
+ /* TIME_WAIT connection and not the server. raj 8/96 */
+
+ if (rsp_bytes_recvd == 0) {
+ /* connection close, call close. we assume that the requisite */
+ /* number of bytes have been received */
+ recv_ring = recv_ring->next;
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ HIST_timestamp(&time_two);
+ HIST_add(time_hist,delta_micro(&time_one,&time_two));
+ }
+#endif /* WANT_HISTOGRAM */
+
+#ifdef WANT_DEMO
+ DEMO_RR_INTERVAL(1)
+#endif
+
+ nummessages++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug > 3) {
+ fprintf(where,
+ "Transaction %d completed on local port %d\n",
+ nummessages,
+ get_port_number(local_res));
+ fflush(where);
+ }
+
+ close(send_socket);
+
+ }
+ else {
+ /* it was less than zero - an error occured */
+ if (SOCKET_EINTR(rsp_bytes_recvd))
+ {
+ /* We hit the end of a timed test. */
+ timed_out = 1;
+ break;
+ }
+ perror("send_tcp_conn_rr: data recv error");
+ exit(1);
+ }
+
+ }
+
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being measured? */
+ /* how long did we really run? */
+
+ if (!no_control) {
+ /* Get the statistics from the remote end. The remote will have
+ calculated service demand and all those interesting things. If
+ it wasn't supposed to care, it will return obvious values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+ }
+
+ /* We now calculate what our thruput was for the test. In the future, */
+ /* we may want to include a calculation of the thruput measured by */
+ /* the remote, but it should be the case that for a TCP stream test, */
+ /* that the two numbers should be *very* close... We calculate */
+ /* bytes_sent regardless of the way the test length was controlled. */
+ /* If it was time, we needed to, and if it was by bytes, the user may */
+ /* have specified a number of bytes that wasn't a multiple of the */
+ /* send_size, so we really didn't send what he asked for ;-) We use */
+ /* Kbytes/s as the units of thruput for a TCP stream test, where K = */
+ /* 1024. A future enhancement *might* be to choose from a couple of */
+ /* unit selections. */
+
+ bytes_xferd = (req_size * nummessages) + (rsp_size * nummessages);
+ thruput = calc_thruput(bytes_xferd);
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+ if (local_cpu_rate == 0.0) {
+ fprintf(where,
+ "WARNING WARNING WARNING WARNING WARNING WARNING WARNING!\n");
+ fprintf(where,
+ "Local CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+ local_cpu_utilization = calc_cpu_util(0.0);
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ local_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ }
+
+ if (remote_cpu_usage) {
+ if (remote_cpu_rate == 0.0) {
+ fprintf(where,
+ "DANGER DANGER DANGER DANGER DANGER DANGER DANGER!\n");
+ fprintf(where,
+ "Remote CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+ remote_cpu_utilization = tcp_conn_rr_result->cpu_util;
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ remote_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ remote_cpu_utilization,
+ tcp_conn_rr_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand);
+ }
+ break;
+ case 1:
+ case 2:
+
+ if (print_headers) {
+ fprintf(where,
+ cpu_title,
+ local_cpu_method,
+ remote_cpu_method);
+ }
+
+ fprintf(where,
+ cpu_fmt_1_line_1, /* the format string */
+ lss_size, /* local sendbuf size */
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* guess */
+ elapsed_time, /* how long was the test */
+ nummessages/elapsed_time,
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand); /* remote service demand */
+ fprintf(where,
+ cpu_fmt_1_line_2,
+ rss_size,
+ rsr_size);
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ nummessages/elapsed_time);
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,tput_title,format_units());
+ }
+
+ fprintf(where,
+ tput_fmt_1_line_1, /* the format string */
+ lss_size,
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* how large were the responses */
+ elapsed_time, /* how long did it take */
+ nummessages/elapsed_time);
+ fprintf(where,
+ tput_fmt_1_line_2,
+ rss_size, /* remote recvbuf size */
+ rsr_size);
+
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* TCP statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ fprintf(where,
+ ksink_fmt,
+ local_send_align,
+ remote_recv_offset,
+ local_send_offset,
+ remote_recv_offset);
+
+#ifdef WANT_HISTOGRAM
+ fprintf(where,"\nHistogram of request/response times\n");
+ fflush(where);
+ HIST_report(time_hist);
+#endif /* WANT_HISTOGRAM */
+
+ }
+
+}
+
+
+void
+recv_tcp_conn_rr()
+{
+
+ char *message;
+ struct addrinfo *local_res;
+ char local_name[BUFSIZ];
+ char port_buffer[PORTBUFSIZE];
+
+ struct sockaddr_storage myaddr_in, peeraddr_in;
+ SOCKET s_listen,s_data;
+ netperf_socklen_t addrlen;
+ char *recv_message_ptr;
+ char *send_message_ptr;
+ char *temp_message_ptr;
+ int trans_received;
+ int trans_remaining;
+ int bytes_sent;
+ int request_bytes_recvd;
+ int request_bytes_remaining;
+ int timed_out = 0;
+ float elapsed_time;
+
+ struct tcp_conn_rr_request_struct *tcp_conn_rr_request;
+ struct tcp_conn_rr_response_struct *tcp_conn_rr_response;
+ struct tcp_conn_rr_results_struct *tcp_conn_rr_results;
+
+ tcp_conn_rr_request =
+ (struct tcp_conn_rr_request_struct *)netperf_request.content.test_specific_data;
+ tcp_conn_rr_response =
+ (struct tcp_conn_rr_response_struct *)netperf_response.content.test_specific_data;
+ tcp_conn_rr_results =
+ (struct tcp_conn_rr_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_tcp_conn_rr: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_tcp_conn_rr: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = TCP_CRR_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_tcp_conn_rr: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* set-up the data buffer with the requested alignment and offset */
+ message = (char *)malloc(DATABUFFERLEN);
+ if (message == NULL) {
+ printf("malloc(%d) failed!\n", DATABUFFERLEN);
+ exit(1);
+ }
+
+ /* We now alter the message_ptr variables to be at the desired */
+ /* alignments with the desired offsets. */
+
+ if (debug) {
+ fprintf(where,
+ "recv_tcp_conn_rr: requested recv alignment of %d offset %d\n",
+ tcp_conn_rr_request->recv_alignment,
+ tcp_conn_rr_request->recv_offset);
+ fprintf(where,
+ "recv_tcp_conn_rr: requested send alignment of %d offset %d\n",
+ tcp_conn_rr_request->send_alignment,
+ tcp_conn_rr_request->send_offset);
+ fflush(where);
+ }
+
+ recv_message_ptr = ALIGN_BUFFER(message, tcp_conn_rr_request->recv_alignment, tcp_conn_rr_request->recv_offset);
+
+ send_message_ptr = ALIGN_BUFFER(message, tcp_conn_rr_request->send_alignment, tcp_conn_rr_request->send_offset);
+
+ if (debug) {
+ fprintf(where,"recv_tcp_conn_rr: receive alignment and offset set...\n");
+ fflush(where);
+ }
+
+ /* Grab a socket to listen on, and then listen on it. */
+
+ if (debug) {
+ fprintf(where,"recv_tcp_conn_rr: grabbing a socket...\n");
+ fflush(where);
+ }
+
+ /* create_data_socket expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lss_size_req = tcp_conn_rr_request->send_buf_size;
+ lsr_size_req = tcp_conn_rr_request->recv_buf_size;
+ loc_nodelay = tcp_conn_rr_request->no_delay;
+ loc_rcvavoid = tcp_conn_rr_request->so_rcvavoid;
+ loc_sndavoid = tcp_conn_rr_request->so_sndavoid;
+
+ set_hostname_and_port(local_name,
+ port_buffer,
+ nf_to_af(tcp_conn_rr_request->ipfamily),
+ tcp_conn_rr_request->port);
+
+ local_res = complete_addrinfo(local_name,
+ local_name,
+ port_buffer,
+ nf_to_af(tcp_conn_rr_request->ipfamily),
+ SOCK_STREAM,
+ IPPROTO_TCP,
+ 0);
+
+ s_listen = create_data_socket(local_res);
+
+ if (s_listen == INVALID_SOCKET) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ if (debug) {
+ fprintf(where,"could not create data socket\n");
+ fflush(where);
+ }
+ exit(1);
+ }
+
+#ifdef WIN32
+ /* The test timer can fire during operations on the listening socket,
+ so to make the start_timer below work we have to move
+ it to close s_listen while we are blocked on accept. */
+ win_kludge_socket2 = s_listen;
+#endif
+
+
+ /* Now, let's set-up the socket to listen for connections */
+ if (listen(s_listen, 5) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+ if (debug) {
+ fprintf(where,"could not listen\n");
+ fflush(where);
+ }
+ exit(1);
+ }
+
+ /* now get the port number assigned by the system */
+ addrlen = sizeof(myaddr_in);
+ if (getsockname(s_listen,
+ (struct sockaddr *)&myaddr_in,
+ &addrlen) == SOCKET_ERROR){
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+ if (debug) {
+ fprintf(where,"could not getsockname\n");
+ fflush(where);
+ }
+ exit(1);
+ }
+
+ /* Now myaddr_in contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ tcp_conn_rr_response->data_port_number =
+ (int) ntohs(((struct sockaddr_in *)&myaddr_in)->sin_port);
+ if (debug) {
+ fprintf(where,"telling the remote to call me at %d\n",
+ tcp_conn_rr_response->data_port_number);
+ fflush(where);
+ }
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a 0.0 to */
+ /* the initiator. */
+
+ tcp_conn_rr_response->cpu_rate = (float)0.0; /* assume no cpu */
+ if (tcp_conn_rr_request->measure_cpu) {
+ tcp_conn_rr_response->measure_cpu = 1;
+ tcp_conn_rr_response->cpu_rate =
+ calibrate_local_cpu(tcp_conn_rr_request->cpu_rate);
+ }
+
+
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ tcp_conn_rr_response->send_buf_size = lss_size;
+ tcp_conn_rr_response->recv_buf_size = lsr_size;
+ tcp_conn_rr_response->no_delay = loc_nodelay;
+ tcp_conn_rr_response->so_rcvavoid = loc_rcvavoid;
+ tcp_conn_rr_response->so_sndavoid = loc_sndavoid;
+
+ send_response();
+
+ addrlen = sizeof(peeraddr_in);
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(tcp_conn_rr_request->measure_cpu);
+
+ /* The loop will exit when the sender does a shutdown, which will */
+ /* return a length of zero */
+
+ if (tcp_conn_rr_request->test_length > 0) {
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(tcp_conn_rr_request->test_length + PAD_TIME);
+ }
+ else {
+ times_up = 1;
+ trans_remaining = tcp_conn_rr_request->test_length * -1;
+ }
+
+ trans_received = 0;
+
+ while ((!times_up) || (trans_remaining > 0)) {
+
+ /* accept a connection from the remote */
+#ifdef WIN32
+ /* The test timer will probably fire during this accept,
+ so to make the start_timer above work we have to move
+ it to close s_listen while we are blocked on accept. */
+ win_kludge_socket = s_listen;
+#endif
+ if ((s_data=accept(s_listen,
+ (struct sockaddr *)&peeraddr_in,
+ &addrlen)) == INVALID_SOCKET) {
+ if (errno == EINTR) {
+ /* the timer popped */
+ timed_out = 1;
+ break;
+ }
+ fprintf(where,"recv_tcp_conn_rr: accept: errno = %d\n",errno);
+ fflush(where);
+ close(s_listen);
+
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"recv_tcp_conn_rr: accepted data connection.\n");
+ fflush(where);
+ }
+
+#ifdef WIN32
+ /* this is used so the timer thread can close the socket out from */
+ /* under us, which to date is the easiest/cleanest/least */
+ /* Windows-specific way I can find to force the winsock calls to */
+ /* return WSAEINTR with the test is over. anything that will run on */
+ /* 95 and NT and is closer to what netperf expects from Unix signals */
+ /* and such would be appreciated raj 1/96 */
+ win_kludge_socket = s_data;
+#endif /* WIN32 */
+
+#ifdef KLUDGE_SOCKET_OPTIONS
+ /* this is for those systems which *INCORRECTLY* fail to pass */
+ /* attributes across an accept() call. Including this goes against */
+ /* my better judgement :( raj 11/95 */
+
+ kludge_socket_options(s_data);
+
+#endif /* KLUDGE_SOCKET_OPTIONS */
+
+ temp_message_ptr = recv_message_ptr;
+ request_bytes_remaining = tcp_conn_rr_request->request_size;
+
+ /* receive the request from the other side */
+ while (!times_up && (request_bytes_remaining > 0)) {
+ if((request_bytes_recvd=recv(s_data,
+ temp_message_ptr,
+ request_bytes_remaining,
+ 0)) == SOCKET_ERROR) {
+ if (SOCKET_EINTR(request_bytes_recvd))
+ {
+ /* the timer popped */
+ timed_out = 1;
+ break;
+ }
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+ else {
+ request_bytes_remaining -= request_bytes_recvd;
+ temp_message_ptr += request_bytes_recvd;
+ }
+ }
+
+ if (timed_out) {
+ /* we hit the end of the test based on time - lets */
+ /* bail out of here now... */
+ fprintf(where,"yo5\n");
+ fflush(where);
+ break;
+ }
+
+ /* Now, send the response to the remote */
+ if((bytes_sent=send(s_data,
+ send_message_ptr,
+ tcp_conn_rr_request->response_size,
+ 0)) == SOCKET_ERROR) {
+ if (errno == EINTR) {
+ /* the test timer has popped */
+ timed_out = 1;
+ fprintf(where,"yo6\n");
+ fflush(where);
+ break;
+ }
+ netperf_response.content.serv_errno = 99;
+ send_response();
+ exit(1);
+ }
+
+ trans_received++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_tcp_conn_rr: Transaction %d complete\n",
+ trans_received);
+ fflush(where);
+ }
+
+ /* close the connection. the server will likely do a graceful */
+ /* close of the connection, insuring that all data has arrived at */
+ /* the client. for this it will call shutdown(), and then recv() and */
+ /* then close(). I'm reasonably confident that this is the */
+ /* appropriate sequence of calls - I would like to hear of */
+ /* examples in web servers to the contrary. raj 10/95*/
+#ifdef TCP_CRR_SHUTDOWN
+ shutdown(s_data,SHUT_WR);
+ recv(s_data,
+ recv_message_ptr,
+ 1,
+ 0);
+ close(s_data);
+#else
+ close(s_data);
+#endif /* TCP_CRR_SHUTDOWN */
+
+ }
+
+
+ /* The loop now exits due to timeout or transaction count being */
+ /* reached */
+
+ cpu_stop(tcp_conn_rr_request->measure_cpu,&elapsed_time);
+
+ if (timed_out) {
+ /* we ended the test by time, which was at least 2 seconds */
+ /* longer than we wanted to run. so, we want to subtract */
+ /* PAD_TIME from the elapsed_time. */
+ elapsed_time -= PAD_TIME;
+ }
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_tcp_conn_rr: got %d transactions\n",
+ trans_received);
+ fflush(where);
+ }
+
+ tcp_conn_rr_results->bytes_received = (trans_received *
+ (tcp_conn_rr_request->request_size +
+ tcp_conn_rr_request->response_size));
+ tcp_conn_rr_results->trans_received = trans_received;
+ tcp_conn_rr_results->elapsed_time = elapsed_time;
+ if (tcp_conn_rr_request->measure_cpu) {
+ tcp_conn_rr_results->cpu_util = calc_cpu_util(elapsed_time);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_tcp_conn_rr: test complete, sending results.\n");
+ fflush(where);
+ }
+
+ send_response();
+
+}
+
+
+#ifdef DO_1644
+
+ /* this test is intended to test the performance of establishing a */
+ /* connection, exchanging a request/response pair, and repeating. it */
+ /* is expected that this would be a good starting-point for */
+ /* comparision of T/TCP with classic TCP for transactional workloads. */
+ /* it will also look (can look) much like the communication pattern */
+ /* of http for www access. */
+
+int
+send_tcp_tran_rr(char remote_host[])
+{
+
+ char *tput_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans.\n\
+Send Recv Size Size Time Rate \n\
+bytes Bytes bytes bytes secs. per sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %7.2f \n";
+ char *tput_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *cpu_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem\n\
+Send Recv Size Size Time Rate local remote local remote\n\
+bytes bytes bytes bytes secs. per sec %% %% us/Tr us/Tr\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f\n";
+
+ char *cpu_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %-6.2f %-6.2f %-6.2f %-6.3f %-6.3f\n";
+
+ char *cpu_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *ksink_fmt = "\n\
+Alignment Offset\n\
+Local Remote Local Remote\n\
+Send Recv Send Recv\n\
+%5d %5d %5d %5d\n";
+
+
+ int one = 1;
+ int timed_out = 0;
+ float elapsed_time;
+
+ int len;
+ struct ring_elt *send_ring;
+ struct ring_elt *recv_ring;
+ char *temp_message_ptr;
+ int nummessages;
+ SOCKET send_socket;
+ int trans_remaining;
+ double bytes_xferd;
+ int sock_opt_len = sizeof(int);
+ int rsp_bytes_left;
+ int rsp_bytes_recvd;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+ double thruput;
+
+ struct hostent *hp;
+ struct sockaddr_in server;
+ struct sockaddr_in *myaddr;
+ unsigned int addr;
+ int myport;
+
+ struct tcp_tran_rr_request_struct *tcp_tran_rr_request;
+ struct tcp_tran_rr_response_struct *tcp_tran_rr_response;
+ struct tcp_tran_rr_results_struct *tcp_tran_rr_result;
+
+ tcp_tran_rr_request =
+ (struct tcp_tran_rr_request_struct *)netperf_request.content.test_specific_data;
+ tcp_tran_rr_response =
+ (struct tcp_tran_rr_response_struct *)netperf_response.content.test_specific_data;
+ tcp_tran_rr_result =
+ (struct tcp_tran_rr_results_struct *)netperf_response.content.test_specific_data;
+
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ time_hist = HIST_new();
+ }
+#endif /* WANT_HISTOGRAM */
+
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ myaddr = (struct sockaddr_storage *)malloc(sizeof(struct sockaddr_storage));
+ if (myaddr == NULL) {
+ printf("malloc(%d) failed!\n", sizeof(struct sockaddr_storage));
+ exit(1);
+ }
+
+ bzero((char *)&server,
+ sizeof(server));
+ bzero((char *)myaddr,
+ sizeof(struct sockaddr_storage));
+ myaddr->sin_family = AF_INET;
+
+ complete_addrinfos(&remote_res,
+ &local_res,
+ remote_host,
+ SOCK_STREAM,
+ IPPROTO_TCP,
+ 0);
+
+ if ( print_headers ) {
+ print_top_test_header("TCP Transactional/Request/Response TEST",local_res,remote_res);
+ }
+
+ /* initialize a few counters */
+
+ nummessages = 0;
+ bytes_xferd = 0.0;
+ times_up = 0;
+
+ /* set-up the data buffers with the requested alignment and offset */
+ if (send_width == 0) send_width = 1;
+ if (recv_width == 0) recv_width = 1;
+
+ send_ring = allocate_buffer_ring(send_width,
+ req_size,
+ local_send_align,
+ local_send_offset);
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ rsp_size,
+ local_recv_align,
+ local_recv_offset);
+
+
+ if (debug) {
+ fprintf(where,"send_tcp_tran_rr: send_socket obtained...\n");
+ }
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back.*/
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ /* Tell the remote end to do a listen. The server alters the socket */
+ /* paramters on the other side at this point, hence the reason for */
+ /* all the values being passed in the setup message. If the user did */
+ /* not specify any of the parameters, they will be passed as 0, which */
+ /* will indicate to the remote that no changes beyond the system's */
+ /* default should be used. Alignment is the exception, it will */
+ /* default to 8, which will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_TCP_TRR;
+ tcp_tran_rr_request->recv_buf_size = rsr_size_req;
+ tcp_tran_rr_request->send_buf_size = rss_size_req;
+ tcp_tran_rr_request->recv_alignment = remote_recv_align;
+ tcp_tran_rr_request->recv_offset = remote_recv_offset;
+ tcp_tran_rr_request->send_alignment = remote_send_align;
+ tcp_tran_rr_request->send_offset = remote_send_offset;
+ tcp_tran_rr_request->request_size = req_size;
+ tcp_tran_rr_request->response_size = rsp_size;
+ tcp_tran_rr_request->no_delay = rem_nodelay;
+ tcp_tran_rr_request->measure_cpu = remote_cpu_usage;
+ tcp_tran_rr_request->cpu_rate = remote_cpu_rate;
+ tcp_tran_rr_request->so_rcvavoid = rem_rcvavoid;
+ tcp_tran_rr_request->so_sndavoid = rem_sndavoid;
+ if (test_time) {
+ tcp_tran_rr_request->test_length = test_time;
+ }
+ else {
+ tcp_tran_rr_request->test_length = test_trans * -1;
+ }
+ tcp_tran_rr_request->port = atoi(remote_data_port);
+ tcp_tran_rr_request->ipfamily = af_to_nf(remote_res->ai_family);
+
+ if (debug > 1) {
+ fprintf(where,"netperf: send_tcp_tran_rr: requesting TCP_TRR test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant */
+ /* socket parameters for this test type. We will put them back into */
+ /* the variables here so they can be displayed if desired. The */
+ /* remote will have calibrated CPU if necessary, and will have done */
+ /* all the needed set-up we will have calibrated the cpu locally */
+ /* before sending the request, and will grab the counter value right */
+ /* after the connect returns. The remote will grab the counter right */
+ /* after the accept call. This saves the hassle of extra messages */
+ /* being sent for the TCP tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ rsr_size = tcp_tran_rr_response->recv_buf_size;
+ rss_size = tcp_tran_rr_response->send_buf_size;
+ rem_nodelay = tcp_tran_rr_response->no_delay;
+ remote_cpu_usage= tcp_tran_rr_response->measure_cpu;
+ remote_cpu_rate = tcp_tran_rr_response->cpu_rate;
+ /* make sure that port numbers are in network order */
+ server.sin_port = tcp_tran_rr_response->data_port_number;
+ server.sin_port = htons(server.sin_port);
+ if (debug) {
+ fprintf(where,"remote listen done.\n");
+ fprintf(where,"remote port is %d\n",ntohs(server.sin_port));
+ fflush(where);
+ }
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+ exit(1);
+ }
+
+ /* pick a nice random spot between client_port_min and */
+ /* client_port_max for our initial port number. if they are the */
+ /* same, then just set to _min */
+ if (client_port_max - client_port_min) {
+ srand(getpid());
+ myport = client_port_min +
+ (rand() % (client_port_max - client_port_min));
+ }
+ else {
+ myport = client_port_min;
+ }
+
+ /* there will be a ++ before the first call to bind, so subtract one */
+ myport--;
+ myaddr->sin_port = htons((unsigned short)myport);
+
+ /* Set-up the test end conditions. For a request/response test, they */
+ /* can be either time or transaction based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ trans_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return false. */
+ /* When the test is controlled by byte count, the time test will */
+ /* always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. I think I */
+ /* just arbitrarily decrement trans_remaining for the timed test, but */
+ /* will not do that just yet... One other question is whether or not */
+ /* the send buffer and the receive buffer should be the same buffer. */
+
+ while ((!times_up) || (trans_remaining > 0)) {
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ /* timestamp just before our call to create the socket, and then */
+ /* again just after the receive raj 3/95 */
+ HIST_timestamp(&time_one);
+ }
+#endif /* WANT_HISTOGRAM */
+
+ /* set up the data socket - is this really necessary or can I just */
+ /* re-use the same socket and move this cal out of the while loop. */
+ /* it does introcudea *boatload* of system calls. I guess that it */
+ /* all depends on "reality of programming." keeping it this way is */
+ /* a bit more conservative I imagine - raj 3/95 */
+ send_socket = create_data_socket(local_res);
+
+ if (send_socket == INVALID_SOCKET) {
+ perror("netperf: send_tcp_tran_rr: tcp stream data socket");
+ exit(1);
+ }
+
+ /* we set SO_REUSEADDR on the premis that no unreserved port */
+ /* number on the local system is going to be already connected to */
+ /* the remote netserver's port number. One thing that I might */
+ /* try later is to have the remote actually allocate a couple of */
+ /* port numbers and cycle through those as well. depends on if we */
+ /* can get through all the unreserved port numbers in less than */
+ /* the length of the TIME_WAIT state raj 8/94 */
+ one = 1;
+ if(setsockopt(send_socket, SOL_SOCKET, SO_REUSEADDR,
+ (char *)&one, sock_opt_len) == SOCKET_ERROR) {
+ perror("netperf: send_tcp_tran_rr: so_reuseaddr");
+ exit(1);
+ }
+
+newport:
+ /* pick a new port number */
+ myport = ntohs(myaddr->sin_port);
+ myport++;
+
+ /* we do not want to use the port number that the server is */
+ /* sitting at - this would cause us to fail in a loopback test. we */
+ /* could just rely on the failure of the bind to get us past this, */
+ /* but I'm guessing that in this one case at least, it is much */
+ /* faster, given that we *know* that port number is already in use */
+ /* (or rather would be in a loopback test) */
+
+ if (myport == ntohs(server.sin_port)) myport++;
+
+ /* wrap the port number when we get to 65535. NOTE, some broken */
+ /* TCP's might treat the port number as a signed 16 bit quantity. */
+ /* we aren't interested in testing such broken implementations :) */
+ /* raj 8/94 */
+ if (myport >= client_port_max) {
+ myport = client_port_min;
+ }
+ myaddr->sin_port = htons((unsigned short)myport);
+
+ if (debug) {
+ if ((nummessages % 100) == 0) {
+ printf("port %d\n",myport);
+ }
+ }
+
+ /* we want to bind our socket to a particular port number. */
+ if (bind(send_socket,
+ (struct sockaddr *)myaddr,
+ sizeof(struct sockaddr_storage)) == SOCKET_ERROR) {
+ /* if the bind failed, someone else must have that port number */
+ /* - perhaps in the listen state. since we can't use it, skip to */
+ /* the next port number. we may have to do this again later, but */
+ /* that's just too bad :) */
+ if (debug > 1) {
+ fprintf(where,
+ "send_tcp_tran_rr: tried to bind to port %d errno %d\n",
+ ntohs(myaddr->sin_port),
+ errno);
+ fflush(where);
+ }
+ /* yes, goto's are supposed to be evil, but they do have their */
+ /* uses from time to time. the real world doesn't always have */
+ /* to code to ge tthe A in CS 101 :) raj 3/95 */
+ goto newport;
+ }
+
+ /* Connect up to the remote port on the data socket. Since this is */
+ /* a test for RFC_1644-style transactional TCP, we can use the */
+ /* sendto() call instead of calling connect and then send() */
+
+ /* send the request */
+ if((len=sendto(send_socket,
+ send_ring->buffer_ptr,
+ req_size,
+ MSG_EOF,
+ (struct sockaddr *)&server,
+ sizeof(server))) != req_size) {
+ if (SOCKET_EINTR(len))
+ {
+ /* we hit the end of a */
+ /* timed test. */
+ timed_out = 1;
+ break;
+ }
+ perror("send_tcp_tran_rr: data send error");
+ exit(1);
+ }
+ send_ring = send_ring->next;
+
+ /* receive the response */
+ rsp_bytes_left = rsp_size;
+ temp_message_ptr = recv_ring->buffer_ptr;
+ while(rsp_bytes_left > 0) {
+ if((rsp_bytes_recvd=recv(send_socket,
+ temp_message_ptr,
+ rsp_bytes_left,
+ 0)) == SOCKET_ERROR) {
+ if (SOCKET_EINTR(rsp_bytes_recvd))
+ {
+ /* We hit the end of a timed test. */
+ timed_out = 1;
+ break;
+ }
+ perror("send_tcp_tran_rr: data recv error");
+ exit(1);
+ }
+ rsp_bytes_left -= rsp_bytes_recvd;
+ temp_message_ptr += rsp_bytes_recvd;
+ }
+ recv_ring = recv_ring->next;
+
+ if (timed_out) {
+ /* we may have been in a nested while loop - we need */
+ /* another call to break. */
+ break;
+ }
+
+ close(send_socket);
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ HIST_timestamp(&time_two);
+ HIST_add(time_hist,delta_micro(&time_one,&time_two));
+ }
+#endif /* WANT_HISTOGRAM */
+
+ nummessages++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug > 3) {
+ fprintf(where,
+ "Transaction %d completed on local port %d\n",
+ nummessages,
+ ntohs(myaddr->sin_port));
+ fflush(where);
+ }
+
+
+ }
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being measured? */
+ /* how long did we really run? */
+
+ /* Get the statistics from the remote end. The remote will have */
+ /* calculated service demand and all those interesting things. If it */
+ /* wasn't supposed to care, it will return obvious values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+ exit(1);
+ }
+
+ /* We now calculate what our thruput was for the test. In the future, */
+ /* we may want to include a calculation of the thruput measured by */
+ /* the remote, but it should be the case that for a TCP stream test, */
+ /* that the two numbers should be *very* close... We calculate */
+ /* bytes_sent regardless of the way the test length was controlled. */
+ /* If it was time, we needed to, and if it was by bytes, the user may */
+ /* have specified a number of bytes that wasn't a multiple of the */
+ /* send_size, so we really didn't send what he asked for ;-) We use */
+ /* Kbytes/s as the units of thruput for a TCP stream test, where K = */
+ /* 1024. A future enhancement *might* be to choose from a couple of */
+ /* unit selections. */
+
+ bytes_xferd = (req_size * nummessages) + (rsp_size * nummessages);
+ thruput = calc_thruput(bytes_xferd);
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+ if (local_cpu_rate == 0.0) {
+ fprintf(where,"WARNING WARNING WARNING WARNING WARNING WARNING WARNING!\n");
+ fprintf(where,"Local CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+ local_cpu_utilization = calc_cpu_util(0.0);
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ local_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ }
+
+ if (remote_cpu_usage) {
+ if (remote_cpu_rate == 0.0) {
+ fprintf(where,"DANGER DANGER DANGER DANGER DANGER DANGER DANGER!\n");
+ fprintf(where,"Remote CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+ remote_cpu_utilization = tcp_tran_rr_result->cpu_util;
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ remote_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ remote_cpu_utilization,
+ tcp_tran_rr_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand);
+ }
+ break;
+ case 1:
+ case 2:
+
+ if (print_headers) {
+ fprintf(where,
+ cpu_title,
+ local_cpu_method,
+ remote_cpu_method);
+ }
+
+ fprintf(where,
+ cpu_fmt_1_line_1, /* the format string */
+ lss_size, /* local sendbuf size */
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* guess */
+ elapsed_time, /* how long was the test */
+ nummessages/elapsed_time,
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand); /* remote service demand */
+ fprintf(where,
+ cpu_fmt_1_line_2,
+ rss_size,
+ rsr_size);
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ nummessages/elapsed_time);
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,tput_title,format_units());
+ }
+
+ fprintf(where,
+ tput_fmt_1_line_1, /* the format string */
+ lss_size,
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* how large were the responses */
+ elapsed_time, /* how long did it take */
+ nummessages/elapsed_time);
+ fprintf(where,
+ tput_fmt_1_line_2,
+ rss_size, /* remote recvbuf size */
+ rsr_size);
+
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* TCP statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ fprintf(where,
+ ksink_fmt,
+ local_send_align,
+ remote_recv_offset,
+ local_send_offset,
+ remote_recv_offset);
+
+#ifdef WANT_HISTOGRAM
+ fprintf(where,"\nHistogram of request/response times\n");
+ fflush(where);
+ HIST_report(time_hist);
+#endif /* WANT_HISTOGRAM */
+
+ }
+
+}
+
+
+int
+recv_tcp_tran_rr()
+{
+
+ char *message;
+ struct sockaddr_in myaddr_in,
+ peeraddr_in;
+ SOCKET s_listen,s_data;
+ netperf_socklen_t addrlen;
+ int NoPush = 1;
+
+ char *recv_message_ptr;
+ char *send_message_ptr;
+ char *temp_message_ptr;
+ int trans_received;
+ int trans_remaining;
+ int bytes_sent;
+ int request_bytes_recvd;
+ int request_bytes_remaining;
+ int timed_out = 0;
+ float elapsed_time;
+
+ struct tcp_tran_rr_request_struct *tcp_tran_rr_request;
+ struct tcp_tran_rr_response_struct *tcp_tran_rr_response;
+ struct tcp_tran_rr_results_struct *tcp_tran_rr_results;
+
+ tcp_tran_rr_request =
+ (struct tcp_tran_rr_request_struct *)netperf_request.content.test_specific_data;
+ tcp_tran_rr_response =
+ (struct tcp_tran_rr_response_struct *)netperf_response.content.test_specific_data;
+ tcp_tran_rr_results =
+ (struct tcp_tran_rr_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_tcp_tran_rr: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_tcp_tran_rr: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = TCP_TRR_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_tcp_tran_rr: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* set-up the data buffer with the requested alignment and offset */
+ message = (char *)malloc(DATABUFFERLEN);
+ if (message == NULL) {
+ printf("malloc(%d) failed!\n", DATABUFFERLEN);
+ exit(1);
+ }
+
+ /* We now alter the message_ptr variables to be at the desired */
+ /* alignments with the desired offsets. */
+
+ if (debug) {
+ fprintf(where,
+ "recv_tcp_tran_rr: requested recv alignment of %d offset %d\n",
+ tcp_tran_rr_request->recv_alignment,
+ tcp_tran_rr_request->recv_offset);
+ fprintf(where,
+ "recv_tcp_tran_rr: requested send alignment of %d offset %d\n",
+ tcp_tran_rr_request->send_alignment,
+ tcp_tran_rr_request->send_offset);
+ fflush(where);
+ }
+
+ recv_message_ptr = ALIGN_BUFFER(message, tcp_tran_rr_request->recv_alignment, tcp_tran_rr_request->recv_offset);
+
+ send_message_ptr = ALIGN_BUFFER(message, tcp_tran_rr_request->send_alignment, tcp_tran_rr_request->send_offset);
+
+ if (debug) {
+ fprintf(where,"recv_tcp_tran_rr: receive alignment and offset set...\n");
+ fflush(where);
+ }
+
+ /* Let's clear-out our sockaddr for the sake of cleanlines. Then we */
+ /* can put in OUR values !-) At some point, we may want to nail this */
+ /* socket to a particular network-level address, but for now, */
+ /* INADDR_ANY should be just fine. */
+
+ bzero((char *)&myaddr_in,
+ sizeof(myaddr_in));
+ myaddr_in.sin_family = AF_INET;
+ myaddr_in.sin_addr.s_addr = INADDR_ANY;
+ myaddr_in.sin_port = htons((unsigned short)tcp_tran_rr_request->port);
+
+ /* Grab a socket to listen on, and then listen on it. */
+
+ if (debug) {
+ fprintf(where,"recv_tcp_tran_rr: grabbing a socket...\n");
+ fflush(where);
+ }
+
+ /* create_data_socket expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lss_size_req = tcp_tran_rr_request->send_buf_size;
+ lsr_size_req = tcp_tran_rr_request->recv_buf_size;
+ loc_nodelay = tcp_tran_rr_request->no_delay;
+ loc_rcvavoid = tcp_tran_rr_request->so_rcvavoid;
+ loc_sndavoid = tcp_tran_rr_request->so_sndavoid;
+
+ set_hostname_and_port(local_name,
+ port_buffer,
+ nf_to_af(tcp_tran_rr_request->ipfamily),
+ tcp_tran_rr_request->port);
+
+ local_res = complete_addrinfo(local_name,
+ local_name,
+ port_buffer,
+ nf_to_af(tcp_tran_rr_request->ipfamily),
+ SOCK_STREAM,
+ IPPROTO_TCP,
+ 0);
+
+ s_listen = create_data_socket(local_res);
+
+ if (s_listen == INVALID_SOCKET) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ if (debug) {
+ fprintf(where,"could not create data socket\n");
+ fflush(where);
+ }
+ exit(1);
+ }
+
+#ifdef WIN32
+ /* The test timer can fire during operations on the listening socket,
+ so to make the start_timer below work we have to move
+ it to close s_listen while we are blocked on accept. */
+ win_kludge_socket2 = s_listen;
+#endif
+
+
+ /* Let's get an address assigned to this socket so we can tell the */
+ /* initiator how to reach the data socket. There may be a desire to */
+ /* nail this socket to a specific IP address in a multi-homed, */
+ /* multi-connection situation, but for now, we'll ignore the issue */
+ /* and concentrate on single connection testing. */
+
+ if (bind(s_listen,
+ (struct sockaddr *)&myaddr_in,
+ sizeof(myaddr_in)) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+ if (debug) {
+ fprintf(where,"could not bind\n");
+ fflush(where);
+ }
+ exit(1);
+ }
+
+ /* we want to disable the implicit PUSH on all sends. at some point, */
+ /* this might want to be a parm to the test raj 3/95 */
+ if (setsockopt(s_listen,
+ IPPROTO_TCP,
+ TCP_NOPUSH,
+ (const char *)&NoPush,
+ sizeof(int)) == SOCKET_ERROR) {
+ fprintf(where,
+ "recv_tcp_tran_rr: could not set TCP_NOPUSH errno %d\n",
+ errno);
+ fflush(where);
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+ }
+
+ /* Now, let's set-up the socket to listen for connections */
+ if (listen(s_listen, 5) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+ if (debug) {
+ fprintf(where,"could not listen\n");
+ fflush(where);
+ }
+ exit(1);
+ }
+
+ /* now get the port number assigned by the system */
+ addrlen = sizeof(myaddr_in);
+ if (getsockname(s_listen,
+ (struct sockaddr *)&myaddr_in,
+ &addrlen) == SOCKET_ERROR){
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+ if (debug) {
+ fprintf(where,"could not geetsockname\n");
+ fflush(where);
+ }
+ exit(1);
+ }
+
+ /* Now myaddr_in contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ tcp_tran_rr_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
+ if (debug) {
+ fprintf(where,"telling the remote to call me at %d\n",
+ tcp_tran_rr_response->data_port_number);
+ fflush(where);
+ }
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a 0.0 to */
+ /* the initiator. */
+
+ tcp_tran_rr_response->cpu_rate = 0.0; /* assume no cpu */
+ if (tcp_tran_rr_request->measure_cpu) {
+ tcp_tran_rr_response->measure_cpu = 1;
+ tcp_tran_rr_response->cpu_rate =
+ calibrate_local_cpu(tcp_tran_rr_request->cpu_rate);
+ }
+
+
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ tcp_tran_rr_response->send_buf_size = lss_size;
+ tcp_tran_rr_response->recv_buf_size = lsr_size;
+ tcp_tran_rr_response->no_delay = loc_nodelay;
+ tcp_tran_rr_response->so_rcvavoid = loc_rcvavoid;
+ tcp_tran_rr_response->so_sndavoid = loc_sndavoid;
+
+ send_response();
+
+ addrlen = sizeof(peeraddr_in);
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(tcp_tran_rr_request->measure_cpu);
+
+ /* The loop will exit when the sender does a shutdown, which will */
+ /* return a length of zero */
+
+ if (tcp_tran_rr_request->test_length > 0) {
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(tcp_tran_rr_request->test_length + PAD_TIME);
+ }
+ else {
+ times_up = 1;
+ trans_remaining = tcp_tran_rr_request->test_length * -1;
+ }
+
+ trans_received = 0;
+
+ while ((!times_up) || (trans_remaining > 0)) {
+
+ /* accept a connection from the remote */
+ if ((s_data=accept(s_listen,
+ (struct sockaddr *)&peeraddr_in,
+ &addrlen)) == INVALID_SOCKET) {
+ if (errno == EINTR) {
+ /* the timer popped */
+ timed_out = 1;
+ break;
+ }
+ fprintf(where,"recv_tcp_tran_rr: accept: errno = %d\n",errno);
+ fflush(where);
+ close(s_listen);
+
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"recv_tcp_tran_rr: accepted data connection.\n");
+ fflush(where);
+ }
+
+#ifdef WIN32
+ /* this is used so the timer thread can close the socket out from */
+ /* under us, which to date is the easiest/cleanest/least */
+ /* Windows-specific way I can find to force the winsock calls to */
+ /* return WSAEINTR with the test is over. anything that will run on */
+ /* 95 and NT and is closer to what netperf expects from Unix signals */
+ /* and such would be appreciated raj 1/96 */
+ win_kludge_socket = s_data;
+#endif /* WIN32 */
+
+#ifdef KLUDGE_SOCKET_OPTIONS
+ /* this is for those systems which *INCORRECTLY* fail to pass */
+ /* attributes across an accept() call. Including this goes against */
+ /* my better judgement :( raj 11/95 */
+
+ kludge_socket_options(s_data);
+
+#endif /* KLUDGE_SOCKET_OPTIONS */
+
+ temp_message_ptr = recv_message_ptr;
+ request_bytes_remaining = tcp_tran_rr_request->request_size;
+
+ /* receive the request from the other side. we can just receive */
+ /* until we get zero bytes, but that would be a slight structure */
+ /* change in the code, with minimal perfomance effects. If */
+ /* however, I has variable-length messages, I would want to do */
+ /* this to avoid needing "double reads" - one for the message */
+ /* length, and one for the rest of the message raj 3/95 */
+ while(request_bytes_remaining > 0) {
+ if((request_bytes_recvd=recv(s_data,
+ temp_message_ptr,
+ request_bytes_remaining,
+ 0)) == SOCKET_ERROR) {
+ if ( SOCKET_EINTR(request_bytes_recvd) )
+ {
+ /* the timer popped */
+ timed_out = 1;
+ break;
+ }
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+ else {
+ request_bytes_remaining -= request_bytes_recvd;
+ temp_message_ptr += request_bytes_recvd;
+ }
+ }
+
+ if (timed_out) {
+ /* we hit the end of the test based on time - lets */
+ /* bail out of here now... */
+ fprintf(where,"yo5\n");
+ fflush(where);
+ break;
+ }
+
+ /* Now, send the response to the remote we can use sendto here to */
+ /* help remind people that this is an rfc 1644 style of test */
+ if((bytes_sent=sendto(s_data,
+ send_message_ptr,
+ tcp_tran_rr_request->response_size,
+ MSG_EOF,
+ (struct sockaddr *)&peeraddr_in,
+ sizeof(struct sockaddr_storage))) == SOCKET_ERROR) {
+ if (SOCKET_EINTR(bytes_sent)) {
+ /* the test timer has popped */
+ timed_out = 1;
+ fprintf(where,"yo6\n");
+ fflush(where);
+ break;
+ }
+ netperf_response.content.serv_errno = 99;
+ send_response();
+ exit(1);
+ }
+
+ trans_received++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_tcp_tran_rr: Transaction %d complete\n",
+ trans_received);
+ fflush(where);
+ }
+
+ /* close the connection. since we have disable PUSH on sends, the */
+ /* FIN should be tacked-onto our last send instead of being */
+ /* standalone */
+ close(s_data);
+
+ }
+
+
+ /* The loop now exits due to timeout or transaction count being */
+ /* reached */
+
+ cpu_stop(tcp_tran_rr_request->measure_cpu,&elapsed_time);
+
+ if (timed_out) {
+ /* we ended the test by time, which was at least 2 seconds */
+ /* longer than we wanted to run. so, we want to subtract */
+ /* PAD_TIME from the elapsed_time. */
+ elapsed_time -= PAD_TIME;
+ }
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_tcp_tran_rr: got %d transactions\n",
+ trans_received);
+ fflush(where);
+ }
+
+ tcp_tran_rr_results->bytes_received = (trans_received *
+ (tcp_tran_rr_request->request_size +
+ tcp_tran_rr_request->response_size));
+ tcp_tran_rr_results->trans_received = trans_received;
+ tcp_tran_rr_results->elapsed_time = elapsed_time;
+ if (tcp_tran_rr_request->measure_cpu) {
+ tcp_tran_rr_results->cpu_util = calc_cpu_util(elapsed_time);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_tcp_tran_rr: test complete, sending results.\n");
+ fflush(where);
+ }
+
+ send_response();
+
+}
+#endif /* DO_1644 */
+
+#ifdef DO_NBRR
+ /* this routine implements the sending (netperf) side of the TCP_RR */
+ /* test using POSIX-style non-blocking sockets. */
+
+void
+send_tcp_nbrr(char remote_host[])
+{
+
+ char *tput_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans.\n\
+Send Recv Size Size Time Rate \n\
+bytes Bytes bytes bytes secs. per sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %7.2f \n";
+ char *tput_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *cpu_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem\n\
+Send Recv Size Size Time Rate local remote local remote\n\
+bytes bytes bytes bytes secs. per sec %% %c %% %c us/Tr us/Tr\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f %c\n";
+
+ char *cpu_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %-6.2f %-6.2f %-6.2f %-6.3f %-6.3f\n";
+
+ char *cpu_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *ksink_fmt = "\
+Alignment Offset\n\
+Local Remote Local Remote\n\
+Send Recv Send Recv\n\
+%5d %5d %5d %5d\n";
+
+
+ int timed_out = 0;
+ float elapsed_time;
+
+ int len;
+ char *temp_message_ptr;
+ int nummessages;
+ SOCKET send_socket;
+ int trans_remaining;
+ double bytes_xferd;
+
+ struct ring_elt *send_ring;
+ struct ring_elt *recv_ring;
+
+ int rsp_bytes_left;
+ int rsp_bytes_recvd;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+ double thruput;
+
+ struct hostent *hp;
+ struct sockaddr_storage server;
+ unsigned int addr;
+
+ struct tcp_rr_request_struct *tcp_rr_request;
+ struct tcp_rr_response_struct *tcp_rr_response;
+ struct tcp_rr_results_struct *tcp_rr_result;
+
+ struct addrinfo *remote_res;
+ struct addrinfo *local_res;
+
+ tcp_rr_request =
+ (struct tcp_rr_request_struct *)netperf_request.content.test_specific_data;
+ tcp_rr_response=
+ (struct tcp_rr_response_struct *)netperf_response.content.test_specific_data;
+ tcp_rr_result =
+ (struct tcp_rr_results_struct *)netperf_response.content.test_specific_data;
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ time_hist = HIST_new();
+ }
+#endif /* WANT_HISTOGRAM */
+
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ bzero((char *)&server,
+ sizeof(server));
+
+ complete_addrinfos(&remote_res,
+ &local_res,
+ remote_host,
+ SOCK_STREAM,
+ IPPROTO_TCP,
+ 0);
+
+ if ( print_headers ) {
+ print_top_test_header("TCP Non-Blocking REQUEST/RESPONSE TEST",local_res,remote_res);
+ }
+
+ /* initialize a few counters */
+
+ send_ring = NULL;
+ recv_ring = NULL;
+ confidence_iteration = 1;
+ init_stat();
+
+ /* we have a great-big while loop which controls the number of times */
+ /* we run a particular test. this is for the calculation of a */
+ /* confidence interval (I really should have stayed awake during */
+ /* probstats :). If the user did not request confidence measurement */
+ /* (no confidence is the default) then we will only go though the */
+ /* loop once. the confidence stuff originates from the folks at IBM */
+
+ while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
+ (confidence_iteration <= iteration_min)) {
+
+ /* initialize a few counters. we have to remember that we might be */
+ /* going through the loop more than once. */
+
+ nummessages = 0;
+ bytes_xferd = 0.0;
+ times_up = 0;
+ timed_out = 0;
+ trans_remaining = 0;
+
+ /* set-up the data buffers with the requested alignment and offset. */
+ /* since this is a request/response test, default the send_width and */
+ /* recv_width to 1 and not two raj 7/94 */
+
+ if (send_width == 0) send_width = 1;
+ if (recv_width == 0) recv_width = 1;
+
+ if (send_ring == NULL) {
+ send_ring = allocate_buffer_ring(send_width,
+ req_size,
+ local_send_align,
+ local_send_offset);
+ }
+
+ if (recv_ring == NULL) {
+ recv_ring = allocate_buffer_ring(recv_width,
+ rsp_size,
+ local_recv_align,
+ local_recv_offset);
+ }
+
+ /*set up the data socket */
+ send_socket = create_data_socket(local_res);
+
+ if (send_socket == INVALID_SOCKET){
+ perror("netperf: send_tcp_nbrr: tcp stream data socket");
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"send_tcp_nbrr: send_socket obtained...\n");
+ }
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back.*/
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ /* Tell the remote end to do a listen. The server alters the socket */
+ /* paramters on the other side at this point, hence the reason for */
+ /* all the values being passed in the setup message. If the user did */
+ /* not specify any of the parameters, they will be passed as 0, which */
+ /* will indicate to the remote that no changes beyond the system's */
+ /* default should be used. Alignment is the exception, it will */
+ /* default to 8, which will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_TCP_NBRR;
+ tcp_rr_request->recv_buf_size = rsr_size_req;
+ tcp_rr_request->send_buf_size = rss_size_req;
+ tcp_rr_request->recv_alignment = remote_recv_align;
+ tcp_rr_request->recv_offset = remote_recv_offset;
+ tcp_rr_request->send_alignment = remote_send_align;
+ tcp_rr_request->send_offset = remote_send_offset;
+ tcp_rr_request->request_size = req_size;
+ tcp_rr_request->response_size = rsp_size;
+ tcp_rr_request->no_delay = rem_nodelay;
+ tcp_rr_request->measure_cpu = remote_cpu_usage;
+ tcp_rr_request->cpu_rate = remote_cpu_rate;
+ tcp_rr_request->so_rcvavoid = rem_rcvavoid;
+ tcp_rr_request->so_sndavoid = rem_sndavoid;
+ if (test_time) {
+ tcp_rr_request->test_length = test_time;
+ }
+ else {
+ tcp_rr_request->test_length = test_trans * -1;
+ }
+
+ if (debug > 1) {
+ fprintf(where,"netperf: send_tcp_nbrr: requesting TCP rr test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant */
+ /* socket parameters for this test type. We will put them back into */
+ /* the variables here so they can be displayed if desired. The */
+ /* remote will have calibrated CPU if necessary, and will have done */
+ /* all the needed set-up we will have calibrated the cpu locally */
+ /* before sending the request, and will grab the counter value right*/
+ /* after the connect returns. The remote will grab the counter right*/
+ /* after the accept call. This saves the hassle of extra messages */
+ /* being sent for the TCP tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote listen done.\n");
+ rsr_size = tcp_rr_response->recv_buf_size;
+ rss_size = tcp_rr_response->send_buf_size;
+ rem_nodelay = tcp_rr_response->no_delay;
+ remote_cpu_usage = tcp_rr_response->measure_cpu;
+ remote_cpu_rate = tcp_rr_response->cpu_rate;
+ /* make sure that port numbers are in network order */
+ server.sin_port = (unsigned short)tcp_rr_response->data_port_number;
+ server.sin_port = htons(server.sin_port);
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+ exit(1);
+ }
+
+ /*Connect up to the remote port on the data socket */
+ if (connect(send_socket,
+ remote_res->ai_addr,
+ remote_res->ai_addrlen) == INVALID_SOCKET){
+ perror("netperf: data socket connect failed");
+
+ exit(1);
+ }
+
+ /* now that we are connected, mark the socket as non-blocking */
+ if (!set_nonblock(send_socket)) {
+ perror("netperf: set_nonblock");
+ exit(1);
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either the */
+ /* connect would have failed, or the previous response would have */
+ /* indicated a problem. I failed to see the value of the extra */
+ /* message after the accept on the remote. If it failed, we'll see it */
+ /* here. If it didn't, we might as well start pumping data. */
+
+ /* Set-up the test end conditions. For a request/response test, they */
+ /* can be either time or transaction based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ trans_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+#ifdef WANT_INTERVALS
+ INTERVALS_INIT();
+#endif /* WANT_INTERVALS */
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return false. */
+ /* When the test is controlled by byte count, the time test will */
+ /* always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. I think I */
+ /* just arbitrarily decrement trans_remaining for the timed test, but */
+ /* will not do that just yet... One other question is whether or not */
+ /* the send buffer and the receive buffer should be the same buffer. */
+
+ while ((!times_up) || (trans_remaining > 0)) {
+ /* send the request. we assume that if we use a blocking socket, */
+ /* the request will be sent at one shot. */
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ /* timestamp just before our call to send, and then again just */
+ /* after the receive raj 8/94 */
+ HIST_timestamp(&time_one);
+ }
+#endif /* WANT_HISTOGRAM */
+
+ /* even though this is a non-blocking socket, we will assume for */
+ /* the time being that we will be able to send an entire request */
+ /* without getting an EAGAIN */
+ if((len=send(send_socket,
+ send_ring->buffer_ptr,
+ req_size,
+ 0)) != req_size) {
+ if (SOCKET_EINTR(len)) {
+ /* we hit the end of a */
+ /* timed test. */
+ timed_out = 1;
+ break;
+ }
+ perror("send_tcp_nbrr: data send error");
+ exit(1);
+ }
+ send_ring = send_ring->next;
+
+ /* receive the response. since we are using non-blocking I/O, we */
+ /* will "spin" on the recvs */
+ rsp_bytes_left = rsp_size;
+ temp_message_ptr = recv_ring->buffer_ptr;
+ while(rsp_bytes_left > 0) {
+ if((rsp_bytes_recvd=recv(send_socket,
+ temp_message_ptr,
+ rsp_bytes_left,
+ 0)) == SOCKET_ERROR) {
+ if (SOCKET_EINTR(rsp_bytes_recvd))
+ {
+ /* We hit the end of a timed test. */
+ timed_out = 1;
+ break;
+ }
+#ifndef WIN32 // But what does WinNT indicate in this situation...
+ else if (errno == EAGAIN) {
+ Set_errno(0);
+ continue;
+ }
+#endif
+ else {
+ perror("send_tcp_nbrr: data recv error");
+ exit(1);
+ }
+ }
+ rsp_bytes_left -= rsp_bytes_recvd;
+ temp_message_ptr += rsp_bytes_recvd;
+ }
+ recv_ring = recv_ring->next;
+
+ if (timed_out) {
+ /* we may have been in a nested while loop - we need */
+ /* another call to break. */
+ break;
+ }
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ HIST_timestamp(&time_two);
+ HIST_add(time_hist,delta_micro(&time_one,&time_two));
+ }
+#endif /* WANT_HISTOGRAM */
+#ifdef WANT_INTERVALS
+ INTERVALS_WAIT();
+#endif /* WANT_INTERVALS */
+
+ nummessages++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug > 3) {
+ if ((nummessages % 100) == 0) {
+ fprintf(where,
+ "Transaction %d completed\n",
+ nummessages);
+ fflush(where);
+ }
+ }
+ }
+
+ /* At this point we used to call shutdown on the data socket to be */
+ /* sure all the data was delivered, but this was not germane in a */
+ /* request/response test, and it was causing the tests to "hang" when */
+ /* they were being controlled by time. So, I have replaced this */
+ /* shutdown call with a call to close that can be found later in the */
+ /* procedure. */
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being */
+ /* measured? how long */
+ /* did we really run? */
+
+ /* Get the statistics from the remote end. The remote will have */
+ /* calculated service demand and all those interesting things. If it */
+ /* wasn't supposed to care, it will return obvious values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+
+ /* We now calculate what our thruput was for the test. */
+
+ bytes_xferd = (req_size * nummessages) + (rsp_size * nummessages);
+ thruput = nummessages/elapsed_time;
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+ local_cpu_utilization = calc_cpu_util(0.0);
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ local_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ }
+
+ if (remote_cpu_usage) {
+ remote_cpu_utilization = tcp_rr_result->cpu_util;
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ remote_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ remote_cpu_utilization,
+ tcp_rr_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ }
+ else {
+ /* we were not measuring cpu, for the confidence stuff, we */
+ /* should make it -1.0 */
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ /* at this point, we want to calculate the confidence information. */
+ /* if debugging is on, calculate_confidence will print-out the */
+ /* parameters we pass it */
+
+ calculate_confidence(confidence_iteration,
+ elapsed_time,
+ thruput,
+ local_cpu_utilization,
+ remote_cpu_utilization,
+ local_service_demand,
+ remote_service_demand);
+
+
+ confidence_iteration++;
+
+ /* we are now done with the socket, so close it */
+ close(send_socket);
+
+ }
+
+ retrieve_confident_values(&elapsed_time,
+ &thruput,
+ &local_cpu_utilization,
+ &remote_cpu_utilization,
+ &local_service_demand,
+ &remote_service_demand);
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ if (confidence < 0) {
+ /* we did not hit confidence, but were we asked to look for it? */
+ if (iteration_max > 1) {
+ display_confidence();
+ }
+ }
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ local_cpu_method = format_cpu_method(cpu_method);
+ remote_cpu_method = format_cpu_method(tcp_rr_result->cpu_method);
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand,
+ local_cpu_method);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand,
+ remote_cpu_method);
+ }
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,
+ cpu_title,
+ local_cpu_method,
+ remote_cpu_method);
+ }
+
+ fprintf(where,
+ cpu_fmt_1_line_1, /* the format string */
+ lss_size, /* local sendbuf size */
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* guess */
+ elapsed_time, /* how long was the test */
+ thruput,
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand); /* remote service demand */
+ fprintf(where,
+ cpu_fmt_1_line_2,
+ rss_size,
+ rsr_size);
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ thruput);
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,tput_title,format_units());
+ }
+
+ fprintf(where,
+ tput_fmt_1_line_1, /* the format string */
+ lss_size,
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* how large were the responses */
+ elapsed_time, /* how long did it take */
+ thruput);
+ fprintf(where,
+ tput_fmt_1_line_2,
+ rss_size, /* remote recvbuf size */
+ rsr_size);
+
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ /* how to handle the verbose information in the presence of */
+ /* confidence intervals is yet to be determined... raj 11/94 */
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* TCP statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ fprintf(where,
+ ksink_fmt,
+ local_send_align,
+ remote_recv_offset,
+ local_send_offset,
+ remote_recv_offset);
+
+#ifdef WANT_HISTOGRAM
+ fprintf(where,"\nHistogram of request/response times\n");
+ fflush(where);
+ HIST_report(time_hist);
+#endif /* WANT_HISTOGRAM */
+
+ }
+
+}
+
+ /* this routine implements the receive (netserver) side of a TCP_RR */
+ /* test */
+void
+recv_tcp_nbrr()
+{
+
+ struct ring_elt *send_ring;
+ struct ring_elt *recv_ring;
+
+ struct sockaddr_in myaddr_in,
+ peeraddr_in;
+ SOCKET s_listen,s_data;
+ netperf_socklen_t addrlen;
+ char *temp_message_ptr;
+ int trans_received;
+ int trans_remaining;
+ int bytes_sent;
+ int request_bytes_recvd;
+ int request_bytes_remaining;
+ int timed_out = 0;
+ float elapsed_time;
+
+ struct addrinfo *local_res;
+ char local_name[BUFSIZ];
+ char port_buffer[PORTBUFSIZE];
+
+ struct tcp_rr_request_struct *tcp_rr_request;
+ struct tcp_rr_response_struct *tcp_rr_response;
+ struct tcp_rr_results_struct *tcp_rr_results;
+
+ tcp_rr_request =
+ (struct tcp_rr_request_struct *)netperf_request.content.test_specific_data;
+ tcp_rr_response =
+ (struct tcp_rr_response_struct *)netperf_response.content.test_specific_data;
+ tcp_rr_results =
+ (struct tcp_rr_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_tcp_nbrr: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_tcp_nbrr: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = TCP_RR_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_tcp_nbrr: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* allocate the recv and send rings with the requested alignments */
+ /* and offsets. raj 7/94 */
+ if (debug) {
+ fprintf(where,"recv_tcp_nbrr: requested recv alignment of %d offset %d\n",
+ tcp_rr_request->recv_alignment,
+ tcp_rr_request->recv_offset);
+ fprintf(where,"recv_tcp_nbrr: requested send alignment of %d offset %d\n",
+ tcp_rr_request->send_alignment,
+ tcp_rr_request->send_offset);
+ fflush(where);
+ }
+
+ /* at some point, these need to come to us from the remote system */
+ if (send_width == 0) send_width = 1;
+ if (recv_width == 0) recv_width = 1;
+
+ send_ring = allocate_buffer_ring(send_width,
+ tcp_rr_request->response_size,
+ tcp_rr_request->send_alignment,
+ tcp_rr_request->send_offset);
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ tcp_rr_request->request_size,
+ tcp_rr_request->recv_alignment,
+ tcp_rr_request->recv_offset);
+
+
+ /* Let's clear-out our sockaddr for the sake of cleanlines. Then we */
+ /* can put in OUR values !-) At some point, we may want to nail this */
+ /* socket to a particular network-level address, but for now, */
+ /* INADDR_ANY should be just fine. */
+
+ bzero((char *)&myaddr_in,
+ sizeof(myaddr_in));
+ myaddr_in.sin_family = AF_INET;
+ myaddr_in.sin_addr.s_addr = INADDR_ANY;
+ myaddr_in.sin_port = htons((unsigned short)tcp_rr_request->port);
+
+ /* Grab a socket to listen on, and then listen on it. */
+
+ if (debug) {
+ fprintf(where,"recv_tcp_nbrr: grabbing a socket...\n");
+ fflush(where);
+ }
+
+ /* create_data_socket expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lss_size_req = tcp_rr_request->send_buf_size;
+ lsr_size_req = tcp_rr_request->recv_buf_size;
+ loc_nodelay = tcp_rr_request->no_delay;
+ loc_rcvavoid = tcp_rr_request->so_rcvavoid;
+ loc_sndavoid = tcp_rr_request->so_sndavoid;
+
+ set_hostname_and_port(local_name,
+ port_buffer,
+ nf_to_af(tcp_rr_request->ipfamily),
+ tcp_rr_request->port);
+
+ local_res = complete_addrinfo(local_name,
+ local_name,
+ port_buffer,
+ nf_to_af(tcp_rr_request->ipfamily),
+ SOCK_STREAM,
+ IPPROTO_TCP,
+ 0);
+
+ s_listen = create_data_socket(local_res);
+
+ if (s_listen == INVALID_SOCKET) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+
+ exit(1);
+ }
+
+ /* Let's get an address assigned to this socket so we can tell the */
+ /* initiator how to reach the data socket. There may be a desire to */
+ /* nail this socket to a specific IP address in a multi-homed, */
+ /* multi-connection situation, but for now, we'll ignore the issue */
+ /* and concentrate on single connection testing. */
+
+ if (bind(s_listen,
+ (struct sockaddr *)&myaddr_in,
+ sizeof(myaddr_in)) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+ /* Now, let's set-up the socket to listen for connections */
+ if (listen(s_listen, 5) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+
+ /* now get the port number assigned by the system */
+ addrlen = sizeof(myaddr_in);
+ if (getsockname(s_listen,
+ (struct sockaddr *)&myaddr_in, &addrlen) == SOCKET_ERROR){
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+ /* Now myaddr_in contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ tcp_rr_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a 0.0 to */
+ /* the initiator. */
+
+ tcp_rr_response->cpu_rate = 0.0; /* assume no cpu */
+ tcp_rr_response->measure_cpu = 0;
+
+ if (tcp_rr_request->measure_cpu) {
+ tcp_rr_response->measure_cpu = 1;
+ tcp_rr_response->cpu_rate = calibrate_local_cpu(tcp_rr_request->cpu_rate);
+ }
+
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ tcp_rr_response->send_buf_size = lss_size;
+ tcp_rr_response->recv_buf_size = lsr_size;
+ tcp_rr_response->no_delay = loc_nodelay;
+ tcp_rr_response->so_rcvavoid = loc_rcvavoid;
+ tcp_rr_response->so_sndavoid = loc_sndavoid;
+ tcp_rr_response->test_length = tcp_rr_request->test_length;
+ send_response();
+
+ addrlen = sizeof(peeraddr_in);
+
+ if ((s_data = accept(s_listen,
+ (struct sockaddr *)&peeraddr_in,
+ &addrlen)) == INVALID_SOCKET) {
+ /* Let's just punt. The remote will be given some information */
+ close(s_listen);
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"recv_tcp_nbrr: accept completes on the data connection.\n");
+ fflush(where);
+ }
+
+#ifdef KLUDGE_SOCKET_OPTIONS
+ /* this is for those systems which *INCORRECTLY* fail to pass */
+ /* attributes across an accept() call. Including this goes against */
+ /* my better judgement :( raj 11/95 */
+
+ kludge_socket_options(s_data);
+
+#endif /* KLUDGE_SOCKET_OPTIONS */
+
+ /* now that we are connected, mark the socket as non-blocking */
+ if (!set_nonblock(s_data)) {
+ close(s_data);
+ exit(1);
+ }
+
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(tcp_rr_request->measure_cpu);
+
+#ifdef WIN32
+ /* this is used so the timer thread can close the socket out from */
+ /* under us, which to date is the easiest/cleanest/least */
+ /* Windows-specific way I can find to force the winsock calls to */
+ /* return WSAEINTR with the test is over. anything that will run on */
+ /* 95 and NT and is closer to what netperf expects from Unix signals */
+ /* and such would be appreciated raj 1/96 */
+ win_kludge_socket = s_data;
+#endif /* WIN32 */
+
+ /* The loop will exit when the sender does a shutdown, which will */
+ /* return a length of zero */
+
+ if (tcp_rr_request->test_length > 0) {
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(tcp_rr_request->test_length + PAD_TIME);
+ }
+ else {
+ times_up = 1;
+ trans_remaining = tcp_rr_request->test_length * -1;
+ }
+
+ trans_received = 0;
+
+ while ((!times_up) || (trans_remaining > 0)) {
+ temp_message_ptr = recv_ring->buffer_ptr;
+ request_bytes_remaining = tcp_rr_request->request_size;
+ while(request_bytes_remaining > 0) {
+ if((request_bytes_recvd=recv(s_data,
+ temp_message_ptr,
+ request_bytes_remaining,
+ 0)) == SOCKET_ERROR) {
+ if ( SOCKET_EINTR(request_bytes_recvd))
+ {
+ /* the timer popped */
+ timed_out = 1;
+ break;
+ }
+#ifndef WIN32 // But what does WinNT indicate in this situation...
+ else if (errno == EAGAIN) {
+ Set_errno(0);
+ if (times_up) {
+ timed_out = 1;
+ break;
+ }
+ continue;
+ }
+#endif
+ else {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+ }
+ else {
+ request_bytes_remaining -= request_bytes_recvd;
+ temp_message_ptr += request_bytes_recvd;
+ }
+ }
+
+ recv_ring = recv_ring->next;
+
+ if (timed_out) {
+ /* we hit the end of the test based on time - lets */
+ /* bail out of here now... */
+ fprintf(where,"yo5\n");
+ fflush(where);
+ break;
+ }
+
+ /* Now, send the response to the remote */
+ if((bytes_sent=send(s_data,
+ send_ring->buffer_ptr,
+ tcp_rr_request->response_size,
+ 0)) == SOCKET_ERROR) {
+ if (SOCKET_EINTR(bytes_sent)) {
+ /* the test timer has popped */
+ timed_out = 1;
+ fprintf(where,"yo6\n");
+ fflush(where);
+ break;
+ }
+ netperf_response.content.serv_errno = 992;
+ send_response();
+ exit(1);
+ }
+
+ send_ring = send_ring->next;
+
+ trans_received++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+ }
+
+
+ /* The loop now exits due to timeout or transaction count being */
+ /* reached */
+
+ cpu_stop(tcp_rr_request->measure_cpu,&elapsed_time);
+
+ stop_timer();
+
+ if (timed_out) {
+ /* we ended the test by time, which was at least 2 seconds */
+ /* longer than we wanted to run. so, we want to subtract */
+ /* PAD_TIME from the elapsed_time. */
+ elapsed_time -= PAD_TIME;
+ }
+
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_tcp_nbrr: got %d transactions\n",
+ trans_received);
+ fflush(where);
+ }
+
+ tcp_rr_results->bytes_received = (trans_received *
+ (tcp_rr_request->request_size +
+ tcp_rr_request->response_size));
+ tcp_rr_results->trans_received = trans_received;
+ tcp_rr_results->elapsed_time = elapsed_time;
+ tcp_rr_results->cpu_method = cpu_method;
+ tcp_rr_results->num_cpus = lib_num_loc_cpus;
+ if (tcp_rr_request->measure_cpu) {
+ tcp_rr_results->cpu_util = calc_cpu_util(elapsed_time);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_tcp_nbrr: test complete, sending results.\n");
+ fflush(where);
+ }
+
+ /* we are done with the socket, free it */
+ close(s_data);
+
+ send_response();
+
+}
+
+#endif /* DO_NBRR */
+
+
+ /* this test is intended to test the performance of establishing a */
+ /* connection, and then closing it again. this test is of somewhat */
+ /* arcane interest since no packets are exchanged between the */
+ /* user-space processes, but it will show the raw overhead of */
+ /* establishing a TCP connection. that service demand could then be */
+ /* compared with the sum of the service demands of a TCP_CRR and */
+ /* TCP_RR test - presumeably, they would all relate */
+
+void
+send_tcp_cc(char remote_host[])
+{
+
+ char *tput_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans.\n\
+Send Recv Size Size Time Rate \n\
+bytes Bytes bytes bytes secs. per sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %7.2f \n";
+ char *tput_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *cpu_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem\n\
+Send Recv Size Size Time Rate local remote local remote\n\
+bytes bytes bytes bytes secs. per sec %% %% us/Tr us/Tr\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f\n";
+
+ char *cpu_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %-6.2f %-6.2f %-6.2f %-6.3f %-6.3f\n";
+
+ char *cpu_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *ksink_fmt = "\n\
+Alignment Offset\n\
+Local Remote Local Remote\n\
+Send Recv Send Recv\n\
+%5d %5d %5d %5d\n";
+
+
+ int timed_out = 0;
+ float elapsed_time;
+
+ char temp_message_ptr[1];
+ int nummessages;
+ SOCKET send_socket;
+ int trans_remaining;
+ double bytes_xferd;
+ int rsp_bytes_left = 1;
+ int rsp_bytes_recvd;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+ double thruput;
+
+ struct addrinfo *local_res;
+ struct addrinfo *remote_res;
+
+ int myport;
+ int ret;
+
+ struct tcp_cc_request_struct *tcp_cc_request;
+ struct tcp_cc_response_struct *tcp_cc_response;
+ struct tcp_cc_results_struct *tcp_cc_result;
+
+ tcp_cc_request =
+ (struct tcp_cc_request_struct *)netperf_request.content.test_specific_data;
+ tcp_cc_response =
+ (struct tcp_cc_response_struct *)netperf_response.content.test_specific_data;
+ tcp_cc_result =
+ (struct tcp_cc_results_struct *)netperf_response.content.test_specific_data;
+
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ time_hist = HIST_new();
+ }
+#endif /* WANT_HISTOGRAM */
+
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ complete_addrinfos(&remote_res,
+ &local_res,
+ remote_host,
+ SOCK_STREAM,
+ IPPROTO_TCP,
+ 0);
+
+ if ( print_headers ) {
+ print_top_test_header("TCP Connect/Close TEST",local_res,remote_res);
+ }
+
+ /* initialize a few counters */
+
+ nummessages = 0;
+ bytes_xferd = 0.0;
+ times_up = 0;
+
+ /* since there are no data buffers in this test, we need no send or */
+ /* recv rings */
+
+ if (debug) {
+ fprintf(where,"send_tcp_cc: send_socket obtained...\n");
+ }
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back.*/
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ /* Tell the remote end to do a listen. The server alters the socket */
+ /* paramters on the other side at this point, hence the reason for */
+ /* all the values being passed in the setup message. If the user did */
+ /* not specify any of the parameters, they will be passed as 0, which */
+ /* will indicate to the remote that no changes beyond the system's */
+ /* default should be used. Alignment is the exception, it will */
+ /* default to 8, which will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_TCP_CC;
+ tcp_cc_request->recv_buf_size = rsr_size_req;
+ tcp_cc_request->send_buf_size = rss_size_req;
+ tcp_cc_request->recv_alignment = remote_recv_align;
+ tcp_cc_request->recv_offset = remote_recv_offset;
+ tcp_cc_request->send_alignment = remote_send_align;
+ tcp_cc_request->send_offset = remote_send_offset;
+ tcp_cc_request->request_size = req_size;
+ tcp_cc_request->response_size = rsp_size;
+ tcp_cc_request->no_delay = rem_nodelay;
+ tcp_cc_request->measure_cpu = remote_cpu_usage;
+ tcp_cc_request->cpu_rate = remote_cpu_rate;
+ tcp_cc_request->so_rcvavoid = rem_rcvavoid;
+ tcp_cc_request->so_sndavoid = rem_sndavoid;
+ if (test_time) {
+ tcp_cc_request->test_length = test_time;
+ }
+ else {
+ tcp_cc_request->test_length = test_trans * -1;
+ }
+ tcp_cc_request->port = atoi(remote_data_port);
+ tcp_cc_request->ipfamily = af_to_nf(remote_res->ai_family);
+
+ if (debug > 1) {
+ fprintf(where,"netperf: send_tcp_cc: requesting TCP crr test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant */
+ /* socket parameters for this test type. We will put them back into */
+ /* the variables here so they can be displayed if desired. The */
+ /* remote will have calibrated CPU if necessary, and will have done */
+ /* all the needed set-up we will have calibrated the cpu locally */
+ /* before sending the request, and will grab the counter value right */
+ /* after the connect returns. The remote will grab the counter right */
+ /* after the accept call. This saves the hassle of extra messages */
+ /* being sent for the TCP tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ rsr_size = tcp_cc_response->recv_buf_size;
+ rss_size = tcp_cc_response->send_buf_size;
+ rem_nodelay = tcp_cc_response->no_delay;
+ remote_cpu_usage= tcp_cc_response->measure_cpu;
+ remote_cpu_rate = tcp_cc_response->cpu_rate;
+ /* make sure that port numbers are in network order */
+ set_port_number(remote_res,(unsigned short)tcp_cc_response->data_port_number);
+
+ if (debug) {
+ fprintf(where,"remote listen done.\n");
+ fprintf(where,"remote port is %d\n",get_port_number(remote_res));
+ fflush(where);
+ }
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+ exit(1);
+ }
+
+#ifdef WANT_DEMO
+ DEMO_RR_SETUP(100)
+#endif
+
+ /* pick a nice random spot between client_port_min and */
+ /* client_port_max for our initial port number */
+ srand(getpid());
+ if (client_port_max - client_port_min) {
+ myport = client_port_min +
+ (rand() % (client_port_max - client_port_min));
+ }
+ else {
+ myport = client_port_min;
+ }
+ /* there will be a ++ before the first call to bind, so subtract one */
+ myport--;
+
+ /* Set-up the test end conditions. For a request/response test, they */
+ /* can be either time or transaction based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ trans_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+#ifdef WANT_DEMO
+ if (demo_mode) {
+ HIST_timestamp(demo_one_ptr);
+ }
+#endif
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return false. */
+ /* When the test is controlled by byte count, the time test will */
+ /* always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. I think I */
+ /* just arbitrarily decrement trans_remaining for the timed test, but */
+ /* will not do that just yet... One other question is whether or not */
+ /* the send buffer and the receive buffer should be the same buffer. */
+
+ while ((!times_up) || (trans_remaining > 0)) {
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ /* timestamp just before our call to create the socket, and then */
+ /* again just after the receive raj 3/95 */
+ HIST_timestamp(&time_one);
+ }
+#endif /* WANT_HISTOGRAM */
+
+ /* set up the data socket */
+ /* newport: is this label really required any longer? */
+ /* pick a new port number */
+ myport++;
+
+ /* wrap the port number when we get to client_port_max. NOTE, some */
+ /* broken TCP's might treat the port number as a signed 16 bit */
+ /* quantity. we aren't interested in testing such broken */
+ /* implementations :) so we won't make sure that it is below 32767 */
+ /* raj 8/94 */
+ if (myport >= client_port_max) {
+ myport = client_port_min;
+ }
+
+ /* we do not want to use the port number that the server is */
+ /* sitting at - this would cause us to fail in a loopback test. we */
+ /* could just rely on the failure of the bind to get us past this, */
+ /* but I'm guessing that in this one case at least, it is much */
+ /* faster, given that we *know* that port number is already in use */
+ /* (or rather would be in a loopback test) */
+
+ if (myport == get_port_number(remote_res)) myport++;
+
+ if (debug) {
+ if ((nummessages % 100) == 0) {
+ printf("port %d\n",myport);
+ }
+ }
+ set_port_number(local_res, (unsigned short)myport);
+ send_socket = create_data_socket(local_res);
+
+ if (send_socket == INVALID_SOCKET) {
+ perror("netperf: send_tcp_cc: tcp stream data socket");
+ exit(1);
+ }
+
+ /* we used to have a call to bind() here, but that is being
+ taken care of by create_data_socket(). raj 2005-02-08 */
+
+ /* Connect up to the remote port on the data socket */
+ if ((ret = connect(send_socket,
+ remote_res->ai_addr,
+ remote_res->ai_addrlen)) == INVALID_SOCKET){
+ if (SOCKET_EINTR(ret))
+ {
+ /* we hit the end of a */
+ /* timed test. */
+ timed_out = 1;
+ break;
+ }
+ perror("netperf: data socket connect failed");
+ printf("\tattempted to connect on socket %d to port %d",
+ send_socket,
+ get_port_number(remote_res));
+ printf(" from port %u \n",get_port_number(local_res));
+ exit(1);
+ }
+
+ /* we hang in a recv() to get the remote's close indication */
+
+ rsp_bytes_recvd=recv(send_socket,
+ temp_message_ptr,
+ rsp_bytes_left,
+ 0);
+
+
+ if (rsp_bytes_recvd == 0) {
+ /* connection close, call close. we assume that the requisite */
+ /* number of bytes have been received */
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ HIST_timestamp(&time_two);
+ HIST_add(time_hist,delta_micro(&time_one,&time_two));
+ }
+#endif /* WANT_HISTOGRAM */
+
+#ifdef WANT_DEMO
+ DEMO_RR_INTERVAL(1)
+#endif
+
+ nummessages++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug > 3) {
+ fprintf(where,
+ "Transaction %d completed on local port %u\n",
+ nummessages,
+ get_port_number(local_res));
+ fflush(where);
+ }
+
+ close(send_socket);
+
+ }
+ else {
+ /* it was less than zero - an error occured */
+ if (SOCKET_EINTR(rsp_bytes_recvd))
+ {
+ /* We hit the end of a timed test. */
+ timed_out = 1;
+ break;
+ }
+ perror("send_tcp_cc: data recv error");
+ exit(1);
+ }
+
+ }
+
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being measured? */
+ /* how long did we really run? */
+
+ /* Get the statistics from the remote end. The remote will have */
+ /* calculated service demand and all those interesting things. If it */
+ /* wasn't supposed to care, it will return obvious values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+
+ /* We now calculate what our thruput was for the test. In the future, */
+ /* we may want to include a calculation of the thruput measured by */
+ /* the remote, but it should be the case that for a TCP stream test, */
+ /* that the two numbers should be *very* close... We calculate */
+ /* bytes_sent regardless of the way the test length was controlled. */
+ /* If it was time, we needed to, and if it was by bytes, the user may */
+ /* have specified a number of bytes that wasn't a multiple of the */
+ /* send_size, so we really didn't send what he asked for ;-) We use */
+ /* Kbytes/s as the units of thruput for a TCP stream test, where K = */
+ /* 1024. A future enhancement *might* be to choose from a couple of */
+ /* unit selections. */
+
+ bytes_xferd = (req_size * nummessages) + (rsp_size * nummessages);
+ thruput = calc_thruput(bytes_xferd);
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+ if (local_cpu_rate == 0.0) {
+ fprintf(where,"WARNING WARNING WARNING WARNING WARNING WARNING WARNING!\n");
+ fprintf(where,"Local CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+ local_cpu_utilization = calc_cpu_util(0.0);
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ local_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ }
+
+ if (remote_cpu_usage) {
+ if (remote_cpu_rate == 0.0) {
+ fprintf(where,"DANGER DANGER DANGER DANGER DANGER DANGER DANGER!\n");
+ fprintf(where,"Remote CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+ remote_cpu_utilization = tcp_cc_result->cpu_util;
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ remote_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ remote_cpu_utilization,
+ tcp_cc_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand);
+ }
+ break;
+ case 1:
+ case 2:
+
+ if (print_headers) {
+ fprintf(where,
+ cpu_title,
+ local_cpu_method,
+ remote_cpu_method);
+ }
+
+ fprintf(where,
+ cpu_fmt_1_line_1, /* the format string */
+ lss_size, /* local sendbuf size */
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* guess */
+ elapsed_time, /* how long was the test */
+ nummessages/elapsed_time,
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand); /* remote service demand */
+ fprintf(where,
+ cpu_fmt_1_line_2,
+ rss_size,
+ rsr_size);
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ nummessages/elapsed_time);
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,tput_title,format_units());
+ }
+
+ fprintf(where,
+ tput_fmt_1_line_1, /* the format string */
+ lss_size,
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* how large were the responses */
+ elapsed_time, /* how long did it take */
+ nummessages/elapsed_time);
+ fprintf(where,
+ tput_fmt_1_line_2,
+ rss_size, /* remote recvbuf size */
+ rsr_size);
+
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* TCP statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ fprintf(where,
+ ksink_fmt,
+ local_send_align,
+ remote_recv_offset,
+ local_send_offset,
+ remote_recv_offset);
+
+#ifdef WANT_HISTOGRAM
+ fprintf(where,"\nHistogram of request/response times\n");
+ fflush(where);
+ HIST_report(time_hist);
+#endif /* WANT_HISTOGRAM */
+
+ }
+
+}
+
+
+void
+recv_tcp_cc()
+{
+
+ char *message;
+
+ struct addrinfo *local_res;
+ char local_name[BUFSIZ];
+ char port_buffer[PORTBUFSIZE];
+
+ struct sockaddr_storage myaddr_in, peeraddr_in;
+ SOCKET s_listen,s_data;
+ netperf_socklen_t addrlen;
+ char *recv_message_ptr;
+ char *send_message_ptr;
+ int trans_received;
+ int trans_remaining;
+ int timed_out = 0;
+ float elapsed_time;
+
+ struct tcp_cc_request_struct *tcp_cc_request;
+ struct tcp_cc_response_struct *tcp_cc_response;
+ struct tcp_cc_results_struct *tcp_cc_results;
+
+ tcp_cc_request =
+ (struct tcp_cc_request_struct *)netperf_request.content.test_specific_data;
+ tcp_cc_response =
+ (struct tcp_cc_response_struct *)netperf_response.content.test_specific_data;
+ tcp_cc_results =
+ (struct tcp_cc_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_tcp_cc: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_tcp_cc: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = TCP_CC_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_tcp_cc: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* set-up the data buffer with the requested alignment and offset */
+ message = (char *)malloc(DATABUFFERLEN);
+ if (message == NULL) {
+ printf("malloc(%d) failed!\n", DATABUFFERLEN);
+ exit(1);
+ }
+
+ /* We now alter the message_ptr variables to be at the desired */
+ /* alignments with the desired offsets. */
+
+ if (debug) {
+ fprintf(where,
+ "recv_tcp_cc: requested recv alignment of %d offset %d\n",
+ tcp_cc_request->recv_alignment,
+ tcp_cc_request->recv_offset);
+ fprintf(where,
+ "recv_tcp_cc: requested send alignment of %d offset %d\n",
+ tcp_cc_request->send_alignment,
+ tcp_cc_request->send_offset);
+ fflush(where);
+ }
+
+ recv_message_ptr = ALIGN_BUFFER(message, tcp_cc_request->recv_alignment, tcp_cc_request->recv_offset);
+
+ send_message_ptr = ALIGN_BUFFER(message, tcp_cc_request->send_alignment, tcp_cc_request->send_offset);
+
+ if (debug) {
+ fprintf(where,"recv_tcp_cc: receive alignment and offset set...\n");
+ fflush(where);
+ }
+
+ /* Grab a socket to listen on, and then listen on it. */
+
+ if (debug) {
+ fprintf(where,"recv_tcp_cc: grabbing a socket...\n");
+ fflush(where);
+ }
+
+ /* create_data_socket expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lss_size_req = tcp_cc_request->send_buf_size;
+ lsr_size_req = tcp_cc_request->recv_buf_size;
+ loc_nodelay = tcp_cc_request->no_delay;
+ loc_rcvavoid = tcp_cc_request->so_rcvavoid;
+ loc_sndavoid = tcp_cc_request->so_sndavoid;
+
+ set_hostname_and_port(local_name,
+ port_buffer,
+ nf_to_af(tcp_cc_request->ipfamily),
+ tcp_cc_request->port);
+
+ local_res = complete_addrinfo(local_name,
+ local_name,
+ port_buffer,
+ nf_to_af(tcp_cc_request->ipfamily),
+ SOCK_STREAM,
+ IPPROTO_TCP,
+ 0);
+
+ s_listen = create_data_socket(local_res);
+
+ if (s_listen == INVALID_SOCKET) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ if (debug) {
+ fprintf(where,"could not create data socket\n");
+ fflush(where);
+ }
+ exit(1);
+ }
+
+#ifdef WIN32
+ /* The test timer can fire during operations on the listening socket,
+ so to make the start_timer below work we have to move
+ it to close s_listen while we are blocked on accept. */
+ win_kludge_socket2 = s_listen;
+#endif
+
+
+ /* Now, let's set-up the socket to listen for connections */
+ if (listen(s_listen, 5) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+ if (debug) {
+ fprintf(where,"could not listen\n");
+ fflush(where);
+ }
+ exit(1);
+ }
+
+ /* now get the port number assigned by the system */
+ addrlen = sizeof(myaddr_in);
+ if (getsockname(s_listen,
+ (struct sockaddr *)&myaddr_in,
+ &addrlen) == SOCKET_ERROR){
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+ if (debug) {
+ fprintf(where,"could not geetsockname\n");
+ fflush(where);
+ }
+ exit(1);
+ }
+
+ /* Now myaddr_in contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ tcp_cc_response->data_port_number =
+ (int) ntohs(((struct sockaddr_in *)&myaddr_in)->sin_port);
+ if (debug) {
+ fprintf(where,"telling the remote to call me at %d\n",
+ tcp_cc_response->data_port_number);
+ fflush(where);
+ }
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a 0.0 to */
+ /* the initiator. */
+
+ tcp_cc_response->cpu_rate = (float)0.0; /* assume no cpu */
+ if (tcp_cc_request->measure_cpu) {
+ tcp_cc_response->measure_cpu = 1;
+ tcp_cc_response->cpu_rate =
+ calibrate_local_cpu(tcp_cc_request->cpu_rate);
+ }
+
+
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ tcp_cc_response->send_buf_size = lss_size;
+ tcp_cc_response->recv_buf_size = lsr_size;
+ tcp_cc_response->no_delay = loc_nodelay;
+ tcp_cc_response->so_rcvavoid = loc_rcvavoid;
+ tcp_cc_response->so_sndavoid = loc_sndavoid;
+
+ send_response();
+
+ addrlen = sizeof(peeraddr_in);
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(tcp_cc_request->measure_cpu);
+
+ /* The loop will exit when the sender does a shutdown, which will */
+ /* return a length of zero */
+
+ if (tcp_cc_request->test_length > 0) {
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(tcp_cc_request->test_length + PAD_TIME);
+ }
+ else {
+ times_up = 1;
+ trans_remaining = tcp_cc_request->test_length * -1;
+ }
+
+ trans_received = 0;
+
+ while ((!times_up) || (trans_remaining > 0)) {
+#ifdef WIN32
+ /* The test timer will probably fire during this accept,
+ so to make the start_timer above work we have to move
+ it to close s_listen while we are blocked on accept. */
+ win_kludge_socket = s_listen;
+#endif
+ /* accept a connection from the remote */
+ if ((s_data=accept(s_listen,
+ (struct sockaddr *)&peeraddr_in,
+ &addrlen)) == INVALID_SOCKET) {
+ if (errno == EINTR) {
+ /* the timer popped */
+ timed_out = 1;
+ break;
+ }
+ fprintf(where,"recv_tcp_cc: accept: errno = %d\n",errno);
+ fflush(where);
+ close(s_listen);
+
+ exit(1);
+ }
+
+#ifdef KLUDGE_SOCKET_OPTIONS
+ /* this is for those systems which *INCORRECTLY* fail to pass */
+ /* attributes across an accept() call. Including this goes against */
+ /* my better judgement :( raj 11/95 */
+
+ kludge_socket_options(s_data);
+
+#endif /* KLUDGE_SOCKET_OPTIONS */
+
+#ifdef WIN32
+ /* this is used so the timer thread can close the socket out from */
+ /* under us, which to date is the easiest/cleanest/least */
+ /* Windows-specific way I can find to force the winsock calls to */
+ /* return WSAEINTR with the test is over. anything that will run on */
+ /* 95 and NT and is closer to what netperf expects from Unix signals */
+ /* and such would be appreciated raj 1/96 */
+ win_kludge_socket = s_data;
+#endif /* WIN32 */
+
+ if (debug) {
+ fprintf(where,"recv_tcp_cc: accepted data connection.\n");
+ fflush(where);
+ }
+
+
+ /* close the connection. the server will likely do a graceful */
+ /* close of the connection, insuring that all data has arrived at */
+ /* the client. for this it will call shutdown(), and then recv() and */
+ /* then close(). I'm reasonably confident that this is the */
+ /* appropriate sequence of calls - I would like to hear of */
+ /* examples in web servers to the contrary. raj 10/95*/
+ close(s_data);
+
+ trans_received++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_tcp_cc: Transaction %d complete\n",
+ trans_received);
+ fflush(where);
+ }
+
+ }
+
+
+ /* The loop now exits due to timeout or transaction count being */
+ /* reached */
+
+ cpu_stop(tcp_cc_request->measure_cpu,&elapsed_time);
+
+ if (timed_out) {
+ /* we ended the test by time, which was at least 2 seconds */
+ /* longer than we wanted to run. so, we want to subtract */
+ /* PAD_TIME from the elapsed_time. */
+ elapsed_time -= PAD_TIME;
+ }
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_tcp_cc: got %d transactions\n",
+ trans_received);
+ fflush(where);
+ }
+
+ tcp_cc_results->bytes_received = (trans_received *
+ (tcp_cc_request->request_size +
+ tcp_cc_request->response_size));
+ tcp_cc_results->trans_received = trans_received;
+ tcp_cc_results->elapsed_time = elapsed_time;
+ if (tcp_cc_request->measure_cpu) {
+ tcp_cc_results->cpu_util = calc_cpu_util(elapsed_time);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_tcp_cc: test complete, sending results.\n");
+ fflush(where);
+ }
+
+ send_response();
+
+}
+
+void
+print_sockets_usage()
+{
+
+ fwrite(sockets_usage, sizeof(char), strlen(sockets_usage), stdout);
+ exit(1);
+
+}
+
+void
+scan_sockets_args(int argc, char *argv[])
+
+{
+
+#define SOCKETS_ARGS "b:CDnNhH:L:m:M:p:P:r:s:S:T:Vw:W:z46"
+
+ extern char *optarg; /* pointer to option string */
+
+ int c;
+
+ char
+ arg1[BUFSIZ], /* argument holders */
+ arg2[BUFSIZ];
+
+ if (debug) {
+ int i;
+ printf("%s called with the following argument vector\n",
+ __func__);
+ for (i = 0; i< argc; i++) {
+ printf("%s ",argv[i]);
+ }
+ printf("\n");
+ }
+
+ strncpy(local_data_port,"0",sizeof(local_data_port));
+ strncpy(remote_data_port,"0",sizeof(remote_data_port));
+
+ /* Go through all the command line arguments and break them */
+ /* out. For those options that take two parms, specifying only */
+ /* the first will set both to that value. Specifying only the */
+ /* second will leave the first untouched. To change only the */
+ /* first, use the form "first," (see the routine break_args.. */
+
+ while ((c= getopt(argc, argv, SOCKETS_ARGS)) != EOF) {
+ switch (c) {
+ case '?':
+ case '4':
+ remote_data_family = AF_INET;
+ local_data_family = AF_INET;
+ break;
+ case '6':
+#if defined(AF_INET6)
+ remote_data_family = AF_INET6;
+ local_data_family = AF_INET6;
+#else
+ fprintf(stderr,
+ "This netperf was not compiled on an IPv6 capable host!\n");
+ fflush(stderr);
+ exit(-1);
+#endif
+ break;
+ case 'h':
+ print_sockets_usage();
+ exit(1);
+ case 'b':
+#ifdef WANT_FIRST_BURST
+ first_burst_size = atoi(optarg);
+#else /* WANT_FIRST_BURST */
+ printf("Initial request burst functionality not compiled-in!\n");
+#endif /* WANT_FIRST_BURST */
+ break;
+ case 'C':
+#ifdef TCP_CORK
+ /* set TCP_CORK */
+ loc_tcpcork = 1;
+ rem_tcpcork = 1; /* however, at first, we ony have cork affect loc */
+#else
+ printf("WARNING: TCP_CORK not available on this platform!\n");
+#endif /* TCP_CORK */
+ break;
+ case 'D':
+ /* set the TCP nodelay flag */
+ loc_nodelay = 1;
+ rem_nodelay = 1;
+ break;
+ case 'H':
+ break_args_explicit(optarg,arg1,arg2);
+ if (arg1[0]) {
+ /* make sure we leave room for the NULL termination boys and
+ girls. raj 2005-02-82 */
+ remote_data_address = malloc(strlen(arg1)+1);
+ strncpy(remote_data_address,arg1,strlen(arg1));
+ }
+ if (arg2[0])
+ remote_data_family = parse_address_family(arg2);
+ break;
+ case 'L':
+ break_args_explicit(optarg,arg1,arg2);
+ if (arg1[0]) {
+ /* make sure we leave room for the NULL termination boys and
+ girls. raj 2005-02-82 */
+ local_data_address = malloc(strlen(arg1)+1);
+ strncpy(local_data_address,arg1,strlen(arg1));
+ }
+ if (arg2[0])
+ local_data_family = parse_address_family(arg2);
+ break;
+ case 's':
+ /* set local socket sizes */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ lss_size_req = convert(arg1);
+ if (arg2[0])
+ lsr_size_req = convert(arg2);
+ break;
+ case 'S':
+ /* set remote socket sizes */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ rss_size_req = convert(arg1);
+ if (arg2[0])
+ rsr_size_req = convert(arg2);
+ break;
+ case 'r':
+ /* set the request/response sizes */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ req_size = convert(arg1);
+ if (arg2[0])
+ rsp_size = convert(arg2);
+ break;
+ case 'm':
+ /* set the send size */
+ send_size = convert(optarg);
+ break;
+ case 'M':
+ /* set the recv size */
+ recv_size = convert(optarg);
+ break;
+ case 'n':
+ /* set the local socket type*/
+ local_connected = 1;
+ break;
+ case 'N':
+ /* set the remote socket type*/
+ remote_connected = 1;
+ break;
+ case 'p':
+ /* set the min and max port numbers for the TCP_CRR and TCP_TRR */
+ /* tests. */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ client_port_min = atoi(arg1);
+ if (arg2[0])
+ client_port_max = atoi(arg2);
+ break;
+ case 'P':
+ /* set the local and remote data port numbers for the tests to
+ allow them to run through those blankety blank end-to-end
+ breaking firewalls. raj 2004-06-15 */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ strncpy(local_data_port,arg1,sizeof(local_data_port));
+ if (arg2[0])
+ strncpy(remote_data_port,arg2,sizeof(remote_data_port));
+ break;
+ case 't':
+ /* set the test name */
+ strcpy(test_name,optarg);
+ break;
+ case 'W':
+ /* set the "width" of the user space data */
+ /* buffer. This will be the number of */
+ /* send_size buffers malloc'd in the */
+ /* *_STREAM test. It may be enhanced to set */
+ /* both send and receive "widths" but for now */
+ /* it is just the sending *_STREAM. */
+ send_width = convert(optarg);
+ break;
+ case 'V' :
+ /* we want to do copy avoidance and will set */
+ /* it for everything, everywhere, if we really */
+ /* can. of course, we don't know anything */
+ /* about the remote... */
+#ifdef SO_SND_COPYAVOID
+ loc_sndavoid = 1;
+#else
+ loc_sndavoid = 0;
+ printf("Local send copy avoidance not available.\n");
+#endif
+#ifdef SO_RCV_COPYAVOID
+ loc_rcvavoid = 1;
+#else
+ loc_rcvavoid = 0;
+ printf("Local recv copy avoidance not available.\n");
+#endif
+ rem_sndavoid = 1;
+ rem_rcvavoid = 1;
+ break;
+ };
+ }
+
+#if defined(WANT_FIRST_BURST)
+#if defined(WANT_HISTOGRAM)
+ /* if WANT_FIRST_BURST and WANT_HISTOGRAM are defined and the user
+ indeed wants a non-zero first burst size, and we would emit a
+ histogram, then we should emit a warning that the two are not
+ compatible. raj 2006-01-31 */
+ if ((first_burst_size > 0) && (verbosity >= 2)) {
+ fprintf(stderr,
+ "WARNING! Histograms and first bursts are incompatible!\n");
+ fflush(stderr);
+ }
+#endif
+#endif
+
+ /* we do not want to make remote_data_address non-NULL because if
+ the user has not specified a remote adata address, we want to
+ take it from the hostname in the -H global option. raj
+ 2005-02-08 */
+
+ /* so, if there is to be no control connection, we want to have some
+ different settings for a few things */
+
+ if (no_control) {
+
+ if (strcmp(remote_data_port,"0") == 0) {
+ /* we need to select either the discard port, echo port or
+ chargen port dedepending on the test name. raj 2007-02-08 */
+ if (strstr(test_name,"STREAM") ||
+ strstr(test_name,"SENDFILE")) {
+ strncpy(remote_data_port,"discard",sizeof(remote_data_port));
+ }
+ else if (strstr(test_name,"RR")) {
+ strncpy(remote_data_port,"echo",sizeof(remote_data_port));
+ }
+ else if (strstr(test_name,"MAERTS")) {
+ strncpy(remote_data_port,"chargen",sizeof(remote_data_port));
+ }
+ else {
+ printf("No default port known for the %s test, please set one yourself\n",test_name);
+ exit(-1);
+ }
+ }
+ remote_data_port[sizeof(remote_data_port) - 1] = '\0';
+
+ /* I go back and forth on whether these should become -1 or if
+ they should become 0 for a no_control test. what do you think?
+ raj 2006-02-08 */
+
+ rem_rcvavoid = -1;
+ rem_sndavoid = -1;
+ rss_size_req = -1;
+ rsr_size_req = -1;
+ rem_nodelay = -1;
+
+ if (strstr(test_name,"STREAM") ||
+ strstr(test_name,"SENDFILE")) {
+ recv_size = -1;
+ }
+ else if (strstr(test_name,"RR")) {
+ /* I am however _certain_ that for a no control RR test the
+ response size must equal the request size since 99 times out
+ of ten we will be speaking to the echo service somewhere */
+ rsp_size = req_size;
+ }
+ else if (strstr(test_name,"MAERTS")) {
+ send_size = -1;
+ }
+ else {
+ printf("No default port known for the %s test, please set one yourself\n",test_name);
+ exit(-1);
+ }
+ }
+}
diff --git a/nettest_bsd.h b/nettest_bsd.h
new file mode 100644
index 0000000..5491290
--- /dev/null
+++ b/nettest_bsd.h
@@ -0,0 +1,471 @@
+/*
+ Copyright (C) 1993-2004 Hewlett-Packard Company
+*/
+
+ /* This file contains the test-specific definitions for netperf's BSD */
+ /* sockets tests */
+
+/* well boys and girls, seems that while AF_INET is "2" and AF_UNSPEC
+ is "0" the world over, AF_INET6 is different values depending on
+ the platform... grrr. On HP-UX 11i it is "22" and on Linux 2.6 it
+ is "10" sooooo... we have to define our own space for netperf to
+ enable us to pass values around from machine to machine. raj
+ 2005-02-08 */
+#define NF_UNSPEC 0
+#define NF_INET 4
+#define NF_INET6 6
+
+struct tcp_stream_request_struct {
+ int send_buf_size;
+ int recv_buf_size; /* how big does the client want it - the */
+ /* receive socket buffer that is */
+ int receive_size; /* how many bytes do we want to receive at one */
+ /* time? */
+ int recv_alignment; /* what is the alignment of the receive */
+ /* buffer? */
+ int recv_offset; /* and at what offset from that alignment? */
+ int no_delay; /* do we disable the nagle algorithm for send */
+ /* coalescing? */
+ int measure_cpu; /* does the client want server cpu utilization */
+ /* measured? */
+ float cpu_rate; /* do we know how fast the cpu is already? */
+ int test_length; /* how long is the test? */
+ int so_rcvavoid; /* do we want the remote to avoid copies on */
+ /* receives? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int dirty_count; /* how many integers in the receive buffer */
+ /* should be made dirty before calling recv? */
+ int clean_count; /* how many integers should be read from the */
+ /* recv buffer before calling recv? */
+ int port; /* the port to which the recv side should bind
+ to allow netperf to run through those evil
+ firewall things */
+ int ipfamily; /* the address family of ipaddress */
+};
+
+struct tcp_stream_response_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int receive_size;
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ int test_length; /* how long is the test? */
+ int send_buf_size;
+ int data_port_number; /* connect to me here */
+ float cpu_rate; /* could we measure */
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+};
+
+struct tcp_stream_results_struct {
+ double bytes_received;
+ unsigned int recv_calls;
+ float elapsed_time; /* how long the test ran */
+ float cpu_util; /* -1 if not measured */
+ float serv_dem; /* -1 if not measured */
+ int cpu_method; /* how was cpu util measured? */
+ int num_cpus; /* how many CPUs had the remote? */
+};
+
+struct tcp_maerts_request_struct {
+ int send_buf_size;
+ int recv_buf_size; /* how big does the client want it - the */
+ /* receive socket buffer that is */
+ int send_size; /* how many bytes do we want netserver to send
+ at one time? */
+ int send_alignment; /* what is the alignment of the send */
+ /* buffer? */
+ int send_offset; /* and at what offset from that alignment? */
+ int no_delay; /* do we disable the nagle algorithm for send */
+ /* coalescing? */
+ int measure_cpu; /* does the client want server cpu utilization */
+ /* measured? */
+ float cpu_rate; /* do we know how fast the cpu is already? */
+ int test_length; /* how long is the test? */
+ int so_rcvavoid; /* do we want the remote to avoid copies on */
+ /* receives? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int dirty_count; /* how many integers in the send buffer */
+ /* should be made dirty before calling recv? */
+ int clean_count; /* how many integers should be read from the */
+ /* recv buffer before calling recv? */
+ int port; /* the port to which the recv side should bind
+ to allow netperf to run through those evil
+ firewall things */
+ int ipfamily;
+};
+
+struct tcp_maerts_response_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int send_size;
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ int test_length; /* how long is the test? */
+ int send_buf_size;
+ int data_port_number; /* connect to me here */
+ float cpu_rate; /* could we measure */
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+};
+
+struct tcp_maerts_results_struct {
+ double bytes_sent;
+ unsigned int send_calls;
+ float elapsed_time; /* how long the test ran */
+ float cpu_util; /* -1 if not measured */
+ float serv_dem; /* -1 if not measured */
+ int cpu_method; /* how was cpu util measured? */
+ int num_cpus; /* how many CPUs had the remote? */
+};
+
+struct tcp_rr_request_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int send_buf_size;
+ int recv_alignment;
+ int recv_offset;
+ int send_alignment;
+ int send_offset;
+ int request_size;
+ int response_size;
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ float cpu_rate; /* do we know how fast the cpu is? */
+ int test_length; /* how long is the test? */
+ int so_rcvavoid; /* do we want the remote to avoid receive */
+ /* copies? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int port; /* the port to which the recv side should bind
+ to allow netperf to run through those evil
+ firewall things */
+ int ipfamily;
+};
+
+struct tcp_rr_response_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ int test_length; /* how long is the test? */
+ int send_buf_size;
+ int data_port_number; /* connect to me here */
+ float cpu_rate; /* could we measure */
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+};
+
+struct tcp_rr_results_struct {
+ unsigned int bytes_received; /* ignored initially */
+ unsigned int recv_calls; /* ignored initially */
+ unsigned int trans_received; /* not ignored */
+ float elapsed_time; /* how long the test ran */
+ float cpu_util; /* -1 if not measured */
+ float serv_dem; /* -1 if not measured */
+ int cpu_method; /* how was cpu util measured? */
+ int num_cpus; /* how many CPUs had the remote? */
+};
+
+struct tcp_conn_rr_request_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int send_buf_size;
+ int recv_alignment;
+ int recv_offset;
+ int send_alignment;
+ int send_offset;
+ int request_size;
+ int response_size;
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ float cpu_rate; /* do we know how fast the cpu is? */
+ int test_length; /* how long is the test? */
+ int so_rcvavoid; /* do we want the remote to avoid receive */
+ /* copies? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int port; /* the port to which the recv side should bind
+ to allow netperf to run through those evil
+ firewall things */
+ int ipfamily;
+};
+
+
+struct tcp_conn_rr_response_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ int test_length; /* how long is the test? */
+ int send_buf_size;
+ int data_port_number; /* connect to me here */
+ float cpu_rate; /* could we measure */
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+};
+
+struct tcp_conn_rr_results_struct {
+ unsigned int bytes_received; /* ignored initially */
+ unsigned int recv_calls; /* ignored initially */
+ unsigned int trans_received; /* not ignored */
+ float elapsed_time; /* how long the test ran */
+ float cpu_util; /* -1 if not measured */
+ float serv_dem; /* -1 if not measured */
+ int cpu_method; /* how was cpu util measured? */
+ int num_cpus; /* how many CPUs had the remote? */
+};
+
+struct tcp_tran_rr_request_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int send_buf_size;
+ int recv_alignment;
+ int recv_offset;
+ int send_alignment;
+ int send_offset;
+ int request_size;
+ int response_size;
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ float cpu_rate; /* do we know how fast the cpu is? */
+ int test_length; /* how long is the test? */
+ int so_rcvavoid; /* do we want the remote to avoid receive */
+ /* copies? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int port; /* the port to which the recv side should bind
+ to allow netperf to run through those evil
+ firewall things */
+ int ipfamily;
+};
+
+
+struct tcp_tran_rr_response_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ int test_length; /* how long is the test? */
+ int send_buf_size;
+ int data_port_number; /* connect to me here */
+ float cpu_rate; /* could we measure */
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+};
+
+struct tcp_tran_rr_results_struct {
+ unsigned int bytes_received; /* ignored initially */
+ unsigned int recv_calls; /* ignored initially */
+ unsigned int trans_received; /* not ignored */
+ float elapsed_time; /* how long the test ran */
+ float cpu_util; /* -1 if not measured */
+ float serv_dem; /* -1 if not measured */
+ int cpu_method; /* how was cpu util measured? */
+ int num_cpus; /* how many CPUs had the remote? */
+
+};
+
+struct udp_stream_request_struct {
+ int recv_buf_size;
+ int message_size;
+ int recv_connected;
+ int recv_alignment;
+ int recv_offset;
+ int checksum_off;
+ int measure_cpu;
+ float cpu_rate;
+ int test_length;
+ int so_rcvavoid; /* do we want the remote to avoid receive */
+ /* copies? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int port; /* the port to which the recv side should bind
+ to allow netperf to run through those evil
+ firewall things */
+ int ipfamily;
+
+};
+
+struct udp_stream_response_struct {
+ int recv_buf_size;
+ int send_buf_size;
+ int measure_cpu;
+ int test_length;
+ int data_port_number;
+ float cpu_rate;
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+};
+
+struct udp_stream_results_struct {
+ unsigned int messages_recvd;
+ unsigned int bytes_received;
+ float elapsed_time;
+ float cpu_util;
+ int cpu_method; /* how was cpu util measured? */
+ int num_cpus; /* how many CPUs had the remote? */
+};
+
+
+struct udp_rr_request_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int send_buf_size;
+ int recv_alignment;
+ int recv_offset;
+ int send_alignment;
+ int send_offset;
+ int request_size;
+ int response_size;
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ float cpu_rate; /* do we know how fast the cpu is? */
+ int test_length; /* how long is the test? */
+ int so_rcvavoid; /* do we want the remote to avoid receive */
+ /* copies? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int port; /* the port to which the recv side should bind
+ to allow netperf to run through those evil
+ firewall things */
+ int ipfamily;
+};
+
+struct udp_rr_response_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ int test_length; /* how long is the test? */
+ int send_buf_size;
+ int data_port_number; /* connect to me here */
+ float cpu_rate; /* could we measure */
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+};
+
+struct udp_rr_results_struct {
+ unsigned int bytes_received; /* ignored initially */
+ unsigned int recv_calls; /* ignored initially */
+ unsigned int trans_received; /* not ignored */
+ float elapsed_time; /* how long the test ran */
+ float cpu_util; /* -1 if not measured */
+ float serv_dem; /* -1 if not measured */
+ int cpu_method; /* how was cpu util measured? */
+ int num_cpus; /* how many CPUs had the remote? */
+};
+
+struct tcp_cc_request_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int send_buf_size;
+ int recv_alignment;
+ int recv_offset;
+ int send_alignment;
+ int send_offset;
+ int request_size;
+ int response_size;
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ float cpu_rate; /* do we know how fast the cpu is? */
+ int test_length; /* how long is the test? */
+ int so_rcvavoid; /* do we want the remote to avoid receive */
+ /* copies? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int port; /* the port to which the recv side should bind
+ to allow netperf to run through those evil
+ firewall things */
+ int ipfamily;
+};
+
+
+struct tcp_cc_response_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ int test_length; /* how long is the test? */
+ int send_buf_size;
+ int data_port_number; /* connect to me here */
+ float cpu_rate; /* could we measure */
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+};
+
+struct tcp_cc_results_struct {
+ unsigned int bytes_received; /* ignored initially */
+ unsigned int recv_calls; /* ignored initially */
+ unsigned int trans_received; /* not ignored */
+ float elapsed_time; /* how long the test ran */
+ float cpu_util; /* -1 if not measured */
+ float serv_dem; /* -1 if not measured */
+ int cpu_method; /* how was cpu util measured? */
+ int num_cpus; /* how many CPUs had the remote? */
+};
+
+extern int rss_size_req, /* requested remote socket send buffer size */
+ rsr_size_req, /* requested remote socket recv buffer size */
+ rss_size, /* remote socket send buffer size */
+ rsr_size, /* remote socket recv buffer size */
+ lss_size_req, /* requested local socket send buffer size */
+ lsr_size_req, /* requested local socket recv buffer size */
+ lss_size, /* local socket send buffer size */
+ lsr_size, /* local socket recv buffer size */
+ req_size, /* request size */
+ rsp_size, /* response size */
+ send_size, /* how big are individual sends */
+ recv_size, /* how big are individual receives */
+ loc_nodelay, /* don't/do use NODELAY locally */
+ rem_nodelay, /* don't/do use NODELAY remotely */
+ loc_sndavoid, /* avoid send copies locally */
+ loc_rcvavoid, /* avoid recv copies locally */
+ rem_sndavoid, /* avoid send copies remotely */
+ rem_rcvavoid; /* avoid recv_copies remotely */
+
+
+extern void scan_sockets_args(int argc, char *argv[]);
+extern struct addrinfo *complete_addrinfo(char *controlhost,
+ char *data_address,
+ char *port,
+ int family,
+ int type,
+ int protocol,
+ int flags);
+extern void complete_addrinfos(struct addrinfo **remote,
+ struct addrinfo **local,
+ char remote_host[],
+ int type,
+ int protocol,
+ int flags);
+extern int af_to_nf(int af);
+extern int nf_to_af(int nf);
+extern void print_top_test_header(char test_name[],
+ struct addrinfo *source,
+ struct addrinfo *destination);
+extern void set_port_number(struct addrinfo *res,
+ unsigned short port);
+extern void set_hostname_and_port(char *hostname,
+ char *portstr,
+ int family,
+ int port);
+extern void send_tcp_stream(char remote_host[]);
+extern void send_tcp_maerts(char remote_host[]);
+extern void send_tcp_rr(char remote_host[]);
+extern void send_tcp_conn_rr(char remote_host[]);
+extern void send_tcp_cc(char remote_host[]);
+extern void send_udp_stream(char remote_host[]);
+extern void send_udp_rr(char remote_host[]);
+
+extern void recv_tcp_stream();
+extern void recv_tcp_maerts();
+extern void recv_tcp_rr();
+extern void recv_tcp_conn_rr();
+extern void recv_tcp_cc();
+extern void recv_udp_stream();
+extern void recv_udp_rr();
+
+extern void loc_cpu_rate();
+extern void rem_cpu_rate();
+
+#ifdef HAVE_ICSC_EXS
+extern void send_exs_tcp_stream(char remotehost[]);
+#endif /* HAVE_ICSC_EXS */
+
+#ifdef HAVE_SENDFILE
+extern void sendfile_tcp_stream(char remotehost[]);
+#endif /* HAVE_SENDFILE */
+
+#if !defined(HAVE_STRUCT_SOCKADDR_STORAGE) && !defined(sockaddr_storage)
+#define sockaddr_storage sockaddr_in
+#endif
+
+#ifdef DO_NBRR
+extern void send_tcp_nbrr(char remote_host[]);
+
+extern void recv_tcp_nbrr();
+#endif
+
diff --git a/nettest_dlpi.c b/nettest_dlpi.c
new file mode 100644
index 0000000..ab3e79f
--- /dev/null
+++ b/nettest_dlpi.c
@@ -0,0 +1,3798 @@
+
+/****************************************************************/
+/* */
+/* nettest_dlpi.c */
+/* */
+/* the actual test routines... */
+/* */
+/* send_dlpi_co_stream() perform a CO DLPI stream test */
+/* recv_dlpi_co_stream() */
+/* send_dlpi_co_rr() perform a CO DLPI req/res */
+/* recv_dlpi_co_rr() */
+/* send_dlpi_cl_stream() perform a CL DLPI stream test */
+/* recv_dlpi_cl_stream() */
+/* send_dlpi_cl_rr() perform a CL DLPI req/res */
+/* recv_dlpi_cl_rr() */
+/* */
+/****************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef WANT_DLPI
+char nettest_dlpi_id[]="\
+@(#)nettest_dlpi.c (c) Copyright 1993,1995,2004 Hewlett-Packard Co. Version 2.4.3";
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <malloc.h>
+#include <sys/stream.h>
+#include <sys/stropts.h>
+#include <sys/poll.h>
+#ifdef __osf__
+#include <sys/dlpihdr.h>
+#else /* __osf__ */
+#include <sys/dlpi.h>
+#ifdef __hpux__
+#include <sys/dlpi_ext.h>
+#endif /* __hpux__ */
+#endif /* __osf__ */
+
+#include "netlib.h"
+#include "netsh.h"
+#include "nettest_dlpi.h"
+
+/* these are some variables global to all the DLPI tests. declare */
+/* them static to make them global only to this file */
+
+static int
+ rsw_size, /* remote send window size */
+ rrw_size, /* remote recv window size */
+ lsw_size, /* local send window size */
+ lrw_size, /* local recv window size */
+ req_size = 100, /* request size */
+ rsp_size = 200, /* response size */
+ send_size, /* how big are individual sends */
+ recv_size; /* how big are individual receives */
+
+int
+ loc_ppa = 4, /* the ppa for the local interface, */
+ /* as shown as the NM Id in lanscan */
+ rem_ppa = 4, /* the ppa for the remote interface */
+ dlpi_sap = 84; /* which 802.2 SAP should we use? */
+
+char loc_dlpi_device[32] = "/dev/dlpi";
+char rem_dlpi_device[32] = "/dev/dlpi";
+
+char dlpi_usage[] = "\n\
+Usage: netperf [global options] -- [test options] \n\
+\n\
+CO/CL DLPI Test Options:\n\
+ -D dev[,dev] Set the local/remote DLPI device file name\n\
+ -h Display this text\n\
+ -M bytes Set the recv size (DLCO_STREAM, DLCL_STREAM)\n\
+ -m bytes Set the send size (DLCO_STREAM, DLCL_STREAM)\n\
+ -p loc[,rem] Set the local/remote PPA for the test\n\
+ -R bytes Set response size (DLCO_RR, DLCL_RR)\n\
+ -r bytes Set request size (DLCO_RR, DLCL_RR)\n\
+ -s sap Set the 802.2 sap for the test\n\
+ -W send[,recv] Set remote send/recv window sizes\n\
+ -w send[,recv] Set local send/recv window sizes\n\
+\n\
+For those options taking two parms, at least one must be specified;\n\
+specifying one value without a comma will set both parms to that\n\
+value, specifying a value with a leading comma will set just the second\n\
+parm, a value with a trailing comma will set just the first. To set\n\
+each parm to unique values, specify both and separate them with a\n\
+comma.\n";
+
+
+/* This routine implements the CO unidirectional data transfer test */
+/* (a.k.a. stream) for the sockets interface. It receives its */
+/* parameters via global variables from the shell and writes its */
+/* output to the standard output. */
+
+
+void
+send_dlpi_co_stream()
+{
+
+ char *tput_title = "\
+Recv Send Send \n\
+Window Window Message Elapsed \n\
+Size Size Size Time Throughput \n\
+frames frames bytes secs. %s/sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1 =
+ "%5d %5d %6d %-6.2f %7.2f \n";
+
+ char *cpu_title = "\
+Recv Send Send Utilization Service Demand\n\
+Window Window Message Elapsed Send Recv Send Recv\n\
+Size Size Size Time Throughput local remote local remote\n\
+frames frames bytes secs. %-8.8s/s %% %% us/KB us/KB\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f\n";
+
+ char *cpu_fmt_1 =
+ "%5d %5d %6d %-6.2f %7.2f %-6.2f %-6.2f %-6.3f %-6.3f\n";
+
+ char *ksink_fmt = "\n\
+Alignment Offset %-8.8s %-8.8s Sends %-8.8s Recvs\n\
+Local Remote Local Remote Xfered Per Per\n\
+Send Recv Send Recv Send (avg) Recv (avg)\n\
+%5d %5d %5d %5d %6.4g %6.2f %6d %6.2f %6d\n";
+
+
+ float elapsed_time;
+
+#ifdef WANT_INTERVALS
+ int interval_count;
+#endif /* WANT_INTERVALS */
+
+ /* what we want is to have a buffer space that is at least one */
+ /* send-size greater than our send window. this will insure that we */
+ /* are never trying to re-use a buffer that may still be in the hands */
+ /* of the transport. This buffer will be malloc'd after we have found */
+ /* the size of the local senc socket buffer. We will want to deal */
+ /* with alignment and offset concerns as well. */
+
+ struct ring_elt *send_ring;
+ char *message;
+ char *message_ptr;
+ struct strbuf send_message;
+ char dlsap[BUFSIZ];
+ int dlsap_len;
+ int *message_int_ptr;
+ int message_offset;
+ int malloc_size;
+
+ int len;
+ int nummessages;
+ int send_descriptor;
+ int bytes_remaining;
+ /* with links like fddi, one can send > 32 bits worth of bytes */
+ /* during a test... ;-) */
+ double bytes_sent;
+
+#ifdef DIRTY
+ int i;
+#endif /* DIRTY */
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+ double thruput;
+
+ struct dlpi_co_stream_request_struct *dlpi_co_stream_request;
+ struct dlpi_co_stream_response_struct *dlpi_co_stream_response;
+ struct dlpi_co_stream_results_struct *dlpi_co_stream_result;
+
+ dlpi_co_stream_request =
+ (struct dlpi_co_stream_request_struct *)netperf_request.content.test_specific_data;
+ dlpi_co_stream_response =
+ (struct dlpi_co_stream_response_struct *)netperf_response.content.test_specific_data;
+ dlpi_co_stream_result =
+ (struct dlpi_co_stream_results_struct *)netperf_response.content.test_specific_data;
+
+ if ( print_headers ) {
+ fprintf(where,"DLPI CO STREAM TEST\n");
+ if (local_cpu_usage || remote_cpu_usage)
+ fprintf(where,cpu_title,format_units());
+ else
+ fprintf(where,tput_title,format_units());
+ }
+
+ /* initialize a few counters */
+
+ nummessages = 0;
+ bytes_sent = 0.0;
+ times_up = 0;
+
+ /*set up the data descriptor */
+ send_descriptor = dl_open(loc_dlpi_device,loc_ppa);
+ if (send_descriptor < 0){
+ perror("netperf: send_dlpi_co_stream: dlpi stream data descriptor");
+ exit(1);
+ }
+
+ /* bind the puppy and get the assigned dlsap */
+ dlsap_len = BUFSIZ;
+ if (dl_bind(send_descriptor,
+ dlpi_sap, DL_CODLS, dlsap, &dlsap_len) != 0) {
+ fprintf(where,"send_dlpi_co_rr: bind failure\n");
+ fflush(where);
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"send_dlpi_co_stream: send_descriptor obtained...\n");
+ }
+
+#ifdef DL_HP_SET_LOCAL_WIN_REQ
+ if (lsw_size > 0) {
+ if (debug > 1) {
+ fprintf(where,"netperf: send_dlpi_co_stream: window send size altered from system default...\n");
+ fprintf(where," send: %d\n",lsw_size);
+ }
+ }
+ if (lrw_size > 0) {
+ if (debug > 1) {
+ fprintf(where,
+ "netperf: send_dlpi_co_stream: window recv size altered from system default...\n");
+ fprintf(where," recv: %d\n",lrw_size);
+ }
+ }
+
+
+ /* Now, we will find-out what the size actually became, and report */
+ /* that back to the user. If the call fails, we will just report a -1 */
+ /* back to the initiator for the recv buffer size. */
+
+
+ if (debug) {
+ fprintf(where,
+ "netperf: send_dlpi_co_stream: window sizes determined...\n");
+ fprintf(where," send: %d recv: %d\n",lsw_size,lrw_size);
+ ffluch(where);
+ }
+
+#else /* DL_HP_SET_LOCAL_WIN_REQ */
+
+ lsw_size = -1;
+ lrw_size = -1;
+
+#endif /* DL_HP_SET_LOCAL_WIN_REQ */
+
+ /* we should pick a default send_size, it should not be larger than */
+ /* the min of the two interface MTU's, and should perhaps default to */
+ /* the Interface MTU, but for now, we will default it to 1024... if */
+ /* someone wants to change this, the should change the corresponding */
+ /* lines in the recv_dlpi_co_stream routine */
+
+ if (send_size == 0) {
+ send_size = 1024;
+ }
+
+ /* set-up the data buffer with the requested alignment and offset. */
+ /* After we have calculated the proper starting address, we want to */
+ /* put that back into the message variable so we go back to the */
+ /* proper place. note that this means that only the first send is */
+ /* guaranteed to be at the alignment specified by the -a parameter. I */
+ /* think that this is a little more "real-world" than what was found */
+ /* in previous versions. note also that we have allocated a quantity */
+ /* of memory that is at least one send-size greater than our socket */
+ /* buffer size. We want to be sure that there are at least two */
+ /* buffers allocated - this can be a bit of a problem when the */
+ /* send_size is bigger than the socket size, so we must check... the */
+ /* user may have wanted to explicitly set the "width" of our send */
+ /* buffers, we should respect that wish... */
+ if (send_width == 0) {
+ send_width = (lsw_size/send_size) + 1;
+ if (send_width == 1) send_width++;
+ }
+
+ send_ring = allocate_buffer_ring(send_width,
+ send_size,
+ local_send_align,
+ local_send_offset);
+
+ send_message.maxlen = send_size;
+ send_message.len = send_size;
+ send_message.buf = send_ring->buffer_ptr;
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back.*/
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ /* Tell the remote end to do a listen. The server alters the socket */
+ /* paramters on the other side at this point, hence the reason for */
+ /* all the values being passed in the setup message. If the user did */
+ /* not specify any of the parameters, they will be passed as 0, which */
+ /* will indicate to the remote that no changes beyond the system's */
+ /* default should be used. */
+
+ netperf_request.content.request_type = DO_DLPI_CO_STREAM;
+ dlpi_co_stream_request->send_win_size = rsw_size;
+ dlpi_co_stream_request->recv_win_size = rrw_size;
+ dlpi_co_stream_request->receive_size = recv_size;
+ dlpi_co_stream_request->recv_alignment= remote_recv_align;
+ dlpi_co_stream_request->recv_offset = remote_recv_offset;
+ dlpi_co_stream_request->measure_cpu = remote_cpu_usage;
+ dlpi_co_stream_request->cpu_rate = remote_cpu_rate;
+ dlpi_co_stream_request->ppa = rem_ppa;
+ dlpi_co_stream_request->sap = dlpi_sap;
+ dlpi_co_stream_request->dev_name_len = strlen(rem_dlpi_device);
+ strcpy(dlpi_co_stream_request->dlpi_device,
+ rem_dlpi_device);
+
+#ifdef __alpha
+
+ /* ok - even on a DEC box, strings are strings. I didn't really want */
+ /* to ntohl the words of a string. since I don't want to teach the */
+ /* send_ and recv_ _request and _response routines about the types, */
+ /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
+ /* solution would be to use XDR, but I am still leary of being able */
+ /* to find XDR libs on all platforms I want running netperf. raj */
+ {
+ int *charword;
+ int *initword;
+ int *lastword;
+
+ initword = (int *) dlpi_co_stream_request->dlpi_device;
+ lastword = initword + ((strlen(rem_dlpi_device) + 3) / 4);
+
+ for (charword = initword;
+ charword < lastword;
+ charword++) {
+
+ *charword = ntohl(*charword);
+ }
+ }
+#endif /* __alpha */
+
+ if (test_time) {
+ dlpi_co_stream_request->test_length = test_time;
+ }
+ else {
+ dlpi_co_stream_request->test_length = test_bytes;
+ }
+#ifdef DIRTY
+ dlpi_co_stream_request->dirty_count = rem_dirty_count;
+ dlpi_co_stream_request->clean_count = rem_clean_count;
+#endif /* DIRTY */
+
+
+ if (debug > 1) {
+ fprintf(where,
+ "netperf: send_dlpi_co_stream: requesting DLPI CO stream test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant */
+ /* parameters for this test type. We will put them back into */
+ /* the variables here so they can be displayed if desired. The */
+ /* remote will have calibrated CPU if necessary, and will have done */
+ /* all the needed set-up we will have calibrated the cpu locally */
+ /* before sending the request, and will grab the counter value right */
+ /* after the connect returns. The remote will grab the counter right */
+ /* after the accept call. This saves the hassle of extra messages */
+ /* being sent for the TCP tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote listen done.\n");
+ rrw_size = dlpi_co_stream_response->recv_win_size;
+ rsw_size = dlpi_co_stream_response->send_win_size;
+ remote_cpu_usage= dlpi_co_stream_response->measure_cpu;
+ remote_cpu_rate = dlpi_co_stream_response->cpu_rate;
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("netperf: remote error");
+ exit(1);
+ }
+
+ /* Connect up to the remote port on the data descriptor */
+ if(dl_connect(send_descriptor,
+ dlpi_co_stream_response->station_addr,
+ dlpi_co_stream_response->station_addr_len) != 0) {
+ fprintf(where,"recv_dlpi_co_stream: connect failure\n");
+ fflush(where);
+ exit(1);
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either the */
+ /* connect would have failed, or the previous response would have */
+ /* indicated a problem. I failed to see the value of the extra */
+ /* message after the accept on the remote. If it failed, we'll see it */
+ /* here. If it didn't, we might as well start pumping data. */
+
+ /* Set-up the test end conditions. For a stream test, they can be */
+ /* either time or byte-count based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ bytes_remaining = 0;
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ bytes_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return false. */
+ /* When the test is controlled by byte count, the time test will */
+ /* always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. */
+
+#ifdef DIRTY
+ /* initialize the random number generator for putting dirty stuff */
+ /* into the send buffer. raj */
+ srand((int) getpid());
+#endif /* DIRTY */
+
+ while ((!times_up) || (bytes_remaining > 0)) {
+
+#ifdef DIRTY
+ /* we want to dirty some number of consecutive integers in the buffer */
+ /* we are about to send. we may also want to bring some number of */
+ /* them cleanly into the cache. The clean ones will follow any dirty */
+ /* ones into the cache. */
+ message_int_ptr = (int *)message_ptr;
+ for (i = 0; i < loc_dirty_count; i++) {
+ *message_int_ptr = rand();
+ message_int_ptr++;
+ }
+ for (i = 0; i < loc_clean_count; i++) {
+ loc_dirty_count = *message_int_ptr;
+ message_int_ptr++;
+ }
+#endif /* DIRTY */
+
+ if((putmsg(send_descriptor,
+ 0,
+ &send_message,
+ 0)) != 0) {
+ if (errno == EINTR)
+ break;
+ perror("netperf: data send error");
+ exit(1);
+ }
+ send_ring = send_ring->next;
+ send_message.buf = send_ring->buffer_ptr;
+#ifdef WANT_INTERVALS
+ for (interval_count = 0;
+ interval_count < interval_wate;
+ interval_count++);
+#endif /* WANT_INTERVALS */
+
+ if (debug > 4) {
+ fprintf(where,"netperf: send_clpi_co_stream: putmsg called ");
+ fprintf(where,"len is %d\n",send_message.len);
+ fflush(where);
+ }
+
+ nummessages++;
+ if (bytes_remaining) {
+ bytes_remaining -= send_size;
+ }
+ }
+
+ /* The test is over. Flush the buffers to the remote end. We do a */
+ /* graceful release to insure that all data has been taken by the */
+ /* remote. this needs a little work - there is no three-way */
+ /* handshake with type two as there is with TCP, so there really */
+ /* should be a message exchange here. however, we will finesse it by */
+ /* saying that the tests shoudl run for a while. */
+
+ if (debug) {
+ fprintf(where,"sending test end signal \n");
+ fflush(where);
+ }
+
+ send_message.len = (send_size - 1);
+ if (send_message.len == 0) send_message.len = 2;
+
+ if((putmsg(send_descriptor,
+ 0,
+ &send_message,
+ 0)) != 0) {
+ perror("netperf: data send error");
+ exit(1);
+ }
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being measured? */
+ /* how long did we really run? */
+
+ /* Get the statistics from the remote end. The remote will have */
+ /* calculated service demand and all those interesting things. If it */
+ /* wasn't supposed to care, it will return obvious values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("netperf: remote error");
+
+ exit(1);
+ }
+
+ /* We now calculate what our thruput was for the test. In the future, */
+ /* we may want to include a calculation of the thruput measured by */
+ /* the remote, but it should be the case that for a TCP stream test, */
+ /* that the two numbers should be *very* close... We calculate */
+ /* bytes_sent regardless of the way the test length was controlled. */
+ /* If it was time, we needed to, and if it was by bytes, the user may */
+ /* have specified a number of bytes that wasn't a multiple of the */
+ /* send_size, so we really didn't send what he asked for ;-) */
+
+ bytes_sent = ((double) send_size * (double) nummessages) + (double) len;
+ thruput = calc_thruput(bytes_sent);
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+ if (local_cpu_rate == 0.0) {
+ fprintf(where,
+ "WARNING WARNING WARNING WARNING WARNING WARNING WARNING!\n");
+ fprintf(where,
+ "Local CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+ local_cpu_utilization = calc_cpu_util(0.0);
+ local_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = -1.0;
+ local_service_demand = -1.0;
+ }
+
+ if (remote_cpu_usage) {
+ if (remote_cpu_rate == 0.0) {
+ fprintf(where,
+ "DANGER DANGER DANGER DANGER DANGER DANGER DANGER!\n");
+ fprintf(where,
+ "Remote CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+ remote_cpu_utilization = dlpi_co_stream_result->cpu_util;
+ remote_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ remote_cpu_utilization,
+ dlpi_co_stream_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = -1.0;
+ remote_service_demand = -1.0;
+ }
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand);
+ }
+ break;
+ case 1:
+ case 2:
+ fprintf(where,
+ cpu_fmt_1, /* the format string */
+ rrw_size, /* remote recvbuf size */
+ lsw_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long was the test */
+ thruput, /* what was the xfer rate */
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand); /* remote service demand */
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ thruput);
+ break;
+ case 1:
+ case 2:
+ fprintf(where,
+ tput_fmt_1, /* the format string */
+ rrw_size, /* remote recvbuf size */
+ lsw_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long did it take */
+ thruput);/* how fast did it go */
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* TCP statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ fprintf(where,
+ ksink_fmt,
+ "Bytes",
+ "Bytes",
+ "Bytes",
+ local_send_align,
+ remote_recv_align,
+ local_send_offset,
+ remote_recv_offset,
+ bytes_sent,
+ bytes_sent / (double)nummessages,
+ nummessages,
+ bytes_sent / (double)dlpi_co_stream_result->recv_calls,
+ dlpi_co_stream_result->recv_calls);
+ }
+
+}
+
+
+/* This is the server-side routine for the tcp stream test. It is */
+/* implemented as one routine. I could break things-out somewhat, but */
+/* didn't feel it was necessary. */
+
+int
+ recv_dlpi_co_stream()
+{
+
+ int data_descriptor;
+ int flags = 0;
+ int measure_cpu;
+ int bytes_received;
+ int receive_calls;
+ float elapsed_time;
+
+ struct ring_elt *recv_ring;
+ char *message_ptr;
+ char *message;
+ int *message_int_ptr;
+ struct strbuf recv_message;
+ int dirty_count;
+ int clean_count;
+ int i;
+
+ struct dlpi_co_stream_request_struct *dlpi_co_stream_request;
+ struct dlpi_co_stream_response_struct *dlpi_co_stream_response;
+ struct dlpi_co_stream_results_struct *dlpi_co_stream_results;
+
+ dlpi_co_stream_request = (struct dlpi_co_stream_request_struct *)netperf_request.content.test_specific_data;
+ dlpi_co_stream_response = (struct dlpi_co_stream_response_struct *)netperf_response.content.test_specific_data;
+ dlpi_co_stream_results = (struct dlpi_co_stream_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_dlpi_co_stream: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ netperf_response.content.response_type = DLPI_CO_STREAM_RESPONSE;
+
+ /* We now alter the message_ptr variable to be at the desired */
+ /* alignment with the desired offset. */
+
+ if (debug > 1) {
+ fprintf(where,"recv_dlpi_co_stream: requested alignment of %d\n",
+ dlpi_co_stream_request->recv_alignment);
+ fflush(where);
+ }
+
+
+ /* Grab a descriptor to listen on, and then listen on it. */
+
+ if (debug > 1) {
+ fprintf(where,"recv_dlpi_co_stream: grabbing a descriptor...\n");
+ fflush(where);
+ }
+
+
+
+#ifdef __alpha
+
+ /* ok - even on a DEC box, strings are strings. I din't really want */
+ /* to ntohl the words of a string. since I don't want to teach the */
+ /* send_ and recv_ _request and _response routines about the types, */
+ /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
+ /* solution would be to use XDR, but I am still leary of being able */
+ /* to find XDR libs on all platforms I want running netperf. raj */
+ {
+ int *charword;
+ int *initword;
+ int *lastword;
+
+ initword = (int *) dlpi_co_stream_request->dlpi_device;
+ lastword = initword + ((dlpi_co_stream_request->dev_name_len + 3) / 4);
+
+ for (charword = initword;
+ charword < lastword;
+ charword++) {
+
+ *charword = htonl(*charword);
+ }
+ }
+#endif /* __alpha */
+
+ data_descriptor = dl_open(dlpi_co_stream_request->dlpi_device,
+ dlpi_co_stream_request->ppa);
+ if (data_descriptor < 0) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ /* Let's get an address assigned to this descriptor so we can tell the */
+ /* initiator how to reach the data descriptor. There may be a desire to */
+ /* nail this descriptor to a specific address in a multi-homed, */
+ /* multi-connection situation, but for now, we'll ignore the issue */
+ /* and concentrate on single connection testing. */
+
+ /* bind the sap and retrieve the dlsap assigned by the system */
+ dlpi_co_stream_response->station_addr_len = 14; /* arbitrary */
+ if (dl_bind(data_descriptor,
+ dlpi_co_stream_request->sap,
+ DL_CODLS,
+ (char *)dlpi_co_stream_response->station_addr,
+ &dlpi_co_stream_response->station_addr_len) != 0) {
+ fprintf(where,"recv_dlpi_co_stream: bind failure\n");
+ fflush(where);
+ exit(1);
+ }
+
+ /* The initiator may have wished-us to modify the socket buffer */
+ /* sizes. We should give it a shot. If he didn't ask us to change the */
+ /* sizes, we should let him know what sizes were in use at this end. */
+ /* If none of this code is compiled-in, then we will tell the */
+ /* initiator that we were unable to play with the socket buffer by */
+ /* setting the size in the response to -1. */
+
+#ifdef DL_HP_SET_LOCAL_WIN_REQ
+
+ if (dlpi_co_stream_request->recv_win_size) {
+ }
+ /* Now, we will find-out what the size actually became, and report */
+ /* that back to the user. If the call fails, we will just report a -1 */
+ /* back to the initiator for the recv buffer size. */
+
+#else /* the system won't let us play with the buffers */
+
+ dlpi_co_stream_response->recv_win_size = -1;
+
+#endif /* DL_HP_SET_LOCAL_WIN_REQ */
+
+ /* what sort of sizes did we end-up with? */
+ /* this bit of code whould default to the Interface MTU */
+ if (dlpi_co_stream_request->receive_size == 0) {
+ recv_size = 1024;
+ }
+ else {
+ recv_size = dlpi_co_stream_request->receive_size;
+ }
+
+ /* tell the other fellow what our receive size became */
+ dlpi_co_stream_response->receive_size = recv_size;
+
+ /* just a little prep work for when we may have to behave like the */
+ /* sending side... */
+ message = (char *)malloc(recv_size * 2);
+ if (message == NULL) {
+ printf("malloc(%d) failed!\n", recv_size * 2);
+ exit(1);
+ }
+
+ message_ptr = ALIGN_BUFFER(message, dlpi_co_stream_request->recv_alignment, dlpi_co_stream_request->recv_offset);
+ recv_message.maxlen = recv_size;
+ recv_message.len = 0;
+ recv_message.buf = message_ptr;
+
+ if (debug > 1) {
+ fprintf(where,
+ "recv_dlpi_co_stream: receive alignment and offset set...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a -1 to */
+ /* the initiator. */
+
+ dlpi_co_stream_response->cpu_rate = 0.0; /* assume no cpu */
+ if (dlpi_co_stream_request->measure_cpu) {
+ dlpi_co_stream_response->measure_cpu = 1;
+ dlpi_co_stream_response->cpu_rate =
+ calibrate_local_cpu(dlpi_co_stream_request->cpu_rate);
+ }
+
+ send_response();
+
+ /* accept a connection on this file descriptor. at some point, */
+ /* dl_accept will "do the right thing" with the last two parms, but */
+ /* for now it ignores them, so we will pass zeros. */
+
+ if(dl_accept(data_descriptor, 0, 0) != 0) {
+ fprintf(where,
+ "recv_dlpi_co_stream: error in accept, errno %d\n",
+ errno);
+ fflush(where);
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"netserver:recv_dlpi_co_stream: connection accepted\n");
+ fflush(where);
+ }
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(dlpi_co_stream_request->measure_cpu);
+
+#ifdef DIRTY
+ /* we want to dirty some number of consecutive integers in the buffer */
+ /* we are about to recv. we may also want to bring some number of */
+ /* them cleanly into the cache. The clean ones will follow any dirty */
+ /* ones into the cache. */
+
+ dirty_count = dlpi_co_stream_request->dirty_count;
+ clean_count = dlpi_co_stream_request->clean_count;
+ message_int_ptr = (int *)message_ptr;
+ for (i = 0; i < dirty_count; i++) {
+ *message_int_ptr = rand();
+ message_int_ptr++;
+ }
+ for (i = 0; i < clean_count; i++) {
+ dirty_count = *message_int_ptr;
+ message_int_ptr++;
+ }
+#endif /* DIRTY */
+
+ recv_message.len = recv_size;
+ while (recv_message.len == recv_size) {
+ if (getmsg(data_descriptor,
+ 0,
+ &recv_message,
+ &flags) != 0) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+ bytes_received += recv_message.len;
+ receive_calls++;
+
+ if (debug) {
+ fprintf(where,
+ "netserver:recv_dlpi_co_stream: getmsg accepted %d bytes\n",
+ recv_message.len);
+ fflush(where);
+ }
+
+
+#ifdef DIRTY
+ message_int_ptr = (int *)message_ptr;
+ for (i = 0; i < dirty_count; i++) {
+ *message_int_ptr = rand();
+ message_int_ptr++;
+ }
+ for (i = 0; i < clean_count; i++) {
+ dirty_count = *message_int_ptr;
+ message_int_ptr++;
+ }
+#endif /* DIRTY */
+
+ }
+
+ /* The loop now exits due to zero bytes received. */
+ /* should perform a disconnect to signal the sender that */
+ /* we have received all the data sent. */
+
+ if (close(data_descriptor) == -1) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ cpu_stop(dlpi_co_stream_request->measure_cpu,&elapsed_time);
+
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_dlpi_co_stream: got %d bytes\n",
+ bytes_received);
+ fprintf(where,
+ "recv_dlpi_co_stream: got %d recvs\n",
+ receive_calls);
+ fflush(where);
+ }
+
+ dlpi_co_stream_results->bytes_received = bytes_received;
+ dlpi_co_stream_results->elapsed_time = elapsed_time;
+ dlpi_co_stream_results->recv_calls = receive_calls;
+
+ if (dlpi_co_stream_request->measure_cpu) {
+ dlpi_co_stream_results->cpu_util = calc_cpu_util(0.0);
+ };
+
+ if (debug > 1) {
+ fprintf(where,
+ "recv_dlpi_co_stream: test complete, sending results.\n");
+ fflush(where);
+ }
+
+ send_response();
+}
+
+/*********************************/
+
+int send_dlpi_co_rr(char remote_host[])
+{
+
+ char *tput_title = "\
+ Local /Remote\n\
+ Window Size Request Resp. Elapsed Trans.\n\
+ Send Recv Size Size Time Rate \n\
+ frames frames bytes bytes secs. per sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1_line_1 = "\
+ %-6d %-6d %-6d %-6d %-6.2f %7.2f \n";
+ char *tput_fmt_1_line_2 = "\
+ %-6d %-6d\n";
+
+ char *cpu_title = "\
+ Local /Remote\n\
+ Window Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem\n\
+ Send Recv Size Size Time Rate local remote local remote\n\
+ frames frames bytes bytes secs. per sec %% %% us/Tr us/Tr\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f\n";
+
+ char *cpu_fmt_1_line_1 = "\
+ %-6d %-6d %-6d %-6d %-6.2f %-6.2f %-6.2f %-6.2f %-6.3f %-6.3f\n";
+
+ char *cpu_fmt_1_line_2 = "\
+ %-6d %-6d\n";
+
+ char *ksink_fmt = "\
+ Alignment Offset\n\
+ Local Remote Local Remote\n\
+ Send Recv Send Recv\n\
+ %5d %5d %5d %5d\n";
+
+
+ int timed_out = 0;
+ float elapsed_time;
+ int dlsap_len;
+ char dlsap[BUFSIZ];
+
+ int flags = 0;
+ char *send_message_ptr;
+ char *recv_message_ptr;
+ char *temp_message_ptr;
+ struct strbuf send_message;
+ struct strbuf recv_message;
+
+ int nummessages;
+ int send_descriptor;
+ int trans_remaining;
+ double bytes_xferd;
+
+ int rsp_bytes_left;
+
+ /* we assume that station adresses fit within two ints */
+ unsigned int remote_address[1];
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+ double thruput;
+
+ struct dlpi_co_rr_request_struct *dlpi_co_rr_request;
+ struct dlpi_co_rr_response_struct *dlpi_co_rr_response;
+ struct dlpi_co_rr_results_struct *dlpi_co_rr_result;
+
+ dlpi_co_rr_request =
+ (struct dlpi_co_rr_request_struct *)netperf_request.content.test_specific_data;
+ dlpi_co_rr_response =
+ (struct dlpi_co_rr_response_struct *)netperf_response.content.test_specific_data;
+ dlpi_co_rr_result =
+ (struct dlpi_co_rr_results_struct *)netperf_response.content.test_specific_data;
+
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ if ( print_headers ) {
+ fprintf(where,"DLPI CO REQUEST/RESPONSE TEST\n");
+ if (local_cpu_usage || remote_cpu_usage)
+ fprintf(where,cpu_title,format_units());
+ else
+ fprintf(where,tput_title,format_units());
+ }
+
+ /* initialize a few counters */
+
+ nummessages = 0;
+ bytes_xferd = 0.0;
+ times_up = 0;
+
+ /* set-up the data buffers with the requested alignment and offset */
+ temp_message_ptr = (char *)malloc(req_size+MAXALIGNMENT+MAXOFFSET);
+ if (temp_message_ptr == NULL) {
+ printf("malloc(%d) failed!\n", req_size+MAXALIGNMENT+MAXOFFSET);
+ exit(1);
+ }
+ send_message_ptr = (char *)(( (long) temp_message_ptr +
+ (long) local_send_align - 1) &
+ ~((long) local_send_align - 1));
+ send_message_ptr = send_message_ptr + local_send_offset;
+ send_message.maxlen = req_size+MAXALIGNMENT+MAXOFFSET;
+ send_message.len = req_size;
+ send_message.buf = send_message_ptr;
+
+ temp_message_ptr = (char *)malloc(rsp_size+MAXALIGNMENT+MAXOFFSET);
+ if (temp_message_ptr == NULL) {
+ printf("malloc(%d) failed!\n", rsp_size+MAXALIGNMENT+MAXOFFSET);
+ exit(1);
+ }
+ recv_message_ptr = (char *)(( (long) temp_message_ptr +
+ (long) local_recv_align - 1) &
+ ~((long) local_recv_align - 1));
+ recv_message_ptr = recv_message_ptr + local_recv_offset;
+ recv_message.maxlen = rsp_size+MAXALIGNMENT+MAXOFFSET;
+ recv_message.len = 0;
+ recv_message.buf = send_message_ptr;
+
+ /*set up the data socket */
+
+ send_descriptor = dl_open(loc_dlpi_device,loc_ppa);
+ if (send_descriptor < 0){
+ perror("netperf: send_dlpi_co_rr: tcp stream data descriptor");
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"send_dlpi_co_rr: send_descriptor obtained...\n");
+ }
+
+ /* bind the puppy and get the assigned dlsap */
+
+ dlsap_len = BUFSIZ;
+ if (dl_bind(send_descriptor,
+ dlpi_sap, DL_CODLS, dlsap, &dlsap_len) != 0) {
+ fprintf(where,"send_dlpi_co_rr: bind failure\n");
+ fflush(where);
+ exit(1);
+ }
+
+ /* Modify the local socket size. The reason we alter the send buffer */
+ /* size here rather than when the connection is made is to take care */
+ /* of decreases in buffer size. Decreasing the window size after */
+ /* connection establishment is a TCP no-no. Also, by setting the */
+ /* buffer (window) size before the connection is established, we can */
+ /* control the TCP MSS (segment size). The MSS is never more that 1/2 */
+ /* the minimum receive buffer size at each half of the connection. */
+ /* This is why we are altering the receive buffer size on the sending */
+ /* size of a unidirectional transfer. If the user has not requested */
+ /* that the socket buffers be altered, we will try to find-out what */
+ /* their values are. If we cannot touch the socket buffer in any way, */
+ /* we will set the values to -1 to indicate that. */
+
+#ifdef DL_HP_SET_LOCAL_WIN_REQ
+ if (lsw_size > 0) {
+ if (debug > 1) {
+ fprintf(where,"netperf: send_dlpi_co_rr: socket send size altered from system default...\n");
+ fprintf(where," send: %d\n",lsw_size);
+ }
+ }
+ if (lrw_size > 0) {
+ if (debug > 1) {
+ fprintf(where,"netperf: send_dlpi_co_rr: socket recv size altered from system default...\n");
+ fprintf(where," recv: %d\n",lrw_size);
+ }
+ }
+
+
+ /* Now, we will find-out what the size actually became, and report */
+ /* that back to the user. If the call fails, we will just report a -1 */
+ /* back to the initiator for the recv buffer size. */
+
+
+ if (debug) {
+ fprintf(where,"netperf: send_dlpi_co_rr: socket sizes determined...\n");
+ fprintf(where," send: %d recv: %d\n",lsw_size,lrw_size);
+ }
+
+#else /* DL_HP_SET_LOCAL_WIN_REQ */
+
+ lsw_size = -1;
+ lrw_size = -1;
+
+#endif /* DL_HP_SET_LOCAL_WIN_REQ */
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back.*/
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ /* Tell the remote end to do a listen. The server alters the socket */
+ /* paramters on the other side at this point, hence the reason for */
+ /* all the values being passed in the setup message. If the user did */
+ /* not specify any of the parameters, they will be passed as 0, which */
+ /* will indicate to the remote that no changes beyond the system's */
+ /* default should be used. Alignment is the exception, it will */
+ /* default to 8, which will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_DLPI_CO_RR;
+ dlpi_co_rr_request->recv_win_size = rrw_size;
+ dlpi_co_rr_request->send_win_size = rsw_size;
+ dlpi_co_rr_request->recv_alignment = remote_recv_align;
+ dlpi_co_rr_request->recv_offset = remote_recv_offset;
+ dlpi_co_rr_request->send_alignment = remote_send_align;
+ dlpi_co_rr_request->send_offset = remote_send_offset;
+ dlpi_co_rr_request->request_size = req_size;
+ dlpi_co_rr_request->response_size = rsp_size;
+ dlpi_co_rr_request->measure_cpu = remote_cpu_usage;
+ dlpi_co_rr_request->cpu_rate = remote_cpu_rate;
+ dlpi_co_rr_request->ppa = rem_ppa;
+ dlpi_co_rr_request->sap = dlpi_sap;
+ dlpi_co_rr_request->dev_name_len = strlen(rem_dlpi_device);
+ strcpy(dlpi_co_rr_request->dlpi_device,
+ rem_dlpi_device);
+#ifdef __alpha
+
+ /* ok - even on a DEC box, strings are strings. I din't really want */
+ /* to ntohl the words of a string. since I don't want to teach the */
+ /* send_ and recv_ _request and _response routines about the types, */
+ /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
+ /* solution would be to use XDR, but I am still leary of being able */
+ /* to find XDR libs on all platforms I want running netperf. raj */
+ {
+ int *charword;
+ int *initword;
+ int *lastword;
+
+ initword = (int *) dlpi_co_rr_request->dlpi_device;
+ lastword = initword + ((strlen(rem_dlpi_device) + 3) / 4);
+
+ for (charword = initword;
+ charword < lastword;
+ charword++) {
+
+ *charword = ntohl(*charword);
+ }
+ }
+#endif /* __alpha */
+
+ if (test_time) {
+ dlpi_co_rr_request->test_length = test_time;
+ }
+ else {
+ dlpi_co_rr_request->test_length = test_trans * -1;
+ }
+
+ if (debug > 1) {
+ fprintf(where,"netperf: send_dlpi_co_rr: requesting TCP stream test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant */
+ /* socket parameters for this test type. We will put them back into */
+ /* the variables here so they can be displayed if desired. The */
+ /* remote will have calibrated CPU if necessary, and will have done */
+ /* all the needed set-up we will have calibrated the cpu locally */
+ /* before sending the request, and will grab the counter value right */
+ /* after the connect returns. The remote will grab the counter right */
+ /* after the accept call. This saves the hassle of extra messages */
+ /* being sent for the TCP tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote listen done.\n");
+ rrw_size = dlpi_co_rr_response->recv_win_size;
+ rsw_size = dlpi_co_rr_response->send_win_size;
+ remote_cpu_usage= dlpi_co_rr_response->measure_cpu;
+ remote_cpu_rate = dlpi_co_rr_response->cpu_rate;
+
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("netperf: remote error");
+
+ exit(1);
+ }
+
+ /*Connect up to the remote port on the data descriptor */
+
+ if(dl_connect(send_descriptor,
+ dlpi_co_rr_response->station_addr,
+ dlpi_co_rr_response->station_addr_len) != 0) {
+ fprintf(where,"send_dlpi_co_rr: connect failure\n");
+ fflush(where);
+ exit(1);
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either the */
+ /* connect would have failed, or the previous response would have */
+ /* indicated a problem. I failed to see the value of the extra */
+ /* message after the accept on the remote. If it failed, we'll see it */
+ /* here. If it didn't, we might as well start pumping data. */
+
+ /* Set-up the test end conditions. For a request/response test, they */
+ /* can be either time or transaction based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ trans_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return false. */
+ /* When the test is controlled by byte count, the time test will */
+ /* always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. I think I */
+ /* just arbitrarily decrement trans_remaining for the timed test, but */
+ /* will not do that just yet... One other question is whether or not */
+ /* the send buffer and the receive buffer should be the same buffer. */
+
+ while ((!times_up) || (trans_remaining > 0)) {
+ /* send the request */
+ if((putmsg(send_descriptor,
+ 0,
+ &send_message,
+ 0)) != 0) {
+ if (errno == EINTR) {
+ /* we hit the end of a */
+ /* timed test. */
+ timed_out = 1;
+ break;
+ }
+ perror("send_dlpi_co_rr: putmsg error");
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"recv_message.len %d\n",recv_message.len);
+ fprintf(where,"send_message.len %d\n",send_message.len);
+ fflush(where);
+ }
+
+ /* receive the response */
+ /* this needs some work with streams buffers if we are going to */
+ /* support requests and responses larger than the MTU of the */
+ /* network, but this can wait until later */
+ rsp_bytes_left = rsp_size;
+ recv_message.len = rsp_size;
+ while(rsp_bytes_left > 0) {
+ if((getmsg(send_descriptor,
+ 0,
+ &recv_message,
+ &flags)) < 0) {
+ if (errno == EINTR) {
+ /* We hit the end of a timed test. */
+ timed_out = 1;
+ break;
+ }
+ perror("send_dlpi_co_rr: data recv error");
+ exit(1);
+ }
+ rsp_bytes_left -= recv_message.len;
+ }
+
+ if (timed_out) {
+ /* we may have been in a nested while loop - we need */
+ /* another call to break. */
+ break;
+ }
+
+ nummessages++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug > 3) {
+ fprintf(where,
+ "Transaction %d completed\n",
+ nummessages);
+ fflush(where);
+ }
+ }
+
+ /* At this point we used to call shutdown onthe data socket to be */
+ /* sure all the data was delivered, but this was not germane in a */
+ /* request/response test, and it was causing the tests to "hang" when */
+ /* they were being controlled by time. So, I have replaced this */
+ /* shutdown call with a call to close that can be found later in the */
+ /* procedure. */
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being measured? */
+ /* how long did we really run? */
+
+ /* Get the statistics from the remote end. The remote will have */
+ /* calculated service demand and all those interesting things. If it */
+ /* wasn't supposed to care, it will return obvious values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("netperf: remote error");
+
+ exit(1);
+ }
+
+ /* We now calculate what our thruput was for the test. In the future, */
+ /* we may want to include a calculation of the thruput measured by */
+ /* the remote, but it should be the case that for a TCP stream test, */
+ /* that the two numbers should be *very* close... We calculate */
+ /* bytes_sent regardless of the way the test length was controlled. */
+ /* If it was time, we needed to, and if it was by bytes, the user may */
+ /* have specified a number of bytes that wasn't a multiple of the */
+ /* send_size, so we really didn't send what he asked for ;-) We use */
+ /* Kbytes/s as the units of thruput for a TCP stream test, where K = */
+ /* 1024. A future enhancement *might* be to choose from a couple of */
+ /* unit selections. */
+
+ bytes_xferd = (req_size * nummessages) + (rsp_size * nummessages);
+ thruput = calc_thruput(bytes_xferd);
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+ if (local_cpu_rate == 0.0) {
+ fprintf(where,"WARNING WARNING WARNING WARNING WARNING WARNING WARNING!\n");
+ fprintf(where,"Local CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+ local_cpu_utilization = calc_cpu_util(0.0);
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ local_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = -1.0;
+ local_service_demand = -1.0;
+ }
+
+ if (remote_cpu_usage) {
+ if (remote_cpu_rate == 0.0) {
+ fprintf(where,"DANGER DANGER DANGER DANGER DANGER DANGER DANGER!\n");
+ fprintf(where,"Remote CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+ remote_cpu_utilization = dlpi_co_rr_result->cpu_util;
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ remote_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ remote_cpu_utilization,
+ dlpi_co_rr_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = -1.0;
+ remote_service_demand = -1.0;
+ }
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand);
+ }
+ break;
+ case 1:
+ fprintf(where,
+ cpu_fmt_1_line_1, /* the format string */
+ lsw_size, /* local sendbuf size */
+ lrw_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* guess */
+ elapsed_time, /* how long was the test */
+ nummessages/elapsed_time,
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand); /* remote service demand */
+ fprintf(where,
+ cpu_fmt_1_line_2,
+ rsw_size,
+ rrw_size);
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ nummessages/elapsed_time);
+ break;
+ case 1:
+ fprintf(where,
+ tput_fmt_1_line_1, /* the format string */
+ lsw_size,
+ lrw_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* how large were the responses */
+ elapsed_time, /* how long did it take */
+ nummessages/elapsed_time);
+ fprintf(where,
+ tput_fmt_1_line_2,
+ rsw_size, /* remote recvbuf size */
+ rrw_size);
+
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* TCP statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ fprintf(where,
+ ksink_fmt);
+ }
+ /* The test is over. Kill the data descriptor */
+
+ if (close(send_descriptor) == -1) {
+ perror("send_dlpi_co_rr: cannot shutdown tcp stream descriptor");
+ }
+
+}
+
+void
+ send_dlpi_cl_stream(char remote_host[])
+{
+ /************************************************************************/
+ /* */
+ /* UDP Unidirectional Send Test */
+ /* */
+ /************************************************************************/
+ char *tput_title =
+ "Window Message Elapsed Messages \n\
+Size Size Time Okay Errors Throughput\n\
+frames bytes secs # # %s/sec\n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1 =
+ "%5d %5d %-7.2f %7d %6d %7.2f\n\
+%5d %-7.2f %7d %7.2f\n\n";
+
+
+ char *cpu_title =
+ "Window Message Elapsed Messages CPU Service\n\
+Size Size Time Okay Errors Throughput Util Demand\n\
+frames bytes secs # # %s/sec %% us/KB\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.2f\n";
+
+ char *cpu_fmt_1 =
+ "%5d %5d %-7.2f %7d %6d %7.1f %-6.2f %-6.3f\n\
+%5d %-7.2f %7d %7.1f %-6.2f %-6.3f\n\n";
+
+ int messages_recvd;
+ float elapsed_time,
+ local_cpu_utilization,
+ remote_cpu_utilization;
+
+ float local_service_demand, remote_service_demand;
+ double local_thruput, remote_thruput;
+ double bytes_sent;
+ double bytes_recvd;
+
+
+ int *message_int_ptr;
+ char *message_ptr;
+ char *message;
+ char sctl_data[BUFSIZ];
+ struct strbuf send_message;
+ struct strbuf sctl_message;
+ dl_unitdata_req_t *data_req = (dl_unitdata_req_t *)sctl_data;
+
+ char dlsap[BUFSIZ];
+ int dlsap_len;
+ int message_offset;
+ int message_max_offset;
+ int failed_sends;
+ int failed_cows;
+ int messages_sent;
+ int data_descriptor;
+
+
+#ifdef WANT_INTERVALS
+ int interval_count;
+#endif /* WANT_INTERVALS */
+#ifdef DIRTY
+ int i;
+#endif /* DIRTY */
+
+ struct dlpi_cl_stream_request_struct *dlpi_cl_stream_request;
+ struct dlpi_cl_stream_response_struct *dlpi_cl_stream_response;
+ struct dlpi_cl_stream_results_struct *dlpi_cl_stream_results;
+
+ dlpi_cl_stream_request = (struct dlpi_cl_stream_request_struct *)netperf_request.content.test_specific_data;
+ dlpi_cl_stream_response = (struct dlpi_cl_stream_response_struct *)netperf_response.content.test_specific_data;
+ dlpi_cl_stream_results = (struct dlpi_cl_stream_results_struct *)netperf_response.content.test_specific_data;
+
+ if ( print_headers ) {
+ printf("DLPI CL UNIDIRECTIONAL SEND TEST\n");
+ if (local_cpu_usage || remote_cpu_usage)
+ printf(cpu_title,format_units());
+ else
+ printf(tput_title,format_units());
+ }
+
+ failed_sends = 0;
+ messages_sent = 0;
+ times_up = 0;
+
+ /*set up the data descriptor */
+
+ data_descriptor = dl_open(loc_dlpi_device,loc_ppa);
+ if (data_descriptor < 0){
+ perror("send_dlpi_cl_stream: data descriptor");
+ exit(1);
+ }
+
+ /* bind the puppy and get the assigned dlsap */
+ dlsap_len = BUFSIZ;
+ if (dl_bind(data_descriptor,
+ dlpi_sap, DL_CLDLS, dlsap, &dlsap_len) != 0) {
+ fprintf(where,"send_dlpi_cl_stream: bind failure\n");
+ fflush(where);
+ exit(1);
+ }
+
+ /* Modify the local socket size (SNDBUF size) */
+
+#ifdef DL_HP_SET_LOCAL_WIN_REQ
+ if (lsw_size > 0) {
+ if (debug > 1) {
+ fprintf(where,"netperf: send_dlpi_cl_stream: descriptor send size altered from system default...\n");
+ fprintf(where," send: %d\n",lsw_size);
+ }
+ }
+ if (lrw_size > 0) {
+ if (debug > 1) {
+ fprintf(where,"netperf: send_dlpi_cl_stream: descriptor recv size altered from system default...\n");
+ fprintf(where," recv: %d\n",lrw_size);
+ }
+ }
+
+
+ /* Now, we will find-out what the size actually became, and report */
+ /* that back to the user. If the call fails, we will just report a -1 */
+ /* back to the initiator for the recv buffer size. */
+
+#else /* DL_HP_SET_LOCAL_WIN_REQ */
+
+ lsw_size = -1;
+ lrw_size = -1;
+
+#endif /* DL_HP_SET_LOCAL_WIN_REQ */
+
+ /* now, we want to see if we need to set the send_size */
+ if (send_size == 0) {
+ send_size = 1024;
+ }
+
+
+ /* set-up the data buffer with the requested alignment and offset, */
+ /* most of the numbers here are just a hack to pick something nice */
+ /* and big in an attempt to never try to send a buffer a second time */
+ /* before it leaves the node...unless the user set the width */
+ /* explicitly. */
+ if (send_width == 0) send_width = 32;
+ message = (char *)malloc(send_size * (send_width + 1) + local_send_align + local_send_offset);
+ if (message == NULL) {
+ printf("malloc(%d) failed!\n", send_size * (send_width + 1) + local_send_align + local_send_offset);
+ exit(1);
+ }
+ message_ptr = (char *)(( (long) message +
+ (long) local_send_align - 1) &
+ ~((long) local_send_align - 1));
+ message_ptr = message_ptr + local_send_offset;
+ message = message_ptr;
+ send_message.maxlen = send_size;
+ send_message.len = send_size;
+ send_message.buf = message;
+
+ sctl_message.maxlen = BUFSIZ;
+ sctl_message.len = 0;
+ sctl_message.buf = sctl_data;
+
+ /* if the user supplied a cpu rate, this call will complete rather */
+ /* quickly, otherwise, the cpu rate will be retured to us for */
+ /* possible display. The Library will keep it's own copy of this data */
+ /* for use elsewhere. We will only display it. (Does that make it */
+ /* "opaque" to us?) */
+
+ if (local_cpu_usage)
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+
+ /* Tell the remote end to set up the data connection. The server */
+ /* sends back the port number and alters the socket parameters there. */
+ /* Of course this is a datagram service so no connection is actually */
+ /* set up, the server just sets up the socket and binds it. */
+
+ netperf_request.content.request_type = DO_DLPI_CL_STREAM;
+ dlpi_cl_stream_request->recv_win_size = rrw_size;
+ dlpi_cl_stream_request->message_size = send_size;
+ dlpi_cl_stream_request->recv_alignment = remote_recv_align;
+ dlpi_cl_stream_request->recv_offset = remote_recv_offset;
+ dlpi_cl_stream_request->measure_cpu = remote_cpu_usage;
+ dlpi_cl_stream_request->cpu_rate = remote_cpu_rate;
+ dlpi_cl_stream_request->ppa = rem_ppa;
+ dlpi_cl_stream_request->sap = dlpi_sap;
+ dlpi_cl_stream_request->dev_name_len = strlen(rem_dlpi_device);
+ strcpy(dlpi_cl_stream_request->dlpi_device,
+ rem_dlpi_device);
+
+#ifdef __alpha
+
+ /* ok - even on a DEC box, strings are strings. I din't really want */
+ /* to ntohl the words of a string. since I don't want to teach the */
+ /* send_ and recv_ _request and _response routines about the types, */
+ /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
+ /* solution would be to use XDR, but I am still leary of being able */
+ /* to find XDR libs on all platforms I want running netperf. raj */
+ {
+ int *charword;
+ int *initword;
+ int *lastword;
+
+ initword = (int *) dlpi_cl_stream_request->dlpi_device;
+ lastword = initword + ((strlen(rem_dlpi_device) + 3) / 4);
+
+ for (charword = initword;
+ charword < lastword;
+ charword++) {
+
+ *charword = ntohl(*charword);
+ }
+ }
+#endif /* __alpha */
+
+ if (test_time) {
+ dlpi_cl_stream_request->test_length = test_time;
+ }
+ else {
+ dlpi_cl_stream_request->test_length = test_bytes * -1;
+ }
+
+
+ send_request();
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"send_dlpi_cl_stream: remote data connection done.\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("send_dlpi_cl_stream: error on remote");
+ exit(1);
+ }
+
+ /* place some of the remote's addressing information into the send */
+ /* structure so our sends can be sent to the correct place. Also get */
+ /* some of the returned socket buffer information for user display. */
+
+ /* set-up the destination addressing control info */
+ data_req->dl_primitive = DL_UNITDATA_REQ;
+ bcopy((char *)(dlpi_cl_stream_response->station_addr),
+ ((char *)data_req + sizeof(dl_unitdata_req_t)),
+ dlpi_cl_stream_response->station_addr_len);
+ data_req->dl_dest_addr_offset = sizeof(dl_unitdata_req_t);
+ data_req->dl_dest_addr_length = dlpi_cl_stream_response->station_addr_len;
+ /* there is a dl_priority structure too, but I am ignoring it for */
+ /* the time being. */
+ /* however... it is best to put some value in there lest some code
+ get grumpy about it - fix from Nicolas Thomas */
+ data_req->dl_priority.dl_min = DL_QOS_DONT_CARE;
+ data_req->dl_priority.dl_max = DL_QOS_DONT_CARE;
+
+ sctl_message.len = sizeof(dl_unitdata_req_t) +
+ data_req->dl_dest_addr_length;
+
+ rrw_size = dlpi_cl_stream_response->recv_win_size;
+ rsw_size = dlpi_cl_stream_response->send_win_size;
+ remote_cpu_rate = dlpi_cl_stream_response->cpu_rate;
+
+
+ /* set up the timer to call us after test_time */
+ start_timer(test_time);
+
+ /* Get the start count for the idle counter and the start time */
+
+ cpu_start(local_cpu_usage);
+
+#ifdef WANT_INTERVALS
+ interval_count = interval_burst;
+#endif /* WANT_INTERVALS */
+
+ /* Send datagrams like there was no tomorrow */
+ while (!times_up) {
+#ifdef DIRTY
+ /* we want to dirty some number of consecutive integers in the buffer */
+ /* we are about to send. we may also want to bring some number of */
+ /* them cleanly into the cache. The clean ones will follow any dirty */
+ /* ones into the cache. */
+ message_int_ptr = (int *)message_ptr;
+ for (i = 0; i < loc_dirty_count; i++) {
+ *message_int_ptr = 4;
+ message_int_ptr++;
+ }
+ for (i = 0; i < loc_clean_count; i++) {
+ loc_dirty_count = *message_int_ptr;
+ message_int_ptr++;
+ }
+#endif /* DIRTY */
+ if (putmsg(data_descriptor,
+ &sctl_message,
+ &send_message,
+ 0) != 0) {
+ if (errno == EINTR) {
+ break;
+ }
+ if (errno == ENOBUFS) {
+ /* we might not ever hit this with STREAMS, it would probably */
+ /* be better to do a getinfo request at the end of the test to */
+ /* get all sorts of gory statistics. in the meantime, we will */
+ /* keep this code in place. */
+ failed_sends++;
+ continue;
+ }
+ perror("send_dlpi_cl_stream: data send error");
+ if (debug) {
+ fprintf(where,"messages_sent %u\n",messages_sent);
+ fflush(where);
+ }
+ exit(1);
+ }
+ messages_sent++;
+
+ /* now we want to move our pointer to the next position in the */
+ /* data buffer...since there was a successful send */
+
+
+#ifdef WANT_INTERVALS
+ /* in this case, the interval count is the count-down couter */
+ /* to decide to sleep for a little bit */
+ if ((interval_burst) && (--interval_count == 0)) {
+ /* call the sleep routine for some milliseconds, if our */
+ /* timer popped while we were in there, we want to */
+ /* break out of the loop. */
+ if (msec_sleep(interval_wate)) {
+ break;
+ }
+ interval_count = interval_burst;
+ }
+
+#endif /* WANT_INTERVALS */
+
+ }
+
+ /* This is a timed test, so the remote will be returning to us after */
+ /* a time. We should not need to send any "strange" messages to tell */
+ /* the remote that the test is completed, unless we decide to add a */
+ /* number of messages to the test. */
+
+ /* the test is over, so get stats and stuff */
+ cpu_stop(local_cpu_usage,
+ &elapsed_time);
+
+ /* Get the statistics from the remote end */
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"send_dlpi_cl_stream: remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("send_dlpi_cl_stream: error on remote");
+ exit(1);
+ }
+
+ bytes_sent = send_size * messages_sent;
+ local_thruput = calc_thruput(bytes_sent);
+
+ messages_recvd = dlpi_cl_stream_results->messages_recvd;
+ bytes_recvd = send_size * messages_recvd;
+
+ /* we asume that the remote ran for as long as we did */
+
+ remote_thruput = calc_thruput(bytes_recvd);
+
+ /* print the results for this descriptor and message size */
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) We pass zeros for the local */
+ /* cpu utilization and elapsed time to tell the routine to use */
+ /* the libraries own values for those. */
+ if (local_cpu_usage) {
+ if (local_cpu_rate == 0.0) {
+ fprintf(where,"WARNING WARNING WARNING WARNING WARNING WARNING WARNING!\n");
+ fprintf(where,"Local CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+
+ local_cpu_utilization = calc_cpu_util(0.0);
+ local_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = -1.0;
+ local_service_demand = -1.0;
+ }
+
+ /* The local calculations could use variables being kept by */
+ /* the local netlib routines. The remote calcuations need to */
+ /* have a few things passed to them. */
+ if (remote_cpu_usage) {
+ if (remote_cpu_rate == 0.0) {
+ fprintf(where,"DANGER DANGER DANGER DANGER DANGER DANGER DANGER!\n");
+ fprintf(where,"REMOTE CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+
+ remote_cpu_utilization = dlpi_cl_stream_results->cpu_util;
+ remote_service_demand = calc_service_demand(bytes_recvd,
+ 0.0,
+ remote_cpu_utilization,
+ dlpi_cl_stream_results->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = -1.0;
+ remote_service_demand = -1.0;
+ }
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand);
+ }
+ break;
+ case 1:
+ fprintf(where,
+ cpu_fmt_1, /* the format string */
+ lsw_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long was the test */
+ messages_sent,
+ failed_sends,
+ local_thruput, /* what was the xfer rate */
+ local_cpu_utilization, /* local cpu */
+ local_service_demand, /* local service demand */
+ rrw_size,
+ elapsed_time,
+ messages_recvd,
+ remote_thruput,
+ remote_cpu_utilization, /* remote cpu */
+ remote_service_demand); /* remote service demand */
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ local_thruput);
+ break;
+ case 1:
+ fprintf(where,
+ tput_fmt_1, /* the format string */
+ lsw_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long did it take */
+ messages_sent,
+ failed_sends,
+ local_thruput,
+ rrw_size, /* remote recvbuf size */
+ elapsed_time,
+ messages_recvd,
+ remote_thruput
+ );
+ break;
+ }
+ }
+}
+
+int
+ recv_dlpi_cl_stream()
+{
+
+ char *message;
+ int data_descriptor;
+ int len;
+ char *message_ptr;
+ char rctl_data[BUFSIZ];
+ struct strbuf recv_message;
+ struct strbuf rctl_message;
+ int flags = 0;
+ /* these are to make reading some of the DLPI control messages easier */
+ dl_unitdata_ind_t *data_ind = (dl_unitdata_ind_t *)rctl_data;
+ dl_uderror_ind_t *uder_ind = (dl_uderror_ind_t *)rctl_data;
+
+ int bytes_received = 0;
+ float elapsed_time;
+
+ int message_size;
+ int messages_recvd = 0;
+ int measure_cpu;
+
+ struct dlpi_cl_stream_request_struct *dlpi_cl_stream_request;
+ struct dlpi_cl_stream_response_struct *dlpi_cl_stream_response;
+ struct dlpi_cl_stream_results_struct *dlpi_cl_stream_results;
+
+ dlpi_cl_stream_request = (struct dlpi_cl_stream_request_struct *)netperf_request.content.test_specific_data;
+ dlpi_cl_stream_response = (struct dlpi_cl_stream_response_struct *)netperf_response.content.test_specific_data;
+ dlpi_cl_stream_results = (struct dlpi_cl_stream_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_dlpi_cl_stream: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen descriptor with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug > 1) {
+ fprintf(where,"recv_dlpi_cl_stream: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = DLPI_CL_STREAM_RESPONSE;
+
+ if (debug > 2) {
+ fprintf(where,"recv_dlpi_cl_stream: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* set-up the data buffer with the requested alignment and offset */
+ message = (char *)malloc(DATABUFFERLEN);
+ if (message == NULL) {
+ printf("malloc(%d) failed!\n", DATABUFFERLEN);
+ exit(1);
+ }
+
+ /* We now alter the message_ptr variable to be at the desired */
+ /* alignment with the desired offset. */
+
+ if (debug > 1) {
+ fprintf(where,"recv_dlpi_cl_stream: requested alignment of %d\n",
+ dlpi_cl_stream_request->recv_alignment);
+ fflush(where);
+ }
+
+ message_ptr = ALIGN_BUFFER(message, dlpi_cl_stream_request->recv_alignment, dlpi_cl_stream_request->recv_offset);
+
+ if (dlpi_cl_stream_request->message_size > 0) {
+ recv_message.maxlen = dlpi_cl_stream_request->message_size;
+ }
+ else {
+ recv_message.maxlen = 4096;
+ }
+ recv_message.len = 0;
+ recv_message.buf = message_ptr;
+
+ rctl_message.maxlen = BUFSIZ;
+ rctl_message.len = 0;
+ rctl_message.buf = rctl_data;
+
+ if (debug > 1) {
+ fprintf(where,
+ "recv_dlpi_cl_stream: receive alignment and offset set...\n");
+ fflush(where);
+ }
+
+ if (debug > 1) {
+ fprintf(where,"recv_dlpi_cl_stream: grabbing a descriptor...\n");
+ fflush(where);
+ }
+
+#ifdef __alpha
+
+ /* ok - even on a DEC box, strings are strings. I din't really want */
+ /* to ntohl the words of a string. since I don't want to teach the */
+ /* send_ and recv_ _request and _response routines about the types, */
+ /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
+ /* solution would be to use XDR, but I am still leary of being able */
+ /* to find XDR libs on all platforms I want running netperf. raj */
+ {
+ int *charword;
+ int *initword;
+ int *lastword;
+
+ initword = (int *) dlpi_cl_stream_request->dlpi_device;
+ lastword = initword + ((dlpi_cl_stream_request->dev_name_len + 3) / 4);
+
+ for (charword = initword;
+ charword < lastword;
+ charword++) {
+
+ *charword = htonl(*charword);
+ }
+ }
+#endif /* __alpha */
+
+ data_descriptor = dl_open(dlpi_cl_stream_request->dlpi_device,
+ dlpi_cl_stream_request->ppa);
+ if (data_descriptor < 0) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ /* The initiator may have wished-us to modify the window */
+ /* sizes. We should give it a shot. If he didn't ask us to change the */
+ /* sizes, we should let him know what sizes were in use at this end. */
+ /* If none of this code is compiled-in, then we will tell the */
+ /* initiator that we were unable to play with the sizes by */
+ /* setting the size in the response to -1. */
+
+#ifdef DL_HP_SET_LOCAL_WIN_REQ
+
+ if (dlpi_cl_stream_request->recv_win_size) {
+ dlpi_cl_stream_response->recv_win_size = -1;
+ }
+
+#else /* the system won't let us play with the buffers */
+
+ dlpi_cl_stream_response->recv_win_size = -1;
+
+#endif /* DL_HP_SET_LOCAL_WIN_REQ */
+
+ dlpi_cl_stream_response->test_length = dlpi_cl_stream_request->test_length;
+
+ /* bind the sap and retrieve the dlsap assigned by the system */
+ dlpi_cl_stream_response->station_addr_len = 14; /* arbitrary */
+ if (dl_bind(data_descriptor,
+ dlpi_cl_stream_request->sap,
+ DL_CLDLS,
+ (char *)dlpi_cl_stream_response->station_addr,
+ &dlpi_cl_stream_response->station_addr_len) != 0) {
+ fprintf(where,"send_dlpi_cl_stream: bind failure\n");
+ fflush(where);
+ exit(1);
+ }
+
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a -1 to */
+ /* the initiator. */
+
+ dlpi_cl_stream_response->cpu_rate = 0.0; /* assume no cpu */
+ if (dlpi_cl_stream_request->measure_cpu) {
+ /* We will pass the rate into the calibration routine. If the */
+ /* user did not specify one, it will be 0.0, and we will do a */
+ /* "real" calibration. Otherwise, all it will really do is */
+ /* store it away... */
+ dlpi_cl_stream_response->measure_cpu = 1;
+ dlpi_cl_stream_response->cpu_rate = calibrate_local_cpu(dlpi_cl_stream_request->cpu_rate);
+ }
+
+ message_size = dlpi_cl_stream_request->message_size;
+ test_time = dlpi_cl_stream_request->test_length;
+
+ send_response();
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(dlpi_cl_stream_request->measure_cpu);
+
+ /* The loop will exit when the timer pops, or if we happen to recv a */
+ /* message of less than send_size bytes... */
+
+ times_up = 0;
+ start_timer(test_time + PAD_TIME);
+
+ if (debug) {
+ fprintf(where,"recv_dlpi_cl_stream: about to enter inner sanctum.\n");
+ fflush(where);
+ }
+
+ while (!times_up) {
+ if((getmsg(data_descriptor,
+ &rctl_message,
+ &recv_message,
+ &flags) != 0) ||
+ (data_ind->dl_primitive != DL_UNITDATA_IND)) {
+ if (errno == EINTR) {
+ /* Again, we have likely hit test-end time */
+ break;
+ }
+ fprintf(where,
+ "dlpi_recv_cl_stream: getmsg failure: errno %d primitive 0x%x\n",
+ errno,
+ data_ind->dl_primitive);
+ fflush(where);
+ netperf_response.content.serv_errno = 996;
+ send_response();
+ exit(1);
+ }
+ messages_recvd++;
+ }
+
+ if (debug) {
+ fprintf(where,"recv_dlpi_cl_stream: got %d messages.\n",messages_recvd);
+ fflush(where);
+ }
+
+
+ /* The loop now exits due timer or < send_size bytes received. */
+
+ cpu_stop(dlpi_cl_stream_request->measure_cpu,&elapsed_time);
+
+ if (times_up) {
+ /* we ended on a timer, subtract the PAD_TIME */
+ elapsed_time -= (float)PAD_TIME;
+ }
+ else {
+ stop_timer();
+ }
+
+ if (debug) {
+ fprintf(where,"recv_dlpi_cl_stream: test ended in %f seconds.\n",elapsed_time);
+ fflush(where);
+ }
+
+
+ /* We will count the "off" message */
+ bytes_received = (messages_recvd * message_size) + len;
+
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_dlpi_cl_stream: got %d bytes\n",
+ bytes_received);
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = DLPI_CL_STREAM_RESULTS;
+ dlpi_cl_stream_results->bytes_received = bytes_received;
+ dlpi_cl_stream_results->messages_recvd = messages_recvd;
+ dlpi_cl_stream_results->elapsed_time = elapsed_time;
+ if (dlpi_cl_stream_request->measure_cpu) {
+ dlpi_cl_stream_results->cpu_util = calc_cpu_util(elapsed_time);
+ }
+ else {
+ dlpi_cl_stream_results->cpu_util = -1.0;
+ }
+
+ if (debug > 1) {
+ fprintf(where,
+ "recv_dlpi_cl_stream: test complete, sending results.\n");
+ fflush(where);
+ }
+
+ send_response();
+
+}
+
+int send_dlpi_cl_rr(char remote_host[])
+{
+
+ char *tput_title = "\
+Local /Remote\n\
+Window Size Request Resp. Elapsed Trans.\n\
+Send Recv Size Size Time Rate \n\
+frames frames bytes bytes secs. per sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %7.2f \n";
+ char *tput_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *cpu_title = "\
+Local /Remote\n\
+Window Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem\n\
+Send Recv Size Size Time Rate local remote local remote\n\
+frames frames bytes bytes secs. per sec %% %% us/Tr us/Tr\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f\n";
+
+ char *cpu_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %-6.2f %-6.2f %-6.2f %-6.3f %-6.3f\n";
+
+ char *cpu_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *ksink_fmt = "\
+Alignment Offset\n\
+Local Remote Local Remote\n\
+Send Recv Send Recv\n\
+%5d %5d %5d %5d\n";
+
+
+ float elapsed_time;
+
+ int dlsap_len;
+ int flags = 0;
+ char *send_message_ptr;
+ char *recv_message_ptr;
+ char *temp_message_ptr;
+ char sctl_data[BUFSIZ];
+ char rctl_data[BUFSIZ];
+ char dlsap[BUFSIZ];
+ struct strbuf send_message;
+ struct strbuf recv_message;
+ struct strbuf sctl_message;
+ struct strbuf rctl_message;
+
+ /* these are to make reading some of the DLPI control messages easier */
+ dl_unitdata_ind_t *data_ind = (dl_unitdata_ind_t *)rctl_data;
+ dl_unitdata_req_t *data_req = (dl_unitdata_req_t *)sctl_data;
+ dl_uderror_ind_t *uder_ind = (dl_uderror_ind_t *)rctl_data;
+
+ int nummessages;
+ int send_descriptor;
+ int trans_remaining;
+ int bytes_xferd;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+ double thruput;
+
+#ifdef WANT_INTERVALS
+ /* timing stuff */
+#define MAX_KEPT_TIMES 1024
+ int time_index = 0;
+ int unused_buckets;
+ int kept_times[MAX_KEPT_TIMES];
+ int sleep_usecs;
+ unsigned int total_times=0;
+ struct timezone dummy_zone;
+ struct timeval send_time;
+ struct timeval recv_time;
+ struct timeval sleep_timeval;
+#endif /* WANT_INTERVALS */
+
+ struct dlpi_cl_rr_request_struct *dlpi_cl_rr_request;
+ struct dlpi_cl_rr_response_struct *dlpi_cl_rr_response;
+ struct dlpi_cl_rr_results_struct *dlpi_cl_rr_result;
+
+ dlpi_cl_rr_request =
+ (struct dlpi_cl_rr_request_struct *)netperf_request.content.test_specific_data;
+ dlpi_cl_rr_response =
+ (struct dlpi_cl_rr_response_struct *)netperf_response.content.test_specific_data;
+ dlpi_cl_rr_result =
+ (struct dlpi_cl_rr_results_struct *)netperf_response.content.test_specific_data;
+
+ /* we want to zero out the times, so we can detect unused entries. */
+#ifdef WANT_INTERVALS
+ time_index = 0;
+ while (time_index < MAX_KEPT_TIMES) {
+ kept_times[time_index] = 0;
+ time_index += 1;
+ }
+ time_index = 0;
+#endif /* WANT_INTERVALS */
+
+ if (print_headers) {
+ fprintf(where,"DLPI CL REQUEST/RESPONSE TEST\n");
+ if (local_cpu_usage || remote_cpu_usage)
+ fprintf(where,cpu_title,format_units());
+ else
+ fprintf(where,tput_title,format_units());
+ }
+
+ /* initialize a few counters */
+
+ nummessages = 0;
+ bytes_xferd = 0;
+ times_up = 0;
+
+ /* set-up the data buffer with the requested alignment and offset */
+ temp_message_ptr = (char *)malloc(req_size+MAXALIGNMENT+MAXOFFSET);
+ if (temp_message_ptr == NULL) {
+ printf("malloc(%d) failed!\n", req_size+MAXALIGNMENT+MAXOFFSET);
+ exit(1);
+ }
+ send_message_ptr = (char *)(( (long)temp_message_ptr +
+ (long) local_send_align - 1) &
+ ~((long) local_send_align - 1));
+ send_message_ptr = send_message_ptr + local_send_offset;
+ send_message.maxlen = req_size;
+ send_message.len = req_size;
+ send_message.buf = send_message_ptr;
+
+ temp_message_ptr = (char *)malloc(rsp_size+MAXALIGNMENT+MAXOFFSET);
+ if (temp_message_ptr == NULL) {
+ printf("malloc(%d) failed!\n", rsp_size+MAXALIGNMENT+MAXOFFSET);
+ exit(1);
+ }
+ recv_message_ptr = (char *)(( (long)temp_message_ptr +
+ (long) local_recv_align - 1) &
+ ~((long) local_recv_align - 1));
+ recv_message_ptr = recv_message_ptr + local_recv_offset;
+ recv_message.maxlen = rsp_size;
+ recv_message.len = 0;
+ recv_message.buf = recv_message_ptr;
+
+ sctl_message.maxlen = BUFSIZ;
+ sctl_message.len = 0;
+ sctl_message.buf = sctl_data;
+
+ rctl_message.maxlen = BUFSIZ;
+ rctl_message.len = 0;
+ rctl_message.buf = rctl_data;
+
+ /* lets get ourselves a file descriptor */
+
+ send_descriptor = dl_open(loc_dlpi_device,loc_ppa);
+ if (send_descriptor < 0){
+ perror("netperf: send_dlpi_cl_rr: dlpi cl rr send descriptor");
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"send_dlpi_cl_rr: send_descriptor obtained...\n");
+ }
+
+ /* bind the sap to the descriptor and get the dlsap */
+ dlsap_len = BUFSIZ;
+ if (dl_bind(send_descriptor,
+ dlpi_sap,
+ DL_CLDLS,
+ dlsap,
+ &dlsap_len) != 0) {
+ fprintf(where,"send_dlpi_cl_rr: bind failure\n");
+ fflush(where);
+ exit(1);
+ }
+
+ /* Modify the local socket size. If the user has not requested that */
+ /* the socket buffers be altered, we will try to find-out what their */
+ /* values are. If we cannot touch the socket buffer in any way, we */
+ /* will set the values to -1 to indicate that. The receive socket */
+ /* must have enough space to hold addressing information so += a */
+ /* sizeof struct sockaddr_in to it. */
+
+ /* this is actually nothing code, and should be replaced with the */
+ /* alalagous calls in the STREAM test where the window size is set */
+ /* with the HP DLPI Extension. raj 8/94 */
+#ifdef SO_SNDBUF
+ if (lsw_size > 0) {
+ if (debug > 1) {
+ fprintf(where,"netperf: send_dlpi_cl_rr: local window size altered from system default...\n");
+ fprintf(where," window: %d\n",lsw_size);
+ }
+ }
+ if (lrw_size > 0) {
+ if (debug > 1) {
+ fprintf(where,"netperf: send_dlpi_cl_rr: remote window size altered from system default...\n");
+ fprintf(where," remote: %d\n",lrw_size);
+ }
+ }
+
+
+ /* Now, we will find-out what the size actually became, and report */
+ /* that back to the user. If the call fails, we will just report a -1 */
+ /* back to the initiator for the recv buffer size. */
+
+ if (debug) {
+ fprintf(where,"netperf: send_dlpi_cl_rr: socket sizes determined...\n");
+ fprintf(where," send: %d recv: %d\n",lsw_size,lrw_size);
+ }
+
+#else /* SO_SNDBUF */
+
+ lsw_size = -1;
+ lrw_size = -1;
+
+#endif /* SO_SNDBUF */
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back. If */
+ /* there is no idle counter in the kernel idle loop, the */
+ /* local_cpu_rate will be set to -1. */
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ /* Tell the remote end to do a listen. The server alters the socket */
+ /* paramters on the other side at this point, hence the reason for */
+ /* all the values being passed in the setup message. If the user did */
+ /* not specify any of the parameters, they will be passed as 0, which */
+ /* will indicate to the remote that no changes beyond the system's */
+ /* default should be used. Alignment is the exception, it will */
+ /* default to 8, which will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_DLPI_CL_RR;
+ dlpi_cl_rr_request->recv_win_size = rrw_size;
+ dlpi_cl_rr_request->send_win_size = rsw_size;
+ dlpi_cl_rr_request->recv_alignment = remote_recv_align;
+ dlpi_cl_rr_request->recv_offset = remote_recv_offset;
+ dlpi_cl_rr_request->send_alignment = remote_send_align;
+ dlpi_cl_rr_request->send_offset = remote_send_offset;
+ dlpi_cl_rr_request->request_size = req_size;
+ dlpi_cl_rr_request->response_size = rsp_size;
+ dlpi_cl_rr_request->measure_cpu = remote_cpu_usage;
+ dlpi_cl_rr_request->cpu_rate = remote_cpu_rate;
+ dlpi_cl_rr_request->ppa = rem_ppa;
+ dlpi_cl_rr_request->sap = dlpi_sap;
+ dlpi_cl_rr_request->dev_name_len = strlen(rem_dlpi_device);
+ strcpy(dlpi_cl_rr_request->dlpi_device,
+ rem_dlpi_device);
+
+#ifdef __alpha
+
+ /* ok - even on a DEC box, strings are strings. I din't really want */
+ /* to ntohl the words of a string. since I don't want to teach the */
+ /* send_ and recv_ _request and _response routines about the types, */
+ /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
+ /* solution would be to use XDR, but I am still leary of being able */
+ /* to find XDR libs on all platforms I want running netperf. raj */
+ {
+ int *charword;
+ int *initword;
+ int *lastword;
+
+ initword = (int *) dlpi_cl_rr_request->dlpi_device;
+ lastword = initword + ((strlen(rem_dlpi_device) + 3) / 4);
+
+ for (charword = initword;
+ charword < lastword;
+ charword++) {
+
+ *charword = ntohl(*charword);
+ }
+ }
+#endif /* __alpha */
+
+ if (test_time) {
+ dlpi_cl_rr_request->test_length = test_time;
+ }
+ else {
+ dlpi_cl_rr_request->test_length = test_trans * -1;
+ }
+
+ if (debug > 1) {
+ fprintf(where,"netperf: send_dlpi_cl_rr: requesting DLPI CL request/response test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant */
+ /* socket parameters for this test type. We will put them back into */
+ /* the variables here so they can be displayed if desired. The */
+ /* remote will have calibrated CPU if necessary, and will have done */
+ /* all the needed set-up we will have calibrated the cpu locally */
+ /* before sending the request, and will grab the counter value right */
+ /* after the connect returns. The remote will grab the counter right */
+ /* after the accept call. This saves the hassle of extra messages */
+ /* being sent for the tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote listen done.\n");
+ rrw_size = dlpi_cl_rr_response->recv_win_size;
+ rsw_size = dlpi_cl_rr_response->send_win_size;
+ remote_cpu_usage= dlpi_cl_rr_response->measure_cpu;
+ remote_cpu_rate = dlpi_cl_rr_response->cpu_rate;
+
+ /* set-up the destination addressing control info */
+ data_req->dl_primitive = DL_UNITDATA_REQ;
+ bcopy((char *)(dlpi_cl_rr_response->station_addr),
+ ((char *)data_req + sizeof(dl_unitdata_req_t)),
+ dlpi_cl_rr_response->station_addr_len);
+ data_req->dl_dest_addr_offset = sizeof(dl_unitdata_req_t);
+ data_req->dl_dest_addr_length = dlpi_cl_rr_response->station_addr_len;
+ /* there is a dl_priority structure too, but I am ignoring it for */
+ /* the time being. */
+ sctl_message.len = sizeof(dl_unitdata_req_t) +
+ data_req->dl_dest_addr_length;
+ /* famous last words - some DLPI providers get unhappy if the
+ priority stuff is not initialized. fix from Nicolas Thomas. */
+ data_req->dl_priority.dl_min = DL_QOS_DONT_CARE;
+ data_req->dl_priority.dl_max = DL_QOS_DONT_CARE;
+
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("netperf: remote error");
+ exit(1);
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either the */
+ /* connect would have failed, or the previous response would have */
+ /* indicated a problem. I failed to see the value of the extra */
+ /* message after the accept on the remote. If it failed, we'll see it */
+ /* here. If it didn't, we might as well start pumping data. */
+
+ /* Set-up the test end conditions. For a request/response test, they */
+ /* can be either time or transaction based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ trans_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return false. */
+ /* When the test is controlled by byte count, the time test will */
+ /* always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. I think I */
+ /* just arbitrarily decrement trans_remaining for the timed test, but */
+ /* will not do that just yet... One other question is whether or not */
+ /* the send buffer and the receive buffer should be the same buffer. */
+ while ((!times_up) || (trans_remaining > 0)) {
+ /* send the request */
+#ifdef WANT_INTERVALS
+ gettimeofday(&send_time,&dummy_zone);
+#endif /* WANT_INTERVALS */
+ if(putmsg(send_descriptor,
+ &sctl_message,
+ &send_message,
+ 0) != 0) {
+ if (errno == EINTR) {
+ /* We likely hit */
+ /* test-end time. */
+ break;
+ }
+ /* there is more we could do here, but it can wait */
+ perror("send_dlpi_cl_rr: data send error");
+ exit(1);
+ }
+
+ /* receive the response. at some point, we will need to handle */
+ /* sending responses which are greater than the datalink MTU. we */
+ /* may also want to add some DLPI error checking, but for now we */
+ /* will ignore that and just let errors stop the test with little */
+ /* indication of what might actually be wrong. */
+
+ if((getmsg(send_descriptor,
+ &rctl_message,
+ &recv_message,
+ &flags) != 0) ||
+ (data_ind->dl_primitive != DL_UNITDATA_IND)) {
+ if (errno == EINTR) {
+ /* Again, we have likely hit test-end time */
+ break;
+ }
+ fprintf(where,
+ "send_dlpi_cl_rr: recv error: errno %d primitive 0x%x\n",
+ errno,
+ data_ind->dl_primitive);
+ fflush(where);
+ exit(1);
+ }
+#ifdef WANT_INTERVALS
+ gettimeofday(&recv_time,&dummy_zone);
+
+ /* now we do some arithmatic on the two timevals */
+ if (recv_time.tv_usec < send_time.tv_usec) {
+ /* we wrapped around a second */
+ recv_time.tv_usec += 1000000;
+ recv_time.tv_sec -= 1;
+ }
+
+ /* and store it away */
+ kept_times[time_index] = (recv_time.tv_sec - send_time.tv_sec) * 1000000;
+ kept_times[time_index] += (recv_time.tv_usec - send_time.tv_usec);
+
+ /* at this point, we may wish to sleep for some period of */
+ /* time, so we see how long that last transaction just took, */
+ /* and sleep for the difference of that and the interval. We */
+ /* will not sleep if the time would be less than a */
+ /* millisecond. */
+ if (interval_usecs > 0) {
+ sleep_usecs = interval_usecs - kept_times[time_index];
+ if (sleep_usecs > 1000) {
+ /* we sleep */
+ sleep_timeval.tv_sec = sleep_usecs / 1000000;
+ sleep_timeval.tv_usec = sleep_usecs % 1000000;
+ select(0,
+ 0,
+ 0,
+ 0,
+ &sleep_timeval);
+ }
+ }
+
+ /* now up the time index */
+ time_index = (time_index +1)%MAX_KEPT_TIMES;
+#endif /* WANT_INTERVALS */
+ nummessages++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug > 3) {
+ fprintf(where,"Transaction %d completed\n",nummessages);
+ fflush(where);
+ }
+
+ }
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being measured? */
+ /* how long did we really run? */
+
+ /* Get the statistics from the remote end. The remote will have */
+ /* calculated service demand and all those interesting things. If it */
+ /* wasn't supposed to care, it will return obvious values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("netperf: remote error");
+
+ exit(1);
+ }
+
+ /* We now calculate what our thruput was for the test. In the future, */
+ /* we may want to include a calculation of the thruput measured by */
+ /* the remote, but it should be the case that for a UDP stream test, */
+ /* that the two numbers should be *very* close... We calculate */
+ /* bytes_sent regardless of the way the test length was controlled. */
+ /* If it was time, we needed to, and if it was by bytes, the user may */
+ /* have specified a number of bytes that wasn't a multiple of the */
+ /* send_size, so we really didn't send what he asked for ;-) We use */
+
+ bytes_xferd = (req_size * nummessages) + (rsp_size * nummessages);
+ thruput = calc_thruput(bytes_xferd);
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+ if (local_cpu_rate == 0.0) {
+ fprintf(where,"WARNING WARNING WARNING WARNING WARNING WARNING WARNING!\n");
+ fprintf(where,"Local CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+ local_cpu_utilization = calc_cpu_util(0.0);
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ local_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = -1.0;
+ local_service_demand = -1.0;
+ }
+
+ if (remote_cpu_usage) {
+ if (remote_cpu_rate == 0.0) {
+ fprintf(where,"DANGER DANGER DANGER DANGER DANGER DANGER DANGER!\n");
+ fprintf(where,"Remote CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+ remote_cpu_utilization = dlpi_cl_rr_result->cpu_util;
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ remote_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ remote_cpu_utilization,
+ dlpi_cl_rr_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = -1.0;
+ remote_service_demand = -1.0;
+ }
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand);
+ }
+ break;
+ case 1:
+ case 2:
+ fprintf(where,
+ cpu_fmt_1_line_1, /* the format string */
+ lsw_size, /* local sendbuf size */
+ lrw_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* guess */
+ elapsed_time, /* how long was the test */
+ nummessages/elapsed_time,
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand); /* remote service demand */
+ fprintf(where,
+ cpu_fmt_1_line_2,
+ rsw_size,
+ rrw_size);
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ nummessages/elapsed_time);
+ break;
+ case 1:
+ case 2:
+ fprintf(where,
+ tput_fmt_1_line_1, /* the format string */
+ lsw_size,
+ lrw_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* how large were the responses */
+ elapsed_time, /* how long did it take */
+ nummessages/elapsed_time);
+ fprintf(where,
+ tput_fmt_1_line_2,
+ rsw_size, /* remote recvbuf size */
+ rrw_size);
+
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* UDP statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+#ifdef WANT_INTERVALS
+ kept_times[MAX_KEPT_TIMES] = 0;
+ time_index = 0;
+ while (time_index < MAX_KEPT_TIMES) {
+ if (kept_times[time_index] > 0) {
+ total_times += kept_times[time_index];
+ }
+ else
+ unused_buckets++;
+ time_index += 1;
+ }
+ total_times /= (MAX_KEPT_TIMES-unused_buckets);
+ fprintf(where,
+ "Average response time %d usecs\n",
+ total_times);
+#endif
+ }
+}
+
+int
+ recv_dlpi_cl_rr()
+{
+
+ char *message;
+ int data_descriptor;
+ int flags = 0;
+ int measure_cpu;
+
+ char *recv_message_ptr;
+ char *send_message_ptr;
+ char sctl_data[BUFSIZ];
+ char rctl_data[BUFSIZ];
+ char dlsap[BUFSIZ];
+ struct strbuf send_message;
+ struct strbuf recv_message;
+ struct strbuf sctl_message;
+ struct strbuf rctl_message;
+
+ /* these are to make reading some of the DLPI control messages easier */
+ dl_unitdata_ind_t *data_ind = (dl_unitdata_ind_t *)rctl_data;
+ dl_unitdata_req_t *data_req = (dl_unitdata_req_t *)sctl_data;
+ dl_uderror_ind_t *uder_ind = (dl_uderror_ind_t *)rctl_data;
+
+ int trans_received;
+ int trans_remaining;
+ float elapsed_time;
+
+ struct dlpi_cl_rr_request_struct *dlpi_cl_rr_request;
+ struct dlpi_cl_rr_response_struct *dlpi_cl_rr_response;
+ struct dlpi_cl_rr_results_struct *dlpi_cl_rr_results;
+
+ dlpi_cl_rr_request =
+ (struct dlpi_cl_rr_request_struct *)netperf_request.content.test_specific_data;
+ dlpi_cl_rr_response =
+ (struct dlpi_cl_rr_response_struct *)netperf_response.content.test_specific_data;
+ dlpi_cl_rr_results =
+ (struct dlpi_cl_rr_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_dlpi_cl_rr: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen descriptor with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the descriptor sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_dlpi_cl_rr: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = DLPI_CL_RR_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_dlpi_cl_rr: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* set-up the data buffer with the requested alignment and offset */
+ message = (char *)malloc(DATABUFFERLEN);
+ if (message == NULL) {
+ printf("malloc(%d) failed!\n", DATABUFFERLEN);
+ exit(1);
+ }
+
+ /* We now alter the message_ptr variables to be at the desired */
+ /* alignments with the desired offsets. */
+
+ if (debug) {
+ fprintf(where,
+ "recv_dlpi_cl_rr: requested recv alignment of %d offset %d\n",
+ dlpi_cl_rr_request->recv_alignment,
+ dlpi_cl_rr_request->recv_offset);
+ fprintf(where,
+ "recv_dlpi_cl_rr: requested send alignment of %d offset %d\n",
+ dlpi_cl_rr_request->send_alignment,
+ dlpi_cl_rr_request->send_offset);
+ fflush(where);
+ }
+
+ recv_message_ptr = ALIGN_BUFFER(message, dlpi_cl_rr_request->recv_alignment, dlpi_cl_rr_request->recv_offset);
+ recv_message.maxlen = dlpi_cl_rr_request->request_size;
+ recv_message.len = 0;
+ recv_message.buf = recv_message_ptr;
+
+ send_message_ptr = ALIGN_BUFFER(message, dlpi_cl_rr_request->send_alignment, dlpi_cl_rr_request->send_offset);
+ send_message.maxlen = dlpi_cl_rr_request->response_size;
+ send_message.len = dlpi_cl_rr_request->response_size;
+ send_message.buf = send_message_ptr;
+
+ sctl_message.maxlen = BUFSIZ;
+ sctl_message.len = 0;
+ sctl_message.buf = sctl_data;
+
+ rctl_message.maxlen = BUFSIZ;
+ rctl_message.len = 0;
+ rctl_message.buf = rctl_data;
+
+ if (debug) {
+ fprintf(where,"recv_dlpi_cl_rr: receive alignment and offset set...\n");
+ fprintf(where,"recv_dlpi_cl_rr: grabbing a socket...\n");
+ fflush(where);
+ }
+
+
+#ifdef __alpha
+
+ /* ok - even on a DEC box, strings are strings. I din't really want */
+ /* to ntohl the words of a string. since I don't want to teach the */
+ /* send_ and recv_ _request and _response routines about the types, */
+ /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
+ /* solution would be to use XDR, but I am still leary of being able */
+ /* to find XDR libs on all platforms I want running netperf. raj */
+ {
+ int *charword;
+ int *initword;
+ int *lastword;
+
+ initword = (int *) dlpi_cl_rr_request->dlpi_device;
+ lastword = initword + ((dlpi_cl_rr_request->dev_name_len + 3) / 4);
+
+ for (charword = initword;
+ charword < lastword;
+ charword++) {
+
+ *charword = htonl(*charword);
+ }
+ }
+#endif /* __alpha */
+
+ data_descriptor = dl_open(dlpi_cl_rr_request->dlpi_device,
+ dlpi_cl_rr_request->ppa);
+ if (data_descriptor < 0) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+
+ /* The initiator may have wished-us to modify the window */
+ /* sizes. We should give it a shot. If he didn't ask us to change the */
+ /* sizes, we should let him know what sizes were in use at this end. */
+ /* If none of this code is compiled-in, then we will tell the */
+ /* initiator that we were unable to play with the sizes by */
+ /* setting the size in the response to -1. */
+
+#ifdef DL_HP_SET_LOCAL_WIN_REQ
+
+ if (dlpi_cl_rr_request->recv_win_size) {
+ }
+
+ if (dlpi_cl_rr_request->send_win_size) {
+ }
+
+ /* Now, we will find-out what the sizes actually became, and report */
+ /* them back to the user. If the calls fail, we will just report a -1 */
+ /* back to the initiator for the buffer size. */
+
+#else /* the system won't let us play with the buffers */
+
+ dlpi_cl_rr_response->recv_win_size = -1;
+ dlpi_cl_rr_response->send_win_size = -1;
+
+#endif /* DL_HP_SET_LOCAL_WIN_REQ */
+
+ /* bind the sap and retrieve the dlsap assigned by the system */
+ dlpi_cl_rr_response->station_addr_len = 14; /* arbitrary */
+ if (dl_bind(data_descriptor,
+ dlpi_cl_rr_request->sap,
+ DL_CLDLS,
+ (char *)dlpi_cl_rr_response->station_addr,
+ &dlpi_cl_rr_response->station_addr_len) != 0) {
+ fprintf(where,"send_dlpi_cl_rr: bind failure\n");
+ fflush(where);
+ exit(1);
+ }
+
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a 0.0 to */
+ /* the initiator. */
+
+ dlpi_cl_rr_response->cpu_rate = 0.0; /* assume no cpu */
+ if (dlpi_cl_rr_request->measure_cpu) {
+ dlpi_cl_rr_response->measure_cpu = 1;
+ dlpi_cl_rr_response->cpu_rate = calibrate_local_cpu(dlpi_cl_rr_request->cpu_rate);
+ }
+
+ send_response();
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start receiving. */
+
+ cpu_start(dlpi_cl_rr_request->measure_cpu);
+
+ if (dlpi_cl_rr_request->test_length > 0) {
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(dlpi_cl_rr_request->test_length + PAD_TIME);
+ }
+else {
+ times_up = 1;
+ trans_remaining = dlpi_cl_rr_request->test_length * -1;
+}
+
+ while ((!times_up) || (trans_remaining > 0)) {
+
+ /* receive the request from the other side. at some point we need */
+ /* to handle "logical" requests and responses which are larger */
+ /* than the data link MTU */
+
+ if((getmsg(data_descriptor,
+ &rctl_message,
+ &recv_message,
+ &flags) != 0) ||
+ (data_ind->dl_primitive != DL_UNITDATA_IND)) {
+ if (errno == EINTR) {
+ /* Again, we have likely hit test-end time */
+ break;
+ }
+ fprintf(where,
+ "dlpi_recv_cl_rr: getmsg failure: errno %d primitive 0x%x\n",
+ errno,
+ data_ind->dl_primitive);
+ fprintf(where,
+ " recevied %u transactions\n",
+ trans_received);
+ fflush(where);
+ netperf_response.content.serv_errno = 995;
+ send_response();
+ exit(1);
+ }
+
+ /* Now, send the response to the remote. first copy the dlsap */
+ /* information from the receive to the sending control message */
+
+ data_req->dl_dest_addr_offset = sizeof(dl_unitdata_req_t);
+ bcopy((char *)data_ind + data_ind->dl_src_addr_offset,
+ (char *)data_req + data_req->dl_dest_addr_offset,
+ data_ind->dl_src_addr_length);
+ data_req->dl_dest_addr_length = data_ind->dl_src_addr_length;
+ data_req->dl_primitive = DL_UNITDATA_REQ;
+ /* be sure to initialize the priority fields. fix from Nicholas
+ Thomas */
+ data_req->dl_priority.dl_min = DL_QOS_DONT_CARE;
+ data_req->dl_priority.dl_max = DL_QOS_DONT_CARE;
+
+ sctl_message.len = sizeof(dl_unitdata_req_t) +
+ data_ind->dl_src_addr_length;
+ if(putmsg(data_descriptor,
+ &sctl_message,
+ &send_message,
+ 0) != 0) {
+ if (errno == EINTR) {
+ /* We likely hit */
+ /* test-end time. */
+ break;
+ }
+ /* there is more we could do here, but it can wait */
+ fprintf(where,
+ "dlpi_recv_cl_rr: putmsg failure: errno %d\n",
+ errno);
+ fflush(where);
+ netperf_response.content.serv_errno = 993;
+ send_response();
+ exit(1);
+ }
+
+ trans_received++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_dlpi_cl_rr: Transaction %d complete.\n",
+ trans_received);
+ fflush(where);
+ }
+
+ }
+
+
+ /* The loop now exits due to timeout or transaction count being */
+ /* reached */
+
+ cpu_stop(dlpi_cl_rr_request->measure_cpu,&elapsed_time);
+
+ if (times_up) {
+ /* we ended the test by time, which was at least 2 seconds */
+ /* longer than we wanted to run. so, we want to subtract */
+ /* PAD_TIME from the elapsed_time. */
+ elapsed_time -= PAD_TIME;
+ }
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_dlpi_cl_rr: got %d transactions\n",
+ trans_received);
+ fflush(where);
+ }
+
+ dlpi_cl_rr_results->bytes_received = (trans_received *
+ (dlpi_cl_rr_request->request_size +
+ dlpi_cl_rr_request->response_size));
+ dlpi_cl_rr_results->trans_received = trans_received;
+ dlpi_cl_rr_results->elapsed_time = elapsed_time;
+ if (dlpi_cl_rr_request->measure_cpu) {
+ dlpi_cl_rr_results->cpu_util = calc_cpu_util(elapsed_time);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_dlpi_cl_rr: test complete, sending results.\n");
+ fflush(where);
+ }
+
+ send_response();
+
+}
+
+int
+ recv_dlpi_co_rr()
+{
+
+ char *message;
+ SOCKET s_listen,data_descriptor;
+
+ int measure_cpu;
+
+ int flags = 0;
+ char *recv_message_ptr;
+ char *send_message_ptr;
+ struct strbuf send_message;
+ struct strbuf recv_message;
+
+ int trans_received;
+ int trans_remaining;
+ int request_bytes_remaining;
+ int timed_out = 0;
+ float elapsed_time;
+
+ struct dlpi_co_rr_request_struct *dlpi_co_rr_request;
+ struct dlpi_co_rr_response_struct *dlpi_co_rr_response;
+ struct dlpi_co_rr_results_struct *dlpi_co_rr_results;
+
+ dlpi_co_rr_request = (struct dlpi_co_rr_request_struct *)netperf_request.content.test_specific_data;
+ dlpi_co_rr_response = (struct dlpi_co_rr_response_struct *)netperf_response.content.test_specific_data;
+ dlpi_co_rr_results = (struct dlpi_co_rr_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_dlpi_co_rr: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_dlpi_co_rr: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = DLPI_CO_RR_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_dlpi_co_rr: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* set-up the data buffer with the requested alignment and offset */
+ message = (char *)malloc(DATABUFFERLEN);
+ if (message == NULL) {
+ printf("malloc(%d) failed!\n", DATABUFFERLEN);
+ exit(1);
+ }
+
+ /* We now alter the message_ptr variables to be at the desired */
+ /* alignments with the desired offsets. */
+
+ if (debug) {
+ fprintf(where,
+ "recv_dlpi_co_rr: requested recv alignment of %d offset %d\n",
+ dlpi_co_rr_request->recv_alignment,
+ dlpi_co_rr_request->recv_offset);
+ fprintf(where,
+ "recv_dlpi_co_rr: requested send alignment of %d offset %d\n",
+ dlpi_co_rr_request->send_alignment,
+ dlpi_co_rr_request->send_offset);
+ fflush(where);
+ }
+
+ recv_message_ptr = ALIGN_BUFFER(message, dlpi_co_rr_request->recv_alignment, dlpi_co_rr_request->recv_offset);
+ recv_message.maxlen = dlpi_co_rr_request->request_size;
+ recv_message.len = 0;
+ recv_message.buf = recv_message_ptr;
+
+ send_message_ptr = ALIGN_BUFFER(message, dlpi_co_rr_request->send_alignment, dlpi_co_rr_request->send_offset);
+ send_message.maxlen = dlpi_co_rr_request->response_size;
+ send_message.len = dlpi_co_rr_request->response_size;
+ send_message.buf = send_message_ptr;
+
+ if (debug) {
+ fprintf(where,"recv_dlpi_co_rr: receive alignment and offset set...\n");
+ fprintf(where,"recv_dlpi_co_rr: send_message.buf %x .len %d .maxlen %d\n",
+ send_message.buf,send_message.len,send_message.maxlen);
+ fprintf(where,"recv_dlpi_co_rr: recv_message.buf %x .len %d .maxlen %d\n",
+ recv_message.buf,recv_message.len,recv_message.maxlen);
+ fflush(where);
+ }
+
+ /* Let's clear-out our sockaddr for the sake of cleanlines. Then we */
+ /* can put in OUR values !-) At some point, we may want to nail this */
+ /* socket to a particular network-level address, but for now, */
+ /* INADDR_ANY should be just fine. */
+
+ /* Grab a socket to listen on, and then listen on it. */
+
+ if (debug) {
+ fprintf(where,"recv_dlpi_co_rr: grabbing a socket...\n");
+ fflush(where);
+ }
+
+ /* lets grab a file descriptor for a particular link */
+
+#ifdef __alpha
+
+ /* ok - even on a DEC box, strings are strings. I din't really want */
+ /* to ntohl the words of a string. since I don't want to teach the */
+ /* send_ and recv_ _request and _response routines about the types, */
+ /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
+ /* solution would be to use XDR, but I am still leary of being able */
+ /* to find XDR libs on all platforms I want running netperf. raj */
+ {
+ int *charword;
+ int *initword;
+ int *lastword;
+
+ initword = (int *) dlpi_co_rr_request->dlpi_device;
+ lastword = initword + ((dlpi_co_rr_request->dev_name_len + 3) / 4);
+
+ for (charword = initword;
+ charword < lastword;
+ charword++) {
+
+ *charword = htonl(*charword);
+ }
+ }
+#endif /* __alpha */
+
+ if ((data_descriptor = dl_open(dlpi_co_rr_request->dlpi_device,
+ dlpi_co_rr_request->ppa)) < 0) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ /* bind the file descriptor to a sap and get the resultant dlsap */
+ dlpi_co_rr_response->station_addr_len = 14; /*arbitrary needs fixing */
+ if (dl_bind(data_descriptor,
+ dlpi_co_rr_request->sap,
+ DL_CODLS,
+ (char *)dlpi_co_rr_response->station_addr,
+ &dlpi_co_rr_response->station_addr_len) != 0) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ /* The initiator may have wished-us to modify the socket buffer */
+ /* sizes. We should give it a shot. If he didn't ask us to change the */
+ /* sizes, we should let him know what sizes were in use at this end. */
+ /* If none of this code is compiled-in, then we will tell the */
+ /* initiator that we were unable to play with the socket buffer by */
+ /* setting the size in the response to -1. */
+
+#ifdef DL_HP_SET_LOCAL_WIN_REQ
+
+ if (dlpi_co_rr_request->recv_win_size) {
+ /* SMOP */
+ }
+
+ if (dlpi_co_rr_request->send_win_size) {
+ /* SMOP */
+ }
+
+ /* Now, we will find-out what the sizes actually became, and report */
+ /* them back to the user. If the calls fail, we will just report a -1 */
+ /* back to the initiator for the buffer size. */
+
+#else /* the system won't let us play with the buffers */
+
+ dlpi_co_rr_response->recv_win_size = -1;
+ dlpi_co_rr_response->send_win_size = -1;
+
+#endif /* DL_HP_SET_LOCAL_WIN_REQ */
+
+ /* we may have been requested to enable the copy avoidance features. */
+ /* can we actually do this with DLPI, the world wonders */
+
+ if (dlpi_co_rr_request->so_rcvavoid) {
+#ifdef SO_RCV_COPYAVOID
+ dlpi_co_rr_response->so_rcvavoid = 0;
+#else
+ /* it wasn't compiled in... */
+ dlpi_co_rr_response->so_rcvavoid = 0;
+#endif
+ }
+
+ if (dlpi_co_rr_request->so_sndavoid) {
+#ifdef SO_SND_COPYAVOID
+ dlpi_co_rr_response->so_sndavoid = 0;
+#else
+ /* it wasn't compiled in... */
+ dlpi_co_rr_response->so_sndavoid = 0;
+#endif
+ }
+
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a 0.0 to */
+ /* the initiator. */
+
+ dlpi_co_rr_response->cpu_rate = 0.0; /* assume no cpu */
+ if (dlpi_co_rr_request->measure_cpu) {
+ dlpi_co_rr_response->measure_cpu = 1;
+ dlpi_co_rr_response->cpu_rate = calibrate_local_cpu(dlpi_co_rr_request->cpu_rate);
+ }
+
+ send_response();
+
+ /* accept a connection on this file descriptor. at some point, */
+ /* dl_accept will "do the right thing" with the last two parms, but */
+ /* for now it ignores them, so we will pass zeros. */
+
+ if(dl_accept(data_descriptor, 0, 0) != 0) {
+ fprintf(where,
+ "recv_dlpi_co_rr: error in accept, errno %d\n",
+ errno);
+ fflush(where);
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_dlpi_co_rr: accept completes on the data connection.\n");
+ fflush(where);
+ }
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(dlpi_co_rr_request->measure_cpu);
+
+ /* The loop will exit when the sender does a shutdown, which will */
+ /* return a length of zero */
+
+ if (dlpi_co_rr_request->test_length > 0) {
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(dlpi_co_rr_request->test_length + PAD_TIME);
+ }
+else {
+ times_up = 1;
+ trans_remaining = dlpi_co_rr_request->test_length * -1;
+}
+
+ while ((!times_up) || (trans_remaining > 0)) {
+ request_bytes_remaining = dlpi_co_rr_request->request_size;
+
+ /* receive the request from the other side. there needs to be some */
+ /* more login in place for handling messages larger than link mtu, */
+ /* but that can wait for later */
+ while(request_bytes_remaining > 0) {
+ if((getmsg(data_descriptor,
+ 0,
+ &recv_message,
+ &flags)) < 0) {
+ if (errno == EINTR) {
+ /* the timer popped */
+ timed_out = 1;
+ break;
+ }
+
+ if (debug) {
+ fprintf(where,"failed getmsg call errno %d\n",errno);
+ fprintf(where,"recv_message.len %d\n",recv_message.len);
+ fprintf(where,"send_message.len %d\n",send_message.len);
+ fflush(where);
+ }
+
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+ else {
+ request_bytes_remaining -= recv_message.len;
+ }
+ }
+
+ if (timed_out) {
+ /* we hit the end of the test based on time - lets bail out of */
+ /* here now... */
+ break;
+ }
+
+ if (debug) {
+ fprintf(where,"recv_message.len %d\n",recv_message.len);
+ fprintf(where,"send_message.len %d\n",send_message.len);
+ fflush(where);
+ }
+
+ /* Now, send the response to the remote */
+ if((putmsg(data_descriptor,
+ 0,
+ &send_message,
+ 0)) != 0) {
+ if (errno == EINTR) {
+ /* the test timer has popped */
+ timed_out = 1;
+ break;
+ }
+ netperf_response.content.serv_errno = 994;
+ send_response();
+ exit(1);
+ }
+
+ trans_received++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_dlpi_co_rr: Transaction %d complete\n",
+ trans_received);
+ fflush(where);
+ }
+ }
+
+
+ /* The loop now exits due to timeout or transaction count being */
+ /* reached */
+
+ cpu_stop(dlpi_co_rr_request->measure_cpu,&elapsed_time);
+
+ if (timed_out) {
+ /* we ended the test by time, which was at least 2 seconds */
+ /* longer than we wanted to run. so, we want to subtract */
+ /* PAD_TIME from the elapsed_time. */
+ elapsed_time -= PAD_TIME;
+ }
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_dlpi_co_rr: got %d transactions\n",
+ trans_received);
+ fflush(where);
+ }
+
+ dlpi_co_rr_results->bytes_received = (trans_received *
+ (dlpi_co_rr_request->request_size +
+ dlpi_co_rr_request->response_size));
+ dlpi_co_rr_results->trans_received = trans_received;
+ dlpi_co_rr_results->elapsed_time = elapsed_time;
+ if (dlpi_co_rr_request->measure_cpu) {
+ dlpi_co_rr_results->cpu_util = calc_cpu_util(elapsed_time);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_dlpi_co_rr: test complete, sending results.\n");
+ fflush(where);
+ }
+
+ send_response();
+
+}
+
+/* this routine will display the usage string for the DLPI tests */
+void
+ print_dlpi_usage()
+
+{
+ fwrite(dlpi_usage, sizeof(char), strlen(dlpi_usage), stdout);
+}
+
+
+/* this routine will scan the command line for DLPI test arguments */
+void
+ scan_dlpi_args(int argc, char *argv[])
+{
+ extern int optind, opterrs; /* index of first unused arg */
+ extern char *optarg; /* pointer to option string */
+
+ int c;
+
+ char arg1[BUFSIZ], /* argument holders */
+ arg2[BUFSIZ];
+
+ if (no_control) {
+ fprintf(where,
+ "The DLPI tests do not know how to run with no control connection\n");
+ exit(-1);
+ }
+
+ /* Go through all the command line arguments and break them */
+ /* out. For those options that take two parms, specifying only */
+ /* the first will set both to that value. Specifying only the */
+ /* second will leave the first untouched. To change only the */
+ /* first, use the form first, (see the routine break_args.. */
+
+#define DLPI_ARGS "D:hM:m:p:r:s:W:w:"
+
+ while ((c= getopt(argc, argv, DLPI_ARGS)) != EOF) {
+ switch (c) {
+ case '?':
+ case 'h':
+ print_dlpi_usage();
+ exit(1);
+ case 'D':
+ /* set the dlpi device file name(s) */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ strcpy(loc_dlpi_device,arg1);
+ if (arg2[0])
+ strcpy(rem_dlpi_device,arg2);
+ break;
+ case 'm':
+ /* set the send size */
+ send_size = atoi(optarg);
+ break;
+ case 'M':
+ /* set the recv size */
+ recv_size = atoi(optarg);
+ break;
+ case 'p':
+ /* set the local/remote ppa */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ loc_ppa = atoi(arg1);
+ if (arg2[0])
+ rem_ppa = atoi(arg2);
+ break;
+ case 'r':
+ /* set the request/response sizes */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ req_size = atoi(arg1);
+ if (arg2[0])
+ rsp_size = atoi(arg2);
+ break;
+ case 's':
+ /* set the 802.2 sap for the test */
+ dlpi_sap = atoi(optarg);
+ break;
+ case 'w':
+ /* set local window sizes */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ lsw_size = atoi(arg1);
+ if (arg2[0])
+ lrw_size = atoi(arg2);
+ break;
+ case 'W':
+ /* set remote window sizes */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ rsw_size = atoi(arg1);
+ if (arg2[0])
+ rrw_size = atoi(arg2);
+ break;
+ };
+ }
+}
+
+
+#endif /* WANT_DLPI */
diff --git a/nettest_dlpi.h b/nettest_dlpi.h
new file mode 100644
index 0000000..8169237
--- /dev/null
+++ b/nettest_dlpi.h
@@ -0,0 +1,215 @@
+/*
+ Copyright (C) 1993, Hewlett-Packard Company
+*/
+
+ /* This file contains the test-specific definitions for netperf's */
+ /* DLPI tests */
+
+
+struct dlpi_co_stream_request_struct {
+ int recv_win_size;
+ int send_win_size;
+ int receive_size; /* how many bytes do we want to */
+ /* receive at one time? */
+ int recv_alignment; /* what is the alignment of the */
+ /* receive buffer? */
+ int recv_offset; /* and at what offset from that */
+ /* alignment? */
+ int measure_cpu; /* does the client want server cpu */
+ /* utilization measured? */
+ float cpu_rate; /* do we know how fast the cpu is */
+ /* already? */
+ int test_length; /* how long is the test? */
+ int so_rcvavoid; /* do we want the remote to avoid */
+ /* copies on receives? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int dirty_count; /* how many integers in the receive buffer */
+ /* should be made dirty before calling recv? */
+ int clean_count; /* how many integers should be read from the */
+ /* recv buffer before calling recv? */
+ int sap; /* */
+ int ppa; /* which device do we wish to use? */
+ int dev_name_len; /* the length of the device name string. this */
+ /* is used to put it into the proper order on */
+ /* @#$% byte-swapped boxes... */
+ char dlpi_device[32]; /* the path to the dlpi device */
+};
+
+struct dlpi_co_stream_response_struct {
+ int recv_win_size; /* how big does the client want it */
+ int send_win_size;
+ int receive_size;
+ int measure_cpu; /* does the client want server cpu */
+ int test_length; /* how long is the test? */
+ int data_port_number; /* connect to me here */
+ float cpu_rate; /* could we measure */
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+ int station_addr_len;
+ int station_addr[1];/* what is the station address for the */
+ /* specified ppa? */
+};
+
+struct dlpi_co_stream_results_struct {
+ int bytes_received; /* ignored initially */
+ int recv_calls; /* ignored initially */
+ float elapsed_time; /* how long the test ran */
+ float cpu_util; /* -1 if not measured */
+ float serv_dem; /* -1 if not measured */
+ int cpu_method; /* how was CPU util measured? */
+ int num_cpus; /* how many CPUs were there? */
+};
+
+struct dlpi_co_rr_request_struct {
+ int recv_win_size; /* how big does the client want it */
+ int send_win_size;
+ int recv_alignment;
+ int recv_offset;
+ int send_alignment;
+ int send_offset;
+ int request_size;
+ int response_size;
+ int measure_cpu; /* does the client want server cpu */
+ float cpu_rate; /* do we know how fast the cpu is? */
+ int test_length; /* how long is the test? */
+ int so_rcvavoid; /* do we want the remote to avoid receive copies? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int ppa; /* which device do we wish to use? */
+ int sap; /* which sap should be used? */
+ int dev_name_len; /* the length of the device name string. this */
+ /* is used to put it into the proper order on */
+ /* @#$% byte-swapped boxes... */
+ char dlpi_device[32]; /* the path to the dlpi device */
+};
+
+struct dlpi_co_rr_response_struct {
+ int recv_win_size; /* how big does the client want it */
+ int send_win_size;
+ int measure_cpu; /* does the client want server cpu */
+ int test_length; /* how long is the test? */
+ int data_port_number; /* connect to me here */
+ float cpu_rate; /* could we measure */
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+ int station_addr_len; /* the length of the station address */
+ int station_addr[1]; /* the remote's station address */
+};
+
+struct dlpi_co_rr_results_struct {
+ int bytes_received; /* ignored initially */
+ int recv_calls; /* ignored initially */
+ int trans_received; /* not ignored */
+ float elapsed_time; /* how long the test ran */
+ float cpu_util; /* -1 if not measured */
+ float serv_dem; /* -1 if not measured */
+ int cpu_method; /* how was CPU util measured? */
+ int num_cpus; /* how many CPUs were there? */
+};
+
+struct dlpi_cl_stream_request_struct {
+ int recv_win_size;
+ int message_size;
+ int recv_alignment;
+ int recv_offset;
+ int checksum_off;
+ int measure_cpu;
+ float cpu_rate;
+ int test_length;
+ int so_rcvavoid; /* do we want the remote to avoid receive copies? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int ppa; /* which device do we wish to use? */
+ int sap;
+ int dev_name_len; /* the length of the device name string. this */
+ /* is used to put it into the proper order on */
+ /* @#$% byte-swapped boxes... */
+ char dlpi_device[32]; /* the path to the dlpi device */
+};
+
+struct dlpi_cl_stream_response_struct {
+ int recv_win_size;
+ int send_win_size;
+ int measure_cpu;
+ int test_length;
+ int data_port_number;
+ float cpu_rate;
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+ int station_addr_len; /* the length of the station address */
+ int station_addr[1]; /* the remote's station address */
+};
+
+struct dlpi_cl_stream_results_struct {
+ int messages_recvd;
+ int bytes_received;
+ float elapsed_time;
+ float cpu_util;
+ int num_cpus;
+};
+
+
+struct dlpi_cl_rr_request_struct {
+ int recv_win_size; /* how big does the client want it */
+ int send_win_size;
+ int recv_alignment;
+ int recv_offset;
+ int send_alignment;
+ int send_offset;
+ int request_size;
+ int response_size;
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ float cpu_rate; /* do we know how fast the cpu is? */
+ int test_length; /* how long is the test? */
+ int so_rcvavoid; /* do we want the remote to avoid receive */
+ /* copies? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int ppa; /* which device do we wish to use? */
+ int sap; /* which sap? */
+ int dev_name_len; /* the length of the device name string. this */
+ /* is used to put it into the proper order on */
+ /* @#$% byte-swapped boxes... */
+ char dlpi_device[32]; /* the path to the dlpi device */
+};
+
+struct dlpi_cl_rr_response_struct {
+ int recv_win_size; /* how big does the client want it */
+ int send_win_size;
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ int test_length; /* how long is the test? */
+ int data_port_number; /* connect to me here */
+ float cpu_rate; /* could we measure */
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+ int station_addr_len; /* the length of the station address */
+ int station_addr[1]; /* the remote's station address */
+};
+
+struct dlpi_cl_rr_results_struct {
+ int bytes_received; /* ignored initially */
+ int recv_calls; /* ignored initially */
+ int trans_received; /* not ignored */
+ float elapsed_time; /* how long the test ran */
+ float cpu_util; /* -1 if not measured */
+ float serv_dem; /* -1 if not measured */
+ int cpu_method; /* how was CPU util measured? */
+ int num_cpus; /* how many CPUs were there? */
+};
+
+extern void send_dlpi_co_stream();
+
+extern int recv_dlpi_co_stream();
+
+extern int send_dlpi_co_rr(char remote_host[]);
+
+extern void send_dlpi_cl_stream(char remote_host[]);
+
+extern int recv_dlpi_cl_stream();
+
+extern int send_dlpi_cl_rr(char remote_host[]);
+
+extern int recv_dlpi_cl_rr();
+
+extern int recv_dlpi_co_rr();
+
+extern void scan_dlpi_args(int argc, char *argv[]);
diff --git a/nettest_sctp.c b/nettest_sctp.c
new file mode 100644
index 0000000..7cfcd9f
--- /dev/null
+++ b/nettest_sctp.c
@@ -0,0 +1,4869 @@
+#ifndef lint
+char nettest_sctp[]="\
+@(#)nettest_sctp.c (c) Copyright 2005-2007 Hewlett-Packard Co. Version 2.4.3";
+#else
+#define DIRTY
+#define WANT_HISTOGRAM
+#define WANT_INTERVALS
+#endif /* lint */
+
+/****************************************************************/
+/* */
+/* nettest_sctp.c */
+/* */
+/* */
+/* scan_sctp_args() get the sctp command line args */
+/* */
+/* the actual test routines... */
+/* */
+/* send_sctp_stream() perform a sctp stream test */
+/* recv_sctp_stream() */
+/* send_sctp_rr() perform a sctp request/response */
+/* recv_sctp_rr() */
+/* send_sctp_stream_udp() perform a sctp request/response */
+/* recv_sctp_stream_upd() using UDP style API */
+/* send_sctp_rr_udp() perform a sctp request/response */
+/* recv_sctp_rr_upd() using UDP style API */
+/* */
+/* relies on create_data_socket in nettest_bsd.c */
+/****************************************************************/
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if defined(WANT_SCTP)
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#ifdef NOSTDLIBH
+#include <malloc.h>
+#else /* NOSTDLIBH */
+#include <stdlib.h>
+#endif /* NOSTDLIBH */
+
+#if !defined(__VMS)
+#include <sys/ipc.h>
+#endif /* !defined(__VMS) */
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <netinet/sctp.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+/* would seem that not all sctp.h files define a MSG_EOF, but that
+ MSG_EOF can be the same as MSG_FIN so lets work with that
+ assumption. initial find by Jon Pedersen. raj 2006-02-01 */
+#ifndef MSG_EOF
+#ifdef MSG_FIN
+#define MSG_EOF MSG_FIN
+#else
+#error Must have either MSG_EOF or MSG_FIN defined
+#endif
+#endif
+
+#include "netlib.h"
+#include "netsh.h"
+/* get some of the functions from nettest_bsd.c */
+#include "nettest_bsd.h"
+#include "nettest_sctp.h"
+
+#ifdef WANT_HISTOGRAM
+#ifdef __sgi
+#include <sys/time.h>
+#endif /* __sgi */
+#include "hist.h"
+#endif /* WANT_HISTOGRAM */
+
+#ifdef WANT_FIRST_BURST
+extern int first_burst_size;
+#endif /* WANT_FIRST_BURST */
+
+
+
+/* these variables are specific to SCTP tests. declare */
+/* them static to make them global only to this file. */
+
+static int
+ msg_count = 0, /* number of messages to transmit on association */
+ non_block = 0, /* default to blocking sockets */
+ num_associations = 1; /* number of associations on the endpoint */
+
+static int confidence_iteration;
+static char local_cpu_method;
+static char remote_cpu_method;
+
+#ifdef WANT_HISTOGRAM
+static struct timeval time_one;
+static struct timeval time_two;
+static HIST time_hist;
+#endif /* WANT_HISTOGRAM */
+
+
+char sctp_usage[] = "\n\
+Usage: netperf [global options] -- [test options] \n\
+\n\
+SCTP Sockets Test Options:\n\
+ -b number Send number requests at the start of _RR tests\n\
+ -D [L][,R] Set SCTP_NODELAY locally and/or remotely\n\
+ -h Display this text\n\
+ -H name,fam Use name (or IP) and family as target of data connection\n\
+ -L name,fam Use name (or IP) and family as source of data connextion\n\
+ -m bytes Set the size of each sent message\n\
+ -M bytes Set the size of each received messages\n\
+ -P local[,remote] Set the local/remote port for the data socket\n\
+ -r req,[rsp] Set request/response sizes (_RR tests)\n\
+ -s send[,recv] Set local socket send/recv buffer sizes\n\
+ -S send[,recv] Set remote socket send/recv buffer sizes\n\
+ -V Enable copy avoidance if supported\n\
+ -N number Specifies the number of messages to send (_STREAM tests)\n\
+ -B run the test in non-blocking mode\n\
+ -T number Number of associations to create (_MANY tests)\n\
+ -4 Use AF_INET (eg IPv4) on both ends of the data conn\n\
+ -6 Use AF_INET6 (eg IPv6) on both ends of the data conn\n\
+\n\
+For those options taking two parms, at least one must be specified;\n\
+specifying one value without a comma will set both parms to that\n\
+value, specifying a value with a leading comma will set just the second\n\
+parm, a value with a trailing comma will set just the first. To set\n\
+each parm to unique values, specify both and separate them with a\n\
+comma.\n";
+
+
+ /* This routine is intended to retrieve interesting aspects of tcp */
+ /* for the data connection. at first, it attempts to retrieve the */
+ /* maximum segment size. later, it might be modified to retrieve */
+ /* other information, but it must be information that can be */
+ /* retrieved quickly as it is called during the timing of the test. */
+ /* for that reason, a second routine may be created that can be */
+ /* called outside of the timing loop */
+static
+void
+get_sctp_info(socket, mss)
+ int socket;
+ int *mss;
+{
+
+ int sock_opt_len;
+
+ if (sctp_opt_info(socket,
+ 0,
+ SCTP_MAXSEG,
+ mss,
+ &sock_opt_len) < 0) {
+ lss_size = -1;
+ }
+}
+
+
+static
+void
+sctp_enable_events(socket, ev_mask)
+ int socket;
+ int ev_mask;
+{
+ struct sctp_event_subscribe ev;
+
+ bzero(&ev, sizeof(ev));
+
+ if (ev_mask & SCTP_SNDRCV_INFO_EV)
+ ev.sctp_data_io_event = 1;
+
+ if (ev_mask & SCTP_ASSOC_CHANGE_EV)
+ ev.sctp_association_event = 1;
+
+ if (ev_mask & SCTP_PEERADDR_CHANGE_EV)
+ ev.sctp_address_event = 1;
+
+ if (ev_mask & SCTP_SND_FAILED_EV)
+ ev.sctp_send_failure_event = 1;
+
+ if (ev_mask & SCTP_REMOTE_ERROR_EV)
+ ev.sctp_peer_error_event = 1;
+
+ if (ev_mask & SCTP_SHUTDOWN_EV)
+ ev.sctp_shutdown_event = 1;
+
+ if (ev_mask & SCTP_PD_EV)
+ ev.sctp_partial_delivery_event = 1;
+
+ if (ev_mask & SCTP_ADAPT_EV)
+#ifdef HAVE_SCTP_ADAPTATION_LAYER_EVENT
+ ev.sctp_adaptation_layer_event = 1;
+#else
+ ev.sctp_adaption_layer_event = 1;
+#endif
+
+ if (setsockopt(socket,
+ IPPROTO_SCTP,
+#ifdef SCTP_EVENTS
+ SCTP_EVENTS,
+#else
+ SCTP_SET_EVENTS,
+#endif
+ (const char*)&ev,
+ sizeof(ev)) != 0 ) {
+ fprintf(where,
+ "sctp_enable_event: could not set sctp events errno %d\n",
+ errno);
+ fflush(where);
+ exit(1);
+ }
+}
+
+
+static
+sctp_disposition_t
+sctp_process_event(socket, buf)
+ int socket;
+ void *buf;
+{
+
+ struct sctp_assoc_change *sac;
+ struct sctp_send_failed *ssf;
+ struct sctp_paddr_change *spc;
+ struct sctp_remote_error *sre;
+ union sctp_notification *snp;
+
+ snp = buf;
+
+ switch (snp->sn_header.sn_type) {
+ case SCTP_ASSOC_CHANGE:
+ if (debug) {
+ fprintf(where, "\tSCTP_ASSOC_CHANGE event, type:");
+ fflush(where);
+ }
+ sac = &snp->sn_assoc_change;
+ switch (sac->sac_type) {
+ case SCTP_COMM_UP:
+ if (debug) {
+ fprintf(where, " SCTP_COMM_UP\n");
+ fflush(where);
+ }
+ break;
+ case SCTP_RESTART:
+ if (debug) {
+ fprintf(where, " SCTP_RESTART\n");
+ fflush(where);
+ }
+ break;
+ case SCTP_CANT_STR_ASSOC:
+ if (debug) {
+ fprintf(where, " SCTP_CANT_STR_ASSOC\n");
+ fflush(where);
+ }
+ break; /* FIXME ignore above status changes */
+ case SCTP_COMM_LOST:
+ if (debug) {
+ fprintf(where, " SCTP_COMM_LOST\n");
+ fflush(where);
+ }
+ return SCTP_CLOSE;
+ case SCTP_SHUTDOWN_COMP:
+ if (debug) {
+ fprintf(where, " SCTP_SHUTDOWN_COMPLETE\n");
+ fflush(where);
+ }
+ return SCTP_CLOSE;
+ break;
+ }
+
+ case SCTP_SEND_FAILED:
+ if (debug) {
+ fprintf(where, "\tSCTP_SEND_FAILED event\n");
+ fflush(where);
+ }
+ ssf = &snp->sn_send_failed;
+ break; /* FIXME ??? ignore this for now */
+
+ case SCTP_PEER_ADDR_CHANGE:
+ if (debug) {
+ fprintf(where, "\tSCTP_PEER_ADDR_CHANGE event\n");
+ fflush(where);
+ }
+ spc = &snp->sn_paddr_change;
+ break; /* FIXME ??? ignore this for now */
+
+ case SCTP_REMOTE_ERROR:
+ if (debug) {
+ fprintf(where, "\tSCTP_REMOTE_ERROR event\n");
+ fflush(where);
+ }
+ sre = &snp->sn_remote_error;
+ break; /* FIXME ??? ignore this for now */
+ case SCTP_SHUTDOWN_EVENT:
+ if (debug) {
+ fprintf(where, "\tSCTP_SHUTDOWN event\n");
+ fflush(where);
+ }
+ return SCTP_CLOSE;
+ default:
+ fprintf(where, "unknown type: %hu\n", snp->sn_header.sn_type);
+ fflush(where);
+ break;
+ }
+ return SCTP_OK;
+}
+
+
+
+/* This routine implements the SCTP unidirectional data transfer test */
+/* (a.k.a. stream) for the sockets interface. It receives its */
+/* parameters via global variables from the shell and writes its */
+/* output to the standard output. */
+
+
+void
+send_sctp_stream(remote_host)
+char remote_host[];
+{
+
+ char *tput_title = "\
+Recv Send Send \n\
+Socket Socket Message Elapsed \n\
+Size Size Size Time Throughput \n\
+bytes bytes bytes secs. %s/sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1 =
+ "%6d %6d %6d %-6.2f %7.2f \n";
+
+ char *cpu_title = "\
+Recv Send Send Utilization Service Demand\n\
+Socket Socket Message Elapsed Send Recv Send Recv\n\
+Size Size Size Time Throughput local remote local remote\n\
+bytes bytes bytes secs. %-8.8s/s %% %c %% %c us/KB us/KB\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f %c\n";
+
+ char *cpu_fmt_1 =
+ "%6d %6d %6d %-6.2f %7.2f %-6.2f %-6.2f %-6.3f %-6.3f\n";
+
+ char *ksink_fmt = "\n\
+Alignment Offset %-8.8s %-8.8s Sends %-8.8s Recvs\n\
+Local Remote Local Remote Xfered Per Per\n\
+Send Recv Send Recv Send (avg) Recv (avg)\n\
+%5d %5d %5d %5d %6.4g %6.2f %6d %6.2f %6d\n";
+
+ char *ksink_fmt2 = "\n\
+Maximum\n\
+Segment\n\
+Size (bytes)\n\
+%6d\n";
+
+
+ float elapsed_time;
+
+#ifdef WANT_INTERVALS
+ int interval_count;
+ sigset_t signal_set;
+#endif
+
+ /* what we want is to have a buffer space that is at least one */
+ /* send-size greater than our send window. this will insure that we */
+ /* are never trying to re-use a buffer that may still be in the hands */
+ /* of the transport. This buffer will be malloc'd after we have found */
+ /* the size of the local senc socket buffer. We will want to deal */
+ /* with alignment and offset concerns as well. */
+
+#ifdef DIRTY
+ int *message_int_ptr;
+#endif
+
+ struct ring_elt *send_ring;
+
+ int len;
+ unsigned int nummessages = 0;
+ int send_socket;
+ int bytes_remaining;
+ int sctp_mss;
+ int timed_out;
+
+ /* with links like fddi, one can send > 32 bits worth of bytes */
+ /* during a test... ;-) at some point, this should probably become a */
+ /* 64bit integral type, but those are not entirely common yet */
+ double bytes_sent = 0.0;
+
+#ifdef DIRTY
+ int i;
+#endif /* DIRTY */
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+
+ double thruput;
+
+ struct addrinfo *remote_res;
+ struct addrinfo *local_res;
+ struct addrinfo *local_remote_res;
+ struct addrinfo *local_local_res;
+
+ struct sctp_stream_request_struct *sctp_stream_request;
+ struct sctp_stream_response_struct *sctp_stream_response;
+ struct sctp_stream_results_struct *sctp_stream_result;
+
+ sctp_stream_request =
+ (struct sctp_stream_request_struct *)netperf_request.content.test_specific_data;
+ sctp_stream_response =
+ (struct sctp_stream_response_struct *)netperf_response.content.test_specific_data;
+ sctp_stream_result =
+ (struct sctp_stream_results_struct *)netperf_response.content.test_specific_data;
+
+#ifdef WANT_HISTOGRAM
+ time_hist = HIST_new();
+#endif /* WANT_HISTOGRAM */
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ /* complete_addrinfos will either succede or exit the process */
+ complete_addrinfos(&remote_res,
+ &local_res,
+ remote_host,
+ SOCK_STREAM,
+ IPPROTO_SCTP,
+ 0);
+
+ if ( print_headers ) {
+ print_top_test_header("SCTP STREAM TEST", local_res, remote_res);
+ }
+
+ send_ring = NULL;
+ confidence_iteration = 1;
+ init_stat();
+
+ /* we have a great-big while loop which controls the number of times */
+ /* we run a particular test. this is for the calculation of a */
+ /* confidence interval (I really should have stayed awake during */
+ /* probstats :). If the user did not request confidence measurement */
+ /* (no confidence is the default) then we will only go though the */
+ /* loop once. the confidence stuff originates from the folks at IBM */
+
+ while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
+ (confidence_iteration <= iteration_min)) {
+
+ /* initialize a few counters. we have to remember that we might be */
+ /* going through the loop more than once. */
+
+ nummessages = 0;
+ bytes_sent = 0.0;
+ times_up = 0;
+ timed_out = 0;
+
+ /*set up the data socket */
+ send_socket = create_data_socket(local_res);
+
+ if (send_socket == INVALID_SOCKET){
+ perror("netperf: send_sctp_stream: sctp stream data socket");
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"send_sctp_stream: send_socket obtained...\n");
+ }
+
+ /* at this point, we have either retrieved the socket buffer sizes, */
+ /* or have tried to set them, so now, we may want to set the send */
+ /* size based on that (because the user either did not use a -m */
+ /* option, or used one with an argument of 0). If the socket buffer */
+ /* size is not available, we will set the send size to 4KB - no */
+ /* particular reason, just arbitrary... */
+ if (send_size == 0) {
+ if (lss_size > 0) {
+ send_size = lss_size;
+ }
+ else {
+ send_size = 4096;
+ }
+ }
+
+ /* set-up the data buffer ring with the requested alignment and offset. */
+ /* note also that we have allocated a quantity */
+ /* of memory that is at least one send-size greater than our socket */
+ /* buffer size. We want to be sure that there are at least two */
+ /* buffers allocated - this can be a bit of a problem when the */
+ /* send_size is bigger than the socket size, so we must check... the */
+ /* user may have wanted to explicitly set the "width" of our send */
+ /* buffers, we should respect that wish... */
+ if (send_width == 0) {
+ send_width = (lss_size/send_size) + 1;
+ if (send_width == 1) send_width++;
+ }
+
+ if (send_ring == NULL) {
+ /* only allocate the send ring once. this is a networking test, */
+ /* not a memory allocation test. this way, we do not need a */
+ /* deallocate_buffer_ring() routine, and I don't feel like */
+ /* writing one anyway :) raj 11/94 */
+ send_ring = allocate_buffer_ring(send_width,
+ send_size,
+ local_send_align,
+ local_send_offset);
+ }
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back. */
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ /* Tell the remote end to do a listen. The server alters the socket */
+ /* paramters on the other side at this point, hence the reason for */
+ /* all the values being passed in the setup message. If the user did */
+ /* not specify any of the parameters, they will be passed as 0, which */
+ /* will indicate to the remote that no changes beyond the system's */
+ /* default should be used. Alignment is the exception, it will */
+ /* default to 1, which will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_SCTP_STREAM;
+ sctp_stream_request->send_buf_size = rss_size_req;
+ sctp_stream_request->recv_buf_size = rsr_size_req;
+ sctp_stream_request->receive_size = recv_size;
+ sctp_stream_request->no_delay = rem_nodelay;
+ sctp_stream_request->recv_alignment = remote_recv_align;
+ sctp_stream_request->recv_offset = remote_recv_offset;
+ sctp_stream_request->measure_cpu = remote_cpu_usage;
+ sctp_stream_request->cpu_rate = remote_cpu_rate;
+ if (test_time) {
+ sctp_stream_request->test_length = test_time;
+ }
+ else {
+ if (msg_count)
+ test_bytes = send_size * msg_count;
+
+ sctp_stream_request->test_length = test_bytes;
+ }
+ sctp_stream_request->so_rcvavoid = rem_rcvavoid;
+ sctp_stream_request->so_sndavoid = rem_sndavoid;
+#ifdef DIRTY
+ sctp_stream_request->dirty_count = rem_dirty_count;
+ sctp_stream_request->clean_count = rem_clean_count;
+#endif /* DIRTY */
+ sctp_stream_request->port = htonl(atoi(remote_data_port));
+ sctp_stream_request->ipfamily = af_to_nf(remote_res->ai_family);
+ sctp_stream_request->non_blocking = non_block;
+
+
+ if (debug > 1) {
+ fprintf(where,
+ "netperf: send_sctp_stream: requesting sctp stream test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant */
+ /* socket parameters for this test type. We will put them back into */
+ /* the variables here so they can be displayed if desired. The */
+ /* remote will have calibrated CPU if necessary, and will have done */
+ /* all the needed set-up we will have calibrated the cpu locally */
+ /* before sending the request, and will grab the counter value right*/
+ /* after the connect returns. The remote will grab the counter right*/
+ /* after the accept call. This saves the hassle of extra messages */
+ /* being sent for the sctp tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote listen done.\n");
+ rsr_size = sctp_stream_response->recv_buf_size;
+ rss_size = sctp_stream_response->send_buf_size;
+ rem_nodelay = sctp_stream_response->no_delay;
+ remote_cpu_usage= sctp_stream_response->measure_cpu;
+ remote_cpu_rate = sctp_stream_response->cpu_rate;
+
+ /* we have to make sure that the server port number is in */
+ /* network order */
+ set_port_number(remote_res, (short)sctp_stream_response->data_port_number);
+
+ rem_rcvavoid = sctp_stream_response->so_rcvavoid;
+ rem_sndavoid = sctp_stream_response->so_sndavoid;
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+
+ /*Connect up to the remote port on the data socket */
+ if (connect(send_socket,
+ remote_res->ai_addr,
+ remote_res->ai_addrlen) == INVALID_SOCKET) {
+ perror("netperf: send_sctp_stream: data socket connect failed");
+ exit(1);
+ }
+
+ sctp_enable_events(send_socket, SCTP_ASSOC_CHANGE_EV);
+
+ if (non_block) {
+ /* now that we are connected, mark the socket as non-blocking */
+ if (!set_nonblock(send_socket)) {
+ perror("netperf: fcntl");
+ exit(1);
+ }
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either */
+ /* the connect would have failed, or the previous response would */
+ /* have indicated a problem. I failed to see the value of the */
+ /* extra message after the accept on the remote. If it failed, */
+ /* we'll see it here. If it didn't, we might as well start pumping */
+ /* data. */
+
+ /* Set-up the test end conditions. For a stream test, they can be */
+ /* either time or byte-count based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ bytes_remaining = 0;
+ /* in previous revisions, we had the same code repeated throught */
+ /* all the test suites. this was unnecessary, and meant more */
+ /* work for me when I wanted to switch to POSIX signals, so I */
+ /* have abstracted this out into a routine in netlib.c. if you */
+ /* are experiencing signal problems, you might want to look */
+ /* there. raj 11/94 */
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ bytes_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+#ifdef WANT_INTERVALS
+ if ((interval_burst) || (demo_mode)) {
+ /* zero means that we never pause, so we never should need the */
+ /* interval timer, unless we are in demo_mode */
+ start_itimer(interval_wate);
+ }
+ interval_count = interval_burst;
+ /* get the signal set for the call to sigsuspend */
+ if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &signal_set) != 0) {
+ fprintf(where,
+ "send_sctp_stream: unable to get sigmask errno %d\n",
+ errno);
+ fflush(where);
+ exit(1);
+ }
+#endif /* WANT_INTERVALS */
+
+#ifdef DIRTY
+ /* initialize the random number generator for putting dirty stuff */
+ /* into the send buffer. raj */
+ srand((int) getpid());
+#endif
+
+ /* before we start, initialize a few variables */
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return false. */
+ /* When the test is controlled by byte count, the time test will */
+ /* always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. */
+
+ while ((!times_up) || (bytes_remaining > 0)) {
+
+#ifdef DIRTY
+ /* we want to dirty some number of consecutive integers in the buffer */
+ /* we are about to send. we may also want to bring some number of */
+ /* them cleanly into the cache. The clean ones will follow any dirty */
+ /* ones into the cache. at some point, we might want to replace */
+ /* the rand() call with something from a table to reduce our call */
+ /* overhead during the test, but it is not a high priority item. */
+ message_int_ptr = (int *)(send_ring->buffer_ptr);
+ for (i = 0; i < loc_dirty_count; i++) {
+ *message_int_ptr = rand();
+ message_int_ptr++;
+ }
+ for (i = 0; i < loc_clean_count; i++) {
+ loc_dirty_count = *message_int_ptr;
+ message_int_ptr++;
+ }
+#endif /* DIRTY */
+
+#ifdef WANT_HISTOGRAM
+ /* timestamp just before we go into send and then again just after */
+ /* we come out raj 8/94 */
+ HIST_timestamp(&time_one);
+#endif /* WANT_HISTOGRAM */
+
+ while ((len=sctp_sendmsg(send_socket,
+ send_ring->buffer_ptr, send_size,
+ NULL, 0,
+ 0, 0, 0, 0, 0)) != send_size) {
+ if (non_block && errno == EAGAIN)
+ continue;
+ else if ((len >=0) || SOCKET_EINTR(len)) {
+ /* the test was interrupted, must be the end of test */
+ timed_out = 1;
+ break;
+ }
+ perror("netperf: data send error");
+ printf("len was %d\n",len);
+ exit(1);
+ }
+
+ if (timed_out)
+ break; /* we timed out durint sendmsg, done with test */
+
+#ifdef WANT_HISTOGRAM
+ /* timestamp the exit from the send call and update the histogram */
+ HIST_timestamp(&time_two);
+ HIST_add(time_hist,delta_micro(&time_one,&time_two));
+#endif /* WANT_HISTOGRAM */
+
+#ifdef WANT_INTERVALS
+ if (demo_mode) {
+ units_this_tick += send_size;
+ }
+ /* in this case, the interval count is the count-down couter */
+ /* to decide to sleep for a little bit */
+ if ((interval_burst) && (--interval_count == 0)) {
+ /* call sigsuspend and wait for the interval timer to get us */
+ /* out */
+ if (debug > 1) {
+ fprintf(where,"about to suspend\n");
+ fflush(where);
+ }
+ if (sigsuspend(&signal_set) == EFAULT) {
+ fprintf(where,
+ "send_sctp_stream: fault with sigsuspend.\n");
+ fflush(where);
+ exit(1);
+ }
+ interval_count = interval_burst;
+ }
+#endif /* WANT_INTERVALS */
+
+ /* now we want to move our pointer to the next position in the */
+ /* data buffer...we may also want to wrap back to the "beginning" */
+ /* of the bufferspace, so we will mod the number of messages sent */
+ /* by the send width, and use that to calculate the offset to add */
+ /* to the base pointer. */
+ nummessages++;
+ send_ring = send_ring->next;
+ if (bytes_remaining) {
+ bytes_remaining -= send_size;
+ }
+ }
+
+ /* The test is over. Flush the buffers to the remote end. We do a */
+ /* graceful release to insure that all data has been taken by the */
+ /* remote. */
+
+ /* but first, if the verbosity is greater than 1, find-out what */
+ /* the sctp maximum segment_size was (if possible) */
+ if (verbosity > 1) {
+ sctp_mss = -1;
+ get_sctp_info(send_socket, &sctp_mss);
+ }
+
+ shutdown(send_socket, SHUT_WR);
+
+ /* The test server will signal to us when it wants to shutdown.
+ * In blocking mode, we can call recvmsg. In non-blocking
+ * mode, we need to select on the socket for reading.
+ * We'll assume that all returns are succefull
+ */
+ if (non_block) {
+ fd_set readfds;
+
+ FD_ZERO(&readfds);
+ FD_SET(send_socket, &readfds);
+ select(send_socket+1, &readfds, NULL, NULL, NULL);
+ } else {
+ sctp_recvmsg(send_socket, send_ring->buffer_ptr, send_size, NULL,
+ 0, NULL, 0);
+ }
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being */
+ /* measured and how */
+ /* long did we really */
+ /* run? */
+
+ /* we are finished with the socket, so close it to prevent hitting */
+ /* the limit on maximum open files. */
+ close(send_socket);
+
+ /* Get the statistics from the remote end. The remote will have */
+ /* calculated service demand and all those interesting things. If it */
+ /* wasn't supposed to care, it will return obvious values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+
+ /* We now calculate what our thruput was for the test. In the future, */
+ /* we may want to include a calculation of the thruput measured by */
+ /* the remote, but it should be the case that for a sctp stream test, */
+ /* that the two numbers should be *very* close... We calculate */
+ /* bytes_sent regardless of the way the test length was controlled. */
+ /* If it was time, we needed to, and if it was by bytes, the user may */
+ /* have specified a number of bytes that wasn't a multiple of the */
+ /* send_size, so we really didn't send what he asked for ;-) */
+
+ bytes_sent = ntohd(sctp_stream_result->bytes_received);
+
+ thruput = (double) calc_thruput(bytes_sent);
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+
+ local_cpu_utilization = calc_cpu_util(0.0);
+ local_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ }
+
+ if (remote_cpu_usage) {
+
+ remote_cpu_utilization = sctp_stream_result->cpu_util;
+ remote_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ remote_cpu_utilization,
+ sctp_stream_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+ }
+ else {
+ /* we were not measuring cpu, for the confidence stuff, we */
+ /* should make it -1.0 */
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ /* at this point, we want to calculate the confidence information. */
+ /* if debugging is on, calculate_confidence will print-out the */
+ /* parameters we pass it */
+
+ calculate_confidence(confidence_iteration,
+ elapsed_time,
+ thruput,
+ local_cpu_utilization,
+ remote_cpu_utilization,
+ local_service_demand,
+ remote_service_demand);
+
+
+ confidence_iteration++;
+ }
+
+ /* at this point, we have finished making all the runs that we */
+ /* will be making. so, we should extract what the calcuated values */
+ /* are for all the confidence stuff. we could make the values */
+ /* global, but that seemed a little messy, and it did not seem worth */
+ /* all the mucking with header files. so, we create a routine much */
+ /* like calcualte_confidence, which just returns the mean values. */
+ /* raj 11/94 */
+
+ retrieve_confident_values(&elapsed_time,
+ &thruput,
+ &local_cpu_utilization,
+ &remote_cpu_utilization,
+ &local_service_demand,
+ &remote_service_demand);
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ if (confidence < 0) {
+ /* we did not hit confidence, but were we asked to look for it? */
+ if (iteration_max > 1) {
+ display_confidence();
+ }
+ }
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ local_cpu_method = format_cpu_method(cpu_method);
+ remote_cpu_method = format_cpu_method(sctp_stream_result->cpu_method);
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand,
+ local_cpu_method);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand,
+ remote_cpu_method);
+ }
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,
+ cpu_title,
+ format_units(),
+ local_cpu_method,
+ remote_cpu_method);
+ }
+
+ fprintf(where,
+ cpu_fmt_1, /* the format string */
+ rsr_size, /* remote recvbuf size */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long was the test */
+ thruput, /* what was the xfer rate */
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand); /* remote service demand */
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ thruput);
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,tput_title,format_units());
+ }
+ fprintf(where,
+ tput_fmt_1, /* the format string */
+ rsr_size, /* remote recvbuf size */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long did it take */
+ thruput);/* how fast did it go */
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* sctp statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ /* this stuff needs to be worked-out in the presence of confidence */
+ /* intervals and multiple iterations of the test... raj 11/94 */
+
+ fprintf(where,
+ ksink_fmt,
+ "Bytes",
+ "Bytes",
+ "Bytes",
+ local_send_align,
+ remote_recv_align,
+ local_send_offset,
+ remote_recv_offset,
+ bytes_sent,
+ bytes_sent / (double)nummessages,
+ nummessages,
+ bytes_sent / (double)sctp_stream_result->recv_calls,
+ sctp_stream_result->recv_calls);
+ fprintf(where,
+ ksink_fmt2,
+ sctp_mss);
+ fflush(where);
+#ifdef WANT_HISTOGRAM
+ fprintf(where,"\n\nHistogram of time spent in send() call.\n");
+ fflush(where);
+ HIST_report(time_hist);
+#endif /* WANT_HISTOGRAM */
+ }
+
+}
+
+
+
+
+/* This is the server-side routine for the sctp stream test. It is */
+/* implemented as one routine. I could break things-out somewhat, but */
+/* didn't feel it was necessary. */
+
+void
+recv_sctp_stream()
+{
+
+ struct sockaddr_in myaddr_in; /* needed to get port number */
+ struct sockaddr_storage peeraddr; /* used in accept */
+ int s_listen,s_data;
+ int addrlen;
+ int len;
+ unsigned int receive_calls;
+ float elapsed_time;
+ double bytes_received;
+
+ struct ring_elt *recv_ring;
+
+ struct addrinfo *local_res;
+ char local_name[BUFSIZ];
+ char port_buffer[PORTBUFSIZE];
+ int msg_flags = 0;
+
+#ifdef DIRTY
+ int *message_int_ptr;
+ int dirty_count;
+ int clean_count;
+ int i;
+#endif
+
+#ifdef DO_SELECT
+ fd_set readfds;
+ struct timeval timeout;
+#endif /* DO_SELECT */
+
+ struct sctp_stream_request_struct *sctp_stream_request;
+ struct sctp_stream_response_struct *sctp_stream_response;
+ struct sctp_stream_results_struct *sctp_stream_results;
+
+#ifdef DO_SELECT
+ FD_ZERO(&readfds);
+ timeout.tv_sec = 1;
+ timeout.tv_usec = 0;
+#endif /* DO_SELECT */
+
+ sctp_stream_request =
+ (struct sctp_stream_request_struct *)netperf_request.content.test_specific_data;
+ sctp_stream_response =
+ (struct sctp_stream_response_struct *)netperf_response.content.test_specific_data;
+ sctp_stream_results =
+ (struct sctp_stream_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_sctp_stream: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_sctp_stream: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = SCTP_STREAM_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_sctp_stream: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* We now alter the message_ptr variable to be at the desired */
+ /* alignment with the desired offset. */
+
+ if (debug) {
+ fprintf(where,"recv_sctp_stream: requested alignment of %d\n",
+ sctp_stream_request->recv_alignment);
+ fflush(where);
+ }
+
+ /* create_data_socket expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lss_size_req = sctp_stream_request->send_buf_size;
+ lsr_size_req = sctp_stream_request->recv_buf_size;
+ loc_nodelay = sctp_stream_request->no_delay;
+ loc_rcvavoid = sctp_stream_request->so_rcvavoid;
+ loc_sndavoid = sctp_stream_request->so_sndavoid;
+ non_block = sctp_stream_request->non_blocking;
+
+ set_hostname_and_port(local_name,
+ port_buffer,
+ nf_to_af(sctp_stream_request->ipfamily),
+ sctp_stream_request->port);
+
+ local_res = complete_addrinfo(local_name,
+ local_name,
+ port_buffer,
+ nf_to_af(sctp_stream_request->ipfamily),
+ SOCK_STREAM,
+ IPPROTO_SCTP,
+ 0);
+
+ s_listen = create_data_socket(local_res);
+
+ if (s_listen < 0) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ /* what sort of sizes did we end-up with? */
+ if (sctp_stream_request->receive_size == 0) {
+ if (lsr_size > 0) {
+ recv_size = lsr_size;
+ }
+ else {
+ recv_size = 4096;
+ }
+ }
+ else {
+ recv_size = sctp_stream_request->receive_size;
+ }
+
+ /* we want to set-up our recv_ring in a manner analagous to what we */
+ /* do on the sending side. this is more for the sake of symmetry */
+ /* than for the needs of say copy avoidance, but it might also be */
+ /* more realistic - this way one could conceivably go with a */
+ /* double-buffering scheme when taking the data an putting it into */
+ /* the filesystem or something like that. raj 7/94 */
+
+ if (recv_width == 0) {
+ recv_width = (lsr_size/recv_size) + 1;
+ if (recv_width == 1) recv_width++;
+ }
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ recv_size,
+ sctp_stream_request->recv_alignment,
+ sctp_stream_request->recv_offset);
+
+ if (debug) {
+ fprintf(where,"recv_sctp_stream: set recv_size = %d, align = %d, offset = %d.\n",
+ recv_size, sctp_stream_request->recv_alignment,
+ sctp_stream_request->recv_offset);
+ fflush(where);
+ }
+
+ /* now get the port number assigned by the system */
+ addrlen = sizeof(myaddr_in);
+ if (getsockname(s_listen,
+ (struct sockaddr *)&myaddr_in,
+ &addrlen) == -1){
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+ /* Now myaddr_in contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ sctp_stream_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a -1 to */
+ /* the initiator. */
+
+ sctp_stream_response->cpu_rate = (float)0.0; /* assume no cpu */
+ if (sctp_stream_request->measure_cpu) {
+ sctp_stream_response->measure_cpu = 1;
+ sctp_stream_response->cpu_rate =
+ calibrate_local_cpu(sctp_stream_request->cpu_rate);
+ }
+ else {
+ sctp_stream_response->measure_cpu = 0;
+ }
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ sctp_stream_response->send_buf_size = lss_size;
+ sctp_stream_response->recv_buf_size = lsr_size;
+ sctp_stream_response->no_delay = loc_nodelay;
+ sctp_stream_response->so_rcvavoid = loc_rcvavoid;
+ sctp_stream_response->so_sndavoid = loc_sndavoid;
+ sctp_stream_response->receive_size = recv_size;
+
+ /* Now, let's set-up the socket to listen for connections */
+ if (listen(s_listen, 5) == -1) {
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+ send_response();
+
+ addrlen = sizeof(peeraddr);
+
+ if ((s_data = accept(s_listen,
+ (struct sockaddr *)&peeraddr,
+ &addrlen)) == INVALID_SOCKET) {
+ /* Let's just punt. The remote will be given some information */
+ close(s_listen);
+ exit(1);
+ }
+
+ sctp_enable_events(s_data, SCTP_ASSOC_CHANGE_EV | SCTP_SHUTDOWN_EV);
+
+ /* now that we are connected, mark the socket as non-blocking */
+ if (non_block) {
+ fprintf(where, "setting socket as nonblocking\n");
+ fflush(where);
+ if (!set_nonblock(s_data)) {
+ close(s_data);
+ exit(1);
+ }
+ }
+
+#ifdef KLUDGE_SOCKET_OPTIONS
+ /* this is for those systems which *INCORRECTLY* fail to pass */
+ /* attributes across an accept() call. Including this goes against */
+ /* my better judgement :( raj 11/95 */
+
+ kludge_socket_options(s_data);
+
+#endif /* KLUDGE_SOCKET_OPTIONS */
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(sctp_stream_request->measure_cpu);
+
+ /* The loop will exit when the sender does a shutdown, which will */
+ /* return a length of zero */
+
+#ifdef DIRTY
+ /* we want to dirty some number of consecutive integers in the buffer */
+ /* we are about to recv. we may also want to bring some number of */
+ /* them cleanly into the cache. The clean ones will follow any dirty */
+ /* ones into the cache. */
+
+ dirty_count = sctp_stream_request->dirty_count;
+ clean_count = sctp_stream_request->clean_count;
+ message_int_ptr = (int *)recv_ring->buffer_ptr;
+ for (i = 0; i < dirty_count; i++) {
+ *message_int_ptr = rand();
+ message_int_ptr++;
+ }
+ for (i = 0; i < clean_count; i++) {
+ dirty_count = *message_int_ptr;
+ message_int_ptr++;
+ }
+#endif /* DIRTY */
+
+ bytes_received = 0;
+ receive_calls = 0;
+
+ while ((len = sctp_recvmsg(s_data,
+ recv_ring->buffer_ptr, recv_size,
+ NULL, 0, NULL, &msg_flags)) != 0) {
+ if (len == SOCKET_ERROR) {
+ if (non_block && errno == EAGAIN) {
+ if (debug){
+ fprintf(where,
+ "recv_sctp_stream: sctp_recvmsg timed out, trying again\n");
+ fflush(where);
+ }
+ Set_errno(0);
+ continue;
+ }
+ if (debug) {
+ fprintf(where,
+ "recv_sctp_stream: sctp_recvmsg error %d, exiting",
+ errno);
+ fflush(where);
+ }
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ close(s_data);
+ exit(1);
+ }
+
+ if (msg_flags & MSG_NOTIFICATION) {
+ msg_flags = 0;
+ if (debug) {
+ fprintf(where,
+ "recv_sctp_stream: Got notification... processing\n");
+ fflush(where);
+ }
+ if (sctp_process_event(s_data, recv_ring->buffer_ptr) == SCTP_CLOSE)
+ break; /* break out of the recvmsg loop */
+
+ continue;
+ }
+
+ bytes_received += len;
+ receive_calls++;
+
+ /* more to the next buffer in the recv_ring */
+ recv_ring = recv_ring->next;
+
+#ifdef PAUSE
+ sleep(1);
+#endif /* PAUSE */
+
+#ifdef DIRTY
+ message_int_ptr = (int *)(recv_ring->buffer_ptr);
+ for (i = 0; i < dirty_count; i++) {
+ *message_int_ptr = rand();
+ message_int_ptr++;
+ }
+ for (i = 0; i < clean_count; i++) {
+ dirty_count = *message_int_ptr;
+ message_int_ptr++;
+ }
+#endif /* DIRTY */
+
+#ifdef DO_SELECT
+ FD_SET(s_data,&readfds);
+ select(s_data+1,&readfds,NULL,NULL,&timeout);
+#endif /* DO_SELECT */
+
+ }
+
+ /* perform a shutdown to signal the sender that */
+ /* we have received all the data sent. raj 4/93 */
+
+ if (close(s_data) == -1) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ cpu_stop(sctp_stream_request->measure_cpu,&elapsed_time);
+
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_sctp_stream: got %g bytes\n",
+ bytes_received);
+ fprintf(where,
+ "recv_sctp_stream: got %d recvs\n",
+ receive_calls);
+ fflush(where);
+ }
+
+ sctp_stream_results->bytes_received = htond(bytes_received);
+ sctp_stream_results->elapsed_time = elapsed_time;
+ sctp_stream_results->recv_calls = receive_calls;
+
+ if (sctp_stream_request->measure_cpu) {
+ sctp_stream_results->cpu_util = calc_cpu_util(0.0);
+ };
+
+ if (debug) {
+ fprintf(where,
+ "recv_sctp_stream: test complete, sending results.\n");
+ fprintf(where,
+ " bytes_received %g receive_calls %d\n",
+ bytes_received,
+ receive_calls);
+ fprintf(where,
+ " len %d\n",
+ len);
+ fflush(where);
+ }
+
+ sctp_stream_results->cpu_method = cpu_method;
+ sctp_stream_results->num_cpus = lib_num_loc_cpus;
+ send_response();
+
+ /* we are now done with the sockets */
+ close(s_listen);
+
+}
+
+
+/* This routine implements the SCTP unidirectional data transfer test */
+/* (a.k.a. stream) for the sockets interface. It receives its */
+/* parameters via global variables from the shell and writes its */
+/* output to the standard output. */
+
+
+void
+send_sctp_stream_1toMany(remote_host)
+char remote_host[];
+{
+
+ char *tput_title = "\
+Recv Send Send \n\
+Socket Socket Message Elapsed \n\
+Size Size Size Time Throughput \n\
+bytes bytes bytes secs. %s/sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1 =
+ "%6d %6d %6d %-6.2f %7.2f \n";
+
+ char *cpu_title = "\
+Recv Send Send Utilization Service Demand\n\
+Socket Socket Message Elapsed Send Recv Send Recv\n\
+Size Size Size Time Throughput local remote local remote\n\
+bytes bytes bytes secs. %-8.8s/s %% %c %% %c us/KB us/KB\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f %c\n";
+
+ char *cpu_fmt_1 =
+ "%6d %6d %6d %-6.2f %7.2f %-6.2f %-6.2f %-6.3f %-6.3f\n";
+
+ char *ksink_fmt = "\n\
+Alignment Offset %-8.8s %-8.8s Sends %-8.8s Recvs\n\
+Local Remote Local Remote Xfered Per Per\n\
+Send Recv Send Recv Send (avg) Recv (avg)\n\
+%5d %5d %5d %5d %6.4g %6.2f %6d %6.2f %6d\n";
+
+ char *ksink_fmt2 = "\n\
+Maximum\n\
+Segment\n\
+Size (bytes)\n\
+%6d\n";
+
+
+ float elapsed_time;
+
+#ifdef WANT_INTERVALS
+ int interval_count;
+ sigset_t signal_set;
+#endif
+
+ /* what we want is to have a buffer space that is at least one */
+ /* send-size greater than our send window. this will insure that we */
+ /* are never trying to re-use a buffer that may still be in the hands */
+ /* of the transport. This buffer will be malloc'd after we have found */
+ /* the size of the local senc socket buffer. We will want to deal */
+ /* with alignment and offset concerns as well. */
+
+#ifdef DIRTY
+ int *message_int_ptr;
+#endif
+
+ struct ring_elt *send_ring;
+
+ int len;
+ unsigned int nummessages = 0;
+ int *send_socket;
+ int bytes_remaining;
+ int sctp_mss;
+
+ /* with links like fddi, one can send > 32 bits worth of bytes */
+ /* during a test... ;-) at some point, this should probably become a */
+ /* 64bit integral type, but those are not entirely common yet */
+ double bytes_sent = 0.0;
+
+#ifdef DIRTY
+ int i;
+#endif /* DIRTY */
+ int j;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+
+ double thruput;
+
+ struct addrinfo *remote_res;
+ struct addrinfo *local_res;
+ struct addrinfo *last_remote_res;
+ struct addrinfo *last_local_res;
+
+ struct sctp_stream_request_struct *sctp_stream_request;
+ struct sctp_stream_response_struct *sctp_stream_response;
+ struct sctp_stream_results_struct *sctp_stream_result;
+
+ sctp_stream_request =
+ (struct sctp_stream_request_struct *)netperf_request.content.test_specific_data;
+ sctp_stream_response =
+ (struct sctp_stream_response_struct *)netperf_response.content.test_specific_data;
+ sctp_stream_result =
+ (struct sctp_stream_results_struct *)netperf_response.content.test_specific_data;
+
+#ifdef WANT_HISTOGRAM
+ time_hist = HIST_new();
+#endif /* WANT_HISTOGRAM */
+
+ complete_addrinfos(&remote_res,
+ &local_res,
+ remote_host,
+ SOCK_SEQPACKET,
+ IPPROTO_SCTP,
+ 0);
+
+ if ( print_headers ) {
+ print_top_test_header("SCTP 1-TO-MANY STREAM TEST",local_res,remote_res);
+ }
+
+ send_ring = NULL;
+ confidence_iteration = 1;
+ init_stat();
+
+ send_socket = malloc(sizeof (int) * num_associations);
+ if (send_socket == NULL) {
+ fprintf(where, "send_sctp_stream_1toMany: failed to allocation sockets!\n");
+ exit(1);
+ }
+
+ /* we have a great-big while loop which controls the number of times */
+ /* we run a particular test. this is for the calculation of a */
+ /* confidence interval (I really should have stayed awake during */
+ /* probstats :). If the user did not request confidence measurement */
+ /* (no confidence is the default) then we will only go though the */
+ /* loop once. the confidence stuff originates from the folks at IBM */
+
+ while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
+ (confidence_iteration <= iteration_min)) {
+
+ int j=0;
+ int timed_out = 0;
+
+
+ /* initialize a few counters. we have to remember that we might be */
+ /* going through the loop more than once. */
+
+ nummessages = 0;
+ bytes_sent = 0.0;
+ times_up = 0;
+
+ /* at this point, we have either retrieved the socket buffer sizes, */
+ /* or have tried to set them, so now, we may want to set the send */
+ /* size based on that (because the user either did not use a -m */
+ /* option, or used one with an argument of 0). If the socket buffer */
+ /* size is not available, we will set the send size to 4KB - no */
+ /* particular reason, just arbitrary... */
+ if (send_size == 0) {
+ if (lss_size > 0) {
+ send_size = lss_size;
+ }
+ else {
+ send_size = 4096;
+ }
+ }
+
+ /* set-up the data buffer ring with the requested alignment and offset. */
+ /* note also that we have allocated a quantity */
+ /* of memory that is at least one send-size greater than our socket */
+ /* buffer size. We want to be sure that there are at least two */
+ /* buffers allocated - this can be a bit of a problem when the */
+ /* send_size is bigger than the socket size, so we must check... the */
+ /* user may have wanted to explicitly set the "width" of our send */
+ /* buffers, we should respect that wish... */
+ if (send_width == 0) {
+ send_width = (lss_size/send_size) + 1;
+ if (send_width == 1) send_width++;
+ }
+
+ if (send_ring == NULL) {
+ /* only allocate the send ring once. this is a networking test, */
+ /* not a memory allocation test. this way, we do not need a */
+ /* deallocate_buffer_ring() routine, and I don't feel like */
+ /* writing one anyway :) raj 11/94 */
+ send_ring = allocate_buffer_ring(send_width,
+ send_size,
+ local_send_align,
+ local_send_offset);
+ }
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back. */
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ /* Tell the remote end to do a listen. The server alters the socket */
+ /* paramters on the other side at this point, hence the reason for */
+ /* all the values being passed in the setup message. If the user did */
+ /* not specify any of the parameters, they will be passed as 0, which */
+ /* will indicate to the remote that no changes beyond the system's */
+ /* default should be used. Alignment is the exception, it will */
+ /* default to 1, which will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_SCTP_STREAM_MANY;
+ sctp_stream_request->send_buf_size = rss_size_req;
+ sctp_stream_request->recv_buf_size = rsr_size_req;
+ sctp_stream_request->receive_size = recv_size;
+ sctp_stream_request->no_delay = rem_nodelay;
+ sctp_stream_request->recv_alignment = remote_recv_align;
+ sctp_stream_request->recv_offset = remote_recv_offset;
+ sctp_stream_request->measure_cpu = remote_cpu_usage;
+ sctp_stream_request->cpu_rate = remote_cpu_rate;
+ if (test_time) {
+ sctp_stream_request->test_length = test_time;
+ }
+ else {
+ if (msg_count)
+ test_bytes = send_size * msg_count;
+
+ sctp_stream_request->test_length = test_bytes*num_associations;
+ }
+ sctp_stream_request->so_rcvavoid = rem_rcvavoid;
+ sctp_stream_request->so_sndavoid = rem_sndavoid;
+#ifdef DIRTY
+ sctp_stream_request->dirty_count = rem_dirty_count;
+ sctp_stream_request->clean_count = rem_clean_count;
+#endif /* DIRTY */
+ sctp_stream_request->port = (atoi(remote_data_port));
+ sctp_stream_request->ipfamily = af_to_nf(remote_res->ai_family);
+ sctp_stream_request->non_blocking = non_block;
+
+
+ if (debug > 1) {
+ fprintf(where,
+ "netperf: send_sctp_stream_1toMany: requesting sctp stream test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant */
+ /* socket parameters for this test type. We will put them back into */
+ /* the variables here so they can be displayed if desired. The */
+ /* remote will have calibrated CPU if necessary, and will have done */
+ /* all the needed set-up we will have calibrated the cpu locally */
+ /* before sending the request, and will grab the counter value right*/
+ /* after the connect returns. The remote will grab the counter right*/
+ /* after the accept call. This saves the hassle of extra messages */
+ /* being sent for the sctp tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote listen done.\n");
+ rsr_size = sctp_stream_response->recv_buf_size;
+ rss_size = sctp_stream_response->send_buf_size;
+ rem_nodelay = sctp_stream_response->no_delay;
+ remote_cpu_usage= sctp_stream_response->measure_cpu;
+ remote_cpu_rate = sctp_stream_response->cpu_rate;
+
+ /* we have to make sure that the server port number is in */
+ /* network order */
+ set_port_number(remote_res, (unsigned short)sctp_stream_response->data_port_number);
+ rem_rcvavoid = sctp_stream_response->so_rcvavoid;
+ rem_sndavoid = sctp_stream_response->so_sndavoid;
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+
+ /*set up the the array of data sockets and connect them to the server */
+
+ for (j = 0; j < num_associations; j++) {
+ send_socket[j] = create_data_socket(local_res);
+
+ if (send_socket[j] < 0){
+ perror("netperf: send_sctp_stream_1toMany: sctp stream data socket");
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"send_sctp_stream_1toMany: send_socket obtained...\n");
+ }
+
+ /*Connect up to the remote port on the data socket */
+ if (connect(send_socket[j],
+ remote_res->ai_addr,
+ remote_res->ai_addrlen) == INVALID_SOCKET){
+ perror("netperf: send_sctp_stream_1toMany: data socket connect failed");
+ exit(1);
+ }
+
+ /* Do it after connect is successfull, so that we don't see COMM_UP */
+ sctp_enable_events(send_socket[j], SCTP_ASSOC_CHANGE_EV);
+
+ if (non_block) {
+ /* now that we are connected, mark the socket as non-blocking */
+ if (!set_nonblock(send_socket[j])) {
+ perror("netperf: fcntl");
+ exit(1);
+ }
+ }
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either */
+ /* the connect would have failed, or the previous response would */
+ /* have indicated a problem. I failed to see the value of the */
+ /* extra message after the accept on the remote. If it failed, */
+ /* we'll see it here. If it didn't, we might as well start pumping */
+ /* data. */
+
+ /* Set-up the test end conditions. For a stream test, they can be */
+ /* either time or byte-count based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ bytes_remaining = 0;
+ /* in previous revisions, we had the same code repeated throught */
+ /* all the test suites. this was unnecessary, and meant more */
+ /* work for me when I wanted to switch to POSIX signals, so I */
+ /* have abstracted this out into a routine in netlib.c. if you */
+ /* are experiencing signal problems, you might want to look */
+ /* there. raj 11/94 */
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ bytes_remaining = test_bytes * num_associations;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+#ifdef WANT_INTERVALS
+ if ((interval_burst) || (demo_mode)) {
+ /* zero means that we never pause, so we never should need the */
+ /* interval timer, unless we are in demo_mode */
+ start_itimer(interval_wate);
+ }
+ interval_count = interval_burst;
+ /* get the signal set for the call to sigsuspend */
+ if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &signal_set) != 0) {
+ fprintf(where,
+ "send_sctp_stream_1toMany: unable to get sigmask errno %d\n",
+ errno);
+ fflush(where);
+ exit(1);
+ }
+#endif /* WANT_INTERVALS */
+
+#ifdef DIRTY
+ /* initialize the random number generator for putting dirty stuff */
+ /* into the send buffer. raj */
+ srand((int) getpid());
+#endif
+
+ /* before we start, initialize a few variables */
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return false. */
+ /* When the test is controlled by byte count, the time test will */
+ /* always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. */
+
+ while ((!times_up) || (bytes_remaining > 0)) {
+
+#ifdef DIRTY
+ /* we want to dirty some number of consecutive integers in the buffer */
+ /* we are about to send. we may also want to bring some number of */
+ /* them cleanly into the cache. The clean ones will follow any dirty */
+ /* ones into the cache. at some point, we might want to replace */
+ /* the rand() call with something from a table to reduce our call */
+ /* overhead during the test, but it is not a high priority item. */
+ message_int_ptr = (int *)(send_ring->buffer_ptr);
+ for (i = 0; i < loc_dirty_count; i++) {
+ *message_int_ptr = rand();
+ message_int_ptr++;
+ }
+ for (i = 0; i < loc_clean_count; i++) {
+ loc_dirty_count = *message_int_ptr;
+ message_int_ptr++;
+ }
+#endif /* DIRTY */
+
+#ifdef WANT_HISTOGRAM
+ /* timestamp just before we go into send and then again just after */
+ /* we come out raj 8/94 */
+ gettimeofday(&time_one,NULL);
+#endif /* WANT_HISTOGRAM */
+
+ for (j = 0; j < num_associations; j++) {
+
+ if((len=sctp_sendmsg(send_socket[j],
+ send_ring->buffer_ptr,
+ send_size,
+ (struct sockaddr *)remote_res->ai_addr,
+ remote_res->ai_addrlen,
+ 0, 0, 0, 0, 0)) != send_size) {
+ if ((len >=0) || SOCKET_EINTR(len)) {
+ /* the test was interrupted, must be the end of test */
+ timed_out = 1;
+ break;
+ } else if (non_block && errno == EAGAIN) {
+ j--; /* send again on the same socket */
+ Set_errno(0);
+ continue;
+ }
+ perror("netperf: data send error");
+ printf("len was %d\n",len);
+ exit(1);
+ }
+ }
+
+ if (timed_out)
+ break; /* test is over, try next iteration */
+
+#ifdef WANT_HISTOGRAM
+ /* timestamp the exit from the send call and update the histogram */
+ gettimeofday(&time_two,NULL);
+ HIST_add(time_hist,delta_micro(&time_one,&time_two));
+#endif /* WANT_HISTOGRAM */
+
+#ifdef WANT_INTERVALS
+ if (demo_mode) {
+ units_this_tick += send_size;
+ }
+ /* in this case, the interval count is the count-down couter */
+ /* to decide to sleep for a little bit */
+ if ((interval_burst) && (--interval_count == 0)) {
+ /* call sigsuspend and wait for the interval timer to get us */
+ /* out */
+ if (debug > 1) {
+ fprintf(where,"about to suspend\n");
+ fflush(where);
+ }
+ if (sigsuspend(&signal_set) == EFAULT) {
+ fprintf(where,
+ "send_sctp_stream_1toMany: fault with sigsuspend.\n");
+ fflush(where);
+ exit(1);
+ }
+ interval_count = interval_burst;
+ }
+#endif /* WANT_INTERVALS */
+
+ /* now we want to move our pointer to the next position in the */
+ /* data buffer...we may also want to wrap back to the "beginning" */
+ /* of the bufferspace, so we will mod the number of messages sent */
+ /* by the send width, and use that to calculate the offset to add */
+ /* to the base pointer. */
+ nummessages++;
+ send_ring = send_ring->next;
+ if (bytes_remaining) {
+ bytes_remaining -= send_size;
+ }
+ }
+
+ /* The test is over. Flush the buffers to the remote end. We do a */
+ /* graceful release to insure that all data has been taken by the */
+ /* remote. */
+
+ /* but first, if the verbosity is greater than 1, find-out what */
+ /* the sctp maximum segment_size was (if possible) */
+ if (verbosity > 1) {
+ sctp_mss = -1;
+ get_sctp_info(send_socket[0], &sctp_mss);
+ }
+
+ /* signal the server that we are all done writing, this will
+ * initiate a shutdonw of one of the associations on the
+ * server and trigger an event telling the server it's all done
+ */
+ sctp_sendmsg(send_socket[0], NULL, 0, remote_res->ai_addr,
+ remote_res->ai_addrlen, 0, MSG_EOF, 0, 0, 0);
+
+
+ /* The test server will initiate closure of all associations
+ * when it's done reading. We want a basic mechanism to catch this
+ * and are using SCTP events for this.
+ * In blocking mode, we can call recvmsg with the last socket we created.
+ * In non-blocking mode, we need to select on the socket for reading.
+ * We'll assume that all returns are succefull and signify
+ * closure.
+ * It is sufficient to do this on a single socket in the client.
+ * We choose to do it on a socket other then the one that send MSG_EOF.
+ * This means that anything comming in on that socket will be a shutdown.
+ */
+ if (non_block) {
+ fd_set readfds;
+
+ FD_ZERO(&readfds);
+ FD_SET(send_socket[num_associations-1], &readfds);
+ select(send_socket[num_associations-1]+1, &readfds, NULL, NULL, NULL);
+ } else {
+ sctp_recvmsg(send_socket[num_associations], send_ring->buffer_ptr,
+ send_size, NULL, 0, NULL, 0);
+ }
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being */
+ /* measured and how */
+ /* long did we really */
+ /* run? */
+
+ /* we are finished with our sockets, so close them to prevent hitting */
+ /* the limit on maximum open files. */
+ for (j = 0; j < num_associations; j++)
+ close(send_socket[j]);
+
+ /* Get the statistics from the remote end. The remote will have */
+ /* calculated service demand and all those interesting things. If it */
+ /* wasn't supposed to care, it will return obvious values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+
+ /* We now calculate what our thruput was for the test. In the future, */
+ /* we may want to include a calculation of the thruput measured by */
+ /* the remote, but it should be the case that for a sctp stream test, */
+ /* that the two numbers should be *very* close... We calculate */
+ /* bytes_sent regardless of the way the test length was controlled. */
+ /* If it was time, we needed to, and if it was by bytes, the user may */
+ /* have specified a number of bytes that wasn't a multiple of the */
+ /* send_size, so we really didn't send what he asked for ;-) */
+
+ bytes_sent = ntohd(sctp_stream_result->bytes_received);
+
+ thruput = (double) calc_thruput(bytes_sent);
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+
+ local_cpu_utilization = calc_cpu_util(0.0);
+ local_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ }
+
+ if (remote_cpu_usage) {
+
+ remote_cpu_utilization = sctp_stream_result->cpu_util;
+ remote_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ remote_cpu_utilization,
+ sctp_stream_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+ }
+ else {
+ /* we were not measuring cpu, for the confidence stuff, we */
+ /* should make it -1.0 */
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ /* at this point, we want to calculate the confidence information. */
+ /* if debugging is on, calculate_confidence will print-out the */
+ /* parameters we pass it */
+
+ calculate_confidence(confidence_iteration,
+ elapsed_time,
+ thruput,
+ local_cpu_utilization,
+ remote_cpu_utilization,
+ local_service_demand,
+ remote_service_demand);
+
+
+ confidence_iteration++;
+ }
+
+ /* at this point, we have finished making all the runs that we */
+ /* will be making. so, we should extract what the calcuated values */
+ /* are for all the confidence stuff. we could make the values */
+ /* global, but that seemed a little messy, and it did not seem worth */
+ /* all the mucking with header files. so, we create a routine much */
+ /* like calcualte_confidence, which just returns the mean values. */
+ /* raj 11/94 */
+
+ retrieve_confident_values(&elapsed_time,
+ &thruput,
+ &local_cpu_utilization,
+ &remote_cpu_utilization,
+ &local_service_demand,
+ &remote_service_demand);
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ if (confidence < 0) {
+ /* we did not hit confidence, but were we asked to look for it? */
+ if (iteration_max > 1) {
+ display_confidence();
+ }
+ }
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ local_cpu_method = format_cpu_method(cpu_method);
+ remote_cpu_method = format_cpu_method(sctp_stream_result->cpu_method);
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand,
+ local_cpu_method);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand,
+ remote_cpu_method);
+ }
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,
+ cpu_title,
+ format_units(),
+ local_cpu_method,
+ remote_cpu_method);
+ }
+
+ fprintf(where,
+ cpu_fmt_1, /* the format string */
+ rsr_size, /* remote recvbuf size */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long was the test */
+ thruput, /* what was the xfer rate */
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand); /* remote service demand */
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ thruput);
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,tput_title,format_units());
+ }
+ fprintf(where,
+ tput_fmt_1, /* the format string */
+ rsr_size, /* remote recvbuf size */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long did it take */
+ thruput);/* how fast did it go */
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* sctp statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ /* this stuff needs to be worked-out in the presence of confidence */
+ /* intervals and multiple iterations of the test... raj 11/94 */
+
+ fprintf(where,
+ ksink_fmt,
+ "Bytes",
+ "Bytes",
+ "Bytes",
+ local_send_align,
+ remote_recv_align,
+ local_send_offset,
+ remote_recv_offset,
+ bytes_sent,
+ bytes_sent / (double)nummessages,
+ nummessages,
+ bytes_sent / (double)sctp_stream_result->recv_calls,
+ sctp_stream_result->recv_calls);
+ fprintf(where,
+ ksink_fmt2,
+ sctp_mss);
+ fflush(where);
+#ifdef WANT_HISTOGRAM
+ fprintf(where,"\n\nHistogram of time spent in send() call.\n");
+ fflush(where);
+ HIST_report(time_hist);
+#endif /* WANT_HISTOGRAM */
+ }
+
+}
+
+
+
+/* This is the server-side routine for the sctp stream test. It is */
+/* implemented as one routine. I could break things-out somewhat, but */
+/* didn't feel it was necessary. */
+
+void
+recv_sctp_stream_1toMany()
+{
+
+ struct sockaddr_in myaddr_in;
+ int s_recv;
+ int addrlen;
+ int len;
+ unsigned int receive_calls;
+ float elapsed_time;
+ double bytes_received;
+ int msg_flags = 0;
+
+ struct ring_elt *recv_ring;
+
+ struct addrinfo *local_res;
+ char local_name[BUFSIZ];
+ char port_buffer[PORTBUFSIZE];
+
+#ifdef DIRTY
+ int *message_int_ptr;
+ int dirty_count;
+ int clean_count;
+ int i;
+#endif
+
+#ifdef DO_SELECT
+ fd_set readfds;
+ struct timeval timeout;
+#endif
+
+ struct sctp_stream_request_struct *sctp_stream_request;
+ struct sctp_stream_response_struct *sctp_stream_response;
+ struct sctp_stream_results_struct *sctp_stream_results;
+
+#ifdef DO_SELECT
+ FD_ZERO(&readfds);
+ timeout.tv_sec = 1;
+ timeout.tv_usec = 0;
+#endif
+
+ sctp_stream_request =
+ (struct sctp_stream_request_struct *)netperf_request.content.test_specific_data;
+ sctp_stream_response =
+ (struct sctp_stream_response_struct *)netperf_response.content.test_specific_data;
+ sctp_stream_results =
+ (struct sctp_stream_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_sctp_stream: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_sctp_stream_1toMany: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = SCTP_STREAM_MANY_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_sctp_stream_1toMany: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* We now alter the message_ptr variable to be at the desired */
+ /* alignment with the desired offset. */
+
+ if (debug) {
+ fprintf(where,"recv_sctp_stream_1toMany: requested alignment of %d\n",
+ sctp_stream_request->recv_alignment);
+ fflush(where);
+ }
+
+ /* create_data_socket expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lss_size_req = sctp_stream_request->send_buf_size;
+ lsr_size_req = sctp_stream_request->recv_buf_size;
+ loc_nodelay = sctp_stream_request->no_delay;
+ loc_rcvavoid = sctp_stream_request->so_rcvavoid;
+ loc_sndavoid = sctp_stream_request->so_sndavoid;
+ non_block = sctp_stream_request->non_blocking;
+
+ set_hostname_and_port(local_name,
+ port_buffer,
+ nf_to_af(sctp_stream_request->ipfamily),
+ sctp_stream_request->port);
+
+ local_res = complete_addrinfo(local_name,
+ local_name,
+ port_buffer,
+ nf_to_af(sctp_stream_request->ipfamily),
+ SOCK_SEQPACKET,
+ IPPROTO_SCTP,
+ 0);
+
+ s_recv = create_data_socket(local_res);
+
+ if (s_recv < 0) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ /* what sort of sizes did we end-up with? */
+ if (sctp_stream_request->receive_size == 0) {
+ if (lsr_size > 0) {
+ recv_size = lsr_size;
+ }
+ else {
+ recv_size = 4096;
+ }
+ }
+ else {
+ recv_size = sctp_stream_request->receive_size;
+ }
+
+ /* we want to set-up our recv_ring in a manner analagous to what we */
+ /* do on the sending side. this is more for the sake of symmetry */
+ /* than for the needs of say copy avoidance, but it might also be */
+ /* more realistic - this way one could conceivably go with a */
+ /* double-buffering scheme when taking the data an putting it into */
+ /* the filesystem or something like that. raj 7/94 */
+
+ if (recv_width == 0) {
+ recv_width = (lsr_size/recv_size) + 1;
+ if (recv_width == 1) recv_width++;
+ }
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ recv_size,
+ sctp_stream_request->recv_alignment,
+ sctp_stream_request->recv_offset);
+
+ if (debug) {
+ fprintf(where,"recv_sctp_stream: receive alignment and offset set...\n");
+ fflush(where);
+ }
+
+ /* Now, let's set-up the socket to listen for connections */
+ if (listen(s_recv, 5) == -1) {
+ netperf_response.content.serv_errno = errno;
+ close(s_recv);
+ send_response();
+
+ exit(1);
+ }
+
+ /* now get the port number assigned by the system */
+ addrlen = sizeof(myaddr_in);
+ if (getsockname(s_recv,
+ (struct sockaddr *)&myaddr_in,
+ &addrlen) == -1){
+ netperf_response.content.serv_errno = errno;
+ close(s_recv);
+ send_response();
+
+ exit(1);
+ }
+
+ /* Now myaddr_in contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ sctp_stream_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a -1 to */
+ /* the initiator. */
+
+ sctp_stream_response->cpu_rate = (float)0.0; /* assume no cpu */
+ if (sctp_stream_request->measure_cpu) {
+ sctp_stream_response->measure_cpu = 1;
+ sctp_stream_response->cpu_rate =
+ calibrate_local_cpu(sctp_stream_request->cpu_rate);
+ }
+ else {
+ sctp_stream_response->measure_cpu = 0;
+ }
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ sctp_stream_response->send_buf_size = lss_size;
+ sctp_stream_response->recv_buf_size = lsr_size;
+ sctp_stream_response->no_delay = loc_nodelay;
+ sctp_stream_response->so_rcvavoid = loc_rcvavoid;
+ sctp_stream_response->so_sndavoid = loc_sndavoid;
+ sctp_stream_response->receive_size = recv_size;
+
+ send_response();
+
+
+ sctp_enable_events(s_recv, SCTP_ASSOC_CHANGE_EV | SCTP_SHUTDOWN_EV);
+
+ /* now that we are connected, mark the socket as non-blocking */
+ if (non_block) {
+ if (!set_nonblock(s_recv)) {
+ close(s_recv);
+ exit(1);
+ }
+ }
+
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(sctp_stream_request->measure_cpu);
+
+ /* The loop will exit when the sender does a shutdown, which will */
+ /* return a length of zero */
+
+#ifdef DIRTY
+ /* we want to dirty some number of consecutive integers in the buffer */
+ /* we are about to recv. we may also want to bring some number of */
+ /* them cleanly into the cache. The clean ones will follow any dirty */
+ /* ones into the cache. */
+
+ dirty_count = sctp_stream_request->dirty_count;
+ clean_count = sctp_stream_request->clean_count;
+ message_int_ptr = (int *)recv_ring->buffer_ptr;
+ for (i = 0; i < dirty_count; i++) {
+ *message_int_ptr = rand();
+ message_int_ptr++;
+ }
+ for (i = 0; i < clean_count; i++) {
+ dirty_count = *message_int_ptr;
+ message_int_ptr++;
+ }
+#endif /* DIRTY */
+
+ bytes_received = 0;
+ receive_calls = 0;
+
+ while ((len = sctp_recvmsg(s_recv, recv_ring->buffer_ptr, recv_size,
+ NULL, 0, /* we don't care who it's from */
+ NULL, &msg_flags)) != 0) {
+ if (len < 0) {
+ if (non_block && errno == EAGAIN) {
+ Set_errno(0);
+ continue;
+ }
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ close(s_recv);
+ exit(1);
+ }
+
+ if (msg_flags & MSG_NOTIFICATION) {
+ if (sctp_process_event(s_recv, recv_ring->buffer_ptr) == SCTP_CLOSE)
+ break;
+
+ continue;
+ }
+
+ bytes_received += len;
+ receive_calls++;
+
+ /* more to the next buffer in the recv_ring */
+ recv_ring = recv_ring->next;
+
+#ifdef PAUSE
+ sleep(1);
+#endif /* PAUSE */
+
+#ifdef DIRTY
+ message_int_ptr = (int *)(recv_ring->buffer_ptr);
+ for (i = 0; i < dirty_count; i++) {
+ *message_int_ptr = rand();
+ message_int_ptr++;
+ }
+ for (i = 0; i < clean_count; i++) {
+ dirty_count = *message_int_ptr;
+ message_int_ptr++;
+ }
+#endif /* DIRTY */
+
+#ifdef DO_SELECT
+ FD_SET(s_recv,&readfds);
+ select(s_recv+1,&readfds,NULL,NULL,&timeout);
+#endif /* DO_SELECT */
+
+ }
+
+ /* perform a shutdown to signal the sender. in this case, sctp
+ * will close all associations on this socket
+ */
+ if (close(s_recv) == -1) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ cpu_stop(sctp_stream_request->measure_cpu,&elapsed_time);
+
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_sctp_stream: got %g bytes\n",
+ bytes_received);
+ fprintf(where,
+ "recv_sctp_stream: got %d recvs\n",
+ receive_calls);
+ fflush(where);
+ }
+
+ sctp_stream_results->bytes_received = htond(bytes_received);
+ sctp_stream_results->elapsed_time = elapsed_time;
+ sctp_stream_results->recv_calls = receive_calls;
+
+ if (sctp_stream_request->measure_cpu) {
+ sctp_stream_results->cpu_util = calc_cpu_util(0.0);
+ };
+
+ if (debug) {
+ fprintf(where,
+ "recv_sctp_stream: test complete, sending results.\n");
+ fprintf(where,
+ " bytes_received %g receive_calls %d\n",
+ bytes_received,
+ receive_calls);
+ fprintf(where,
+ " len %d\n",
+ len);
+ fflush(where);
+ }
+
+ sctp_stream_results->cpu_method = cpu_method;
+ sctp_stream_results->num_cpus = lib_num_loc_cpus;
+ send_response();
+}
+
+
+ /* this routine implements the sending (netperf) side of the SCTP_RR */
+ /* test. */
+
+void
+send_sctp_rr(remote_host)
+ char remote_host[];
+{
+
+ char *tput_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans.\n\
+Send Recv Size Size Time Rate \n\
+bytes Bytes bytes bytes secs. per sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %7.2f \n";
+ char *tput_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *cpu_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem\n\
+Send Recv Size Size Time Rate local remote local remote\n\
+bytes bytes bytes bytes secs. per sec %% %c %% %c us/Tr us/Tr\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f %c\n";
+
+ char *cpu_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %-6.2f %-6.2f %-6.2f %-6.3f %-6.3f\n";
+
+ char *cpu_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *ksink_fmt = "\
+Alignment Offset\n\
+Local Remote Local Remote\n\
+Send Recv Send Recv\n\
+%5d %5d %5d %5d\n";
+
+
+ int timed_out = 0;
+ float elapsed_time;
+
+ int len;
+ char *temp_message_ptr;
+ int nummessages;
+ int send_socket;
+ int trans_remaining;
+ int msg_flags = 0;
+ double bytes_xferd;
+
+ struct ring_elt *send_ring;
+ struct ring_elt *recv_ring;
+
+ int rsp_bytes_left;
+ int rsp_bytes_recvd;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+ double thruput;
+
+ struct sockaddr_storage peer;
+ struct addrinfo *remote_res;
+ struct addrinfo *local_res;
+
+ struct sctp_rr_request_struct *sctp_rr_request;
+ struct sctp_rr_response_struct *sctp_rr_response;
+ struct sctp_rr_results_struct *sctp_rr_result;
+
+#ifdef WANT_INTERVALS
+ int interval_count;
+ sigset_t signal_set;
+#endif /* WANT_INTERVALS */
+
+ sctp_rr_request =
+ (struct sctp_rr_request_struct *)netperf_request.content.test_specific_data;
+ sctp_rr_response =
+ (struct sctp_rr_response_struct *)netperf_response.content.test_specific_data;
+ sctp_rr_result =
+ (struct sctp_rr_results_struct *)netperf_response.content.test_specific_data;
+
+#ifdef WANT_HISTOGRAM
+ time_hist = HIST_new();
+#endif /* WANT_HISTOGRAM */
+
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ /* complete_addrinfos will either succede or exit the process */
+ complete_addrinfos(&remote_res,
+ &local_res,
+ remote_host,
+ SOCK_STREAM,
+ IPPROTO_SCTP,
+ 0);
+
+ if ( print_headers ) {
+ print_top_test_header("SCTP REQUEST/RESPONSE TEST", local_res, remote_res);
+ }
+
+ /* initialize a few counters */
+
+ send_ring = NULL;
+ recv_ring = NULL;
+ confidence_iteration = 1;
+ init_stat();
+
+ /* we have a great-big while loop which controls the number of times */
+ /* we run a particular test. this is for the calculation of a */
+ /* confidence interval (I really should have stayed awake during */
+ /* probstats :). If the user did not request confidence measurement */
+ /* (no confidence is the default) then we will only go though the */
+ /* loop once. the confidence stuff originates from the folks at IBM */
+
+ while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
+ (confidence_iteration <= iteration_min)) {
+
+ /* initialize a few counters. we have to remember that we might be */
+ /* going through the loop more than once. */
+
+ nummessages = 0;
+ bytes_xferd = 0.0;
+ times_up = 0;
+ timed_out = 0;
+ trans_remaining = 0;
+
+ /* set-up the data buffers with the requested alignment and offset. */
+ /* since this is a request/response test, default the send_width and */
+ /* recv_width to 1 and not two raj 7/94 */
+
+ if (send_width == 0) send_width = 1;
+ if (recv_width == 0) recv_width = 1;
+
+ if (send_ring == NULL) {
+ send_ring = allocate_buffer_ring(send_width,
+ req_size,
+ local_send_align,
+ local_send_offset);
+ }
+
+ if (recv_ring == NULL) {
+ recv_ring = allocate_buffer_ring(recv_width,
+ rsp_size,
+ local_recv_align,
+ local_recv_offset);
+ }
+
+ /*set up the data socket */
+ send_socket = create_data_socket(local_res);
+
+ if (send_socket < 0){
+ perror("netperf: send_sctp_rr: sctp stream data socket");
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"send_sctp_rr: send_socket obtained...\n");
+ }
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back.*/
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ /* Tell the remote end to do a listen. The server alters the socket */
+ /* paramters on the other side at this point, hence the reason for */
+ /* all the values being passed in the setup message. If the user did */
+ /* not specify any of the parameters, they will be passed as 0, which */
+ /* will indicate to the remote that no changes beyond the system's */
+ /* default should be used. Alignment is the exception, it will */
+ /* default to 8, which will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_SCTP_RR;
+ sctp_rr_request->recv_buf_size = rsr_size_req;
+ sctp_rr_request->send_buf_size = rss_size_req;
+ sctp_rr_request->recv_alignment = remote_recv_align;
+ sctp_rr_request->recv_offset = remote_recv_offset;
+ sctp_rr_request->send_alignment = remote_send_align;
+ sctp_rr_request->send_offset = remote_send_offset;
+ sctp_rr_request->request_size = req_size;
+ sctp_rr_request->response_size = rsp_size;
+ sctp_rr_request->no_delay = rem_nodelay;
+ sctp_rr_request->measure_cpu = remote_cpu_usage;
+ sctp_rr_request->cpu_rate = remote_cpu_rate;
+ sctp_rr_request->so_rcvavoid = rem_rcvavoid;
+ sctp_rr_request->so_sndavoid = rem_sndavoid;
+ if (test_time) {
+ sctp_rr_request->test_length = test_time;
+ }
+ else {
+ sctp_rr_request->test_length = test_trans * -1;
+ }
+ sctp_rr_request->non_blocking = non_block;
+ sctp_rr_request->ipfamily = af_to_nf(remote_res->ai_family);
+
+ if (debug > 1) {
+ fprintf(where,"netperf: send_sctp_rr: requesting SCTP rr test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant */
+ /* socket parameters for this test type. We will put them back into */
+ /* the variables here so they can be displayed if desired. The */
+ /* remote will have calibrated CPU if necessary, and will have done */
+ /* all the needed set-up we will have calibrated the cpu locally */
+ /* before sending the request, and will grab the counter value right*/
+ /* after the connect returns. The remote will grab the counter right*/
+ /* after the accept call. This saves the hassle of extra messages */
+ /* being sent for the sctp tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote listen done.\n");
+ rsr_size = sctp_rr_response->recv_buf_size;
+ rss_size = sctp_rr_response->send_buf_size;
+ rem_nodelay = sctp_rr_response->no_delay;
+ remote_cpu_usage = sctp_rr_response->measure_cpu;
+ remote_cpu_rate = sctp_rr_response->cpu_rate;
+ /* make sure that port numbers are in network order */
+ set_port_number(remote_res,
+ (unsigned short)sctp_rr_response->data_port_number);
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+
+ /*Connect up to the remote port on the data socket */
+ if (connect(send_socket,
+ remote_res->ai_addr,
+ remote_res->ai_addrlen) <0){
+ perror("netperf: send_sctp_rr data socket connect failed");
+ exit(1);
+ }
+
+ /* don't need events for 1-to-1 API with request-response tests */
+ sctp_enable_events(send_socket, 0);
+
+ /* set non-blocking if needed */
+ if (non_block) {
+ if (!set_nonblock(send_socket)) {
+ close(send_socket);
+ exit(1);
+ }
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either the */
+ /* connect would have failed, or the previous response would have */
+ /* indicated a problem. I failed to see the value of the extra */
+ /* message after the accept on the remote. If it failed, we'll see it */
+ /* here. If it didn't, we might as well start pumping data. */
+
+ /* Set-up the test end conditions. For a request/response test, they */
+ /* can be either time or transaction based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ trans_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+#ifdef WANT_INTERVALS
+ if ((interval_burst) || (demo_mode)) {
+ /* zero means that we never pause, so we never should need the */
+ /* interval timer, unless we are in demo_mode */
+ start_itimer(interval_wate);
+ }
+ interval_count = interval_burst;
+ /* get the signal set for the call to sigsuspend */
+ if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &signal_set) != 0) {
+ fprintf(where,
+ "send_sctp_rr: unable to get sigmask errno %d\n",
+ errno);
+ fflush(where);
+ exit(1);
+ }
+#endif /* WANT_INTERVALS */
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return false. */
+ /* When the test is controlled by byte count, the time test will */
+ /* always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. I think I */
+ /* just arbitrarily decrement trans_remaining for the timed test, but */
+ /* will not do that just yet... One other question is whether or not */
+ /* the send buffer and the receive buffer should be the same buffer. */
+
+#ifdef WANT_FIRST_BURST
+ {
+ int i;
+ for (i = 0; i < first_burst_size; i++) {
+ if((len=sctp_sendmsg(send_socket,
+ send_ring->buffer_ptr, req_size,
+ NULL, 0, /* don't need addrs with 1-to-1 */
+ 0, 0, 0, 0, 0)) != req_size) {
+ /* we should never hit the end of the test in the first burst */
+ perror("send_sctp_rr: initial burst data send error");
+ exit(1);
+ }
+ }
+ }
+#endif /* WANT_FIRST_BURST */
+
+ while ((!times_up) || (trans_remaining > 0)) {
+ /* send the request. we assume that if we use a blocking socket, */
+ /* the request will be sent at one shot. */
+
+#ifdef WANT_HISTOGRAM
+ /* timestamp just before our call to send, and then again just */
+ /* after the receive raj 8/94 */
+ HIST_timestamp(&time_one);
+#endif /* WANT_HISTOGRAM */
+
+ while ((len=sctp_sendmsg(send_socket,
+ send_ring->buffer_ptr, req_size,
+ NULL, 0, /* don't need addrs with 1-to-1 */
+ 0, 0, 0, 0, 0)) != req_size) {
+ if (non_block && errno == EAGAIN) {
+ /* try sending again */
+ continue;
+ } else if (SOCKET_EINTR(len) || (errno == 0)) {
+ /* we hit the end of a */
+ /* timed test. */
+ timed_out = 1;
+ break;
+ }
+ perror("send_sctp_rr: data send error");
+ exit(1);
+ }
+
+ if (timed_out) {
+ /* we timed out while sending. break out another level */
+ break;
+ }
+ send_ring = send_ring->next;
+
+ /* receive the response */
+ rsp_bytes_left = rsp_size;
+ temp_message_ptr = recv_ring->buffer_ptr;
+ do {
+ msg_flags = 0;
+ if ((rsp_bytes_recvd=sctp_recvmsg(send_socket,
+ temp_message_ptr, rsp_bytes_left,
+ NULL, 0,
+ NULL, &msg_flags)) < 0) {
+ if (errno == EINTR) {
+ /* We hit the end of a timed test. */
+ timed_out = 1;
+ break;
+ } else if (non_block && errno == EAGAIN) {
+ continue;
+ }
+ perror("send_sctp_rr: data recv error");
+ exit(1);
+ }
+ rsp_bytes_left -= rsp_bytes_recvd;
+ temp_message_ptr += rsp_bytes_recvd;
+ } while (!(msg_flags & MSG_EOR));
+
+ recv_ring = recv_ring->next;
+
+ if (timed_out) {
+ /* we may have been in a nested while loop - we need */
+ /* another call to break. */
+ break;
+ }
+
+#ifdef WANT_HISTOGRAM
+ HIST_timestamp(&time_two);
+ HIST_add(time_hist,delta_micro(&time_one,&time_two));
+#endif /* WANT_HISTOGRAM */
+#ifdef WANT_INTERVALS
+ if (demo_mode) {
+ units_this_tick += 1;
+ }
+ /* in this case, the interval count is the count-down couter */
+ /* to decide to sleep for a little bit */
+ if ((interval_burst) && (--interval_count == 0)) {
+ /* call sigsuspend and wait for the interval timer to get us */
+ /* out */
+ if (debug > 1) {
+ fprintf(where,"about to suspend\n");
+ fflush(where);
+ }
+ if (sigsuspend(&signal_set) == EFAULT) {
+ fprintf(where,
+ "send_sctp_rr: fault with signal set!\n");
+ fflush(where);
+ exit(1);
+ }
+ interval_count = interval_burst;
+ }
+#endif /* WANT_INTERVALS */
+
+ nummessages++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug > 3) {
+ if ((nummessages % 100) == 0) {
+ fprintf(where,
+ "Transaction %d completed\n",
+ nummessages);
+ fflush(where);
+ }
+ }
+ }
+
+ /* At this point we used to call shutdown on the data socket to be */
+ /* sure all the data was delivered, but this was not germane in a */
+ /* request/response test, and it was causing the tests to "hang" when */
+ /* they were being controlled by time. So, I have replaced this */
+ /* shutdown call with a call to close that can be found later in the */
+ /* procedure. */
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being */
+ /* measured? how long */
+ /* did we really run? */
+
+ /* Get the statistics from the remote end. The remote will have */
+ /* calculated CPU utilization. If it wasn't supposed to care, it */
+ /* will return obvious values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,"netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+ exit(1);
+ }
+
+ /* We now calculate what our throughput was for the test. */
+
+ bytes_xferd = (req_size * nummessages) + (rsp_size * nummessages);
+ thruput = nummessages/elapsed_time;
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+ local_cpu_utilization = calc_cpu_util(0.0);
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ local_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ }
+
+ if (remote_cpu_usage) {
+ remote_cpu_utilization = sctp_rr_result->cpu_util;
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ remote_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ remote_cpu_utilization,
+ sctp_rr_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ }
+ else {
+ /* we were not measuring cpu, for the confidence stuff, we */
+ /* should make it -1.0 */
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ /* at this point, we want to calculate the confidence information. */
+ /* if debugging is on, calculate_confidence will print-out the */
+ /* parameters we pass it */
+
+ calculate_confidence(confidence_iteration,
+ elapsed_time,
+ thruput,
+ local_cpu_utilization,
+ remote_cpu_utilization,
+ local_service_demand,
+ remote_service_demand);
+
+
+ confidence_iteration++;
+
+ /* we are now done with the socket, so close it */
+ close(send_socket);
+
+ }
+
+ retrieve_confident_values(&elapsed_time,
+ &thruput,
+ &local_cpu_utilization,
+ &remote_cpu_utilization,
+ &local_service_demand,
+ &remote_service_demand);
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ if (confidence < 0) {
+ /* we did not hit confidence, but were we asked to look for it? */
+ if (iteration_max > 1) {
+ display_confidence();
+ }
+ }
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ local_cpu_method = format_cpu_method(cpu_method);
+ remote_cpu_method = format_cpu_method(sctp_rr_result->cpu_method);
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand,
+ local_cpu_method);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand,
+ remote_cpu_method);
+ }
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,
+ cpu_title,
+ local_cpu_method,
+ remote_cpu_method);
+ }
+
+ fprintf(where,
+ cpu_fmt_1_line_1, /* the format string */
+ lss_size, /* local sendbuf size */
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* guess */
+ elapsed_time, /* how long was the test */
+ thruput,
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand); /* remote service demand */
+ fprintf(where,
+ cpu_fmt_1_line_2,
+ rss_size,
+ rsr_size);
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ thruput);
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,tput_title,format_units());
+ }
+
+ fprintf(where,
+ tput_fmt_1_line_1, /* the format string */
+ lss_size,
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* how large were the responses */
+ elapsed_time, /* how long did it take */
+ thruput);
+ fprintf(where,
+ tput_fmt_1_line_2,
+ rss_size, /* remote recvbuf size */
+ rsr_size);
+
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ /* how to handle the verbose information in the presence of */
+ /* confidence intervals is yet to be determined... raj 11/94 */
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* TCP statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ fprintf(where,
+ ksink_fmt,
+ local_send_align,
+ remote_recv_offset,
+ local_send_offset,
+ remote_recv_offset);
+
+#ifdef WANT_HISTOGRAM
+ fprintf(where,"\nHistogram of request/response times\n");
+ fflush(where);
+ HIST_report(time_hist);
+#endif /* WANT_HISTOGRAM */
+
+ }
+
+}
+
+
+ /* this routine implements the receive (netserver) side of a TCP_RR */
+ /* test */
+void
+recv_sctp_rr()
+{
+
+ struct ring_elt *send_ring;
+ struct ring_elt *recv_ring;
+
+ struct addrinfo *local_res;
+ char local_name[BUFSIZ];
+ char port_buffer[PORTBUFSIZE];
+
+ struct sockaddr_in myaddr_in, peeraddr_in;
+ int s_listen, s_data;
+ int addrlen;
+ char *temp_message_ptr;
+ int trans_received;
+ int trans_remaining;
+ int bytes_sent;
+ int request_bytes_recvd;
+ int request_bytes_remaining;
+ int timed_out = 0;
+ float elapsed_time;
+
+ struct sctp_rr_request_struct *sctp_rr_request;
+ struct sctp_rr_response_struct *sctp_rr_response;
+ struct sctp_rr_results_struct *sctp_rr_results;
+
+ sctp_rr_request =
+ (struct sctp_rr_request_struct *)netperf_request.content.test_specific_data;
+ sctp_rr_response =
+ (struct sctp_rr_response_struct *)netperf_response.content.test_specific_data;
+ sctp_rr_results =
+ (struct sctp_rr_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_sctp_rr: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_sctp_rr: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = SCTP_RR_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_sctp_rr: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* allocate the recv and send rings with the requested alignments */
+ /* and offsets. raj 7/94 */
+ if (debug) {
+ fprintf(where,"recv_sctp_rr: requested recv alignment of %d offset %d\n",
+ sctp_rr_request->recv_alignment,
+ sctp_rr_request->recv_offset);
+ fprintf(where,"recv_sctp_rr: requested send alignment of %d offset %d\n",
+ sctp_rr_request->send_alignment,
+ sctp_rr_request->send_offset);
+ fflush(where);
+ }
+
+ /* at some point, these need to come to us from the remote system */
+ if (send_width == 0) send_width = 1;
+ if (recv_width == 0) recv_width = 1;
+
+ send_ring = allocate_buffer_ring(send_width,
+ sctp_rr_request->response_size,
+ sctp_rr_request->send_alignment,
+ sctp_rr_request->send_offset);
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ sctp_rr_request->request_size,
+ sctp_rr_request->recv_alignment,
+ sctp_rr_request->recv_offset);
+
+
+ /* Grab a socket to listen on, and then listen on it. */
+
+ if (debug) {
+ fprintf(where,"recv_sctp_rr: grabbing a socket...\n");
+ fflush(where);
+ }
+
+ /* create_data_socket expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lss_size_req = sctp_rr_request->send_buf_size;
+ lsr_size_req = sctp_rr_request->recv_buf_size;
+ loc_nodelay = sctp_rr_request->no_delay;
+ loc_rcvavoid = sctp_rr_request->so_rcvavoid;
+ loc_sndavoid = sctp_rr_request->so_sndavoid;
+ non_block = sctp_rr_request->non_blocking;
+
+ set_hostname_and_port(local_name,
+ port_buffer,
+ nf_to_af(sctp_rr_request->ipfamily),
+ sctp_rr_request->port);
+
+ local_res = complete_addrinfo(local_name,
+ local_name,
+ port_buffer,
+ nf_to_af(sctp_rr_request->ipfamily),
+ SOCK_STREAM,
+ IPPROTO_SCTP,
+ 0);
+
+ s_listen = create_data_socket(local_res);
+
+ if (s_listen < 0) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+
+ exit(1);
+ }
+
+ /* Now, let's set-up the socket to listen for connections */
+ if (listen(s_listen, 5) == -1) {
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+
+ /* now get the port number assigned by the system */
+ addrlen = sizeof(myaddr_in);
+ if (getsockname(s_listen,
+ (struct sockaddr *)&myaddr_in, &addrlen) == -1){
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+ /* Now myaddr_in contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ sctp_rr_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a 0.0 to */
+ /* the initiator. */
+
+ sctp_rr_response->cpu_rate = (float)0.0; /* assume no cpu */
+ sctp_rr_response->measure_cpu = 0;
+
+ if (sctp_rr_request->measure_cpu) {
+ sctp_rr_response->measure_cpu = 1;
+ sctp_rr_response->cpu_rate = calibrate_local_cpu(sctp_rr_request->cpu_rate);
+ }
+
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ sctp_rr_response->send_buf_size = lss_size;
+ sctp_rr_response->recv_buf_size = lsr_size;
+ sctp_rr_response->no_delay = loc_nodelay;
+ sctp_rr_response->so_rcvavoid = loc_rcvavoid;
+ sctp_rr_response->so_sndavoid = loc_sndavoid;
+ sctp_rr_response->test_length = sctp_rr_request->test_length;
+ send_response();
+
+ addrlen = sizeof(peeraddr_in);
+
+ if ((s_data = accept(s_listen,
+ (struct sockaddr *)&peeraddr_in,
+ &addrlen)) == -1) {
+ /* Let's just punt. The remote will be given some information */
+ close(s_listen);
+
+ exit(1);
+ }
+
+ /* we do not need events on a 1-to-1 RR test. The test will finish
+ * once all transactions are done.
+ */
+
+ /* now that we are connected, mark the socket as non-blocking */
+ if (non_block) {
+ if (!set_nonblock(s_data)) {
+ perror("netperf: set_nonblock");
+ exit(1);
+ }
+ }
+
+#ifdef KLUDGE_SOCKET_OPTIONS
+ /* this is for those systems which *INCORRECTLY* fail to pass */
+ /* attributes across an accept() call. Including this goes against */
+ /* my better judgement :( raj 11/95 */
+
+ kludge_socket_options(s_data);
+
+#endif /* KLUDGE_SOCKET_OPTIONS */
+
+ if (debug) {
+ fprintf(where,"recv_sctp_rr: accept completes on the data connection.\n");
+ fflush(where);
+ }
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(sctp_rr_request->measure_cpu);
+
+ /* The loop will exit when we hit the end of the test time, or when */
+ /* we have exchanged the requested number of transactions. */
+
+ if (sctp_rr_request->test_length > 0) {
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(sctp_rr_request->test_length + PAD_TIME);
+ }
+ else {
+ times_up = 1;
+ trans_remaining = sctp_rr_request->test_length * -1;
+ }
+
+ trans_received = 0;
+
+ while ((!times_up) || (trans_remaining > 0)) {
+ int msg_flags = 0;
+
+ temp_message_ptr = recv_ring->buffer_ptr;
+ request_bytes_remaining = sctp_rr_request->request_size;
+ while(!(msg_flags & MSG_EOR)) {
+ if((request_bytes_recvd=sctp_recvmsg(s_data,
+ temp_message_ptr,
+ request_bytes_remaining,
+ NULL, 0,
+ NULL, &msg_flags)) < 0) {
+ if (errno == EINTR) {
+ /* the timer popped */
+ timed_out = 1;
+ break;
+ } else if (non_block && errno == EAGAIN) {
+ continue; /* while request_bytes_remaining */
+ }
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+ request_bytes_remaining -= request_bytes_recvd;
+ temp_message_ptr += request_bytes_recvd;
+ }
+
+ recv_ring = recv_ring->next;
+
+ if (timed_out) {
+ /* we hit the end of the test based on time - lets */
+ /* bail out of here now... */
+ if (debug) {
+ fprintf(where,"yo55\n");
+ fflush(where);
+ }
+ break;
+ }
+
+
+ /* Now, send the response to the remote
+ * In 1-to-1 API destination addr is not needed.
+ */
+ while ((bytes_sent=sctp_sendmsg(s_data,
+ send_ring->buffer_ptr,
+ sctp_rr_request->response_size,
+ NULL, 0,
+ 0, 0, 0, 0, 0)) == -1) {
+ if (errno == EINTR) {
+ /* the test timer has popped */
+ timed_out = 1;
+ break;
+ } else if (non_block && errno == EAGAIN) {
+ continue;
+ }
+
+ netperf_response.content.serv_errno = 982;
+ send_response();
+ exit(1);
+ }
+
+ if (timed_out) {
+ /* we hit the end of the test based on time - lets */
+ /* bail out of here now... */
+ if (debug) {
+ fprintf(where,"yo6\n");
+ fflush(where);
+ }
+ break;
+ }
+
+ send_ring = send_ring->next;
+
+ trans_received++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+ }
+
+
+ /* The loop now exits due to timeout or transaction count being */
+ /* reached */
+
+ cpu_stop(sctp_rr_request->measure_cpu,&elapsed_time);
+
+ stop_timer();
+
+ if (timed_out) {
+ /* we ended the test by time, which was at least 2 seconds */
+ /* longer than we wanted to run. so, we want to subtract */
+ /* PAD_TIME from the elapsed_time. */
+ elapsed_time -= PAD_TIME;
+ }
+
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_sctp_rr: got %d transactions\n",
+ trans_received);
+ fflush(where);
+ }
+
+ sctp_rr_results->bytes_received = (trans_received *
+ (sctp_rr_request->request_size +
+ sctp_rr_request->response_size));
+ sctp_rr_results->trans_received = trans_received;
+ sctp_rr_results->elapsed_time = elapsed_time;
+ sctp_rr_results->cpu_method = cpu_method;
+ sctp_rr_results->num_cpus = lib_num_loc_cpus;
+ if (sctp_rr_request->measure_cpu) {
+ sctp_rr_results->cpu_util = calc_cpu_util(elapsed_time);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_sctp_rr: test complete, sending results.\n");
+ fflush(where);
+ }
+
+ /* we are now done with the sockets */
+ send_response();
+
+ close(s_data);
+ close(s_listen);
+
+}
+
+
+
+/* this routine implements the sending (netperf) side of the
+ SCTP_RR_1TOMANY test */
+
+void
+send_sctp_rr_1toMany(remote_host)
+ char remote_host[];
+{
+
+ char *tput_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans.\n\
+Send Recv Size Size Time Rate \n\
+bytes Bytes bytes bytes secs. per sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %7.2f \n";
+ char *tput_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *cpu_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem\n\
+Send Recv Size Size Time Rate local remote local remote\n\
+bytes bytes bytes bytes secs. per sec %% %c %% %c us/Tr us/Tr\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f %c\n";
+
+ char *cpu_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %-6.2f %-6.2f %-6.2f %-6.3f %-6.3f\n";
+
+ char *cpu_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *ksink_fmt = "\
+Alignment Offset\n\
+Local Remote Local Remote\n\
+Send Recv Send Recv\n\
+%5d %5d %5d %5d\n";
+
+
+ int timed_out = 0;
+ float elapsed_time;
+
+ int len, j = 0;
+ char *temp_message_ptr;
+ int nummessages;
+ int *send_socket;
+ int trans_remaining;
+ double bytes_xferd;
+ int msg_flags = 0;
+
+ struct ring_elt *send_ring;
+ struct ring_elt *recv_ring;
+
+ int rsp_bytes_left;
+ int rsp_bytes_recvd;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+ double thruput;
+
+ struct sockaddr_storage peer;
+ struct addrinfo *local_res;
+ struct addrinfo *remote_res;
+
+ struct sctp_rr_request_struct *sctp_rr_request;
+ struct sctp_rr_response_struct *sctp_rr_response;
+ struct sctp_rr_results_struct *sctp_rr_result;
+
+#ifdef WANT_INTERVALS
+ int interval_count;
+ sigset_t signal_set;
+#endif /* WANT_INTERVALS */
+
+ sctp_rr_request =
+ (struct sctp_rr_request_struct *)netperf_request.content.test_specific_data;
+ sctp_rr_response =
+ (struct sctp_rr_response_struct *)netperf_response.content.test_specific_data;
+ sctp_rr_result =
+ (struct sctp_rr_results_struct *)netperf_response.content.test_specific_data;
+
+#ifdef WANT_HISTOGRAM
+ time_hist = HIST_new();
+#endif /* WANT_HISTOGRAM */
+
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ complete_addrinfos(&remote_res,
+ &local_res,
+ remote_host,
+ SOCK_SEQPACKET,
+ IPPROTO_SCTP,
+ 0);
+
+ if ( print_headers ) {
+ print_top_test_header("SCTP 1-TO-MANY REQUEST/RESPONSE TEST",local_res,remote_res);
+ }
+
+ /* initialize a few counters */
+
+ send_ring = NULL;
+ recv_ring = NULL;
+ confidence_iteration = 1;
+ init_stat();
+
+ send_socket = malloc(sizeof(int) * num_associations);
+ if (send_socket == NULL) {
+ fprintf(where,
+ "Could not create the socket array for %d associations",
+ num_associations);
+ fflush(where);
+ exit(1);
+ }
+
+ /* we have a great-big while loop which controls the number of times */
+ /* we run a particular test. this is for the calculation of a */
+ /* confidence interval (I really should have stayed awake during */
+ /* probstats :). If the user did not request confidence measurement */
+ /* (no confidence is the default) then we will only go though the */
+ /* loop once. the confidence stuff originates from the folks at IBM */
+
+ while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
+ (confidence_iteration <= iteration_min)) {
+
+ /* initialize a few counters. we have to remember that we might be */
+ /* going through the loop more than once. */
+
+ nummessages = 0;
+ bytes_xferd = 0.0;
+ times_up = 0;
+ timed_out = 0;
+ trans_remaining = 0;
+
+ /* set-up the data buffers with the requested alignment and offset. */
+ /* since this is a request/response test, default the send_width and */
+ /* recv_width to 1 and not two raj 7/94 */
+
+ if (send_width == 0) send_width = 1;
+ if (recv_width == 0) recv_width = 1;
+
+ if (send_ring == NULL) {
+ send_ring = allocate_buffer_ring(send_width,
+ req_size,
+ local_send_align,
+ local_send_offset);
+ }
+
+ if (recv_ring == NULL) {
+ recv_ring = allocate_buffer_ring(recv_width,
+ rsp_size,
+ local_recv_align,
+ local_recv_offset);
+ }
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back.*/
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ /* Tell the remote end to do a listen. The server alters the socket */
+ /* paramters on the other side at this point, hence the reason for */
+ /* all the values being passed in the setup message. If the user did */
+ /* not specify any of the parameters, they will be passed as 0, which */
+ /* will indicate to the remote that no changes beyond the system's */
+ /* default should be used. Alignment is the exception, it will */
+ /* default to 8, which will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_SCTP_RR_MANY;
+ sctp_rr_request->recv_buf_size = rsr_size_req;
+ sctp_rr_request->send_buf_size = rss_size_req;
+ sctp_rr_request->recv_alignment = remote_recv_align;
+ sctp_rr_request->recv_offset = remote_recv_offset;
+ sctp_rr_request->send_alignment = remote_send_align;
+ sctp_rr_request->send_offset = remote_send_offset;
+ sctp_rr_request->request_size = req_size;
+ sctp_rr_request->response_size = rsp_size;
+ sctp_rr_request->no_delay = rem_nodelay;
+ sctp_rr_request->measure_cpu = remote_cpu_usage;
+ sctp_rr_request->cpu_rate = remote_cpu_rate;
+ sctp_rr_request->so_rcvavoid = rem_rcvavoid;
+ sctp_rr_request->so_sndavoid = rem_sndavoid;
+ if (test_time) {
+ sctp_rr_request->test_length = test_time;
+ }
+ else {
+ sctp_rr_request->test_length = test_trans * num_associations
+ * -1;
+ }
+ sctp_rr_request->non_blocking = non_block;
+ sctp_rr_request->port = atoi(remote_data_port);
+ sctp_rr_request->ipfamily = af_to_nf(remote_res->ai_family);
+ if (debug > 1) {
+ fprintf(where,"netperf: send_sctp_rr_1toMany: requesting SCTP rr test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant */
+ /* socket parameters for this test type. We will put them back into */
+ /* the variables here so they can be displayed if desired. The */
+ /* remote will have calibrated CPU if necessary, and will have done */
+ /* all the needed set-up we will have calibrated the cpu locally */
+ /* before sending the request, and will grab the counter value right*/
+ /* after the connect returns. The remote will grab the counter right*/
+ /* after the accept call. This saves the hassle of extra messages */
+ /* being sent for the sctp tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ rsr_size = sctp_rr_response->recv_buf_size;
+ rss_size = sctp_rr_response->send_buf_size;
+ rem_nodelay = sctp_rr_response->no_delay;
+ remote_cpu_usage = sctp_rr_response->measure_cpu;
+ remote_cpu_rate = sctp_rr_response->cpu_rate;
+ /* make sure that port numbers are in network order */
+ set_port_number(remote_res,
+ (unsigned short)sctp_rr_response->data_port_number);
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+
+ /*set up the data socket list */
+ for (j = 0; j < num_associations; j++) {
+ send_socket[j] = create_data_socket(local_res);
+
+ if (send_socket < 0){
+ perror("netperf: send_sctp_rr_1toMany: sctp stream data socket");
+ exit(1);
+ }
+
+ /*Connect up to the remote port on the data socket */
+ if (connect(send_socket[j],
+ remote_res->ai_addr,
+ remote_res->ai_addrlen) < 0){
+ perror("netperf: data socket connect failed");
+
+ exit(1);
+ }
+
+ /* The client end of the 1-to-Many test uses 1-to-1 sockets.
+ * it doesn't need events.
+ */
+ sctp_enable_events(send_socket[j], 0);
+
+ if (non_block) {
+ if (!set_nonblock(send_socket[j])) {
+ close(send_socket[j]);
+ exit(1);
+ }
+ }
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either the */
+ /* connect would have failed, or the previous response would have */
+ /* indicated a problem. I failed to see the value of the extra */
+ /* message after the accept on the remote. If it failed, we'll see it */
+ /* here. If it didn't, we might as well start pumping data. */
+
+ /* Set-up the test end conditions. For a request/response test, they */
+ /* can be either time or transaction based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ trans_remaining = test_bytes * num_associations;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+#ifdef WANT_INTERVALS
+ if ((interval_burst) || (demo_mode)) {
+ /* zero means that we never pause, so we never should need the */
+ /* interval timer, unless we are in demo_mode */
+ start_itimer(interval_wate);
+ }
+ interval_count = interval_burst;
+ /* get the signal set for the call to sigsuspend */
+ if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &signal_set) != 0) {
+ fprintf(where,
+ "send_sctp_rr_1toMany: unable to get sigmask errno %d\n",
+ errno);
+ fflush(where);
+ exit(1);
+ }
+#endif /* WANT_INTERVALS */
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return false. */
+ /* When the test is controlled by byte count, the time test will */
+ /* always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. I think I */
+ /* just arbitrarily decrement trans_remaining for the timed test, but */
+ /* will not do that just yet... One other question is whether or not */
+ /* the send buffer and the receive buffer should be the same buffer. */
+
+#ifdef WANT_FIRST_BURST
+ {
+ int i;
+ for (j = 0; j < num_associations; j++) {
+ for (i = 0; i < first_burst_size; i++) {
+ if((len=sctp_sendmsg(send_socket[j],
+ send_ring->buffer_ptr, send_size,
+ remote_res->ai_addr,
+ remote_res->ai_addrlen,
+ 0, 0, 0, 0, 0)) != req_size) {
+ /* we should never hit the end of the test in the first burst */
+ perror("send_sctp_rr_1toMany: initial burst data send error");
+ exit(1);
+ }
+ }
+ }
+ }
+#endif /* WANT_FIRST_BURST */
+
+ while ((!times_up) || (trans_remaining > 0)) {
+ /* send the request. we assume that if we use a blocking socket, */
+ /* the request will be sent at one shot. */
+
+ /* this is a fairly poor way of testing 1toMany connections.
+ * For each association we measure round trip time to account for
+ * any delay in lookups and delivery. To stress the server a bit
+ * more we would need a distributed client test, or at least multiple
+ * processes. I want to force as much paralellism as possible, but
+ * this will do for the fist take. vlad
+ */
+ for (j = 0; j < num_associations; j++) {
+#ifdef WANT_HISTOGRAM
+ /* timestamp just before our call to send, and then again just */
+ /* after the receive raj 8/94 */
+ gettimeofday(&time_one,NULL);
+#endif /* WANT_HISTOGRAM */
+
+ while ((len=sctp_sendmsg(send_socket[j],
+ send_ring->buffer_ptr, send_size,
+ remote_res->ai_addr,
+ remote_res->ai_addrlen,
+ 0, 0, 0, 0, 0)) != req_size) {
+ if (non_block && errno == EAGAIN) {
+ /* try sending again */
+ continue;
+ } else if ((errno == EINTR) || (errno == 0)) {
+ /* we hit the end of a */
+ /* timed test. */
+ timed_out = 1;
+ break;
+ }
+ perror("send_sctp_rr_1toMany: data send error");
+ exit(1);
+ }
+
+ if (timed_out) {
+ /* we may have been in a nested while loop - we need */
+ /* another call to break. */
+ break;
+ }
+
+ /* setup for the next time */
+ send_ring = send_ring->next;
+
+ rsp_bytes_left = rsp_size;
+ temp_message_ptr = recv_ring->buffer_ptr;
+ while (!(msg_flags & MSG_EOR)) {
+ if((rsp_bytes_recvd = sctp_recvmsg(send_socket[j],
+ temp_message_ptr,
+ rsp_bytes_left,
+ NULL, 0,
+ NULL, &msg_flags)) < 0) {
+ if (errno == EINTR) {
+ /* We hit the end of a timed test. */
+ timed_out = 1;
+ break;
+ } else if (non_block && errno == EAGAIN) {
+ continue;
+ }
+ perror("send_sctp_rr_1toMany: data recv error");
+ exit(1);
+ }
+ rsp_bytes_left -= rsp_bytes_recvd;
+ temp_message_ptr += rsp_bytes_recvd;
+ }
+ recv_ring = recv_ring->next;
+
+ if (timed_out) {
+ /* we may have been in a nested while loop - we need */
+ /* another call to break. */
+ break;
+ }
+
+#ifdef WANT_HISTOGRAM
+ gettimeofday(&time_two,NULL);
+ HIST_add(time_hist,delta_micro(&time_one,&time_two));
+#endif /* WANT_HISTOGRAM */
+
+ nummessages++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug > 3) {
+ if ((nummessages % 100) == 0) {
+ fprintf(where,
+ "Transaction %d completed\n",
+ nummessages);
+ fflush(where);
+ }
+ }
+ }
+ }
+
+ /* At this point we used to call shutdown on the data socket to be */
+ /* sure all the data was delivered, but this was not germane in a */
+ /* request/response test, and it was causing the tests to "hang" when */
+ /* they were being controlled by time. So, I have replaced this */
+ /* shutdown call with a call to close that can be found later in the */
+ /* procedure. */
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being */
+ /* measured? how long */
+ /* did we really run? */
+
+ /* Get the statistics from the remote end. The remote will have */
+ /* calculated CPU utilization. If it wasn't supposed to care, it */
+ /* will return obvious values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,"netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+ exit(1);
+ }
+
+ /* We now calculate what our throughput was for the test. */
+
+ bytes_xferd = (req_size * nummessages) + (rsp_size * nummessages);
+ thruput = nummessages/elapsed_time;
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+ local_cpu_utilization = calc_cpu_util(0.0);
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ local_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ }
+
+ if (remote_cpu_usage) {
+ remote_cpu_utilization = sctp_rr_result->cpu_util;
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ remote_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ remote_cpu_utilization,
+ sctp_rr_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ }
+ else {
+ /* we were not measuring cpu, for the confidence stuff, we */
+ /* should make it -1.0 */
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ /* at this point, we want to calculate the confidence information. */
+ /* if debugging is on, calculate_confidence will print-out the */
+ /* parameters we pass it */
+
+ calculate_confidence(confidence_iteration,
+ elapsed_time,
+ thruput,
+ local_cpu_utilization,
+ remote_cpu_utilization,
+ local_service_demand,
+ remote_service_demand);
+
+
+ confidence_iteration++;
+
+ /* we are now done with the socket, so close it */
+ for (j = 0; j < num_associations; j++)
+ close(send_socket[j]);
+ }
+
+ retrieve_confident_values(&elapsed_time,
+ &thruput,
+ &local_cpu_utilization,
+ &remote_cpu_utilization,
+ &local_service_demand,
+ &remote_service_demand);
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ if (confidence < 0) {
+ /* we did not hit confidence, but were we asked to look for it? */
+ if (iteration_max > 1) {
+ display_confidence();
+ }
+ }
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ local_cpu_method = format_cpu_method(cpu_method);
+ remote_cpu_method = format_cpu_method(sctp_rr_result->cpu_method);
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand,
+ local_cpu_method);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand,
+ remote_cpu_method);
+ }
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,
+ cpu_title,
+ local_cpu_method,
+ remote_cpu_method);
+ }
+
+ fprintf(where,
+ cpu_fmt_1_line_1, /* the format string */
+ lss_size, /* local sendbuf size */
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* guess */
+ elapsed_time, /* how long was the test */
+ thruput,
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand); /* remote service demand */
+ fprintf(where,
+ cpu_fmt_1_line_2,
+ rss_size,
+ rsr_size);
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ thruput);
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,tput_title,format_units());
+ }
+
+ fprintf(where,
+ tput_fmt_1_line_1, /* the format string */
+ lss_size,
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* how large were the responses */
+ elapsed_time, /* how long did it take */
+ thruput);
+ fprintf(where,
+ tput_fmt_1_line_2,
+ rss_size, /* remote recvbuf size */
+ rsr_size);
+
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ /* how to handle the verbose information in the presence of */
+ /* confidence intervals is yet to be determined... raj 11/94 */
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* TCP statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ fprintf(where,
+ ksink_fmt,
+ local_send_align,
+ remote_recv_offset,
+ local_send_offset,
+ remote_recv_offset);
+
+#ifdef WANT_HISTOGRAM
+ fprintf(where,"\nHistogram of request/response times\n");
+ fflush(where);
+ HIST_report(time_hist);
+#endif /* WANT_HISTOGRAM */
+
+ }
+
+}
+
+
+ /* this routine implements the receive (netserver) side of a TCP_RR */
+ /* test */
+void
+recv_sctp_rr_1toMany()
+{
+
+ struct ring_elt *send_ring;
+ struct ring_elt *recv_ring;
+
+
+ struct sockaddr_in myaddr_in; /* needed to get the port number */
+ struct sockaddr_storage peeraddr; /* to communicate with peer */
+ struct addrinfo *local_res;
+ char local_name[BUFSIZ];
+ char port_buffer[PORTBUFSIZE];
+ int msg_flags;
+
+ int s_rcv;
+ int addrlen;
+ char *temp_message_ptr;
+ int trans_received;
+ int trans_remaining;
+ int bytes_sent;
+ int bytes_recvd;
+ int recv_buf_size;
+ int timed_out = 0;
+ float elapsed_time;
+
+ struct sctp_rr_request_struct *sctp_rr_request;
+ struct sctp_rr_response_struct *sctp_rr_response;
+ struct sctp_rr_results_struct *sctp_rr_results;
+
+ sctp_rr_request =
+ (struct sctp_rr_request_struct *)netperf_request.content.test_specific_data;
+ sctp_rr_response =
+ (struct sctp_rr_response_struct *)netperf_response.content.test_specific_data;
+ sctp_rr_results =
+ (struct sctp_rr_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_sctp_rr_1toMany: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_sctp_rr_1toMany: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = SCTP_RR_MANY_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_sctp_rr_1toMany: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* allocate the recv and send rings with the requested alignments */
+ /* and offsets. raj 7/94 */
+ if (debug) {
+ fprintf(where,"recv_sctp_rr_1toMany: requested recv alignment of %d offset %d\n",
+ sctp_rr_request->recv_alignment,
+ sctp_rr_request->recv_offset);
+ fprintf(where,"recv_sctp_rr_1toMany: requested send alignment of %d offset %d\n",
+ sctp_rr_request->send_alignment,
+ sctp_rr_request->send_offset);
+ fflush(where);
+ }
+
+ /* at some point, these need to come to us from the remote system */
+ if (send_width == 0) send_width = 1;
+ if (recv_width == 0) recv_width = 1;
+
+ send_ring = allocate_buffer_ring(send_width,
+ sctp_rr_request->response_size,
+ sctp_rr_request->send_alignment,
+ sctp_rr_request->send_offset);
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ sctp_rr_request->request_size,
+ sctp_rr_request->recv_alignment,
+ sctp_rr_request->recv_offset);
+
+
+ /* create_data_socket expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lss_size_req = sctp_rr_request->send_buf_size;
+ lsr_size_req = sctp_rr_request->recv_buf_size;
+ loc_nodelay = sctp_rr_request->no_delay;
+ loc_rcvavoid = sctp_rr_request->so_rcvavoid;
+ loc_sndavoid = sctp_rr_request->so_sndavoid;
+ non_block = sctp_rr_request->non_blocking;
+
+ set_hostname_and_port(local_name,
+ port_buffer,
+ nf_to_af(sctp_rr_request->ipfamily),
+ sctp_rr_request->port);
+
+ local_res = complete_addrinfo(local_name,
+ local_name,
+ port_buffer,
+ nf_to_af(sctp_rr_request->ipfamily),
+ SOCK_SEQPACKET,
+ IPPROTO_SCTP,
+ 0);
+
+ /* Grab a socket to listen on, and then listen on it. */
+ if (debug) {
+ fprintf(where,"recv_sctp_rr_1toMany: grabbing a socket...\n");
+ fflush(where);
+ }
+
+ s_rcv = create_data_socket(local_res);
+
+ if (s_rcv < 0) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+
+ exit(1);
+ }
+
+ /* Now, let's set-up the socket to listen for connections */
+ if (listen(s_rcv, 5) == -1) {
+ netperf_response.content.serv_errno = errno;
+ close(s_rcv);
+ send_response();
+
+ exit(1);
+ }
+
+
+ /* now get the port number assigned by the system */
+ addrlen = sizeof(myaddr_in);
+ if (getsockname(s_rcv,
+ (struct sockaddr *)&myaddr_in, &addrlen) == -1){
+ netperf_response.content.serv_errno = errno;
+ close(s_rcv);
+ send_response();
+
+ exit(1);
+ }
+
+ /* Now myaddr_in contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ sctp_rr_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a 0.0 to */
+ /* the initiator. */
+
+ sctp_rr_response->cpu_rate = (float)0.0; /* assume no cpu */
+ sctp_rr_response->measure_cpu = 0;
+
+ if (sctp_rr_request->measure_cpu) {
+ sctp_rr_response->measure_cpu = 1;
+ sctp_rr_response->cpu_rate = calibrate_local_cpu(sctp_rr_request->cpu_rate);
+ }
+
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ sctp_rr_response->send_buf_size = lss_size;
+ sctp_rr_response->recv_buf_size = lsr_size;
+ sctp_rr_response->no_delay = loc_nodelay;
+ sctp_rr_response->so_rcvavoid = loc_rcvavoid;
+ sctp_rr_response->so_sndavoid = loc_sndavoid;
+ sctp_rr_response->test_length = sctp_rr_request->test_length;
+ send_response();
+
+ /* Don't need events */
+ sctp_enable_events(s_rcv, 0);
+
+ /* now that we are connected, mark the socket as non-blocking */
+ if (non_block) {
+ if (!set_nonblock(s_rcv)) {
+ perror("netperf: set_nonblock");
+ exit(1);
+ }
+ }
+
+ /* FIXME: The way 1-to-Many test operates right now, we are including
+ * association setup time into our measurements. The reason for this
+ * is that the client creates multiple endpoints and connects each
+ * endpoint to us using the connect call. On this end we simply call
+ * recvmsg() to get data becuase there is no equivalen of accept() for
+ * 1-to-Many API.
+ * I think this is OK, but if it were to be fixed, the server side
+ * would need to know how many associations are being setup and
+ * have a recvmsg() loop with SCTP_ASSOC_CHANGE events waiting for
+ * all the associations to be be established.
+ * I am punting on this for now.
+ */
+
+
+ addrlen = sizeof(peeraddr);
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(sctp_rr_request->measure_cpu);
+
+ /* The loop will exit when we hit the end of the test time, or when */
+ /* we have exchanged the requested number of transactions. */
+
+ if (sctp_rr_request->test_length > 0) {
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(sctp_rr_request->test_length + PAD_TIME);
+ }
+ else {
+ times_up = 1;
+ trans_remaining = sctp_rr_request->test_length * -1;
+ }
+
+ trans_received = 0;
+
+ while ((!times_up) || (trans_remaining > 0)) {
+
+ recv_buf_size = sctp_rr_request->request_size;
+
+ /* Receive the data. We don't particularly care which association
+ * the data came in on. We'll simply be doing a receive untill
+ * we get and MSG_EOR flag (meaning that a single transmission was
+ * received) and a send to the same address, so the RR would be for
+ * the same associations.
+ * We can get away with this because the client will establish all
+ * the associations before transmitting any data. Any partial data
+ * will not have EOR thus will we will not send a response untill
+ * we get everything.
+ */
+
+ do {
+ msg_flags = 0;
+ if((bytes_recvd = sctp_recvmsg(s_rcv,
+ recv_ring->buffer_ptr,
+ recv_buf_size,
+ (struct sockaddr *)&peeraddr, &addrlen,
+ 0, &msg_flags)) == SOCKET_ERROR) {
+ if (SOCKET_EINTR(bytes_recvd)) {
+ /* the timer popped */
+ timed_out = 1;
+ break;
+ } else if (non_block & errno == EAGAIN) {
+ /* do recvmsg again */
+ continue;
+ }
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+ } while(!(msg_flags & MSG_EOR));
+
+ recv_ring = recv_ring->next;
+
+ if (timed_out) {
+ /* we hit the end of the test based on time - lets */
+ /* bail out of here now... */
+ if (debug) {
+ fprintf(where,"yo5\n");
+ fflush(where);
+ }
+ break;
+ }
+
+ /* Now, send the response to the remote */
+ while ((bytes_sent=sctp_sendmsg(s_rcv,
+ send_ring->buffer_ptr,
+ sctp_rr_request->response_size,
+ (struct sockaddr *)&peeraddr, addrlen,
+ 0, 0, 0, 0, 0)) == SOCKET_ERROR) {
+ if (SOCKET_EINTR(bytes_sent)) {
+ /* the test timer has popped */
+ timed_out = 1;
+ break;
+ } else if (non_block && errno == EAGAIN) {
+ continue;
+ }
+
+ netperf_response.content.serv_errno = 992;
+ send_response();
+ exit(1);
+ }
+
+ if (timed_out) {
+ if (debug) {
+ fprintf(where,"yo6\n");
+ fflush(where);
+ }
+ /* we hit the end of the test based on time - lets */
+ /* bail out of here now... */
+ break;
+ }
+
+ send_ring = send_ring->next;
+
+ trans_received++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+ }
+
+
+ /* The loop now exits due to timeout or transaction count being */
+ /* reached */
+
+ cpu_stop(sctp_rr_request->measure_cpu,&elapsed_time);
+
+ stop_timer();
+
+ if (timed_out) {
+ /* we ended the test by time, which was at least 2 seconds */
+ /* longer than we wanted to run. so, we want to subtract */
+ /* PAD_TIME from the elapsed_time. */
+ elapsed_time -= PAD_TIME;
+ }
+
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_sctp_rr: got %d transactions\n",
+ trans_received);
+ fflush(where);
+ }
+
+ sctp_rr_results->bytes_received = (trans_received *
+ (sctp_rr_request->request_size +
+ sctp_rr_request->response_size));
+ sctp_rr_results->trans_received = trans_received;
+ sctp_rr_results->elapsed_time = elapsed_time;
+ sctp_rr_results->cpu_method = cpu_method;
+ sctp_rr_results->num_cpus = lib_num_loc_cpus;
+ if (sctp_rr_request->measure_cpu) {
+ sctp_rr_results->cpu_util = calc_cpu_util(elapsed_time);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_sctp_rr: test complete, sending results.\n");
+ fflush(where);
+ }
+
+ /* we are now done with the sockets */
+ close(s_rcv);
+
+ send_response();
+
+}
+
+
+void
+print_sctp_usage()
+{
+
+ printf("%s",sctp_usage);
+ exit(1);
+
+}
+void
+scan_sctp_args(argc, argv)
+ int argc;
+ char *argv[];
+
+{
+
+#define SOCKETS_ARGS "BDhH:I:L:m:M:P:r:s:S:VN:T:46"
+
+ extern char *optarg; /* pointer to option string */
+
+ int c;
+
+ char
+ arg1[BUFSIZ], /* argument holders */
+ arg2[BUFSIZ];
+
+ if (no_control) {
+ fprintf(where,
+ "The SCTP tests do not know how to deal with no control tests\n");
+ exit(-1);
+ }
+
+ strncpy(local_data_port,"0",sizeof(local_data_port));
+ strncpy(remote_data_port,"0",sizeof(remote_data_port));
+
+ /* Go through all the command line arguments and break them */
+ /* out. For those options that take two parms, specifying only */
+ /* the first will set both to that value. Specifying only the */
+ /* second will leave the first untouched. To change only the */
+ /* first, use the form "first," (see the routine break_args.. */
+
+ while ((c= getopt(argc, argv, SOCKETS_ARGS)) != EOF) {
+ switch (c) {
+ case '?':
+ case '4':
+ remote_data_family = AF_INET;
+ local_data_family = AF_INET;
+ break;
+ case '6':
+#if defined(AF_INET6)
+ remote_data_family = AF_INET6;
+ local_data_family = AF_INET6;
+#else
+ fprintf(stderr,
+ "This netperf was not compiled on an IPv6 capable host!\n");
+ fflush(stderr);
+ exit(-1);
+#endif
+ break;
+ case 'h':
+ print_sctp_usage();
+ exit(1);
+ case 'b':
+#ifdef WANT_FIRST_BURST
+ first_burst_size = atoi(optarg);
+#else /* WANT_FIRST_BURST */
+ printf("Initial request burst functionality not compiled-in!\n");
+#endif /* WANT_FIRST_BURST */
+ break;
+ case 'D':
+ /* set the nodelay flag */
+ loc_nodelay = 1;
+ rem_nodelay = 1;
+ break;
+ case 'H':
+ break_args_explicit(optarg,arg1,arg2);
+ if (arg1[0]) {
+ /* make sure we leave room for the NULL termination boys and
+ girls. raj 2005-02-82 */
+ remote_data_address = malloc(strlen(arg1)+1);
+ strncpy(remote_data_address,arg1,strlen(arg1));
+ }
+ if (arg2[0])
+ remote_data_family = parse_address_family(arg2);
+ break;
+ case 'L':
+ break_args_explicit(optarg,arg1,arg2);
+ if (arg1[0]) {
+ /* make sure we leave room for the NULL termination boys and
+ girls. raj 2005-02-82 */
+ local_data_address = malloc(strlen(arg1)+1);
+ strncpy(local_data_address,arg1,strlen(arg1));
+ }
+ if (arg2[0])
+ local_data_family = parse_address_family(arg2);
+ break;
+ case 'P':
+ /* set the local and remote data port numbers for the tests to
+ allow them to run through those blankety blank end-to-end
+ breaking firewalls. raj 2004-06-15 */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ strncpy(local_data_port,arg1,sizeof(local_data_port));
+ if (arg2[0])
+ strncpy(remote_data_port,arg2,sizeof(remote_data_port));
+ break;
+ case 's':
+ /* set local socket sizes */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ lss_size_req = convert(arg1);
+ if (arg2[0])
+ lsr_size_req = convert(arg2);
+ break;
+ case 'S':
+ /* set remote socket sizes */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ rss_size_req = convert(arg1);
+ if (arg2[0])
+ rsr_size_req = convert(arg2);
+ break;
+ case 'r':
+ /* set the request/response sizes */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ req_size = convert(arg1);
+ if (arg2[0])
+ rsp_size = convert(arg2);
+ break;
+ case 'm':
+ /* set size of the buffer for each sent message */
+ send_size = convert(optarg);
+ break;
+ case 'M':
+ /* set the size of the buffer for each received message */
+ recv_size = convert(optarg);
+ break;
+ case 't':
+ /* set the test name */
+ strcpy(test_name,optarg);
+ break;
+ case 'W':
+ /* set the "width" of the user space data */
+ /* buffer. This will be the number of */
+ /* send_size buffers malloc'd in the */
+ /* *_STREAM test. It may be enhanced to set */
+ /* both send and receive "widths" but for now */
+ /* it is just the sending *_STREAM. */
+ send_width = convert(optarg);
+ break;
+ case 'V':
+ /* we want to do copy avoidance and will set */
+ /* it for everything, everywhere, if we really */
+ /* can. of course, we don't know anything */
+ /* about the remote... */
+#ifdef SO_SND_COPYAVOID
+ loc_sndavoid = 1;
+#else
+ loc_sndavoid = 0;
+ printf("Local send copy avoidance not available.\n");
+#endif
+#ifdef SO_RCV_COPYAVOID
+ loc_rcvavoid = 1;
+#else
+ loc_rcvavoid = 0;
+ printf("Local recv copy avoidance not available.\n");
+#endif
+ rem_sndavoid = 1;
+ rem_rcvavoid = 1;
+ break;
+ case 'N':
+ /* this opton allows the user to set the number of
+ * messages to send. This in effect modifies the test
+ * time. If we know the message size, then the we can
+ * express the test time as message_size * number_messages
+ */
+ msg_count = convert (optarg);
+ if (msg_count > 0)
+ test_time = 0;
+ break;
+ case 'B':
+ non_block = 1;
+ break;
+ case 'T':
+ num_associations = atoi(optarg);
+ if (num_associations <= 1) {
+ printf("Number of SCTP associations must be >= 1\n");
+ exit(1);
+ }
+ break;
+ };
+ }
+}
+
+#endif /* WANT_SCTP */
diff --git a/nettest_sctp.h b/nettest_sctp.h
new file mode 100644
index 0000000..5297853
--- /dev/null
+++ b/nettest_sctp.h
@@ -0,0 +1,128 @@
+/*
+ Copyright (C) 1993-2003 Hewlett-Packard Company
+*/
+
+ /* This file contains the test-specific definitions for netperf's BSD */
+ /* sockets tests */
+
+
+struct sctp_stream_request_struct {
+ int send_buf_size;
+ int recv_buf_size; /* how big does the client want it - the */
+ /* receive socket buffer that is */
+ int receive_size; /* how many bytes do we want to receive at one */
+ /* time? */
+ int recv_alignment; /* what is the alignment of the receive */
+ /* buffer? */
+ int recv_offset; /* and at what offset from that alignment? */
+ int no_delay; /* do we disable the nagle algorithm for send */
+ /* coalescing? */
+ int measure_cpu; /* does the client want server cpu utilization */
+ /* measured? */
+ float cpu_rate; /* do we know how fast the cpu is already? */
+ int test_length; /* how long is the test? */
+ int so_rcvavoid; /* do we want the remote to avoid copies on */
+ /* receives? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int dirty_count; /* how many integers in the receive buffer */
+ /* should be made dirty before calling recv? */
+ int clean_count; /* how many integers should be read from the */
+ /* recv buffer before calling recv? */
+ int port; /* the to port to which recv side should bind
+ to allow netperf to run through firewalls */
+ int ipfamily; /* address family of ipaddress */
+ int non_blocking; /* run the test in non-blocking mode */
+};
+
+struct sctp_stream_response_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int receive_size;
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ int test_length; /* how long is the test? */
+ int send_buf_size;
+ int data_port_number; /* connect to me here */
+ float cpu_rate; /* could we measure */
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+ int non_blocking; /* run the test in non-blocking mode */
+};
+
+struct sctp_stream_results_struct {
+ double bytes_received;
+ unsigned int recv_calls;
+ float elapsed_time; /* how long the test ran */
+ float cpu_util; /* -1 if not measured */
+ float serv_dem; /* -1 if not measured */
+ int cpu_method; /* how was cpu util measured? */
+ int num_cpus; /* how many CPUs had the remote? */
+};
+
+struct sctp_rr_request_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int send_buf_size;
+ int recv_alignment;
+ int recv_offset;
+ int send_alignment;
+ int send_offset;
+ int request_size;
+ int response_size;
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ float cpu_rate; /* do we know how fast the cpu is? */
+ int test_length; /* how long is the test? */
+ int so_rcvavoid; /* do we want the remote to avoid receive */
+ /* copies? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int port; /* the to port to which recv side should bind
+ to allow netperf to run through firewalls */
+ int ipfamily; /* address family of ipaddress */
+ int non_blocking; /* run the test in non-blocking mode */
+};
+
+struct sctp_rr_response_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ int test_length; /* how long is the test? */
+ int send_buf_size;
+ int data_port_number; /* connect to me here */
+ float cpu_rate; /* could we measure */
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+ int non_blocking; /* run the test in non-blocking mode */
+};
+
+struct sctp_rr_results_struct {
+ unsigned int bytes_received; /* ignored initially */
+ unsigned int recv_calls; /* ignored initially */
+ unsigned int trans_received; /* not ignored */
+ float elapsed_time; /* how long the test ran */
+ float cpu_util; /* -1 if not measured */
+ float serv_dem; /* -1 if not measured */
+ int cpu_method; /* how was cpu util measured? */
+ int num_cpus; /* how many CPUs had the remote? */
+};
+
+#define SCTP_SNDRCV_INFO_EV 0x01
+#define SCTP_ASSOC_CHANGE_EV 0x02
+#define SCTP_PEERADDR_CHANGE_EV 0x04
+#define SCTP_SND_FAILED_EV 0x08
+#define SCTP_REMOTE_ERROR_EV 0x10
+#define SCTP_SHUTDOWN_EV 0x20
+#define SCTP_PD_EV 0x40
+#define SCTP_ADAPT_EV 0x80
+
+typedef enum sctp_disposition {
+ SCTP_OK = 1,
+ SCTP_CLOSE,
+} sctp_disposition_t;
+
+extern void send_sctp_stream();
+extern void send_sctp_rr();
+
+extern void recv_sctp_stream();
+extern void recv_sctp_rr();
+
+extern void loc_cpu_rate();
+extern void rem_cpu_rate();
diff --git a/nettest_sdp.c b/nettest_sdp.c
new file mode 100644
index 0000000..696fd3e
--- /dev/null
+++ b/nettest_sdp.c
@@ -0,0 +1,3553 @@
+#ifndef lint
+char nettest_sdp[]="\
+@(#)nettest_sdp.c (c) Copyright 2007 Hewlett-Packard Co. Version 2.4.4";
+#else
+#define DIRTY
+#define WANT_HISTOGRAM
+#define WANT_INTERVALS
+#endif /* lint */
+
+/****************************************************************/
+/* */
+/* nettest_sdp.c */
+/* */
+/* */
+/* scan_sdp_args() get the sdp command line args */
+/* */
+/* the actual test routines... */
+/* */
+/* send_sdp_stream() perform a sdp stream test */
+/* recv_sdp_stream() */
+/* send_sdp_rr() perform a sdp request/response */
+/* recv_sdp_rr() */
+/* */
+/* relies on create_data_socket in nettest_bsd.c */
+/****************************************************************/
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if defined(WANT_SDP)
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#ifdef NOSTDLIBH
+#include <malloc.h>
+#else /* NOSTDLIBH */
+#include <stdlib.h>
+#endif /* NOSTDLIBH */
+
+#if !defined(__VMS)
+#include <sys/ipc.h>
+#endif /* !defined(__VMS) */
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+/* would seem that not all sdp.h files define a MSG_EOF, but that
+ MSG_EOF can be the same as MSG_FIN so lets work with that
+ assumption. initial find by Jon Pedersen. raj 2006-02-01 */
+#ifndef MSG_EOF
+#ifdef MSG_FIN
+#define MSG_EOF MSG_FIN
+#else
+#error Must have either MSG_EOF or MSG_FIN defined
+#endif
+#endif
+
+#include "netlib.h"
+#include "netsh.h"
+/* get some of the functions from nettest_bsd.c */
+#include "nettest_bsd.h"
+#include "nettest_sdp.h"
+
+#ifdef WANT_HISTOGRAM
+#ifdef __sgi
+#include <sys/time.h>
+#endif /* __sgi */
+#include "hist.h"
+#endif /* WANT_HISTOGRAM */
+
+#ifdef WANT_FIRST_BURST
+extern int first_burst_size;
+#endif /* WANT_FIRST_BURST */
+
+
+
+/* these variables are specific to SDP tests. declare */
+/* them static to make them global only to this file. */
+
+static int
+ msg_count = 0, /* number of messages to transmit on association */
+ non_block = 0, /* default to blocking sockets */
+ num_associations = 1; /* number of associations on the endpoint */
+
+static int confidence_iteration;
+static char local_cpu_method;
+static char remote_cpu_method;
+
+#ifdef WANT_HISTOGRAM
+static struct timeval time_one;
+static struct timeval time_two;
+static HIST time_hist;
+#endif /* WANT_HISTOGRAM */
+
+
+char sdp_usage[] = "\n\
+Usage: netperf [global options] -- [test options] \n\
+\n\
+SDP Sockets Test Options:\n\
+ -b number Send number requests at the start of _RR tests\n\
+ -D [L][,R] Set SDP_NODELAY locally and/or remotely\n\
+ -h Display this text\n\
+ -H name,fam Use name (or IP) and family as target of data connection\n\
+ -L name,fam Use name (or IP) and family as source of data connextion\n\
+ -m bytes Set the size of each sent message\n\
+ -M bytes Set the size of each received messages\n\
+ -P local[,remote] Set the local/remote port for the data socket\n\
+ -r req,[rsp] Set request/response sizes (_RR tests)\n\
+ -s send[,recv] Set local socket send/recv buffer sizes\n\
+ -S send[,recv] Set remote socket send/recv buffer sizes\n\
+ -V Enable copy avoidance if supported\n\
+ -4 Use AF_INET (eg IPv4) on both ends of the data conn\n\
+ -6 Use AF_INET6 (eg IPv6) on both ends of the data conn\n\
+\n\
+For those options taking two parms, at least one must be specified;\n\
+specifying one value without a comma will set both parms to that\n\
+value, specifying a value with a leading comma will set just the second\n\
+parm, a value with a trailing comma will set just the first. To set\n\
+each parm to unique values, specify both and separate them with a\n\
+comma.\n";
+
+
+ /* This routine is intended to retrieve interesting aspects of sdp */
+ /* for the data connection. at first, it attempts to retrieve the */
+ /* maximum segment size. later, it might be modified to retrieve */
+ /* other information, but it must be information that can be */
+ /* retrieved quickly as it is called during the timing of the test. */
+ /* for that reason, a second routine may be created that can be */
+ /* called outside of the timing loop */
+static
+void
+get_sdp_info(int socket, int * mss)
+{
+
+#ifdef TCP_MAXSEG
+ netperf_socklen_t sock_opt_len;
+
+ sock_opt_len = sizeof(netperf_socklen_t);
+ if (getsockopt(socket,
+ getprotobyname("tcp")->p_proto,
+ TCP_MAXSEG,
+ (char *)mss,
+ &sock_opt_len) == SOCKET_ERROR) {
+ fprintf(where,
+ "netperf: get_sdp_info: getsockopt TCP_MAXSEG: errno %d\n",
+ errno);
+ fflush(where);
+ *mss = -1;
+ }
+#else
+ *mss = -1;
+#endif /* TCP_MAXSEG */
+
+}
+
+void
+send_sdp_stream(char remote_host[])
+{
+
+ char *tput_title = "\
+Recv Send Send \n\
+Socket Socket Message Elapsed \n\
+Size Size Size Time Throughput \n\
+bytes bytes bytes secs. %s/sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f %s\n";
+
+ char *tput_fmt_1 =
+ "%6d %6d %6d %-6.2f %7.2f %s\n";
+
+ char *cpu_title = "\
+Recv Send Send Utilization Service Demand\n\
+Socket Socket Message Elapsed Send Recv Send Recv\n\
+Size Size Size Time Throughput local remote local remote\n\
+bytes bytes bytes secs. %-8.8s/s %% %c %% %c us/KB us/KB\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f %c %s\n";
+
+ char *cpu_fmt_1 =
+ "%6d %6d %6d %-6.2f %7.2f %-6.2f %-6.2f %-6.3f %-6.3f %s\n";
+
+ char *ksink_fmt = "\n\
+Alignment Offset %-8.8s %-8.8s Sends %-8.8s Recvs\n\
+Local Remote Local Remote Xfered Per Per\n\
+Send Recv Send Recv Send (avg) Recv (avg)\n\
+%5d %5d %5d %5d %6.4g %6.2f %6d %6.2f %6d\n";
+
+ char *ksink_fmt2 = "\n\
+Maximum\n\
+Segment\n\
+Size (bytes)\n\
+%6d\n";
+
+
+ float elapsed_time;
+
+ /* what we want is to have a buffer space that is at least one */
+ /* send-size greater than our send window. this will insure that we */
+ /* are never trying to re-use a buffer that may still be in the hands */
+ /* of the transport. This buffer will be malloc'd after we have found */
+ /* the size of the local senc socket buffer. We will want to deal */
+ /* with alignment and offset concerns as well. */
+
+ struct ring_elt *send_ring;
+
+ int len;
+ unsigned int nummessages = 0;
+ SOCKET send_socket;
+ int bytes_remaining;
+ int sdp_mss = -1; /* possibly uninitialized on printf far below */
+
+ /* with links like fddi, one can send > 32 bits worth of bytes */
+ /* during a test... ;-) at some point, this should probably become a */
+ /* 64bit integral type, but those are not entirely common yet */
+
+ unsigned long long local_bytes_sent = 0;
+ double bytes_sent = 0.0;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+
+ double thruput;
+
+ struct addrinfo *remote_res;
+ struct addrinfo *local_res;
+
+ struct sdp_stream_request_struct *sdp_stream_request;
+ struct sdp_stream_response_struct *sdp_stream_response;
+ struct sdp_stream_results_struct *sdp_stream_result;
+
+ sdp_stream_request =
+ (struct sdp_stream_request_struct *)netperf_request.content.test_specific_data;
+ sdp_stream_response =
+ (struct sdp_stream_response_struct *)netperf_response.content.test_specific_data;
+ sdp_stream_result =
+ (struct sdp_stream_results_struct *)netperf_response.content.test_specific_data;
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ time_hist = HIST_new();
+ }
+#endif /* WANT_HISTOGRAM */
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ /* complete_addrinfos will either succede or exit the process */
+ complete_addrinfos(&remote_res,
+ &local_res,
+ remote_host,
+ SOCK_STREAM,
+ IPPROTO_TCP,
+ 0);
+
+ if ( print_headers ) {
+ print_top_test_header("SDP STREAM TEST",local_res,remote_res);
+ }
+
+ send_ring = NULL;
+ confidence_iteration = 1;
+ init_stat();
+
+ /* we have a great-big while loop which controls the number of times */
+ /* we run a particular test. this is for the calculation of a */
+ /* confidence interval (I really should have stayed awake during */
+ /* probstats :). If the user did not request confidence measurement */
+ /* (no confidence is the default) then we will only go though the */
+ /* loop once. the confidence stuff originates from the folks at IBM */
+
+ while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
+ (confidence_iteration <= iteration_min)) {
+
+ /* initialize a few counters. we have to remember that we might be */
+ /* going through the loop more than once. */
+
+ nummessages = 0;
+ bytes_sent = 0.0;
+ times_up = 0;
+
+ /*set up the data socket */
+ /* fake things out by changing local_res->ai_family to AF_INET_SDP */
+ local_res->ai_family = AF_INET_SDP;
+ local_res->ai_protocol = 0;
+ send_socket = create_data_socket(local_res);
+
+ if (send_socket == INVALID_SOCKET){
+ perror("netperf: send_sdp_stream: sdp stream data socket");
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"send_sdp_stream: send_socket obtained...\n");
+ }
+
+ /* at this point, we have either retrieved the socket buffer sizes, */
+ /* or have tried to set them, so now, we may want to set the send */
+ /* size based on that (because the user either did not use a -m */
+ /* option, or used one with an argument of 0). If the socket buffer */
+ /* size is not available, we will set the send size to 4KB - no */
+ /* particular reason, just arbitrary... */
+ if (send_size == 0) {
+ if (lss_size > 0) {
+ send_size = lss_size;
+ }
+ else {
+ send_size = 4096;
+ }
+ }
+
+ /* set-up the data buffer ring with the requested alignment and offset. */
+ /* note also that we have allocated a quantity */
+ /* of memory that is at least one send-size greater than our socket */
+ /* buffer size. We want to be sure that there are at least two */
+ /* buffers allocated - this can be a bit of a problem when the */
+ /* send_size is bigger than the socket size, so we must check... the */
+ /* user may have wanted to explicitly set the "width" of our send */
+ /* buffers, we should respect that wish... */
+ if (send_width == 0) {
+ send_width = (lss_size/send_size) + 1;
+ if (send_width == 1) send_width++;
+ }
+
+ if (send_ring == NULL) {
+ /* only allocate the send ring once. this is a networking test, */
+ /* not a memory allocation test. this way, we do not need a */
+ /* deallocate_buffer_ring() routine, and I don't feel like */
+ /* writing one anyway :) raj 11/94 */
+ send_ring = allocate_buffer_ring(send_width,
+ send_size,
+ local_send_align,
+ local_send_offset);
+ }
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back. */
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ if (!no_control) {
+ /* Tell the remote end to do a listen. The server alters the
+ socket paramters on the other side at this point, hence the
+ reason for all the values being passed in the setup
+ message. If the user did not specify any of the parameters,
+ they will be passed as 0, which will indicate to the remote
+ that no changes beyond the system's default should be
+ used. Alignment is the exception, it will default to 1, which
+ will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_SDP_STREAM;
+ sdp_stream_request->send_buf_size = rss_size_req;
+ sdp_stream_request->recv_buf_size = rsr_size_req;
+ sdp_stream_request->receive_size = recv_size;
+ sdp_stream_request->no_delay = rem_nodelay;
+ sdp_stream_request->recv_alignment = remote_recv_align;
+ sdp_stream_request->recv_offset = remote_recv_offset;
+ sdp_stream_request->measure_cpu = remote_cpu_usage;
+ sdp_stream_request->cpu_rate = remote_cpu_rate;
+ if (test_time) {
+ sdp_stream_request->test_length = test_time;
+ }
+ else {
+ sdp_stream_request->test_length = test_bytes;
+ }
+ sdp_stream_request->so_rcvavoid = rem_rcvavoid;
+ sdp_stream_request->so_sndavoid = rem_sndavoid;
+#ifdef DIRTY
+ sdp_stream_request->dirty_count = rem_dirty_count;
+ sdp_stream_request->clean_count = rem_clean_count;
+#endif /* DIRTY */
+ sdp_stream_request->port = atoi(remote_data_port);
+ sdp_stream_request->ipfamily = af_to_nf(remote_res->ai_family);
+ if (debug > 1) {
+ fprintf(where,
+ "netperf: send_sdp_stream: requesting SDP stream test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant
+ socket parameters for this test type. We will put them back
+ into the variables here so they can be displayed if desired.
+ The remote will have calibrated CPU if necessary, and will
+ have done all the needed set-up we will have calibrated the
+ cpu locally before sending the request, and will grab the
+ counter value right after the connect returns. The remote
+ will grab the counter right after the accept call. This saves
+ the hassle of extra messages being sent for the SDP
+ tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote listen done.\n");
+ rsr_size = sdp_stream_response->recv_buf_size;
+ rss_size = sdp_stream_response->send_buf_size;
+ rem_nodelay = sdp_stream_response->no_delay;
+ remote_cpu_usage= sdp_stream_response->measure_cpu;
+ remote_cpu_rate = sdp_stream_response->cpu_rate;
+
+ /* we have to make sure that the server port number is in
+ network order */
+ set_port_number(remote_res,
+ (short)sdp_stream_response->data_port_number);
+
+ rem_rcvavoid = sdp_stream_response->so_rcvavoid;
+ rem_sndavoid = sdp_stream_response->so_sndavoid;
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+ }
+
+#ifdef WANT_DEMO
+ DEMO_STREAM_SETUP(lss_size,rsr_size)
+#endif
+
+ /*Connect up to the remote port on the data socket */
+ if (connect(send_socket,
+ remote_res->ai_addr,
+ remote_res->ai_addrlen) == INVALID_SOCKET){
+ perror("netperf: send_sdp_stream: data socket connect failed");
+ exit(1);
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either */
+ /* the connect would have failed, or the previous response would */
+ /* have indicated a problem. I failed to see the value of the */
+ /* extra message after the accept on the remote. If it failed, */
+ /* we'll see it here. If it didn't, we might as well start pumping */
+ /* data. */
+
+ /* Set-up the test end conditions. For a stream test, they can be */
+ /* either time or byte-count based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ bytes_remaining = 0;
+ /* in previous revisions, we had the same code repeated throught */
+ /* all the test suites. this was unnecessary, and meant more */
+ /* work for me when I wanted to switch to POSIX signals, so I */
+ /* have abstracted this out into a routine in netlib.c. if you */
+ /* are experiencing signal problems, you might want to look */
+ /* there. raj 11/94 */
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ bytes_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+ /* we only start the interval timer if we are using the
+ timer-timed intervals rather than the sit and spin ones. raj
+ 2006-02-06 */
+#if defined(WANT_INTERVALS)
+ INTERVALS_INIT();
+#endif /* WANT_INTERVALS */
+
+ /* before we start, initialize a few variables */
+
+#ifdef WANT_DEMO
+ if (demo_mode) {
+ HIST_timestamp(demo_one_ptr);
+ }
+#endif
+
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return false. */
+ /* When the test is controlled by byte count, the time test will */
+ /* always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. */
+
+ while ((!times_up) || (bytes_remaining > 0)) {
+
+#ifdef DIRTY
+ access_buffer(send_ring->buffer_ptr,
+ send_size,
+ loc_dirty_count,
+ loc_clean_count);
+#endif /* DIRTY */
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ /* timestamp just before we go into send and then again just
+ after we come out raj 8/94 */
+ /* but lets only do this if there is going to be a histogram
+ displayed */
+ HIST_timestamp(&time_one);
+ }
+#endif /* WANT_HISTOGRAM */
+
+ if((len=send(send_socket,
+ send_ring->buffer_ptr,
+ send_size,
+ 0)) != send_size) {
+ if ((len >=0) || SOCKET_EINTR(len)) {
+ /* the test was interrupted, must be the end of test */
+ break;
+ }
+ perror("netperf: data send error");
+ printf("len was %d\n",len);
+ exit(1);
+ }
+
+ local_bytes_sent += send_size;
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ /* timestamp the exit from the send call and update the histogram */
+ HIST_timestamp(&time_two);
+ HIST_add(time_hist,delta_micro(&time_one,&time_two));
+ }
+#endif /* WANT_HISTOGRAM */
+
+#ifdef WANT_DEMO
+ DEMO_STREAM_INTERVAL(send_size)
+#endif
+
+#if defined(WANT_INTERVALS)
+ INTERVALS_WAIT();
+#endif /* WANT_INTERVALS */
+
+ /* now we want to move our pointer to the next position in the */
+ /* data buffer...we may also want to wrap back to the "beginning" */
+ /* of the bufferspace, so we will mod the number of messages sent */
+ /* by the send width, and use that to calculate the offset to add */
+ /* to the base pointer. */
+ nummessages++;
+ send_ring = send_ring->next;
+ if (bytes_remaining) {
+ bytes_remaining -= send_size;
+ }
+ }
+
+ /* The test is over. Flush the buffers to the remote end. We do a */
+ /* graceful release to insure that all data has been taken by the */
+ /* remote. */
+
+ /* but first, if the verbosity is greater than 1, find-out what */
+ /* the SDP maximum segment_size was (if possible) */
+ if (verbosity > 1) {
+ sdp_mss = -1;
+ get_sdp_info(send_socket,&sdp_mss);
+ }
+
+ if (shutdown(send_socket,SHUT_WR) == SOCKET_ERROR) {
+ perror("netperf: cannot shutdown sdp stream socket");
+ exit(1);
+ }
+
+ /* hang a recv() off the socket to block until the remote has */
+ /* brought all the data up into the application. it will do a */
+ /* shutdown to cause a FIN to be sent our way. We will assume that */
+ /* any exit from the recv() call is good... raj 4/93 */
+
+ recv(send_socket, send_ring->buffer_ptr, send_size, 0);
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being */
+ /* measured and how */
+ /* long did we really */
+ /* run? */
+
+ /* we are finished with the socket, so close it to prevent hitting */
+ /* the limit on maximum open files. */
+
+ close(send_socket);
+
+ if (!no_control) {
+ /* Get the statistics from the remote end. The remote will have
+ calculated service demand and all those interesting
+ things. If it wasn't supposed to care, it will return obvious
+ values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+
+ /* We now calculate what our thruput was for the test. In the
+ future, we may want to include a calculation of the thruput
+ measured by the remote, but it should be the case that for a
+ SDP stream test, that the two numbers should be *very*
+ close... We calculate bytes_sent regardless of the way the
+ test length was controlled. If it was time, we needed to,
+ and if it was by bytes, the user may have specified a number
+ of bytes that wasn't a multiple of the send_size, so we
+ really didn't send what he asked for ;-) */
+
+ bytes_sent = ntohd(sdp_stream_result->bytes_received);
+ }
+ else {
+ bytes_sent = (double)local_bytes_sent;
+ }
+
+ thruput = calc_thruput(bytes_sent);
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+
+ local_cpu_utilization = calc_cpu_util(0.0);
+ local_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ }
+
+ if (remote_cpu_usage) {
+
+ remote_cpu_utilization = sdp_stream_result->cpu_util;
+ remote_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ remote_cpu_utilization,
+ sdp_stream_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+ }
+ else {
+ /* we were not measuring cpu, for the confidence stuff, we */
+ /* should make it -1.0 */
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ /* at this point, we want to calculate the confidence information. */
+ /* if debugging is on, calculate_confidence will print-out the */
+ /* parameters we pass it */
+
+ calculate_confidence(confidence_iteration,
+ elapsed_time,
+ thruput,
+ local_cpu_utilization,
+ remote_cpu_utilization,
+ local_service_demand,
+ remote_service_demand);
+
+
+ confidence_iteration++;
+ }
+
+ /* at this point, we have finished making all the runs that we */
+ /* will be making. so, we should extract what the calcuated values */
+ /* are for all the confidence stuff. we could make the values */
+ /* global, but that seemed a little messy, and it did not seem worth */
+ /* all the mucking with header files. so, we create a routine much */
+ /* like calcualte_confidence, which just returns the mean values. */
+ /* raj 11/94 */
+
+ retrieve_confident_values(&elapsed_time,
+ &thruput,
+ &local_cpu_utilization,
+ &remote_cpu_utilization,
+ &local_service_demand,
+ &remote_service_demand);
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ if (confidence < 0) {
+ /* we did not hit confidence, but were we asked to look for it? */
+ if (iteration_max > 1) {
+ display_confidence();
+ }
+ }
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ local_cpu_method = format_cpu_method(cpu_method);
+ remote_cpu_method = format_cpu_method(sdp_stream_result->cpu_method);
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand,
+ local_cpu_method,
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand,
+ remote_cpu_method,
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ }
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,
+ cpu_title,
+ format_units(),
+ local_cpu_method,
+ remote_cpu_method);
+ }
+
+ fprintf(where,
+ cpu_fmt_1, /* the format string */
+ rsr_size, /* remote recvbuf size */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long was the test */
+ thruput, /* what was the xfer rate */
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand, /* remote service demand */
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ thruput,
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,tput_title,format_units());
+ }
+ fprintf(where,
+ tput_fmt_1, /* the format string */
+ rsr_size, /* remote recvbuf size */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long did it take */
+ thruput, /* how fast did it go */
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* SDP statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ /* this stuff needs to be worked-out in the presence of confidence */
+ /* intervals and multiple iterations of the test... raj 11/94 */
+
+ fprintf(where,
+ ksink_fmt,
+ "Bytes",
+ "Bytes",
+ "Bytes",
+ local_send_align,
+ remote_recv_align,
+ local_send_offset,
+ remote_recv_offset,
+ bytes_sent,
+ bytes_sent / (double)nummessages,
+ nummessages,
+ bytes_sent / (double)sdp_stream_result->recv_calls,
+ sdp_stream_result->recv_calls);
+ fprintf(where,
+ ksink_fmt2,
+ sdp_mss);
+ fflush(where);
+#ifdef WANT_HISTOGRAM
+ fprintf(where,"\n\nHistogram of time spent in send() call.\n");
+ fflush(where);
+ HIST_report(time_hist);
+#endif /* WANT_HISTOGRAM */
+ }
+
+}
+
+
+
+/* This routine implements the netperf-side SDP unidirectional data
+ transfer test (a.k.a. stream) for the sockets interface where the
+ data flow is from the netserver to the netperf. It receives its
+ parameters via global variables from the shell and writes its
+ output to the standard output. */
+
+
+void
+send_sdp_maerts(char remote_host[])
+{
+
+ char *tput_title = "\
+Recv Send Send \n\
+Socket Socket Message Elapsed \n\
+Size Size Size Time Throughput \n\
+bytes bytes bytes secs. %s/sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f %s\n";
+
+ char *tput_fmt_1 =
+ "%6d %6d %6d %-6.2f %7.2f \n %s";
+
+ char *cpu_title = "\
+Recv Send Send Utilization Service Demand\n\
+Socket Socket Message Elapsed Send Recv Send Recv\n\
+Size Size Size Time Throughput local remote local remote\n\
+bytes bytes bytes secs. %-8.8s/s %% %c %% %c us/KB us/KB\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f %c %s\n";
+
+ char *cpu_fmt_1 =
+ "%6d %6d %6d %-6.2f %7.2f %-6.2f %-6.2f %-6.3f %-6.3f %s\n";
+
+ char *ksink_fmt = "\n\
+Alignment Offset %-8.8s %-8.8s Recvs %-8.8s Sends\n\
+Local Remote Local Remote Xfered Per Per\n\
+Recv Send Recv Send Recv (avg) Send (avg)\n\
+%5d %5d %5d %5d %6.4g %6.2f %6d %6.2f %6d\n";
+
+ char *ksink_fmt2 = "\n\
+Maximum\n\
+Segment\n\
+Size (bytes)\n\
+%6d\n";
+
+
+ float elapsed_time;
+
+ /* what we want is to have a buffer space that is at least one */
+ /* recv-size greater than our recv window. this will insure that we */
+ /* are never trying to re-use a buffer that may still be in the hands */
+ /* of the transport. This buffer will be malloc'd after we have found */
+ /* the size of the local senc socket buffer. We will want to deal */
+ /* with alignment and offset concerns as well. */
+
+ struct ring_elt *recv_ring;
+
+ int len;
+ unsigned int nummessages = 0;
+ SOCKET recv_socket;
+ int bytes_remaining;
+ int sdp_mss = -1; /* possibly uninitialized on printf far below */
+
+ /* with links like fddi, one can recv > 32 bits worth of bytes */
+ /* during a test... ;-) at some point, this should probably become a */
+ /* 64bit integral type, but those are not entirely common yet */
+ double bytes_sent = 0.0;
+ unsigned long long local_bytes_recvd = 0;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+
+ double thruput;
+
+ struct addrinfo *remote_res;
+ struct addrinfo *local_res;
+
+ struct sdp_maerts_request_struct *sdp_maerts_request;
+ struct sdp_maerts_response_struct *sdp_maerts_response;
+ struct sdp_maerts_results_struct *sdp_maerts_result;
+
+ sdp_maerts_request =
+ (struct sdp_maerts_request_struct *)netperf_request.content.test_specific_data;
+ sdp_maerts_response =
+ (struct sdp_maerts_response_struct *)netperf_response.content.test_specific_data;
+ sdp_maerts_result =
+ (struct sdp_maerts_results_struct *)netperf_response.content.test_specific_data;
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ time_hist = HIST_new();
+ }
+#endif /* WANT_HISTOGRAM */
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ complete_addrinfos(&remote_res,
+ &local_res,
+ remote_host,
+ SOCK_STREAM,
+ IPPROTO_TCP,
+ 0);
+
+ if ( print_headers ) {
+ print_top_test_header("SDP MAERTS TEST",local_res,remote_res);
+ }
+
+ recv_ring = NULL;
+ confidence_iteration = 1;
+ init_stat();
+
+ /* we have a great-big while loop which controls the number of times */
+ /* we run a particular test. this is for the calculation of a */
+ /* confidence interval (I really should have stayed awake during */
+ /* probstats :). If the user did not request confidence measurement */
+ /* (no confidence is the default) then we will only go though the */
+ /* loop once. the confidence stuff originates from the folks at IBM */
+
+ while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
+ (confidence_iteration <= iteration_min)) {
+
+ /* initialize a few counters. we have to remember that we might be */
+ /* going through the loop more than once. */
+
+ nummessages = 0;
+ bytes_sent = 0.0;
+ times_up = 0;
+
+ /*set up the data socket */
+ /* fake things out by changing local_res->ai_family to AF_INET_SDP */
+ local_res->ai_family = AF_INET_SDP;
+ local_res->ai_protocol = 0;
+ recv_socket = create_data_socket(local_res);
+
+ if (recv_socket == INVALID_SOCKET){
+ perror("netperf: send_sdp_maerts: sdp stream data socket");
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"send_sdp_maerts: recv_socket obtained...\n");
+ }
+
+ /* at this point, we have either retrieved the socket buffer sizes, */
+ /* or have tried to set them, so now, we may want to set the recv */
+ /* size based on that (because the user either did not use a -m */
+ /* option, or used one with an argument of 0). If the socket buffer */
+ /* size is not available, we will set the recv size to 4KB - no */
+ /* particular reason, just arbitrary... */
+ if (recv_size == 0) {
+ if (lsr_size > 0) {
+ recv_size = lsr_size;
+ }
+ else {
+ recv_size = 4096;
+ }
+ }
+
+ /* set-up the data buffer ring with the requested alignment and offset. */
+ /* note also that we have allocated a quantity */
+ /* of memory that is at least one recv-size greater than our socket */
+ /* buffer size. We want to be sure that there are at least two */
+ /* buffers allocated - this can be a bit of a problem when the */
+ /* recv_size is bigger than the socket size, so we must check... the */
+ /* user may have wanted to explicitly set the "width" of our recv */
+ /* buffers, we should respect that wish... */
+ if (recv_width == 0) {
+ recv_width = (lsr_size/recv_size) + 1;
+ if (recv_width == 1) recv_width++;
+ }
+
+ if (recv_ring == NULL) {
+ /* only allocate the recv ring once. this is a networking test, */
+ /* not a memory allocation test. this way, we do not need a */
+ /* deallocate_buffer_ring() routine, and I don't feel like */
+ /* writing one anyway :) raj 11/94 */
+ recv_ring = allocate_buffer_ring(recv_width,
+ recv_size,
+ local_recv_align,
+ local_recv_offset);
+ }
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back. */
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ if (!no_control) {
+ /* Tell the remote end to do a listen. The server alters the
+ socket paramters on the other side at this point, hence the
+ reason for all the values being passed in the setup
+ message. If the user did not specify any of the parameters,
+ they will be passed as 0, which will indicate to the remote
+ that no changes beyond the system's default should be
+ used. Alignment is the exception, it will default to 1, which
+ will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_SDP_MAERTS;
+ sdp_maerts_request->send_buf_size = rss_size_req;
+ sdp_maerts_request->recv_buf_size = rsr_size_req;
+ sdp_maerts_request->send_size = send_size;
+ sdp_maerts_request->no_delay = rem_nodelay;
+ sdp_maerts_request->send_alignment = remote_send_align;
+ sdp_maerts_request->send_offset = remote_send_offset;
+ sdp_maerts_request->measure_cpu = remote_cpu_usage;
+ sdp_maerts_request->cpu_rate = remote_cpu_rate;
+ if (test_time) {
+ sdp_maerts_request->test_length = test_time;
+ }
+ else {
+ sdp_maerts_request->test_length = test_bytes;
+ }
+ sdp_maerts_request->so_rcvavoid = rem_rcvavoid;
+ sdp_maerts_request->so_sndavoid = rem_sndavoid;
+#ifdef DIRTY
+ sdp_maerts_request->dirty_count = rem_dirty_count;
+ sdp_maerts_request->clean_count = rem_clean_count;
+#endif /* DIRTY */
+ sdp_maerts_request->port = atoi(remote_data_port);
+ sdp_maerts_request->ipfamily = af_to_nf(remote_res->ai_family);
+ if (debug > 1) {
+ fprintf(where,
+ "netperf: send_sdp_maerts: requesting SDP maerts test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant
+ socket parameters for this test type. We will put them back
+ into the variables here so they can be displayed if desired.
+ The remote will have calibrated CPU if necessary, and will
+ have done all the needed set-up we will have calibrated the
+ cpu locally before sending the request, and will grab the
+ counter value right after the connect returns. The remote
+ will grab the counter right after the accept call. This saves
+ the hassle of extra messages being sent for the SDP
+ tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote listen done.\n");
+ rsr_size = sdp_maerts_response->recv_buf_size;
+ rss_size = sdp_maerts_response->send_buf_size;
+ rem_nodelay = sdp_maerts_response->no_delay;
+ remote_cpu_usage= sdp_maerts_response->measure_cpu;
+ remote_cpu_rate = sdp_maerts_response->cpu_rate;
+ send_size = sdp_maerts_response->send_size;
+
+ /* we have to make sure that the server port number is in
+ network order */
+ set_port_number(remote_res,
+ (short)sdp_maerts_response->data_port_number);
+ rem_rcvavoid = sdp_maerts_response->so_rcvavoid;
+ rem_sndavoid = sdp_maerts_response->so_sndavoid;
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+ }
+
+#ifdef WANT_DEMO
+ DEMO_STREAM_SETUP(lsr_size,rss_size)
+#endif
+
+ /*Connect up to the remote port on the data socket */
+ if (connect(recv_socket,
+ remote_res->ai_addr,
+ remote_res->ai_addrlen) == INVALID_SOCKET){
+ perror("netperf: send_sdp_maerts: data socket connect failed");
+ exit(1);
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either */
+ /* the connect would have failed, or the previous response would */
+ /* have indicated a problem. I failed to see the value of the */
+ /* extra message after the accept on the remote. If it failed, */
+ /* we'll see it here. If it didn't, we might as well start pumping */
+ /* data. */
+
+ /* Set-up the test end conditions. For a maerts test, they can be */
+ /* either time or byte-count based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ bytes_remaining = 0;
+ /* in previous revisions, we had the same code repeated throught */
+ /* all the test suites. this was unnecessary, and meant more */
+ /* work for me when I wanted to switch to POSIX signals, so I */
+ /* have abstracted this out into a routine in netlib.c. if you */
+ /* are experiencing signal problems, you might want to look */
+ /* there. raj 11/94 */
+ if (!no_control) {
+ /* this is a netperf to netserver test, netserver will close
+ to tell us the test is over, so use PAD_TIME to avoid
+ causing the netserver fits. */
+ start_timer(test_time + PAD_TIME);
+ }
+ else {
+ /* this is a netperf to data source test, no PAD_TIME */
+ start_timer(test_time);
+ }
+ }
+ else {
+ /* The tester wanted to recv a number of bytes. we don't do that
+ in a SDP_MAERTS test. sorry. raj 2002-06-21 */
+ printf("netperf: send_sdp_maerts: test must be timed\n");
+ exit(1);
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+#ifdef WANT_INTERVALS
+ INTERVALS_INIT();
+#endif /* WANT_INTERVALS */
+
+ /* before we start, initialize a few variables */
+
+#ifdef WANT_DEMO
+ if (demo_mode) {
+ HIST_timestamp(demo_one_ptr);
+ }
+#endif
+
+ /* the test will continue until we either get a zero-byte recv()
+ on the socket or our failsafe timer expires. most of the time
+ we trust that we get a zero-byte recieve from the socket. raj
+ 2002-06-21 */
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ /* timestamp just before we go into recv and then again just
+ after we come out raj 8/94 */
+ /* but only if we are actually going to display a histogram. raj
+ 2006-02-07 */
+ HIST_timestamp(&time_one);
+ }
+#endif /* WANT_HISTOGRAM */
+
+ while ((!times_up) && (len=recv(recv_socket,
+ recv_ring->buffer_ptr,
+ recv_size,
+ 0)) > 0 ) {
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ /* timestamp the exit from the recv call and update the histogram */
+ HIST_timestamp(&time_two);
+ HIST_add(time_hist,delta_micro(&time_one,&time_two));
+ }
+#endif /* WANT_HISTOGRAM */
+
+#ifdef DIRTY
+ access_buffer(recv_ring->buffer_ptr,
+ recv_size,
+ loc_dirty_count,
+ loc_clean_count);
+#endif /* DIRTY */
+
+#ifdef WANT_DEMO
+ DEMO_STREAM_INTERVAL(len);
+#endif
+
+#ifdef WANT_INTERVALS
+ INTERVALS_WAIT();
+#endif /* WANT_INTERVALS */
+
+ /* now we want to move our pointer to the next position in the */
+ /* data buffer...we may also want to wrap back to the "beginning" */
+ /* of the bufferspace, so we will mod the number of messages sent */
+ /* by the recv width, and use that to calculate the offset to add */
+ /* to the base pointer. */
+ nummessages++;
+ recv_ring = recv_ring->next;
+ if (bytes_remaining) {
+ bytes_remaining -= len;
+ }
+
+ local_bytes_recvd += len;
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ /* make sure we timestamp just before we go into recv */
+ /* raj 2004-06-15 */
+ HIST_timestamp(&time_one);
+ }
+#endif /* WANT_HISTOGRAM */
+
+ }
+
+ /* an EINTR is to be expected when this is a no_control test */
+ if (((len < 0) || SOCKET_EINTR(len)) && (!no_control)) {
+ perror("send_sdp_maerts: data recv error");
+ printf("len was %d\n",len);
+ exit(1);
+ }
+
+ /* if we get here, it must mean we had a recv return of 0 before
+ the watchdog timer expired, or the watchdog timer expired and
+ this was a no_control test */
+
+ /* The test is over. Flush the buffers to the remote end. We do a
+ graceful release to tell the remote we have all the data. */
+
+ /* but first, if the verbosity is greater than 1, find-out what */
+ /* the SDP maximum segment_size was (if possible) */
+ if (verbosity > 1) {
+ sdp_mss = -1;
+ get_sdp_info(recv_socket,&sdp_mss);
+ }
+
+ if (shutdown(recv_socket,SHUT_WR) == SOCKET_ERROR) {
+ perror("netperf: cannot shutdown sdp maerts socket");
+ exit(1);
+ }
+
+ stop_timer();
+
+ /* this call will always give us the local elapsed time for the
+ test, and will also store-away the necessaries for cpu
+ utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being */
+ /* measured and how */
+ /* long did we really */
+ /* run? */
+
+ /* we are finished with the socket, so close it to prevent hitting */
+ /* the limit on maximum open files. */
+
+ close(recv_socket);
+
+ if (!no_control) {
+ /* Get the statistics from the remote end. The remote will have
+ calculated service demand and all those interesting
+ things. If it wasn't supposed to care, it will return obvious
+ values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+
+ /* We now calculate what our thruput was for the test. In the
+ future, we may want to include a calculation of the thruput
+ measured by the remote, but it should be the case that for a
+ SDP maerts test, that the two numbers should be *very*
+ close... We calculate bytes_sent regardless of the way the
+ test length was controlled. If it was time, we needed to,
+ and if it was by bytes, the user may have specified a number
+ of bytes that wasn't a multiple of the recv_size, so we
+ really didn't recv what he asked for ;-) */
+
+ bytes_sent = ntohd(sdp_maerts_result->bytes_sent);
+ }
+ else {
+ bytes_sent = (double)local_bytes_recvd;
+ }
+
+
+ thruput = calc_thruput(bytes_sent);
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+
+ local_cpu_utilization = calc_cpu_util(0.0);
+ local_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ }
+
+ if (remote_cpu_usage) {
+
+ remote_cpu_utilization = sdp_maerts_result->cpu_util;
+ remote_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ remote_cpu_utilization,
+ sdp_maerts_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+ }
+ else {
+ /* we were not measuring cpu, for the confidence stuff, we */
+ /* should make it -1.0 */
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ /* at this point, we want to calculate the confidence information. */
+ /* if debugging is on, calculate_confidence will print-out the */
+ /* parameters we pass it */
+
+ calculate_confidence(confidence_iteration,
+ elapsed_time,
+ thruput,
+ local_cpu_utilization,
+ remote_cpu_utilization,
+ local_service_demand,
+ remote_service_demand);
+
+
+ confidence_iteration++;
+ }
+
+ /* at this point, we have finished making all the runs that we */
+ /* will be making. so, we should extract what the calcuated values */
+ /* are for all the confidence stuff. we could make the values */
+ /* global, but that seemed a little messy, and it did not seem worth */
+ /* all the mucking with header files. so, we create a routine much */
+ /* like calcualte_confidence, which just returns the mean values. */
+ /* raj 11/94 */
+
+ retrieve_confident_values(&elapsed_time,
+ &thruput,
+ &local_cpu_utilization,
+ &remote_cpu_utilization,
+ &local_service_demand,
+ &remote_service_demand);
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ if (confidence < 0) {
+ /* we did not hit confidence, but were we asked to look for it? */
+ if (iteration_max > 1) {
+ display_confidence();
+ }
+ }
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ local_cpu_method = format_cpu_method(cpu_method);
+ remote_cpu_method = format_cpu_method(sdp_maerts_result->cpu_method);
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand,
+ local_cpu_method,
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand,
+ remote_cpu_method,
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ }
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,
+ cpu_title,
+ format_units(),
+ local_cpu_method,
+ remote_cpu_method);
+ }
+
+ fprintf(where,
+ cpu_fmt_1, /* the format string */
+ rsr_size, /* remote recvbuf size */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the recvs */
+ elapsed_time, /* how long was the test */
+ thruput, /* what was the xfer rate */
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand, /* remote service demand */
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ thruput,
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,tput_title,format_units());
+ }
+ fprintf(where,
+ tput_fmt_1, /* the format string */
+ lsr_size, /* local recvbuf size */
+ rss_size, /* remot sendbuf size */
+ send_size, /* how large were the recvs */
+ elapsed_time, /* how long did it take */
+ thruput, /* how fast did it go */
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* SDP statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ /* this stuff needs to be worked-out in the presence of confidence */
+ /* intervals and multiple iterations of the test... raj 11/94 */
+
+ fprintf(where,
+ ksink_fmt,
+ "Bytes",
+ "Bytes",
+ "Bytes",
+ local_recv_align,
+ remote_recv_align,
+ local_recv_offset,
+ remote_recv_offset,
+ bytes_sent,
+ bytes_sent / (double)nummessages,
+ nummessages,
+ bytes_sent / (double)sdp_maerts_result->send_calls,
+ sdp_maerts_result->send_calls);
+ fprintf(where,
+ ksink_fmt2,
+ sdp_mss);
+ fflush(where);
+#ifdef WANT_HISTOGRAM
+ fprintf(where,"\n\nHistogram of time spent in recv() call.\n");
+ fflush(where);
+ HIST_report(time_hist);
+#endif /* WANT_HISTOGRAM */
+ }
+
+}
+/* This is the server-side routine for the sdp stream test. It is */
+/* implemented as one routine. I could break things-out somewhat, but */
+/* didn't feel it was necessary. */
+
+void
+recv_sdp_stream()
+{
+
+ struct sockaddr_in myaddr_in, peeraddr_in;
+ SOCKET s_listen,s_data;
+ netperf_socklen_t addrlen;
+ int len;
+ unsigned int receive_calls;
+ float elapsed_time;
+ double bytes_received;
+
+ struct ring_elt *recv_ring;
+
+ struct addrinfo *local_res;
+ char local_name[BUFSIZ];
+ char port_buffer[PORTBUFSIZE];
+
+#ifdef DO_SELECT
+ fd_set readfds;
+ struct timeval timeout;
+#endif /* DO_SELECT */
+
+ struct sdp_stream_request_struct *sdp_stream_request;
+ struct sdp_stream_response_struct *sdp_stream_response;
+ struct sdp_stream_results_struct *sdp_stream_results;
+
+#ifdef DO_SELECT
+ FD_ZERO(&readfds);
+ timeout.tv_sec = 1;
+ timeout.tv_usec = 0;
+#endif /* DO_SELECT */
+
+ sdp_stream_request =
+ (struct sdp_stream_request_struct *)netperf_request.content.test_specific_data;
+ sdp_stream_response =
+ (struct sdp_stream_response_struct *)netperf_response.content.test_specific_data;
+ sdp_stream_results =
+ (struct sdp_stream_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_sdp_stream: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_sdp_stream: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = SDP_STREAM_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_sdp_stream: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* We now alter the message_ptr variable to be at the desired */
+ /* alignment with the desired offset. */
+
+ if (debug) {
+ fprintf(where,"recv_sdp_stream: requested alignment of %d\n",
+ sdp_stream_request->recv_alignment);
+ fflush(where);
+ }
+
+ /* create_data_socket expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lss_size_req = sdp_stream_request->send_buf_size;
+ lsr_size_req = sdp_stream_request->recv_buf_size;
+ loc_nodelay = sdp_stream_request->no_delay;
+ loc_rcvavoid = sdp_stream_request->so_rcvavoid;
+ loc_sndavoid = sdp_stream_request->so_sndavoid;
+
+ set_hostname_and_port(local_name,
+ port_buffer,
+ nf_to_af(sdp_stream_request->ipfamily),
+ sdp_stream_request->port);
+
+ local_res = complete_addrinfo(local_name,
+ local_name,
+ port_buffer,
+ nf_to_af(sdp_stream_request->ipfamily),
+ SOCK_STREAM,
+ IPPROTO_TCP,
+ 0);
+
+ /* fake things out by changing local_res->ai_family to AF_INET_SDP */
+ local_res->ai_family = AF_INET_SDP;
+ local_res->ai_protocol = 0;
+ s_listen = create_data_socket(local_res);
+
+ if (s_listen == INVALID_SOCKET) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+#ifdef WIN32
+ /* The test timer can fire during operations on the listening socket,
+ so to make the start_timer below work we have to move
+ it to close s_listen while we are blocked on accept. */
+ win_kludge_socket2 = s_listen;
+#endif
+
+ /* what sort of sizes did we end-up with? */
+ if (sdp_stream_request->receive_size == 0) {
+ if (lsr_size > 0) {
+ recv_size = lsr_size;
+ }
+ else {
+ recv_size = 4096;
+ }
+ }
+ else {
+ recv_size = sdp_stream_request->receive_size;
+ }
+
+ /* we want to set-up our recv_ring in a manner analagous to what we */
+ /* do on the sending side. this is more for the sake of symmetry */
+ /* than for the needs of say copy avoidance, but it might also be */
+ /* more realistic - this way one could conceivably go with a */
+ /* double-buffering scheme when taking the data an putting it into */
+ /* the filesystem or something like that. raj 7/94 */
+
+ if (recv_width == 0) {
+ recv_width = (lsr_size/recv_size) + 1;
+ if (recv_width == 1) recv_width++;
+ }
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ recv_size,
+ sdp_stream_request->recv_alignment,
+ sdp_stream_request->recv_offset);
+
+ if (debug) {
+ fprintf(where,"recv_sdp_stream: receive alignment and offset set...\n");
+ fflush(where);
+ }
+
+ /* Now, let's set-up the socket to listen for connections */
+ if (listen(s_listen, 5) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+
+ /* now get the port number assigned by the system */
+ addrlen = sizeof(myaddr_in);
+ if (getsockname(s_listen,
+ (struct sockaddr *)&myaddr_in,
+ &addrlen) == SOCKET_ERROR){
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+ /* Now myaddr_in contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ sdp_stream_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a -1 to */
+ /* the initiator. */
+
+ sdp_stream_response->cpu_rate = (float)0.0; /* assume no cpu */
+ if (sdp_stream_request->measure_cpu) {
+ sdp_stream_response->measure_cpu = 1;
+ sdp_stream_response->cpu_rate =
+ calibrate_local_cpu(sdp_stream_request->cpu_rate);
+ }
+ else {
+ sdp_stream_response->measure_cpu = 0;
+ }
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ sdp_stream_response->send_buf_size = lss_size;
+ sdp_stream_response->recv_buf_size = lsr_size;
+ sdp_stream_response->no_delay = loc_nodelay;
+ sdp_stream_response->so_rcvavoid = loc_rcvavoid;
+ sdp_stream_response->so_sndavoid = loc_sndavoid;
+ sdp_stream_response->receive_size = recv_size;
+
+ send_response();
+
+ addrlen = sizeof(peeraddr_in);
+
+ if ((s_data=accept(s_listen,
+ (struct sockaddr *)&peeraddr_in,
+ &addrlen)) == INVALID_SOCKET) {
+ /* Let's just punt. The remote will be given some information */
+ close(s_listen);
+ exit(1);
+ }
+
+#ifdef KLUDGE_SOCKET_OPTIONS
+ /* this is for those systems which *INCORRECTLY* fail to pass */
+ /* attributes across an accept() call. Including this goes against */
+ /* my better judgement :( raj 11/95 */
+
+ kludge_socket_options(s_data);
+
+#endif /* KLUDGE_SOCKET_OPTIONS */
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(sdp_stream_request->measure_cpu);
+
+ /* The loop will exit when the sender does a shutdown, which will */
+ /* return a length of zero */
+
+ /* there used to be an #ifdef DIRTY call to access_buffer() here,
+ but we have switched from accessing the buffer before the recv()
+ call to accessing the buffer after the recv() call. The
+ accessing before was, IIRC, related to having dirty data when
+ doing page-flipping copy avoidance. */
+
+ bytes_received = 0;
+ receive_calls = 0;
+
+ while ((len = recv(s_data, recv_ring->buffer_ptr, recv_size, 0)) != 0) {
+ if (len == SOCKET_ERROR )
+ {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+ bytes_received += len;
+ receive_calls++;
+
+#ifdef DIRTY
+ /* we access the buffer after the recv() call now, rather than before */
+ access_buffer(recv_ring->buffer_ptr,
+ recv_size,
+ sdp_stream_request->dirty_count,
+ sdp_stream_request->clean_count);
+#endif /* DIRTY */
+
+
+ /* move to the next buffer in the recv_ring */
+ recv_ring = recv_ring->next;
+
+#ifdef PAUSE
+ sleep(1);
+#endif /* PAUSE */
+
+#ifdef DO_SELECT
+ FD_SET(s_data,&readfds);
+ select(s_data+1,&readfds,NULL,NULL,&timeout);
+#endif /* DO_SELECT */
+
+ }
+
+ /* perform a shutdown to signal the sender that */
+ /* we have received all the data sent. raj 4/93 */
+
+ if (shutdown(s_data,SHUT_WR) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ cpu_stop(sdp_stream_request->measure_cpu,&elapsed_time);
+
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_sdp_stream: got %g bytes\n",
+ bytes_received);
+ fprintf(where,
+ "recv_sdp_stream: got %d recvs\n",
+ receive_calls);
+ fflush(where);
+ }
+
+ sdp_stream_results->bytes_received = htond(bytes_received);
+ sdp_stream_results->elapsed_time = elapsed_time;
+ sdp_stream_results->recv_calls = receive_calls;
+
+ sdp_stream_results->cpu_method = cpu_method;
+ sdp_stream_results->num_cpus = lib_num_loc_cpus;
+
+ if (sdp_stream_request->measure_cpu) {
+ sdp_stream_results->cpu_util = calc_cpu_util(0.0);
+ };
+
+ if (debug) {
+ fprintf(where,
+ "recv_sdp_stream: test complete, sending results.\n");
+ fprintf(where,
+ " bytes_received %g receive_calls %d\n",
+ bytes_received,
+ receive_calls);
+ fprintf(where,
+ " len %d\n",
+ len);
+ fflush(where);
+ }
+
+ send_response();
+
+ /* we are now done with the sockets */
+ close(s_data);
+ close(s_listen);
+
+ }
+
+/* This is the server-side routine for the sdp maerts test. It is
+ implemented as one routine. I could break things-out somewhat, but
+ didn't feel it was necessary. */
+
+void
+recv_sdp_maerts()
+{
+
+ struct sockaddr_in myaddr_in, peeraddr_in;
+ struct addrinfo *local_res;
+ char local_name[BUFSIZ];
+ char port_buffer[PORTBUFSIZE];
+
+ SOCKET s_listen,s_data;
+ netperf_socklen_t addrlen;
+ int len;
+ unsigned int send_calls;
+ float elapsed_time;
+ double bytes_sent = 0.0 ;
+
+ struct ring_elt *send_ring;
+
+ struct sdp_maerts_request_struct *sdp_maerts_request;
+ struct sdp_maerts_response_struct *sdp_maerts_response;
+ struct sdp_maerts_results_struct *sdp_maerts_results;
+
+ sdp_maerts_request =
+ (struct sdp_maerts_request_struct *)netperf_request.content.test_specific_data;
+ sdp_maerts_response =
+ (struct sdp_maerts_response_struct *)netperf_response.content.test_specific_data;
+ sdp_maerts_results =
+ (struct sdp_maerts_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_sdp_maerts: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired
+ parameters and then let the initiator know that all is ready. If
+ socket size defaults are to be used, then the initiator will have
+ sent us 0's. If the socket sizes cannot be changed, then we will
+ send-back what they are. If that information cannot be
+ determined, then we send-back -1's for the sizes. If things go
+ wrong for any reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It
+ would be best if the error that the remote reports to the user is
+ the actual error we encountered, rather than some bogus
+ unexpected response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_sdp_maerts: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = SDP_MAERTS_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_sdp_maerts: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* We now alter the message_ptr variable to be at the desired */
+ /* alignment with the desired offset. */
+
+ if (debug) {
+ fprintf(where,"recv_sdp_maerts: requested alignment of %d\n",
+ sdp_maerts_request->send_alignment);
+ fflush(where);
+ }
+
+ /* Grab a socket to listen on, and then listen on it. */
+
+ if (debug) {
+ fprintf(where,"recv_sdp_maerts: grabbing a socket...\n");
+ fflush(where);
+ }
+
+ /* create_data_socket expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lss_size_req = sdp_maerts_request->send_buf_size;
+ lsr_size_req = sdp_maerts_request->recv_buf_size;
+ loc_nodelay = sdp_maerts_request->no_delay;
+ loc_rcvavoid = sdp_maerts_request->so_rcvavoid;
+ loc_sndavoid = sdp_maerts_request->so_sndavoid;
+
+ set_hostname_and_port(local_name,
+ port_buffer,
+ nf_to_af(sdp_maerts_request->ipfamily),
+ sdp_maerts_request->port);
+
+ local_res = complete_addrinfo(local_name,
+ local_name,
+ port_buffer,
+ nf_to_af(sdp_maerts_request->ipfamily),
+ SOCK_STREAM,
+ IPPROTO_TCP,
+ 0);
+
+ /* fake things out by changing local_res->ai_family to AF_INET_SDP */
+ local_res->ai_family = AF_INET_SDP;
+ local_res->ai_protocol = 0;
+ s_listen = create_data_socket(local_res);
+
+ if (s_listen == INVALID_SOCKET) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+#ifdef WIN32
+ /* The test timer can fire during operations on the listening socket,
+ so to make the start_timer below work we have to move
+ it to close s_listen while we are blocked on accept. */
+ win_kludge_socket2 = s_listen;
+#endif
+
+
+ /* what sort of sizes did we end-up with? */
+ if (sdp_maerts_request->send_size == 0) {
+ if (lss_size > 0) {
+ send_size = lss_size;
+ }
+ else {
+ send_size = 4096;
+ }
+ }
+ else {
+ send_size = sdp_maerts_request->send_size;
+ }
+
+ /* we want to set-up our recv_ring in a manner analagous to what we */
+ /* do on the recving side. this is more for the sake of symmetry */
+ /* than for the needs of say copy avoidance, but it might also be */
+ /* more realistic - this way one could conceivably go with a */
+ /* double-buffering scheme when taking the data an putting it into */
+ /* the filesystem or something like that. raj 7/94 */
+
+ if (send_width == 0) {
+ send_width = (lsr_size/send_size) + 1;
+ if (send_width == 1) send_width++;
+ }
+
+ send_ring = allocate_buffer_ring(send_width,
+ send_size,
+ sdp_maerts_request->send_alignment,
+ sdp_maerts_request->send_offset);
+
+ if (debug) {
+ fprintf(where,"recv_sdp_maerts: receive alignment and offset set...\n");
+ fflush(where);
+ }
+
+ /* Now, let's set-up the socket to listen for connections */
+ if (listen(s_listen, 5) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+
+ /* now get the port number assigned by the system */
+ addrlen = sizeof(myaddr_in);
+ if (getsockname(s_listen,
+ (struct sockaddr *)&myaddr_in,
+ &addrlen) == SOCKET_ERROR){
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+ /* Now myaddr_in contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ sdp_maerts_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a -1 to */
+ /* the initiator. */
+
+ sdp_maerts_response->cpu_rate = (float)0.0; /* assume no cpu */
+ if (sdp_maerts_request->measure_cpu) {
+ sdp_maerts_response->measure_cpu = 1;
+ sdp_maerts_response->cpu_rate =
+ calibrate_local_cpu(sdp_maerts_request->cpu_rate);
+ }
+ else {
+ sdp_maerts_response->measure_cpu = 0;
+ }
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ sdp_maerts_response->send_buf_size = lss_size;
+ sdp_maerts_response->recv_buf_size = lsr_size;
+ sdp_maerts_response->no_delay = loc_nodelay;
+ sdp_maerts_response->so_rcvavoid = loc_rcvavoid;
+ sdp_maerts_response->so_sndavoid = loc_sndavoid;
+ sdp_maerts_response->send_size = send_size;
+
+ send_response();
+
+ addrlen = sizeof(peeraddr_in);
+
+ /* we will start the timer before the accept() to be somewhat
+ analagous to the starting of the timer before the connect() call
+ in the SDP_STREAM test. raj 2002-06-21 */
+
+ start_timer(sdp_maerts_request->test_length);
+
+ /* Now it's time to start receiving data on the connection. We will
+ first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(sdp_maerts_request->measure_cpu);
+
+
+ if ((s_data=accept(s_listen,
+ (struct sockaddr *)&peeraddr_in,
+ &addrlen)) == INVALID_SOCKET) {
+ /* Let's just punt. The remote will be given some information */
+ close(s_listen);
+ exit(1);
+ }
+
+#ifdef KLUDGE_SOCKET_OPTIONS
+
+ /* this is for those systems which *INCORRECTLY* fail to pass
+ attributes across an accept() call. Including this goes against
+ my better judgement :( raj 11/95 */
+
+ kludge_socket_options(s_data);
+
+#endif /* KLUDGE_SOCKET_OPTIONS */
+
+ /* The loop will exit when the sender does a shutdown, which will */
+ /* return a length of zero */
+
+ bytes_sent = 0.0;
+ send_calls = 0;
+
+ len = 0; /* nt-lint; len is not initialized (printf far below) if
+ times_up initially true.*/
+ times_up = 0; /* must remember to initialize this little beauty */
+ while (!times_up) {
+
+#ifdef DIRTY
+ /* we want to dirty some number of consecutive integers in the buffer */
+ /* we are about to send. we may also want to bring some number of */
+ /* them cleanly into the cache. The clean ones will follow any dirty */
+ /* ones into the cache. */
+
+ access_buffer(send_ring->buffer_ptr,
+ send_size,
+ sdp_maerts_request->dirty_count,
+ sdp_maerts_request->clean_count);
+
+#endif /* DIRTY */
+
+ if((len=send(s_data,
+ send_ring->buffer_ptr,
+ send_size,
+ 0)) != send_size) {
+ if ((len >=0) || SOCKET_EINTR(len)) {
+ /* the test was interrupted, must be the end of test */
+ break;
+ }
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ bytes_sent += len;
+ send_calls++;
+
+ /* more to the next buffer in the send_ring */
+ send_ring = send_ring->next;
+
+ }
+
+ /* perform a shutdown to signal the sender that */
+ /* we have received all the data sent. raj 4/93 */
+
+ if (shutdown(s_data,SHUT_WR) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ /* hang a recv() off the socket to block until the remote has
+ brought all the data up into the application. it will do a
+ shutdown to cause a FIN to be sent our way. We will assume that
+ any exit from the recv() call is good... raj 4/93 */
+
+ recv(s_data, send_ring->buffer_ptr, send_size, 0);
+
+
+ cpu_stop(sdp_maerts_request->measure_cpu,&elapsed_time);
+
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_sdp_maerts: got %g bytes\n",
+ bytes_sent);
+ fprintf(where,
+ "recv_sdp_maerts: got %d sends\n",
+ send_calls);
+ fflush(where);
+ }
+
+ sdp_maerts_results->bytes_sent = htond(bytes_sent);
+ sdp_maerts_results->elapsed_time = elapsed_time;
+ sdp_maerts_results->send_calls = send_calls;
+
+ if (sdp_maerts_request->measure_cpu) {
+ sdp_maerts_results->cpu_util = calc_cpu_util(0.0);
+ };
+
+ if (debug) {
+ fprintf(where,
+ "recv_sdp_maerts: test complete, sending results.\n");
+ fprintf(where,
+ " bytes_sent %g send_calls %d\n",
+ bytes_sent,
+ send_calls);
+ fprintf(where,
+ " len %d\n",
+ len);
+ fflush(where);
+ }
+
+ sdp_maerts_results->cpu_method = cpu_method;
+ sdp_maerts_results->num_cpus = lib_num_loc_cpus;
+ send_response();
+
+ /* we are now done with the sockets */
+ close(s_data);
+ close(s_listen);
+
+ }
+
+
+ /* this routine implements the sending (netperf) side of the SDP_RR */
+ /* test. */
+
+void
+send_sdp_rr(char remote_host[])
+{
+
+ char *tput_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans.\n\
+Send Recv Size Size Time Rate \n\
+bytes Bytes bytes bytes secs. per sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f %s\n";
+
+ char *tput_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %7.2f %s\n";
+ char *tput_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *cpu_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem\n\
+Send Recv Size Size Time Rate local remote local remote\n\
+bytes bytes bytes bytes secs. per sec %% %c %% %c us/Tr us/Tr\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f %c %s\n";
+
+ char *cpu_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %-6.2f %-6.2f %-6.2f %-6.3f %-6.3f %s\n";
+
+ char *cpu_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *ksink_fmt = "\
+Alignment Offset\n\
+Local Remote Local Remote\n\
+Send Recv Send Recv\n\
+%5d %5d %5d %5d\n";
+
+
+ int timed_out = 0;
+ float elapsed_time;
+
+ int len;
+ char *temp_message_ptr;
+ int nummessages;
+ SOCKET send_socket;
+ int trans_remaining;
+ double bytes_xferd;
+
+ struct ring_elt *send_ring;
+ struct ring_elt *recv_ring;
+
+ int rsp_bytes_left;
+ int rsp_bytes_recvd;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+ double thruput;
+
+ struct addrinfo *local_res;
+ struct addrinfo *remote_res;
+
+ struct sdp_rr_request_struct *sdp_rr_request;
+ struct sdp_rr_response_struct *sdp_rr_response;
+ struct sdp_rr_results_struct *sdp_rr_result;
+
+#ifdef WANT_FIRST_BURST
+#define REQUEST_CWND_INITIAL 2
+ /* "in the beginning..." the WANT_FIRST_BURST stuff was like both
+ Unix and the state of New Jersey - both were simple an unspoiled.
+ then it was realized that some stacks are quite picky about
+ initial congestion windows and a non-trivial initial burst of
+ requests would not be individual segments even with TCP_NODELAY
+ set. so, we have to start tracking a poor-man's congestion window
+ up here in window space because we want to try to make something
+ happen that frankly, we cannot guarantee with the specification
+ of SDP. ain't that grand?-) raj 2006-01-30 */
+ int requests_outstanding = 0;
+ int request_cwnd = REQUEST_CWND_INITIAL; /* we ass-u-me that having
+ three requests
+ outstanding at the
+ beginning of the test
+ is ok with SDP stacks
+ of interest. the first
+ two will come from our
+ first_burst loop, and
+ the third from our
+ regularly scheduled
+ send */
+#endif
+
+ sdp_rr_request =
+ (struct sdp_rr_request_struct *)netperf_request.content.test_specific_data;
+ sdp_rr_response=
+ (struct sdp_rr_response_struct *)netperf_response.content.test_specific_data;
+ sdp_rr_result =
+ (struct sdp_rr_results_struct *)netperf_response.content.test_specific_data;
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ time_hist = HIST_new();
+ }
+#endif /* WANT_HISTOGRAM */
+
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ complete_addrinfos(&remote_res,
+ &local_res,
+ remote_host,
+ SOCK_STREAM,
+ IPPROTO_TCP,
+ 0);
+
+ if ( print_headers ) {
+ print_top_test_header("SDP REQUEST/RESPONSE TEST",local_res,remote_res);
+ }
+
+ /* initialize a few counters */
+
+ send_ring = NULL;
+ recv_ring = NULL;
+ confidence_iteration = 1;
+ init_stat();
+
+ /* we have a great-big while loop which controls the number of times */
+ /* we run a particular test. this is for the calculation of a */
+ /* confidence interval (I really should have stayed awake during */
+ /* probstats :). If the user did not request confidence measurement */
+ /* (no confidence is the default) then we will only go though the */
+ /* loop once. the confidence stuff originates from the folks at IBM */
+
+ while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
+ (confidence_iteration <= iteration_min)) {
+
+ /* initialize a few counters. we have to remember that we might be */
+ /* going through the loop more than once. */
+
+ nummessages = 0;
+ bytes_xferd = 0.0;
+ times_up = 0;
+ timed_out = 0;
+ trans_remaining = 0;
+
+#ifdef WANT_FIRST_BURST
+ /* we have to remember to reset the number of transactions
+ outstanding and the "congestion window for each new
+ iteration. raj 2006-01-31 */
+ requests_outstanding = 0;
+ request_cwnd = REQUEST_CWND_INITIAL;
+#endif
+
+
+ /* set-up the data buffers with the requested alignment and offset. */
+ /* since this is a request/response test, default the send_width and */
+ /* recv_width to 1 and not two raj 7/94 */
+
+ if (send_width == 0) send_width = 1;
+ if (recv_width == 0) recv_width = 1;
+
+ if (send_ring == NULL) {
+ send_ring = allocate_buffer_ring(send_width,
+ req_size,
+ local_send_align,
+ local_send_offset);
+ }
+
+ if (recv_ring == NULL) {
+ recv_ring = allocate_buffer_ring(recv_width,
+ rsp_size,
+ local_recv_align,
+ local_recv_offset);
+ }
+
+ /*set up the data socket */
+ /* fake things out by changing local_res->ai_family to AF_INET_SDP */
+ local_res->ai_family = AF_INET_SDP;
+ local_res->ai_protocol = 0;
+ send_socket = create_data_socket(local_res);
+
+ if (send_socket == INVALID_SOCKET){
+ perror("netperf: send_sdp_rr: sdp stream data socket");
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"send_sdp_rr: send_socket obtained...\n");
+ }
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back.*/
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ if (!no_control) {
+ /* Tell the remote end to do a listen. The server alters the
+ socket paramters on the other side at this point, hence the
+ reason for all the values being passed in the setup
+ message. If the user did not specify any of the parameters,
+ they will be passed as 0, which will indicate to the remote
+ that no changes beyond the system's default should be
+ used. Alignment is the exception, it will default to 8, which
+ will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_SDP_RR;
+ sdp_rr_request->recv_buf_size = rsr_size_req;
+ sdp_rr_request->send_buf_size = rss_size_req;
+ sdp_rr_request->recv_alignment = remote_recv_align;
+ sdp_rr_request->recv_offset = remote_recv_offset;
+ sdp_rr_request->send_alignment = remote_send_align;
+ sdp_rr_request->send_offset = remote_send_offset;
+ sdp_rr_request->request_size = req_size;
+ sdp_rr_request->response_size = rsp_size;
+ sdp_rr_request->no_delay = rem_nodelay;
+ sdp_rr_request->measure_cpu = remote_cpu_usage;
+ sdp_rr_request->cpu_rate = remote_cpu_rate;
+ sdp_rr_request->so_rcvavoid = rem_rcvavoid;
+ sdp_rr_request->so_sndavoid = rem_sndavoid;
+ if (test_time) {
+ sdp_rr_request->test_length = test_time;
+ }
+ else {
+ sdp_rr_request->test_length = test_trans * -1;
+ }
+ sdp_rr_request->port = atoi(remote_data_port);
+ sdp_rr_request->ipfamily = af_to_nf(remote_res->ai_family);
+
+ if (debug > 1) {
+ fprintf(where,"netperf: send_sdp_rr: requesting SDP rr test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant
+ socket parameters for this test type. We will put them back
+ into the variables here so they can be displayed if desired.
+ The remote will have calibrated CPU if necessary, and will
+ have done all the needed set-up we will have calibrated the
+ cpu locally before sending the request, and will grab the
+ counter value right after the connect returns. The remote
+ will grab the counter right after the accept call. This saves
+ the hassle of extra messages being sent for the SDP
+ tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote listen done.\n");
+ rsr_size = sdp_rr_response->recv_buf_size;
+ rss_size = sdp_rr_response->send_buf_size;
+ rem_nodelay = sdp_rr_response->no_delay;
+ remote_cpu_usage = sdp_rr_response->measure_cpu;
+ remote_cpu_rate = sdp_rr_response->cpu_rate;
+ /* make sure that port numbers are in network order */
+ set_port_number(remote_res,(short)sdp_rr_response->data_port_number);
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,
+ "netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+
+ exit(1);
+ }
+ }
+
+#ifdef WANT_DEMO
+ DEMO_RR_SETUP(1000)
+#endif
+
+ /*Connect up to the remote port on the data socket */
+ if (connect(send_socket,
+ remote_res->ai_addr,
+ remote_res->ai_addrlen) == INVALID_SOCKET){
+ perror("netperf: data socket connect failed");
+
+ exit(1);
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either the */
+ /* connect would have failed, or the previous response would have */
+ /* indicated a problem. I failed to see the value of the extra */
+ /* message after the accept on the remote. If it failed, we'll see it */
+ /* here. If it didn't, we might as well start pumping data. */
+
+ /* Set-up the test end conditions. For a request/response test, they */
+ /* can be either time or transaction based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ trans_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+#ifdef WANT_INTERVALS
+ INTERVALS_INIT();
+#endif /* WANT_INTERVALS */
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return false. */
+ /* When the test is controlled by byte count, the time test will */
+ /* always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. I think I */
+ /* just arbitrarily decrement trans_remaining for the timed test, but */
+ /* will not do that just yet... One other question is whether or not */
+ /* the send buffer and the receive buffer should be the same buffer. */
+
+#ifdef WANT_DEMO
+ if (demo_mode) {
+ HIST_timestamp(demo_one_ptr);
+ }
+#endif
+
+ while ((!times_up) || (trans_remaining > 0)) {
+ /* send the request. we assume that if we use a blocking socket, */
+ /* the request will be sent at one shot. */
+
+#ifdef WANT_FIRST_BURST
+ /* we can inject no more than request_cwnd, which will grow with
+ time, and no more than first_burst_size. we don't use <= to
+ account for the "regularly scheduled" send call. of course
+ that makes it more a "max_outstanding_ than a
+ "first_burst_size" but for now we won't fix the names. also,
+ I suspect the extra check against < first_burst_size is
+ redundant since later I expect to make sure that request_cwnd
+ can never get larger than first_burst_size, but just at the
+ moment I'm feeling like a belt and suspenders kind of
+ programmer. raj 2006-01-30 */
+ while ((first_burst_size > 0) &&
+ (requests_outstanding < request_cwnd) &&
+ (requests_outstanding < first_burst_size)) {
+ if (debug) {
+ fprintf(where,
+ "injecting, req_outstndng %d req_cwnd %d burst %d\n",
+ requests_outstanding,
+ request_cwnd,
+ first_burst_size);
+ }
+ if ((len = send(send_socket,
+ send_ring->buffer_ptr,
+ req_size,
+ 0)) != req_size) {
+ /* we should never hit the end of the test in the first burst */
+ perror("send_sdp_rr: initial burst data send error");
+ exit(-1);
+ }
+ requests_outstanding += 1;
+ }
+
+#endif /* WANT_FIRST_BURST */
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ /* timestamp just before our call to send, and then again just
+ after the receive raj 8/94 */
+ /* but only if we are actually going to display one. raj
+ 2007-02-07 */
+
+ HIST_timestamp(&time_one);
+ }
+#endif /* WANT_HISTOGRAM */
+
+ if ((len = send(send_socket,
+ send_ring->buffer_ptr,
+ req_size,
+ 0)) != req_size) {
+ if (SOCKET_EINTR(len) || (errno == 0)) {
+ /* we hit the end of a */
+ /* timed test. */
+ timed_out = 1;
+ break;
+ }
+ perror("send_sdp_rr: data send error");
+ exit(1);
+ }
+ send_ring = send_ring->next;
+
+#ifdef WANT_FIRST_BURST
+ requests_outstanding += 1;
+#endif
+
+ /* receive the response */
+ rsp_bytes_left = rsp_size;
+ temp_message_ptr = recv_ring->buffer_ptr;
+ while(rsp_bytes_left > 0) {
+ if((rsp_bytes_recvd=recv(send_socket,
+ temp_message_ptr,
+ rsp_bytes_left,
+ 0)) == SOCKET_ERROR) {
+ if ( SOCKET_EINTR(rsp_bytes_recvd) ) {
+ /* We hit the end of a timed test. */
+ timed_out = 1;
+ break;
+ }
+ perror("send_sdp_rr: data recv error");
+ exit(1);
+ }
+ rsp_bytes_left -= rsp_bytes_recvd;
+ temp_message_ptr += rsp_bytes_recvd;
+ }
+ recv_ring = recv_ring->next;
+
+#ifdef WANT_FIRST_BURST
+ /* so, since we've gotten a response back, update the
+ bookkeeping accordingly. there is one less request
+ outstanding and we can put one more out there than before. */
+ requests_outstanding -= 1;
+ if (request_cwnd < first_burst_size) {
+ request_cwnd += 1;
+ if (debug) {
+ fprintf(where,
+ "incr req_cwnd to %d first_burst %d reqs_outstndng %d\n",
+ request_cwnd,
+ first_burst_size,
+ requests_outstanding);
+ }
+ }
+#endif
+ if (timed_out) {
+ /* we may have been in a nested while loop - we need */
+ /* another call to break. */
+ break;
+ }
+
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ HIST_timestamp(&time_two);
+ HIST_add(time_hist,delta_micro(&time_one,&time_two));
+ }
+#endif /* WANT_HISTOGRAM */
+
+#ifdef WANT_DEMO
+ DEMO_RR_INTERVAL(1);
+#endif
+
+#ifdef WANT_INTERVALS
+ INTERVALS_WAIT();
+#endif /* WANT_INTERVALS */
+
+ nummessages++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug > 3) {
+ if ((nummessages % 100) == 0) {
+ fprintf(where,
+ "Transaction %d completed\n",
+ nummessages);
+ fflush(where);
+ }
+ }
+ }
+
+ /* At this point we used to call shutdown on the data socket to be
+ sure all the data was delivered, but this was not germane in a
+ request/response test, and it was causing the tests to "hang"
+ when they were being controlled by time. So, I have replaced
+ this shutdown call with a call to close that can be found later
+ in the procedure. */
+
+ /* this call will always give us the elapsed time for the test,
+ and will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being */
+ /* measured? how long */
+ /* did we really run? */
+
+ if (!no_control) {
+ /* Get the statistics from the remote end. The remote will have
+ calculated CPU utilization. If it wasn't supposed to care, it
+ will return obvious values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ fprintf(where,"netperf: remote error %d",
+ netperf_response.content.serv_errno);
+ perror("");
+ fflush(where);
+ exit(1);
+ }
+ }
+
+ /* We now calculate what our throughput was for the test. */
+
+ bytes_xferd = (req_size * nummessages) + (rsp_size * nummessages);
+ thruput = nummessages/elapsed_time;
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu
+ utilization for the system(s) Of course, some of the
+ information might be bogus because there was no idle counter in
+ the kernel(s). We need to make a note of this for the user's
+ benefit... */
+ if (local_cpu_usage) {
+ local_cpu_utilization = calc_cpu_util(0.0);
+ /* since calc_service demand is doing ms/Kunit we will
+ multiply the number of transaction by 1024 to get "good"
+ numbers */
+ local_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ }
+
+ if (remote_cpu_usage) {
+ remote_cpu_utilization = sdp_rr_result->cpu_util;
+ /* since calc_service demand is doing ms/Kunit we will
+ multiply the number of transaction by 1024 to get "good"
+ numbers */
+ remote_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ remote_cpu_utilization,
+ sdp_rr_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ }
+ else {
+ /* we were not measuring cpu, for the confidence stuff, we */
+ /* should make it -1.0 */
+ local_cpu_utilization = (float) -1.0;
+ local_service_demand = (float) -1.0;
+ remote_cpu_utilization = (float) -1.0;
+ remote_service_demand = (float) -1.0;
+ }
+
+ /* at this point, we want to calculate the confidence information.
+ if debugging is on, calculate_confidence will print-out the
+ parameters we pass it */
+
+ calculate_confidence(confidence_iteration,
+ elapsed_time,
+ thruput,
+ local_cpu_utilization,
+ remote_cpu_utilization,
+ local_service_demand,
+ remote_service_demand);
+
+
+ confidence_iteration++;
+
+ /* we are now done with the socket, so close it */
+ close(send_socket);
+
+ }
+
+ retrieve_confident_values(&elapsed_time,
+ &thruput,
+ &local_cpu_utilization,
+ &remote_cpu_utilization,
+ &local_service_demand,
+ &remote_service_demand);
+
+ /* We are now ready to print all the information. If the user has
+ specified zero-level verbosity, we will just print the local
+ service demand, or the remote service demand. If the user has
+ requested verbosity level 1, he will get the basic "streamperf"
+ numbers. If the user has specified a verbosity of greater than 1,
+ we will display a veritable plethora of background information
+ from outside of this block as it it not cpu_measurement
+ specific... */
+
+ if (confidence < 0) {
+ /* we did not hit confidence, but were we asked to look for it? */
+ if (iteration_max > 1) {
+ display_confidence();
+ }
+ }
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ local_cpu_method = format_cpu_method(cpu_method);
+ remote_cpu_method = format_cpu_method(sdp_rr_result->cpu_method);
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand,
+ local_cpu_method,
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand,
+ remote_cpu_method,
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ }
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,
+ cpu_title,
+ local_cpu_method,
+ remote_cpu_method);
+ }
+
+ fprintf(where,
+ cpu_fmt_1_line_1, /* the format string */
+ lss_size, /* local sendbuf size */
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* guess */
+ elapsed_time, /* how long was the test */
+ thruput,
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand, /* remote service demand */
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ fprintf(where,
+ cpu_fmt_1_line_2,
+ rss_size,
+ rsr_size);
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ thruput,
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,tput_title,format_units());
+ }
+
+ fprintf(where,
+ tput_fmt_1_line_1, /* the format string */
+ lss_size,
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* how large were the responses */
+ elapsed_time, /* how long did it take */
+ thruput,
+ ((print_headers) ||
+ (result_brand == NULL)) ? "" : result_brand);
+ fprintf(where,
+ tput_fmt_1_line_2,
+ rss_size, /* remote recvbuf size */
+ rsr_size);
+
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ /* how to handle the verbose information in the presence of */
+ /* confidence intervals is yet to be determined... raj 11/94 */
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* SDP statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ fprintf(where,
+ ksink_fmt,
+ local_send_align,
+ remote_recv_offset,
+ local_send_offset,
+ remote_recv_offset);
+
+#ifdef WANT_HISTOGRAM
+ fprintf(where,"\nHistogram of request/response times\n");
+ fflush(where);
+ HIST_report(time_hist);
+#endif /* WANT_HISTOGRAM */
+
+ }
+
+}
+ /* this routine implements the receive (netserver) side of a SDP_RR */
+ /* test */
+void
+recv_sdp_rr()
+{
+
+ struct ring_elt *send_ring;
+ struct ring_elt *recv_ring;
+
+ struct addrinfo *local_res;
+ char local_name[BUFSIZ];
+ char port_buffer[PORTBUFSIZE];
+
+ struct sockaddr_in myaddr_in,
+ peeraddr_in;
+ SOCKET s_listen,s_data;
+ netperf_socklen_t addrlen;
+ char *temp_message_ptr;
+ int trans_received;
+ int trans_remaining;
+ int bytes_sent;
+ int request_bytes_recvd;
+ int request_bytes_remaining;
+ int timed_out = 0;
+ int sock_closed = 0;
+ float elapsed_time;
+
+ struct sdp_rr_request_struct *sdp_rr_request;
+ struct sdp_rr_response_struct *sdp_rr_response;
+ struct sdp_rr_results_struct *sdp_rr_results;
+
+ sdp_rr_request =
+ (struct sdp_rr_request_struct *)netperf_request.content.test_specific_data;
+ sdp_rr_response =
+ (struct sdp_rr_response_struct *)netperf_response.content.test_specific_data;
+ sdp_rr_results =
+ (struct sdp_rr_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_sdp_rr: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_sdp_rr: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = SDP_RR_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_sdp_rr: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* allocate the recv and send rings with the requested alignments */
+ /* and offsets. raj 7/94 */
+ if (debug) {
+ fprintf(where,"recv_sdp_rr: requested recv alignment of %d offset %d\n",
+ sdp_rr_request->recv_alignment,
+ sdp_rr_request->recv_offset);
+ fprintf(where,"recv_sdp_rr: requested send alignment of %d offset %d\n",
+ sdp_rr_request->send_alignment,
+ sdp_rr_request->send_offset);
+ fflush(where);
+ }
+
+ /* at some point, these need to come to us from the remote system */
+ if (send_width == 0) send_width = 1;
+ if (recv_width == 0) recv_width = 1;
+
+ send_ring = allocate_buffer_ring(send_width,
+ sdp_rr_request->response_size,
+ sdp_rr_request->send_alignment,
+ sdp_rr_request->send_offset);
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ sdp_rr_request->request_size,
+ sdp_rr_request->recv_alignment,
+ sdp_rr_request->recv_offset);
+
+
+ /* Grab a socket to listen on, and then listen on it. */
+
+ if (debug) {
+ fprintf(where,"recv_sdp_rr: grabbing a socket...\n");
+ fflush(where);
+ }
+
+ /* create_data_socket expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lss_size_req = sdp_rr_request->send_buf_size;
+ lsr_size_req = sdp_rr_request->recv_buf_size;
+ loc_nodelay = sdp_rr_request->no_delay;
+ loc_rcvavoid = sdp_rr_request->so_rcvavoid;
+ loc_sndavoid = sdp_rr_request->so_sndavoid;
+
+ set_hostname_and_port(local_name,
+ port_buffer,
+ nf_to_af(sdp_rr_request->ipfamily),
+ sdp_rr_request->port);
+
+ local_res = complete_addrinfo(local_name,
+ local_name,
+ port_buffer,
+ nf_to_af(sdp_rr_request->ipfamily),
+ SOCK_STREAM,
+ IPPROTO_TCP,
+ 0);
+
+ /* fake things out by changing local_res->ai_family to AF_INET_SDP */
+ local_res->ai_family = AF_INET_SDP;
+ local_res->ai_protocol = 0;
+ s_listen = create_data_socket(local_res);
+
+ if (s_listen == INVALID_SOCKET) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+
+ exit(1);
+ }
+
+
+#ifdef WIN32
+ /* The test timer can fire during operations on the listening socket,
+ so to make the start_timer below work we have to move
+ it to close s_listen while we are blocked on accept. */
+ win_kludge_socket2 = s_listen;
+#endif
+
+
+ /* Now, let's set-up the socket to listen for connections */
+ if (listen(s_listen, 5) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+
+ /* now get the port number assigned by the system */
+ addrlen = sizeof(myaddr_in);
+ if (getsockname(s_listen,
+ (struct sockaddr *)&myaddr_in,
+ &addrlen) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+ /* Now myaddr_in contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ sdp_rr_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a 0.0 to */
+ /* the initiator. */
+
+ sdp_rr_response->cpu_rate = (float)0.0; /* assume no cpu */
+ sdp_rr_response->measure_cpu = 0;
+
+ if (sdp_rr_request->measure_cpu) {
+ sdp_rr_response->measure_cpu = 1;
+ sdp_rr_response->cpu_rate = calibrate_local_cpu(sdp_rr_request->cpu_rate);
+ }
+
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ sdp_rr_response->send_buf_size = lss_size;
+ sdp_rr_response->recv_buf_size = lsr_size;
+ sdp_rr_response->no_delay = loc_nodelay;
+ sdp_rr_response->so_rcvavoid = loc_rcvavoid;
+ sdp_rr_response->so_sndavoid = loc_sndavoid;
+ sdp_rr_response->test_length = sdp_rr_request->test_length;
+ send_response();
+
+ addrlen = sizeof(peeraddr_in);
+
+ if ((s_data = accept(s_listen,
+ (struct sockaddr *)&peeraddr_in,
+ &addrlen)) == INVALID_SOCKET) {
+ /* Let's just punt. The remote will be given some information */
+ close(s_listen);
+
+ exit(1);
+ }
+
+#ifdef KLUDGE_SOCKET_OPTIONS
+ /* this is for those systems which *INCORRECTLY* fail to pass */
+ /* attributes across an accept() call. Including this goes against */
+ /* my better judgement :( raj 11/95 */
+
+ kludge_socket_options(s_data);
+
+#endif /* KLUDGE_SOCKET_OPTIONS */
+
+#ifdef WIN32
+ /* this is used so the timer thread can close the socket out from */
+ /* under us, which to date is the easiest/cleanest/least */
+ /* Windows-specific way I can find to force the winsock calls to */
+ /* return WSAEINTR with the test is over. anything that will run on */
+ /* 95 and NT and is closer to what netperf expects from Unix signals */
+ /* and such would be appreciated raj 1/96 */
+ win_kludge_socket = s_data;
+#endif /* WIN32 */
+
+ if (debug) {
+ fprintf(where,"recv_sdp_rr: accept completes on the data connection.\n");
+ fflush(where);
+ }
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(sdp_rr_request->measure_cpu);
+
+ /* The loop will exit when we hit the end of the test time, or when */
+ /* we have exchanged the requested number of transactions. */
+
+ if (sdp_rr_request->test_length > 0) {
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(sdp_rr_request->test_length + PAD_TIME);
+ }
+ else {
+ times_up = 1;
+ trans_remaining = sdp_rr_request->test_length * -1;
+ }
+
+ trans_received = 0;
+
+ while ((!times_up) || (trans_remaining > 0)) {
+ temp_message_ptr = recv_ring->buffer_ptr;
+ request_bytes_remaining = sdp_rr_request->request_size;
+ while(request_bytes_remaining > 0) {
+ if((request_bytes_recvd=recv(s_data,
+ temp_message_ptr,
+ request_bytes_remaining,
+ 0)) == SOCKET_ERROR) {
+ if (SOCKET_EINTR(request_bytes_recvd))
+ {
+ timed_out = 1;
+ break;
+ }
+
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+ else if( request_bytes_recvd == 0 ) {
+ if (debug) {
+ fprintf(where,"zero is my hero\n");
+ fflush(where);
+ }
+ sock_closed = 1;
+ break;
+ }
+ else {
+ request_bytes_remaining -= request_bytes_recvd;
+ temp_message_ptr += request_bytes_recvd;
+ }
+ }
+
+ recv_ring = recv_ring->next;
+
+ if ((timed_out) || (sock_closed)) {
+ /* we hit the end of the test based on time - or the socket
+ closed on us along the way. bail out of here now... */
+ if (debug) {
+ fprintf(where,"yo5\n");
+ fflush(where);
+ }
+ break;
+ }
+
+ /* Now, send the response to the remote */
+ if((bytes_sent=send(s_data,
+ send_ring->buffer_ptr,
+ sdp_rr_request->response_size,
+ 0)) == SOCKET_ERROR) {
+ if (SOCKET_EINTR(bytes_sent)) {
+ /* the test timer has popped */
+ timed_out = 1;
+ fprintf(where,"yo6\n");
+ fflush(where);
+ break;
+ }
+ netperf_response.content.serv_errno = 992;
+ send_response();
+ exit(1);
+ }
+
+ send_ring = send_ring->next;
+
+ trans_received++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+ }
+
+
+ /* The loop now exits due to timeout or transaction count being */
+ /* reached */
+
+ cpu_stop(sdp_rr_request->measure_cpu,&elapsed_time);
+
+ stop_timer();
+
+ if (timed_out) {
+ /* we ended the test by time, which was at least 2 seconds */
+ /* longer than we wanted to run. so, we want to subtract */
+ /* PAD_TIME from the elapsed_time. */
+ elapsed_time -= PAD_TIME;
+ }
+
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_sdp_rr: got %d transactions\n",
+ trans_received);
+ fflush(where);
+ }
+
+ sdp_rr_results->bytes_received = (trans_received *
+ (sdp_rr_request->request_size +
+ sdp_rr_request->response_size));
+ sdp_rr_results->trans_received = trans_received;
+ sdp_rr_results->elapsed_time = elapsed_time;
+ sdp_rr_results->cpu_method = cpu_method;
+ sdp_rr_results->num_cpus = lib_num_loc_cpus;
+ if (sdp_rr_request->measure_cpu) {
+ sdp_rr_results->cpu_util = calc_cpu_util(elapsed_time);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_sdp_rr: test complete, sending results.\n");
+ fflush(where);
+ }
+
+ /* we are now done with the sockets */
+ close(s_data);
+ close(s_listen);
+
+ send_response();
+
+}
+
+
+
+void
+print_sdp_usage()
+{
+
+ printf("%s",sdp_usage);
+ exit(1);
+
+}
+void
+scan_sdp_args(argc, argv)
+ int argc;
+ char *argv[];
+
+{
+
+#define SOCKETS_ARGS "b:DhH:I:L:m:M:P:r:s:S:V46"
+
+ extern char *optarg; /* pointer to option string */
+
+ int c;
+
+ char
+ arg1[BUFSIZ], /* argument holders */
+ arg2[BUFSIZ];
+
+ if (no_control) {
+ fprintf(where,
+ "The SDP tests do not know how to deal with no control tests\n");
+ exit(-1);
+ }
+
+ strncpy(local_data_port,"0",sizeof(local_data_port));
+ strncpy(remote_data_port,"0",sizeof(remote_data_port));
+
+ /* Go through all the command line arguments and break them */
+ /* out. For those options that take two parms, specifying only */
+ /* the first will set both to that value. Specifying only the */
+ /* second will leave the first untouched. To change only the */
+ /* first, use the form "first," (see the routine break_args.. */
+
+ while ((c= getopt(argc, argv, SOCKETS_ARGS)) != EOF) {
+ switch (c) {
+ case '?':
+ case '4':
+ remote_data_family = AF_INET;
+ local_data_family = AF_INET;
+ break;
+ case '6':
+#if defined(AF_INET6)
+ remote_data_family = AF_INET6;
+ local_data_family = AF_INET6;
+#else
+ fprintf(stderr,
+ "This netperf was not compiled on an IPv6 capable host!\n");
+ fflush(stderr);
+ exit(-1);
+#endif
+ break;
+ case 'h':
+ print_sdp_usage();
+ exit(1);
+ case 'b':
+#ifdef WANT_FIRST_BURST
+ first_burst_size = atoi(optarg);
+#else /* WANT_FIRST_BURST */
+ printf("Initial request burst functionality not compiled-in!\n");
+#endif /* WANT_FIRST_BURST */
+ break;
+ case 'D':
+ /* set the nodelay flag */
+ loc_nodelay = 1;
+ rem_nodelay = 1;
+ break;
+ case 'H':
+ break_args_explicit(optarg,arg1,arg2);
+ if (arg1[0]) {
+ /* make sure we leave room for the NULL termination boys and
+ girls. raj 2005-02-82 */
+ remote_data_address = malloc(strlen(arg1)+1);
+ strncpy(remote_data_address,arg1,strlen(arg1));
+ }
+ if (arg2[0])
+ remote_data_family = parse_address_family(arg2);
+ break;
+ case 'L':
+ break_args_explicit(optarg,arg1,arg2);
+ if (arg1[0]) {
+ /* make sure we leave room for the NULL termination boys and
+ girls. raj 2005-02-82 */
+ local_data_address = malloc(strlen(arg1)+1);
+ strncpy(local_data_address,arg1,strlen(arg1));
+ }
+ if (arg2[0])
+ local_data_family = parse_address_family(arg2);
+ break;
+ case 'P':
+ /* set the local and remote data port numbers for the tests to
+ allow them to run through those blankety blank end-to-end
+ breaking firewalls. raj 2004-06-15 */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ strncpy(local_data_port,arg1,sizeof(local_data_port));
+ if (arg2[0])
+ strncpy(remote_data_port,arg2,sizeof(remote_data_port));
+ break;
+ case 's':
+ /* set local socket sizes */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ lss_size_req = convert(arg1);
+ if (arg2[0])
+ lsr_size_req = convert(arg2);
+ break;
+ case 'S':
+ /* set remote socket sizes */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ rss_size_req = convert(arg1);
+ if (arg2[0])
+ rsr_size_req = convert(arg2);
+ break;
+ case 'r':
+ /* set the request/response sizes */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ req_size = convert(arg1);
+ if (arg2[0])
+ rsp_size = convert(arg2);
+ break;
+ case 'm':
+ /* set size of the buffer for each sent message */
+ send_size = convert(optarg);
+ break;
+ case 'M':
+ /* set the size of the buffer for each received message */
+ recv_size = convert(optarg);
+ break;
+ case 't':
+ /* set the test name */
+ strcpy(test_name,optarg);
+ break;
+ case 'W':
+ /* set the "width" of the user space data */
+ /* buffer. This will be the number of */
+ /* send_size buffers malloc'd in the */
+ /* *_STREAM test. It may be enhanced to set */
+ /* both send and receive "widths" but for now */
+ /* it is just the sending *_STREAM. */
+ send_width = convert(optarg);
+ break;
+ case 'V':
+ /* we want to do copy avoidance and will set */
+ /* it for everything, everywhere, if we really */
+ /* can. of course, we don't know anything */
+ /* about the remote... */
+#ifdef SO_SND_COPYAVOID
+ loc_sndavoid = 1;
+#else
+ loc_sndavoid = 0;
+ printf("Local send copy avoidance not available.\n");
+#endif
+#ifdef SO_RCV_COPYAVOID
+ loc_rcvavoid = 1;
+#else
+ loc_rcvavoid = 0;
+ printf("Local recv copy avoidance not available.\n");
+#endif
+ rem_sndavoid = 1;
+ rem_rcvavoid = 1;
+ break;
+ case 'N':
+ /* this opton allows the user to set the number of
+ * messages to send. This in effect modifies the test
+ * time. If we know the message size, then the we can
+ * express the test time as message_size * number_messages
+ */
+ msg_count = convert (optarg);
+ if (msg_count > 0)
+ test_time = 0;
+ break;
+ case 'B':
+ non_block = 1;
+ break;
+ case 'T':
+ num_associations = atoi(optarg);
+ if (num_associations <= 1) {
+ printf("Number of SDP associations must be >= 1\n");
+ exit(1);
+ }
+ break;
+ };
+ }
+}
+
+#endif /* WANT_SDP */
diff --git a/nettest_sdp.h b/nettest_sdp.h
new file mode 100644
index 0000000..31d76bc
--- /dev/null
+++ b/nettest_sdp.h
@@ -0,0 +1,170 @@
+/*
+ Copyright (C) 2007 Hewlett-Packard Company
+*/
+
+ /* This file contains the test-specific definitions for netperf's SDP */
+ /* sockets tests */
+
+/* one of these days, this should not be required */
+#ifndef AF_INET_SDP
+#define AF_INET_SDP 27
+#define PF_INET_SDP AF_INET_SDP
+#endif
+
+struct sdp_stream_request_struct {
+ int send_buf_size;
+ int recv_buf_size; /* how big does the client want it - the */
+ /* receive socket buffer that is */
+ int receive_size; /* how many bytes do we want to receive at one */
+ /* time? */
+ int recv_alignment; /* what is the alignment of the receive */
+ /* buffer? */
+ int recv_offset; /* and at what offset from that alignment? */
+ int no_delay; /* do we disable the nagle algorithm for send */
+ /* coalescing? */
+ int measure_cpu; /* does the client want server cpu utilization */
+ /* measured? */
+ float cpu_rate; /* do we know how fast the cpu is already? */
+ int test_length; /* how long is the test? */
+ int so_rcvavoid; /* do we want the remote to avoid copies on */
+ /* receives? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int dirty_count; /* how many integers in the receive buffer */
+ /* should be made dirty before calling recv? */
+ int clean_count; /* how many integers should be read from the */
+ /* recv buffer before calling recv? */
+ int port; /* the to port to which recv side should bind
+ to allow netperf to run through firewalls */
+ int ipfamily; /* address family of ipaddress */
+ int non_blocking; /* run the test in non-blocking mode */
+};
+
+struct sdp_stream_response_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int receive_size;
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ int test_length; /* how long is the test? */
+ int send_buf_size;
+ int data_port_number; /* connect to me here */
+ float cpu_rate; /* could we measure */
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+ int non_blocking; /* run the test in non-blocking mode */
+};
+
+struct sdp_stream_results_struct {
+ double bytes_received;
+ unsigned int recv_calls;
+ float elapsed_time; /* how long the test ran */
+ float cpu_util; /* -1 if not measured */
+ float serv_dem; /* -1 if not measured */
+ int cpu_method; /* how was cpu util measured? */
+ int num_cpus; /* how many CPUs had the remote? */
+};
+
+struct sdp_rr_request_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int send_buf_size;
+ int recv_alignment;
+ int recv_offset;
+ int send_alignment;
+ int send_offset;
+ int request_size;
+ int response_size;
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ float cpu_rate; /* do we know how fast the cpu is? */
+ int test_length; /* how long is the test? */
+ int so_rcvavoid; /* do we want the remote to avoid receive */
+ /* copies? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int port; /* the to port to which recv side should bind
+ to allow netperf to run through firewalls */
+ int ipfamily; /* address family of ipaddress */
+ int non_blocking; /* run the test in non-blocking mode */
+};
+
+struct sdp_rr_response_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ int test_length; /* how long is the test? */
+ int send_buf_size;
+ int data_port_number; /* connect to me here */
+ float cpu_rate; /* could we measure */
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+ int non_blocking; /* run the test in non-blocking mode */
+};
+
+struct sdp_rr_results_struct {
+ unsigned int bytes_received; /* ignored initially */
+ unsigned int recv_calls; /* ignored initially */
+ unsigned int trans_received; /* not ignored */
+ float elapsed_time; /* how long the test ran */
+ float cpu_util; /* -1 if not measured */
+ float serv_dem; /* -1 if not measured */
+ int cpu_method; /* how was cpu util measured? */
+ int num_cpus; /* how many CPUs had the remote? */
+};
+
+struct sdp_maerts_request_struct {
+ int send_buf_size;
+ int recv_buf_size; /* how big does the client want it - the */
+ /* receive socket buffer that is */
+ int send_size; /* how many bytes do we want netserver to send
+ at one time? */
+ int send_alignment; /* what is the alignment of the send */
+ /* buffer? */
+ int send_offset; /* and at what offset from that alignment? */
+ int no_delay; /* do we disable the nagle algorithm for send */
+ /* coalescing? */
+ int measure_cpu; /* does the client want server cpu utilization */
+ /* measured? */
+ float cpu_rate; /* do we know how fast the cpu is already? */
+ int test_length; /* how long is the test? */
+ int so_rcvavoid; /* do we want the remote to avoid copies on */
+ /* receives? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int dirty_count; /* how many integers in the send buffer */
+ /* should be made dirty before calling recv? */
+ int clean_count; /* how many integers should be read from the */
+ /* recv buffer before calling recv? */
+ int port; /* the port to which the recv side should bind
+ to allow netperf to run through those evil
+ firewall things */
+ int ipfamily;
+};
+
+struct sdp_maerts_response_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int send_size;
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ int test_length; /* how long is the test? */
+ int send_buf_size;
+ int data_port_number; /* connect to me here */
+ float cpu_rate; /* could we measure */
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+};
+
+struct sdp_maerts_results_struct {
+ double bytes_sent;
+ unsigned int send_calls;
+ float elapsed_time; /* how long the test ran */
+ float cpu_util; /* -1 if not measured */
+ float serv_dem; /* -1 if not measured */
+ int cpu_method; /* how was cpu util measured? */
+ int num_cpus; /* how many CPUs had the remote? */
+};
+
+extern void send_sdp_stream();
+extern void send_sdp_rr();
+
+extern void recv_sdp_stream();
+extern void recv_sdp_rr();
+
+extern void loc_cpu_rate();
+extern void rem_cpu_rate();
diff --git a/nettest_unix.c b/nettest_unix.c
new file mode 100644
index 0000000..e4716a4
--- /dev/null
+++ b/nettest_unix.c
@@ -0,0 +1,3431 @@
+#ifdef lint
+#define WANT_UNIX
+#define DIRTY
+#define WANT_INTERVALS
+#endif /* lint */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef WANT_UNIX
+char nettest_unix_id[]="\
+@(#)nettest_unix.c (c) Copyright 1994-2007 Hewlett-Packard Co. Version 2.4.3";
+
+/****************************************************************/
+/* */
+/* nettest_bsd.c */
+/* */
+/* the BSD sockets parsing routine... */
+/* */
+/* scan_unix_args() */
+/* */
+/* the actual test routines... */
+/* */
+/* send_stream_stream() perform a stream stream test */
+/* recv_stream_stream() */
+/* send_stream_rr() perform a stream request/response */
+/* recv_stream_rr() */
+/* send_dg_stream() perform a dg stream test */
+/* recv_dg_stream() */
+/* send_dg_rr() perform a dg request/response */
+/* recv_dg_rr() */
+/* loc_cpu_rate() determine the local cpu maxrate */
+/* rem_cpu_rate() find the remote cpu maxrate */
+/* */
+/****************************************************************/
+
+ /* at some point, I might want to go-in and see if I really need all */
+ /* these includes, but for the moment, we'll let them all just sit */
+ /* there. raj 8/94 */
+#include <sys/types.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifndef WIN32
+#include <sys/ipc.h>
+#include <sys/socket.h>
+#include <errno.h>
+#include <signal.h>
+#include <sys/un.h>
+#include <unistd.h>
+#else /* WIN32 */
+#include <process.h>
+#include <winsock2.h>
+#include <windows.h>
+#endif /* WIN32 */
+#include <string.h>
+#include <time.h>
+#include <sys/time.h>
+
+#ifdef NOSTDLIBH
+#include <malloc.h>
+#else /* NOSTDLIBH */
+#include <stdlib.h>
+#endif /* NOSTDLIBH */
+
+#include <sys/stat.h>
+
+
+#include "netlib.h"
+#include "netsh.h"
+#include "nettest_unix.h"
+
+
+
+ /* these variables are specific to the UNIX sockets tests. declare */
+ /* them static to make them global only to this file. */
+
+#define UNIX_PRFX "netperf."
+#define UNIX_LENGTH_MAX 0xFFFF - 28
+
+static char
+ path_prefix[32];
+
+static int
+ rss_size, /* remote socket send buffer size */
+ rsr_size, /* remote socket recv buffer size */
+ lss_size_req, /* requested local socket send buffer size */
+ lsr_size_req, /* requested local socket recv buffer size */
+ lss_size, /* local socket send buffer size */
+ lsr_size, /* local socket recv buffer size */
+ req_size = 1, /* request size */
+ rsp_size = 1, /* response size */
+ send_size, /* how big are individual sends */
+ recv_size; /* how big are individual receives */
+
+ /* different options for the sockets */
+
+
+char unix_usage[] = "\n\
+Usage: netperf [global options] -- [test options] \n\
+\n\
+STREAM/DG UNIX Sockets Test Options:\n\
+ -h Display this text\n\
+ -m bytes Set the send size (STREAM_STREAM, DG_STREAM)\n\
+ -M bytes Set the recv size (STREAM_STREAM, DG_STREAM)\n\
+ -p dir Set the directory where pipes are created\n\
+ -r req,res Set request,response size (STREAM_RR, DG_RR)\n\
+ -s send[,recv] Set local socket send/recv buffer sizes\n\
+ -S send[,recv] Set remote socket send/recv buffer sizes\n\
+\n\
+For those options taking two parms, at least one must be specified;\n\
+specifying one value without a comma will set both parms to that\n\
+value, specifying a value with a leading comma will set just the second\n\
+parm, a value with a trailing comma will set just the first. To set\n\
+each parm to unique values, specify both and separate them with a\n\
+comma.\n";
+
+ /* this routing initializes all the test specific variables */
+
+static void
+init_test_vars()
+{
+ rss_size = 0;
+ rsr_size = 0;
+ lss_size_req = 0;
+ lsr_size_req = 0;
+ lss_size = 0;
+ lsr_size = 0;
+ req_size = 1;
+ rsp_size = 1;
+ send_size = 0;
+ recv_size = 0;
+
+ strcpy(path_prefix,"/tmp");
+
+}
+
+ /* This routine will create a data (listen) socket with the apropriate */
+ /* options set and return it to the caller. this replaces all the */
+ /* duplicate code in each of the test routines and should help make */
+ /* things a little easier to understand. since this routine can be */
+ /* called by either the netperf or netserver programs, all output */
+ /* should be directed towards "where." family is generally AF_UNIX, */
+ /* and type will be either SOCK_STREAM or SOCK_DGRAM */
+SOCKET
+create_unix_socket(int family, int type)
+{
+
+ SOCKET temp_socket;
+ int sock_opt_len;
+
+ /*set up the data socket */
+ temp_socket = socket(family,
+ type,
+ 0);
+
+ if (temp_socket == INVALID_SOCKET){
+ fprintf(where,
+ "netperf: create_unix_socket: socket: %d\n",
+ errno);
+ fflush(where);
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"create_unix_socket: socket %d obtained...\n",temp_socket);
+ fflush(where);
+ }
+
+ /* Modify the local socket size. The reason we alter the send buffer */
+ /* size here rather than when the connection is made is to take care */
+ /* of decreases in buffer size. Decreasing the window size after */
+ /* connection establishment is a STREAM no-no. Also, by setting the */
+ /* buffer (window) size before the connection is established, we can */
+ /* control the STREAM MSS (segment size). The MSS is never more that 1/2 */
+ /* the minimum receive buffer size at each half of the connection. */
+ /* This is why we are altering the receive buffer size on the sending */
+ /* size of a unidirectional transfer. If the user has not requested */
+ /* that the socket buffers be altered, we will try to find-out what */
+ /* their values are. If we cannot touch the socket buffer in any way, */
+ /* we will set the values to -1 to indicate that. */
+
+ set_sock_buffer(temp_socket, SEND_BUFFER, lss_size_req, &lss_size);
+ set_sock_buffer(temp_socket, RECV_BUFFER, lsr_size_req, &lsr_size);
+
+ return(temp_socket);
+
+}
+
+
+/* This routine implements the STREAM unidirectional data transfer test */
+/* (a.k.a. stream) for the sockets interface. It receives its */
+/* parameters via global variables from the shell and writes its */
+/* output to the standard output. */
+
+
+void
+send_stream_stream(char remote_host[])
+{
+
+ char *tput_title = "\
+Recv Send Send \n\
+Socket Socket Message Elapsed \n\
+Size Size Size Time Throughput \n\
+bytes bytes bytes secs. %s/sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1 =
+ "%5d %5d %6d %-6.2f %7.2f \n";
+
+ char *cpu_title = "\
+Recv Send Send Utilization Service Demand\n\
+Socket Socket Message Elapsed Send Recv Send Recv\n\
+Size Size Size Time Throughput local remote local remote\n\
+bytes bytes bytes secs. %-8.8s/s %% %% us/KB us/KB\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f\n";
+
+ char *cpu_fmt_1 =
+ "%5d %5d %6d %-6.2f %7.2f %-6.2f %-6.2f %-6.3f %-6.3f\n";
+
+ char *ksink_fmt = "\n\
+Alignment Offset %-8.8s %-8.8s Sends %-8.8s Recvs\n\
+Local Remote Local Remote Xfered Per Per\n\
+Send Recv Send Recv Send (avg) Recv (avg)\n\
+%5d %5d %5d %5d %6.4g %6.2f %6d %6.2f %6d\n";
+
+
+ float elapsed_time;
+
+#ifdef WANT_INTERVALS
+ int interval_count;
+#endif
+
+ /* what we want is to have a buffer space that is at least one */
+ /* send-size greater than our send window. this will insure that we */
+ /* are never trying to re-use a buffer that may still be in the hands */
+ /* of the transport. This buffer will be malloc'd after we have found */
+ /* the size of the local senc socket buffer. We will want to deal */
+ /* with alignment and offset concerns as well. */
+
+#ifdef DIRTY
+ int *message_int_ptr;
+#endif
+#include <sys/stat.h>
+
+ struct ring_elt *send_ring;
+
+ int len = 0;
+ int nummessages;
+ SOCKET send_socket;
+ int bytes_remaining;
+ /* with links like fddi, one can send > 32 bits worth of bytes */
+ /* during a test... ;-) */
+ double bytes_sent;
+
+#ifdef DIRTY
+ int i;
+#endif /* DIRTY */
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+ double thruput;
+
+ struct sockaddr_un server;
+
+ struct stream_stream_request_struct *stream_stream_request;
+ struct stream_stream_response_struct *stream_stream_response;
+ struct stream_stream_results_struct *stream_stream_result;
+
+ stream_stream_request =
+ (struct stream_stream_request_struct *)netperf_request.content.test_specific_data;
+ stream_stream_response =
+ (struct stream_stream_response_struct *)netperf_response.content.test_specific_data;
+ stream_stream_result =
+ (struct stream_stream_results_struct *)netperf_response.content.test_specific_data;
+
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ bzero((char *)&server,
+ sizeof(server));
+ server.sun_family = AF_UNIX;
+
+
+ if ( print_headers ) {
+ fprintf(where,"STREAM STREAM TEST\n");
+ if (local_cpu_usage || remote_cpu_usage)
+ fprintf(where,cpu_title,format_units());
+ else
+ fprintf(where,tput_title,format_units());
+ }
+
+ /* initialize a few counters */
+
+ nummessages = 0;
+ bytes_sent = 0.0;
+ times_up = 0;
+
+ /*set up the data socket */
+ send_socket = create_unix_socket(AF_UNIX,
+ SOCK_STREAM);
+
+ if (send_socket == INVALID_SOCKET){
+ perror("netperf: send_stream_stream: stream stream data socket");
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"send_stream_stream: send_socket obtained...\n");
+ }
+
+ /* at this point, we have either retrieved the socket buffer sizes, */
+ /* or have tried to set them, so now, we may want to set the send */
+ /* size based on that (because the user either did not use a -m */
+ /* option, or used one with an argument of 0). If the socket buffer */
+ /* size is not available, we will set the send size to 4KB - no */
+ /* particular reason, just arbitrary... */
+ if (send_size == 0) {
+ if (lss_size > 0) {
+ send_size = lss_size;
+ }
+ else {
+ send_size = 4096;
+ }
+ }
+
+ /* set-up the data buffer ring with the requested alignment and offset. */
+ /* note also that we have allocated a quantity */
+ /* of memory that is at least one send-size greater than our socket */
+ /* buffer size. We want to be sure that there are at least two */
+ /* buffers allocated - this can be a bit of a problem when the */
+ /* send_size is bigger than the socket size, so we must check... the */
+ /* user may have wanted to explicitly set the "width" of our send */
+ /* buffers, we should respect that wish... */
+ if (send_width == 0) {
+ send_width = (lss_size/send_size) + 1;
+ if (send_width == 1) send_width++;
+ }
+
+ send_ring = allocate_buffer_ring(send_width,
+ send_size,
+ local_send_align,
+ local_send_offset);
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back.*/
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ /* Tell the remote end to do a listen. The server alters the socket */
+ /* paramters on the other side at this point, hence the reason for */
+ /* all the values being passed in the setup message. If the user did */
+ /* not specify any of the parameters, they will be passed as 0, which */
+ /* will indicate to the remote that no changes beyond the system's */
+ /* default should be used. Alignment is the exception, it will */
+ /* default to 1, which will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_STREAM_STREAM;
+ stream_stream_request->send_buf_size = rss_size;
+ stream_stream_request->recv_buf_size = rsr_size;
+ stream_stream_request->receive_size = recv_size;
+ stream_stream_request->recv_alignment = remote_recv_align;
+ stream_stream_request->recv_offset = remote_recv_offset;
+ stream_stream_request->measure_cpu = remote_cpu_usage;
+ stream_stream_request->cpu_rate = remote_cpu_rate;
+ if (test_time) {
+ stream_stream_request->test_length = test_time;
+ }
+ else {
+ stream_stream_request->test_length = test_bytes;
+ }
+#ifdef DIRTY
+ stream_stream_request->dirty_count = rem_dirty_count;
+ stream_stream_request->clean_count = rem_clean_count;
+#endif /* DIRTY */
+
+
+ if (debug > 1) {
+ fprintf(where,
+ "netperf: send_stream_stream: requesting STREAM stream test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant */
+ /* socket parameters for this test type. We will put them back into */
+ /* the variables here so they can be displayed if desired. The */
+ /* remote will have calibrated CPU if necessary, and will have done */
+ /* all the needed set-up we will have calibrated the cpu locally */
+ /* before sending the request, and will grab the counter value right */
+ /* after the connect returns. The remote will grab the counter right */
+ /* after the accept call. This saves the hassle of extra messages */
+ /* being sent for the STREAM tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote listen done.\n");
+ rsr_size = stream_stream_response->recv_buf_size;
+ rss_size = stream_stream_response->send_buf_size;
+ remote_cpu_usage = stream_stream_response->measure_cpu;
+ remote_cpu_rate = stream_stream_response->cpu_rate;
+ strcpy(server.sun_path,stream_stream_response->unix_path);
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("netperf: send_stream_stream: remote error");
+ exit(1);
+ }
+
+ /*Connect up to the remote port on the data socket */
+ if (connect(send_socket,
+ (struct sockaddr *)&server,
+ sizeof(server)) == INVALID_SOCKET){
+ perror("netperf: send_stream_stream: data socket connect failed");
+ printf(" path: %s\n",server.sun_path);
+ exit(1);
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either the */
+ /* connect would have failed, or the previous response would have */
+ /* indicated a problem. I failed to see the value of the extra */
+ /* message after the accept on the remote. If it failed, we'll see it */
+ /* here. If it didn't, we might as well start pumping data. */
+
+ /* Set-up the test end conditions. For a stream test, they can be */
+ /* either time or byte-count based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ bytes_remaining = 0;
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ bytes_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return false. */
+ /* When the test is controlled by byte count, the time test will */
+ /* always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. */
+
+#ifdef DIRTY
+ /* initialize the random number generator for putting dirty stuff */
+ /* into the send buffer. raj */
+ srand((int) getpid());
+#endif
+
+ while ((!times_up) || (bytes_remaining > 0)) {
+
+#ifdef DIRTY
+ /* we want to dirty some number of consecutive integers in the buffer */
+ /* we are about to send. we may also want to bring some number of */
+ /* them cleanly into the cache. The clean ones will follow any dirty */
+ /* ones into the cache. at some point, we might want to replace */
+ /* the rand() call with something from a table to reduce our call */
+ /* overhead during the test, but it is not a high priority item. */
+ message_int_ptr = (int *)(send_ring->buffer_ptr);
+ for (i = 0; i < loc_dirty_count; i++) {
+ *message_int_ptr = rand();
+ message_int_ptr++;
+ }
+ for (i = 0; i < loc_clean_count; i++) {
+ loc_dirty_count = *message_int_ptr;
+ message_int_ptr++;
+ }
+#endif /* DIRTY */
+
+ if((len=send(send_socket,
+ send_ring->buffer_ptr,
+ send_size,
+ 0)) != send_size) {
+ if ((len >=0) || (errno == EINTR)) {
+ /* the test was interrupted, must be the end of test */
+ break;
+ }
+ perror("netperf: data send error");
+ printf("len was %d\n",len);
+ exit(1);
+ }
+#ifdef WANT_INTERVALS
+ for (interval_count = 0;
+ interval_count < interval_wate;
+ interval_count++);
+#endif
+
+ /* now we want to move our pointer to the next position in the */
+ /* data buffer...we may also want to wrap back to the "beginning" */
+ /* of the bufferspace, so we will mod the number of messages sent */
+ /* by the send width, and use that to calculate the offset to add */
+ /* to the base pointer. */
+ nummessages++;
+ send_ring = send_ring->next;
+ if (bytes_remaining) {
+ bytes_remaining -= send_size;
+ }
+ }
+
+ /* The test is over. Flush the buffers to the remote end. We do a */
+ /* graceful release to insure that all data has been taken by the */
+ /* remote. */
+
+ if (close(send_socket) == -1) {
+ perror("netperf: send_stream_stream: cannot close socket");
+ exit(1);
+ }
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being */
+ /* measured and how */
+ /* long did we really */
+ /* run? */
+
+ /* Get the statistics from the remote end. The remote will have */
+ /* calculated service demand and all those interesting things. If it */
+ /* wasn't supposed to care, it will return obvious values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("netperf: remote error");
+
+ exit(1);
+ }
+
+ /* We now calculate what our thruput was for the test. In the future, */
+ /* we may want to include a calculation of the thruput measured by */
+ /* the remote, but it should be the case that for a STREAM stream test, */
+ /* that the two numbers should be *very* close... We calculate */
+ /* bytes_sent regardless of the way the test length was controlled. */
+ /* If it was time, we needed to, and if it was by bytes, the user may */
+ /* have specified a number of bytes that wasn't a multiple of the */
+ /* send_size, so we really didn't send what he asked for ;-) */
+
+ bytes_sent = ((double) send_size * (double) nummessages) + len;
+ thruput = calc_thruput(bytes_sent);
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+ if (local_cpu_rate == 0.0) {
+ fprintf(where,"WARNING WARNING WARNING WARNING WARNING WARNING WARNING!\n");
+ fprintf(where,"Local CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+ local_cpu_utilization = calc_cpu_util(0.0);
+ local_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = -1.0;
+ local_service_demand = -1.0;
+ }
+
+ if (remote_cpu_usage) {
+ if (remote_cpu_rate == 0.0) {
+ fprintf(where,"DANGER DANGER DANGER DANGER DANGER DANGER DANGER!\n");
+ fprintf(where,"Remote CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+ remote_cpu_utilization = stream_stream_result->cpu_util;
+ remote_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ remote_cpu_utilization,
+ stream_stream_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = -1.0;
+ remote_service_demand = -1.0;
+ }
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand);
+ }
+ break;
+ case 1:
+ case 2:
+ fprintf(where,
+ cpu_fmt_1, /* the format string */
+ rsr_size, /* remote recvbuf size */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long was the test */
+ thruput, /* what was the xfer rate */
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand); /* remote service demand */
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ thruput);
+ break;
+ case 1:
+ case 2:
+ fprintf(where,
+ tput_fmt_1, /* the format string */
+ rsr_size, /* remote recvbuf size */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long did it take */
+ thruput);/* how fast did it go */
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* STREAM statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ fprintf(where,
+ ksink_fmt,
+ "Bytes",
+ "Bytes",
+ "Bytes",
+ local_send_align,
+ remote_recv_align,
+ local_send_offset,
+ remote_recv_offset,
+ bytes_sent,
+ bytes_sent / (double)nummessages,
+ nummessages,
+ bytes_sent / (double)stream_stream_result->recv_calls,
+ stream_stream_result->recv_calls);
+ }
+
+}
+
+
+/* This is the server-side routine for the stream stream test. It is */
+/* implemented as one routine. I could break things-out somewhat, but */
+/* didn't feel it was necessary. */
+
+void
+recv_stream_stream()
+{
+
+ struct sockaddr_un myaddr_un, peeraddr_un;
+ SOCKET s_listen,s_data;
+ int addrlen;
+ int len;
+ int receive_calls = 0;
+ float elapsed_time;
+ int bytes_received;
+
+ struct ring_elt *recv_ring;
+
+#ifdef DIRTY
+ char *message_ptr;
+ int *message_int_ptr;
+ int dirty_count;
+ int clean_count;
+ int i;
+#endif
+
+ struct stream_stream_request_struct *stream_stream_request;
+ struct stream_stream_response_struct *stream_stream_response;
+ struct stream_stream_results_struct *stream_stream_results;
+
+ stream_stream_request =
+ (struct stream_stream_request_struct *)netperf_request.content.test_specific_data;
+ stream_stream_response =
+ (struct stream_stream_response_struct *)netperf_response.content.test_specific_data;
+ stream_stream_results =
+ (struct stream_stream_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_stream_stream: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_stream_stream: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = STREAM_STREAM_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_stream_stream: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* We now alter the message_ptr variable to be at the desired */
+ /* alignment with the desired offset. */
+
+ if (debug) {
+ fprintf(where,"recv_stream_stream: requested alignment of %d\n",
+ stream_stream_request->recv_alignment);
+ fflush(where);
+ }
+
+ /* Let's clear-out our sockaddr for the sake of cleanlines. Then we */
+ /* can put in OUR values !-) At some point, we may want to nail this */
+ /* socket to a particular network-level address, but for now, */
+ /* INADDR_ANY should be just fine. */
+
+ bzero((char *)&myaddr_un,
+ sizeof(myaddr_un));
+ myaddr_un.sun_family = AF_UNIX;
+
+ /* Grab a socket to listen on, and then listen on it. */
+
+ if (debug) {
+ fprintf(where,"recv_stream_stream: grabbing a socket...\n");
+ fflush(where);
+ }
+
+ /* create_unix_socket expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lss_size_req = stream_stream_request->send_buf_size;
+ lsr_size_req = stream_stream_request->recv_buf_size;
+
+ s_listen = create_unix_socket(AF_UNIX,
+ SOCK_STREAM);
+
+ if (s_listen == INVALID_SOCKET) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ /* Let's get an address assigned to this socket so we can tell the */
+ /* initiator how to reach the data socket. There may be a desire to */
+ /* nail this socket to a specific IP address in a multi-homed, */
+ /* multi-connection situation, but for now, we'll ignore the issue */
+ /* and concentrate on single connection testing. */
+
+ strcpy(myaddr_un.sun_path,tempnam(path_prefix,"netperf."));
+ if (debug) {
+ fprintf(where,"selected a path of %s\n",myaddr_un.sun_path);
+ fflush(where);
+ }
+ if (bind(s_listen,
+ (struct sockaddr *)&myaddr_un,
+ sizeof(myaddr_un)) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ fprintf(where,"could not bind to path\n");
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+ chmod(myaddr_un.sun_path, 0666);
+
+ /* what sort of sizes did we end-up with? */
+ if (stream_stream_request->receive_size == 0) {
+ if (lsr_size > 0) {
+ recv_size = lsr_size;
+ }
+ else {
+ recv_size = 4096;
+ }
+ }
+ else {
+ recv_size = stream_stream_request->receive_size;
+ }
+
+ /* we want to set-up our recv_ring in a manner analagous to what we */
+ /* do on the sending side. this is more for the sake of symmetry */
+ /* than for the needs of say copy avoidance, but it might also be */
+ /* more realistic - this way one could conceivably go with a */
+ /* double-buffering scheme when taking the data an putting it into */
+ /* the filesystem or something like that. raj 7/94 */
+
+ if (recv_width == 0) {
+ recv_width = (lsr_size/recv_size) + 1;
+ if (recv_width == 1) recv_width++;
+ }
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ recv_size,
+ stream_stream_request->recv_alignment,
+ stream_stream_request->recv_offset);
+
+ if (debug) {
+ fprintf(where,"recv_stream_stream: receive alignment and offset set...\n");
+ fflush(where);
+ }
+
+ /* Now, let's set-up the socket to listen for connections */
+ if (listen(s_listen, 5) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+ /* now get the port number assigned by the system */
+ addrlen = sizeof(myaddr_un);
+ if (getsockname(s_listen,
+ (struct sockaddr *)&myaddr_un,
+ &addrlen) == SOCKET_ERROR){
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+ /* Now myaddr_un contains the path */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+ strcpy(stream_stream_response->unix_path,myaddr_un.sun_path);
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a -1 to */
+ /* the initiator. */
+
+ stream_stream_response->cpu_rate = 0.0; /* assume no cpu */
+ if (stream_stream_request->measure_cpu) {
+ stream_stream_response->measure_cpu = 1;
+ stream_stream_response->cpu_rate =
+ calibrate_local_cpu(stream_stream_request->cpu_rate);
+ }
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ stream_stream_response->send_buf_size = lss_size;
+ stream_stream_response->recv_buf_size = lsr_size;
+ stream_stream_response->receive_size = recv_size;
+
+ send_response();
+
+ addrlen = sizeof(peeraddr_un);
+
+ if ((s_data=accept(s_listen,
+ (struct sockaddr *)&peeraddr_un,
+ &addrlen)) == INVALID_SOCKET) {
+ /* Let's just punt. The remote will be given some information */
+ close(s_listen);
+ exit(1);
+ }
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(stream_stream_request->measure_cpu);
+
+ /* The loop will exit when the sender does a shutdown, which will */
+ /* return a length of zero */
+
+#ifdef DIRTY
+ /* we want to dirty some number of consecutive integers in the buffer */
+ /* we are about to recv. we may also want to bring some number of */
+ /* them cleanly into the cache. The clean ones will follow any dirty */
+ /* ones into the cache. */
+
+ dirty_count = stream_stream_request->dirty_count;
+ clean_count = stream_stream_request->clean_count;
+ message_int_ptr = (int *)recv_ring->buffer_ptr;
+ for (i = 0; i < dirty_count; i++) {
+ *message_int_ptr = rand();
+ message_int_ptr++;
+ }
+ for (i = 0; i < clean_count; i++) {
+ dirty_count = *message_int_ptr;
+ message_int_ptr++;
+ }
+#endif /* DIRTY */
+ bytes_received = 0;
+
+ while ((len = recv(s_data, recv_ring->buffer_ptr, recv_size, 0)) != 0) {
+ if (len == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+ bytes_received += len;
+ receive_calls++;
+
+ /* more to the next buffer in the recv_ring */
+ recv_ring = recv_ring->next;
+
+#ifdef DIRTY
+ message_int_ptr = (int *)(recv_ring->buffer_ptr);
+ for (i = 0; i < dirty_count; i++) {
+ *message_int_ptr = rand();
+ message_int_ptr++;
+ }
+ for (i = 0; i < clean_count; i++) {
+ dirty_count = *message_int_ptr;
+ message_int_ptr++;
+ }
+#endif /* DIRTY */
+ }
+
+ /* The loop now exits due to zero bytes received. we will have */
+ /* counted one too many messages received, so decrement the */
+ /* receive_calls counter by one. raj 7/94 */
+ receive_calls--;
+
+ /* perform a shutdown to signal the sender that */
+ /* we have received all the data sent. raj 4/93 */
+
+ if (shutdown(s_data,1) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ cpu_stop(stream_stream_request->measure_cpu,&elapsed_time);
+
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_stream_stream: got %d bytes\n",
+ bytes_received);
+ fprintf(where,
+ "recv_stream_stream: got %d recvs\n",
+ receive_calls);
+ fflush(where);
+ }
+
+ stream_stream_results->bytes_received = bytes_received;
+ stream_stream_results->elapsed_time = elapsed_time;
+ stream_stream_results->recv_calls = receive_calls;
+
+ if (stream_stream_request->measure_cpu) {
+ stream_stream_results->cpu_util = calc_cpu_util(0.0);
+ };
+
+ if (debug > 1) {
+ fprintf(where,
+ "recv_stream_stream: test complete, sending results.\n");
+ fflush(where);
+ }
+
+ send_response();
+ unlink(myaddr_un.sun_path);
+}
+
+
+ /* this routine implements the sending (netperf) side of the STREAM_RR */
+ /* test. */
+
+void
+send_stream_rr(char remote_host[])
+{
+
+ char *tput_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans.\n\
+Send Recv Size Size Time Rate \n\
+bytes Bytes bytes bytes secs. per sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %7.2f \n";
+ char *tput_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *cpu_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem\n\
+Send Recv Size Size Time Rate local remote local remote\n\
+bytes bytes bytes bytes secs. per sec %% %% us/Tr us/Tr\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f\n";
+
+ char *cpu_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %-6.2f %-6.2f %-6.2f %-6.3f %-6.3f\n";
+
+ char *cpu_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *ksink_fmt = "\
+Alignment Offset\n\
+Local Remote Local Remote\n\
+Send Recv Send Recv\n\
+%5d %5d %5d %5d\n";
+
+
+ int timed_out = 0;
+ float elapsed_time;
+
+ int len;
+ char *temp_message_ptr;
+ int nummessages;
+ SOCKET send_socket;
+ int trans_remaining;
+ double bytes_xferd;
+
+ struct ring_elt *send_ring;
+ struct ring_elt *recv_ring;
+
+ int rsp_bytes_left;
+ int rsp_bytes_recvd;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+ double thruput;
+
+ struct sockaddr_un server;
+
+ struct stream_rr_request_struct *stream_rr_request;
+ struct stream_rr_response_struct *stream_rr_response;
+ struct stream_rr_results_struct *stream_rr_result;
+
+ stream_rr_request =
+ (struct stream_rr_request_struct *)netperf_request.content.test_specific_data;
+ stream_rr_response=
+ (struct stream_rr_response_struct *)netperf_response.content.test_specific_data;
+ stream_rr_result =
+ (struct stream_rr_results_struct *)netperf_response.content.test_specific_data;
+
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ bzero((char *)&server,
+ sizeof(server));
+
+ server.sun_family = AF_UNIX;
+
+
+ if ( print_headers ) {
+ fprintf(where,"STREAM REQUEST/RESPONSE TEST\n");
+ if (local_cpu_usage || remote_cpu_usage)
+ fprintf(where,cpu_title,format_units());
+ else
+ fprintf(where,tput_title,format_units());
+ }
+
+ /* initialize a few counters */
+
+ nummessages = 0;
+ bytes_xferd = 0.0;
+ times_up = 0;
+
+ /* set-up the data buffers with the requested alignment and offset. */
+ /* since this is a request/response test, default the send_width and */
+ /* recv_width to 1 and not two raj 7/94 */
+
+ if (send_width == 0) send_width = 1;
+ if (recv_width == 0) recv_width = 1;
+
+ send_ring = allocate_buffer_ring(send_width,
+ req_size,
+ local_send_align,
+ local_send_offset);
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ rsp_size,
+ local_recv_align,
+ local_recv_offset);
+
+ /*set up the data socket */
+ send_socket = create_unix_socket(AF_UNIX,
+ SOCK_STREAM);
+
+ if (send_socket == INVALID_SOCKET){
+ perror("netperf: send_stream_rr: stream stream data socket");
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"send_stream_rr: send_socket obtained...\n");
+ }
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back.*/
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ /* Tell the remote end to do a listen. The server alters the socket */
+ /* paramters on the other side at this point, hence the reason for */
+ /* all the values being passed in the setup message. If the user did */
+ /* not specify any of the parameters, they will be passed as 0, which */
+ /* will indicate to the remote that no changes beyond the system's */
+ /* default should be used. Alignment is the exception, it will */
+ /* default to 8, which will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_STREAM_RR;
+ stream_rr_request->recv_buf_size = rsr_size;
+ stream_rr_request->send_buf_size = rss_size;
+ stream_rr_request->recv_alignment= remote_recv_align;
+ stream_rr_request->recv_offset = remote_recv_offset;
+ stream_rr_request->send_alignment= remote_send_align;
+ stream_rr_request->send_offset = remote_send_offset;
+ stream_rr_request->request_size = req_size;
+ stream_rr_request->response_size = rsp_size;
+ stream_rr_request->measure_cpu = remote_cpu_usage;
+ stream_rr_request->cpu_rate = remote_cpu_rate;
+ if (test_time) {
+ stream_rr_request->test_length = test_time;
+ }
+ else {
+ stream_rr_request->test_length = test_trans * -1;
+ }
+
+ if (debug > 1) {
+ fprintf(where,"netperf: send_stream_rr: requesting STREAM rr test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant */
+ /* socket parameters for this test type. We will put them back into */
+ /* the variables here so they can be displayed if desired. The */
+ /* remote will have calibrated CPU if necessary, and will have done */
+ /* all the needed set-up we will have calibrated the cpu locally */
+ /* before sending the request, and will grab the counter value right */
+ /* after the connect returns. The remote will grab the counter right */
+ /* after the accept call. This saves the hassle of extra messages */
+ /* being sent for the STREAM tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote listen done.\n");
+ rsr_size = stream_rr_response->recv_buf_size;
+ rss_size = stream_rr_response->send_buf_size;
+ remote_cpu_usage= stream_rr_response->measure_cpu;
+ remote_cpu_rate = stream_rr_response->cpu_rate;
+ /* make sure that port numbers are in network order */
+ strcpy(server.sun_path,stream_rr_response->unix_path);
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("netperf: remote error");
+
+ exit(1);
+ }
+
+ /*Connect up to the remote port on the data socket */
+ if (connect(send_socket,
+ (struct sockaddr *)&server,
+ sizeof(server)) == INVALID_SOCKET){
+ perror("netperf: data socket connect failed");
+
+ exit(1);
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either the */
+ /* connect would have failed, or the previous response would have */
+ /* indicated a problem. I failed to see the value of the extra */
+ /* message after the accept on the remote. If it failed, we'll see it */
+ /* here. If it didn't, we might as well start pumping data. */
+
+ /* Set-up the test end conditions. For a request/response test, they */
+ /* can be either time or transaction based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ trans_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return false. */
+ /* When the test is controlled by byte count, the time test will */
+ /* always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. I think I */
+ /* just arbitrarily decrement trans_remaining for the timed test, but */
+ /* will not do that just yet... One other question is whether or not */
+ /* the send buffer and the receive buffer should be the same buffer. */
+
+ while ((!times_up) || (trans_remaining > 0)) {
+ /* send the request. we assume that if we use a blocking socket, */
+ /* the request will be sent at one shot. */
+ if((len=send(send_socket,
+ send_ring->buffer_ptr,
+ req_size,
+ 0)) != req_size) {
+ if (errno == EINTR) {
+ /* we hit the end of a */
+ /* timed test. */
+ timed_out = 1;
+ break;
+ }
+ perror("send_stream_rr: data send error");
+ exit(1);
+ }
+ send_ring = send_ring->next;
+
+ /* receive the response */
+ rsp_bytes_left = rsp_size;
+ temp_message_ptr = recv_ring->buffer_ptr;
+ while(rsp_bytes_left > 0) {
+ if((rsp_bytes_recvd=recv(send_socket,
+ temp_message_ptr,
+ rsp_bytes_left,
+ 0)) == SOCKET_ERROR) {
+ if (errno == EINTR) {
+ /* We hit the end of a timed test. */
+ timed_out = 1;
+ break;
+ }
+ perror("send_stream_rr: data recv error");
+ exit(1);
+ }
+ rsp_bytes_left -= rsp_bytes_recvd;
+ temp_message_ptr += rsp_bytes_recvd;
+ }
+ recv_ring = recv_ring->next;
+
+ if (timed_out) {
+ /* we may have been in a nested while loop - we need */
+ /* another call to break. */
+ break;
+ }
+
+ nummessages++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug > 3) {
+ fprintf(where,
+ "Transaction %d completed\n",
+ nummessages);
+ fflush(where);
+ }
+ }
+
+ /* At this point we used to call shutdown on the data socket to be */
+ /* sure all the data was delivered, but this was not germane in a */
+ /* request/response test, and it was causing the tests to "hang" when */
+ /* they were being controlled by time. So, I have replaced this */
+ /* shutdown call with a call to close that can be found later in the */
+ /* procedure. */
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being measured? */
+ /* how long did we really run? */
+
+ /* Get the statistics from the remote end. The remote will have */
+ /* calculated service demand and all those interesting things. If it */
+ /* wasn't supposed to care, it will return obvious values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("netperf: remote error");
+
+ exit(1);
+ }
+
+ /* We now calculate what our thruput was for the test. In the future, */
+ /* we may want to include a calculation of the thruput measured by */
+ /* the remote, but it should be the case that for a STREAM stream test, */
+ /* that the two numbers should be *very* close... We calculate */
+ /* bytes_sent regardless of the way the test length was controlled. */
+ /* If it was time, we needed to, and if it was by bytes, the user may */
+ /* have specified a number of bytes that wasn't a multiple of the */
+ /* send_size, so we really didn't send what he asked for ;-) We use */
+ /* Kbytes/s as the units of thruput for a STREAM stream test, where K = */
+ /* 1024. A future enhancement *might* be to choose from a couple of */
+ /* unit selections. */
+
+ bytes_xferd = (req_size * nummessages) + (rsp_size * nummessages);
+ thruput = calc_thruput(bytes_xferd);
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+ if (local_cpu_rate == 0.0) {
+ fprintf(where,"WARNING WARNING WARNING WARNING WARNING WARNING WARNING!\n");
+ fprintf(where,"Local CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+ local_cpu_utilization = calc_cpu_util(0.0);
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ local_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = -1.0;
+ local_service_demand = -1.0;
+ }
+
+ if (remote_cpu_usage) {
+ if (remote_cpu_rate == 0.0) {
+ fprintf(where,"DANGER DANGER DANGER DANGER DANGER DANGER DANGER!\n");
+ fprintf(where,"Remote CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+ remote_cpu_utilization = stream_rr_result->cpu_util;
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ remote_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ remote_cpu_utilization,
+ stream_rr_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = -1.0;
+ remote_service_demand = -1.0;
+ }
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand);
+ }
+ break;
+ case 1:
+ fprintf(where,
+ cpu_fmt_1_line_1, /* the format string */
+ lss_size, /* local sendbuf size */
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* guess */
+ elapsed_time, /* how long was the test */
+ nummessages/elapsed_time,
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand); /* remote service demand */
+ fprintf(where,
+ cpu_fmt_1_line_2,
+ rss_size,
+ rsr_size);
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ nummessages/elapsed_time);
+ break;
+ case 1:
+ fprintf(where,
+ tput_fmt_1_line_1, /* the format string */
+ lss_size,
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* how large were the responses */
+ elapsed_time, /* how long did it take */
+ nummessages/elapsed_time);
+ fprintf(where,
+ tput_fmt_1_line_2,
+ rss_size, /* remote recvbuf size */
+ rsr_size);
+
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* STREAM statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ fprintf(where,
+ ksink_fmt);
+ }
+ /* The test is over. Kill the data socket */
+
+ if (close(send_socket) == -1) {
+ perror("send_stream_rr: cannot shutdown stream stream socket");
+ }
+
+}
+
+void
+send_dg_stream(char remote_host[])
+{
+ /************************************************************************/
+ /* */
+ /* DG Unidirectional Send Test */
+ /* */
+ /************************************************************************/
+ char *tput_title =
+ "Socket Message Elapsed Messages \n\
+Size Size Time Okay Errors Throughput\n\
+bytes bytes secs # # %s/sec\n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1 =
+ "%5d %5d %-7.2f %7d %6d %7.2f\n\
+%5d %-7.2f %7d %7.2f\n\n";
+
+
+ char *cpu_title =
+ "Socket Message Elapsed Messages CPU Service\n\
+Size Size Time Okay Errors Throughput Util Demand\n\
+bytes bytes secs # # %s/sec %% us/KB\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.2f\n";
+
+ char *cpu_fmt_1 =
+ "%5d %5d %-7.2f %7d %6d %7.1f %-6.2f %-6.3f\n\
+%5d %-7.2f %7d %7.1f %-6.2f %-6.3f\n\n";
+
+ int messages_recvd;
+ float elapsed_time,
+ local_cpu_utilization,
+ remote_cpu_utilization;
+
+ float local_service_demand, remote_service_demand;
+ double local_thruput, remote_thruput;
+ double bytes_sent;
+ double bytes_recvd;
+
+
+ int len;
+ struct ring_elt *send_ring;
+ int failed_sends;
+ int failed_cows;
+ int messages_sent;
+ SOCKET data_socket;
+
+
+#ifdef WANT_INTERVALS
+ int interval_count;
+#endif /* WANT_INTERVALS */
+#ifdef DIRTY
+ int *message_int_ptr;
+ int i;
+#endif /* DIRTY */
+
+ struct sockaddr_un server;
+
+ struct dg_stream_request_struct *dg_stream_request;
+ struct dg_stream_response_struct *dg_stream_response;
+ struct dg_stream_results_struct *dg_stream_results;
+
+ dg_stream_request = (struct dg_stream_request_struct *)netperf_request.content.test_specific_data;
+ dg_stream_response = (struct dg_stream_response_struct *)netperf_response.content.test_specific_data;
+ dg_stream_results = (struct dg_stream_results_struct *)netperf_response.content.test_specific_data;
+
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ bzero((char *)&server,
+ sizeof(server));
+
+ server.sun_family = AF_UNIX;
+
+ if ( print_headers ) {
+ printf("DG UNIDIRECTIONAL SEND TEST\n");
+ if (local_cpu_usage || remote_cpu_usage)
+ printf(cpu_title,format_units());
+ else
+ printf(tput_title,format_units());
+ }
+
+ failed_sends = 0;
+ failed_cows = 0;
+ messages_sent = 0;
+ times_up = 0;
+
+ /*set up the data socket */
+ data_socket = create_unix_socket(AF_UNIX,
+ SOCK_DGRAM);
+
+ if (data_socket == INVALID_SOCKET){
+ perror("dg_send: data socket");
+ exit(1);
+ }
+
+ /* now, we want to see if we need to set the send_size */
+ if (send_size == 0) {
+ if (lss_size > 0) {
+ send_size = (lss_size < UNIX_LENGTH_MAX ? lss_size : UNIX_LENGTH_MAX);
+ }
+ else {
+ send_size = 4096;
+ }
+ }
+
+
+ /* set-up the data buffer with the requested alignment and offset, */
+ /* most of the numbers here are just a hack to pick something nice */
+ /* and big in an attempt to never try to send a buffer a second time */
+ /* before it leaves the node...unless the user set the width */
+ /* explicitly. */
+ if (send_width == 0) send_width = 32;
+
+ send_ring = allocate_buffer_ring(send_width,
+ send_size,
+ local_send_align,
+ local_send_offset);
+
+ /* At this point, we want to do things like disable DG checksumming */
+ /* and measure the cpu rate and all that so we are ready to go */
+ /* immediately after the test response message is delivered. */
+
+ /* if the user supplied a cpu rate, this call will complete rather */
+ /* quickly, otherwise, the cpu rate will be retured to us for */
+ /* possible display. The Library will keep it's own copy of this data */
+ /* for use elsewhere. We will only display it. (Does that make it */
+ /* "opaque" to us?) */
+
+ if (local_cpu_usage)
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+
+ /* Tell the remote end to set up the data connection. The server */
+ /* sends back the port number and alters the socket parameters there. */
+ /* Of course this is a datagram service so no connection is actually */
+ /* set up, the server just sets up the socket and binds it. */
+
+ netperf_request.content.request_type = DO_DG_STREAM;
+ dg_stream_request->recv_buf_size = rsr_size;
+ dg_stream_request->message_size = send_size;
+ dg_stream_request->recv_alignment = remote_recv_align;
+ dg_stream_request->recv_offset = remote_recv_offset;
+ dg_stream_request->measure_cpu = remote_cpu_usage;
+ dg_stream_request->cpu_rate = remote_cpu_rate;
+ dg_stream_request->test_length = test_time;
+
+ send_request();
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"send_dg_stream: remote data connection done.\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("send_dg_stream: error on remote");
+ exit(1);
+ }
+
+ /* Place the port number returned by the remote into the sockaddr */
+ /* structure so our sends can be sent to the correct place. Also get */
+ /* some of the returned socket buffer information for user display. */
+
+ /* make sure that port numbers are in the proper order */
+ strcpy(server.sun_path,dg_stream_response->unix_path);
+ rsr_size = dg_stream_response->recv_buf_size;
+ rss_size = dg_stream_response->send_buf_size;
+ remote_cpu_rate = dg_stream_response->cpu_rate;
+
+ /* We "connect" up to the remote post to allow is to use the send */
+ /* call instead of the sendto call. Presumeably, this is a little */
+ /* simpler, and a little more efficient. I think that it also means */
+ /* that we can be informed of certain things, but am not sure yet... */
+
+ if (connect(data_socket,
+ (struct sockaddr *)&server,
+ sizeof(server)) == INVALID_SOCKET){
+ perror("send_dg_stream: data socket connect failed");
+ exit(1);
+ }
+
+ /* set up the timer to call us after test_time */
+ start_timer(test_time);
+
+ /* Get the start count for the idle counter and the start time */
+
+ cpu_start(local_cpu_usage);
+
+#ifdef WANT_INTERVALS
+ interval_count = interval_burst;
+#endif
+
+ /* Send datagrams like there was no tomorrow. at somepoint it might */
+ /* be nice to set this up so that a quantity of bytes could be sent, */
+ /* but we still need some sort of end of test trigger on the receive */
+ /* side. that could be a select with a one second timeout, but then */
+ /* if there is a test where none of the data arrives for awile and */
+ /* then starts again, we would end the test too soon. something to */
+ /* think about... */
+ while (!times_up) {
+
+#ifdef DIRTY
+ /* we want to dirty some number of consecutive integers in the buffer */
+ /* we are about to send. we may also want to bring some number of */
+ /* them cleanly into the cache. The clean ones will follow any dirty */
+ /* ones into the cache. */
+ message_int_ptr = (int *)(send_ring->buffer_ptr);
+ for (i = 0; i < loc_dirty_count; i++) {
+ *message_int_ptr = 4;
+ message_int_ptr++;
+ }
+ for (i = 0; i < loc_clean_count; i++) {
+ loc_dirty_count = *message_int_ptr;
+ message_int_ptr++;
+ }
+#endif /* DIRTY */
+
+ if ((len=send(data_socket,
+ send_ring->buffer_ptr,
+ send_size,
+ 0)) != send_size) {
+ if ((len >= 0) || (errno == EINTR))
+ break;
+ if (errno == ENOBUFS) {
+ failed_sends++;
+ continue;
+ }
+ perror("dg_send: data send error");
+ exit(1);
+ }
+ messages_sent++;
+
+ /* now we want to move our pointer to the next position in the */
+ /* data buffer... */
+
+ send_ring = send_ring->next;
+
+
+#ifdef WANT_INTERVALS
+ /* in this case, the interval count is the count-down couter */
+ /* to decide to sleep for a little bit */
+ if ((interval_burst) && (--interval_count == 0)) {
+ /* call the sleep routine for some milliseconds, if our */
+ /* timer popped while we were in there, we want to */
+ /* break out of the loop. */
+ if (msec_sleep(interval_wate)) {
+ break;
+ }
+ interval_count = interval_burst;
+ }
+
+#endif
+
+ }
+
+ /* This is a timed test, so the remote will be returning to us after */
+ /* a time. We should not need to send any "strange" messages to tell */
+ /* the remote that the test is completed, unless we decide to add a */
+ /* number of messages to the test. */
+
+ /* the test is over, so get stats and stuff */
+ cpu_stop(local_cpu_usage,
+ &elapsed_time);
+
+ /* Get the statistics from the remote end */
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"send_dg_stream: remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("send_dg_stream: error on remote");
+ exit(1);
+ }
+
+ bytes_sent = send_size * messages_sent;
+ local_thruput = calc_thruput(bytes_sent);
+
+ messages_recvd = dg_stream_results->messages_recvd;
+ bytes_recvd = send_size * messages_recvd;
+
+ /* we asume that the remote ran for as long as we did */
+
+ remote_thruput = calc_thruput(bytes_recvd);
+
+ /* print the results for this socket and message size */
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) We pass zeros for the local */
+ /* cpu utilization and elapsed time to tell the routine to use */
+ /* the libraries own values for those. */
+ if (local_cpu_usage) {
+ if (local_cpu_rate == 0.0) {
+ fprintf(where,"WARNING WARNING WARNING WARNING WARNING WARNING WARNING!\n");
+ fprintf(where,"Local CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+
+ local_cpu_utilization = calc_cpu_util(0.0);
+ local_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = -1.0;
+ local_service_demand = -1.0;
+ }
+
+ /* The local calculations could use variables being kept by */
+ /* the local netlib routines. The remote calcuations need to */
+ /* have a few things passed to them. */
+ if (remote_cpu_usage) {
+ if (remote_cpu_rate == 0.0) {
+ fprintf(where,"DANGER DANGER DANGER DANGER DANGER DANGER DANGER!\n");
+ fprintf(where,"REMOTE CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+
+ remote_cpu_utilization = dg_stream_results->cpu_util;
+ remote_service_demand = calc_service_demand(bytes_recvd,
+ 0.0,
+ remote_cpu_utilization,
+ dg_stream_results->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = -1.0;
+ remote_service_demand = -1.0;
+ }
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand);
+ }
+ break;
+ case 1:
+ fprintf(where,
+ cpu_fmt_1, /* the format string */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long was the test */
+ messages_sent,
+ failed_sends,
+ local_thruput, /* what was the xfer rate */
+ local_cpu_utilization, /* local cpu */
+ local_service_demand, /* local service demand */
+ rsr_size,
+ elapsed_time,
+ messages_recvd,
+ remote_thruput,
+ remote_cpu_utilization, /* remote cpu */
+ remote_service_demand); /* remote service demand */
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ local_thruput);
+ break;
+ case 1:
+ fprintf(where,
+ tput_fmt_1, /* the format string */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long did it take */
+ messages_sent,
+ failed_sends,
+ local_thruput,
+ rsr_size, /* remote recvbuf size */
+ elapsed_time,
+ messages_recvd,
+ remote_thruput
+ );
+ break;
+ }
+ }
+}
+
+
+ /* this routine implements the receive side (netserver) of the */
+ /* DG_STREAM performance test. */
+
+void
+recv_dg_stream()
+{
+ struct ring_elt *recv_ring;
+
+ struct sockaddr_un myaddr_un;
+ SOCKET s_data;
+ int len = 0;
+ int bytes_received = 0;
+ float elapsed_time;
+
+ int message_size;
+ int messages_recvd = 0;
+
+ struct dg_stream_request_struct *dg_stream_request;
+ struct dg_stream_response_struct *dg_stream_response;
+ struct dg_stream_results_struct *dg_stream_results;
+
+ dg_stream_request =
+ (struct dg_stream_request_struct *)netperf_request.content.test_specific_data;
+ dg_stream_response =
+ (struct dg_stream_response_struct *)netperf_response.content.test_specific_data;
+ dg_stream_results =
+ (struct dg_stream_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_dg_stream: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug > 1) {
+ fprintf(where,"recv_dg_stream: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = DG_STREAM_RESPONSE;
+
+ if (debug > 2) {
+ fprintf(where,"recv_dg_stream: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* We now alter the message_ptr variable to be at the desired */
+ /* alignment with the desired offset. */
+
+ if (debug > 1) {
+ fprintf(where,"recv_dg_stream: requested alignment of %d\n",
+ dg_stream_request->recv_alignment);
+ fflush(where);
+ }
+
+ if (recv_width == 0) recv_width = 1;
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ dg_stream_request->message_size,
+ dg_stream_request->recv_alignment,
+ dg_stream_request->recv_offset);
+
+ if (debug > 1) {
+ fprintf(where,"recv_dg_stream: receive alignment and offset set...\n");
+ fflush(where);
+ }
+
+ /* Let's clear-out our sockaddr for the sake of cleanlines. Then we */
+ /* can put in OUR values !-) At some point, we may want to nail this */
+ /* socket to a particular network-level address, but for now, */
+ /* INADDR_ANY should be just fine. */
+
+ bzero((char *)&myaddr_un,
+ sizeof(myaddr_un));
+ myaddr_un.sun_family = AF_UNIX;
+
+ /* Grab a socket to listen on, and then listen on it. */
+
+ if (debug > 1) {
+ fprintf(where,"recv_dg_stream: grabbing a socket...\n");
+ fflush(where);
+ }
+
+ /* create_unix_socket expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lsr_size = dg_stream_request->recv_buf_size;
+
+ s_data = create_unix_socket(AF_UNIX,
+ SOCK_DGRAM);
+
+ if (s_data == INVALID_SOCKET) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ /* Let's get an address assigned to this socket so we can tell the */
+ /* initiator how to reach the data socket. There may be a desire to */
+ /* nail this socket to a specific IP address in a multi-homed, */
+ /* multi-connection situation, but for now, we'll ignore the issue */
+ /* and concentrate on single connection testing. */
+
+ strcpy(myaddr_un.sun_path,tempnam(path_prefix,"netperf."));
+ if (bind(s_data,
+ (struct sockaddr *)&myaddr_un,
+ sizeof(myaddr_un)) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ chmod(myaddr_un.sun_path, 0666);
+
+ dg_stream_response->test_length = dg_stream_request->test_length;
+
+ /* Now myaddr_un contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ strcpy(dg_stream_response->unix_path,myaddr_un.sun_path);
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a -1 to */
+ /* the initiator. */
+
+ dg_stream_response->cpu_rate = 0.0; /* assume no cpu */
+ if (dg_stream_request->measure_cpu) {
+ /* We will pass the rate into the calibration routine. If the */
+ /* user did not specify one, it will be 0.0, and we will do a */
+ /* "real" calibration. Otherwise, all it will really do is */
+ /* store it away... */
+ dg_stream_response->measure_cpu = 1;
+ dg_stream_response->cpu_rate =
+ calibrate_local_cpu(dg_stream_request->cpu_rate);
+ }
+
+ message_size = dg_stream_request->message_size;
+ test_time = dg_stream_request->test_length;
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ dg_stream_response->send_buf_size = lss_size;
+ dg_stream_response->recv_buf_size = lsr_size;
+
+ send_response();
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(dg_stream_request->measure_cpu);
+
+ /* The loop will exit when the timer pops, or if we happen to recv a */
+ /* message of less than send_size bytes... */
+
+ times_up = 0;
+ start_timer(test_time + PAD_TIME);
+
+ if (debug) {
+ fprintf(where,"recv_dg_stream: about to enter inner sanctum.\n");
+ fflush(where);
+ }
+
+ while (!times_up) {
+ if ((len = recv(s_data,
+ recv_ring->buffer_ptr,
+ message_size,
+ 0)) != message_size) {
+ if ((len == SOCKET_ERROR) && (errno != EINTR)) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+ break;
+ }
+ messages_recvd++;
+ recv_ring = recv_ring->next;
+ }
+
+ if (debug) {
+ fprintf(where,"recv_dg_stream: got %d messages.\n",messages_recvd);
+ fflush(where);
+ }
+
+
+ /* The loop now exits due timer or < send_size bytes received. */
+
+ cpu_stop(dg_stream_request->measure_cpu,&elapsed_time);
+
+ if (times_up) {
+ /* we ended on a timer, subtract the PAD_TIME */
+ elapsed_time -= (float)PAD_TIME;
+ }
+ else {
+ stop_timer();
+ }
+
+ if (debug) {
+ fprintf(where,"recv_dg_stream: test ended in %f seconds.\n",elapsed_time);
+ fflush(where);
+ }
+
+
+ /* We will count the "off" message that got us out of the loop */
+ bytes_received = (messages_recvd * message_size) + len;
+
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_dg_stream: got %d bytes\n",
+ bytes_received);
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = DG_STREAM_RESULTS;
+ dg_stream_results->bytes_received = bytes_received;
+ dg_stream_results->messages_recvd = messages_recvd;
+ dg_stream_results->elapsed_time = elapsed_time;
+ if (dg_stream_request->measure_cpu) {
+ dg_stream_results->cpu_util = calc_cpu_util(elapsed_time);
+ }
+ else {
+ dg_stream_results->cpu_util = -1.0;
+ }
+
+ if (debug > 1) {
+ fprintf(where,
+ "recv_dg_stream: test complete, sending results.\n");
+ fflush(where);
+ }
+
+ send_response();
+
+}
+
+void
+send_dg_rr(char remote_host[])
+{
+
+ char *tput_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans.\n\
+Send Recv Size Size Time Rate \n\
+bytes Bytes bytes bytes secs. per sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %7.2f \n";
+ char *tput_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *cpu_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem\n\
+Send Recv Size Size Time Rate local remote local remote\n\
+bytes bytes bytes bytes secs. per sec %% %% us/Tr us/Tr\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f\n";
+
+ char *cpu_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %-6.2f %-6.2f %-6.2f %-6.3f %-6.3f\n";
+
+ char *cpu_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ float elapsed_time;
+
+ /* we add MAXALIGNMENT and MAXOFFSET to insure that there is enough */
+ /* space for a maximally aligned, maximally sized message. At some */
+ /* point, we may want to actually make this even larger and cycle */
+ /* through the thing one piece at a time.*/
+
+ int len;
+ char *send_message_ptr;
+ char *recv_message_ptr;
+ char *temp_message_ptr;
+ int nummessages;
+ SOCKET send_socket;
+ int trans_remaining;
+ int bytes_xferd;
+
+ int rsp_bytes_recvd;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+ double thruput;
+
+#ifdef WANT_INTERVALS
+ /* timing stuff */
+#define MAX_KEPT_TIMES 1024
+ int time_index = 0;
+ int unused_buckets;
+ int kept_times[MAX_KEPT_TIMES];
+ int sleep_usecs;
+ unsigned int total_times=0;
+ struct timezone dummy_zone;
+ struct timeval send_time;
+ struct timeval recv_time;
+ struct timeval sleep_timeval;
+#endif
+
+ struct sockaddr_un server, myaddr_un;
+
+ struct dg_rr_request_struct *dg_rr_request;
+ struct dg_rr_response_struct *dg_rr_response;
+ struct dg_rr_results_struct *dg_rr_result;
+
+ dg_rr_request =
+ (struct dg_rr_request_struct *)netperf_request.content.test_specific_data;
+ dg_rr_response=
+ (struct dg_rr_response_struct *)netperf_response.content.test_specific_data;
+ dg_rr_result =
+ (struct dg_rr_results_struct *)netperf_response.content.test_specific_data;
+
+ /* we want to zero out the times, so we can detect unused entries. */
+#ifdef WANT_INTERVALS
+ time_index = 0;
+ while (time_index < MAX_KEPT_TIMES) {
+ kept_times[time_index] = 0;
+ time_index += 1;
+ }
+ time_index = 0;
+#endif
+
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ bzero((char *)&server,
+ sizeof(server));
+ server.sun_family = AF_UNIX;
+
+ bzero((char *)&myaddr_un,
+ sizeof(myaddr_un));
+ myaddr_un.sun_family = AF_UNIX;
+
+ strcpy(myaddr_un.sun_path,tempnam(path_prefix,"netperf."));
+
+ if ( print_headers ) {
+ fprintf(where,"DG REQUEST/RESPONSE TEST\n");
+ if (local_cpu_usage || remote_cpu_usage)
+ fprintf(where,cpu_title,format_units());
+ else
+ fprintf(where,tput_title,format_units());
+ }
+
+ /* initialize a few counters */
+
+ nummessages = 0;
+ bytes_xferd = 0;
+ times_up = 0;
+
+ /* set-up the data buffer with the requested alignment and offset */
+ temp_message_ptr = (char *)malloc(DATABUFFERLEN);
+ if (temp_message_ptr == NULL) {
+ printf("malloc(%d) failed!\n", DATABUFFERLEN);
+ exit(1);
+ }
+ send_message_ptr = (char *)(( (long)temp_message_ptr +
+ (long) local_send_align - 1) &
+ ~((long) local_send_align - 1));
+ send_message_ptr = send_message_ptr + local_send_offset;
+ temp_message_ptr = (char *)malloc(DATABUFFERLEN);
+ if (temp_message_ptr == NULL) {
+ printf("malloc(%d) failed!\n", DATABUFFERLEN);
+ exit(1);
+ }
+ recv_message_ptr = (char *)(( (long)temp_message_ptr +
+ (long) local_recv_align - 1) &
+ ~((long) local_recv_align - 1));
+ recv_message_ptr = recv_message_ptr + local_recv_offset;
+
+ /*set up the data socket */
+ send_socket = create_unix_socket(AF_UNIX,
+ SOCK_DGRAM);
+
+ if (send_socket == INVALID_SOCKET){
+ perror("netperf: send_dg_rr: dg rr data socket");
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"send_dg_rr: send_socket obtained...\n");
+ }
+
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back. If */
+ /* there is no idle counter in the kernel idle loop, the */
+ /* local_cpu_rate will be set to -1. */
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ /* Tell the remote end to do a listen. The server alters the socket */
+ /* paramters on the other side at this point, hence the reason for */
+ /* all the values being passed in the setup message. If the user did */
+ /* not specify any of the parameters, they will be passed as 0, which */
+ /* will indicate to the remote that no changes beyond the system's */
+ /* default should be used. Alignment is the exception, it will */
+ /* default to 8, which will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_DG_RR;
+ dg_rr_request->recv_buf_size = rsr_size;
+ dg_rr_request->send_buf_size = rss_size;
+ dg_rr_request->recv_alignment = remote_recv_align;
+ dg_rr_request->recv_offset = remote_recv_offset;
+ dg_rr_request->send_alignment = remote_send_align;
+ dg_rr_request->send_offset = remote_send_offset;
+ dg_rr_request->request_size = req_size;
+ dg_rr_request->response_size = rsp_size;
+ dg_rr_request->measure_cpu = remote_cpu_usage;
+ dg_rr_request->cpu_rate = remote_cpu_rate;
+ if (test_time) {
+ dg_rr_request->test_length = test_time;
+ }
+ else {
+ dg_rr_request->test_length = test_trans * -1;
+ }
+
+ if (debug > 1) {
+ fprintf(where,"netperf: send_dg_rr: requesting DG request/response test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant */
+ /* socket parameters for this test type. We will put them back into */
+ /* the variables here so they can be displayed if desired. The */
+ /* remote will have calibrated CPU if necessary, and will have done */
+ /* all the needed set-up we will have calibrated the cpu locally */
+ /* before sending the request, and will grab the counter value right */
+ /* after the connect returns. The remote will grab the counter right */
+ /* after the accept call. This saves the hassle of extra messages */
+ /* being sent for the DG tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote listen done.\n");
+ rsr_size = dg_rr_response->recv_buf_size;
+ rss_size = dg_rr_response->send_buf_size;
+ remote_cpu_usage= dg_rr_response->measure_cpu;
+ remote_cpu_rate = dg_rr_response->cpu_rate;
+ /* port numbers in proper order */
+ strcpy(server.sun_path,dg_rr_response->unix_path);
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("netperf: remote error");
+
+ exit(1);
+ }
+
+ /* Connect up to the remote port on the data socket. This will set */
+ /* the default destination address on this socket. we need to bind */
+ /* out socket so that the remote gets something from a recvfrom */
+ if (bind(send_socket,
+ (struct sockaddr *)&myaddr_un,
+ sizeof(myaddr_un)) == SOCKET_ERROR) {
+ perror("netperf: send_dg_rr");
+ unlink(myaddr_un.sun_path);
+ close(send_socket);
+ exit(1);
+ }
+
+ if (connect(send_socket,
+ (struct sockaddr *)&server,
+ sizeof(server)) == INVALID_SOCKET ) {
+ perror("netperf: data socket connect failed");
+ exit(1);
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either the */
+ /* connect would have failed, or the previous response would have */
+ /* indicated a problem. I failed to see the value of the extra */
+ /* message after the accept on the remote. If it failed, we'll see it */
+ /* here. If it didn't, we might as well start pumping data. */
+
+ /* Set-up the test end conditions. For a request/response test, they */
+ /* can be either time or transaction based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ trans_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return false. */
+ /* When the test is controlled by byte count, the time test will */
+ /* always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. I think I */
+ /* just arbitrarily decrement trans_remaining for the timed test, but */
+ /* will not do that just yet... One other question is whether or not */
+ /* the send buffer and the receive buffer should be the same buffer. */
+ while ((!times_up) || (trans_remaining > 0)) {
+ /* send the request */
+#ifdef WANT_INTERVALS
+ gettimeofday(&send_time,&dummy_zone);
+#endif
+ if((len=send(send_socket,
+ send_message_ptr,
+ req_size,
+ 0)) != req_size) {
+ if (errno == EINTR) {
+ /* We likely hit */
+ /* test-end time. */
+ break;
+ }
+ perror("send_dg_rr: data send error");
+ exit(1);
+ }
+
+ /* receive the response. with DG we will get it all, or nothing */
+
+ if((rsp_bytes_recvd=recv(send_socket,
+ recv_message_ptr,
+ rsp_size,
+ 0)) != rsp_size) {
+ if (errno == EINTR) {
+ /* Again, we have likely hit test-end time */
+ break;
+ }
+ perror("send_dg_rr: data recv error");
+ exit(1);
+ }
+#ifdef WANT_INTERVALS
+ gettimeofday(&recv_time,&dummy_zone);
+
+ /* now we do some arithmatic on the two timevals */
+ if (recv_time.tv_usec < send_time.tv_usec) {
+ /* we wrapped around a second */
+ recv_time.tv_usec += 1000000;
+ recv_time.tv_sec -= 1;
+ }
+
+ /* and store it away */
+ kept_times[time_index] = (recv_time.tv_sec - send_time.tv_sec) * 1000000;
+ kept_times[time_index] += (recv_time.tv_usec - send_time.tv_usec);
+
+ /* at this point, we may wish to sleep for some period of */
+ /* time, so we see how long that last transaction just took, */
+ /* and sleep for the difference of that and the interval. We */
+ /* will not sleep if the time would be less than a */
+ /* millisecond. */
+ if (interval_usecs > 0) {
+ sleep_usecs = interval_usecs - kept_times[time_index];
+ if (sleep_usecs > 1000) {
+ /* we sleep */
+ sleep_timeval.tv_sec = sleep_usecs / 1000000;
+ sleep_timeval.tv_usec = sleep_usecs % 1000000;
+ select(0,
+ 0,
+ 0,
+ 0,
+ &sleep_timeval);
+ }
+ }
+
+ /* now up the time index */
+ time_index = (time_index +1)%MAX_KEPT_TIMES;
+#endif
+ nummessages++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug > 3) {
+ fprintf(where,"Transaction %d completed\n",nummessages);
+ fflush(where);
+ }
+
+ }
+
+ /* The test is over. Flush the buffers to the remote end. We do a */
+ /* graceful release to insure that all data has been taken by the */
+ /* remote. Of course, since this was a request/response test, there */
+ /* should be no data outstanding on the socket ;-) */
+
+ if (shutdown(send_socket,1) == SOCKET_ERROR) {
+ perror("netperf: cannot shutdown dg stream socket");
+
+ exit(1);
+ }
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being measured? */
+ /* how long did we really run? */
+
+ /* Get the statistics from the remote end. The remote will have */
+ /* calculated service demand and all those interesting things. If it */
+ /* wasn't supposed to care, it will return obvious values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("netperf: remote error");
+
+ exit(1);
+ }
+
+ /* We now calculate what our thruput was for the test. In the future, */
+ /* we may want to include a calculation of the thruput measured by */
+ /* the remote, but it should be the case that for a DG stream test, */
+ /* that the two numbers should be *very* close... We calculate */
+ /* bytes_sent regardless of the way the test length was controlled. */
+ /* If it was time, we needed to, and if it was by bytes, the user may */
+ /* have specified a number of bytes that wasn't a multiple of the */
+ /* send_size, so we really didn't send what he asked for ;-) We use */
+
+ bytes_xferd = (req_size * nummessages) + (rsp_size * nummessages);
+ thruput = calc_thruput(bytes_xferd);
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+ if (local_cpu_rate == 0.0) {
+ fprintf(where,"WARNING WARNING WARNING WARNING WARNING WARNING WARNING!\n");
+ fprintf(where,"Local CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+ local_cpu_utilization = calc_cpu_util(0.0);
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ local_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = -1.0;
+ local_service_demand = -1.0;
+ }
+
+ if (remote_cpu_usage) {
+ if (remote_cpu_rate == 0.0) {
+ fprintf(where,"DANGER DANGER DANGER DANGER DANGER DANGER DANGER!\n");
+ fprintf(where,"Remote CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+ remote_cpu_utilization = dg_rr_result->cpu_util;
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ remote_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ remote_cpu_utilization,
+ dg_rr_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = -1.0;
+ remote_service_demand = -1.0;
+ }
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand);
+ }
+ break;
+ case 1:
+ case 2:
+ fprintf(where,
+ cpu_fmt_1_line_1, /* the format string */
+ lss_size, /* local sendbuf size */
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* guess */
+ elapsed_time, /* how long was the test */
+ nummessages/elapsed_time,
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand); /* remote service demand */
+ fprintf(where,
+ cpu_fmt_1_line_2,
+ rss_size,
+ rsr_size);
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ nummessages/elapsed_time);
+ break;
+ case 1:
+ case 2:
+ fprintf(where,
+ tput_fmt_1_line_1, /* the format string */
+ lss_size,
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* how large were the responses */
+ elapsed_time, /* how long did it take */
+ nummessages/elapsed_time);
+ fprintf(where,
+ tput_fmt_1_line_2,
+ rss_size, /* remote recvbuf size */
+ rsr_size);
+
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* DG statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+#ifdef WANT_INTERVALS
+ kept_times[MAX_KEPT_TIMES] = 0;
+ time_index = 0;
+ while (time_index < MAX_KEPT_TIMES) {
+ if (kept_times[time_index] > 0) {
+ total_times += kept_times[time_index];
+ }
+ else
+ unused_buckets++;
+ time_index += 1;
+ }
+ total_times /= (MAX_KEPT_TIMES-unused_buckets);
+ fprintf(where,
+ "Average response time %d usecs\n",
+ total_times);
+#endif
+ }
+ unlink(myaddr_un.sun_path);
+}
+
+ /* this routine implements the receive side (netserver) of a DG_RR */
+ /* test. */
+void
+recv_dg_rr()
+{
+
+ struct ring_elt *recv_ring;
+ struct ring_elt *send_ring;
+
+ struct sockaddr_un myaddr_un,
+ peeraddr_un;
+ SOCKET s_data;
+ int addrlen;
+ int trans_received = 0;
+ int trans_remaining;
+ float elapsed_time;
+
+ struct dg_rr_request_struct *dg_rr_request;
+ struct dg_rr_response_struct *dg_rr_response;
+ struct dg_rr_results_struct *dg_rr_results;
+
+ dg_rr_request =
+ (struct dg_rr_request_struct *)netperf_request.content.test_specific_data;
+ dg_rr_response =
+ (struct dg_rr_response_struct *)netperf_response.content.test_specific_data;
+ dg_rr_results =
+ (struct dg_rr_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_dg_rr: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_dg_rr: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = DG_RR_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_dg_rr: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* We now alter the message_ptr variables to be at the desired */
+ /* alignments with the desired offsets. */
+
+ if (debug) {
+ fprintf(where,"recv_dg_rr: requested recv alignment of %d offset %d\n",
+ dg_rr_request->recv_alignment,
+ dg_rr_request->recv_offset);
+ fprintf(where,"recv_dg_rr: requested send alignment of %d offset %d\n",
+ dg_rr_request->send_alignment,
+ dg_rr_request->send_offset);
+ fflush(where);
+ }
+
+ if (send_width == 0) send_width = 1;
+ if (recv_width == 0) recv_width = 1;
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ dg_rr_request->request_size,
+ dg_rr_request->recv_alignment,
+ dg_rr_request->recv_offset);
+
+ send_ring = allocate_buffer_ring(send_width,
+ dg_rr_request->response_size,
+ dg_rr_request->send_alignment,
+ dg_rr_request->send_offset);
+
+ if (debug) {
+ fprintf(where,"recv_dg_rr: receive alignment and offset set...\n");
+ fflush(where);
+ }
+
+ /* Let's clear-out our sockaddr for the sake of cleanlines. Then we */
+ /* can put in OUR values !-) At some point, we may want to nail this */
+ /* socket to a particular network-level address, but for now, */
+ /* INADDR_ANY should be just fine. */
+
+ bzero((char *)&myaddr_un,
+ sizeof(myaddr_un));
+ myaddr_un.sun_family = AF_UNIX;
+
+ /* Grab a socket to listen on, and then listen on it. */
+
+ if (debug) {
+ fprintf(where,"recv_dg_rr: grabbing a socket...\n");
+ fflush(where);
+ }
+
+
+ /* create_unix_socket expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lss_size_req = dg_rr_request->send_buf_size;
+ lsr_size_req = dg_rr_request->recv_buf_size;
+
+ s_data = create_unix_socket(AF_UNIX,
+ SOCK_DGRAM);
+
+ if (s_data == INVALID_SOCKET) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+
+ exit(1);
+ }
+
+ /* Let's get an address assigned to this socket so we can tell the */
+ /* initiator how to reach the data socket. There may be a desire to */
+ /* nail this socket to a specific IP address in a multi-homed, */
+ /* multi-connection situation, but for now, we'll ignore the issue */
+ /* and concentrate on single connection testing. */
+
+ strcpy(myaddr_un.sun_path,tempnam(path_prefix,"netperf."));
+ if (bind(s_data,
+ (struct sockaddr *)&myaddr_un,
+ sizeof(myaddr_un)) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ unlink(myaddr_un.sun_path);
+ close(s_data);
+ send_response();
+
+ exit(1);
+ }
+
+ /* Now myaddr_un contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ strcpy(dg_rr_response->unix_path,myaddr_un.sun_path);
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a 0.0 to */
+ /* the initiator. */
+
+ dg_rr_response->cpu_rate = 0.0; /* assume no cpu */
+ if (dg_rr_request->measure_cpu) {
+ dg_rr_response->measure_cpu = 1;
+ dg_rr_response->cpu_rate = calibrate_local_cpu(dg_rr_request->cpu_rate);
+ }
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ dg_rr_response->send_buf_size = lss_size;
+ dg_rr_response->recv_buf_size = lsr_size;
+
+ send_response();
+
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(dg_rr_request->measure_cpu);
+
+ if (dg_rr_request->test_length > 0) {
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(dg_rr_request->test_length + PAD_TIME);
+ }
+ else {
+ times_up = 1;
+ trans_remaining = dg_rr_request->test_length * -1;
+ }
+
+ addrlen = sizeof(peeraddr_un);
+ bzero((char *)&peeraddr_un, addrlen);
+
+ while ((!times_up) || (trans_remaining > 0)) {
+
+ /* receive the request from the other side */
+ fprintf(where,"socket %d ptr %p size %d\n",
+ s_data,
+ recv_ring->buffer_ptr,
+ dg_rr_request->request_size);
+ fflush(where);
+ if (recvfrom(s_data,
+ recv_ring->buffer_ptr,
+ dg_rr_request->request_size,
+ 0,
+ (struct sockaddr *)&peeraddr_un,
+ &addrlen) != dg_rr_request->request_size) {
+ if (errno == EINTR) {
+ /* we must have hit the end of test time. */
+ break;
+ }
+ netperf_response.content.serv_errno = errno;
+ fprintf(where,"error on recvfrom errno %d\n",errno);
+ fflush(where);
+ send_response();
+ unlink(myaddr_un.sun_path);
+ exit(1);
+ }
+ recv_ring = recv_ring->next;
+
+ /* Now, send the response to the remote */
+ if (sendto(s_data,
+ send_ring->buffer_ptr,
+ dg_rr_request->response_size,
+ 0,
+ (struct sockaddr *)&peeraddr_un,
+ addrlen) != dg_rr_request->response_size) {
+ if (errno == EINTR) {
+ /* we have hit end of test time. */
+ break;
+ }
+ netperf_response.content.serv_errno = errno;
+ fprintf(where,"error on recvfrom errno %d\n",errno);
+ fflush(where);
+ unlink(myaddr_un.sun_path);
+ send_response();
+ exit(1);
+ }
+ send_ring = send_ring->next;
+
+ trans_received++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_dg_rr: Transaction %d complete.\n",
+ trans_received);
+ fflush(where);
+ }
+
+ }
+
+
+ /* The loop now exits due to timeout or transaction count being */
+ /* reached */
+
+ cpu_stop(dg_rr_request->measure_cpu,&elapsed_time);
+
+ if (times_up) {
+ /* we ended the test by time, which was at least 2 seconds */
+ /* longer than we wanted to run. so, we want to subtract */
+ /* PAD_TIME from the elapsed_time. */
+ elapsed_time -= PAD_TIME;
+ }
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_dg_rr: got %d transactions\n",
+ trans_received);
+ fflush(where);
+ }
+
+ dg_rr_results->bytes_received = (trans_received *
+ (dg_rr_request->request_size +
+ dg_rr_request->response_size));
+ dg_rr_results->trans_received = trans_received;
+ dg_rr_results->elapsed_time = elapsed_time;
+ if (dg_rr_request->measure_cpu) {
+ dg_rr_results->cpu_util = calc_cpu_util(elapsed_time);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_dg_rr: test complete, sending results.\n");
+ fflush(where);
+ }
+
+ send_response();
+ unlink(myaddr_un.sun_path);
+
+}
+ /* this routine implements the receive (netserver) side of a STREAM_RR */
+ /* test */
+
+void
+recv_stream_rr()
+{
+
+ struct ring_elt *send_ring;
+ struct ring_elt *recv_ring;
+
+ struct sockaddr_un myaddr_un,
+ peeraddr_un;
+ SOCKET s_listen,s_data;
+ int addrlen;
+ char *temp_message_ptr;
+ int trans_received = 0;
+ int trans_remaining;
+ int bytes_sent;
+ int request_bytes_recvd;
+ int request_bytes_remaining;
+ int timed_out = 0;
+ float elapsed_time;
+
+ struct stream_rr_request_struct *stream_rr_request;
+ struct stream_rr_response_struct *stream_rr_response;
+ struct stream_rr_results_struct *stream_rr_results;
+
+ stream_rr_request =
+ (struct stream_rr_request_struct *)netperf_request.content.test_specific_data;
+ stream_rr_response =
+ (struct stream_rr_response_struct *)netperf_response.content.test_specific_data;
+ stream_rr_results =
+ (struct stream_rr_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_stream_rr: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_stream_rr: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = STREAM_RR_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_stream_rr: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* allocate the recv and send rings with the requested alignments */
+ /* and offsets. raj 7/94 */
+ if (debug) {
+ fprintf(where,"recv_stream_rr: requested recv alignment of %d offset %d\n",
+ stream_rr_request->recv_alignment,
+ stream_rr_request->recv_offset);
+ fprintf(where,"recv_stream_rr: requested send alignment of %d offset %d\n",
+ stream_rr_request->send_alignment,
+ stream_rr_request->send_offset);
+ fflush(where);
+ }
+
+ /* at some point, these need to come to us from the remote system */
+ if (send_width == 0) send_width = 1;
+ if (recv_width == 0) recv_width = 1;
+
+ send_ring = allocate_buffer_ring(send_width,
+ stream_rr_request->response_size,
+ stream_rr_request->send_alignment,
+ stream_rr_request->send_offset);
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ stream_rr_request->request_size,
+ stream_rr_request->recv_alignment,
+ stream_rr_request->recv_offset);
+
+
+ /* Let's clear-out our sockaddr for the sake of cleanlines. Then we */
+ /* can put in OUR values !-) At some point, we may want to nail this */
+ /* socket to a particular network-level address, but for now, */
+ /* INADDR_ANY should be just fine. */
+
+ bzero((char *)&myaddr_un,
+ sizeof(myaddr_un));
+ myaddr_un.sun_family = AF_UNIX;
+
+ /* Grab a socket to listen on, and then listen on it. */
+
+ if (debug) {
+ fprintf(where,"recv_stream_rr: grabbing a socket...\n");
+ fflush(where);
+ }
+
+ /* create_unix_socket expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lss_size_req = stream_rr_request->send_buf_size;
+ lsr_size_req = stream_rr_request->recv_buf_size;
+
+ s_listen = create_unix_socket(AF_UNIX,
+ SOCK_STREAM);
+
+ if (s_listen == INVALID_SOCKET) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+
+ exit(1);
+ }
+
+ /* Let's get an address assigned to this socket so we can tell the */
+ /* initiator how to reach the data socket. There may be a desire to */
+ /* nail this socket to a specific IP address in a multi-homed, */
+ /* multi-connection situation, but for now, we'll ignore the issue */
+ /* and concentrate on single connection testing. */
+
+ strcpy(myaddr_un.sun_path,tempnam(path_prefix,"netperf."));
+ if (bind(s_listen,
+ (struct sockaddr *)&myaddr_un,
+ sizeof(myaddr_un)) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ unlink(myaddr_un.sun_path);
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+ /* Now, let's set-up the socket to listen for connections */
+ if (listen(s_listen, 5) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+ /* Now myaddr_un contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ strcpy(stream_rr_response->unix_path,myaddr_un.sun_path);
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a 0.0 to */
+ /* the initiator. */
+
+ stream_rr_response->cpu_rate = 0.0; /* assume no cpu */
+ if (stream_rr_request->measure_cpu) {
+ stream_rr_response->measure_cpu = 1;
+ stream_rr_response->cpu_rate = calibrate_local_cpu(stream_rr_request->cpu_rate);
+ }
+
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ stream_rr_response->send_buf_size = lss_size;
+ stream_rr_response->recv_buf_size = lsr_size;
+
+ send_response();
+
+ addrlen = sizeof(peeraddr_un);
+
+ if ((s_data = accept(s_listen,
+ (struct sockaddr *)&peeraddr_un,
+ &addrlen)) == INVALID_SOCKET) {
+ /* Let's just punt. The remote will be given some information */
+ close(s_listen);
+
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"recv_stream_rr: accept completes on the data connection.\n");
+ fflush(where);
+ }
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(stream_rr_request->measure_cpu);
+
+ /* The loop will exit when the sender does a shutdown, which will */
+ /* return a length of zero */
+
+ if (stream_rr_request->test_length > 0) {
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(stream_rr_request->test_length + PAD_TIME);
+ }
+ else {
+ times_up = 1;
+ trans_remaining = stream_rr_request->test_length * -1;
+ }
+
+ while ((!times_up) || (trans_remaining > 0)) {
+ temp_message_ptr = recv_ring->buffer_ptr;
+ request_bytes_remaining = stream_rr_request->request_size;
+
+ /* receive the request from the other side */
+ if (debug) {
+ fprintf(where,"about to receive for trans %d\n",trans_received);
+ fprintf(where,"temp_message_ptr is %p\n",temp_message_ptr);
+ fflush(where);
+ }
+ while(request_bytes_remaining > 0) {
+ if((request_bytes_recvd=recv(s_data,
+ temp_message_ptr,
+ request_bytes_remaining,
+ 0)) == SOCKET_ERROR) {
+ if (errno == EINTR) {
+ /* the timer popped */
+ timed_out = 1;
+ break;
+ }
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+ else {
+ request_bytes_remaining -= request_bytes_recvd;
+ temp_message_ptr += request_bytes_recvd;
+ }
+ if (debug) {
+ fprintf(where,"just received for trans %d\n",trans_received);
+ fflush(where);
+ }
+ }
+
+ recv_ring = recv_ring->next;
+
+ if (timed_out) {
+ /* we hit the end of the test based on time - lets */
+ /* bail out of here now... */
+ fprintf(where,"yo5\n");
+ fflush(where);
+ break;
+ }
+
+ /* Now, send the response to the remote */
+ if (debug) {
+ fprintf(where,"about to send for trans %d\n",trans_received);
+ fflush(where);
+ }
+ if((bytes_sent=send(s_data,
+ send_ring->buffer_ptr,
+ stream_rr_request->response_size,
+ 0)) == SOCKET_ERROR) {
+ if (errno == EINTR) {
+ /* the test timer has popped */
+ timed_out = 1;
+ fprintf(where,"yo6\n");
+ fflush(where);
+ break;
+ }
+ netperf_response.content.serv_errno = 997;
+ send_response();
+ exit(1);
+ }
+
+ send_ring = send_ring->next;
+
+ trans_received++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_stream_rr: Transaction %d complete\n",
+ trans_received);
+ fflush(where);
+ }
+ }
+
+
+ /* The loop now exits due to timeout or transaction count being */
+ /* reached */
+
+ cpu_stop(stream_rr_request->measure_cpu,&elapsed_time);
+
+ if (timed_out) {
+ /* we ended the test by time, which was at least 2 seconds */
+ /* longer than we wanted to run. so, we want to subtract */
+ /* PAD_TIME from the elapsed_time. */
+ elapsed_time -= PAD_TIME;
+ }
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_stream_rr: got %d transactions\n",
+ trans_received);
+ fflush(where);
+ }
+
+ stream_rr_results->bytes_received = (trans_received *
+ (stream_rr_request->request_size +
+ stream_rr_request->response_size));
+ stream_rr_results->trans_received = trans_received;
+ stream_rr_results->elapsed_time = elapsed_time;
+ if (stream_rr_request->measure_cpu) {
+ stream_rr_results->cpu_util = calc_cpu_util(elapsed_time);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_stream_rr: test complete, sending results.\n");
+ fflush(where);
+ }
+
+ send_response();
+ unlink(myaddr_un.sun_path);
+}
+
+void
+print_unix_usage()
+{
+
+ fwrite(unix_usage, sizeof(char), strlen(unix_usage), stdout);
+ exit(1);
+
+}
+void
+scan_unix_args(int argc, char *argv[])
+{
+#define UNIX_ARGS "hm:M:p:r:s:S:"
+ extern char *optarg; /* pointer to option string */
+
+ int c;
+
+ char
+ arg1[BUFSIZ], /* argument holders */
+ arg2[BUFSIZ];
+
+ init_test_vars();
+
+ if (no_control) {
+ fprintf(where,
+ "The UNIX tests do not know how to run with no control connection\n");
+ exit(-1);
+ }
+
+ /* Go through all the command line arguments and break them */
+ /* out. For those options that take two parms, specifying only */
+ /* the first will set both to that value. Specifying only the */
+ /* second will leave the first untouched. To change only the */
+ /* first, use the form "first," (see the routine break_args.. */
+
+ while ((c= getopt(argc, argv, UNIX_ARGS)) != EOF) {
+ switch (c) {
+ case '?':
+ case 'h':
+ print_unix_usage();
+ exit(1);
+ case 'p':
+ /* set the path prefix (directory) that should be used for the */
+ /* pipes. at some point, there should be some error checking. */
+ strcpy(path_prefix,optarg);
+ break;
+ case 's':
+ /* set local socket sizes */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ lss_size_req = atoi(arg1);
+ if (arg2[0])
+ lsr_size_req = atoi(arg2);
+ break;
+ case 'S':
+ /* set remote socket sizes */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ rss_size = atoi(arg1);
+ if (arg2[0])
+ rsr_size = atoi(arg2);
+ break;
+ case 'r':
+ /* set the request/response sizes */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ req_size = atoi(arg1);
+ if (arg2[0])
+ rsp_size = atoi(arg2);
+ break;
+ case 'm':
+ /* set the send size */
+ send_size = atoi(optarg);
+ break;
+ case 'M':
+ /* set the recv size */
+ recv_size = atoi(optarg);
+ break;
+ };
+ }
+}
+#endif /* WANT_UNIX */
diff --git a/nettest_unix.h b/nettest_unix.h
new file mode 100644
index 0000000..8eb393b
--- /dev/null
+++ b/nettest_unix.h
@@ -0,0 +1,198 @@
+/*
+ Copyright (C) 1993-2004 Hewlett-Packard Company
+*/
+
+ /* This file contains the test-specific definitions for netperf's */
+ /* DLPI tests */
+
+struct stream_stream_request_struct {
+ int recv_buf_size;
+ int send_buf_size;
+ int receive_size; /* how many bytes do we want to */
+ /* receive at one time? */
+ int recv_alignment; /* what is the alignment of the */
+ /* receive buffer? */
+ int recv_offset; /* and at what offset from that */
+ /* alignment? */
+ int so_rcvavoid; /* do we want the remote to avoid receive copies? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int measure_cpu; /* does the client want server cpu */
+ /* utilization measured? */
+ float cpu_rate; /* do we know how fast the cpu is */
+ /* already? */
+ int test_length; /* how long is the test? */
+ int dirty_count; /* how many integers in the receive buffer */
+ /* should be made dirty before calling recv? */
+ int clean_count; /* how many integers should be read from the */
+ /* recv buffer before calling recv? */
+ int path_name_len; /* the length of the device name string. this */
+ /* is used to put it into the proper order on */
+ /* @#$% byte-swapped boxes... */
+ char unix_path[32]; /* the path */
+};
+
+struct stream_stream_response_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int send_buf_size;
+ int receive_size;
+ int so_rcvavoid; /* do we want the remote to avoid receive copies? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int measure_cpu; /* does the client want server cpu */
+ int test_length; /* how long is the test? */
+ int data_port_number; /* connect to me here */
+ float cpu_rate; /* could we measure */
+ int path_name_len; /* the length of the device name string. this */
+ /* is used to put it into the proper order on */
+ /* @#$% byte-swapped boxes... */
+ char unix_path[32]; /* the path */
+};
+
+struct stream_stream_results_struct {
+ int bytes_received; /* ignored initially */
+ int recv_calls; /* ignored initially */
+ float elapsed_time; /* how long the test ran */
+ float cpu_util; /* -1 if not measured */
+ float serv_dem; /* -1 if not measured */
+ int num_cpus;
+};
+
+struct stream_rr_request_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int send_buf_size;
+ int recv_alignment;
+ int recv_offset;
+ int send_alignment;
+ int send_offset;
+ int request_size;
+ int response_size;
+ int so_rcvavoid; /* do we want the remote to avoid receive copies? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int measure_cpu; /* does the client want server cpu */
+ float cpu_rate; /* do we know how fast the cpu is? */
+ int test_length; /* how long is the test? */
+ int path_name_len; /* the length of the device name string. this */
+ /* is used to put it into the proper order on */
+ /* @#$% byte-swapped boxes... */
+ char unix_path[32]; /* the path */
+};
+
+struct stream_rr_response_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int send_buf_size;
+ int so_rcvavoid; /* do we want the remote to avoid receive copies? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int measure_cpu; /* does the client want server cpu */
+ int test_length; /* how long is the test? */
+ float cpu_rate; /* could we measure */
+ int path_name_len; /* the length of the device name string. this */
+ /* is used to put it into the proper order on */
+ /* @#$% byte-swapped boxes... */
+ char unix_path[32]; /* the path to the dlpi device */
+};
+
+struct stream_rr_results_struct {
+ int bytes_received; /* ignored initially */
+ int recv_calls; /* ignored initially */
+ int trans_received; /* not ignored */
+ float elapsed_time; /* how long the test ran */
+ float cpu_util; /* -1 if not measured */
+ float serv_dem; /* -1 if not measured */
+ int num_cpus;
+};
+
+struct dg_stream_request_struct {
+ int recv_buf_size;
+ int message_size;
+ int recv_alignment;
+ int recv_offset;
+ int measure_cpu;
+ float cpu_rate;
+ int test_length;
+ int so_rcvavoid; /* do we want the remote to avoid receive copies? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int path_name_len; /* the length of the device name string. this */
+ /* is used to put it into the proper order on */
+ /* @#$% byte-swapped boxes... */
+ char unix_path[32]; /* the path */
+};
+
+struct dg_stream_response_struct {
+ int recv_buf_size;
+ int send_buf_size;
+ int measure_cpu;
+ int test_length;
+ float cpu_rate;
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+ int path_name_len; /* the length of the device name string. this */
+ /* is used to put it into the proper order on */
+ /* @#$% byte-swapped boxes... */
+ char unix_path[32]; /* the path */
+};
+
+struct dg_stream_results_struct {
+ int messages_recvd;
+ int bytes_received;
+ float elapsed_time;
+ float cpu_util;
+ int num_cpus;
+};
+
+
+struct dg_rr_request_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int send_buf_size;
+ int recv_alignment;
+ int recv_offset;
+ int send_alignment;
+ int send_offset;
+ int request_size;
+ int response_size;
+ int measure_cpu; /* does the client want server cpu */
+ float cpu_rate; /* do we know how fast the cpu is? */
+ int test_length; /* how long is the test? */
+ int so_rcvavoid; /* do we want the remote to avoid receive */
+ /* copies? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int path_name_len; /* the length of the device name string. this */
+ /* is used to put it into the proper order on */
+ /* @#$% byte-swapped boxes... */
+ char unix_path[32]; /* the path */
+};
+
+struct dg_rr_response_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int send_buf_size;
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ int test_length; /* how long is the test? */
+ float cpu_rate; /* could we measure */
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+ int path_name_len; /* the length of the device name string. this */
+ /* is used to put it into the proper order on */
+ /* @#$% byte-swapped boxes... */
+ char unix_path[32]; /* the path */
+};
+
+struct dg_rr_results_struct {
+ int bytes_received; /* ignored initially */
+ int recv_calls; /* ignored initially */
+ int trans_received; /* not ignored */
+ float elapsed_time; /* how long the test ran */
+ float cpu_util; /* -1 if not measured */
+ float serv_dem; /* -1 if not measured */
+ int num_cpus;
+};
+
+extern void scan_unix_args(int argc, char *argv[]);
+
+extern void send_stream_stream(char remote_host[]);
+extern void send_stream_rr(char remote_host[]);
+extern void send_dg_stream(char remote_host[]);
+extern void send_dg_rr(char remote_host[]);
+
+extern void recv_stream_stream();
+extern void recv_stream_rr();
+extern void recv_dg_stream();
+extern void recv_dg_rr();
diff --git a/nettest_xti.c b/nettest_xti.c
new file mode 100644
index 0000000..9d27f25
--- /dev/null
+++ b/nettest_xti.c
@@ -0,0 +1,6026 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef WANT_XTI
+#ifndef lint
+char nettest_xti_id[]="\
+@(#)nettest_xti.c (c) Copyright 1995-2007 Hewlett-Packard Co. Version 2.4.3";
+#else
+#define DIRTY
+#define WANT_HISTOGRAM
+#define WANT_INTERVALS
+#endif /* lint */
+/****************************************************************/
+/* */
+/* nettest_xti.c */
+/* */
+/* the XTI args parsing routine... */
+/* */
+/* scan_xti_args() */
+/* */
+/* the actual test routines... */
+/* */
+/* send_xti_tcp_stream() perform a tcp stream test */
+/* recv_xti_tcp_stream() */
+/* send_xti_tcp_rr() perform a tcp request/response */
+/* recv_xti_tcp_rr() */
+/* send_xti_tcp_conn_rr() an RR test including connect */
+/* recv_xti_tcp_conn_rr() */
+/* send_xti_udp_stream() perform a udp stream test */
+/* recv_xti_udp_stream() */
+/* send_xti_udp_rr() perform a udp request/response */
+/* recv_xti_udp_rr() */
+/* */
+/****************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <fcntl.h>
+#ifndef WIN32
+#include <sys/ipc.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <errno.h>
+#include <signal.h>
+#else /* WIN32 */
+#include <process.h>
+#include <winsock2.h>
+#include <windows.h>
+#endif /* WIN32 */
+#include <stdio.h>
+#include <time.h>
+#include <malloc.h>
+ /* xti.h should be included *after* in.h because there are name */
+ /* conflicts!( Silly standards people... raj 2/95 fortuenately, the */
+ /* confilcts are on IP_TOP and IP_TTL, whcih netperf does not yet use */
+#include <xti.h>
+
+#include "netlib.h"
+#include "netsh.h"
+#include "nettest_xti.h"
+
+#ifdef WANT_HISTOGRAM
+#ifdef __sgi
+#include <sys/time.h>
+#endif /* __sgi */
+#include "hist.h"
+#endif /* WANT_HISTOGRAM */
+
+
+
+ /* these variables are specific to the XTI sockets tests. declare */
+ /* them static to make them global only to this file. */
+
+static int
+ rss_size, /* remote socket send buffer size */
+ rsr_size, /* remote socket recv buffer size */
+ lss_size, /* local socket send buffer size */
+ lsr_size, /* local socket recv buffer size */
+ req_size = 1, /* request size */
+ rsp_size = 1, /* response size */
+ send_size, /* how big are individual sends */
+ recv_size; /* how big are individual receives */
+
+static int confidence_iteration;
+static char local_cpu_method;
+static char remote_cpu_method;
+
+ /* different options for the xti */
+
+static int
+ loc_nodelay, /* don't/do use NODELAY locally */
+ rem_nodelay, /* don't/do use NODELAY remotely */
+ loc_sndavoid, /* avoid send copies locally */
+ loc_rcvavoid, /* avoid recv copies locally */
+ rem_sndavoid, /* avoid send copies remotely */
+ rem_rcvavoid; /* avoid recv_copies remotely */
+
+static struct t_info info_struct;
+
+#ifdef WANT_HISTOGRAM
+#ifdef HAVE_GETHRTIME
+hrtime_t time_one;
+hrtime_t time_two;
+#else
+static struct timeval time_one;
+static struct timeval time_two;
+#endif /* HAVE_GETHRTIME */
+static HIST time_hist;
+#endif /* WANT_HISTOGRAM */
+
+static char loc_xti_device[32] = "/dev/tcp";
+static char rem_xti_device[32] = "/dev/tcp";
+
+static int xti_flags = 0;
+
+char xti_usage[] = "\n\
+Usage: netperf [global options] -- [test options] \n\
+\n\
+TCP/UDP XTI API Test Options:\n\
+ -D [L][,R] Set XTI_TCP_NODELAY locally and/or remotely (XTI_TCP_*)\n\
+ -h Display this text\n\
+ -m bytes Set the send size (XTI_TCP_STREAM, XTI_UDP_STREAM)\n\
+ -M bytes Set the recv size (XTI_TCP_STREAM, XTI_UDP_STREAM)\n\
+ -r bytes Set request size (XTI_TCP_RR, XTI_UDP_RR)\n\
+ -R bytes Set response size (XTI_TCP_RR, XTI_UDP_RR)\n\
+ -s send[,recv] Set local socket send/recv buffer sizes\n\
+ -S send[,recv] Set remote socket send/recv buffer sizes\n\
+ -X dev[,dev] Set the local/remote XTI device file name\n\
+\n\
+For those options taking two parms, at least one must be specified;\n\
+specifying one value without a comma will set both parms to that\n\
+value, specifying a value with a leading comma will set just the second\n\
+parm, a value with a trailing comma will set just the first. To set\n\
+each parm to unique values, specify both and separate them with a\n\
+comma.\n";
+
+
+ /* This routine is intended to retrieve interesting aspects of tcp */
+ /* for the data connection. at first, it attempts to retrieve the */
+ /* maximum segment size. later, it might be modified to retrieve */
+ /* other information, but it must be information that can be */
+ /* retrieved quickly as it is called during the timing of the test. */
+ /* for that reason, a second routine may be created that can be */
+ /* called outside of the timing loop */
+void
+get_xti_info(socket, info_struct)
+ int socket;
+ struct t_info *info_struct;
+{
+
+}
+
+
+ /* This routine will create a data (listen) socket with the apropriate */
+ /* options set and return it to the caller. this replaces all the */
+ /* duplicate code in each of the test routines and should help make */
+ /* things a little easier to understand. since this routine can be */
+ /* called by either the netperf or netserver programs, all output */
+ /* should be directed towards "where." family is generally AF_INET, */
+ /* and type will be either SOCK_STREAM or SOCK_DGRAM */
+SOCKET
+create_xti_endpoint(char *name)
+{
+
+ SOCKET temp_socket;
+
+ struct t_optmgmt *opt_req; /* we request an option */
+ struct t_optmgmt *opt_ret; /* it tells us what we got */
+
+ /* we use this to pass-in BSD-like socket options through t_optmgmt. */
+ /* it ends up being about as clear as mud. raj 2/95 */
+ struct sock_option {
+ struct t_opthdr myopthdr;
+ long value;
+ } *sock_option;
+
+ if (debug) {
+ fprintf(where,"create_xti_endpoint: attempting to open %s\n",
+ name);
+ fflush(where);
+ }
+
+ /*set up the data socket */
+ temp_socket = t_open(name,O_RDWR,NULL);
+
+ if (temp_socket == INVALID_SOCKET){
+ fprintf(where,
+ "netperf: create_xti_endpoint: t_open %s: errno %d t_errno %d\n",
+ name,
+ errno,
+ t_errno);
+ fflush(where);
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"create_xti_endpoint: socket %d obtained...\n",temp_socket);
+ fflush(where);
+ }
+
+ /* allocate what we need for option mgmt */
+ if ((opt_req = (struct t_optmgmt *)t_alloc(temp_socket,T_OPTMGMT,T_ALL)) ==
+ NULL) {
+ fprintf(where,
+ "netperf: create_xti_endpoint: t_alloc: opt_req errno %d\n",
+ errno);
+ fflush(where);
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "create_xti_endpoint: opt_req->opt.buf %x maxlen %d len %d\n",
+ opt_req->opt.buf,
+ opt_req->opt.maxlen,
+ opt_req->opt.len);
+
+ fflush(where);
+ }
+
+ if ((opt_ret = (struct t_optmgmt *) t_alloc(temp_socket,T_OPTMGMT,T_ALL)) ==
+ NULL) {
+ fprintf(where,
+ "netperf: create_xti_endpoint: t_alloc: opt_ret errno %d\n",
+ errno);
+ fflush(where);
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "create_xti_endpoint: opt_ret->opt.buf %x maxlen %d len %d\n",
+ opt_ret->opt.buf,
+ opt_ret->opt.maxlen,
+ opt_ret->opt.len);
+ fflush(where);
+ }
+
+ /* Modify the local socket size. The reason we alter the send buffer */
+ /* size here rather than when the connection is made is to take care */
+ /* of decreases in buffer size. Decreasing the window size after */
+ /* connection establishment is a TCP no-no. Also, by setting the */
+ /* buffer (window) size before the connection is established, we can */
+ /* control the TCP MSS (segment size). The MSS is never more that 1/2 */
+ /* the minimum receive buffer size at each half of the connection. */
+ /* This is why we are altering the receive buffer size on the sending */
+ /* size of a unidirectional transfer. If the user has not requested */
+ /* that the socket buffers be altered, we will try to find-out what */
+ /* their values are. If we cannot touch the socket buffer in any way, */
+ /* we will set the values to -1 to indicate that. */
+
+#ifdef XTI_SNDBUF
+ if (lss_size > 0) {
+ /* we want to "negotiate" the option */
+ opt_req->flags = T_NEGOTIATE;
+ }
+ else {
+ /* we want to accept the default, and know what it is. I assume */
+ /* that when nothing has been changed, that T_CURRENT will return */
+ /* the same as T_DEFAULT raj 3/95 */
+ opt_req->flags = T_CURRENT;
+ }
+
+ /* the first part is for the netbuf that holds the option we want */
+ /* to negotiate or check */
+ /* the buffer of the netbuf points at the socket options structure */
+
+ /* we assume that the t_alloc call allocated a buffer that started */
+ /* on a proper alignment */
+ sock_option = (struct sock_option *)opt_req->opt.buf;
+
+ /* and next, set the fields in the sock_option structure */
+ sock_option->myopthdr.level = XTI_GENERIC;
+ sock_option->myopthdr.name = XTI_SNDBUF;
+ sock_option->myopthdr.len = sizeof(struct t_opthdr) + sizeof(long);
+ sock_option->value = lss_size;
+
+ opt_req->opt.len = sizeof(struct t_opthdr) + sizeof(long);
+
+ /* now, set-up the stuff to return the value in the end */
+ /* we assume that the t_alloc call allocated a buffer that started */
+ /* on a proper alignment */
+ sock_option = (struct sock_option *)opt_ret->opt.buf;
+
+ /* finally, call t_optmgmt. clear as mud. */
+ if (t_optmgmt(temp_socket,opt_req,opt_ret) == -1) {
+ fprintf(where,
+ "netperf: create_xti_endpoint: XTI_SNDBUF option: t_errno %d\n",
+ t_errno);
+ fflush(where);
+ exit(1);
+ }
+
+ if (sock_option->myopthdr.status == T_SUCCESS) {
+ lss_size = sock_option->value;
+ }
+ else {
+ fprintf(where,"create_xti_endpoint: XTI_SNDBUF option status 0x%.4x",
+ sock_option->myopthdr.status);
+ fprintf(where," value %d\n",
+ sock_option->value);
+ fflush(where);
+ lss_size = -1;
+ }
+
+ if (lsr_size > 0) {
+ /* we want to "negotiate" the option */
+ opt_req->flags = T_NEGOTIATE;
+ }
+ else {
+ /* we want to accept the default, and know what it is. I assume */
+ /* that when nothing has been changed, that T_CURRENT will return */
+ /* the same as T_DEFAULT raj 3/95 */
+ opt_req->flags = T_CURRENT;
+ }
+
+ /* the first part is for the netbuf that holds the option we want */
+ /* to negotiate or check */
+ /* the buffer of the netbuf points at the socket options structure */
+
+ /* we assume that the t_alloc call allocated a buffer that started */
+ /* on a proper alignment */
+ sock_option = (struct sock_option *)opt_req->opt.buf;
+
+ /* and next, set the fields in the sock_option structure */
+ sock_option->myopthdr.level = XTI_GENERIC;
+ sock_option->myopthdr.name = XTI_RCVBUF;
+ sock_option->myopthdr.len = sizeof(struct t_opthdr) + sizeof(long);
+ sock_option->value = lsr_size;
+
+ opt_req->opt.len = sizeof(struct t_opthdr) + sizeof(long);
+
+ /* now, set-up the stuff to return the value in the end */
+ /* we assume that the t_alloc call allocated a buffer that started */
+ /* on a proper alignment */
+ sock_option = (struct sock_option *)opt_ret->opt.buf;
+
+ /* finally, call t_optmgmt. clear as mud. */
+ if (t_optmgmt(temp_socket,opt_req,opt_ret) == -1) {
+ fprintf(where,
+ "netperf: create_xti_endpoint: XTI_RCVBUF option: t_errno %d\n",
+ t_errno);
+ fflush(where);
+ exit(1);
+ }
+ lsr_size = sock_option->value;
+
+ /* this needs code */
+
+ if (debug) {
+ fprintf(where,"netperf: create_xti_endpoint: socket sizes determined...\n");
+ fprintf(where," send: %d recv: %d\n",
+ lss_size,lsr_size);
+ fflush(where);
+ }
+
+#else /* XTI_SNDBUF */
+
+ lss_size = -1;
+ lsr_size = -1;
+
+#endif /* XTI_SNDBUF */
+
+ /* now, we may wish to enable the copy avoidance features on the */
+ /* local system. of course, this may not be possible... */
+
+ if (loc_rcvavoid) {
+ fprintf(where,
+ "netperf: create_xti_endpoint: Could not enable receive copy avoidance");
+ fflush(where);
+ loc_rcvavoid = 0;
+ }
+
+ if (loc_sndavoid) {
+ fprintf(where,
+ "netperf: create_xti_endpoint: Could not enable send copy avoidance");
+ fflush(where);
+ loc_sndavoid = 0;
+ }
+
+ /* Now, we will see about setting the TCP_NODELAY flag on the local */
+ /* socket. We will only do this for those systems that actually */
+ /* support the option. If it fails, note the fact, but keep going. */
+ /* If the user tries to enable TCP_NODELAY on a UDP socket, this */
+ /* will cause an error to be displayed */
+
+#ifdef TCP_NODELAY
+ if ((strcmp(test_name,"XTI_TCP_STREAM") == 0) ||
+ (strcmp(test_name,"XTI_TCP_RR") == 0) ||
+ (strcmp(test_name,"XTI_TCP_CRR") == 0)) {
+ if (loc_nodelay) {
+ /* we want to "negotiate" the option */
+ opt_req->flags = T_NEGOTIATE;
+ }
+ else {
+ /* we want to accept the default, and know what it is. I assume */
+ /* that when nothing has been changed, that T_CURRENT will return */
+ /* the same as T_DEFAULT raj 3/95 */
+ opt_req->flags = T_CURRENT;
+ }
+
+ /* the first part is for the netbuf that holds the option we want */
+ /* to negotiate or check the buffer of the netbuf points at the */
+ /* socket options structure */
+
+ /* we assume that the t_alloc call allocated a buffer that started */
+ /* on a proper alignment */
+ sock_option = (struct sock_option *)opt_req->opt.buf;
+
+ /* and next, set the fields in the sock_option structure */
+ sock_option->myopthdr.level = INET_TCP;
+ sock_option->myopthdr.name = TCP_NODELAY;
+ sock_option->myopthdr.len = sizeof(struct t_opthdr) + sizeof(long);
+ sock_option->value = T_YES;
+
+ opt_req->opt.len = sizeof(struct t_opthdr) + sizeof(long);
+
+ /* now, set-up the stuff to return the value in the end */
+ /* we assume that the t_alloc call allocated a buffer that started */
+ /* on a proper alignment */
+ sock_option = (struct sock_option *)opt_ret->opt.buf;
+
+ /* finally, call t_optmgmt. clear as mud. */
+ if (t_optmgmt(temp_socket,opt_req,opt_ret) == -1) {
+ fprintf(where,
+ "create_xti_endpoint: TCP_NODELAY option: errno %d t_errno %d\n",
+ errno,
+ t_errno);
+ fflush(where);
+ exit(1);
+ }
+ loc_nodelay = sock_option->value;
+ }
+#else /* TCP_NODELAY */
+
+ loc_nodelay = 0;
+
+#endif /* TCP_NODELAY */
+
+ return(temp_socket);
+
+}
+
+
+/* This routine implements the TCP unidirectional data transfer test */
+/* (a.k.a. stream) for the xti interface. It receives its */
+/* parameters via global variables from the shell and writes its */
+/* output to the standard output. */
+
+
+void
+send_xti_tcp_stream(char remote_host[])
+{
+
+ char *tput_title = "\
+Recv Send Send \n\
+Socket Socket Message Elapsed \n\
+Size Size Size Time Throughput \n\
+bytes bytes bytes secs. %s/sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1 =
+ "%6d %6d %6d %-6.2f %7.2f \n";
+
+ char *cpu_title = "\
+Recv Send Send Utilization Service Demand\n\
+Socket Socket Message Elapsed Send Recv Send Recv\n\
+Size Size Size Time Throughput local remote local remote\n\
+bytes bytes bytes secs. %-8.8s/s %% %c %% %c us/KB us/KB\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f %c\n";
+
+ char *cpu_fmt_1 =
+ "%6d %6d %6d %-6.2f %7.2f %-6.2f %-6.2f %-6.3f %-6.3f\n";
+
+ char *ksink_fmt = "\n\
+Alignment Offset %-8.8s %-8.8s Sends %-8.8s Recvs\n\
+Local Remote Local Remote Xfered Per Per\n\
+Send Recv Send Recv Send (avg) Recv (avg)\n\
+%5d %5d %5d %5d %6.4g %6.2f %6d %6.2f %6d\n";
+
+ char *ksink_fmt2 = "\n\
+Maximum\n\
+Segment\n\
+Size (bytes)\n\
+%6d\n";
+
+
+ float elapsed_time;
+
+#ifdef WANT_INTERVALS
+ int interval_count;
+ sigset_t signal_set;
+#endif
+
+ /* what we want is to have a buffer space that is at least one */
+ /* send-size greater than our send window. this will insure that we */
+ /* are never trying to re-use a buffer that may still be in the hands */
+ /* of the transport. This buffer will be malloc'd after we have found */
+ /* the size of the local senc socket buffer. We will want to deal */
+ /* with alignment and offset concerns as well. */
+
+ int *message_int_ptr;
+
+ struct ring_elt *send_ring;
+
+ int len;
+ unsigned int nummessages;
+ SOCKET send_socket;
+ int bytes_remaining;
+ int tcp_mss = -1; /* possibly uninitialized on printf far below */
+
+ /* with links like fddi, one can send > 32 bits worth of bytes */
+ /* during a test... ;-) at some point, this should probably become a */
+ /* 64bit integral type, but those are not entirely common yet */
+
+ double bytes_sent;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+
+ double thruput;
+
+ /* some addressing information */
+ struct hostent *hp;
+ struct sockaddr_in server;
+ unsigned int addr;
+
+ struct t_call server_call;
+
+ struct xti_tcp_stream_request_struct *xti_tcp_stream_request;
+ struct xti_tcp_stream_response_struct *xti_tcp_stream_response;
+ struct xti_tcp_stream_results_struct *xti_tcp_stream_result;
+
+ xti_tcp_stream_request =
+ (struct xti_tcp_stream_request_struct *)netperf_request.content.test_specific_data;
+ xti_tcp_stream_response =
+ (struct xti_tcp_stream_response_struct *)netperf_response.content.test_specific_data;
+ xti_tcp_stream_result =
+ (struct xti_tcp_stream_results_struct *)netperf_response.content.test_specific_data;
+
+#ifdef WANT_HISTOGRAM
+ time_hist = HIST_new();
+#endif /* WANT_HISTOGRAM */
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ bzero((char *)&server,
+ sizeof(server));
+
+ /* it would seem that while HP-UX will allow an IP address (as a */
+ /* string) in a call to gethostbyname, other, less enlightened */
+ /* systems do not. fix from awjacks@ca.sandia.gov raj 10/95 */
+ /* order changed to check for IP address first. raj 7/96 */
+
+ if ((addr = inet_addr(remote_host)) == SOCKET_ERROR) {
+ /* it was not an IP address, try it as a name */
+ if ((hp = gethostbyname(remote_host)) == NULL) {
+ /* we have no idea what it is */
+ fprintf(where,
+ "establish_control: could not resolve the destination %s\n",
+ remote_host);
+ fflush(where);
+ exit(1);
+ }
+ else {
+ /* it was a valid remote_host */
+ bcopy(hp->h_addr,
+ (char *)&server.sin_addr,
+ hp->h_length);
+ server.sin_family = hp->h_addrtype;
+ }
+ }
+ else {
+ /* it was a valid IP address */
+ server.sin_addr.s_addr = addr;
+ server.sin_family = AF_INET;
+ }
+
+ if ( print_headers ) {
+ /* we want to have some additional, interesting information in */
+ /* the headers. we know some of it here, but not all, so we will */
+ /* only print the test title here and will print the results */
+ /* titles after the test is finished */
+ fprintf(where,"XTI TCP STREAM TEST");
+ fprintf(where," to %s", remote_host);
+ if (iteration_max > 1) {
+ fprintf(where,
+ " : +/-%3.1f%% @ %2d%% conf.",
+ interval/0.02,
+ confidence_level);
+ }
+ if (loc_nodelay || rem_nodelay) {
+ fprintf(where," : nodelay");
+ }
+ if (loc_sndavoid ||
+ loc_rcvavoid ||
+ rem_sndavoid ||
+ rem_rcvavoid) {
+ fprintf(where," : copy avoidance");
+ }
+#ifdef WANT_HISTOGRAM
+ fprintf(where," : histogram");
+#endif /* WANT_HISTOGRAM */
+#ifdef WANT_INTERVALS
+ fprintf(where," : interval");
+#endif /* WANT_INTERVALS */
+#ifdef DIRTY
+ fprintf(where," : dirty data");
+#endif /* DIRTY */
+ fprintf(where,"\n");
+ }
+
+ send_ring = NULL;
+ confidence_iteration = 1;
+ init_stat();
+
+ /* we have a great-big while loop which controls the number of times */
+ /* we run a particular test. this is for the calculation of a */
+ /* confidence interval (I really should have stayed awake during */
+ /* probstats :). If the user did not request confidence measurement */
+ /* (no confidence is the default) then we will only go though the */
+ /* loop once. the confidence stuff originates from the folks at IBM */
+
+ while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
+ (confidence_iteration <= iteration_min)) {
+
+ /* initialize a few counters. we have to remember that we might be */
+ /* going through the loop more than once. */
+
+ nummessages = 0;
+ bytes_sent = 0.0;
+ times_up = 0;
+
+ /*set up the data socket */
+ send_socket = create_xti_endpoint(loc_xti_device);
+
+ if (send_socket == INVALID_SOCKET) {
+ perror("netperf: send_xti_tcp_stream: tcp stream data socket");
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"send_xti_tcp_stream: send_socket obtained...\n");
+ }
+
+ /* it would seem that with XTI, there is no implicit bind on a */
+ /* connect, so we have to make a call to t_bind. this is not */
+ /* terribly convenient, but I suppose that "standard is better */
+ /* than better" :) raj 2/95 */
+
+ if (t_bind(send_socket, NULL, NULL) == SOCKET_ERROR) {
+ t_error("send_xti_tcp_stream: t_bind");
+ exit(1);
+ }
+
+ /* at this point, we have either retrieved the socket buffer sizes, */
+ /* or have tried to set them, so now, we may want to set the send */
+ /* size based on that (because the user either did not use a -m */
+ /* option, or used one with an argument of 0). If the socket buffer */
+ /* size is not available, we will set the send size to 4KB - no */
+ /* particular reason, just arbitrary... */
+ if (send_size == 0) {
+ if (lss_size > 0) {
+ send_size = lss_size;
+ }
+ else {
+ send_size = 4096;
+ }
+ }
+
+ /* set-up the data buffer ring with the requested alignment and offset. */
+ /* note also that we have allocated a quantity */
+ /* of memory that is at least one send-size greater than our socket */
+ /* buffer size. We want to be sure that there are at least two */
+ /* buffers allocated - this can be a bit of a problem when the */
+ /* send_size is bigger than the socket size, so we must check... the */
+ /* user may have wanted to explicitly set the "width" of our send */
+ /* buffers, we should respect that wish... */
+
+ if (send_width == 0) {
+ send_width = (lss_size/send_size) + 1;
+ if (send_width == 1) send_width++;
+ }
+
+ if (send_ring == NULL) {
+ /* only allocate the send ring once. this is a networking test, */
+ /* not a memory allocation test. this way, we do not need a */
+ /* deallocate_buffer_ring() routine, and I don't feel like */
+ /* writing one anyway :) raj 11/94 */
+ send_ring = allocate_buffer_ring(send_width,
+ send_size,
+ local_send_align,
+ local_send_offset);
+ }
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back. */
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ /* Tell the remote end to do a listen. The server alters the socket */
+ /* paramters on the other side at this point, hence the reason for */
+ /* all the values being passed in the setup message. If the user did */
+ /* not specify any of the parameters, they will be passed as 0, which */
+ /* will indicate to the remote that no changes beyond the system's */
+ /* default should be used. Alignment is the exception, it will */
+ /* default to 1, which will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_XTI_TCP_STREAM;
+ xti_tcp_stream_request->send_buf_size = rss_size;
+ xti_tcp_stream_request->recv_buf_size = rsr_size;
+ xti_tcp_stream_request->receive_size = recv_size;
+ xti_tcp_stream_request->no_delay = rem_nodelay;
+ xti_tcp_stream_request->recv_alignment = remote_recv_align;
+ xti_tcp_stream_request->recv_offset = remote_recv_offset;
+ xti_tcp_stream_request->measure_cpu = remote_cpu_usage;
+ xti_tcp_stream_request->cpu_rate = remote_cpu_rate;
+ if (test_time) {
+ xti_tcp_stream_request->test_length = test_time;
+ }
+ else {
+ xti_tcp_stream_request->test_length = test_bytes;
+ }
+ xti_tcp_stream_request->so_rcvavoid = rem_rcvavoid;
+ xti_tcp_stream_request->so_sndavoid = rem_sndavoid;
+
+ strcpy(xti_tcp_stream_request->xti_device, rem_xti_device);
+
+#ifdef __alpha
+
+ /* ok - even on a DEC box, strings are strings. I didn't really want */
+ /* to ntohl the words of a string. since I don't want to teach the */
+ /* send_ and recv_ _request and _response routines about the types, */
+ /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
+ /* solution would be to use XDR, but I am still leary of being able */
+ /* to find XDR libs on all platforms I want running netperf. raj */
+ {
+ int *charword;
+ int *initword;
+ int *lastword;
+
+ initword = (int *) xti_tcp_stream_request->xti_device;
+ lastword = initword + ((strlen(rem_xti_device) + 3) / 4);
+
+ for (charword = initword;
+ charword < lastword;
+ charword++) {
+
+ *charword = ntohl(*charword);
+ }
+ }
+#endif /* __alpha */
+
+#ifdef DIRTY
+ xti_tcp_stream_request->dirty_count = rem_dirty_count;
+ xti_tcp_stream_request->clean_count = rem_clean_count;
+#endif /* DIRTY */
+
+
+ if (debug > 1) {
+ fprintf(where,
+ "netperf: send_xti_tcp_stream: requesting TCP stream test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant */
+ /* socket parameters for this test type. We will put them back into */
+ /* the variables here so they can be displayed if desired. The */
+ /* remote will have calibrated CPU if necessary, and will have done */
+ /* all the needed set-up we will have calibrated the cpu locally */
+ /* before sending the request, and will grab the counter value right*/
+ /* after the connect returns. The remote will grab the counter right*/
+ /* after the accept call. This saves the hassle of extra messages */
+ /* being sent for the TCP tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote listen done.\n");
+ rsr_size = xti_tcp_stream_response->recv_buf_size;
+ rss_size = xti_tcp_stream_response->send_buf_size;
+ rem_nodelay = xti_tcp_stream_response->no_delay;
+ remote_cpu_usage = xti_tcp_stream_response->measure_cpu;
+ remote_cpu_rate = xti_tcp_stream_response->cpu_rate;
+
+ /* we have to make sure that the server port number is in */
+ /* network order */
+ server.sin_port = (short)xti_tcp_stream_response->data_port_number;
+ server.sin_port = htons(server.sin_port);
+ rem_rcvavoid = xti_tcp_stream_response->so_rcvavoid;
+ rem_sndavoid = xti_tcp_stream_response->so_sndavoid;
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("netperf: remote error");
+
+ exit(1);
+ }
+
+ /*Connect up to the remote port on the data socket */
+ memset (&server_call, 0, sizeof(server_call));
+ server_call.addr.maxlen = sizeof(struct sockaddr_in);
+ server_call.addr.len = sizeof(struct sockaddr_in);
+ server_call.addr.buf = (char *)&server;
+
+ if (t_connect(send_socket,
+ &server_call,
+ NULL) == INVALID_SOCKET){
+ t_error("netperf: send_xti_tcp_stream: data socket connect failed");
+ printf(" port: %d\n",ntohs(server.sin_port));
+ exit(1);
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either */
+ /* the connect would have failed, or the previous response would */
+ /* have indicated a problem. I failed to see the value of the */
+ /* extra message after the accept on the remote. If it failed, */
+ /* we'll see it here. If it didn't, we might as well start pumping */
+ /* data. */
+
+ /* Set-up the test end conditions. For a stream test, they can be */
+ /* either time or byte-count based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ bytes_remaining = 0;
+ /* in previous revisions, we had the same code repeated throught */
+ /* all the test suites. this was unnecessary, and meant more */
+ /* work for me when I wanted to switch to POSIX signals, so I */
+ /* have abstracted this out into a routine in netlib.c. if you */
+ /* are experiencing signal problems, you might want to look */
+ /* there. raj 11/94 */
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ bytes_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+#ifdef WANT_INTERVALS
+ if ((interval_burst) || (demo_mode)) {
+ /* zero means that we never pause, so we never should need the */
+ /* interval timer, unless we are in demo_mode */
+ start_itimer(interval_wate);
+ }
+ interval_count = interval_burst;
+ /* get the signal set for the call to sigsuspend */
+ if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &signal_set) != 0) {
+ fprintf(where,
+ "send_xti_tcp_stream: unable to get sigmask errno %d\n",
+ errno);
+ fflush(where);
+ exit(1);
+ }
+#endif /* WANT_INTERVALS */
+
+ /* before we start, initialize a few variables */
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return false. */
+ /* When the test is controlled by byte count, the time test will */
+ /* always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. */
+
+ while ((!times_up) || (bytes_remaining > 0)) {
+
+#ifdef DIRTY
+ /* we want to dirty some number of consecutive integers in the buffer */
+ /* we are about to send. we may also want to bring some number of */
+ /* them cleanly into the cache. The clean ones will follow any dirty */
+ /* ones into the cache. at some point, we might want to replace */
+ /* the rand() call with something from a table to reduce our call */
+ /* overhead during the test, but it is not a high priority item. */
+ access_buffer(send_ring->buffer_ptr,
+ send_size,
+ loc_dirty_count,
+ loc_clean_count);
+#endif /* DIRTY */
+
+#ifdef WANT_HISTOGRAM
+ /* timestamp just before we go into send and then again just after */
+ /* we come out raj 8/94 */
+ HIST_timestamp(&time_one);
+#endif /* WANT_HISTOGRAM */
+
+ if((len=t_snd(send_socket,
+ send_ring->buffer_ptr,
+ send_size,
+ 0)) != send_size) {
+ if ((len >=0) || (errno == EINTR)) {
+ /* the test was interrupted, must be the end of test */
+ break;
+ }
+ fprintf(where,
+ "send_xti_tcp_stream: t_snd: errno %d t_errno %d t_look 0x%.4x\n",
+ errno,
+ t_errno,
+ t_look(send_socket));
+ fflush(where);
+ exit(1);
+ }
+
+#ifdef WANT_HISTOGRAM
+ /* timestamp the exit from the send call and update the histogram */
+ HIST_timestamp(&time_two);
+ HIST_add(time_hist,delta_micro(&time_one,&time_two));
+#endif /* WANT_HISTOGRAM */
+
+#ifdef WANT_INTERVALS
+ if (demo_mode) {
+ units_this_tick += send_size;
+ }
+ /* in this case, the interval count is the count-down couter */
+ /* to decide to sleep for a little bit */
+ if ((interval_burst) && (--interval_count == 0)) {
+ /* call sigsuspend and wait for the interval timer to get us */
+ /* out */
+ if (debug) {
+ fprintf(where,"about to suspend\n");
+ fflush(where);
+ }
+ if (sigsuspend(&signal_set) == EFAULT) {
+ fprintf(where,
+ "send_xti_tcp_stream: fault with signal set!\n");
+ fflush(where);
+ exit(1);
+ }
+ interval_count = interval_burst;
+ }
+#endif /* WANT_INTERVALS */
+
+ /* now we want to move our pointer to the next position in the */
+ /* data buffer...we may also want to wrap back to the "beginning" */
+ /* of the bufferspace, so we will mod the number of messages sent */
+ /* by the send width, and use that to calculate the offset to add */
+ /* to the base pointer. */
+ nummessages++;
+ send_ring = send_ring->next;
+ if (bytes_remaining) {
+ bytes_remaining -= send_size;
+ }
+ }
+
+ /* The test is over. Flush the buffers to the remote end. We do a */
+ /* graceful release to insure that all data has been taken by the */
+ /* remote. */
+
+ /* but first, if the verbosity is greater than 1, find-out what */
+ /* the TCP maximum segment_size was (if possible) */
+ if (verbosity > 1) {
+ tcp_mss = -1;
+ get_xti_info(send_socket,info_struct);
+ }
+
+ if (t_sndrel(send_socket) == -1) {
+ t_error("netperf: cannot shutdown tcp stream socket");
+ exit(1);
+ }
+
+ /* hang a t_rcvrel() off the socket to block until the remote has */
+ /* brought all the data up into the application. it will do a */
+ /* t_sedrel to cause a FIN to be sent our way. We will assume that */
+ /* any exit from the t_rcvrel() call is good... raj 2/95 */
+
+ if (debug > 1) {
+ fprintf(where,"about to hang a receive for graceful release.\n");
+ fflush(where);
+ }
+
+ t_rcvrel(send_socket);
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being */
+ /* measured and how */
+ /* long did we really */
+ /* run? */
+
+ /* Get the statistics from the remote end. The remote will have */
+ /* calculated service demand and all those interesting things. If it */
+ /* wasn't supposed to care, it will return obvious values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("netperf: remote error");
+
+ exit(1);
+ }
+
+ /* We now calculate what our thruput was for the test. In the future, */
+ /* we may want to include a calculation of the thruput measured by */
+ /* the remote, but it should be the case that for a TCP stream test, */
+ /* that the two numbers should be *very* close... We calculate */
+ /* bytes_sent regardless of the way the test length was controlled. */
+ /* If it was time, we needed to, and if it was by bytes, the user may */
+ /* have specified a number of bytes that wasn't a multiple of the */
+ /* send_size, so we really didn't send what he asked for ;-) */
+
+ bytes_sent = xti_tcp_stream_result->bytes_received;
+
+ thruput = calc_thruput(bytes_sent);
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+
+ local_cpu_utilization = calc_cpu_util(0.0);
+ local_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = -1.0;
+ local_service_demand = -1.0;
+ }
+
+ if (remote_cpu_usage) {
+
+ remote_cpu_utilization = xti_tcp_stream_result->cpu_util;
+ remote_service_demand = calc_service_demand(bytes_sent,
+ 0.0,
+ remote_cpu_utilization,
+ xti_tcp_stream_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = -1.0;
+ remote_service_demand = -1.0;
+ }
+ }
+ else {
+ /* we were not measuring cpu, for the confidence stuff, we */
+ /* should make it -1.0 */
+ local_cpu_utilization = -1.0;
+ local_service_demand = -1.0;
+ remote_cpu_utilization = -1.0;
+ remote_service_demand = -1.0;
+ }
+
+ /* at this point, we want to calculate the confidence information. */
+ /* if debugging is on, calculate_confidence will print-out the */
+ /* parameters we pass it */
+
+ calculate_confidence(confidence_iteration,
+ elapsed_time,
+ thruput,
+ local_cpu_utilization,
+ remote_cpu_utilization,
+ local_service_demand,
+ remote_service_demand);
+
+
+ confidence_iteration++;
+ }
+
+ /* at this point, we have finished making all the runs that we */
+ /* will be making. so, we should extract what the calcuated values */
+ /* are for all the confidence stuff. we could make the values */
+ /* global, but that seemed a little messy, and it did not seem worth */
+ /* all the mucking with header files. so, we create a routine much */
+ /* like calcualte_confidence, which just returns the mean values. */
+ /* raj 11/94 */
+
+ retrieve_confident_values(&elapsed_time,
+ &thruput,
+ &local_cpu_utilization,
+ &remote_cpu_utilization,
+ &local_service_demand,
+ &remote_service_demand);
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ if (confidence < 0) {
+ /* we did not hit confidence, but were we asked to look for it? */
+ if (iteration_max > 1) {
+ display_confidence();
+ }
+ }
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ local_cpu_method = format_cpu_method(cpu_method);
+ remote_cpu_method = format_cpu_method(xti_tcp_stream_result->cpu_method);
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand,
+ local_cpu_method);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand,
+ remote_cpu_method);
+ }
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,
+ cpu_title,
+ format_units(),
+ local_cpu_method,
+ remote_cpu_method);
+ }
+
+ fprintf(where,
+ cpu_fmt_1, /* the format string */
+ rsr_size, /* remote recvbuf size */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long was the test */
+ thruput, /* what was the xfer rate */
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand); /* remote service demand */
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ thruput);
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,tput_title,format_units());
+ }
+ fprintf(where,
+ tput_fmt_1, /* the format string */
+ rsr_size, /* remote recvbuf size */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long did it take */
+ thruput);/* how fast did it go */
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* TCP statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ /* this stuff needs to be worked-out in the presence of confidence */
+ /* intervals and multiple iterations of the test... raj 11/94 */
+
+ fprintf(where,
+ ksink_fmt,
+ "Bytes",
+ "Bytes",
+ "Bytes",
+ local_send_align,
+ remote_recv_align,
+ local_send_offset,
+ remote_recv_offset,
+ bytes_sent,
+ bytes_sent / (double)nummessages,
+ nummessages,
+ bytes_sent / (double)xti_tcp_stream_result->recv_calls,
+ xti_tcp_stream_result->recv_calls);
+ fprintf(where,
+ ksink_fmt2,
+ tcp_mss);
+ fflush(where);
+#ifdef WANT_HISTOGRAM
+ fprintf(where,"\n\nHistogram of time spent in send() call.\n");
+ fflush(where);
+ HIST_report(time_hist);
+#endif /* WANT_HISTOGRAM */
+ }
+
+}
+
+
+/* This is the server-side routine for the tcp stream test. It is */
+/* implemented as one routine. I could break things-out somewhat, but */
+/* didn't feel it was necessary. */
+
+void
+recv_xti_tcp_stream()
+{
+
+ struct sockaddr_in myaddr_in, peeraddr_in;
+ struct t_bind bind_req, bind_resp;
+ struct t_call call_req;
+
+ SOCKET s_listen,s_data;
+ int addrlen;
+ int len;
+ unsigned int receive_calls;
+ float elapsed_time;
+ double bytes_received;
+
+ struct ring_elt *recv_ring;
+
+ int *message_int_ptr;
+ int i;
+
+ struct xti_tcp_stream_request_struct *xti_tcp_stream_request;
+ struct xti_tcp_stream_response_struct *xti_tcp_stream_response;
+ struct xti_tcp_stream_results_struct *xti_tcp_stream_results;
+
+ xti_tcp_stream_request =
+ (struct xti_tcp_stream_request_struct *)netperf_request.content.test_specific_data;
+ xti_tcp_stream_response =
+ (struct xti_tcp_stream_response_struct *)netperf_response.content.test_specific_data;
+ xti_tcp_stream_results =
+ (struct xti_tcp_stream_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_xti_tcp_stream: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_xti_tcp_stream: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = XTI_TCP_STREAM_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_xti_tcp_stream: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* We now alter the message_ptr variable to be at the desired */
+ /* alignment with the desired offset. */
+
+ if (debug) {
+ fprintf(where,"recv_xti_tcp_stream: requested alignment of %d\n",
+ xti_tcp_stream_request->recv_alignment);
+ fflush(where);
+ }
+
+ /* Let's clear-out our sockaddr for the sake of cleanlines. Then we */
+ /* can put in OUR values !-) At some point, we may want to nail this */
+ /* socket to a particular network-level address, but for now, */
+ /* INADDR_ANY should be just fine. */
+
+ bzero((char *)&myaddr_in,
+ sizeof(myaddr_in));
+ myaddr_in.sin_family = AF_INET;
+ myaddr_in.sin_addr.s_addr = INADDR_ANY;
+ myaddr_in.sin_port = 0;
+
+ /* Grab a socket to listen on, and then listen on it. */
+
+ if (debug) {
+ fprintf(where,"recv_xti_tcp_stream: grabbing a socket...\n");
+ fflush(where);
+ }
+
+ /* create_xti_endpoint expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lss_size = xti_tcp_stream_request->send_buf_size;
+ lsr_size = xti_tcp_stream_request->recv_buf_size;
+ loc_nodelay = xti_tcp_stream_request->no_delay;
+ loc_rcvavoid = xti_tcp_stream_request->so_rcvavoid;
+ loc_sndavoid = xti_tcp_stream_request->so_sndavoid;
+
+#ifdef __alpha
+
+ /* ok - even on a DEC box, strings are strings. I din't really want */
+ /* to ntohl the words of a string. since I don't want to teach the */
+ /* send_ and recv_ _request and _response routines about the types, */
+ /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
+ /* solution would be to use XDR, but I am still leary of being able */
+ /* to find XDR libs on all platforms I want running netperf. raj */
+ {
+ int *charword;
+ int *initword;
+ int *lastword;
+
+ initword = (int *) xti_tcp_stream_request->xti_device;
+ lastword = initword + ((xti_tcp_stream_request->dev_name_len + 3) / 4);
+
+ for (charword = initword;
+ charword < lastword;
+ charword++) {
+
+ *charword = htonl(*charword);
+ }
+ }
+
+#endif /* __alpha */
+
+ s_listen = create_xti_endpoint(xti_tcp_stream_request->xti_device);
+
+ if (s_listen == INVALID_SOCKET) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ /* Let's get an address assigned to this socket so we can tell the */
+ /* initiator how to reach the data socket. There may be a desire to */
+ /* nail this socket to a specific IP address in a multi-homed, */
+ /* multi-connection situation, but for now, we'll ignore the issue */
+ /* and concentrate on single connection testing. */
+
+ bind_req.addr.maxlen = sizeof(struct sockaddr_in);
+ bind_req.addr.len = sizeof(struct sockaddr_in);
+ bind_req.addr.buf = (char *)&myaddr_in;
+ bind_req.qlen = 1;
+
+ bind_resp.addr.maxlen = sizeof(struct sockaddr_in);
+ bind_resp.addr.len = sizeof(struct sockaddr_in);
+ bind_resp.addr.buf = (char *)&myaddr_in;
+ bind_resp.qlen = 1;
+
+ if (t_bind(s_listen,
+ &bind_req,
+ &bind_resp) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = t_errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_xti_tcp_stream: t_bind complete port %d\n",
+ ntohs(myaddr_in.sin_port));
+ fflush(where);
+ }
+
+ /* what sort of sizes did we end-up with? */
+ if (xti_tcp_stream_request->receive_size == 0) {
+ if (lsr_size > 0) {
+ recv_size = lsr_size;
+ }
+ else {
+ recv_size = 4096;
+ }
+ }
+ else {
+ recv_size = xti_tcp_stream_request->receive_size;
+ }
+
+ /* we want to set-up our recv_ring in a manner analagous to what we */
+ /* do on the sending side. this is more for the sake of symmetry */
+ /* than for the needs of say copy avoidance, but it might also be */
+ /* more realistic - this way one could conceivably go with a */
+ /* double-buffering scheme when taking the data an putting it into */
+ /* the filesystem or something like that. raj 7/94 */
+
+ if (recv_width == 0) {
+ recv_width = (lsr_size/recv_size) + 1;
+ if (recv_width == 1) recv_width++;
+ }
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ recv_size,
+ xti_tcp_stream_request->recv_alignment,
+ xti_tcp_stream_request->recv_offset);
+
+ if (debug) {
+ fprintf(where,"recv_xti_tcp_stream: recv alignment and offset set...\n");
+ fflush(where);
+ }
+
+ /* Now myaddr_in contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ xti_tcp_stream_response->data_port_number =
+ (int) ntohs(myaddr_in.sin_port);
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a -1 to */
+ /* the initiator. */
+
+ xti_tcp_stream_response->cpu_rate = 0.0; /* assume no cpu */
+ if (xti_tcp_stream_request->measure_cpu) {
+ xti_tcp_stream_response->measure_cpu = 1;
+ xti_tcp_stream_response->cpu_rate =
+ calibrate_local_cpu(xti_tcp_stream_request->cpu_rate);
+ }
+ else {
+ xti_tcp_stream_response->measure_cpu = 0;
+ }
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ xti_tcp_stream_response->send_buf_size = lss_size;
+ xti_tcp_stream_response->recv_buf_size = lsr_size;
+ xti_tcp_stream_response->no_delay = loc_nodelay;
+ xti_tcp_stream_response->so_rcvavoid = loc_rcvavoid;
+ xti_tcp_stream_response->so_sndavoid = loc_sndavoid;
+ xti_tcp_stream_response->receive_size = recv_size;
+
+ send_response();
+
+ /* Now, let's set-up the socket to listen for connections. for xti, */
+ /* the t_listen call is blocking by default - this is different */
+ /* semantics from BSD - probably has to do with being able to reject */
+ /* a call before an accept */
+ call_req.addr.maxlen = sizeof(struct sockaddr_in);
+ call_req.addr.len = sizeof(struct sockaddr_in);
+ call_req.addr.buf = (char *)&peeraddr_in;
+ call_req.opt.maxlen = 0;
+ call_req.opt.len = 0;
+ call_req.opt.buf = NULL;
+ call_req.udata.maxlen= 0;
+ call_req.udata.len = 0;
+ call_req.udata.buf = 0;
+
+ if (t_listen(s_listen, &call_req) == -1) {
+ fprintf(where,
+ "recv_xti_tcp_stream: t_listen: errno %d t_errno %d\n",
+ errno,
+ t_errno);
+ fflush(where);
+ netperf_response.content.serv_errno = t_errno;
+ close(s_listen);
+ send_response();
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_xti_tcp_stream: t_listen complete t_look 0x%.4x\n",
+ t_look(s_listen));
+ fflush(where);
+ }
+
+ /* now just rubber stamp the thing. we want to use the same fd? so */
+ /* we will just equate s_data with s_listen. this seems a little */
+ /* hokey to me, but then I'm a BSD biggot still. raj 2/95 */
+ s_data = s_listen;
+ if (t_accept(s_listen,
+ s_data,
+ &call_req) == -1) {
+ fprintf(where,
+ "recv_xti_tcp_stream: t_accept: errno %d t_errno %d\n",
+ errno,
+ t_errno);
+ fflush(where);
+ close(s_listen);
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_xti_tcp_stream: t_accept complete t_look 0x%.4x\n",
+ t_look(s_data));
+ fprintf(where,
+ " remote is %s port %d\n",
+ inet_ntoa(*(struct in_addr *)&peeraddr_in.sin_addr),
+ ntohs(peeraddr_in.sin_port));
+ fflush(where);
+ }
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(xti_tcp_stream_request->measure_cpu);
+
+ /* The loop will exit when the sender does a t_sndrel, which will */
+ /* return T_LOOK error from the t_recv */
+
+#ifdef DIRTY
+ /* we want to dirty some number of consecutive integers in the buffer */
+ /* we are about to recv. we may also want to bring some number of */
+ /* them cleanly into the cache. The clean ones will follow any dirty */
+ /* ones into the cache. */
+
+ access_buffer(recv_ring->buffer_ptr,
+ recv_size,
+ xti_tcp_stream_request->dirty_count,
+ xti_tcp_stream_request->clean_count);
+
+#endif /* DIRTY */
+
+ bytes_received = 0;
+ receive_calls = 0;
+
+ while ((len = t_rcv(s_data,
+ recv_ring->buffer_ptr,
+ recv_size,
+ &xti_flags)) != -1) {
+ bytes_received += len;
+ receive_calls++;
+
+ /* more to the next buffer in the recv_ring */
+ recv_ring = recv_ring->next;
+
+#ifdef DIRTY
+
+ access_buffer(recv_ring->buffer_ptr,
+ recv_size,
+ xti_tcp_stream_request->dirty_count,
+ xti_tcp_stream_request->clean_count);
+
+#endif /* DIRTY */
+ }
+
+ if (t_look(s_data) == T_ORDREL) {
+ /* this is a normal exit path */
+ if (debug) {
+ fprintf(where,
+ "recv_xti_tcp_stream: t_rcv T_ORDREL indicated\n");
+ fflush(where);
+ }
+ }
+ else {
+ /* something went wrong */
+ fprintf(where,
+ "recv_xti_tcp_stream: t_rcv: errno %d t_errno %d len %d",
+ errno,
+ t_errno,
+ len);
+ fprintf(where,
+ " t_look 0x%.4x",
+ t_look(s_data));
+ fflush(where);
+ netperf_response.content.serv_errno = t_errno;
+ send_response();
+ exit(1);
+ }
+
+ /* receive the release and let the initiator know that we have */
+ /* received all the data. raj 3/95 */
+
+ if (t_rcvrel(s_data) == -1) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_xti_tcp_stream: t_rcvrel complete\n");
+ fflush(where);
+ }
+
+ if (t_sndrel(s_data) == -1) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_xti_tcp_stream: t_sndrel complete\n");
+ fflush(where);
+ }
+
+ cpu_stop(xti_tcp_stream_request->measure_cpu,&elapsed_time);
+
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_xti_tcp_stream: got %g bytes\n",
+ bytes_received);
+ fprintf(where,
+ "recv_xti_tcp_stream: got %d recvs\n",
+ receive_calls);
+ fflush(where);
+ }
+
+ xti_tcp_stream_results->bytes_received = bytes_received;
+ xti_tcp_stream_results->elapsed_time = elapsed_time;
+ xti_tcp_stream_results->recv_calls = receive_calls;
+
+ if (xti_tcp_stream_request->measure_cpu) {
+ xti_tcp_stream_results->cpu_util = calc_cpu_util(0.0);
+ };
+
+ if (debug) {
+ fprintf(where,
+ "recv_xti_tcp_stream: test complete, sending results.\n");
+ fprintf(where,
+ " bytes_received %g receive_calls %d\n",
+ bytes_received,
+ receive_calls);
+ fprintf(where,
+ " len %d\n",
+ len);
+ fflush(where);
+ }
+
+ xti_tcp_stream_results->cpu_method = cpu_method;
+ send_response();
+
+ /* we are now done with the socket */
+ t_close(s_data);
+
+}
+
+
+ /* this routine implements the sending (netperf) side of the XTI_TCP_RR */
+ /* test. */
+
+void
+send_xti_tcp_rr(char remote_host[])
+{
+
+ char *tput_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans.\n\
+Send Recv Size Size Time Rate \n\
+bytes Bytes bytes bytes secs. per sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %7.2f \n";
+ char *tput_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *cpu_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem\n\
+Send Recv Size Size Time Rate local remote local remote\n\
+bytes bytes bytes bytes secs. per sec %% %c %% %c us/Tr us/Tr\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f %c\n";
+
+ char *cpu_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %-6.2f %-6.2f %-6.2f %-6.3f %-6.3f\n";
+
+ char *cpu_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *ksink_fmt = "\
+Alignment Offset\n\
+Local Remote Local Remote\n\
+Send Recv Send Recv\n\
+%5d %5d %5d %5d\n";
+
+
+ int timed_out = 0;
+ float elapsed_time;
+
+ int len;
+ char *temp_message_ptr;
+ int nummessages;
+ SOCKET send_socket;
+ int trans_remaining;
+ double bytes_xferd;
+
+ struct ring_elt *send_ring;
+ struct ring_elt *recv_ring;
+
+ int rsp_bytes_left;
+ int rsp_bytes_recvd;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+ double thruput;
+
+ struct hostent *hp;
+ struct sockaddr_in server;
+ unsigned int addr;
+
+ struct t_call server_call;
+
+ struct xti_tcp_rr_request_struct *xti_tcp_rr_request;
+ struct xti_tcp_rr_response_struct *xti_tcp_rr_response;
+ struct xti_tcp_rr_results_struct *xti_tcp_rr_result;
+
+#ifdef WANT_INTERVALS
+ int interval_count;
+ sigset_t signal_set;
+#endif /* WANT_INTERVALS */
+
+ xti_tcp_rr_request =
+ (struct xti_tcp_rr_request_struct *)netperf_request.content.test_specific_data;
+ xti_tcp_rr_response=
+ (struct xti_tcp_rr_response_struct *)netperf_response.content.test_specific_data;
+ xti_tcp_rr_result =
+ (struct xti_tcp_rr_results_struct *)netperf_response.content.test_specific_data;
+
+#ifdef WANT_HISTOGRAM
+ time_hist = HIST_new();
+#endif /* WANT_HISTOGRAM */
+
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ bzero((char *)&server,
+ sizeof(server));
+
+ /* it would seem that while HP-UX will allow an IP address (as a */
+ /* string) in a call to gethostbyname, other, less enlightened */
+ /* systems do not. fix from awjacks@ca.sandia.gov raj 10/95 */
+ /* order changed to check for IP address first. raj 7/96 */
+
+ if ((addr = inet_addr(remote_host)) == SOCKET_ERROR) {
+ /* it was not an IP address, try it as a name */
+ if ((hp = gethostbyname(remote_host)) == NULL) {
+ /* we have no idea what it is */
+ fprintf(where,
+ "establish_control: could not resolve the destination %s\n",
+ remote_host);
+ fflush(where);
+ exit(1);
+ }
+ else {
+ /* it was a valid remote_host */
+ bcopy(hp->h_addr,
+ (char *)&server.sin_addr,
+ hp->h_length);
+ server.sin_family = hp->h_addrtype;
+ }
+ }
+ else {
+ /* it was a valid IP address */
+ server.sin_addr.s_addr = addr;
+ server.sin_family = AF_INET;
+ }
+
+ if ( print_headers ) {
+ fprintf(where,"XTI TCP REQUEST/RESPONSE TEST");
+ fprintf(where," to %s", remote_host);
+ if (iteration_max > 1) {
+ fprintf(where,
+ " : +/-%3.1f%% @ %2d%% conf.",
+ interval/0.02,
+ confidence_level);
+ }
+ if (loc_nodelay || rem_nodelay) {
+ fprintf(where," : nodelay");
+ }
+ if (loc_sndavoid ||
+ loc_rcvavoid ||
+ rem_sndavoid ||
+ rem_rcvavoid) {
+ fprintf(where," : copy avoidance");
+ }
+#ifdef WANT_HISTOGRAM
+ fprintf(where," : histogram");
+#endif /* WANT_HISTOGRAM */
+#ifdef WANT_INTERVALS
+ fprintf(where," : interval");
+#endif /* WANT_INTERVALS */
+#ifdef DIRTY
+ fprintf(where," : dirty data");
+#endif /* DIRTY */
+ fprintf(where,"\n");
+ }
+
+ /* initialize a few counters */
+
+ send_ring = NULL;
+ recv_ring = NULL;
+ confidence_iteration = 1;
+ init_stat();
+
+ /* we have a great-big while loop which controls the number of times */
+ /* we run a particular test. this is for the calculation of a */
+ /* confidence interval (I really should have stayed awake during */
+ /* probstats :). If the user did not request confidence measurement */
+ /* (no confidence is the default) then we will only go though the */
+ /* loop once. the confidence stuff originates from the folks at IBM */
+
+ while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
+ (confidence_iteration <= iteration_min)) {
+
+ /* initialize a few counters. we have to remember that we might be */
+ /* going through the loop more than once. */
+
+ nummessages = 0;
+ bytes_xferd = 0.0;
+ times_up = 0;
+ timed_out = 0;
+ trans_remaining = 0;
+
+ /* set-up the data buffers with the requested alignment and offset. */
+ /* since this is a request/response test, default the send_width and */
+ /* recv_width to 1 and not two raj 7/94 */
+
+ if (send_width == 0) send_width = 1;
+ if (recv_width == 0) recv_width = 1;
+
+ if (send_ring == NULL) {
+ send_ring = allocate_buffer_ring(send_width,
+ req_size,
+ local_send_align,
+ local_send_offset);
+ }
+
+ if (recv_ring == NULL) {
+ recv_ring = allocate_buffer_ring(recv_width,
+ rsp_size,
+ local_recv_align,
+ local_recv_offset);
+ }
+
+ /*set up the data socket */
+ send_socket = create_xti_endpoint(loc_xti_device);
+
+ if (send_socket == INVALID_SOCKET){
+ perror("netperf: send_xti_tcp_rr: tcp stream data socket");
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"send_xti_tcp_rr: send_socket obtained...\n");
+ }
+
+ /* it would seem that with XTI, there is no implicit bind on a */
+ /* connect, so we have to make a call to t_bind. this is not */
+ /* terribly convenient, but I suppose that "standard is better */
+ /* than better" :) raj 2/95 */
+
+ if (t_bind(send_socket, NULL, NULL) == SOCKET_ERROR) {
+ t_error("send_xti_tcp_stream: t_bind");
+ exit(1);
+ }
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back.*/
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ /* Tell the remote end to do a listen. The server alters the socket */
+ /* paramters on the other side at this point, hence the reason for */
+ /* all the values being passed in the setup message. If the user did */
+ /* not specify any of the parameters, they will be passed as 0, which */
+ /* will indicate to the remote that no changes beyond the system's */
+ /* default should be used. Alignment is the exception, it will */
+ /* default to 8, which will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_XTI_TCP_RR;
+ xti_tcp_rr_request->recv_buf_size = rsr_size;
+ xti_tcp_rr_request->send_buf_size = rss_size;
+ xti_tcp_rr_request->recv_alignment = remote_recv_align;
+ xti_tcp_rr_request->recv_offset = remote_recv_offset;
+ xti_tcp_rr_request->send_alignment = remote_send_align;
+ xti_tcp_rr_request->send_offset = remote_send_offset;
+ xti_tcp_rr_request->request_size = req_size;
+ xti_tcp_rr_request->response_size = rsp_size;
+ xti_tcp_rr_request->no_delay = rem_nodelay;
+ xti_tcp_rr_request->measure_cpu = remote_cpu_usage;
+ xti_tcp_rr_request->cpu_rate = remote_cpu_rate;
+ xti_tcp_rr_request->so_rcvavoid = rem_rcvavoid;
+ xti_tcp_rr_request->so_sndavoid = rem_sndavoid;
+ if (test_time) {
+ xti_tcp_rr_request->test_length = test_time;
+ }
+ else {
+ xti_tcp_rr_request->test_length = test_trans * -1;
+ }
+
+ strcpy(xti_tcp_rr_request->xti_device, rem_xti_device);
+
+#ifdef __alpha
+
+ /* ok - even on a DEC box, strings are strings. I didn't really want */
+ /* to ntohl the words of a string. since I don't want to teach the */
+ /* send_ and recv_ _request and _response routines about the types, */
+ /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
+ /* solution would be to use XDR, but I am still leary of being able */
+ /* to find XDR libs on all platforms I want running netperf. raj */
+ {
+ int *charword;
+ int *initword;
+ int *lastword;
+
+ initword = (int *) xti_tcp_rr_request->xti_device;
+ lastword = initword + ((strlen(rem_xti_device) + 3) / 4);
+
+ for (charword = initword;
+ charword < lastword;
+ charword++) {
+
+ *charword = ntohl(*charword);
+ }
+ }
+#endif /* __alpha */
+
+ if (debug > 1) {
+ fprintf(where,"netperf: send_xti_tcp_rr: requesting TCP rr test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant */
+ /* socket parameters for this test type. We will put them back into */
+ /* the variables here so they can be displayed if desired. The */
+ /* remote will have calibrated CPU if necessary, and will have done */
+ /* all the needed set-up we will have calibrated the cpu locally */
+ /* before sending the request, and will grab the counter value right*/
+ /* after the connect returns. The remote will grab the counter right*/
+ /* after the accept call. This saves the hassle of extra messages */
+ /* being sent for the TCP tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote listen done.\n");
+ rsr_size = xti_tcp_rr_response->recv_buf_size;
+ rss_size = xti_tcp_rr_response->send_buf_size;
+ rem_nodelay = xti_tcp_rr_response->no_delay;
+ remote_cpu_usage = xti_tcp_rr_response->measure_cpu;
+ remote_cpu_rate = xti_tcp_rr_response->cpu_rate;
+ /* make sure that port numbers are in network order */
+ server.sin_port = (short)xti_tcp_rr_response->data_port_number;
+ server.sin_port = htons(server.sin_port);
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("netperf: remote error");
+
+ exit(1);
+ }
+
+ /*Connect up to the remote port on the data socket */
+ memset (&server_call, 0, sizeof(server_call));
+ server_call.addr.maxlen = sizeof(struct sockaddr_in);
+ server_call.addr.len = sizeof(struct sockaddr_in);
+ server_call.addr.buf = (char *)&server;
+
+ if (t_connect(send_socket,
+ &server_call,
+ NULL) == INVALID_SOCKET){
+ t_error("netperf: send_xti_tcp_rr: data socket connect failed");
+ printf(" port: %d\n",ntohs(server.sin_port));
+ exit(1);
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either the */
+ /* connect would have failed, or the previous response would have */
+ /* indicated a problem. I failed to see the value of the extra */
+ /* message after the accept on the remote. If it failed, we'll see it */
+ /* here. If it didn't, we might as well start pumping data. */
+
+ /* Set-up the test end conditions. For a request/response test, they */
+ /* can be either time or transaction based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ trans_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+#ifdef WANT_INTERVALS
+ if ((interval_burst) || (demo_mode)) {
+ /* zero means that we never pause, so we never should need the */
+ /* interval timer, unless we are in demo_mode */
+ start_itimer(interval_wate);
+ }
+ interval_count = interval_burst;
+ /* get the signal set for the call to sigsuspend */
+ if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &signal_set) != 0) {
+ fprintf(where,
+ "send_xti_tcp_rr: unable to get sigmask errno %d\n",
+ errno);
+ fflush(where);
+ exit(1);
+ }
+#endif /* WANT_INTERVALS */
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return false. */
+ /* When the test is controlled by byte count, the time test will */
+ /* always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. I think I */
+ /* just arbitrarily decrement trans_remaining for the timed test, but */
+ /* will not do that just yet... One other question is whether or not */
+ /* the send buffer and the receive buffer should be the same buffer. */
+
+ while ((!times_up) || (trans_remaining > 0)) {
+ /* send the request. we assume that if we use a blocking socket, */
+ /* the request will be sent at one shot. */
+
+#ifdef WANT_HISTOGRAM
+ /* timestamp just before our call to send, and then again just */
+ /* after the receive raj 8/94 */
+ HIST_timestamp(&time_one);
+#endif /* WANT_HISTOGRAM */
+
+ if((len=t_snd(send_socket,
+ send_ring->buffer_ptr,
+ req_size,
+ 0)) != req_size) {
+ if ((errno == EINTR) || (errno == 0)) {
+ /* we hit the end of a */
+ /* timed test. */
+ timed_out = 1;
+ break;
+ }
+ fprintf(where,
+ "send_xti_tcp_rr: t_snd: errno %d t_errno %d t_look 0x%.4x\n",
+ errno,
+ t_errno,
+ t_look(send_socket));
+ fflush(where);
+ exit(1);
+ }
+ send_ring = send_ring->next;
+
+ /* receive the response */
+ rsp_bytes_left = rsp_size;
+ temp_message_ptr = recv_ring->buffer_ptr;
+ while(rsp_bytes_left > 0) {
+ if((rsp_bytes_recvd=t_rcv(send_socket,
+ temp_message_ptr,
+ rsp_bytes_left,
+ &xti_flags)) == SOCKET_ERROR) {
+ if (errno == EINTR) {
+ /* We hit the end of a timed test. */
+ timed_out = 1;
+ break;
+ }
+ fprintf(where,
+ "send_xti_tcp_rr: t_rcv: errno %d t_errno %d t_look 0x%x\n",
+ errno,
+ t_errno,
+ t_look(send_socket));
+ fflush(where);
+ exit(1);
+ }
+ rsp_bytes_left -= rsp_bytes_recvd;
+ temp_message_ptr += rsp_bytes_recvd;
+ }
+ recv_ring = recv_ring->next;
+
+ if (timed_out) {
+ /* we may have been in a nested while loop - we need */
+ /* another call to break. */
+ break;
+ }
+
+#ifdef WANT_HISTOGRAM
+ HIST_timestamp(&time_two);
+ HIST_add(time_hist,delta_micro(&time_one,&time_two));
+#endif /* WANT_HISTOGRAM */
+#ifdef WANT_INTERVALS
+ if (demo_mode) {
+ units_this_tick += 1;
+ }
+ /* in this case, the interval count is the count-down couter */
+ /* to decide to sleep for a little bit */
+ if ((interval_burst) && (--interval_count == 0)) {
+ /* call sigsuspend and wait for the interval timer to get us */
+ /* out */
+ if (debug) {
+ fprintf(where,"about to suspend\n");
+ fflush(where);
+ }
+ if (sigsuspend(&signal_set) == EFAULT) {
+ fprintf(where,
+ "send_xti_udp_rr: fault with signal set!\n");
+ fflush(where);
+ exit(1);
+ }
+ interval_count = interval_burst;
+ }
+#endif /* WANT_INTERVALS */
+
+ nummessages++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug > 3) {
+ if ((nummessages % 100) == 0) {
+ fprintf(where,
+ "Transaction %d completed\n",
+ nummessages);
+ fflush(where);
+ }
+ }
+ }
+
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being */
+ /* measured? how long */
+ /* did we really run? */
+
+ /* Get the statistics from the remote end. The remote will have */
+ /* calculated service demand and all those interesting things. If it */
+ /* wasn't supposed to care, it will return obvious values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("netperf: remote error");
+
+ exit(1);
+ }
+
+ /* We now calculate what our thruput was for the test. */
+
+ bytes_xferd = (req_size * nummessages) + (rsp_size * nummessages);
+ thruput = nummessages/elapsed_time;
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+ local_cpu_utilization = calc_cpu_util(0.0);
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ local_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = -1.0;
+ local_service_demand = -1.0;
+ }
+
+ if (remote_cpu_usage) {
+ remote_cpu_utilization = xti_tcp_rr_result->cpu_util;
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ remote_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ remote_cpu_utilization,
+ xti_tcp_rr_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = -1.0;
+ remote_service_demand = -1.0;
+ }
+
+ }
+ else {
+ /* we were not measuring cpu, for the confidence stuff, we */
+ /* should make it -1.0 */
+ local_cpu_utilization = -1.0;
+ local_service_demand = -1.0;
+ remote_cpu_utilization = -1.0;
+ remote_service_demand = -1.0;
+ }
+
+ /* at this point, we want to calculate the confidence information. */
+ /* if debugging is on, calculate_confidence will print-out the */
+ /* parameters we pass it */
+
+ calculate_confidence(confidence_iteration,
+ elapsed_time,
+ thruput,
+ local_cpu_utilization,
+ remote_cpu_utilization,
+ local_service_demand,
+ remote_service_demand);
+
+
+ confidence_iteration++;
+
+ /* we are now done with the socket, so close it */
+ t_close(send_socket);
+
+ }
+
+ retrieve_confident_values(&elapsed_time,
+ &thruput,
+ &local_cpu_utilization,
+ &remote_cpu_utilization,
+ &local_service_demand,
+ &remote_service_demand);
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ if (confidence < 0) {
+ /* we did not hit confidence, but were we asked to look for it? */
+ if (iteration_max > 1) {
+ display_confidence();
+ }
+ }
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ local_cpu_method = format_cpu_method(cpu_method);
+ remote_cpu_method = format_cpu_method(xti_tcp_rr_result->cpu_method);
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand,
+ local_cpu_method);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand,
+ remote_cpu_method);
+ }
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,
+ cpu_title,
+ local_cpu_method,
+ remote_cpu_method);
+ }
+
+ fprintf(where,
+ cpu_fmt_1_line_1, /* the format string */
+ lss_size, /* local sendbuf size */
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* guess */
+ elapsed_time, /* how long was the test */
+ thruput,
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand); /* remote service demand */
+ fprintf(where,
+ cpu_fmt_1_line_2,
+ rss_size,
+ rsr_size);
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ thruput);
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,tput_title,format_units());
+ }
+
+ fprintf(where,
+ tput_fmt_1_line_1, /* the format string */
+ lss_size,
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* how large were the responses */
+ elapsed_time, /* how long did it take */
+ thruput);
+ fprintf(where,
+ tput_fmt_1_line_2,
+ rss_size, /* remote recvbuf size */
+ rsr_size);
+
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ /* how to handle the verbose information in the presence of */
+ /* confidence intervals is yet to be determined... raj 11/94 */
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* TCP statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ fprintf(where,
+ ksink_fmt,
+ local_send_align,
+ remote_recv_offset,
+ local_send_offset,
+ remote_recv_offset);
+
+#ifdef WANT_HISTOGRAM
+ fprintf(where,"\nHistogram of request/response times\n");
+ fflush(where);
+ HIST_report(time_hist);
+#endif /* WANT_HISTOGRAM */
+
+ }
+
+}
+
+void
+send_xti_udp_stream(char remote_host[])
+{
+ /**********************************************************************/
+ /* */
+ /* UDP Unidirectional Send Test */
+ /* */
+ /**********************************************************************/
+ char *tput_title = "\
+Socket Message Elapsed Messages \n\
+Size Size Time Okay Errors Throughput\n\
+bytes bytes secs # # %s/sec\n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1 = "\
+%6d %6d %-7.2f %7d %6d %7.2f\n\
+%6d %-7.2f %7d %7.2f\n\n";
+
+
+ char *cpu_title = "\
+Socket Message Elapsed Messages CPU Service\n\
+Size Size Time Okay Errors Throughput Util Demand\n\
+bytes bytes secs # # %s/sec %% %c%c us/KB\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.2f %c\n";
+
+ char *cpu_fmt_1 = "\
+%6d %6d %-7.2f %7d %6d %7.1f %-6.2f %-6.3f\n\
+%6d %-7.2f %7d %7.1f %-6.2f %-6.3f\n\n";
+
+ unsigned int messages_recvd;
+ unsigned int messages_sent;
+ unsigned int failed_sends;
+
+ float elapsed_time,
+ recv_elapsed,
+ local_cpu_utilization,
+ remote_cpu_utilization;
+
+ float local_service_demand, remote_service_demand;
+ double local_thruput, remote_thruput;
+ double bytes_sent;
+ double bytes_recvd;
+
+
+ int len;
+ int *message_int_ptr;
+ struct ring_elt *send_ring;
+ SOCKET data_socket;
+
+ unsigned int sum_messages_sent;
+ unsigned int sum_messages_recvd;
+ unsigned int sum_failed_sends;
+ double sum_local_thruput;
+
+#ifdef WANT_INTERVALS
+ int interval_count;
+ sigset_t signal_set;
+#endif /* WANT_INTERVALS */
+
+ struct hostent *hp;
+ struct sockaddr_in server;
+ unsigned int addr;
+
+ struct t_unitdata unitdata;
+
+ struct xti_udp_stream_request_struct *xti_udp_stream_request;
+ struct xti_udp_stream_response_struct *xti_udp_stream_response;
+ struct xti_udp_stream_results_struct *xti_udp_stream_results;
+
+ xti_udp_stream_request =
+ (struct xti_udp_stream_request_struct *)netperf_request.content.test_specific_data;
+ xti_udp_stream_response =
+ (struct xti_udp_stream_response_struct *)netperf_response.content.test_specific_data;
+ xti_udp_stream_results =
+ (struct xti_udp_stream_results_struct *)netperf_response.content.test_specific_data;
+
+#ifdef WANT_HISTOGRAM
+ time_hist = HIST_new();
+#endif /* WANT_HISTOGRAM */
+
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ bzero((char *)&server,
+ sizeof(server));
+
+ /* it would seem that while HP-UX will allow an IP address (as a */
+ /* string) in a call to gethostbyname, other, less enlightened */
+ /* systems do not. fix from awjacks@ca.sandia.gov raj 10/95 */
+ /* order changed to check for IP address first. raj 7/96 */
+
+ if ((addr = inet_addr(remote_host)) == SOCKET_ERROR) {
+ /* it was not an IP address, try it as a name */
+ if ((hp = gethostbyname(remote_host)) == NULL) {
+ /* we have no idea what it is */
+ fprintf(where,
+ "establish_control: could not resolve the destination %s\n",
+ remote_host);
+ fflush(where);
+ exit(1);
+ }
+ else {
+ /* it was a valid remote_host */
+ bcopy(hp->h_addr,
+ (char *)&server.sin_addr,
+ hp->h_length);
+ server.sin_family = hp->h_addrtype;
+ }
+ }
+ else {
+ /* it was a valid IP address */
+ server.sin_addr.s_addr = addr;
+ server.sin_family = AF_INET;
+ }
+
+ if ( print_headers ) {
+ fprintf(where,"UDP UNIDIRECTIONAL SEND TEST");
+ fprintf(where," to %s", remote_host);
+ if (iteration_max > 1) {
+ fprintf(where,
+ " : +/-%3.1f%% @ %2d%% conf.",
+ interval/0.02,
+ confidence_level);
+ }
+ if (loc_sndavoid ||
+ loc_rcvavoid ||
+ rem_sndavoid ||
+ rem_rcvavoid) {
+ fprintf(where," : copy avoidance");
+ }
+#ifdef WANT_HISTOGRAM
+ fprintf(where," : histogram");
+#endif /* WANT_HISTOGRAM */
+#ifdef WANT_INTERVALS
+ fprintf(where," : interval");
+#endif /* WANT_INTERVALS */
+#ifdef DIRTY
+ fprintf(where," : dirty data");
+#endif /* DIRTY */
+ fprintf(where,"\n");
+ }
+
+ send_ring = NULL;
+ confidence_iteration = 1;
+ init_stat();
+ sum_messages_sent = 0;
+ sum_messages_recvd = 0;
+ sum_failed_sends = 0;
+ sum_local_thruput = 0.0;
+
+ /* we have a great-big while loop which controls the number of times */
+ /* we run a particular test. this is for the calculation of a */
+ /* confidence interval (I really should have stayed awake during */
+ /* probstats :). If the user did not request confidence measurement */
+ /* (no confidence is the default) then we will only go though the */
+ /* loop once. the confidence stuff originates from the folks at IBM */
+
+ while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
+ (confidence_iteration <= iteration_min)) {
+
+ /* initialize a few counters. we have to remember that we might be */
+ /* going through the loop more than once. */
+ messages_sent = 0;
+ messages_recvd = 0;
+ failed_sends = 0;
+ times_up = 0;
+
+ /*set up the data socket */
+ data_socket = create_xti_endpoint(loc_xti_device);
+
+ if (data_socket == INVALID_SOCKET) {
+ perror("send_xti_udp_stream: create_xti_endpoint");
+ exit(1);
+ }
+
+ if (t_bind(data_socket, NULL, NULL) == SOCKET_ERROR) {
+ t_error("send_xti_udp_stream: t_bind");
+ exit(1);
+ }
+
+ /* now, we want to see if we need to set the send_size */
+ if (send_size == 0) {
+ if (lss_size > 0) {
+ send_size = lss_size;
+ }
+ else {
+ send_size = 4096;
+ }
+ }
+
+ /* set-up the data buffer with the requested alignment and offset, */
+ /* most of the numbers here are just a hack to pick something nice */
+ /* and big in an attempt to never try to send a buffer a second time */
+ /* before it leaves the node...unless the user set the width */
+ /* explicitly. */
+ if (send_width == 0) send_width = 32;
+
+ if (send_ring == NULL ) {
+ send_ring = allocate_buffer_ring(send_width,
+ send_size,
+ local_send_align,
+ local_send_offset);
+ }
+
+
+ /* if the user supplied a cpu rate, this call will complete rather */
+ /* quickly, otherwise, the cpu rate will be retured to us for */
+ /* possible display. The Library will keep it's own copy of this data */
+ /* for use elsewhere. We will only display it. (Does that make it */
+ /* "opaque" to us?) */
+
+ if (local_cpu_usage)
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+
+ /* Tell the remote end to set up the data connection. The server */
+ /* sends back the port number and alters the socket parameters there. */
+ /* Of course this is a datagram service so no connection is actually */
+ /* set up, the server just sets up the socket and binds it. */
+
+ netperf_request.content.request_type = DO_XTI_UDP_STREAM;
+ xti_udp_stream_request->recv_buf_size = rsr_size;
+ xti_udp_stream_request->message_size = send_size;
+ xti_udp_stream_request->recv_alignment = remote_recv_align;
+ xti_udp_stream_request->recv_offset = remote_recv_offset;
+ xti_udp_stream_request->measure_cpu = remote_cpu_usage;
+ xti_udp_stream_request->cpu_rate = remote_cpu_rate;
+ xti_udp_stream_request->test_length = test_time;
+ xti_udp_stream_request->so_rcvavoid = rem_rcvavoid;
+ xti_udp_stream_request->so_sndavoid = rem_sndavoid;
+
+ strcpy(xti_udp_stream_request->xti_device, rem_xti_device);
+
+#ifdef __alpha
+
+ /* ok - even on a DEC box, strings are strings. I didn't really want */
+ /* to ntohl the words of a string. since I don't want to teach the */
+ /* send_ and recv_ _request and _response routines about the types, */
+ /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
+ /* solution would be to use XDR, but I am still leary of being able */
+ /* to find XDR libs on all platforms I want running netperf. raj */
+ {
+ int *charword;
+ int *initword;
+ int *lastword;
+
+ initword = (int *) xti_udp_stream_request->xti_device;
+ lastword = initword + ((strlen(rem_xti_device) + 3) / 4);
+
+ for (charword = initword;
+ charword < lastword;
+ charword++) {
+
+ *charword = ntohl(*charword);
+ }
+ }
+#endif /* __alpha */
+
+ send_request();
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"send_xti_udp_stream: remote data connection done.\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("send_xti_udp_stream: error on remote");
+ exit(1);
+ }
+
+ /* Place the port number returned by the remote into the sockaddr */
+ /* structure so our sends can be sent to the correct place. Also get */
+ /* some of the returned socket buffer information for user display. */
+
+ /* make sure that port numbers are in the proper order */
+ server.sin_port = (short)xti_udp_stream_response->data_port_number;
+ server.sin_port = htons(server.sin_port);
+ rsr_size = xti_udp_stream_response->recv_buf_size;
+ rss_size = xti_udp_stream_response->send_buf_size;
+ remote_cpu_rate = xti_udp_stream_response->cpu_rate;
+
+ /* it would seem that XTI does not allow the expedient of */
+ /* "connecting" a UDP end-point the way BSD does. so, we will do */
+ /* everything with t_sndudata and t_rcvudata. Our "virtual" */
+ /* connect here will be to assign the destination portion of the */
+ /* t_unitdata struct here, where we would have otherwise called */
+ /* t_connect() raj 3/95 */
+
+ memset (&unitdata, 0, sizeof(unitdata));
+ unitdata.addr.maxlen = sizeof(struct sockaddr_in);
+ unitdata.addr.len = sizeof(struct sockaddr_in);
+ unitdata.addr.buf = (char *)&server;
+
+ /* we don't use any options, so might as well set that part here */
+ /* too */
+
+ unitdata.opt.maxlen = 0;
+ unitdata.opt.len = 0;
+ unitdata.opt.buf = NULL;
+
+ /* we need to initialize the send buffer for the first time as */
+ /* well since we move to the next pointer after the send call. */
+
+ unitdata.udata.maxlen = send_size;
+ unitdata.udata.len = send_size;
+ unitdata.udata.buf = send_ring->buffer_ptr;
+
+ /* set up the timer to call us after test_time. one of these days, */
+ /* it might be nice to figure-out a nice reliable way to have the */
+ /* test controlled by a byte count as well, but since UDP is not */
+ /* reliable, that could prove difficult. so, in the meantime, we */
+ /* only allow a XTI_UDP_STREAM test to be a timed test. */
+
+ if (test_time) {
+ times_up = 0;
+ start_timer(test_time);
+ }
+ else {
+ fprintf(where,"Sorry, XTI_UDP_STREAM tests must be timed.\n");
+ fflush(where);
+ exit(1);
+ }
+
+ /* Get the start count for the idle counter and the start time */
+
+ cpu_start(local_cpu_usage);
+
+#ifdef WANT_INTERVALS
+ if ((interval_burst) || (demo_mode)) {
+ /* zero means that we never pause, so we never should need the */
+ /* interval timer, unless we are in demo_mode */
+ start_itimer(interval_wate);
+ }
+ interval_count = interval_burst;
+ /* get the signal set for the call to sigsuspend */
+ if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &signal_set) != 0) {
+ fprintf(where,
+ "send_xti_udp_stream: unable to get sigmask errno %d\n",
+ errno);
+ fflush(where);
+ exit(1);
+ }
+#endif /* WANT_INTERVALS */
+
+ /* Send datagrams like there was no tomorrow. at somepoint it might */
+ /* be nice to set this up so that a quantity of bytes could be sent, */
+ /* but we still need some sort of end of test trigger on the receive */
+ /* side. that could be a select with a one second timeout, but then */
+ /* if there is a test where none of the data arrives for awile and */
+ /* then starts again, we would end the test too soon. something to */
+ /* think about... */
+ while (!times_up) {
+
+#ifdef DIRTY
+ /* we want to dirty some number of consecutive integers in the buffer */
+ /* we are about to send. we may also want to bring some number of */
+ /* them cleanly into the cache. The clean ones will follow any dirty */
+ /* ones into the cache. */
+
+ access_buffer(send_ring->buffer_ptr,
+ send_size,
+ loc_dirty_count,
+ loc_clean_count);
+
+#endif /* DIRTY */
+
+#ifdef WANT_HISTOGRAM
+ HIST_timestamp(&time_one);
+#endif /* WANT_HISTOGRAM */
+
+ if ((t_sndudata(data_socket,
+ &unitdata)) != 0) {
+ if (errno == EINTR)
+ break;
+ if (errno == ENOBUFS) {
+ failed_sends++;
+ continue;
+ }
+ perror("xti_udp_send: data send error");
+ t_error("xti_udp_send: data send error");
+ exit(1);
+ }
+ messages_sent++;
+
+ /* now we want to move our pointer to the next position in the */
+ /* data buffer...and update the unitdata structure */
+
+ send_ring = send_ring->next;
+ unitdata.udata.buf = send_ring->buffer_ptr;
+
+#ifdef WANT_HISTOGRAM
+ /* get the second timestamp */
+ HIST_timestamp(&time_two);
+ HIST_add(time_hist,delta_micro(&time_one,&time_two));
+#endif /* WANT_HISTOGRAM */
+#ifdef WANT_INTERVALS
+ if (demo_mode) {
+ units_this_tick += send_size;
+ }
+ /* in this case, the interval count is the count-down couter */
+ /* to decide to sleep for a little bit */
+ if ((interval_burst) && (--interval_count == 0)) {
+ /* call sigsuspend and wait for the interval timer to get us */
+ /* out */
+ if (debug) {
+ fprintf(where,"about to suspend\n");
+ fflush(where);
+ }
+ if (sigsuspend(&signal_set) == EFAULT) {
+ fprintf(where,
+ "send_xti_udp_stream: fault with signal set!\n");
+ fflush(where);
+ exit(1);
+ }
+ interval_count = interval_burst;
+ }
+#endif /* WANT_INTERVALS */
+
+ }
+
+ /* This is a timed test, so the remote will be returning to us after */
+ /* a time. We should not need to send any "strange" messages to tell */
+ /* the remote that the test is completed, unless we decide to add a */
+ /* number of messages to the test. */
+
+ /* the test is over, so get stats and stuff */
+ cpu_stop(local_cpu_usage,
+ &elapsed_time);
+
+ /* Get the statistics from the remote end */
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"send_xti_udp_stream: remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("send_xti_udp_stream: error on remote");
+ exit(1);
+ }
+
+ bytes_sent = (double) send_size * (double) messages_sent;
+ local_thruput = calc_thruput(bytes_sent);
+
+ messages_recvd = xti_udp_stream_results->messages_recvd;
+ bytes_recvd = (double) send_size * (double) messages_recvd;
+
+ /* we asume that the remote ran for as long as we did */
+
+ remote_thruput = calc_thruput(bytes_recvd);
+
+ /* print the results for this socket and message size */
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) We pass zeros for the local */
+ /* cpu utilization and elapsed time to tell the routine to use */
+ /* the libraries own values for those. */
+ if (local_cpu_usage) {
+ local_cpu_utilization = calc_cpu_util(0.0);
+ /* shouldn't this really be based on bytes_recvd, since that is */
+ /* the effective throughput of the test? I think that it should, */
+ /* so will make the change raj 11/94 */
+ local_service_demand = calc_service_demand(bytes_recvd,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = -1.0;
+ local_service_demand = -1.0;
+ }
+
+ /* The local calculations could use variables being kept by */
+ /* the local netlib routines. The remote calcuations need to */
+ /* have a few things passed to them. */
+ if (remote_cpu_usage) {
+ remote_cpu_utilization = xti_udp_stream_results->cpu_util;
+ remote_service_demand = calc_service_demand(bytes_recvd,
+ 0.0,
+ remote_cpu_utilization,
+ xti_udp_stream_results->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = -1.0;
+ remote_service_demand = -1.0;
+ }
+ }
+ else {
+ /* we were not measuring cpu, for the confidence stuff, we */
+ /* should make it -1.0 */
+ local_cpu_utilization = -1.0;
+ local_service_demand = -1.0;
+ remote_cpu_utilization = -1.0;
+ remote_service_demand = -1.0;
+ }
+
+ /* at this point, we want to calculate the confidence information. */
+ /* if debugging is on, calculate_confidence will print-out the */
+ /* parameters we pass it */
+
+ calculate_confidence(confidence_iteration,
+ elapsed_time,
+ remote_thruput,
+ local_cpu_utilization,
+ remote_cpu_utilization,
+ local_service_demand,
+ remote_service_demand);
+
+ /* since the routine calculate_confidence is rather generic, and */
+ /* we have a few other parms of interest, we will do a little work */
+ /* here to caclulate their average. */
+ sum_messages_sent += messages_sent;
+ sum_messages_recvd += messages_recvd;
+ sum_failed_sends += failed_sends;
+ sum_local_thruput += local_thruput;
+
+ confidence_iteration++;
+
+ /* this datapoint is done, so we don't need the socket any longer */
+ close(data_socket);
+
+ }
+
+ /* we should reach this point once the test is finished */
+
+ retrieve_confident_values(&elapsed_time,
+ &remote_thruput,
+ &local_cpu_utilization,
+ &remote_cpu_utilization,
+ &local_service_demand,
+ &remote_service_demand);
+
+ /* some of the interesting values aren't covered by the generic */
+ /* confidence routine */
+ messages_sent = sum_messages_sent / (confidence_iteration -1);
+ messages_recvd = sum_messages_recvd / (confidence_iteration -1);
+ failed_sends = sum_failed_sends / (confidence_iteration -1);
+ local_thruput = sum_local_thruput / (confidence_iteration -1);
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+
+ if (confidence < 0) {
+ /* we did not hit confidence, but were we asked to look for it? */
+ if (iteration_max > 1) {
+ display_confidence();
+ }
+ }
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ local_cpu_method = format_cpu_method(cpu_method);
+ remote_cpu_method = format_cpu_method(xti_udp_stream_results->cpu_method);
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand,
+ local_cpu_method);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand,
+ local_cpu_method);
+ }
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,
+ cpu_title,
+ format_units(),
+ local_cpu_method,
+ remote_cpu_method);
+ }
+
+ fprintf(where,
+ cpu_fmt_1, /* the format string */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long was the test */
+ messages_sent,
+ failed_sends,
+ local_thruput, /* what was the xfer rate */
+ local_cpu_utilization, /* local cpu */
+ local_service_demand, /* local service demand */
+ rsr_size,
+ elapsed_time,
+ messages_recvd,
+ remote_thruput,
+ remote_cpu_utilization, /* remote cpu */
+ remote_service_demand); /* remote service demand */
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ local_thruput);
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,tput_title,format_units());
+ }
+ fprintf(where,
+ tput_fmt_1, /* the format string */
+ lss_size, /* local sendbuf size */
+ send_size, /* how large were the sends */
+ elapsed_time, /* how long did it take */
+ messages_sent,
+ failed_sends,
+ local_thruput,
+ rsr_size, /* remote recvbuf size */
+ elapsed_time,
+ messages_recvd,
+ remote_thruput);
+ break;
+ }
+ }
+
+ fflush(where);
+#ifdef WANT_HISTOGRAM
+ if (verbosity > 1) {
+ fprintf(where,"\nHistogram of time spent in send() call\n");
+ fflush(where);
+ HIST_report(time_hist);
+ }
+#endif /* WANT_HISTOGRAM */
+
+}
+
+
+ /* this routine implements the receive side (netserver) of the */
+ /* XTI_UDP_STREAM performance test. */
+
+void
+recv_xti_udp_stream()
+{
+ struct ring_elt *recv_ring;
+
+ struct t_bind bind_req, bind_resp;
+ struct t_unitdata unitdata;
+ int flags = 0;
+
+ struct sockaddr_in myaddr_in;
+ struct sockaddr_in fromaddr_in;
+
+ SOCKET s_data;
+ int addrlen;
+ unsigned int bytes_received = 0;
+ float elapsed_time;
+
+ unsigned int message_size;
+ unsigned int messages_recvd = 0;
+
+ struct xti_udp_stream_request_struct *xti_udp_stream_request;
+ struct xti_udp_stream_response_struct *xti_udp_stream_response;
+ struct xti_udp_stream_results_struct *xti_udp_stream_results;
+
+ xti_udp_stream_request =
+ (struct xti_udp_stream_request_struct *)netperf_request.content.test_specific_data;
+ xti_udp_stream_response =
+ (struct xti_udp_stream_response_struct *)netperf_response.content.test_specific_data;
+ xti_udp_stream_results =
+ (struct xti_udp_stream_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_xti_udp_stream: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug > 1) {
+ fprintf(where,"recv_xti_udp_stream: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = XTI_UDP_STREAM_RESPONSE;
+
+ if (debug > 2) {
+ fprintf(where,"recv_xti_udp_stream: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* We now alter the message_ptr variable to be at the desired */
+ /* alignment with the desired offset. */
+
+ if (debug > 1) {
+ fprintf(where,"recv_xti_udp_stream: requested alignment of %d\n",
+ xti_udp_stream_request->recv_alignment);
+ fflush(where);
+ }
+
+ if (recv_width == 0) recv_width = 1;
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ xti_udp_stream_request->message_size,
+ xti_udp_stream_request->recv_alignment,
+ xti_udp_stream_request->recv_offset);
+
+ if (debug > 1) {
+ fprintf(where,"recv_xti_udp_stream: receive alignment and offset set...\n");
+ fflush(where);
+ }
+
+ /* Let's clear-out our sockaddr for the sake of cleanlines. Then we */
+ /* can put in OUR values !-) At some point, we may want to nail this */
+ /* socket to a particular network-level address, but for now, */
+ /* INADDR_ANY should be just fine. */
+
+ bzero((char *)&myaddr_in,
+ sizeof(myaddr_in));
+ myaddr_in.sin_family = AF_INET;
+ myaddr_in.sin_addr.s_addr = INADDR_ANY;
+ myaddr_in.sin_port = 0;
+
+ /* Grab a socket to listen on, and then listen on it. */
+
+ if (debug > 1) {
+ fprintf(where,"recv_xti_udp_stream: grabbing a socket...\n");
+ fflush(where);
+ }
+
+ /* create_xti_endpoint expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lsr_size = xti_udp_stream_request->recv_buf_size;
+ loc_rcvavoid = xti_udp_stream_request->so_rcvavoid;
+ loc_sndavoid = xti_udp_stream_request->so_sndavoid;
+
+#ifdef __alpha
+
+ /* ok - even on a DEC box, strings are strings. I din't really want */
+ /* to ntohl the words of a string. since I don't want to teach the */
+ /* send_ and recv_ _request and _response routines about the types, */
+ /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
+ /* solution would be to use XDR, but I am still leary of being able */
+ /* to find XDR libs on all platforms I want running netperf. raj */
+ {
+ int *charword;
+ int *initword;
+ int *lastword;
+
+ initword = (int *) xti_udp_stream_request->xti_device;
+ lastword = initword + ((xti_udp_stream_request->dev_name_len + 3) / 4);
+
+ for (charword = initword;
+ charword < lastword;
+ charword++) {
+
+ *charword = htonl(*charword);
+ }
+ }
+
+#endif /* __alpha */
+
+ s_data = create_xti_endpoint(xti_udp_stream_request->xti_device);
+
+ if (s_data == INVALID_SOCKET) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ /* Let's get an address assigned to this socket so we can tell the */
+ /* initiator how to reach the data socket. There may be a desire to */
+ /* nail this socket to a specific IP address in a multi-homed, */
+ /* multi-connection situation, but for now, we'll ignore the issue */
+ /* and concentrate on single connection testing. */
+
+ bind_req.addr.maxlen = sizeof(struct sockaddr_in);
+ bind_req.addr.len = sizeof(struct sockaddr_in);
+ bind_req.addr.buf = (char *)&myaddr_in;
+ bind_req.qlen = 1;
+
+ bind_resp.addr.maxlen = sizeof(struct sockaddr_in);
+ bind_resp.addr.len = sizeof(struct sockaddr_in);
+ bind_resp.addr.buf = (char *)&myaddr_in;
+ bind_resp.qlen = 1;
+
+ if (t_bind(s_data,
+ &bind_req,
+ &bind_resp) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = t_errno;
+ send_response();
+
+ exit(1);
+ }
+
+ xti_udp_stream_response->test_length =
+ xti_udp_stream_request->test_length;
+
+ /* Now myaddr_in contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ xti_udp_stream_response->data_port_number =
+ (int) ntohs(myaddr_in.sin_port);
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a -1 to */
+ /* the initiator. */
+
+ xti_udp_stream_response->cpu_rate = 0.0; /* assume no cpu */
+ xti_udp_stream_response->measure_cpu = 0;
+ if (xti_udp_stream_request->measure_cpu) {
+ /* We will pass the rate into the calibration routine. If the */
+ /* user did not specify one, it will be 0.0, and we will do a */
+ /* "real" calibration. Otherwise, all it will really do is */
+ /* store it away... */
+ xti_udp_stream_response->measure_cpu = 1;
+ xti_udp_stream_response->cpu_rate =
+ calibrate_local_cpu(xti_udp_stream_request->cpu_rate);
+ }
+
+ message_size = xti_udp_stream_request->message_size;
+ test_time = xti_udp_stream_request->test_length;
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ xti_udp_stream_response->send_buf_size = lss_size;
+ xti_udp_stream_response->recv_buf_size = lsr_size;
+ xti_udp_stream_response->so_rcvavoid = loc_rcvavoid;
+ xti_udp_stream_response->so_sndavoid = loc_sndavoid;
+
+ /* since we are going to call t_rcvudata() instead of t_rcv() we */
+ /* need to init the unitdata structure raj 3/95 */
+
+ unitdata.addr.maxlen = sizeof(fromaddr_in);
+ unitdata.addr.len = sizeof(fromaddr_in);
+ unitdata.addr.buf = (char *)&fromaddr_in;
+
+ unitdata.opt.maxlen = 0;
+ unitdata.opt.len = 0;
+ unitdata.opt.buf = NULL;
+
+ unitdata.udata.maxlen = xti_udp_stream_request->message_size;
+ unitdata.udata.len = xti_udp_stream_request->message_size;
+ unitdata.udata.buf = recv_ring->buffer_ptr;
+
+ send_response();
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(xti_udp_stream_request->measure_cpu);
+
+ /* The loop will exit when the timer pops, or if we happen to recv a */
+ /* message of less than send_size bytes... */
+
+ times_up = 0;
+ start_timer(test_time + PAD_TIME);
+
+ if (debug) {
+ fprintf(where,"recv_xti_udp_stream: about to enter inner sanctum.\n");
+ fflush(where);
+ }
+
+ while (!times_up) {
+#ifdef RAJ_DEBUG
+ if (debug) {
+ fprintf(where,"t_rcvudata, errno %d, t_errno %d",
+ errno,
+ t_errno);
+ fprintf(where," after %d messages\n",messages_recvd);
+ fprintf(where,"addrmax %d addrlen %d addrbuf %x\n",
+ unitdata.addr.maxlen,
+ unitdata.addr.len,
+ unitdata.addr.buf);
+ fprintf(where,"optmax %d optlen %d optbuf %x\n",
+ unitdata.opt.maxlen,
+ unitdata.opt.len,
+ unitdata.opt.buf);
+ fprintf(where,"udatamax %d udatalen %d udatabuf %x\n",
+ unitdata.udata.maxlen,
+ unitdata.udata.len,
+ unitdata.udata.buf);
+ fflush(where);
+ }
+#endif /* RAJ_DEBUG */
+ if (t_rcvudata(s_data,
+ &unitdata,
+ &flags) != 0) {
+ if (errno == TNODATA) {
+ continue;
+ }
+ if (errno != EINTR) {
+ netperf_response.content.serv_errno = t_errno;
+ send_response();
+ exit(1);
+ }
+ break;
+ }
+ messages_recvd++;
+ recv_ring = recv_ring->next;
+ unitdata.udata.buf = recv_ring->buffer_ptr;
+ }
+
+ if (debug) {
+ fprintf(where,"recv_xti_udp_stream: got %d messages.\n",messages_recvd);
+ fflush(where);
+ }
+
+
+ /* The loop now exits due timer or < send_size bytes received. */
+
+ cpu_stop(xti_udp_stream_request->measure_cpu,&elapsed_time);
+
+ if (times_up) {
+ /* we ended on a timer, subtract the PAD_TIME */
+ elapsed_time -= (float)PAD_TIME;
+ }
+ else {
+ stop_timer();
+ }
+
+ if (debug) {
+ fprintf(where,"recv_xti_udp_stream: test ended in %f seconds.\n",elapsed_time);
+ fflush(where);
+ }
+
+ bytes_received = (messages_recvd * message_size);
+
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_xti_udp_stream: got %d bytes\n",
+ bytes_received);
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = XTI_UDP_STREAM_RESULTS;
+ xti_udp_stream_results->bytes_received = bytes_received;
+ xti_udp_stream_results->messages_recvd = messages_recvd;
+ xti_udp_stream_results->elapsed_time = elapsed_time;
+ xti_udp_stream_results->cpu_method = cpu_method;
+ if (xti_udp_stream_request->measure_cpu) {
+ xti_udp_stream_results->cpu_util = calc_cpu_util(elapsed_time);
+ }
+ else {
+ xti_udp_stream_results->cpu_util = -1.0;
+ }
+
+ if (debug > 1) {
+ fprintf(where,
+ "recv_xti_udp_stream: test complete, sending results.\n");
+ fflush(where);
+ }
+
+ send_response();
+
+}
+
+void send_xti_udp_rr(char remote_host[])
+{
+
+ char *tput_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans.\n\
+Send Recv Size Size Time Rate \n\
+bytes Bytes bytes bytes secs. per sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %7.2f \n";
+ char *tput_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *cpu_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem\n\
+Send Recv Size Size Time Rate local remote local remote\n\
+bytes bytes bytes bytes secs. per sec %% %c %% %c us/Tr us/Tr\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f %c\n";
+
+ char *cpu_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %-6.2f %-6.2f %-6.2f %-6.3f %-6.3f\n";
+
+ char *cpu_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *ksink_fmt = "\
+Alignment Offset\n\
+Local Remote Local Remote\n\
+Send Recv Send Recv\n\
+%5d %5d %5d %5d\n";
+
+
+ float elapsed_time;
+
+ struct ring_elt *send_ring;
+ struct ring_elt *recv_ring;
+
+ struct t_bind bind_req, bind_resp;
+ struct t_unitdata unitdata;
+ struct t_unitdata send_unitdata;
+ struct t_unitdata recv_unitdata;
+ int flags = 0;
+
+ int len;
+ int nummessages;
+ SOCKET send_socket;
+ int trans_remaining;
+ int bytes_xferd;
+
+ int rsp_bytes_recvd;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+ double thruput;
+
+ struct hostent *hp;
+ struct sockaddr_in server, myaddr_in;
+ unsigned int addr;
+ int addrlen;
+
+ struct xti_udp_rr_request_struct *xti_udp_rr_request;
+ struct xti_udp_rr_response_struct *xti_udp_rr_response;
+ struct xti_udp_rr_results_struct *xti_udp_rr_result;
+
+#ifdef WANT_INTERVALS
+ int interval_count;
+ sigset_t signal_set;
+#endif /* WANT_INTERVALS */
+
+ xti_udp_rr_request =
+ (struct xti_udp_rr_request_struct *)netperf_request.content.test_specific_data;
+ xti_udp_rr_response =
+ (struct xti_udp_rr_response_struct *)netperf_response.content.test_specific_data;
+ xti_udp_rr_result =
+ (struct xti_udp_rr_results_struct *)netperf_response.content.test_specific_data;
+
+#ifdef WANT_HISTOGRAM
+ time_hist = HIST_new();
+#endif
+
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ bzero((char *)&server,
+ sizeof(server));
+
+ /* it would seem that while HP-UX will allow an IP address (as a */
+ /* string) in a call to gethostbyname, other, less enlightened */
+ /* systems do not. fix from awjacks@ca.sandia.gov raj 10/95 */
+ /* order changed to check for IP address first. raj 7/96 */
+
+ if ((addr = inet_addr(remote_host)) == SOCKET_ERROR) {
+ /* it was not an IP address, try it as a name */
+ if ((hp = gethostbyname(remote_host)) == NULL) {
+ /* we have no idea what it is */
+ fprintf(where,
+ "establish_control: could not resolve the destination %s\n",
+ remote_host);
+ fflush(where);
+ exit(1);
+ }
+ else {
+ /* it was a valid remote_host */
+ bcopy(hp->h_addr,
+ (char *)&server.sin_addr,
+ hp->h_length);
+ server.sin_family = hp->h_addrtype;
+ }
+ }
+ else {
+ /* it was a valid IP address */
+ server.sin_addr.s_addr = addr;
+ server.sin_family = AF_INET;
+ }
+
+ if ( print_headers ) {
+ fprintf(where,"XTI UDP REQUEST/RESPONSE TEST");
+ fprintf(where," to %s", remote_host);
+ if (iteration_max > 1) {
+ fprintf(where,
+ " : +/-%3.1f%% @ %2d%% conf.",
+ interval/0.02,
+ confidence_level);
+ }
+ if (loc_sndavoid ||
+ loc_rcvavoid ||
+ rem_sndavoid ||
+ rem_rcvavoid) {
+ fprintf(where," : copy avoidance");
+ }
+#ifdef WANT_HISTOGRAM
+ fprintf(where," : histogram");
+#endif /* WANT_HISTOGRAM */
+#ifdef WANT_INTERVALS
+ fprintf(where," : interval");
+#endif /* WANT_INTERVALS */
+#ifdef DIRTY
+ fprintf(where," : dirty data");
+#endif /* DIRTY */
+ fprintf(where,"\n");
+ }
+
+ /* initialize a few counters */
+
+ send_ring = NULL;
+ recv_ring = NULL;
+ nummessages = 0;
+ bytes_xferd = 0;
+ times_up = 0;
+ confidence_iteration = 1;
+ init_stat();
+
+
+ /* we have a great-big while loop which controls the number of times */
+ /* we run a particular test. this is for the calculation of a */
+ /* confidence interval (I really should have stayed awake during */
+ /* probstats :). If the user did not request confidence measurement */
+ /* (no confidence is the default) then we will only go though the */
+ /* loop once. the confidence stuff originates from the folks at IBM */
+
+ while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
+ (confidence_iteration <= iteration_min)) {
+
+ nummessages = 0;
+ bytes_xferd = 0.0;
+ times_up = 0;
+ trans_remaining = 0;
+
+ /* set-up the data buffers with the requested alignment and offset */
+
+ if (send_width == 0) send_width = 1;
+ if (recv_width == 0) recv_width = 1;
+
+ if (send_ring == NULL) {
+ send_ring = allocate_buffer_ring(send_width,
+ req_size,
+ local_send_align,
+ local_send_offset);
+ }
+
+ if (recv_ring == NULL) {
+ recv_ring = allocate_buffer_ring(recv_width,
+ rsp_size,
+ local_recv_align,
+ local_recv_offset);
+ }
+
+ /* since we are going to call t_rcvudata() instead of t_rcv() we */
+ /* need to init the unitdata structure raj 8/95 */
+
+ memset (&recv_unitdata, 0, sizeof(recv_unitdata));
+ recv_unitdata.addr.maxlen = sizeof(struct sockaddr_in);
+ recv_unitdata.addr.len = sizeof(struct sockaddr_in);
+ recv_unitdata.addr.buf = (char *)&server;
+
+ recv_unitdata.opt.maxlen = 0;
+ recv_unitdata.opt.len = 0;
+ recv_unitdata.opt.buf = NULL;
+
+ recv_unitdata.udata.maxlen = rsp_size;
+ recv_unitdata.udata.len = rsp_size;
+ recv_unitdata.udata.buf = recv_ring->buffer_ptr;
+
+ /* since we are going to call t_sndudata() instead of t_snd() we */
+ /* need to init the unitdata structure raj 8/95 */
+
+ memset (&send_unitdata, 0, sizeof(send_unitdata));
+ send_unitdata.addr.maxlen = sizeof(struct sockaddr_in);
+ send_unitdata.addr.len = sizeof(struct sockaddr_in);
+ send_unitdata.addr.buf = (char *)&server;
+
+ send_unitdata.opt.maxlen = 0;
+ send_unitdata.opt.len = 0;
+ send_unitdata.opt.buf = NULL;
+
+ send_unitdata.udata.maxlen = req_size;
+ send_unitdata.udata.len = req_size;
+ send_unitdata.udata.buf = send_ring->buffer_ptr;
+
+ /*set up the data socket */
+ send_socket = create_xti_endpoint(loc_xti_device);
+
+ if (send_socket == INVALID_SOCKET){
+ perror("netperf: send_xti_udp_rr: udp rr data socket");
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"send_xti_udp_rr: send_socket obtained...\n");
+ }
+
+ /* it would seem that with XTI, there is no implicit bind */
+ /* so we have to make a call to t_bind. this is not */
+ /* terribly convenient, but I suppose that "standard is better */
+ /* than better" :) raj 2/95 */
+
+ if (t_bind(send_socket, NULL, NULL) == SOCKET_ERROR) {
+ t_error("send_xti_tcp_stream: t_bind");
+ exit(1);
+ }
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back. If */
+ /* there is no idle counter in the kernel idle loop, the */
+ /* local_cpu_rate will be set to -1. */
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ /* Tell the remote end to do a listen. The server alters the socket */
+ /* paramters on the other side at this point, hence the reason for */
+ /* all the values being passed in the setup message. If the user did */
+ /* not specify any of the parameters, they will be passed as 0, which */
+ /* will indicate to the remote that no changes beyond the system's */
+ /* default should be used. Alignment is the exception, it will */
+ /* default to 8, which will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_XTI_UDP_RR;
+ xti_udp_rr_request->recv_buf_size = rsr_size;
+ xti_udp_rr_request->send_buf_size = rss_size;
+ xti_udp_rr_request->recv_alignment = remote_recv_align;
+ xti_udp_rr_request->recv_offset = remote_recv_offset;
+ xti_udp_rr_request->send_alignment = remote_send_align;
+ xti_udp_rr_request->send_offset = remote_send_offset;
+ xti_udp_rr_request->request_size = req_size;
+ xti_udp_rr_request->response_size = rsp_size;
+ xti_udp_rr_request->measure_cpu = remote_cpu_usage;
+ xti_udp_rr_request->cpu_rate = remote_cpu_rate;
+ xti_udp_rr_request->so_rcvavoid = rem_rcvavoid;
+ xti_udp_rr_request->so_sndavoid = rem_sndavoid;
+ if (test_time) {
+ xti_udp_rr_request->test_length = test_time;
+ }
+ else {
+ xti_udp_rr_request->test_length = test_trans * -1;
+ }
+
+ strcpy(xti_udp_rr_request->xti_device, rem_xti_device);
+
+#ifdef __alpha
+
+ /* ok - even on a DEC box, strings are strings. I didn't really want */
+ /* to ntohl the words of a string. since I don't want to teach the */
+ /* send_ and recv_ _request and _response routines about the types, */
+ /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
+ /* solution would be to use XDR, but I am still leary of being able */
+ /* to find XDR libs on all platforms I want running netperf. raj */
+ {
+ int *charword;
+ int *initword;
+ int *lastword;
+
+ initword = (int *) xti_udp_rr_request->xti_device;
+ lastword = initword + ((strlen(rem_xti_device) + 3) / 4);
+
+ for (charword = initword;
+ charword < lastword;
+ charword++) {
+
+ *charword = ntohl(*charword);
+ }
+ }
+#endif /* __alpha */
+
+ if (debug > 1) {
+ fprintf(where,"netperf: send_xti_udp_rr: requesting UDP r/r test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant */
+ /* socket parameters for this test type. We will put them back into */
+ /* the variables here so they can be displayed if desired. The */
+ /* remote will have calibrated CPU if necessary, and will have done */
+ /* all the needed set-up we will have calibrated the cpu locally */
+ /* before sending the request, and will grab the counter value right*/
+ /* after the connect returns. The remote will grab the counter right*/
+ /* after the accept call. This saves the hassle of extra messages */
+ /* being sent for the UDP tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote listen done.\n");
+ rsr_size = xti_udp_rr_response->recv_buf_size;
+ rss_size = xti_udp_rr_response->send_buf_size;
+ remote_cpu_usage = xti_udp_rr_response->measure_cpu;
+ remote_cpu_rate = xti_udp_rr_response->cpu_rate;
+ /* port numbers in proper order */
+ server.sin_port = (short)xti_udp_rr_response->data_port_number;
+ server.sin_port = htons(server.sin_port);
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("netperf: remote error");
+
+ exit(1);
+ }
+
+ /* Data Socket set-up is finished. If there were problems, either the */
+ /* connect would have failed, or the previous response would have */
+ /* indicated a problem. I failed to see the value of the extra */
+ /* message after the accept on the remote. If it failed, we'll see it */
+ /* here. If it didn't, we might as well start pumping data. */
+
+ /* Set-up the test end conditions. For a request/response test, they */
+ /* can be either time or transaction based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ trans_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+#ifdef WANT_INTERVALS
+ if ((interval_burst) || (demo_mode)) {
+ /* zero means that we never pause, so we never should need the */
+ /* interval timer, unless we are in demo_mode */
+ start_itimer(interval_wate);
+ }
+ interval_count = interval_burst;
+ /* get the signal set for the call to sigsuspend */
+ if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &signal_set) != 0) {
+ fprintf(where,
+ "send_xti_udp_rr: unable to get sigmask errno %d\n",
+ errno);
+ fflush(where);
+ exit(1);
+ }
+#endif /* WANT_INTERVALS */
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return */
+ /* false. When the test is controlled by byte count, the time test */
+ /* will always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. I think */
+ /* I just arbitrarily decrement trans_remaining for the timed */
+ /* test, but will not do that just yet... One other question is */
+ /* whether or not the send buffer and the receive buffer should be */
+ /* the same buffer. */
+
+ while ((!times_up) || (trans_remaining > 0)) {
+ /* send the request */
+#ifdef WANT_HISTOGRAM
+ HIST_timestamp(&time_one);
+#endif
+ if((t_sndudata(send_socket,
+ &send_unitdata)) != 0) {
+ if (errno == EINTR) {
+ /* We likely hit */
+ /* test-end time. */
+ break;
+ }
+ fprintf(where,
+ "send_xti_udp_rr: t_sndudata: errno %d t_errno %d t_look 0x%.4x\n",
+ errno,
+ t_errno,
+ t_look(send_socket));
+ fflush(where);
+ exit(1);
+ }
+ send_ring = send_ring->next;
+
+ /* receive the response. with UDP we will get it all, or nothing */
+
+ if((t_rcvudata(send_socket,
+ &recv_unitdata,
+ &flags)) != 0) {
+ if (errno == TNODATA) {
+ continue;
+ }
+ if (errno == EINTR) {
+ /* Again, we have likely hit test-end time */
+ break;
+ }
+ fprintf(where,
+ "send_xti_udp_rr: t_rcvudata: errno %d t_errno %d t_look 0x%x\n",
+ errno,
+ t_errno,
+ t_look(send_socket));
+ fprintf(where,
+ "recv_unitdata.udata.buf %x\n",recv_unitdata.udata.buf);
+ fprintf(where,
+ "recv_unitdata.udata.maxlen %x\n",recv_unitdata.udata.maxlen);
+ fprintf(where,
+ "recv_unitdata.udata.len %x\n",recv_unitdata.udata.len);
+ fprintf(where,
+ "recv_unitdata.addr.buf %x\n",recv_unitdata.addr.buf);
+ fprintf(where,
+ "recv_unitdata.addr.maxlen %x\n",recv_unitdata.addr.maxlen);
+ fprintf(where,
+ "recv_unitdata.addr.len %x\n",recv_unitdata.addr.len);
+ fflush(where);
+ exit(1);
+ }
+ recv_ring = recv_ring->next;
+
+#ifdef WANT_HISTOGRAM
+ HIST_timestamp(&time_two);
+ HIST_add(time_hist,delta_micro(&time_one,&time_two));
+
+ /* at this point, we may wish to sleep for some period of */
+ /* time, so we see how long that last transaction just took, */
+ /* and sleep for the difference of that and the interval. We */
+ /* will not sleep if the time would be less than a */
+ /* millisecond. */
+#endif
+#ifdef WANT_INTERVALS
+ if (demo_mode) {
+ units_this_tick += 1;
+ }
+ /* in this case, the interval count is the count-down couter */
+ /* to decide to sleep for a little bit */
+ if ((interval_burst) && (--interval_count == 0)) {
+ /* call sigsuspend and wait for the interval timer to get us */
+ /* out */
+ if (debug) {
+ fprintf(where,"about to suspend\n");
+ fflush(where);
+ }
+ if (sigsuspend(&signal_set) == EFAULT) {
+ fprintf(where,
+ "send_xti_udp_rr: fault with signal set!\n");
+ fflush(where);
+ exit(1);
+ }
+ interval_count = interval_burst;
+ }
+#endif /* WANT_INTERVALS */
+
+ nummessages++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug > 3) {
+ if ((nummessages % 100) == 0) {
+ fprintf(where,"Transaction %d completed\n",nummessages);
+ fflush(where);
+ }
+ }
+
+ }
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being */
+ /* measured? how long */
+ /* did we really run? */
+
+ /* Get the statistics from the remote end. The remote will have */
+ /* calculated service demand and all those interesting things. If */
+ /* it wasn't supposed to care, it will return obvious values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("netperf: remote error");
+
+ exit(1);
+ }
+
+ /* We now calculate what our thruput was for the test. In the */
+ /* future, we may want to include a calculation of the thruput */
+ /* measured by the remote, but it should be the case that for a */
+ /* UDP rr test, that the two numbers should be *very* close... */
+ /* We calculate bytes_sent regardless of the way the test length */
+ /* was controlled. */
+
+ bytes_xferd = (req_size * nummessages) + (rsp_size * nummessages);
+ thruput = nummessages / elapsed_time;
+
+ if (local_cpu_usage || remote_cpu_usage) {
+
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) Of course, some of the */
+ /* information might be bogus because there was no idle counter */
+ /* in the kernel(s). We need to make a note of this for the */
+ /* user's benefit by placing a code for the metod used in the */
+ /* test banner */
+
+ if (local_cpu_usage) {
+ local_cpu_utilization = calc_cpu_util(0.0);
+
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+
+ local_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = -1.0;
+ local_service_demand = -1.0;
+ }
+
+ if (remote_cpu_usage) {
+ remote_cpu_utilization = xti_udp_rr_result->cpu_util;
+
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+
+ remote_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ remote_cpu_utilization,
+ xti_udp_rr_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = -1.0;
+ remote_service_demand = -1.0;
+ }
+ }
+ else {
+ /* we were not measuring cpu, for the confidence stuff, we */
+ /* should make it -1.0 */
+ local_cpu_utilization = -1.0;
+ local_service_demand = -1.0;
+ remote_cpu_utilization = -1.0;
+ remote_service_demand = -1.0;
+ }
+
+ /* at this point, we want to calculate the confidence information. */
+ /* if debugging is on, calculate_confidence will print-out the */
+ /* parameters we pass it */
+
+ calculate_confidence(confidence_iteration,
+ elapsed_time,
+ thruput,
+ local_cpu_utilization,
+ remote_cpu_utilization,
+ local_service_demand,
+ remote_service_demand);
+
+
+ confidence_iteration++;
+
+ /* we are done with the socket */
+ t_close(send_socket);
+ }
+
+ /* at this point, we have made all the iterations we are going to */
+ /* make. */
+ retrieve_confident_values(&elapsed_time,
+ &thruput,
+ &local_cpu_utilization,
+ &remote_cpu_utilization,
+ &local_service_demand,
+ &remote_service_demand);
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ if (confidence < 0) {
+ /* we did not hit confidence, but were we asked to look for it? */
+ if (iteration_max > 1) {
+ display_confidence();
+ }
+ }
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ local_cpu_method = format_cpu_method(cpu_method);
+ remote_cpu_method = format_cpu_method(xti_udp_rr_result->cpu_method);
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand,
+ local_cpu_method);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand,
+ remote_cpu_method);
+ }
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,
+ cpu_title,
+ local_cpu_method,
+ remote_cpu_method);
+ }
+
+ fprintf(where,
+ cpu_fmt_1_line_1, /* the format string */
+ lss_size, /* local sendbuf size */
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* guess */
+ elapsed_time, /* how long was the test */
+ nummessages/elapsed_time,
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand); /* remote service demand */
+ fprintf(where,
+ cpu_fmt_1_line_2,
+ rss_size,
+ rsr_size);
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ nummessages/elapsed_time);
+ break;
+ case 1:
+ case 2:
+ if (print_headers) {
+ fprintf(where,tput_title,format_units());
+ }
+
+ fprintf(where,
+ tput_fmt_1_line_1, /* the format string */
+ lss_size,
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* how large were the responses */
+ elapsed_time, /* how long did it take */
+ nummessages/elapsed_time);
+ fprintf(where,
+ tput_fmt_1_line_2,
+ rss_size, /* remote recvbuf size */
+ rsr_size);
+
+ break;
+ }
+ }
+ fflush(where);
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ /* how to handle the verbose information in the presence of */
+ /* confidence intervals is yet to be determined... raj 11/94 */
+
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* UDP statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+#ifdef WANT_HISTOGRAM
+ fprintf(where,"\nHistogram of request/reponse times.\n");
+ fflush(where);
+ HIST_report(time_hist);
+#endif /* WANT_HISTOGRAM */
+ }
+}
+
+ /* this routine implements the receive side (netserver) of a XTI_UDP_RR */
+ /* test. */
+void
+ recv_xti_udp_rr()
+{
+
+ struct ring_elt *recv_ring;
+ struct ring_elt *send_ring;
+
+ struct t_bind bind_req, bind_resp;
+ struct t_unitdata send_unitdata;
+ struct t_unitdata recv_unitdata;
+ int flags = 0;
+
+ struct sockaddr_in myaddr_in, peeraddr_in;
+ SOCKET s_data;
+ int addrlen;
+ int trans_received;
+ int trans_remaining;
+ float elapsed_time;
+
+ struct xti_udp_rr_request_struct *xti_udp_rr_request;
+ struct xti_udp_rr_response_struct *xti_udp_rr_response;
+ struct xti_udp_rr_results_struct *xti_udp_rr_results;
+
+
+ /* a little variable initialization */
+ memset (&myaddr_in, 0, sizeof(struct sockaddr_in));
+ myaddr_in.sin_family = AF_INET;
+ myaddr_in.sin_addr.s_addr = INADDR_ANY;
+ myaddr_in.sin_port = 0;
+ memset (&peeraddr_in, 0, sizeof(struct sockaddr_in));
+
+ /* and some not so paranoid :) */
+ xti_udp_rr_request =
+ (struct xti_udp_rr_request_struct *)netperf_request.content.test_specific_data;
+ xti_udp_rr_response =
+ (struct xti_udp_rr_response_struct *)netperf_response.content.test_specific_data;
+ xti_udp_rr_results =
+ (struct xti_udp_rr_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_xti_udp_rr: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_xti_udp_rr: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = XTI_UDP_RR_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_xti_udp_rr: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* We now alter the message_ptr variables to be at the desired */
+ /* alignments with the desired offsets. */
+
+ if (debug) {
+ fprintf(where,"recv_xti_udp_rr: requested recv alignment of %d offset %d\n",
+ xti_udp_rr_request->recv_alignment,
+ xti_udp_rr_request->recv_offset);
+ fprintf(where,"recv_xti_udp_rr: requested send alignment of %d offset %d\n",
+ xti_udp_rr_request->send_alignment,
+ xti_udp_rr_request->send_offset);
+ fflush(where);
+ }
+
+ if (send_width == 0) send_width = 1;
+ if (recv_width == 0) recv_width = 1;
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ xti_udp_rr_request->request_size,
+ xti_udp_rr_request->recv_alignment,
+ xti_udp_rr_request->recv_offset);
+
+ send_ring = allocate_buffer_ring(send_width,
+ xti_udp_rr_request->response_size,
+ xti_udp_rr_request->send_alignment,
+ xti_udp_rr_request->send_offset);
+
+ if (debug) {
+ fprintf(where,"recv_xti_udp_rr: receive alignment and offset set...\n");
+ fflush(where);
+ }
+
+ /* create_xti_endpoint expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lss_size = xti_udp_rr_request->send_buf_size;
+ lsr_size = xti_udp_rr_request->recv_buf_size;
+ loc_rcvavoid = xti_udp_rr_request->so_rcvavoid;
+ loc_sndavoid = xti_udp_rr_request->so_sndavoid;
+
+#ifdef __alpha
+
+ /* ok - even on a DEC box, strings are strings. I din't really want */
+ /* to ntohl the words of a string. since I don't want to teach the */
+ /* send_ and recv_ _request and _response routines about the types, */
+ /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
+ /* solution would be to use XDR, but I am still leary of being able */
+ /* to find XDR libs on all platforms I want running netperf. raj */
+ {
+ int *charword;
+ int *initword;
+ int *lastword;
+
+ initword = (int *) xti_udp_rr_request->xti_device;
+ lastword = initword + ((xti_udp_rr_request->dev_name_len + 3) / 4);
+
+ for (charword = initword;
+ charword < lastword;
+ charword++) {
+
+ *charword = htonl(*charword);
+ }
+ }
+
+#endif /* __alpha */
+
+ s_data = create_xti_endpoint(xti_udp_rr_request->xti_device);
+
+ if (s_data == INVALID_SOCKET) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"recv_xti_udp_rr: endpoint created...\n");
+ fflush(where);
+ }
+
+ /* Let's get an address assigned to this socket so we can tell the */
+ /* initiator how to reach the data socket. There may be a desire to */
+ /* nail this socket to a specific IP address in a multi-homed, */
+ /* multi-connection situation, but for now, we'll ignore the issue */
+ /* and concentrate on single connection testing. */
+
+ bind_req.addr.maxlen = sizeof(struct sockaddr_in);
+ bind_req.addr.len = sizeof(struct sockaddr_in);
+ bind_req.addr.buf = (char *)&myaddr_in;
+ bind_req.qlen = 1;
+
+ bind_resp.addr.maxlen = sizeof(struct sockaddr_in);
+ bind_resp.addr.len = sizeof(struct sockaddr_in);
+ bind_resp.addr.buf = (char *)&myaddr_in;
+ bind_resp.qlen = 1;
+
+ if (t_bind(s_data,
+ &bind_req,
+ &bind_resp) == SOCKET_ERROR) {
+ if (debug) {
+ fprintf(where,
+ "recv_xti_udp_rr: t_bind failed, t_errno %d errno %d\n",
+ t_errno,
+ errno);
+ fflush(where);
+ }
+
+ netperf_response.content.serv_errno = t_errno;
+ send_response();
+
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_xti_udp_rr: endpoint bound to port %d...\n",
+ ntohs(myaddr_in.sin_port));
+ fflush(where);
+ }
+
+ xti_udp_rr_response->test_length =
+ xti_udp_rr_request->test_length;
+
+
+ /* Now myaddr_in contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ xti_udp_rr_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
+ netperf_response.content.serv_errno = 0;
+
+ fprintf(where,"recv port number %d\n",myaddr_in.sin_port);
+ fflush(where);
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a 0.0 to */
+ /* the initiator. */
+
+ xti_udp_rr_response->cpu_rate = 0.0; /* assume no cpu */
+ xti_udp_rr_response->measure_cpu = 0;
+ if (xti_udp_rr_request->measure_cpu) {
+ xti_udp_rr_response->measure_cpu = 1;
+ xti_udp_rr_response->cpu_rate =
+ calibrate_local_cpu(xti_udp_rr_request->cpu_rate);
+ }
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ xti_udp_rr_response->send_buf_size = lss_size;
+ xti_udp_rr_response->recv_buf_size = lsr_size;
+ xti_udp_rr_response->so_rcvavoid = loc_rcvavoid;
+ xti_udp_rr_response->so_sndavoid = loc_sndavoid;
+
+ /* since we are going to call t_rcvudata() instead of t_rcv() we */
+ /* need to init the unitdata structure raj 3/95 */
+
+ memset (&recv_unitdata, 0, sizeof(recv_unitdata));
+ recv_unitdata.addr.maxlen = sizeof(struct sockaddr_in);
+ recv_unitdata.addr.len = sizeof(struct sockaddr_in);
+ recv_unitdata.addr.buf = (char *)&peeraddr_in;
+
+ recv_unitdata.opt.maxlen = 0;
+ recv_unitdata.opt.len = 0;
+ recv_unitdata.opt.buf = NULL;
+
+ recv_unitdata.udata.maxlen = xti_udp_rr_request->request_size;
+ recv_unitdata.udata.len = xti_udp_rr_request->request_size;
+ recv_unitdata.udata.buf = recv_ring->buffer_ptr;
+
+ /* since we are going to call t_sndudata() instead of t_snd() we */
+ /* need to init the unitdata structure raj 8/95 */
+
+ memset (&send_unitdata, 0, sizeof(send_unitdata));
+ send_unitdata.addr.maxlen = sizeof(struct sockaddr_in);
+ send_unitdata.addr.len = sizeof(struct sockaddr_in);
+ send_unitdata.addr.buf = (char *)&peeraddr_in;
+
+ send_unitdata.opt.maxlen = 0;
+ send_unitdata.opt.len = 0;
+ send_unitdata.opt.buf = NULL;
+
+ send_unitdata.udata.maxlen = xti_udp_rr_request->response_size;
+ send_unitdata.udata.len = xti_udp_rr_request->response_size;
+ send_unitdata.udata.buf = send_ring->buffer_ptr;
+
+ send_response();
+
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(xti_udp_rr_request->measure_cpu);
+
+ if (xti_udp_rr_request->test_length > 0) {
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(xti_udp_rr_request->test_length + PAD_TIME);
+ }
+ else {
+ times_up = 1;
+ trans_remaining = xti_udp_rr_request->test_length * -1;
+ }
+
+ addrlen = sizeof(peeraddr_in);
+ bzero((char *)&peeraddr_in, addrlen);
+
+ trans_received = 0;
+
+ while ((!times_up) || (trans_remaining > 0)) {
+
+ /* receive the request from the other side */
+ if (t_rcvudata(s_data,
+ &recv_unitdata,
+ &flags) != 0) {
+ if (errno == TNODATA) {
+ continue;
+ }
+ if (errno == EINTR) {
+ /* we must have hit the end of test time. */
+ break;
+ }
+ if (debug) {
+ fprintf(where,
+ "recv_xti_udp_rr: t_rcvudata failed, t_errno %d errno %d\n",
+ t_errno,
+ errno);
+ fflush(where);
+ }
+ netperf_response.content.serv_errno = t_errno;
+ send_response();
+ exit(1);
+ }
+ recv_ring = recv_ring->next;
+ recv_unitdata.udata.buf = recv_ring->buffer_ptr;
+
+ /* Now, send the response to the remote */
+ if (t_sndudata(s_data,
+ &send_unitdata) != 0) {
+ if (errno == EINTR) {
+ /* we have hit end of test time. */
+ break;
+ }
+ if (debug) {
+ fprintf(where,
+ "recv_xti_udp_rr: t_sndudata failed, t_errno %d errno %d\n",
+ t_errno,
+ errno);
+ fflush(where);
+ }
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+ send_ring = send_ring->next;
+ send_unitdata.udata.buf = send_ring->buffer_ptr;
+
+ trans_received++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_xti_udp_rr: Transaction %d complete.\n",
+ trans_received);
+ fflush(where);
+ }
+
+ }
+
+
+ /* The loop now exits due to timeout or transaction count being */
+ /* reached */
+
+ cpu_stop(xti_udp_rr_request->measure_cpu,&elapsed_time);
+
+ if (times_up) {
+ /* we ended the test by time, which was at least 2 seconds */
+ /* longer than we wanted to run. so, we want to subtract */
+ /* PAD_TIME from the elapsed_time. */
+ elapsed_time -= PAD_TIME;
+ }
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_xti_udp_rr: got %d transactions\n",
+ trans_received);
+ fflush(where);
+ }
+
+ xti_udp_rr_results->bytes_received = (trans_received *
+ (xti_udp_rr_request->request_size +
+ xti_udp_rr_request->response_size));
+ xti_udp_rr_results->trans_received = trans_received;
+ xti_udp_rr_results->elapsed_time = elapsed_time;
+ xti_udp_rr_results->cpu_method = cpu_method;
+ if (xti_udp_rr_request->measure_cpu) {
+ xti_udp_rr_results->cpu_util = calc_cpu_util(elapsed_time);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_xti_udp_rr: test complete, sending results.\n");
+ fflush(where);
+ }
+
+ send_response();
+
+ /* we are done with the socket now */
+ close(s_data);
+
+}
+
+ /* this routine implements the receive (netserver) side of a XTI_TCP_RR */
+ /* test */
+void
+recv_xti_tcp_rr()
+{
+
+ struct ring_elt *send_ring;
+ struct ring_elt *recv_ring;
+
+ struct sockaddr_in myaddr_in, peeraddr_in;
+ struct t_bind bind_req, bind_resp;
+ struct t_call call_req;
+
+ SOCKET s_listen,s_data;
+ int addrlen;
+ char *temp_message_ptr;
+ int trans_received;
+ int trans_remaining;
+ int bytes_sent;
+ int request_bytes_recvd;
+ int request_bytes_remaining;
+ int timed_out = 0;
+ float elapsed_time;
+
+ struct xti_tcp_rr_request_struct *xti_tcp_rr_request;
+ struct xti_tcp_rr_response_struct *xti_tcp_rr_response;
+ struct xti_tcp_rr_results_struct *xti_tcp_rr_results;
+
+ xti_tcp_rr_request =
+ (struct xti_tcp_rr_request_struct *)netperf_request.content.test_specific_data;
+ xti_tcp_rr_response =
+ (struct xti_tcp_rr_response_struct *)netperf_response.content.test_specific_data;
+ xti_tcp_rr_results =
+ (struct xti_tcp_rr_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_xti_tcp_rr: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_xti_tcp_rr: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = XTI_TCP_RR_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_xti_tcp_rr: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* allocate the recv and send rings with the requested alignments */
+ /* and offsets. raj 7/94 */
+ if (debug) {
+ fprintf(where,"recv_xti_tcp_rr: requested recv alignment of %d offset %d\n",
+ xti_tcp_rr_request->recv_alignment,
+ xti_tcp_rr_request->recv_offset);
+ fprintf(where,"recv_xti_tcp_rr: requested send alignment of %d offset %d\n",
+ xti_tcp_rr_request->send_alignment,
+ xti_tcp_rr_request->send_offset);
+ fflush(where);
+ }
+
+ /* at some point, these need to come to us from the remote system */
+ if (send_width == 0) send_width = 1;
+ if (recv_width == 0) recv_width = 1;
+
+ send_ring = allocate_buffer_ring(send_width,
+ xti_tcp_rr_request->response_size,
+ xti_tcp_rr_request->send_alignment,
+ xti_tcp_rr_request->send_offset);
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ xti_tcp_rr_request->request_size,
+ xti_tcp_rr_request->recv_alignment,
+ xti_tcp_rr_request->recv_offset);
+
+
+ /* Let's clear-out our sockaddr for the sake of cleanlines. Then we */
+ /* can put in OUR values !-) At some point, we may want to nail this */
+ /* socket to a particular network-level address, but for now, */
+ /* INADDR_ANY should be just fine. */
+
+ bzero((char *)&myaddr_in,
+ sizeof(myaddr_in));
+ myaddr_in.sin_family = AF_INET;
+ myaddr_in.sin_addr.s_addr = INADDR_ANY;
+ myaddr_in.sin_port = 0;
+
+ /* Grab a socket to listen on, and then listen on it. */
+
+ if (debug) {
+ fprintf(where,"recv_xti_tcp_rr: grabbing a socket...\n");
+ fflush(where);
+ }
+
+ /* create_xti_endpoint expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lss_size = xti_tcp_rr_request->send_buf_size;
+ lsr_size = xti_tcp_rr_request->recv_buf_size;
+ loc_nodelay = xti_tcp_rr_request->no_delay;
+ loc_rcvavoid = xti_tcp_rr_request->so_rcvavoid;
+ loc_sndavoid = xti_tcp_rr_request->so_sndavoid;
+
+#ifdef __alpha
+
+ /* ok - even on a DEC box, strings are strings. I din't really want */
+ /* to ntohl the words of a string. since I don't want to teach the */
+ /* send_ and recv_ _request and _response routines about the types, */
+ /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
+ /* solution would be to use XDR, but I am still leary of being able */
+ /* to find XDR libs on all platforms I want running netperf. raj */
+ {
+ int *charword;
+ int *initword;
+ int *lastword;
+
+ initword = (int *) xti_tcp_rr_request->xti_device;
+ lastword = initword + ((xti_tcp_rr_request->dev_name_len + 3) / 4);
+
+ for (charword = initword;
+ charword < lastword;
+ charword++) {
+
+ *charword = htonl(*charword);
+ }
+ }
+
+#endif /* __alpha */
+
+ s_listen = create_xti_endpoint(xti_tcp_rr_request->xti_device);
+
+ if (s_listen == INVALID_SOCKET) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+
+ exit(1);
+ }
+
+ /* Let's get an address assigned to this socket so we can tell the */
+ /* initiator how to reach the data socket. There may be a desire to */
+ /* nail this socket to a specific IP address in a multi-homed, */
+ /* multi-connection situation, but for now, we'll ignore the issue */
+ /* and concentrate on single connection testing. */
+
+ bind_req.addr.maxlen = sizeof(struct sockaddr_in);
+ bind_req.addr.len = sizeof(struct sockaddr_in);
+ bind_req.addr.buf = (char *)&myaddr_in;
+ bind_req.qlen = 1;
+
+ bind_resp.addr.maxlen = sizeof(struct sockaddr_in);
+ bind_resp.addr.len = sizeof(struct sockaddr_in);
+ bind_resp.addr.buf = (char *)&myaddr_in;
+ bind_resp.qlen = 1;
+
+ if (t_bind(s_listen,
+ &bind_req,
+ &bind_resp) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = t_errno;
+ close(s_listen);
+ send_response();
+
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_xti_tcp_rr: t_bind complete port %d\n",
+ ntohs(myaddr_in.sin_port));
+ fflush(where);
+ }
+
+ /* Now myaddr_in contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ xti_tcp_rr_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a 0.0 to */
+ /* the initiator. */
+
+ xti_tcp_rr_response->cpu_rate = 0.0; /* assume no cpu */
+ xti_tcp_rr_response->measure_cpu = 0;
+
+ if (xti_tcp_rr_request->measure_cpu) {
+ xti_tcp_rr_response->measure_cpu = 1;
+ xti_tcp_rr_response->cpu_rate = calibrate_local_cpu(xti_tcp_rr_request->cpu_rate);
+ }
+
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ xti_tcp_rr_response->send_buf_size = lss_size;
+ xti_tcp_rr_response->recv_buf_size = lsr_size;
+ xti_tcp_rr_response->no_delay = loc_nodelay;
+ xti_tcp_rr_response->so_rcvavoid = loc_rcvavoid;
+ xti_tcp_rr_response->so_sndavoid = loc_sndavoid;
+ xti_tcp_rr_response->test_length = xti_tcp_rr_request->test_length;
+ send_response();
+
+ /* Now, let's set-up the socket to listen for connections. for xti, */
+ /* the t_listen call is blocking by default - this is different */
+ /* semantics from BSD - probably has to do with being able to reject */
+ /* a call before an accept */
+ call_req.addr.maxlen = sizeof(struct sockaddr_in);
+ call_req.addr.len = sizeof(struct sockaddr_in);
+ call_req.addr.buf = (char *)&peeraddr_in;
+ call_req.opt.maxlen = 0;
+ call_req.opt.len = 0;
+ call_req.opt.buf = NULL;
+ call_req.udata.maxlen= 0;
+ call_req.udata.len = 0;
+ call_req.udata.buf = 0;
+
+ if (t_listen(s_listen, &call_req) == -1) {
+ fprintf(where,
+ "recv_xti_tcp_rr: t_listen: errno %d t_errno %d\n",
+ errno,
+ t_errno);
+ fflush(where);
+ netperf_response.content.serv_errno = t_errno;
+ close(s_listen);
+ send_response();
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_xti_tcp_rr: t_listen complete t_look 0x%.4x\n",
+ t_look(s_listen));
+ fflush(where);
+ }
+
+ /* now just rubber stamp the thing. we want to use the same fd? so */
+ /* we will just equate s_data with s_listen. this seems a little */
+ /* hokey to me, but then I'm a BSD biggot still. raj 2/95 */
+ s_data = s_listen;
+ if (t_accept(s_listen,
+ s_data,
+ &call_req) == -1) {
+ fprintf(where,
+ "recv_xti_tcp_rr: t_accept: errno %d t_errno %d\n",
+ errno,
+ t_errno);
+ fflush(where);
+ close(s_listen);
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_xti_tcp_rr: t_accept complete t_look 0x%.4x",
+ t_look(s_data));
+ fprintf(where,
+ " remote is %s port %d\n",
+ inet_ntoa(*(struct in_addr *)&peeraddr_in.sin_addr),
+ ntohs(peeraddr_in.sin_port));
+ fflush(where);
+ }
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(xti_tcp_rr_request->measure_cpu);
+
+ if (xti_tcp_rr_request->test_length > 0) {
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(xti_tcp_rr_request->test_length + PAD_TIME);
+ }
+ else {
+ times_up = 1;
+ trans_remaining = xti_tcp_rr_request->test_length * -1;
+ }
+
+ trans_received = 0;
+
+ while ((!times_up) || (trans_remaining > 0)) {
+ temp_message_ptr = recv_ring->buffer_ptr;
+ request_bytes_remaining = xti_tcp_rr_request->request_size;
+ while(request_bytes_remaining > 0) {
+ if((request_bytes_recvd=t_rcv(s_data,
+ temp_message_ptr,
+ request_bytes_remaining,
+ &xti_flags)) == SOCKET_ERROR) {
+ if (errno == EINTR) {
+ /* the timer popped */
+ timed_out = 1;
+ break;
+ }
+ fprintf(where,
+ "recv_xti_tcp_rr: t_rcv: errno %d t_errno %d len %d",
+ errno,
+ t_errno,
+ request_bytes_recvd);
+ fprintf(where,
+ " t_look 0x%x",
+ t_look(s_data));
+ fflush(where);
+ netperf_response.content.serv_errno = t_errno;
+ send_response();
+ exit(1);
+ }
+ else {
+ request_bytes_remaining -= request_bytes_recvd;
+ temp_message_ptr += request_bytes_recvd;
+ }
+ }
+
+ recv_ring = recv_ring->next;
+
+ if (timed_out) {
+ /* we hit the end of the test based on time - lets */
+ /* bail out of here now... */
+ if (debug) {
+ fprintf(where,"yo5\n");
+ fflush(where);
+ }
+ break;
+ }
+
+ /* Now, send the response to the remote */
+ if((bytes_sent=t_snd(s_data,
+ send_ring->buffer_ptr,
+ xti_tcp_rr_request->response_size,
+ 0)) == -1) {
+ if (errno == EINTR) {
+ /* the test timer has popped */
+ timed_out = 1;
+ if (debug) {
+ fprintf(where,"yo6\n");
+ fflush(where);
+ }
+ break;
+ }
+ fprintf(where,
+ "recv_xti_tcp_rr: t_rcv: errno %d t_errno %d len %d",
+ errno,
+ t_errno,
+ bytes_sent);
+ fprintf(where,
+ " t_look 0x%x",
+ t_look(s_data));
+ fflush(where);
+ netperf_response.content.serv_errno = t_errno;
+ send_response();
+ exit(1);
+ }
+
+ send_ring = send_ring->next;
+
+ trans_received++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+ }
+
+
+ /* The loop now exits due to timeout or transaction count being */
+ /* reached */
+
+ cpu_stop(xti_tcp_rr_request->measure_cpu,&elapsed_time);
+
+ stop_timer(); /* this is probably unnecessary, but it shouldn't hurt */
+
+ if (timed_out) {
+ /* we ended the test by time, which was at least 2 seconds */
+ /* longer than we wanted to run. so, we want to subtract */
+ /* PAD_TIME from the elapsed_time. */
+ elapsed_time -= PAD_TIME;
+ }
+
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_xti_tcp_rr: got %d transactions\n",
+ trans_received);
+ fflush(where);
+ }
+
+ xti_tcp_rr_results->bytes_received = (trans_received *
+ (xti_tcp_rr_request->request_size +
+ xti_tcp_rr_request->response_size));
+ xti_tcp_rr_results->trans_received = trans_received;
+ xti_tcp_rr_results->elapsed_time = elapsed_time;
+ xti_tcp_rr_results->cpu_method = cpu_method;
+ if (xti_tcp_rr_request->measure_cpu) {
+ xti_tcp_rr_results->cpu_util = calc_cpu_util(elapsed_time);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_xti_tcp_rr: test complete, sending results.\n");
+ fflush(where);
+ }
+
+ /* we are done with the socket, free it */
+ t_close(s_data);
+
+ send_response();
+
+}
+
+
+
+ /* this test is intended to test the performance of establishing a */
+ /* connection, exchanging a request/response pair, and repeating. it */
+ /* is expected that this would be a good starting-point for */
+ /* comparision of T/TCP with classic TCP for transactional workloads. */
+ /* it will also look (can look) much like the communication pattern */
+ /* of http for www access. */
+
+void
+send_xti_tcp_conn_rr(char remote_host[])
+{
+
+ char *tput_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans.\n\
+Send Recv Size Size Time Rate \n\
+bytes Bytes bytes bytes secs. per sec \n\n";
+
+ char *tput_fmt_0 =
+ "%7.2f\n";
+
+ char *tput_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %7.2f \n";
+ char *tput_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *cpu_title = "\
+Local /Remote\n\
+Socket Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem\n\
+Send Recv Size Size Time Rate local remote local remote\n\
+bytes bytes bytes bytes secs. per sec %% %% us/Tr us/Tr\n\n";
+
+ char *cpu_fmt_0 =
+ "%6.3f\n";
+
+ char *cpu_fmt_1_line_1 = "\
+%-6d %-6d %-6d %-6d %-6.2f %-6.2f %-6.2f %-6.2f %-6.3f %-6.3f\n";
+
+ char *cpu_fmt_1_line_2 = "\
+%-6d %-6d\n";
+
+ char *ksink_fmt = "\
+Alignment Offset\n\
+Local Remote Local Remote\n\
+Send Recv Send Recv\n\
+%5d %5d %5d %5d\n";
+
+
+ int one = 1;
+ int timed_out = 0;
+ float elapsed_time;
+
+ int len;
+ struct ring_elt *send_ring;
+ struct ring_elt *recv_ring;
+ char *temp_message_ptr;
+ int nummessages;
+ SOCKET send_socket;
+ int trans_remaining;
+ double bytes_xferd;
+ int sock_opt_len = sizeof(int);
+ int rsp_bytes_left;
+ int rsp_bytes_recvd;
+
+ float local_cpu_utilization;
+ float local_service_demand;
+ float remote_cpu_utilization;
+ float remote_service_demand;
+ double thruput;
+
+ struct hostent *hp;
+ struct sockaddr_in server;
+ struct sockaddr_in *myaddr;
+ unsigned int addr;
+ int myport;
+
+ struct xti_tcp_conn_rr_request_struct *xti_tcp_conn_rr_request;
+ struct xti_tcp_conn_rr_response_struct *xti_tcp_conn_rr_response;
+ struct xti_tcp_conn_rr_results_struct *xti_tcp_conn_rr_result;
+
+ xti_tcp_conn_rr_request =
+ (struct xti_tcp_conn_rr_request_struct *)netperf_request.content.test_specific_data;
+ xti_tcp_conn_rr_response =
+ (struct xti_tcp_conn_rr_response_struct *)netperf_response.content.test_specific_data;
+ xti_tcp_conn_rr_result =
+ (struct xti_tcp_conn_rr_results_struct *)netperf_response.content.test_specific_data;
+
+ /* since we are now disconnected from the code that established the */
+ /* control socket, and since we want to be able to use different */
+ /* protocols and such, we are passed the name of the remote host and */
+ /* must turn that into the test specific addressing information. */
+
+ myaddr = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in));
+ if (myaddr == NULL) {
+ printf("malloc(%d) failed!\n", sizeof(struct sockaddr_in));
+ exit(1);
+ }
+
+ bzero((char *)&server,
+ sizeof(server));
+ bzero((char *)myaddr,
+ sizeof(struct sockaddr_in));
+ myaddr->sin_family = AF_INET;
+
+ /* it would seem that while HP-UX will allow an IP address (as a */
+ /* string) in a call to gethostbyname, other, less enlightened */
+ /* systems do not. fix from awjacks@ca.sandia.gov raj 10/95 */
+ /* order changed to check for IP address first. raj 7/96 */
+
+ if ((addr = inet_addr(remote_host)) == SOCKET_ERROR) {
+ /* it was not an IP address, try it as a name */
+ if ((hp = gethostbyname(remote_host)) == NULL) {
+ /* we have no idea what it is */
+ fprintf(where,
+ "establish_control: could not resolve the destination %s\n",
+ remote_host);
+ fflush(where);
+ exit(1);
+ }
+ else {
+ /* it was a valid remote_host */
+ bcopy(hp->h_addr,
+ (char *)&server.sin_addr,
+ hp->h_length);
+ server.sin_family = hp->h_addrtype;
+ }
+ }
+ else {
+ /* it was a valid IP address */
+ server.sin_addr.s_addr = addr;
+ server.sin_family = AF_INET;
+ }
+
+ if ( print_headers ) {
+ fprintf(where,"TCP Connect/Request/Response Test\n");
+ if (local_cpu_usage || remote_cpu_usage)
+ fprintf(where,cpu_title,format_units());
+ else
+ fprintf(where,tput_title,format_units());
+ }
+
+ /* initialize a few counters */
+
+ nummessages = 0;
+ bytes_xferd = 0.0;
+ times_up = 0;
+
+ /* set-up the data buffers with the requested alignment and offset */
+ if (send_width == 0) send_width = 1;
+ if (recv_width == 0) recv_width = 1;
+
+ send_ring = allocate_buffer_ring(send_width,
+ req_size,
+ local_send_align,
+ local_send_offset);
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ rsp_size,
+ local_recv_align,
+ local_recv_offset);
+
+
+ if (debug) {
+ fprintf(where,"send_xti_tcp_conn_rr: send_socket obtained...\n");
+ }
+
+ /* If the user has requested cpu utilization measurements, we must */
+ /* calibrate the cpu(s). We will perform this task within the tests */
+ /* themselves. If the user has specified the cpu rate, then */
+ /* calibrate_local_cpu will return rather quickly as it will have */
+ /* nothing to do. If local_cpu_rate is zero, then we will go through */
+ /* all the "normal" calibration stuff and return the rate back.*/
+
+ if (local_cpu_usage) {
+ local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
+ }
+
+ /* Tell the remote end to do a listen. The server alters the socket */
+ /* paramters on the other side at this point, hence the reason for */
+ /* all the values being passed in the setup message. If the user did */
+ /* not specify any of the parameters, they will be passed as 0, which */
+ /* will indicate to the remote that no changes beyond the system's */
+ /* default should be used. Alignment is the exception, it will */
+ /* default to 8, which will be no alignment alterations. */
+
+ netperf_request.content.request_type = DO_XTI_TCP_CRR;
+ xti_tcp_conn_rr_request->recv_buf_size = rsr_size;
+ xti_tcp_conn_rr_request->send_buf_size = rss_size;
+ xti_tcp_conn_rr_request->recv_alignment = remote_recv_align;
+ xti_tcp_conn_rr_request->recv_offset = remote_recv_offset;
+ xti_tcp_conn_rr_request->send_alignment = remote_send_align;
+ xti_tcp_conn_rr_request->send_offset = remote_send_offset;
+ xti_tcp_conn_rr_request->request_size = req_size;
+ xti_tcp_conn_rr_request->response_size = rsp_size;
+ xti_tcp_conn_rr_request->no_delay = rem_nodelay;
+ xti_tcp_conn_rr_request->measure_cpu = remote_cpu_usage;
+ xti_tcp_conn_rr_request->cpu_rate = remote_cpu_rate;
+ xti_tcp_conn_rr_request->so_rcvavoid = rem_rcvavoid;
+ xti_tcp_conn_rr_request->so_sndavoid = rem_sndavoid;
+ if (test_time) {
+ xti_tcp_conn_rr_request->test_length = test_time;
+ }
+ else {
+ xti_tcp_conn_rr_request->test_length = test_trans * -1;
+ }
+
+ if (debug > 1) {
+ fprintf(where,"netperf: send_xti_tcp_conn_rr: requesting TCP crr test\n");
+ }
+
+ send_request();
+
+ /* The response from the remote will contain all of the relevant */
+ /* socket parameters for this test type. We will put them back into */
+ /* the variables here so they can be displayed if desired. The */
+ /* remote will have calibrated CPU if necessary, and will have done */
+ /* all the needed set-up we will have calibrated the cpu locally */
+ /* before sending the request, and will grab the counter value right */
+ /* after the connect returns. The remote will grab the counter right */
+ /* after the accept call. This saves the hassle of extra messages */
+ /* being sent for the TCP tests. */
+
+ recv_response();
+
+ if (!netperf_response.content.serv_errno) {
+ rsr_size = xti_tcp_conn_rr_response->recv_buf_size;
+ rss_size = xti_tcp_conn_rr_response->send_buf_size;
+ rem_nodelay = xti_tcp_conn_rr_response->no_delay;
+ remote_cpu_usage= xti_tcp_conn_rr_response->measure_cpu;
+ remote_cpu_rate = xti_tcp_conn_rr_response->cpu_rate;
+ /* make sure that port numbers are in network order */
+ server.sin_port = (short)xti_tcp_conn_rr_response->data_port_number;
+ server.sin_port = htons(server.sin_port);
+ if (debug) {
+ fprintf(where,"remote listen done.\n");
+ fprintf(where,"remote port is %d\n",ntohs(server.sin_port));
+ fflush(where);
+ }
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("netperf: remote error");
+
+ exit(1);
+ }
+
+ /* Set-up the test end conditions. For a request/response test, they */
+ /* can be either time or transaction based. */
+
+ if (test_time) {
+ /* The user wanted to end the test after a period of time. */
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(test_time);
+ }
+ else {
+ /* The tester wanted to send a number of bytes. */
+ trans_remaining = test_bytes;
+ times_up = 1;
+ }
+
+ /* The cpu_start routine will grab the current time and possibly */
+ /* value of the idle counter for later use in measuring cpu */
+ /* utilization and/or service demand and thruput. */
+
+ cpu_start(local_cpu_usage);
+
+ /* We use an "OR" to control test execution. When the test is */
+ /* controlled by time, the byte count check will always return false. */
+ /* When the test is controlled by byte count, the time test will */
+ /* always return false. When the test is finished, the whole */
+ /* expression will go false and we will stop sending data. I think I */
+ /* just arbitrarily decrement trans_remaining for the timed test, but */
+ /* will not do that just yet... One other question is whether or not */
+ /* the send buffer and the receive buffer should be the same buffer. */
+
+ /* just for grins, start the port numbers at 65530. this should */
+ /* quickly flush-out those broken implementations of TCP which treat */
+ /* the port number as a signed 16 bit quantity. */
+ myport = 65530;
+ myaddr->sin_port = htons(myport);
+
+ while ((!times_up) || (trans_remaining > 0)) {
+
+ /* set up the data socket */
+ send_socket = create_xti_endpoint(loc_xti_device);
+
+ if (send_socket == INVALID_SOCKET) {
+ perror("netperf: send_xti_tcp_conn_rr: tcp stream data socket");
+ exit(1);
+ }
+
+ /* we set SO_REUSEADDR on the premis that no unreserved port */
+ /* number on the local system is going to be already connected to */
+ /* the remote netserver's port number. we might still have a */
+ /* problem if there is a port in the unconnected state. In that */
+ /* case, we might want to throw-in a goto to the point where we */
+ /* increment the port number by one and try again. of course, this */
+ /* could lead to a big load of spinning. one thing that I might */
+ /* try later is to have the remote actually allocate a couple of */
+ /* port numbers and cycle through those as well. depends on if we */
+ /* can get through all the unreserved port numbers in less than */
+ /* the length of the TIME_WAIT state raj 8/94 */
+ one = 1;
+ if(setsockopt(send_socket, SOL_SOCKET, SO_REUSEADDR,
+ (char *)&one, sock_opt_len) == SOCKET_ERROR) {
+ perror("netperf: send_xti_tcp_conn_rr: so_reuseaddr");
+ exit(1);
+ }
+
+ /* we want to bind our socket to a particular port number. */
+ if (bind(send_socket,
+ (struct sockaddr *)myaddr,
+ sizeof(struct sockaddr_in)) == SOCKET_ERROR) {
+ printf("netperf: send_xti_tcp_conn_rr: tried to bind to port %d\n",
+ ntohs(myaddr->sin_port));
+ perror("netperf: send_xti_tcp_conn_rr: bind");
+ exit(1);
+ }
+
+ /* Connect up to the remote port on the data socket */
+ if (connect(send_socket,
+ (struct sockaddr *)&server,
+ sizeof(server)) == INVALID_SOCKET){
+ if (errno == EINTR) {
+ /* we hit the end of a */
+ /* timed test. */
+ timed_out = 1;
+ break;
+ }
+ perror("netperf: data socket connect failed");
+ printf("\tattempted to connect on socket %d to port %d",
+ send_socket,
+ ntohs(server.sin_port));
+ printf(" from port %d \n",ntohs(myaddr->sin_port));
+ exit(1);
+ }
+
+ /* send the request */
+ if((len=send(send_socket,
+ send_ring->buffer_ptr,
+ req_size,
+ 0)) != req_size) {
+ if (errno == EINTR) {
+ /* we hit the end of a */
+ /* timed test. */
+ timed_out = 1;
+ break;
+ }
+ perror("send_xti_tcp_conn_rr: data send error");
+ exit(1);
+ }
+ send_ring = send_ring->next;
+
+ /* receive the response */
+ rsp_bytes_left = rsp_size;
+ temp_message_ptr = recv_ring->buffer_ptr;
+ while(rsp_bytes_left > 0) {
+ if((rsp_bytes_recvd=recv(send_socket,
+ temp_message_ptr,
+ rsp_bytes_left,
+ 0)) == SOCKET_ERROR) {
+ if (errno == EINTR) {
+ /* We hit the end of a timed test. */
+ timed_out = 1;
+ break;
+ }
+ perror("send_xti_tcp_conn_rr: data recv error");
+ exit(1);
+ }
+ rsp_bytes_left -= rsp_bytes_recvd;
+ temp_message_ptr += rsp_bytes_recvd;
+ }
+ recv_ring = recv_ring->next;
+
+ if (timed_out) {
+ /* we may have been in a nested while loop - we need */
+ /* another call to break. */
+ break;
+ }
+
+ close(send_socket);
+
+ nummessages++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug > 3) {
+ fprintf(where,
+ "Transaction %d completed on local port %d\n",
+ nummessages,
+ ntohs(myaddr->sin_port));
+ fflush(where);
+ }
+
+newport:
+ /* pick a new port number */
+ myport = ntohs(myaddr->sin_port);
+ myport++;
+ /* we do not want to use the port number that the server is */
+ /* sitting at - this would cause us to fail in a loopback test */
+
+ if (myport == ntohs(server.sin_port)) myport++;
+
+ /* wrap the port number when we get to 65535. NOTE, some broken */
+ /* TCP's might treat the port number as a signed 16 bit quantity. */
+ /* we aren't interested in testing such broekn implementations :) */
+ /* raj 8/94 */
+ if (myport == 65535) {
+ myport = 5000;
+ }
+ myaddr->sin_port = htons(myport);
+
+ if (debug) {
+ if ((myport % 1000) == 0) {
+ printf("port %d\n",myport);
+ }
+ }
+
+ }
+
+ /* this call will always give us the elapsed time for the test, and */
+ /* will also store-away the necessaries for cpu utilization */
+
+ cpu_stop(local_cpu_usage,&elapsed_time); /* was cpu being measured? */
+ /* how long did we really run? */
+
+ /* Get the statistics from the remote end. The remote will have */
+ /* calculated service demand and all those interesting things. If it */
+ /* wasn't supposed to care, it will return obvious values. */
+
+ recv_response();
+ if (!netperf_response.content.serv_errno) {
+ if (debug)
+ fprintf(where,"remote results obtained\n");
+ }
+ else {
+ Set_errno(netperf_response.content.serv_errno);
+ perror("netperf: remote error");
+
+ exit(1);
+ }
+
+ /* We now calculate what our thruput was for the test. In the future, */
+ /* we may want to include a calculation of the thruput measured by */
+ /* the remote, but it should be the case that for a TCP stream test, */
+ /* that the two numbers should be *very* close... We calculate */
+ /* bytes_sent regardless of the way the test length was controlled. */
+ /* If it was time, we needed to, and if it was by bytes, the user may */
+ /* have specified a number of bytes that wasn't a multiple of the */
+ /* send_size, so we really didn't send what he asked for ;-) We use */
+ /* Kbytes/s as the units of thruput for a TCP stream test, where K = */
+ /* 1024. A future enhancement *might* be to choose from a couple of */
+ /* unit selections. */
+
+ bytes_xferd = (req_size * nummessages) + (rsp_size * nummessages);
+ thruput = calc_thruput(bytes_xferd);
+
+ if (local_cpu_usage || remote_cpu_usage) {
+ /* We must now do a little math for service demand and cpu */
+ /* utilization for the system(s) */
+ /* Of course, some of the information might be bogus because */
+ /* there was no idle counter in the kernel(s). We need to make */
+ /* a note of this for the user's benefit...*/
+ if (local_cpu_usage) {
+ if (local_cpu_rate == 0.0) {
+ fprintf(where,"WARNING WARNING WARNING WARNING WARNING WARNING WARNING!\n");
+ fprintf(where,"Local CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+ local_cpu_utilization = calc_cpu_util(0.0);
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ local_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ 0.0,
+ 0);
+ }
+ else {
+ local_cpu_utilization = -1.0;
+ local_service_demand = -1.0;
+ }
+
+ if (remote_cpu_usage) {
+ if (remote_cpu_rate == 0.0) {
+ fprintf(where,"DANGER DANGER DANGER DANGER DANGER DANGER DANGER!\n");
+ fprintf(where,"Remote CPU usage numbers based on process information only!\n");
+ fflush(where);
+ }
+ remote_cpu_utilization = xti_tcp_conn_rr_result->cpu_util;
+ /* since calc_service demand is doing ms/Kunit we will */
+ /* multiply the number of transaction by 1024 to get */
+ /* "good" numbers */
+ remote_service_demand = calc_service_demand((double) nummessages*1024,
+ 0.0,
+ remote_cpu_utilization,
+ xti_tcp_conn_rr_result->num_cpus);
+ }
+ else {
+ remote_cpu_utilization = -1.0;
+ remote_service_demand = -1.0;
+ }
+
+ /* We are now ready to print all the information. If the user */
+ /* has specified zero-level verbosity, we will just print the */
+ /* local service demand, or the remote service demand. If the */
+ /* user has requested verbosity level 1, he will get the basic */
+ /* "streamperf" numbers. If the user has specified a verbosity */
+ /* of greater than 1, we will display a veritable plethora of */
+ /* background information from outside of this block as it it */
+ /* not cpu_measurement specific... */
+
+ switch (verbosity) {
+ case 0:
+ if (local_cpu_usage) {
+ fprintf(where,
+ cpu_fmt_0,
+ local_service_demand);
+ }
+ else {
+ fprintf(where,
+ cpu_fmt_0,
+ remote_service_demand);
+ }
+ break;
+ case 1:
+ fprintf(where,
+ cpu_fmt_1_line_1, /* the format string */
+ lss_size, /* local sendbuf size */
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* guess */
+ elapsed_time, /* how long was the test */
+ nummessages/elapsed_time,
+ local_cpu_utilization, /* local cpu */
+ remote_cpu_utilization, /* remote cpu */
+ local_service_demand, /* local service demand */
+ remote_service_demand); /* remote service demand */
+ fprintf(where,
+ cpu_fmt_1_line_2,
+ rss_size,
+ rsr_size);
+ break;
+ }
+ }
+ else {
+ /* The tester did not wish to measure service demand. */
+ switch (verbosity) {
+ case 0:
+ fprintf(where,
+ tput_fmt_0,
+ nummessages/elapsed_time);
+ break;
+ case 1:
+ fprintf(where,
+ tput_fmt_1_line_1, /* the format string */
+ lss_size,
+ lsr_size,
+ req_size, /* how large were the requests */
+ rsp_size, /* how large were the responses */
+ elapsed_time, /* how long did it take */
+ nummessages/elapsed_time);
+ fprintf(where,
+ tput_fmt_1_line_2,
+ rss_size, /* remote recvbuf size */
+ rsr_size);
+
+ break;
+ }
+ }
+
+ /* it would be a good thing to include information about some of the */
+ /* other parameters that may have been set for this test, but at the */
+ /* moment, I do not wish to figure-out all the formatting, so I will */
+ /* just put this comment here to help remind me that it is something */
+ /* that should be done at a later time. */
+
+ if (verbosity > 1) {
+ /* The user wanted to know it all, so we will give it to him. */
+ /* This information will include as much as we can find about */
+ /* TCP statistics, the alignments of the sends and receives */
+ /* and all that sort of rot... */
+
+ fprintf(where,
+ ksink_fmt);
+ }
+
+}
+
+
+void
+recv_xti_tcp_conn_rr()
+{
+
+ char *message;
+ struct sockaddr_in myaddr_in,
+ peeraddr_in;
+ SOCKET s_listen,s_data;
+ int addrlen;
+ char *recv_message_ptr;
+ char *send_message_ptr;
+ char *temp_message_ptr;
+ int trans_received;
+ int trans_remaining;
+ int bytes_sent;
+ int request_bytes_recvd;
+ int request_bytes_remaining;
+ int timed_out = 0;
+ float elapsed_time;
+
+ struct xti_tcp_conn_rr_request_struct *xti_tcp_conn_rr_request;
+ struct xti_tcp_conn_rr_response_struct *xti_tcp_conn_rr_response;
+ struct xti_tcp_conn_rr_results_struct *xti_tcp_conn_rr_results;
+
+ xti_tcp_conn_rr_request =
+ (struct xti_tcp_conn_rr_request_struct *)netperf_request.content.test_specific_data;
+ xti_tcp_conn_rr_response =
+ (struct xti_tcp_conn_rr_response_struct *)netperf_response.content.test_specific_data;
+ xti_tcp_conn_rr_results =
+ (struct xti_tcp_conn_rr_results_struct *)netperf_response.content.test_specific_data;
+
+ if (debug) {
+ fprintf(where,"netserver: recv_xti_tcp_conn_rr: entered...\n");
+ fflush(where);
+ }
+
+ /* We want to set-up the listen socket with all the desired */
+ /* parameters and then let the initiator know that all is ready. If */
+ /* socket size defaults are to be used, then the initiator will have */
+ /* sent us 0's. If the socket sizes cannot be changed, then we will */
+ /* send-back what they are. If that information cannot be determined, */
+ /* then we send-back -1's for the sizes. If things go wrong for any */
+ /* reason, we will drop back ten yards and punt. */
+
+ /* If anything goes wrong, we want the remote to know about it. It */
+ /* would be best if the error that the remote reports to the user is */
+ /* the actual error we encountered, rather than some bogus unexpected */
+ /* response type message. */
+
+ if (debug) {
+ fprintf(where,"recv_xti_tcp_conn_rr: setting the response type...\n");
+ fflush(where);
+ }
+
+ netperf_response.content.response_type = XTI_TCP_CRR_RESPONSE;
+
+ if (debug) {
+ fprintf(where,"recv_xti_tcp_conn_rr: the response type is set...\n");
+ fflush(where);
+ }
+
+ /* set-up the data buffer with the requested alignment and offset */
+ message = (char *)malloc(DATABUFFERLEN);
+ if (message == NULL) {
+ printf("malloc(%d) failed!\n", DATABUFFERLEN);
+ exit(1);
+ }
+
+ /* We now alter the message_ptr variables to be at the desired */
+ /* alignments with the desired offsets. */
+
+ if (debug) {
+ fprintf(where,
+ "recv_xti_tcp_conn_rr: requested recv alignment of %d offset %d\n",
+ xti_tcp_conn_rr_request->recv_alignment,
+ xti_tcp_conn_rr_request->recv_offset);
+ fprintf(where,
+ "recv_xti_tcp_conn_rr: requested send alignment of %d offset %d\n",
+ xti_tcp_conn_rr_request->send_alignment,
+ xti_tcp_conn_rr_request->send_offset);
+ fflush(where);
+ }
+
+ recv_message_ptr = ALIGN_BUFFER(message, xti_tcp_conn_rr_request->recv_alignment, xti_tcp_conn_rr_request->recv_offset);
+
+ send_message_ptr = ALIGN_BUFFER(message, xti_tcp_conn_rr_request->send_alignment, xti_tcp_conn_rr_request->send_offset);
+
+ if (debug) {
+ fprintf(where,"recv_xti_tcp_conn_rr: receive alignment and offset set...\n");
+ fflush(where);
+ }
+
+ /* Let's clear-out our sockaddr for the sake of cleanlines. Then we */
+ /* can put in OUR values !-) At some point, we may want to nail this */
+ /* socket to a particular network-level address, but for now, */
+ /* INADDR_ANY should be just fine. */
+
+ bzero((char *)&myaddr_in,
+ sizeof(myaddr_in));
+ myaddr_in.sin_family = AF_INET;
+ myaddr_in.sin_addr.s_addr = INADDR_ANY;
+ myaddr_in.sin_port = 0;
+
+ /* Grab a socket to listen on, and then listen on it. */
+
+ if (debug) {
+ fprintf(where,"recv_xti_tcp_conn_rr: grabbing a socket...\n");
+ fflush(where);
+ }
+
+ /* create_xti_endpoint expects to find some things in the global */
+ /* variables, so set the globals based on the values in the request. */
+ /* once the socket has been created, we will set the response values */
+ /* based on the updated value of those globals. raj 7/94 */
+ lss_size = xti_tcp_conn_rr_request->send_buf_size;
+ lsr_size = xti_tcp_conn_rr_request->recv_buf_size;
+ loc_nodelay = xti_tcp_conn_rr_request->no_delay;
+ loc_rcvavoid = xti_tcp_conn_rr_request->so_rcvavoid;
+ loc_sndavoid = xti_tcp_conn_rr_request->so_sndavoid;
+
+ s_listen = create_xti_endpoint(loc_xti_device);
+
+ if (s_listen == INVALID_SOCKET) {
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ if (debug) {
+ fprintf(where,"could not create data socket\n");
+ fflush(where);
+ }
+ exit(1);
+ }
+
+ /* Let's get an address assigned to this socket so we can tell the */
+ /* initiator how to reach the data socket. There may be a desire to */
+ /* nail this socket to a specific IP address in a multi-homed, */
+ /* multi-connection situation, but for now, we'll ignore the issue */
+ /* and concentrate on single connection testing. */
+
+ if (bind(s_listen,
+ (struct sockaddr *)&myaddr_in,
+ sizeof(myaddr_in)) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+ if (debug) {
+ fprintf(where,"could not bind\n");
+ fflush(where);
+ }
+ exit(1);
+ }
+
+ /* Now, let's set-up the socket to listen for connections */
+ if (listen(s_listen, 5) == SOCKET_ERROR) {
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+ if (debug) {
+ fprintf(where,"could not listen\n");
+ fflush(where);
+ }
+ exit(1);
+ }
+
+ /* now get the port number assigned by the system */
+ addrlen = sizeof(myaddr_in);
+ if (getsockname(s_listen,
+ (struct sockaddr *)&myaddr_in,
+ &addrlen) == SOCKET_ERROR){
+ netperf_response.content.serv_errno = errno;
+ close(s_listen);
+ send_response();
+ if (debug) {
+ fprintf(where,"could not geetsockname\n");
+ fflush(where);
+ }
+ exit(1);
+ }
+
+ /* Now myaddr_in contains the port and the internet address this is */
+ /* returned to the sender also implicitly telling the sender that the */
+ /* socket buffer sizing has been done. */
+
+ xti_tcp_conn_rr_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
+ if (debug) {
+ fprintf(where,"telling the remote to call me at %d\n",
+ xti_tcp_conn_rr_response->data_port_number);
+ fflush(where);
+ }
+ netperf_response.content.serv_errno = 0;
+
+ /* But wait, there's more. If the initiator wanted cpu measurements, */
+ /* then we must call the calibrate routine, which will return the max */
+ /* rate back to the initiator. If the CPU was not to be measured, or */
+ /* something went wrong with the calibration, we will return a 0.0 to */
+ /* the initiator. */
+
+ xti_tcp_conn_rr_response->cpu_rate = 0.0; /* assume no cpu */
+ if (xti_tcp_conn_rr_request->measure_cpu) {
+ xti_tcp_conn_rr_response->measure_cpu = 1;
+ xti_tcp_conn_rr_response->cpu_rate =
+ calibrate_local_cpu(xti_tcp_conn_rr_request->cpu_rate);
+ }
+
+
+
+ /* before we send the response back to the initiator, pull some of */
+ /* the socket parms from the globals */
+ xti_tcp_conn_rr_response->send_buf_size = lss_size;
+ xti_tcp_conn_rr_response->recv_buf_size = lsr_size;
+ xti_tcp_conn_rr_response->no_delay = loc_nodelay;
+ xti_tcp_conn_rr_response->so_rcvavoid = loc_rcvavoid;
+ xti_tcp_conn_rr_response->so_sndavoid = loc_sndavoid;
+
+ send_response();
+
+ addrlen = sizeof(peeraddr_in);
+
+ /* Now it's time to start receiving data on the connection. We will */
+ /* first grab the apropriate counters and then start grabbing. */
+
+ cpu_start(xti_tcp_conn_rr_request->measure_cpu);
+
+ /* The loop will exit when the sender does a shutdown, which will */
+ /* return a length of zero */
+
+ if (xti_tcp_conn_rr_request->test_length > 0) {
+ times_up = 0;
+ trans_remaining = 0;
+ start_timer(xti_tcp_conn_rr_request->test_length + PAD_TIME);
+ }
+ else {
+ times_up = 1;
+ trans_remaining = xti_tcp_conn_rr_request->test_length * -1;
+ }
+
+ trans_received = 0;
+
+ while ((!times_up) || (trans_remaining > 0)) {
+
+ /* accept a connection from the remote */
+ if ((s_data=accept(s_listen,
+ (struct sockaddr *)&peeraddr_in,
+ &addrlen)) == INVALID_SOCKET) {
+ if (errno == EINTR) {
+ /* the timer popped */
+ timed_out = 1;
+ break;
+ }
+ fprintf(where,"recv_xti_tcp_conn_rr: accept: errno = %d\n",errno);
+ fflush(where);
+ close(s_listen);
+
+ exit(1);
+ }
+
+ if (debug) {
+ fprintf(where,"recv_xti_tcp_conn_rr: accepted data connection.\n");
+ fflush(where);
+ }
+
+ temp_message_ptr = recv_message_ptr;
+ request_bytes_remaining = xti_tcp_conn_rr_request->request_size;
+
+ /* receive the request from the other side */
+ while(request_bytes_remaining > 0) {
+ if((request_bytes_recvd=recv(s_data,
+ temp_message_ptr,
+ request_bytes_remaining,
+ 0)) == SOCKET_ERROR) {
+ if (errno == EINTR) {
+ /* the timer popped */
+ timed_out = 1;
+ break;
+ }
+ netperf_response.content.serv_errno = errno;
+ send_response();
+ exit(1);
+ }
+ else {
+ request_bytes_remaining -= request_bytes_recvd;
+ temp_message_ptr += request_bytes_recvd;
+ }
+ }
+
+ if (timed_out) {
+ /* we hit the end of the test based on time - lets */
+ /* bail out of here now... */
+ fprintf(where,"yo5\n");
+ fflush(where);
+ break;
+ }
+
+ /* Now, send the response to the remote */
+ if((bytes_sent=send(s_data,
+ send_message_ptr,
+ xti_tcp_conn_rr_request->response_size,
+ 0)) == SOCKET_ERROR) {
+ if (errno == EINTR) {
+ /* the test timer has popped */
+ timed_out = 1;
+ fprintf(where,"yo6\n");
+ fflush(where);
+ break;
+ }
+ netperf_response.content.serv_errno = 99;
+ send_response();
+ exit(1);
+ }
+
+ trans_received++;
+ if (trans_remaining) {
+ trans_remaining--;
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_xti_tcp_conn_rr: Transaction %d complete\n",
+ trans_received);
+ fflush(where);
+ }
+
+ /* close the connection */
+ close(s_data);
+
+ }
+
+
+ /* The loop now exits due to timeout or transaction count being */
+ /* reached */
+
+ cpu_stop(xti_tcp_conn_rr_request->measure_cpu,&elapsed_time);
+
+ if (timed_out) {
+ /* we ended the test by time, which was at least 2 seconds */
+ /* longer than we wanted to run. so, we want to subtract */
+ /* PAD_TIME from the elapsed_time. */
+ elapsed_time -= PAD_TIME;
+ }
+ /* send the results to the sender */
+
+ if (debug) {
+ fprintf(where,
+ "recv_xti_tcp_conn_rr: got %d transactions\n",
+ trans_received);
+ fflush(where);
+ }
+
+ xti_tcp_conn_rr_results->bytes_received = (trans_received *
+ (xti_tcp_conn_rr_request->request_size +
+ xti_tcp_conn_rr_request->response_size));
+ xti_tcp_conn_rr_results->trans_received = trans_received;
+ xti_tcp_conn_rr_results->elapsed_time = elapsed_time;
+ if (xti_tcp_conn_rr_request->measure_cpu) {
+ xti_tcp_conn_rr_results->cpu_util = calc_cpu_util(elapsed_time);
+ }
+
+ if (debug) {
+ fprintf(where,
+ "recv_xti_tcp_conn_rr: test complete, sending results.\n");
+ fflush(where);
+ }
+
+ send_response();
+
+}
+
+void
+print_xti_usage()
+{
+
+ fwrite(xti_usage, sizeof(char), strlen(xti_usage), stdout);
+ exit(1);
+
+}
+
+void
+scan_xti_args(int argc, char *argv[])
+{
+#define XTI_ARGS "Dhm:M:r:s:S:Vw:W:X:"
+ extern int optind, opterrs; /* index of first unused arg */
+ extern char *optarg; /* pointer to option string */
+
+ int c;
+
+ char
+ arg1[BUFSIZ], /* argument holders */
+ arg2[BUFSIZ];
+
+ if (no_control) {
+ fprintf(where,
+ "The XTI tests do not know how to run with no control connection\n");
+ exit(-1);
+ }
+
+ /* Go through all the command line arguments and break them */
+ /* out. For those options that take two parms, specifying only */
+ /* the first will set both to that value. Specifying only the */
+ /* second will leave the first untouched. To change only the */
+ /* first, use the form "first," (see the routine break_args.. */
+
+ while ((c= getopt(argc, argv, XTI_ARGS)) != EOF) {
+ switch (c) {
+ case '?':
+ case 'h':
+ print_xti_usage();
+ exit(1);
+ case 'D':
+ /* set the TCP nodelay flag */
+ loc_nodelay = 1;
+ rem_nodelay = 1;
+ break;
+ case 's':
+ /* set local socket sizes */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ lss_size = convert(arg1);
+ if (arg2[0])
+ lsr_size = convert(arg2);
+ break;
+ case 'S':
+ /* set remote socket sizes */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ rss_size = convert(arg1);
+ if (arg2[0])
+ rsr_size = convert(arg2);
+ break;
+ case 'r':
+ /* set the request/response sizes */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ req_size = convert(arg1);
+ if (arg2[0])
+ rsp_size = convert(arg2);
+ break;
+ case 'm':
+ /* set the send size */
+ send_size = convert(optarg);
+ break;
+ case 'M':
+ /* set the recv size */
+ recv_size = convert(optarg);
+ break;
+ case 'W':
+ /* set the "width" of the user space data */
+ /* buffer. This will be the number of */
+ /* send_size buffers malloc'd in the */
+ /* *_STREAM test. It may be enhanced to set */
+ /* both send and receive "widths" but for now */
+ /* it is just the sending *_STREAM. */
+ send_width = convert(optarg);
+ break;
+ case 'V' :
+ /* we want to do copy avoidance and will set */
+ /* it for everything, everywhere, if we really */
+ /* can. of course, we don't know anything */
+ /* about the remote... */
+#ifdef SO_SND_COPYAVOID
+ loc_sndavoid = 1;
+#else
+ loc_sndavoid = 0;
+ printf("Local send copy avoidance not available.\n");
+#endif
+#ifdef SO_RCV_COPYAVOID
+ loc_rcvavoid = 1;
+#else
+ loc_rcvavoid = 0;
+ printf("Local recv copy avoidance not available.\n");
+#endif
+ rem_sndavoid = 1;
+ rem_rcvavoid = 1;
+ break;
+ case 'X':
+ /* set the xti device file name(s) */
+ break_args(optarg,arg1,arg2);
+ if (arg1[0])
+ strcpy(loc_xti_device,arg1);
+ if (arg2[0])
+ strcpy(rem_xti_device,arg2);
+ break;
+ };
+ }
+}
+#endif /* WANT_XTI */
diff --git a/nettest_xti.h b/nettest_xti.h
new file mode 100644
index 0000000..3bf9968
--- /dev/null
+++ b/nettest_xti.h
@@ -0,0 +1,264 @@
+/*
+ * Copyright (C) 1995,2004 Hewlett-Packard Company
+ */
+
+ /* This file contains the test-specific definitions for netperf's BSD */
+ /* sockets tests */
+
+struct xti_tcp_stream_request_struct {
+ int send_buf_size;
+ int recv_buf_size; /* how big does the client want it - the */
+ /* receive socket buffer that is */
+ int receive_size; /* how many bytes do we want to receive at one */
+ /* time? */
+ int recv_alignment; /* what is the alignment of the receive */
+ /* buffer? */
+ int recv_offset; /* and at what offset from that alignment? */
+ int no_delay; /* do we disable the nagle algorithm for send */
+ /* coalescing? */
+ int measure_cpu; /* does the client want server cpu utilization */
+ /* measured? */
+ float cpu_rate; /* do we know how fast the cpu is already? */
+ int test_length; /* how long is the test? */
+ int so_rcvavoid; /* do we want the remote to avoid copies on */
+ /* receives? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int dirty_count; /* how many integers in the receive buffer */
+ /* should be made dirty before calling recv? */
+ int clean_count; /* how many integers should be read from the */
+ /* recv buffer before calling recv? */
+ int dev_name_len; /* the length of the device name string. this */
+ /* is used to put it into the proper order on */
+ /* @#$% byte-swapped boxes... */
+ char xti_device[32]; /* the path to the dlpi device */
+};
+
+struct xti_tcp_stream_response_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int receive_size;
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ int test_length; /* how long is the test? */
+ int send_buf_size;
+ int data_port_number; /* connect to me here */
+ float cpu_rate; /* could we measure */
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+};
+
+struct xti_tcp_stream_results_struct {
+ double bytes_received;
+ unsigned int recv_calls;
+ float elapsed_time; /* how long the test ran */
+ float cpu_util; /* -1 if not measured */
+ float serv_dem; /* -1 if not measured */
+ int cpu_method; /* how was cpu util measured? */
+ int num_cpus; /* how many CPUs were there */
+};
+
+struct xti_tcp_rr_request_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int send_buf_size;
+ int recv_alignment;
+ int recv_offset;
+ int send_alignment;
+ int send_offset;
+ int request_size;
+ int response_size;
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ float cpu_rate; /* do we know how fast the cpu is? */
+ int test_length; /* how long is the test? */
+ int so_rcvavoid; /* do we want the remote to avoid receive */
+ /* copies? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int dev_name_len; /* the length of the device name string. this */
+ /* is used to put it into the proper order on */
+ /* @#$% byte-swapped boxes... */
+ char xti_device[32]; /* the path to the dlpi device */
+};
+
+struct xti_tcp_rr_response_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ int test_length; /* how long is the test? */
+ int send_buf_size;
+ int data_port_number; /* connect to me here */
+ float cpu_rate; /* could we measure */
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+};
+
+struct xti_tcp_rr_results_struct {
+ unsigned int bytes_received; /* ignored initially */
+ unsigned int recv_calls; /* ignored initially */
+ unsigned int trans_received; /* not ignored */
+ float elapsed_time; /* how long the test ran */
+ float cpu_util; /* -1 if not measured */
+ float serv_dem; /* -1 if not measured */
+ int cpu_method; /* how was cpu util measured? */
+ int num_cpus; /* how many CPUs were there */
+};
+
+struct xti_tcp_conn_rr_request_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int send_buf_size;
+ int recv_alignment;
+ int recv_offset;
+ int send_alignment;
+ int send_offset;
+ int request_size;
+ int response_size;
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ float cpu_rate; /* do we know how fast the cpu is? */
+ int test_length; /* how long is the test? */
+ int so_rcvavoid; /* do we want the remote to avoid receive */
+ /* copies? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int dev_name_len; /* the length of the device name string. this */
+ /* is used to put it into the proper order on */
+ /* @#$% byte-swapped boxes... */
+ char xti_device[32]; /* the path to the dlpi device */
+};
+
+
+struct xti_tcp_conn_rr_response_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ int test_length; /* how long is the test? */
+ int send_buf_size;
+ int data_port_number; /* connect to me here */
+ float cpu_rate; /* could we measure */
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+};
+
+struct xti_tcp_conn_rr_results_struct {
+ unsigned int bytes_received; /* ignored initially */
+ unsigned int recv_calls; /* ignored initially */
+ unsigned int trans_received; /* not ignored */
+ float elapsed_time; /* how long the test ran */
+ float cpu_util; /* -1 if not measured */
+ float serv_dem; /* -1 if not measured */
+ int cpu_method; /* how was cpu util measured? */
+ int num_cpus; /* how many CPUs were there */
+};
+
+struct xti_udp_stream_request_struct {
+ int recv_buf_size;
+ int message_size;
+ int recv_alignment;
+ int recv_offset;
+ int checksum_off; /* not used. left in for compatibility */
+ int measure_cpu;
+ float cpu_rate;
+ int test_length;
+ int so_rcvavoid; /* do we want the remote to avoid receive */
+ /* copies? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int dev_name_len; /* the length of the device name string. this */
+ /* is used to put it into the proper order on */
+ /* @#$% byte-swapped boxes... */
+ char xti_device[32]; /* the path to the dlpi device */
+};
+
+struct xti_udp_stream_response_struct {
+ int recv_buf_size;
+ int send_buf_size;
+ int measure_cpu;
+ int test_length;
+ int data_port_number;
+ float cpu_rate;
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+};
+
+struct xti_udp_stream_results_struct {
+ unsigned int messages_recvd;
+ unsigned int bytes_received;
+ float elapsed_time;
+ float cpu_util;
+ int cpu_method; /* how was cpu util measured? */
+ int num_cpus; /* how many CPUs were there */
+};
+
+
+struct xti_udp_rr_request_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int send_buf_size;
+ int recv_alignment;
+ int recv_offset;
+ int send_alignment;
+ int send_offset;
+ int request_size;
+ int response_size;
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ float cpu_rate; /* do we know how fast the cpu is? */
+ int test_length; /* how long is the test? */
+ int so_rcvavoid; /* do we want the remote to avoid receive */
+ /* copies? */
+ int so_sndavoid; /* do we want the remote to avoid send copies? */
+ int dev_name_len; /* the length of the device name string. this */
+ /* is used to put it into the proper order on */
+ /* @#$% byte-swapped boxes... */
+ char xti_device[32]; /* the path to the dlpi device */
+};
+
+struct xti_udp_rr_response_struct {
+ int recv_buf_size; /* how big does the client want it */
+ int no_delay;
+ int measure_cpu; /* does the client want server cpu */
+ int test_length; /* how long is the test? */
+ int send_buf_size;
+ int data_port_number; /* connect to me here */
+ float cpu_rate; /* could we measure */
+ int so_rcvavoid; /* could the remote avoid receive copies? */
+ int so_sndavoid; /* could the remote avoid send copies? */
+};
+
+struct xti_udp_rr_results_struct {
+ unsigned int bytes_received; /* ignored initially */
+ unsigned int recv_calls; /* ignored initially */
+ unsigned int trans_received; /* not ignored */
+ float elapsed_time; /* how long the test ran */
+ float cpu_util; /* -1 if not measured */
+ float serv_dem; /* -1 if not measured */
+ int cpu_method; /* how was cpu util measured? */
+ int num_cpus; /* how many CPUs were there */
+};
+
+extern void send_xti_tcp_stream(char remote_host[]);
+
+extern void recv_xti_tcp_stream();
+
+extern void send_xti_tcp_rr(char remote_host[]);
+
+extern void send_xti_udp_stream(char remote_host[]);
+
+extern void recv_xti_udp_stream();
+
+extern void send_xti_udp_rr(char remote_host[]);
+
+extern void recv_xti_udp_rr();
+
+extern void recv_xti_tcp_rr();
+
+extern void send_xti_tcp_conn_rr(char remote_host[]);
+
+extern void recv_xti_tcp_conn_rr();
+
+extern void scan_xti_args(int argc, char *argv[]);
+
+
+
+
+
+
+
+
+
+